jsmodebus
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
'use strict';
|
||||
|
||||
const Stampit = require('stampit');
|
||||
const Put = require('put');
|
||||
const EventBus = require('stampit-event-bus');
|
||||
|
||||
const core = Stampit()
|
||||
.compose(EventBus)
|
||||
.init(function () {
|
||||
this.log = this.options && this.options.log;
|
||||
|
||||
if (!this.log) {
|
||||
this.log = {
|
||||
log: () => console.log.apply(console, arguments),
|
||||
error: () => console.error.apply(console, arguments),
|
||||
warn: () => console.warn.apply(console, arguments),
|
||||
debug: () => console.log.apply(console, arguments)
|
||||
};
|
||||
}
|
||||
let data = {
|
||||
coils: null,
|
||||
holding: null,
|
||||
input: null,
|
||||
discrete: null,
|
||||
};
|
||||
|
||||
let handler = {};
|
||||
|
||||
let init = () => {
|
||||
if (!this.coils) {
|
||||
data.coils = new Buffer(1024);
|
||||
} else {
|
||||
data.coils = this.coils;
|
||||
}
|
||||
|
||||
if (!this.holding) {
|
||||
data.holding = new Buffer(1024);
|
||||
} else {
|
||||
data.holding = this.holding;
|
||||
}
|
||||
|
||||
if (!this.input) {
|
||||
data.input = new Buffer(1024);
|
||||
} else {
|
||||
data.input = this.input;
|
||||
}
|
||||
if (!this.discrete) {
|
||||
data.discrete = new Buffer(1024);
|
||||
} else {
|
||||
data.discrete = this.discrete;
|
||||
}
|
||||
};
|
||||
|
||||
this.onData = (pdu, callback) => {
|
||||
// get fc and byteCount in advance
|
||||
const fc = pdu.readUInt8(0);
|
||||
// const byteCount = pdu.readUInt8(1);
|
||||
|
||||
// get the pdu handler
|
||||
const reqHandler = handler[fc];
|
||||
|
||||
if (!reqHandler) {
|
||||
// write a error/exception pkt to the
|
||||
// socket with error code fc + 0x80 and
|
||||
// exception code 0x01 (Illegal Function)
|
||||
|
||||
this.log.debug('no handler for fc', fc);
|
||||
|
||||
callback(Put().word8(fc + 0x80).word8(0x01).buffer());
|
||||
} else {
|
||||
reqHandler(pdu, response => {
|
||||
callback(response);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
this.setRequestHandler = (fc, callback) => {
|
||||
this.log.debug('setting request handler', fc);
|
||||
handler[fc] = callback;
|
||||
return this;
|
||||
};
|
||||
|
||||
this.getCoils = () => data.coils;
|
||||
this.getInput = () => data.input;
|
||||
this.getHolding = () => data.holding;
|
||||
this.getDiscrete = () => data.discrete;
|
||||
|
||||
init();
|
||||
});
|
||||
|
||||
module.exports = core;
|
||||
Reference in New Issue
Block a user