/** ----------------------------------------------------------------------
 *
 * 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
