Merge upstream
This commit is contained in:
@@ -92,6 +92,9 @@ set(SDK_SOURCE_FILES
|
||||
set(TINYCRYPT_SRC
|
||||
libs/mynewt-nimble/ext/tinycrypt/src/aes_encrypt.c
|
||||
libs/mynewt-nimble/ext/tinycrypt/src/utils.c
|
||||
libs/mynewt-nimble/ext/tinycrypt/src/cmac_mode.c
|
||||
libs/mynewt-nimble/ext/tinycrypt/src/ecc.c
|
||||
libs/mynewt-nimble/ext/tinycrypt/src/ecc_dh.c
|
||||
)
|
||||
|
||||
set(NIMBLE_SRC
|
||||
@@ -104,6 +107,10 @@ set(NIMBLE_SRC
|
||||
libs/mynewt-nimble/nimble/host/src/ble_l2cap.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_hs_mbuf.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm_cmd.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm_lgcy.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm_alg.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm_sc.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_gap.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_gatts.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_gattc.c
|
||||
@@ -127,10 +134,6 @@ set(NIMBLE_SRC
|
||||
libs/mynewt-nimble/nimble/host/src/ble_hs_atomic.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_hs_adv.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_hs_flow.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm_cmd.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm_lgcy.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_sm_alg.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_hs_mqueue.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_hs_stop.c
|
||||
libs/mynewt-nimble/nimble/host/src/ble_hs_startup.c
|
||||
@@ -625,6 +628,7 @@ set(INCLUDE_FILES
|
||||
drivers/DebugPins.h
|
||||
drivers/InternalFlash.h
|
||||
drivers/Hrs3300.h
|
||||
drivers/PinMap.h
|
||||
drivers/Bma421.h
|
||||
drivers/Bma421_C/bma4.c
|
||||
drivers/Bma421_C/bma423.c
|
||||
|
@@ -1,4 +1,5 @@
|
||||
#include "BatteryController.h"
|
||||
#include "drivers/PinMap.h"
|
||||
#include <hal/nrf_gpio.h>
|
||||
#include <nrfx_saadc.h>
|
||||
#include <algorithm>
|
||||
@@ -9,15 +10,12 @@ Battery* Battery::instance = nullptr;
|
||||
|
||||
Battery::Battery() {
|
||||
instance = this;
|
||||
}
|
||||
|
||||
void Battery::Init() {
|
||||
nrf_gpio_cfg_input(chargingPin, static_cast<nrf_gpio_pin_pull_t> GPIO_PIN_CNF_PULL_Pullup);
|
||||
nrf_gpio_cfg_input(PinMap::Charging, static_cast<nrf_gpio_pin_pull_t> GPIO_PIN_CNF_PULL_Disabled);
|
||||
}
|
||||
|
||||
void Battery::Update() {
|
||||
isCharging = !nrf_gpio_pin_read(chargingPin);
|
||||
isPowerPresent = !nrf_gpio_pin_read(powerPresentPin);
|
||||
isCharging = !nrf_gpio_pin_read(PinMap::Charging);
|
||||
isPowerPresent = !nrf_gpio_pin_read(PinMap::PowerPresent);
|
||||
|
||||
if (isReading) {
|
||||
return;
|
||||
@@ -75,5 +73,11 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) {
|
||||
|
||||
nrfx_saadc_uninit();
|
||||
isReading = false;
|
||||
|
||||
systemTask->PushMessage(System::Messages::BatteryMeasurementDone);
|
||||
}
|
||||
}
|
||||
|
||||
void Battery::Register(Pinetime::System::SystemTask* systemTask) {
|
||||
this->systemTask = systemTask;
|
||||
}
|
||||
|
@@ -1,8 +1,7 @@
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
#include <drivers/include/nrfx_saadc.h>
|
||||
#include <array>
|
||||
#include <numeric>
|
||||
#include <systemtask/SystemTask.h>
|
||||
|
||||
namespace Pinetime {
|
||||
namespace Controllers {
|
||||
@@ -11,8 +10,8 @@ namespace Pinetime {
|
||||
public:
|
||||
Battery();
|
||||
|
||||
void Init();
|
||||
void Update();
|
||||
void Register(System::SystemTask* systemTask);
|
||||
|
||||
uint8_t PercentRemaining() const {
|
||||
return percentRemaining;
|
||||
@@ -34,8 +33,6 @@ namespace Pinetime {
|
||||
static Battery* instance;
|
||||
nrf_saadc_value_t saadc_value;
|
||||
|
||||
static constexpr uint32_t chargingPin = 12;
|
||||
static constexpr uint32_t powerPresentPin = 19;
|
||||
static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7;
|
||||
uint16_t voltage = 0;
|
||||
uint8_t percentRemaining = 0;
|
||||
@@ -49,6 +46,8 @@ namespace Pinetime {
|
||||
static void AdcCallbackStatic(nrfx_saadc_evt_t const* event);
|
||||
|
||||
bool isReading = false;
|
||||
|
||||
Pinetime::System::SystemTask* systemTask = nullptr;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@@ -42,6 +42,19 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
|
||||
serviceDiscovery({¤tTimeClient, &alertNotificationClient}) {
|
||||
}
|
||||
|
||||
void nimble_on_reset(int reason) {
|
||||
NRF_LOG_INFO("Resetting state; reason=%d\n", reason);
|
||||
}
|
||||
|
||||
void nimble_on_sync(void) {
|
||||
int rc;
|
||||
|
||||
rc = ble_hs_util_ensure_addr(0);
|
||||
ASSERT(rc == 0);
|
||||
|
||||
nptr->StartAdvertising();
|
||||
}
|
||||
|
||||
int GAPEventCallback(struct ble_gap_event* event, void* arg) {
|
||||
auto nimbleController = static_cast<NimbleController*>(arg);
|
||||
return nimbleController->OnGAPEvent(event);
|
||||
@@ -51,6 +64,10 @@ void NimbleController::Init() {
|
||||
while (!ble_hs_synced()) {
|
||||
}
|
||||
|
||||
nptr = this;
|
||||
ble_hs_cfg.reset_cb = nimble_on_reset;
|
||||
ble_hs_cfg.sync_cb = nimble_on_sync;
|
||||
|
||||
ble_svc_gap_init();
|
||||
ble_svc_gatt_init();
|
||||
|
||||
@@ -64,28 +81,31 @@ void NimbleController::Init() {
|
||||
batteryInformationService.Init();
|
||||
immediateAlertService.Init();
|
||||
heartRateService.Init();
|
||||
int res;
|
||||
res = ble_hs_util_ensure_addr(0);
|
||||
ASSERT(res == 0);
|
||||
res = ble_hs_id_infer_auto(0, &addrType);
|
||||
ASSERT(res == 0);
|
||||
res = ble_svc_gap_device_name_set(deviceName);
|
||||
ASSERT(res == 0);
|
||||
|
||||
int rc;
|
||||
rc = ble_hs_util_ensure_addr(0);
|
||||
ASSERT(rc == 0);
|
||||
rc = ble_hs_id_infer_auto(0, &addrType);
|
||||
ASSERT(rc == 0);
|
||||
rc = ble_svc_gap_device_name_set(deviceName);
|
||||
ASSERT(rc == 0);
|
||||
rc = ble_svc_gap_device_appearance_set(0xC2);
|
||||
ASSERT(rc == 0);
|
||||
Pinetime::Controllers::Ble::BleAddress address;
|
||||
res = ble_hs_id_copy_addr(addrType, address.data(), nullptr);
|
||||
ASSERT(res == 0);
|
||||
rc = ble_hs_id_copy_addr(addrType, address.data(), nullptr);
|
||||
ASSERT(rc == 0);
|
||||
bleController.AddressType((addrType == 0) ? Ble::AddressTypes::Public : Ble::AddressTypes::Random);
|
||||
bleController.Address(std::move(address));
|
||||
|
||||
res = ble_gatts_start();
|
||||
ASSERT(res == 0);
|
||||
rc = ble_gatts_start();
|
||||
ASSERT(rc == 0);
|
||||
|
||||
if (!ble_gap_adv_active() && !bleController.IsConnected())
|
||||
StartAdvertising();
|
||||
}
|
||||
|
||||
void NimbleController::StartAdvertising() {
|
||||
if (bleController.IsConnected() || ble_gap_conn_active() || ble_gap_adv_active())
|
||||
return;
|
||||
|
||||
ble_svc_gap_device_name_set(deviceName);
|
||||
int rc;
|
||||
|
||||
/* set adv parameters */
|
||||
struct ble_gap_adv_params adv_params;
|
||||
@@ -102,11 +122,17 @@ void NimbleController::StartAdvertising() {
|
||||
|
||||
adv_params.conn_mode = BLE_GAP_CONN_MODE_UND;
|
||||
adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
|
||||
/* fast advertise for 30 sec */
|
||||
if (fastAdvCount < 15) {
|
||||
adv_params.itvl_min = 32;
|
||||
adv_params.itvl_max = 47;
|
||||
fastAdvCount++;
|
||||
} else {
|
||||
adv_params.itvl_min = 1636;
|
||||
adv_params.itvl_max = 1651;
|
||||
}
|
||||
|
||||
fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
|
||||
// fields.uuids128 = BLE_UUID128(BLE_UUID128_DECLARE(
|
||||
// 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
|
||||
// 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff));
|
||||
fields.uuids128 = &dfuServiceUuid;
|
||||
fields.num_uuids128 = 1;
|
||||
fields.uuids128_is_complete = 1;
|
||||
@@ -116,28 +142,25 @@ void NimbleController::StartAdvertising() {
|
||||
rsp_fields.name_len = strlen(deviceName);
|
||||
rsp_fields.name_is_complete = 1;
|
||||
|
||||
ble_gap_adv_set_fields(&fields);
|
||||
// ASSERT(res == 0); // TODO this one sometimes fails with error 22 (notsync)
|
||||
rc = ble_gap_adv_set_fields(&fields);
|
||||
ASSERT(rc == 0);
|
||||
|
||||
ble_gap_adv_rsp_set_fields(&rsp_fields);
|
||||
// ASSERT(res == 0);
|
||||
rc = ble_gap_adv_rsp_set_fields(&rsp_fields);
|
||||
ASSERT(rc == 0);
|
||||
|
||||
ble_gap_adv_start(addrType, NULL, 180000, &adv_params, GAPEventCallback, this);
|
||||
// ASSERT(res == 0);// TODO I've disabled these ASSERT as they sometime asserts and reset the mcu.
|
||||
// For now, the advertising is restarted as soon as it ends. There may be a race condition
|
||||
// that prevent the advertising from restarting reliably.
|
||||
// I remove the assert to prevent this uncesseray crash, but in the long term, the management of
|
||||
// the advertising should be improve (better error handling, and advertise for 3 minutes after
|
||||
// the application has been woken up, for example.
|
||||
rc = ble_gap_adv_start(addrType, NULL, 2000, &adv_params, GAPEventCallback, this);
|
||||
ASSERT(rc == 0);
|
||||
}
|
||||
|
||||
int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||
switch (event->type) {
|
||||
case BLE_GAP_EVENT_ADV_COMPLETE:
|
||||
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE");
|
||||
NRF_LOG_INFO("advertise complete; reason=%dn status=%d", event->adv_complete.reason, event->connect.status);
|
||||
NRF_LOG_INFO("reason=%d; status=%d", event->adv_complete.reason, event->connect.status);
|
||||
StartAdvertising();
|
||||
break;
|
||||
case BLE_GAP_EVENT_CONNECT: {
|
||||
|
||||
case BLE_GAP_EVENT_CONNECT:
|
||||
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_CONNECT");
|
||||
|
||||
/* A new connection was established or a connection attempt failed. */
|
||||
@@ -145,35 +168,44 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||
|
||||
if (event->connect.status != 0) {
|
||||
/* Connection failed; resume advertising. */
|
||||
StartAdvertising();
|
||||
currentTimeClient.Reset();
|
||||
alertNotificationClient.Reset();
|
||||
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
|
||||
bleController.Disconnect();
|
||||
fastAdvCount = 0;
|
||||
StartAdvertising();
|
||||
} else {
|
||||
connectionHandle = event->connect.conn_handle;
|
||||
bleController.Connect();
|
||||
systemTask.PushMessage(Pinetime::System::Messages::BleConnected);
|
||||
connectionHandle = event->connect.conn_handle;
|
||||
// Service discovery is deffered via systemtask
|
||||
// Service discovery is deferred via systemtask
|
||||
}
|
||||
} break;
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVENT_DISCONNECT:
|
||||
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_DISCONNECT");
|
||||
NRF_LOG_INFO("disconnect; reason=%d", event->disconnect.reason);
|
||||
NRF_LOG_INFO("disconnect reason=%d", event->disconnect.reason);
|
||||
|
||||
/* Connection terminated; resume advertising. */
|
||||
currentTimeClient.Reset();
|
||||
alertNotificationClient.Reset();
|
||||
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
|
||||
bleController.Disconnect();
|
||||
fastAdvCount = 0;
|
||||
StartAdvertising();
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVENT_CONN_UPDATE:
|
||||
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_CONN_UPDATE");
|
||||
/* The central has updated the connection parameters. */
|
||||
NRF_LOG_INFO("connection updated; status=%d ", event->conn_update.status);
|
||||
NRF_LOG_INFO("update status=%d ", event->conn_update.status);
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVENT_ENC_CHANGE:
|
||||
/* Encryption has been enabled or disabled for this connection. */
|
||||
NRF_LOG_INFO("encryption change event; status=%d ", event->enc_change.status);
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVENT_SUBSCRIBE:
|
||||
NRF_LOG_INFO("subscribe event; conn_handle=%d attr_handle=%d "
|
||||
"reason=%d prevn=%d curn=%d previ=%d curi=???\n",
|
||||
@@ -183,10 +215,12 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||
event->subscribe.prev_notify,
|
||||
event->subscribe.cur_notify,
|
||||
event->subscribe.prev_indicate);
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVENT_MTU:
|
||||
NRF_LOG_INFO("mtu update event; conn_handle=%d cid=%d mtu=%d\n", event->mtu.conn_handle, event->mtu.channel_id, event->mtu.value);
|
||||
return 0;
|
||||
NRF_LOG_INFO("mtu update event; conn_handle=%d cid=%d mtu=%d\n",
|
||||
event->mtu.conn_handle, event->mtu.channel_id, event->mtu.value);
|
||||
break;
|
||||
|
||||
case BLE_GAP_EVENT_REPEAT_PAIRING: {
|
||||
/* We already have a bond with the peer, but it is attempting to
|
||||
@@ -217,8 +251,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||
notifSize);
|
||||
|
||||
alertNotificationClient.OnNotification(event);
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
/* Attribute data is contained in event->notify_rx.attr_data. */
|
||||
|
||||
default:
|
||||
@@ -229,7 +262,9 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||
}
|
||||
|
||||
void NimbleController::StartDiscovery() {
|
||||
serviceDiscovery.StartDiscovery(connectionHandle);
|
||||
if (connectionHandle != BLE_HS_CONN_HANDLE_NONE) {
|
||||
serviceDiscovery.StartDiscovery(connectionHandle);
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t NimbleController::connHandle() {
|
||||
@@ -237,7 +272,7 @@ uint16_t NimbleController::connHandle() {
|
||||
}
|
||||
|
||||
void NimbleController::NotifyBatteryLevel(uint8_t level) {
|
||||
if(connectionHandle != BLE_HS_CONN_HANDLE_NONE) {
|
||||
if (connectionHandle != BLE_HS_CONN_HANDLE_NONE) {
|
||||
batteryInformationService.NotifyBatteryLevel(connectionHandle, level);
|
||||
}
|
||||
}
|
||||
|
@@ -72,6 +72,10 @@ namespace Pinetime {
|
||||
uint16_t connHandle();
|
||||
void NotifyBatteryLevel(uint8_t level);
|
||||
|
||||
void RestartFastAdv() {
|
||||
fastAdvCount = 0;
|
||||
}
|
||||
|
||||
private:
|
||||
static constexpr const char* deviceName = "InfiniTime";
|
||||
Pinetime::System::SystemTask& systemTask;
|
||||
@@ -94,6 +98,7 @@ namespace Pinetime {
|
||||
|
||||
uint8_t addrType; // 1 = Random, 0 = PUBLIC
|
||||
uint16_t connectionHandle = BLE_HS_CONN_HANDLE_NONE;
|
||||
uint8_t fastAdvCount = 0;
|
||||
|
||||
ble_uuid128_t dfuServiceUuid {
|
||||
.u {.type = BLE_UUID_TYPE_128},
|
||||
@@ -101,5 +106,7 @@ namespace Pinetime {
|
||||
|
||||
ServiceDiscovery serviceDiscovery;
|
||||
};
|
||||
|
||||
static NimbleController* nptr;
|
||||
}
|
||||
}
|
||||
|
@@ -1,13 +1,13 @@
|
||||
#include "BrightnessController.h"
|
||||
#include <hal/nrf_gpio.h>
|
||||
#include "displayapp/screens/Symbols.h"
|
||||
|
||||
#include "drivers/PinMap.h"
|
||||
using namespace Pinetime::Controllers;
|
||||
|
||||
void BrightnessController::Init() {
|
||||
nrf_gpio_cfg_output(pinLcdBacklight1);
|
||||
nrf_gpio_cfg_output(pinLcdBacklight2);
|
||||
nrf_gpio_cfg_output(pinLcdBacklight3);
|
||||
nrf_gpio_cfg_output(PinMap::LcdBacklightLow);
|
||||
nrf_gpio_cfg_output(PinMap::LcdBacklightMedium);
|
||||
nrf_gpio_cfg_output(PinMap::LcdBacklightHigh);
|
||||
Set(level);
|
||||
}
|
||||
|
||||
@@ -16,24 +16,24 @@ void BrightnessController::Set(BrightnessController::Levels level) {
|
||||
switch (level) {
|
||||
default:
|
||||
case Levels::High:
|
||||
nrf_gpio_pin_clear(pinLcdBacklight1);
|
||||
nrf_gpio_pin_clear(pinLcdBacklight2);
|
||||
nrf_gpio_pin_clear(pinLcdBacklight3);
|
||||
nrf_gpio_pin_clear(PinMap::LcdBacklightLow);
|
||||
nrf_gpio_pin_clear(PinMap::LcdBacklightMedium);
|
||||
nrf_gpio_pin_clear(PinMap::LcdBacklightHigh);
|
||||
break;
|
||||
case Levels::Medium:
|
||||
nrf_gpio_pin_clear(pinLcdBacklight1);
|
||||
nrf_gpio_pin_clear(pinLcdBacklight2);
|
||||
nrf_gpio_pin_set(pinLcdBacklight3);
|
||||
nrf_gpio_pin_clear(PinMap::LcdBacklightLow);
|
||||
nrf_gpio_pin_clear(PinMap::LcdBacklightMedium);
|
||||
nrf_gpio_pin_set(PinMap::LcdBacklightHigh);
|
||||
break;
|
||||
case Levels::Low:
|
||||
nrf_gpio_pin_clear(pinLcdBacklight1);
|
||||
nrf_gpio_pin_set(pinLcdBacklight2);
|
||||
nrf_gpio_pin_set(pinLcdBacklight3);
|
||||
nrf_gpio_pin_clear(PinMap::LcdBacklightLow);
|
||||
nrf_gpio_pin_set(PinMap::LcdBacklightMedium);
|
||||
nrf_gpio_pin_set(PinMap::LcdBacklightHigh);
|
||||
break;
|
||||
case Levels::Off:
|
||||
nrf_gpio_pin_set(pinLcdBacklight1);
|
||||
nrf_gpio_pin_set(pinLcdBacklight2);
|
||||
nrf_gpio_pin_set(pinLcdBacklight3);
|
||||
nrf_gpio_pin_set(PinMap::LcdBacklightLow);
|
||||
nrf_gpio_pin_set(PinMap::LcdBacklightMedium);
|
||||
nrf_gpio_pin_set(PinMap::LcdBacklightHigh);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -22,9 +22,6 @@ namespace Pinetime {
|
||||
const char* ToString();
|
||||
|
||||
private:
|
||||
static constexpr uint8_t pinLcdBacklight1 = 14;
|
||||
static constexpr uint8_t pinLcdBacklight2 = 22;
|
||||
static constexpr uint8_t pinLcdBacklight3 = 23;
|
||||
Levels level = Levels::High;
|
||||
Levels backupLevel = Levels::High;
|
||||
};
|
||||
|
@@ -2,6 +2,7 @@
|
||||
#include <hal/nrf_gpio.h>
|
||||
#include "systemtask/SystemTask.h"
|
||||
#include "app_timer.h"
|
||||
#include "drivers/PinMap.h"
|
||||
|
||||
APP_TIMER_DEF(shortVibTimer);
|
||||
APP_TIMER_DEF(longVibTimer);
|
||||
@@ -12,8 +13,8 @@ MotorController::MotorController(Controllers::Settings& settingsController) : se
|
||||
}
|
||||
|
||||
void MotorController::Init() {
|
||||
nrf_gpio_cfg_output(pinMotor);
|
||||
nrf_gpio_pin_set(pinMotor);
|
||||
nrf_gpio_cfg_output(PinMap::Motor);
|
||||
nrf_gpio_pin_set(PinMap::Motor);
|
||||
app_timer_init();
|
||||
|
||||
app_timer_create(&shortVibTimer, APP_TIMER_MODE_SINGLE_SHOT, StopMotor);
|
||||
@@ -30,7 +31,7 @@ void MotorController::RunForDuration(uint8_t motorDuration) {
|
||||
return;
|
||||
}
|
||||
|
||||
nrf_gpio_pin_clear(pinMotor);
|
||||
nrf_gpio_pin_clear(PinMap::Motor);
|
||||
app_timer_start(shortVibTimer, APP_TIMER_TICKS(motorDuration), nullptr);
|
||||
}
|
||||
|
||||
@@ -44,9 +45,9 @@ void MotorController::StartRinging() {
|
||||
|
||||
void MotorController::StopRinging() {
|
||||
app_timer_stop(longVibTimer);
|
||||
nrf_gpio_pin_set(pinMotor);
|
||||
nrf_gpio_pin_set(PinMap::Motor);
|
||||
}
|
||||
|
||||
void MotorController::StopMotor(void* p_context) {
|
||||
nrf_gpio_pin_set(pinMotor);
|
||||
nrf_gpio_pin_set(PinMap::Motor);
|
||||
}
|
||||
|
@@ -1,12 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include "app_timer.h"
|
||||
#include "components/settings/Settings.h"
|
||||
|
||||
namespace Pinetime {
|
||||
namespace Controllers {
|
||||
static constexpr uint8_t pinMotor = 16;
|
||||
|
||||
class MotorController {
|
||||
public:
|
||||
|
@@ -114,7 +114,7 @@ namespace Pinetime {
|
||||
};
|
||||
|
||||
void setWakeUpMode(WakeUpMode wakeUp, bool enabled) {
|
||||
if (!isWakeUpModeOn(wakeUp)) {
|
||||
if (enabled != isWakeUpModeOn(wakeUp)) {
|
||||
settingsChanged = true;
|
||||
}
|
||||
settings.wakeUpMode.set(static_cast<size_t>(wakeUp), enabled);
|
||||
|
@@ -139,9 +139,6 @@ void DisplayApp::InitHw() {
|
||||
brightnessController.Set(settingsController.GetBrightness());
|
||||
}
|
||||
|
||||
uint32_t acc = 0;
|
||||
uint32_t count = 0;
|
||||
bool toggle = true;
|
||||
void DisplayApp::Refresh() {
|
||||
TickType_t queueTimeout;
|
||||
TickType_t delta;
|
||||
@@ -197,9 +194,6 @@ void DisplayApp::Refresh() {
|
||||
// clockScreen.SetBleConnectionState(bleController.IsConnected() ? Screens::Clock::BleConnectionStates::Connected :
|
||||
// Screens::Clock::BleConnectionStates::NotConnected);
|
||||
break;
|
||||
case Messages::UpdateBatteryLevel:
|
||||
batteryController.Update();
|
||||
break;
|
||||
case Messages::NewNotification:
|
||||
LoadApp(Apps::NotificationsPreview, DisplayApp::FullRefreshDirections::Down);
|
||||
break;
|
||||
|
@@ -5,6 +5,7 @@
|
||||
#include <components/rle/RleDecoder.h>
|
||||
#include <touchhandler/TouchHandler.h>
|
||||
#include "displayapp/icons/infinitime/infinitime-nb.c"
|
||||
#include "components/ble/BleController.h"
|
||||
|
||||
using namespace Pinetime::Applications;
|
||||
|
||||
|
@@ -6,32 +6,38 @@
|
||||
#include <bits/unique_ptr.h>
|
||||
#include <queue.h>
|
||||
#include "components/gfx/Gfx.h"
|
||||
#include "components/battery/BatteryController.h"
|
||||
#include "components/brightness/BrightnessController.h"
|
||||
#include "components/ble/BleController.h"
|
||||
#include "components/datetime/DateTimeController.h"
|
||||
#include "components/ble/NotificationManager.h"
|
||||
#include "components/firmwarevalidator/FirmwareValidator.h"
|
||||
#include "drivers/Cst816s.h"
|
||||
#include <date/date.h>
|
||||
#include <drivers/Watchdog.h>
|
||||
#include <components/heartrate/HeartRateController.h>
|
||||
#include <components/motion/MotionController.h>
|
||||
#include <components/motor/MotorController.h>
|
||||
#include <components/settings/Settings.h>
|
||||
#include "TouchEvents.h"
|
||||
#include "Apps.h"
|
||||
#include "Messages.h"
|
||||
#include "DummyLittleVgl.h"
|
||||
#include "components/timer/TimerController.h"
|
||||
|
||||
namespace Pinetime {
|
||||
namespace Drivers {
|
||||
class St7789;
|
||||
class Cst816S;
|
||||
class WatchdogView;
|
||||
}
|
||||
namespace Controllers {
|
||||
class Settings;
|
||||
class Battery;
|
||||
class Ble;
|
||||
class DateTime;
|
||||
class NotificationManager;
|
||||
class HeartRateController;
|
||||
class MotionController;
|
||||
class TouchHandler;
|
||||
class MotorController;
|
||||
class TimerController;
|
||||
}
|
||||
|
||||
namespace System {
|
||||
class SystemTask;
|
||||
};
|
||||
namespace Controllers {
|
||||
class TouchHandler;
|
||||
}
|
||||
|
||||
namespace Applications {
|
||||
class DisplayApp {
|
||||
public:
|
||||
|
@@ -7,7 +7,6 @@ namespace Pinetime {
|
||||
GoToRunning,
|
||||
UpdateDateTime,
|
||||
UpdateBleConnection,
|
||||
UpdateBatteryLevel,
|
||||
TouchEvent,
|
||||
ButtonPushed,
|
||||
NewNotification,
|
||||
|
@@ -55,8 +55,6 @@ BatteryInfo::~BatteryInfo() {
|
||||
|
||||
void BatteryInfo::Refresh() {
|
||||
|
||||
batteryController.Update();
|
||||
|
||||
batteryPercent = batteryController.PercentRemaining();
|
||||
batteryVoltage = batteryController.Voltage();
|
||||
|
||||
|
@@ -152,7 +152,7 @@ Notifications::NotificationItem::NotificationItem(const char* title,
|
||||
uint8_t notifNb,
|
||||
Modes mode,
|
||||
Pinetime::Controllers::AlertNotificationService& alertNotificationService)
|
||||
: notifNr {notifNr}, notifNb {notifNb}, mode {mode}, alertNotificationService {alertNotificationService} {
|
||||
: mode {mode}, alertNotificationService {alertNotificationService} {
|
||||
lv_obj_t* container1 = lv_cont_create(lv_scr_act(), NULL);
|
||||
|
||||
lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222));
|
||||
|
@@ -43,21 +43,13 @@ namespace Pinetime {
|
||||
void OnCallButtonEvent(lv_obj_t*, lv_event_t event);
|
||||
|
||||
private:
|
||||
uint8_t notifNr = 0;
|
||||
uint8_t notifNb = 0;
|
||||
char pageText[4];
|
||||
|
||||
lv_obj_t* container1;
|
||||
lv_obj_t* t1;
|
||||
lv_obj_t* l1;
|
||||
lv_obj_t* l2;
|
||||
lv_obj_t* bt_accept;
|
||||
lv_obj_t* bt_mute;
|
||||
lv_obj_t* bt_reject;
|
||||
lv_obj_t* label_accept;
|
||||
lv_obj_t* label_mute;
|
||||
lv_obj_t* label_reject;
|
||||
lv_obj_t* bottomPlaceholder;
|
||||
Modes mode;
|
||||
Pinetime::Controllers::AlertNotificationService& alertNotificationService;
|
||||
bool running = true;
|
||||
|
@@ -50,8 +50,8 @@ std::unique_ptr<Screen> Settings::CreateScreen2() {
|
||||
std::array<Screens::List::Applications, 4> applications {{
|
||||
{Symbols::shoe, "Steps", Apps::SettingSteps},
|
||||
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
|
||||
{Symbols::paintbrush, "PTS Colors", Apps::SettingPineTimeStyle},
|
||||
{Symbols::check, "Firmware", Apps::FirmwareValidation},
|
||||
{Symbols::list, "About", Apps::SysInfo},
|
||||
}};
|
||||
|
||||
return std::make_unique<Screens::List>(1, 3, app, settingsController, applications);
|
||||
@@ -60,7 +60,7 @@ std::unique_ptr<Screen> Settings::CreateScreen2() {
|
||||
std::unique_ptr<Screen> Settings::CreateScreen3() {
|
||||
|
||||
std::array<Screens::List::Applications, 4> applications {{
|
||||
{Symbols::paintbrush, "PTS Colors", Apps::SettingPineTimeStyle},
|
||||
{Symbols::list, "About", Apps::SysInfo},
|
||||
{Symbols::none, "None", Apps::None},
|
||||
{Symbols::none, "None", Apps::None},
|
||||
{Symbols::none, "None", Apps::None},
|
||||
|
@@ -3,6 +3,7 @@
|
||||
#include <legacy/nrf_drv_gpiote.h>
|
||||
#include <nrfx_log.h>
|
||||
#include <task.h>
|
||||
#include "drivers/PinMap.h"
|
||||
|
||||
using namespace Pinetime::Drivers;
|
||||
|
||||
@@ -18,12 +19,12 @@ Cst816S::Cst816S(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaste
|
||||
}
|
||||
|
||||
void Cst816S::Init() {
|
||||
nrf_gpio_cfg_output(pinReset);
|
||||
nrf_gpio_pin_set(pinReset);
|
||||
nrf_gpio_cfg_output(PinMap::Cst816sReset);
|
||||
nrf_gpio_pin_set(PinMap::Cst816sReset);
|
||||
vTaskDelay(50);
|
||||
nrf_gpio_pin_clear(pinReset);
|
||||
nrf_gpio_pin_clear(PinMap::Cst816sReset);
|
||||
vTaskDelay(5);
|
||||
nrf_gpio_pin_set(pinReset);
|
||||
nrf_gpio_pin_set(PinMap::Cst816sReset);
|
||||
vTaskDelay(50);
|
||||
|
||||
// Wake the touchpanel up
|
||||
@@ -80,9 +81,9 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() {
|
||||
}
|
||||
|
||||
void Cst816S::Sleep() {
|
||||
nrf_gpio_pin_clear(pinReset);
|
||||
nrf_gpio_pin_clear(PinMap::Cst816sReset);
|
||||
vTaskDelay(5);
|
||||
nrf_gpio_pin_set(pinReset);
|
||||
nrf_gpio_pin_set(PinMap::Cst816sReset);
|
||||
vTaskDelay(50);
|
||||
static constexpr uint8_t sleepValue = 0x03;
|
||||
twiMaster.Write(twiAddress, 0xA5, &sleepValue, 1);
|
||||
|
@@ -36,9 +36,6 @@ namespace Pinetime {
|
||||
void Wakeup();
|
||||
|
||||
private:
|
||||
static constexpr uint8_t pinIrq = 28;
|
||||
static constexpr uint8_t pinReset = 10;
|
||||
|
||||
// Unused/Unavailable commented out
|
||||
static constexpr uint8_t gestureIndex = 1;
|
||||
static constexpr uint8_t touchPointNumIndex = 2;
|
||||
|
38
src/drivers/PinMap.h
Normal file
38
src/drivers/PinMap.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
|
||||
namespace Pinetime {
|
||||
namespace PinMap {
|
||||
|
||||
#ifdef WATCH_P8
|
||||
// COLMI P8
|
||||
static constexpr uint8_t Charging = 19;
|
||||
static constexpr uint8_t Cst816sReset = 13;
|
||||
static constexpr uint8_t Button = 17;
|
||||
#else
|
||||
// Pinetime
|
||||
static constexpr uint8_t Charging = 12;
|
||||
static constexpr uint8_t Cst816sReset = 10;
|
||||
static constexpr uint8_t Button = 13;
|
||||
#endif
|
||||
|
||||
static constexpr uint8_t Cst816sIrq = 28;
|
||||
static constexpr uint8_t PowerPresent = 19;
|
||||
|
||||
static constexpr uint8_t Motor = 16;
|
||||
|
||||
static constexpr uint8_t LcdBacklightLow = 14;
|
||||
static constexpr uint8_t LcdBacklightMedium = 22;
|
||||
static constexpr uint8_t LcdBacklightHigh = 23;
|
||||
|
||||
static constexpr uint8_t SpiSck = 2;
|
||||
static constexpr uint8_t SpiMosi = 3;
|
||||
static constexpr uint8_t SpiMiso = 4;
|
||||
|
||||
static constexpr uint8_t SpiFlashCsn = 5;
|
||||
static constexpr uint8_t SpiLcdCsn = 25;
|
||||
static constexpr uint8_t LcdDataCommand = 18;
|
||||
|
||||
static constexpr uint8_t TwiScl = 7;
|
||||
static constexpr uint8_t TwiSda = 6;
|
||||
}
|
||||
}
|
47
src/main.cpp
47
src/main.cpp
@@ -43,7 +43,9 @@
|
||||
#include "drivers/St7789.h"
|
||||
#include "drivers/TwiMaster.h"
|
||||
#include "drivers/Cst816s.h"
|
||||
#include "drivers/PinMap.h"
|
||||
#include "systemtask/SystemTask.h"
|
||||
#include "drivers/PinMap.h"
|
||||
#include "touchhandler/TouchHandler.h"
|
||||
|
||||
#if NRF_LOG_ENABLED
|
||||
@@ -54,14 +56,6 @@ Pinetime::Logging::NrfLogger logger;
|
||||
Pinetime::Logging::DummyLogger logger;
|
||||
#endif
|
||||
|
||||
static constexpr uint8_t pinSpiSck = 2;
|
||||
static constexpr uint8_t pinSpiMosi = 3;
|
||||
static constexpr uint8_t pinSpiMiso = 4;
|
||||
static constexpr uint8_t pinSpiFlashCsn = 5;
|
||||
static constexpr uint8_t pinLcdCsn = 25;
|
||||
static constexpr uint8_t pinLcdDataCommand = 18;
|
||||
static constexpr uint8_t pinTwiScl = 7;
|
||||
static constexpr uint8_t pinTwiSda = 6;
|
||||
static constexpr uint8_t touchPanelTwiAddress = 0x15;
|
||||
static constexpr uint8_t motionSensorTwiAddress = 0x18;
|
||||
static constexpr uint8_t heartRateSensorTwiAddress = 0x44;
|
||||
@@ -70,33 +64,30 @@ 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}};
|
||||
Pinetime::PinMap::SpiSck,
|
||||
Pinetime::PinMap::SpiMosi,
|
||||
Pinetime::PinMap::SpiMiso}};
|
||||
|
||||
Pinetime::Drivers::Spi lcdSpi {spi, pinLcdCsn};
|
||||
Pinetime::Drivers::St7789 lcd {lcdSpi, pinLcdDataCommand};
|
||||
Pinetime::Drivers::Spi lcdSpi {spi, Pinetime::PinMap::SpiLcdCsn};
|
||||
Pinetime::Drivers::St7789 lcd {lcdSpi, Pinetime::PinMap::LcdDataCommand};
|
||||
|
||||
Pinetime::Drivers::Spi flashSpi {spi, pinSpiFlashCsn};
|
||||
Pinetime::Drivers::Spi flashSpi {spi, Pinetime::PinMap::SpiFlashCsn};
|
||||
Pinetime::Drivers::SpiNorFlash spiNorFlash {flashSpi};
|
||||
|
||||
// The TWI device should work @ up to 400Khz but there is a HW bug which prevent it from
|
||||
// respecting correct timings. According to erratas heet, this magic value makes it run
|
||||
// at ~390Khz with correct timings.
|
||||
static constexpr uint32_t MaxTwiFrequencyWithoutHardwareBug {0x06200000};
|
||||
Pinetime::Drivers::TwiMaster twiMaster {NRF_TWIM1, MaxTwiFrequencyWithoutHardwareBug, pinTwiSda, pinTwiScl};
|
||||
Pinetime::Drivers::TwiMaster twiMaster {NRF_TWIM1, MaxTwiFrequencyWithoutHardwareBug, Pinetime::PinMap::TwiSda, Pinetime::PinMap::TwiScl};
|
||||
Pinetime::Drivers::Cst816S touchPanel {twiMaster, touchPanelTwiAddress};
|
||||
#ifdef PINETIME_IS_RECOVERY
|
||||
static constexpr bool isFactory = true;
|
||||
#include "displayapp/DummyLittleVgl.h"
|
||||
#include "displayapp/DisplayAppRecovery.h"
|
||||
Pinetime::Components::LittleVgl lvgl {lcd, touchPanel};
|
||||
#else
|
||||
static constexpr bool isFactory = false;
|
||||
#include "displayapp/LittleVgl.h"
|
||||
#include "displayapp/DisplayApp.h"
|
||||
Pinetime::Components::LittleVgl lvgl {lcd, touchPanel};
|
||||
#endif
|
||||
Pinetime::Components::LittleVgl lvgl {lcd, touchPanel};
|
||||
|
||||
Pinetime::Drivers::Bma421 motionSensor {twiMaster, motionSensorTwiAddress};
|
||||
Pinetime::Drivers::Hrs3300 heartRateSensor {twiMaster, heartRateSensorTwiAddress};
|
||||
@@ -105,10 +96,8 @@ 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;
|
||||
static constexpr uint8_t pinTouchIrq = Pinetime::PinMap::Cst816sIrq;
|
||||
static constexpr uint8_t pinPowerPresentIrq = Pinetime::PinMap::PowerPresent;
|
||||
|
||||
Pinetime::Controllers::HeartRateController heartRateController;
|
||||
Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateController);
|
||||
@@ -168,14 +157,14 @@ Pinetime::System::SystemTask systemTask(spi,
|
||||
touchHandler);
|
||||
|
||||
void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
|
||||
if (pin == pinTouchIrq) {
|
||||
if (pin == Pinetime::PinMap::Cst816sIrq) {
|
||||
systemTask.OnTouchEvent();
|
||||
return;
|
||||
}
|
||||
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
|
||||
if (pin == pinPowerPresentIrq and action == NRF_GPIOTE_POLARITY_TOGGLE) {
|
||||
if (pin == Pinetime::PinMap::PowerPresent and action == NRF_GPIOTE_POLARITY_TOGGLE) {
|
||||
xTimerStartFromISR(debounceChargeTimer, &xHigherPriorityTaskWoken);
|
||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||
return;
|
||||
@@ -308,18 +297,18 @@ int main(void) {
|
||||
nrf_drv_clock_init();
|
||||
|
||||
// Unblock i2c?
|
||||
nrf_gpio_cfg(pinTwiScl,
|
||||
nrf_gpio_cfg(Pinetime::PinMap::TwiScl,
|
||||
NRF_GPIO_PIN_DIR_OUTPUT,
|
||||
NRF_GPIO_PIN_INPUT_DISCONNECT,
|
||||
NRF_GPIO_PIN_NOPULL,
|
||||
NRF_GPIO_PIN_S0D1,
|
||||
NRF_GPIO_PIN_NOSENSE);
|
||||
nrf_gpio_pin_set(pinTwiScl);
|
||||
nrf_gpio_pin_set(Pinetime::PinMap::TwiScl);
|
||||
for (uint8_t i = 0; i < 16; i++) {
|
||||
nrf_gpio_pin_toggle(pinTwiScl);
|
||||
nrf_gpio_pin_toggle(Pinetime::PinMap::TwiScl);
|
||||
nrf_delay_us(5);
|
||||
}
|
||||
nrf_gpio_cfg_default(pinTwiScl);
|
||||
nrf_gpio_cfg_default(Pinetime::PinMap::TwiScl);
|
||||
|
||||
debounceTimer = xTimerCreate("debounceTimer", 200, pdFALSE, (void*) 0, DebounceTimerCallback);
|
||||
debounceChargeTimer = xTimerCreate("debounceTimerCharge", 200, pdFALSE, (void*) 0, DebounceTimerChargeCallback);
|
||||
|
@@ -15,6 +15,7 @@
|
||||
#include <components/brightness/BrightnessController.h>
|
||||
#include <algorithm>
|
||||
#include "recoveryImage.h"
|
||||
#include "drivers/PinMap.h"
|
||||
|
||||
#include "displayapp/icons/infinitime/infinitime-nb.c"
|
||||
#include "components/rle/RleDecoder.h"
|
||||
@@ -27,12 +28,6 @@ Pinetime::Logging::NrfLogger logger;
|
||||
Pinetime::Logging::DummyLogger logger;
|
||||
#endif
|
||||
|
||||
static constexpr uint8_t pinSpiSck = 2;
|
||||
static constexpr uint8_t pinSpiMosi = 3;
|
||||
static constexpr uint8_t pinSpiMiso = 4;
|
||||
static constexpr uint8_t pinSpiFlashCsn = 5;
|
||||
static constexpr uint8_t pinLcdCsn = 25;
|
||||
static constexpr uint8_t pinLcdDataCommand = 18;
|
||||
|
||||
static constexpr uint8_t displayWidth = 240;
|
||||
static constexpr uint8_t displayHeight = 240;
|
||||
@@ -45,14 +40,14 @@ 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}};
|
||||
Pinetime::Drivers::Spi flashSpi {spi, pinSpiFlashCsn};
|
||||
Pinetime::PinMap::SpiSck,
|
||||
Pinetime::PinMap::SpiMosi,
|
||||
Pinetime::PinMap::SpiMiso}};
|
||||
Pinetime::Drivers::Spi flashSpi {spi, Pinetime::PinMap::SpiFlashCsn};
|
||||
Pinetime::Drivers::SpiNorFlash spiNorFlash {flashSpi};
|
||||
|
||||
Pinetime::Drivers::Spi lcdSpi {spi, pinLcdCsn};
|
||||
Pinetime::Drivers::St7789 lcd {lcdSpi, pinLcdDataCommand};
|
||||
Pinetime::Drivers::Spi lcdSpi {spi, Pinetime::PinMap::SpiLcdCsn};
|
||||
Pinetime::Drivers::St7789 lcd {lcdSpi, Pinetime::PinMap::LcdDataCommand};
|
||||
|
||||
Pinetime::Components::Gfx gfx {lcd};
|
||||
Pinetime::Controllers::BrightnessController brightnessController;
|
||||
|
@@ -22,7 +22,9 @@ namespace Pinetime {
|
||||
OnNewDay,
|
||||
OnChargingEvent,
|
||||
SetOffAlarm,
|
||||
StopRinging
|
||||
StopRinging,
|
||||
MeasureBatteryTimerExpired,
|
||||
BatteryMeasurementDone,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@@ -21,8 +21,10 @@
|
||||
#include "drivers/SpiNorFlash.h"
|
||||
#include "drivers/TwiMaster.h"
|
||||
#include "drivers/Hrs3300.h"
|
||||
#include "drivers/PinMap.h"
|
||||
#include "main.h"
|
||||
|
||||
|
||||
#include <memory>
|
||||
|
||||
using namespace Pinetime::System;
|
||||
@@ -47,6 +49,11 @@ void IdleTimerCallback(TimerHandle_t xTimer) {
|
||||
sysTask->OnIdle();
|
||||
}
|
||||
|
||||
void MeasureBatteryTimerCallback(TimerHandle_t xTimer) {
|
||||
auto* sysTask = static_cast<SystemTask*>(pvTimerGetTimerID(xTimer));
|
||||
sysTask->PushMessage(Pinetime::System::Messages::MeasureBatteryTimerExpired);
|
||||
}
|
||||
|
||||
SystemTask::SystemTask(Drivers::SpiMaster& spi,
|
||||
Drivers::St7789& lcd,
|
||||
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
|
||||
@@ -123,13 +130,13 @@ void SystemTask::Work() {
|
||||
fs.Init();
|
||||
|
||||
nimbleController.Init();
|
||||
nimbleController.StartAdvertising();
|
||||
lcd.Init();
|
||||
|
||||
twiMaster.Init();
|
||||
touchPanel.Init();
|
||||
dateTimeController.Register(this);
|
||||
batteryController.Init();
|
||||
batteryController.Register(this);
|
||||
batteryController.Update();
|
||||
motorController.Init();
|
||||
motionSensor.SoftReset();
|
||||
timerController.Register(this);
|
||||
@@ -147,13 +154,11 @@ void SystemTask::Work() {
|
||||
displayApp.Register(this);
|
||||
displayApp.Start();
|
||||
|
||||
displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
|
||||
|
||||
heartRateSensor.Init();
|
||||
heartRateSensor.Disable();
|
||||
heartRateApp.Start();
|
||||
|
||||
nrf_gpio_cfg_sense_input(pinButton, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pulldown, (nrf_gpio_pin_sense_t) GPIO_PIN_CNF_SENSE_High);
|
||||
nrf_gpio_cfg_sense_input(PinMap::Button, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pulldown, (nrf_gpio_pin_sense_t) GPIO_PIN_CNF_SENSE_High);
|
||||
nrf_gpio_cfg_output(15);
|
||||
nrf_gpio_pin_set(15);
|
||||
|
||||
@@ -164,9 +169,9 @@ void SystemTask::Work() {
|
||||
pinConfig.sense = (nrf_gpiote_polarity_t) NRF_GPIOTE_POLARITY_HITOLO;
|
||||
pinConfig.pull = (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pulldown;
|
||||
|
||||
nrfx_gpiote_in_init(pinButton, &pinConfig, nrfx_gpiote_evt_handler);
|
||||
nrfx_gpiote_in_init(PinMap::Button, &pinConfig, nrfx_gpiote_evt_handler);
|
||||
|
||||
nrf_gpio_cfg_sense_input(pinTouchIrq, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup, (nrf_gpio_pin_sense_t) GPIO_PIN_CNF_SENSE_Low);
|
||||
nrf_gpio_cfg_sense_input(PinMap::Cst816sIrq, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup, (nrf_gpio_pin_sense_t) GPIO_PIN_CNF_SENSE_Low);
|
||||
|
||||
pinConfig.skip_gpio_setup = true;
|
||||
pinConfig.hi_accuracy = false;
|
||||
@@ -174,24 +179,26 @@ void SystemTask::Work() {
|
||||
pinConfig.sense = (nrf_gpiote_polarity_t) NRF_GPIOTE_POLARITY_HITOLO;
|
||||
pinConfig.pull = (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup;
|
||||
|
||||
nrfx_gpiote_in_init(pinTouchIrq, &pinConfig, nrfx_gpiote_evt_handler);
|
||||
nrfx_gpiote_in_init(PinMap::Cst816sIrq, &pinConfig, nrfx_gpiote_evt_handler);
|
||||
|
||||
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);
|
||||
nrfx_gpiote_in_init(PinMap::PowerPresent, &pinConfig, nrfx_gpiote_evt_handler);
|
||||
|
||||
if (nrf_gpio_pin_read(pinPowerPresentIrq)) {
|
||||
nrf_gpio_cfg_sense_input(pinPowerPresentIrq, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_LOW);
|
||||
if (nrf_gpio_pin_read(PinMap::PowerPresent)) {
|
||||
nrf_gpio_cfg_sense_input(PinMap::PowerPresent, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_LOW);
|
||||
} else {
|
||||
nrf_gpio_cfg_sense_input(pinPowerPresentIrq, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH);
|
||||
nrf_gpio_cfg_sense_input(PinMap::PowerPresent, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH);
|
||||
}
|
||||
|
||||
idleTimer = xTimerCreate("idleTimer", pdMS_TO_TICKS(2000), pdFALSE, this, IdleTimerCallback);
|
||||
dimTimer = xTimerCreate("dimTimer", pdMS_TO_TICKS(settingsController.GetScreenTimeOut() - 2000), pdFALSE, this, DimTimerCallback);
|
||||
measureBatteryTimer = xTimerCreate("measureBattery", batteryMeasurementPeriod, pdTRUE, this, MeasureBatteryTimerCallback);
|
||||
xTimerStart(dimTimer, 0);
|
||||
xTimerStart(measureBatteryTimer, portMAX_DELAY);
|
||||
|
||||
// Suppress endless loop diagnostic
|
||||
#pragma clang diagnostic push
|
||||
@@ -201,11 +208,6 @@ void SystemTask::Work() {
|
||||
|
||||
uint8_t msg;
|
||||
if (xQueueReceive(systemTasksMsgQueue, &msg, 100)) {
|
||||
|
||||
batteryController.Update();
|
||||
// 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) {
|
||||
case Messages::EnableSleeping:
|
||||
@@ -229,15 +231,16 @@ void SystemTask::Work() {
|
||||
touchPanel.Wakeup();
|
||||
}
|
||||
|
||||
nimbleController.StartAdvertising();
|
||||
xTimerStart(dimTimer, 0);
|
||||
spiNorFlash.Wakeup();
|
||||
lcd.Wakeup();
|
||||
|
||||
displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToRunning);
|
||||
displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
|
||||
heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::WakeUp);
|
||||
|
||||
if (!bleController.IsConnected())
|
||||
nimbleController.RestartFastAdv();
|
||||
|
||||
isSleeping = false;
|
||||
isWakingUp = false;
|
||||
isDimmed = false;
|
||||
@@ -340,8 +343,18 @@ void SystemTask::Work() {
|
||||
stepCounterMustBeReset = true;
|
||||
break;
|
||||
case Messages::OnChargingEvent:
|
||||
batteryController.Update();
|
||||
motorController.RunForDuration(15);
|
||||
// Battery level is updated on every message - there's no need to do anything
|
||||
break;
|
||||
case Messages::MeasureBatteryTimerExpired:
|
||||
sendBatteryNotification = true;
|
||||
batteryController.Update();
|
||||
break;
|
||||
case Messages::BatteryMeasurementDone:
|
||||
if (sendBatteryNotification) {
|
||||
sendBatteryNotification = false;
|
||||
nimbleController.NotifyBatteryLevel(batteryController.PercentRemaining());
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -353,22 +366,17 @@ void SystemTask::Work() {
|
||||
if (bleDiscoveryTimer == 0) {
|
||||
isBleDiscoveryTimerRunning = false;
|
||||
// Services discovery is deffered from 3 seconds to avoid the conflicts between the host communicating with the
|
||||
// tharget and vice-versa. I'm not sure if this is the right way to handle this...
|
||||
// target and vice-versa. I'm not sure if this is the right way to handle this...
|
||||
nimbleController.StartDiscovery();
|
||||
} else {
|
||||
bleDiscoveryTimer--;
|
||||
}
|
||||
}
|
||||
|
||||
if (xTaskGetTickCount() - batteryNotificationTick > batteryNotificationPeriod) {
|
||||
nimbleController.NotifyBatteryLevel(batteryController.PercentRemaining());
|
||||
batteryNotificationTick = xTaskGetTickCount();
|
||||
}
|
||||
|
||||
monitor.Process();
|
||||
uint32_t systick_counter = nrf_rtc_counter_get(portNRF_RTC_REG);
|
||||
dateTimeController.UpdateTime(systick_counter);
|
||||
if (!nrf_gpio_pin_read(pinButton))
|
||||
if (!nrf_gpio_pin_read(PinMap::Button))
|
||||
watchdog.Kick();
|
||||
}
|
||||
// Clear diagnostic suppression
|
||||
|
@@ -8,6 +8,7 @@
|
||||
#include <heartratetask/HeartRateTask.h>
|
||||
#include <components/settings/Settings.h>
|
||||
#include <drivers/Bma421.h>
|
||||
#include <drivers/PinMap.h>
|
||||
#include <components/motion/MotionController.h>
|
||||
|
||||
#include "SystemMonitor.h"
|
||||
@@ -123,15 +124,6 @@ namespace Pinetime {
|
||||
Pinetime::Controllers::TouchHandler& touchHandler;
|
||||
Pinetime::Controllers::NimbleController nimbleController;
|
||||
|
||||
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;
|
||||
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();
|
||||
void ReloadIdleTimer();
|
||||
@@ -139,13 +131,15 @@ namespace Pinetime {
|
||||
uint8_t bleDiscoveryTimer = 0;
|
||||
TimerHandle_t dimTimer;
|
||||
TimerHandle_t idleTimer;
|
||||
TimerHandle_t measureBatteryTimer;
|
||||
bool sendBatteryNotification = false;
|
||||
bool doNotGoToSleep = false;
|
||||
|
||||
void GoToRunning();
|
||||
void UpdateMotion();
|
||||
bool stepCounterMustBeReset = false;
|
||||
static constexpr TickType_t batteryNotificationPeriod = 1000 * 60 * 10; // 1 tick ~= 1ms. 1ms * 60 * 10 = 10 minutes
|
||||
TickType_t batteryNotificationTick = 0;
|
||||
static constexpr TickType_t batteryMeasurementPeriod = pdMS_TO_TICKS(10 * 60 * 1000);
|
||||
TickType_t lastBatteryNotificationTime = 0;
|
||||
|
||||
#if configUSE_TRACE_FACILITY == 1
|
||||
SystemMonitor<FreeRtosMonitor> monitor;
|
||||
|
Reference in New Issue
Block a user