Added Blank FSService that exposes only version info

This commit is contained in:
Tim Keller 2021-10-17 01:09:26 +00:00
parent 42a5cdb5b7
commit f57f797ff5
5 changed files with 132 additions and 3 deletions

View File

@ -487,6 +487,7 @@ list(APPEND SOURCE_FILES
components/ble/NavigationService.cpp
displayapp/fonts/lv_font_navi_80.c
components/ble/BatteryInformationService.cpp
components/ble/FSService.cpp
components/ble/ImmediateAlertService.cpp
components/ble/ServiceDiscovery.cpp
components/ble/HeartRateService.cpp
@ -557,6 +558,7 @@ list(APPEND RECOVERY_SOURCE_FILES
components/ble/MusicService.cpp
components/ble/weather/WeatherService.cpp
components/ble/BatteryInformationService.cpp
components/ble/FSService.cpp
components/ble/ImmediateAlertService.cpp
components/ble/ServiceDiscovery.cpp
components/ble/NavigationService.cpp
@ -669,6 +671,7 @@ set(INCLUDE_FILES
components/ble/DfuService.h
components/firmwarevalidator/FirmwareValidator.h
components/ble/BatteryInformationService.h
components/ble/FSService.h
components/ble/ImmediateAlertService.h
components/ble/ServiceDiscovery.h
components/ble/BleClient.h

View File

@ -0,0 +1,55 @@
#include <nrf_log.h>
#include "FSService.h"
using namespace Pinetime::Controllers;
constexpr ble_uuid128_t FSService::fsServiceUuid;
constexpr ble_uuid128_t FSService::fsVersionUuid;
constexpr ble_uuid128_t FSService::fsTransferUuid;
int FSServiceCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) {
auto* fsService = static_cast<FSService*>(arg);
return fsService->OnFSServiceRequested(conn_handle, attr_handle, ctxt);
}
FSService::FSService(Pinetime::Controllers::FS& fs)
: fs {fs},
characteristicDefinition {{.uuid = &fsVersionUuid.u,
.access_cb = FSServiceCallback,
.arg = this,
.flags = BLE_GATT_CHR_F_READ,
.val_handle = &versionCharacteristicHandle},
{
.uuid = &fsTransferUuid.u,
.access_cb = FSServiceCallback,
.arg = this,
.flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY,
.val_handle = nullptr,
},
{0}},
serviceDefinition {
{/* Device Information Service */
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = &fsServiceUuid.u,
.characteristics = characteristicDefinition},
{0},
} {
}
void FSService::Init() {
int res = 0;
res = ble_gatts_count_cfg(serviceDefinition);
ASSERT(res == 0);
res = ble_gatts_add_svcs(serviceDefinition);
ASSERT(res == 0);
}
int FSService::OnFSServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context) {
if (attributeHandle == versionCharacteristicHandle) {
NRF_LOG_INFO("FS_S : handle = %d", versionCharacteristicHandle);
int res = os_mbuf_append(context->om, &fsVersion, sizeof(fsVersion));
return (res == 0) ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES;
}
return 0;
}

View File

@ -0,0 +1,65 @@
#pragma once
#define min // workaround: nimble's min/max macros conflict with libstdc++
#define max
#include <host/ble_gap.h>
#undef max
#undef min
#include "components/fs/FS.h"
namespace Pinetime {
namespace System {
class SystemTask;
}
namespace Controllers {
class Ble;
class FSService {
public:
FSService(Pinetime::Controllers::FS& fs);
void Init();
int OnFSServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context);
void NotifyFSRaw(uint16_t connectionHandle);
private:
Pinetime::Controllers::FS& fs;
static constexpr uint16_t FSServiceId {0xFEBB};
static constexpr uint16_t fsVersionId {0x0100};
static constexpr uint16_t fsTransferId {0x0200};
uint16_t fsVersion = {0x0004};
static constexpr ble_uuid128_t fsServiceUuid {
.u {.type = BLE_UUID_TYPE_128},
.value = {0x72, 0x65, 0x66, 0x73, 0x6e, 0x61, 0x72, 0x54, 0x65, 0x6c, 0x69, 0x46, 0xBB, 0xFE, 0xAF, 0xAD}};
static constexpr ble_uuid128_t fsVersionUuid {
.u {.type = BLE_UUID_TYPE_128},
.value = {0x72, 0x65, 0x66, 0x73, 0x6e, 0x61, 0x72, 0x54, 0x65, 0x6c, 0x69, 0x46, 0x00, 0x01, 0xAF, 0xAD}};
static constexpr ble_uuid128_t fsTransferUuid {
.u {.type = BLE_UUID_TYPE_128},
.value = {0x72, 0x65, 0x66, 0x73, 0x6e, 0x61, 0x72, 0x54, 0x65, 0x6c, 0x69, 0x46, 0x00, 0x02, 0xAF, 0xAD}};
struct ble_gatt_chr_def characteristicDefinition[3];
struct ble_gatt_svc_def serviceDefinition[2];
uint16_t versionCharacteristicHandle;
enum class commands {
INVALID = 0x00,
READ = 0x10,
READ_DATA = 0x11,
READ_PACING = 0x12,
WRITE = 0x20,
WRITE_PACING = 0x21,
WRITE_DATA = 0x22,
DELETE = 0x30,
DELETE_STATUS = 0x31,
MKDIR = 0x40,
MKDIR_STATUS = 0x41,
LISTDIR = 0x50,
LISTDIR_ENTRY = 0x51,
MOVE = 0x60,
MOVE_STATUS = 0x61,
}
};
}
}

View File

@ -30,7 +30,7 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
Controllers::HeartRateController& heartRateController,
Controllers::MotionController& motionController,
Pinetime::Controllers::FS& fs)
Controllers::FS& fs)
: systemTask {systemTask},
bleController {bleController},
dateTimeController {dateTimeController},
@ -49,7 +49,9 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
batteryInformationService {batteryController},
immediateAlertService {systemTask, notificationManager},
heartRateService {systemTask, heartRateController},
motionService {systemTask, motionController},
motionService{systemTask, motionController},
fs {fs},
fsService {fs},
serviceDiscovery({&currentTimeClient, &alertNotificationClient}) {
}
@ -97,7 +99,8 @@ void NimbleController::Init() {
immediateAlertService.Init();
heartRateService.Init();
motionService.Init();
fsService.Init();
int rc;
rc = ble_hs_util_ensure_addr(0);
ASSERT(rc == 0);

View File

@ -22,6 +22,7 @@
#include "components/ble/MotionService.h"
#include "components/ble/weather/WeatherService.h"
#include "components/fs/FS.h"
#include "components/ble/FSService.h"
namespace Pinetime {
namespace Drivers {
@ -110,6 +111,8 @@ namespace Pinetime {
HeartRateService heartRateService;
MotionService motionService;
ServiceDiscovery serviceDiscovery;
FS fs;
FSService fsService;
uint8_t addrType;
uint16_t connectionHandle = BLE_HS_CONN_HANDLE_NONE;