comparison Discovery/Src/tMenuEditHardware.c @ 1073:734f84b72b30 Icon_Integration tip

CV Option Menu added sub menus for O2 and CO2 sensors: In the previous implementation by the external sensor menu the problem exists that only three sensor could be displayed. If three o2 sensors were active then the CO2 sensor was not accessible. With the new dynamic view the CO2 sensor is a standalone menu element. The three sensor view was reused from the external sensor menu by introducing a filter (sensor type) functionality. O" and CO2 sensors may now be calibrated using the cv option sub menus.
author Ideenmodellierer
date Fri, 20 Feb 2026 17:26:46 +0100
parents 85f7e19c6688
children
comparison
equal deleted inserted replaced
1072:8b97003dbb60 1073:734f84b72b30
39 #include "tInfo.h" 39 #include "tInfo.h"
40 #include "tInfoLog.h" 40 #include "tInfoLog.h"
41 #include "tInfoSensor.h" 41 #include "tInfoSensor.h"
42 #include "tComm.h" 42 #include "tComm.h"
43 #include "data_exchange_main.h" 43 #include "data_exchange_main.h"
44 #include "tMenuCvOptionText.h"
44 45
45 46
46 //extern void tM_build_pages(void); 47 //extern void tM_build_pages(void);
47 48
48 /* Private function prototypes -----------------------------------------------*/ 49 /* Private function prototypes -----------------------------------------------*/
49 void openEdit_Bluetooth(void); 50 void openEdit_Bluetooth(void);
50 void openEdit_O2Sensors(void); 51 void openEdit_Sensors(uint8_t filter);
51 void openEdit_Brightness(void); 52 void openEdit_Brightness(void);
52 //void openEdit_Luftintegration(void); 53 //void openEdit_Luftintegration(void);
53 void openEdit_ButtonSens(void); 54 void openEdit_ButtonSens(void);
54 void openEdit_WarningBuz(void); 55 void openEdit_WarningBuz(void);
55 56
57 /* Announced function prototypes -----------------------------------------------*/ 58 /* Announced function prototypes -----------------------------------------------*/
58 uint8_t OnAction_Sensor1 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 59 uint8_t OnAction_Sensor1 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
59 uint8_t OnAction_Sensor2 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 60 uint8_t OnAction_Sensor2 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
60 uint8_t OnAction_Sensor3 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 61 uint8_t OnAction_Sensor3 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
61 uint8_t OnAction_O2_Calibrate (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 62 uint8_t OnAction_O2_Calibrate (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
63 uint8_t OnAction_CO2_Calibrate (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
62 uint8_t OnAction_Sensor_Info (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 64 uint8_t OnAction_Sensor_Info (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
63 uint8_t OnAction_Sensor_Detect (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 65 uint8_t OnAction_Sensor_Detect (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
64 uint8_t OnAction_Button (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 66 uint8_t OnAction_Button (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
65 uint8_t OnAction_ButtonBalance (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 67 uint8_t OnAction_ButtonBalance (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
66 uint8_t OnAction_ButtonLock (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); 68 uint8_t OnAction_ButtonLock (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
71 #define O2_CALIB_FRACTION_AIR (0.209F) 73 #define O2_CALIB_FRACTION_AIR (0.209F)
72 #define O2_CALIB_FRACTION_O2 (0.98F) 74 #define O2_CALIB_FRACTION_O2 (0.98F)
73 75
74 static uint8_t O2_calib_gas = 21; 76 static uint8_t O2_calib_gas = 21;
75 77
78 static externalInterfaceSensorType sensorFilter = SENSOR_NONE; /* used to have only a specific type of sensor in the sensor list view */
79 static externalInterfaceSensorType localSensorMap[3]; /* reduce the complete external sensor map to the three entries which are displayed by the menu */
80
76 void openEdit_Hardware(uint8_t line) 81 void openEdit_Hardware(uint8_t line)
77 { 82 {
78 set_globalState_Menu_Line(line); 83 set_globalState_Menu_Line(line);
79 84
80 switch(line) 85 switch(line)
81 { 86 {
82 case 1: 87 case 1:
83 default: openEdit_Bluetooth(); 88 default: openEdit_Bluetooth();
84 break; 89 break;
85 case 2: openEdit_O2Sensors(); 90 case 2: openEdit_Sensors(SENSOR_NONE);
86 break; 91 break;
87 case 3: openEdit_Brightness(); 92 case 3: openEdit_Brightness();
88 break; 93 break;
89 case 4: resetMenuEdit(CLUT_MenuPageHardware); 94 case 4: resetMenuEdit(CLUT_MenuPageHardware);
90 openEdit_ButtonSens(); 95 openEdit_ButtonSens();
141 char strSensorId[20]; 146 char strSensorId[20];
142 char strSensorValue[20]; 147 char strSensorValue[20];
143 uint16_t y_line; 148 uint16_t y_line;
144 uint8_t index = 0; 149 uint8_t index = 0;
145 150
151
146 const SDiveState *pStateReal = stateRealGetPointer(); 152 const SDiveState *pStateReal = stateRealGetPointer();
147 SSettings *pSettings = settingsGetPointer(); 153 SSettings *pSettings = settingsGetPointer();
148 154
149 if(memcmp(pSettings->ext_sensor_map, pStateReal->lifeData.extIf_sensor_map, EXT_INTERFACE_SENSOR_CNT) != 0) 155 if((memcmp(pSettings->ext_sensor_map, pStateReal->lifeData.extIf_sensor_map, EXT_INTERFACE_SENSOR_CNT) != 0) && (sensorFilter == SENSOR_NONE))
150 { 156 {
151 memcpy(pSettings->ext_sensor_map, pStateReal->lifeData.extIf_sensor_map, EXT_INTERFACE_SENSOR_CNT); 157 memcpy(pSettings->ext_sensor_map, pStateReal->lifeData.extIf_sensor_map, EXT_INTERFACE_SENSOR_CNT);
152 pSettings->ppo2sensors_deactivated = 0x0; /* deactivation will be done by openEditO2Sensor if need */ 158 pSettings->ppo2sensors_deactivated = 0x0; /* deactivation will be done by openEditO2Sensor if need */
153 pSettings->co2_sensor_active = 0; 159 pSettings->co2_sensor_active = 0;
154 pSettings->ppo2sensors_source = O2_SENSOR_SOURCE_OPTIC; 160 pSettings->ppo2sensors_source = O2_SENSOR_SOURCE_OPTIC;
186 #endif 192 #endif
187 default: 193 default:
188 break; 194 break;
189 } 195 }
190 } 196 }
191 openEdit_O2Sensors(); 197 if(pSettings->ext_sensor_map[0] != SENSOR_SEARCH)
198 {
199 index = tMCvOptText_BuildDynamicContentList();
200 tM_setLinesForPage(StMOption, index);
201 openEdit_Sensors(SENSOR_NONE);
202 }
203 else
204 {
205 openEdit_Sensors(SENSOR_SEARCH);
206 }
207
208
192 } 209 }
193 210
194 strSensorId[0] = '\001'; 211 strSensorId[0] = '\001';
195 strSensorId[1] = TXT_o2Sensors; 212 strSensorId[1] = TXT_o2Sensors;
196 strSensorId[2] = 0; 213 strSensorId[2] = 0;
208 { 225 {
209 strSensorId[3] = TXT_2BYTE; 226 strSensorId[3] = TXT_2BYTE;
210 strSensorId[4] = 'X'; 227 strSensorId[4] = 'X';
211 strSensorId[5] = '1' + index; 228 strSensorId[5] = '1' + index;
212 229
213 switch(pSettings->ext_sensor_map[index]) 230 switch(localSensorMap[index])
214 { 231 {
215 case SENSOR_SEARCH: strSensorId[1] = TXT2BYTE_SensorDetect; 232 case SENSOR_SEARCH: strSensorId[1] = TXT2BYTE_SensorDetect;
216 strSensorId[2] = 0; 233 strSensorId[2] = 0;
217 strSensorId[4] = 0; 234 strSensorId[4] = 0;
218 break; 235 break;
222 break; 239 break;
223 case SENSOR_DIGO2: 240 case SENSOR_DIGO2:
224 case SENSOR_DIGO2M: strSensorId[4] = TXT2BYTE_O2IFDigital; 241 case SENSOR_DIGO2M: strSensorId[4] = TXT2BYTE_O2IFDigital;
225 break; 242 break;
226 case SENSOR_CO2: 243 case SENSOR_CO2:
227 case SENSOR_CO2M: strSensorId[3] = 'C'; 244 case SENSOR_CO2M: strSensorId[3] = 'C';
228 strSensorId[4] = 'O'; 245 strSensorId[4] = 'O';
229 strSensorId[5] = '2'; 246 strSensorId[5] = '2';
230 break; 247 break;
231 case SENSOR_SENTINEL: 248 case SENSOR_SENTINEL:
232 case SENSOR_SENTINELM: strSensorId[3] = 'S'; 249 case SENSOR_SENTINELM: strSensorId[3] = 'S';
233 strSensorId[4] = 'e'; 250 strSensorId[4] = 'e';
234 break; 251 break;
235 case SENSOR_GNSS: 252 case SENSOR_GNSS:
236 case SENSOR_GNSSM: strSensorId[3] = 'G'; 253 case SENSOR_GNSSM: strSensorId[3] = 'G';
237 strSensorId[4] = 'N'; 254 strSensorId[4] = 'N';
238 break; 255 break;
243 if(strSensorId[4] != 'X') 260 if(strSensorId[4] != 'X')
244 { 261 {
245 write_label_var( 96, 340, ME_Y_LINE1 + (index * ME_Y_LINE_STEP), &FontT48, strSensorId); 262 write_label_var( 96, 340, ME_Y_LINE1 + (index * ME_Y_LINE_STEP), &FontT48, strSensorId);
246 } 263 }
247 strSensorValue[0] = 0; 264 strSensorValue[0] = 0;
248 if((pSettings->ext_sensor_map[index] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[index] < SENSOR_TYPE_O2_END)) 265 if((localSensorMap[index] >= SENSOR_OPTIC) && (localSensorMap[index] < SENSOR_TYPE_O2_END))
249 { 266 {
250 snprintf(strSensorValue, 20,"%01.2f, %01.1f mV", pStateReal->lifeData.ppO2Sensor_bar[index], pStateReal->lifeData.sensorVoltage_mV[index]); 267 snprintf(strSensorValue, 20,"%01.2f, %01.1f mV", pStateReal->lifeData.ppO2Sensor_bar[index], pStateReal->lifeData.sensorVoltage_mV[index]);
251 } 268 }
252 else if(pSettings->ext_sensor_map[index] == SENSOR_CO2M) 269 else if(localSensorMap[index] == SENSOR_CO2M)
253 { 270 {
254 snprintf(strSensorValue, 20,"%ld ppm", pStateReal->lifeData.CO2_data.CO2_ppm); 271 snprintf(strSensorValue, 20,"%ld ppm", pStateReal->lifeData.CO2_data.CO2_ppm);
255 } 272 }
256 y_line = ME_Y_LINE1 + (index * ME_Y_LINE_STEP); 273 y_line = ME_Y_LINE1 + (index * ME_Y_LINE_STEP);
257 if(strSensorValue[0] != 0) 274 if(strSensorValue[0] != 0)
258 { 275 {
259 write_label_var( 480, 800, y_line, &FontT48, strSensorValue); 276 write_label_var( 480, 800, y_line, &FontT48, strSensorValue);
260 } 277 }
261 } 278 }
262 279
263 if(pSettings->ext_sensor_map[0] == SENSOR_OPTIC) 280 if(localSensorMap[0] == SENSOR_OPTIC)
264 { 281 {
265 strSensorId[0] = TXT_2BYTE; 282 strSensorId[0] = TXT_2BYTE;
266 strSensorId[1] = TXT2BYTE_HUDbattery; 283 strSensorId[1] = TXT2BYTE_HUDbattery;
267 strSensorId[2] = 0; 284 strSensorId[2] = 0;
268 write_label_var( 30, 340, ME_Y_LINE4, &FontT48, strSensorId); 285 write_label_var( 30, 340, ME_Y_LINE4, &FontT48, strSensorId);
270 snprintf(strSensorId, 20,"%01.3fV", get_HUD_battery_voltage_V()); 287 snprintf(strSensorId, 20,"%01.3fV", get_HUD_battery_voltage_V());
271 write_label_var( 480, 800, ME_Y_LINE4, &FontT48, strSensorId); 288 write_label_var( 480, 800, ME_Y_LINE4, &FontT48, strSensorId);
272 } 289 }
273 else 290 else
274 { 291 {
275 if((pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_ANALOG) || (pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_ANADIG) 292 if(((pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_ANALOG) || (pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_ANADIG)
276 #ifdef ENABLE_SENTINEL_MODE 293 #ifdef ENABLE_SENTINEL_MODE
277 || (pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_SENTINEL) 294 || (pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_SENTINEL)
278 #endif 295 #endif
279 ) 296 ) && ((sensorFilter == SENSOR_NONE) || (sensorFilter == SENSOR_DIGO2)))
280 { 297 {
281 strSensorId[0] = TXT_2BYTE; 298 strSensorId[0] = TXT_2BYTE;
282 strSensorId[1] = TXT2BYTE_O2Calib; 299 strSensorId[1] = TXT2BYTE_O2Calib;
283 strSensorId[2] = 0; 300 strSensorId[2] = 0;
284 write_label_var( 30, 340, ME_Y_LINE4, &FontT48, strSensorId); 301 write_label_var( 30, 340, ME_Y_LINE4, &FontT48, strSensorId);
285 snprintf(strSensorId, 20,"%d%%", O2_calib_gas); 302 snprintf(strSensorId, 20,"%d%%", O2_calib_gas);
286 write_label_var( 480, 800, ME_Y_LINE4, &FontT48, strSensorId); 303 write_label_var( 480, 800, ME_Y_LINE4, &FontT48, strSensorId);
287 } 304 }
288 } 305 else if(sensorFilter == SENSOR_CO2)
289 if(DataEX_external_ADC_Present()) 306 {
307 strSensorId[0] = TXT_2BYTE;
308 strSensorId[1] = TXT2BYTE_O2Calib;
309 strSensorId[2] = 0;
310 write_label_var( 30, 340, ME_Y_LINE4, &FontT48, strSensorId);
311 }
312
313 }
314 if((DataEX_external_ADC_Present()) && (sensorFilter == SENSOR_NONE))
290 { 315 {
291 strSensorId[0] = TXT_2BYTE; 316 strSensorId[0] = TXT_2BYTE;
292 strSensorId[1] = TXT2BYTE_SensorDetect; 317 strSensorId[1] = TXT2BYTE_SensorDetect;
293 strSensorId[2] = 0; 318 strSensorId[2] = 0;
294 319
295 write_label_var( 30, 340, ME_Y_LINE6, &FontT48, strSensorId); 320 write_label_var( 30, 340, ME_Y_LINE6, &FontT48, strSensorId);
296 } 321 }
297 322
298 if((pSettings->ext_sensor_map[0] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[0] < SENSOR_MUX)) 323 if((localSensorMap[0] >= SENSOR_OPTIC) && (localSensorMap[0] < SENSOR_MUX))
299 { 324 {
300 tMenuEdit_refresh_field(StMHARD3_O2_Sensor1); 325 tMenuEdit_refresh_field(StMHARD3_O2_Sensor1);
301 } 326 }
302 if((pSettings->ext_sensor_map[1] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[1] < SENSOR_MUX)) 327 if((localSensorMap[1] >= SENSOR_OPTIC) && (localSensorMap[1] < SENSOR_MUX))
303 { 328 {
304 tMenuEdit_refresh_field(StMHARD3_O2_Sensor2); 329 tMenuEdit_refresh_field(StMHARD3_O2_Sensor2);
305 } 330 }
306 if((pSettings->ext_sensor_map[2] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[2] < SENSOR_MUX)) 331 if((localSensorMap[2] >= SENSOR_OPTIC) && (localSensorMap[2] < SENSOR_MUX))
307 { 332 {
308 tMenuEdit_refresh_field(StMHARD3_O2_Sensor3); 333 tMenuEdit_refresh_field(StMHARD3_O2_Sensor3);
309 } 334 }
310 335
311 if(get_globalState() == StMHARD3_O2_Calibrate) 336 if(get_globalState() == StMHARD3_O2_Calibrate)
317 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); 342 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
318 } 343 }
319 } 344 }
320 345
321 346
322 void openEdit_O2Sensors(void) 347 void openEdit_Sensors(uint8_t filter)
323 { 348 {
349 static externalInterfaceSensorType lastFilter;
324 SSettings *pSettings = settingsGetPointer(); 350 SSettings *pSettings = settingsGetPointer();
325 uint8_t sensorActive[3]; 351 uint8_t sensorActive[3];
326 uint8_t index = 0; 352 uint8_t index = 0;
327 char text[3]; 353 char text[3];
328 uint32_t firstSensorId = 0; 354 uint32_t firstSensorId = 0;
329 355
330 set_globalState(StMHARD3_Sensors); 356 set_globalState(StMHARD3_Sensors);
331 resetMenuEdit(CLUT_MenuPageHardware); 357 resetMenuEdit(CLUT_MenuPageHardware);
332 358
333 for(index = 0; index < 3; index++ ) 359 if(filter == SENSOR_SEARCH)
334 { 360 {
335 if(pSettings->ppo2sensors_deactivated & (0x01 << index)) 361 for(index = 0; index < 3; index++ )
336 { 362 {
337 sensorActive[index] = 0; 363 localSensorMap[index] = SENSOR_SEARCH;
364 }
365 }
366 else
367 {
368 if(filter == SENSOR_END) /* use last filter settings. e.g. for return from submenu */
369 {
370 sensorFilter = lastFilter;
338 } 371 }
339 else 372 else
340 { 373 {
341 sensorActive[index] = 1; 374 sensorFilter = filter;
342 } 375 }
343 } 376 lastFilter = sensorFilter;
344 377
345 if(((pSettings->ext_sensor_map[0] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[0] >= SENSOR_TYPE_O2_END))) 378 for(index = 0; index < 3; index++ )
346 { 379 {
347 pSettings->ppo2sensors_deactivated |= 1; 380 localSensorMap[index] = SENSOR_NONE;
348 if(pSettings->ext_sensor_map[0] == SENSOR_CO2M) 381 if(pSettings->ppo2sensors_deactivated & (0x01 << index))
349 { 382 {
350 write_field_on_off(StMHARD3_O2_Sensor1, 30, 95, ME_Y_LINE1, &FontT48, "", pSettings->co2_sensor_active); 383 sensorActive[index] = 0;
351 } 384 }
352 } 385 else
353 else 386 {
354 { 387 sensorActive[index] = 1;
355 write_field_on_off(StMHARD3_O2_Sensor1, 30, 95, ME_Y_LINE1, &FontT48, "", sensorActive[0]); 388 }
356 if(firstSensorId == 0) 389 }
357 { 390 if(sensorFilter != SENSOR_CO2)
391 {
392 if(((pSettings->ext_sensor_map[0] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[0] >= SENSOR_TYPE_O2_END)))
393 {
394 pSettings->ppo2sensors_deactivated |= 1;
395 if((pSettings->ext_sensor_map[0] == SENSOR_CO2M) && (sensorFilter == SENSOR_NONE))
396 {
397 write_field_on_off(StMHARD3_O2_Sensor1, 30, 95, ME_Y_LINE1, &FontT48, "", pSettings->co2_sensor_active);
398 }
399 }
400 else
401 {
402 write_field_on_off(StMHARD3_O2_Sensor1, 30, 95, ME_Y_LINE1, &FontT48, "", sensorActive[0]);
403 if(firstSensorId == 0)
404 {
405 firstSensorId = StMHARD3_O2_Sensor1;
406 }
407 }
408 if(((pSettings->ext_sensor_map[1] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[1] >= SENSOR_TYPE_O2_END)))
409 {
410 pSettings->ppo2sensors_deactivated |= 2;
411 if((pSettings->ext_sensor_map[1] == SENSOR_CO2M) && (sensorFilter == SENSOR_NONE))
412 {
413 write_field_on_off(StMHARD3_O2_Sensor2, 30, 95, ME_Y_LINE2, &FontT48, "", pSettings->co2_sensor_active);
414 }
415 }
416 else
417 {
418 write_field_on_off(StMHARD3_O2_Sensor2, 30, 95, ME_Y_LINE2, &FontT48, "", sensorActive[1]);
419 if(firstSensorId == 0)
420 {
421 firstSensorId = StMHARD3_O2_Sensor2;
422 }
423 }
424 if(((pSettings->ext_sensor_map[2] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[2] >= SENSOR_TYPE_O2_END)))
425 {
426 pSettings->ppo2sensors_deactivated |= 4;
427 if((pSettings->ext_sensor_map[2] == SENSOR_CO2M) && (sensorFilter == SENSOR_NONE))
428 {
429 write_field_on_off(StMHARD3_O2_Sensor3, 30, 95, ME_Y_LINE3, &FontT48, "", pSettings->co2_sensor_active);
430 }
431 }
432 else
433 {
434 write_field_on_off(StMHARD3_O2_Sensor3, 30, 95, ME_Y_LINE3, &FontT48, "", sensorActive[2]);
435 if(firstSensorId == 0)
436 {
437 firstSensorId = StMHARD3_O2_Sensor3;
438 }
439 }
440 }
441 else
442 {
443 write_field_on_off(StMHARD3_O2_Sensor1, 30, 95, ME_Y_LINE1, &FontT48, "", pSettings->co2_sensor_active); /* only one CO2 supporterd => show at first line */
358 firstSensorId = StMHARD3_O2_Sensor1; 444 firstSensorId = StMHARD3_O2_Sensor1;
359 } 445 }
360 } 446 stateRealGetPointerWrite()->diveSettings.ppo2sensors_deactivated = pSettings->ppo2sensors_deactivated;
361 if(((pSettings->ext_sensor_map[1] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[1] >= SENSOR_TYPE_O2_END))) 447
362 { 448 if(settingsGetPointer()->ppo2sensors_deactivated & 1)
363 pSettings->ppo2sensors_deactivated |= 2; 449 sensorActive[0] = 0;
364 if(pSettings->ext_sensor_map[1] == SENSOR_CO2M) 450 if(settingsGetPointer()->ppo2sensors_deactivated & 2)
365 { 451 sensorActive[1] = 0;
366 write_field_on_off(StMHARD3_O2_Sensor2, 30, 95, ME_Y_LINE2, &FontT48, "", pSettings->co2_sensor_active); 452 if(settingsGetPointer()->ppo2sensors_deactivated & 4)
367 } 453 sensorActive[2] = 0;
368 } 454
369 else 455 if (sensorFilter == SENSOR_CO2)
370 { 456 {
371 write_field_on_off(StMHARD3_O2_Sensor2, 30, 95, ME_Y_LINE2, &FontT48, "", sensorActive[1]); 457 write_field_button(StMHARD3_O2_Calibrate, 30, 800, ME_Y_LINE4, &FontT48, "");
372 if(firstSensorId == 0) 458 }
373 { 459 else
374 firstSensorId = StMHARD3_O2_Sensor2; 460 {
375 } 461 if(((pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_ANALOG) || (pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_ANADIG)
376 }
377 if(((pSettings->ext_sensor_map[2] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[2] >= SENSOR_TYPE_O2_END)))
378 {
379 pSettings->ppo2sensors_deactivated |= 4;
380 if(pSettings->ext_sensor_map[2] == SENSOR_CO2M)
381 {
382 write_field_on_off(StMHARD3_O2_Sensor3, 30, 95, ME_Y_LINE3, &FontT48, "", pSettings->co2_sensor_active);
383 }
384 }
385 else
386 {
387 write_field_on_off(StMHARD3_O2_Sensor3, 30, 95, ME_Y_LINE3, &FontT48, "", sensorActive[2]);
388 if(firstSensorId == 0)
389 {
390 firstSensorId = StMHARD3_O2_Sensor3;
391 }
392 }
393
394 stateRealGetPointerWrite()->diveSettings.ppo2sensors_deactivated = pSettings->ppo2sensors_deactivated;
395
396 if(settingsGetPointer()->ppo2sensors_deactivated & 1)
397 sensorActive[0] = 0;
398 if(settingsGetPointer()->ppo2sensors_deactivated & 2)
399 sensorActive[1] = 0;
400 if(settingsGetPointer()->ppo2sensors_deactivated & 4)
401 sensorActive[2] = 0;
402
403 if((pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_ANALOG) || (pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_ANADIG)
404 #ifdef ENABLE_SENTINEL_MODE 462 #ifdef ENABLE_SENTINEL_MODE
405 || (settingsGetPointer()->ppo2sensors_source == O2_SENSOR_SOURCE_SENTINEL) 463 || (settingsGetPointer()->ppo2sensors_source == O2_SENSOR_SOURCE_SENTINEL)
406 #endif 464 #endif
407 ) 465 ) && ((sensorFilter == SENSOR_NONE) || (sensorFilter == SENSOR_DIGO2)))
408 { 466 {
409 write_label_fix( 30, 800, ME_Y_LINE4, &FontT48, TXT2BYTE_O2Calib); 467 write_label_fix( 30, 800, ME_Y_LINE4, &FontT48, TXT2BYTE_O2Calib);
410 write_label_var( 400, 800, ME_Y_LINE4, &FontT48, "\016\016 %\017"); 468 write_label_var( 400, 800, ME_Y_LINE4, &FontT48, "\016\016 %\017");
411 469
412 write_field_toggle(StMHARD3_O2_Calibrate, 400, 800, ME_Y_LINE4, &FontT48, "", 21, 98); 470 write_field_toggle(StMHARD3_O2_Calibrate, 400, 800, ME_Y_LINE4, &FontT48, "", 21, 98);
413 } 471 }
414 472 }
415 if(DataEX_external_ADC_Present()) 473 if((DataEX_external_ADC_Present()) && (sensorFilter == SENSOR_NONE))
416 { 474 {
417 text[0] = TXT_2BYTE; 475 text[0] = TXT_2BYTE;
418 text[1] = TXT2BYTE_SensorDetect; 476 text[1] = TXT2BYTE_SensorDetect;
419 text[2] = 0; 477 text[2] = 0;
420 478
421 write_label_var( 30, 340, ME_Y_LINE6, &FontT48, text); 479 write_label_var( 30, 340, ME_Y_LINE6, &FontT48, text);
422 480
423 write_field_button(StMHARD3_Sensor_Detect, 30, 800, ME_Y_LINE6, &FontT48, text); 481 write_field_button(StMHARD3_Sensor_Detect, 30, 800, ME_Y_LINE6, &FontT48, text);
424 } 482 }
425 483
426 if((pSettings->ext_sensor_map[0] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[0] < SENSOR_MUX)) 484 switch(sensorFilter)
427 { 485 {
428 setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1); 486 case SENSOR_NONE:
429 } 487 default: if((pSettings->ext_sensor_map[0] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[0] < SENSOR_MUX))
430 if((pSettings->ext_sensor_map[1] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[1] < SENSOR_MUX)) 488 {
431 { 489 setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1);
432 setEvent(StMHARD3_O2_Sensor2, (uint32_t)OnAction_Sensor2); 490 localSensorMap[0] =pSettings->ext_sensor_map[0];
433 } 491 }
434 if((pSettings->ext_sensor_map[2] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[2] < SENSOR_MUX)) 492 if((pSettings->ext_sensor_map[1] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[1] < SENSOR_MUX))
435 { 493 {
436 setEvent(StMHARD3_O2_Sensor3, (uint32_t)OnAction_Sensor3); 494 setEvent(StMHARD3_O2_Sensor2, (uint32_t)OnAction_Sensor2);
437 } 495 localSensorMap[1] =pSettings->ext_sensor_map[1];
438 496 }
439 if((settingsGetPointer()->ppo2sensors_source == O2_SENSOR_SOURCE_ANALOG) || (settingsGetPointer()->ppo2sensors_source == O2_SENSOR_SOURCE_ANADIG) 497 if((pSettings->ext_sensor_map[2] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[2] < SENSOR_MUX))
498 {
499 setEvent(StMHARD3_O2_Sensor3, (uint32_t)OnAction_Sensor3);
500 localSensorMap[2] =pSettings->ext_sensor_map[2];
501 }
502 break;
503 case SENSOR_DIGO2: if((pSettings->ext_sensor_map[0] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[0] < SENSOR_TYPE_O2_END))
504 {
505 setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1);
506 localSensorMap[0] = pSettings->ext_sensor_map[0];
507 }
508 if((pSettings->ext_sensor_map[1] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[1] < SENSOR_TYPE_O2_END))
509 {
510 setEvent(StMHARD3_O2_Sensor2, (uint32_t)OnAction_Sensor2);
511 localSensorMap[1] = pSettings->ext_sensor_map[1];
512 }
513 if((pSettings->ext_sensor_map[2] >= SENSOR_OPTIC) && (pSettings->ext_sensor_map[2] < SENSOR_TYPE_O2_END))
514 {
515 setEvent(StMHARD3_O2_Sensor3, (uint32_t)OnAction_Sensor3);
516 localSensorMap[2] = pSettings->ext_sensor_map[2];
517 }
518 break;
519 case SENSOR_CO2: setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1);
520 localSensorMap[0] = SENSOR_CO2M;
521 break;
522 }
523
524 if (sensorFilter == SENSOR_CO2)
525 {
526 setEvent(StMHARD3_O2_Calibrate, (uint32_t)OnAction_CO2_Calibrate);
527 }
528 else
529 {
530 if((((settingsGetPointer()->ppo2sensors_source == O2_SENSOR_SOURCE_ANALOG) || (settingsGetPointer()->ppo2sensors_source == O2_SENSOR_SOURCE_ANADIG))
531 && ((sensorFilter == SENSOR_NONE) || (sensorFilter == SENSOR_DIGO2)))
440 #ifdef ENABLE_SENTINEL_MODE 532 #ifdef ENABLE_SENTINEL_MODE
441 || (settingsGetPointer()->ppo2sensors_source == O2_SENSOR_SOURCE_SENTINEL) 533 || (settingsGetPointer()->ppo2sensors_source == O2_SENSOR_SOURCE_SENTINEL)
442 #endif 534 #endif
443 ) 535 )
444 { 536 {
445 setEvent(StMHARD3_O2_Calibrate, (uint32_t)OnAction_O2_Calibrate); 537 setEvent(StMHARD3_O2_Calibrate, (uint32_t)OnAction_O2_Calibrate);
446 } 538 }
447 539 }
448 if(DataEX_external_ADC_Present()) 540 if((DataEX_external_ADC_Present()) && (sensorFilter == SENSOR_NONE))
449 { 541 {
450 setEvent(StMHARD3_Sensor_Detect, (uint32_t)OnAction_Sensor_Detect); 542 setEvent(StMHARD3_Sensor_Detect, (uint32_t)OnAction_Sensor_Detect);
451 } 543 }
452 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); 544 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
453 545
454 switch(firstSensorId) 546 switch(firstSensorId)
455 { 547 {
456 case StMHARD3_O2_Sensor2: tMenuEdit_select(StMHARD3_O2_Sensor2); 548 case StMHARD3_O2_Sensor2: tMenuEdit_select(StMHARD3_O2_Sensor2);
457 break; 549 break;
458 case StMHARD3_O2_Sensor3: tMenuEdit_select(StMHARD3_O2_Sensor3); 550 case StMHARD3_O2_Sensor3: tMenuEdit_select(StMHARD3_O2_Sensor3);
459 break; 551 break;
460 default: break; 552 default: break;
461 } 553 }
554 }
555 }
556
557 void openEdit_SensorsO2()
558 {
559 openEdit_Sensors(SENSOR_DIGO2); /* used for o2 sensors in general */
560 }
561
562 void openEdit_SensorsCO2()
563 {
564 openEdit_Sensors(SENSOR_CO2);
462 } 565 }
463 566
464 567
465 uint8_t OnAction_Sensor1(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 568 uint8_t OnAction_Sensor1(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
466 { 569 {
467 const SDiveState *pStateReal = stateRealGetPointer(); 570 if((localSensorMap[0] == SENSOR_DIGO2M) || (localSensorMap[0] == SENSOR_CO2M) || (localSensorMap[0] == SENSOR_CO2M))
468 571 {
469 if((pStateReal->lifeData.extIf_sensor_map[0] == SENSOR_DIGO2M) || (pStateReal->lifeData.extIf_sensor_map[0] == SENSOR_CO2M)) 572 openInfo_SetSensorType(localSensorMap[0]);
470 {
471 return EXIT_TO_INFO_SENSOR; 573 return EXIT_TO_INFO_SENSOR;
472 } 574 }
473 else 575 else
474 { 576 {
475 if(settingsGetPointer()->ppo2sensors_deactivated & 1) 577 if(settingsGetPointer()->ppo2sensors_deactivated & 1)
488 } 590 }
489 591
490 592
491 uint8_t OnAction_Sensor2(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 593 uint8_t OnAction_Sensor2(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
492 { 594 {
493 const SDiveState *pStateReal = stateRealGetPointer(); 595 if((localSensorMap[1] == SENSOR_DIGO2M) || (localSensorMap[1] == SENSOR_CO2M))
494 596 {
495 if((pStateReal->lifeData.extIf_sensor_map[1] == SENSOR_DIGO2M) || (pStateReal->lifeData.extIf_sensor_map[1] == SENSOR_CO2M)) 597 openInfo_SetSensorType(localSensorMap[1]);
496 {
497 return EXIT_TO_INFO_SENSOR; 598 return EXIT_TO_INFO_SENSOR;
498 } 599 }
499 else 600 else
500 { 601 {
501 if(settingsGetPointer()->ppo2sensors_deactivated & 2) 602 if(settingsGetPointer()->ppo2sensors_deactivated & 2)
513 } 614 }
514 615
515 616
516 uint8_t OnAction_Sensor3(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 617 uint8_t OnAction_Sensor3(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
517 { 618 {
518 const SDiveState *pStateReal = stateRealGetPointer(); 619 if((localSensorMap[2] == SENSOR_DIGO2M) || (localSensorMap[2] == SENSOR_CO2M))
519 620 {
520 if((pStateReal->lifeData.extIf_sensor_map[2] == SENSOR_DIGO2M) || (pStateReal->lifeData.extIf_sensor_map[2] == SENSOR_CO2M)) 621 openInfo_SetSensorType(localSensorMap[2]);
521 {
522 return EXIT_TO_INFO_SENSOR; 622 return EXIT_TO_INFO_SENSOR;
523 } 623 }
524 else 624 else
525 { 625 {
526 626
536 } 636 }
537 } 637 }
538 return UPDATE_DIVESETTINGS; 638 return UPDATE_DIVESETTINGS;
539 } 639 }
540 640
641
642 uint8_t OnAction_CO2_Calibrate(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
643 {
644 SSettings* pSettings = settingsGetPointer();
645 uint8_t index = 0;
646
647 for (index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_SENSOR_CNT; index++)
648 {
649 if(pSettings->ext_sensor_map[index] == SENSOR_CO2) break;
650 }
651
652 if(index != EXT_INTERFACE_SENSOR_CNT)
653 {
654 DataEX_setExtInterface_Cmd(EXT_INTERFACE_CO2_CALIB, index);
655 }
656 return UNSPECIFIC_RETURN;
657 }
541 658
542 uint8_t OnAction_O2_Calibrate (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 659 uint8_t OnAction_O2_Calibrate (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
543 { 660 {
544 uint8_t loop; 661 uint8_t loop;
545 const SDiveState *pStateReal = stateRealGetPointer(); 662 const SDiveState *pStateReal = stateRealGetPointer();