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
932
+ − 32 extern sUartComCtrl Uart1Ctrl;
+ − 33
842
+ − 34 void ConvertByteToHexString(uint8_t byte, char* str)
+ − 35 {
+ − 36 uint8_t worker = 0;
+ − 37 uint8_t digit = 0;
+ − 38 uint8_t digitCnt = 1;
+ − 39
+ − 40 worker = byte;
+ − 41 while((worker!=0) && (digitCnt != 255))
+ − 42 {
+ − 43 digit = worker % 16;
+ − 44 if( digit < 10)
+ − 45 {
+ − 46 digit += '0';
+ − 47 }
+ − 48 else
+ − 49 {
+ − 50 digit += 'A' - 10;
+ − 51 }
+ − 52 str[digitCnt--]= digit;
+ − 53 worker = worker / 16;
+ − 54 }
+ − 55 }
+ − 56
+ − 57 void uartSentinel_Control(void)
+ − 58 {
+ − 59 uint8_t activeSensor = externalInterface_GetActiveUartSensor();
+ − 60 uartSentinelStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET);
+ − 61
+ − 62 if(localComState == UART_SENTINEL_INIT)
+ − 63 {
+ − 64 SentinelConnected = 0;
932
+ − 65 UART_StartDMA_Receiption(&Uart1Ctrl);
842
+ − 66 localComState = UART_SENTINEL_IDLE;
+ − 67 }
+ − 68 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState);
+ − 69 }
+ − 70
+ − 71 void uartSentinel_ProcessData(uint8_t data)
+ − 72 {
+ − 73 static uint8_t dataType = 0;
+ − 74 static uint32_t dataValue[3];
+ − 75 static uint8_t dataValueIdx = 0;
+ − 76
+ − 77 static uint8_t checksum = 0;
+ − 78 static char checksum_str[]="00";
+ − 79
+ − 80 uint8_t activeSensor = externalInterface_GetActiveUartSensor();
+ − 81 uartSentinelStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET);
+ − 82
+ − 83 switch(rxState)
+ − 84 {
+ − 85 case SENTRX_Ready: if((data >= 'a') && (data <= 'z'))
+ − 86 {
+ − 87 rxState = SENTRX_DetectStart;
+ − 88 checksum = 0;
+ − 89 }
+ − 90 break;
+ − 91
+ − 92 case SENTRX_DetectStart: checksum += data;
+ − 93 if(data == '1')
+ − 94 {
+ − 95 rxState = SENTRX_SelectData;
+ − 96 dataType = 0xFF;
+ − 97
+ − 98 }
+ − 99 else
+ − 100 {
+ − 101 rxState = SENTRX_Ready;
+ − 102 }
+ − 103 break;
+ − 104
+ − 105 case SENTRX_SelectData: checksum += data;
+ − 106 switch(data)
+ − 107 {
+ − 108 case 'T': dataType = data;
+ − 109 break;
+ − 110 case '0': if(dataType != 0xff)
+ − 111 {
+ − 112 rxState = SENTRX_Data0;
+ − 113 dataValueIdx = 0;
+ − 114 dataValue[0] = 0;
+ − 115
+ − 116 }
+ − 117 else
+ − 118 {
+ − 119 rxState = SENTRX_Ready;
+ − 120 }
+ − 121 break;
+ − 122 default: rxState = SENTRX_Ready;
+ − 123 }
+ − 124 break;
+ − 125
+ − 126 case SENTRX_Data0:
+ − 127 case SENTRX_Data1:
+ − 128 case SENTRX_Data2:
+ − 129 case SENTRX_Data4:
+ − 130 case SENTRX_Data5:
+ − 131 case SENTRX_Data6:
+ − 132 case SENTRX_Data8:
+ − 133 case SENTRX_Data9:
+ − 134 case SENTRX_Data10: checksum += data;
+ − 135 if((data >= '0') && (data <= '9'))
+ − 136 {
+ − 137 dataValue[dataValueIdx] = dataValue[dataValueIdx] * 10 + (data - '0');
+ − 138 rxState++;
+ − 139 }
+ − 140 else
+ − 141 {
+ − 142 rxState = SENTRX_Ready;
+ − 143 }
+ − 144 break;
+ − 145
+ − 146 case SENTRX_Data3:
+ − 147 case SENTRX_Data7: checksum += data;
+ − 148 if(data == '0')
+ − 149 {
+ − 150 rxState++;
+ − 151 dataValueIdx++;
+ − 152 dataValue[dataValueIdx] = 0;
+ − 153 }
+ − 154 else
+ − 155 {
+ − 156 rxState = SENTRX_Ready;
+ − 157 }
+ − 158 break;
+ − 159 case SENTRX_Data11: rxState = SENTRX_DataComplete;
+ − 160 ConvertByteToHexString(checksum,checksum_str);
+ − 161 if(data == checksum_str[0])
+ − 162 {
+ − 163 rxState = SENTRX_DataComplete;
+ − 164 }
+ − 165 else
+ − 166 {
+ − 167 rxState = SENTRX_Ready;
+ − 168 }
+ − 169
+ − 170 break;
+ − 171
+ − 172 case SENTRX_DataComplete: if(data == checksum_str[1])
+ − 173 {
+ − 174 setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0));
+ − 175 setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0));
+ − 176 setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0));
+ − 177 SentinelConnected = 1;
+ − 178 localComState = UART_SENTINEL_OPERATING;
+ − 179 }
+ − 180 rxState = SENTRX_Ready;
+ − 181 break;
+ − 182
+ − 183
+ − 184 default: rxState = SENTRX_Ready;
+ − 185 break;
+ − 186
+ − 187 }
+ − 188 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState);
+ − 189 }
+ − 190
+ − 191 uint8_t uartSentinel_isSensorConnected()
+ − 192 {
+ − 193 return SentinelConnected;
+ − 194 }
+ − 195
+ − 196 #endif
+ − 197