Mercurial > public > ostc4
comparison Small_CPU/Src/uart.c @ 981:c6c781a2e85b default
Merge into default
| author | heinrichsweikamp |
|---|---|
| date | Tue, 11 Feb 2025 18:12:00 +0100 |
| parents | 0b81ac558e89 |
| children | d9290c76b840 |
comparison
equal
deleted
inserted
replaced
| 871:f7318457df4d | 981:c6c781a2e85b |
|---|---|
| 20 */ | 20 */ |
| 21 /* Includes ------------------------------------------------------------------*/ | 21 /* Includes ------------------------------------------------------------------*/ |
| 22 #include "uart.h" | 22 #include "uart.h" |
| 23 #include "uartProtocol_O2.h" | 23 #include "uartProtocol_O2.h" |
| 24 #include "uartProtocol_Co2.h" | 24 #include "uartProtocol_Co2.h" |
| 25 #include "uartProtocol_Sentinel.h" | |
| 26 #include "uartProtocol_GNSS.h" | |
| 25 #include "externalInterface.h" | 27 #include "externalInterface.h" |
| 26 #include "data_exchange.h" | 28 #include "data_exchange.h" |
| 27 #include <string.h> /* memset */ | 29 #include <string.h> /* memset */ |
| 28 | 30 |
| 31 #ifdef ENABLE_GPIO_V2 | |
| 32 extern UART_HandleTypeDef huart6; | |
| 33 extern sUartComCtrl Uart6Ctrl; | |
| 34 #endif | |
| 35 | |
| 29 /* Private variables ---------------------------------------------------------*/ | 36 /* Private variables ---------------------------------------------------------*/ |
| 30 | 37 |
| 31 | 38 DMA_HandleTypeDef hdma_usart1_rx, hdma_usart1_tx; |
| 32 | 39 |
| 33 #define CHUNK_SIZE (25u) /* the DMA will handle chunk size transfers */ | 40 uint8_t rxBuffer[CHUNK_SIZE * CHUNKS_PER_BUFFER]; /* The complete buffer has a X * chunk size to allow variations in buffer read time */ |
| 34 #define CHUNKS_PER_BUFFER (5u) | 41 uint8_t txBuffer[TX_BUF_SIZE]; /* tx uses less bytes */ |
| 35 | 42 uint8_t txBufferQue[TX_BUF_SIZE]; /* In MUX mode command may be send shortly after each other => allow q 1 entry que */ |
| 36 UART_HandleTypeDef huart1; | 43 |
| 37 | 44 |
| 38 DMA_HandleTypeDef hdma_usart1_rx; | 45 static uint8_t lastCmdIndex; /* Index of last command which has not been completely received */ |
| 39 | 46 |
| 40 uint8_t rxBuffer[CHUNK_SIZE * CHUNKS_PER_BUFFER]; /* The complete buffer has a X * chunk size to allow fariations in buffer read time */ | 47 sUartComCtrl Uart1Ctrl; |
| 41 static uint8_t rxWriteIndex; /* Index of the data item which is analysed */ | 48 static sUartComCtrl* pGnssCtrl = NULL; |
| 42 static uint8_t rxReadIndex; /* Index at which new data is stared */ | 49 |
| 43 static uint8_t lastCmdIndex; /* Index of last command which has not been completly received */ | 50 static uint32_t LastCmdRequestTick = 0; /* Used by ADC handler to avoid interferance with UART communication */ |
| 44 static uint8_t dmaActive; /* Indicator if DMA reception needs to be started */ | |
| 45 | |
| 46 | |
| 47 static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor is connected or not */ | |
| 48 | |
| 49 | 51 |
| 50 /* Exported functions --------------------------------------------------------*/ | 52 /* Exported functions --------------------------------------------------------*/ |
| 51 | 53 |
| 52 | 54 |
| 55 void UART_SetGnssCtrl(sUartComCtrl* pTarget) | |
| 56 { | |
| 57 pGnssCtrl = pTarget; | |
| 58 } | |
| 59 | |
| 60 sUartComCtrl* UART_GetGnssCtrl() | |
| 61 { | |
| 62 return pGnssCtrl; | |
| 63 } | |
| 64 | |
| 65 | |
| 66 void UART_clearRxBuffer(sUartComCtrl* pUartCtrl) | |
| 67 { | |
| 68 uint16_t index = 0; | |
| 69 do | |
| 70 { | |
| 71 pUartCtrl->pRxBuffer[index++] = BUFFER_NODATA_LOW; | |
| 72 pUartCtrl->pRxBuffer[index++] = BUFFER_NODATA_HIGH; | |
| 73 } while (index < sizeof(rxBuffer)); | |
| 74 | |
| 75 pUartCtrl->rxReadIndex = 0; | |
| 76 pUartCtrl->rxWriteIndex = 0; | |
| 77 } | |
| 78 | |
| 53 void MX_USART1_UART_Init(void) | 79 void MX_USART1_UART_Init(void) |
| 54 { | 80 { |
| 55 /* regular init */ | 81 /* regular init */ |
| 56 | |
| 57 huart1.Instance = USART1; | 82 huart1.Instance = USART1; |
| 58 huart1.Init.BaudRate = 19200; | 83 huart1.Init.BaudRate = 19200; |
| 59 huart1.Init.WordLength = UART_WORDLENGTH_8B; | 84 huart1.Init.WordLength = UART_WORDLENGTH_8B; |
| 60 huart1.Init.StopBits = UART_STOPBITS_1; | 85 huart1.Init.StopBits = UART_STOPBITS_1; |
| 61 huart1.Init.Parity = UART_PARITY_NONE; | 86 huart1.Init.Parity = UART_PARITY_NONE; |
| 65 | 90 |
| 66 HAL_UART_Init(&huart1); | 91 HAL_UART_Init(&huart1); |
| 67 | 92 |
| 68 MX_USART1_DMA_Init(); | 93 MX_USART1_DMA_Init(); |
| 69 | 94 |
| 70 memset(rxBuffer,BUFFER_NODATA,sizeof(rxBuffer)); | 95 UART_clearRxBuffer(&Uart1Ctrl); |
| 71 rxReadIndex = 0; | |
| 72 lastCmdIndex = 0; | 96 lastCmdIndex = 0; |
| 73 rxWriteIndex = 0; | 97 |
| 74 dmaActive = 0; | 98 Uart1Ctrl.pHandle = &huart1; |
| 75 | 99 Uart1Ctrl.rxWriteIndex = 0; |
| 76 SentinelConnected = 0; | 100 Uart1Ctrl.rxReadIndex = 0; |
| 77 | 101 Uart1Ctrl.dmaRxActive = 0; |
| 78 } | 102 Uart1Ctrl.dmaTxActive = 0; |
| 103 Uart1Ctrl.pRxBuffer = rxBuffer; | |
| 104 Uart1Ctrl.pTxBuffer = txBuffer; | |
| 105 Uart1Ctrl.txBufferQueLen = 0; | |
| 106 | |
| 107 #ifndef ENABLE_GPIO_V2 | |
| 108 UART_SetGnssCtrl(&Uart1Ctrl); | |
| 109 #endif | |
| 110 } | |
| 111 | |
| 112 | |
| 79 | 113 |
| 80 void MX_USART1_UART_DeInit(void) | 114 void MX_USART1_UART_DeInit(void) |
| 81 { | 115 { |
| 82 HAL_DMA_Abort(&hdma_usart1_rx); | 116 HAL_DMA_Abort(&hdma_usart1_rx); |
| 83 HAL_DMA_DeInit(&hdma_usart1_rx); | 117 HAL_DMA_DeInit(&hdma_usart1_rx); |
| 118 HAL_DMA_Abort(&hdma_usart1_tx); | |
| 119 HAL_DMA_DeInit(&hdma_usart1_tx); | |
| 84 HAL_UART_DeInit(&huart1); | 120 HAL_UART_DeInit(&huart1); |
| 85 dmaActive = 0; | 121 Uart1Ctrl.dmaRxActive = 0; |
| 122 Uart1Ctrl.dmaTxActive = 0; | |
| 123 Uart1Ctrl.txBufferQueLen = 0; | |
| 86 } | 124 } |
| 87 | 125 |
| 88 void MX_USART1_DMA_Init() | 126 void MX_USART1_DMA_Init() |
| 89 { | 127 { |
| 90 /* DMA controller clock enable */ | 128 /* DMA controller clock enable */ |
| 103 hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; | 141 hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; |
| 104 HAL_DMA_Init(&hdma_usart1_rx); | 142 HAL_DMA_Init(&hdma_usart1_rx); |
| 105 | 143 |
| 106 __HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx); | 144 __HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx); |
| 107 | 145 |
| 146 hdma_usart1_tx.Instance = DMA2_Stream7; | |
| 147 hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4; | |
| 148 hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; | |
| 149 hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; | |
| 150 hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE; | |
| 151 hdma_usart1_tx.Init.PeriphDataAlignment = DMA_MDATAALIGN_BYTE; | |
| 152 hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; | |
| 153 hdma_usart1_tx.Init.Mode = DMA_NORMAL; | |
| 154 hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW; | |
| 155 hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; | |
| 156 HAL_DMA_Init(&hdma_usart1_tx); | |
| 157 | |
| 158 __HAL_LINKDMA(&huart1,hdmatx,hdma_usart1_tx); | |
| 159 | |
| 160 | |
| 108 /* DMA interrupt init */ | 161 /* DMA interrupt init */ |
| 109 HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 0, 0); | 162 HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 2, 2); |
| 110 HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn); | 163 HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn); |
| 111 } | 164 HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 2, 1); |
| 112 | 165 HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); |
| 113 void UART_MUX_SelectAddress(uint8_t muxAddress) | 166 } |
| 167 | |
| 168 void UART_MUX_SelectAddress(uint8_t muxAddress) | |
| 114 { | 169 { |
| 115 uint8_t indexstr[4]; | 170 uint8_t indexstr[4]; |
| 116 | 171 |
| 117 if(muxAddress <= MAX_MUX_CHANNEL) | 172 if(muxAddress <= MAX_MUX_CHANNEL) |
| 118 { | 173 { |
| 119 indexstr[0] = '~'; | 174 indexstr[0] = '~'; |
| 120 indexstr[1] = muxAddress; | 175 indexstr[1] = muxAddress; |
| 121 indexstr[2] = 0x0D; | 176 indexstr[2] = 0x0D; |
| 122 indexstr[3] = 0x0A; | 177 indexstr[3] = 0x0A; |
| 123 | 178 if(!Uart1Ctrl.dmaTxActive) |
| 124 HAL_UART_Transmit(&huart1,indexstr,4,10); | 179 { |
| 180 memcpy(txBuffer, indexstr, 4); | |
| 181 Uart1Ctrl.dmaTxActive = 0; | |
| 182 if(HAL_OK == HAL_UART_Transmit_DMA(&huart1,txBuffer,4)) | |
| 183 { | |
| 184 Uart1Ctrl.dmaTxActive = 1; | |
| 185 while(Uart1Ctrl.dmaTxActive) | |
| 186 { | |
| 187 HAL_Delay(1); | |
| 188 } | |
| 189 } | |
| 190 } | |
| 191 else | |
| 192 { | |
| 193 memcpy(txBufferQue, indexstr, 4); | |
| 194 Uart1Ctrl.txBufferQueLen = 4; | |
| 195 } | |
| 125 } | 196 } |
| 126 } | 197 } |
| 127 | 198 |
| 128 | 199 |
| 129 void UART_SendCmdString(uint8_t *cmdString) | 200 void UART_SendCmdString(uint8_t *cmdString) |
| 130 { | 201 { |
| 131 uint8_t cmdLength = strlen((char*)cmdString); | 202 uint8_t cmdLength = strlen((char*)cmdString); |
| 132 | 203 |
| 133 if(cmdLength < 20) /* A longer string is an indication for a missing 0 termination */ | 204 if(Uart1Ctrl.dmaTxActive == 0) |
| 134 { | 205 { |
| 135 if(dmaActive == 0) | 206 if(cmdLength < TX_BUF_SIZE) /* A longer string is an indication for a missing 0 termination */ |
| 136 { | 207 { |
| 137 UART_StartDMA_Receiption(); | 208 if(Uart1Ctrl.dmaRxActive == 0) |
| 138 } | 209 { |
| 139 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10); | 210 UART_StartDMA_Receiption(&Uart1Ctrl); |
| 211 } | |
| 212 memcpy(txBuffer, cmdString, cmdLength); | |
| 213 if(HAL_OK == HAL_UART_Transmit_DMA(&huart1,txBuffer,cmdLength)) | |
| 214 { | |
| 215 Uart1Ctrl.dmaTxActive = 1; | |
| 216 LastCmdRequestTick = HAL_GetTick(); | |
| 217 } | |
| 218 } | |
| 219 } | |
| 220 else | |
| 221 { | |
| 222 memcpy(txBufferQue, cmdString, cmdLength); | |
| 223 Uart1Ctrl.txBufferQueLen = cmdLength; | |
| 224 } | |
| 225 } | |
| 226 | |
| 227 void UART_AddFletcher(uint8_t* pBuffer, uint8_t length) | |
| 228 { | |
| 229 uint8_t ck_A = 0; | |
| 230 uint8_t ck_B = 0; | |
| 231 uint8_t index = 0; | |
| 232 | |
| 233 | |
| 234 pBuffer += 2; /* skip sync chars */ | |
| 235 for(index = 2; index < length; index++) | |
| 236 { | |
| 237 ck_A += *pBuffer++; | |
| 238 ck_B += ck_A; | |
| 239 } | |
| 240 *pBuffer++ = ck_A; | |
| 241 *pBuffer++ = ck_B; | |
| 242 } | |
| 243 | |
| 244 void UART_SendCmdUbx(const uint8_t *cmd, uint8_t len) | |
| 245 { | |
| 246 if(len < TX_BUF_SIZE) /* A longer string is an indication for a missing 0 termination */ | |
| 247 { | |
| 248 if(pGnssCtrl != NULL) | |
| 249 { | |
| 250 if(pGnssCtrl->dmaRxActive == 0) | |
| 251 { | |
| 252 UART_StartDMA_Receiption(pGnssCtrl); | |
| 253 } | |
| 254 memcpy(pGnssCtrl->pTxBuffer, cmd, len); | |
| 255 UART_AddFletcher(pGnssCtrl->pTxBuffer, len); | |
| 256 len += 2; | |
| 257 if(HAL_OK == HAL_UART_Transmit_DMA(pGnssCtrl->pHandle,pGnssCtrl->pTxBuffer,len)) | |
| 258 { | |
| 259 pGnssCtrl->dmaTxActive = 1; | |
| 260 LastCmdRequestTick = HAL_GetTick(); | |
| 261 } | |
| 262 } | |
| 140 } | 263 } |
| 141 } | 264 } |
| 142 | 265 |
| 143 | 266 |
| 144 void StringToInt(char *pstr, uint32_t *puInt32) | 267 void StringToInt(char *pstr, uint32_t *puInt32) |
| 164 result += pstr[index] - '0'; | 287 result += pstr[index] - '0'; |
| 165 index++; | 288 index++; |
| 166 } | 289 } |
| 167 *puint64 = result; | 290 *puint64 = result; |
| 168 } | 291 } |
| 169 void ConvertByteToHexString(uint8_t byte, char* str) | 292 |
| 170 { | 293 void UART_StartDMA_Receiption(sUartComCtrl* pUartCtrl) |
| 171 uint8_t worker = 0; | 294 { |
| 172 uint8_t digit = 0; | 295 if(pUartCtrl->dmaRxActive == 0) |
| 173 uint8_t digitCnt = 1; | 296 { |
| 174 | 297 if(((pUartCtrl->rxWriteIndex / CHUNK_SIZE) != (pUartCtrl->rxReadIndex / CHUNK_SIZE)) || ((UART_isEndIndication(pUartCtrl, pUartCtrl->rxWriteIndex)) && (UART_isEndIndication(pUartCtrl, pUartCtrl->rxWriteIndex + 1)))) /* start next transfer if we did not catch up with read index */ |
| 175 worker = byte; | 298 { |
| 176 while((worker!=0) && (digitCnt != 255)) | 299 if(HAL_OK == HAL_UART_Receive_DMA (pUartCtrl->pHandle, &pUartCtrl->pRxBuffer[pUartCtrl->rxWriteIndex], CHUNK_SIZE)) |
| 177 { | 300 { |
| 178 digit = worker % 16; | 301 pUartCtrl->dmaRxActive = 1; |
| 179 if( digit < 10) | 302 } |
| 180 { | 303 } |
| 181 digit += '0'; | |
| 182 } | |
| 183 else | |
| 184 { | |
| 185 digit += 'A' - 10; | |
| 186 } | |
| 187 str[digitCnt--]= digit; | |
| 188 worker = worker / 16; | |
| 189 } | |
| 190 } | |
| 191 | |
| 192 void UART_StartDMA_Receiption() | |
| 193 { | |
| 194 if(dmaActive == 0) | |
| 195 { | |
| 196 if(HAL_OK == HAL_UART_Receive_DMA (&huart1, &rxBuffer[rxWriteIndex], CHUNK_SIZE)) | |
| 197 { | |
| 198 dmaActive = 1; | |
| 199 } | |
| 200 } | 304 } |
| 201 } | 305 } |
| 202 | 306 |
| 203 void UART_ChangeBaudrate(uint32_t newBaudrate) | 307 void UART_ChangeBaudrate(uint32_t newBaudrate) |
| 204 { | 308 { |
| 205 uint8_t dmaWasActive = dmaActive; | 309 MX_USART1_UART_DeInit(); |
| 206 // HAL_DMA_Abort(&hdma_usart1_rx); | |
| 207 MX_USART1_UART_DeInit(); | |
| 208 //HAL_UART_Abort(&huart1); | |
| 209 //HAL_DMA_DeInit(&hdma_usart1_rx); | |
| 210 | |
| 211 | |
| 212 // huart1.Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq()/2, newBaudrate); | |
| 213 huart1.Init.BaudRate = newBaudrate; | 310 huart1.Init.BaudRate = newBaudrate; |
| 214 HAL_UART_Init(&huart1); | 311 HAL_UART_Init(&huart1); |
| 215 MX_USART1_DMA_Init(); | 312 MX_USART1_DMA_Init(); |
| 216 if(dmaWasActive) | 313 HAL_NVIC_SetPriority(USART1_IRQn, 1, 3); |
| 217 { | 314 HAL_NVIC_EnableIRQ(USART1_IRQn); |
| 218 memset(rxBuffer,BUFFER_NODATA,sizeof(rxBuffer)); | 315 |
| 219 rxReadIndex = 0; | 316 UART_clearRxBuffer(&Uart1Ctrl); |
| 220 rxWriteIndex = 0; | 317 Uart1Ctrl.rxReadIndex = 0; |
| 221 dmaActive = 0; | 318 Uart1Ctrl.rxWriteIndex = 0; |
| 222 UART_StartDMA_Receiption(); | 319 Uart1Ctrl.dmaRxActive = 0; |
| 223 } | 320 Uart1Ctrl.dmaTxActive = 0; |
| 224 } | 321 Uart1Ctrl.txBufferQueLen = 0; |
| 225 | 322 } |
| 226 #ifdef ENABLE_SENTINEL_MODE | 323 |
| 227 void UART_HandleSentinelData(void) | 324 void UART_HandleRxComplete(sUartComCtrl* pUartCtrl) |
| 228 { | 325 { |
| 229 uint8_t localRX = rxReadIndex; | 326 pUartCtrl->dmaRxActive = 0; |
| 230 static uint8_t dataType = 0; | 327 pUartCtrl->rxWriteIndex+=CHUNK_SIZE; |
| 231 static uint32_t dataValue[3]; | 328 if(pUartCtrl->rxWriteIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) |
| 232 static uint8_t dataValueIdx = 0; | 329 { |
| 233 static receiveState_t rxState = RX_Ready; | 330 pUartCtrl->rxWriteIndex = 0; |
| 234 static uint32_t lastReceiveTick = 0; | 331 } |
| 235 static uint8_t lastAlive = 0; | 332 UART_StartDMA_Receiption(pUartCtrl); |
| 236 static uint8_t curAlive = 0; | 333 } |
| 237 static uint8_t checksum = 0; | 334 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) |
| 238 static char checksum_str[]="00"; | 335 { |
| 239 | 336 if(huart == &huart1) |
| 240 while((rxBuffer[localRX]!=0)) | 337 { |
| 241 { | 338 UART_HandleRxComplete(&Uart1Ctrl); |
| 242 lastReceiveTick = HAL_GetTick(); | 339 } |
| 243 | 340 #ifdef ENABLE_GPIO_V2 |
| 244 switch(rxState) | 341 if(huart == &huart6) |
| 245 { | 342 { |
| 246 case RX_Ready: if((rxBuffer[localRX] >= 'a') && (rxBuffer[localRX] <= 'z')) | 343 UART_HandleRxComplete(&Uart6Ctrl); |
| 247 { | 344 } |
| 248 rxState = RX_DetectStart; | 345 #endif |
| 249 curAlive = rxBuffer[localRX]; | 346 } |
| 250 checksum = 0; | 347 |
| 251 } | 348 void UART_HandleTxComplete(sUartComCtrl* pUartCtrl) |
| 349 { | |
| 350 pUartCtrl->dmaTxActive = 0; | |
| 351 UART_WriteData(pUartCtrl); | |
| 352 if(pUartCtrl->txBufferQueLen) | |
| 353 { | |
| 354 memcpy(pUartCtrl->pTxBuffer, pUartCtrl->pTxQue, pUartCtrl->txBufferQueLen); | |
| 355 HAL_UART_Transmit_DMA(pUartCtrl->pHandle,pUartCtrl->pTxBuffer,pUartCtrl->txBufferQueLen); | |
| 356 pUartCtrl->dmaTxActive = 1; | |
| 357 pUartCtrl->txBufferQueLen = 0; | |
| 358 } | |
| 359 } | |
| 360 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) | |
| 361 { | |
| 362 if(huart == &huart1) | |
| 363 { | |
| 364 UART_HandleTxComplete(&Uart1Ctrl); | |
| 365 } | |
| 366 #ifdef ENABLE_GPIO_V2 | |
| 367 if(huart == &huart6) | |
| 368 { | |
| 369 UART_HandleTxComplete(&Uart6Ctrl); | |
| 370 } | |
| 371 #endif | |
| 372 } | |
| 373 | |
| 374 uint8_t UART_isEndIndication(sUartComCtrl* pCtrl, uint8_t index) | |
| 375 { | |
| 376 uint8_t ret = 0; | |
| 377 if(index % 2) | |
| 378 { | |
| 379 if(pCtrl->pRxBuffer[index] == BUFFER_NODATA_HIGH) | |
| 380 { | |
| 381 ret = 1; | |
| 382 } | |
| 383 } | |
| 384 else | |
| 385 { | |
| 386 if(pCtrl->pRxBuffer[index] == BUFFER_NODATA_LOW) | |
| 387 { | |
| 388 ret = 1; | |
| 389 } | |
| 390 } | |
| 391 | |
| 392 return ret; | |
| 393 } | |
| 394 void UART_ReadData(uint8_t sensorType, uint8_t flush) /* flush = 1 skips processing of data => data is discarded */ | |
| 395 { | |
| 396 uint8_t localRX; | |
| 397 uint8_t futureIndex; | |
| 398 uint8_t moreData = 0; | |
| 399 | |
| 400 sUartComCtrl* pUartCtrl; | |
| 401 | |
| 402 if(sensorType == SENSOR_GNSS) | |
| 403 { | |
| 404 #ifdef ENABLE_GPIO_V2 | |
| 405 pUartCtrl = &Uart6Ctrl; | |
| 406 #else | |
| 407 pUartCtrl = &Uart1Ctrl; | |
| 408 #endif | |
| 409 } | |
| 410 else | |
| 411 { | |
| 412 pUartCtrl = &Uart1Ctrl; | |
| 413 } | |
| 414 localRX = pUartCtrl->rxReadIndex; | |
| 415 futureIndex = pUartCtrl->rxReadIndex + 1; | |
| 416 if(futureIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | |
| 417 { | |
| 418 futureIndex = 0; | |
| 419 } | |
| 420 | |
| 421 if(!UART_isEndIndication(pUartCtrl, futureIndex)) | |
| 422 { | |
| 423 moreData = 1; | |
| 424 } | |
| 425 | |
| 426 if((!UART_isEndIndication(pUartCtrl, localRX)) || (moreData)) | |
| 427 do | |
| 428 { | |
| 429 while((!UART_isEndIndication(pUartCtrl, localRX)) || (moreData)) | |
| 430 { | |
| 431 moreData = 0; | |
| 432 switch (sensorType) | |
| 433 { | |
| 434 case SENSOR_MUX: | |
| 435 case SENSOR_DIGO2: uartO2_ProcessData(pUartCtrl->pRxBuffer[localRX]); | |
| 252 break; | 436 break; |
| 253 | 437 #ifdef ENABLE_CO2_SUPPORT |
| 254 case RX_DetectStart: checksum += rxBuffer[localRX]; | 438 case SENSOR_CO2: uartCo2_ProcessData(pUartCtrl->pRxBuffer[localRX]); |
| 255 if(rxBuffer[localRX] == '1') | |
| 256 { | |
| 257 rxState = RX_SelectData; | |
| 258 dataType = 0xFF; | |
| 259 | |
| 260 } | |
| 261 else | |
| 262 { | |
| 263 rxState = RX_Ready; | |
| 264 } | |
| 265 break; | 439 break; |
| 266 | 440 #endif |
| 267 case RX_SelectData: checksum += rxBuffer[localRX]; | 441 #if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2 |
| 268 switch(rxBuffer[localRX]) | 442 case SENSOR_GNSS: uartGnss_ProcessData(pUartCtrl->pRxBuffer[localRX]); |
| 269 { | 443 break; |
| 270 case 'T': dataType = rxBuffer[localRX]; | 444 #endif |
| 271 break; | 445 #ifdef ENABLE_SENTINEL_MODE |
| 272 case '0': if(dataType != 0xff) | 446 case SENSOR_SENTINEL: uartSentinel_ProcessData(pUartCtrl->pRxBuffer[localRX]); |
| 273 { | |
| 274 rxState = RX_Data0; | |
| 275 dataValueIdx = 0; | |
| 276 dataValue[0] = 0; | |
| 277 | |
| 278 } | |
| 279 else | |
| 280 { | |
| 281 rxState = RX_Ready; | |
| 282 } | |
| 283 break; | |
| 284 default: rxState = RX_Ready; | |
| 285 } | |
| 286 break; | 447 break; |
| 287 | 448 #endif |
| 288 case RX_Data0: | 449 default: |
| 289 case RX_Data1: | |
| 290 case RX_Data2: | |
| 291 case RX_Data4: | |
| 292 case RX_Data5: | |
| 293 case RX_Data6: | |
| 294 case RX_Data8: | |
| 295 case RX_Data9: | |
| 296 case RX_Data10: checksum += rxBuffer[localRX]; | |
| 297 if((rxBuffer[localRX] >= '0') && (rxBuffer[localRX] <= '9')) | |
| 298 { | |
| 299 dataValue[dataValueIdx] = dataValue[dataValueIdx] * 10 + (rxBuffer[localRX] - '0'); | |
| 300 rxState++; | |
| 301 } | |
| 302 else | |
| 303 { | |
| 304 rxState = RX_Ready; | |
| 305 } | |
| 306 break; | 450 break; |
| 307 | 451 } |
| 308 case RX_Data3: | 452 if(localRX % 2) |
| 309 case RX_Data7: checksum += rxBuffer[localRX]; | 453 { |
| 310 if(rxBuffer[localRX] == '0') | 454 pUartCtrl->pRxBuffer[localRX] = BUFFER_NODATA_HIGH; |
| 311 { | 455 } |
| 312 rxState++; | 456 else |
| 313 dataValueIdx++; | 457 { |
| 314 dataValue[dataValueIdx] = 0; | 458 pUartCtrl->pRxBuffer[localRX] = BUFFER_NODATA_LOW; |
| 315 } | 459 } |
| 316 else | 460 |
| 317 { | 461 localRX++; |
| 318 rxState = RX_Ready; | 462 pUartCtrl->rxReadIndex++; |
| 319 } | 463 if(pUartCtrl->rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) |
| 320 break; | 464 { |
| 321 case RX_Data11: rxState = RX_DataComplete; | 465 localRX = 0; |
| 322 ConvertByteToHexString(checksum,checksum_str); | 466 pUartCtrl->rxReadIndex = 0; |
| 323 if(rxBuffer[localRX] == checksum_str[0]) | 467 } |
| 324 { | 468 futureIndex++; |
| 325 rxState = RX_DataComplete; | 469 if(futureIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) |
| 326 } | 470 { |
| 327 else | 471 futureIndex = 0; |
| 328 { | 472 } |
| 329 rxState = RX_Ready; | 473 } |
| 330 } | 474 if(!UART_isEndIndication(pUartCtrl, futureIndex)) |
| 331 | 475 { |
| 332 break; | 476 moreData = 1; |
| 333 | 477 } |
| 334 case RX_DataComplete: if(rxBuffer[localRX] == checksum_str[1]) | 478 } while(moreData); |
| 335 { | 479 } |
| 336 setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0)); | 480 |
| 337 setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0)); | 481 void UART_WriteData(sUartComCtrl* pUartCtrl) |
| 338 setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0)); | 482 { |
| 339 SentinelConnected = 1; | 483 if(pUartCtrl->pHandle->hdmatx->State == HAL_DMA_STATE_READY) |
| 340 } | 484 { |
| 341 rxState = RX_Ready; | 485 pUartCtrl->pHandle->gState = HAL_UART_STATE_READY; |
| 342 break; | 486 pUartCtrl->dmaTxActive = 0; |
| 343 | 487 } |
| 344 | 488 if(pUartCtrl->pHandle->hdmarx->State == HAL_DMA_STATE_READY) |
| 345 default: rxState = RX_Ready; | 489 { |
| 346 break; | 490 pUartCtrl->pHandle->RxState = HAL_UART_STATE_READY; |
| 347 | 491 pUartCtrl->dmaRxActive = 0; |
| 348 } | 492 } |
| 349 localRX++; | 493 } |
| 350 rxReadIndex++; | 494 |
| 351 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | 495 uint8_t UART_isComActive(uint8_t sensorId) |
| 352 { | 496 { |
| 353 localRX = 0; | 497 uint8_t active = 1; |
| 354 rxReadIndex = 0; | 498 |
| 355 } | 499 if(time_elapsed_ms(LastCmdRequestTick, HAL_GetTick()) > 300) /* UART activity should be inactive 300ms after last command */ |
| 356 } | 500 { |
| 357 | 501 active = 0; |
| 358 if(time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 4000) /* check for communication timeout */ | 502 } |
| 359 { | 503 return active; |
| 360 if(curAlive == lastAlive) | 504 } |
| 361 { | |
| 362 setExternalInterfaceChannel(0,0.0); | |
| 363 setExternalInterfaceChannel(1,0.0); | |
| 364 setExternalInterfaceChannel(2,0.0); | |
| 365 SentinelConnected = 0; | |
| 366 } | |
| 367 lastAlive = curAlive; | |
| 368 } | |
| 369 | |
| 370 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */ | |
| 371 { | |
| 372 UART_StartDMA_Receiption(); | |
| 373 } | |
| 374 } | |
| 375 #endif | |
| 376 | |
| 377 | |
| 378 | |
| 379 uint8_t UART_isSentinelConnected() | |
| 380 { | |
| 381 return SentinelConnected; | |
| 382 } | |
| 383 | |
| 384 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) | |
| 385 { | |
| 386 if(huart == &huart1) | |
| 387 { | |
| 388 dmaActive = 0; | |
| 389 rxWriteIndex+=CHUNK_SIZE; | |
| 390 if(rxWriteIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | |
| 391 { | |
| 392 rxWriteIndex = 0; | |
| 393 } | |
| 394 if((rxWriteIndex / CHUNK_SIZE) != (rxReadIndex / CHUNK_SIZE) || (rxWriteIndex == rxReadIndex)) /* start next transfer if we did not catch up with read index */ | |
| 395 { | |
| 396 UART_StartDMA_Receiption(); | |
| 397 } | |
| 398 } | |
| 399 } | |
| 400 | |
| 401 void UART_ReadData(uint8_t sensorType) | |
| 402 { | |
| 403 uint8_t localRX = rxReadIndex; | |
| 404 | |
| 405 while((rxBuffer[localRX]!=BUFFER_NODATA)) | |
| 406 { | |
| 407 switch (sensorType) | |
| 408 { | |
| 409 case SENSOR_MUX: | |
| 410 case SENSOR_DIGO2: uartO2_ProcessData(rxBuffer[localRX]); | |
| 411 break; | |
| 412 #ifdef ENABLE_CO2_SUPPORT | |
| 413 case SENSOR_CO2: uartCo2_ProcessData(rxBuffer[localRX]); | |
| 414 break; | |
| 415 #endif | |
| 416 default: | |
| 417 break; | |
| 418 } | |
| 419 | |
| 420 rxBuffer[localRX] = BUFFER_NODATA; | |
| 421 localRX++; | |
| 422 rxReadIndex++; | |
| 423 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | |
| 424 { | |
| 425 localRX = 0; | |
| 426 rxReadIndex = 0; | |
| 427 } | |
| 428 } | |
| 429 } | |
| 430 | |
| 431 void UART_FlushRxBuffer(void) | |
| 432 { | |
| 433 while(rxBuffer[rxReadIndex] != BUFFER_NODATA) | |
| 434 { | |
| 435 rxBuffer[rxReadIndex] = BUFFER_NODATA; | |
| 436 rxReadIndex++; | |
| 437 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | |
| 438 { | |
| 439 rxReadIndex = 0; | |
| 440 } | |
| 441 } | |
| 442 } | |
| 443 | |
| 444 | 505 |
| 445 | 506 |
| 446 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ | 507 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |
