comparison Discovery/Src/tMenuEditHardware.c @ 1078:082825daccb5 Icon_Integration tip

Added control views for HUD: The HUD implementation may now be activated by the compile switch ENABLE_HUD_SUPPORT. The HUD will become visible onces detected in the CvOpt overview menu. The first implementation is for testing only => The LEDs may be operated by a number field. Positiv values activate the red, negativ the green LEDs. Depending on the value blink sequences will be scheduled. At the moment no dive specific data is mapped to the LED operation (like e.g. warnings).
author Ideenmodellierer
date Mon, 02 Mar 2026 17:30:38 +0100
parents 734f84b72b30
children
comparison
equal deleted inserted replaced
1077:bd8ab302ef4a 1078:082825daccb5
64 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);
65 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);
66 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);
67 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);
68 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);
69 69 uint8_t OnAction_LedSequence (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
70 uint8_t OnAction_LedBrightness (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
70 /* Exported functions --------------------------------------------------------*/ 71 /* Exported functions --------------------------------------------------------*/
71 72
72 73
73 #define O2_CALIB_FRACTION_AIR (0.209F) 74 #define O2_CALIB_FRACTION_AIR (0.209F)
74 #define O2_CALIB_FRACTION_O2 (0.98F) 75 #define O2_CALIB_FRACTION_O2 (0.98F)
141 } 142 }
142 143
143 144
144 void refresh_O2Sensors(void) 145 void refresh_O2Sensors(void)
145 { 146 {
146 char strSensorId[20]; 147 static uint8_t HUD_cmdUpdateCnt = 20;
147 char strSensorValue[20]; 148
149 char strSensorId[20];
150 char strSensorValue[30];
148 uint16_t y_line; 151 uint16_t y_line;
149 uint8_t index = 0; 152 uint8_t index = 0;
150 153 uint8_t uartSensorCnt = 0;
151 154
152 const SDiveState *pStateReal = stateRealGetPointer(); 155 const SDiveState *pStateReal = stateRealGetPointer();
153 SSettings *pSettings = settingsGetPointer(); 156 SSettings *pSettings = settingsGetPointer();
154 157
155 if((memcmp(pSettings->ext_sensor_map, pStateReal->lifeData.extIf_sensor_map, EXT_INTERFACE_SENSOR_CNT) != 0) && (sensorFilter == SENSOR_NONE)) 158 if((memcmp(pSettings->ext_sensor_map, pStateReal->lifeData.extIf_sensor_map, EXT_INTERFACE_SENSOR_CNT) != 0) && (sensorFilter == SENSOR_NONE))
211 strSensorId[0] = '\001'; 214 strSensorId[0] = '\001';
212 strSensorId[1] = TXT_o2Sensors; 215 strSensorId[1] = TXT_o2Sensors;
213 strSensorId[2] = 0; 216 strSensorId[2] = 0;
214 write_topline(strSensorId); 217 write_topline(strSensorId);
215 218
219 memset(strSensorId,0,20);
216 strSensorId[0] = TXT_2BYTE; 220 strSensorId[0] = TXT_2BYTE;
217 strSensorId[1] = TXT2BYTE_Sensor; 221 strSensorId[1] = TXT2BYTE_Sensor;
218 strSensorId[2] = ' '; 222 strSensorId[2] = ' ';
219 strSensorId[3] = TXT_2BYTE; 223 strSensorId[3] = TXT_2BYTE;
220 strSensorId[4] = 'X'; 224 strSensorId[4] = 'X';
251 break; 255 break;
252 case SENSOR_GNSS: 256 case SENSOR_GNSS:
253 case SENSOR_GNSSM: strSensorId[3] = 'G'; 257 case SENSOR_GNSSM: strSensorId[3] = 'G';
254 strSensorId[4] = 'N'; 258 strSensorId[4] = 'N';
255 break; 259 break;
260 case SENSOR_HUD: strSensorId[3] = 'H';
261 strSensorId[4] = 'U';
262 strSensorId[5] = 'D';
263 break;
256 default: 264 default:
257 strSensorId[5] = 0; 265 strSensorId[5] = 0;
258 break; 266 break;
259 } 267 }
260 if(strSensorId[4] != 'X') 268 if(strSensorId[4] != 'X')
267 snprintf(strSensorValue, 20,"%01.2f, %01.1f mV", pStateReal->lifeData.ppO2Sensor_bar[index], pStateReal->lifeData.sensorVoltage_mV[index]); 275 snprintf(strSensorValue, 20,"%01.2f, %01.1f mV", pStateReal->lifeData.ppO2Sensor_bar[index], pStateReal->lifeData.sensorVoltage_mV[index]);
268 } 276 }
269 else if(localSensorMap[index] == SENSOR_CO2M) 277 else if(localSensorMap[index] == SENSOR_CO2M)
270 { 278 {
271 snprintf(strSensorValue, 20,"%ld ppm", pStateReal->lifeData.CO2_data.CO2_ppm); 279 snprintf(strSensorValue, 20,"%ld ppm", pStateReal->lifeData.CO2_data.CO2_ppm);
280 }
281 else if(localSensorMap[index] == SENSOR_HUD)
282 {
283 write_label_var( 30, 340, ME_Y_LINE2, &FontT48, "LED Sequence:");
284 tMenuEdit_newInput(StMHARD3_O2_Sensor2, pStateReal->lifeData.HUD_led_sequence[0] - pStateReal->lifeData.HUD_led_sequence[1],
285 pStateReal->lifeData.HUD_led_sequence[2] - pStateReal->lifeData.HUD_led_sequence[3],
286 pStateReal->lifeData.HUD_led_sequence[4] - pStateReal->lifeData.HUD_led_sequence[5],
287 pStateReal->lifeData.HUD_led_sequence[6]);
288 snprintf(strSensorValue, 30,"LED Brightness: %d",pStateReal->lifeData.HUD_led_brightness);
289 write_label_var( 30, 340, ME_Y_LINE3, &FontT48, strSensorValue);
290 snprintf(strSensorValue, 20,"o o o \023o");
272 } 291 }
273 y_line = ME_Y_LINE1 + (index * ME_Y_LINE_STEP); 292 y_line = ME_Y_LINE1 + (index * ME_Y_LINE_STEP);
274 if(strSensorValue[0] != 0) 293 if(strSensorValue[0] != 0)
275 { 294 {
276 write_label_var( 480, 800, y_line, &FontT48, strSensorValue); 295 write_label_var( 480, 800, y_line, &FontT48, strSensorValue);
309 strSensorId[2] = 0; 328 strSensorId[2] = 0;
310 write_label_var( 30, 340, ME_Y_LINE4, &FontT48, strSensorId); 329 write_label_var( 30, 340, ME_Y_LINE4, &FontT48, strSensorId);
311 } 330 }
312 331
313 } 332 }
333 if(sensorFilter == SENSOR_NONE)
334 {
335 for(index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_SENSOR_CNT; index++)
336 {
337 if(pSettings->ext_sensor_map[index] != SENSOR_NONE)
338 {
339 uartSensorCnt++;
340 }
341 }
342 if(uartSensorCnt != 0)
343 {
344 snprintf(strSensorId, 20,"%c: %d", TXT_o2Sensors, uartSensorCnt);
345 write_label_var( 30, 340, ME_Y_LINE5, &FontT48, strSensorId);
346 }
347 }
314 if((DataEX_external_ADC_Present()) && (sensorFilter == SENSOR_NONE)) 348 if((DataEX_external_ADC_Present()) && (sensorFilter == SENSOR_NONE))
315 { 349 {
316 strSensorId[0] = TXT_2BYTE; 350 strSensorId[0] = TXT_2BYTE;
317 strSensorId[1] = TXT2BYTE_SensorDetect; 351 strSensorId[1] = TXT2BYTE_SensorDetect;
318 strSensorId[2] = 0; 352 strSensorId[2] = 0;
339 } 373 }
340 else 374 else
341 { 375 {
342 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); 376 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
343 } 377 }
378
379 if(localSensorMap[0] == SENSOR_HUD)
380 {
381 HUD_cmdUpdateCnt--;
382 if(HUD_cmdUpdateCnt == 0)
383 {
384 HUD_cmdUpdateCnt = 20;
385 for(index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_SENSOR_CNT; index++)
386 {
387 if(pSettings->ext_sensor_map[index] == SENSOR_HUD)
388 {
389 DataEX_setExtInterface_Cmd(EXT_INTERFACE_HUD_UPDATE, index);
390 break;
391 }
392 }
393
394 }
395 }
344 } 396 }
345 397
346 398
347 void openEdit_Sensors(uint8_t filter) 399 void openEdit_Sensors(uint8_t filter)
348 { 400 {
349 static externalInterfaceSensorType lastFilter; 401 static externalInterfaceSensorType lastFilter;
350 SSettings *pSettings = settingsGetPointer(); 402 SSettings *pSettings = settingsGetPointer();
403 const SDiveState* pRealState = stateRealGetPointer();
351 uint8_t sensorActive[3]; 404 uint8_t sensorActive[3];
352 uint8_t index = 0; 405 uint8_t index = 0;
353 char text[3]; 406 char text[3];
354 uint32_t firstSensorId = 0; 407 uint32_t firstSensorId = 0;
355 408
385 else 438 else
386 { 439 {
387 sensorActive[index] = 1; 440 sensorActive[index] = 1;
388 } 441 }
389 } 442 }
390 if(sensorFilter != SENSOR_CO2) 443 if((sensorFilter == SENSOR_NONE) || (sensorFilter == SENSOR_DIGO2))
391 { 444 {
392 if(((pSettings->ext_sensor_map[0] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[0] >= SENSOR_TYPE_O2_END))) 445 if(((pSettings->ext_sensor_map[0] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[0] >= SENSOR_TYPE_O2_END)))
393 { 446 {
394 pSettings->ppo2sensors_deactivated |= 1; 447 pSettings->ppo2sensors_deactivated |= 1;
395 if((pSettings->ext_sensor_map[0] == SENSOR_CO2M) && (sensorFilter == SENSOR_NONE)) 448 if((pSettings->ext_sensor_map[0] == SENSOR_CO2M) && (sensorFilter == SENSOR_NONE))
436 { 489 {
437 firstSensorId = StMHARD3_O2_Sensor3; 490 firstSensorId = StMHARD3_O2_Sensor3;
438 } 491 }
439 } 492 }
440 } 493 }
441 else 494 else /* single, none O2 sensors */
442 { 495 {
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 */ 496 switch(sensorFilter)
497 {
498 case SENSOR_CO2: 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 */
499 break;
500 default: write_field_button(StMHARD3_O2_Sensor1, 30, 95, ME_Y_LINE1, &FontT48, "");
501 break;
502 }
444 firstSensorId = StMHARD3_O2_Sensor1; 503 firstSensorId = StMHARD3_O2_Sensor1;
445 } 504 }
446 stateRealGetPointerWrite()->diveSettings.ppo2sensors_deactivated = pSettings->ppo2sensors_deactivated; 505 stateRealGetPointerWrite()->diveSettings.ppo2sensors_deactivated = pSettings->ppo2sensors_deactivated;
447 506
448 if(settingsGetPointer()->ppo2sensors_deactivated & 1) 507 if(settingsGetPointer()->ppo2sensors_deactivated & 1)
517 } 576 }
518 break; 577 break;
519 case SENSOR_CO2: setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1); 578 case SENSOR_CO2: setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1);
520 localSensorMap[0] = SENSOR_CO2M; 579 localSensorMap[0] = SENSOR_CO2M;
521 break; 580 break;
581 case SENSOR_HUD: write_label_var( 30, 340, ME_Y_LINE2, &FontT48, "LED Sequence:");
582 write_field_sdigit(StMHARD3_O2_Sensor2, 400, 800, ME_Y_LINE2, &FontT48, "### ### ### ###",
583 pRealState->lifeData.HUD_led_sequence[0] - pRealState->lifeData.HUD_led_sequence[1],
584 pRealState->lifeData.HUD_led_sequence[2] - pRealState->lifeData.HUD_led_sequence[3],
585 pRealState->lifeData.HUD_led_sequence[4] - pRealState->lifeData.HUD_led_sequence[5],
586 pRealState->lifeData.HUD_led_sequence[6]);
587
588 write_field_button(StMHARD3_O2_Sensor3, 400, 800, ME_Y_LINE3, &FontT48, "");
589
590 setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1);
591 setEvent(StMHARD3_O2_Sensor2, (uint32_t)OnAction_LedSequence);
592 setEvent(StMHARD3_O2_Sensor3, (uint32_t)OnAction_LedBrightness);
593
594 localSensorMap[0] = SENSOR_HUD;
595 break;
522 } 596 }
523 597
524 if (sensorFilter == SENSOR_CO2) 598 if (sensorFilter == SENSOR_CO2)
525 { 599 {
526 setEvent(StMHARD3_O2_Calibrate, (uint32_t)OnAction_CO2_Calibrate); 600 setEvent(StMHARD3_O2_Calibrate, (uint32_t)OnAction_CO2_Calibrate);
561 635
562 void openEdit_SensorsCO2() 636 void openEdit_SensorsCO2()
563 { 637 {
564 openEdit_Sensors(SENSOR_CO2); 638 openEdit_Sensors(SENSOR_CO2);
565 } 639 }
566 640 void openEdit_SensorsHUD()
641 {
642 openEdit_Sensors(SENSOR_HUD);
643 }
567 644
568 uint8_t OnAction_Sensor1(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 645 uint8_t OnAction_Sensor1(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
569 { 646 {
570 if((localSensorMap[0] == SENSOR_DIGO2M) || (localSensorMap[0] == SENSOR_CO2M) || (localSensorMap[0] == SENSOR_CO2M)) 647 if((localSensorMap[0] == SENSOR_DIGO2M) || (localSensorMap[0] == SENSOR_CO2M) || (localSensorMap[0] == SENSOR_CO2M) || (localSensorMap[0] == SENSOR_HUD))
571 { 648 {
572 openInfo_SetSensorType(localSensorMap[0]); 649 openInfo_SetSensorType(localSensorMap[0]);
573 return EXIT_TO_INFO_SENSOR; 650 return EXIT_TO_INFO_SENSOR;
574 } 651 }
575 else 652 else
964 tMenuEdit_set_on_off(editId, 1); 1041 tMenuEdit_set_on_off(editId, 1);
965 } 1042 }
966 1043
967 return UNSPECIFIC_RETURN; 1044 return UNSPECIFIC_RETURN;
968 } 1045 }
1046
1047
1048 uint8_t OnAction_LedBrightness(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
1049 {
1050 SDiveState * pStateReal = stateRealGetPointerWrite();
1051
1052 if(pStateReal->lifeData.HUD_led_brightness == 0)
1053 {
1054 pStateReal->lifeData.HUD_led_brightness = 0xFF;
1055 }
1056 else
1057 {
1058 pStateReal->lifeData.HUD_led_brightness = 0;
1059 }
1060
1061 return UNSPECIFIC_RETURN;
1062 }
1063
1064 uint8_t OnAction_LedSequence(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
1065 {
1066 SDiveState * pStateReal = stateRealGetPointerWrite();
1067 int32_t ledSeq[4];
1068 uint8_t digitContentNew;
1069 uint8_t index = 0;
1070
1071
1072 switch (action) {
1073 case ACTION_BUTTON_ENTER:
1074
1075 return digitContent;
1076 case ACTION_BUTTON_ENTER_FINAL:
1077 {
1078 evaluateNewString(editId, (uint32_t*) &ledSeq[0], (uint32_t*)&ledSeq[1], (uint32_t*)&ledSeq[2], (uint32_t*)&ledSeq[3]);
1079
1080 for(index = 0; index < 3; index++)
1081 {
1082 if (ledSeq[index] > 16)
1083 {
1084 ledSeq[index] = 16;
1085 } else if (ledSeq[index] < -16)
1086 {
1087 ledSeq[index] = -16;
1088 }
1089 pStateReal->lifeData.HUD_led_sequence[(index*2)] = 0; /* every value handles 2 LEDs depending on +/- sign */
1090 pStateReal->lifeData.HUD_led_sequence[(index*2)+1] = 0;
1091 if(ledSeq[index] > 0)
1092 {
1093 pStateReal->lifeData.HUD_led_sequence[(index*2)] = ledSeq[index];
1094 }
1095 else
1096 {
1097 pStateReal->lifeData.HUD_led_sequence[(index*2 + 1)] = ledSeq[index] * -1;
1098 }
1099 }
1100 pStateReal->lifeData.HUD_led_sequence[6] = ledSeq[3];
1101 tMenuEdit_newInput(editId, ledSeq[0], ledSeq[1], ledSeq[2], ledSeq[3]);
1102 }
1103
1104 break;
1105 case ACTION_BUTTON_NEXT:
1106 if ((blockNumber < 3) && (digitNumber == 0))
1107 {
1108 digitContentNew = togglePlusMinus(digitContent);
1109 } else if (digitNumber == 1)
1110 {
1111 digitContentNew = digitContent + 1;
1112 if (digitContentNew > '1') {
1113 digitContentNew = '0';
1114 }
1115 } else
1116 {
1117 digitContentNew = digitContent + 1;
1118 if (digitContentNew > '9') {
1119 digitContentNew = '0';
1120 }
1121 }
1122
1123 return digitContentNew;
1124 case ACTION_BUTTON_BACK:
1125 if ((blockNumber < 3) && (digitNumber == 0))
1126 {
1127 digitContentNew = togglePlusMinus(digitContent);
1128 } else if (digitNumber == 1)
1129 {
1130 digitContentNew = digitContent - 1;
1131 if (digitContentNew < '0') {
1132 digitContentNew = '1';
1133 }
1134 }else
1135 {
1136 digitContentNew = digitContent - 1;
1137 if (digitContentNew < '0') {
1138 digitContentNew = '9';
1139 }
1140 }
1141 return digitContentNew;
1142 }
1143 return UNSPECIFIC_RETURN;
1144 }
1145