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