comparison Discovery/Src/base.c @ 95:2a74647d28d1 kittz

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