diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0358c63..0c0cb57 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -80,6 +80,8 @@ target_sources(infinisim PUBLIC
sim/components/ble/MusicService.cpp
sim/components/ble/NavigationService.h
sim/components/ble/NavigationService.cpp
+ sim/components/ble/AgendaService.h
+ sim/components/ble/AgendaService.cpp
sim/components/ble/NimbleController.h
sim/components/ble/NimbleController.cpp
sim/components/ble/weather/WeatherService.h
diff --git a/InfiniTime b/InfiniTime
index 373289c..e54d78a 160000
--- a/InfiniTime
+++ b/InfiniTime
@@ -1 +1 @@
-Subproject commit 373289c072b701684520fce72801136c58b61c55
+Subproject commit e54d78a04b42264770cf25dc2bb2952c7618b764
diff --git a/sim/components/ble/AgendaService.cpp b/sim/components/ble/AgendaService.cpp
new file mode 100644
index 0000000..c07c9fa
--- /dev/null
+++ b/sim/components/ble/AgendaService.cpp
@@ -0,0 +1,138 @@
+/* Copyright (C) 2021 Adam Pigg
+
+ This file is part of InfiniTime.
+
+ InfiniTime is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ InfiniTime is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#include "components/ble/AgendaService.h"
+
+#include "systemtask/SystemTask.h"
+
+namespace {
+ /*
+ // 3fdaYYXX-e246-472e-b7e0-d2b0f3d9c17a
+ constexpr ble_uuid128_t CharUuid(uint8_t x, uint8_t y) {
+ return ble_uuid128_t {.u = {.type = BLE_UUID_TYPE_128},
+ .value = {0x7a, 0xc1, 0xd9, 0xf3, 0xb0, 0xd2, 0xe0, 0xb7, 0x2e, 0x47, 0x46, 0xe2, x, y, 0xda, 0x3f}};
+ }
+
+ // 00010000-78fc-48fe-8e23-433b3a1942d0
+ constexpr ble_uuid128_t BaseUuid() {
+ return CharUuid(0x00, 0x00);
+ }
+
+ constexpr ble_uuid128_t agendaUuid {BaseUuid()};
+
+ constexpr ble_uuid128_t agendaItemCharUuid {CharUuid(0x01, 0x00)};
+
+ int AgendaCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) {
+ auto agendaService = static_cast(arg);
+ return agendaService->OnCommand(conn_handle, attr_handle, ctxt);
+ }
+ */
+} // namespace
+
+
+Pinetime::Controllers::AgendaService::AgendaService(Pinetime::System::SystemTask& system) : m_system(system) {
+ /*
+ characteristicDefinition[0] = {.uuid = &agendaItemCharUuid.u,
+ .access_cb = AgendaCallback,
+ .arg = this,
+ .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ};
+
+ characteristicDefinition[1] = {0};
+
+ serviceDefinition[0] = {.type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = &agendaUuid.u, .characteristics = characteristicDefinition};
+ serviceDefinition[1] = {0};
+ */
+ m_agenda_times[0] = 1655327841;
+ m_agenda_pieces[0] = "Write AgendaService";
+
+ m_agenda_times[1] = 1655369999;
+ m_agenda_pieces[1] = "WTF C++ dates";
+
+ m_agenda_times[2] = 1655370699;
+ m_agenda_pieces[2] = "??? work ???";
+
+ m_agenda_times[3] = 1655380699;
+ m_agenda_pieces[3] = "??? stuff ???";
+
+ m_agenda_times[4] = 1655381699;
+ m_agenda_pieces[4] = "WTF C++ dates";
+
+ m_agenda_times[5] = 1655382699;
+ m_agenda_pieces[5] = "??? work ???";
+
+ m_agenda_times[6] = 1655493699;
+ m_agenda_pieces[6] = "??? stuff ???";
+
+ m_agenda_times[7] = 1655497999;
+ m_agenda_pieces[7] = "??? stuff ???";
+}
+
+void Pinetime::Controllers::AgendaService::Init() {
+ /*
+ int res = 0;
+ res = ble_gatts_count_cfg(serviceDefinition);
+ ASSERT(res == 0);
+
+ res = ble_gatts_add_svcs(serviceDefinition);
+ ASSERT(res == 0);
+
+ m_agenda_times[0] = 1655327841;
+ m_agenda_pieces[0] = "Write AgendaService";
+ */
+}
+
+/*
+int Pinetime::Controllers::AgendaService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) {
+
+ if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+ size_t notifSize = OS_MBUF_PKTLEN(ctxt->om);
+ uint8_t data[notifSize + 1];
+ data[notifSize] = '\0';
+ os_mbuf_copydata(ctxt->om, 0, notifSize, data);
+ char* s = (char*) &data[0];
+ if (ble_uuid_cmp(ctxt->chr->uuid, &agendaItemCharUuid.u) == 0) {
+ if (notifSize >= 5) {
+ uint8_t itemIndex = (uint8_t) data[0];
+ uint32_t itemTime = ((uint32_t) data[1]) << 24 | ((uint32_t) data[2]) << 16 | ((uint32_t) data[3]) << 8 | ((uint32_t) data[4]);
+ char* sAgendaItem = (char*) &data[5];
+ if (itemIndex <= 15) { // don't allow a buffer overflow
+ m_agenda_times = itemTime;
+ // implicit std::string copy/conversion here:
+ m_agenda_pieces = sAgendaItem;
+ }
+ }
+ }
+ }
+ return 0;
+}
+*/
+uint32_t Pinetime::Controllers::AgendaService::getAgendaTime(uint8_t index) {
+ if (index <= AGENDA_CAPACITY) {
+ return m_agenda_times[index];
+ } else {
+ return 0;
+ }
+}
+
+std::string Pinetime::Controllers::AgendaService::getAgendaPiece(uint8_t index) {
+ if (index <= AGENDA_CAPACITY) {
+ return m_agenda_pieces[index];
+ } else {
+ return 0;
+ }
+}
diff --git a/sim/components/ble/AgendaService.h b/sim/components/ble/AgendaService.h
new file mode 100644
index 0000000..e3c5e61
--- /dev/null
+++ b/sim/components/ble/AgendaService.h
@@ -0,0 +1,59 @@
+/* Copyright (C) 2021 Adam Pigg
+
+ This file is part of InfiniTime.
+
+ InfiniTime is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ InfiniTime is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#pragma once
+
+#include
+#include
+// #define min // workaround: nimble's min/max macros conflict with libstdc++
+// #define max
+// #include
+// #include
+// #undef max
+// #undef min
+
+namespace Pinetime {
+ namespace System {
+ class SystemTask;
+ }
+ namespace Controllers {
+
+ class AgendaService {
+ public:
+ static const uint8_t AGENDA_CAPACITY = 30;
+
+ explicit AgendaService(Pinetime::System::SystemTask& system);
+
+ void Init();
+
+// int OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt);
+
+ uint32_t getAgendaTime(uint8_t index);
+
+ std::string getAgendaPiece(uint8_t index);
+
+ private:
+// struct ble_gatt_chr_def characteristicDefinition[2];
+// struct ble_gatt_svc_def serviceDefinition[2];
+
+ uint32_t m_agenda_times[AGENDA_CAPACITY];
+ std::string m_agenda_pieces[AGENDA_CAPACITY];
+
+ Pinetime::System::SystemTask& m_system;
+ };
+ }
+}
diff --git a/sim/components/ble/NimbleController.cpp b/sim/components/ble/NimbleController.cpp
index 3684d25..05f43b1 100644
--- a/sim/components/ble/NimbleController.cpp
+++ b/sim/components/ble/NimbleController.cpp
@@ -45,6 +45,7 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
// currentTimeService {dateTimeController},
musicService {systemTask},
weatherService {systemTask, dateTimeController},
+ agendaService {systemTask},
navService {systemTask} {
// batteryInformationService {batteryController},
// immediateAlertService {systemTask, notificationManager},
@@ -92,6 +93,7 @@ void NimbleController::Init() {
musicService.Init();
weatherService.Init();
navService.Init();
+ agendaService.Init();
// anService.Init();
// dfuService.Init();
// batteryInformationService.Init();
diff --git a/sim/components/ble/NimbleController.h b/sim/components/ble/NimbleController.h
index ce7e8d7..0f281c3 100644
--- a/sim/components/ble/NimbleController.h
+++ b/sim/components/ble/NimbleController.h
@@ -18,6 +18,7 @@
//#include "components/ble/ImmediateAlertService.h"
#include "components/ble/MusicService.h"
#include "components/ble/NavigationService.h"
+#include "components/ble/AgendaService.h"
//#include "components/ble/ServiceDiscovery.h"
//#include "components/ble/MotionService.h"
#include "components/ble/weather/WeatherService.h"
@@ -75,6 +76,9 @@ namespace Pinetime {
Pinetime::Controllers::NavigationService& navigation() {
return navService;
};
+ Pinetime::Controllers::AgendaService& agenda() {
+ return agendaService;
+ };
Pinetime::Controllers::AlertNotificationService& alertService() {
return anService;
};
@@ -113,6 +117,7 @@ namespace Pinetime {
MusicService musicService;
WeatherService weatherService;
NavigationService navService;
+ AgendaService agendaService;
// BatteryInformationService batteryInformationService;
// ImmediateAlertService immediateAlertService;
// HeartRateService heartRateService;