Huge refactoring for C++ and low-power mode

The display currently shows the time, with hours and minutes, and is
capable of receiving input with buttons (though does nothing). It
sleeps during intervals where nothing is happening. The display task
runs once per second, and RTC alarm A is used for periodic alarms to
update the system time.
This commit is contained in:
2019-04-17 21:51:35 -07:00
parent 6747d6c831
commit a7f1ffc1b5
22 changed files with 1051 additions and 231 deletions

View File

@@ -19,12 +19,13 @@
* THE SOFTWARE.
*/
#include "ConcreteTaskScheduler.h"
#include "LowPowerTaskScheduler.h"
#include "RtcDriver.h"
#include "DisplayDriver.h"
#include "SpiDriver.h"
#include "BlinkTask.h"
#include "LowPowerDelay.h"
#include "DisplayTimeTask.h"
#include "LptimPwm.h"
#include "ButtonManager.h"
#include "stm32l0xx.h"
@@ -32,12 +33,12 @@
using Common::Time;
static Common::Schedule::ConcreteTaskScheduler<10> g_sched;
static Common::Schedule::LowPowerTaskScheduler<10> g_sched;
static BSP::SpiDriver g_spi(g_sched);
static BSP::DisplayDriver g_display(g_sched, g_spi);
//static BlinkTask g_blink(Common::Time::seconds(2));
static BSP::LptimPwm g_lptim_pwm(LPTIM1);
static BSP::ButtonManager g_btn_manager(0, 1, 3, Time::millis(1));
static DisplayTimeTask g_display_time(g_display);
//static LowPowerDelay g_lp_delay;
extern "C" void __cxa_pure_virtual() { while(1) {} }
@@ -116,25 +117,61 @@ static void _init(void)
(*func)();
}
}
}
[[noreturn]] void main() {
_init();
BSP::SystemTimer::init(RTC);
// Set up the system clock
BSP::RtcDriver::init();
BSP::SystemTimer::set_timer(BSP::RtcDriver::get_system_timer());
BSP::LowPower::init();
// Initialize the tasks
g_lptim_pwm.init();
g_spi.init();
g_btn_manager.init();
g_display.init();
//g_blink.init();
g_display_time.init();
// Enqueue each of the tasks
Common::Schedule::NextTime asap = Common::Schedule::NextTime::asap();
//g_sched.add_task(g_blink, asap);
//g_sched.add_task(g_lp_delay, asap);
g_sched.add_task(g_spi, asap);
g_sched.add_task(g_btn_manager, asap);
g_sched.add_task(g_display, asap);
g_sched.add_task(g_display_time, asap);
// And we're off! This will never return
g_sched.run();
}
extern "C" void NMI_Handler() {while (1);}
extern "C" void HardFault_Handler() {while (1);}
extern "C" void SVC_Handler() {while (1);}
extern "C" void PendSV_Handler() {while (1);}
extern "C" void SysTick_Handler() {while (1);}
extern "C" void WWDG_IRQHandler() {while (1);}
extern "C" void PVD_IRQHandler() {while (1);}
extern "C" void WDT_IRQHandler() {while (1);}
//extern "C" void RTC_IRQHandler() {while (1);}
extern "C" void FLASH_IRQHandler() {while (1);}
extern "C" void RCC_CRS_IRQHandler() {while (1);}
// extern "C" void EXTI_1_0_IRQHandler() {while (1);}
// extern "C" void EXTI_3_2_IRQHandler() {while (1);}
// extern "C" void EXTI_15_4_IRQHandler() {while (1);}
extern "C" void DMA1_CHANNEL1_IRQHandler() {while (1);}
extern "C" void DMA1_CHANNEL3_2_IRQHandler() {while (1);}
extern "C" void DMA_CHANNEL_7_4_IRQHandler() {while (1);}
extern "C" void ADC_COMP_IRQHandler() {while (1);}
extern "C" void LPTIM1_IRQHandler() {while (1);}
extern "C" void USART4_USART5_IRQHandler() {while (1);}
extern "C" void TIM2_IRQHandler() {while (1);}
extern "C" void TIM3_IRQHandler() {while (1);}
extern "C" void TIM6_IRQHandler() {while (1);}
extern "C" void TIM7_IRQHandler() {while (1);}
extern "C" void TIM21_IRQHandler() {while (1);}
extern "C" void I2C3_IRQHandler() {while (1);}
extern "C" void TIM22_IRQHandler() {while (1);}