842
+ − 1 /**
+ − 2 ******************************************************************************
+ − 3 * @file uartProtocol_Co2.c
+ − 4 * @author heinrichs weikamp gmbh
+ − 5 * @version V0.0.1
+ − 6 * @date 15-Jan-2024
+ − 7 * @brief Interface functionality to read data from Sentinel rebreather
+ − 8 *
+ − 9 @verbatim
+ − 10
+ − 11
+ − 12 @endverbatim
+ − 13 ******************************************************************************
+ − 14 * @attention
+ − 15 *
+ − 16 * <h2><center>© COPYRIGHT(c) 2024 heinrichs weikamp</center></h2>
+ − 17 *
+ − 18 ******************************************************************************
+ − 19 */
+ − 20 /* Includes ------------------------------------------------------------------*/
+ − 21
+ − 22 #include <string.h>
+ − 23 #include <uartProtocol_Sentinel.h>
+ − 24 #include "uart.h"
+ − 25 #include "externalInterface.h"
+ − 26
+ − 27
+ − 28 #ifdef ENABLE_SENTINEL_MODE
+ − 29 static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor is connected or not */
+ − 30 static receiveStateSentinel_t rxState = SENTRX_Ready;
+ − 31
+ − 32 void ConvertByteToHexString(uint8_t byte, char* str)
+ − 33 {
+ − 34 uint8_t worker = 0;
+ − 35 uint8_t digit = 0;
+ − 36 uint8_t digitCnt = 1;
+ − 37
+ − 38 worker = byte;
+ − 39 while((worker!=0) && (digitCnt != 255))
+ − 40 {
+ − 41 digit = worker % 16;
+ − 42 if( digit < 10)
+ − 43 {
+ − 44 digit += '0';
+ − 45 }
+ − 46 else
+ − 47 {
+ − 48 digit += 'A' - 10;
+ − 49 }
+ − 50 str[digitCnt--]= digit;
+ − 51 worker = worker / 16;
+ − 52 }
+ − 53 }
+ − 54
+ − 55 void uartSentinel_Control(void)
+ − 56 {
+ − 57 uint8_t activeSensor = externalInterface_GetActiveUartSensor();
+ − 58 uartSentinelStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET);
+ − 59
+ − 60 if(localComState == UART_SENTINEL_INIT)
+ − 61 {
+ − 62 SentinelConnected = 0;
+ − 63 UART_StartDMA_Receiption();
+ − 64 localComState = UART_SENTINEL_IDLE;
+ − 65 }
+ − 66 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState);
+ − 67 }
+ − 68
+ − 69 void uartSentinel_ProcessData(uint8_t data)
+ − 70 {
+ − 71 static uint8_t dataType = 0;
+ − 72 static uint32_t dataValue[3];
+ − 73 static uint8_t dataValueIdx = 0;
+ − 74
+ − 75 static uint8_t checksum = 0;
+ − 76 static char checksum_str[]="00";
+ − 77
+ − 78 uint8_t activeSensor = externalInterface_GetActiveUartSensor();
+ − 79 uartSentinelStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET);
+ − 80
+ − 81 switch(rxState)
+ − 82 {
+ − 83 case SENTRX_Ready: if((data >= 'a') && (data <= 'z'))
+ − 84 {
+ − 85 rxState = SENTRX_DetectStart;
+ − 86 checksum = 0;
+ − 87 }
+ − 88 break;
+ − 89
+ − 90 case SENTRX_DetectStart: checksum += data;
+ − 91 if(data == '1')
+ − 92 {
+ − 93 rxState = SENTRX_SelectData;
+ − 94 dataType = 0xFF;
+ − 95
+ − 96 }
+ − 97 else
+ − 98 {
+ − 99 rxState = SENTRX_Ready;
+ − 100 }
+ − 101 break;
+ − 102
+ − 103 case SENTRX_SelectData: checksum += data;
+ − 104 switch(data)
+ − 105 {
+ − 106 case 'T': dataType = data;
+ − 107 break;
+ − 108 case '0': if(dataType != 0xff)
+ − 109 {
+ − 110 rxState = SENTRX_Data0;
+ − 111 dataValueIdx = 0;
+ − 112 dataValue[0] = 0;
+ − 113
+ − 114 }
+ − 115 else
+ − 116 {
+ − 117 rxState = SENTRX_Ready;
+ − 118 }
+ − 119 break;
+ − 120 default: rxState = SENTRX_Ready;
+ − 121 }
+ − 122 break;
+ − 123
+ − 124 case SENTRX_Data0:
+ − 125 case SENTRX_Data1:
+ − 126 case SENTRX_Data2:
+ − 127 case SENTRX_Data4:
+ − 128 case SENTRX_Data5:
+ − 129 case SENTRX_Data6:
+ − 130 case SENTRX_Data8:
+ − 131 case SENTRX_Data9:
+ − 132 case SENTRX_Data10: checksum += data;
+ − 133 if((data >= '0') && (data <= '9'))
+ − 134 {
+ − 135 dataValue[dataValueIdx] = dataValue[dataValueIdx] * 10 + (data - '0');
+ − 136 rxState++;
+ − 137 }
+ − 138 else
+ − 139 {
+ − 140 rxState = SENTRX_Ready;
+ − 141 }
+ − 142 break;
+ − 143
+ − 144 case SENTRX_Data3:
+ − 145 case SENTRX_Data7: checksum += data;
+ − 146 if(data == '0')
+ − 147 {
+ − 148 rxState++;
+ − 149 dataValueIdx++;
+ − 150 dataValue[dataValueIdx] = 0;
+ − 151 }
+ − 152 else
+ − 153 {
+ − 154 rxState = SENTRX_Ready;
+ − 155 }
+ − 156 break;
+ − 157 case SENTRX_Data11: rxState = SENTRX_DataComplete;
+ − 158 ConvertByteToHexString(checksum,checksum_str);
+ − 159 if(data == checksum_str[0])
+ − 160 {
+ − 161 rxState = SENTRX_DataComplete;
+ − 162 }
+ − 163 else
+ − 164 {
+ − 165 rxState = SENTRX_Ready;
+ − 166 }
+ − 167
+ − 168 break;
+ − 169
+ − 170 case SENTRX_DataComplete: if(data == checksum_str[1])
+ − 171 {
+ − 172 setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0));
+ − 173 setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0));
+ − 174 setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0));
+ − 175 SentinelConnected = 1;
+ − 176 localComState = UART_SENTINEL_OPERATING;
+ − 177 }
+ − 178 rxState = SENTRX_Ready;
+ − 179 break;
+ − 180
+ − 181
+ − 182 default: rxState = SENTRX_Ready;
+ − 183 break;
+ − 184
+ − 185 }
+ − 186 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState);
+ − 187 }
+ − 188
+ − 189 uint8_t uartSentinel_isSensorConnected()
+ − 190 {
+ − 191 return SentinelConnected;
+ − 192 }
+ − 193
+ − 194 #endif
+ − 195