38
+ − 1 /**
+ − 2 ******************************************************************************
+ − 3 * @file uart.c
+ − 4 * @author heinrichs weikamp gmbh
+ − 5 * @version V0.0.1
+ − 6 * @date 27-March-2014
+ − 7 * @brief button control
+ − 8 *
+ − 9 @verbatim
+ − 10 ==============================================================================
+ − 11 ##### How to use #####
+ − 12 ==============================================================================
+ − 13 @endverbatim
+ − 14 ******************************************************************************
+ − 15 * @attention
+ − 16 *
+ − 17 * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2>
+ − 18 *
+ − 19 ******************************************************************************
+ − 20 */
+ − 21 /* Includes ------------------------------------------------------------------*/
+ − 22 #include "uart.h"
662
+ − 23 #include "externalInterface.h"
+ − 24 #include "data_exchange.h"
704
+ − 25 #include <string.h> /* memset */
38
+ − 26
+ − 27 /* Private variables ---------------------------------------------------------*/
+ − 28
721
+ − 29 #define CHUNK_SIZE (25u) /* the DMA will handle chunk size transfers */
+ − 30 #define CHUNKS_PER_BUFFER (5u)
662
+ − 31 UART_HandleTypeDef huart1;
+ − 32
+ − 33 DMA_HandleTypeDef hdma_usart1_rx;
38
+ − 34
662
+ − 35 uint8_t rxBuffer[CHUNK_SIZE * CHUNKS_PER_BUFFER]; /* The complete buffer has a X * chunk size to allow fariations in buffer read time */
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 36 static uint8_t rxWriteIndex; /* Index of the data item which is analysed */
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 37 static uint8_t rxReadIndex; /* Index at which new data is stared */
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 38 static uint8_t lastCmdIndex; /* Index of last command which has not been completly received */
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 39 static uint8_t dmaActive; /* Indicator if DMA reception needs to be started */
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 40 static uint8_t digO2Connected = 0; /* Binary indicator if a sensor is connected or not */
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 41 static uint8_t CO2Connected = 0; /* Binary indicator if a sensor is connected or not */
742
+ − 42 static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor is connected or not */
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 43 static uint8_t ppO2TargetChannel = 0; /* The OSTC4 supports three slots for visualization of the ppo2. This one is reserved for the digital sensor */
38
+ − 44
714
+ − 45 static SSensorDataDiveO2 sensorDataDiveO2; /* intermediate storage for additional sensor data */
+ − 46
704
+ − 47 char tmpRxBuf[30];
+ − 48 uint8_t tmpRxIdx = 0;
+ − 49
+ − 50 static uartO2Status_t Comstatus_O2 = UART_O2_INIT;
+ − 51
662
+ − 52 float LED_Level = 0.0; /* Normalized LED value which may be used as indication for the health status of the sensor */
+ − 53 float LED_ZeroOffset = 0.0;
+ − 54 float pCO2 = 0.0;
38
+ − 55 /* Exported functions --------------------------------------------------------*/
+ − 56
662
+ − 57 void MX_USART1_UART_Init(void)
38
+ − 58 {
662
+ − 59 /* regular init */
+ − 60
+ − 61 huart1.Instance = USART1;
704
+ − 62
+ − 63 if(externalInterface_GetUARTProtocol() == 0x04)
+ − 64 {
+ − 65 huart1.Init.BaudRate = 19200;
+ − 66 Comstatus_O2 = UART_O2_INIT;
+ − 67 }
+ − 68 else
+ − 69 {
+ − 70 huart1.Init.BaudRate = 9600;
+ − 71 }
662
+ − 72 huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ − 73 huart1.Init.StopBits = UART_STOPBITS_1;
+ − 74 huart1.Init.Parity = UART_PARITY_NONE;
+ − 75 huart1.Init.Mode = UART_MODE_TX_RX;
+ − 76 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ − 77 huart1.Init.OverSampling = UART_OVERSAMPLING_16;
+ − 78
+ − 79 HAL_UART_Init(&huart1);
+ − 80
704
+ − 81 MX_USART1_DMA_Init();
+ − 82
731
+ − 83 memset(rxBuffer,0,sizeof(rxBuffer));
662
+ − 84 rxReadIndex = 0;
+ − 85 lastCmdIndex = 0;
+ − 86 rxWriteIndex = 0;
+ − 87 dmaActive = 0;
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 88 digO2Connected = 0;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 89 CO2Connected = 0;
742
+ − 90 SentinelConnected = 0;
704
+ − 91 Comstatus_O2 = UART_O2_INIT;
662
+ − 92 }
38
+ − 93
662
+ − 94 void MX_USART1_UART_DeInit(void)
+ − 95 {
704
+ − 96 HAL_DMA_Abort(&hdma_usart1_rx);
662
+ − 97 HAL_DMA_DeInit(&hdma_usart1_rx);
+ − 98 HAL_UART_DeInit(&huart1);
+ − 99 }
+ − 100
+ − 101 void MX_USART1_DMA_Init()
+ − 102 {
+ − 103 /* DMA controller clock enable */
+ − 104 __DMA2_CLK_ENABLE();
+ − 105
+ − 106 /* Peripheral DMA init*/
+ − 107 hdma_usart1_rx.Instance = DMA2_Stream5;
+ − 108 hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;
+ − 109 hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; //DMA_MEMORY_TO_PERIPH;
+ − 110 hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+ − 111 hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
+ − 112 hdma_usart1_rx.Init.PeriphDataAlignment = DMA_MDATAALIGN_BYTE;
+ − 113 hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ − 114 hdma_usart1_rx.Init.Mode = DMA_NORMAL;
+ − 115 hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
+ − 116 hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+ − 117 HAL_DMA_Init(&hdma_usart1_rx);
+ − 118
+ − 119 __HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx);
+ − 120
+ − 121 /* DMA interrupt init */
+ − 122 HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 0, 0);
+ − 123 HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
38
+ − 124 }
+ − 125
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 126
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 127 void DigitalO2_SetupCmd(uint8_t O2State, uint8_t *cmdString, uint8_t *cmdLength)
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 128 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 129 switch (O2State)
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 130 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 131 case UART_O2_CHECK: *cmdLength = snprintf((char*)cmdString, 10, "#LOGO");
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 132 break;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 133 case UART_O2_REQ_INFO: *cmdLength = snprintf((char*)cmdString, 10, "#VERS");
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 134 break;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 135 case UART_O2_REQ_ID: *cmdLength = snprintf((char*)cmdString, 10, "#IDNR");
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 136 break;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 137 case UART_O2_REQ_O2: *cmdLength = snprintf((char*)cmdString, 10, "#DOXY");
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 138 break;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 139 case UART_O2_REQ_RAW: *cmdLength = snprintf((char*)cmdString, 10, "#DRAW");
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 140 break;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 141 default: *cmdLength = 0;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 142 break;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 143 }
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 144 if(*cmdLength != 0)
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 145 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 146 cmdString[*cmdLength] = 0x0D;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 147 *cmdLength = *cmdLength + 1;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 148 }
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 149 }
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 150
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 151 void StringToInt(char *pstr, uint32_t *puInt32)
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 152 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 153 uint8_t index = 0;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 154 uint32_t result = 0;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 155 while((pstr[index] >= '0') && (pstr[index] <= '9'))
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 156 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 157 result *=10;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 158 result += pstr[index] - '0';
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 159 index++;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 160 }
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 161 *puInt32 = result;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 162 }
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 163
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 164 void StringToUInt64(char *pstr, uint64_t *puint64)
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 165 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 166 uint8_t index = 0;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 167 uint64_t result = 0;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 168 while((pstr[index] >= '0') && (pstr[index] <= '9'))
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 169 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 170 result *=10;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 171 result += pstr[index] - '0';
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 172 index++;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 173 }
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 174 *puint64 = result;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 175 }
690
+ − 176 void ConvertByteToHexString(uint8_t byte, char* str)
+ − 177 {
+ − 178 uint8_t worker = 0;
+ − 179 uint8_t digit = 0;
+ − 180 uint8_t digitCnt = 1;
38
+ − 181
690
+ − 182 worker = byte;
+ − 183 while((worker!=0) && (digitCnt != 255))
+ − 184 {
+ − 185 digit = worker % 16;
+ − 186 if( digit < 10)
+ − 187 {
+ − 188 digit += '0';
+ − 189 }
+ − 190 else
+ − 191 {
+ − 192 digit += 'A' - 10;
+ − 193 }
+ − 194 str[digitCnt--]= digit;
+ − 195 worker = worker / 16;
+ − 196 }
+ − 197 }
662
+ − 198
742
+ − 199 void UART_StartDMA_Receiption()
+ − 200 {
+ − 201 if(HAL_OK == HAL_UART_Receive_DMA (&huart1, &rxBuffer[rxWriteIndex], CHUNK_SIZE))
+ − 202 {
+ − 203 dmaActive = 1;
+ − 204 }
+ − 205 }
690
+ − 206
+ − 207 #ifdef ENABLE_CO2_SUPPORT
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 208 void UART_HandleCO2Data(void)
38
+ − 209 {
662
+ − 210 uint8_t localRX = rxReadIndex;
747
+ − 211 static uint8_t dataType = 0;
+ − 212 static uint32_t dataValue = 0;
662
+ − 213 static receiveState_t rxState = RX_Ready;
+ − 214 static uint32_t lastReceiveTick = 0;
+ − 215
725
+ − 216
+ − 217 while((rxBuffer[localRX]!=0))
662
+ − 218 {
+ − 219 lastReceiveTick = HAL_GetTick();
+ − 220 if(rxState == RX_Ready) /* identify data content */
+ − 221 {
+ − 222 switch(rxBuffer[localRX])
+ − 223 {
+ − 224 case 'l':
+ − 225 case 'D':
+ − 226 case 'Z':
+ − 227 dataType = rxBuffer[localRX];
+ − 228 rxState = RX_Data0;
+ − 229 dataValue = 0;
+ − 230 break;
+ − 231
+ − 232 default: /* unknown or corrupted => ignore */
+ − 233 break;
+ − 234 }
+ − 235 }
725
+ − 236 else if((rxBuffer[localRX] >= '0') && (rxBuffer[localRX] <= '9'))
662
+ − 237 {
725
+ − 238 if((rxState >= RX_Data0) && (rxState <= RX_Data4))
662
+ − 239 {
+ − 240 dataValue = dataValue * 10 + (rxBuffer[localRX] - '0');
+ − 241 rxState++;
725
+ − 242 if(rxState == RX_Data5)
+ − 243 {
+ − 244 rxState = RX_DataComplete;
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 245 CO2Connected = 1;
725
+ − 246 }
+ − 247 }
+ − 248 else /* protocol error data has max 5 digits */
+ − 249 {
+ − 250 rxState = RX_Ready;
662
+ − 251 }
+ − 252 }
+ − 253 if((rxBuffer[localRX] == ' ') || (rxBuffer[localRX] == '\n')) /* Abort data detection */
+ − 254 {
+ − 255 if(rxState == RX_DataComplete)
+ − 256 {
+ − 257 if(externalInterface_GetCO2State() == 0)
+ − 258 {
+ − 259 externalInterface_SetCO2State(EXT_INTERFACE_33V_ON);
+ − 260 }
+ − 261 switch(dataType)
+ − 262 {
+ − 263 case 'D': externalInterface_SetCO2SignalStrength(dataValue);
+ − 264 break;
+ − 265 case 'l': LED_ZeroOffset = dataValue;
+ − 266 break;
+ − 267 case 'Z': externalInterface_SetCO2Value(dataValue);
+ − 268 break;
747
+ − 269 default: rxState = RX_Ready;
+ − 270 break;
662
+ − 271 }
+ − 272 }
+ − 273 if(rxState != RX_Data0) /* reset state machine because message in wrong format */
+ − 274 {
+ − 275 rxState = RX_Ready;
+ − 276 }
+ − 277 }
742
+ − 278 rxBuffer[localRX] = 0;
662
+ − 279 localRX++;
+ − 280 rxReadIndex++;
+ − 281 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER)
+ − 282 {
+ − 283 localRX = 0;
+ − 284 rxReadIndex = 0;
+ − 285 }
+ − 286 }
+ − 287
+ − 288 if(time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 2000) /* check for communication timeout */
+ − 289 {
+ − 290 externalInterface_SetCO2State(0);
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 291 CO2Connected = 0;
662
+ − 292 }
+ − 293
+ − 294 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */
+ − 295 {
742
+ − 296 UART_StartDMA_Receiption();
662
+ − 297 }
38
+ − 298 }
690
+ − 299 #endif
+ − 300
+ − 301 #ifdef ENABLE_SENTINEL_MODE
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 302 void UART_HandleSentinelData(void)
690
+ − 303 {
+ − 304 uint8_t localRX = rxReadIndex;
+ − 305 static uint8_t dataType = 0;
+ − 306 static uint32_t dataValue[3];
+ − 307 static uint8_t dataValueIdx = 0;
+ − 308 static receiveState_t rxState = RX_Ready;
+ − 309 static uint32_t lastReceiveTick = 0;
+ − 310 static uint8_t lastAlive = 0;
+ − 311 static uint8_t curAlive = 0;
+ − 312 static uint8_t checksum = 0;
742
+ − 313 static char checksum_str[]="00";
690
+ − 314
742
+ − 315 while((rxBuffer[localRX]!=0))
690
+ − 316 {
+ − 317 lastReceiveTick = HAL_GetTick();
+ − 318
+ − 319 switch(rxState)
+ − 320 {
+ − 321 case RX_Ready: if((rxBuffer[localRX] >= 'a') && (rxBuffer[localRX] <= 'z'))
+ − 322 {
+ − 323 rxState = RX_DetectStart;
+ − 324 curAlive = rxBuffer[localRX];
+ − 325 checksum = 0;
+ − 326 }
+ − 327 break;
+ − 328
+ − 329 case RX_DetectStart: checksum += rxBuffer[localRX];
+ − 330 if(rxBuffer[localRX] == '1')
+ − 331 {
+ − 332 rxState = RX_SelectData;
+ − 333 dataType = 0xFF;
+ − 334
+ − 335 }
+ − 336 else
+ − 337 {
+ − 338 rxState = RX_Ready;
+ − 339 }
+ − 340 break;
+ − 341
+ − 342 case RX_SelectData: checksum += rxBuffer[localRX];
+ − 343 switch(rxBuffer[localRX])
+ − 344 {
+ − 345 case 'T': dataType = rxBuffer[localRX];
+ − 346 break;
+ − 347 case '0': if(dataType != 0xff)
+ − 348 {
+ − 349 rxState = RX_Data0;
+ − 350 dataValueIdx = 0;
+ − 351 dataValue[0] = 0;
+ − 352
+ − 353 }
+ − 354 else
+ − 355 {
+ − 356 rxState = RX_Ready;
+ − 357 }
+ − 358 break;
+ − 359 default: rxState = RX_Ready;
+ − 360 }
+ − 361 break;
+ − 362
+ − 363 case RX_Data0:
+ − 364 case RX_Data1:
+ − 365 case RX_Data2:
+ − 366 case RX_Data4:
+ − 367 case RX_Data5:
+ − 368 case RX_Data6:
+ − 369 case RX_Data8:
+ − 370 case RX_Data9:
+ − 371 case RX_Data10: checksum += rxBuffer[localRX];
+ − 372 if((rxBuffer[localRX] >= '0') && (rxBuffer[localRX] <= '9'))
+ − 373 {
+ − 374 dataValue[dataValueIdx] = dataValue[dataValueIdx] * 10 + (rxBuffer[localRX] - '0');
+ − 375 rxState++;
+ − 376 }
+ − 377 else
+ − 378 {
+ − 379 rxState = RX_Ready;
+ − 380 }
+ − 381 break;
+ − 382
+ − 383 case RX_Data3:
+ − 384 case RX_Data7: checksum += rxBuffer[localRX];
+ − 385 if(rxBuffer[localRX] == '0')
+ − 386 {
+ − 387 rxState++;
+ − 388 dataValueIdx++;
+ − 389 dataValue[dataValueIdx] = 0;
+ − 390 }
+ − 391 else
+ − 392 {
+ − 393 rxState = RX_Ready;
+ − 394 }
+ − 395 break;
+ − 396 case RX_Data11: rxState = RX_DataComplete;
+ − 397 ConvertByteToHexString(checksum,checksum_str);
+ − 398 if(rxBuffer[localRX] == checksum_str[0])
+ − 399 {
+ − 400 rxState = RX_DataComplete;
+ − 401 }
+ − 402 else
+ − 403 {
+ − 404 rxState = RX_Ready;
+ − 405 }
+ − 406
+ − 407 break;
+ − 408
+ − 409 case RX_DataComplete: if(rxBuffer[localRX] == checksum_str[1])
+ − 410 {
+ − 411 setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0));
+ − 412 setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0));
+ − 413 setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0));
742
+ − 414 SentinelConnected = 1;
690
+ − 415 }
+ − 416 rxState = RX_Ready;
+ − 417 break;
+ − 418
+ − 419
+ − 420 default: rxState = RX_Ready;
+ − 421 break;
+ − 422
+ − 423 }
+ − 424 localRX++;
+ − 425 rxReadIndex++;
+ − 426 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER)
+ − 427 {
+ − 428 localRX = 0;
+ − 429 rxReadIndex = 0;
+ − 430 }
+ − 431 }
+ − 432
+ − 433 if(time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 4000) /* check for communication timeout */
+ − 434 {
+ − 435 if(curAlive == lastAlive)
+ − 436 {
+ − 437 setExternalInterfaceChannel(0,0.0);
+ − 438 setExternalInterfaceChannel(1,0.0);
+ − 439 setExternalInterfaceChannel(2,0.0);
742
+ − 440 SentinelConnected = 0;
690
+ − 441 }
+ − 442 lastAlive = curAlive;
+ − 443 }
+ − 444
+ − 445 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */
+ − 446 {
742
+ − 447 UART_StartDMA_Receiption();
690
+ − 448 }
+ − 449 }
+ − 450 #endif
38
+ − 451
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 452
704
+ − 453
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 454 void UART_HandleDigitalO2(void)
704
+ − 455 {
+ − 456 static uint32_t lastO2ReqTick = 0;
+ − 457
+ − 458 static uartO2RxState_t rxState = O2RX_IDLE;
+ − 459 static uint32_t lastReceiveTick = 0;
+ − 460 static uint8_t lastAlive = 0;
+ − 461 static uint8_t curAlive = 0;
+ − 462
+ − 463 static uint8_t cmdLength = 0;
+ − 464 static uint8_t cmdString[10];
+ − 465 static uint8_t cmdReadIndex = 0;
+ − 466
+ − 467 uint32_t tmpO2 = 0;
+ − 468 uint32_t tmpData = 0;
+ − 469 uint8_t localRX = rxReadIndex;
+ − 470 uint32_t tick = HAL_GetTick();
+ − 471
+ − 472
+ − 473 if(Comstatus_O2 == UART_O2_INIT)
+ − 474 {
+ − 475 memset((char*)&rxBuffer[rxWriteIndex],(int)0,CHUNK_SIZE);
714
+ − 476 memset((char*) &sensorDataDiveO2, 0, sizeof(sensorDataDiveO2));
+ − 477 externalInterface_SetSensorData(0,(uint8_t*)&sensorDataDiveO2);
+ − 478
704
+ − 479 lastAlive = 0;
+ − 480 curAlive = 0;
+ − 481
+ − 482 Comstatus_O2 = UART_O2_CHECK;
+ − 483 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength);
+ − 484 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10);
+ − 485
+ − 486 rxState = O2RX_CONFIRM;
+ − 487 cmdReadIndex = 0;
+ − 488 lastO2ReqTick = tick;
+ − 489
742
+ − 490 UART_StartDMA_Receiption();
704
+ − 491 }
+ − 492 if(time_elapsed_ms(lastO2ReqTick,tick) > 1000) /* repeat request once per second */
+ − 493 {
+ − 494 lastO2ReqTick = tick;
+ − 495 if(Comstatus_O2 == UART_O2_IDLE) /* cyclic request of o2 value */
+ − 496 {
721
+ − 497 Comstatus_O2 = UART_O2_REQ_RAW;
704
+ − 498 rxState = O2RX_CONFIRM;
+ − 499 }
+ − 500 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength);
+ − 501
+ − 502 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10);
+ − 503 }
+ − 504
+ − 505 while((rxBuffer[localRX]!=0))
+ − 506 {
+ − 507
+ − 508 lastReceiveTick = tick;
+ − 509 switch(rxState)
+ − 510 {
+ − 511 case O2RX_CONFIRM: if(rxBuffer[localRX] == '#')
+ − 512 {
+ − 513 cmdReadIndex = 0;
+ − 514 }
+ − 515 if(rxBuffer[localRX] == cmdString[cmdReadIndex])
+ − 516 {
+ − 517 cmdReadIndex++;
+ − 518 if(cmdReadIndex == cmdLength - 1)
+ − 519 {
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 520 digO2Connected = 1;
704
+ − 521 tmpRxIdx = 0;
+ − 522 memset((char*) tmpRxBuf, 0, sizeof(tmpRxBuf));
+ − 523 switch (Comstatus_O2)
+ − 524 {
714
+ − 525 case UART_O2_CHECK: Comstatus_O2 = UART_O2_REQ_ID;
+ − 526 rxState = O2RX_CONFIRM;
704
+ − 527 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength);
+ − 528 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10);
+ − 529 break;
+ − 530 case UART_O2_REQ_ID: rxState = O2RX_GETNR;
+ − 531 break;
+ − 532 case UART_O2_REQ_INFO: rxState = O2RX_GETTYPE;
+ − 533 break;
721
+ − 534 case UART_O2_REQ_RAW:
704
+ − 535 case UART_O2_REQ_O2: rxState = O2RX_GETO2;
+ − 536 break;
+ − 537 default: Comstatus_O2 = UART_O2_IDLE;
+ − 538 rxState = O2RX_IDLE;
+ − 539 break;
+ − 540 }
+ − 541 }
+ − 542 }
+ − 543 break;
+ − 544
+ − 545 case O2RX_GETSTATUS:
+ − 546 case O2RX_GETTEMP:
+ − 547 case O2RX_GETTYPE:
+ − 548 case O2RX_GETVERSION:
+ − 549 case O2RX_GETCHANNEL:
+ − 550 case O2RX_GETSUBSENSORS:
+ − 551 case O2RX_GETO2:
721
+ − 552 case O2RX_GETNR:
+ − 553 case O2RX_GETDPHI:
+ − 554 case O2RX_INTENSITY:
+ − 555 case O2RX_AMBIENTLIGHT:
+ − 556 case O2RX_PRESSURE:
+ − 557 case O2RX_HUMIDITY:
+ − 558 if(rxBuffer[localRX] != 0x0D)
704
+ − 559 {
+ − 560 if(rxBuffer[localRX] != ' ')
+ − 561 {
+ − 562 tmpRxBuf[tmpRxIdx++] = rxBuffer[localRX];
+ − 563 }
+ − 564 else
+ − 565 {
+ − 566 if(tmpRxIdx != 0)
+ − 567 {
+ − 568 switch(rxState)
+ − 569 {
+ − 570 case O2RX_GETCHANNEL: StringToInt(tmpRxBuf,&tmpData);
+ − 571 rxState = O2RX_GETVERSION;
+ − 572 break;
+ − 573 case O2RX_GETVERSION: StringToInt(tmpRxBuf,&tmpData);
+ − 574 rxState = O2RX_GETSUBSENSORS;
+ − 575 break;
+ − 576 case O2RX_GETTYPE: StringToInt(tmpRxBuf,&tmpData);
+ − 577 rxState = O2RX_GETCHANNEL;
+ − 578 break;
+ − 579
+ − 580 case O2RX_GETO2: StringToInt(tmpRxBuf,&tmpO2);
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 581 setExternalInterfaceChannel(ppO2TargetChannel,(float)(tmpO2 / 10000.0));
704
+ − 582 rxState = O2RX_GETTEMP;
+ − 583 break;
714
+ − 584 case O2RX_GETTEMP: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.temperature);
+ − 585 rxState = O2RX_GETSTATUS;
704
+ − 586 break;
721
+ − 587 case O2RX_GETSTATUS: StringToInt(tmpRxBuf,&sensorDataDiveO2.status); /* raw data cycle */
+ − 588 rxState = O2RX_GETDPHI;
+ − 589 break;
+ − 590 case O2RX_GETDPHI: /* ignored to save memory and most likly irrelevant for diver */
+ − 591 rxState = O2RX_INTENSITY;
+ − 592 break;
+ − 593 case O2RX_INTENSITY: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.intensity); /* raw data cycle */
+ − 594 rxState = O2RX_AMBIENTLIGHT;
+ − 595 break;
+ − 596 case O2RX_AMBIENTLIGHT: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.ambient); /* raw data cycle */
+ − 597 rxState = O2RX_PRESSURE;
+ − 598 break;
+ − 599 case O2RX_PRESSURE: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.pressure); /* raw data cycle */
+ − 600 rxState = O2RX_HUMIDITY;
+ − 601 break;
704
+ − 602 default:
+ − 603 break;
+ − 604 }
+ − 605 memset((char*) tmpRxBuf, 0, tmpRxIdx);
+ − 606 tmpRxIdx = 0;
+ − 607 }
+ − 608 }
+ − 609 }
+ − 610 else
+ − 611 {
+ − 612 switch (rxState)
+ − 613 {
714
+ − 614 case O2RX_GETSTATUS: StringToInt(tmpRxBuf,&sensorDataDiveO2.status);
+ − 615 externalInterface_SetSensorData(1,(uint8_t*)&sensorDataDiveO2);
704
+ − 616 Comstatus_O2 = UART_O2_IDLE;
+ − 617 rxState = O2RX_IDLE;
+ − 618 break;
+ − 619 case O2RX_GETSUBSENSORS: StringToInt(tmpRxBuf,&tmpData);
+ − 620 Comstatus_O2 = UART_O2_IDLE;
+ − 621 rxState = O2RX_IDLE;
+ − 622 break;
721
+ − 623 case O2RX_HUMIDITY: StringToInt(tmpRxBuf,(uint32_t*)&sensorDataDiveO2.humidity); /* raw data cycle */
+ − 624 externalInterface_SetSensorData(1,(uint8_t*)&sensorDataDiveO2);
+ − 625 Comstatus_O2 = UART_O2_IDLE;
+ − 626 rxState = O2RX_IDLE;
+ − 627 break;
714
+ − 628 case O2RX_GETNR: StringToUInt64((char*)tmpRxBuf,&sensorDataDiveO2.sensorId);
704
+ − 629 /* no break */
+ − 630 default: Comstatus_O2 = UART_O2_IDLE;
+ − 631 rxState = O2RX_IDLE;
+ − 632 break;
+ − 633 }
+ − 634 }
+ − 635 break;
+ − 636 default: rxState = O2RX_IDLE;
+ − 637 break;
+ − 638
+ − 639 }
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 640 rxBuffer[localRX] = 0;
704
+ − 641 localRX++;
+ − 642 rxReadIndex++;
+ − 643 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER)
+ − 644 {
+ − 645 localRX = 0;
+ − 646 rxReadIndex = 0;
+ − 647 }
+ − 648 }
+ − 649
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 650 if((digO2Connected) && time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 4000) /* check for communication timeout */
704
+ − 651 {
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 652 digO2Connected = 0;
704
+ − 653 if(curAlive == lastAlive)
+ − 654 {
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 655 setExternalInterfaceChannel(ppO2TargetChannel,0.0);
704
+ − 656 }
+ − 657 lastAlive = curAlive;
+ − 658 }
+ − 659 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */
+ − 660 {
742
+ − 661 UART_StartDMA_Receiption();
704
+ − 662 }
+ − 663 }
+ − 664
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 665 uint8_t UART_isDigO2Connected()
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 666 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 667 return digO2Connected;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 668 }
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 669 uint8_t UART_isCO2Connected()
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 670 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 671 return CO2Connected;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 672 }
742
+ − 673 uint8_t UART_isSentinelConnected()
+ − 674 {
+ − 675 return SentinelConnected;
+ − 676 }
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 677
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 678 void UART_setTargetChannel(uint8_t channel)
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 679 {
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 680 ppO2TargetChannel = channel;
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
diff
changeset
+ − 681 }
704
+ − 682
662
+ − 683 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
38
+ − 684 {
662
+ − 685 if(huart == &huart1)
+ − 686 {
+ − 687 dmaActive = 0;
+ − 688 rxWriteIndex+=CHUNK_SIZE;
+ − 689 if(rxWriteIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER)
+ − 690 {
+ − 691 rxWriteIndex = 0;
+ − 692 }
+ − 693 if((rxWriteIndex / CHUNK_SIZE) != (rxReadIndex / CHUNK_SIZE)) /* start next transfer if we did not catch up with read index */
+ − 694 {
+ − 695 if(externalInterface_isEnabledPower33())
+ − 696 {
704
+ − 697 memset((char*)&rxBuffer[rxWriteIndex],(int)0,CHUNK_SIZE);
742
+ − 698 UART_StartDMA_Receiption();
662
+ − 699 }
+ − 700 }
+ − 701 }
38
+ − 702 }
+ − 703
+ − 704
662
+ − 705
38
+ − 706 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/