comparison Small_CPU/Src/uartProtocol_Co2.c @ 1065:1f2067cad41b Icon_Integration

Mixed sensor operation improvment: A peak detector has been added to the adc measurement to avoid interferance while UART sensor are taking measurement while adc is active. The previous approach to shift adc into time windows where no UART were active had to be replaced because for the CO2 sensor is continously taking samples without providing a sync signal. In addition the UART MUX switching behavior has been improved (potential rx data received from previous sensor is discarded during channel switch etc.)
author Ideenmodellierer
date Mon, 16 Feb 2026 21:27:26 +0100
parents a3f42192da0f
children
comparison
equal deleted inserted replaced
1064:449e0f8f23d0 1065:1f2067cad41b
64 64
65 void uartCo2_Control(void) 65 void uartCo2_Control(void)
66 { 66 {
67 static uint8_t cmdString[10]; 67 static uint8_t cmdString[10];
68 static uint8_t cmdLength = 0; 68 static uint8_t cmdLength = 0;
69 static uint8_t lastComState = 0; 69 static uint8_t lastComState = UART_CO2_INIT;
70 70
71 uint8_t activeSensor = externalInterface_GetActiveUartSensor(); 71 uint8_t activeSensor = externalInterface_GetActiveUartSensor();
72 uartCO2Status_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET); 72 uartCO2Status_t localComState = externalInterface_GetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET);
73 73
74 if(localComState == UART_CO2_ERROR) 74 if(localComState == UART_CO2_ERROR)
75 { 75 {
76 localComState = lastComState; 76 localComState = lastComState;
77 } 77 }
78 78
79 if(localComState == UART_CO2_INIT) 79 switch(localComState)
80 { 80 {
81 CO2Connected = 0; 81 case UART_CO2_INIT: CO2Connected = 0;
82 externalInterface_SetCO2Scale(0.0); 82 externalInterface_SetCO2Scale(0.0);
83 UART_ReadData(SENSOR_CO2, 1); /* flush buffer */ 83 UART_ReadData(SENSOR_CO2, 1); /* flush buffer */
84 UART_StartDMA_Receiption(&Uart1Ctrl); 84 UART_StartDMA_Receiption(&Uart1Ctrl);
85 localComState = UART_CO2_SETUP; 85 localComState = UART_CO2_SETUP;
86 } 86 uartCo2_SendCmd(CO2CMD_GETSCALE, cmdString, &cmdLength);
87 if(localComState == UART_CO2_SETUP) 87 break;
88 { 88 case UART_CO2_SETUP: if(externalInterface_GetCO2Scale() == 0.0)
89 if(externalInterface_GetCO2Scale() == 0.0) 89 {
90 { 90 uartCo2_SendCmd(CO2CMD_GETSCALE, cmdString, &cmdLength);
91 uartCo2_SendCmd(CO2CMD_GETSCALE, cmdString, &cmdLength); 91 }
92 } 92 else
93 else 93 {
94 { 94 uartCo2_SendCmd(CO2CMD_MODE_POLL, cmdString, &cmdLength);
95 localComState = UART_CO2_MODE; 95 localComState = UART_CO2_MODE;
96 } 96 }
97 } 97 break;
98 else if(localComState == UART_CO2_MODE) 98 case UART_CO2_MODE: uartCo2_SendCmd(CO2CMD_MODE_POLL, cmdString, &cmdLength);
99 { 99 break;
100 uartCo2_SendCmd(CO2CMD_MODE_POLL, cmdString, &cmdLength); 100 case UART_CO2_CALIBRATE: uartCo2_SendCmd(CO2CMD_CALIBRATE, cmdString, &cmdLength);
101 } 101 localComState = UART_CO2_IDLE;
102 else 102 break;
103 { 103 case UART_CO2_IDLE: if(externalInterface_GetCO2Scale() == 0.0) /* artifact from streaming mode => not needed for polling */
104 if(localComState == UART_CO2_CALIBRATE) 104 {
105 { 105 uartCo2_SendCmd(CO2CMD_GETSCALE, cmdString, &cmdLength);
106 uartCo2_SendCmd(CO2CMD_CALIBRATE, cmdString, &cmdLength); 106 localComState = UART_CO2_SETUP;
107 localComState = UART_CO2_IDLE; 107 }
108 } 108 else
109 else 109 {
110 { 110 uartCo2_SendCmd(CO2CMD_GETDATA, cmdString, &cmdLength);
111 if(localComState == UART_CO2_IDLE) 111 localComState = UART_CO2_OPERATING;
112 { 112 }
113 if(externalInterface_GetCO2Scale() == 0.0) 113 break;
114 { 114 default: if(cmdLength != 0)
115 uartCo2_SendCmd(CO2CMD_GETSCALE, cmdString, &cmdLength); 115 {
116 localComState = UART_CO2_SETUP; 116 UART_SendCmdString(cmdString); /* resend last command */
117 } 117 cmdLength = 0;
118 else 118 }
119 { 119 break;
120 uartCo2_SendCmd(CO2CMD_GETDATA, cmdString, &cmdLength);
121 localComState = UART_CO2_OPERATING;
122 }
123 }
124 else /* resend last command */
125 {
126 UART_SendCmdString(cmdString);
127 cmdLength = 0;
128 }
129 }
130 } 120 }
131 lastComState = localComState; 121 lastComState = localComState;
132 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState); 122 externalInterface_SetSensorState(activeSensor + EXT_INTERFACE_MUX_OFFSET,localComState);
133 } 123 }
134
135 124
136 void uartCo2_ProcessData(uint8_t data) 125 void uartCo2_ProcessData(uint8_t data)
137 { 126 {
138 static uint8_t dataType = 0; 127 static uint8_t dataType = 0;
139 static uint32_t dataValue = 0; 128 static uint32_t dataValue = 0;
152 case '.': dataType = data; 141 case '.': dataType = data;
153 rxState = CO2RX_Data0; 142 rxState = CO2RX_Data0;
154 dataValue = 0; 143 dataValue = 0;
155 break; 144 break;
156 case '?': localComState = UART_CO2_ERROR; 145 case '?': localComState = UART_CO2_ERROR;
146 rxState = CO2RX_Ready;
157 break; 147 break;
158 default: /* unknown or corrupted => ignore */ 148 default: /* unknown or corrupted => ignore */
159 break; 149 break;
160 } 150 }
161 } 151 }
162 else if((data >= '0') && (data <= '9')) 152 else if((data >= '0') && (data <= '9'))
163 { 153 {
164 if((rxState >= CO2RX_Data0) && (rxState <= CO2RX_Data4)) 154 if((rxState >= CO2RX_Data0) && (rxState <= CO2RX_Data4))
165 { 155 {
166 dataValue = dataValue * 10 + (data - '0'); 156 dataValue = dataValue * 10 + (data - '0');
167 rxState++; 157
168 if(rxState == CO2RX_Data5) 158 if((rxState == CO2RX_Data4))
169 { 159 {
170 rxState = CO2RX_DataComplete; 160 rxState = CO2RX_DataComplete;
161 }
162 else
163 {
164 rxState++;
171 } 165 }
172 } 166 }
173 else /* protocol error data has max 5 digits */ 167 else /* protocol error data has max 5 digits */
174 { 168 {
175 if(rxState != CO2RX_DataComplete) /* commands will not answer with number values */ 169 if(rxState != CO2RX_DataComplete) /* commands will not answer with number values */
185 CO2Connected = 1; 179 CO2Connected = 1;
186 switch(localComState) 180 switch(localComState)
187 { 181 {
188 case UART_CO2_SETUP: if(dataType == '.') 182 case UART_CO2_SETUP: if(dataType == '.')
189 { 183 {
190 localComState = UART_CO2_IDLE; 184 localComState = UART_CO2_MODE;
191 } 185 }
192 break; 186 break;
193 case UART_CO2_MODE: if((dataType == 'K') && (dataValue == 2)) 187 case UART_CO2_MODE: if((dataType == 'K') && (dataValue == 2))
194 { 188 {
195 localComState = UART_CO2_IDLE; 189 localComState = UART_CO2_IDLE;
197 break; 191 break;
198 default: localComState = UART_CO2_IDLE; 192 default: localComState = UART_CO2_IDLE;
199 break; 193 break;
200 } 194 }
201 195
202 if(externalInterface_GetCO2State() == 0)
203 {
204 externalInterface_SetCO2State(EXT_INTERFACE_33V_ON);
205 }
206 switch(dataType) 196 switch(dataType)
207 { 197 {
208 case 'D': externalInterface_SetCO2SignalStrength(dataValue); 198 case 'D': externalInterface_SetCO2SignalStrength(dataValue);
209 break; 199 break;
210 case 'l': LED_ZeroOffset = dataValue; 200 case 'l': LED_ZeroOffset = dataValue;