comparison Small_CPU/Src/externalInterface.c @ 975:142f3d0363b3 Evo_2_23

Workaround single DiveO2 startup: If a DiveO2 sensor is used without Mux then the sensor is not recognized by the Autodetection. It seems to be a timing issue. A delay between first command send and receive function seems to fix (or hide) the problem.
author Ideenmodellierer
date Tue, 28 Jan 2025 22:31:17 +0100 (7 weeks ago)
parents 3420e3ba698d
children 0b81ac558e89
comparison
equal deleted inserted replaced
974:53900dfe335b 975:142f3d0363b3
686 686
687 if(externalAutoDetect != DETECTION_OFF) 687 if(externalAutoDetect != DETECTION_OFF)
688 { 688 {
689 switch(externalAutoDetect) 689 switch(externalAutoDetect)
690 { 690 {
691 case DETECTION_INIT: externalInterfaceMuxReqIntervall = 0; 691 case DETECTION_INIT: externalInterfaceMuxReqIntervall = 0xffff;
692 sensorIndex = 0; 692 sensorIndex = 0;
693 uartMuxChannel = 0; 693 uartMuxChannel = 0;
694 tmpSensorMap[0] = SENSOR_OPTIC; 694 tmpSensorMap[0] = SENSOR_OPTIC;
695 tmpSensorMap[1] = SENSOR_OPTIC; 695 tmpSensorMap[1] = SENSOR_OPTIC;
696 tmpSensorMap[2] = SENSOR_OPTIC; 696 tmpSensorMap[2] = SENSOR_OPTIC;
1175 1175
1176 TriggerTick = tick; 1176 TriggerTick = tick;
1177 timeToTrigger = COMMAND_TX_DELAY; 1177 timeToTrigger = COMMAND_TX_DELAY;
1178 retryRequest = 1; 1178 retryRequest = 1;
1179 } 1179 }
1180
1181 else if(time_elapsed_ms(lastRequestTick,tick) > externalInterfaceMuxReqIntervall) /* switch sensor and / or trigger next request */ 1180 else if(time_elapsed_ms(lastRequestTick,tick) > externalInterfaceMuxReqIntervall) /* switch sensor and / or trigger next request */
1182 { 1181 {
1183 lastRequestTick = tick; 1182 if(timeToTrigger == 0) /* no pending action */
1184 TriggerTick = tick; 1183 {
1185 retryRequest = 0; 1184 TriggerTick = tick;
1186 timeToTrigger = 1; 1185 retryRequest = 0;
1187 1186 timeToTrigger = 1;
1188 if((externalInterface_SensorState[activeSensorId] == UART_O2_REQ_O2) /* timeout */ 1187
1189 || (externalInterface_SensorState[activeSensorId] == UART_O2_REQ_RAW) 1188 if((externalInterface_SensorState[activeSensorId] == UART_O2_REQ_O2) /* timeout */
1190 || (externalInterface_SensorState[activeSensorId] == UART_CO2_OPERATING) 1189 || (externalInterface_SensorState[activeSensorId] == UART_O2_REQ_RAW)
1191 || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_PVT) 1190 || (externalInterface_SensorState[activeSensorId] == UART_CO2_OPERATING)
1192 || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_SAT)) 1191 || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_PVT)
1193 { 1192 || (externalInterface_SensorState[activeSensorId] == UART_GNSS_GET_SAT))
1194 forceMuxChannel = 1;
1195 externalInterface_SensorState[activeSensorId] = UART_O2_IDLE;
1196 switch(pmap[activeSensorId])
1197 { 1193 {
1198 case SENSOR_DIGO2: setExternalInterfaceChannel(activeSensorId,0.0); 1194 forceMuxChannel = 1;
1199 break; 1195 externalInterface_SensorState[activeSensorId] = UART_O2_IDLE;
1200 case SENSOR_CO2: externalInterface_SetCO2Value(0.0); 1196 switch(pmap[activeSensorId])
1201 externalInterface_SetCO2State(0); 1197 {
1202 break; 1198 case SENSOR_DIGO2: setExternalInterfaceChannel(activeSensorId,0.0);
1203 default: 1199 break;
1204 break; 1200 case SENSOR_CO2: externalInterface_SetCO2Value(0.0);
1201 externalInterface_SetCO2State(0);
1202 break;
1203 default:
1204 break;
1205 }
1205 } 1206 }
1206 } 1207 if((externalInterface_SensorState[activeSensorId] == UART_CO2_SETUP) /* timeout while setting up sensors */
1207 if((externalInterface_SensorState[activeSensorId] == UART_CO2_SETUP) /* timeout while setting up sensors */ 1208 || (externalInterface_SensorState[activeSensorId] == UART_O2_CHECK))
1208 || (externalInterface_SensorState[activeSensorId] == UART_O2_CHECK))
1209 {
1210 forceMuxChannel = 1;
1211 }
1212
1213
1214 if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) /* select next sensor if mux is connected */
1215 {
1216 if(activeUartChannel < MAX_MUX_CHANNEL)
1217 { 1209 {
1218 index = ExternalInterface_SelectUsedMuxChannel(activeUartChannel); 1210 forceMuxChannel = 1;
1219 if((index != activeUartChannel) || (forceMuxChannel)) 1211 }
1212
1213
1214 if(pmap[EXT_INTERFACE_SENSOR_CNT-1] == SENSOR_MUX) /* select next sensor if mux is connected */
1215 {
1216 if(activeUartChannel < MAX_MUX_CHANNEL)
1220 { 1217 {
1221 forceMuxChannel = 0; 1218 index = ExternalInterface_SelectUsedMuxChannel(activeUartChannel);
1222 timeToTrigger = 100; 1219 if((index != activeUartChannel) || (forceMuxChannel))
1223 activeUartChannel = index;
1224 switch(pmap[index + EXT_INTERFACE_MUX_OFFSET])
1225 { 1220 {
1226 case SENSOR_DIGO2: uartO2_SetChannel(activeUartChannel); 1221 forceMuxChannel = 0;
1227 /* no break */ 1222 timeToTrigger = 100;
1228 case SENSOR_CO2: 1223 activeUartChannel = index;
1229 case SENSOR_GNSS: externalInterface_CheckBaudrate(SENSOR_MUX); 1224 switch(pmap[index + EXT_INTERFACE_MUX_OFFSET])
1230 UART_MUX_SelectAddress(activeUartChannel); 1225 {
1231 externalInterface_CheckBaudrate(pmap[activeUartChannel + EXT_INTERFACE_MUX_OFFSET]); 1226 case SENSOR_DIGO2: uartO2_SetChannel(activeUartChannel);
1232 break; 1227 /* no break */
1233 default: 1228 case SENSOR_CO2:
1234 break; 1229 case SENSOR_GNSS: externalInterface_CheckBaudrate(SENSOR_MUX);
1230 UART_MUX_SelectAddress(activeUartChannel);
1231 externalInterface_CheckBaudrate(pmap[activeUartChannel + EXT_INTERFACE_MUX_OFFSET]);
1232 break;
1233 default:
1234 break;
1235 }
1235 } 1236 }
1236 } 1237 }
1237 } 1238 }
1238 } 1239 }
1239 else
1240 {
1241 timeToTrigger = 1;
1242 }
1243 } 1240 }
1244 if((timeToTrigger != 0) && (time_elapsed_ms(TriggerTick,tick) > timeToTrigger)) 1241 if((timeToTrigger != 0) && (time_elapsed_ms(TriggerTick,tick) > timeToTrigger))
1245 { 1242 {
1243 lastRequestTick = tick;
1246 timeToTrigger = 0; 1244 timeToTrigger = 0;
1247 switch (pmap[activeSensorId]) 1245 switch (pmap[activeSensorId])
1248 { 1246 {
1249 case SENSOR_MUX: 1247 case SENSOR_MUX:
1250 case SENSOR_DIGO2: uartO2_Control(); 1248 case SENSOR_DIGO2: uartO2_Control();