Compare commits
2 Commits
master
...
Uint8Array
Author | SHA1 | Date | |
---|---|---|---|
![]() |
83143ca8c2 | ||
![]() |
098633af13 |
@ -19,4 +19,7 @@ export namespace MeterbusLibExceptions {
|
||||
|
||||
export class PayloadTooShortError extends InvalidTelegramError {
|
||||
}
|
||||
|
||||
export class IllegalNumberError extends InvalidTelegramError {
|
||||
}
|
||||
}
|
@ -8,7 +8,7 @@ export namespace MeterbusLibLongFrame {
|
||||
private _fixedDataHeader : FixedDataHeader
|
||||
get fixedDataHeader() : FixedDataHeader { return this._fixedDataHeader }
|
||||
|
||||
constructor(telegram : number[]) {
|
||||
constructor(telegram : Uint8Array) {
|
||||
super(telegram)
|
||||
}
|
||||
|
||||
@ -17,10 +17,14 @@ export namespace MeterbusLibLongFrame {
|
||||
this._fixedDataHeader = new FixedDataHeader(this._telegram.slice(7, 19))
|
||||
this._fixedDataHeader.parse()
|
||||
}
|
||||
|
||||
getJSON() : string {
|
||||
return JSON.stringify(this)
|
||||
}
|
||||
}
|
||||
|
||||
export class FixedDataHeader {
|
||||
private _data : number[]
|
||||
private _data : Uint8Array
|
||||
|
||||
private _identNo : number
|
||||
private _manufacturer : string
|
||||
@ -28,7 +32,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 +40,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
|
||||
}
|
||||
|
||||
|
@ -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,10 @@ 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]))
|
||||
})
|
||||
it('should print itself as json', () => {
|
||||
console.log((telegram.frame as MeterbusLibLongFrame.LongFrame).getJSON())
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -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<number>((val) => {
|
||||
return parseInt(val, 16)
|
||||
})
|
||||
this._telegram = new Uint8Array(this._hexString.split(' ').map<number>((val) => {
|
||||
let n = parseInt(val, 16)
|
||||
if ((n < 0) || (n > 255)) {
|
||||
throw new MeterbusLibExceptions.IllegalNumberError()
|
||||
}
|
||||
return n
|
||||
}))
|
||||
}
|
||||
|
||||
parse() {
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -8,21 +8,21 @@ const expect = chai.expect
|
||||
|
||||
describe('The Meterbus Library Utils', () => {
|
||||
it('should convert a bcd to a number (10203)', () => {
|
||||
expect(MeterbusLibUtils.bcd([1, 2, 3])).to.equal(10203)
|
||||
expect(MeterbusLibUtils.bcd(new Uint8Array([1, 2, 3]))).to.equal(10203)
|
||||
})
|
||||
it('should convert a bcd to a number (0010203)', () => {
|
||||
expect(MeterbusLibUtils.bcd([0, 1, 2, 3])).to.equal(10203)
|
||||
expect(MeterbusLibUtils.bcd(new Uint8Array([0, 1, 2, 3]))).to.equal(10203)
|
||||
})
|
||||
it('should convert a bcd to a number (0)', () => {
|
||||
expect(MeterbusLibUtils.bcd([0, 0, 0])).to.equal(0)
|
||||
expect(MeterbusLibUtils.bcd(new Uint8Array([0, 0, 0]))).to.equal(0)
|
||||
})
|
||||
it('should convert a bcd to a number (0)', () => {
|
||||
expect(MeterbusLibUtils.bcd([0, 0, 0, 0])).to.equal(0)
|
||||
expect(MeterbusLibUtils.bcd(new Uint8Array([0, 0, 0, 0]))).to.equal(0)
|
||||
})
|
||||
it('should convert a bcd to a number (99999999)', () => {
|
||||
expect(MeterbusLibUtils.bcd([0x99, 0x99, 0x99, 0x99])).to.equal(99999999)
|
||||
expect(MeterbusLibUtils.bcd(new Uint8Array([0x99, 0x99, 0x99, 0x99]))).to.equal(99999999)
|
||||
})
|
||||
it('should convert two number to manufacturer code', () => {
|
||||
expect(MeterbusLibUtils.manufCode([0x2e, 0x19])).to.equal("FIN")
|
||||
expect(MeterbusLibUtils.manufCode(new Uint8Array([0x2e, 0x19]))).to.equal("FIN")
|
||||
})
|
||||
})
|
||||
|
@ -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))
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user