UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

297 lines 19.6 kB
import { TapStreamReader, TapStreamWriter } from '@iotize/tap/client/impl'; import { ASCIIControl } from './ascii-control'; import { DBIOT_BYTE_ORDER_CONVERTER } from './dbiot-compressor/dbiot-byte-order-converter'; import { DBIOT_BOOLEAN_CONVERTER, DBIOT_FLOAT32_CONVERTER, DBIOT_FLOAT64_CONVERTER, DBIOT_UINT_CONVERTER, DBIOT_UTF8_CONVERTER, } from './json-compressor/tlv-json-base-type-compressor'; import { TLVMappedJsonArrayOfObjectCompressor, TLVMappedJsonObjectCompressor, } from './json-compressor/tlv-mapped-json-compressor'; var ButtonSizeEnum; (function (ButtonSizeEnum) { ButtonSizeEnum[ButtonSizeEnum["DEFAULT"] = 0] = "DEFAULT"; ButtonSizeEnum[ButtonSizeEnum["SMALL"] = 1] = "SMALL"; ButtonSizeEnum[ButtonSizeEnum["LARGE"] = 2] = "LARGE"; })(ButtonSizeEnum || (ButtonSizeEnum = {})); const DBIOT_INNER_CONVERTER = new TLVMappedJsonObjectCompressor({ encoding: { code: 'E', converter: new TLVMappedJsonObjectCompressor({ scaling: { code: 'x', converter: DBIOT_FLOAT32_CONVERTER, }, bitLength: { code: 'b', converter: DBIOT_UINT_CONVERTER, }, offset: { code: 'o', converter: DBIOT_FLOAT32_CONVERTER, }, }), }, tap: { code: 'T', converter: new TLVMappedJsonObjectCompressor({ address: { code: 'a', converter: DBIOT_UINT_CONVERTER, }, valueAcquisitionPeriod: { code: 's', converter: DBIOT_UINT_CONVERTER, }, }), }, dashboard: { code: 'D', converter: new TLVMappedJsonObjectCompressor({ offset: { code: 'O', converter: DBIOT_FLOAT64_CONVERTER, }, scaling: { code: 'X', converter: DBIOT_FLOAT64_CONVERTER, }, readable: { code: 'R', converter: DBIOT_BOOLEAN_CONVERTER, }, writable: { code: 'W', converter: DBIOT_BOOLEAN_CONVERTER, }, format: { code: 'F', converter: DBIOT_UTF8_CONVERTER, }, name: { code: 'N', converter: DBIOT_UTF8_CONVERTER, }, unit: { code: 'U', converter: DBIOT_UTF8_CONVERTER, }, byteOrder: { code: 'B', converter: DBIOT_BYTE_ORDER_CONVERTER, }, component: { code: 'C', converter: new TLVMappedJsonObjectCompressor({ 'tap-variable-number': { code: 't', converter: new TLVMappedJsonObjectCompressor({}), }, 'tap-variable-range': { code: 'r', converter: new TLVMappedJsonObjectCompressor({ min: { code: 'm', converter: DBIOT_FLOAT64_CONVERTER, }, max: { code: 'M', converter: DBIOT_FLOAT64_CONVERTER, }, step: { code: 's', converter: DBIOT_FLOAT64_CONVERTER, }, writeValueForEveryChange: { code: 'w', converter: DBIOT_BOOLEAN_CONVERTER, }, }), }, 'tap-variable-linear-gauge': { code: 'G', converter: new TLVMappedJsonObjectCompressor({ min: { code: 'm', converter: DBIOT_FLOAT64_CONVERTER, }, max: { code: 'M', converter: DBIOT_FLOAT64_CONVERTER, }, }), }, 'tap-variable-gauge': { code: 'g', converter: new TLVMappedJsonObjectCompressor({ min: { code: 'm', converter: DBIOT_FLOAT64_CONVERTER, }, max: { code: 'M', converter: DBIOT_FLOAT64_CONVERTER, }, }), }, 'tap-variable-line-chart': { code: 'l', converter: new TLVMappedJsonObjectCompressor({}), }, 'tap-variable-bar-chart': { code: 'B', converter: new TLVMappedJsonObjectCompressor({}), }, 'tap-variable-table': { code: 'T', converter: new TLVMappedJsonObjectCompressor({}), }, 'tap-variable-bits-editor': { code: 'b', converter: new TLVMappedJsonObjectCompressor({ bitsTemplate: { code: 'T', converter: new TLVMappedJsonArrayOfObjectCompressor({ fields: [ { fieldName: 'index', converter: DBIOT_UINT_CONVERTER, }, { fieldName: 'label', converter: DBIOT_UTF8_CONVERTER, }, ], }), }, }), }, 'tap-variable-buttons': { code: 'U', converter: new TLVMappedJsonObjectCompressor({ buttons: { code: 'b', converter: new TLVMappedJsonArrayOfObjectCompressor({ fields: [ { fieldName: 'value', converter: DBIOT_FLOAT64_CONVERTER, }, { fieldName: 'label', converter: DBIOT_UTF8_CONVERTER, }, ], }), }, }), }, 'tap-variable-push-button': { code: 'P', converter: new TLVMappedJsonObjectCompressor({ mouseDownValue: { code: 'd', converter: DBIOT_FLOAT64_CONVERTER, }, mouseUpValue: { code: 'U', converter: DBIOT_FLOAT64_CONVERTER, }, value: { code: 'u', converter: DBIOT_FLOAT64_CONVERTER, }, buttonText: { code: 'l', converter: DBIOT_UTF8_CONVERTER, }, // size: { // code: 's', // converter: new TLVMappedEnumConverter(ButtonSizeEnum), // }, icon: { code: 'i', converter: DBIOT_UTF8_CONVERTER, }, }), }, 'tap-variable-select': { code: 'S', converter: new TLVMappedJsonObjectCompressor({ options: { code: 'o', converter: new TLVMappedJsonArrayOfObjectCompressor({ fields: [ { fieldName: 'value', converter: DBIOT_FLOAT64_CONVERTER, }, { fieldName: 'text', converter: DBIOT_UTF8_CONVERTER, }, ], }), }, }), }, }), }, }), }, cloud: { code: 'C', converter: new TLVMappedJsonObjectCompressor({ name: { code: 'N', converter: DBIOT_UTF8_CONVERTER, }, optional: { code: 'p', converter: DBIOT_UINT_CONVERTER, }, uploadPeriod: { code: 't', converter: DBIOT_UINT_CONVERTER, }, valueDelta: { code: 'd', converter: DBIOT_FLOAT32_CONVERTER, }, alarmMinValue: { code: 'l', converter: DBIOT_FLOAT32_CONVERTER, }, alarmMaxValue: { code: 'h', converter: DBIOT_FLOAT32_CONVERTER, }, }), }, }); export class DBIOTVarConfigConverter { encode(mainConfig) { if (!mainConfig) { return new Uint8Array(); } const writter = new TapStreamWriter(); writter.writeU1(ASCIIControl.DEVICE_CONTROL_1); DBIOT_INNER_CONVERTER.encode(mainConfig, writter); return writter.toBytes; } decode(streamOrBuffer) { const stream = TapStreamReader.create(streamOrBuffer); if (stream.byteLeft === 0) { return undefined; } let char; if (!stream.isEof() && char !== ASCIIControl.DEVICE_CONTROL_1) { char = stream.readU1(); } if (char === ASCIIControl.DEVICE_CONTROL_1) { try { return DBIOT_INNER_CONVERTER.decode(stream); } catch (err) { console.warn(`Failed to restore variable configuration`, err); } } return undefined; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJpb3QtdmFyLWNvbmZpZy1jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9leHRyYS9kYmlvdC9zcmMvbGliL2RiaW90LXZhci1jb25maWctY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRTNGLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3JCLE1BQU0saURBQWlELENBQUM7QUFDekQsT0FBTyxFQUNMLG9DQUFvQyxFQUNwQyw2QkFBNkIsR0FDOUIsTUFBTSw4Q0FBOEMsQ0FBQztBQUV0RCxJQUFLLGNBSUo7QUFKRCxXQUFLLGNBQWM7SUFDakIseURBQU8sQ0FBQTtJQUNQLHFEQUFLLENBQUE7SUFDTCxxREFBSyxDQUFBO0FBQ1AsQ0FBQyxFQUpJLGNBQWMsS0FBZCxjQUFjLFFBSWxCO0FBRUQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLDZCQUE2QixDQUFDO0lBQzlELFFBQVEsRUFBRTtRQUNSLElBQUksRUFBRSxHQUFHO1FBQ1QsU0FBUyxFQUFFLElBQUksNkJBQTZCLENBQUM7WUFDM0MsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxHQUFHO2dCQUNULFNBQVMsRUFBRSx1QkFBdUI7YUFDbkM7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsU0FBUyxFQUFFLG9CQUFvQjthQUNoQztZQUNELE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsR0FBRztnQkFDVCxTQUFTLEVBQUUsdUJBQXVCO2FBQ25DO1NBQ0YsQ0FB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