UNPKG

rxpoweredup

Version:

A Typescript RxJS-based library for controlling LEGO Powered UP hubs & peripherals.

118 lines (117 loc) 4.77 kB
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 };