Open FFBoard
Open source force feedback firmware
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;
18
19uint16_t main_id = 0;
20
21FFBoardMain* mainclass __attribute__((section (CCRAM_SEC)));
23
24
25#define USBD_STACK_SIZE (3*configMINIMAL_STACK_SIZE/2)
26StackType_t usb_device_stack[USBD_STACK_SIZE];
27StaticTask_t usb_device_taskdef;
28
29
30void cppmain() {
31#ifdef FW_DEVID
32 if(HAL_GetDEVID() != FW_DEVID){
38 while(true){ // Block forever to prevent an incorrect firmware from damaging hardware
39 Error_Handler();
40 }
41 }
42#endif
43
44 // Flash init
45 if(!Flash_Init()){
46 Error_Handler();
47 }
48
49// // Check if flash is initialized
50// uint16_t lastVersion = 0;
51// if(!Flash_Read(ADR_SW_VERSION, &lastVersion)){ // Version never written
52// Flash_Write(ADR_SW_VERSION, (SW_VERSION_INT[0]<<8) | SW_VERSION_INT[1]);
53// }
54// Flash_Read(ADR_SW_VERSION,&lastVersion);
55// if((lastVersion & 0xff00) != (SW_VERSION_INT[0]<<8)){
56// //EE_Format(); // Major version changed or could not write initial value. force a format
57// Flash_Write(ADR_SW_VERSION, (SW_VERSION_INT[0]<<8) | SW_VERSION_INT[1]);
58// }
59 // Check if flash is initialized
60 uint16_t lastFlashVersion = 0;
61 if(!Flash_Read(ADR_FLASH_VERSION, &lastFlashVersion)){ // Version never written
62 Flash_Write(ADR_FLASH_VERSION, FLASH_VERSION);
63 }
64 Flash_Read(ADR_FLASH_VERSION,&lastFlashVersion);
65 if(lastFlashVersion != FLASH_VERSION){
66 Flash_Format(); // Major version changed or could not write initial value. force a format
67 Flash_Write(ADR_FLASH_VERSION, FLASH_VERSION);
68 }
69
70 // ------------------------
71
72 startADC(); // enable ADC DMA
73
74 // If switch pressed at boot select failsafe implementation
75#ifdef BTNFAILSAFE
76 if(HAL_GPIO_ReadPin(BUTTON_A_GPIO_Port, BUTTON_A_Pin) == 1){
77 main_id = 0;
78 }else
79#endif
80 if(!Flash_ReadWriteDefault(ADR_CURRENT_CONFIG, &main_id,DEFAULTMAIN)){
81 Error_Handler();
82 }
83
84 PersistentStorage::restoreFlashStartupCb(); // Flash is initialized. allow restoring now
85
87 if(mainclass == nullptr){ // invalid id
88 mainclass = mainchooser.Create(0); // Baseclass
89 }
90 mainclassChosen = true;
91
92 mainclass->usbInit(); // Let mainclass initialize usb
93
94 while(running){
96 updateLeds();
97 //external_spi.process();
99 taskYIELD(); // Change task if higher priority task wants to run
100 }
101}
102
104#ifdef HAL_IWDG_MODULE_ENABLED
105 HAL_IWDG_Refresh(&hiwdg); // Refresh watchdog
106#endif
107}
108
109
116uint32_t micros(){
117#ifdef TIM_MICROS_HALTICK
118 extern TIM_HandleTypeDef TIM_MICROS_HALTICK;
119 return (HAL_GetTick() * 1000) + TIM_MICROS_HALTICK.Instance->CNT;
120#elif defined(TIM_MICROS)
121 extern TIM_HandleTypeDef TIM_MICROS;
122 return TIM_MICROS.Instance->CNT;
123#else
124 return DWT->CYCCNT / clkmhz;
125#endif
126
127}
128
129
130void* malloc(size_t size)
131{
132 return pvPortMalloc(size);
133}
134
135void free(void *p)
136{
137 vPortFree(p);
138}
139
144unsigned long getRunTimeCounterValue(void){
145 return micros();
146}
147
TIM_TypeDef TIM_MICROS
virtual void update()
Definition: FFBoardMain.cpp:71
virtual void usbInit()
Definition: FFBoardMain.cpp:61
static void restoreFlashStartupCb()
void cppmain()
Definition: cppmain.cpp:30
uint32_t clkmhz
Definition: cppmain.cpp:10
uint32_t micros()
Definition: cppmain.cpp:116
bool running
Definition: cppmain.cpp:16
uint16_t main_id
Definition: cppmain.cpp:19
void refreshWatchdog()
Definition: cppmain.cpp:103
FFBoardMain *mainclass __attribute__((section(CCRAM_SEC)))
unsigned long getRunTimeCounterValue(void)
Definition: cppmain.cpp:144
ClassChooser< FFBoardMain > mainchooser(class_registry)
IWDG_HandleTypeDef hiwdg
bool mainclassChosen
Definition: cppmain.cpp:17
void * malloc(size_t size)
Definition: cppmain.cpp:130
void free(void *p)
Definition: cppmain.cpp:135
StaticTask_t usb_device_taskdef
Definition: cppmain.cpp:27
StackType_t usb_device_stack[USBD_STACK_SIZE]
Definition: cppmain.cpp:26
bool Flash_Init()
bool Flash_Format()
bool Flash_Write(uint16_t adr, uint16_t dat)
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()
Definition: ledEffects.cpp:103
const std::vector< class_entry< FFBoardMain > > class_registry