Mercurial > public > ostc4
changeset 400:7bcbbaa42cbf ImproveBluetooth
Added retry through power off/on cycle:
During tests sometime (<10%) the initialization of the module failed which was visible due to a deactivated Bluetooth option. Manual activation was always successfull. To improve the startup behavior a retry by using a module power off / on cycle has been added
author | ideenmodellierer |
---|---|
date | Sat, 28 Dec 2019 19:42:04 +0100 |
parents | 523892f62ce0 |
children | 4151fddb1e34 |
files | Discovery/Inc/tComm.h Discovery/Src/tComm.c |
diffstat | 2 files changed, 53 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/Discovery/Inc/tComm.h Sat Dec 21 20:21:26 2019 +0100 +++ b/Discovery/Inc/tComm.h Sat Dec 28 19:42:04 2019 +0100 @@ -41,8 +41,8 @@ BM_CONFIG_SIGNAL_POLL, BM_CONFIG_BAUD, BM_CONFIG_SILENCE, -// BM_CONFIG_DISABLE_EVENT, - BM_CONFIG_DONE + BM_CONFIG_DONE, + BM_CONFIG_RETRY } BlueModTmpConfig_t; /* Exported functions --------------------------------------------------------*/
--- a/Discovery/Src/tComm.c Sat Dec 21 20:21:26 2019 +0100 +++ b/Discovery/Src/tComm.c Sat Dec 28 19:42:04 2019 +0100 @@ -107,7 +107,9 @@ #define BYTE_SERVICE_MODE (0xAA) #define UART_TIMEOUT_SECONDS (120u) /* Timeout for keeping connection open and waiting for data */ -#define UART_TIMEOUT_LARGE_BLOCK (6000u) /* Timeout (ms) for receiption of an 16K data block (typical RX time ~4,5seconds) */ +#define UART_TIMEOUT_LARGE_BLOCK (6000u) /* Timeout (ms) for reception of an 16K data block (typical RX time ~4,5seconds) */ + +#define UART_CMD_BUF_SIZE (20u) /* size of buffer for command exchange */ const uint8_t id_Region1_firmware = 0xFF; const uint8_t id_RTE = 0xFE; @@ -1917,13 +1919,13 @@ uint8_t tComm_CheckAnswerOK() { char answerOkay[] = "\r\nOK\r\n"; - char aRxBuffer[20]; + char aRxBuffer[UART_CMD_BUF_SIZE]; uint8_t sizeAnswer = sizeof(answerOkay) -1; uint8_t result = HAL_OK; uint8_t index = 0; uint8_t answer; - memset(aRxBuffer,0,20); + memset(aRxBuffer,0,UART_CMD_BUF_SIZE); if(HAL_UART_Receive(&UartHandle, (uint8_t*)aRxBuffer, sizeAnswer, 1000) == HAL_OK) { do @@ -1935,7 +1937,10 @@ do { answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&aRxBuffer[index], 1, 10); - if (index < 20) index++; + if (index < UART_CMD_BUF_SIZE) + { + index++; + } }while(answer == HAL_OK); index = sizeAnswer; } @@ -1952,7 +1957,7 @@ return result; } -char SignalStr[20]; + void tComm_EvaluateBluetoothStrength(void) { @@ -1962,8 +1967,8 @@ uint8_t sizeRequest = sizeof(aTxBufferBarSSI) -1; uint8_t answer = HAL_OK; - char aRxBuffer[20]; - + char aRxBuffer[UART_CMD_BUF_SIZE]; + char SignalStr[UART_CMD_BUF_SIZE]; uint8_t index = 0; uint8_t strindex = 0; int8_t sigqual = 0; @@ -1979,7 +1984,10 @@ do /* Answer is not the common one. Instead the signal strength is received => read all available bytes one by one*/ { answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&aRxBuffer[index], 1, 100); - if(index < 20-1) index++; + if(index < UART_CMD_BUF_SIZE) + { + index++; + } }while(answer == HAL_OK); if((aRxBuffer[index] != 'E') && (aRxBuffer[index] != 0)) /* E represents the first letter of the string ERROR */ @@ -1989,20 +1997,13 @@ do { SignalStr[strindex++] = aRxBuffer[index++]; - }while ((index < 20) && (aRxBuffer[index] != '\r')); + }while ((index < UART_CMD_BUF_SIZE - 1) && (aRxBuffer[index] != '\r')); SignalStr[strindex] = 0; /* terminate String */ sigqual = strtol(SignalStr,NULL,0); -#if 0 - if(sigqual & 0x80) /* high bit set? */ - { - sigqual = ~sigqual; /* calc complement of 2 */ - sigqual++; - } -#endif /* Map db to abstract Bargraph */ if(sigqual > 0) { - sprintf(SignalStr,"Bluetooth ||||||||||"); + sprintf(SignalStr,"Bluetooth ||||||||"); } else { @@ -2027,7 +2028,10 @@ do /* module will answer with current connection state */ { answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&aRxBuffer[index], 1, 100); - if(index < 20-1) index++; + if(index < UART_CMD_BUF_SIZE) + { + index++; + } }while(answer == HAL_OK); } } @@ -2036,26 +2040,29 @@ void tComm_StartBlueModConfig() { uint8_t answer = HAL_OK; - uint8_t RxBuffer[20]; + uint8_t RxBuffer[UART_CMD_BUF_SIZE]; uint8_t index = 0; BmTmpConfig = BM_CONFIG_ECHO; do /* flush RX buffer */ { answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&RxBuffer[index], 1, 10); - if(index < 20-1) index++; + if(index < UART_CMD_BUF_SIZE) index++; }while(answer == HAL_OK); } uint8_t tComm_HandleBlueModConfig() { - static uint8_t ConfigRetryCnt = 0; + static uint8_t RestartModule = 1; /* used to do power off / on cycle */ + static uint8_t ConfigRetryCnt = 0; /* Retry count without power cycle */ - char TxBuffer[20]; + char TxBuffer[UART_CMD_BUF_SIZE]; uint8_t CmdSize = 0; uint8_t result = HAL_OK; + TxBuffer[0] = 0; + switch (BmTmpConfig) { case BM_CONFIG_ECHO: sprintf(TxBuffer,"ATE0\r"); @@ -2068,16 +2075,23 @@ break; case BM_CONFIG_BAUD: sprintf(TxBuffer,"AT%%B22\r"); break; -// case BM_CONFIG_DISABLE_EVENT: sprintf(TxBuffer,"AT+LECPEVENT=0\r"); -// break; + case BM_CONFIG_RETRY: ConfigRetryCnt--; + HAL_Delay(1); + if(ConfigRetryCnt == 0) + { + MX_Bluetooth_PowerOn(); + tComm_StartBlueModConfig(); + } + break; case BM_CONFIG_DONE: case BM_CONFIG_OFF: ConfigRetryCnt = 0; + RestartModule = 1; break; default: break; } - if((BmTmpConfig != BM_CONFIG_OFF) && (BmTmpConfig != BM_CONFIG_DONE)) + if(TxBuffer[0] != 0) /* forward command to module */ { CmdSize = strlen(TxBuffer); if(HAL_UART_Transmit(&UartHandle, (uint8_t*)TxBuffer,CmdSize, 2000) == HAL_OK) @@ -2112,10 +2126,19 @@ ConfigRetryCnt++; if(ConfigRetryCnt > 3) /* Configuration failed => switch off module */ { - ConfigRetryCnt = 0; - BmTmpConfig = BM_CONFIG_OFF; - settingsGetPointer()->bluetoothActive = 0; MX_Bluetooth_PowerOff(); + if(RestartModule) + { + RestartModule = 0; /* only one try */ + ConfigRetryCnt = 200; /* used for delay to startup module again */ + BmTmpConfig = BM_CONFIG_RETRY; + } + else /* even restarting module failed => switch bluetooth off */ + { + ConfigRetryCnt = 0; + BmTmpConfig = BM_CONFIG_OFF; + settingsGetPointer()->bluetoothActive = 0; + } } } return result;