Skip to content

Commit

Permalink
draft
Browse files Browse the repository at this point in the history
  • Loading branch information
lsongdev committed Sep 9, 2018
1 parent 91129a5 commit 611d74c
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 35 deletions.
25 changes: 23 additions & 2 deletions HCHO.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,34 @@
const assert = require('assert');
const SerialPort = require('serialport');
const createReader = require('./reader');

function parse(buffer){
const data = {
HEAD : buffer.readUInt16BE(0),
LENGTH : buffer.readUIntBE(2),
TYPE : buffer.readUIntBE(3),
UNIT : buffer.readUIntBE(4),
VH : buffer.readUIntBE(5),
VALUE : buffer.readUInt16BE(6),
CHECKSUM: buffer.readUInt16BE(8),
};
var checksum = 0;
for(var i=0;i<buffer.length - 2;i++){
checksum += buffer[i];
}
assert.equal(data.HEAD, 0x424d, 'Invalid data header');
assert.equal(checksum, data.CHECKSUM, 'Checksum error');
return data;
}

class HCHO extends SerialPort {
constructor(dev){
super(dev);
const reader = createReader({
LEN_LENGTH: 1
}, message => {
console.log(message);
}, data => {
const message = parse(data);
this.emit('message', message);
});
this.on('data', reader);
}
Expand Down
19 changes: 8 additions & 11 deletions PMS5003.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
const fs = require('fs');
const assert = require('assert');
const EventEmitter = require('events');
const SerialPort = require('serialport');
const createReader = require('./reader');

/**
* parse sensor data
*/
function parse(buffer){
var data = {
Head : buffer.readUInt16BE(00),
Length : buffer.readUInt16BE(02),
const data = {
HEAD : buffer.readUInt16BE(00),
LENGTH : buffer.readUInt16BE(02),
PM1_0 : buffer.readUInt16BE(04),
PM2_5 : buffer.readUInt16BE(06),
PM10 : buffer.readUInt16BE(08),
Expand All @@ -30,22 +29,20 @@ function parse(buffer){
for(var i=0;i<buffer.length - 2;i++){
checksum += buffer[i];
}
assert.equal(data.Head, 0x424d, 'Invalid data header');
assert.equal(data.HEAD, 0x424d, 'Invalid data header');
assert.equal(checksum, data.CHECKSUM, 'Checksum error');
return data;
}

/**
* DSensor
*/
class DSensor extends EventEmitter {
class DSensor extends SerialPort {
constructor(dev){
super();
if(typeof dev === 'undefined') dev = process.stdin;
if(typeof dev === 'string') dev = fs.createReadStream(dev);
super(dev);
const reader = createReader(data => {
const message = parse(data);
this.emit('data', message);
this.emit('message', message);
});
dev.on('data', reader);
return this;
Expand Down
42 changes: 20 additions & 22 deletions reader.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,37 @@

function createReader({
LEN_HEADER = 2,
LEN_LENGTH = 2,
LEN_CHECKSUM = 2
}, fn){
const STATE_HEADER_1 = 0x42;
const STATE_HEADER_2 = 0x4d;
const STATE_LENGTH = 2;
const STATE_DATA = 3;
var flag = STATE_HEADER_1, index, len, buffer = Buffer.alloc(0);
return function(chunk){
const STATE_HEADER_1 = 0x42;
const STATE_HEADER_2 = 0x4d;
const STATE_LENGTH = 2;
const STATE_DATA = 3;

const LEN_HEADER = 2;
const LEN_CHECKSUM = 2;

function createReader(fn){
let state = STATE_HEADER_1, buffer = Buffer.alloc(0), len;
return chunk => {
buffer = Buffer.concat([ buffer, chunk ]);
for(var i = 0; i < buffer.length; i++){
if(flag === STATE_HEADER_1 && buffer[i] === STATE_HEADER_1){
flag = STATE_HEADER_2;
for(const i = 0; i < buffer.length; i++){
if(state === STATE_HEADER_1 && buffer[i] === STATE_HEADER_1){
state = STATE_HEADER_2;
continue;
}
if(flag === STATE_HEADER_2 && buffer[i] === STATE_HEADER_2){
flag = STATE_LENGTH;
index = ++i;
if(state === STATE_HEADER_2 && buffer[i] === STATE_HEADER_2){
state = STATE_LENGTH;
continue;
}
if(flag === STATE_LENGTH && buffer.length - index >= LEN_LENGTH){
if(state === STATE_LENGTH){
len = buffer.readUInt16BE(index);
flag = STATE_DATA;
state = STATE_DATA;
continue;
}
if(flag === STATE_DATA && buffer.length - index >= len + LEN_CHECKSUM){
if(state === STATE_DATA){
fn(buffer.slice(index - LEN_HEADER, index + len + LEN_CHECKSUM));
buffer = buffer.slice(index + len + LEN_CHECKSUM);
flag = STATE_HEADER_1;
state = STATE_HEADER_1;
}
}
};
}


module.exports = createReader;

0 comments on commit 611d74c

Please sign in to comment.