@adminide-stack/yantra-mobile 12.0.135 → 12.0.136-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {readingId}from'../readings.js';import {qnChecksumOk,u16be,qnPacket,le32}from'./frames.js';import {QN}from'./uuids.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {readingId}from'../readings.js';import {qnChecksumOk,u16be,qnPacket,le32,be16}from'./frames.js';import {QN}from'./uuids.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
3
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
4
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -36,35 +36,40 @@ function startQnScale(link, ctx) {
|
|
|
36
36
|
let resolution = 0;
|
|
37
37
|
let done = false;
|
|
38
38
|
let configSent = false;
|
|
39
|
+
let timeSent = false;
|
|
40
|
+
let userSent = false;
|
|
41
|
+
let isVa = false;
|
|
39
42
|
const weightKgOf = (raw) => {
|
|
40
43
|
const w = raw * (resolution === 1 ? 0.1 : 0.01);
|
|
41
44
|
return w > 300 ? w * 0.1 : w;
|
|
42
45
|
};
|
|
43
|
-
const emitFinal = (
|
|
46
|
+
const emitFinal = (fields) => {
|
|
44
47
|
const at = ctx.now();
|
|
45
48
|
const reading = __spreadValues({
|
|
46
49
|
kind: "body",
|
|
47
50
|
id: readingId(link.id, "body", at),
|
|
48
51
|
at,
|
|
49
52
|
deviceId: link.id,
|
|
50
|
-
deviceName: link.name
|
|
51
|
-
|
|
52
|
-
}, impedance ? {
|
|
53
|
-
impedanceOhm: impedance
|
|
54
|
-
} : {});
|
|
53
|
+
deviceName: link.name
|
|
54
|
+
}, fields);
|
|
55
55
|
ctx.onReading(reading);
|
|
56
56
|
};
|
|
57
|
-
const
|
|
58
|
-
var _a, _b;
|
|
57
|
+
const sendUnitConfig = () => {
|
|
59
58
|
const unitByte = 1;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
void send(qnPacket([19, 9, deviceByte, unitByte, 16, height, age, male])).catch(() => void 0);
|
|
59
|
+
void send(qnPacket([19, 9, deviceByte, unitByte, 16, 0, 0, 0])).catch(() => void 0);
|
|
60
|
+
};
|
|
61
|
+
const sendTime = () => {
|
|
64
62
|
void send(qnPacket([32, 8, deviceByte, ...le32(qnTime(ctx.now()))])).catch(() => void 0);
|
|
65
63
|
};
|
|
66
|
-
const
|
|
64
|
+
const sendVisitorUser = () => {
|
|
67
65
|
var _a, _b;
|
|
66
|
+
const male = ctx.person.sex === "male" ? 1 : 0;
|
|
67
|
+
const age = Math.round((_a = ctx.person.age) != null ? _a : 30);
|
|
68
|
+
const heightX10 = Math.round(((_b = ctx.person.heightCm) != null ? _b : 170) * 10);
|
|
69
|
+
void send(qnPacket([160, 13, 2, 254, 255, 238, male, age, ...be16(heightX10), 1, 0])).catch(() => void 0);
|
|
70
|
+
};
|
|
71
|
+
const unsub = link.monitor(service, notifyChar, (p) => {
|
|
72
|
+
var _a, _b, _c;
|
|
68
73
|
if (p.length === 1) {
|
|
69
74
|
(_a = ctx.onLive) == null ? void 0 : _a.call(ctx, {
|
|
70
75
|
battery: p[0]
|
|
@@ -78,21 +83,62 @@ function startQnScale(link, ctx) {
|
|
|
78
83
|
resolution = (p[10] & 1) === 0 ? 1 : 0;
|
|
79
84
|
if (!configSent) {
|
|
80
85
|
configSent = true;
|
|
81
|
-
|
|
86
|
+
sendUnitConfig();
|
|
87
|
+
setTimeout(() => {
|
|
88
|
+
if (!timeSent) {
|
|
89
|
+
timeSent = true;
|
|
90
|
+
sendTime();
|
|
91
|
+
}
|
|
92
|
+
}, 400);
|
|
82
93
|
}
|
|
83
94
|
return;
|
|
84
95
|
}
|
|
85
|
-
if (cmd ===
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
96
|
+
if (cmd === 20) {
|
|
97
|
+
if (!timeSent) {
|
|
98
|
+
timeSent = true;
|
|
99
|
+
sendTime();
|
|
100
|
+
}
|
|
101
|
+
isVa = true;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (cmd === 33) {
|
|
105
|
+
if (isVa && !userSent) {
|
|
106
|
+
userSent = true;
|
|
107
|
+
sendVisitorUser();
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (cmd === 16) {
|
|
112
|
+
if (isVa && p.length >= 14) {
|
|
113
|
+
const weightKg = weightKgOf(u16be(p, 5));
|
|
89
114
|
(_b = ctx.onLive) == null ? void 0 : _b.call(ctx, {
|
|
90
115
|
weightKg
|
|
91
116
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
117
|
+
if (p[4] === 2 && !done) {
|
|
118
|
+
done = true;
|
|
119
|
+
emitFinal({
|
|
120
|
+
weightKg,
|
|
121
|
+
impedanceOhm: u16be(p, 7) || void 0,
|
|
122
|
+
bodyFatPct: u16be(p, 11) / 10 || void 0
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (p.length >= 6) {
|
|
128
|
+
const weightKg = weightKgOf(u16be(p, 3));
|
|
129
|
+
const state = p[5];
|
|
130
|
+
if (state === 0 || state === 17 || state === 18) {
|
|
131
|
+
(_c = ctx.onLive) == null ? void 0 : _c.call(ctx, {
|
|
132
|
+
weightKg
|
|
133
|
+
});
|
|
134
|
+
} else if ((state === 1 || state === 2) && !done) {
|
|
135
|
+
done = true;
|
|
136
|
+
const impedance = p.length >= 8 ? u16be(p, 6) || void 0 : void 0;
|
|
137
|
+
emitFinal({
|
|
138
|
+
weightKg,
|
|
139
|
+
impedanceOhm: impedance
|
|
140
|
+
});
|
|
141
|
+
}
|
|
96
142
|
}
|
|
97
143
|
return;
|
|
98
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qnScale.js","sources":["../../../../src/features/devices/brands/qnScale.ts"],"sourcesContent":["/**\n * QN / Yolanda public scales (PROTOCOLS.md section 6). Packets are\n * `cmd len deviceByte ... sum`, notified on FFE1; writes go to FFE3/FFE4 (or\n * FFF2 when the scale exposes the FFF0 service).\n *\n * Yantra reads weight (reliable on the public protocol) and, when the scale\n * does not scramble it, the impedance. Body composition is left to Yantra's own\n * estimate: the scale's own figure needs QN's proprietary algorithm.\n */\nimport type { DriverContext, DriverHandle, GattLink } from '../drivers';\nimport { readingId, type BodyReading } from '../readings';\nimport { le32, qnChecksumOk, qnPacket, u16be } from './frames';\nimport { QN } from './uuids';\n\n/** Seconds from 2000-01-01 UTC, the epoch QN scales stamp with. */\nfunction qnTime(now: number): number {\n return Math.max(0, Math.floor((now - Date.UTC(2000, 0, 1)) / 1000));\n}\n\nexport function startQnScale(link: GattLink, ctx: DriverContext): DriverHandle {\n // A scale advertises FFE0 but may expose FFE0 or FFF0 in its GATT; prefer\n // whichever is actually present (confirmed: Renpho-Scale exposes FFF0/FFF1/FFF2).\n const useAlt = !link.has(QN.service) && link.has(QN.serviceAlt);\n const service = useAlt ? QN.serviceAlt : QN.service;\n const notifyChar = useAlt ? QN.notifyAlt : QN.notify;\n const writeChar = (cmd: number) => (useAlt ? QN.writeAlt : cmd === 0x20 || cmd === 0x22 ? QN.write20 : QN.write13);\n const withoutResponse = (char: string) => link.canWriteWithoutResponse?.(service, char) ?? false;\n\n const send = (packet: number[]) => {\n const char = writeChar(packet[0]);\n return link.write(service, char, packet, { withoutResponse: withoutResponse(char) });\n };\n\n let deviceByte = 0;\n let resolution = 0; // 0 = 0.01 kg, 1 = 0.1 kg\n let done = false;\n let configSent = false; // the scale repeats 0x12 until it gets the config reply\n\n const weightKgOf = (raw: number) => {\n const w = raw * (resolution === 1 ? 0.1 : 0.01);\n // The scale's own guard: a value over 300 is still in the finer unit.\n return w > 300 ? w * 0.1 : w;\n };\n\n const emitFinal = (weightKg: number, impedance: number | undefined) => {\n const at = ctx.now();\n const reading: BodyReading = {\n kind: 'body',\n id: readingId(link.id, 'body', at),\n at,\n deviceId: link.id,\n deviceName: link.name,\n weightKg,\n ...(impedance ? { impedanceOhm: impedance } : {}),\n };\n ctx.onReading(reading);\n };\n\n const sendConfig = () => {\n const unitByte = 0x01; // kg\n const height = Math.round(ctx.person.heightCm ?? 0);\n const age = Math.round(ctx.person.age ?? 0);\n const male = ctx.person.sex === 'male' ? 1 : 0;\n void send(qnPacket([0x13, 0x09, deviceByte, unitByte, 0x10, height, age, male])).catch(() => undefined);\n void send(qnPacket([0x20, 0x08, deviceByte, ...le32(qnTime(ctx.now()))])).catch(() => undefined);\n };\n\n const unsub = link.monitor(service, notifyChar, (p) => {\n if (p.length === 1) {\n ctx.onLive?.({ battery: p[0] });\n return;\n }\n if (!qnChecksumOk(p)) return;\n const cmd = p[0];\n if (cmd === 0x12 && p.length >= 11) {\n deviceByte = p[2];\n resolution = (p[10] & 1) === 0 ? 1 : 0; // flag bit0 set => 0.01 kg\n if (!configSent) {\n configSent = true;\n sendConfig();\n }\n return;\n }\n if (cmd === 0x10 && p.length >= 6) {\n const weightKg = weightKgOf(u16be(p, 3));\n const state = p[5];\n if (state === 0 || state === 0x11 || state === 0x12) {\n ctx.onLive?.({ weightKg });\n } else if ((state === 1 || state === 2) && !done) {\n done = true;\n // Impedance is reported raw only when the scale does not scramble it.\n const impedance = p.length >= 8 ? u16be(p, 6) || undefined : undefined;\n emitFinal(weightKg, impedance);\n }\n return;\n }\n });\n\n return { stop: unsub };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAS,OAAO,GAAqB,EAAA;AACnC,EAAA,OAAO,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,KAAO,CAAA,CAAA,GAAA,GAAM,IAAK,CAAA,GAAA,CAAI,GAAM,EAAA,CAAA,EAAG,CAAC,CAAA,IAAK,GAAI,CAAC,CAAA;AACpE;AACgB,SAAA,YAAA,CAAa,MAAgB,GAAkC,EAAA;AAG7E,EAAM,MAAA,MAAA,GAAS,CAAC,IAAA,CAAK,GAAI,CAAA,EAAA,CAAG,OAAO,CAAK,IAAA,IAAA,CAAK,GAAI,CAAA,EAAA,CAAG,UAAU,CAAA;AAC9D,EAAA,MAAM,OAAU,GAAA,MAAA,GAAS,EAAG,CAAA,UAAA,GAAa,EAAG,CAAA,OAAA;AAC5C,EAAA,MAAM,UAAa,GAAA,MAAA,GAAS,EAAG,CAAA,SAAA,GAAY,EAAG,CAAA,MAAA;AAC9C,EAAA,MAAM,SAAY,GAAA,CAAC,GAAgB,KAAA,MAAA,GAAS,EAAG,CAAA,QAAA,GAAW,GAAQ,KAAA,EAAA,IAAQ,GAAQ,KAAA,EAAA,GAAO,EAAG,CAAA,OAAA,GAAU,EAAG,CAAA,OAAA;AACzG,EAAM,MAAA,eAAA,GAAkB,CAAC,IAAc,KAAA;AAzBzC,IAAA,IAAA,EAAA,EAAA,EAAA;AAyB4C,IAAA,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,uBAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAA+B,OAAS,EAAA,IAAA,CAAA,KAAxC,IAAiD,GAAA,EAAA,GAAA,KAAA;AAAA,GAAA;AAC3F,EAAM,MAAA,IAAA,GAAO,CAAC,MAAqB,KAAA;AACjC,IAAA,MAAM,IAAO,GAAA,SAAA,CAAU,MAAO,CAAA,CAAC,CAAC,CAAA;AAChC,IAAA,OAAO,IAAK,CAAA,KAAA,CAAM,OAAS,EAAA,IAAA,EAAM,MAAQ,EAAA;AAAA,MACvC,eAAA,EAAiB,gBAAgB,IAAI;AAAA,KACtC,CAAA;AAAA,GACH;AACA,EAAA,IAAI,UAAa,GAAA,CAAA;AACjB,EAAA,IAAI,UAAa,GAAA,CAAA;AACjB,EAAA,IAAI,IAAO,GAAA,KAAA;AACX,EAAA,IAAI,UAAa,GAAA,KAAA;AAEjB,EAAM,MAAA,UAAA,GAAa,CAAC,GAAgB,KAAA;AAClC,IAAA,MAAM,CAAI,GAAA,GAAA,IAAO,UAAe,KAAA,CAAA,GAAI,GAAM,GAAA,IAAA,CAAA;AAE1C,IAAO,OAAA,CAAA,GAAI,GAAM,GAAA,CAAA,GAAI,GAAM,GAAA,CAAA;AAAA,GAC7B;AACA,EAAM,MAAA,SAAA,GAAY,CAAC,QAAA,EAAkB,SAAkC,KAAA;AACrE,IAAM,MAAA,EAAA,GAAK,IAAI,GAAI,EAAA;AACnB,IAAA,MAAM,OAAuB,GAAA,cAAA,CAAA;AAAA,MAC3B,IAAM,EAAA,MAAA;AAAA,MACN,EAAI,EAAA,SAAA,CAAU,IAAK,CAAA,EAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,MACjC,EAAA;AAAA,MACA,UAAU,IAAK,CAAA,EAAA;AAAA,MACf,YAAY,IAAK,CAAA,IAAA;AAAA,MACjB;AAAA,KAAA,EACI,SAAY,GAAA;AAAA,MACd,YAAc,EAAA;AAAA,QACZ,EAAC,CAAA;AAEP,IAAA,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,GACvB;AACA,EAAA,MAAM,aAAa,MAAM;AAzD3B,IAAA,IAAA,EAAA,EAAA,EAAA;AA0DI,IAAA,MAAM,QAAW,GAAA,CAAA;AACjB,IAAA,MAAM,SAAS,IAAK,CAAA,KAAA,CAAA,CAAM,SAAI,MAAO,CAAA,QAAA,KAAX,YAAuB,CAAC,CAAA;AAClD,IAAA,MAAM,MAAM,IAAK,CAAA,KAAA,CAAA,CAAM,SAAI,MAAO,CAAA,GAAA,KAAX,YAAkB,CAAC,CAAA;AAC1C,IAAA,MAAM,IAAO,GAAA,GAAA,CAAI,MAAO,CAAA,GAAA,KAAQ,SAAS,CAAI,GAAA,CAAA;AAC7C,IAAA,KAAK,KAAK,QAAS,CAAA,CAAC,EAAM,EAAA,CAAA,EAAM,YAAY,QAAU,EAAA,EAAA,EAAM,MAAQ,EAAA,GAAA,EAAK,IAAI,CAAC,CAAC,CAAE,CAAA,KAAA,CAAM,MAAM,MAAS,CAAA;AACtG,IAAA,KAAK,KAAK,QAAS,CAAA,CAAC,IAAM,CAAM,EAAA,UAAA,EAAY,GAAG,IAAK,CAAA,MAAA,CAAO,IAAI,GAAI,EAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,GACjG;AACA,EAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,EAAS,YAAY,CAAK,CAAA,KAAA;AAjEvD,IAAA,IAAA,EAAA,EAAA,EAAA;AAkEI,IAAI,IAAA,CAAA,CAAE,WAAW,CAAG,EAAA;AAClB,MAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,IAAa,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,GAAA,EAAA;AAAA,QACX,OAAA,EAAS,EAAE,CAAC;AAAA,OACd,CAAA;AACA,MAAA;AAAA;AAEF,IAAI,IAAA,CAAC,YAAa,CAAA,CAAC,CAAG,EAAA;AACtB,IAAM,MAAA,GAAA,GAAM,EAAE,CAAC,CAAA;AACf,IAAA,IAAI,GAAQ,KAAA,EAAA,IAAQ,CAAE,CAAA,MAAA,IAAU,EAAI,EAAA;AAClC,MAAA,UAAA,GAAa,EAAE,CAAC,CAAA;AAChB,MAAA,UAAA,GAAA,CAAc,CAAE,CAAA,EAAE,CAAI,GAAA,CAAA,MAAO,IAAI,CAAI,GAAA,CAAA;AACrC,MAAA,IAAI,CAAC,UAAY,EAAA;AACf,QAAa,UAAA,GAAA,IAAA;AACb,QAAW,UAAA,EAAA;AAAA;AAEb,MAAA;AAAA;AAEF,IAAA,IAAI,GAAQ,KAAA,EAAA,IAAQ,CAAE,CAAA,MAAA,IAAU,CAAG,EAAA;AACjC,MAAA,MAAM,QAAW,GAAA,UAAA,CAAW,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AACvC,MAAM,MAAA,KAAA,GAAQ,EAAE,CAAC,CAAA;AACjB,MAAA,IAAI,KAAU,KAAA,CAAA,IAAK,KAAU,KAAA,EAAA,IAAQ,UAAU,EAAM,EAAA;AACnD,QAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,IAAa,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,GAAA,EAAA;AAAA,UACX;AAAA,SACF,CAAA;AAAA,kBACU,KAAU,KAAA,CAAA,IAAK,KAAU,KAAA,CAAA,KAAM,CAAC,IAAM,EAAA;AAChD,QAAO,IAAA,GAAA,IAAA;AAEP,QAAM,MAAA,SAAA,GAAY,EAAE,MAAU,IAAA,CAAA,GAAI,MAAM,CAAG,EAAA,CAAC,KAAK,MAAY,GAAA,MAAA;AAC7D,QAAA,SAAA,CAAU,UAAU,SAAS,CAAA;AAAA;AAE/B,MAAA;AAAA;AACF,GACD,CAAA;AACD,EAAO,OAAA;AAAA,IACL,IAAM,EAAA;AAAA,GACR;AACF"}
|
|
1
|
+
{"version":3,"file":"qnScale.js","sources":["../../../../src/features/devices/brands/qnScale.ts"],"sourcesContent":["/**\n * QN / Yolanda public scales (PROTOCOLS.md section 6). Packets are\n * `cmd len deviceByte ... sum`, notified on FFE1; writes go to FFE3/FFE4 (or\n * FFF2 when the scale exposes the FFF0 service).\n *\n * Yantra reads weight (reliable on the public protocol) and, when the scale\n * does not scramble it, the impedance. Body composition is left to Yantra's own\n * estimate: the scale's own figure needs QN's proprietary algorithm.\n */\nimport type { DriverContext, DriverHandle, GattLink } from '../drivers';\nimport { readingId, type BodyReading } from '../readings';\nimport { be16, le32, qnChecksumOk, qnPacket, u16be } from './frames';\nimport { QN } from './uuids';\n\n/** Seconds from 2000-01-01 UTC, the epoch QN scales stamp with. */\nfunction qnTime(now: number): number {\n return Math.max(0, Math.floor((now - Date.UTC(2000, 0, 1)) / 1000));\n}\n\nexport function startQnScale(link: GattLink, ctx: DriverContext): DriverHandle {\n // A scale advertises FFE0 but may expose FFE0 or FFF0 in its GATT; prefer\n // whichever is actually present (confirmed: Renpho-Scale exposes FFF0/FFF1/FFF2).\n const useAlt = !link.has(QN.service) && link.has(QN.serviceAlt);\n const service = useAlt ? QN.serviceAlt : QN.service;\n const notifyChar = useAlt ? QN.notifyAlt : QN.notify;\n const writeChar = (cmd: number) => (useAlt ? QN.writeAlt : cmd === 0x20 || cmd === 0x22 ? QN.write20 : QN.write13);\n const withoutResponse = (char: string) => link.canWriteWithoutResponse?.(service, char) ?? false;\n\n const send = (packet: number[]) => {\n const char = writeChar(packet[0]);\n return link.write(service, char, packet, { withoutResponse: withoutResponse(char) });\n };\n\n let deviceByte = 0;\n let resolution = 0; // 0 = 0.01 kg, 1 = 0.1 kg\n let done = false;\n let configSent = false; // the scale repeats 0x12 until it gets the config reply\n let timeSent = false; // the time goes after the unit config is acked (0x14), not before\n let userSent = false; // the visitor user profile goes after the time is acked (0x21)\n // The \"Va\" scale variant lays its 0x10 weight packet out differently and\n // sends body fat. It is the only variant that acks the unit config with a\n // 0x14 packet, so that packet tells us which layout the 0x10 uses.\n let isVa = false;\n\n const weightKgOf = (raw: number) => {\n const w = raw * (resolution === 1 ? 0.1 : 0.01);\n // The scale's own guard: a value over 300 is still in the finer unit.\n return w > 300 ? w * 0.1 : w;\n };\n\n const emitFinal = (fields: Pick<BodyReading, 'weightKg' | 'impedanceOhm' | 'bodyFatPct'>) => {\n const at = ctx.now();\n const reading: BodyReading = {\n kind: 'body',\n id: readingId(link.id, 'body', at),\n at,\n deviceId: link.id,\n deviceName: link.name,\n ...fields,\n };\n ctx.onReading(reading);\n };\n\n const sendUnitConfig = () => {\n const unitByte = 0x01; // kg\n // Bytes 5-7 differ by variant (public: height/age/sex; Va: fat-control/\n // baby-carrying). Zeros are valid for both and the scale sends weight and\n // impedance either way; Yantra computes body composition from impedance.\n void send(qnPacket([0x13, 0x09, deviceByte, unitByte, 0x10, 0, 0, 0])).catch(() => undefined);\n };\n const sendTime = () => {\n void send(qnPacket([0x20, 0x08, deviceByte, ...le32(qnTime(ctx.now()))])).catch(() => undefined);\n };\n // After the time is acked, the Va scale wants a visitor user profile (cmd\n // 0xa0) before it transmits weight; method 1 = normal (non-athlete).\n const sendVisitorUser = () => {\n const male = ctx.person.sex === 'male' ? 1 : 0;\n const age = Math.round(ctx.person.age ?? 30);\n const heightX10 = Math.round((ctx.person.heightCm ?? 170) * 10);\n void send(\n qnPacket([0xa0, 0x0d, 0x02, 0xfe, 0xff, 0xee, male, age, ...be16(heightX10), 0x01, 0x00]),\n ).catch(() => undefined);\n };\n\n const unsub = link.monitor(service, notifyChar, (p) => {\n if (p.length === 1) {\n ctx.onLive?.({ battery: p[0] });\n return;\n }\n if (!qnChecksumOk(p)) return;\n const cmd = p[0];\n if (cmd === 0x12 && p.length >= 11) {\n deviceByte = p[2];\n resolution = (p[10] & 1) === 0 ? 1 : 0; // flag bit0 set => 0.01 kg\n if (!configSent) {\n configSent = true;\n // The scale wants the unit config first; the time only after it\n // acks (0x14 for the Va variant). A scale that never acks also\n // gets the time here as a fallback.\n sendUnitConfig();\n setTimeout(() => {\n if (!timeSent) {\n timeSent = true;\n sendTime();\n }\n }, 400);\n }\n return;\n }\n // The Va variant acks the unit config with 0x14; no other variant does.\n if (cmd === 0x14) {\n if (!timeSent) {\n timeSent = true;\n sendTime();\n }\n isVa = true;\n return;\n }\n // The scale acks the time with 0x21; now send the visitor user so it\n // has a user to measure for (the Va scale needs this before it weighs).\n if (cmd === 0x21) {\n if (isVa && !userSent) {\n userSent = true;\n sendVisitorUser();\n }\n return;\n }\n if (cmd === 0x10) {\n if (isVa && p.length >= 14) {\n // Va layout: [3] user slot, [4] state (2 = final), [5..6] weight,\n // [7..8] impedance, [11..12] body fat x10, [13] heart rate.\n const weightKg = weightKgOf(u16be(p, 5));\n ctx.onLive?.({ weightKg });\n if (p[4] === 2 && !done) {\n done = true;\n emitFinal({\n weightKg,\n impedanceOhm: u16be(p, 7) || undefined,\n bodyFatPct: u16be(p, 11) / 10 || undefined,\n });\n }\n return;\n }\n if (p.length >= 6) {\n // Public layout: [3..4] weight, [5] state, [6..7] impedance.\n const weightKg = weightKgOf(u16be(p, 3));\n const state = p[5];\n if (state === 0 || state === 0x11 || state === 0x12) {\n ctx.onLive?.({ weightKg });\n } else if ((state === 1 || state === 2) && !done) {\n done = true;\n const impedance = p.length >= 8 ? u16be(p, 6) || undefined : undefined;\n emitFinal({ weightKg, impedanceOhm: impedance });\n }\n }\n return;\n }\n });\n\n return { stop: unsub };\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.136-alpha.1",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"uuid": "^9.0.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"common": "12.0.
|
|
30
|
+
"common": "12.0.136-alpha.1",
|
|
31
31
|
"libphonenumber-js": "^1.13.3"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@messenger-box/platform-mobile": "*",
|
|
46
46
|
"@react-native-async-storage/async-storage": "*",
|
|
47
47
|
"@react-navigation/native": "*",
|
|
48
|
-
"common": "12.0.
|
|
48
|
+
"common": "12.0.136-alpha.0",
|
|
49
49
|
"expo-background-task": "*",
|
|
50
50
|
"expo-constants": "*",
|
|
51
51
|
"expo-secure-store": "*",
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"typescript": {
|
|
68
68
|
"definition": "lib/index.d.ts"
|
|
69
69
|
},
|
|
70
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "830affceaa1fdcc7ed2227ec75ce4133b1204667"
|
|
71
71
|
}
|