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