@hangtime/grip-connect
Version:
Griptonite Motherboard, Tindeq Progressor, PitchSix Force Board, WHC-06, Entralpi, Climbro, mySmartBoard: Bluetooth API Force-Sensing strength analysis for climbers
83 lines (77 loc) • 2.6 kB
text/typescript
import type { ForceMeasurement, ForceUnit } from "./interfaces/callback.interface.js"
/** 1 kgf = this many N (standard gravity) */
const KG_TO_N = 9.80665
/** 1 lbf = this many N */
const LBS_TO_N = 4.4482216152605
function toNewtons(value: number, from: ForceUnit): number {
switch (from) {
case "kg":
return value * KG_TO_N
case "lbs":
return value * LBS_TO_N
case "n":
return value
}
}
function fromNewtons(value: number, to: ForceUnit): number {
switch (to) {
case "kg":
return value / KG_TO_N
case "lbs":
return value / LBS_TO_N
case "n":
return value
}
}
/**
* Converts a force value between kg, lbs, and newtons.
* @param value - The numeric force value in the source unit.
* @param from - The unit of the input value.
* @param to - The unit for the output value.
* @returns The force value in the target unit.
*/
export function convertForce(value: number, from: ForceUnit, to: ForceUnit): number {
if (from === to) return value
return fromNewtons(toNewtons(value, from), to)
}
/**
* Converts all numeric force fields in a ForceMeasurement from one unit to another.
* Recurses one level into distribution.left / center / right.
* Used internally by the device model when building notify payloads.
*/
export function convertForceMeasurement(
measurement: ForceMeasurement,
from: ForceUnit,
to: ForceUnit,
): ForceMeasurement {
if (from === to) return measurement
const out: ForceMeasurement = {
unit: to,
timestamp: measurement.timestamp,
current: convertForce(measurement.current, from, to),
peak: convertForce(measurement.peak, from, to),
mean: convertForce(measurement.mean, from, to),
min: convertForce(measurement.min, from, to),
}
if (measurement.performance !== undefined) {
out.performance = { ...measurement.performance }
}
if (
measurement.distribution &&
(measurement.distribution.left !== undefined ||
measurement.distribution.center !== undefined ||
measurement.distribution.right !== undefined)
) {
out.distribution = {}
if (measurement.distribution.left !== undefined) {
out.distribution.left = convertForceMeasurement(measurement.distribution.left, from, to)
}
if (measurement.distribution.center !== undefined) {
out.distribution.center = convertForceMeasurement(measurement.distribution.center, from, to)
}
if (measurement.distribution.right !== undefined) {
out.distribution.right = convertForceMeasurement(measurement.distribution.right, from, to)
}
}
return out
}