diff options
Diffstat (limited to 'src/components/ble')
-rw-r--r-- | src/components/ble/NavigationService.cpp | 137 | ||||
-rw-r--r-- | src/components/ble/NavigationService.h | 96 | ||||
-rw-r--r-- | src/components/ble/NimbleController.cpp | 2 | ||||
-rw-r--r-- | src/components/ble/NimbleController.h | 3 |
4 files changed, 238 insertions, 0 deletions
diff --git a/src/components/ble/NavigationService.cpp b/src/components/ble/NavigationService.cpp new file mode 100644 index 00000000..3c1fd162 --- /dev/null +++ b/src/components/ble/NavigationService.cpp @@ -0,0 +1,137 @@ +/* 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 <https://www.gnu.org/licenses/>. +*/ + +#include "NavigationService.h" + +#include "systemtask/SystemTask.h" + +int NAVCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { + auto navService = static_cast<Pinetime::Controllers::NavigationService *>(arg); + return navService->OnCommand(conn_handle, attr_handle, ctxt); +} + +Pinetime::Controllers::NavigationService::NavigationService(Pinetime::System::SystemTask &system) : m_system(system) { + navUuid.value[14] = navId[0]; + navUuid.value[15] = navId[1]; + + navFlagCharUuid.value[12] = navFlagCharId[0]; + navFlagCharUuid.value[13] = navFlagCharId[1]; + navFlagCharUuid.value[14] = navId[0]; + navFlagCharUuid.value[15] = navId[1]; + + navNarrativeCharUuid.value[12] = navNarrativeCharId[0]; + navNarrativeCharUuid.value[13] = navNarrativeCharId[1]; + navNarrativeCharUuid.value[14] = navId[0]; + navNarrativeCharUuid.value[15] = navId[1]; + + navManDistCharUuid.value[12] = navManDistCharId[0]; + navManDistCharUuid.value[13] = navManDistCharId[1]; + navManDistCharUuid.value[14] = navId[0]; + navManDistCharUuid.value[15] = navId[1]; + + navProgressCharUuid.value[12] = navProgressCharId[0]; + navProgressCharUuid.value[13] = navProgressCharId[1]; + navProgressCharUuid.value[14] = navId[0]; + navProgressCharUuid.value[15] = navId[1]; + + characteristicDefinition[0] = {.uuid = (ble_uuid_t *) (&navFlagCharUuid), + .access_cb = NAVCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ + }; + + characteristicDefinition[1] = {.uuid = (ble_uuid_t *) (&navNarrativeCharUuid), + .access_cb = NAVCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ + }; + characteristicDefinition[2] = {.uuid = (ble_uuid_t *) (&navManDistCharUuid), + .access_cb = NAVCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ + }; + characteristicDefinition[3] = {.uuid = (ble_uuid_t *) (&navProgressCharUuid), + .access_cb = NAVCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ + }; + + characteristicDefinition[4] = {0}; + + serviceDefinition[0] = { + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t *) &navUuid, + .characteristics = characteristicDefinition + }; + serviceDefinition[1] = {0}; + + m_progress = 0; +} + +void Pinetime::Controllers::NavigationService::Init() { + int res = 0; + res = ble_gatts_count_cfg(serviceDefinition); + ASSERT(res == 0); + + res = ble_gatts_add_svcs(serviceDefinition); + ASSERT(res == 0); +} + +int Pinetime::Controllers::NavigationService::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]; + NRF_LOG_INFO("DATA : %s", s); + if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navFlagCharUuid) == 0) { + m_flag = s; + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navNarrativeCharUuid) == 0) { + m_narrative = s; + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navManDistCharUuid) == 0) { + m_manDist = s; + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navProgressCharUuid) == 0) { + m_progress = data[0]; + } + } + return 0; +} + +std::string Pinetime::Controllers::NavigationService::getFlag() +{ + return m_flag; +} + +std::string Pinetime::Controllers::NavigationService::getNarrative() +{ + return m_narrative; +} + +std::string Pinetime::Controllers::NavigationService::getManDist() +{ + return m_manDist; +} + +int Pinetime::Controllers::NavigationService::getProgress() +{ + return m_progress; +} + diff --git a/src/components/ble/NavigationService.h b/src/components/ble/NavigationService.h new file mode 100644 index 00000000..29b17582 --- /dev/null +++ b/src/components/ble/NavigationService.h @@ -0,0 +1,96 @@ +/* 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 <https://www.gnu.org/licenses/>. +*/ +#pragma once + +#include <cstdint> +#include <string> +#define min // workaround: nimble's min/max macros conflict with libstdc++ +#define max +#include <host/ble_gap.h> +#include <host/ble_uuid.h> +#undef max +#undef min + +//c7e60000-78fc-48fe-8e23-433b3a1942d0 +#define NAVIGATION_SERVICE_UUID_BASE {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0x00, 0x00} + +namespace Pinetime { + namespace System { + class SystemTask; + } + namespace Controllers { + + class NavigationService { + public: + explicit NavigationService(Pinetime::System::SystemTask &system); + + void Init(); + + int OnCommand(uint16_t conn_handle, uint16_t attr_handle, + struct ble_gatt_access_ctxt *ctxt); + + std::string getFlag(); + + std::string getNarrative(); + + std::string getManDist(); + + int getProgress(); + + private: + static constexpr uint8_t navId[2] = {0x01, 0x00}; + static constexpr uint8_t navFlagCharId[2] = {0x01, 0x00}; + static constexpr uint8_t navNarrativeCharId[2] = {0x02, 0x00}; + static constexpr uint8_t navManDistCharId[2] = {0x03, 0x00}; + static constexpr uint8_t navProgressCharId[2] = {0x04, 0x00}; + + ble_uuid128_t navUuid{ + .u = {.type = BLE_UUID_TYPE_128}, + .value = NAVIGATION_SERVICE_UUID_BASE + }; + + ble_uuid128_t navFlagCharUuid{ + .u = {.type = BLE_UUID_TYPE_128}, + .value = NAVIGATION_SERVICE_UUID_BASE + }; + ble_uuid128_t navNarrativeCharUuid{ + .u = {.type = BLE_UUID_TYPE_128}, + .value = NAVIGATION_SERVICE_UUID_BASE + }; + ble_uuid128_t navManDistCharUuid{ + .u = {.type = BLE_UUID_TYPE_128}, + .value = NAVIGATION_SERVICE_UUID_BASE + }; + ble_uuid128_t navProgressCharUuid{ + .u = {.type = BLE_UUID_TYPE_128}, + .value = NAVIGATION_SERVICE_UUID_BASE + }; + + struct ble_gatt_chr_def characteristicDefinition[5]; + struct ble_gatt_svc_def serviceDefinition[2]; + + std::string m_flag; + std::string m_narrative; + std::string m_manDist; + int m_progress; + + Pinetime::System::SystemTask &m_system; + }; + } +} + diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index 608e230e..f2786ea1 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -35,6 +35,7 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask, alertNotificationClient{systemTask, notificationManager}, currentTimeService{dateTimeController}, musicService{systemTask}, + navService{systemTask}, batteryInformationService{batteryController}, immediateAlertService{systemTask, notificationManager}, serviceDiscovery({¤tTimeClient, &alertNotificationClient}), @@ -56,6 +57,7 @@ void NimbleController::Init() { currentTimeClient.Init(); currentTimeService.Init(); musicService.Init(); + navService.Init(); anService.Init(); dfuService.Init(); batteryInformationService.Init(); diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h index 304182a2..a109800c 100644 --- a/src/components/ble/NimbleController.h +++ b/src/components/ble/NimbleController.h @@ -16,6 +16,7 @@ #include "DfuService.h" #include "ImmediateAlertService.h" #include "MusicService.h" +#include "NavigationService.h" #include "ServiceDiscovery.h" #include "HeartRateService.h" @@ -56,6 +57,7 @@ namespace Pinetime { void StartDiscovery(); Pinetime::Controllers::MusicService& music() {return musicService;}; + Pinetime::Controllers::NavigationService& navigation() {return navService;}; uint16_t connHandle(); @@ -74,6 +76,7 @@ namespace Pinetime { AlertNotificationClient alertNotificationClient; CurrentTimeService currentTimeService; MusicService musicService; + NavigationService navService; BatteryInformationService batteryInformationService; ImmediateAlertService immediateAlertService; HeartRateService heartRateService; |