comparison Small_CPU/Src/uartProtocol_Sentinel.c @ 1062:785772303f9c Icon_Integration

Added pressure sensors in Sentnel mode: The Red Head/Provide pressure and tempstick information on a uart channel together with the O2 data. The support for receiving pressure data has been added to the Sentinel protocol function.
author Ideenmodellierer
date Tue, 10 Feb 2026 19:36:05 +0100
parents effadaa3a1f7
children
comparison
equal deleted inserted replaced
1061:f501d7c35c8f 1062:785772303f9c
24 #include "uart.h" 24 #include "uart.h"
25 #include "externalInterface.h" 25 #include "externalInterface.h"
26 26
27 27
28 #ifdef ENABLE_SENTINEL_MODE 28 #ifdef ENABLE_SENTINEL_MODE
29 static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor is connected or not */ 29 static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor (and what type of subsensor) is connected or not */
30 static receiveStateSentinel_t rxState = SENTRX_Ready; 30 static receiveStateSentinel_t rxState = SENTRX_Ready;
31 31
32 extern sUartComCtrl Uart1Ctrl; 32 extern sUartComCtrl Uart1Ctrl;
33 33
34 void ConvertByteToHexString(uint8_t byte, char* str) 34 void ConvertByteToHexString(uint8_t byte, char* str)
63 { 63 {
64 SentinelConnected = 0; 64 SentinelConnected = 0;
65 UART_StartDMA_Receiption(&Uart1Ctrl); 65 UART_StartDMA_Receiption(&Uart1Ctrl);
66 localComState = UART_SENTINEL_IDLE; 66 localComState = UART_SENTINEL_IDLE;
67 } 67 }
68 if(localComState == UART_SENTINEL_IDLE)
69 {
70 localComState = UART_SENTINEL_OPERATING; /* state is only used for timeout detection */
71 }
68 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState); 72 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState);
69 } 73 }
70 74
71 void uartSentinel_ProcessData(uint8_t data) 75 void uartSentinel_ProcessData(uint8_t data)
72 { 76 {
80 uint8_t activeSensor = externalInterface_GetActiveUartSensor(); 84 uint8_t activeSensor = externalInterface_GetActiveUartSensor();
81 uartSentinelStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); 85 uartSentinelStatus_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET);
82 86
83 switch(rxState) 87 switch(rxState)
84 { 88 {
85 case SENTRX_Ready: if((data >= 'a') && (data <= 'z')) 89 case SENTRX_Ready: if((data >= 'a') && (data <= 'z')) /* Alive byte */
86 { 90 {
87 rxState = SENTRX_DetectStart; 91 rxState = SENTRX_DetectStart;
88 checksum = 0; 92 checksum = 0;
89 } 93 }
90 break; 94 break;
91 95
92 case SENTRX_DetectStart: checksum += data; 96 case SENTRX_DetectStart: checksum += data; /* data available */
93 if(data == '1') 97 if(data == '1')
94 { 98 {
95 rxState = SENTRX_SelectData; 99 rxState = SENTRX_SelectData;
96 dataType = 0xFF; 100 dataType = 0xFF;
97 101
100 { 104 {
101 rxState = SENTRX_Ready; 105 rxState = SENTRX_Ready;
102 } 106 }
103 break; 107 break;
104 108
105 case SENTRX_SelectData: checksum += data; 109 case SENTRX_SelectData: checksum += data; /* data type */
106 switch(data) 110 switch(data)
107 { 111 {
108 case 'T': dataType = data; 112 case UART_SENTINEL_PRESSURE_O2: /* no '0' spacing for pressure sensors */
113 case UART_SENTINEL_PRESSURE_D: dataType = data;
114 rxState = SENTRX_Data0;
115 dataValueIdx = 0;
116 dataValue[0] = 0;
109 break; 117 break;
118 case UART_SENTINEL_O2_P:
119 case UART_SENTINEL_O2_S:
120 case UART_SENTINEL_TEMPSTICK: dataType = data;
121 break;
122
110 case '0': if(dataType != 0xff) 123 case '0': if(dataType != 0xff)
111 { 124 {
112 rxState = SENTRX_Data0; 125 rxState = SENTRX_Data0;
113 dataValueIdx = 0; 126 dataValueIdx = 0;
114 dataValue[0] = 0; 127 dataValue[0] = 0;
133 case SENTRX_Data9: 146 case SENTRX_Data9:
134 case SENTRX_Data10: checksum += data; 147 case SENTRX_Data10: checksum += data;
135 if((data >= '0') && (data <= '9')) 148 if((data >= '0') && (data <= '9'))
136 { 149 {
137 dataValue[dataValueIdx] = dataValue[dataValueIdx] * 10 + (data - '0'); 150 dataValue[dataValueIdx] = dataValue[dataValueIdx] * 10 + (data - '0');
138 rxState++; 151 if((rxState == SENTRX_Data2) && ((dataType == UART_SENTINEL_PRESSURE_O2) || (dataType == UART_SENTINEL_PRESSURE_D)))
152 {
153 rxState = SENTRX_CheckSum;
154 }
155 else
156 {
157 rxState++;
158 }
139 } 159 }
140 else 160 else
141 { 161 {
142 rxState = SENTRX_Ready; 162 rxState = SENTRX_Ready;
143 } 163 }
145 165
146 case SENTRX_Data3: 166 case SENTRX_Data3:
147 case SENTRX_Data7: checksum += data; 167 case SENTRX_Data7: checksum += data;
148 if(data == '0') 168 if(data == '0')
149 { 169 {
150 rxState++;
151 dataValueIdx++; 170 dataValueIdx++;
152 dataValue[dataValueIdx] = 0; 171 dataValue[dataValueIdx] = 0;
172 rxState++;
153 } 173 }
154 else 174 else
155 { 175 {
156 rxState = SENTRX_Ready; 176 rxState = SENTRX_Ready;
157 } 177 }
158 break; 178 break;
159 case SENTRX_Data11: rxState = SENTRX_DataComplete; 179 case SENTRX_CheckSum: ConvertByteToHexString(checksum,checksum_str);
160 ConvertByteToHexString(checksum,checksum_str); 180 if(data == checksum_str[0])
161 if(data == checksum_str[0]) 181 {
162 { 182 rxState = SENTRX_DataComplete;
163 rxState = SENTRX_DataComplete; 183 }
164 } 184 else
165 else 185 {
166 { 186 rxState = SENTRX_Ready;
167 rxState = SENTRX_Ready; 187 }
168 }
169 188
170 break; 189 break;
171 190
172 case SENTRX_DataComplete: if(data == checksum_str[1]) 191 case SENTRX_DataComplete: if(data == checksum_str[1])
173 { 192 {
174 setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0)); 193 switch(dataType)
175 setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0)); 194 {
176 setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0)); 195 case UART_SENTINEL_O2_P: setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0));
177 SentinelConnected = 1; 196 setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0));
178 localComState = UART_SENTINEL_OPERATING; 197 setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0));
198 SentinelConnected |= SENTINEL_O2;
199 break;
200 case UART_SENTINEL_PRESSURE_O2: externalInterface_SetBottlePressure(0,dataValue[0]);
201 SentinelConnected |= SENTINEL_PRESSURE;
202 break;
203 case UART_SENTINEL_PRESSURE_D: externalInterface_SetBottlePressure(1,dataValue[0]);
204 SentinelConnected |= SENTINEL_PRESSURE;
205 break;
206 case UART_SENTINEL_TEMPSTICK: SentinelConnected |= SENTINEL_TEMPSTICK;
207 }
208 localComState = UART_SENTINEL_IDLE;
179 } 209 }
180 rxState = SENTRX_Ready; 210 rxState = SENTRX_Ready;
181 break; 211 break;
182 212
183 213