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