From a3cd6e6f39aaea122800e89036ac88e1ed4c0249 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ab=C3=A1sz?= <>
Date: Sat, 17 Dec 2022 21:35:22 +0100
Subject: [PATCH] Add OFF mode to BLE peripheral and refactoring
Add OFF mode to be able to turn BLE advertisement off. Rename
switchPeripheralMode function to include BLE in order to be more
descriptive.
---
app/client/components/DashboardActions.js | 8 +--
app/client/lib/app.js | 4 +-
app/peripherals/PeripheralManager.js | 71 ++++++++++++-----------
app/server.js | 8 +--
config/default.config.js | 1 +
5 files changed, 49 insertions(+), 43 deletions(-)
diff --git a/app/client/components/DashboardActions.js b/app/client/components/DashboardActions.js
index 109cdfa..cde18ec 100644
--- a/app/client/components/DashboardActions.js
+++ b/app/client/components/DashboardActions.js
@@ -65,7 +65,7 @@ export class DashboardActions extends AppElement {
return html`
${this.renderOptionalButtons()}
-
+
${this.peripheralMode()}
${this.dialog ? this.dialog : ''}
`
@@ -116,7 +116,7 @@ export class DashboardActions extends AppElement {
case 'FTMS':
return 'FTMS Rower'
default:
- return ''
+ return 'Off'
}
}
@@ -135,8 +135,8 @@ export class DashboardActions extends AppElement {
this.sendEvent('triggerAction', { command: 'reset' })
}
- switchPeripheralMode () {
- this.sendEvent('triggerAction', { command: 'switchPeripheralMode' })
+ switchBlePeripheralMode () {
+ this.sendEvent('triggerAction', { command: 'switchBlePeripheralMode' })
}
uploadTraining () {
diff --git a/app/client/lib/app.js b/app/client/lib/app.js
index 86da9f6..5961202 100644
--- a/app/client/lib/app.js
+++ b/app/client/lib/app.js
@@ -130,8 +130,8 @@ export function createApp (app) {
function handleAction (action) {
switch (action.command) {
- case 'switchPeripheralMode': {
- if (socket)socket.send(JSON.stringify({ command: 'switchPeripheralMode' }))
+ case 'switchBlePeripheralMode': {
+ if (socket)socket.send(JSON.stringify({ command: 'switchBlePeripheralMode' }))
break
}
case 'reset': {
diff --git a/app/peripherals/PeripheralManager.js b/app/peripherals/PeripheralManager.js
index f518bc7..efa8ed2 100644
--- a/app/peripherals/PeripheralManager.js
+++ b/app/peripherals/PeripheralManager.js
@@ -16,83 +16,88 @@ import child_process from 'child_process'
import AntManager from './ant/AntManager.js'
import { createAntHrmPeripheral } from './ant/HrmPeripheral.js'
-const modes = ['FTMS', 'FTMSBIKE', 'PM5', 'CSC', 'CPS']
+const bleModes = ['FTMS', 'FTMSBIKE', 'PM5', 'CSC', 'CPS', 'OFF']
function createPeripheralManager () {
const emitter = new EventEmitter()
- let peripheral
- let mode
+ let blePeripheral
+ let bleMode
- createPeripheral(config.bluetoothMode)
+ createBlePeripheral(config.bluetoothMode)
- function getPeripheral () {
- return peripheral
+ function getBlePeripheral () {
+ return blePeripheral
}
- function getPeripheralMode () {
- return mode
+ function getBlePeripheralMode () {
+ return bleMode
}
- function switchPeripheralMode (newMode) {
+ function switchBlePeripheralMode (newMode) {
// if now mode was passed, select the next one from the list
if (newMode === undefined) {
- newMode = modes[(modes.indexOf(mode) + 1) % modes.length]
+ newMode = bleModes[(bleModes.indexOf(bleMode) + 1) % bleModes.length]
}
- createPeripheral(newMode)
+ createBlePeripheral(newMode)
}
function notifyMetrics (type, metrics) {
- peripheral.notifyData(type, metrics)
+ blePeripheral.notifyData(type, metrics)
}
function notifyStatus (status) {
- peripheral.notifyStatus(status)
+ blePeripheral.notifyStatus(status)
}
- async function createPeripheral (newMode) {
- if (peripheral) {
- await peripheral.destroy()
+ async function createBlePeripheral (newMode) {
+ if (blePeripheral) {
+ await blePeripheral.destroy()
}
switch (newMode) {
case 'PM5':
log.info('bluetooth profile: Concept2 PM5')
- peripheral = createPm5Peripheral(controlCallback)
- mode = 'PM5'
+ blePeripheral = createPm5Peripheral(controlCallback)
+ bleMode = 'PM5'
break
case 'FTMSBIKE':
log.info('bluetooth profile: FTMS Indoor Bike')
- peripheral = createFtmsPeripheral(controlCallback, {
+ blePeripheral = createFtmsPeripheral(controlCallback, {
simulateIndoorBike: true
})
- mode = 'FTMSBIKE'
+ bleMode = 'FTMSBIKE'
break
+
case 'CSC':
log.info('bluetooth profile: Cycling Speed and Cadence')
- peripheral = createCscPeripheral()
- mode = 'CSC'
+ blePeripheral = createCscPeripheral()
+ bleMode = 'CSC'
break
+
case 'CPS':
log.info('bluetooth profile: Cycling Power Meter')
- peripheral = createCpsPeripheral()
- mode = 'CPS'
+ blePeripheral = createCpsPeripheral()
+ bleMode = 'CPS'
break
case 'FTMS':
- default:
log.info('bluetooth profile: FTMS Rower')
- peripheral = createFtmsPeripheral(controlCallback, {
+ blePeripheral = createFtmsPeripheral(controlCallback, {
simulateIndoorBike: false
})
- mode = 'FTMS'
+ bleMode = 'FTMS'
break
+
+ default:
+ log.info('bluetooth profile: Off')
+ bleMode = 'OFF'
}
- peripheral.triggerAdvertising()
+ if (bleMode.toLocaleLowerCase() !== 'OFF'.toLocaleLowerCase()) { blePeripheral.triggerAdvertising() }
emitter.emit('control', {
req: {
- name: 'peripheralMode',
- peripheralMode: mode
+ name: 'blePeripheralMode',
+ peripheralMode: bleMode
}
})
}
@@ -123,9 +128,9 @@ function createPeripheralManager () {
return Object.assign(emitter, {
startAntHeartRateService,
startBleHeartRateService,
- getPeripheral,
- getPeripheralMode,
- switchPeripheralMode,
+ getBlePeripheral,
+ getBlePeripheralMode,
+ switchBlePeripheralMode,
notifyMetrics,
notifyStatus
})
diff --git a/app/server.js b/app/server.js
index 32e449c..d287559 100644
--- a/app/server.js
+++ b/app/server.js
@@ -98,7 +98,7 @@ peripheralManager.on('control', (event) => {
peripheralManager.notifyStatus({ name: 'startedOrResumedByUser' })
event.res = true
break
- case 'peripheralMode':
+ case 'blePeripheralMode':
webServer.notifyClients('config', getConfig())
event.res = true
break
@@ -216,8 +216,8 @@ workoutUploader.on('resetWorkout', () => {
const webServer = createWebServer()
webServer.on('messageReceived', async (message, client) => {
switch (message.command) {
- case 'switchPeripheralMode':
- peripheralManager.switchPeripheralMode()
+ case 'switchBlePeripheralMode':
+ peripheralManager.switchBlePeripheralMode()
break
case 'reset':
resetWorkout()
@@ -243,7 +243,7 @@ webServer.on('clientConnected', (client) => {
// todo: extract this into some kind of state manager
function getConfig () {
return {
- peripheralMode: peripheralManager.getPeripheralMode(),
+ peripheralMode: peripheralManager.getBlePeripheralMode(),
stravaUploadEnabled: !!config.stravaClientId && !!config.stravaClientSecret,
shutdownEnabled: !!config.shutdownCommand
}
diff --git a/config/default.config.js b/config/default.config.js
index fa16cfa..e44371d 100644
--- a/config/default.config.js
+++ b/config/default.config.js
@@ -78,6 +78,7 @@ export default {
// - FTMSBIKE: The FTMS profile is used by Smart Bike Trainers (please note: the speed and power are still aimed for rowing, NOT for a bike!)
// - CPS: The BLE Cycling Power Profile simulates a bike for more modern Garmin watches
// - CSC: The BLE Cycling Speed and Cadence Profile simulates a bike for older Garmin watches
+ // - OFF: Turns Bluetooth advertisement off
bluetoothMode: 'FTMS',
// Turn this on if you want support for Bluetooth Low Energy heart rate monitors