Mercurial > public > ostc4
comparison Discovery/Src/tMenuEditHardware.c @ 776:45b8f3c2acce
Add support for a configurable compass declination in a range of -99 to 99 degrees.
This allows the displayed compass reading to be configured to take into account the compass declination (difference between the measured magnetic North direction and the actual geographical North direction) that has different values for different locations around the globe. See https://magnetic-declination.com/ for more information. (mikeller)
author | heinrichsweikamp |
---|---|
date | Thu, 18 May 2023 09:49:17 +0200 |
parents | ec7b62983a8c |
children | c31237d20491 |
comparison
equal
deleted
inserted
replaced
775:46c6d2380d4e | 776:45b8f3c2acce |
---|---|
157 | 157 |
158 exitEditWithUpdate(); | 158 exitEditWithUpdate(); |
159 exitMenuEdit_to_Home(); | 159 exitMenuEdit_to_Home(); |
160 } | 160 } |
161 | 161 |
162 | |
163 static uint8_t togglePlusMinus(uint8_t input) | |
164 { | |
165 if (input == '+') { | |
166 return '-'; | |
167 } else { | |
168 return '+'; | |
169 } | |
170 } | |
171 | |
172 | |
173 static uint8_t OnAction_CompassDeclination(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) | |
174 { | |
175 SSettings *settings = settingsGetPointer(); | |
176 uint8_t digitContentNew; | |
177 switch (action) { | |
178 case ACTION_BUTTON_ENTER: | |
179 | |
180 return digitContent; | |
181 case ACTION_BUTTON_ENTER_FINAL: | |
182 { | |
183 int32_t compassDeclinationDeg; | |
184 evaluateNewString(editId, (uint32_t *)&compassDeclinationDeg, NULL, NULL, NULL); | |
185 | |
186 if (compassDeclinationDeg > 99) { | |
187 compassDeclinationDeg = 99; | |
188 } else if (compassDeclinationDeg < -99) { | |
189 compassDeclinationDeg = -99; | |
190 } | |
191 | |
192 settings->compassDeclinationDeg = compassDeclinationDeg; | |
193 | |
194 tMenuEdit_newInput(editId, ((input_u)compassDeclinationDeg).uint32, 0, 0, 0); | |
195 } | |
196 | |
197 break; | |
198 case ACTION_BUTTON_NEXT: | |
199 if (digitNumber == 0) { | |
200 digitContentNew = togglePlusMinus(digitContent); | |
201 } else { | |
202 digitContentNew = digitContent + 1; | |
203 if (digitContentNew > '9') { | |
204 digitContentNew = '0'; | |
205 } | |
206 } | |
207 | |
208 return digitContentNew; | |
209 case ACTION_BUTTON_BACK: | |
210 if (digitNumber == 0) { | |
211 digitContentNew = togglePlusMinus(digitContent); | |
212 } else { | |
213 digitContentNew = digitContent - 1; | |
214 if (digitContentNew < '0') { | |
215 digitContentNew = '9'; | |
216 } | |
217 } | |
218 | |
219 return digitContentNew; | |
220 } | |
221 | |
222 return UNSPECIFIC_RETURN; | |
223 } | |
224 | |
225 | |
226 static void showCompassDeclination(SSettings *settings, bool isRefresh) | |
227 { | |
228 char text[16]; | |
229 snprintf(text, 16, "%c%c:", TXT_2BYTE, TXT2BYTE_CompassDeclination); | |
230 write_label_var(30, 800, ME_Y_LINE6, &FontT48, text); | |
231 if (isRefresh) { | |
232 tMenuEdit_refresh_field(StMHARD2_Compass_Declination); | |
233 } else { | |
234 write_field_sdigit(StMHARD2_Compass_Declination, 500, 800, ME_Y_LINE6, &FontT48, "\034###`", settings->compassDeclinationDeg, 0, 0, 0); | |
235 } | |
236 } | |
237 | |
238 | |
162 void refresh_CompassEdit(void) | 239 void refresh_CompassEdit(void) |
163 { | 240 { |
241 SSettings *settings = settingsGetPointer(); | |
242 | |
164 uint16_t heading; | 243 uint16_t heading; |
165 char text[32]; | 244 char text[32]; |
166 uint8_t textIndex = 0; | 245 uint8_t textIndex = 0; |
167 | 246 |
168 text[0] = '\001'; | 247 text[0] = '\001'; |
169 text[1] = TXT_2BYTE; | 248 text[1] = TXT_2BYTE; |
170 text[2] = TXT2BYTE_Compass; | 249 text[2] = TXT2BYTE_Compass; |
171 text[3] = 0; | 250 text[3] = 0; |
172 write_topline(text); | 251 write_topline(text); |
173 | 252 |
174 if(settingsGetPointer()->compassInertia) | 253 if(settings->compassInertia) |
175 { | 254 { |
176 heading = (uint16_t)compass_getCompensated(); | 255 heading = (uint16_t)compass_getCompensated(); |
177 } | 256 } |
178 else | 257 else |
179 { | 258 { |
187 tMenuEdit_refresh_field(StMHARD2_Compass_ResetCourse); | 266 tMenuEdit_refresh_field(StMHARD2_Compass_ResetCourse); |
188 text[textIndex++] = TXT_2BYTE; | 267 text[textIndex++] = TXT_2BYTE; |
189 text[textIndex++] = TXT2BYTE_CompassInertia; | 268 text[textIndex++] = TXT2BYTE_CompassInertia; |
190 text[textIndex++] = ':'; | 269 text[textIndex++] = ':'; |
191 text[textIndex++] = ' '; | 270 text[textIndex++] = ' '; |
192 text[textIndex++] = '0' + settingsGetPointer()->compassInertia; | 271 text[textIndex++] = '0' + settings->compassInertia; |
193 | 272 |
194 write_label_var(30, 800, ME_Y_LINE5, &FontT48, text); | 273 write_label_var(30, 800, ME_Y_LINE5, &FontT48, text); |
195 | 274 |
275 showCompassDeclination(settings, true); | |
276 | |
196 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); | 277 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); |
197 } | 278 } |
198 | 279 |
199 | 280 |
200 void openEdit_Compass(void) | 281 void openEdit_Compass(void) |
201 { | 282 { |
283 SSettings *settings = settingsGetPointer(); | |
284 | |
202 char text[10]; | 285 char text[10]; |
203 uint8_t textIndex = 0; | 286 uint8_t textIndex = 0; |
204 | 287 |
205 text[textIndex++] = '\001'; | 288 text[textIndex++] = '\001'; |
206 text[textIndex++] = TXT_2BYTE; | 289 text[textIndex++] = TXT_2BYTE; |
212 text[2] = 0; | 295 text[2] = 0; |
213 | 296 |
214 text[1] = TXT2BYTE_SetBearing; | 297 text[1] = TXT2BYTE_SetBearing; |
215 write_field_button(StMHARD2_Compass_SetCourse, 30, 800, ME_Y_LINE2, &FontT48, text); | 298 write_field_button(StMHARD2_Compass_SetCourse, 30, 800, ME_Y_LINE2, &FontT48, text); |
216 | 299 |
300 text[1] = TXT2BYTE_ResetBearing; | |
301 write_field_button(StMHARD2_Compass_ResetCourse, 30, 800, ME_Y_LINE3, &FontT48, text); | |
302 | |
217 text[1] = TXT2BYTE_CompassCalib; | 303 text[1] = TXT2BYTE_CompassCalib; |
218 write_field_button(StMHARD2_Compass_Calibrate, 30, 800, ME_Y_LINE3, &FontT48, text); | 304 write_field_button(StMHARD2_Compass_Calibrate, 30, 800, ME_Y_LINE4, &FontT48, text); |
219 | |
220 text[1] = TXT2BYTE_ResetBearing; | |
221 write_field_button(StMHARD2_Compass_ResetCourse, 30, 800, ME_Y_LINE4, &FontT48, text); | |
222 | 305 |
223 text[1] = TXT2BYTE_CompassInertia; | 306 text[1] = TXT2BYTE_CompassInertia; |
224 textIndex = 2; | 307 textIndex = 2; |
225 text[textIndex++] = ':'; | 308 text[textIndex++] = ':'; |
226 text[textIndex++] = ' '; | 309 text[textIndex++] = ' '; |
227 text[textIndex++] = '0' + settingsGetPointer()->compassInertia; | 310 text[textIndex++] = '0' + settings->compassInertia; |
311 text[textIndex++] = 0; | |
228 | 312 |
229 write_field_button(StMHARD2_Compass_Inertia, 30, 800, ME_Y_LINE5, &FontT48, text); | 313 write_field_button(StMHARD2_Compass_Inertia, 30, 800, ME_Y_LINE5, &FontT48, text); |
230 | 314 |
315 showCompassDeclination(settings, false); | |
316 | |
231 setEvent(StMHARD2_Compass_SetCourse, (uint32_t)OnAction_Bearing); | 317 setEvent(StMHARD2_Compass_SetCourse, (uint32_t)OnAction_Bearing); |
318 setEvent(StMHARD2_Compass_ResetCourse, (uint32_t)OnAction_BearingClear); | |
232 setEvent(StMHARD2_Compass_Calibrate, (uint32_t)OnAction_Compass); | 319 setEvent(StMHARD2_Compass_Calibrate, (uint32_t)OnAction_Compass); |
233 setEvent(StMHARD2_Compass_ResetCourse, (uint32_t)OnAction_BearingClear); | |
234 setEvent(StMHARD2_Compass_Inertia, (uint32_t)OnAction_InertiaLevel); | 320 setEvent(StMHARD2_Compass_Inertia, (uint32_t)OnAction_InertiaLevel); |
321 setEvent(StMHARD2_Compass_Declination, (uint32_t)OnAction_CompassDeclination); | |
235 | 322 |
236 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); | 323 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); |
237 } | 324 } |
238 | 325 |
239 | 326 |