st-ethernet-ip
Version:
A simple node interface for Ethernet/IP.
100 lines (89 loc) • 2.58 kB
text/typescript
type outputMapItem = {
size: number,
byte: number,
offset: number,
name: string,
value: any
}
class OutputMap {
mapping: outputMapItem[];
/**
* Helper to encode input buffer from process value
*/
constructor() {
this.mapping = [];
}
/**
* Add a bit value to encode
*
* @param byte - Which byte to start at
* @param offset - Number of bits to offset
* @param name - Unique name to reference value
* @param value - Initial value
*/
addBit(byte: number, offset: number, name: string, value: boolean = false): void {
this.mapping.push({
size: 1,
byte: byte,
offset: offset,
name: name,
value: value
});
}
/**
* Add a 16 bit integer value to encode
*
* @param byte - Number off bytes to offset
* @param name - Unique name to reference value
* @param value - Initial value
*/
addInt(byte: number, name: string, value: number = 0): void {
this.mapping.push({
size: 16,
byte: byte,
offset: null,
name: name,
value: value
});
}
/**
* Reads encodes each map process value and writes to buffer
*
* @param data - Device output buffer
* @returns Device output buffer encoded with values
*/
_writeMap(data: Buffer): Buffer {
this.mapping.forEach(map => {
switch (map.size) {
case 1:
(map.value) ? data[map.byte] |= (1 << map.offset) : data[map.byte] &= ~(1 << map.offset);
break;
case 16:
data.writeUInt16LE(map.value, map.byte);
break;
}
});
return data;
}
/**
* Set a process value for a output buffer
*
* @param name - Name of map item
* @param data - Device input buffer
* @param value - New value to send to device
* @returns Output buffer to send to device
*/
setValue(name: string, value: any, data: Buffer): Buffer {
this.mapping[this.mapping.findIndex(map => map.name === name)].value = value;
return this._writeMap(data);
}
/**
* Get array of names assigned to mappings
*
* @returns Array of names
*/
getNames(): string[] {
return this.mapping.map(item => item.name);
}
}
export default OutputMap;