The code assumes that whenever scheduler is running I2CSemaphore is available. Initialising it in a task might lead to race conditions and is also not happening at all if the task is disabled (for debugging or due to lack of need for a particular usecase). The race condition can't happen with the current code though, as GUI task has lower priority than the MOV task, and they're the only tasks that currently use I2C. However, this might change in the future with the code refactoring or introduction of new features.
97 lines
2.6 KiB
C++
97 lines
2.6 KiB
C++
// By Ben V. Brown - V2.0 of the TS100 firmware
|
|
|
|
/*
|
|
* Main.cpp bootstraps the device and then hands over to FreeRTOS and the threads
|
|
*/
|
|
|
|
#include "BSP.h"
|
|
#include <main.hpp>
|
|
#include "LIS2DH12.hpp"
|
|
#include <MMA8652FC.hpp>
|
|
#include <power.hpp>
|
|
#include "Settings.h"
|
|
#include "cmsis_os.h"
|
|
uint8_t PCBVersion = 0;
|
|
// File local variables
|
|
bool usb_pd_available = false;
|
|
bool settingsWereReset = false;
|
|
// FreeRTOS variables
|
|
|
|
osThreadId GUITaskHandle;
|
|
static const size_t GUITaskStackSize = 1024 / 4;
|
|
uint32_t GUITaskBuffer[GUITaskStackSize];
|
|
osStaticThreadDef_t GUITaskControlBlock;
|
|
|
|
osThreadId PIDTaskHandle;
|
|
static const size_t PIDTaskStackSize = 512 / 4;
|
|
uint32_t PIDTaskBuffer[PIDTaskStackSize];
|
|
osStaticThreadDef_t PIDTaskControlBlock;
|
|
osThreadId MOVTaskHandle;
|
|
static const size_t MOVTaskStackSize = 512 / 4;
|
|
uint32_t MOVTaskBuffer[MOVTaskStackSize];
|
|
osStaticThreadDef_t MOVTaskControlBlock;
|
|
|
|
// End FreeRTOS
|
|
|
|
// Main sets up the hardware then hands over to the FreeRTOS kernel
|
|
int main(void) {
|
|
preRToSInit();
|
|
|
|
setTipX10Watts(0); // force tip off
|
|
resetWatchdog();
|
|
OLED::initialize(); // start up the LCD
|
|
OLED::setFont(0); // default to bigger font
|
|
// Testing for which accelerometer is mounted
|
|
resetWatchdog();
|
|
usb_pd_available = usb_pd_detect();
|
|
resetWatchdog();
|
|
settingsWereReset = restoreSettings(); // load the settings from flash
|
|
#ifdef ACCEL_MMA
|
|
if (MMA8652FC::detect()) {
|
|
PCBVersion = 1;
|
|
MMA8652FC::initalize(); // this sets up the I2C registers
|
|
} else
|
|
#endif
|
|
#ifdef ACCEL_LIS
|
|
if (LIS2DH12::detect()) {
|
|
PCBVersion = 2;
|
|
// Setup the ST Accelerometer
|
|
LIS2DH12::initalize(); // startup the accelerometer
|
|
} else
|
|
#endif
|
|
{
|
|
PCBVersion = 3;
|
|
systemSettings.SleepTime = 0;
|
|
systemSettings.ShutdownTime = 0; // No accel -> disable sleep
|
|
systemSettings.sensitivity = 0;
|
|
}
|
|
resetWatchdog();
|
|
|
|
/* Create the thread(s) */
|
|
/* definition and creation of GUITask */
|
|
|
|
osThreadStaticDef(GUITask, startGUITask, osPriorityBelowNormal, 0,
|
|
GUITaskStackSize, GUITaskBuffer, &GUITaskControlBlock);
|
|
GUITaskHandle = osThreadCreate(osThread(GUITask), NULL);
|
|
|
|
/* definition and creation of PIDTask */
|
|
osThreadStaticDef(PIDTask, startPIDTask, osPriorityRealtime, 0,
|
|
PIDTaskStackSize, PIDTaskBuffer, &PIDTaskControlBlock);
|
|
PIDTaskHandle = osThreadCreate(osThread(PIDTask), NULL);
|
|
|
|
osThreadStaticDef(MOVTask, startMOVTask, osPriorityNormal, 0,
|
|
MOVTaskStackSize, MOVTaskBuffer, &MOVTaskControlBlock);
|
|
MOVTaskHandle = osThreadCreate(osThread(MOVTask), NULL);
|
|
|
|
resetWatchdog();
|
|
|
|
/* Init the IPC objects */
|
|
FRToSI2C::FRToSInit();
|
|
|
|
/* Start scheduler */
|
|
osKernelStart();
|
|
/* We should never get here as control is now taken by the scheduler */
|
|
for (;;) {
|
|
}
|
|
}
|