@iotize/tap
Version:
IoTize Device client for Javascript
297 lines • 19.6 kB
JavaScript
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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