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

Merge into default
author heinrichsweikamp
date Tue, 11 Feb 2025 18:12:00 +0100
parents 0b81ac558e89
children
comparison
equal deleted inserted replaced
871:f7318457df4d 981:c6c781a2e85b
22 #include <string.h> 22 #include <string.h>
23 #include <uartProtocol_Co2.h> 23 #include <uartProtocol_Co2.h>
24 #include "uart.h" 24 #include "uart.h"
25 #include "externalInterface.h" 25 #include "externalInterface.h"
26 26
27
28 #ifdef ENABLE_CO2_SUPPORT 27 #ifdef ENABLE_CO2_SUPPORT
29 static uint8_t CO2Connected = 0; /* Binary indicator if a sensor is connected or not */ 28 static uint8_t CO2Connected = 0; /* Binary indicator if a sensor is connected or not */
30 static receiveState_t rxState = RX_Ready; 29 static receiveStateCO2_t rxState = CO2RX_Ready;
31 30
32 31
33 32
34 float LED_Level = 0.0; /* Normalized LED value which may be used as indication for the health status of the sensor */ 33 float LED_Level = 0.0; /* Normalized LED value which may be used as indication for the health status of the sensor */
35 float LED_ZeroOffset = 0.0; 34 float LED_ZeroOffset = 0.0;
82 81
83 if(localComState == UART_CO2_INIT) 82 if(localComState == UART_CO2_INIT)
84 { 83 {
85 CO2Connected = 0; 84 CO2Connected = 0;
86 externalInterface_SetCO2Scale(0.0); 85 externalInterface_SetCO2Scale(0.0);
87 UART_StartDMA_Receiption(); 86 UART_ReadData(SENSOR_CO2, 1); /* flush buffer */
87 UART_StartDMA_Receiption(&Uart1Ctrl);
88 localComState = UART_CO2_SETUP; 88 localComState = UART_CO2_SETUP;
89 } 89 }
90 if(localComState == UART_CO2_SETUP) 90 if(localComState == UART_CO2_SETUP)
91 { 91 {
92 if(externalInterface_GetCO2Scale() == 0.0) 92 if(externalInterface_GetCO2Scale() == 0.0)
108 else if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) /* sensor is working in polling mode if mux is connected to avoid interference with other sensors */ 108 else if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) /* sensor is working in polling mode if mux is connected to avoid interference with other sensors */
109 { 109 {
110 //if(cmdLength == 0) /* poll data */ 110 //if(cmdLength == 0) /* poll data */
111 if(localComState == UART_CO2_IDLE) 111 if(localComState == UART_CO2_IDLE)
112 { 112 {
113 uartCo2_SendCmd(CO2CMD_GETDATA, cmdString, &cmdLength); 113 if(externalInterface_GetCO2Scale() == 0.0)
114 localComState = UART_CO2_OPERATING; 114 {
115 uartCo2_SendCmd(CO2CMD_GETSCALE, cmdString, &cmdLength);
116 localComState = UART_CO2_SETUP;
117 }
118 else
119 {
120 uartCo2_SendCmd(CO2CMD_GETDATA, cmdString, &cmdLength);
121 localComState = UART_CO2_OPERATING;
122 }
115 } 123 }
116 else /* resend last command */ 124 else /* resend last command */
117 { 125 {
118 UART_SendCmdString(cmdString); 126 UART_SendCmdString(cmdString);
119 cmdLength = 0; 127 cmdLength = 0;
120 } 128 }
121 } 129 }
122 else 130 else
123 { 131 {
124 localComState = UART_CO2_OPERATING; /* sensor in streaming mode if not connected to mux => operating */ 132 localComState = UART_CO2_OPERATING; /* sensor in streaming mode if not connected to mux => operating */
125 UART_StartDMA_Receiption(); 133 UART_StartDMA_Receiption(&Uart1Ctrl);
126 } 134 }
127 } 135 }
128 lastComState = localComState; 136 lastComState = localComState;
129 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState); 137 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState);
130 } 138 }
135 static uint8_t dataType = 0; 143 static uint8_t dataType = 0;
136 static uint32_t dataValue = 0; 144 static uint32_t dataValue = 0;
137 uint8_t activeSensor = externalInterface_GetActiveUartSensor(); 145 uint8_t activeSensor = externalInterface_GetActiveUartSensor();
138 uartCO2Status_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); 146 uartCO2Status_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET);
139 147
140 if(rxState == RX_Ready) /* identify data content */ 148 if(rxState == CO2RX_Ready) /* identify data content */
141 { 149 {
142 switch(data) 150 switch(data)
143 { 151 {
144 case 'G': 152 case 'G':
145 case 'l': 153 case 'l':
146 case 'D': 154 case 'D':
147 case 'Z': 155 case 'Z':
148 case '.': dataType = data; 156 case '.': dataType = data;
149 rxState = RX_Data0; 157 rxState = CO2RX_Data0;
150 dataValue = 0; 158 dataValue = 0;
151 break; 159 break;
152 case '?': localComState = UART_CO2_ERROR; 160 case '?': localComState = UART_CO2_ERROR;
153 break; 161 break;
154 default: /* unknown or corrupted => ignore */ 162 default: /* unknown or corrupted => ignore */
155 break; 163 break;
156 } 164 }
157 } 165 }
158 else if((data >= '0') && (data <= '9')) 166 else if((data >= '0') && (data <= '9'))
159 { 167 {
160 if((rxState >= RX_Data0) && (rxState <= RX_Data4)) 168 if((rxState >= CO2RX_Data0) && (rxState <= CO2RX_Data4))
161 { 169 {
162 dataValue = dataValue * 10 + (data - '0'); 170 dataValue = dataValue * 10 + (data - '0');
163 rxState++; 171 rxState++;
164 if(rxState == RX_Data5) 172 if(rxState == CO2RX_Data5)
165 { 173 {
166 rxState = RX_DataComplete; 174 rxState = CO2RX_DataComplete;
167 } 175 }
168 } 176 }
169 else /* protocol error data has max 5 digits */ 177 else /* protocol error data has max 5 digits */
170 { 178 {
171 if(rxState != RX_DataComplete) /* commands will not answer with number values */ 179 if(rxState != CO2RX_DataComplete) /* commands will not answer with number values */
172 { 180 {
173 rxState = RX_Ready; 181 rxState = CO2RX_Ready;
174 } 182 }
175 } 183 }
176 } 184 }
177 if((data == ' ') || (data == '\n')) /* Abort data detection */ 185 else if((data == ' ') || (data == '\n')) /* Abort data detection */
178 { 186 {
179 if(rxState == RX_DataComplete) 187 if(rxState == CO2RX_DataComplete)
180 { 188 {
181 CO2Connected = 1; 189 CO2Connected = 1;
182 if(localComState == UART_CO2_SETUP) 190 if(localComState == UART_CO2_SETUP)
183 { 191 {
184 if(dataType == '.') 192 if(dataType == '.')
202 break; 210 break;
203 case 'Z': externalInterface_SetCO2Value(dataValue); 211 case 'Z': externalInterface_SetCO2Value(dataValue);
204 break; 212 break;
205 case '.': externalInterface_SetCO2Scale(dataValue); 213 case '.': externalInterface_SetCO2Scale(dataValue);
206 break; 214 break;
207 default: rxState = RX_Ready; 215 default: rxState = CO2RX_Ready;
208 break; 216 break;
209 } 217 }
210 } 218 rxState = CO2RX_Ready;
211 if(rxState != RX_Data0) /* reset state machine because message in wrong format */ 219 }
212 { 220 if(rxState != CO2RX_Data0) /* reset state machine because message in wrong format */
213 rxState = RX_Ready; 221 {
222 rxState = CO2RX_Ready;
223 }
224 }
225 else
226 {
227 if((rxState >= CO2RX_Data0) && (rxState <= CO2RX_Data4))
228 {
229 rxState = CO2RX_Ready; /* numerical data expected => abort */
214 } 230 }
215 } 231 }
216 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState); 232 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState);
217 } 233 }
218 234