-
-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathBLE_Cycling_Speed_Cadence.cpp
More file actions
64 lines (49 loc) · 2.75 KB
/
BLE_Cycling_Speed_Cadence.cpp
File metadata and controls
64 lines (49 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
* Copyright (C) 2020 Anthony Doud & Joel Baranick
* All rights reserved
*
* SPDX-License-Identifier: GPL-2.0-only
*/
#include "BLE_Cycling_Speed_Cadence.h"
#include "DirConManager.h"
#include <Constants.h>
BLE_Cycling_Speed_Cadence::BLE_Cycling_Speed_Cadence() : pCyclingSpeedCadenceService(nullptr), cscMeasurement(nullptr), cscFeature(nullptr) {}
void BLE_Cycling_Speed_Cadence::setupService(NimBLEServer* pServer, MyCharacteristicCallbacks* chrCallbacks) {
pCyclingSpeedCadenceService = pServer->createService(CSCSERVICE_UUID);
cscMeasurement = pCyclingSpeedCadenceService->createCharacteristic(CSCMEASUREMENT_UUID, NIMBLE_PROPERTY::NOTIFY);
cscFeature = pCyclingSpeedCadenceService->createCharacteristic(CSCFEATURE_UUID, NIMBLE_PROPERTY::READ);
CyclingSpeedCadenceFeatureFlags::Types cscFeatureFlags =
CyclingSpeedCadenceFeatureFlags::WheelRevolutionDataSupported | CyclingSpeedCadenceFeatureFlags::CrankRevolutionDataSupported;
cscFeatureBytes[0] = static_cast<uint8_t>(cscFeatureFlags & 0xFF);
cscFeatureBytes[1] = static_cast<uint8_t>((cscFeatureFlags >> 8) & 0xFF);
cscFeature->setValue(cscFeatureBytes, sizeof(cscFeatureBytes));
cscMeasurement->setCallbacks(chrCallbacks);
pCyclingSpeedCadenceService->start();
// Add service UUID to DirCon MDNS
DirConManager::addBleServiceUuid(pCyclingSpeedCadenceService->getUUID());
}
void BLE_Cycling_Speed_Cadence::update() {
/*if (!spinBLEServer.clientSubscribed.CyclingSpeedCadence) {
return;
}*/
CscMeasurement csc;
// Clear all flags initially
*(reinterpret_cast<uint8_t*>(&(csc.flags))) = 0;
// Set flags based on data presence
csc.flags.wheelRevolutionDataPresent = 1; // Wheel Revolution Data Present
csc.flags.crankRevolutionDataPresent = 1; // Crank Revolution Data Present
// Set data fields
csc.cumulativeWheelRevolutions = spinBLEClient.cscCumulativeWheelRev;
csc.lastWheelEventTime = spinBLEClient.cscLastWheelEvtTime;
csc.cumulativeCrankRevolutions = spinBLEClient.cscCumulativeCrankRev;
csc.lastCrankEventTime = spinBLEClient.cscLastCrankEvtTime;
auto byteArray = csc.toByteArray();
// Notify the cycling power measurement characteristic
spinBLEServer.notifyBleAndDircon(cscMeasurement, &byteArray[0], byteArray.size());
const int kLogBufCapacity = 150;
char logBuf[kLogBufCapacity];
const size_t byteArrayLength = byteArray.size();
logCharacteristic(logBuf, kLogBufCapacity, &byteArray[0], byteArrayLength, CSCSERVICE_UUID, cscMeasurement->getUUID(),
"CSC(CSM)[ WheelRev(%lu) WheelTime(%u) CrankRev(%u) CrankTime(%u) ]", spinBLEClient.cscCumulativeWheelRev, spinBLEClient.cscLastWheelEvtTime,
spinBLEClient.cscCumulativeCrankRev, spinBLEClient.cscLastCrankEvtTime);
}