blob: 5bb485371030e6aeef15012889d7a1e45976f037 [file] [log] [blame]
/** ----------------------------------------------------------------------
*
* Copyright (C) 2016 ST Microelectronics S.A.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
----------------------------------------------------------------------*/
#ifndef __HALCORE_PRIVATE_
#define __HALCORE_PRIVATE_
#include <pthread.h>
#include <semaphore.h>
#include <stdint.h>
#include <time.h>
#include "halcore.h"
#define MAX_NCIFRAME_PAYLOAD_SIZE 255
#define MAX_HEADER_SIZE 3
#define MAX_BUFFER_SIZE (MAX_NCIFRAME_PAYLOAD_SIZE + MAX_HEADER_SIZE)
// the three NCI bytes:
// Octet1 and Octet 2: connection-id and stuff
// Octet3: length of payload (in bytes)
/* ----------------------------------------------------------------------------------------------*/
/* ----------------------------------------------------------------------------------------------*/
/* ----------------------------------------------------------------------------------------------*/
/* ----------------------------------------------------------------------------------------------*/
/* ----------------------------------------------------------------------------------------------*/
#define HAL_QUEUE_MAX \
8 /* max. # of messages enqueued before going into blocking mode */
/* thread messages */
#define MSG_EXIT_REQUEST 0 /* worker thread should terminate itself */
#define MSG_TX_DATA 1 /* send a message downstream */
#define MSG_RX_DATA 2 /* a new message has arrived from lower layer */
// HAL _WRAPPER
#define MSG_TX_DATA_TIMER_START 3
/* number of buffers used for incoming & outgoing data */
#define NUM_BUFFERS 10
/* constants for the return value of osWait */
#define OS_SYNC_INFINITE 0xffffffffu
#define OS_SYNC_RELEASED 0
#define OS_SYNC_TIMEOUT 1
#define OS_SYNC_FAILED 0xffffffffu
/* default timeouts */
#define HAL_SLEEP_TIMER 0
#define HAL_SLEEP_TIMER_DURATION 500 /* ordinary t1 timeout to resent data */
typedef struct tagHalBuffer {
uint8_t data[MAX_BUFFER_SIZE];
size_t length;
struct tagHalBuffer* next;
} HalBuffer;
typedef struct tagThreadMessage {
uint32_t command; /* message type / command */
const void* payload; /* ptr to message related data item */
size_t length; /* length of above payload */
HalBuffer* buffer; /* buffer object (optional) */
} ThreadMesssage;
typedef enum {
EVT_RX_DATA = 0,
EVT_TX_DATA = 1,
// HAL WRAPPER
EVT_TIMER = 2,
} HalEvent;
typedef struct tagTimer {
struct timespec startTime; /* start time (CLOCK_REALTIME) */
uint32_t duration; /* timer duration in milliseconds */
bool active; /* true if timer is currently active */
} Timer;
typedef struct tagHalInstance {
uint32_t flags;
void* context;
HAL_CALLBACK callback;
/* current timeout values */
uint32_t timeout;
Timer timer;
/* threading and runtime support */
bool exitRequest;
sem_t semaphore;
pthread_t thread;
pthread_mutex_t hMutex; /* guards the message ringbuffer */
/* IOBuffers for read/writes */
HalBuffer* bufferData;
HalBuffer* freeBufferList;
HalBuffer* pendingNciList; /* outgoing packages waiting to be processed */
HalBuffer* nciBuffer; /* current buffer in progress */
sem_t bufferResourceSem;
sem_t upstreamBlock;
/* message ring-buffer */
ThreadMesssage ring[HAL_QUEUE_MAX];
int ringReadPos;
int ringWritePos;
/* current frame going downstream */
uint8_t lastDsFrame[MAX_BUFFER_SIZE];
size_t lastDsFrameSize;
/* current frame from CLF */
uint8_t lastUsFrame[MAX_BUFFER_SIZE];
size_t lastUsFrameSize;
} HalInstance;
#endif