InfiniTime.git

commit efd0c9eff7000c71825221d3094e7bb709465fc2

Author: JF <jf@codingfield.com>

Merge branch 'batteryInformationService' of JF/PineTime into develop

 src/CMakeLists.txt | 2 
 src/Components/Battery/BatteryController.cpp | 5 +
 src/Components/Ble/BatteryInformationService.cpp | 62 ++++++++++++++++++
 src/Components/Ble/BatteryInformationService.h | 40 +++++++++++
 src/Components/Ble/NimbleController.cpp | 7 +
 src/Components/Ble/NimbleController.h | 4 
 src/SystemTask/SystemTask.cpp | 2 


diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4032d7ea8867d4fd44839682cf0a5ae405c874ff..57dbe8b975419313e9f00a4e8f30d99a2e08e27e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -362,6 +362,7 @@   Components/Ble/DfuService.cpp
   Components/Ble/CurrentTimeService.cpp
   Components/Ble/AlertNotificationService.cpp
   Components/Ble/MusicService.cpp
+  Components/Ble/BatteryInformationService.cpp
   Components/FirmwareValidator/FirmwareValidator.cpp
   drivers/Cst816s.cpp
   FreeRTOS/port.c
@@ -435,6 +436,7 @@   Components/Ble/CurrentTimeClient.h
   Components/Ble/AlertNotificationClient.h
   Components/Ble/DfuService.h
   Components/FirmwareValidator/FirmwareValidator.h
+  Components/Ble/BatteryInformationService.h
   drivers/Cst816s.h
   FreeRTOS/portmacro.h
   FreeRTOS/portmacro_cmsis.h




diff --git a/src/Components/Battery/BatteryController.cpp b/src/Components/Battery/BatteryController.cpp
index 198ce5aa1db434dd1a58d1b1a308b7008ee545c0..571efae64d7c8b352648777df15b264d8275d65f 100644
--- a/src/Components/Battery/BatteryController.cpp
+++ b/src/Components/Battery/BatteryController.cpp
@@ -1,6 +1,7 @@
 #include <drivers/include/nrfx_saadc.h>
 #include <hal/nrf_gpio.h>
 #include <libraries/log/nrf_log.h>
+#include <algorithm>
 #include "BatteryController.h"
 
 using namespace Pinetime::Controllers;
@@ -34,7 +35,9 @@   nrfx_saadc_sample_convert(0, &value);
 
   // see https://forum.pine64.org/showthread.php?tid=8147
   voltage = (value * 2.0f) / (1024/3.0f);
-  percentRemaining = ((voltage - 3.55)*100)*3.9;
+  percentRemaining = ((voltage - 3.55f)*100.0f)*3.9f;
+  percentRemaining = std::max(percentRemaining, 0.0f);
+  percentRemaining = std::min(percentRemaining, 100.0f);
 
 //  NRF_LOG_INFO("BATTERY " NRF_LOG_FLOAT_MARKER " %% - " NRF_LOG_FLOAT_MARKER " v", NRF_LOG_FLOAT(percentRemaining), NRF_LOG_FLOAT(voltage));
 //  NRF_LOG_INFO("POWER Charging : %d - Power : %d", isCharging, isPowerPresent);




diff --git a/src/Components/Ble/BatteryInformationService.cpp b/src/Components/Ble/BatteryInformationService.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c86830b88c33b647d8be22000f5a24acaf961530
--- /dev/null
+++ b/src/Components/Ble/BatteryInformationService.cpp
@@ -0,0 +1,62 @@
+#include "BatteryInformationService.h"
+#include "../Battery/BatteryController.h"
+
+using namespace Pinetime::Controllers;
+
+constexpr ble_uuid16_t BatteryInformationService::batteryInformationServiceUuid;
+constexpr ble_uuid16_t BatteryInformationService::batteryLevelUuid;
+
+
+
+int BatteryInformationServiceCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) {
+  auto* batteryInformationService = static_cast<BatteryInformationService*>(arg);
+  return batteryInformationService->OnBatteryServiceRequested(conn_handle, attr_handle, ctxt);
+}
+
+BatteryInformationService::BatteryInformationService(Controllers::Battery& batteryController) :
+        batteryController{batteryController},
+        characteristicDefinition{
+                {
+                        .uuid = (ble_uuid_t *) &batteryLevelUuid,
+                        .access_cb = BatteryInformationServiceCallback,
+                        .arg = this,
+                        .flags = BLE_GATT_CHR_F_READ,
+                        .val_handle = &batteryLevelHandle
+                },
+                {
+                        0
+                }
+        },
+        serviceDefinition{
+                {
+                        /* Device Information Service */
+                        .type = BLE_GATT_SVC_TYPE_PRIMARY,
+                        .uuid = (ble_uuid_t *) &batteryInformationServiceUuid,
+                        .characteristics = characteristicDefinition
+                },
+                {
+                        0
+                },
+        }{
+
+}
+
+void BatteryInformationService::Init() {
+  int res = 0;
+  res = ble_gatts_count_cfg(serviceDefinition);
+  ASSERT(res == 0);
+
+  res = ble_gatts_add_svcs(serviceDefinition);
+  ASSERT(res == 0);
+}
+
+int BatteryInformationService::OnBatteryServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle,
+                                                         ble_gatt_access_ctxt *context) {
+  if(attributeHandle == batteryLevelHandle) {
+    NRF_LOG_INFO("BATTERY : handle = %d", batteryLevelHandle);
+    static uint8_t batteryValue = batteryController.PercentRemaining();
+    int res = os_mbuf_append(context->om, &batteryValue, 1);
+    return (res == 0) ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES;
+  }
+  return 0;
+}
\ No newline at end of file




diff --git a/src/Components/Ble/BatteryInformationService.h b/src/Components/Ble/BatteryInformationService.h
new file mode 100644
index 0000000000000000000000000000000000000000..74b2222c4ee59f67e0029b74275444158c35e3b0
--- /dev/null
+++ b/src/Components/Ble/BatteryInformationService.h
@@ -0,0 +1,40 @@
+#pragma once
+#include <host/ble_gap.h>
+
+namespace Pinetime {
+  namespace System {
+    class SystemTask;
+  }
+  namespace Controllers {
+    class Battery;
+    class BatteryInformationService {
+      public:
+        BatteryInformationService(Controllers::Battery& batteryController);
+        void Init();
+
+        int
+        OnBatteryServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt *context);
+
+      private:
+        Controllers::Battery& batteryController;
+        static constexpr uint16_t batteryInformationServiceId {0x180F};
+        static constexpr uint16_t batteryLevelId {0x2A19};
+
+        static constexpr ble_uuid16_t batteryInformationServiceUuid {
+                .u {.type = BLE_UUID_TYPE_16},
+                .value = batteryInformationServiceId
+        };
+
+        static constexpr ble_uuid16_t batteryLevelUuid {
+                .u {.type = BLE_UUID_TYPE_16},
+                .value = batteryLevelId
+        };
+
+        struct ble_gatt_chr_def characteristicDefinition[3];
+        struct ble_gatt_svc_def serviceDefinition[2];
+
+        uint16_t batteryLevelHandle;
+
+    };
+  }
+}




diff --git a/src/Components/Ble/NimbleController.cpp b/src/Components/Ble/NimbleController.cpp
index 7dde9d0c82cdad0adca57c8cc7d2d31c684a274c..a8add0dfcccbc93b4fc9de3640dff05a32d158db 100644
--- a/src/Components/Ble/NimbleController.cpp
+++ b/src/Components/Ble/NimbleController.cpp
@@ -26,6 +26,7 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
                                    Pinetime::Controllers::Ble& bleController,
         DateTime& dateTimeController,
         Pinetime::Controllers::NotificationManager& notificationManager,
+        Controllers::Battery& batteryController,
         Pinetime::Drivers::SpiNorFlash& spiNorFlash) :
         systemTask{systemTask},
         bleController{bleController},
@@ -37,7 +38,8 @@         currentTimeClient{dateTimeController},
         anService{systemTask, notificationManager},
         alertNotificationClient{systemTask, notificationManager},
         currentTimeService{dateTimeController},
-        musicService{systemTask} {
+        musicService{systemTask},
+        batteryInformationService{batteryController} {
 
 }
 
@@ -83,10 +85,9 @@   deviceInformationService.Init();
   currentTimeClient.Init();
   currentTimeService.Init();
   musicService.Init();
-
   anService.Init();
-
   dfuService.Init();
+  batteryInformationService.Init();
   int res;
   res = ble_hs_util_ensure_addr(0);
   ASSERT(res == 0);




diff --git a/src/Components/Ble/NimbleController.h b/src/Components/Ble/NimbleController.h
index 50b8b0b85815ed65b2528dad895ebfcfb672acd6..2dee8987a18737ac12a94bf4a54a326efa575595 100644
--- a/src/Components/Ble/NimbleController.h
+++ b/src/Components/Ble/NimbleController.h
@@ -8,6 +8,7 @@ #include "CurrentTimeClient.h"
 #include "DfuService.h"
 #include "CurrentTimeService.h"
 #include "MusicService.h"
+#include "BatteryInformationService.h"
 #include <host/ble_gap.h>
 
 namespace Pinetime {
@@ -22,7 +23,7 @@
       public:
         NimbleController(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::Ble& bleController,
                 DateTime& dateTimeController, Pinetime::Controllers::NotificationManager& notificationManager,
-                Pinetime::Drivers::SpiNorFlash& spiNorFlash);
+                Controllers::Battery& batteryController, Pinetime::Drivers::SpiNorFlash& spiNorFlash);
         void Init();
         void StartAdvertising();
         int OnGAPEvent(ble_gap_event *event);
@@ -57,6 +58,7 @@         AlertNotificationService anService;
         AlertNotificationClient alertNotificationClient;
         CurrentTimeService currentTimeService;
         MusicService musicService;
+        BatteryInformationService batteryInformationService;
 
         uint8_t addrType; // 1 = Random, 0 = PUBLIC
         uint16_t connectionHandle = 0;




diff --git a/src/SystemTask/SystemTask.cpp b/src/SystemTask/SystemTask.cpp
index a4e635602e68db5ffba113844863fd4ebae79fa0..2070282b82b6b7cda08f3c5ce240164c0f3079ef 100644
--- a/src/SystemTask/SystemTask.cpp
+++ b/src/SystemTask/SystemTask.cpp
@@ -35,7 +35,7 @@                        spi{spi}, lcd{lcd}, spiNorFlash{spiNorFlash},
                        twiMaster{twiMaster}, touchPanel{touchPanel}, lvgl{lvgl}, batteryController{batteryController},
                        bleController{bleController}, dateTimeController{dateTimeController},
                        watchdog{}, watchdogView{watchdog}, notificationManager{notificationManager},
-                       nimbleController(*this, bleController,dateTimeController, notificationManager, spiNorFlash) {
+                       nimbleController(*this, bleController,dateTimeController, notificationManager, batteryController, spiNorFlash) {
   systemTaksMsgQueue = xQueueCreate(10, 1);
 }