summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Ventura <davidventura27@gmail.com>2021-05-16 21:13:22 +0200
committerGitHub <noreply@github.com>2021-05-16 21:13:22 +0200
commit9342d62a44830113241f0fdbc2951db93e474e26 (patch)
tree20094e33a7eb84060af9976433f54cb58fb1b1cb /src
parent5b2472c4bc84bbdd5e8326ea7562f6bc133cf00e (diff)
Emit event on power-present toggle (#320)
* Emit event on power-present toggle * clang-format on changes * also update battery status on any event * update comments; remove double battery update * Fix formatting * Vibrate shortly on charging event * debounce charge event
Diffstat (limited to 'src')
-rw-r--r--src/components/battery/BatteryController.cpp1
-rw-r--r--src/main.cpp15
-rw-r--r--src/systemtask/SystemTask.cpp22
-rw-r--r--src/systemtask/SystemTask.h4
4 files changed, 35 insertions, 7 deletions
diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp
index b39efefb..bc146457 100644
--- a/src/components/battery/BatteryController.cpp
+++ b/src/components/battery/BatteryController.cpp
@@ -15,7 +15,6 @@ Battery::Battery() {
void Battery::Init() {
nrf_gpio_cfg_input(chargingPin, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup);
- nrf_gpio_cfg_input(powerPresentPin, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup);
}
void Battery::Update() {
diff --git a/src/main.cpp b/src/main.cpp
index 04cef6b5..61194b95 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -101,11 +101,13 @@ Pinetime::Drivers::Bma421 motionSensor {twiMaster, motionSensorTwiAddress};
Pinetime::Drivers::Hrs3300 heartRateSensor {twiMaster, heartRateSensorTwiAddress};
TimerHandle_t debounceTimer;
+TimerHandle_t debounceChargeTimer;
Pinetime::Controllers::Battery batteryController;
Pinetime::Controllers::Ble bleController;
void ble_manager_set_ble_connection_callback(void (*connection)());
void ble_manager_set_ble_disconnection_callback(void (*disconnection)());
static constexpr uint8_t pinTouchIrq = 28;
+static constexpr uint8_t pinPowerPresentIrq = 19;
std::unique_ptr<Pinetime::System::SystemTask> systemTask;
Pinetime::Controllers::Settings settingsController {spiNorFlash};
@@ -119,6 +121,13 @@ void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action
}
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
+
+ if (pin == pinPowerPresentIrq and action == NRF_GPIOTE_POLARITY_TOGGLE) {
+ xTimerStartFromISR(debounceChargeTimer, &xHigherPriorityTaskWoken);
+ portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
+ return;
+ }
+
xTimerStartFromISR(debounceTimer, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
@@ -130,6 +139,11 @@ void vApplicationIdleHook(void) {
}
}
+void DebounceTimerChargeCallback(TimerHandle_t xTimer) {
+ xTimerStop(xTimer, 0);
+ systemTask->PushMessage(Pinetime::System::SystemTask::Messages::OnChargingEvent);
+}
+
void DebounceTimerCallback(TimerHandle_t xTimer) {
xTimerStop(xTimer, 0);
systemTask->OnButtonPushed();
@@ -248,6 +262,7 @@ int main(void) {
nrf_drv_clock_init();
debounceTimer = xTimerCreate("debounceTimer", 200, pdFALSE, (void*) 0, DebounceTimerCallback);
+ debounceChargeTimer = xTimerCreate("debounceTimerCharge", 200, pdFALSE, (void*) 0, DebounceTimerChargeCallback);
systemTask = std::make_unique<Pinetime::System::SystemTask>(spi,
lcd,
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 6d695e2c..59660623 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -149,6 +149,16 @@ void SystemTask::Work() {
nrfx_gpiote_in_init(pinTouchIrq, &pinConfig, nrfx_gpiote_evt_handler);
+ nrf_gpio_cfg_sense_input(pinPowerPresentIrq, (nrf_gpio_pin_pull_t) NRF_GPIO_PIN_NOPULL, (nrf_gpio_pin_sense_t) GPIO_PIN_CNF_SENSE_Low);
+
+ pinConfig.sense = NRF_GPIOTE_POLARITY_TOGGLE;
+ pinConfig.pull = NRF_GPIO_PIN_NOPULL;
+ pinConfig.is_watcher = false;
+ pinConfig.hi_accuracy = false;
+ pinConfig.skip_gpio_setup = true;
+
+ nrfx_gpiote_in_init(pinPowerPresentIrq, &pinConfig, nrfx_gpiote_evt_handler);
+
idleTimer = xTimerCreate("idleTimer", pdMS_TO_TICKS(settingsController.GetScreenTimeOut()), pdFALSE, this, IdleTimerCallback);
xTimerStart(idleTimer, 0);
@@ -161,12 +171,9 @@ void SystemTask::Work() {
uint8_t msg;
if (xQueueReceive(systemTasksMsgQueue, &msg, 100)) {
- // call the battery controller or use the MSG in DisplayApp to get the battery status ???
- // it is necessary to validate which is the most efficient
batteryController.Update();
- // displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
- // analyze a more efficient way to do this refreshment
- // this and the UpdateMotion(); can be called on a timer to be independent of the main process ???
+ // the battery does not emit events when changing charge levels, so we piggyback
+ // on any system event to read and update the current values
Messages message = static_cast<Messages>(msg);
switch (message) {
@@ -274,6 +281,11 @@ void SystemTask::Work() {
// Remember we'll have to reset the counter next time we're awake
stepCounterMustBeReset = true;
break;
+ case Messages::OnChargingEvent:
+ motorController.SetDuration(15);
+ // Battery level is updated on every message - there's no need to do anything
+ break;
+
default:
break;
}
diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h
index e65fbea0..52e71b17 100644
--- a/src/systemtask/SystemTask.h
+++ b/src/systemtask/SystemTask.h
@@ -55,7 +55,8 @@ namespace Pinetime {
OnDisplayTaskSleeping,
EnableSleeping,
DisableSleeping,
- OnNewDay
+ OnNewDay,
+ OnChargingEvent
};
SystemTask(Drivers::SpiMaster& spi,
@@ -121,6 +122,7 @@ namespace Pinetime {
static constexpr uint8_t pinLcdDataCommand = 18;
static constexpr uint8_t pinButton = 13;
static constexpr uint8_t pinTouchIrq = 28;
+ static constexpr uint8_t pinPowerPresentIrq = 19;
static void Process(void* instance);
void Work();