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