rxpoweredup
Version:
A Typescript RxJS-based library for controlling LEGO Powered UP hubs & peripherals.
118 lines (117 loc) • 4.77 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { injectable } from 'tsyringe';
import { HUB_DEVICE_TYPE_MAP, HubProperty, HubType, MessageType } from '../../constants';
import { convertUint8ToSignedInt } from '../../helpers';
let HubPropertiesReplyParser = class HubPropertiesReplyParser {
messageType = MessageType.properties;
hubPropertyLength = 1;
operationLength = 1;
hubPropertyValueParser = {
[HubProperty.batteryVoltage]: (v) => this.parseBatteryData(v),
[HubProperty.RSSI]: (v) => this.parseRssiLevel(v),
[HubProperty.systemTypeId]: (v) => this.parseSystemTypeId(v),
[HubProperty.button]: (v) => this.parseButtonState(v),
[HubProperty.primaryMacAddress]: (v) => this.parsePrimaryMacAddress(v),
[HubProperty.advertisingName]: (v) => this.parseAdvertisingName(v),
[HubProperty.manufacturerName]: (v) => this.parseManufacturerName(v),
[HubProperty.firmwareVersion]: (v) => this.parseFirmwareVersion(v),
[HubProperty.hardwareVersion]: (v) => this.parseHardwareVersion(v),
};
parseMessage(message) {
const propertyType = message.payload[0];
const payload = message.payload.slice(this.hubPropertyLength + this.operationLength);
return this.hubPropertyValueParser[propertyType](payload);
}
parseBatteryData(payload) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.batteryVoltage,
level: payload[0],
};
}
parseRssiLevel(payload) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.RSSI,
level: convertUint8ToSignedInt(payload[0]),
};
}
parseSystemTypeId(payload) {
const systemTypeId = payload[0];
if (!(systemTypeId in HUB_DEVICE_TYPE_MAP)) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.systemTypeId,
hubType: HubType.Unknown,
};
}
return {
messageType: MessageType.properties,
propertyType: HubProperty.systemTypeId,
hubType: HUB_DEVICE_TYPE_MAP[payload[0]],
};
}
parseManufacturerName(payload) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.manufacturerName,
manufacturerName: [...payload].map((v) => String.fromCharCode(v)).join(''),
};
}
parseButtonState(payload) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.button,
isPressed: payload[0] === 1,
};
}
parsePrimaryMacAddress(payload) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.primaryMacAddress,
macAddress: [...payload].map((v) => v.toString(16).padStart(2, '0')).join(':'),
};
}
parseAdvertisingName(payload) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.advertisingName,
advertisingName: [...payload].map((v) => String.fromCharCode(v)).join(''),
};
}
parseFirmwareVersion(payload) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.firmwareVersion,
firmwareVersion: this.decodeVersion(payload),
};
}
parseHardwareVersion(payload) {
return {
messageType: MessageType.properties,
propertyType: HubProperty.hardwareVersion,
hardwareVersion: this.decodeVersion(payload),
};
}
decodeVersion(payload) {
const major = (payload[3] & 0b01110000) >>> 4;
const minor = payload[3] & 0b00001111;
const bugfix = payload[2];
const build = payload[0] + (payload[1] << 8);
return {
major: major.toString(16),
minor: minor.toString(16),
bugfix: bugfix.toString(16),
build: build.toString(16),
};
}
};
HubPropertiesReplyParser = __decorate([
injectable()
], HubPropertiesReplyParser);
export { HubPropertiesReplyParser };