diff options
Diffstat (limited to 'src/systemtask/SystemTask.cpp')
| -rw-r--r-- | src/systemtask/SystemTask.cpp | 100 |
1 files changed, 43 insertions, 57 deletions
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 6f6d474..3353a45 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -2,7 +2,6 @@ #include <hal/nrf_rtc.h> #include <libraries/gpiote/app_gpiote.h> #include <libraries/log/nrf_log.h> - #include "BootloaderVersion.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" @@ -176,39 +175,29 @@ void SystemTask::Work() { buttonHandler.Init(this); - // Button - nrf_gpio_cfg_output(15); - nrf_gpio_pin_set(15); - + // Setup Interrupts nrfx_gpiote_in_config_t pinConfig; pinConfig.skip_gpio_setup = false; pinConfig.hi_accuracy = false; pinConfig.is_watcher = false; - pinConfig.sense = static_cast<nrf_gpiote_polarity_t>(NRF_GPIOTE_POLARITY_TOGGLE); - pinConfig.pull = static_cast<nrf_gpio_pin_pull_t>(GPIO_PIN_CNF_PULL_Pulldown); + // Button + nrf_gpio_cfg_output(PinMap::ButtonEnable); + nrf_gpio_pin_set(PinMap::ButtonEnable); + pinConfig.sense = NRF_GPIOTE_POLARITY_TOGGLE; + pinConfig.pull = NRF_GPIO_PIN_PULLDOWN; nrfx_gpiote_in_init(PinMap::Button, &pinConfig, nrfx_gpiote_evt_handler); nrfx_gpiote_in_event_enable(PinMap::Button, true); // Touchscreen - nrf_gpio_cfg_sense_input(PinMap::Cst816sIrq, - static_cast<nrf_gpio_pin_pull_t>(GPIO_PIN_CNF_PULL_Pullup), - static_cast<nrf_gpio_pin_sense_t>(GPIO_PIN_CNF_SENSE_Low)); - - pinConfig.skip_gpio_setup = true; - pinConfig.hi_accuracy = false; - pinConfig.is_watcher = false; - pinConfig.sense = static_cast<nrf_gpiote_polarity_t>(NRF_GPIOTE_POLARITY_HITOLO); - pinConfig.pull = static_cast<nrf_gpio_pin_pull_t>(GPIO_PIN_CNF_PULL_Pullup); - + pinConfig.sense = NRF_GPIOTE_POLARITY_HITOLO; + pinConfig.pull = NRF_GPIO_PIN_PULLUP; nrfx_gpiote_in_init(PinMap::Cst816sIrq, &pinConfig, nrfx_gpiote_evt_handler); + nrfx_gpiote_in_event_enable(PinMap::Cst816sIrq, true); // Power present pinConfig.sense = NRF_GPIOTE_POLARITY_TOGGLE; pinConfig.pull = NRF_GPIO_PIN_NOPULL; - pinConfig.is_watcher = false; - pinConfig.hi_accuracy = false; - pinConfig.skip_gpio_setup = false; nrfx_gpiote_in_init(PinMap::PowerPresent, &pinConfig, nrfx_gpiote_evt_handler); nrfx_gpiote_in_event_enable(PinMap::PowerPresent, true); @@ -262,27 +251,27 @@ void SystemTask::Work() { nimbleController.RestartFastAdv(); } - isSleeping = false; - isWakingUp = false; + state = SystemTaskState::Running; isDimmed = false; break; case Messages::TouchWakeUp: { if (touchHandler.GetNewTouchInfo()) { auto gesture = touchHandler.GestureGet(); - if (gesture != Pinetime::Applications::TouchEvents::None and - ((gesture == Pinetime::Applications::TouchEvents::DoubleTap and - settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) or - (gesture == Pinetime::Applications::TouchEvents::Tap and + if (gesture != Pinetime::Applications::TouchEvents::None && + ((gesture == Pinetime::Applications::TouchEvents::DoubleTap && + settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) || + (gesture == Pinetime::Applications::TouchEvents::Tap && settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)))) { GoToRunning(); } } - } break; + break; + } case Messages::GoToSleep: if (doNotGoToSleep) { break; } - isGoingToSleep = true; + state = SystemTaskState::GoingToSleep; // Already set in PushMessage() NRF_LOG_INFO("[systemtask] Going to sleep"); xTimerStop(idleTimer, 0); xTimerStop(dimTimer, 0); @@ -304,7 +293,7 @@ void SystemTask::Work() { break; case Messages::OnNewNotification: if (settingsController.GetNotificationStatus() == Pinetime::Controllers::Settings::Notification::ON) { - if (isSleeping && !isWakingUp) { + if (state == SystemTaskState::Sleeping) { GoToRunning(); } else { ReloadIdleTimer(); @@ -313,14 +302,14 @@ void SystemTask::Work() { } break; case Messages::OnTimerDone: - if (isSleeping && !isWakingUp) { + if (state == SystemTaskState::Sleeping) { GoToRunning(); } motorController.RunForDuration(35); displayApp.PushMessage(Pinetime::Applications::Display::Messages::TimerDone); break; case Messages::SetOffAlarm: - if (isSleeping && !isWakingUp) { + if (state == SystemTaskState::Sleeping) { GoToRunning(); } motorController.StartRinging(); @@ -328,7 +317,6 @@ void SystemTask::Work() { break; case Messages::StopRinging: motorController.StopRinging(); - alarmController.OnStopRinging(); break; case Messages::BleConnected: ReloadIdleTimer(); @@ -337,7 +325,7 @@ void SystemTask::Work() { break; case Messages::BleFirmwareUpdateStarted: doNotGoToSleep = true; - if (isSleeping && !isWakingUp) { + if (state == SystemTaskState::Sleeping) { GoToRunning(); } displayApp.PushMessage(Pinetime::Applications::Display::Messages::BleFirmwareUpdateStarted); @@ -352,8 +340,9 @@ void SystemTask::Work() { case Messages::StartFileTransfer: NRF_LOG_INFO("[systemtask] FS Started"); doNotGoToSleep = true; - if (isSleeping && !isWakingUp) + if (state == SystemTaskState::Sleeping) { GoToRunning(); + } // TODO add intent of fs access icon or something break; case Messages::StopFileTransfer: @@ -402,8 +391,7 @@ void SystemTask::Work() { touchPanel.Sleep(); } - isSleeping = true; - isGoingToSleep = false; + state = SystemTaskState::Sleeping; break; case Messages::OnNewDay: // We might be sleeping (with TWI device disabled. @@ -422,14 +410,15 @@ void SystemTask::Work() { if (message == Messages::OnNewHour) { chimeDuration = 22; chimeWakeup = true; - } else if (chimeOption >= Controllers::Settings::ChimesOption::HalfHours && (minute = dateTimeController.Minutes()) == 30) { + } else if (chimeOption >= Controllers::Settings::ChimesOption::HalfHours && + (minute = dateTimeController.Minutes()) == 30) { chimeDuration = 18; } else if (chimeOption > Controllers::Settings::ChimesOption::HalfHours) { chimeDuration = 11; } else { break; } - if (chimeWakeup && isSleeping && !isWakingUp) { + if (chimeWakeup && state == SystemTaskState::Sleeping) { GoToRunning(); displayApp.PushMessage(Pinetime::Applications::Display::Messages::Clock); } @@ -441,7 +430,7 @@ void SystemTask::Work() { batteryController.ReadPowerState(); motorController.RunForDuration(15); ReloadIdleTimer(); - if (isSleeping && !isWakingUp) { + if (state == SystemTaskState::Sleeping) { GoToRunning(); } break; @@ -452,7 +441,7 @@ void SystemTask::Work() { nimbleController.NotifyBatteryLevel(batteryController.PercentRemaining()); break; case Messages::OnPairing: - if (isSleeping && !isWakingUp) { + if (state == SystemTaskState::Sleeping) { GoToRunning(); } motorController.RunForDuration(35); @@ -480,7 +469,7 @@ void SystemTask::Work() { if (isBleDiscoveryTimerRunning) { if (bleDiscoveryTimer == 0) { isBleDiscoveryTimerRunning = false; - // Services discovery is deffered from 3 seconds to avoid the conflicts between the host communicating with the + // Services discovery is deferred from 3 seconds to avoid the conflicts between the host communicating with the // target and vice-versa. I'm not sure if this is the right way to handle this... nimbleController.StartDiscovery(); } else { @@ -500,14 +489,15 @@ void SystemTask::Work() { } void SystemTask::UpdateMotion() { - if (isGoingToSleep or isWakingUp) { + if (state == SystemTaskState::GoingToSleep || state == SystemTaskState::WakingUp) { return; } - if (isSleeping && !(settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) || - settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake))) { + if (state == SystemTaskState::Sleeping && !(settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) || + settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake))) { return; } + if (stepCounterMustBeReset) { motionSensor.ResetStepCounter(); stepCounterMustBeReset = false; @@ -519,7 +509,7 @@ void SystemTask::UpdateMotion() { motionController.Update(motionValues.x, motionValues.y, motionValues.z, motionValues.steps); if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) && - motionController.Should_RaiseWake(isSleeping)) { + motionController.Should_RaiseWake(state == SystemTaskState::Sleeping)) { GoToRunning(); } if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake) && @@ -540,7 +530,7 @@ void SystemTask::HandleButtonAction(Controllers::ButtonActions action) { switch (action) { case Actions::Click: // If the first action after fast wakeup is a click, it should be ignored. - if (!fastWakeUpDone && !isGoingToSleep) { + if (!fastWakeUpDone && state != SystemTaskState::GoingToSleep) { displayApp.PushMessage(Applications::Display::Messages::ButtonPushed); } break; @@ -561,20 +551,16 @@ void SystemTask::HandleButtonAction(Controllers::ButtonActions action) { } void SystemTask::GoToRunning() { - if (isGoingToSleep or (not isSleeping) or isWakingUp) { - return; + if (state == SystemTaskState::Sleeping) { + state = SystemTaskState::WakingUp; + PushMessage(Messages::GoToRunning); } - isWakingUp = true; - PushMessage(Messages::GoToRunning); } void SystemTask::OnTouchEvent() { - if (isGoingToSleep) { - return; - } - if (!isSleeping) { + if (state == SystemTaskState::Running) { PushMessage(Messages::OnTouchEvent); - } else if (!isWakingUp) { + } else if (state == SystemTaskState::Sleeping) { if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap) or settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) { PushMessage(Messages::TouchWakeUp); @@ -584,7 +570,7 @@ void SystemTask::OnTouchEvent() { void SystemTask::PushMessage(System::Messages msg) { if (msg == Messages::GoToSleep && !doNotGoToSleep) { - isGoingToSleep = true; + state = SystemTaskState::GoingToSleep; } if (in_isr()) { @@ -619,7 +605,7 @@ void SystemTask::OnIdle() { } void SystemTask::ReloadIdleTimer() { - if (isSleeping || isGoingToSleep) { + if (state != SystemTaskState::Running) { return; } if (isDimmed) { |
