Mercurial > public > ostc4
annotate Discovery/Src/base.c @ 224:ceecabfddb57 div-fixes-3
Bugfix, deco: fix 2 (small) problems with calculated ceiling
This fixes 1 trivial, and 1 not really trivial bug in the calculation
of the ceiling. When simulating a bounce dive to 80m, things become
clear (tried this on a CCR dive, fixed setpoint 1.2bar, about 15 minutes
of bottom time). Closely watch the behavior of the ceiling data. At some
point during the ascent, the ceiling begins to decrease in 10cm steps.
Then suddenly (while still ascending), the ceiling increases again with 1m,
does not change for some time, and then suddenly steps 1.1m less deep.
While not very relevant to real deco diving, it is simply wrong.
The reason for this is subtle. The algorithm used to find the ceiling
is a sort of linear search, stepping down a meter, overshoot the depth, and
search back in 10cm steps. It seems some numerical instability. Fixing
this, was a bit more computational intensive search by stepping up down in
equal steps of 10cm. But, I'm pretty sure that things can be speeded up here, as a
ceiling does not change fast, so it should be not that difficult to limit
the search space, or use a binary search algorithm instead.
The trivial second problem fixed, is that the ceiling ends at the surface
and not at 1m depth. This small issue became visible after changing the step
down size above.
Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Sun, 31 Mar 2019 19:35:51 +0200 |
parents | 5f535ef6a3db |
children | 2bb1db22b5f5 |
rev | line source |
---|---|
38 | 1 /////////////////////////////////////////////////////////////////////////////// |
2 /// -*- coding: UTF-8 -*- | |
3 /// | |
4 /// \file Discovery/Src/base.c | |
5 /// \brief main(): init hardware, IRQs and start sub-systems | |
6 /// \author heinrichs weikamp gmbh | |
7 /// \date 26-February-2014 | |
8 /// | |
9 /// $Id$ | |
10 /////////////////////////////////////////////////////////////////////////////// | |
11 /// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh | |
12 /// | |
13 /// This program is free software: you can redistribute it and/or modify | |
14 /// it under the terms of the GNU General Public License as published by | |
15 /// the Free Software Foundation, either version 3 of the License, or | |
16 /// (at your option) any later version. | |
17 /// | |
18 /// This program is distributed in the hope that it will be useful, | |
19 /// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 /// GNU General Public License for more details. | |
22 /// | |
23 /// You should have received a copy of the GNU General Public License | |
24 /// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
25 ////////////////////////////////////////////////////////////////////////////// | |
26 | |
27 /** | |
28 @verbatim | |
29 ============================================================================== | |
30 ##### Firmware Info ##### | |
31 ============================================================================== | |
32 [..] In settings.c including text and magic stuff | |
33 ============================================================================== | |
34 ##### IRQs ##### | |
35 ============================================================================== | |
36 [..] The IRQs are very important and most functions should only run there. | |
37 | |
38 PreemptPriority are as follows | |
39 (#) 2 (low) sprintf _only_ here. Don't use in maintask or anywhere else. | |
40 Called by Buttons und Timer3 | |
41 Timer3 is 1/10 second | |
42 (#) 1 (mid) anything that should work while in IRQ2 like HalDelay(), VSYNC | |
43 and DMA2D Transfer Complete for housekeepingFrame(); | |
44 (#) 0 (high) _very very short_ interrupts like The HAL hardware part for | |
45 spi, uart, i2c. | |
46 | |
47 SubPriority within PreemptPriority give the order to execute. | |
48 Introduced 30.Oct.14 as it used by several HAL examples. | |
49 Three levelAmbients are available (2 low,1 mid,0 high) | |
50 | |
51 The STM32F4 has 4bits for IRQ levelAmbients, divided 2/2 in this code | |
52 with the NVIC_PRIORITYGROUP_2 setting. | |
53 | |
54 ============================================================================== | |
55 ##### MainTask ##### | |
56 ============================================================================== | |
57 [..] For everthing slow without importance to be 'in time'. | |
58 Like VPM and Buehlmann. | |
59 No sprintf and probably no GFX_SetFramesTopBottom() stuff neither. | |
60 If sprintf is called while sprintf is executed it blows up everything. | |
61 | |
62 ============================================================================== | |
63 ##### Frames / the external SDRAM ##### | |
64 ============================================================================== | |
65 [..] The SDRAM is handled by getFrame() and releaseFrame(). | |
66 Each frame with 800*480*2 Bytes. | |
67 Be carefull to release every frame | |
68 otherwise there will be a memory leakage over time. | |
69 housekeepingFrame() in the MainTask takes care of cleaning the frames. | |
70 All frames are filled with 0x00. This will be transparent with color of | |
71 CLUT_Font020 (is CLUT 0) if the alpha is set for a 16bit pair. | |
72 housekeepingFrame() delays the cleaning of frames still used as screen | |
73 buffer to prevent flickering. | |
74 | |
75 [..] use global variable frameCounter[] in gfxengine.c to control memory | |
76 all but the last three are identical to caller_id | |
77 for example 0x05 are the menu frames | |
78 the last but one is a sum for higher numbers (shouldn't be any) | |
79 the last but one are those in status RELEASED | |
80 the last are those CLEAR (as of 151202 down to 4 in logbook mode) | |
81 | |
82 [..] 4 pages are used for two double memories for screenshots (since Nov. 15) | |
83 | |
84 ============================================================================== | |
85 ##### Display ##### | |
86 ============================================================================== | |
87 [..] There is a Top layer, Bottom layer and background color. | |
88 All are perfectly alpha-blended by hardware. | |
89 | |
90 (#) top layer has 800x480 option function calls only | |
91 as it is not used for cursors here | |
92 (#) bottom layer has free size and start option to be used | |
93 for cursors (or sprites in the future ;-) | |
94 (#) background only black in the moment. | |
95 ToDo: Could be anything else for warnings etc. | |
96 if needed | |
97 | |
98 [..] Frame updates, switching and cursors is done with | |
99 | |
100 (#) GFX_SetFramesTopBottom() and the subset | |
101 GFX_SetFrameTop() + GFX_SetFrameBottom() | |
102 Those do not change anything on the display but give commands to.. | |
103 (#) GFX_change_LTDC() The only place that changes the pointer. | |
104 This prevents erratic behaviour if several changes | |
105 are made within one refresh rate of the screen. | |
106 Is called in IRQ by PD4 and HAL_GPIO_EXTI_IRQHandler | |
107 from VSYNC signal. | |
108 | |
109 [..] Content | |
110 | |
111 (#) Colors by LookupTable only. This could be modified by | |
112 system settings in the future. (gfx_color.h/.c) | |
113 | |
114 (#) Text by text_multilinguage.h/.c with one char | |
115 necessary only starting from '\x80' | |
116 with automatic language switch by | |
117 selected_language in SSettings | |
118 see openEdit_Language() in tMenuEditSystem.c | |
119 Therefore there are differnent functions | |
120 for example: | |
121 write_label_fix() for single char multilanguage | |
122 write_label_var() for strings that could include | |
123 multilanguage as well | |
124 see GFX_write_string() to get an overview of the controls | |
125 as well as the command list in gfx_engine.h | |
126 There is no clear before writing, text overlay is always on. | |
127 Many options to have LargeFont.SmallFont for numbers etc. | |
128 | |
129 ============================================================================== | |
130 ##### Update, DualBoot and build-in FLASH memory usage ##### | |
131 ============================================================================== | |
132 [..] Boot0 pin, Boot1/PB2 pin and BFB2 software bit control the behaviour. | |
133 PB2 should be tied to GND. | |
134 Boot0 == VDD -> bootloader on start, otherwise boot from Bank1 or Bank2 | |
135 depending on BFB2. | |
136 Bank2 contains the Fonts and should contain a proper test code in future | |
137 Bank1 is the main code (Bank1 is 1 MB too, usage as of Oct. 14 is 200 KB) | |
138 [..] Bootloader should be either UART or USB (on FS pins _only_) | |
139 USB HS to FS like on the Eval board does not work. | |
140 [..] Bootloader for the smaller CPU2 is implemented via the SPI used for DMA copy. | |
141 | |
142 ============================================================================== | |
143 ##### Connection to CPU2 (STM32F411 as of Oct.14 ##### | |
144 ============================================================================== | |
145 [..] Connected via SPI and DMA for every purpose. | |
146 two entire arrays are transfered for data security reasons | |
147 with respect to master (STM32F429) might interrupt internal | |
148 data copy in CPU2 (like hi byte, low byte, etc.). | |
149 [..] The entire life data is calculated in CPU2. Like tissues, CNS,... | |
150 Therefore the main unit is _not_ necessarily a Real Time system. | |
151 Simulation on the main unit can be executed without disrupting life data. | |
152 [..] SPI is triggered and timed by calling DataEX_call() in data_exchange_main.c | |
153 DataEX_copy_to_LifeData() does the transfer from buffer to variables used. | |
154 | |
155 ============================================================================== | |
156 ##### Menu, MenuEdit, Info ##### | |
157 ============================================================================== | |
158 [..] tMenu.c, tMenuEdit.c and tInfo.c is the system used. | |
159 logbook is part of Info not Menu. | |
160 The Info Menu is accessed by button 'Back' | |
161 The regular Menu is accessed by button 'Enter' | |
162 [..] Menu content is kept in frame memory for fast access. | |
163 There is no need to build pages if the 'Enter' button is pressed. | |
164 This is in contrast to MenuEdit pages. | |
165 [..] Button control for new pages (and pages in general) have to implemented | |
166 in tMenu.c, tMenuEdit.c or tInfo.c | |
167 | |
168 [..] ToDo (Oct. 14) Timeout for menus via Timer3 / IRQ 2 | |
169 | |
170 ============================================================================== | |
171 ##### settings ##### | |
172 ============================================================================== | |
173 [..] files: settings.c, settings.h | |
174 1. adjust struct SSettings in settings.h | |
175 2. adjust const SSettings SettingsStandard in settings.c | |
176 3. adjust set_new_settings_missing_in_ext_flash() | |
177 4. adjust check_and_correct_settings() IMPORTANT as it changes values! | |
178 | |
179 ============================================================================== | |
180 ##### specials ##### | |
181 ============================================================================== | |
182 [..] There was code for vector graphics from great demos | |
183 (peridiummmm and jupiter) that can be fitted again | |
184 | |
185 ============================================================================== | |
186 ##### ppO2 sensors ##### | |
187 ============================================================================== | |
188 [..] in tCCR.c is function get_ppO2SensorWeightedResult_cbar(); | |
189 | |
190 @endverbatim | |
191 ****************************************************************************** | |
192 * @attention | |
193 * | |
194 * <h2><center>© COPYRIGHT(c) 2014 heinrichs weikamp</center></h2> | |
195 * | |
196 ****************************************************************************** | |
197 */ | |
198 | |
199 /* Includes ------------------------------------------------------------------*/ | |
200 #include "stdio.h" | |
201 #include <string.h> // for memcopy | |
202 | |
203 #include "stm32f4xx_hal.h" | |
204 #include "ostc.h" | |
205 #include "base.h" | |
206 #include "display.h" | |
207 #include "gfx_engine.h" | |
208 #include "show_logbook.h" | |
209 //#include "test_vpm.h" | |
210 #include "text_multilanguage.h" | |
211 #include "tHome.h" | |
212 #include "tInfo.h" | |
213 #include "tInfoLog.h" | |
214 #include "tMenu.h" | |
215 #include "tMenuEdit.h" | |
216 #include "tMenuEditGasOC.h" | |
217 #include "tStructure.h" | |
218 //#include "gfx_specialeffects.h" | |
219 #include "externLogbookFlash.h" | |
220 #include "tComm.h" | |
221 #include "tCCR.h" | |
222 #include "data_exchange.h" | |
223 #include "data_exchange_main.h" | |
224 #include "vpm.h" | |
225 #include "buehlmann.h" | |
226 #include "logbook.h" | |
227 #include "check_warning.h" | |
228 #include "simulation.h" | |
229 #include "decom.h" | |
230 #include "timer.h" | |
231 #include "logbook_miniLive.h" | |
232 #include "test_vpm.h" | |
233 #include "tDebug.h" | |
234 | |
235 #ifdef DEMOMODE | |
236 #include "demo.h" | |
237 static void TIM_DEMO_init(void); | |
238 #endif | |
239 | |
240 //#include "lodepng.h" | |
241 //#include <stdlib.h> // for malloc and free | |
242 | |
243 /** @addtogroup OSTC 4 | |
244 * @{ | |
245 */ | |
246 | |
247 /* Private typedef -----------------------------------------------------------*/ | |
248 | |
249 //#define NO_TIMEOUT | |
250 //#define QUICK_SLEEP | |
251 | |
252 /* Private define ------------------------------------------------------------*/ | |
253 //#define BUFFER_SIZE ((uint32_t)0x00177000) | |
254 //#define WRITE_READ_ADDR ((uint32_t)0x0000) | |
255 #define REFRESH_COUNT ((uint32_t)0x0569) /**< for SDRAM refresh counter (90Mhz SD clock) */ | |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
256 #define INVALID_BUTTON ((uint8_t) 0xFF) |
38 | 257 /* Private macro -------------------------------------------------------------*/ |
258 /* Private variables ---------------------------------------------------------*/ | |
259 | |
260 RTC_HandleTypeDef RtcHandle; /* used to change time and date, no RTC is running on this MCU */ | |
261 TIM_HandleTypeDef TimHandle; /* used in stm32f4xx_it.c too */ | |
262 TIM_HandleTypeDef TimBacklightHandle; /* used in stm32f4xx_it.c too */ | |
263 TIM_HandleTypeDef TimDemoHandle; /* used in stm32f4xx_it.c too */ | |
264 | |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
265 uint8_t LastButtonPressed; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
266 uint32_t LastButtonPressedTick; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
267 |
38 | 268 /* |
269 uint32_t time_before; | |
270 uint32_t time_between; | |
271 uint32_t time_after; | |
272 */ | |
273 | |
274 /* SDRAM handler declaration */ | |
275 SDRAM_HandleTypeDef hsdram; | |
276 FMC_SDRAM_TimingTypeDef SDRAM_Timing; | |
277 FMC_SDRAM_CommandTypeDef command; | |
278 | |
279 /* This was used for Dual Boot */ | |
280 //FLASH_OBProgramInitTypeDef OBInit; | |
281 //FLASH_AdvOBProgramInitTypeDef AdvOBInit; | |
282 | |
283 /* Private variables with external access ------------------------------------*/ | |
284 | |
285 uint32_t globalStateID = 0; | |
286 uint8_t globalModeID = SURFMODE; | |
287 uint32_t time_without_button_pressed_deciseconds = 0; /**< langbeschreibung (eigenes Feld) warum diese variable verwendet wird um den sleepmode zu aktivieren */ | |
288 uint8_t bootToBootloader = 0; ///< set in tComm.c to install firmware updates, calls resetToFirmwareUpdate() | |
289 //uint8_t dataEx_VPM_call = 0; | |
290 uint8_t returnFromCommCleanUpRequest = 0; ///< use this to exit bluetooth mode and call tComm_exit() | |
291 uint32_t base_tempLightLevel = 0; | |
292 uint8_t updateButtonsToDefault = 0; | |
293 uint8_t wasFirmwareUpdateCheckBattery = 0; | |
294 | |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
295 static DoDisplayRefresh = 0; /* trigger to refresh display data */ |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
296 |
38 | 297 /* Private function prototypes -----------------------------------------------*/ |
298 static void SystemClock_Config(void); | |
299 static void Error_Handler(void); | |
300 static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command); | |
301 static void SDRAM_Config(void); | |
302 static void EXTILine_Buttons_Config(void); | |
303 static void TIM_init(void); | |
304 static void TIM_BACKLIGHT_init(void); | |
305 static uint32_t TIM_BACKLIGHT_adjust(void); | |
306 static void gotoSleep(void); | |
307 static void deco_loop(void); | |
308 static void resetToFirmwareUpdate(void); | |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
309 static void TriggerButtonAction(void); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
310 static void EvaluateButton(void); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
311 static void RefreshDisplay(void); |
38 | 312 |
313 /* ITM Trace-------- ---------------------------------------------------------*/ | |
314 /* | |
315 #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) | |
316 #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) | |
317 #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) | |
318 | |
319 #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) | |
320 #define TRCENA 0x01000000 | |
321 | |
322 struct __FILE { int handle; }; | |
323 FILE __stdout; | |
324 FILE __stdin; | |
325 | |
326 int fputc(int ch, FILE *f) { | |
327 if (DEMCR & TRCENA) { | |
328 while (ITM_Port32(0) == 0); | |
329 ITM_Port8(0) = ch; | |
330 } | |
331 return(ch); | |
332 } | |
333 */ | |
116 | 334 /* #define DEBUG_RUNTIME TRUE */ |
335 #ifdef DEBUG_RUNTIME | |
336 #define MEASURECNT 60 /* number of measuremets to be stored */ | |
337 static uint32_t loopcnt[MEASURECNT]; | |
338 #endif | |
38 | 339 // =============================================================================== |
340 // main | |
341 /// @brief This function makes initializations and has the nonIRQ endless loop | |
342 /// for bluetooth and deco calculations | |
343 /// | |
344 // =============================================================================== | |
345 int main(void) | |
346 { | |
347 uint32_t pLayerInvisible; | |
348 uint16_t totalDiveCounterFound; | |
116 | 349 #ifdef DEBUG_RUNTIME |
350 RTC_TimeTypeDef Stime; | |
351 uint8_t measurementindex = 0; | |
352 uint8_t lastsecond = 0xFF; | |
353 #endif | |
354 | |
38 | 355 |
356 set_globalState( StBoot0 ); | |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
357 LastButtonPressed = 0; |
38 | 358 |
359 HAL_Init(); | |
360 HAL_NVIC_SetPriorityGrouping( NVIC_PRIORITYGROUP_2 ); | |
361 | |
362 SystemClock_Config(); | |
363 | |
364 MX_GPIO_Init(); | |
365 // MX_SmallCPU_NO_Reset_Helper(); //161116 hw | |
366 MX_SPI_Init(); | |
367 MX_UART_Init(); | |
368 SDRAM_Config(); | |
369 HAL_Delay( 100 ); | |
116 | 370 |
371 stateRealGetPointerWrite()->lastKnownBatteryPercentage = 0; // damit das nicht in settings kopiert wird. | |
372 set_settings_to_Standard(); | |
373 mod_settings_for_first_start_with_empty_ext_flash(); | |
374 ext_flash_read_settings(); | |
375 if( newFirmwareVersionCheckViaSettings() ) // test for old firmware version in loaded settings | |
376 { | |
377 wasFirmwareUpdateCheckBattery = 1; | |
378 set_settings_button_to_standard_with_individual_buttonBalance(); // will adapt individual values | |
379 } | |
380 //settingsGetPointer()->bluetoothActive = 0; /* MX_Bluetooth_PowerOff(); unnecessary as part of MX_GPIO_Init() */ | |
381 //settingsGetPointer()->compassBearing = 0; | |
382 set_new_settings_missing_in_ext_flash(); // inlcudes update of firmware version 161121 | |
383 | |
38 | 384 GFX_init( &pLayerInvisible ); |
385 | |
386 TIM_init(); | |
387 TIM_BACKLIGHT_init(); | |
388 | |
389 /* | |
390 GFX_helper_font_memory_list(&FontT24); | |
391 GFX_helper_font_memory_list(&FontT42); | |
392 GFX_helper_font_memory_list(&FontT48); | |
393 GFX_helper_font_memory_list(&FontT54); | |
394 GFX_helper_font_memory_list(&FontT84); | |
395 GFX_helper_font_memory_list(&FontT105); | |
396 GFX_helper_font_memory_list(&FontT144); | |
397 */ | |
398 | |
116 | 399 |
38 | 400 |
401 // new 170508: bluetooth on at start | |
402 settingsGetPointer()->bluetoothActive = 1; | |
403 MX_Bluetooth_PowerOn(); | |
404 | |
405 // Haase Geburtstag: | |
406 // settingsGetPointer()->serialHigh = (3012 / 256); | |
407 // settingsGetPointer()->serialLow = (3012 & 0xFF); | |
408 | |
409 // settingsGetPointer()->showDebugInfo = 1; | |
410 | |
411 /* | |
412 if( (hardwareDataGetPointer()->primarySerial == 20+18) | |
413 || (hardwareDataGetPointer()->primarySerial == 20+25) | |
414 || (hardwareDataGetPointer()->primarySerial == 20+27)) | |
415 { | |
416 MX_Bluetooth_PowerOn(); | |
417 tComm_Set_Bluetooth_Name(1); | |
418 } | |
419 */ | |
420 errorsInSettings = check_and_correct_settings(); | |
421 createDiveSettings(); | |
422 | |
423 #ifdef QUICK_SLEEP | |
424 settingsGetPointer()->timeoutSurfacemode = 20; | |
425 #else | |
426 settingsGetPointer()->timeoutSurfacemode = 120; | |
427 #endif | |
428 | |
429 #ifdef DEMOMODE | |
430 demoConfigureSettings(); | |
431 TIM_DEMO_init(); | |
432 #endif | |
433 | |
434 // ----------------------------- | |
435 | |
436 display_power_on__1_of_2__pre_RGB(); | |
437 GFX_LTDC_Init(); | |
438 GFX_LTDC_LayerDefaultInit( TOP_LAYER, pLayerInvisible ); | |
439 GFX_LTDC_LayerDefaultInit( BACKGRD_LAYER, pLayerInvisible ); | |
440 GFX_SetFramesTopBottom( pLayerInvisible, pLayerInvisible, 480 ); | |
441 HAL_Delay( 20 ); | |
442 display_power_on__2_of_2__post_RGB(); | |
443 GFX_use_colorscheme( settingsGetPointer()->tX_colorscheme ); | |
444 | |
445 // ----------------------------- | |
446 tHome_init(); | |
447 tI_init(); | |
448 tM_init(); | |
449 tMenuEdit_init(); | |
450 tInfoLog_init(); | |
451 tComm_init(); | |
452 DataEX_init(); | |
453 setButtonResponsiveness( settingsGetPointer()->ButtonResponsiveness ); | |
454 set_globalState_tHome(); | |
455 | |
456 GFX_start_VSYNC_IRQ(); | |
457 tCCR_init(); | |
458 | |
459 GFX_logoAutoOff(); | |
460 EXTILine_Buttons_Config(); | |
461 | |
462 ext_flash_repair_dive_log(); | |
463 //ext_flash_repair_SPECIAL_dive_numbers_starting_count_with(1); | |
464 | |
465 totalDiveCounterFound = logbook_lastDive_diveNumber(); | |
466 if( settingsGetPointer()->totalDiveCounter < totalDiveCounterFound ) | |
467 settingsGetPointer()->totalDiveCounter = totalDiveCounterFound; | |
468 | |
469 if( settingsGetPointer()->debugModeOnStart ) | |
470 { | |
471 settingsGetPointer()->debugModeOnStart = 0; | |
472 ext_flash_write_settings(); | |
473 setDebugMode(); | |
474 openInfo( StIDEBUG ); | |
475 } | |
476 | |
477 /* @brief main LOOP | |
478 * | |
479 * this is executed while no IRQ interrupts it | |
480 * - deco calculation | |
481 * - bluetooth | |
482 * and resetToFirmwareUpdate() | |
483 * because tComm_control() does not exit before disconnection | |
484 */ | |
485 while( 1 ) | |
486 { | |
487 if( bootToBootloader ) | |
488 resetToFirmwareUpdate(); | |
489 | |
490 // this will allways reset after RTE reset -> no good! | |
491 // if(DataEX_was_power_on()) // new to allow for update after RTE update | |
492 // resetToFirmwareUpdate(); | |
493 | |
494 tCCR_control(); | |
495 if( tComm_control() )// will stop while loop if tComm Mode started until exit from UART | |
496 { | |
497 createDiveSettings(); | |
498 updateMenu(); | |
499 ext_flash_write_settings(); | |
500 } | |
501 deco_loop(); | |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
502 TriggerButtonAction(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
503 if(DoDisplayRefresh) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
504 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
505 DoDisplayRefresh = 0; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
506 RefreshDisplay(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
507 } |
116 | 508 |
509 #ifdef DEBUG_RUNTIME | |
510 translateTime(stateUsed->lifeData.timeBinaryFormat, &Stime); | |
511 if(lastsecond == 0xFF) | |
512 { | |
513 measurementindex = 0; | |
514 loopcnt[measurementindex] = 0; | |
515 lastsecond = Stime.Seconds; | |
516 } | |
517 loopcnt[measurementindex]++; | |
518 | |
519 if(lastsecond != Stime.Seconds) | |
520 { | |
521 measurementindex++; | |
522 if (measurementindex == MEASURECNT) measurementindex = 0; | |
523 loopcnt[measurementindex] = 0; | |
524 lastsecond = Stime.Seconds; | |
525 if(measurementindex +1 < MEASURECNT) loopcnt[measurementindex +1] = 0xffff; /* helps to identify the latest value */ | |
526 } | |
527 #endif | |
528 | |
38 | 529 } |
530 } | |
531 | |
532 // =============================================================================== | |
533 // timer IRQ | |
534 /// @brief this is called periodically | |
535 /// | |
536 /// - refresh screen (the actual change is done in the VSYNC IRQ) | |
537 /// - start data transfer with RTE / small CPU (DateEX....) | |
538 /// - update logbook | |
539 /// - timeouts | |
540 /// .... | |
541 /// | |
542 /// all this in three steps / switch() routines in a given order | |
543 /// as the previous switch() might influence the next functions | |
544 /// to be called | |
545 /// | |
546 // =============================================================================== | |
547 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |
548 { | |
549 #ifdef DEMOMODE | |
550 if(htim->Instance==TIM7) | |
551 { | |
552 HAL_GPIO_EXTI_Callback(demoGetCommand()); | |
553 return; | |
554 } | |
555 #endif | |
556 static uint8_t last_base; | |
557 | |
558 SStateList status; | |
559 uint32_t timeout_in_seconds; | |
560 uint32_t timeout_limit_Surface_in_seconds; | |
561 | |
562 _Bool InDiveMode = 0; | |
563 _Bool modeChange = 0; // to exit from menu and logbook | |
564 | |
565 if(stateUsed->mode == MODE_DIVE) | |
566 InDiveMode = 1; | |
567 else | |
568 InDiveMode = 0; | |
569 | |
206 | 570 EvaluateButton(); |
571 | |
38 | 572 if(returnFromCommCleanUpRequest) |
573 { | |
574 tComm_exit(); | |
575 returnFromCommCleanUpRequest = 0; | |
576 } | |
577 | |
578 get_globalStateList(&status); | |
579 | |
580 switch(status.base) | |
581 { | |
582 case BaseHome: | |
583 case BaseMenu: | |
584 case BaseInfo: | |
585 updateSetpointStateUsed(); | |
132
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
586 |
38 | 587 DateEx_copy_to_dataOut(); |
588 DataEX_copy_to_LifeData(&modeChange); | |
589 //foto session :-) stateRealGetPointerWrite()->lifeData.battery_charge = 99; | |
590 //foto session :-) stateSimGetPointerWrite()->lifeData.battery_charge = 99; | |
591 DataEX_copy_to_deco(); | |
132
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
592 DataEX_call(); |
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
593 |
38 | 594 if(stateUsed == stateSimGetPointer()) |
595 simulation_UpdateLifeData(1); | |
596 check_warning(); | |
597 if(stateUsed == stateRealGetPointer()) | |
598 logbook_InitAndWrite(); | |
599 updateMiniLiveLogbook(1); | |
600 timer_UpdateSecond(1); | |
132
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
601 base_tempLightLevel = TIM_BACKLIGHT_adjust(); |
38 | 602 tCCR_tick(); |
603 tHome_tick(); | |
604 if(status.base == BaseHome) | |
605 tMenuEdit_writeSettingsToFlash(); // takes 900 ms!! | |
606 break; | |
607 case BaseStop: | |
608 DateEx_copy_to_dataOut(); | |
609 DataEX_call(); | |
610 DataEX_control_connection_while_asking_for_sleep(); | |
611 break; | |
612 default: | |
613 case BaseComm: | |
614 if(get_globalState() == StUART_RTECONNECT) | |
615 { | |
616 DateEx_copy_to_dataOut(); | |
617 DataEX_call(); | |
618 DataEX_copy_to_LifeData(0); | |
619 } | |
620 break; | |
621 } | |
622 | |
623 /* timeout control */ | |
624 if(modeChange) ///< from RTE, set in data_exchange_main.c | |
625 time_without_button_pressed_deciseconds = (settingsGetPointer()->timeoutSurfacemode / 4) * 3; | |
626 if(status.base != last_base) | |
627 time_without_button_pressed_deciseconds = 0; | |
628 last_base = status.base; | |
629 timeout_in_seconds = time_without_button_pressed_deciseconds / 10; | |
630 time_without_button_pressed_deciseconds += 1; | |
631 if(modeChange || (timeout_in_seconds != time_without_button_pressed_deciseconds / 10)) | |
632 { | |
633 #ifdef NO_TIMEOUT | |
634 timeout_in_seconds = 0; | |
635 #else | |
636 timeout_in_seconds += 1; | |
637 #endif | |
638 | |
639 if(InDiveMode) | |
640 { | |
641 switch(status.base) | |
642 { | |
643 case BaseHome: | |
644 if((status.line != 0) && (timeout_in_seconds >= settingsGetPointer()->timeoutEnterButtonSelectDive)) | |
645 { | |
646 set_globalState(StD); | |
647 timeout_in_seconds = 0; | |
648 } | |
649 break; | |
104 | 650 |
38 | 651 case BaseMenu: |
652 if((status.line == 0) && ((timeout_in_seconds >= settingsGetPointer()->timeoutMenuDive) || modeChange)) | |
653 { | |
654 exitMenu(); | |
655 timeout_in_seconds = 0; | |
656 } | |
657 if((status.line != 0) && ((timeout_in_seconds >= settingsGetPointer()->timeoutMenuEdit) || modeChange)) | |
658 { | |
659 exitMenuEdit_to_Home(); | |
660 timeout_in_seconds = 0; | |
661 } | |
662 break; | |
663 /* why was this here? 160317 hw | |
664 case BaseInfo: | |
665 if(status.page == InfoPageLogList) | |
666 { | |
667 exitLog(); | |
668 } | |
669 else | |
670 if(status.page == InfoPageLogShow) | |
671 { | |
672 show_logbook_exit(); | |
673 exitLog(); | |
674 } | |
675 else | |
676 if(status.page != InfoPageCompass) | |
677 { | |
678 exitInfo(); | |
679 } | |
680 timeout_in_seconds = 0; | |
681 break; | |
682 */ | |
683 default: | |
684 break; | |
685 } | |
686 } | |
687 else /* surface mode */ | |
688 { | |
689 switch(status.base) | |
690 { | |
691 case BaseHome: | |
692 // added hw 161027 | |
693 if(!(stateRealGetPointer()->warnings.lowBattery) && (stateRealGetPointer()->lifeData.battery_charge > 9)) | |
694 { | |
695 stateRealGetPointerWrite()->lastKnownBatteryPercentage = stateRealGetPointer()->lifeData.battery_charge; | |
696 } | |
697 else if((wasFirmwareUpdateCheckBattery) && (timeout_in_seconds > 3)) | |
698 { | |
699 wasFirmwareUpdateCheckBattery = 0; | |
700 setButtonResponsiveness(settingsGetPointer()->ButtonResponsiveness); // added 170306 | |
701 if( (settingsGetPointer()->lastKnownBatteryPercentage > 0) | |
702 && (settingsGetPointer()->lastKnownBatteryPercentage <= 100) | |
703 && (stateRealGetPointer()->warnings.lowBattery)) | |
704 { | |
705 setBatteryPercentage(settingsGetPointer()->lastKnownBatteryPercentage); | |
706 } | |
707 } | |
708 // stuff before and new @161121 CCR-sensor limit 10 minutes | |
709 if((settingsGetPointer()->dive_mode == DIVEMODE_CCR) && (settingsGetPointer()->CCR_Mode == CCRMODE_Sensors)) | |
710 { | |
711 timeout_limit_Surface_in_seconds = settingsGetPointer()->timeoutSurfacemodeWithSensors; | |
712 } | |
713 else | |
714 { | |
715 timeout_limit_Surface_in_seconds = settingsGetPointer()->timeoutSurfacemode; | |
716 } | |
717 if(timeout_in_seconds >= timeout_limit_Surface_in_seconds) | |
718 { | |
719 gotoSleep(); | |
720 } | |
721 break; | |
722 case BaseMenu: | |
723 if((status.line == 0) && ((timeout_in_seconds >= settingsGetPointer()->timeoutMenuSurface) || modeChange)) | |
724 { | |
725 exitMenu(); | |
726 timeout_in_seconds = 0; | |
727 } | |
728 if((status.line != 0) && ((timeout_in_seconds >= settingsGetPointer()->timeoutMenuEdit) || modeChange)) | |
729 { | |
730 if((status.page != (uint8_t)((StMPLAN >> 24) & 0x0F)) || (timeout_in_seconds >= 10*(settingsGetPointer()->timeoutMenuEdit))) | |
731 { | |
732 exitMenuEdit_to_Home(); | |
733 timeout_in_seconds = 0; | |
734 } | |
735 } | |
736 break; | |
737 | |
738 case BaseInfo: | |
739 if((timeout_in_seconds >= settingsGetPointer()->timeoutInfo) || modeChange) | |
740 { | |
741 if(status.page == InfoPageLogList) | |
742 { | |
743 exitLog(); | |
744 timeout_in_seconds = 0; | |
745 } | |
746 else | |
747 if(status.page == InfoPageLogShow) | |
748 { | |
749 show_logbook_exit(); | |
750 exitLog(); | |
751 timeout_in_seconds = 0; | |
752 } | |
753 else | |
754 if(status.page != InfoPageCompass) | |
755 { | |
756 exitInfo(); | |
757 timeout_in_seconds = 0; | |
758 } | |
759 } | |
760 break; | |
761 default: | |
762 break; | |
763 } | |
764 } | |
765 } | |
766 | |
767 get_globalStateList(&status); | |
768 | |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
769 if(status.base == BaseComm) /* main loop not serviced in com mode */ |
38 | 770 { |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
771 tComm_refresh(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
772 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
773 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
774 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
775 DoDisplayRefresh = 1; |
38 | 776 } |
777 } | |
778 | |
779 | |
780 /* button and VSYNC IRQ | |
781 * | |
782 * VSYNC will switch foreground and background picture | |
783 * if demanded. see GFX_change_LTDC() | |
784 * | |
785 */ | |
786 // =============================================================================== | |
787 // HAL_GPIO_EXTI_Callback | |
788 /// @brief button and VSYNC IRQ | |
789 /// | |
790 /// VSYNC will switch foreground and background picture if demanded - | |
791 /// see GFX_change_LTDC() | |
792 /// | |
793 // =============================================================================== | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
794 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
795 if (!GPIO_Pin) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
796 return; |
38 | 797 |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
798 if (GPIO_Pin == VSYNC_IRQ_PIN) // rechts, unten |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
799 { |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
800 GFX_change_LTDC(); |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
801 housekeepingFrame(); |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
802 /* |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
803 #ifdef DEMOMODE |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
804 static uint8_t countCall = 0; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
805 if(countCall++ < 10) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
806 return; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
807 countCall = 0; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
808 uint8_t buttonAction = demoGetCommand(); |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
809 if(buttonAction) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
810 GPIO_Pin = buttonAction; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
811 else |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
812 #endif |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
813 */ |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
814 return; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
815 } |
115 | 816 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
817 LastButtonPressed = GPIO_Pin; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
818 LastButtonPressedTick = HAL_GetTick(); |
38 | 819 |
820 #ifdef DEMOMODE | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
821 uint8_t demoMachineCall = 0; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
822 if(GPIO_Pin & 0x80) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
823 { |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
824 demoMachineCall = 1; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
825 GPIO_Pin &= 0x7F; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
826 } |
38 | 827 #endif |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
828 } |
38 | 829 |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
830 static void RefreshDisplay() |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
831 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
832 SStateList status; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
833 get_globalStateList(&status); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
834 switch(status.base) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
835 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
836 case BaseHome: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
837 tHome_refresh(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
838 tM_check_content(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
839 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
840 case BaseMenu: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
841 tM_refresh_live_content(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
842 tMenuEdit_refresh_live_content(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
843 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
844 case BaseInfo: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
845 tInfo_refresh(); ///< only compass at the moment 23.Feb.2015 hw |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
846 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
847 case BaseComm: /* refresh already done in tim callback */ |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
848 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
849 default: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
850 if(get_globalState() == StStop) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
851 tHome_sleepmode_fun(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
852 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
853 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
854 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
855 static uint8_t ButtonAction = ACTION_END; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
856 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
857 static void StoreButtonAction(uint8_t action) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
858 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
859 ButtonAction = action; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
860 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
861 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
862 static void TriggerButtonAction() |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
863 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
864 uint8_t action = ButtonAction; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
865 SStateList status; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
866 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
867 if(ButtonAction != ACTION_END) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
868 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
869 get_globalStateList(&status); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
870 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
871 if (action == ACTION_BUTTON_CUSTOM) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
872 GFX_screenshot(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
873 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
874 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
875 switch (status.base) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
876 case BaseStop: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
877 if (action == ACTION_BUTTON_BACK) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
878 resetToFirmwareUpdate(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
879 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
880 case BaseComm: /* already handled in tim callback */ |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
881 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
882 case BaseHome: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
883 if (action == ACTION_BUTTON_NEXT) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
884 if (status.page == PageSurface) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
885 openMenu(1); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
886 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
887 tHomeDiveMenuControl(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
888 } else if (action == ACTION_BUTTON_BACK) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
889 if (get_globalState() == StS) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
890 openInfo(StILOGLIST); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
891 else if ((status.page == PageDive) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
892 && (settingsGetPointer()->design < 7)) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
893 settingsGetPointer()->design = 7; // auto switch to 9 if necessary |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
894 } else if ((status.page == PageDive) && (status.line != 0)) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
895 if (settingsGetPointer()->extraDisplay == EXTRADISPLAY_BIGFONT) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
896 settingsGetPointer()->design = 3; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
897 else if (settingsGetPointer()->extraDisplay |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
898 == EXTRADISPLAY_DECOGAME) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
899 settingsGetPointer()->design = 4; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
900 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
901 set_globalState(StD); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
902 } else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
903 tHome_change_field_button_pressed(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
904 } else if (action == ACTION_BUTTON_ENTER) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
905 if ((status.page == PageDive) && (status.line == 0)) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
906 tHome_change_customview_button_pressed(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
907 else if (status.page == PageSurface) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
908 tHome_change_customview_button_pressed(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
909 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
910 tHomeDiveMenuControl(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
911 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
912 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
913 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
914 case BaseMenu: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
915 if (status.line == 0) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
916 sendActionToMenu(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
917 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
918 sendActionToMenuEdit(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
919 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
920 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
921 case BaseInfo: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
922 if (status.page == InfoPageLogList) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
923 sendActionToInfoLogList(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
924 else if (status.page == InfoPageLogShow) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
925 sendActionToInfoLogShow(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
926 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
927 sendActionToInfo(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
928 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
929 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
930 default: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
931 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
932 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
933 ButtonAction = ACTION_END; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
934 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
935 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
936 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
937 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
938 void EvaluateButton() |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
939 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
940 uint8_t action = 0; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
941 SStateList status; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
942 SSettings* pSettings; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
943 pSettings = settingsGetPointer(); |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
944 |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
945 if (GFX_logoStatus() != 0) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
946 return; |
38 | 947 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
948 if ((LastButtonPressed != INVALID_BUTTON) && (time_elapsed_ms(LastButtonPressedTick, HAL_GetTick())) > 50) |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
949 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
950 if (LastButtonPressed == BUTTON_BACK_PIN) { // links |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
951 if (HAL_GPIO_ReadPin(BUTTON_BACK_GPIO_PORT, BUTTON_BACK_PIN) == 1) { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
952 action = ACTION_BUTTON_BACK; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
953 } |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
954 } |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
955 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
956 else if (LastButtonPressed == BUTTON_ENTER_PIN) { // mitte |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
957 if (HAL_GPIO_ReadPin(BUTTON_ENTER_GPIO_PORT, BUTTON_ENTER_PIN) == 1) { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
958 action = ACTION_BUTTON_ENTER; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
959 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
960 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
961 |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
962 else if (LastButtonPressed == BUTTON_NEXT_PIN) { // rechts |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
963 if (HAL_GPIO_ReadPin(BUTTON_NEXT_GPIO_PORT, BUTTON_NEXT_PIN) == 1) { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
964 action = ACTION_BUTTON_NEXT; |
108 | 965 } |
966 } | |
38 | 967 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
968 if(action != 0) |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
969 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
970 time_without_button_pressed_deciseconds = 0; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
971 if(pSettings->FlipDisplay) /* switch action resulting from pressed button */ |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
972 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
973 if (action == ACTION_BUTTON_BACK) |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
974 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
975 action = ACTION_BUTTON_NEXT; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
976 } |
158 | 977 else |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
978 { |
158 | 979 if (action == ACTION_BUTTON_NEXT) |
980 { | |
981 action = ACTION_BUTTON_BACK; | |
982 } | |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
983 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
984 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
985 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
986 |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
987 #ifdef BUTTON_CUSTOM_PIN |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
988 else |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
989 if(LastButtonPressed == BUTTON_CUSTOM_PIN) // extra |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
990 action = ACTION_BUTTON_CUSTOM; |
38 | 991 #endif |
992 | |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
993 #ifdef DEMOMODE // user pressed button ? |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
994 if((!demoMachineCall) && demoModeActive()) |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
995 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
996 demoSendCommand(action); |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
997 return; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
998 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
999 #endif |
38 | 1000 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1001 get_globalStateList(&status); |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1002 if(status.base == BaseComm) /* main loop is not serviced in comm mode => react immediately */ |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1003 { |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1004 if (action == ACTION_BUTTON_BACK) { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1005 settingsGetPointer()->bluetoothActive = 0; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1006 MX_Bluetooth_PowerOff(); |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1007 tComm_exit(); |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1008 } |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1009 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1010 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1011 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1012 StoreButtonAction(action); /* Handle action in main loop */ |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1013 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1014 LastButtonPressed = INVALID_BUTTON; |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1015 } |
38 | 1016 } |
1017 | |
1018 void gotoSleep(void) | |
1019 { | |
1020 /* not at the moment of testing */ | |
1021 // ext_flash_erase_firmware_if_not_empty(); | |
1022 GFX_logoAutoOff(); | |
1023 set_globalState(StStop); | |
1024 } | |
1025 | |
1026 | |
1027 // ----------------------------- | |
1028 | |
1029 uint8_t get_globalMode(void) | |
1030 { | |
1031 return globalModeID; | |
1032 } | |
1033 | |
1034 | |
1035 void set_globalMode(uint8_t newMode) | |
1036 { | |
1037 if((newMode != DIVEMODE) && (newMode != SURFMODE)) | |
1038 return; | |
1039 | |
1040 globalModeID = newMode; | |
1041 } | |
1042 | |
1043 | |
1044 uint32_t get_globalState(void) | |
1045 { | |
1046 return globalStateID; | |
1047 } | |
1048 | |
1049 | |
1050 void get_globalStateList(SStateList *output) | |
1051 { | |
1052 output->base = (uint8_t)((globalStateID >> 28) & 0x0F); | |
1053 output->page = (uint8_t)((globalStateID >> 24) & 0x0F); | |
1054 output->line = (uint8_t)((globalStateID >> 16) & 0xFF); | |
1055 output->field = (uint8_t)((globalStateID >> 8) & 0xFF); | |
1056 output->mode = (uint8_t)((globalStateID ) & 0xFF); | |
1057 } | |
1058 | |
1059 | |
1060 void get_idSpecificStateList(uint32_t id, SStateList *output) | |
1061 { | |
1062 output->base = (uint8_t)((id >> 28) & 0x0F); | |
1063 output->page = (uint8_t)((id >> 24) & 0x0F); | |
1064 output->line = (uint8_t)((id >> 16) & 0xFF); | |
1065 output->field = (uint8_t)((id >> 8) & 0xFF); | |
1066 output->mode = (uint8_t)((id ) & 0xFF); | |
1067 } | |
1068 | |
1069 | |
1070 void set_globalState_Menu_Page(uint8_t page) | |
1071 { | |
1072 globalStateID = ((BaseMenu << 28) + (page << 24)); | |
1073 } | |
1074 | |
1075 void set_globalState_Log_Page(uint8_t pageIsLine) | |
1076 { | |
1077 globalStateID = StILOGLIST + (pageIsLine << 16); | |
1078 } | |
1079 | |
1080 | |
1081 void set_globalState_Menu_Line(uint8_t line) | |
1082 { | |
1083 globalStateID = ((globalStateID & MaskLineFieldDigit) + (line << 16)); | |
1084 } | |
1085 | |
1086 | |
1087 void set_globalState(uint32_t newID) | |
1088 { | |
1089 globalStateID = newID; | |
1090 } | |
1091 | |
1092 void set_returnFromComm(void) | |
1093 { | |
1094 returnFromCommCleanUpRequest = 1; | |
1095 } | |
1096 | |
1097 uint8_t font_update_required(void) | |
1098 { | |
1099 uint8_t *fontVersionHigh; | |
1100 uint8_t *fontVersionLow; | |
1101 | |
1102 fontVersionHigh = (uint8_t *)0x08132000; | |
1103 fontVersionLow = (uint8_t *)0x08132001; | |
1104 | |
1105 if(FONTminimum_required_high() < *fontVersionHigh) | |
1106 return 0; | |
1107 | |
1108 if((FONTminimum_required_high() == *fontVersionHigh) && (FONTminimum_required_low() <= *fontVersionLow)) | |
1109 return 0; | |
1110 | |
1111 return 1; | |
1112 } | |
1113 | |
1114 | |
132
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
1115 __attribute__((optimize("O0"))) void delayMicros(uint32_t micros) |
38 | 1116 { |
1117 micros = micros * (168/4) - 10; | |
1118 while(micros--); | |
1119 } | |
1120 | |
1121 | |
1122 void get_RTC_DateTime(RTC_DateTypeDef * sdatestructureget, RTC_TimeTypeDef * stimestructureget) | |
1123 { | |
1124 /* Get the RTC current Time */ | |
1125 if(sdatestructureget) | |
1126 HAL_RTC_GetTime(&RtcHandle, stimestructureget, FORMAT_BIN); | |
1127 /* Get the RTC current Date */ | |
1128 if(stimestructureget) | |
1129 HAL_RTC_GetDate(&RtcHandle, sdatestructureget, FORMAT_BIN); | |
1130 } | |
1131 | |
1132 | |
1133 void set_RTC_DateTime(RTC_DateTypeDef * sdatestructure, RTC_TimeTypeDef * stimestructure) | |
1134 { | |
1135 if(sdatestructure) | |
1136 if(HAL_RTC_SetDate(&RtcHandle,sdatestructure,FORMAT_BCD) != HAL_OK) | |
1137 { | |
1138 /* Initialization Error */ | |
1139 Error_Handler(); | |
1140 } | |
1141 | |
1142 if(stimestructure) | |
1143 if(HAL_RTC_SetTime(&RtcHandle,stimestructure,FORMAT_BCD) != HAL_OK) | |
1144 { | |
1145 /* Initialization Error */ | |
1146 Error_Handler(); | |
1147 } | |
1148 } | |
1149 | |
1150 static void TIM_init(void) | |
1151 { | |
1152 uint16_t uwPrescalerValue = 0; | |
1153 | |
1154 uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 10000) - 1; | |
1155 | |
1156 /* Set TIMx instance */ | |
1157 TimHandle.Instance = TIMx; | |
1158 | |
1159 /* Initialize TIM3 peripheral as follows: | |
1160 + Period = 10000 - 1 | |
1161 + Prescaler = ((SystemCoreClock/2)/10000) - 1 | |
1162 + ClockDivision = 0 | |
1163 + Counter direction = Up | |
1164 */ | |
1165 TimHandle.Init.Period = 1000 - 1; | |
1166 TimHandle.Init.Prescaler = uwPrescalerValue; | |
1167 TimHandle.Init.ClockDivision = 0; | |
1168 TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; | |
1169 if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK) | |
1170 { | |
1171 /* Initialization Error */ | |
1172 Error_Handler(); | |
1173 } | |
1174 | |
1175 /*##-2- Start the TIM Base generation in interrupt mode ####################*/ | |
1176 /* Start Channel1 */ | |
1177 if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK) | |
1178 { | |
1179 /* Starting Error */ | |
1180 Error_Handler(); | |
1181 } | |
1182 } | |
1183 | |
1184 #ifdef DEMOMODE | |
1185 static void TIM_DEMO_init(void) | |
1186 { | |
1187 uint16_t uwPrescalerValue = 0; | |
1188 | |
1189 uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 10000) - 1; | |
1190 | |
1191 /* Set TIMx instance */ | |
1192 TimDemoHandle.Instance = TIM7; | |
1193 | |
1194 /* Initialize TIM3 peripheral as follows: | |
1195 + Period = 10000 - 1 | |
1196 + Prescaler = ((SystemCoreClock/2)/10000) - 1 | |
1197 + ClockDivision = 0 | |
1198 + Counter direction = Up | |
1199 */ | |
1200 TimDemoHandle.Init.Period = 1000 - 1; | |
1201 TimDemoHandle.Init.Prescaler = uwPrescalerValue; | |
1202 TimDemoHandle.Init.ClockDivision = 0; | |
1203 TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; | |
1204 if(HAL_TIM_Base_Init(&TimDemoHandle) != HAL_OK) | |
1205 { | |
1206 /* Initialization Error */ | |
1207 Error_Handler(); | |
1208 } | |
1209 | |
1210 /*##-2- Start the TIM Base generation in interrupt mode ####################*/ | |
1211 /* Start Channel1 */ | |
1212 if(HAL_TIM_Base_Start_IT(&TimDemoHandle) != HAL_OK) | |
1213 { | |
1214 /* Starting Error */ | |
1215 Error_Handler(); | |
1216 } | |
1217 } | |
1218 #endif | |
1219 | |
1220 | |
1221 | |
1222 #ifndef TIM_BACKLIGHT | |
1223 | |
1224 static uint32_t TIM_BACKLIGHT_adjust(void) | |
1225 { | |
1226 return 0; | |
1227 } | |
1228 | |
1229 static void TIM_BACKLIGHT_init(void) | |
1230 { | |
1231 } | |
1232 #else | |
1233 static uint32_t TIM_BACKLIGHT_adjust(void) | |
1234 { | |
1235 static uint32_t levelActual = 12000; | |
1236 static uint8_t brightnessModeLast = 0; | |
1237 // static _Bool wasLostConnection = 0; | |
1238 | |
1239 uint32_t levelAmbient; | |
1240 uint32_t levelMax; | |
1241 uint32_t levelMin; | |
1242 uint32_t levelUpStep_100ms = 200; | |
1243 uint32_t levelDnStep_100ms = 20; | |
1244 | |
1245 TIM_OC_InitTypeDef sConfig; | |
1246 sConfig.OCMode = TIM_OCMODE_PWM1; | |
1247 sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; | |
1248 sConfig.OCFastMode = TIM_OCFAST_DISABLE; | |
1249 | |
1250 const SDiveState * pStateReal = stateRealGetPointer(); | |
1251 | |
1252 | |
1253 // if(pStateReal->data_old__lost_connection_to_slave) | |
1254 // { | |
1255 // changed 160613 from 6000 to 12000 | |
1256 // removed hw 161209 | |
1257 // levelAmbient = 12000; | |
1258 // levelActual = 12000; | |
1259 // wasLostConnection = 1; | |
1260 // } | |
1261 // else | |
1262 // { | |
1263 SSettings *pSettings = settingsGetPointer(); | |
1264 /* 300 - 4000 */ | |
1265 /* important levelAmbient 300 - 1200 */ | |
1266 levelAmbient = 10 * pStateReal->lifeData.ambient_light_level; | |
1267 | |
1268 switch( pSettings->brightness) | |
1269 { | |
1270 case 0: /* Cave */ | |
1271 levelMax = 3000;/* max 25 % (x2) */ | |
1272 levelMin = 1500; | |
1273 break; | |
1274 case 1: /* Eco */ | |
1275 levelMax = 6000;/* max 50 % (x2) */ | |
1276 levelMin = 3000; | |
1277 break; | |
1278 case 2: /* Std */ | |
1279 levelAmbient += 1000; | |
1280 levelMax = 9000; | |
1281 levelMin = 4500; | |
1282 levelUpStep_100ms += levelUpStep_100ms/2; // 4500 instead of 3000 | |
1283 levelDnStep_100ms += levelDnStep_100ms/2; | |
1284 break; | |
1285 case 3: /* High */ | |
1286 default: | |
1287 levelAmbient += 3000; | |
1288 levelMax = 12000; /* max 100% (x2) */ | |
1289 levelMin = 6000; | |
1290 levelUpStep_100ms += levelUpStep_100ms; // 6000 instead of 3000 | |
1291 levelDnStep_100ms += levelDnStep_100ms; | |
1292 break; | |
1293 case 4: /* New Max */ | |
1294 levelAmbient = 12000; | |
1295 levelMax = 12000; /* max 100% (x2) */ | |
1296 levelMin = 12000; | |
1297 levelUpStep_100ms += 12000; | |
1298 levelDnStep_100ms += 0; | |
1299 break; | |
1300 } | |
1301 | |
1302 if((pSettings->brightness != brightnessModeLast))// || wasLostConnection) | |
1303 { | |
1304 levelActual = levelAmbient; | |
1305 brightnessModeLast = pSettings->brightness; | |
1306 // wasLostConnection = 0; | |
1307 } | |
1308 // } | |
1309 | |
1310 if(levelAmbient > levelActual) | |
1311 levelActual += levelUpStep_100ms; | |
1312 else | |
1313 if((levelAmbient < levelActual) && (levelActual > levelMin) && (levelActual > levelDnStep_100ms)) | |
1314 levelActual -= levelDnStep_100ms; | |
1315 | |
1316 if(levelActual > levelMax) | |
1317 levelActual = levelMax; | |
1318 else | |
1319 if(levelActual < levelMin) | |
1320 levelActual = levelMin; | |
1321 | |
1322 // sConfig.Pulse = levelActual / 20; | |
1323 sConfig.Pulse = (levelMin + ((levelMax - levelMin)/2)) / 20; // added 170306 | |
1324 | |
1325 /* xx - 600 */ | |
1326 if(sConfig.Pulse > 600) | |
1327 sConfig.Pulse = 600; | |
1328 else | |
1329 if(sConfig.Pulse < 100) | |
1330 sConfig.Pulse = 100; | |
1331 | |
1332 HAL_TIM_PWM_ConfigChannel(&TimBacklightHandle, &sConfig, TIM_BACKLIGHT_CHANNEL); | |
1333 HAL_TIM_PWM_Start(&TimBacklightHandle, TIM_BACKLIGHT_CHANNEL); | |
1334 | |
1335 return levelActual; | |
1336 } | |
1337 | |
1338 static void TIM_BACKLIGHT_init(void) | |
1339 { | |
1340 uint32_t uwPrescalerValue = 0; | |
1341 TIM_OC_InitTypeDef sConfig; | |
1342 | |
1343 uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 18000000) - 1; | |
1344 | |
1345 TimBacklightHandle.Instance = TIM_BACKLIGHT; | |
1346 | |
1347 /* Initialize TIM3 peripheral as follows: | |
1348 30 kHz | |
1349 */ | |
1350 TimBacklightHandle.Init.Period = 600 - 1; | |
1351 TimBacklightHandle.Init.Prescaler = uwPrescalerValue; | |
1352 TimBacklightHandle.Init.ClockDivision = 0; | |
1353 TimBacklightHandle.Init.CounterMode = TIM_COUNTERMODE_UP; | |
1354 HAL_TIM_PWM_Init(&TimBacklightHandle); | |
1355 | |
1356 sConfig.OCMode = TIM_OCMODE_PWM1; | |
1357 sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; | |
1358 sConfig.OCFastMode = TIM_OCFAST_DISABLE; | |
1359 sConfig.Pulse = 50 * 6; | |
1360 | |
1361 HAL_TIM_PWM_ConfigChannel(&TimBacklightHandle, &sConfig, TIM_BACKLIGHT_CHANNEL); | |
1362 HAL_TIM_PWM_Start(&TimBacklightHandle, TIM_BACKLIGHT_CHANNEL); | |
1363 } | |
1364 #endif | |
1365 | |
1366 | |
1367 static void EXTILine_Buttons_Config(void) | |
1368 { | |
1369 GPIO_InitTypeDef GPIO_InitStructure; | |
1370 | |
1371 BUTTON_ENTER_GPIO_ENABLE(); | |
1372 BUTTON_NEXT_GPIO_ENABLE(); | |
1373 BUTTON_BACK_GPIO_ENABLE(); | |
1374 | |
1375 /* Configure pin as weak PULLUP input */ | |
1376 /* buttons */ | |
1377 GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; | |
1378 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
1379 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
1380 | |
1381 GPIO_InitStructure.Pin = BUTTON_ENTER_PIN; | |
1382 HAL_GPIO_Init(BUTTON_ENTER_GPIO_PORT, &GPIO_InitStructure); | |
1383 | |
1384 GPIO_InitStructure.Pin = BUTTON_NEXT_PIN; | |
1385 HAL_GPIO_Init(BUTTON_NEXT_GPIO_PORT, &GPIO_InitStructure); | |
1386 | |
1387 GPIO_InitStructure.Pin = BUTTON_BACK_PIN; | |
1388 HAL_GPIO_Init(BUTTON_BACK_GPIO_PORT, &GPIO_InitStructure); | |
1389 | |
1390 /* Enable and set EXTI Line0 Interrupt to the lowest priority */ | |
1391 HAL_NVIC_SetPriority(BUTTON_ENTER_EXTI_IRQn, 2, 0); | |
1392 HAL_NVIC_SetPriority(BUTTON_NEXT_EXTI_IRQn, 2, 0); | |
1393 HAL_NVIC_SetPriority(BUTTON_BACK_EXTI_IRQn, 2, 0); | |
1394 HAL_NVIC_EnableIRQ(BUTTON_ENTER_EXTI_IRQn); | |
1395 HAL_NVIC_EnableIRQ(BUTTON_NEXT_EXTI_IRQn); | |
1396 HAL_NVIC_EnableIRQ(BUTTON_BACK_EXTI_IRQn); | |
1397 | |
1398 #ifdef BUTTON_CUSTOM_PIN | |
1399 BUTTON_CUSTOM_GPIO_ENABLE(); | |
1400 GPIO_InitStructure.Pin = BUTTON_CUSTOM_PIN; | |
1401 HAL_GPIO_Init(BUTTON_CUSTOM_GPIO_PORT, &GPIO_InitStructure); | |
1402 HAL_NVIC_SetPriority(BUTTON_CUSTOM_EXTI_IRQn, 2, 0); | |
1403 HAL_NVIC_EnableIRQ(BUTTON_CUSTOM_EXTI_IRQn); | |
1404 #endif | |
1405 } | |
1406 | |
1407 | |
1408 /** | |
1409 * @brief System Clock Configuration | |
1410 * The system Clock is configured as follow : | |
1411 * System Clock source = PLL (HSE) | |
1412 * SYSCLK(Hz) = 180000000 | |
1413 * HCLK(Hz) = 180000000 | |
1414 * AHB Prescaler = 1 | |
1415 * APB1 Prescaler = 4 | |
1416 * APB2 Prescaler = 2 | |
1417 * HSE Frequency(Hz) = 8000000 | |
1418 * PLL_M = 8 | |
1419 * PLL_N = 360 | |
1420 * PLL_P = 2 | |
1421 * PLL_Q = 7 | |
1422 * VDD(V) = 3.3 | |
1423 * Main regulator output voltage = Scale1 mode | |
1424 * Flash Latency(WS) = 5 | |
1425 * The LTDC Clock is configured as follow : | |
1426 * PLLSAIN = 192 | |
1427 * PLLSAIR = 4 | |
1428 * PLLSAIDivR = 8 | |
1429 * @param None | |
1430 * @retval None | |
1431 */ | |
1432 static void SystemClock_Config(void) | |
1433 { | |
1434 | |
1435 /* Enable Power Control clock */ | |
1436 __PWR_CLK_ENABLE(); | |
1437 | |
1438 /* The voltage scaling allows optimizing the power consumption when the device is | |
1439 clocked below the maximum system frequency, to update the voltage scaling value | |
1440 regarding system frequency refer to product datasheet. */ | |
1441 __HAL_PWR_VOLTAGESCALING_CONFIG( PWR_REGULATOR_VOLTAGE_SCALE1 ); | |
1442 | |
1443 /*##-1- System Clock Configuration #########################################*/ | |
1444 /* Enable HighSpeed Oscillator and activate PLL with HSE/HSI as source */ | |
1445 RCC_OscInitTypeDef RCC_OscInitStruct = { 0 }; | |
1446 #ifdef DISC1_BOARD | |
1447 // Use High Speed Internal (HSI) oscillator, running at 16MHz. | |
1448 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; | |
1449 RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |
1450 RCC_OscInitStruct.HSICalibrationValue = 0x10; | |
1451 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; | |
1452 RCC_OscInitStruct.PLL.PLLM = 16; // HSI/16 is 1Mhz. | |
1453 #else | |
1454 // Use High Speed External oscillator, running at 8MHz | |
1455 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; | |
1456 RCC_OscInitStruct.HSEState = RCC_HSE_ON; | |
1457 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; | |
1458 RCC_OscInitStruct.PLL.PLLM = 8; // HSE/8 is 1Mhz. | |
1459 #endif | |
1460 // System clock = PLL (1MHz) * N/p = 180 MHz. | |
1461 RCC_OscInitStruct.PLL.PLLN = 360; | |
1462 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; | |
1463 RCC_OscInitStruct.PLL.PLLQ = 7; | |
1464 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
1465 HAL_RCC_OscConfig( &RCC_OscInitStruct ); | |
1466 | |
1467 // HAL_PWREx_ActivateOverDrive(); | |
1468 HAL_PWREx_DeactivateOverDrive(); | |
1469 | |
1470 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ | |
1471 RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 }; | |
1472 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | |
1473 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; | |
1474 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
1475 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |
1476 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; | |
1477 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; | |
1478 HAL_RCC_ClockConfig( &RCC_ClkInitStruct, FLASH_LATENCY_8 ); //FLASH_LATENCY_5); | |
1479 | |
1480 /*##-2- LTDC Clock Configuration ###########################################*/ | |
1481 /* LCD clock configuration */ | |
1482 /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ | |
1483 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ | |
1484 /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ | |
1485 /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDIVR_8 = 48/8 = 6 Mhz */ | |
1486 | |
1487 /* neu: 8MHz/8*300/5/8 = 7,5 MHz = 19,5 Hz bei 800 x 480 */ | |
1488 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; | |
1489 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; | |
1490 PeriphClkInitStruct.PLLSAI.PLLSAIN = 300; //192; | |
1491 PeriphClkInitStruct.PLLSAI.PLLSAIR = 5; //4; | |
1492 PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8;//RCC_PLLSAIDIVR_4;// RCC_PLLSAIDIVR_2; // RCC_PLLSAIDIVR_8 | |
1493 HAL_RCCEx_PeriphCLKConfig( &PeriphClkInitStruct ); | |
1494 } | |
1495 | |
1496 | |
1497 /** | |
1498 * @brief This function is executed in case of error occurrence. | |
1499 * @param None | |
1500 * @retval None | |
1501 */ | |
1502 static void Error_Handler(void) | |
1503 { | |
1504 /* Turn LED3 on */ | |
1505 // BSP_LED_On(LED3); | |
1506 while(1) | |
1507 { | |
1508 } | |
1509 } | |
1510 | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1511 /** |
38 | 1512 * @brief Perform the SDRAM exernal memory inialization sequence |
1513 * @param hsdram: SDRAM handle | |
1514 * @param Command: Pointer to SDRAM command structure | |
1515 * @retval None | |
1516 */ | |
1517 static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command) | |
1518 { | |
1519 __IO uint32_t tmpmrd =0; | |
1520 /* Step 3: Configure a clock configuration enable command */ | |
1521 Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; | |
1522 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; | |
1523 Command->AutoRefreshNumber = 1; | |
1524 Command->ModeRegisterDefinition = 0; | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1525 |
38 | 1526 /* Send the command */ |
1527 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); | |
1528 | |
1529 /* Step 4: Insert 100 ms delay */ | |
1530 HAL_Delay(100); | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1531 |
38 | 1532 /* Step 5: Configure a PALL (precharge all) command */ |
1533 Command->CommandMode = FMC_SDRAM_CMD_PALL; | |
1534 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; | |
1535 Command->AutoRefreshNumber = 1; | |
1536 Command->ModeRegisterDefinition = 0; | |
1537 | |
1538 /* Send the command */ | |
1539 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1540 |
38 | 1541 /* Step 6 : Configure a Auto-Refresh command */ |
1542 Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; | |
1543 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; | |
1544 Command->AutoRefreshNumber = 4; | |
1545 Command->ModeRegisterDefinition = 0; | |
1546 | |
1547 /* Send the command */ | |
1548 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1549 |
38 | 1550 /* Step 7: Program the external memory mode register */ |
1551 tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2 | | |
1552 SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | | |
1553 SDRAM_MODEREG_CAS_LATENCY_3 | | |
1554 SDRAM_MODEREG_OPERATING_MODE_STANDARD | | |
1555 SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1556 |
38 | 1557 Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE; |
1558 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; | |
1559 Command->AutoRefreshNumber = 1; | |
1560 Command->ModeRegisterDefinition = tmpmrd; | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1561 |
38 | 1562 /* Send the command */ |
1563 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); | |
1564 | |
1565 /* Step 8: Set the refresh rate counter */ | |
1566 /* (15.62 us x Freq) - 20 */ | |
1567 /* neu: (8 us x Freq) - 20 */ | |
1568 /* Set the device refresh counter */ | |
1569 HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT); | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1570 } |
38 | 1571 |
1572 | |
1573 /** | |
1574 ****************************************************************************** | |
1575 ****************************************************************************** | |
1576 ****************************************************************************** | |
1577 */ | |
1578 | |
1579 | |
1580 /** | |
1581 * @brief DMA2D configuration. | |
1582 * @note This function Configure tha DMA2D peripheral : | |
1583 * 1) Configure the transfer mode : memory to memory W/ pixel format conversion | |
1584 * 2) Configure the output color mode as ARGB4444 | |
1585 * 3) Configure the output memory address at SRAM memory | |
1586 * 4) Configure the data size : 320x120 (pixels) | |
1587 * 5) Configure the input color mode as ARGB8888 | |
1588 * 6) Configure the input memory address at FLASH memory | |
1589 * @retval | |
1590 * None | |
1591 */ | |
1592 | |
1593 static void SDRAM_Config(void) | |
1594 { | |
1595 /*##-1- Configure the SDRAM device #########################################*/ | |
1596 /* SDRAM device configuration */ | |
1597 hsdram.Instance = FMC_SDRAM_DEVICE; | |
1598 | |
1599 /* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */ | |
1600 /* TMRD: 2 Clock cycles */ | |
1601 SDRAM_Timing.LoadToActiveDelay = 2; | |
1602 /* TXSR: min=70ns (6x11.90ns) */ | |
1603 SDRAM_Timing.ExitSelfRefreshDelay = 7; | |
1604 /* TRAS: min=42ns (4x11.90ns) max=120k (ns) */ | |
1605 SDRAM_Timing.SelfRefreshTime = 4; | |
1606 /* TRC: min=63 (6x11.90ns) */ | |
1607 SDRAM_Timing.RowCycleDelay = 7; | |
1608 /* TWR: 2 Clock cycles */ | |
1609 SDRAM_Timing.WriteRecoveryTime = 2; | |
1610 /* TRP: 15ns => 2x11.90ns */ | |
1611 SDRAM_Timing.RPDelay = 2; | |
1612 /* TRCD: 15ns => 2x11.90ns */ | |
1613 SDRAM_Timing.RCDDelay = 2; | |
1614 | |
1615 hsdram.Init.SDBank = FMC_SDRAM_BANK2; | |
1616 hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9; | |
1617 hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; | |
1618 hsdram.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH; | |
1619 hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; | |
1620 hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; | |
1621 hsdram.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; | |
1622 hsdram.Init.SDClockPeriod = SDCLOCK_PERIOD; | |
1623 hsdram.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE; | |
1624 hsdram.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; | |
1625 | |
1626 /* Initialize the SDRAM controller */ | |
1627 if(HAL_SDRAM_Init(&hsdram, &SDRAM_Timing) != HAL_OK) | |
1628 { | |
1629 /* Initialization Error */ | |
1630 Error_Handler(); | |
1631 } | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1632 |
38 | 1633 /* Program the SDRAM external device */ |
1634 SDRAM_Initialization_Sequence(&hsdram, &command); | |
1635 } | |
1636 | |
1637 | |
1638 #ifdef USE_FULL_ASSERT | |
1639 | |
1640 /** | |
1641 * @brief Reports the name of the source file and the source line number | |
1642 * where the assert_param error has occurred. | |
1643 * @param file: pointer to the source file name | |
1644 * @param line: assert_param error line source number | |
1645 * @retval None | |
1646 */ | |
1647 void assert_failed(uint8_t* file, uint32_t line) | |
1648 { | |
1649 /* User can add his own implementation to report the file name and line number, | |
1650 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ | |
1651 | |
1652 /* Infinite loop */ | |
1653 while (1) | |
1654 { | |
1655 } | |
1656 } | |
1657 #endif | |
1658 | |
1659 | |
1660 void deco_loop(void) | |
1661 { | |
1662 typedef enum | |
1663 { | |
1664 CALC_VPM, | |
1665 CALC_VPM_FUTURE, | |
1666 CALC_BUEHLMANN, | |
1667 CALC_BUEHLMANN_FUTURE, | |
149 | 1668 CALC_INVALID |
38 | 1669 } CALC_WHAT; |
1670 | |
149 | 1671 static CALC_WHAT what = CALC_INVALID; |
223
5f535ef6a3db
Bugfix, minor: properly alternate VPM/Buhlmann in deco loop
Jan Mulder <jlmulder@xs4all.nl>
parents:
217
diff
changeset
|
1672 static int counter = 0; |
38 | 1673 if((stateUsed->mode != MODE_DIVE) || (stateUsed->diveSettings.diveMode == DIVEMODE_Apnea) || (decoLock != DECO_CALC_ready )) |
1674 return; | |
1675 | |
1676 decoLock = DECO_CALC_running; | |
1677 | |
1678 if(stateDeco.diveSettings.deco_type.ub.standard == GF_MODE) | |
1679 { | |
1680 // hw 151110 mh wants future TTS even in deco zone if((what == CALC_BUEHLMANN) && (stateDeco.lifeData.pressure_ambient_bar > stateDeco.diveSettings.internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero)) | |
1681 if(what == CALC_BUEHLMANN) | |
1682 { | |
1683 //Calc future | |
1684 what = CALC_BUEHLMANN_FUTURE; | |
1685 } | |
1686 else | |
1687 what = CALC_BUEHLMANN; | |
1688 | |
1689 } | |
1690 else | |
1691 { | |
1692 // hw 151110 mh wants future TTS even in deco zone if((what == CALC_VPM) && (!stateDeco.vpm.deco_zone_reached)) | |
1693 if(what == CALC_VPM) | |
1694 { | |
1695 //Calc future | |
1696 what = CALC_VPM_FUTURE; | |
1697 } | |
1698 else | |
1699 what = CALC_VPM; | |
1700 } | |
1701 | |
1702 //In one of ten calc the other option | |
1703 if(counter == 10) | |
1704 { | |
1705 if(what == CALC_VPM) | |
1706 what = CALC_BUEHLMANN; | |
1707 if(what == CALC_BUEHLMANN) | |
1708 what = CALC_VPM; | |
1709 counter = 0; | |
1710 } | |
1711 | |
1712 decom_CreateGasChangeList(&stateDeco.diveSettings, &stateDeco.lifeData); | |
1713 | |
1714 switch(what) | |
1715 { | |
149 | 1716 case CALC_VPM: |
1717 vpm_calc(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.vpm,&stateDeco.decolistVPM, DECOSTOPS); | |
1718 decoLock = DECO_CALC_FINSHED_vpm; | |
1719 return; | |
1720 case CALC_VPM_FUTURE: | |
1721 decom_tissues_exposure(stateDeco.diveSettings.future_TTS_minutes * 60,&stateDeco.lifeData); | |
1722 vpm_calc(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.vpm,&stateDeco.decolistFutureVPM, FUTURESTOPS); | |
1723 decoLock = DECO_CALC_FINSHED_Futurevpm; | |
1724 return; | |
1725 case CALC_BUEHLMANN: | |
1726 buehlmann_calc_deco(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.decolistBuehlmann); | |
1727 buehlmann_ceiling_calculator(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.decolistBuehlmann); | |
1728 buehlmann_relative_gradient_calculator(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.decolistBuehlmann); | |
1729 decoLock = DECO_CALC_FINSHED_Buehlmann; | |
1730 return; | |
1731 case CALC_BUEHLMANN_FUTURE: | |
1732 decom_tissues_exposure(stateDeco.diveSettings.future_TTS_minutes * 60,&stateDeco.lifeData); | |
1733 buehlmann_calc_deco(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.decolistFutureBuehlmann); | |
1734 //buehlmann_ceiling_calculator(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.decolistBuehlmann); | |
1735 decoLock = DECO_CALC_FINSHED_FutureBuehlmann; | |
1736 return; | |
1737 default: break; | |
38 | 1738 } |
1739 counter++; | |
1740 } | |
1741 | |
1742 void resetToFirmwareUpdate(void) | |
1743 { | |
1744 __HAL_RCC_CLEAR_RESET_FLAGS(); | |
1745 HAL_NVIC_SystemReset(); | |
1746 } | |
1747 | |
1748 // debugging by https://blog.feabhas.com/2013/02/developing-a-generic-hard-fault-handler-for-arm-cortex-m3cortex-m4/ | |
1749 | |
1750 /* | |
1751 void printErrorMsg(const char * errMsg) | |
1752 { | |
1753 | |
1754 // printf(errMsg); | |
1755 // return; | |
1756 | |
1757 while(*errMsg != 0){ | |
1758 ITM_SendChar(*errMsg); | |
1759 ++errMsg; | |
1760 } | |
1761 } | |
1762 | |
1763 enum { r0, r1, r2, r3, r12, lr, pc, psr}; | |
1764 | |
1765 void stackDump(uint32_t stack[]) | |
1766 { | |
1767 static char msg[80]; | |
1768 sprintf(msg, "r0 = 0x%08x\n", stack[r0]); printErrorMsg(msg); | |
1769 sprintf(msg, "r1 = 0x%08x\n", stack[r1]); printErrorMsg(msg); | |
1770 sprintf(msg, "r2 = 0x%08x\n", stack[r2]); printErrorMsg(msg); | |
1771 sprintf(msg, "r3 = 0x%08x\n", stack[r3]); printErrorMsg(msg); | |
1772 sprintf(msg, "r12 = 0x%08x\n", stack[r12]); printErrorMsg(msg); | |
1773 sprintf(msg, "lr = 0x%08x\n", stack[lr]); printErrorMsg(msg); | |
1774 sprintf(msg, "pc = 0x%08x\n", stack[pc]); printErrorMsg(msg); | |
1775 sprintf(msg, "psr = 0x%08x\n", stack[psr]); printErrorMsg(msg); | |
1776 } | |
1777 | |
1778 void printUsageErrorMsg(uint32_t CFSRValue) | |
1779 { | |
1780 printErrorMsg("Usage fault: "); | |
1781 CFSRValue >>= 16; // right shift to lsb | |
1782 if((CFSRValue & (1 << 9)) != 0) { | |
1783 printErrorMsg("Divide by zero\n"); | |
1784 } | |
1785 } | |
1786 | |
1787 void Hard_Fault_Handler()//uint32_t stack[]) | |
1788 { | |
1789 static char msg[80]; | |
1790 printErrorMsg("In Hard Fault Handler\n"); | |
1791 sprintf(msg, "SCB->HFSR = 0x%08x\n", SCB->HFSR); | |
1792 printErrorMsg(msg); | |
1793 if ((SCB->HFSR & (1 << 30)) != 0) { | |
1794 printErrorMsg("Forced Hard Fault\n"); | |
1795 sprintf(msg, "SCB->CFSR = 0x%08x\n", SCB->CFSR ); | |
1796 printErrorMsg(msg); | |
1797 if((SCB->CFSR & 0xFFFF0000) != 0) { | |
1798 printUsageErrorMsg(SCB->CFSR); | |
1799 } | |
1800 } | |
1801 __ASM volatile("BKPT #01"); | |
1802 while(1); | |
1803 } | |
1804 | |
1805 int my_store_of_MSP; | |
1806 | |
1807 void HardFault_Handler(void) | |
1808 { | |
1809 __asm ("MRS my_store_of_MSP, MSP"); | |
1810 Hard_Fault_Handler(); | |
1811 } | |
1812 */ | |
1813 | |
1814 /* | |
1815 __asm void HardFault_Handler(void) | |
1816 { | |
1817 TST lr, #4 // Test for MSP or PSP | |
1818 ITE EQ | |
1819 MRSEQ r0, MSP | |
1820 MRSNE r0, PSP | |
1821 B __cpp(Hard_Fault_Handler) | |
1822 } | |
1823 */ | |
1824 /* | |
1825 HardFault_Handler\ | |
1826 PROC | |
1827 EXPORT HardFault_Handler | |
1828 B . | |
1829 ENDP | |
1830 */ | |
1831 | |
1832 /* | |
1833 __asm int f(int i) | |
1834 { | |
1835 ADD i, i, #1 // error | |
1836 } | |
1837 | |
1838 EXPORT HardFault_Handler | |
1839 HardFault_Handler FUNCTION | |
1840 MRS r0, MSP | |
1841 B __cpp(Hard_Fault_Handler) | |
1842 ENDFUNC | |
1843 */ |