Mercurial > public > ostc4
annotate Discovery/Src/base.c @ 298:50c26a4442af cleanup-3
Bugfix: fix drawing of CCR bailout profile
When bailing out to an OC gas from CCR dive mode, the profile was not
drawn correctly in the device internal logbook. It was truncated
from the moment of bailout, and the remaining CCR part of the dive
was stretched over the full dive time.
Yes, a lot of text for a 1 letter fix, but finding the reason of this
bug was not trivial. It appeared to be a parsing error from the
internal logbook, looking at the wrong bit from the extended sample
data on drawing time. The bit that denotes bailout is bit 0, and
not bit 1.
Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Thu, 16 May 2019 14:02:46 +0200 |
parents | 74a8296a2318 |
children | 5ca177d2df5d fc5e9fdcb156 |
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 */ | |
225
2bb1db22b5f5
cleanup: random set of cleanups
Jan Mulder <jlmulder@xs4all.nl>
parents:
223
diff
changeset
|
263 #ifdef DEMOMODE |
38 | 264 TIM_HandleTypeDef TimDemoHandle; /* used in stm32f4xx_it.c too */ |
225
2bb1db22b5f5
cleanup: random set of cleanups
Jan Mulder <jlmulder@xs4all.nl>
parents:
223
diff
changeset
|
265 #endif |
38 | 266 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
267 uint8_t LastButtonPressed; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
268 uint32_t LastButtonPressedTick; |
263
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
269 uint32_t BaseTick100ms; /* Tick at last 100ms cycle */ |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
270 |
38 | 271 /* |
272 uint32_t time_before; | |
273 uint32_t time_between; | |
274 uint32_t time_after; | |
275 */ | |
276 | |
277 /* SDRAM handler declaration */ | |
278 SDRAM_HandleTypeDef hsdram; | |
279 FMC_SDRAM_TimingTypeDef SDRAM_Timing; | |
280 FMC_SDRAM_CommandTypeDef command; | |
281 | |
282 /* This was used for Dual Boot */ | |
283 //FLASH_OBProgramInitTypeDef OBInit; | |
284 //FLASH_AdvOBProgramInitTypeDef AdvOBInit; | |
285 | |
286 /* Private variables with external access ------------------------------------*/ | |
287 | |
288 uint32_t globalStateID = 0; | |
289 uint8_t globalModeID = SURFMODE; | |
290 uint32_t time_without_button_pressed_deciseconds = 0; /**< langbeschreibung (eigenes Feld) warum diese variable verwendet wird um den sleepmode zu aktivieren */ | |
291 uint8_t bootToBootloader = 0; ///< set in tComm.c to install firmware updates, calls resetToFirmwareUpdate() | |
292 //uint8_t dataEx_VPM_call = 0; | |
293 uint8_t returnFromCommCleanUpRequest = 0; ///< use this to exit bluetooth mode and call tComm_exit() | |
294 uint32_t base_tempLightLevel = 0; | |
295 uint8_t updateButtonsToDefault = 0; | |
296 uint8_t wasFirmwareUpdateCheckBattery = 0; | |
297 | |
229
2c0b502b0a72
cleanup: fix recent extra compiler warnings
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
298 static uint8_t DoDisplayRefresh = 0; /* trigger to refresh display data */ |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
299 |
38 | 300 /* Private function prototypes -----------------------------------------------*/ |
301 static void SystemClock_Config(void); | |
302 static void Error_Handler(void); | |
303 static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command); | |
304 static void SDRAM_Config(void); | |
305 static void EXTILine_Buttons_Config(void); | |
306 static void TIM_init(void); | |
307 static void TIM_BACKLIGHT_init(void); | |
308 static uint32_t TIM_BACKLIGHT_adjust(void); | |
309 static void gotoSleep(void); | |
310 static void deco_loop(void); | |
311 static void resetToFirmwareUpdate(void); | |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
312 static void TriggerButtonAction(void); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
313 static void EvaluateButton(void); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
314 static void RefreshDisplay(void); |
38 | 315 |
316 /* ITM Trace-------- ---------------------------------------------------------*/ | |
317 /* | |
318 #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) | |
319 #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) | |
320 #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) | |
321 | |
322 #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) | |
323 #define TRCENA 0x01000000 | |
324 | |
325 struct __FILE { int handle; }; | |
326 FILE __stdout; | |
327 FILE __stdin; | |
328 | |
329 int fputc(int ch, FILE *f) { | |
330 if (DEMCR & TRCENA) { | |
331 while (ITM_Port32(0) == 0); | |
332 ITM_Port8(0) = ch; | |
333 } | |
334 return(ch); | |
335 } | |
336 */ | |
116 | 337 /* #define DEBUG_RUNTIME TRUE */ |
338 #ifdef DEBUG_RUNTIME | |
339 #define MEASURECNT 60 /* number of measuremets to be stored */ | |
340 static uint32_t loopcnt[MEASURECNT]; | |
341 #endif | |
38 | 342 // =============================================================================== |
343 // main | |
344 /// @brief This function makes initializations and has the nonIRQ endless loop | |
345 /// for bluetooth and deco calculations | |
346 /// | |
347 // =============================================================================== | |
348 int main(void) | |
349 { | |
350 uint32_t pLayerInvisible; | |
351 uint16_t totalDiveCounterFound; | |
116 | 352 #ifdef DEBUG_RUNTIME |
353 RTC_TimeTypeDef Stime; | |
354 uint8_t measurementindex = 0; | |
355 uint8_t lastsecond = 0xFF; | |
356 #endif | |
357 | |
38 | 358 |
359 set_globalState( StBoot0 ); | |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
360 LastButtonPressed = 0; |
38 | 361 |
362 HAL_Init(); | |
363 HAL_NVIC_SetPriorityGrouping( NVIC_PRIORITYGROUP_2 ); | |
364 | |
365 SystemClock_Config(); | |
366 | |
367 MX_GPIO_Init(); | |
368 // MX_SmallCPU_NO_Reset_Helper(); //161116 hw | |
369 MX_SPI_Init(); | |
370 MX_UART_Init(); | |
371 SDRAM_Config(); | |
372 HAL_Delay( 100 ); | |
116 | 373 |
374 stateRealGetPointerWrite()->lastKnownBatteryPercentage = 0; // damit das nicht in settings kopiert wird. | |
375 set_settings_to_Standard(); | |
376 mod_settings_for_first_start_with_empty_ext_flash(); | |
377 ext_flash_read_settings(); | |
378 if( newFirmwareVersionCheckViaSettings() ) // test for old firmware version in loaded settings | |
379 { | |
380 wasFirmwareUpdateCheckBattery = 1; | |
381 set_settings_button_to_standard_with_individual_buttonBalance(); // will adapt individual values | |
382 } | |
383 //settingsGetPointer()->bluetoothActive = 0; /* MX_Bluetooth_PowerOff(); unnecessary as part of MX_GPIO_Init() */ | |
384 //settingsGetPointer()->compassBearing = 0; | |
385 set_new_settings_missing_in_ext_flash(); // inlcudes update of firmware version 161121 | |
386 | |
38 | 387 GFX_init( &pLayerInvisible ); |
388 TIM_BACKLIGHT_init(); | |
389 | |
390 /* | |
391 GFX_helper_font_memory_list(&FontT24); | |
392 GFX_helper_font_memory_list(&FontT42); | |
393 GFX_helper_font_memory_list(&FontT48); | |
394 GFX_helper_font_memory_list(&FontT54); | |
395 GFX_helper_font_memory_list(&FontT84); | |
396 GFX_helper_font_memory_list(&FontT105); | |
397 GFX_helper_font_memory_list(&FontT144); | |
398 */ | |
399 | |
116 | 400 |
38 | 401 |
402 // new 170508: bluetooth on at start | |
403 settingsGetPointer()->bluetoothActive = 1; | |
404 MX_Bluetooth_PowerOn(); | |
405 | |
406 // Haase Geburtstag: | |
407 // settingsGetPointer()->serialHigh = (3012 / 256); | |
408 // settingsGetPointer()->serialLow = (3012 & 0xFF); | |
409 | |
410 // settingsGetPointer()->showDebugInfo = 1; | |
411 | |
412 /* | |
413 if( (hardwareDataGetPointer()->primarySerial == 20+18) | |
414 || (hardwareDataGetPointer()->primarySerial == 20+25) | |
415 || (hardwareDataGetPointer()->primarySerial == 20+27)) | |
416 { | |
417 MX_Bluetooth_PowerOn(); | |
418 tComm_Set_Bluetooth_Name(1); | |
419 } | |
420 */ | |
421 errorsInSettings = check_and_correct_settings(); | |
422 createDiveSettings(); | |
423 | |
424 #ifdef QUICK_SLEEP | |
425 settingsGetPointer()->timeoutSurfacemode = 20; | |
426 #else | |
427 settingsGetPointer()->timeoutSurfacemode = 120; | |
428 #endif | |
429 | |
430 #ifdef DEMOMODE | |
431 demoConfigureSettings(); | |
432 TIM_DEMO_init(); | |
433 #endif | |
434 | |
435 // ----------------------------- | |
436 | |
437 display_power_on__1_of_2__pre_RGB(); | |
438 GFX_LTDC_Init(); | |
439 GFX_LTDC_LayerDefaultInit( TOP_LAYER, pLayerInvisible ); | |
440 GFX_LTDC_LayerDefaultInit( BACKGRD_LAYER, pLayerInvisible ); | |
441 GFX_SetFramesTopBottom( pLayerInvisible, pLayerInvisible, 480 ); | |
442 HAL_Delay( 20 ); | |
443 display_power_on__2_of_2__post_RGB(); | |
444 GFX_use_colorscheme( settingsGetPointer()->tX_colorscheme ); | |
445 | |
446 // ----------------------------- | |
447 tHome_init(); | |
448 tI_init(); | |
449 tM_init(); | |
450 tMenuEdit_init(); | |
451 tInfoLog_init(); | |
452 tComm_init(); | |
453 DataEX_init(); | |
454 setButtonResponsiveness( settingsGetPointer()->ButtonResponsiveness ); | |
455 set_globalState_tHome(); | |
456 | |
457 GFX_start_VSYNC_IRQ(); | |
458 tCCR_init(); | |
459 | |
460 GFX_logoAutoOff(); | |
461 EXTILine_Buttons_Config(); | |
462 | |
463 ext_flash_repair_dive_log(); | |
464 //ext_flash_repair_SPECIAL_dive_numbers_starting_count_with(1); | |
465 | |
466 totalDiveCounterFound = logbook_lastDive_diveNumber(); | |
467 if( settingsGetPointer()->totalDiveCounter < totalDiveCounterFound ) | |
468 settingsGetPointer()->totalDiveCounter = totalDiveCounterFound; | |
469 | |
470 if( settingsGetPointer()->debugModeOnStart ) | |
471 { | |
472 settingsGetPointer()->debugModeOnStart = 0; | |
473 ext_flash_write_settings(); | |
474 setDebugMode(); | |
475 openInfo( StIDEBUG ); | |
476 } | |
477 | |
263
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
478 TIM_init(); /* start cylic 100ms task */ |
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
479 |
38 | 480 /* @brief main LOOP |
481 * | |
482 * this is executed while no IRQ interrupts it | |
483 * - deco calculation | |
484 * - bluetooth | |
485 * and resetToFirmwareUpdate() | |
486 * because tComm_control() does not exit before disconnection | |
487 */ | |
488 while( 1 ) | |
489 { | |
490 if( bootToBootloader ) | |
491 resetToFirmwareUpdate(); | |
492 | |
493 // this will allways reset after RTE reset -> no good! | |
494 // if(DataEX_was_power_on()) // new to allow for update after RTE update | |
495 // resetToFirmwareUpdate(); | |
496 | |
497 tCCR_control(); | |
498 if( tComm_control() )// will stop while loop if tComm Mode started until exit from UART | |
499 { | |
500 createDiveSettings(); | |
501 updateMenu(); | |
502 ext_flash_write_settings(); | |
503 } | |
504 deco_loop(); | |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
505 TriggerButtonAction(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
506 if(DoDisplayRefresh) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
507 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
508 DoDisplayRefresh = 0; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
509 RefreshDisplay(); |
263
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
510 |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
263
diff
changeset
|
511 // Enable this to make the simulator write a logbook entry |
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
263
diff
changeset
|
512 // #define SIM_WRITES_LOGBOOK 1 |
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
263
diff
changeset
|
513 |
272
74a8296a2318
cleanup: simplify stateUsed usage
Jan Mulder <jlmulder@xs4all.nl>
parents:
270
diff
changeset
|
514 #ifdef SIM_WRITES_LOGBOOK |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
263
diff
changeset
|
515 if(stateUsed == stateSimGetPointer()) |
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
263
diff
changeset
|
516 logbook_InitAndWrite(stateUsed); |
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
263
diff
changeset
|
517 #endif |
263
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
518 if(stateUsed == stateRealGetPointer()) /* Handle log entries while in dive mode*/ |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
263
diff
changeset
|
519 logbook_InitAndWrite(stateUsed); |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
520 } |
116 | 521 |
522 #ifdef DEBUG_RUNTIME | |
523 translateTime(stateUsed->lifeData.timeBinaryFormat, &Stime); | |
524 if(lastsecond == 0xFF) | |
525 { | |
526 measurementindex = 0; | |
527 loopcnt[measurementindex] = 0; | |
528 lastsecond = Stime.Seconds; | |
529 } | |
530 loopcnt[measurementindex]++; | |
531 | |
532 if(lastsecond != Stime.Seconds) | |
533 { | |
534 measurementindex++; | |
535 if (measurementindex == MEASURECNT) measurementindex = 0; | |
536 loopcnt[measurementindex] = 0; | |
537 lastsecond = Stime.Seconds; | |
538 if(measurementindex +1 < MEASURECNT) loopcnt[measurementindex +1] = 0xffff; /* helps to identify the latest value */ | |
539 } | |
540 #endif | |
541 | |
38 | 542 } |
543 } | |
544 | |
545 // =============================================================================== | |
546 // timer IRQ | |
547 /// @brief this is called periodically | |
548 /// | |
549 /// - refresh screen (the actual change is done in the VSYNC IRQ) | |
550 /// - start data transfer with RTE / small CPU (DateEX....) | |
551 /// - update logbook | |
552 /// - timeouts | |
553 /// .... | |
554 /// | |
555 /// all this in three steps / switch() routines in a given order | |
556 /// as the previous switch() might influence the next functions | |
557 /// to be called | |
558 /// | |
559 // =============================================================================== | |
560 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |
561 { | |
562 #ifdef DEMOMODE | |
563 if(htim->Instance==TIM7) | |
564 { | |
565 HAL_GPIO_EXTI_Callback(demoGetCommand()); | |
566 return; | |
567 } | |
568 #endif | |
569 static uint8_t last_base; | |
570 | |
571 SStateList status; | |
572 uint32_t timeout_in_seconds; | |
573 uint32_t timeout_limit_Surface_in_seconds; | |
574 | |
263
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
575 |
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
576 BaseTick100ms = HAL_GetTick(); /* store start of 100ms cycle */ |
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
577 |
38 | 578 _Bool InDiveMode = 0; |
579 _Bool modeChange = 0; // to exit from menu and logbook | |
580 | |
581 if(stateUsed->mode == MODE_DIVE) | |
582 InDiveMode = 1; | |
583 else | |
584 InDiveMode = 0; | |
585 | |
206 | 586 EvaluateButton(); |
587 | |
38 | 588 if(returnFromCommCleanUpRequest) |
589 { | |
590 tComm_exit(); | |
591 returnFromCommCleanUpRequest = 0; | |
592 } | |
593 | |
594 get_globalStateList(&status); | |
595 | |
596 switch(status.base) | |
597 { | |
598 case BaseHome: | |
599 case BaseMenu: | |
600 case BaseInfo: | |
601 updateSetpointStateUsed(); | |
132
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
602 |
38 | 603 DateEx_copy_to_dataOut(); |
604 DataEX_copy_to_LifeData(&modeChange); | |
605 //foto session :-) stateRealGetPointerWrite()->lifeData.battery_charge = 99; | |
606 //foto session :-) stateSimGetPointerWrite()->lifeData.battery_charge = 99; | |
607 DataEX_copy_to_deco(); | |
132
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
608 DataEX_call(); |
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
609 |
38 | 610 if(stateUsed == stateSimGetPointer()) |
263
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
611 { |
38 | 612 simulation_UpdateLifeData(1); |
263
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
613 } |
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
614 |
38 | 615 check_warning(); |
616 updateMiniLiveLogbook(1); | |
617 timer_UpdateSecond(1); | |
132
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
618 base_tempLightLevel = TIM_BACKLIGHT_adjust(); |
38 | 619 tCCR_tick(); |
620 tHome_tick(); | |
621 if(status.base == BaseHome) | |
622 tMenuEdit_writeSettingsToFlash(); // takes 900 ms!! | |
623 break; | |
624 case BaseStop: | |
625 DateEx_copy_to_dataOut(); | |
626 DataEX_call(); | |
627 DataEX_control_connection_while_asking_for_sleep(); | |
628 break; | |
629 default: | |
630 case BaseComm: | |
631 if(get_globalState() == StUART_RTECONNECT) | |
632 { | |
633 DateEx_copy_to_dataOut(); | |
634 DataEX_call(); | |
635 DataEX_copy_to_LifeData(0); | |
636 } | |
637 break; | |
638 } | |
639 | |
640 /* timeout control */ | |
641 if(modeChange) ///< from RTE, set in data_exchange_main.c | |
642 time_without_button_pressed_deciseconds = (settingsGetPointer()->timeoutSurfacemode / 4) * 3; | |
643 if(status.base != last_base) | |
644 time_without_button_pressed_deciseconds = 0; | |
645 last_base = status.base; | |
646 timeout_in_seconds = time_without_button_pressed_deciseconds / 10; | |
647 time_without_button_pressed_deciseconds += 1; | |
648 if(modeChange || (timeout_in_seconds != time_without_button_pressed_deciseconds / 10)) | |
649 { | |
650 #ifdef NO_TIMEOUT | |
651 timeout_in_seconds = 0; | |
652 #else | |
653 timeout_in_seconds += 1; | |
654 #endif | |
655 | |
656 if(InDiveMode) | |
657 { | |
658 switch(status.base) | |
659 { | |
660 case BaseHome: | |
661 if((status.line != 0) && (timeout_in_seconds >= settingsGetPointer()->timeoutEnterButtonSelectDive)) | |
662 { | |
663 set_globalState(StD); | |
664 timeout_in_seconds = 0; | |
665 } | |
666 break; | |
104 | 667 |
38 | 668 case BaseMenu: |
669 if((status.line == 0) && ((timeout_in_seconds >= settingsGetPointer()->timeoutMenuDive) || modeChange)) | |
670 { | |
671 exitMenu(); | |
672 timeout_in_seconds = 0; | |
673 } | |
674 if((status.line != 0) && ((timeout_in_seconds >= settingsGetPointer()->timeoutMenuEdit) || modeChange)) | |
675 { | |
676 exitMenuEdit_to_Home(); | |
677 timeout_in_seconds = 0; | |
678 } | |
679 break; | |
680 default: | |
681 break; | |
682 } | |
683 } | |
684 else /* surface mode */ | |
685 { | |
686 switch(status.base) | |
687 { | |
688 case BaseHome: | |
689 // added hw 161027 | |
690 if(!(stateRealGetPointer()->warnings.lowBattery) && (stateRealGetPointer()->lifeData.battery_charge > 9)) | |
691 { | |
692 stateRealGetPointerWrite()->lastKnownBatteryPercentage = stateRealGetPointer()->lifeData.battery_charge; | |
693 } | |
694 else if((wasFirmwareUpdateCheckBattery) && (timeout_in_seconds > 3)) | |
695 { | |
696 wasFirmwareUpdateCheckBattery = 0; | |
697 setButtonResponsiveness(settingsGetPointer()->ButtonResponsiveness); // added 170306 | |
698 if( (settingsGetPointer()->lastKnownBatteryPercentage > 0) | |
699 && (settingsGetPointer()->lastKnownBatteryPercentage <= 100) | |
700 && (stateRealGetPointer()->warnings.lowBattery)) | |
701 { | |
702 setBatteryPercentage(settingsGetPointer()->lastKnownBatteryPercentage); | |
703 } | |
704 } | |
705 // stuff before and new @161121 CCR-sensor limit 10 minutes | |
706 if((settingsGetPointer()->dive_mode == DIVEMODE_CCR) && (settingsGetPointer()->CCR_Mode == CCRMODE_Sensors)) | |
707 { | |
708 timeout_limit_Surface_in_seconds = settingsGetPointer()->timeoutSurfacemodeWithSensors; | |
709 } | |
710 else | |
711 { | |
712 timeout_limit_Surface_in_seconds = settingsGetPointer()->timeoutSurfacemode; | |
713 } | |
714 if(timeout_in_seconds >= timeout_limit_Surface_in_seconds) | |
715 { | |
716 gotoSleep(); | |
717 } | |
718 break; | |
719 case BaseMenu: | |
720 if((status.line == 0) && ((timeout_in_seconds >= settingsGetPointer()->timeoutMenuSurface) || modeChange)) | |
721 { | |
722 exitMenu(); | |
723 timeout_in_seconds = 0; | |
724 } | |
725 if((status.line != 0) && ((timeout_in_seconds >= settingsGetPointer()->timeoutMenuEdit) || modeChange)) | |
726 { | |
727 if((status.page != (uint8_t)((StMPLAN >> 24) & 0x0F)) || (timeout_in_seconds >= 10*(settingsGetPointer()->timeoutMenuEdit))) | |
728 { | |
729 exitMenuEdit_to_Home(); | |
730 timeout_in_seconds = 0; | |
731 } | |
732 } | |
733 break; | |
734 | |
735 case BaseInfo: | |
736 if((timeout_in_seconds >= settingsGetPointer()->timeoutInfo) || modeChange) | |
737 { | |
738 if(status.page == InfoPageLogList) | |
739 { | |
740 exitLog(); | |
741 timeout_in_seconds = 0; | |
742 } | |
743 else | |
744 if(status.page == InfoPageLogShow) | |
745 { | |
746 show_logbook_exit(); | |
747 exitLog(); | |
748 timeout_in_seconds = 0; | |
749 } | |
750 else | |
751 if(status.page != InfoPageCompass) | |
752 { | |
753 exitInfo(); | |
754 timeout_in_seconds = 0; | |
755 } | |
756 } | |
757 break; | |
758 default: | |
759 break; | |
760 } | |
761 } | |
762 } | |
763 | |
764 get_globalStateList(&status); | |
765 | |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
766 if(status.base == BaseComm) /* main loop not serviced in com mode */ |
38 | 767 { |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
768 tComm_refresh(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
769 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
770 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
771 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
772 DoDisplayRefresh = 1; |
38 | 773 } |
774 } | |
775 | |
776 | |
777 /* button and VSYNC IRQ | |
778 * | |
779 * VSYNC will switch foreground and background picture | |
780 * if demanded. see GFX_change_LTDC() | |
781 * | |
782 */ | |
783 // =============================================================================== | |
784 // HAL_GPIO_EXTI_Callback | |
785 /// @brief button and VSYNC IRQ | |
786 /// | |
787 /// VSYNC will switch foreground and background picture if demanded - | |
788 /// see GFX_change_LTDC() | |
789 /// | |
790 // =============================================================================== | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
791 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
792 if (!GPIO_Pin) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
793 return; |
38 | 794 |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
795 if (GPIO_Pin == VSYNC_IRQ_PIN) // rechts, unten |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
796 { |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
797 GFX_change_LTDC(); |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
798 housekeepingFrame(); |
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 #ifdef DEMOMODE |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
801 static uint8_t countCall = 0; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
802 if(countCall++ < 10) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
803 return; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
804 countCall = 0; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
805 uint8_t buttonAction = demoGetCommand(); |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
806 if(buttonAction) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
807 GPIO_Pin = buttonAction; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
808 else |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
809 #endif |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
810 */ |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
811 return; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
812 } |
115 | 813 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
814 LastButtonPressed = GPIO_Pin; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
815 LastButtonPressedTick = HAL_GetTick(); |
38 | 816 |
817 #ifdef DEMOMODE | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
818 uint8_t demoMachineCall = 0; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
819 if(GPIO_Pin & 0x80) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
820 { |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
821 demoMachineCall = 1; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
822 GPIO_Pin &= 0x7F; |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
823 } |
38 | 824 #endif |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
825 } |
38 | 826 |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
827 static void RefreshDisplay() |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
828 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
829 SStateList status; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
830 get_globalStateList(&status); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
831 switch(status.base) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
832 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
833 case BaseHome: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
834 tHome_refresh(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
835 tM_check_content(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
836 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
837 case BaseMenu: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
838 tM_refresh_live_content(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
839 tMenuEdit_refresh_live_content(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
840 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
841 case BaseInfo: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
842 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
|
843 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
844 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
|
845 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
846 default: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
847 if(get_globalState() == StStop) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
848 tHome_sleepmode_fun(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
849 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
850 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
851 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
852 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
|
853 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
854 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
|
855 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
856 ButtonAction = action; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
857 } |
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 static void TriggerButtonAction() |
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 uint8_t action = ButtonAction; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
862 SStateList status; |
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 if(ButtonAction != ACTION_END) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
865 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
866 get_globalStateList(&status); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
867 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
868 if (action == ACTION_BUTTON_CUSTOM) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
869 GFX_screenshot(); |
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 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
872 switch (status.base) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
873 case BaseStop: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
874 if (action == ACTION_BUTTON_BACK) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
875 resetToFirmwareUpdate(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
876 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
877 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
|
878 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
879 case BaseHome: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
880 if (action == ACTION_BUTTON_NEXT) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
881 if (status.page == PageSurface) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
882 openMenu(1); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
883 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
884 tHomeDiveMenuControl(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
885 } 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
|
886 if (get_globalState() == StS) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
887 openInfo(StILOGLIST); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
888 else if ((status.page == PageDive) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
889 && (settingsGetPointer()->design < 7)) { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
890 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
|
891 } 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
|
892 if (settingsGetPointer()->extraDisplay == EXTRADISPLAY_BIGFONT) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
893 settingsGetPointer()->design = 3; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
894 else if (settingsGetPointer()->extraDisplay |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
895 == EXTRADISPLAY_DECOGAME) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
896 settingsGetPointer()->design = 4; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
897 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
898 set_globalState(StD); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
899 } else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
900 tHome_change_field_button_pressed(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
901 } 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
|
902 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
|
903 tHome_change_customview_button_pressed(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
904 else if (status.page == PageSurface) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
905 tHome_change_customview_button_pressed(); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
906 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
907 tHomeDiveMenuControl(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
908 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
909 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
910 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
911 case BaseMenu: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
912 if (status.line == 0) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
913 sendActionToMenu(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
914 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
915 sendActionToMenuEdit(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
916 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
917 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
918 case BaseInfo: |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
919 if (status.page == InfoPageLogList) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
920 sendActionToInfoLogList(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
921 else if (status.page == InfoPageLogShow) |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
922 sendActionToInfoLogShow(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
923 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
924 sendActionToInfo(action); |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
925 break; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
926 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
927 default: |
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 ButtonAction = ACTION_END; |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
931 } |
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 |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
934 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
935 void EvaluateButton() |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
936 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
937 uint8_t action = 0; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
938 SStateList status; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
939 SSettings* pSettings; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
940 pSettings = settingsGetPointer(); |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
941 |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
942 if (GFX_logoStatus() != 0) |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
943 return; |
38 | 944 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
945 if ((LastButtonPressed != INVALID_BUTTON) && (time_elapsed_ms(LastButtonPressedTick, HAL_GetTick())) > 50) |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
946 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
947 if (LastButtonPressed == BUTTON_BACK_PIN) { // links |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
948 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
|
949 action = ACTION_BUTTON_BACK; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
950 } |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
951 } |
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
952 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
953 else if (LastButtonPressed == BUTTON_ENTER_PIN) { // mitte |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
954 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
|
955 action = ACTION_BUTTON_ENTER; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
956 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
957 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
958 |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
959 else if (LastButtonPressed == BUTTON_NEXT_PIN) { // rechts |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
960 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
|
961 action = ACTION_BUTTON_NEXT; |
108 | 962 } |
963 } | |
38 | 964 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
965 if(action != 0) |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
966 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
967 time_without_button_pressed_deciseconds = 0; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
968 if(pSettings->FlipDisplay) /* switch action resulting from pressed button */ |
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 if (action == ACTION_BUTTON_BACK) |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
971 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
972 action = ACTION_BUTTON_NEXT; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
973 } |
158 | 974 else |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
975 { |
158 | 976 if (action == ACTION_BUTTON_NEXT) |
977 { | |
978 action = ACTION_BUTTON_BACK; | |
979 } | |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
980 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
981 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
982 } |
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 #ifdef BUTTON_CUSTOM_PIN |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
985 else |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
986 if(LastButtonPressed == BUTTON_CUSTOM_PIN) // extra |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
987 action = ACTION_BUTTON_CUSTOM; |
38 | 988 #endif |
989 | |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
990 #ifdef DEMOMODE // user pressed button ? |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
991 if((!demoMachineCall) && demoModeActive()) |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
992 { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
993 demoSendCommand(action); |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
994 return; |
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 #endif |
38 | 997 |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
998 get_globalStateList(&status); |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
999 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
|
1000 { |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1001 if (action == ACTION_BUTTON_BACK) { |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1002 settingsGetPointer()->bluetoothActive = 0; |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1003 MX_Bluetooth_PowerOff(); |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1004 tComm_exit(); |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1005 } |
217
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1006 } |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1007 else |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1008 { |
ce05c801b002
Moved display refresh and button action function from tim callback to main loop
ideenmodellierer
parents:
206
diff
changeset
|
1009 StoreButtonAction(action); /* Handle action in main loop */ |
152
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1010 } |
bc7795161549
Moved button evaluation out of interrupt handler
Ideenmodellierer
parents:
149
diff
changeset
|
1011 LastButtonPressed = INVALID_BUTTON; |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1012 } |
38 | 1013 } |
1014 | |
1015 void gotoSleep(void) | |
1016 { | |
1017 /* not at the moment of testing */ | |
1018 // ext_flash_erase_firmware_if_not_empty(); | |
1019 GFX_logoAutoOff(); | |
1020 set_globalState(StStop); | |
1021 } | |
1022 | |
1023 | |
1024 // ----------------------------- | |
1025 | |
1026 uint8_t get_globalMode(void) | |
1027 { | |
1028 return globalModeID; | |
1029 } | |
1030 | |
1031 | |
1032 void set_globalMode(uint8_t newMode) | |
1033 { | |
1034 if((newMode != DIVEMODE) && (newMode != SURFMODE)) | |
1035 return; | |
1036 | |
1037 globalModeID = newMode; | |
1038 } | |
1039 | |
1040 | |
1041 uint32_t get_globalState(void) | |
1042 { | |
1043 return globalStateID; | |
1044 } | |
1045 | |
1046 | |
1047 void get_globalStateList(SStateList *output) | |
1048 { | |
1049 output->base = (uint8_t)((globalStateID >> 28) & 0x0F); | |
1050 output->page = (uint8_t)((globalStateID >> 24) & 0x0F); | |
1051 output->line = (uint8_t)((globalStateID >> 16) & 0xFF); | |
1052 output->field = (uint8_t)((globalStateID >> 8) & 0xFF); | |
1053 output->mode = (uint8_t)((globalStateID ) & 0xFF); | |
1054 } | |
1055 | |
1056 | |
1057 void get_idSpecificStateList(uint32_t id, SStateList *output) | |
1058 { | |
1059 output->base = (uint8_t)((id >> 28) & 0x0F); | |
1060 output->page = (uint8_t)((id >> 24) & 0x0F); | |
1061 output->line = (uint8_t)((id >> 16) & 0xFF); | |
1062 output->field = (uint8_t)((id >> 8) & 0xFF); | |
1063 output->mode = (uint8_t)((id ) & 0xFF); | |
1064 } | |
1065 | |
1066 | |
1067 void set_globalState_Menu_Page(uint8_t page) | |
1068 { | |
1069 globalStateID = ((BaseMenu << 28) + (page << 24)); | |
1070 } | |
1071 | |
1072 void set_globalState_Log_Page(uint8_t pageIsLine) | |
1073 { | |
1074 globalStateID = StILOGLIST + (pageIsLine << 16); | |
1075 } | |
1076 | |
1077 | |
1078 void set_globalState_Menu_Line(uint8_t line) | |
1079 { | |
1080 globalStateID = ((globalStateID & MaskLineFieldDigit) + (line << 16)); | |
1081 } | |
1082 | |
1083 | |
1084 void set_globalState(uint32_t newID) | |
1085 { | |
1086 globalStateID = newID; | |
1087 } | |
1088 | |
1089 void set_returnFromComm(void) | |
1090 { | |
1091 returnFromCommCleanUpRequest = 1; | |
1092 } | |
1093 | |
1094 uint8_t font_update_required(void) | |
1095 { | |
1096 uint8_t *fontVersionHigh; | |
1097 uint8_t *fontVersionLow; | |
1098 | |
1099 fontVersionHigh = (uint8_t *)0x08132000; | |
1100 fontVersionLow = (uint8_t *)0x08132001; | |
1101 | |
1102 if(FONTminimum_required_high() < *fontVersionHigh) | |
1103 return 0; | |
1104 | |
1105 if((FONTminimum_required_high() == *fontVersionHigh) && (FONTminimum_required_low() <= *fontVersionLow)) | |
1106 return 0; | |
1107 | |
1108 return 1; | |
1109 } | |
1110 | |
1111 | |
132
135eae957389
Add compile switch to disable optimization for specific function
Ideenmodellierer
parents:
116
diff
changeset
|
1112 __attribute__((optimize("O0"))) void delayMicros(uint32_t micros) |
38 | 1113 { |
1114 micros = micros * (168/4) - 10; | |
1115 while(micros--); | |
1116 } | |
1117 | |
1118 | |
1119 void get_RTC_DateTime(RTC_DateTypeDef * sdatestructureget, RTC_TimeTypeDef * stimestructureget) | |
1120 { | |
1121 /* Get the RTC current Time */ | |
1122 if(sdatestructureget) | |
1123 HAL_RTC_GetTime(&RtcHandle, stimestructureget, FORMAT_BIN); | |
1124 /* Get the RTC current Date */ | |
1125 if(stimestructureget) | |
1126 HAL_RTC_GetDate(&RtcHandle, sdatestructureget, FORMAT_BIN); | |
1127 } | |
1128 | |
1129 | |
1130 void set_RTC_DateTime(RTC_DateTypeDef * sdatestructure, RTC_TimeTypeDef * stimestructure) | |
1131 { | |
1132 if(sdatestructure) | |
1133 if(HAL_RTC_SetDate(&RtcHandle,sdatestructure,FORMAT_BCD) != HAL_OK) | |
1134 { | |
1135 /* Initialization Error */ | |
1136 Error_Handler(); | |
1137 } | |
1138 | |
1139 if(stimestructure) | |
1140 if(HAL_RTC_SetTime(&RtcHandle,stimestructure,FORMAT_BCD) != HAL_OK) | |
1141 { | |
1142 /* Initialization Error */ | |
1143 Error_Handler(); | |
1144 } | |
1145 } | |
1146 | |
1147 static void TIM_init(void) | |
1148 { | |
1149 uint16_t uwPrescalerValue = 0; | |
1150 | |
1151 uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 10000) - 1; | |
1152 | |
1153 /* Set TIMx instance */ | |
1154 TimHandle.Instance = TIMx; | |
1155 | |
1156 /* Initialize TIM3 peripheral as follows: | |
1157 + Period = 10000 - 1 | |
1158 + Prescaler = ((SystemCoreClock/2)/10000) - 1 | |
1159 + ClockDivision = 0 | |
1160 + Counter direction = Up | |
1161 */ | |
1162 TimHandle.Init.Period = 1000 - 1; | |
1163 TimHandle.Init.Prescaler = uwPrescalerValue; | |
1164 TimHandle.Init.ClockDivision = 0; | |
1165 TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; | |
1166 if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK) | |
1167 { | |
1168 /* Initialization Error */ | |
1169 Error_Handler(); | |
1170 } | |
1171 | |
1172 /*##-2- Start the TIM Base generation in interrupt mode ####################*/ | |
1173 /* Start Channel1 */ | |
1174 if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK) | |
1175 { | |
1176 /* Starting Error */ | |
1177 Error_Handler(); | |
1178 } | |
1179 } | |
1180 | |
1181 #ifdef DEMOMODE | |
1182 static void TIM_DEMO_init(void) | |
1183 { | |
1184 uint16_t uwPrescalerValue = 0; | |
1185 | |
1186 uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 10000) - 1; | |
1187 | |
1188 /* Set TIMx instance */ | |
1189 TimDemoHandle.Instance = TIM7; | |
1190 | |
1191 /* Initialize TIM3 peripheral as follows: | |
1192 + Period = 10000 - 1 | |
1193 + Prescaler = ((SystemCoreClock/2)/10000) - 1 | |
1194 + ClockDivision = 0 | |
1195 + Counter direction = Up | |
1196 */ | |
1197 TimDemoHandle.Init.Period = 1000 - 1; | |
1198 TimDemoHandle.Init.Prescaler = uwPrescalerValue; | |
1199 TimDemoHandle.Init.ClockDivision = 0; | |
1200 TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; | |
1201 if(HAL_TIM_Base_Init(&TimDemoHandle) != HAL_OK) | |
1202 { | |
1203 /* Initialization Error */ | |
1204 Error_Handler(); | |
1205 } | |
1206 | |
1207 /*##-2- Start the TIM Base generation in interrupt mode ####################*/ | |
1208 /* Start Channel1 */ | |
1209 if(HAL_TIM_Base_Start_IT(&TimDemoHandle) != HAL_OK) | |
1210 { | |
1211 /* Starting Error */ | |
1212 Error_Handler(); | |
1213 } | |
1214 } | |
1215 #endif | |
1216 | |
1217 | |
1218 | |
1219 #ifndef TIM_BACKLIGHT | |
1220 | |
1221 static uint32_t TIM_BACKLIGHT_adjust(void) | |
1222 { | |
1223 return 0; | |
1224 } | |
1225 | |
1226 static void TIM_BACKLIGHT_init(void) | |
1227 { | |
1228 } | |
1229 #else | |
1230 static uint32_t TIM_BACKLIGHT_adjust(void) | |
1231 { | |
1232 static uint32_t levelActual = 12000; | |
1233 static uint8_t brightnessModeLast = 0; | |
1234 // static _Bool wasLostConnection = 0; | |
1235 | |
1236 uint32_t levelAmbient; | |
1237 uint32_t levelMax; | |
1238 uint32_t levelMin; | |
1239 uint32_t levelUpStep_100ms = 200; | |
1240 uint32_t levelDnStep_100ms = 20; | |
1241 | |
1242 TIM_OC_InitTypeDef sConfig; | |
1243 sConfig.OCMode = TIM_OCMODE_PWM1; | |
1244 sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; | |
1245 sConfig.OCFastMode = TIM_OCFAST_DISABLE; | |
1246 | |
1247 const SDiveState * pStateReal = stateRealGetPointer(); | |
1248 | |
1249 | |
1250 // if(pStateReal->data_old__lost_connection_to_slave) | |
1251 // { | |
1252 // changed 160613 from 6000 to 12000 | |
1253 // removed hw 161209 | |
1254 // levelAmbient = 12000; | |
1255 // levelActual = 12000; | |
1256 // wasLostConnection = 1; | |
1257 // } | |
1258 // else | |
1259 // { | |
1260 SSettings *pSettings = settingsGetPointer(); | |
1261 /* 300 - 4000 */ | |
1262 /* important levelAmbient 300 - 1200 */ | |
1263 levelAmbient = 10 * pStateReal->lifeData.ambient_light_level; | |
1264 | |
1265 switch( pSettings->brightness) | |
1266 { | |
1267 case 0: /* Cave */ | |
1268 levelMax = 3000;/* max 25 % (x2) */ | |
1269 levelMin = 1500; | |
1270 break; | |
1271 case 1: /* Eco */ | |
1272 levelMax = 6000;/* max 50 % (x2) */ | |
1273 levelMin = 3000; | |
1274 break; | |
1275 case 2: /* Std */ | |
1276 levelAmbient += 1000; | |
1277 levelMax = 9000; | |
1278 levelMin = 4500; | |
1279 levelUpStep_100ms += levelUpStep_100ms/2; // 4500 instead of 3000 | |
1280 levelDnStep_100ms += levelDnStep_100ms/2; | |
1281 break; | |
1282 case 3: /* High */ | |
1283 default: | |
1284 levelAmbient += 3000; | |
1285 levelMax = 12000; /* max 100% (x2) */ | |
1286 levelMin = 6000; | |
1287 levelUpStep_100ms += levelUpStep_100ms; // 6000 instead of 3000 | |
1288 levelDnStep_100ms += levelDnStep_100ms; | |
1289 break; | |
1290 case 4: /* New Max */ | |
1291 levelAmbient = 12000; | |
1292 levelMax = 12000; /* max 100% (x2) */ | |
1293 levelMin = 12000; | |
1294 levelUpStep_100ms += 12000; | |
1295 levelDnStep_100ms += 0; | |
1296 break; | |
1297 } | |
1298 | |
1299 if((pSettings->brightness != brightnessModeLast))// || wasLostConnection) | |
1300 { | |
1301 levelActual = levelAmbient; | |
1302 brightnessModeLast = pSettings->brightness; | |
1303 // wasLostConnection = 0; | |
1304 } | |
1305 // } | |
1306 | |
1307 if(levelAmbient > levelActual) | |
1308 levelActual += levelUpStep_100ms; | |
1309 else | |
1310 if((levelAmbient < levelActual) && (levelActual > levelMin) && (levelActual > levelDnStep_100ms)) | |
1311 levelActual -= levelDnStep_100ms; | |
1312 | |
1313 if(levelActual > levelMax) | |
1314 levelActual = levelMax; | |
1315 else | |
1316 if(levelActual < levelMin) | |
1317 levelActual = levelMin; | |
1318 | |
1319 // sConfig.Pulse = levelActual / 20; | |
1320 sConfig.Pulse = (levelMin + ((levelMax - levelMin)/2)) / 20; // added 170306 | |
1321 | |
1322 /* xx - 600 */ | |
1323 if(sConfig.Pulse > 600) | |
1324 sConfig.Pulse = 600; | |
1325 else | |
1326 if(sConfig.Pulse < 100) | |
1327 sConfig.Pulse = 100; | |
1328 | |
1329 HAL_TIM_PWM_ConfigChannel(&TimBacklightHandle, &sConfig, TIM_BACKLIGHT_CHANNEL); | |
1330 HAL_TIM_PWM_Start(&TimBacklightHandle, TIM_BACKLIGHT_CHANNEL); | |
1331 | |
1332 return levelActual; | |
1333 } | |
1334 | |
1335 static void TIM_BACKLIGHT_init(void) | |
1336 { | |
1337 uint32_t uwPrescalerValue = 0; | |
1338 TIM_OC_InitTypeDef sConfig; | |
1339 | |
1340 uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 18000000) - 1; | |
1341 | |
1342 TimBacklightHandle.Instance = TIM_BACKLIGHT; | |
1343 | |
1344 /* Initialize TIM3 peripheral as follows: | |
1345 30 kHz | |
1346 */ | |
1347 TimBacklightHandle.Init.Period = 600 - 1; | |
1348 TimBacklightHandle.Init.Prescaler = uwPrescalerValue; | |
1349 TimBacklightHandle.Init.ClockDivision = 0; | |
1350 TimBacklightHandle.Init.CounterMode = TIM_COUNTERMODE_UP; | |
1351 HAL_TIM_PWM_Init(&TimBacklightHandle); | |
1352 | |
1353 sConfig.OCMode = TIM_OCMODE_PWM1; | |
1354 sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; | |
1355 sConfig.OCFastMode = TIM_OCFAST_DISABLE; | |
263
a6c0375bc950
Forward 100ms time stamp to RTE and handle logbook in main loop
ideenmodellierer
parents:
250
diff
changeset
|
1356 sConfig.Pulse = 100; /* Initial brigthness of display */ |
38 | 1357 |
1358 HAL_TIM_PWM_ConfigChannel(&TimBacklightHandle, &sConfig, TIM_BACKLIGHT_CHANNEL); | |
1359 HAL_TIM_PWM_Start(&TimBacklightHandle, TIM_BACKLIGHT_CHANNEL); | |
1360 } | |
1361 #endif | |
1362 | |
1363 | |
1364 static void EXTILine_Buttons_Config(void) | |
1365 { | |
1366 GPIO_InitTypeDef GPIO_InitStructure; | |
1367 | |
1368 BUTTON_ENTER_GPIO_ENABLE(); | |
1369 BUTTON_NEXT_GPIO_ENABLE(); | |
1370 BUTTON_BACK_GPIO_ENABLE(); | |
1371 | |
1372 /* Configure pin as weak PULLUP input */ | |
1373 /* buttons */ | |
1374 GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; | |
1375 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
1376 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
1377 | |
1378 GPIO_InitStructure.Pin = BUTTON_ENTER_PIN; | |
1379 HAL_GPIO_Init(BUTTON_ENTER_GPIO_PORT, &GPIO_InitStructure); | |
1380 | |
1381 GPIO_InitStructure.Pin = BUTTON_NEXT_PIN; | |
1382 HAL_GPIO_Init(BUTTON_NEXT_GPIO_PORT, &GPIO_InitStructure); | |
1383 | |
1384 GPIO_InitStructure.Pin = BUTTON_BACK_PIN; | |
1385 HAL_GPIO_Init(BUTTON_BACK_GPIO_PORT, &GPIO_InitStructure); | |
1386 | |
1387 /* Enable and set EXTI Line0 Interrupt to the lowest priority */ | |
1388 HAL_NVIC_SetPriority(BUTTON_ENTER_EXTI_IRQn, 2, 0); | |
1389 HAL_NVIC_SetPriority(BUTTON_NEXT_EXTI_IRQn, 2, 0); | |
1390 HAL_NVIC_SetPriority(BUTTON_BACK_EXTI_IRQn, 2, 0); | |
1391 HAL_NVIC_EnableIRQ(BUTTON_ENTER_EXTI_IRQn); | |
1392 HAL_NVIC_EnableIRQ(BUTTON_NEXT_EXTI_IRQn); | |
1393 HAL_NVIC_EnableIRQ(BUTTON_BACK_EXTI_IRQn); | |
1394 | |
1395 #ifdef BUTTON_CUSTOM_PIN | |
1396 BUTTON_CUSTOM_GPIO_ENABLE(); | |
1397 GPIO_InitStructure.Pin = BUTTON_CUSTOM_PIN; | |
1398 HAL_GPIO_Init(BUTTON_CUSTOM_GPIO_PORT, &GPIO_InitStructure); | |
1399 HAL_NVIC_SetPriority(BUTTON_CUSTOM_EXTI_IRQn, 2, 0); | |
1400 HAL_NVIC_EnableIRQ(BUTTON_CUSTOM_EXTI_IRQn); | |
1401 #endif | |
1402 } | |
1403 | |
1404 | |
1405 /** | |
1406 * @brief System Clock Configuration | |
1407 * The system Clock is configured as follow : | |
1408 * System Clock source = PLL (HSE) | |
1409 * SYSCLK(Hz) = 180000000 | |
1410 * HCLK(Hz) = 180000000 | |
1411 * AHB Prescaler = 1 | |
1412 * APB1 Prescaler = 4 | |
1413 * APB2 Prescaler = 2 | |
1414 * HSE Frequency(Hz) = 8000000 | |
1415 * PLL_M = 8 | |
1416 * PLL_N = 360 | |
1417 * PLL_P = 2 | |
1418 * PLL_Q = 7 | |
1419 * VDD(V) = 3.3 | |
1420 * Main regulator output voltage = Scale1 mode | |
1421 * Flash Latency(WS) = 5 | |
1422 * The LTDC Clock is configured as follow : | |
1423 * PLLSAIN = 192 | |
1424 * PLLSAIR = 4 | |
1425 * PLLSAIDivR = 8 | |
1426 * @param None | |
1427 * @retval None | |
1428 */ | |
1429 static void SystemClock_Config(void) | |
1430 { | |
1431 | |
1432 /* Enable Power Control clock */ | |
1433 __PWR_CLK_ENABLE(); | |
1434 | |
1435 /* The voltage scaling allows optimizing the power consumption when the device is | |
1436 clocked below the maximum system frequency, to update the voltage scaling value | |
1437 regarding system frequency refer to product datasheet. */ | |
1438 __HAL_PWR_VOLTAGESCALING_CONFIG( PWR_REGULATOR_VOLTAGE_SCALE1 ); | |
1439 | |
1440 /*##-1- System Clock Configuration #########################################*/ | |
1441 /* Enable HighSpeed Oscillator and activate PLL with HSE/HSI as source */ | |
1442 RCC_OscInitTypeDef RCC_OscInitStruct = { 0 }; | |
1443 #ifdef DISC1_BOARD | |
1444 // Use High Speed Internal (HSI) oscillator, running at 16MHz. | |
1445 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; | |
1446 RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |
1447 RCC_OscInitStruct.HSICalibrationValue = 0x10; | |
1448 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; | |
1449 RCC_OscInitStruct.PLL.PLLM = 16; // HSI/16 is 1Mhz. | |
1450 #else | |
1451 // Use High Speed External oscillator, running at 8MHz | |
1452 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; | |
1453 RCC_OscInitStruct.HSEState = RCC_HSE_ON; | |
1454 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; | |
1455 RCC_OscInitStruct.PLL.PLLM = 8; // HSE/8 is 1Mhz. | |
1456 #endif | |
1457 // System clock = PLL (1MHz) * N/p = 180 MHz. | |
1458 RCC_OscInitStruct.PLL.PLLN = 360; | |
1459 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; | |
1460 RCC_OscInitStruct.PLL.PLLQ = 7; | |
1461 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |
1462 HAL_RCC_OscConfig( &RCC_OscInitStruct ); | |
1463 | |
1464 // HAL_PWREx_ActivateOverDrive(); | |
1465 HAL_PWREx_DeactivateOverDrive(); | |
1466 | |
1467 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ | |
1468 RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 }; | |
1469 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | |
1470 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; | |
1471 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |
1472 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |
1473 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; | |
1474 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; | |
1475 HAL_RCC_ClockConfig( &RCC_ClkInitStruct, FLASH_LATENCY_8 ); //FLASH_LATENCY_5); | |
1476 | |
1477 /*##-2- LTDC Clock Configuration ###########################################*/ | |
1478 /* LCD clock configuration */ | |
1479 /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ | |
1480 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ | |
1481 /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ | |
1482 /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDIVR_8 = 48/8 = 6 Mhz */ | |
1483 | |
1484 /* neu: 8MHz/8*300/5/8 = 7,5 MHz = 19,5 Hz bei 800 x 480 */ | |
1485 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; | |
1486 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; | |
1487 PeriphClkInitStruct.PLLSAI.PLLSAIN = 300; //192; | |
1488 PeriphClkInitStruct.PLLSAI.PLLSAIR = 5; //4; | |
1489 PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8;//RCC_PLLSAIDIVR_4;// RCC_PLLSAIDIVR_2; // RCC_PLLSAIDIVR_8 | |
1490 HAL_RCCEx_PeriphCLKConfig( &PeriphClkInitStruct ); | |
1491 } | |
1492 | |
1493 | |
1494 /** | |
1495 * @brief This function is executed in case of error occurrence. | |
1496 * @param None | |
1497 * @retval None | |
1498 */ | |
1499 static void Error_Handler(void) | |
1500 { | |
1501 /* Turn LED3 on */ | |
1502 // BSP_LED_On(LED3); | |
1503 while(1) | |
1504 { | |
1505 } | |
1506 } | |
1507 | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1508 /** |
38 | 1509 * @brief Perform the SDRAM exernal memory inialization sequence |
1510 * @param hsdram: SDRAM handle | |
1511 * @param Command: Pointer to SDRAM command structure | |
1512 * @retval None | |
1513 */ | |
1514 static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command) | |
1515 { | |
1516 __IO uint32_t tmpmrd =0; | |
1517 /* Step 3: Configure a clock configuration enable command */ | |
1518 Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; | |
1519 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; | |
1520 Command->AutoRefreshNumber = 1; | |
1521 Command->ModeRegisterDefinition = 0; | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1522 |
38 | 1523 /* Send the command */ |
1524 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); | |
1525 | |
1526 /* Step 4: Insert 100 ms delay */ | |
1527 HAL_Delay(100); | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1528 |
38 | 1529 /* Step 5: Configure a PALL (precharge all) command */ |
1530 Command->CommandMode = FMC_SDRAM_CMD_PALL; | |
1531 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; | |
1532 Command->AutoRefreshNumber = 1; | |
1533 Command->ModeRegisterDefinition = 0; | |
1534 | |
1535 /* Send the command */ | |
1536 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1537 |
38 | 1538 /* Step 6 : Configure a Auto-Refresh command */ |
1539 Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; | |
1540 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; | |
1541 Command->AutoRefreshNumber = 4; | |
1542 Command->ModeRegisterDefinition = 0; | |
1543 | |
1544 /* Send the command */ | |
1545 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1546 |
38 | 1547 /* Step 7: Program the external memory mode register */ |
1548 tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2 | | |
1549 SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | | |
1550 SDRAM_MODEREG_CAS_LATENCY_3 | | |
1551 SDRAM_MODEREG_OPERATING_MODE_STANDARD | | |
1552 SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1553 |
38 | 1554 Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE; |
1555 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; | |
1556 Command->AutoRefreshNumber = 1; | |
1557 Command->ModeRegisterDefinition = tmpmrd; | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1558 |
38 | 1559 /* Send the command */ |
1560 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); | |
1561 | |
1562 /* Step 8: Set the refresh rate counter */ | |
1563 /* (15.62 us x Freq) - 20 */ | |
1564 /* neu: (8 us x Freq) - 20 */ | |
1565 /* Set the device refresh counter */ | |
1566 HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT); | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1567 } |
38 | 1568 |
1569 | |
1570 /** | |
1571 ****************************************************************************** | |
1572 ****************************************************************************** | |
1573 ****************************************************************************** | |
1574 */ | |
1575 | |
1576 | |
1577 /** | |
1578 * @brief DMA2D configuration. | |
1579 * @note This function Configure tha DMA2D peripheral : | |
1580 * 1) Configure the transfer mode : memory to memory W/ pixel format conversion | |
1581 * 2) Configure the output color mode as ARGB4444 | |
1582 * 3) Configure the output memory address at SRAM memory | |
1583 * 4) Configure the data size : 320x120 (pixels) | |
1584 * 5) Configure the input color mode as ARGB8888 | |
1585 * 6) Configure the input memory address at FLASH memory | |
1586 * @retval | |
1587 * None | |
1588 */ | |
1589 | |
1590 static void SDRAM_Config(void) | |
1591 { | |
1592 /*##-1- Configure the SDRAM device #########################################*/ | |
1593 /* SDRAM device configuration */ | |
1594 hsdram.Instance = FMC_SDRAM_DEVICE; | |
1595 | |
1596 /* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */ | |
1597 /* TMRD: 2 Clock cycles */ | |
1598 SDRAM_Timing.LoadToActiveDelay = 2; | |
1599 /* TXSR: min=70ns (6x11.90ns) */ | |
1600 SDRAM_Timing.ExitSelfRefreshDelay = 7; | |
1601 /* TRAS: min=42ns (4x11.90ns) max=120k (ns) */ | |
1602 SDRAM_Timing.SelfRefreshTime = 4; | |
1603 /* TRC: min=63 (6x11.90ns) */ | |
1604 SDRAM_Timing.RowCycleDelay = 7; | |
1605 /* TWR: 2 Clock cycles */ | |
1606 SDRAM_Timing.WriteRecoveryTime = 2; | |
1607 /* TRP: 15ns => 2x11.90ns */ | |
1608 SDRAM_Timing.RPDelay = 2; | |
1609 /* TRCD: 15ns => 2x11.90ns */ | |
1610 SDRAM_Timing.RCDDelay = 2; | |
1611 | |
1612 hsdram.Init.SDBank = FMC_SDRAM_BANK2; | |
1613 hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9; | |
1614 hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; | |
1615 hsdram.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH; | |
1616 hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; | |
1617 hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; | |
1618 hsdram.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; | |
1619 hsdram.Init.SDClockPeriod = SDCLOCK_PERIOD; | |
1620 hsdram.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE; | |
1621 hsdram.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; | |
1622 | |
1623 /* Initialize the SDRAM controller */ | |
1624 if(HAL_SDRAM_Init(&hsdram, &SDRAM_Timing) != HAL_OK) | |
1625 { | |
1626 /* Initialization Error */ | |
1627 Error_Handler(); | |
1628 } | |
95
2a74647d28d1
Debounce. Bounced buttons fixed.
Dmitry Romanov <kitt@bk.ru>
parents:
91
diff
changeset
|
1629 |
38 | 1630 /* Program the SDRAM external device */ |
1631 SDRAM_Initialization_Sequence(&hsdram, &command); | |
1632 } | |
1633 | |
1634 | |
1635 #ifdef USE_FULL_ASSERT | |
1636 | |
1637 /** | |
1638 * @brief Reports the name of the source file and the source line number | |
1639 * where the assert_param error has occurred. | |
1640 * @param file: pointer to the source file name | |
1641 * @param line: assert_param error line source number | |
1642 * @retval None | |
1643 */ | |
1644 void assert_failed(uint8_t* file, uint32_t line) | |
1645 { | |
1646 /* User can add his own implementation to report the file name and line number, | |
1647 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ | |
1648 | |
1649 /* Infinite loop */ | |
1650 while (1) | |
1651 { | |
1652 } | |
1653 } | |
1654 #endif | |
1655 | |
1656 | |
1657 void deco_loop(void) | |
1658 { | |
1659 typedef enum | |
1660 { | |
1661 CALC_VPM, | |
1662 CALC_VPM_FUTURE, | |
1663 CALC_BUEHLMANN, | |
1664 CALC_BUEHLMANN_FUTURE, | |
149 | 1665 CALC_INVALID |
38 | 1666 } CALC_WHAT; |
1667 | |
149 | 1668 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
|
1669 static int counter = 0; |
38 | 1670 if((stateUsed->mode != MODE_DIVE) || (stateUsed->diveSettings.diveMode == DIVEMODE_Apnea) || (decoLock != DECO_CALC_ready )) |
1671 return; | |
1672 | |
1673 decoLock = DECO_CALC_running; | |
1674 | |
1675 if(stateDeco.diveSettings.deco_type.ub.standard == GF_MODE) | |
1676 { | |
1677 // 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)) | |
1678 if(what == CALC_BUEHLMANN) | |
1679 { | |
1680 //Calc future | |
1681 what = CALC_BUEHLMANN_FUTURE; | |
1682 } | |
1683 else | |
1684 what = CALC_BUEHLMANN; | |
1685 | |
1686 } | |
1687 else | |
1688 { | |
1689 // hw 151110 mh wants future TTS even in deco zone if((what == CALC_VPM) && (!stateDeco.vpm.deco_zone_reached)) | |
1690 if(what == CALC_VPM) | |
1691 { | |
1692 //Calc future | |
1693 what = CALC_VPM_FUTURE; | |
1694 } | |
1695 else | |
1696 what = CALC_VPM; | |
1697 } | |
1698 | |
1699 //In one of ten calc the other option | |
1700 if(counter == 10) | |
1701 { | |
1702 if(what == CALC_VPM) | |
1703 what = CALC_BUEHLMANN; | |
1704 if(what == CALC_BUEHLMANN) | |
1705 what = CALC_VPM; | |
1706 counter = 0; | |
1707 } | |
1708 | |
1709 decom_CreateGasChangeList(&stateDeco.diveSettings, &stateDeco.lifeData); | |
1710 | |
1711 switch(what) | |
1712 { | |
149 | 1713 case CALC_VPM: |
1714 vpm_calc(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.vpm,&stateDeco.decolistVPM, DECOSTOPS); | |
1715 decoLock = DECO_CALC_FINSHED_vpm; | |
1716 return; | |
1717 case CALC_VPM_FUTURE: | |
1718 decom_tissues_exposure(stateDeco.diveSettings.future_TTS_minutes * 60,&stateDeco.lifeData); | |
1719 vpm_calc(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.vpm,&stateDeco.decolistFutureVPM, FUTURESTOPS); | |
1720 decoLock = DECO_CALC_FINSHED_Futurevpm; | |
1721 return; | |
1722 case CALC_BUEHLMANN: | |
1723 buehlmann_calc_deco(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.decolistBuehlmann); | |
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
248
diff
changeset
|
1724 buehlmann_ceiling_calculator(&stateDeco.lifeData, &stateDeco.decolistBuehlmann); |
248 | 1725 buehlmann_super_saturation_calculator(&stateDeco.lifeData,&stateDeco.decolistBuehlmann); |
149 | 1726 decoLock = DECO_CALC_FINSHED_Buehlmann; |
1727 return; | |
1728 case CALC_BUEHLMANN_FUTURE: | |
1729 decom_tissues_exposure(stateDeco.diveSettings.future_TTS_minutes * 60,&stateDeco.lifeData); | |
1730 buehlmann_calc_deco(&stateDeco.lifeData,&stateDeco.diveSettings,&stateDeco.decolistFutureBuehlmann); | |
1731 decoLock = DECO_CALC_FINSHED_FutureBuehlmann; | |
1732 return; | |
1733 default: break; | |
38 | 1734 } |
1735 counter++; | |
1736 } | |
1737 | |
1738 void resetToFirmwareUpdate(void) | |
1739 { | |
1740 __HAL_RCC_CLEAR_RESET_FLAGS(); | |
1741 HAL_NVIC_SystemReset(); | |
1742 } | |
1743 | |
1744 // debugging by https://blog.feabhas.com/2013/02/developing-a-generic-hard-fault-handler-for-arm-cortex-m3cortex-m4/ | |
1745 | |
1746 /* | |
1747 void printErrorMsg(const char * errMsg) | |
1748 { | |
1749 | |
1750 // printf(errMsg); | |
1751 // return; | |
1752 | |
1753 while(*errMsg != 0){ | |
1754 ITM_SendChar(*errMsg); | |
1755 ++errMsg; | |
1756 } | |
1757 } | |
1758 | |
1759 enum { r0, r1, r2, r3, r12, lr, pc, psr}; | |
1760 | |
1761 void stackDump(uint32_t stack[]) | |
1762 { | |
1763 static char msg[80]; | |
1764 sprintf(msg, "r0 = 0x%08x\n", stack[r0]); printErrorMsg(msg); | |
1765 sprintf(msg, "r1 = 0x%08x\n", stack[r1]); printErrorMsg(msg); | |
1766 sprintf(msg, "r2 = 0x%08x\n", stack[r2]); printErrorMsg(msg); | |
1767 sprintf(msg, "r3 = 0x%08x\n", stack[r3]); printErrorMsg(msg); | |
1768 sprintf(msg, "r12 = 0x%08x\n", stack[r12]); printErrorMsg(msg); | |
1769 sprintf(msg, "lr = 0x%08x\n", stack[lr]); printErrorMsg(msg); | |
1770 sprintf(msg, "pc = 0x%08x\n", stack[pc]); printErrorMsg(msg); | |
1771 sprintf(msg, "psr = 0x%08x\n", stack[psr]); printErrorMsg(msg); | |
1772 } | |
1773 | |
1774 void printUsageErrorMsg(uint32_t CFSRValue) | |
1775 { | |
1776 printErrorMsg("Usage fault: "); | |
1777 CFSRValue >>= 16; // right shift to lsb | |
1778 if((CFSRValue & (1 << 9)) != 0) { | |
1779 printErrorMsg("Divide by zero\n"); | |
1780 } | |
1781 } | |
1782 | |
1783 void Hard_Fault_Handler()//uint32_t stack[]) | |
1784 { | |
1785 static char msg[80]; | |
1786 printErrorMsg("In Hard Fault Handler\n"); | |
1787 sprintf(msg, "SCB->HFSR = 0x%08x\n", SCB->HFSR); | |
1788 printErrorMsg(msg); | |
1789 if ((SCB->HFSR & (1 << 30)) != 0) { | |
1790 printErrorMsg("Forced Hard Fault\n"); | |
1791 sprintf(msg, "SCB->CFSR = 0x%08x\n", SCB->CFSR ); | |
1792 printErrorMsg(msg); | |
1793 if((SCB->CFSR & 0xFFFF0000) != 0) { | |
1794 printUsageErrorMsg(SCB->CFSR); | |
1795 } | |
1796 } | |
1797 __ASM volatile("BKPT #01"); | |
1798 while(1); | |
1799 } | |
1800 | |
1801 int my_store_of_MSP; | |
1802 | |
1803 void HardFault_Handler(void) | |
1804 { | |
1805 __asm ("MRS my_store_of_MSP, MSP"); | |
1806 Hard_Fault_Handler(); | |
1807 } | |
1808 */ | |
1809 | |
1810 /* | |
1811 __asm void HardFault_Handler(void) | |
1812 { | |
1813 TST lr, #4 // Test for MSP or PSP | |
1814 ITE EQ | |
1815 MRSEQ r0, MSP | |
1816 MRSNE r0, PSP | |
1817 B __cpp(Hard_Fault_Handler) | |
1818 } | |
1819 */ | |
1820 /* | |
1821 HardFault_Handler\ | |
1822 PROC | |
1823 EXPORT HardFault_Handler | |
1824 B . | |
1825 ENDP | |
1826 */ | |
1827 | |
1828 /* | |
1829 __asm int f(int i) | |
1830 { | |
1831 ADD i, i, #1 // error | |
1832 } | |
1833 | |
1834 EXPORT HardFault_Handler | |
1835 HardFault_Handler FUNCTION | |
1836 MRS r0, MSP | |
1837 B __cpp(Hard_Fault_Handler) | |
1838 ENDFUNC | |
1839 */ |