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