From 098633af133d205859f856692ca289043ff5fb4a Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Thu, 10 Aug 2017 02:02:42 +0200 Subject: [PATCH] replace number[] by Uint8Array --- src/exceptions.ts | 3 +++ src/longframe.ts | 10 +++++----- src/meterbus.test.ts | 10 ++++++++-- src/meterbus.ts | 14 +++++++++----- src/simpleframes.ts | 10 +++++----- src/utils.ts | 4 ++-- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/exceptions.ts b/src/exceptions.ts index dee6bb8..b81010f 100644 --- a/src/exceptions.ts +++ b/src/exceptions.ts @@ -19,4 +19,7 @@ export namespace MeterbusLibExceptions { export class PayloadTooShortError extends InvalidTelegramError { } + + export class IllegalNumberError extends InvalidTelegramError { + } } \ No newline at end of file diff --git a/src/longframe.ts b/src/longframe.ts index 9079648..aa287a2 100644 --- a/src/longframe.ts +++ b/src/longframe.ts @@ -8,7 +8,7 @@ export namespace MeterbusLibLongFrame { private _fixedDataHeader : FixedDataHeader get fixedDataHeader() : FixedDataHeader { return this._fixedDataHeader } - constructor(telegram : number[]) { + constructor(telegram : Uint8Array) { super(telegram) } @@ -20,7 +20,7 @@ export namespace MeterbusLibLongFrame { } export class FixedDataHeader { - private _data : number[] + private _data : Uint8Array private _identNo : number private _manufacturer : string @@ -28,7 +28,7 @@ export namespace MeterbusLibLongFrame { private _medium : string private _accessNo : number private _status : number - private _signature : number[] + private _signature : Uint8Array get identNo() : number { return this._identNo } get manufacturer() : string { return this._manufacturer } @@ -36,9 +36,9 @@ export namespace MeterbusLibLongFrame { get medium() : string { return this._medium } get accessNo() : number { return this._accessNo } get status() : number { return this._status } - get signature() : number[] { return this._signature } + get signature() : Uint8Array { return this._signature } - constructor(data : number[]) { + constructor(data : Uint8Array) { this._data = data } diff --git a/src/meterbus.test.ts b/src/meterbus.test.ts index f947bcb..6e0092d 100644 --- a/src/meterbus.test.ts +++ b/src/meterbus.test.ts @@ -43,6 +43,8 @@ let inputNOKLongframe_too_short = "68 02 02 68 01 02 03 16" let inputNOk_wrong_startcode = "15 01 02 03 16" +let inputNOk_illegal_number = "10 01 260 03 16" + describe('The Meterbus Library', () => { @@ -54,7 +56,7 @@ describe('The Meterbus Library', () => { it('should parse the hexString into the telegram array', () => { const telegram = new MeterbusLib.Telegram() telegram.fromHexString("01 02 03") - expect(telegram.telegram).to.deep.equal([1, 2, 3]) + expect(telegram.telegram).to.deep.equal(new Uint8Array([1, 2, 3])) }) it('should detect a control frame', () => { const telegram = new MeterbusLib.Telegram() @@ -105,6 +107,10 @@ describe('The Meterbus Library', () => { telegram.fromHexString(inputNOKLongframe_too_short) expect(() => telegram.parse()).to.throw(MeterbusLibExceptions.PayloadTooShortError) }) + it('should detect an invalid number', () => { + const telegram = new MeterbusLib.Telegram() + expect(() => telegram.fromHexString(inputNOk_illegal_number)).to.throw(MeterbusLibExceptions.IllegalNumberError) + }) it('should parse cField from a short frame', () => { const telegram = new MeterbusLib.Telegram() telegram.fromHexString(inputOkShortframe) @@ -171,7 +177,7 @@ describe('The Meterbus Library', () => { }) it('should find the signature', () => { expect((telegram.frame as MeterbusLibLongFrame.LongFrame).fixedDataHeader.signature) - .to.deep.equal([0,0]) + .to.deep.equal(new Uint8Array([0,0])) }) }) diff --git a/src/meterbus.ts b/src/meterbus.ts index 825e62a..27dc5b4 100644 --- a/src/meterbus.ts +++ b/src/meterbus.ts @@ -7,7 +7,7 @@ export namespace MeterbusLib { export class Telegram { private _hexString : string - private _telegram : number[] + private _telegram : Uint8Array private _frame : MeterbusLibFrames.Frame constructor() { @@ -17,7 +17,7 @@ export namespace MeterbusLib { return this._hexString } - get telegram() : number[] { + get telegram() : Uint8Array { return this._telegram } @@ -27,9 +27,13 @@ export namespace MeterbusLib { fromHexString(hexString : string) { this._hexString = hexString - this._telegram = this._hexString.split(' ').map((val) => { - return parseInt(val, 16) - }) + this._telegram = new Uint8Array(this._hexString.split(' ').map((val) => { + let n = parseInt(val, 16) + if ((n < 0) || (n > 255)) { + throw new MeterbusLibExceptions.IllegalNumberError() + } + return n + })) } parse() { diff --git a/src/simpleframes.ts b/src/simpleframes.ts index 8fb99b1..8facabf 100644 --- a/src/simpleframes.ts +++ b/src/simpleframes.ts @@ -3,14 +3,14 @@ import {MeterbusLibExceptions} from './exceptions' export namespace MeterbusLibFrames { export abstract class Frame { - protected _telegram : number[] + protected _telegram : Uint8Array protected _startCharacter : number protected _frameLength : number protected _firstPayload : number protected _payloadLength : number constructor(startCharacter : number, frameLength : number, - firstPayload : number, telegram : number[]) { + firstPayload : number, telegram : Uint8Array) { this._startCharacter = startCharacter this._frameLength = frameLength this._firstPayload = firstPayload @@ -68,7 +68,7 @@ export namespace MeterbusLibFrames { return this._ciField } - constructor(telegram : number[]) { + constructor(telegram : Uint8Array) { super(0x68, (telegram[1] + 6), 4, telegram) } @@ -98,7 +98,7 @@ export namespace MeterbusLibFrames { return this._address } - constructor(telegram : number[]) { + constructor(telegram : Uint8Array) { super(0x10, 5, 1, telegram) } @@ -109,7 +109,7 @@ export namespace MeterbusLibFrames { } export class SingleCharFrame extends Frame { - constructor(telegram : number[]) { + constructor(telegram : Uint8Array) { super(0xe5, 1, 0, telegram) } diff --git a/src/utils.ts b/src/utils.ts index 3c69b4e..998d859 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,5 @@ export namespace MeterbusLibUtils { - export function bcd(data : number[]) : number { + export function bcd(data : Uint8Array) : number { let v : string = "" data.forEach((c : number) => { v += (c & 0xf0) >> 4 @@ -9,7 +9,7 @@ export namespace MeterbusLibUtils { return r } - export function manufCode(data : number[]) : string { + export function manufCode(data : Uint8Array) : string { let v : number = (data[1] << 8) + data[0] return String.fromCharCode((((v >> 10) & 0x1f) + 64), (((v >> 5) & 0x1f) + 64), ((v & 0x1f) + 64)) }