Mercurial > public > ostc4
annotate Small_CPU/Src/uart.c @ 784:95af969fe0ae
Bugfixloop UART multiplexer integration:
Fixed problems showing up in cases like no Mux detected, only one sensor connected to mux and mixed analog / digital sensor operation
| author | Ideenmodellierer |
|---|---|
| date | Tue, 30 May 2023 18:44:20 +0200 |
| parents | 01b3eb9d55c3 |
| children | 3c0b16473af4 |
| rev | line source |
|---|---|
| 38 | 1 /** |
| 2 ****************************************************************************** | |
| 3 * @file uart.c | |
| 4 * @author heinrichs weikamp gmbh | |
| 5 * @version V0.0.1 | |
| 6 * @date 27-March-2014 | |
| 7 * @brief button control | |
| 8 * | |
| 9 @verbatim | |
| 10 ============================================================================== | |
| 11 ##### How to use ##### | |
| 12 ============================================================================== | |
| 13 @endverbatim | |
| 14 ****************************************************************************** | |
| 15 * @attention | |
| 16 * | |
| 17 * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> | |
| 18 * | |
| 19 ****************************************************************************** | |
| 20 */ | |
| 21 /* Includes ------------------------------------------------------------------*/ | |
| 22 #include "uart.h" | |
| 662 | 23 #include "externalInterface.h" |
| 24 #include "data_exchange.h" | |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
25 #include <string.h> /* memset */ |
| 38 | 26 |
| 27 /* Private variables ---------------------------------------------------------*/ | |
| 28 | |
| 781 | 29 #define CHUNK_SIZE (25u) /* the DMA will handle chunk size transfers */ |
| 30 #define CHUNKS_PER_BUFFER (5u) | |
| 31 #define COMMAND_TX_DELAY (30u) /* The time the sensor needs to recover from a invalid command request */ | |
| 32 #define REQUEST_INT_SENSOR_MS (1500) /* Minimum time interval for cyclic sensor data requests per sensor */ | |
| 662 | 33 UART_HandleTypeDef huart1; |
| 34 | |
| 35 DMA_HandleTypeDef hdma_usart1_rx; | |
| 38 | 36 |
| 662 | 37 uint8_t rxBuffer[CHUNK_SIZE * CHUNKS_PER_BUFFER]; /* The complete buffer has a X * chunk size to allow fariations in buffer read time */ |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
38 static uint8_t rxWriteIndex; /* Index of the data item which is analysed */ |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
39 static uint8_t rxReadIndex; /* Index at which new data is stared */ |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
40 static uint8_t lastCmdIndex; /* Index of last command which has not been completly received */ |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
41 static uint8_t dmaActive; /* Indicator if DMA reception needs to be started */ |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
42 static uint8_t digO2Connected = 0; /* Binary indicator if a sensor is connected or not */ |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
43 static uint8_t CO2Connected = 0; /* Binary indicator if a sensor is connected or not */ |
| 742 | 44 static uint8_t SentinelConnected = 0; /* Binary indicator if a sensor is connected or not */ |
| 38 | 45 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
46 static SSensorDataDiveO2 tmpSensorDataDiveO2; /* intermediate storage for additional sensor data */ |
|
714
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
704
diff
changeset
|
47 |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
48 char tmpRxBuf[30]; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
49 uint8_t tmpRxIdx = 0; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
50 |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
51 static uartO2Status_t Comstatus_O2 = UART_O2_INIT; |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
52 static uint8_t activeSensor = 0; |
| 781 | 53 static uint8_t sensorMapping[MAX_MUX_CHANNEL]; /* The mapping is used to assign the visible sensor channel to the mux address (DiveO2) */ |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
54 |
| 662 | 55 float LED_Level = 0.0; /* Normalized LED value which may be used as indication for the health status of the sensor */ |
| 56 float LED_ZeroOffset = 0.0; | |
| 57 float pCO2 = 0.0; | |
| 38 | 58 /* Exported functions --------------------------------------------------------*/ |
| 59 | |
| 662 | 60 void MX_USART1_UART_Init(void) |
| 38 | 61 { |
| 662 | 62 /* regular init */ |
| 63 | |
| 64 huart1.Instance = USART1; | |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
65 |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
66 if(externalInterface_GetUARTProtocol() == 0x04) |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
67 { |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
68 huart1.Init.BaudRate = 19200; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
69 Comstatus_O2 = UART_O2_INIT; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
70 } |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
71 else |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
72 { |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
73 huart1.Init.BaudRate = 9600; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
74 } |
| 662 | 75 huart1.Init.WordLength = UART_WORDLENGTH_8B; |
| 76 huart1.Init.StopBits = UART_STOPBITS_1; | |
| 77 huart1.Init.Parity = UART_PARITY_NONE; | |
| 78 huart1.Init.Mode = UART_MODE_TX_RX; | |
| 79 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; | |
| 80 huart1.Init.OverSampling = UART_OVERSAMPLING_16; | |
| 81 | |
| 82 HAL_UART_Init(&huart1); | |
| 83 | |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
84 MX_USART1_DMA_Init(); |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
85 |
| 731 | 86 memset(rxBuffer,0,sizeof(rxBuffer)); |
| 662 | 87 rxReadIndex = 0; |
| 88 lastCmdIndex = 0; | |
| 89 rxWriteIndex = 0; | |
| 90 dmaActive = 0; | |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
91 digO2Connected = 0; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
92 CO2Connected = 0; |
| 742 | 93 SentinelConnected = 0; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
94 Comstatus_O2 = UART_O2_INIT; |
| 662 | 95 } |
| 38 | 96 |
| 662 | 97 void MX_USART1_UART_DeInit(void) |
| 98 { | |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
99 HAL_DMA_Abort(&hdma_usart1_rx); |
| 662 | 100 HAL_DMA_DeInit(&hdma_usart1_rx); |
| 101 HAL_UART_DeInit(&huart1); | |
| 102 } | |
| 103 | |
| 104 void MX_USART1_DMA_Init() | |
| 105 { | |
| 106 /* DMA controller clock enable */ | |
| 107 __DMA2_CLK_ENABLE(); | |
| 108 | |
| 109 /* Peripheral DMA init*/ | |
| 110 hdma_usart1_rx.Instance = DMA2_Stream5; | |
| 111 hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; | |
| 112 hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; //DMA_MEMORY_TO_PERIPH; | |
| 113 hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; | |
| 114 hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; | |
| 115 hdma_usart1_rx.Init.PeriphDataAlignment = DMA_MDATAALIGN_BYTE; | |
| 116 hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; | |
| 117 hdma_usart1_rx.Init.Mode = DMA_NORMAL; | |
| 118 hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; | |
| 119 hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; | |
| 120 HAL_DMA_Init(&hdma_usart1_rx); | |
| 121 | |
| 122 __HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx); | |
| 123 | |
| 124 /* DMA interrupt init */ | |
| 125 HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 0, 0); | |
| 126 HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn); | |
| 38 | 127 } |
| 128 | |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
129 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
130 void DigitalO2_SelectSensor(uint8_t channel) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
131 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
132 uint8_t indexstr[4]; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
133 uint8_t muxAddress = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
134 indexstr[0] = '~'; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
135 indexstr[1] = '1'; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
136 indexstr[2] = 0x0D; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
137 indexstr[3] = 0x0A; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
138 |
| 781 | 139 /* Lookup mux address mapped to the provided channel. If no mapping is found the the MUX itself will be selected */ |
| 140 for(muxAddress = 0; muxAddress < MAX_MUX_CHANNEL; muxAddress++) | |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
141 { |
| 781 | 142 if(sensorMapping[muxAddress] == channel) |
| 143 { | |
| 144 break; | |
| 145 } | |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
146 } |
| 781 | 147 indexstr[1] = muxAddress; |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
148 HAL_UART_Transmit(&huart1,indexstr,4,10); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
149 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
150 |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
151 void DigitalO2_SetupCmd(uint8_t O2State, uint8_t *cmdString, uint8_t *cmdLength) |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
152 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
153 switch (O2State) |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
154 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
155 case UART_O2_CHECK: *cmdLength = snprintf((char*)cmdString, 10, "#LOGO"); |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
156 break; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
157 case UART_O2_REQ_INFO: *cmdLength = snprintf((char*)cmdString, 10, "#VERS"); |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
158 break; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
159 case UART_O2_REQ_ID: *cmdLength = snprintf((char*)cmdString, 10, "#IDNR"); |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
160 break; |
| 784 | 161 case UART_O2_REQ_O2: *cmdLength = snprintf((char*)cmdString, 10, "#MOXY"); |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
162 break; |
| 784 | 163 case UART_O2_REQ_RAW: *cmdLength = snprintf((char*)cmdString, 10, "#MRAW"); |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
164 break; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
165 default: *cmdLength = 0; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
166 break; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
167 } |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
168 if(*cmdLength != 0) |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
169 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
170 cmdString[*cmdLength] = 0x0D; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
171 *cmdLength = *cmdLength + 1; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
172 } |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
173 } |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
174 |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
175 void StringToInt(char *pstr, uint32_t *puInt32) |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
176 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
177 uint8_t index = 0; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
178 uint32_t result = 0; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
179 while((pstr[index] >= '0') && (pstr[index] <= '9')) |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
180 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
181 result *=10; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
182 result += pstr[index] - '0'; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
183 index++; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
184 } |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
185 *puInt32 = result; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
186 } |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
187 |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
188 void StringToUInt64(char *pstr, uint64_t *puint64) |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
189 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
190 uint8_t index = 0; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
191 uint64_t result = 0; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
192 while((pstr[index] >= '0') && (pstr[index] <= '9')) |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
193 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
194 result *=10; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
195 result += pstr[index] - '0'; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
196 index++; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
197 } |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
198 *puint64 = result; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
199 } |
| 690 | 200 void ConvertByteToHexString(uint8_t byte, char* str) |
| 201 { | |
| 202 uint8_t worker = 0; | |
| 203 uint8_t digit = 0; | |
| 204 uint8_t digitCnt = 1; | |
| 38 | 205 |
| 690 | 206 worker = byte; |
| 207 while((worker!=0) && (digitCnt != 255)) | |
| 208 { | |
| 209 digit = worker % 16; | |
| 210 if( digit < 10) | |
| 211 { | |
| 212 digit += '0'; | |
| 213 } | |
| 214 else | |
| 215 { | |
| 216 digit += 'A' - 10; | |
| 217 } | |
| 218 str[digitCnt--]= digit; | |
| 219 worker = worker / 16; | |
| 220 } | |
| 221 } | |
| 662 | 222 |
| 742 | 223 void UART_StartDMA_Receiption() |
| 224 { | |
| 225 if(HAL_OK == HAL_UART_Receive_DMA (&huart1, &rxBuffer[rxWriteIndex], CHUNK_SIZE)) | |
| 226 { | |
| 227 dmaActive = 1; | |
| 228 } | |
| 229 } | |
| 690 | 230 |
| 231 #ifdef ENABLE_CO2_SUPPORT | |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
232 void UART_HandleCO2Data(void) |
| 38 | 233 { |
| 662 | 234 uint8_t localRX = rxReadIndex; |
|
747
df0d43da1614
Added pressure compensation to CO2 detection:
Ideenmodellierer
parents:
742
diff
changeset
|
235 static uint8_t dataType = 0; |
|
df0d43da1614
Added pressure compensation to CO2 detection:
Ideenmodellierer
parents:
742
diff
changeset
|
236 static uint32_t dataValue = 0; |
| 662 | 237 static receiveState_t rxState = RX_Ready; |
| 238 static uint32_t lastReceiveTick = 0; | |
| 239 | |
| 725 | 240 |
| 241 while((rxBuffer[localRX]!=0)) | |
| 662 | 242 { |
| 243 lastReceiveTick = HAL_GetTick(); | |
| 244 if(rxState == RX_Ready) /* identify data content */ | |
| 245 { | |
| 246 switch(rxBuffer[localRX]) | |
| 247 { | |
| 248 case 'l': | |
| 249 case 'D': | |
| 250 case 'Z': | |
| 251 dataType = rxBuffer[localRX]; | |
| 252 rxState = RX_Data0; | |
| 253 dataValue = 0; | |
| 254 break; | |
| 255 | |
| 256 default: /* unknown or corrupted => ignore */ | |
| 257 break; | |
| 258 } | |
| 259 } | |
| 725 | 260 else if((rxBuffer[localRX] >= '0') && (rxBuffer[localRX] <= '9')) |
| 662 | 261 { |
| 725 | 262 if((rxState >= RX_Data0) && (rxState <= RX_Data4)) |
| 662 | 263 { |
| 264 dataValue = dataValue * 10 + (rxBuffer[localRX] - '0'); | |
| 265 rxState++; | |
| 725 | 266 if(rxState == RX_Data5) |
| 267 { | |
| 268 rxState = RX_DataComplete; | |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
269 CO2Connected = 1; |
| 725 | 270 } |
| 271 } | |
| 272 else /* protocol error data has max 5 digits */ | |
| 273 { | |
| 274 rxState = RX_Ready; | |
| 662 | 275 } |
| 276 } | |
| 277 if((rxBuffer[localRX] == ' ') || (rxBuffer[localRX] == '\n')) /* Abort data detection */ | |
| 278 { | |
| 279 if(rxState == RX_DataComplete) | |
| 280 { | |
| 281 if(externalInterface_GetCO2State() == 0) | |
| 282 { | |
| 283 externalInterface_SetCO2State(EXT_INTERFACE_33V_ON); | |
| 284 } | |
| 285 switch(dataType) | |
| 286 { | |
| 287 case 'D': externalInterface_SetCO2SignalStrength(dataValue); | |
| 288 break; | |
| 289 case 'l': LED_ZeroOffset = dataValue; | |
| 290 break; | |
| 291 case 'Z': externalInterface_SetCO2Value(dataValue); | |
| 292 break; | |
|
747
df0d43da1614
Added pressure compensation to CO2 detection:
Ideenmodellierer
parents:
742
diff
changeset
|
293 default: rxState = RX_Ready; |
|
df0d43da1614
Added pressure compensation to CO2 detection:
Ideenmodellierer
parents:
742
diff
changeset
|
294 break; |
| 662 | 295 } |
| 296 } | |
| 297 if(rxState != RX_Data0) /* reset state machine because message in wrong format */ | |
| 298 { | |
| 299 rxState = RX_Ready; | |
| 300 } | |
| 301 } | |
| 742 | 302 rxBuffer[localRX] = 0; |
| 662 | 303 localRX++; |
| 304 rxReadIndex++; | |
| 305 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | |
| 306 { | |
| 307 localRX = 0; | |
| 308 rxReadIndex = 0; | |
| 309 } | |
| 310 } | |
| 311 | |
| 312 if(time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 2000) /* check for communication timeout */ | |
| 313 { | |
| 314 externalInterface_SetCO2State(0); | |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
315 CO2Connected = 0; |
| 662 | 316 } |
| 317 | |
| 318 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */ | |
| 319 { | |
| 742 | 320 UART_StartDMA_Receiption(); |
| 662 | 321 } |
| 38 | 322 } |
| 690 | 323 #endif |
| 324 | |
| 325 #ifdef ENABLE_SENTINEL_MODE | |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
326 void UART_HandleSentinelData(void) |
| 690 | 327 { |
| 328 uint8_t localRX = rxReadIndex; | |
| 329 static uint8_t dataType = 0; | |
| 330 static uint32_t dataValue[3]; | |
| 331 static uint8_t dataValueIdx = 0; | |
| 332 static receiveState_t rxState = RX_Ready; | |
| 333 static uint32_t lastReceiveTick = 0; | |
| 334 static uint8_t lastAlive = 0; | |
| 335 static uint8_t curAlive = 0; | |
| 336 static uint8_t checksum = 0; | |
| 742 | 337 static char checksum_str[]="00"; |
| 690 | 338 |
| 742 | 339 while((rxBuffer[localRX]!=0)) |
| 690 | 340 { |
| 341 lastReceiveTick = HAL_GetTick(); | |
| 342 | |
| 343 switch(rxState) | |
| 344 { | |
| 345 case RX_Ready: if((rxBuffer[localRX] >= 'a') && (rxBuffer[localRX] <= 'z')) | |
| 346 { | |
| 347 rxState = RX_DetectStart; | |
| 348 curAlive = rxBuffer[localRX]; | |
| 349 checksum = 0; | |
| 350 } | |
| 351 break; | |
| 352 | |
| 353 case RX_DetectStart: checksum += rxBuffer[localRX]; | |
| 354 if(rxBuffer[localRX] == '1') | |
| 355 { | |
| 356 rxState = RX_SelectData; | |
| 357 dataType = 0xFF; | |
| 358 | |
| 359 } | |
| 360 else | |
| 361 { | |
| 362 rxState = RX_Ready; | |
| 363 } | |
| 364 break; | |
| 365 | |
| 366 case RX_SelectData: checksum += rxBuffer[localRX]; | |
| 367 switch(rxBuffer[localRX]) | |
| 368 { | |
| 369 case 'T': dataType = rxBuffer[localRX]; | |
| 370 break; | |
| 371 case '0': if(dataType != 0xff) | |
| 372 { | |
| 373 rxState = RX_Data0; | |
| 374 dataValueIdx = 0; | |
| 375 dataValue[0] = 0; | |
| 376 | |
| 377 } | |
| 378 else | |
| 379 { | |
| 380 rxState = RX_Ready; | |
| 381 } | |
| 382 break; | |
| 383 default: rxState = RX_Ready; | |
| 384 } | |
| 385 break; | |
| 386 | |
| 387 case RX_Data0: | |
| 388 case RX_Data1: | |
| 389 case RX_Data2: | |
| 390 case RX_Data4: | |
| 391 case RX_Data5: | |
| 392 case RX_Data6: | |
| 393 case RX_Data8: | |
| 394 case RX_Data9: | |
| 395 case RX_Data10: checksum += rxBuffer[localRX]; | |
| 396 if((rxBuffer[localRX] >= '0') && (rxBuffer[localRX] <= '9')) | |
| 397 { | |
| 398 dataValue[dataValueIdx] = dataValue[dataValueIdx] * 10 + (rxBuffer[localRX] - '0'); | |
| 399 rxState++; | |
| 400 } | |
| 401 else | |
| 402 { | |
| 403 rxState = RX_Ready; | |
| 404 } | |
| 405 break; | |
| 406 | |
| 407 case RX_Data3: | |
| 408 case RX_Data7: checksum += rxBuffer[localRX]; | |
| 409 if(rxBuffer[localRX] == '0') | |
| 410 { | |
| 411 rxState++; | |
| 412 dataValueIdx++; | |
| 413 dataValue[dataValueIdx] = 0; | |
| 414 } | |
| 415 else | |
| 416 { | |
| 417 rxState = RX_Ready; | |
| 418 } | |
| 419 break; | |
| 420 case RX_Data11: rxState = RX_DataComplete; | |
| 421 ConvertByteToHexString(checksum,checksum_str); | |
| 422 if(rxBuffer[localRX] == checksum_str[0]) | |
| 423 { | |
| 424 rxState = RX_DataComplete; | |
| 425 } | |
| 426 else | |
| 427 { | |
| 428 rxState = RX_Ready; | |
| 429 } | |
| 430 | |
| 431 break; | |
| 432 | |
| 433 case RX_DataComplete: if(rxBuffer[localRX] == checksum_str[1]) | |
| 434 { | |
| 435 setExternalInterfaceChannel(0,(float)(dataValue[0] / 10.0)); | |
| 436 setExternalInterfaceChannel(1,(float)(dataValue[1] / 10.0)); | |
| 437 setExternalInterfaceChannel(2,(float)(dataValue[2] / 10.0)); | |
| 742 | 438 SentinelConnected = 1; |
| 690 | 439 } |
| 440 rxState = RX_Ready; | |
| 441 break; | |
| 442 | |
| 443 | |
| 444 default: rxState = RX_Ready; | |
| 445 break; | |
| 446 | |
| 447 } | |
| 448 localRX++; | |
| 449 rxReadIndex++; | |
| 450 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | |
| 451 { | |
| 452 localRX = 0; | |
| 453 rxReadIndex = 0; | |
| 454 } | |
| 455 } | |
| 456 | |
| 457 if(time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 4000) /* check for communication timeout */ | |
| 458 { | |
| 459 if(curAlive == lastAlive) | |
| 460 { | |
| 461 setExternalInterfaceChannel(0,0.0); | |
| 462 setExternalInterfaceChannel(1,0.0); | |
| 463 setExternalInterfaceChannel(2,0.0); | |
| 742 | 464 SentinelConnected = 0; |
| 690 | 465 } |
| 466 lastAlive = curAlive; | |
| 467 } | |
| 468 | |
| 469 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */ | |
| 470 { | |
| 742 | 471 UART_StartDMA_Receiption(); |
| 690 | 472 } |
| 473 } | |
| 474 #endif | |
| 38 | 475 |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
476 |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
477 |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
478 void UART_HandleDigitalO2(void) |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
479 { |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
480 static uint32_t lastO2ReqTick = 0; |
| 784 | 481 static uint8_t errorStr[] = "#ERRO"; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
482 static uartO2RxState_t rxState = O2RX_IDLE; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
483 static uint32_t lastReceiveTick = 0; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
484 static uint8_t lastAlive = 0; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
485 static uint8_t curAlive = 0; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
486 |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
487 static uint8_t cmdLength = 0; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
488 static uint8_t cmdString[10]; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
489 static uint8_t cmdReadIndex = 0; |
| 784 | 490 static uint8_t errorReadIndex = 0; |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
491 static uint32_t tickToTX = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
492 static uint32_t delayStartTick = 0; |
| 781 | 493 static uint16_t requestIntervall = 0; |
| 494 static uint8_t retryRequest = 1; | |
| 495 static uint8_t lastComState = 0; | |
| 784 | 496 static uint8_t respondErrorDetected = 0; |
| 497 static uint8_t switchChannel = 0; | |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
498 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
499 uint8_t index = 0; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
500 uint32_t tmpO2 = 0; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
501 uint32_t tmpData = 0; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
502 uint8_t localRX = rxReadIndex; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
503 uint32_t tick = HAL_GetTick(); |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
504 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
505 uint8_t *pmap = externalInterface_GetSensorMapPointer(0); |
|
714
045ff7800501
Added customizable data area for specific sensor data:
Ideenmodellierer
parents:
704
diff
changeset
|
506 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
507 /* The channel switch will cause the sensor to respond with an error message. */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
508 /* The sensor needs ~30ms to recover before he is ready to receive the next command => transmission delay needed */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
509 if((tickToTX) && (time_elapsed_ms(delayStartTick,tick) >= tickToTX )) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
510 { |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
511 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10); |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
512 tickToTX = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
513 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
514 else |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
515 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
516 if(Comstatus_O2 == UART_O2_INIT) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
517 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
518 memset((char*)&rxBuffer[rxWriteIndex],(int)0,CHUNK_SIZE); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
519 memset((char*) &tmpSensorDataDiveO2, 0, sizeof(tmpSensorDataDiveO2)); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
520 externalInterface_SetSensorData(0,(uint8_t*)&tmpSensorDataDiveO2); |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
521 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
522 lastAlive = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
523 curAlive = 0; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
524 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
525 Comstatus_O2 = UART_O2_CHECK; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
526 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
527 DigitalO2_SelectSensor(activeSensor); |
| 781 | 528 if(activeSensor < MAX_MUX_CHANNEL) |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
529 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
530 externalInterface_GetSensorData(activeSensor + 1, (uint8_t*)&tmpSensorDataDiveO2); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
531 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
532 delayStartTick = tick; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
533 tickToTX = COMMAND_TX_DELAY; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
534 |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
535 rxState = O2RX_CONFIRM; |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
536 cmdReadIndex = 0; |
| 784 | 537 errorReadIndex = 0; |
| 538 respondErrorDetected = 0; | |
| 539 digO2Connected = 0; | |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
540 lastO2ReqTick = tick; |
| 784 | 541 switchChannel = 1; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
542 |
| 781 | 543 requestIntervall = 0; |
| 544 for(index = 0; index < MAX_MUX_CHANNEL; index++) | |
| 545 { | |
| 546 if(pmap[index] == SENSOR_DIGO2) | |
| 547 { | |
| 548 requestIntervall++; | |
| 549 } | |
| 550 } | |
| 551 if(requestIntervall != 0) | |
| 552 { | |
| 553 requestIntervall = REQUEST_INT_SENSOR_MS / requestIntervall; | |
| 554 } | |
| 555 else | |
| 556 { | |
| 557 requestIntervall = REQUEST_INT_SENSOR_MS; | |
| 558 } | |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
559 UART_StartDMA_Receiption(); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
560 } |
| 781 | 561 if(time_elapsed_ms(lastO2ReqTick,tick) > requestIntervall) /* repeat request or iterate to next sensor */ |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
562 { |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
563 lastO2ReqTick = tick; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
564 index = activeSensor; |
| 784 | 565 if((lastComState == Comstatus_O2) && (Comstatus_O2 != UART_O2_IDLE)) |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
566 { |
| 781 | 567 if(retryRequest) |
| 568 { | |
| 569 retryRequest = 0; | |
| 570 } | |
| 571 else /* no answer even repeating the request => abort request */ | |
| 572 { | |
| 573 if(Comstatus_O2 == UART_O2_REQ_RAW) | |
| 574 { | |
| 575 setExternalInterfaceChannel(activeSensor,0.0); | |
| 576 } | |
| 577 Comstatus_O2 = UART_O2_IDLE; | |
| 578 } | |
| 579 } | |
| 580 lastComState = Comstatus_O2; | |
| 581 if(Comstatus_O2 == UART_O2_IDLE) /* cyclic request of o2 value */ | |
| 582 { | |
| 583 retryRequest = 1; | |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
584 if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) /* select next sensor if mux is connected */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
585 { |
| 784 | 586 switchChannel = 0; |
| 781 | 587 if(activeSensor < MAX_MUX_CHANNEL) |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
588 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
589 do |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
590 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
591 index++; |
| 781 | 592 if(index == MAX_MUX_CHANNEL) |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
593 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
594 index = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
595 } |
| 784 | 596 if((pmap[index] == SENSOR_DIGO2) && (index != activeSensor)) |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
597 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
598 activeSensor = index; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
599 switchChannel = 1; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
600 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
601 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
602 } while(index != activeSensor); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
603 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
604 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
605 Comstatus_O2 = UART_O2_REQ_RAW; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
606 rxState = O2RX_CONFIRM; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
607 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
608 if(switchChannel) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
609 { |
| 784 | 610 switchChannel = 0; |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
611 delayStartTick = tick; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
612 DigitalO2_SelectSensor(activeSensor); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
613 externalInterface_GetSensorData(activeSensor + 1, (uint8_t*)&tmpSensorDataDiveO2); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
614 tickToTX = COMMAND_TX_DELAY; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
615 if(tmpSensorDataDiveO2.sensorId == 0) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
616 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
617 Comstatus_O2 = UART_O2_REQ_ID; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
618 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
619 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
620 else |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
621 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
622 HAL_UART_Transmit(&huart1,cmdString,cmdLength,10); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
623 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
624 DigitalO2_SetupCmd(Comstatus_O2,cmdString,&cmdLength); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
625 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
626 |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
627 while((rxBuffer[localRX]!=0)) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
628 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
629 lastReceiveTick = tick; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
630 switch(rxState) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
631 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
632 case O2RX_CONFIRM: if(rxBuffer[localRX] == '#') |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
633 { |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
634 cmdReadIndex = 0; |
| 784 | 635 errorReadIndex = 0; |
| 636 } | |
| 637 if(errorReadIndex < sizeof(errorStr)-1) | |
| 638 { | |
| 639 if(rxBuffer[localRX] == errorStr[errorReadIndex]) | |
| 640 { | |
| 641 errorReadIndex++; | |
| 642 } | |
| 643 else | |
| 644 { | |
| 645 errorReadIndex = 0; | |
| 646 } | |
| 647 } | |
| 648 else | |
| 649 { | |
| 650 respondErrorDetected = 1; | |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
651 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
652 if(rxBuffer[localRX] == cmdString[cmdReadIndex]) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
653 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
654 cmdReadIndex++; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
655 if(cmdReadIndex == cmdLength - 1) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
656 { |
| 784 | 657 if((activeSensor == MAX_MUX_CHANNEL)) |
| 658 { | |
| 659 if(respondErrorDetected) | |
| 660 { | |
| 661 digO2Connected = 0; /* the multiplexer mirrors the incoming message and does not generate an error information => no mux connected */ | |
| 662 } | |
| 663 else | |
| 664 { | |
| 665 digO2Connected = 1; | |
| 666 } | |
| 667 } | |
| 668 else /* handle sensors which should respond with an error message after channel switch */ | |
| 669 { | |
| 670 if(respondErrorDetected) | |
| 671 { | |
| 672 digO2Connected = 1; | |
| 673 } | |
| 674 } | |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
675 tmpRxIdx = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
676 memset((char*) tmpRxBuf, 0, sizeof(tmpRxBuf)); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
677 switch (Comstatus_O2) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
678 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
679 case UART_O2_CHECK: Comstatus_O2 = UART_O2_IDLE; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
680 break; |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
681 case UART_O2_REQ_ID: rxState = O2RX_GETNR; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
682 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
683 case UART_O2_REQ_INFO: rxState = O2RX_GETTYPE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
684 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
685 case UART_O2_REQ_RAW: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
686 case UART_O2_REQ_O2: rxState = O2RX_GETO2; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
687 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
688 default: Comstatus_O2 = UART_O2_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
689 rxState = O2RX_IDLE; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
690 break; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
691 } |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
692 } |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
693 } |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
694 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
695 |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
696 case O2RX_GETSTATUS: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
697 case O2RX_GETTEMP: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
698 case O2RX_GETTYPE: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
699 case O2RX_GETVERSION: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
700 case O2RX_GETCHANNEL: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
701 case O2RX_GETSUBSENSORS: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
702 case O2RX_GETO2: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
703 case O2RX_GETNR: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
704 case O2RX_GETDPHI: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
705 case O2RX_INTENSITY: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
706 case O2RX_AMBIENTLIGHT: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
707 case O2RX_PRESSURE: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
708 case O2RX_HUMIDITY: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
709 if(rxBuffer[localRX] != 0x0D) |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
710 { |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
711 if(rxBuffer[localRX] != ' ') /* the following data entities are placed within the data stream => no need to store data at the end */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
712 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
713 tmpRxBuf[tmpRxIdx++] = rxBuffer[localRX]; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
714 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
715 else |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
716 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
717 if(tmpRxIdx != 0) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
718 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
719 switch(rxState) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
720 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
721 case O2RX_GETCHANNEL: StringToInt(tmpRxBuf,&tmpData); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
722 rxState = O2RX_GETVERSION; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
723 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
724 case O2RX_GETVERSION: StringToInt(tmpRxBuf,&tmpData); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
725 rxState = O2RX_GETSUBSENSORS; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
726 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
727 case O2RX_GETTYPE: StringToInt(tmpRxBuf,&tmpData); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
728 rxState = O2RX_GETCHANNEL; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
729 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
730 |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
731 case O2RX_GETO2: StringToInt(tmpRxBuf,&tmpO2); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
732 setExternalInterfaceChannel(activeSensor,(float)(tmpO2 / 10000.0)); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
733 rxState = O2RX_GETTEMP; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
734 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
735 case O2RX_GETTEMP: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.temperature); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
736 rxState = O2RX_GETSTATUS; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
737 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
738 case O2RX_GETSTATUS: StringToInt(tmpRxBuf,&tmpSensorDataDiveO2.status); /* raw data cycle */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
739 rxState = O2RX_GETDPHI; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
740 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
741 case O2RX_GETDPHI: /* ignored to save memory and most likly irrelevant for diver */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
742 rxState = O2RX_INTENSITY; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
743 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
744 case O2RX_INTENSITY: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.intensity); /* raw data cycle */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
745 rxState = O2RX_AMBIENTLIGHT; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
746 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
747 case O2RX_AMBIENTLIGHT: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.ambient); /* raw data cycle */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
748 rxState = O2RX_PRESSURE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
749 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
750 case O2RX_PRESSURE: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.pressure); /* raw data cycle */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
751 rxState = O2RX_HUMIDITY; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
752 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
753 default: |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
754 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
755 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
756 memset((char*) tmpRxBuf, 0, tmpRxIdx); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
757 tmpRxIdx = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
758 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
759 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
760 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
761 else |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
762 { /* the following data items are the last of a sensor respond => store temporal data */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
763 switch (rxState) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
764 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
765 case O2RX_GETSTATUS: StringToInt(tmpRxBuf,&tmpSensorDataDiveO2.status); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
766 externalInterface_SetSensorData(activeSensor+1,(uint8_t*)&tmpSensorDataDiveO2); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
767 Comstatus_O2 = UART_O2_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
768 rxState = O2RX_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
769 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
770 case O2RX_GETSUBSENSORS: StringToInt(tmpRxBuf,&tmpData); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
771 Comstatus_O2 = UART_O2_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
772 rxState = O2RX_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
773 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
774 case O2RX_HUMIDITY: StringToInt(tmpRxBuf,(uint32_t*)&tmpSensorDataDiveO2.humidity); /* raw data cycle */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
775 externalInterface_SetSensorData(activeSensor+1,(uint8_t*)&tmpSensorDataDiveO2); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
776 Comstatus_O2 = UART_O2_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
777 rxState = O2RX_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
778 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
779 case O2RX_GETNR: StringToUInt64((char*)tmpRxBuf,&tmpSensorDataDiveO2.sensorId); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
780 externalInterface_SetSensorData(activeSensor+1,(uint8_t*)&tmpSensorDataDiveO2); |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
781 index = activeSensor; |
| 784 | 782 Comstatus_O2 = UART_O2_IDLE; |
| 783 rxState = O2RX_IDLE; | |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
784 break; |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
785 default: Comstatus_O2 = UART_O2_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
786 rxState = O2RX_IDLE; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
787 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
788 } |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
789 } |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
790 break; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
791 default: rxState = O2RX_IDLE; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
792 break; |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
793 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
794 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
795 rxBuffer[localRX] = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
796 localRX++; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
797 rxReadIndex++; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
798 if(rxReadIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
799 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
800 localRX = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
801 rxReadIndex = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
802 } |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
803 } |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
804 |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
805 if((digO2Connected) && time_elapsed_ms(lastReceiveTick,HAL_GetTick()) > 4000) /* check for communication timeout */ |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
806 { |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
807 digO2Connected = 0; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
808 if(curAlive == lastAlive) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
809 { |
| 781 | 810 for(index = 0; index < MAX_ADC_CHANNEL; index++) |
| 811 { | |
| 812 if(pmap[index] == SENSOR_DIGO2) | |
| 813 { | |
| 814 setExternalInterfaceChannel(index,0.0); | |
| 815 } | |
| 816 } | |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
817 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
818 lastAlive = curAlive; |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
819 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
820 if((dmaActive == 0) && (externalInterface_isEnabledPower33())) /* Should never happen in normal operation => restart in case of communication error */ |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
821 { |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
822 UART_StartDMA_Receiption(); |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
823 } |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
824 } |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
825 } |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
826 |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
827 void UART_SetDigO2_Channel(uint8_t channel) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
828 { |
| 781 | 829 if(channel <= MAX_MUX_CHANNEL) |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
830 { |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
831 activeSensor = channel; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
832 } |
|
779
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
833 } |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
834 void UART_MapDigO2_Channel(uint8_t channel, uint8_t muxAddress) |
|
0b5f45448eb6
Added UART multiplexer support for DiveO2:
Ideenmodellierer
parents:
747
diff
changeset
|
835 { |
| 781 | 836 if(((channel < MAX_ADC_CHANNEL) || (channel == 0xff)) && (muxAddress < MAX_MUX_CHANNEL)) |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
837 { |
| 781 | 838 sensorMapping[muxAddress] = channel; |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
839 } |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
840 } |
|
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
841 |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
842 uint8_t UART_isDigO2Connected() |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
843 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
844 return digO2Connected; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
845 } |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
846 uint8_t UART_isCO2Connected() |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
847 { |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
848 return CO2Connected; |
|
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
849 } |
| 742 | 850 uint8_t UART_isSentinelConnected() |
| 851 { | |
| 852 return SentinelConnected; | |
| 853 } | |
|
729
d646a0f724a7
Added auto detection functionality for sensors connected to the external interface:
Ideenmodellierer
parents:
725
diff
changeset
|
854 |
| 662 | 855 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) |
| 38 | 856 { |
| 662 | 857 if(huart == &huart1) |
| 858 { | |
| 859 dmaActive = 0; | |
| 860 rxWriteIndex+=CHUNK_SIZE; | |
| 861 if(rxWriteIndex >= CHUNK_SIZE * CHUNKS_PER_BUFFER) | |
| 862 { | |
| 863 rxWriteIndex = 0; | |
| 864 } | |
| 865 if((rxWriteIndex / CHUNK_SIZE) != (rxReadIndex / CHUNK_SIZE)) /* start next transfer if we did not catch up with read index */ | |
| 866 { | |
| 867 if(externalInterface_isEnabledPower33()) | |
| 868 { | |
|
704
f1b40364b0af
Added protocol functions for UART DiveO2 sensor:
Ideenmodellierer
parents:
690
diff
changeset
|
869 memset((char*)&rxBuffer[rxWriteIndex],(int)0,CHUNK_SIZE); |
| 742 | 870 UART_StartDMA_Receiption(); |
| 662 | 871 } |
| 872 } | |
| 873 } | |
| 38 | 874 } |
| 875 | |
| 876 | |
| 662 | 877 |
| 38 | 878 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |
