added getCharacteristic()
This commit is contained in:
Generated
+2481
-170
File diff suppressed because it is too large
Load Diff
+4
-1
@@ -18,12 +18,15 @@
|
||||
"@babel/plugin-syntax-bigint": "^7.8.3",
|
||||
"@babel/preset-env": "^7.28.5",
|
||||
"babel-loader": "^10.0.0",
|
||||
"pkg": "^5.8.1",
|
||||
"webpack": "^5.103.0",
|
||||
"webpack-cli": "^6.0.1",
|
||||
"webpack-node-externals": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"dbus-next": "^0.10.2",
|
||||
"typescript": "^5.9.3"
|
||||
"typescript": "^5.9.3",
|
||||
"usocket": "^1.0.2",
|
||||
"x11": "^2.3.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,6 +82,7 @@ export class BaseCharacteritic extends BaseInterface {
|
||||
super(bus, path, "org.bluez.GattCharacteristic1");
|
||||
this.UUID = uuid;
|
||||
this.Flags = flags;
|
||||
this.service = service;
|
||||
this.Service = service.path;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,25 @@ export class Bluez {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async getDeviceByServiceUUID(uuid) {
|
||||
const om = await this.getObjectManager();
|
||||
const objs = await om.GetManagedObjects();
|
||||
|
||||
for (const [path, ifaces] of Object.entries(objs)) {
|
||||
if (
|
||||
Object.hasOwn(ifaces, DEVICE_IFACE) &&
|
||||
Object.hasOwn(ifaces[DEVICE_IFACE], "UUIDs")
|
||||
) {
|
||||
const found = ifaces[DEVICE_IFACE]["UUIDs"].value.findIndex(
|
||||
(u) => u === uuid
|
||||
);
|
||||
if (found !== -1) {
|
||||
return new BluezDevice(this.bus, path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class BluezDevice {
|
||||
@@ -44,6 +63,11 @@ class BluezDevice {
|
||||
return props.Get(DEVICE_IFACE, name);
|
||||
}
|
||||
|
||||
async getValue(name) {
|
||||
const p = await this.getProperty(name);
|
||||
return p.value;
|
||||
}
|
||||
|
||||
async isConnected() {
|
||||
const c = await this.getProperty("Connected");
|
||||
return c.value;
|
||||
@@ -60,4 +84,22 @@ class BluezDevice {
|
||||
const device = o.getInterface(DEVICE_IFACE);
|
||||
await device.Disconnect();
|
||||
}
|
||||
|
||||
async getCharacteristic(uuid) {
|
||||
const o = await this.dbus.getProxyObject("org.bluez", "/");
|
||||
const om = o.getInterface("org.freedesktop.DBus.ObjectManager");
|
||||
const managed = await om.GetManagedObjects();
|
||||
|
||||
for (const [path, ifaces] of Object.entries(managed)) {
|
||||
if (
|
||||
path.startsWith(this.path) &&
|
||||
Object.hasOwn(ifaces, "org.bluez.GattCharacteristic1") &&
|
||||
Object.hasOwn(ifaces["org.bluez.GattCharacteristic1"], "UUID") &&
|
||||
ifaces["org.bluez.GattCharacteristic1"]["UUID"].value === uuid
|
||||
) {
|
||||
console.log(path);
|
||||
// construct gatt char.I
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+17
-6
@@ -1,6 +1,11 @@
|
||||
import { BaseInterface } from "./base";
|
||||
import { BaseService, BaseCharacteritic, BaseApplication } from "./bluez-gatt";
|
||||
|
||||
const Mode = Object.freeze({
|
||||
SIM: Symbol("sim"),
|
||||
ERG: Symbol("erg"),
|
||||
});
|
||||
|
||||
export class FTMSService extends BaseService {
|
||||
UUID = "00001826-0000-1000-8000-00805f9b34fb";
|
||||
Primary = true;
|
||||
@@ -30,6 +35,7 @@ class FTMSFeature extends BaseCharacteritic {
|
||||
}
|
||||
|
||||
class FTMSControlPoint extends BaseCharacteritic {
|
||||
mode = Mode.SIM;
|
||||
wind = 0;
|
||||
grade = 0;
|
||||
crr = 0;
|
||||
@@ -57,10 +63,16 @@ class FTMSControlPoint extends BaseCharacteritic {
|
||||
} else if (value[0] === 0x01) {
|
||||
// reset machine
|
||||
this.notify([0x80, 0x01, 0x01]);
|
||||
} else if (value[0] === 0x05) {
|
||||
// set target power aka ERG mode
|
||||
this.mode = Mode.ERG;
|
||||
const power = view.getInt16(1, true);
|
||||
this.notify([0x80, 0x05, 0x01]);
|
||||
} else if (value[0] === 0x07) {
|
||||
// start/resume
|
||||
this.notify([0x80, 0x07, 0x01]);
|
||||
} else if (value[0] === 0x11) {
|
||||
this.mode = Mode.SIM;
|
||||
// set simulations param (wind, grade, etc)
|
||||
const wind = view.getInt16(1, true);
|
||||
const grade = view.getInt16(3, true);
|
||||
@@ -72,13 +84,12 @@ class FTMSControlPoint extends BaseCharacteritic {
|
||||
this.crr = crr * 0.001;
|
||||
this.cw = cw * 0.01;
|
||||
|
||||
console.log(wind * 0.001);
|
||||
console.log(grade * 0.01);
|
||||
console.log(crr * 0.0001);
|
||||
console.log(cw * 0.01);
|
||||
|
||||
console.log(
|
||||
`wind=${this.wind} - grade=${this.grade} - crr=${this.crr} - cw=${this.cw}`
|
||||
);
|
||||
this.notify([0x80, 0x11, 0x01]);
|
||||
} else {
|
||||
this.notify([0x80, value[0], 0x02]);
|
||||
console.log("FTMS Control point op code " + value[0] + "not supported");
|
||||
}
|
||||
}
|
||||
@@ -107,7 +118,7 @@ class IndoorBikeData extends BaseCharacteritic {
|
||||
this.Notifying = true;
|
||||
|
||||
this.interval = setInterval(() => {
|
||||
console.log("FTMS Notif Indoor Bike");
|
||||
//console.log("FTMS Notif Indoor Bike");
|
||||
// 0x44 0x02 = fields included: cadence (2), power (6), hr (9)
|
||||
// 0x00 0x00 = average speed, always included
|
||||
// cadence is *2 (resolution 0.5 s^-1)
|
||||
|
||||
+11
-4
@@ -41,17 +41,22 @@ async function main() {
|
||||
await gattmgr.RegisterApplication("/eu/atoy", {});
|
||||
console.log("BLE GATT application registered");
|
||||
|
||||
return;
|
||||
|
||||
const bz = new Bluez();
|
||||
const pafers = await bz.getDevice("PAFERS_53B9A3");
|
||||
|
||||
console.log("Searching PAFERS device...");
|
||||
const pafers = await bz.getDeviceByServiceUUID(
|
||||
"72d70001-501f-46f7-95f9-23846ee1aba3"
|
||||
);
|
||||
|
||||
if (!pafers) {
|
||||
console.log("Device not found");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const name = await pafers.getValue("Name");
|
||||
const iscon = await pafers.isConnected();
|
||||
console.log("connected: " + iscon);
|
||||
|
||||
console.log("Found " + name + " (connected=" + iscon + ")");
|
||||
|
||||
/*bz.on("interfacesAdded", () => {
|
||||
|
||||
@@ -61,6 +66,8 @@ async function main() {
|
||||
await pafers.connect();
|
||||
}
|
||||
|
||||
const char1 = await pafers.getCharacteristic("72d70003-501f-46f7-95f9-23846ee1aba3");
|
||||
|
||||
return;
|
||||
|
||||
const root = await bus.getProxyObject("org.bluez", "/");
|
||||
|
||||
Reference in New Issue
Block a user