summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorJean-François Milants <jf@codingfield.com>2021-01-20 21:34:21 +0100
committerJean-François Milants <jf@codingfield.com>2021-01-20 21:34:21 +0100
commit6d8513938764fe1f9818d562bf1a45498aa87a30 (patch)
tree419bfe41495e6a2e56334db41990ba2fb6d33f16 /src/components
parenta0f2fa8469f3a2c0f5f2f914ad174029da321cc0 (diff)
parent522a1eb0beaabb607b1f123993ec2f09be8a775b (diff)
Merge branch 'piggz-nav' into develop
Diffstat (limited to 'src/components')
-rw-r--r--src/components/ble/NavigationService.cpp137
-rw-r--r--src/components/ble/NavigationService.h96
-rw-r--r--src/components/ble/NimbleController.cpp2
-rw-r--r--src/components/ble/NimbleController.h3
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({&currentTimeClient, &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;