comparison Small_CPU/Src/uartProtocol_Sentinel.c @ 981:c6c781a2e85b default

Merge into default
author heinrichsweikamp
date Tue, 11 Feb 2025 18:12:00 +0100
parents effadaa3a1f7
children
comparison
equal deleted inserted replaced
871:f7318457df4d 981:c6c781a2e85b
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>&copy; 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 extern sUartComCtrl Uart1Ctrl;
33
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;
65 UART_StartDMA_Receiption(&Uart1Ctrl);
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