2019-11-17 14:47:04 -05:00
|
|
|
#include <FreeRTOS.h>
|
|
|
|
#include <task.h>
|
|
|
|
#include <legacy/nrf_drv_clock.h>
|
|
|
|
#include <libraries/timer/app_timer.h>
|
|
|
|
#include <libraries/gpiote/app_gpiote.h>
|
2019-12-05 15:19:47 -05:00
|
|
|
#include <DisplayApp/DisplayApp.h>
|
2019-12-21 11:58:00 -05:00
|
|
|
#include <softdevice/common/nrf_sdh.h>
|
2019-12-26 12:33:40 -05:00
|
|
|
#include <hal/nrf_rtc.h>
|
|
|
|
#include <timers.h>
|
2019-12-28 08:34:50 -05:00
|
|
|
#include <ble/ble_services/ble_cts_c/ble_cts_c.h>
|
|
|
|
#include <Components/DateTime/DateTimeController.h>
|
2019-12-23 13:57:45 -05:00
|
|
|
#include "BLE/BleManager.h"
|
2019-12-27 10:05:35 -05:00
|
|
|
#include "Components/Battery/BatteryController.h"
|
2019-12-27 11:05:49 -05:00
|
|
|
#include "Components/Ble/BleController.h"
|
2020-01-26 07:37:10 -05:00
|
|
|
#include <drivers/St7789.h>
|
|
|
|
#include <drivers/SpiMaster.h>
|
2020-02-10 15:05:33 -05:00
|
|
|
#include <DisplayApp/LittleVgl.h>
|
2020-02-23 07:44:39 -05:00
|
|
|
#include <SystemTask/SystemTask.h>
|
2020-03-28 14:05:28 -04:00
|
|
|
#include <Components/Ble/NotificationManager.h>
|
2020-02-08 12:01:02 -05:00
|
|
|
|
2019-11-17 14:47:04 -05:00
|
|
|
#if NRF_LOG_ENABLED
|
|
|
|
#include "Logging/NrfLogger.h"
|
|
|
|
Pinetime::Logging::NrfLogger logger;
|
|
|
|
#else
|
|
|
|
#include "Logging/DummyLogger.h"
|
|
|
|
Pinetime::Logging::DummyLogger logger;
|
|
|
|
#endif
|
|
|
|
|
2020-01-26 07:37:10 -05:00
|
|
|
static constexpr uint8_t pinSpiSck = 2;
|
|
|
|
static constexpr uint8_t pinSpiMosi = 3;
|
|
|
|
static constexpr uint8_t pinSpiMiso = 4;
|
|
|
|
static constexpr uint8_t pinSpiCsn = 25;
|
|
|
|
static constexpr uint8_t pinLcdDataCommand = 18;
|
|
|
|
|
2020-03-01 10:00:43 -05:00
|
|
|
Pinetime::Drivers::SpiMaster spi{Pinetime::Drivers::SpiMaster::SpiModule::SPI0, {
|
|
|
|
Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb,
|
|
|
|
Pinetime::Drivers::SpiMaster::Modes::Mode3,
|
|
|
|
Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz,
|
|
|
|
pinSpiSck,
|
|
|
|
pinSpiMosi,
|
|
|
|
pinSpiMiso,
|
|
|
|
pinSpiCsn
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Pinetime::Drivers::St7789 lcd {spi, pinLcdDataCommand};
|
|
|
|
Pinetime::Drivers::Cst816S touchPanel {};
|
|
|
|
Pinetime::Components::LittleVgl lvgl {lcd, touchPanel};
|
|
|
|
|
2020-01-26 07:37:10 -05:00
|
|
|
|
2019-12-26 12:33:40 -05:00
|
|
|
TimerHandle_t debounceTimer;
|
2019-12-27 10:05:35 -05:00
|
|
|
Pinetime::Controllers::Battery batteryController;
|
2019-12-27 11:05:49 -05:00
|
|
|
Pinetime::Controllers::Ble bleController;
|
2019-12-28 08:34:50 -05:00
|
|
|
Pinetime::Controllers::DateTime dateTimeController;
|
2020-01-12 10:39:03 -05:00
|
|
|
void ble_manager_set_ble_connection_callback(void (*connection)());
|
|
|
|
void ble_manager_set_ble_disconnection_callback(void (*disconnection)());
|
2020-01-03 10:32:31 -05:00
|
|
|
static constexpr uint8_t pinTouchIrq = 28;
|
2020-02-23 07:44:39 -05:00
|
|
|
std::unique_ptr<Pinetime::System::SystemTask> systemTask;
|
2020-01-03 10:32:31 -05:00
|
|
|
|
2020-03-28 14:05:28 -04:00
|
|
|
Pinetime::Controllers::NotificationManager notificationManager;
|
|
|
|
|
2019-12-26 12:33:40 -05:00
|
|
|
void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
|
2020-01-03 10:32:31 -05:00
|
|
|
if(pin == pinTouchIrq) {
|
2020-02-23 07:44:39 -05:00
|
|
|
systemTask->OnTouchEvent();
|
|
|
|
return ;
|
2020-01-03 10:32:31 -05:00
|
|
|
}
|
|
|
|
|
2019-12-26 12:33:40 -05:00
|
|
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
|
|
|
xTimerStartFromISR(debounceTimer, &xHigherPriorityTaskWoken);
|
2020-01-09 16:00:54 -05:00
|
|
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
2019-12-26 12:33:40 -05:00
|
|
|
}
|
|
|
|
|
2020-02-08 12:01:02 -05:00
|
|
|
extern "C" {
|
|
|
|
void vApplicationIdleHook(void) {
|
|
|
|
lv_tick_inc(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-26 12:33:40 -05:00
|
|
|
void DebounceTimerCallback(TimerHandle_t xTimer) {
|
|
|
|
xTimerStop(xTimer, 0);
|
2020-02-23 07:44:39 -05:00
|
|
|
systemTask->OnButtonPushed();
|
2019-11-17 14:47:04 -05:00
|
|
|
}
|
|
|
|
|
2020-01-12 10:39:03 -05:00
|
|
|
void OnBleConnection() {
|
2019-12-27 11:05:49 -05:00
|
|
|
bleController.Connect();
|
2020-01-12 10:39:03 -05:00
|
|
|
}
|
2019-12-28 08:34:50 -05:00
|
|
|
|
2020-01-12 10:39:03 -05:00
|
|
|
void OnBleDisconnection() {
|
|
|
|
bleController.Disconnect();
|
|
|
|
}
|
|
|
|
|
2020-03-25 16:23:40 -04:00
|
|
|
void OnNewNotification(const char* message, uint8_t size) {
|
2020-03-28 14:05:28 -04:00
|
|
|
notificationManager.Push(Pinetime::Controllers::NotificationManager::Categories::SimpleAlert, message, size);
|
2020-03-25 16:23:40 -04:00
|
|
|
systemTask->PushMessage(Pinetime::System::SystemTask::Messages::OnNewNotification);
|
|
|
|
}
|
|
|
|
|
2020-01-12 10:39:03 -05:00
|
|
|
void OnNewTime(current_time_char_t* currentTime) {
|
2019-12-28 08:34:50 -05:00
|
|
|
auto dayOfWeek = currentTime->exact_time_256.day_date_time.day_of_week;
|
|
|
|
auto year = currentTime->exact_time_256.day_date_time.date_time.year;
|
|
|
|
auto month = currentTime->exact_time_256.day_date_time.date_time.month;
|
|
|
|
auto day = currentTime->exact_time_256.day_date_time.date_time.day;
|
|
|
|
auto hour = currentTime->exact_time_256.day_date_time.date_time.hours;
|
|
|
|
auto minute = currentTime->exact_time_256.day_date_time.date_time.minutes;
|
|
|
|
auto second = currentTime->exact_time_256.day_date_time.date_time.seconds;
|
2020-01-18 07:56:25 -05:00
|
|
|
|
|
|
|
dateTimeController.SetTime(year, month, day,
|
|
|
|
dayOfWeek, hour, minute, second, nrf_rtc_counter_get(portNRF_RTC_REG));
|
2020-03-25 16:23:40 -04:00
|
|
|
|
|
|
|
systemTask->PushMessage(Pinetime::System::SystemTask::Messages::OnNewTime);
|
2019-12-21 11:58:00 -05:00
|
|
|
}
|
|
|
|
|
2020-01-22 13:45:53 -05:00
|
|
|
void SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler(void) {
|
|
|
|
if(((NRF_SPIM0->INTENSET & (1<<6)) != 0) && NRF_SPIM0->EVENTS_END == 1) {
|
|
|
|
NRF_SPIM0->EVENTS_END = 0;
|
2020-03-01 10:00:43 -05:00
|
|
|
spi.OnEndEvent();
|
2020-01-22 15:08:53 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if(((NRF_SPIM0->INTENSET & (1<<19)) != 0) && NRF_SPIM0->EVENTS_STARTED == 1) {
|
|
|
|
NRF_SPIM0->EVENTS_STARTED = 0;
|
2020-03-01 10:00:43 -05:00
|
|
|
spi.OnStartedEvent();
|
2020-01-22 13:45:53 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if(((NRF_SPIM0->INTENSET & (1<<1)) != 0) && NRF_SPIM0->EVENTS_STOPPED == 1) {
|
|
|
|
NRF_SPIM0->EVENTS_STOPPED = 0;
|
|
|
|
}
|
|
|
|
}
|
2020-02-23 07:44:39 -05:00
|
|
|
|
2019-11-17 14:47:04 -05:00
|
|
|
int main(void) {
|
|
|
|
logger.Init();
|
2020-03-01 10:00:43 -05:00
|
|
|
|
2019-11-17 14:47:04 -05:00
|
|
|
nrf_drv_clock_init();
|
|
|
|
|
2020-02-23 07:44:39 -05:00
|
|
|
debounceTimer = xTimerCreate ("debounceTimer", 200, pdFALSE, (void *) 0, DebounceTimerCallback);
|
|
|
|
|
2020-03-28 14:05:28 -04:00
|
|
|
systemTask.reset(new Pinetime::System::SystemTask(spi, lcd, touchPanel, lvgl, batteryController, bleController,
|
|
|
|
dateTimeController, notificationManager));
|
2020-02-23 07:44:39 -05:00
|
|
|
systemTask->Start();
|
|
|
|
|
2020-03-02 14:13:42 -05:00
|
|
|
ble_manager_init();
|
|
|
|
ble_manager_set_new_time_callback(OnNewTime);
|
|
|
|
ble_manager_set_ble_connection_callback(OnBleConnection);
|
|
|
|
ble_manager_set_ble_disconnection_callback(OnBleDisconnection);
|
2020-03-25 16:23:40 -04:00
|
|
|
ble_manager_set_new_notification_callback(OnNewNotification);
|
2020-02-23 10:14:03 -05:00
|
|
|
|
2019-11-17 14:47:04 -05:00
|
|
|
vTaskStartScheduler();
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
APP_ERROR_HANDLER(NRF_ERROR_FORBIDDEN);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-01-12 10:39:03 -05:00
|
|
|
|