Skip to content

Commit 48f368b

Browse files
authored
Merge pull request #801 from entrylabs/develop-hw
1.9.61 PR
2 parents 10a0a80 + be45d4d commit 48f368b

File tree

10 files changed

+288
-20
lines changed

10 files changed

+288
-20
lines changed

app/modules/avatarbot.js

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,15 @@ function Module() {
5858
Osci: 27000000,
5959
Freq: 50
6060
}
61+
6162
this.Board_Servo = {
6263
Pulse_Min: 150,
6364
Pulse_Max: 600,
6465
us_Min: 400,
65-
us_Max: 2100
66+
us_Max: 2100,
67+
angle: 90
6668
}
69+
6770
this.Board_LED_Strip = {
6871
En:0,
6972
sample: 0,
@@ -133,7 +136,9 @@ Module.prototype.init = function(handler, config) {
133136
this.remoteDataSet[index+6] = (this.Board_Servo.us_Min>>8)&0xff;
134137

135138
this.remoteDataSet[index+7] = (this.Board_Servo.us_Max)&0xff;
136-
this.remoteDataSet[index+8] = (this.Board_Servo.us_Max>>8)&0xff;
139+
this.remoteDataSet[index+8] = (this.Board_Servo.us_Max>>8)&0xff;
140+
141+
this.remoteDataSet[index+9] = (this.Board_Servo.angle)&0xff;
137142
}
138143

139144
// led
@@ -203,10 +208,14 @@ slave 모드인 경우 duration 속성 간격으로 지속적으로 기기에
203208
Module.prototype.requestLocalData = function() {
204209
var queryString = [];
205210
var data = this.remoteDataSet; // Module 객체의 dataset table read. max length 200
211+
var checksum = 0;
206212
for (var index = 0; index < this.avatarBotDataSet; index++) {
207213
var query = (data[index])&0xff;
208214
queryString.push(query); // 1byte
215+
checksum += query;
209216
}
217+
checksum = (checksum)&0xff;
218+
queryString.push(checksum); // 1byte
210219
/*
211220
for(var i=0; i<(data.length/10); i++)
212221
{
@@ -222,13 +231,20 @@ Module.prototype.requestLocalData = function() {
222231
};
223232

224233
// 하드웨어에서 온 데이터 처리
234+
/*
225235
Module.prototype.handleLocalData = function(data) {
226236
var self = this;
227237
for (var i = 0; i < data.length; i++) {
228238
self.dataSet[self.dataSet_index+i] = data[i];
229239
}
230-
231-
240+
console.log('data length ', data.length);
241+
for(var j=0; j<21; j++)
242+
{
243+
let i = j*10;
244+
console.log('data ',i, ': ', self.dataSet[i], self.dataSet[i+1], self.dataSet[i+2], self.dataSet[i+3], self.dataSet[i+4], self.dataSet[i+5],
245+
self.dataSet[i+6], self.dataSet[i+7], self.dataSet[i+8], self.dataSet[i+9]);
246+
}
247+
232248
if(self.dataSet[0] === 0x99 && self.dataSet[1] === 0x01 && self.dataSet[2] === 0x01 && self.dataSet[3] === self.avatarBotDataSet)
233249
{
234250
self.dataSet_index = self.dataSet_index + data.length;
@@ -250,6 +266,57 @@ Module.prototype.handleLocalData = function(data) {
250266
251267
252268
};
269+
*/
270+
Module.prototype.handleLocalData = function(data) {
271+
var self = this;
272+
// data.length => 211
273+
var checksum = 0;
274+
var getChecksum = 0;
275+
for (var i = 0; i < data.length; i++) {
276+
if(self.dataSet.length > i)
277+
{
278+
self.dataSet[self.dataSet_index+i] = data[i];
279+
checksum += data[i];
280+
}else{
281+
// last buffer
282+
getChecksum = data[i];
283+
}
284+
}
285+
286+
checksum = (checksum)&0xff;
287+
288+
/*
289+
console.log('data length ', data.length, ', checksum = ', checksum, ', getChecksum = ', getChecksum);
290+
for(var j=0; j<21; j++)
291+
{
292+
let i = j*10;
293+
console.log('data ',i, ': ', self.dataSet[i], self.dataSet[i+1], self.dataSet[i+2], self.dataSet[i+3], self.dataSet[i+4], self.dataSet[i+5],
294+
self.dataSet[i+6], self.dataSet[i+7], self.dataSet[i+8], self.dataSet[i+9]);
295+
}
296+
*/
297+
298+
if(self.dataSet[0] === 0x99 && self.dataSet[1] === 0x01 && self.dataSet[2] === 0x01 && self.dataSet[3] === self.avatarBotDataSet && getChecksum == checksum)
299+
{
300+
self.dataSet_index = self.dataSet_index + (data.length-1);
301+
}else{
302+
self.dataSet_index = 0;
303+
return;
304+
}
305+
306+
if(self.dataSet_index == self.avatarBotDataSet){
307+
self.originParsing(self.dataSet);
308+
self.dataSet_index = 0;
309+
self.dataSet[0] = 0; // clear
310+
self.dataSet[1] = 0; // clear
311+
self.dataSet[2] = 0; // clear
312+
self.dataSet[3] = 0; // clear
313+
//
314+
// console.log('[jhkim] handleLocalData - dataSet_index[11] = ', self.dataSet[11]);
315+
}
316+
317+
318+
};
319+
253320

254321
/* Original Parsing FF 55 ~ */
255322
Module.prototype.originParsing = function(data) {

app/modules/avatarbot.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"en": "AvatarBot",
55
"ko": "AvatarBot"
66
},
7+
"category": "board",
78
"platform": ["win32", "darwin"],
89
"icon" : "avatarbot.png",
910
"module": "avatarbot.js",
@@ -13,18 +14,17 @@
1314
"translate": "Arduino compatible driver"
1415
},
1516
"reconnect" : true,
16-
"firmware": "http://avatarmecha.ddns.net:5050/sharing/iCuhzvxcu",
1717
"select_com_port":true,
1818
"entry": {
1919
"protocol": "json"
2020
},
2121
"hardware": {
22-
"type": "serial",
22+
"type": "bluetooth",
2323
"control": "slave",
24-
"duration": 500,
24+
"duration": 300,
2525
"vendor": ["Arduino", "wch.cn", "FTDI"],
26-
"baudRate": 460800,
27-
"lostTimer": 1000,
26+
"baudRate": 1000000,
27+
"lostTimer": 2000,
2828
"firmwarecheck": false
2929
}
3030
}

app/modules/avatarbot.png

23.8 KB
Loading

app/modules/jcboard.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ Module.prototype.handleLocalData = function(data) {
7373
};
7474

7575
Module.prototype.requestRemoteData = function(handler) {
76-
handler.write('A0', !!(this.sensorData[6] & 0x01));
77-
handler.write('A1', !!(this.sensorData[6] & 0x02));
76+
handler.write('A0', (this.sensorData[6] & 0x01)==0x01? 1 : 0);
77+
handler.write('A1', (this.sensorData[6] & 0x02)==0x02? 1 : 0);
7878
handler.write('A2', this.sensorData[7]);
7979
handler.write('A3', this.sensorData[8]);
8080
handler.write('A4', this.sensorData[9]);

app/modules/jdcode.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,12 @@ Module.prototype.handleLocalData = function(data) {
247247
});
248248
if(dongleData[1] == (sum&0xFF)){
249249
deviceType = 2;
250-
sensorData[6] = true;
250+
sensorData[6] = 1;
251251
sensorData[15] = dongleData[5];
252252
sensorData[7] = dongleData[9];
253253
sensorData[8] = dongleData[7];
254254
sensorData[9] = dongleData[8];
255-
sensorData[10] = (dongleData[3]&0x03)? false : true;
255+
sensorData[10] = (dongleData[3]&0x03)? 0 : 1;
256256
sensorData[16] = dongleData[10];
257257
sensorData[17] = dongleData[11];
258258
sensorData[18] = dongleData[12];

app/modules/robodog.js

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
function Module() {
2+
this.cmdData = [0x26, 0xA8, 0x14, 0x81, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00,
3+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
6+
this.sensorData = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
8+
this.dongleData = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
10+
this.robodog_head = [0x26, 0xA8, 0x14, 0x8A];
11+
this.rk_cnt = 0;
12+
this.pktCnt = -1;
13+
this.pktLength = 6;
14+
this.ledPacket = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
15+
this.txCnt = 0;
16+
}
17+
18+
Module.prototype.init = function(handler, config) {
19+
};
20+
21+
Module.prototype.requestInitialData = function() {
22+
return null;
23+
};
24+
25+
Module.prototype.checkInitialData = function(data, config) {
26+
return true;
27+
};
28+
29+
Module.prototype.validateLocalData = function(data) {
30+
return true;
31+
};
32+
33+
34+
35+
function checksum(cmd){
36+
let sum = 0;
37+
38+
cmd.forEach(function (value, idx) {
39+
if(idx > 5)
40+
sum += value;
41+
});
42+
return sum&0xFF;
43+
}
44+
45+
46+
/////////////// 엔트리에서 받은 데이터에 대한 처리 /////////////////////
47+
Module.prototype.handleRemoteData = function(handler) {
48+
let cmd = handler.read('CMD');
49+
50+
if(typeof cmd !== 'object')
51+
return;
52+
53+
this.cmdData = cmd.slice();
54+
if(this.cmdData[14] > 0){
55+
if(this.cmdData[14] == 2){
56+
this.ledPacket[0] = (this.cmdData[14]&0xC0) | 0x82;
57+
this.ledPacket[1] = this.ledPacket[1] | 0x80;
58+
for(let n=0; n<16; n++)
59+
this.ledPacket[2+n] = this.cmdData[24+n];
60+
}
61+
if(this.cmdData[14] == 3){
62+
this.ledPacket[0] = (this.cmdData[14]&0xC0) | 0x83;
63+
this.ledPacket[1] = this.ledPacket[1] | 0x80;
64+
for(let n=0; n<16; n++)
65+
this.ledPacket[2+n] = this.cmdData[24+n];
66+
}
67+
if(this.cmdData[14] == 4){
68+
this.ledPacket[1] = (this.cmdData[14]&0xC0) | 0x44;
69+
this.ledPacket[0] = this.ledPacket[0] | 0x40;
70+
for(let n=0; n<16; n++)
71+
this.ledPacket[18+n] = this.cmdData[24+n];
72+
}
73+
}
74+
else{
75+
this.ledPacket[0] = 0;
76+
this.ledPacket[1] = 0;
77+
}
78+
};
79+
80+
81+
//////////////// 하드웨어로 보낼 데이터 로직 /////////////
82+
Module.prototype.requestLocalData = function() {
83+
if(((this.ledPacket[0]&0xC0) == 0xC0) || ((this.ledPacket[1]&0xC0) == 0xC0)){
84+
if((this.txCnt%2) == 0){
85+
this.cmdData[14] = this.ledPacket[0];
86+
for(let n=0; n<16; n++)
87+
this.cmdData[24+n] = this.ledPacket[2+n];
88+
}
89+
else{
90+
this.cmdData[14] = this.ledPacket[1];
91+
for(let n=0; n<16; n++)
92+
this.cmdData[24+n] = this.ledPacket[18+n];
93+
}
94+
this.cmdData[5] = checksum(this.cmdData);
95+
this.txCnt += 1;
96+
}
97+
return this.cmdData;
98+
};
99+
100+
///////////// 하드웨어에서 온 데이터 처리 ///////////////////
101+
Module.prototype.handleLocalData = function(data) {
102+
let sensorData = this.sensorData;
103+
let dongleData = this.dongleData;
104+
let pktLength = this.pktLength;
105+
106+
let robodog_head = this.robodog_head;
107+
data.forEach(function (value) {
108+
this.rk_cnt = (value==robodog_head[this.rk_cnt])? this.rk_cnt+1 : 0;
109+
if(this.rk_cnt == 4){
110+
this.rk_cnt = 0;
111+
this.pktCnt = 0;
112+
}
113+
else if(this.pktCnt >= 0){
114+
if(this.pktCnt == 0)
115+
pktLength = ((value>0) && (value<19))? value-4 : 16;
116+
dongleData[4+this.pktCnt++] = value;
117+
}
118+
119+
if(this.pktCnt == pktLength){
120+
this.pktCnt = -1;
121+
var sum = 0;
122+
dongleData.forEach(function (value, idx) {
123+
if(idx > 5)
124+
sum += value;
125+
});
126+
if(dongleData[5] == (sum&0xFF)){
127+
dongleData.forEach(function (value, idx) {
128+
sensorData[idx] = value;
129+
});
130+
}
131+
}
132+
});
133+
this.pktLength = pktLength;
134+
};
135+
136+
function unsingToSign8(data)
137+
{
138+
return data>127? data-256 : data;
139+
}
140+
function unsingToSign16(data)
141+
{
142+
return data>32767? data-65536 : data;
143+
}
144+
145+
///////////// 엔트리로 전달할 데이터 ///////////////////////////
146+
Module.prototype.requestRemoteData = function(handler) {
147+
handler.write("SENSORDATA", this.sensorData);
148+
handler.write('BATTERY', this.sensorData[6]);
149+
handler.write('TOF', this.sensorData[7]);
150+
handler.write('ROLL', unsingToSign8(this.sensorData[8]));
151+
handler.write('PITCH', unsingToSign8(this.sensorData[9]));
152+
handler.write('YAW', unsingToSign16(this.sensorData[10] + this.sensorData[11]*256));
153+
handler.write('RB0', this.sensorData[12]>127? this.sensorData[12]-256 : this.sensorData[12]);
154+
handler.write('RB1', this.sensorData[13]>127? this.sensorData[13]-256 : this.sensorData[13]);
155+
handler.write('RB2', this.sensorData[14]>127? this.sensorData[14]-256 : this.sensorData[14]);
156+
handler.write('RB3', this.sensorData[15]>127? this.sensorData[15]-256 : this.sensorData[15]);
157+
handler.write('BUTTON', this.sensorData[16]);
158+
handler.write('RB_WATCHDOG', this.sensorData[17]);
159+
handler.write('RB4', this.sensorData[18]>127? this.sensorData[18]-256 : this.sensorData[18]);
160+
handler.write('RB5', this.sensorData[19]>127? this.sensorData[19]-256 : this.sensorData[19]);
161+
};
162+
163+
Module.prototype.reset = function() {
164+
this.cmdData = [0x26, 0xA8, 0x14, 0x81, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00,
165+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168+
0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64];
169+
this.sensorData = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
171+
this.ledPacket = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
172+
console.log("reset");
173+
};
174+
175+
module.exports = new Module();

app/modules/robodog.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"id": "1D0501",
3+
"name": {
4+
"en": "RoboDog",
5+
"ko": "로보독"
6+
},
7+
"category": "robot",
8+
"platform": ["win32", "darwin"],
9+
"icon": "robodog.png",
10+
"module": "robodog.js",
11+
"url": "http://www.junilab.co.kr",
12+
"driver": {
13+
"win32-ia32": "JuniLab/dongleSetup.bat",
14+
"win32-x64": "JuniLab/dongleSetup.bat"
15+
},
16+
"reconnect": true,
17+
"hardware": {
18+
"type": "serial",
19+
"control": "slave",
20+
"duration": 32,
21+
"vendor": "Junilab_Inc",
22+
"pnpId": "0226",
23+
"baudRate": 19200,
24+
"firmwarecheck": false
25+
}
26+
}

app/modules/robodog.png

15.7 KB
Loading

0 commit comments

Comments
 (0)