comparison Discovery/Src/tMenuEditCvOption.c @ 999:ac25c35a3c97 GasConsumption

New Tab for dynamic configuration: since more and more functions are added to the OSTC the space in the menus is getting short. To avoid problems a new Tab within the SYS menu has been added which shall focus an functions / views which are configuration dependend. In future this menu may have dynamic content dependend on which views are active or which sensors are connected. The Cview for compass and Timer have been moved to the new tab in the first step
author Ideenmodellierer
date Mon, 28 Apr 2025 19:47:41 +0200
parents
children 21142f4fa968
comparison
equal deleted inserted replaced
998:5a690195b6b7 999:ac25c35a3c97
1 ///////////////////////////////////////////////////////////////////////////////
2 /// -*- coding: UTF-8 -*-
3 ///
4 /// \file Discovery/Src/tMenuEditCvOption.c
5 /// \brief Menu for configuration depended items
6 /// \author heinrichs weikamp gmbh
7 /// \date 24-Apr-2025
8 ///
9 /// \details
10 ///
11 /// $Id$
12 ///////////////////////////////////////////////////////////////////////////////
13 /// \par Copyright (c) 2014-2025 Heinrichs Weikamp gmbh
14 ///
15 /// This program is free software: you can redistribute it and/or modify
16 /// it under the terms of the GNU General Public License as published by
17 /// the Free Software Foundation, either version 3 of the License, or
18 /// (at your option) any later version.
19 ///
20 /// This program is distributed in the hope that it will be useful,
21 /// but WITHOUT ANY WARRANTY; without even the implied warranty of
22 /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 /// GNU General Public License for more details.
24 ///
25 /// You should have received a copy of the GNU General Public License
26 /// along with this program. If not, see <http://www.gnu.org/licenses/>.
27 //////////////////////////////////////////////////////////////////////////////
28
29 /* Includes ------------------------------------------------------------------*/
30 #include "tMenuEditCvOption.h"
31 #include "tMenuEdit.h"
32
33 #include "gfx_fonts.h"
34 #include "ostc.h"
35 #include "tMenuEdit.h"
36 #include "tHome.h"
37
38 /* Private function prototypes -----------------------------------------------*/
39 static void openEdit_Timer(void);
40 void openEdit_Compass(void);
41
42 /* Announced function prototypes -----------------------------------------------*/
43 uint8_t OnAction_Compass (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
44 static uint8_t OnAction_CompassDeclination(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
45 uint8_t OnAction_Bearing (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
46 uint8_t OnAction_BearingClear (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
47 uint8_t OnAction_InertiaLevel (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
48 static uint8_t OnAction_Timer(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
49
50 /* Exported functions --------------------------------------------------------*/
51
52 void openEdit_CvOption(uint8_t line)
53 {
54 set_globalState_Menu_Line(line);
55
56 switch(line)
57 {
58 case 1:
59 default:
60 resetMenuEdit(CLUT_MenuPageHardware);
61 openEdit_Compass();
62 break;
63 case 2:
64 openEdit_Timer();
65 break;
66 }
67 }
68
69 /* Private functions ---------------------------------------------------------*/
70
71 static uint8_t OnAction_CompassDeclination(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
72 {
73 SSettings *settings = settingsGetPointer();
74 uint8_t digitContentNew;
75 switch (action) {
76 case ACTION_BUTTON_ENTER:
77
78 return digitContent;
79 case ACTION_BUTTON_ENTER_FINAL:
80 {
81 int32_t compassDeclinationDeg;
82 evaluateNewString(editId, (uint32_t *)&compassDeclinationDeg, NULL, NULL, NULL);
83
84 if (compassDeclinationDeg > 99) {
85 compassDeclinationDeg = 99;
86 } else if (compassDeclinationDeg < -99) {
87 compassDeclinationDeg = -99;
88 }
89
90 settings->compassDeclinationDeg = compassDeclinationDeg;
91
92 tMenuEdit_newInput(editId, ((input_u)compassDeclinationDeg).uint32, 0, 0, 0);
93 }
94
95 break;
96 case ACTION_BUTTON_NEXT:
97 if (digitNumber == 0) {
98 digitContentNew = togglePlusMinus(digitContent);
99 } else {
100 digitContentNew = digitContent + 1;
101 if (digitContentNew > '9') {
102 digitContentNew = '0';
103 }
104 }
105
106 return digitContentNew;
107 case ACTION_BUTTON_BACK:
108 if (digitNumber == 0) {
109 digitContentNew = togglePlusMinus(digitContent);
110 } else {
111 digitContentNew = digitContent - 1;
112 if (digitContentNew < '0') {
113 digitContentNew = '9';
114 }
115 }
116
117 return digitContentNew;
118 }
119
120 return UNSPECIFIC_RETURN;
121 }
122
123
124 static void showCompassDeclination(SSettings *settings, bool isRefresh)
125 {
126 char text[16];
127 snprintf(text, 16, "%c%c:", TXT_2BYTE, TXT2BYTE_CompassDeclination);
128 write_label_var(30, 800, ME_Y_LINE6, &FontT48, text);
129 if (isRefresh) {
130 tMenuEdit_refresh_field(StMOption_Compass_Declination);
131 } else {
132 write_field_sdigit(StMOption_Compass_Declination, 500, 800, ME_Y_LINE6, &FontT48, "\034###`", settings->compassDeclinationDeg, 0, 0, 0);
133 }
134 }
135
136
137 void refresh_CompassEdit(void)
138 {
139 SSettings *settings = settingsGetPointer();
140
141 uint16_t heading;
142 char text[32];
143 uint8_t textIndex = 0;
144
145 text[0] = '\001';
146 text[1] = TXT_2BYTE;
147 text[2] = TXT2BYTE_Compass;
148 text[3] = 0;
149 write_topline(text);
150
151 if(settings->compassInertia)
152 {
153 heading = (uint16_t)compass_getCompensated();
154 }
155 else
156 {
157 heading = (uint16_t)stateUsed->lifeData.compass_heading;
158 }
159 snprintf(text,32,"\001%03i`",heading);
160 write_label_var( 0, 800, ME_Y_LINE1, &FontT54, text);
161
162 tMenuEdit_refresh_field(StMOption_Compass_SetCourse);
163 tMenuEdit_refresh_field(StMOption_Compass_Calibrate);
164 tMenuEdit_refresh_field(StMOption_Compass_ResetCourse);
165 text[textIndex++] = TXT_2BYTE;
166 text[textIndex++] = TXT2BYTE_CompassInertia;
167 text[textIndex++] = ':';
168 text[textIndex++] = ' ';
169 text[textIndex++] = '0' + settings->compassInertia;
170
171 write_label_var(30, 800, ME_Y_LINE5, &FontT48, text);
172
173 showCompassDeclination(settings, true);
174
175 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
176 }
177
178
179 void openEdit_Compass(void)
180 {
181 SSettings *settings = settingsGetPointer();
182
183 char text[10];
184 uint8_t textIndex = 0;
185
186
187 set_globalState(StMOption_Compass);
188 resetMenuEdit(CLUT_MenuPageHardware);
189
190 text[textIndex++] = '\001';
191 text[textIndex++] = TXT_2BYTE;
192 text[textIndex++] = TXT2BYTE_Compass;
193 text[textIndex++] = 0;
194 write_topline(text);
195
196 text[0] = TXT_2BYTE;
197 text[2] = 0;
198
199 text[1] = TXT2BYTE_SetBearing;
200 write_field_button(StMOption_Compass_SetCourse, 30, 800, ME_Y_LINE2, &FontT48, text);
201
202 text[1] = TXT2BYTE_ResetBearing;
203 write_field_button(StMOption_Compass_ResetCourse, 30, 800, ME_Y_LINE3, &FontT48, text);
204
205 text[1] = TXT2BYTE_CompassCalib;
206 write_field_button(StMOption_Compass_Calibrate, 30, 800, ME_Y_LINE4, &FontT48, text);
207
208 text[1] = TXT2BYTE_CompassInertia;
209 textIndex = 2;
210 text[textIndex++] = ':';
211 text[textIndex++] = ' ';
212 text[textIndex++] = '0' + settings->compassInertia;
213 text[textIndex++] = 0;
214
215 write_field_button(StMOption_Compass_Inertia, 30, 800, ME_Y_LINE5, &FontT48, text);
216
217 showCompassDeclination(settings, false);
218
219 setEvent(StMOption_Compass_SetCourse, (uint32_t)OnAction_Bearing);
220 setEvent(StMOption_Compass_ResetCourse, (uint32_t)OnAction_BearingClear);
221 setEvent(StMOption_Compass_Calibrate, (uint32_t)OnAction_Compass);
222 setEvent(StMOption_Compass_Inertia, (uint32_t)OnAction_InertiaLevel);
223 setEvent(StMOption_Compass_Declination, (uint32_t)OnAction_CompassDeclination);
224
225 tMenuEdit_select(StMOption_Compass_SetCourse);
226
227 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
228 }
229
230
231 uint8_t OnAction_Compass (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
232 {
233 calibrateCompass();
234 return EXIT_TO_INFO_COMPASS;
235 }
236
237
238 uint8_t OnAction_Bearing (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
239 {
240 if((int16_t)stateUsed->lifeData.compass_heading != -1)
241 {
242 settingsGetPointer()->compassBearing = (int16_t)stateUsed->lifeData.compass_heading;
243 }
244 else
245 {
246 settingsGetPointer()->compassBearing = 0;
247 }
248
249 if(settingsGetPointer()->compassBearing == 0)
250 settingsGetPointer()->compassBearing = 360;
251 return UPDATE_AND_EXIT_TO_MENU;
252 }
253
254
255 uint8_t OnAction_BearingClear (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
256 {
257 settingsGetPointer()->compassBearing = 0;
258 return UPDATE_AND_EXIT_TO_MENU;
259 }
260
261
262 uint8_t OnAction_InertiaLevel (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
263 {
264 uint8_t newLevel = 0;
265
266 newLevel = settingsGetPointer()->compassInertia + 1;
267 if(newLevel > MAX_COMPASS_COMP)
268 {
269 newLevel = 0;
270 }
271 settingsGetPointer()->compassInertia = newLevel;
272 return UPDATE_DIVESETTINGS;
273 }
274
275 static void openEdit_Timer(void)
276 {
277 SSettings *settings = settingsGetPointer();
278
279 char text[32];
280 snprintf(text, 32, "\001%c%c", TXT_2BYTE, TXT2BYTE_Timer);
281 write_topline(text);
282
283 uint16_t yPos = ME_Y_LINE_BASE + get_globalState_Menu_Line() * ME_Y_LINE_STEP;
284 snprintf(text, 32, "%c%c", TXT_2BYTE, TXT2BYTE_Timer);
285 write_label_var(30, 299, yPos, &FontT48, text);
286 write_field_udigit(StMOption_Timer, 300, 392, yPos, &FontT48, "#:##", settings->timerDurationS / 60, settings->timerDurationS % 60, 0, 0);
287 write_label_var(393, 800, yPos, &FontT48, "\016\016 [m:ss]\017");
288
289 write_buttonTextline(TXT2BYTE_ButtonMinus, TXT2BYTE_ButtonEnter, TXT2BYTE_ButtonPlus);
290
291 setEvent(StMOption_Timer, (uint32_t)OnAction_Timer);
292 startEdit();
293 }
294 static uint8_t OnAction_Timer(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
295 {
296 SSettings *settings = settingsGetPointer();
297 uint8_t digitContentNew;
298 switch (action) {
299 case ACTION_BUTTON_ENTER:
300
301 return digitContent;
302 case ACTION_BUTTON_ENTER_FINAL:
303 {
304 uint32_t timerM;
305 uint32_t timerS;
306 evaluateNewString(editId, &timerM, &timerS, 0, 0);
307 if (timerM > 9) {
308 timerM = 9;
309 }
310 if (timerS > 59) {
311 timerS = 59;
312 }
313
314 uint16_t timerDurationS = 60 * timerM + timerS;
315
316 if (timerDurationS < 1) {
317 timerDurationS = 1;
318 }
319
320 if (timerDurationS != settings->timerDurationS) {
321 settings->timerDurationS = timerDurationS;
322
323 disableTimer();
324
325 tMenuEdit_newInput(editId, settings->timerDurationS / 60, settings->timerDurationS % 60, 0, 0);
326 }
327
328 return EXIT_TO_MENU;
329 }
330 case ACTION_BUTTON_NEXT:
331 digitContentNew = digitContent + 1;
332 if ((blockNumber == 1 && digitNumber == 0 && digitContentNew > '5') || digitContentNew > '9') {
333 digitContentNew = '0';
334 }
335
336 return digitContentNew;
337 case ACTION_BUTTON_BACK:
338 digitContentNew = digitContent - 1;
339 if (digitContentNew < '0') {
340 if (blockNumber == 1 && digitNumber == 0) {
341 digitContentNew = '5';
342 } else {
343 digitContentNew = '9';
344 }
345 }
346
347 return digitContentNew;
348 }
349
350 return EXIT_TO_MENU;
351 }
352
353