Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
d9b54b7
* Change i2c version
nage-son Jun 1, 2015
978d553
* Remove dependency
nage-son Jun 1, 2015
8abcb73
* TSL2561 원복.
nage-son Jun 3, 2015
35b9697
* TSL2561 변경
nage-son Jun 3, 2015
dce80d1
* serialport 버전 변경
nage-son Jun 12, 2015
579a800
* 경로 조정.
nage-son Jun 26, 2015
d2368aa
* Add ignore file.
nage-son Jun 26, 2015
a795e2a
* [RP] DHT11 드라이버 추가.
nage-son Jul 13, 2015
a51893d
* 폴더 재정리
nage-son Jul 13, 2015
1311807
* DHT11 lib 추가.
nage-son Jul 13, 2015
c641651
* [RP] DHT11 실행파일 추가.
nage-son Jul 13, 2015
33cb095
* 실행 분기 처리.
nage-son Jul 14, 2015
1a19678
* Source cleanup.
nage-son Jul 15, 2015
ba08b5b
* 로그 수정.
nage-son Jul 15, 2015
451c4c5
* 실행권한 부여.
nage-son Jul 15, 2015
b0f04dd
* Bug fix.
nage-son Jul 15, 2015
b80f9e4
* Debug log 추가.
nage-son Jul 15, 2015
eab5b6c
* Debug mode.
nage-son Jul 15, 2015
a737cf0
* Bug fix.
nage-son Jul 15, 2015
f3cd45c
* Bug fix.
nage-son Jul 15, 2015
f18b867
* 실행 권한 적용.
nage-son Jul 15, 2015
bb01b20
* 변경사항 반영
nage-son Jul 15, 2015
615eeeb
* Debug log 추가.
nage-son Jul 20, 2015
84cd6ca
* Debug mode 추가.
nage-son Jul 20, 2015
8d6fe94
* Source cleanup.
nage-son Jul 20, 2015
d9aab84
* Release용 실행파일 추가.
nage-son Jul 20, 2015
78c3afc
Merge pull request #2 from nage-son/porting/raspberry
nage-son Jul 20, 2015
b88bf77
* 줄바꿈 문자열 제거
nage-son Jul 20, 2015
66fe46c
* Bug fix.
nage-son Jul 20, 2015
4d456d3
Merge pull request #3 from nage-son/porting/raspberry
nage-son Jul 20, 2015
11e9f36
Update release
nage-son Jul 20, 2015
52ad319
Merge pull request #4 from nage-son/porting/raspberry
nage-son Jul 20, 2015
bfc5971
* 인자값 검사 부분 변경
nage-son Jul 22, 2015
f249e5f
* 인자값 검사 부분 변경
nage-son Jul 22, 2015
1db891d
Merge pull request #5 from nage-son/porting/raspberry
nage-son Jul 22, 2015
280fd0a
Release version
nage-son Jul 22, 2015
9afd38c
* Raspberry Pi용으로 수정.
nage-son Jul 23, 2015
a17a52b
Merge pull request #6 from nage-son/porting/raspberry
nage-son Jul 23, 2015
7da293f
* Source cleanup.
nage-son Aug 28, 2015
c107477
Merge branch 'porting/raspberry' of https://github.com/nage-son/senso…
nage-son Aug 28, 2015
02a3eae
* Log 추가.
nage-son Sep 28, 2015
5a2fca4
* 데모 시연용 수정사항 반영.
nage-son Sep 29, 2015
917b5a1
Merge remote-tracking branch 'origin/master' into porting/raspberry
nage-son Sep 29, 2015
9124a2c
* i2c-bus 추가.
nage-son Oct 14, 2015
fa77362
* Intel Edison용 로직 추가.
nage-son Oct 14, 2015
9bfd078
* README 추가.
nage-son Dec 23, 2015
c1ed52c
* Source cleanup.
nage-son Dec 23, 2015
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ dump.rdb
client/.idea/*
.idea/*
tags
sftp-config.json
2 changes: 1 addition & 1 deletion lib/middleware/websocketServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ module.exports = function websocketServer(appServer, topic){
});

try {
logger.debug('[WebsocketServer] emitting data', data);
logger.debug('[WebsocketServer] emitting data[', topic || 'data', ']', data);
io.emit(topic || 'data', data);
} catch (e) {
logger.error('[WebsocketServer] error on emitting', e);
Expand Down
21 changes: 21 additions & 0 deletions lib/sensor/driver/dht/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# 보드에 따른 선택적 실행
**index.js** 내부에서는 Beaglebone Black과 Raspberry Pi의 **hostname**을 이용하여 분기 실행합니다.

```js
...
var executeTarget = __dirname + ((os.hostname().indexOf('raspberry') > -1)? '/bin/Raspberry_DHT11': '/bin/Beagle_GPIO_dht22');
var executeAddress = (os.hostname().indexOf('raspberry') > -1)? 'G:' + self.address: self.address;
inProgress = true;

childProcess.exec([
executeTarget,
'-s',
self.model,
'-g',
executeAddress || '27',
].join(' '), {
timeout: Dht.properties.recommendedInterval,
killSignal: 'SIGKILL'
}, function (err, data) {
...
```
Binary file added lib/sensor/driver/dht/bin/Raspberry_DHT11
Binary file not shown.
235 changes: 140 additions & 95 deletions lib/sensor/driver/dht/index.js
Original file line number Diff line number Diff line change
@@ -1,123 +1,168 @@
'use strict';
var Sensor = require('../index').Sensor,
util = require('util'),
childProcess = require('child_process');
util = require('util'),
childProcess = require('child_process'),
os = require('os');

var _cached = { retries: 0},
inProgress = false,
logger = Sensor.getLogger();
inProgress = false,
logger = Sensor.getLogger();

// options.model : dht11(default) or dht22
function Dht(sensorInfo, options) {
Sensor.call(this, sensorInfo, options);
if (sensorInfo.device.address) {
this.address = sensorInfo.device.address;
}
if (sensorInfo.model) {
this.model = sensorInfo.model;
} else {
this.model = (options && options.model === 'dht22') ? 'dht22' : 'dht11';
}
Sensor.call(this, sensorInfo, options);
if (sensorInfo.device.address) {
this.address = sensorInfo.device.address;
}
if (sensorInfo.model) {
this.model = sensorInfo.model;
} else {
this.model = (options && options.model === 'dht22') ? 'dht22' : 'dht11';
}
}

Dht.properties = {
supportedNetworks: ['gpio'],
dataTypes: ['humidity'],
onChange: false,
discoverable: false,
addressable: true,
recommendedInterval: 60000,
validCachedValueTimeout: 25000,
maxInstances: 1,
models: ['dht11', 'dht22'],
idTemplate: '{model}-{gatewayId}-{deviceAddress}', // id generation template
errorRange: '1',
validValueRange: [0, 100],
maxRetries: 4,
category: 'sensor'
supportedNetworks: ['gpio'],
dataTypes: ['humidity'],
onChange: false,
discoverable: false,
addressable: true,
recommendedInterval: 60000,
validCachedValueTimeout: 25000,
maxInstances: 1,
models: ['dht11', 'dht22'],
idTemplate: '{model}-{gatewayId}-{deviceAddress}', // id generation template
errorRange: '1',
validValueRange: [0, 100],
maxRetries: 4,
category: 'sensor'
};


util.inherits(Dht, Sensor);

Dht.prototype._get = function () {
var self = this;
setTimeout(self.__get(), 3000); // delay 1sec to avoid busy situation
var self = this;
setTimeout(self.__get(), 3000); // delay 1sec to avoid busy situation
};

Dht.prototype.__get = function () {
var self = this;

//if (_cached.time && _cached.time + Dht.properties.validCachedValueTimeout > Date.now()) {
// _cached.data.time = _cached.time;
// self.emit('data', _cached.data);
//}
if (inProgress) {
return;
}
inProgress = true;
childProcess.exec([
__dirname + '/bin/Beagle_GPIO_dht22',
'-s',
self.model,
'-g',
self.address || '27',
].join(' '), {
timeout: Dht.properties.recommendedInterval,
killSignal: 'SIGKILL'
}, function (err, data) {

var retry = false,
rtn;

inProgress = false;
if (err) {
rtn = {status: 'error', id : self.id, message: err.toString()};
_cached.retries = 0;
self.emit('data', rtn);
} else {
rtn = JSON.parse(data);
var self = this;

if (inProgress) {
return;
}

rtn.id = self.id;
if (rtn.status === 'ok') {
var now = Date.now();
if (!_cached.time) { // 1st time init
var executeTarget = __dirname + ((os.hostname().indexOf('raspberry') > -1)? '/bin/Raspberry_DHT11': '/bin/Beagle_GPIO_dht22');
var executeAddress = (os.hostname().indexOf('raspberry') > -1)? 'G:' + self.address: self.address;

logger.debug('hostname >>> ', os.hostname());
logger.debug('executeTarget >>> ', executeTarget);
logger.debug('execute address : ', executeAddress);

inProgress = true;

childProcess.exec([
executeTarget,
'-s',
self.model,
'-g',
executeAddress || '27',
].join(' '), {
timeout: Dht.properties.recommendedInterval,
killSignal: 'SIGKILL'
}, function (err, data) {

var retry = false,
rtn;

inProgress = false;
if (err) {
rtn = {status: 'error', id : self.id, message: err.toString()};
_cached.retries = 0;
self.emit('data', rtn);
} else {
rtn = JSON.parse(data);
}

rtn.id = self.id;
if (rtn.status === 'ok') {
var now = Date.now();
if (!_cached.time) { // 1st time init
_cached.retries = 0;
retry = true;
} else {
var cacheExpire = _cached.time + Dht.properties.validCachedValueTimeout * Dht.properties.maxRetries,
diff = Math.abs(rtn.result.humidity - _cached.data.result.humidity);

// retry if cached value is too old or outof accepted error range
if ((now > cacheExpire) || (diff > Dht.properties.errorRange)) {
retry = true;
}
}
_cached.time = now;
_cached.data = rtn;
} else { // rtn.satus === error
retry = true;
}

if (retry) {
logger.debug(self.model, 'retry _cached=', _cached, 'due to result=', rtn);
if (_cached.retries > Dht.properties.maxRetries) {
rtn = {status: 'error', id : self.id,
message: 'too many retries due to invalid sensing value value'};
} else {
_cached.retries++;
process.nextTick(function () {self.__get(); });
return;
}
}

_cached.retries = 0;
retry = true;
} else {
var cacheExpire = _cached.time + Dht.properties.validCachedValueTimeout * Dht.properties.maxRetries,
diff = Math.abs(rtn.result.humidity - _cached.data.result.humidity);

// retry if cached value is too old or outof accepted error range
if ((now > cacheExpire) || (diff > Dht.properties.errorRange)) {
retry = true;
if (rtn.result) { //keep only humidity, remove temperature
delete rtn.result.temperature;
}
}
_cached.time = now;
_cached.data = rtn;
} else { // rtn.satus === error
retry = true;
}
self.emit('data', rtn);
});
};

if (retry) {
logger.debug(self.model, 'retry _cached=', _cached, 'due to result=', rtn);
if (_cached.retries > Dht.properties.maxRetries) {
rtn = {status: 'error', id : self.id,
message: 'too many retries due to invalid sensing value value'};
} else {
_cached.retries++;
process.nextTick(function () {self.__get(); });
return;
}
}
Dht.prototype.__getValue = function (timeout, callback) {
var self = this;

_cached.retries = 0;
if (rtn.result) { //keep only humidity, remove temperature
delete rtn.result.temperature;
if (inProgress) {
return;
}
self.emit('data', rtn);
});
};

var executeTarget = __dirname + ((os.hostname().indexOf('raspberry') > -1)? '/bin/Raspberry_DHT11': '/bin/Beagle_GPIO_dht22');
var executeAddress = (os.hostname().indexOf('raspberry') > -1)? 'G:' + self.address: self.address;

inProgress = true;

childProcess.exec([
executeTarget,
'-s',
self.model,
'-g',
executeAddress || '27',
].join(' '), {
timeout: timeout || Dht.properties.recommendedInterval,
killSignal: 'SIGKILL'
}, function (err, data) {

var rtn;

if (err) {
rtn = {status: 'error', id : self.id, message: err.toString()};
} else {
rtn = JSON.parse(data);
}

rtn.id = self.id;

inProgress = false;

callback(err, rtn);
});
}

module.exports = Dht;
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ CFLAGS=-Wall -c -g
#LDFLAGS=-Wall -O3
LDFLAGS=-Wall -g

BIN_DIR=../bin
BIN_DIR=../../bin
TARGETS = Beagle_GPIO.o \
$(BIN_DIR)/Beagle_GPIO_dht22

Expand Down
2 changes: 2 additions & 0 deletions lib/sensor/driver/dht/src/raspberry/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# 빌드 방법
**Raspberry Pi**에서 `build.sh`를 이용하여 빌드합니다.
14 changes: 14 additions & 0 deletions lib/sensor/driver/dht/src/raspberry/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash
echo "-----------------------------------------"
echo "Install wiringPi static library."
cd ./lib/wiringPi/wiringPi && make static && sudo make install-static

sudo make install-static

echo "-----------------------------------------"
echo "Delte old file..."
rm -f ../../../../../bin/Raspberry_DHT11

echo "Compile dht11..."
cd ../../../ && gcc -o ../../bin/Raspberry_DHT11 ./dht11.c -L/usr/local/lib -lwiringPi -lpthread
echo "Complete."
Loading