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