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