Mercurial > public > ostc4
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 |