diff options
Diffstat (limited to 'Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c')
-rw-r--r-- | Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c | 333 |
1 files changed, 251 insertions, 82 deletions
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c index 3b1438308..76d6d0360 100644 --- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c +++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c @@ -42,15 +42,21 @@ #include <string.h> #include <stdio.h> #include <errno.h> +#include "serial_if.h" +#include "ble_common.h" #include "hal_common.h" #include "mesh_cfg.h" -#include "serial_if.h" #if ENABLE_SERIAL_CONTROL #include "serial_ctrl.h" #endif #if ENABLE_UT #include "serial_ut.h" #endif +#if ENABLE_APPLI_TEST +#include "appli_test.h" +#endif +#include "stm_queue.h" +#include "stm32_seq.h" /** @addtogroup BLE_Mesh * @{ @@ -61,30 +67,207 @@ */ /* Private define ------------------------------------------------------------*/ -#define RECEIVE_STRING_SIZE 48 +#define RECEIVE_STRING_SIZE 48 +#define RX_BUFFER_SIZE 48/*64*/ +#define ESC 0x1b /* Private macro -------------------------------------------------------------*/ typedef enum { - STATE_IDLE, - STATE_INPUT_ENTERED, + STATE_IDLE, + STATE_INPUT_ENTERED, }tSerialState; /* Private variables ---------------------------------------------------------*/ static char Rcvd_String[RECEIVE_STRING_SIZE]; tSerialState SerialCurrentState = STATE_IDLE; +static uint8_t InputCharFromUart; +static queue_t RxQueue; +static uint8_t RxQueueBuffer[RX_BUFFER_SIZE]; +static int stringSize; +static int ch; +static int index_str; + /* Private function prototypes -----------------------------------------------*/ -static int Serial_GetString(MOBLEUINT8*, MOBLEUINT8); +static int Serial_GetString(MOBLEUINT8* text, MOBLEUINT8 size); #if (!ENABLE_UT) __weak void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize); #endif #if (!ENABLE_SERIAL_CONTROL) __weak void SerialCtrl_Process(char *rcvdStringBuff, uint16_t rcvdStringSize); #endif +#if (!ENABLE_APPLI_TEST) +__weak void SerialResponse_Process(char *rcvdStringBuff, uint16_t rcvdStringSize); +#endif /* Private functions ---------------------------------------------------------*/ /** + * @brief DBG_TRACE USART Rx Transfer completed callback + * @retval None + */ +static void Serial_RxCpltCallback( void ) +{ + CircularQueue_Add(&RxQueue, &InputCharFromUart,1,1); + + Serial_InterfaceProcess(); + UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_UART_RX_REQ_ID, CFG_SCH_PRIO_0); + + return; + } + +/** + * @brief DBG_TRACE USART Rx Transfer completed callback + * @retval None + */ +static void Serial_Uart_Rx_Task( void ) +{ + HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, &InputCharFromUart, 1, Serial_RxCpltCallback); +} + +/** + * ***************************************************************************** + * @fn char UartReadChar(uint8_t blocking) + * @author - + * @brief Wait until the receipt of a character from an Uart or JTAG, + * then convert it into ASCII and return the character + * @param blocking : blocking mode + * @return Return the character received from the serial link or the JTAG. + * ***************************************************************************** + */ +static char UartReadChar(uint8_t blocking) +{ + uint16_t size; + uint8_t *c; + static uint8_t ESC_Seq = 0; + uint8_t leave = 0; + char retc = 0; + static uint16_t ESC_Timeout = 0; + + while (!leave) + { + c = CircularQueue_Remove(&RxQueue, &size); + if (!c) + { + if (ESC_Seq == 1) + { + if (--ESC_Timeout == 0) + { + retc = ESC; + ESC_Seq = 0; + break; /* Assume ESC have been hit */ + } + } + if (!blocking) leave=1; + } + else if (c) /* I got a char */ + { + retc = *c; + if ((*c == ESC) && (ESC_Seq == 0)) /* ESC sequence */ + { + ESC_Timeout = 5000; /* Maybe better to arm a timer */ + ESC_Seq = 1; /* If ESC AND Esc_seq ==> error case, here we just restart ESC sequence */ + retc = 0; + } + else if (ESC_Seq == 1) /* check second char in ESC sequence */ + { + if (*c == '[') /* True ESC sequence */ + { + /* wait for next char in ESC seq */ + ESC_Seq++; + retc = 0; + ESC_Timeout = 0; + } + else /* Unexpected char follwing ESC, so ESC hit [no ESC sequence ] */ + { + leave = 1; + ESC_Seq = 0; + retc = ESC; + ESC_Timeout = 0; + } + } + else if (ESC_Seq == 2) + { + leave = 1; + ESC_Seq = 0; + retc = *c | 0x80; + } + else + { + leave = 1; + } + } + } + + return retc; +} + +/** +* @brief Gets the input from user from Serial port +* @param text: String to take input +* @param size: Size of string +* @retval int: Running Status of the test case +*/ +static int Serial_GetString(MOBLEUINT8* text, MOBLEUINT8 size) +{ +// static int index_str = 0; + stringSize = 0; + +#ifndef __IAR_SYSTEMS_ICC__ + clearerr(stdin); +#endif + ch = (int)(UartReadChar(FALSE)); + /* Note: Please use Full Library configuration in project options to use the full + configuration of the C/C++ runtime library for printf and scanf functionality */ + /* Check for error in get function */ + if (ch == EOF) + { +#ifndef __IAR_SYSTEMS_ICC__ + clearerr(stdin); +#endif + } + /* check for backspace press */ + else if (ch == 0x08) + { + if (index_str > 0) + { + --index_str; + } + TRACE_I(TF_SERIAL_CTRL,"\b"); + } + /* Check for the enter key*/ + else if ((ch == 0x0D) || (ch == 0xFFFFFF0D)) + { + /* check for first time enter to display help message */ + if (index_str == 0) + { + stringSize = 1; + } + else + { + stringSize = index_str; + } + index_str = 0; + TRACE_I(TF_SERIAL_CTRL,"\n\r"); + // return stringSize; + } + else + { + TRACE_I(TF_SERIAL_CTRL,"%c", ch); + if (index_str < size) + { + /* check if lowercase and convert it to upper case */ + if ((ch >= 'a') && (ch <= 'z')) + { + ch = ch + 'A' - 'a'; + } + text[index_str++] = (char)ch; + } + } + return stringSize; +} + +/** * @brief This funcrion is used to parse the string given by the user(If * implemented in application, * linker would replace weak linking in library ) @@ -108,6 +291,13 @@ __weak void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize) { } #endif + +#if (!ENABLE_APPLI_TEST) +__weak void SerialResponse_Process(char *rcvdStringBuff, uint16_t rcvdStringSize) +{ +} +#endif + /** * @brief Processes data coming from serial port * @param void @@ -115,90 +305,52 @@ __weak void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize) */ void Serial_InterfaceProcess(void) { - int stringSize = 0; - - stringSize = Serial_GetString((MOBLEUINT8*)Rcvd_String, sizeof(Rcvd_String) - 1); - /* Check if no input has come from user */ - if (!stringSize) - { - return; - } - else - { - Rcvd_String[stringSize] = 0; /* Make last char NULL for string comp */ + Serial_GetString((MOBLEUINT8*)Rcvd_String, sizeof(Rcvd_String) - 1); + /* Check if no input has come from user */ + if (!stringSize) + { +// TRACE_I(TF_SERIAL_CTRL,"No input come from user\r\n"); + return; + } + else + { + Rcvd_String[stringSize] = 0; /* Make last char NULL for string comp */ - /* Check if correct string has been entered or not */ - if (!strncmp(Rcvd_String, "ctrl", 4)) - { - SerialCtrl_Process(Rcvd_String, stringSize); - } - else if(!strncmp(Rcvd_String, "test", 4)) - { - SerialUt_Process(Rcvd_String, stringSize); - } - else - { - TRACE_M(TF_SERIAL_CTRL,"Not Entered valid test parameters\r\n"); - SerialCurrentState = STATE_IDLE; - } + /* Check if correct string has been entered or not */ +#ifdef ENABLE_SERIAL_CONTROL + if (!strncmp(Rcvd_String, "ATCL", 4)) + { + SerialCtrl_Process(Rcvd_String, stringSize); } -} - -/** -* @brief Gets the input from user from Serial port -* @param text: String to take input -* @param size: Size of string -* @retval int: Running Status of the test case -*/ -static int Serial_GetString(MOBLEUINT8* text, MOBLEUINT8 size) -{ - static int index = 0; - int stringSize = 0; - -#ifndef __IAR_SYSTEMS_ICC__ - clearerr(stdin); -#endif - int ch = getchar(); - /* Note: Please use Full Library configuration in project options to use the full - configuration of the C/C++ runtime library for printf and scanf functionality */ - /* Check for error in get function */ - if (ch == EOF) - { -#ifndef __IAR_SYSTEMS_ICC__ - clearerr(stdin); #endif +#if ENABLE_UT + else if(!strncmp(Rcvd_String, "ATUT", 4)) + { + SerialUt_Process(Rcvd_String, stringSize); } - /* check for backspace press */ - else if (ch == 0x7F) +#endif +#if ENABLE_APPLI_TEST + else if(!strncmp(Rcvd_String, "ATAP", 4)) { - if (index) --index; - TRACE_M(TF_SERIAL_CTRL,"\b"); + SerialResponse_Process(Rcvd_String, stringSize); } - /* Check for the enter key*/ - else if ((ch == 0x0D) || (ch == 0xFFFFFF0D)) +#endif +#ifdef ENABLE_AUTH_TYPE_INPUT_OOB + else if(!strncmp(Rcvd_String, "ATIN", 4)) { - /* check for first time enter to display help message */ - if (!index) - { - stringSize = 1; - } - else - { - stringSize = index; - } - index = 0; - TRACE_M(TF_SERIAL_CTRL,"\n\r"); - return stringSize; + Appli_BleSerialInputOOBValue(Rcvd_String, stringSize); } +#endif else { - TRACE_M(TF_SERIAL_CTRL,"%c", ch); - if (index < size) - { - text[index++] = (char)ch; - } + TRACE_I(TF_SERIAL_CTRL,"Not Entered valid test parameters\r\n"); + SerialCurrentState = STATE_IDLE; + } + while(stringSize) + { + Rcvd_String[--stringSize] = 0; } - return stringSize; + } } /** @@ -207,7 +359,7 @@ static int Serial_GetString(MOBLEUINT8* text, MOBLEUINT8 size) * @retval MOBLEUINT8 */ - MOBLEUINT8 Serial_CharToHexConvert(char addr) +MOBLEUINT8 Serial_CharToHexConvert(char addr) { MOBLEUINT8 retVal=0; if (addr >= '0' && addr <= '9') @@ -223,13 +375,29 @@ static int Serial_GetString(MOBLEUINT8* text, MOBLEUINT8 size) } /** + * @brief This function initialize the Rx from UART + * @param None + * @retval None + */ +void Serial_Init(void) +{ + CircularQueue_Init(&RxQueue, RxQueueBuffer, RX_BUFFER_SIZE, 1, CIRCULAR_QUEUE_NO_WRAP_FLAG); + +// HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, &InputCharFromUart, 1, Serial_RxCpltCallback); + UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_UART_RX_REQ_ID, UTIL_SEQ_RFU, Serial_Uart_Rx_Task ); + UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_UART_RX_REQ_ID, CFG_SCH_PRIO_0); + + return; +} + +/** * @brief Callback function to print data serially * @param *message: Pointer of data string * @retval void */ void BLEMesh_PrintStringCb(const char *message) { - TRACE_M(TF_SERIAL_CTRL,"%s", (char*)message); + TRACE_I(TF_SERIAL_CTRL,"%s\n\r", (char*)message); } /** * @brief Callback function to print data array on screen LSB first @@ -241,10 +409,11 @@ void BLEMesh_PrintDataCb(MOBLEUINT8* data, MOBLEUINT16 size) { for (int count=0; count<size; ++count) { - TRACE_M(TF_SERIAL_CTRL,"%02X", data[count]); + TRACE_I(TF_SERIAL_CTRL,"%02X", data[count]); } - TRACE_M(TF_SERIAL_CTRL,"\n\r"); + TRACE_I(TF_SERIAL_CTRL,"\n\r"); } + /** * @} */ |