Open FFBoard
Open source force feedback firmware
Loading...
Searching...
No Matches
cppmain.cpp
Go to the documentation of this file.
1#include "main.h"
2#include "cppmain.h"
3#include "mainclass_chooser.h"
4#include "flash_helpers.h"
5#include "global_callbacks.h"
6#include "cpp_target_config.h"
7#include "cmsis_os.h"
8#include "tusb.h"
9
10uint32_t clkmhz = HAL_RCC_GetHCLKFreq() / 100000;
11
12#ifdef HAL_IWDG_MODULE_ENABLED
13extern IWDG_HandleTypeDef hiwdg; // Watchdog
14#endif
15
16bool running = true;
17bool mainclassChosen = false;
18volatile bool forceErase = false;
19
20uint16_t main_id = 0;
21
22FFBoardMain* mainclass __attribute__((section (CCRAM_SEC)));
24
25
26#define USBD_STACK_SIZE (3*configMINIMAL_STACK_SIZE/2)
27StackType_t usb_device_stack[USBD_STACK_SIZE];
28StaticTask_t usb_device_taskdef;
29
30
31void cppmain() {
32#ifdef FW_DEVID
33 if(HAL_GetDEVID() != FW_DEVID){
39 while(true){ // Block forever to prevent an incorrect firmware from damaging hardware
40 Error_Handler();
41 }
42 }
43#endif
44
45 // Flash init
46 if(!Flash_Init()){
47 Error_Handler();
48 }
49
50 if(forceErase){
53 }
54
55// // Check if flash is initialized
56// uint16_t lastVersion = 0;
57// if(!Flash_Read(ADR_SW_VERSION, &lastVersion)){ // Version never written
58// Flash_Write(ADR_SW_VERSION, (SW_VERSION_INT[0]<<8) | SW_VERSION_INT[1]);
59// }
60// Flash_Read(ADR_SW_VERSION,&lastVersion);
61// if((lastVersion & 0xff00) != (SW_VERSION_INT[0]<<8)){
62// //EE_Format(); // Major version changed or could not write initial value. force a format
63// Flash_Write(ADR_SW_VERSION, (SW_VERSION_INT[0]<<8) | SW_VERSION_INT[1]);
64// }
65 // Check if flash is initialized
66 uint16_t lastFlashVersion = 0;
67 if(!Flash_Read(ADR_FLASH_VERSION, &lastFlashVersion)){ // Version never written
69 Flash_Write(ADR_FLASH_VERSION, FLASH_VERSION);
70 }
71 Flash_Read(ADR_FLASH_VERSION,&lastFlashVersion);
72 if(lastFlashVersion != FLASH_VERSION){
73 Flash_Format(); // Major version changed or could not write initial value. force a format
75 Flash_Write(ADR_FLASH_VERSION, FLASH_VERSION);
76 }
77
78 // ------------------------
79
80 startADC(); // enable ADC DMA
81
82 // If switch pressed at boot select failsafe implementation
83#ifdef BTNFAILSAFE
84 if(HAL_GPIO_ReadPin(BUTTON_A_GPIO_Port, BUTTON_A_Pin) == 1){
85 main_id = 0;
86 }else
87#endif
88 if(!Flash_ReadWriteDefault(ADR_CURRENT_CONFIG, &main_id,DEFAULTMAIN)){
89 Error_Handler();
90 }
91
92 PersistentStorage::restoreFlashStartupCb(); // Flash is initialized. allow restoring now
93
95 if(mainclass == nullptr){ // invalid id
96 mainclass = mainchooser.Create(0); // Baseclass
97 }
98 mainclassChosen = true;
99
100 mainclass->usbInit(); // Let mainclass initialize usb
101
102 while(running){
103 mainclass->update();
104 updateLeds();
105 //external_spi.process();
107 taskYIELD(); // Change task if higher priority task wants to run
108 }
109}
110
112#ifdef HAL_IWDG_MODULE_ENABLED
113 HAL_IWDG_Refresh(&hiwdg); // Refresh watchdog
114#endif
115}
116
117
124uint32_t micros(){
125#ifdef TIM_MICROS_HALTICK
126 extern TIM_HandleTypeDef TIM_MICROS_HALTICK;
127 return (HAL_GetTick() * 1000) + TIM_MICROS_HALTICK.Instance->CNT;
128#elif defined(TIM_MICROS)
129 extern TIM_HandleTypeDef TIM_MICROS;
130 return TIM_MICROS.Instance->CNT;
131#else
132 return DWT->CYCCNT / clkmhz;
133#endif
134
135}
136
137
138void* malloc(size_t size)
139{
140 return pvPortMalloc(size);
141}
142
143void free(void *p)
144{
145 vPortFree(p);
146}
147
152unsigned long getRunTimeCounterValue(void){
153 return micros();
154}
155
static void restoreFlashStartupCb()
void cppmain()
Definition cppmain.cpp:31
uint32_t clkmhz
Definition cppmain.cpp:10
uint32_t micros()
Definition cppmain.cpp:124
bool running
Definition cppmain.cpp:16
volatile bool forceErase
Definition cppmain.cpp:18
uint16_t main_id
Definition cppmain.cpp:20
void refreshWatchdog()
Definition cppmain.cpp:111
FFBoardMain *mainclass __attribute__((section(CCRAM_SEC)))
unsigned long getRunTimeCounterValue(void)
Definition cppmain.cpp:152
ClassChooser< FFBoardMain > mainchooser(class_registry)
IWDG_HandleTypeDef hiwdg
bool mainclassChosen
Definition cppmain.cpp:17
void * malloc(size_t size)
Definition cppmain.cpp:138
void free(void *p)
Definition cppmain.cpp:143
StaticTask_t usb_device_taskdef
Definition cppmain.cpp:28
StackType_t usb_device_stack[USBD_STACK_SIZE]
Definition cppmain.cpp:27
bool Flash_Init()
bool Flash_Format()
bool Flash_Write(uint16_t adr, uint16_t dat)
void Flash_Write_Defaults()
bool Flash_ReadWriteDefault(uint16_t adr, uint16_t *buf, uint16_t def)
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty=true)
FFBoardMain * mainclass
void startADC()
void updateLeds()
const std::vector< class_entry< FFBoardMain > > class_registry