From f8013e4f432b323dfc3e3725a62858e73176742a Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期五, 01 十一月 2024 15:16:32 +0800 Subject: [PATCH] 更换了新的sdk,测试了实际的uwb测距 --- keil/include/components/app/src/uwb_data_transfer.c | 861 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 723 insertions(+), 138 deletions(-) diff --git a/keil/include/components/app/src/uwb_data_transfer.c b/keil/include/components/app/src/uwb_data_transfer.c index 64cb667..9387e12 100644 --- a/keil/include/components/app/src/uwb_data_transfer.c +++ b/keil/include/components/app/src/uwb_data_transfer.c @@ -43,10 +43,44 @@ #include "mk_aes.h" #include "mk_power.h" +#include "wsf_buf.h" + #include "lib_aoa.h" #include "lib_ranging.h" #include "uwb_data_transfer.h" #include "uwb_data.h" + +#if ((UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0) || (UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1) || \ + (UWB_DATA_TRANSFER_MODE == DATA_TRANSFER_TEST_MODE)) + +#if UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0 +// Serial port receives characters. +static uint8_t ch; +#endif + +#if ((UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0) || (UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1)) + +#define SERIAL_NUM UART_ID0 + +// Serial TX Data Buffer +static uint8_t serial_tx_msg[MDSDU_MTU_MAX * UWB_SERIAL_DATA_POOL_SIZE]; +// Serial RX Data Buffer +static uint8_t serial_rx_msg[MDSDU_MTU_MAX * UWB_SERIAL_DATA_POOL_SIZE]; +#endif + +// Serial TX/RX Data Buffer Memory management functions +static void initMemoryPool(MemoryPool *pool, uint8_t *data); +static void updateMemory_allocate_block(MemoryPool *pool, MemoryBlock *block); +static void *allocateMemory(MemoryPool *pool, uint16_t size); +static bool mergeFreeBlocks(MemoryPool *pool, uint8_t *prt, uint16_t length); +static bool freeMemoryPool(MemoryPool *pool, MemoryBlock *block); + +static MemoryPool g_tx_pool; +static MemoryPool g_rx_pool; + +static bool block_send_flag = false; + +#endif // UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0 or SERIAL_DATA_TRANSFER_MODE_1 or DATA_TRANSFER_TEST_MODE struct RANGING_ENV_T ranging_env; uint8_t fira_uwb_tx_buf[PHY_PAYLOAD_LEN_MAX]; @@ -63,6 +97,8 @@ .session_responder_list_clr = ranging_responder_list_clr, .session_responder_num_get = ranging_responder_num_get, .session_responder_addr_get = ranging_responder_addr_get, + .session_initiator_addr_set = ranging_initiator_addr_set, + .session_controller_addr_set = ranging_controller_addr_set, .session_dynamic_update_responder_list = NULL, .session_set_ccc_ursk = NULL, .vendor_session_configure = NULL, @@ -188,7 +224,20 @@ LOG_INFO(TRACE_MODULE_FIRA, "Ranging stop\r\n"); } -#if 0 +uint16_t data_transfer_send(uint8_t *data, uint16_t length) +{ + struct DM_MDSDU_T mdsdu_tx; + uint16_t status = 0; + mdsdu_tx.mac_addr = ranging_responder_addr_get(0); + mdsdu_tx.len = length; + mdsdu_tx.data = data; + mdsdu_tx.ready = 1; + status = uwb_dm_tx_pkt(&mdsdu_tx); + + return status; +} + +#if 1 /* bitmap for 1 responder slot idx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... @@ -287,34 +336,32 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wcast-qual" #endif + uint16_t uwb_pkt_rx_done_ind(const struct MAC_HW_REPORT_T *rx, enum RANGING_STAGE_T stage, uint8_t slot_idx) { // send an indication to application -#if DM_PRINT_PAYLOAD_EN + struct UWB_PKT_RX_DONE_IND_T *ind = WsfMsgAlloc(sizeof(struct UWB_PKT_RX_DONE_IND_T) + rx->pkt_len); -#else - struct UWB_PKT_RX_DONE_IND_T *ind = WsfMsgAlloc(sizeof(struct UWB_PKT_RX_DONE_IND_T)); -#endif + if (ind != NULL) { ind->hdr.event = UWB_PKT_RX_DONE_MSG; ind->ranging_stage = (uint8_t)stage; ind->slot_idx = slot_idx; ind->status = rx->err_code; - ind->rssi = rx->rssi; - ind->snr = rx->snr; + // ind->rssi = rx->rssi; + ind->rssi = correct_rssi(rx->rssi); + ind->snr = correct_snr(rx->snr); if (rx->err_code == UWB_RX_OK) { #if 1 ind->rx_len = rx->pkt_len; -#if DM_PRINT_PAYLOAD_EN + if ((ind->rx_len) && (rx->pkt_data != NULL)) { memcpy(ind->rx_data, rx->pkt_data, rx->pkt_len); } -#endif - #else // Decrypt packet ind->rx_len = fira_packet_decrypt(rx->pkt_data, ind->rx_data, rx->pkt_len, slot_idx); @@ -374,154 +421,532 @@ session_fsm(rx_report); } -#if UWB_SERIAL_DATA_TRANSFER_EN +#if ((UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0) || (UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1) || \ + (UWB_DATA_TRANSFER_MODE == DATA_TRANSFER_TEST_MODE)) +#if UWB_DATA_TRANSFER_MODE == 1 static uint8_t pkt_header_buff[2]; - static uint8_t data_buff[SERIAL_MESSAGE_MAX_LEN]; +#endif -static struct RING_BUFFER_T tx_cb; -static struct RING_BUFFER_T rx_cb; +/**************************************************************************** + * Private Functions + ****************************************************************************/ -static void uwb_serial_cb_init(struct RING_BUFFER_T *tx, struct RING_BUFFER_T *rx) +/*****************************************************************************/ + +#ifdef MEMORY_DEBUG +void memory_check(void) { - for (int i = 0; i < UWB_SERIAL_DATA_POOL_SIZE; i++) +#if 0 + MemoryBlock *current_free = g_tx_pool.free; + int i = 0; + while(current_free != NULL) + { + LOG_INFO(TRACE_MODULE_APP, "free block[%d] start%p, end %p size %d\r\n", i, (void*)current_free->start,(void*)(current_free->start+current_free->size), current_free->size); + i++; + current_free = current_free->next; + } + + i = 0; + MemoryBlock *current_allocate = g_tx_pool.allocated; + while(current_allocate != NULL) + { + LOG_INFO(TRACE_MODULE_APP, "allocate block[%d] start %p, end %p size %d free %d\r\n", i, (void*)current_allocate->start,(void*)(current_allocate->start+current_allocate->size), current_allocate->size, current_allocate->is_free); + i++; + current_allocate = current_allocate->next; + } +#endif + MemoryBlock *current_free = g_tx_pool.free; + int i = 0; + while (current_free != NULL) { - tx->buffer[i].flag = true; - rx->buffer[i].flag = true; + i++; + current_free = current_free->next; } - tx->head = 0; - tx->tail = 0; - tx->check = 0; + LOG_INFO(TRACE_MODULE_APP, "free block[%d]\r\n", i); - rx->head = 0; - rx->tail = 0; - rx->check = 0; + i = 0; + MemoryBlock *current_allocate = g_tx_pool.allocated; + MemoryBlock *tail = NULL; + while (current_allocate != NULL) + { + i++; + tail = current_allocate; + current_allocate = current_allocate->next; + } + if (tail != g_tx_pool.allocated->tail) + { + LOG_INFO(TRACE_MODULE_APP, "tail != g_tx_pool.allocated->tail\r\n"); + } + LOG_INFO(TRACE_MODULE_APP, "allocate block[%d]\r\n", i); + return; +} +#endif + +#if ((UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0) || (UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1) || \ + (UWB_DATA_TRANSFER_MODE == DATA_TRANSFER_TEST_MODE)) +/**************************************************************************** + * Name: initMemoryPool + * + * Description: Initialize the UWB receive/transmit Circular Buffer. + * + * Input Parameters: + * pool - + * data - + * + * Returned Value: + * NULL + * + ****************************************************************************/ +static void initMemoryPool(MemoryPool *pool, uint8_t *data) +{ + if (data == NULL || pool == NULL) + { + return; + } + LOG_INFO(TRACE_MODULE_APP, "Init Memory POOL 0x%p\r\n", (void *)data); + + pool->memoryPool = data; + + pool->allocated = NULL; + + pool->free = (MemoryBlock *)WsfBufAlloc(sizeof(MemoryBlock)); + + if (pool->free == NULL) + { + WsfBufFree(pool); + pool = NULL; + return; + } + pool->free->start = pool->memoryPool; + pool->free->size = MDSDU_MTU_MAX * UWB_SERIAL_DATA_POOL_SIZE; + pool->free->is_free = 1; + pool->free->next = NULL; + pool->free->prev = NULL; + pool->free->tail = pool->free; return; } -static bool uwb_serial_cb_is_full(struct RING_BUFFER_T *cb) +/**************************************************************************** + * Name: updateMemory_allocate_block + * + * Description: Add allocated memory to the memory management chain table + * + * Input Parameters: + * pool - + * block - + * + * Returned Value: + * NULL + * + ****************************************************************************/ +static void updateMemory_allocate_block(MemoryPool *pool, MemoryBlock *block) { - if (cb->buffer[cb->tail].flag == false && ((cb->tail + 1) % (UWB_SERIAL_DATA_POOL_SIZE) == cb->head)) + if (pool == NULL || block == NULL) { - LOG_WARNING(TRACE_NO_OPTION | TRACE_MODULE_APP, "tx_cb_is_full\r\n"); - return true; - } - return false; -} - -static struct UWB_TX_MSG_t *uwb_serial_cb_read(struct RING_BUFFER_T *cb) -{ - if (cb->buffer[cb->check].flag == false) - { - return &cb->buffer[cb->check]; - } - - return NULL; -} - -static void uwb_serial_cb_write(struct RING_BUFFER_T *cb, uint8_t *value, uint16_t length) -{ - if (uwb_serial_cb_is_full(cb)) - { - LOG_INFO(TRACE_MODULE_APP, "uwb serial data fifo full\r\n"); + LOG_INFO(TRACE_MODULE_APP, "%s Input parameter error\r\n", __func__); return; } - - if (cb->buffer[cb->tail].flag == true) + if (pool->allocated == NULL) { - cb->buffer[cb->tail].flag = false; - cb->buffer[cb->tail].length = length; - memcpy(&cb->buffer[cb->tail].msg, value, cb->buffer[cb->tail].length); -#if 0 - LOG_INFO(TRACE_NO_OPTION | TRACE_MODULE_APP, "serial write FIFO[%d] MSG\r\n", cb->tail); - for (uint8_t i = 0; i < cb->buffer[cb->tail].length; i++) - { - LOG_INFO(TRACE_NO_OPTION | TRACE_MODULE_APP, "%02x ", cb->buffer[cb->tail].msg[i]); - } - LOG_INFO(TRACE_NO_OPTION | TRACE_MODULE_APP, "\r\n"); -#endif + block->next = NULL; + block->prev = NULL; + block->tail = block; + pool->allocated = block; } else { - LOG_INFO(TRACE_MODULE_APP, "uwb fifo block number %d\r\n", cb->tail); + MemoryBlock *tail = pool->allocated->tail; + tail->next = block; + + block->next = NULL; + block->prev = tail; + + pool->allocated->tail = block; } - cb->tail = (cb->tail + 1) % UWB_SERIAL_DATA_POOL_SIZE; -} - -void uwb_serial_tx_msg_check(void) -{ - struct UWB_TX_MSG_t *uwb_tx_msg = uwb_serial_cb_read(&tx_cb); - - if (uwb_tx_msg == NULL) - { - return; - } - if (uwb_dm_tx_is_busy() == 1) - { - return; - } - if (uwb_tx_msg->flag == false) - { - struct DM_MDSDU_T mdsdu_tx; - mdsdu_tx.mac_addr = ranging_responder_addr_get(0); - mdsdu_tx.len = uwb_tx_msg->length; - mdsdu_tx.data = uwb_tx_msg->msg; - mdsdu_tx.ready = 1; - - uwb_dm_tx_pkt(&mdsdu_tx); - - tx_cb.buffer[tx_cb.check].flag = true; - - tx_cb.check = (tx_cb.check + 1) % UWB_SERIAL_DATA_POOL_SIZE; - return; - } - return; } -void uwb_serial_rx_msg_update(struct DM_MDSDU_T *rx) +/**************************************************************************** + * Name: allocateMemory + * + * Description: Allocation of memory + * + * Input Parameters: + * pool - + * size - + * + * Returned Value: + * NULL + * + ****************************************************************************/ +static void *allocateMemory(MemoryPool *pool, uint16_t size) { - rx_cb.buffer[rx_cb.check].length = rx->len; - rx_cb.buffer[rx_cb.check].flag = false; + uint32_t lock = int_lock(); - rx_cb.check = (rx_cb.check + 1) % UWB_SERIAL_DATA_POOL_SIZE; + void *prt = NULL; + MemoryBlock *current = pool->free; - uwb_dm_rx_config(rx_cb.buffer[rx_cb.check].msg); - - return; -} - -void uwb_serial_rx_msg_check(void) -{ - if (rx_cb.buffer[rx_cb.tail].flag == false) + while (current != NULL) { -#if 0 - LOG_INFO(TRACE_NO_OPTION | TRACE_MODULE_APP, "serial read FIFO[%d] MSG\r\n", rx_cb.tail); - for (uint8_t i = 0; i < rx_cb.buffer[rx_cb.tail].length; i++) + if (current->is_free && current->size >= size) { - LOG_INFO(TRACE_NO_OPTION | TRACE_MODULE_APP, "%02x ", rx_cb.buffer[rx_cb.tail].msg[i]); + MemoryBlock *allocateblock = (MemoryBlock *)WsfBufAlloc(sizeof(MemoryBlock)); + if (allocateblock == NULL) + { + return NULL; + } + + allocateblock->is_free = 0; + allocateblock->size = size; + allocateblock->start = current->start; + + updateMemory_allocate_block(pool, allocateblock); + + uint16_t free_size = current->size - size; + + current->start = current->start + size * sizeof(uint8_t); + current->size = free_size; + current->is_free = 1; + prt = (void *)allocateblock->start; + break; } - LOG_INFO(TRACE_NO_OPTION | TRACE_MODULE_APP, "\r\n"); -#endif - int ret = DRV_OK; - ret = uart_send(UART_ID1, rx_cb.buffer[rx_cb.tail].msg, rx_cb.buffer[rx_cb.tail].length, 0); + current = current->next; + } - if (ret != DRV_OK) + int_unlock(lock); + + return prt; +} + +/**************************************************************************** + * Name: mergeFreeBlocks + * + * Description: Merge neighboring memory blocks. + * + * Input Parameters: + * pool - + * prt - + * length - + * + * Returned Value: + * NULL + * + ****************************************************************************/ +static bool mergeFreeBlocks(MemoryPool *pool, uint8_t *prt, uint16_t length) +{ + MemoryBlock *current = pool->free; + + uint8_t *start_addr = prt; + uint8_t *end_addr = prt + length; + + bool ret = false; + + while (current != NULL) + { + if (current->start == (end_addr)) { - LOG_INFO(TRACE_MODULE_APP, "UART ERROR 0x%02x\r\n", ret); + current->start = start_addr; + current->size = length + current->size; + current->is_free = 1; + + ret = true; + break; + } + else if (start_addr == (current->start + current->size)) + { + current->size = length + current->size; + current->is_free = 1; + + ret = true; + break; + } + + current = current->next; + } + + if (current != NULL && current->prev != NULL) + { + if ((current->prev->start + current->prev->size) == current->start) + { + current->prev->size = current->prev->size + current->size; + current->prev->is_free = 1; + current->prev->next = current->next; + current->next->prev = current->prev; + if (pool->free->tail == current) + { + pool->free->tail = current->prev; + } + WsfBufFree(current); + current = NULL; + } + if ((current->start + current->size) == current->prev->start) + { + current->prev->start = current->start; + current->prev->size = current->prev->size + current->size; + current->prev->is_free = 1; + current->prev->next = current->next; + current->next->prev = current->prev; + if (pool->free->tail == current) + { + pool->free->tail = current->prev; + } + WsfBufFree(current); + current = NULL; + } + } + if (current != NULL && current->next != NULL) + { + if (((current->start + current->size) == current->next->start)) + { + current->size = current->size + current->next->size; + current->is_free = 1; + if (pool->free->tail == current->next) + { + pool->free->tail = current; + } + current->next = current->next->next; + current->next->next->prev = current; + + WsfBufFree(current->next); + current->next = NULL; + } + if ((current->next->start + current->next->size) == current->start) + { + current->start = current->next->start; + current->size = current->size + current->next->size; + current->is_free = 1; + if (pool->free->tail == current->next) + { + pool->free->tail = current; + } + current->next = current->next->next; + current->next->next->prev = current; + + WsfBufFree(current->next); + current->next = NULL; + } + } + return ret; +} + +/**************************************************************************** + * Name: freeMemoryPool + * + * Description: free memory blocks. + * + * Input Parameters: + * pool - + * prt - + * length - + * + * Returned Value: + * NULL + * + ****************************************************************************/ +static bool freeMemoryPool(MemoryPool *pool, MemoryBlock *block) +{ + uint32_t lock = int_lock(); + if (pool == NULL || block == NULL) + { + LOG_INFO(TRACE_MODULE_APP, "%s Input parameter error\r\n", __func__); + return false; + } + + MemoryBlock *current_allocate = block; + + MemoryBlock *next = current_allocate->next; + MemoryBlock *prev = current_allocate->prev; + uint16_t block_len = current_allocate->size; + uint8_t *prt = current_allocate->start; + + if (next == NULL && prev == NULL) + { + pool->allocated = NULL; + } + else if (prev == NULL) + { + next->tail = pool->allocated->tail; + pool->allocated = next; + pool->allocated->prev = NULL; + } + else + { + prev->next = next; + next->prev = prev; + + if (pool->allocated->tail == current_allocate) + { + pool->allocated->tail = prev; + } + else if (pool->allocated->tail == pool->allocated) + { + pool->allocated->tail = NULL; + } + } + + WsfBufFree(current_allocate); + current_allocate = NULL; + + bool flag = mergeFreeBlocks(pool, prt, block_len); + + if (flag == false) + { + MemoryBlock *newfreeblock = (MemoryBlock *)WsfBufAlloc(sizeof(MemoryBlock)); + if (newfreeblock == NULL) + { + return false; + } + newfreeblock->start = prt; + newfreeblock->size = block_len; + newfreeblock->is_free = 1; + newfreeblock->next = NULL; + newfreeblock->prev = pool->free->tail; + pool->free->tail->next = newfreeblock; + pool->free->tail = newfreeblock; + } + + int_unlock(lock); + + return true; +} +/*****************************************************************************/ + +/**************************************************************************** + * Name: uwb_serial_cb_init + * + * Description: + * Initialize UWB transmit/receive Circular Buffer. + ****************************************************************************/ + +void uwb_cb_init(uint8_t *tx_cb, uint8_t *rx_cb) +{ + if (tx_cb == NULL || rx_cb == NULL) + { + LOG_INFO(TRACE_MODULE_APP, "\r\n Initialize UWB transmit/receive Circular Buffer Error\r\n"); + return; + } + + initMemoryPool(&g_tx_pool, tx_cb); + initMemoryPool(&g_rx_pool, rx_cb); + return; +} + +/**************************************************************************** + * Name: uwb_serial_cb_read + * + * Description: Accessing the UWB receive/transmit Circular Buffer. + * + * Input Parameters: + * cb - UWB transmit/receive Circular Buffers + * + * Returned Value: + * Returns the first valid data segment of the UWB receive/transmit Circular Buffer. + * + ****************************************************************************/ +struct MemoryBlock *uwb_transmit_cb_read(void) +{ + MemoryBlock *current_allocate = g_tx_pool.allocated; + MemoryBlock *next = NULL; + if (current_allocate == NULL) + { + return NULL; + } + + while (current_allocate != NULL) + { + if (current_allocate->is_free == 1) + { + next = current_allocate->next; + bool ret = freeMemoryPool(&g_tx_pool, current_allocate); + if (ret == false) + { + LOG_INFO(TRACE_MODULE_APP, "free Memory address %p fail\r\n", (void *)current_allocate->start); + } + current_allocate = next; } else { - rx_cb.buffer[rx_cb.tail].flag = true; - rx_cb.tail = (rx_cb.tail + 1) % UWB_SERIAL_DATA_POOL_SIZE; + break; } } + return current_allocate; +} + +struct MemoryBlock *uwb_receive_cb_read(void) +{ + MemoryBlock *current_allocate = g_rx_pool.allocated; + + if (current_allocate == NULL) + { + return NULL; + } + + if (current_allocate->is_free == 1) + { + return NULL; + } + if (current_allocate->next != NULL) + { + LOG_INFO(TRACE_MODULE_APP, "Next full\r\n"); + } + return current_allocate; +} + +/**************************************************************************** + * Name: uwb_serial_cb_write + * + * Description: Write the data received from the serial port to the UWB buffer + * and wait for UWB transmission. + * + * Input Parameters: + * cb - UWB transmit/receive Circular Buffers + * value - Waiting for data to be sent from UWB + * length - Length of data waiting to be sent by the UWB + * + * Returned Value: + * NULL + * + ****************************************************************************/ + +void uwb_transmit_cb_write(uint16_t length) +{ + uint8_t *ptr = (uint8_t *)allocateMemory(&g_tx_pool, length); + + if (ptr == NULL) + { + LOG_INFO(TRACE_MODULE_APP, "uwb transmit Cache full\r\n"); + return; + }; + return; +} + +void uwb_receive_cb_write(const uint8_t *value, uint16_t length) +{ + uint8_t *ptr = (uint8_t *)allocateMemory(&g_rx_pool, length); + + if (ptr == NULL) + { + LOG_INFO(TRACE_MODULE_APP, "uw breceive Cache full\r\n"); + return; + } + + memcpy(ptr, value, length); return; } + +#if UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1 + +/**************************************************************************** + * Name: serial_receive_callback + * + * Description: + * Serial port receive data callback function + ****************************************************************************/ static void serial_receive_callback(void *dev, uint32_t err_code) { @@ -568,13 +993,164 @@ if (tmp_read_idx == 0) { - uart_receive(UART_ID1, pkt_header_buff, sizeof(pkt_header_buff), serial_receive_callback); + uart_receive(SERIAL_NUM, pkt_header_buff, sizeof(pkt_header_buff), serial_receive_callback); } int_unlock(lock); } +#elif UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0 + +/**************************************************************************** + * Name: serial_receive_callback + * + * Description: + * Serial port receive data callback function + * This function will receive a single character from the uart module and + * append it to a string. The string will be be sent over UWB when the + * last character received was a 'new line' '\n' (hex 0x0A) or if the + * string has reached the maximum data length. + ****************************************************************************/ + +static void serial_receive_callback(void *dev, uint32_t err_code) +{ + uint32_t lock = int_lock(); + + static uint16_t index = 0; + + g_tx_pool.free->start[index] = ch; + + index++; + if ((g_tx_pool.free->start[index - 1] == '\n') || (g_tx_pool.free->start[index - 1] == '\r')) + { + // When the last character received is 'new line' '\n' (hex 0x0A) + // then it is not transmitted + if (index > 1) + { + // Write complete string to UWB transmit buffer + uwb_transmit_cb_write(index); + } + index = 0; + } + else if (index == MDSDU_MTU_MAX) + { + // Write complete string to UWB transmit buffer + uwb_transmit_cb_write(index); + index = 0; + } + + uart_receive(SERIAL_NUM, &ch, 1, serial_receive_callback); + + int_unlock(lock); + return; +} + +#endif //#if UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1 + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +#if (UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0 || UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1) + +/**************************************************************************** + * Name: uwb_serial_tx_msg_check + * + * Description: + * Check if there is data to be sent in the UWB transmit buffer, + * if so, send it. + ****************************************************************************/ + +void uwb_serial_tx_msg_check(void) +{ + if (block_send_flag == true) + { + return; + } + + MemoryBlock *current_send_block = uwb_transmit_cb_read(); + + if (current_send_block == NULL) + { + return; + } + if (uwb_dm_tx_is_busy() == 1) + { + return; + } + current_send_block->is_free = 1; + + struct DM_MDSDU_T mdsdu_tx; + mdsdu_tx.mac_addr = ranging_responder_addr_get(0); + mdsdu_tx.len = current_send_block->size; + mdsdu_tx.data = current_send_block->start; + mdsdu_tx.ready = 1; + + uwb_dm_tx_pkt(&mdsdu_tx); + + block_send_flag = true; + + return; +} + +/**************************************************************************** + * Name: uwb_serial_rx_msg_check + * + * Description: + * Check if there is data in the UWB receive data buffer and send it + * through the serial port if there is. + ****************************************************************************/ + +void uwb_serial_rx_msg_check(void) +{ + int ret = DRV_OK; + + MemoryBlock *block = uwb_receive_cb_read(); + + if (block == NULL) + { + return; + } + + ret = uart_send(SERIAL_NUM, block->start, block->size, 0); + + if (ret == DRV_OK) + { + freeMemoryPool(&g_rx_pool, block); + } + + return; +} + +void uwb_serial_data_transfer_tx_done(void) +{ + block_send_flag = false; + // LOG_INFO(TRACE_MODULE_APP, "block_send_flag %d \r\n",block_send_flag); +} + +#endif //(UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0 || UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1) + +#endif // UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0 or SERIAL_DATA_TRANSFER_MODE_1 or DATA_TRANSFER_TEST_MODE + +/**************************************************************************** + * Name: uwb_serial_data_transfer_init + * + * Description: + * UWB Serial Data Transfer passthrough initialization + * Mode 0, packet has no data format, serial data is terminated by '\r\n'. + * Mode 1, packet has packet format 2 bytes data length and payload. + * + * Input Parameters: + * NULL + * + * Returned Value: + * NULL + * + ****************************************************************************/ + void uwb_serial_data_transfer_init(void) { +#if UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_1 + LOG_INFO(TRACE_MODULE_APP, "UART input data format: Length(2B) + Data \r\n"); struct UART_CFG_T serialuwb_cfg = { @@ -590,18 +1166,43 @@ .int_tx = false, }; - uart_open(UART_ID1, &serialuwb_cfg); + uart_open(SERIAL_NUM, &serialuwb_cfg); uwb_serial_cb_init(&tx_cb, &rx_cb); uwb_dm_rx_config(rx_cb.buffer[rx_cb.head].msg); - uart_receive(UART_ID1, pkt_header_buff, sizeof(pkt_header_buff), serial_receive_callback); + uart_receive(SERIAL_NUM, pkt_header_buff, sizeof(pkt_header_buff), serial_receive_callback); + +#elif UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0 + + struct UART_CFG_T serialuwb_cfg = { + .parity = UART_PARITY_NONE, + .stop = UART_STOP_BITS_1, + .data = UART_DATA_BITS_8, + .flow = UART_FLOW_CONTROL_NONE, + .rx_level = UART_RXFIFO_CHAR_1, + .tx_level = UART_TXFIFO_EMPTY, + .baud = BAUD_921600, + .dma_en = false, + .int_rx = true, + .int_tx = true, + }; + + uart_open(SERIAL_NUM, &serialuwb_cfg); + + uwb_cb_init(serial_tx_msg, serial_rx_msg); + + uwb_dm_rx_config(g_rx_pool.free->start); + + uart_receive(SERIAL_NUM, &ch, 1, serial_receive_callback); + +#endif return; } -#else +#elif UWB_DATA_TRANSFER_MODE == DATA_TRANSFER_TEST_MODE #include "mk_timer.h" @@ -641,29 +1242,13 @@ return; } -static void timer_callback(void *dev, uint32_t time) -{ - uwb_data_transfer_send_test(); -} - void uwb_data_transfer_init_test(void) { - if (uwb_app_config.session_param.device_role == DEV_ROLE_INITIATOR) - { - data_gen(length); - struct TIMER_CFG_T timer_cfg = { - .extin_type = TIMER_EXTIN_NONE, - .load = 0x7A12, - .int_en = true, - .callback = timer_callback, - }; - - timer_open(TIMER_ID0, &timer_cfg); - } + data_gen(length); uwb_dm_rx_config(rx_buff); return; } -#endif +#endif //#if ((UWB_DATA_TRANSFER_MODE == SERIAL_DATA_TRANSFER_MODE_0 || SERIAL_DATA_TRANSFER_MODE_1 || DATA_TRANSFER_TEST_MODE)) -- Gitblit v1.9.3