Mercurial > public > ostc4
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 |
