diff options
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/alarm/AlarmController.cpp | 28 | ||||
| -rw-r--r-- | src/components/alarm/AlarmController.h | 6 | ||||
| -rw-r--r-- | src/components/ble/BleController.h | 5 | ||||
| -rw-r--r-- | src/components/ble/NimbleController.cpp | 47 | ||||
| -rw-r--r-- | src/components/datetime/DateTimeController.cpp | 23 | ||||
| -rw-r--r-- | src/components/datetime/DateTimeController.h | 5 | ||||
| -rw-r--r-- | src/components/settings/Settings.h | 13 | ||||
| -rw-r--r-- | src/components/timer/TimerController.cpp | 1 |
8 files changed, 99 insertions, 29 deletions
diff --git a/src/components/alarm/AlarmController.cpp b/src/components/alarm/AlarmController.cpp index 9f4e910..94914bd 100644 --- a/src/components/alarm/AlarmController.cpp +++ b/src/components/alarm/AlarmController.cpp @@ -19,6 +19,12 @@ #include "systemtask/SystemTask.h" #include "task.h" #include <chrono> +#include <ratio> +#include <cstdint> + +namespace { + typedef std::chrono::duration< int64_t, std::ratio<1, configTICK_RATE_HZ> > ticks_t; +} using namespace Pinetime::Controllers; using namespace std::chrono_literals; @@ -43,6 +49,24 @@ void AlarmController::SetAlarmTime(uint8_t alarmHr, uint8_t alarmMin) { minutes = alarmMin; } +void AlarmController::OnAdjustTime() { + if (state != AlarmState::Set) { + return; + } + + xTimerStop(alarmTimer, 0); + auto now = dateTimeController.CurrentDateTime(); + + if (now >= alarmTime) { + xTimerChangePeriod(alarmTimer, 1, 0); + } else { + auto ticksToAlarm = std::chrono::duration_cast<ticks_t>(alarmTime - now).count(); + xTimerChangePeriod(alarmTimer, ++ticksToAlarm, 0); + } + + xTimerStart(alarmTimer, 0); +} + void AlarmController::ScheduleAlarm() { // Determine the next time the alarm needs to go off and set the timer xTimerStop(alarmTimer, 0); @@ -75,8 +99,8 @@ void AlarmController::ScheduleAlarm() { // now can convert back to a time_point alarmTime = std::chrono::system_clock::from_time_t(std::mktime(tmAlarmTime)); - auto secondsToAlarm = std::chrono::duration_cast<std::chrono::seconds>(alarmTime - now).count(); - xTimerChangePeriod(alarmTimer, secondsToAlarm * configTICK_RATE_HZ, 0); + auto ticksToAlarm = std::chrono::duration_cast<ticks_t>(alarmTime - now).count(); + xTimerChangePeriod(alarmTimer, ticksToAlarm, 0); xTimerStart(alarmTimer, 0); state = AlarmState::Set; diff --git a/src/components/alarm/AlarmController.h b/src/components/alarm/AlarmController.h index d630a12..c3a9fec 100644 --- a/src/components/alarm/AlarmController.h +++ b/src/components/alarm/AlarmController.h @@ -31,9 +31,9 @@ namespace Pinetime { public: AlarmController(Controllers::DateTime& dateTimeController); - void Init(System::SystemTask* systemTask); void SetAlarmTime(uint8_t alarmHr, uint8_t alarmMin); void ScheduleAlarm(); + void OnAdjustTime(); void DisableAlarm(); void SetOffAlarmNow(); uint32_t SecondsToAlarm(); @@ -56,6 +56,10 @@ namespace Pinetime { recurrence = recurType; } + protected: + friend class Pinetime::System::SystemTask; + void Init(System::SystemTask* systemTask); + private: Controllers::DateTime& dateTimeController; System::SystemTask* systemTask = nullptr; diff --git a/src/components/ble/BleController.h b/src/components/ble/BleController.h index 675ede2..b15d688 100644 --- a/src/components/ble/BleController.h +++ b/src/components/ble/BleController.h @@ -20,6 +20,10 @@ namespace Pinetime { void EnableRadio(); void DisableRadio(); + void EnablePasskey() { isPasskeyEnabled = true; } + void DisablePasskey() { isPasskeyEnabled = false; } + bool IsPasskeyEnabled() { return isPasskeyEnabled; } + void StartFirmwareUpdate(); void StopFirmwareUpdate(); void FirmwareUpdateTotalBytes(uint32_t totalBytes); @@ -60,6 +64,7 @@ namespace Pinetime { private: bool isConnected = false; bool isRadioEnabled = true; + bool isPasskeyEnabled = false; bool isFirmwareUpdating = false; uint32_t firmwareUpdateTotalBytes = 0; uint32_t firmwareUpdateCurrentBytes = 0; diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index 52f4e4c..b2cccf7 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -115,25 +115,38 @@ void NimbleController::Init() { ASSERT(rc == 0); bleController.Address(std::move(address)); - switch (addrType) { - case BLE_OWN_ADDR_PUBLIC: - bleController.AddressType(Ble::AddressTypes::Public); - break; - case BLE_OWN_ADDR_RANDOM: - bleController.AddressType(Ble::AddressTypes::Random); - break; - case BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT: - bleController.AddressType(Ble::AddressTypes::RPA_Public); - break; - case BLE_OWN_ADDR_RPA_RANDOM_DEFAULT: - bleController.AddressType(Ble::AddressTypes::RPA_Random); - break; + if (bleController.IsPasskeyEnabled()) { + switch (addrType) { + case BLE_OWN_ADDR_PUBLIC: + bleController.AddressType(Ble::AddressTypes::Public); + break; + case BLE_OWN_ADDR_RANDOM: + bleController.AddressType(Ble::AddressTypes::Random); + break; + case BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT: + bleController.AddressType(Ble::AddressTypes::RPA_Public); + break; + case BLE_OWN_ADDR_RPA_RANDOM_DEFAULT: + bleController.AddressType(Ble::AddressTypes::RPA_Random); + break; + } + } else { + switch (addrType) { + case BLE_OWN_ADDR_PUBLIC: + bleController.AddressType(Ble::AddressTypes::Public); + break; + default: + bleController.AddressType(Ble::AddressTypes::Random); + break; + } } rc = ble_gatts_start(); ASSERT(rc == 0); - RestoreBond(); + if (bleController.IsPasskeyEnabled()) { + RestoreBond(); + } StartAdvertising(); } @@ -216,7 +229,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { NRF_LOG_INFO("Disconnect event : BLE_GAP_EVENT_DISCONNECT"); NRF_LOG_INFO("disconnect reason=%d", event->disconnect.reason); - if (event->disconnect.conn.sec_state.bonded) { + if (bleController.IsPasskeyEnabled() && event->disconnect.conn.sec_state.bonded) { PersistBond(event->disconnect.conn); } @@ -251,7 +264,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { NRF_LOG_INFO("Security event : BLE_GAP_EVENT_ENC_CHANGE"); NRF_LOG_INFO("encryption change event; status=%0X ", event->enc_change.status); - if (event->enc_change.status == 0) { + if (bleController.IsPasskeyEnabled() && event->enc_change.status == 0) { struct ble_gap_conn_desc desc; ble_gap_conn_find(event->enc_change.conn_handle, &desc); if (desc.sec_state.bonded) { @@ -280,7 +293,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { * Use the tinycrypt prng here since rand() is predictable. */ NRF_LOG_INFO("Security event : BLE_GAP_EVENT_PASSKEY_ACTION"); - if (event->passkey.params.action == BLE_SM_IOACT_DISP) { + if (bleController.IsPasskeyEnabled() && event->passkey.params.action == BLE_SM_IOACT_DISP) { struct ble_sm_io pkey = {0}; pkey.action = event->passkey.params.action; diff --git a/src/components/datetime/DateTimeController.cpp b/src/components/datetime/DateTimeController.cpp index ba04705..1f7182c 100644 --- a/src/components/datetime/DateTimeController.cpp +++ b/src/components/datetime/DateTimeController.cpp @@ -36,6 +36,7 @@ void DateTime::SetTime(uint16_t year, /* .tm_year = */ year - 1900, }; tm.tm_isdst = -1; // Use DST value from local time zone + auto previousDateTime = currentDateTime; currentDateTime = std::chrono::system_clock::from_time_t(std::mktime(&tm)); NRF_LOG_INFO("%d %d %d ", day, month, year); @@ -46,7 +47,17 @@ void DateTime::SetTime(uint16_t year, NRF_LOG_INFO("* %d %d %d ", this->hour, this->minute, this->second); NRF_LOG_INFO("* %d %d %d ", this->day, this->month, this->year); - systemTask->PushMessage(System::Messages::OnNewTime); + decltype(currentDateTime - previousDateTime) timeDifference; + + if (currentDateTime > previousDateTime) { + timeDifference = currentDateTime - previousDateTime; + } else { + timeDifference = previousDateTime - currentDateTime; + } + + using namespace std::chrono_literals; + + systemTask->PushMessage(timeDifference < 3h ? System::Messages::OnAdjustTime : System::Messages::OnNewTime); } void DateTime::UpdateTime(uint32_t systickCounter) { @@ -95,13 +106,13 @@ void DateTime::UpdateTime(uint32_t systickCounter) { isHourAlreadyNotified = false; } - if ((minute == 0 || minute == 30) && !isHalfHourAlreadyNotified) { - isHalfHourAlreadyNotified = true; + if (minute%chimePeriod) { + hasChimed = false; + } else if (!hasChimed) { if (systemTask != nullptr) { - systemTask->PushMessage(System::Messages::OnNewHalfHour); + systemTask->PushMessage(System::Messages::OnChime); + hasChimed = true; } - } else if (minute != 0 && minute != 30) { - isHalfHourAlreadyNotified = false; } // Notify new day to SystemTask diff --git a/src/components/datetime/DateTimeController.h b/src/components/datetime/DateTimeController.h index 00bbc2e..48fe2b1 100644 --- a/src/components/datetime/DateTimeController.h +++ b/src/components/datetime/DateTimeController.h @@ -91,7 +91,10 @@ namespace Pinetime { bool isMidnightAlreadyNotified = false; bool isHourAlreadyNotified = true; - bool isHalfHourAlreadyNotified = true; + bool hasChimed = true; + public: + uint8_t chimePeriod = 5; + private: System::SystemTask* systemTask = nullptr; Controllers::Settings& settingsController; }; diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 3b113ea..393a734 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -10,7 +10,7 @@ namespace Pinetime { public: enum class ClockType : uint8_t { H24, H12 }; enum class Notification : uint8_t { ON, OFF }; - enum class ChimesOption : uint8_t { None, Hours, HalfHours }; + enum class ChimesOption : uint8_t { None, Hours, HalfHours, FiveMinutes }; enum class WakeUpMode : uint8_t { SingleTap = 0, DoubleTap = 1, @@ -209,10 +209,18 @@ namespace Pinetime { return bleRadioEnabled; }; + void SetBluetoothPasskeyEnabled(bool enabled) { + settings.bluetoothPasskeyEnabled = enabled; + }; + + bool GetBluetoothPasskeyEnabled() const { + return settings.bluetoothPasskeyEnabled; + }; + private: Pinetime::Controllers::FS& fs; - static constexpr uint32_t settingsVersion = 0x0003; + static constexpr uint32_t settingsVersion = 0x3505; struct SettingsData { uint32_t version = settingsVersion; uint32_t stepsGoal = 10000; @@ -229,6 +237,7 @@ namespace Pinetime { std::bitset<4> wakeUpMode {0}; uint16_t shakeWakeThreshold = 150; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; + bool bluetoothPasskeyEnabled = false; }; SettingsData settings; diff --git a/src/components/timer/TimerController.cpp b/src/components/timer/TimerController.cpp index ea94521..eeee61f 100644 --- a/src/components/timer/TimerController.cpp +++ b/src/components/timer/TimerController.cpp @@ -37,3 +37,4 @@ bool TimerController::IsRunning() { void TimerController::OnTimerEnd() { systemTask->PushMessage(System::Messages::OnTimerDone); } + |
