/** ----------------------------------------------------------------------
 *
 * 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_H_
#define __HALCORE_H_

#include <errno.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <pthread.h>

/* events sent from the callback */
#define HAL_EVENT_DSWRITE 1  /* write raw HAL data downstream   */
#define HAL_EVENT_DATAIND 2  /* new NCI frame received from CLF  */
#define HAL_EVENT_LINKLOST 3 /* connection/link lost             */
#define HAL_EVENT_ERROR 4    /* protocol got into an error state */
#define HAL_EVENT_JUNKRECEIVED                                        \
  5 /* protocol signals that junk has been received. resyncronization */

#define HAL_EVENT_TIMER_TIMEOUT 6

/* flags to be passed to HalCreate */

#define HAL_WRAPPER_TIMEOUT_EVT 7

#define HAL_FLAG_NO_DEBUG 0 /* disable debug output */
#define HAL_FLAG_DEBUG 1    /* enable debug output */

bool halTraceMask;
pthread_mutex_t debugOutputSem;

#ifdef ANDROID
#include <android/log.h>
#define LOG(s)                                               \
  if (!halTraceMask) {                                       \
  } else {                                                   \
    pthread_mutex_lock(&debugOutputSem);                     \
    __android_log_print(ANDROID_LOG_DEBUG, "NfcHalCore", s); \
    pthread_mutex_unlock(&debugOutputSem);                   \
  }
#define LOGE(s)                                              \
  {                                                          \
    pthread_mutex_lock(&debugOutputSem);                     \
    __android_log_print(ANDROID_LOG_ERROR, "NfcHalCore", s); \
    pthread_mutex_unlock(&debugOutputSem);                   \
  }
#define LOGV(s, ...)                                                      \
  if (!halTraceMask) {                                                    \
  } else {                                                                \
    pthread_mutex_lock(&debugOutputSem);                                  \
    __android_log_print(ANDROID_LOG_DEBUG, "NfcHalCore", s, __VA_ARGS__); \
    pthread_mutex_unlock(&debugOutputSem);                                \
  }
#define LOGVE(s, ...)                                                     \
  {                                                                       \
    pthread_mutex_lock(&debugOutputSem);                                  \
    __android_log_print(ANDROID_LOG_ERROR, "NfcHalCore", s, __VA_ARGS__); \
    pthread_mutex_unlock(&debugOutputSem);                                \
  }
#else
#define LOG printf
#define LOGE printf
#define LOGV printf
#define LOGVE printf
#endif

/* callback function to communicate from HAL Core with the outside world */
typedef void (*HAL_CALLBACK)(void* context, uint32_t event, const void* data,
                             size_t length);

/* flags to be passed to HALCreate */

typedef void* HALHANDLE;

HALHANDLE HalCreate(void* context, HAL_CALLBACK callback, uint32_t flags);

void HalDestroy(HALHANDLE hHAL);

/* send an NCI frame from the HOST to the CLF */
bool HalSendDownstream(HALHANDLE hHAL, const uint8_t* data, size_t size);

// HAL WRAPPER
bool HalSendDownstreamTimer(HALHANDLE hHAL, const uint8_t* data, size_t size,
                            uint8_t duration);
bool HalSendDownstreamStopTimer(HALHANDLE hHAL);

/* send a complete HDLC frame from the CLF to the HOST */
bool HalSendUpstream(HALHANDLE hHAL, const uint8_t* data, size_t size);

#endif
