comparison Discovery/Src/tMenuEditSetpoint.c @ 789:b7cd0c5c8e43

When using automatic setpoint switching, allow the user to set an arbitrary ppO2 as a custom setpoint during the dive.
author heinrichsweikamp
date Wed, 12 Jul 2023 10:13:25 +0200
parents 4abfb8a2a435
children
comparison
equal deleted inserted replaced
788:4abfb8a2a435 789:b7cd0c5c8e43
96 96
97 97
98 int printSetpointName(char *text, uint8_t setpointId, SSettings *settings, bool useSmallFont) 98 int printSetpointName(char *text, uint8_t setpointId, SSettings *settings, bool useSmallFont)
99 { 99 {
100 int charsPrinted = 0; 100 int charsPrinted = 0;
101 if (settings->autoSetpoint) { 101 if (setpointId == 0) {
102 charsPrinted = snprintf(text, 10, "%s%c%c%s", useSmallFont ? "\016\016" : "", TXT_2BYTE, TXT2BYTE_Custom, useSmallFont ? "\017" : "");
103 } else if (settings->autoSetpoint) {
102 switch (setpointId) { 104 switch (setpointId) {
103 case SETPOINT_INDEX_AUTO_LOW: 105 case SETPOINT_INDEX_AUTO_LOW:
104 charsPrinted = snprintf(text, 10, "%s%c%c%s", useSmallFont ? "\016\016" : "", TXT_2BYTE, TXT2BYTE_SetpointLow, useSmallFont ? "\017" : ""); 106 charsPrinted = snprintf(text, 10, "%s%c%c%s", useSmallFont ? "\016\016" : "", TXT_2BYTE, TXT2BYTE_SetpointLow, useSmallFont ? "\017" : "");
105 107
106 break; 108 break;
122 124
123 return charsPrinted; 125 return charsPrinted;
124 } 126 }
125 127
126 128
129 static void changeSetpoint(uint8_t setpointCbar)
130 {
131 uint8_t actualGasID;
132 if (!isLoopMode(stateUsedWrite->diveSettings.diveMode)) {
133 actualGasID = stateUsedWrite->lifeData.lastDiluent_GasIdInSettings;
134 if (actualGasID <= NUM_OFFSET_DILUENT || actualGasID > NUM_GASES + NUM_OFFSET_DILUENT) {
135 actualGasID = NUM_OFFSET_DILUENT + 1;
136 }
137 } else {
138 actualGasID = stateUsedWrite->lifeData.actualGas.GasIdInSettings;
139 }
140
141 setActualGas_DM(&stateUsedWrite->lifeData, actualGasID, setpointCbar);
142
143 checkSwitchToLoop();
144
145 clear_warning_fallback();
146 }
147
148
149 static void startSetpointEdit(uint8_t line, uint8_t setpointId)
150 {
151 SSettings *settings = settingsGetPointer();
152
153 set_globalState_Menu_Line(line);
154
155 resetMenuEdit(CLUT_MenuPageGasSP);
156
157 editSetpointPage.spID = setpointId;
158 editSetpointPage.pSetpointLine = settings->setpoint;
159
160 uint8_t setpoint_cbar = editSetpointPage.pSetpointLine[setpointId].setpoint_cbar;
161 uint8_t depthDeco = editSetpointPage.pSetpointLine[setpointId].depth_meter;
162 uint8_t first = editSetpointPage.pSetpointLine[setpointId].note.ub.first;
163
164 uint8_t setpointBar = setpoint_cbar / 100;
165
166 char text[70];
167
168 uint8_t textPointer = snprintf(text, 20, "\001%c%c ", TXT_2BYTE, TXT2BYTE_Setpoint);
169 textPointer += printSetpointName(&text[textPointer], setpointId, settings, false);
170 snprintf(&text[textPointer], 20, " %c", TXT_Setpoint_Edit);
171 write_topline(text);
172
173 uint16_t y_line = ME_Y_LINE_BASE + (line * ME_Y_LINE_STEP);
174
175 textPointer = snprintf(text, 4, "%c%c", TXT_2BYTE, TXT2BYTE_SetpointShort);
176 textPointer += printSetpointName(&text[textPointer], setpointId, settings, true);
177 textPointer += snprintf(&text[textPointer], 60, " %s* \016\016 bar\017", first ? "" : "\177");
178
179 if ((settings->autoSetpoint && setpointId == SETPOINT_INDEX_AUTO_DECO) || setpointId == 0) {
180 textPointer += snprintf(&text[textPointer], 4, "\n\r");
181 write_label_var(20, 800, y_line, &FontT48, text);
182
183 write_field_udigit(StMSP_ppo2_setting, 160, 800, y_line, &FontT48, "#.##", (uint32_t)setpointBar, (uint32_t)(setpoint_cbar - (100 * setpointBar)), 0, 0);
184
185 if (settings->autoSetpoint && setpointId == SETPOINT_INDEX_AUTO_DECO) {
186 snprintf(text, 60, "\034 \035%c%c\n\r", TXT_2BYTE, TXT2BYTE_Enabled);
187 write_label_var(20, 800, y_line + ME_Y_LINE_STEP, &FontT48, text);
188 write_field_select(StMSP_Active, 160, 800, y_line + ME_Y_LINE_STEP, &FontT48, "#", settings->setpoint[setpointId].note.ub.active, 0, 0, 0);
189 }
190 } else {
191 textPointer += snprintf(&text[textPointer], 40, "\034 \016\016 \017 \016\016meter\017\035\n\r");
192 write_label_var(20, 800, y_line, &FontT48, text);
193 write_field_udigit(StMSP_ppo2_setting, 160, 800, y_line, &FontT48, "#.## ###", (uint32_t)setpointBar, (uint32_t)(setpoint_cbar - (100 * setpointBar)), depthDeco, 0);
194 }
195 setEvent(StMSP_ppo2_setting, (uint32_t)OnAction_SP_Setpoint);
196 setEvent(StMSP_Active, (uint32_t)OnAction_SP_SetpointActive);
197
198 startEdit();
199 }
200
201
127 void openEdit_Setpoint(uint8_t line) 202 void openEdit_Setpoint(uint8_t line)
128 { 203 {
129 SSettings *settings = settingsGetPointer(); 204 SSettings *settings = settingsGetPointer();
130
131 uint8_t useSensorSubMenu = 0;
132 char text[20];
133 uint8_t sensorActive[3];
134 205
135 /* dive mode */ 206 /* dive mode */
136 if (actual_menu_content != MENU_SURFACE) { 207 if (actual_menu_content != MENU_SURFACE) {
137 uint8_t setpointCbar, actualGasID; 208 SSettings *settings = settingsGetPointer();
138 setpointCbar = 100; 209
139 210 uint8_t setpointCbar = 100;
140 // actualGasID 211 uint8_t useSensorSubMenu = 0;
141 if(!isLoopMode(stateUsedWrite->diveSettings.diveMode))
142 {
143 actualGasID = stateUsedWrite->lifeData.lastDiluent_GasIdInSettings;
144 if((actualGasID <= NUM_OFFSET_DILUENT) || (actualGasID > NUM_GASES + NUM_OFFSET_DILUENT))
145 actualGasID = NUM_OFFSET_DILUENT + 1;
146 }
147 else
148 actualGasID = stateUsedWrite->lifeData.actualGas.GasIdInSettings;
149
150 // setpointCbar, CCR_Mode and sensor menu
151 if (line < 6 && stateUsedWrite->diveSettings.diveMode != DIVEMODE_PSCR) { 212 if (line < 6 && stateUsedWrite->diveSettings.diveMode != DIVEMODE_PSCR) {
152 /* setpoints inactive in PSCR mode */ 213 /* setpoints inactive in PSCR mode */
153 214
154 if (settings->autoSetpoint && line > SETPOINT_INDEX_AUTO_DECO) { 215 if (settings->autoSetpoint && line > SETPOINT_INDEX_AUTO_DECO) {
216 if (line == 5) {
217 startSetpointEdit(line, 0);
218 }
219
155 return; 220 return;
156 } 221 }
157 222
158 setpointCbar = stateUsedWrite->diveSettings.setpoint[line].setpoint_cbar; 223 setpointCbar = stateUsedWrite->diveSettings.setpoint[line].setpoint_cbar;
159 stateUsedWrite->diveSettings.CCR_Mode = CCRMODE_FixedSetpoint; 224 stateUsedWrite->diveSettings.CCR_Mode = CCRMODE_FixedSetpoint;
172 { 237 {
173 useSensorSubMenu = 1; 238 useSensorSubMenu = 1;
174 } 239 }
175 } 240 }
176 241
177 setActualGas_DM(&stateUsedWrite->lifeData,actualGasID, setpointCbar); 242 changeSetpoint(setpointCbar);
178
179 checkSwitchToLoop();
180
181 clear_warning_fallback();
182 243
183 if(!useSensorSubMenu) 244 if(!useSensorSubMenu)
184 { 245 {
185 exitMenuEdit_to_Home(); 246 exitMenuEdit_to_Home();
186 } 247 }
187 else // entire sub menu during dive to select sensors active 248 else // entire sub menu during dive to select sensors active
188 { 249 {
189 set_globalState_Menu_Line(line); 250 set_globalState_Menu_Line(line);
190 resetMenuEdit(CLUT_MenuPageGasSP); 251 resetMenuEdit(CLUT_MenuPageGasSP);
191 252
253 char text[20];
254
192 text[0] = '\001'; 255 text[0] = '\001';
193 text[1] = TXT_o2Sensors; 256 text[1] = TXT_o2Sensors;
194 text[2] = 0; 257 text[2] = 0;
195 write_topline(text); 258 write_topline(text);
196 259
260 uint8_t sensorActive[3];
197 if(stateUsedWrite->diveSettings.ppo2sensors_deactivated & 1) 261 if(stateUsedWrite->diveSettings.ppo2sensors_deactivated & 1)
198 { 262 {
199 snprintf (text,20,"Sensor 1"); 263 snprintf (text,20,"Sensor 1");
200 sensorActive[0] = 0; 264 sensorActive[0] = 0;
201 } 265 }
236 setEvent(StMSP_Sensor2, (uint32_t)OnAction_SP_DM_Sensor2); 300 setEvent(StMSP_Sensor2, (uint32_t)OnAction_SP_DM_Sensor2);
237 setEvent(StMSP_Sensor3, (uint32_t)OnAction_SP_DM_Sensor3); 301 setEvent(StMSP_Sensor3, (uint32_t)OnAction_SP_DM_Sensor3);
238 } 302 }
239 } else { 303 } else {
240 /* surface mode */ 304 /* surface mode */
241 uint8_t spId, setpoint_cbar, depthDeco, first;
242 char text[70];
243 uint8_t textPointer;
244 uint16_t y_line;
245
246 if ((!settings->autoSetpoint && line <= 5) || line <= SETPOINT_INDEX_AUTO_DECO) { 305 if ((!settings->autoSetpoint && line <= 5) || line <= SETPOINT_INDEX_AUTO_DECO) {
247 set_globalState_Menu_Line(line); 306 startSetpointEdit(line, line);
248
249 resetMenuEdit(CLUT_MenuPageGasSP);
250
251 spId = line;
252 editSetpointPage.spID = spId;
253 editSetpointPage.pSetpointLine = settings->setpoint;
254
255 setpoint_cbar = editSetpointPage.pSetpointLine[spId].setpoint_cbar;
256 depthDeco = editSetpointPage.pSetpointLine[spId].depth_meter;
257 first = editSetpointPage.pSetpointLine[spId].note.ub.first;
258
259 uint8_t setpointBar = setpoint_cbar / 100;
260
261 textPointer = snprintf(text, 20, "\001%c%c ", TXT_2BYTE, TXT2BYTE_Setpoint);
262 textPointer += printSetpointName(&text[textPointer], line, settings, false);
263 snprintf(&text[textPointer], 20, " %c", TXT_Setpoint_Edit);
264 write_topline(text);
265
266 y_line = ME_Y_LINE_BASE + (line * ME_Y_LINE_STEP);
267
268 textPointer = snprintf(text, 4, "%c%c", TXT_2BYTE, TXT2BYTE_SetpointShort);
269 textPointer += printSetpointName(&text[textPointer], line, settings, true);
270 textPointer += snprintf(&text[textPointer], 60, " %s* \016\016 bar\017", first ? "" : "\177");
271
272 if (settings->autoSetpoint && line == SETPOINT_INDEX_AUTO_DECO) {
273 textPointer += snprintf(&text[textPointer], 4, "\n\r");
274 write_label_var(20, 800, y_line, &FontT48, text);
275
276 write_field_udigit(StMSP_ppo2_setting, 160, 800, y_line, &FontT48, "#.##", (uint32_t)setpointBar, (uint32_t)(setpoint_cbar - (100 * setpointBar)), settings->setpoint[line].note.ub.active, 0);
277
278 snprintf(text, 60, "\034 \035%c%c\n\r", TXT_2BYTE, TXT2BYTE_Enabled);
279 write_label_var(20, 800, y_line + ME_Y_LINE_STEP, &FontT48, text);
280 write_field_select(StMSP_Active, 160, 800, y_line + ME_Y_LINE_STEP, &FontT48, "#", settings->setpoint[line].note.ub.active, 0, 0, 0);
281 } else {
282 textPointer += snprintf(&text[textPointer], 40, "\034 \016\016 \017 \016\016meter\017\035\n\r");
283 write_label_var(20, 800, y_line, &FontT48, text);
284 write_field_udigit(StMSP_ppo2_setting, 160, 800, y_line, &FontT48, "#.## ###", (uint32_t)setpointBar, (uint32_t)(setpoint_cbar - (100 * setpointBar)), depthDeco, 0);
285 }
286 setEvent(StMSP_ppo2_setting, (uint32_t)OnAction_SP_Setpoint);
287 setEvent(StMSP_Active, (uint32_t)OnAction_SP_SetpointActive);
288 startEdit();
289 } else if (line == 5) { 307 } else if (line == 5) {
290 settings->delaySetpointLow = !settings->delaySetpointLow; 308 settings->delaySetpointLow = !settings->delaySetpointLow;
291 309
292 exitMenuEdit_to_Menu_with_Menu_Update_do_not_write_settings_for_this_only(); 310 exitMenuEdit_to_Menu_with_Menu_Update_do_not_write_settings_for_this_only();
293 } else if (line == 6) { 311 } else if (line == 6) {
298 exitMenuEdit_to_Menu_with_Menu_Update_do_not_write_settings_for_this_only(); 316 exitMenuEdit_to_Menu_with_Menu_Update_do_not_write_settings_for_this_only();
299 } 317 }
300 } 318 }
301 } 319 }
302 320
321
303 static uint8_t OnAction_SP_Setpoint(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 322 static uint8_t OnAction_SP_Setpoint(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
304 { 323 {
305 SSettings *settings = settingsGetPointer(); 324 SSettings *settings = settingsGetPointer();
306 325
307 int8_t digitContentNew; 326 int8_t digitContentNew;
331 tMenuEdit_newInput(editId, new_integer_part, new_fractional_part, newDepth, 0); 350 tMenuEdit_newInput(editId, new_integer_part, new_fractional_part, newDepth, 0);
332 351
333 checkAndFixSetpointSettings(); 352 checkAndFixSetpointSettings();
334 353
335 return EXIT_TO_NEXT_MENU; 354 return EXIT_TO_NEXT_MENU;
355 } else if (editSetpointPage.spID == 0) {
356 changeSetpoint(new_cbar);
357
358 return UPDATE_AND_EXIT_TO_HOME;
336 } else { 359 } else {
337 if (newDepth > 255) { 360 if (newDepth > 255) {
338 newDepth = 255; 361 newDepth = 255;
339 } 362 }
340 363