119 lines
4.0 KiB
C
119 lines
4.0 KiB
C
/*
|
|
* Copyright 2012-2020 NXP
|
|
*
|
|
* 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 _PHNXPUCIHAL_UTILS_H_
|
|
#define _PHNXPUCIHAL_UTILS_H_
|
|
|
|
#include <assert.h>
|
|
#include <phUwbStatus.h>
|
|
#include <pthread.h>
|
|
#include <semaphore.h>
|
|
|
|
/********************* Definitions and structures *****************************/
|
|
|
|
/* List structures */
|
|
struct listNode {
|
|
void* pData;
|
|
struct listNode* pNext;
|
|
};
|
|
|
|
struct listHead {
|
|
struct listNode* pFirst;
|
|
pthread_mutex_t mutex;
|
|
};
|
|
|
|
/* Semaphore handling structure */
|
|
typedef struct phNxpUciHal_Sem {
|
|
/* Semaphore used to wait for callback */
|
|
sem_t sem;
|
|
|
|
/* Used to store the status sent by the callback */
|
|
tHAL_UWB_STATUS status;
|
|
|
|
/* Used to provide a local context to the callback */
|
|
void* pContext;
|
|
|
|
} phNxpUciHal_Sem_t;
|
|
|
|
/* Semaphore helper macros */
|
|
#define SEM_WAIT(cb_data) sem_wait(&((cb_data).sem))
|
|
#define SEM_POST(p_cb_data) sem_post(&((p_cb_data)->sem))
|
|
|
|
/* Semaphore and mutex monitor */
|
|
typedef struct phNxpUciHal_Monitor {
|
|
/* Mutex protecting native library against reentrance */
|
|
pthread_mutex_t reentrance_mutex;
|
|
|
|
/* Mutex protecting native library against concurrency */
|
|
pthread_mutex_t concurrency_mutex;
|
|
|
|
/* List used to track pending semaphores waiting for callback */
|
|
struct listHead sem_list;
|
|
|
|
} phNxpUciHal_Monitor_t;
|
|
|
|
/************************ Exposed functions ***********************************/
|
|
/* List functions */
|
|
int listInit(struct listHead* pList);
|
|
int listDestroy(struct listHead* pList);
|
|
int listAdd(struct listHead* pList, void* pData);
|
|
int listRemove(struct listHead* pList, void* pData);
|
|
int listGetAndRemoveNext(struct listHead* pList, void** ppData);
|
|
void listDump(struct listHead* pList);
|
|
|
|
/* NXP UCI HAL utility functions */
|
|
phNxpUciHal_Monitor_t* phNxpUciHal_init_monitor(void);
|
|
void phNxpUciHal_cleanup_monitor(void);
|
|
phNxpUciHal_Monitor_t* phNxpUciHal_get_monitor(void);
|
|
tHAL_UWB_STATUS phNxpUciHal_init_cb_data(phNxpUciHal_Sem_t* pCallbackData,
|
|
void* pContext);
|
|
void phNxpUciHal_sem_timed_wait(phNxpUciHal_Sem_t* pCallbackData);
|
|
void phNxpUciHal_cleanup_cb_data(phNxpUciHal_Sem_t* pCallbackData);
|
|
void phNxpUciHal_releaseall_cb_data(void);
|
|
void phNxpUciHal_print_packet(const char* pString, const uint8_t* p_data,
|
|
uint16_t len);
|
|
void phNxpUciHal_emergency_recovery(void);
|
|
double phNxpUciHal_byteArrayToDouble(const uint8_t* p_data);
|
|
|
|
/* Lock unlock helper macros */
|
|
/* Lock unlock helper macros */
|
|
#define REENTRANCE_LOCK() \
|
|
if (phNxpUciHal_get_monitor()) \
|
|
pthread_mutex_lock(&phNxpUciHal_get_monitor()->reentrance_mutex)
|
|
#define REENTRANCE_UNLOCK() \
|
|
if (phNxpUciHal_get_monitor()) \
|
|
pthread_mutex_unlock(&phNxpUciHal_get_monitor()->reentrance_mutex)
|
|
#define CONCURRENCY_LOCK() \
|
|
if (phNxpUciHal_get_monitor()) \
|
|
pthread_mutex_lock(&phNxpUciHal_get_monitor()->concurrency_mutex)
|
|
#define CONCURRENCY_UNLOCK() \
|
|
if (phNxpUciHal_get_monitor()) \
|
|
pthread_mutex_unlock(&phNxpUciHal_get_monitor()->concurrency_mutex)
|
|
#define STREAM_TO_UINT8(u8, p) \
|
|
{ \
|
|
u8 = (uint8_t)(*(p)); \
|
|
(p) += 1; \
|
|
}
|
|
|
|
#define BE_STREAM_TO_UINT32(u32, p) \
|
|
{ \
|
|
u32 = ((uint32_t)(*((p) + 3)) + ((uint32_t)(*((p) + 2)) << 8) + \
|
|
((uint32_t)(*((p) + 1)) << 16) + ((uint32_t)(*(p)) << 24)); \
|
|
(p) += 4; \
|
|
}
|
|
|
|
#endif /* _PHNXPUCIHAL_UTILS_H_ */
|