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;