From bee11eb13bb90268660835ec84d321878dbb11d9 Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 19 Jan 2024 08:22:23 +0900 Subject: [PATCH 01/13] =?UTF-8?q?RB-100=20=ED=86=B5=ED=95=A9=EC=84=BC?= =?UTF-8?q?=EC=84=9C=20=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_RB100.js | 38 ++++++++++++++++++++++++----- app/modules/robotis_RB100_usb.js | 41 ++++++++++++++++++++++++++------ 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/app/modules/robotis_RB100.js b/app/modules/robotis_RB100.js index 81911372b..0b242640f 100644 --- a/app/modules/robotis_RB100.js +++ b/app/modules/robotis_RB100.js @@ -122,7 +122,8 @@ Module.prototype.requestInitialData = function() { this.servoPrevValue4 = []; // add by kjs 20170627 this.robotisBuffer.push([INST_WRITE, 21, 2, 20]); - this.robotisBuffer.push([INST_WRITE, 20, 1, 0]); + this.robotisBuffer.push([INST_WRITE, 19, 1, 1]); // bypass 모드 켜기 + this.robotisBuffer.push([INST_WRITE, 20, 1, 0]); // bypass port를 BLE로 설정 return this.readPacket(200, 0, 2); }; @@ -213,6 +214,16 @@ Module.prototype.handleRemoteData = function(handler) { doSend = true; } } + } else if (instruction == INST_BYPASS_READ) { + if (isReadDataArrived == false && + this.prevInstruction == INST_BYPASS_READ && + this.prevAddress == address && + this.prevLength == length && + this.prevValue == value) { + doSend = false; + } else { + doSend = true; + } } //console.log("dosend : " + doSend); if (doSend) { @@ -261,7 +272,14 @@ Module.prototype.handleRemoteData = function(handler) { if (instruction == INST_WRITE || instruction == INST_DXL_SYNCWRITE || instruction == INST_DXL_REGWRITE || instruction == INST_DXL_ACTION) { this.robotisBuffer.push(data[index]); - } else if (instruction == INST_READ) { + if (instruction == INST_WRITE) { + // 만약 bypass mode를 enable 한다고 하면 + if (address == 19 && value == 1) { + // bypass port를 BLE로 설정 + this.robotisBuffer.push([INST_WRITE, 20, 1, 0]); + } + } + } else if (instruction == INST_READ || instruction == INST_BYPASS_READ) { if (this.addressToRead[address] == undefined || this.addressToRead[address] == 0) { this.addressToRead[address] = 1; this.robotisBuffer.push(data[index]); @@ -311,7 +329,7 @@ Module.prototype.requestLocalData = function() { isTemp = true; } else { - var data = this.robotisBuffer.shift(); + var data = this.robotisBuffer.shift(); if (data == null) { return sendBuffer; } @@ -359,6 +377,10 @@ Module.prototype.requestLocalData = function() { sendBuffer = this.dxlRegWritePacket(ids[0], address, length, value); } else if(instruction == INST_DXL_ACTION) { sendBuffer = this.dxlActionWrite(); + } else if(instruction == INST_BYPASS_READ) { + var id = value; + this.addressToRead[address] = 0; + sendBuffer = this.readPacket(id, address, length); } console.log("send buffer : " + sendBuffer) @@ -366,10 +388,11 @@ Module.prototype.requestLocalData = function() { sendBuffer[1] == 0xFF && sendBuffer[2] == 0xFD && sendBuffer[3] == 0x00 && - sendBuffer[4] == 0xC8) { + sendBuffer[4] == 0xC8 || + (sendBuffer[4] >= 100 && sendBuffer[4] <= 119)) { dataLength = this.makeWord(sendBuffer[5], sendBuffer[6]); - if (sendBuffer[7] == 0x02) { + if (sendBuffer[7] == INST_READ) { this.receiveAddress = address; this.receiveLength = length; this.defaultLength = data[2]; @@ -411,7 +434,9 @@ Module.prototype.handleLocalData = function(data) { // data: Native Buffer if (this.receiveBuffer.shift() == 0xFF) { if (this.receiveBuffer.shift() == 0xFD) { if (this.receiveBuffer.shift() == 0x00) { - if (this.receiveBuffer.shift() == 0xC8) { + var id = this.receiveBuffer.shift(); + if (id == 0xC8 || + (id >= 100 && id <= 119)) { var packetLength = this.makeWord(this.receiveBuffer.shift(), this.receiveBuffer.shift()); // if (packetLength > 4) { // console.log("?? : " + this.receiveLength + ' / ' + (packetLength - 4)); @@ -516,6 +541,7 @@ var INST_WRITE = 3; var INST_DXL_SYNCWRITE = 4; var INST_DXL_REGWRITE = 5; var INST_DXL_ACTION = 6; +var INST_BYPASS_READ = 0xA2; var isReadDataArrived = true; var isConnected = true; diff --git a/app/modules/robotis_RB100_usb.js b/app/modules/robotis_RB100_usb.js index b60f28a6e..1ccf17958 100644 --- a/app/modules/robotis_RB100_usb.js +++ b/app/modules/robotis_RB100_usb.js @@ -122,7 +122,8 @@ Module.prototype.requestInitialData = function() { this.servoPrevValue4 = []; // add by kjs 20170627 this.robotisBuffer.push([INST_WRITE, 21, 2, 20]); - this.robotisBuffer.push([INST_WRITE, 20, 1, 1]); + this.robotisBuffer.push([INST_WRITE, 19, 1, 1]); // bypass 모드 켜기 + this.robotisBuffer.push([INST_WRITE, 20, 1, 1]); // bypass port를 USB로 설정 return this.readPacket(200, 0, 2); }; @@ -213,6 +214,16 @@ Module.prototype.handleRemoteData = function(handler) { doSend = true; } } + } else if (instruction == INST_BYPASS_READ) { + if (isReadDataArrived == false && + this.prevInstruction == INST_BYPASS_READ && + this.prevAddress == address && + this.prevLength == length && + this.prevValue == value) { + doSend = false; + } else { + doSend = true; + } } //console.log("dosend : " + doSend); if (doSend) { @@ -260,8 +271,16 @@ Module.prototype.handleRemoteData = function(handler) { } if (instruction == INST_WRITE || instruction == INST_DXL_SYNCWRITE || instruction == INST_DXL_REGWRITE || instruction == INST_DXL_ACTION) { - this.robotisBuffer.push(data[index]); - } else if (instruction == INST_READ) { + this.robotisBuffer.push(data[index]); + if (instruction == INST_WRITE) { + // 만약 bypass mode를 enable 한다고 하면 + if (address == 19 && value == 1) { + // bypass port를 USB로 설정 + this.robotisBuffer.push([INST_WRITE, 20, 1, 1]); + } + } + } else if (instruction == INST_READ || instruction == INST_BYPASS_READ) { + if (this.addressToRead[address] == undefined || this.addressToRead[address] == 0) { this.addressToRead[address] = 1; this.robotisBuffer.push(data[index]); @@ -311,7 +330,7 @@ Module.prototype.requestLocalData = function() { isTemp = true; } else { - var data = this.robotisBuffer.shift(); + var data = this.robotisBuffer.shift(); if (data == null) { return sendBuffer; } @@ -359,6 +378,10 @@ Module.prototype.requestLocalData = function() { sendBuffer = this.dxlRegWritePacket(ids[0], address, length, value); } else if(instruction == INST_DXL_ACTION) { sendBuffer = this.dxlActionWrite(); + } else if(instruction == INST_BYPASS_READ) { + var id = value; + this.addressToRead[address] = 0; + sendBuffer = this.readPacket(id, address, length); } console.log("send buffer : " + sendBuffer) @@ -366,10 +389,11 @@ Module.prototype.requestLocalData = function() { sendBuffer[1] == 0xFF && sendBuffer[2] == 0xFD && sendBuffer[3] == 0x00 && - sendBuffer[4] == 0xC8) { + sendBuffer[4] == 0xC8 || + (sendBuffer[4] >= 100 && sendBuffer[4] <= 119)) { dataLength = this.makeWord(sendBuffer[5], sendBuffer[6]); - if (sendBuffer[7] == 0x02) { + if (sendBuffer[7] == INST_READ) { this.receiveAddress = address; this.receiveLength = length; this.defaultLength = data[2]; @@ -411,7 +435,9 @@ Module.prototype.handleLocalData = function(data) { // data: Native Buffer if (this.receiveBuffer.shift() == 0xFF) { if (this.receiveBuffer.shift() == 0xFD) { if (this.receiveBuffer.shift() == 0x00) { - if (this.receiveBuffer.shift() == 0xC8) { + var id = this.receiveBuffer.shift(); + if (id == 0xC8 || + (id >= 100 && id <= 119)) { var packetLength = this.makeWord(this.receiveBuffer.shift(), this.receiveBuffer.shift()); // if (packetLength > 4) { // console.log("?? : " + this.receiveLength + ' / ' + (packetLength - 4)); @@ -523,6 +549,7 @@ var INST_WRITE = 3; var INST_DXL_SYNCWRITE = 4; var INST_DXL_REGWRITE = 5; var INST_DXL_ACTION = 6; +var INST_BYPASS_READ = 0xA2; var isReadDataArrived = true; var isConnected = true; From bbba4520ee223bd1dff37e717cfddbf2841d7d6f Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 19 Jan 2024 08:23:18 +0900 Subject: [PATCH 02/13] =?UTF-8?q?=EC=A1=B0=EB=A6=BD=ED=98=95=20=EC=8B=A4?= =?UTF-8?q?=EA=B3=BC=20=EB=B0=8F=20bypass=20write=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../robotis_RB100_Practical_Assembly.json | 25 ++++++++++++++++++ app/modules/robotis_RB100_usb.js | 23 ++++++---------- .../robotis_RB100im_Practical_Assembly.png | Bin 0 -> 37758 bytes 3 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 app/modules/robotis_RB100_Practical_Assembly.json create mode 100644 app/modules/robotis_RB100im_Practical_Assembly.png diff --git a/app/modules/robotis_RB100_Practical_Assembly.json b/app/modules/robotis_RB100_Practical_Assembly.json new file mode 100644 index 000000000..951ea4150 --- /dev/null +++ b/app/modules/robotis_RB100_Practical_Assembly.json @@ -0,0 +1,25 @@ +{ + "id": "070A01", + "name": { + "en": "ROBOTIS Practical Course 2025", + "ko": "로보티즈 실과 2025" + }, + "category": "module", + "platform": ["win32"], + "icon" : "robotis_RB100im_Practical_Assembly.png", + "module": "robotis_RB100_usb.js", + "url": "http://www.robotis.com", + "email": "jason@robotis.com", + "reconnect" : true, + "driver": { + "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", + "win32-x64": "ROBOTIS/ROBOTIS CDC Driver.bat" + }, + "hardware": { + "type": "serial", + "control": "slave", + "vendor": "ROBOTIS", + "duration": 15, + "baudRate": 57600 + } +} diff --git a/app/modules/robotis_RB100_usb.js b/app/modules/robotis_RB100_usb.js index 1ccf17958..a5df2e28b 100644 --- a/app/modules/robotis_RB100_usb.js +++ b/app/modules/robotis_RB100_usb.js @@ -201,19 +201,6 @@ Module.prototype.handleRemoteData = function(handler) { } else { doSend = true; } - } else if (instruction == INST_WRITE) { - if (this.prevInstruction == INST_WRITE && - this.prevAddress == address && - this.prevLength == length && - this.prevValue == value && address != 86) { - doSend = false; - } else { - if (this.prevServoCompare(address, value, length)) { - - } else { - doSend = true; - } - } } else if (instruction == INST_BYPASS_READ) { if (isReadDataArrived == false && this.prevInstruction == INST_BYPASS_READ && @@ -237,7 +224,7 @@ Module.prototype.handleRemoteData = function(handler) { } } } - if(instruction == 4 || instruction == 5 || instruction == 6) { + if(instruction == INST_WRITE || instruction == 4 || instruction == 5 || instruction == 6 || INST_BYPASS_WRITE) { doSend = true; } if (!doSend) { @@ -270,7 +257,7 @@ Module.prototype.handleRemoteData = function(handler) { this.prevServoSet(address, value, length); } - if (instruction == INST_WRITE || instruction == INST_DXL_SYNCWRITE || instruction == INST_DXL_REGWRITE || instruction == INST_DXL_ACTION) { + if (instruction == INST_WRITE || instruction == INST_DXL_SYNCWRITE || instruction == INST_DXL_REGWRITE || instruction == INST_DXL_ACTION || instruction == INST_BYPASS_WRITE) { this.robotisBuffer.push(data[index]); if (instruction == INST_WRITE) { // 만약 bypass mode를 enable 한다고 하면 @@ -338,6 +325,7 @@ Module.prototype.requestLocalData = function() { var address = data[1]; var length = data[2]; var value = data[3]; + var value_2 = data[4]; //console.log('send address : ' + address + ', ' + value + ", " + length); // add by kjs 170426 if (instruction == INST_WRITE) { if (length == 1) { @@ -382,6 +370,10 @@ Module.prototype.requestLocalData = function() { var id = value; this.addressToRead[address] = 0; sendBuffer = this.readPacket(id, address, length); + } else if(instruction == INST_BYPASS_WRITE) { + var id = value; + this.addressToRead[address] = 0; + sendBuffer = this.writeBytePacket(id, address, value_2); } console.log("send buffer : " + sendBuffer) @@ -550,6 +542,7 @@ var INST_DXL_SYNCWRITE = 4; var INST_DXL_REGWRITE = 5; var INST_DXL_ACTION = 6; var INST_BYPASS_READ = 0xA2; +var INST_BYPASS_WRITE = 0xA3; var isReadDataArrived = true; var isConnected = true; diff --git a/app/modules/robotis_RB100im_Practical_Assembly.png b/app/modules/robotis_RB100im_Practical_Assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..9a8d9b256c2676a91c824b50a75e1d8f57d29693 GIT binary patch literal 37758 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 a;Qs@~tjG+Lx{PH20000 Date: Fri, 19 Jan 2024 08:23:48 +0900 Subject: [PATCH 03/13] =?UTF-8?q?Dxl=20write=20=EB=AA=85=EB=A0=B9=20?= =?UTF-8?q?=EC=A7=80=EC=9B=90=20(read=EA=B0=92=20undefined=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_RB100.js | 7 ------- app/modules/robotis_RB100_usb.js | 25 ++++++++++++++----------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/app/modules/robotis_RB100.js b/app/modules/robotis_RB100.js index 0b242640f..6cae7a5ee 100644 --- a/app/modules/robotis_RB100.js +++ b/app/modules/robotis_RB100.js @@ -343,13 +343,6 @@ Module.prototype.requestLocalData = function() { sendBuffer = this.writeBytePacket(200, address, value); } else if (length == 2) { sendBuffer = this.writeWordPacket(200, address, value); - } else if (length == 4 && address == 136) { - var value2; - if (value < 1024) - value2 = value + 1024; - else - value2 = value - 1024; - sendBuffer = this.writeDWordPacket2(200, address, value, value2); } else { sendBuffer = this.writeDWordPacket(200, address, value); } diff --git a/app/modules/robotis_RB100_usb.js b/app/modules/robotis_RB100_usb.js index a5df2e28b..c87b1d9b5 100644 --- a/app/modules/robotis_RB100_usb.js +++ b/app/modules/robotis_RB100_usb.js @@ -332,13 +332,6 @@ Module.prototype.requestLocalData = function() { sendBuffer = this.writeBytePacket(200, address, value); } else if (length == 2) { sendBuffer = this.writeWordPacket(200, address, value); - } else if (length == 4 && address == 136) { - var value2; - if (value < 1024) - value2 = value + 1024; - else - value2 = value - 1024; - sendBuffer = this.writeDWordPacket2(200, address, value, value2); } else { sendBuffer = this.writeDWordPacket(200, address, value); } @@ -373,7 +366,15 @@ Module.prototype.requestLocalData = function() { } else if(instruction == INST_BYPASS_WRITE) { var id = value; this.addressToRead[address] = 0; - sendBuffer = this.writeBytePacket(id, address, value_2); + if (length == 1) { + sendBuffer = this.writeBytePacket(id, address, value_2); + } + else if (length == 2) { + sendBuffer = this.writeWordPacket(id, address, value_2); + } + else { + sendBuffer = this.writeDWordPacket(id, address, value_2); + } } console.log("send buffer : " + sendBuffer) @@ -382,7 +383,8 @@ Module.prototype.requestLocalData = function() { sendBuffer[2] == 0xFD && sendBuffer[3] == 0x00 && sendBuffer[4] == 0xC8 || - (sendBuffer[4] >= 100 && sendBuffer[4] <= 119)) { + (sendBuffer[4] >= 100 && sendBuffer[4] <= 119) || + (sendBuffer[4] >= 1 && sendBuffer[4] <= 63)) { dataLength = this.makeWord(sendBuffer[5], sendBuffer[6]); if (sendBuffer[7] == INST_READ) { @@ -422,14 +424,15 @@ Module.prototype.handleLocalData = function(data) { // data: Native Buffer // console.log('<< 1 : ' + this.receiveLength + ' : ' + this.receiveBuffer); // while (this.receiveBuffer.length > 0) { - while (this.receiveBuffer.length >= 11 + this.receiveLength) { + while (this.receiveBuffer.length >= 11) { if (this.receiveBuffer.shift() == 0xFF) { if (this.receiveBuffer.shift() == 0xFF) { if (this.receiveBuffer.shift() == 0xFD) { if (this.receiveBuffer.shift() == 0x00) { var id = this.receiveBuffer.shift(); if (id == 0xC8 || - (id >= 100 && id <= 119)) { + (id >= 100 && id <= 119) || + (id >= 1 && id <= 63)) { var packetLength = this.makeWord(this.receiveBuffer.shift(), this.receiveBuffer.shift()); // if (packetLength > 4) { // console.log("?? : " + this.receiveLength + ' / ' + (packetLength - 4)); From 1bfee86299d62c5a7430e813cad2383c53f65fee Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 19 Jan 2024 08:25:22 +0900 Subject: [PATCH 04/13] =?UTF-8?q?=EC=8B=A4=EA=B3=BC=EB=A1=9C=EB=B4=87=20BL?= =?UTF-8?q?E=20=EB=8F=99=EA=B8=80=20=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_RB100.js | 39 ++++++++++--------- .../robotis_RB100_Practical_AssemblyBT.json | 26 +++++++++++++ app/modules/robotis_RB100_usb.js | 2 +- 3 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 app/modules/robotis_RB100_Practical_AssemblyBT.json diff --git a/app/modules/robotis_RB100.js b/app/modules/robotis_RB100.js index 6cae7a5ee..9ec6c5d74 100644 --- a/app/modules/robotis_RB100.js +++ b/app/modules/robotis_RB100.js @@ -201,19 +201,6 @@ Module.prototype.handleRemoteData = function(handler) { } else { doSend = true; } - } else if (instruction == INST_WRITE) { - if (this.prevInstruction == INST_WRITE && - this.prevAddress == address && - this.prevLength == length && - this.prevValue == value && address != 86) { - doSend = false; - } else { - if (this.prevServoCompare(address, value, length)) { - - } else { - doSend = true; - } - } } else if (instruction == INST_BYPASS_READ) { if (isReadDataArrived == false && this.prevInstruction == INST_BYPASS_READ && @@ -237,7 +224,7 @@ Module.prototype.handleRemoteData = function(handler) { } } } - if(instruction == 4 || instruction == 5 || instruction == 6) { + if(instruction == INST_WRITE || instruction == 4 || instruction == 5 || instruction == 6 || instruction == INST_BYPASS_WRITE) { doSend = true; } if (!doSend) { @@ -270,7 +257,7 @@ Module.prototype.handleRemoteData = function(handler) { this.prevServoSet(address, value, length); } - if (instruction == INST_WRITE || instruction == INST_DXL_SYNCWRITE || instruction == INST_DXL_REGWRITE || instruction == INST_DXL_ACTION) { + if (instruction == INST_WRITE || instruction == INST_DXL_SYNCWRITE || instruction == INST_DXL_REGWRITE || instruction == INST_DXL_ACTION || instruction == INST_BYPASS_WRITE) { this.robotisBuffer.push(data[index]); if (instruction == INST_WRITE) { // 만약 bypass mode를 enable 한다고 하면 @@ -337,6 +324,7 @@ Module.prototype.requestLocalData = function() { var address = data[1]; var length = data[2]; var value = data[3]; + var value_2 = data[4]; //console.log('send address : ' + address + ', ' + value + ", " + length); // add by kjs 170426 if (instruction == INST_WRITE) { if (length == 1) { @@ -374,6 +362,18 @@ Module.prototype.requestLocalData = function() { var id = value; this.addressToRead[address] = 0; sendBuffer = this.readPacket(id, address, length); + } else if(instruction == INST_BYPASS_WRITE) { + var id = value; + this.addressToRead[address] = 0; + if (length == 1) { + sendBuffer = this.writeBytePacket(id, address, value_2); + } + else if (length == 2) { + sendBuffer = this.writeWordPacket(id, address, value_2); + } + else { + sendBuffer = this.writeDWordPacket(id, address, value_2); + } } console.log("send buffer : " + sendBuffer) @@ -382,7 +382,8 @@ Module.prototype.requestLocalData = function() { sendBuffer[2] == 0xFD && sendBuffer[3] == 0x00 && sendBuffer[4] == 0xC8 || - (sendBuffer[4] >= 100 && sendBuffer[4] <= 119)) { + (sendBuffer[4] >= 100 && sendBuffer[4] <= 119) || + (sendBuffer[4] >= 1 && sendBuffer[4] <= 63)) { dataLength = this.makeWord(sendBuffer[5], sendBuffer[6]); if (sendBuffer[7] == INST_READ) { @@ -422,14 +423,15 @@ Module.prototype.handleLocalData = function(data) { // data: Native Buffer // console.log('<< 1 : ' + this.receiveLength + ' : ' + this.receiveBuffer); // while (this.receiveBuffer.length > 0) { - while (this.receiveBuffer.length >= 11 + this.receiveLength) { + while (this.receiveBuffer.length >= 11) { if (this.receiveBuffer.shift() == 0xFF) { if (this.receiveBuffer.shift() == 0xFF) { if (this.receiveBuffer.shift() == 0xFD) { if (this.receiveBuffer.shift() == 0x00) { var id = this.receiveBuffer.shift(); if (id == 0xC8 || - (id >= 100 && id <= 119)) { + (id >= 100 && id <= 119) || + (id >= 1 && id <= 63)) { var packetLength = this.makeWord(this.receiveBuffer.shift(), this.receiveBuffer.shift()); // if (packetLength > 4) { // console.log("?? : " + this.receiveLength + ' / ' + (packetLength - 4)); @@ -535,6 +537,7 @@ var INST_DXL_SYNCWRITE = 4; var INST_DXL_REGWRITE = 5; var INST_DXL_ACTION = 6; var INST_BYPASS_READ = 0xA2; +var INST_BYPASS_WRITE = 0xA3; var isReadDataArrived = true; var isConnected = true; diff --git a/app/modules/robotis_RB100_Practical_AssemblyBT.json b/app/modules/robotis_RB100_Practical_AssemblyBT.json new file mode 100644 index 000000000..e75c87b60 --- /dev/null +++ b/app/modules/robotis_RB100_Practical_AssemblyBT.json @@ -0,0 +1,26 @@ +{ + "id": "070B01", + "name": { + "en": "ROBOTIS Practical Course 2025(무선연결)", + "ko": "로보티즈 실과 2025(무선연결)" + }, + "category": "module", + "platform": ["win32"], + "icon" : "robotis_RB100im_Practical_Assembly.png", + "module": "robotis_RB100.js", + "url": "http://www.steamcup.org/ko/", + "email": "jason@robotis.com", + "reconnect" : true, + "driver": { + "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", + "win32-x64": "ROBOTIS/ROBOTIS CDC Driver.bat" + }, + "selectPort" : true, + "hardware": { + "type": "serial", + "control": "slave", + "vendor": "ROBOTIS", + "duration": 15, + "baudRate": 57600 + } +} diff --git a/app/modules/robotis_RB100_usb.js b/app/modules/robotis_RB100_usb.js index c87b1d9b5..d53101c34 100644 --- a/app/modules/robotis_RB100_usb.js +++ b/app/modules/robotis_RB100_usb.js @@ -224,7 +224,7 @@ Module.prototype.handleRemoteData = function(handler) { } } } - if(instruction == INST_WRITE || instruction == 4 || instruction == 5 || instruction == 6 || INST_BYPASS_WRITE) { + if(instruction == INST_WRITE || instruction == 4 || instruction == 5 || instruction == 6 || instruction == INST_BYPASS_WRITE) { doSend = true; } if (!doSend) { From 2dee37497d915e1bbc0c8d35543fafab859a090d Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 19 Jan 2024 08:26:54 +0900 Subject: [PATCH 05/13] =?UTF-8?q?=EB=8B=B4=EB=8B=B9=EC=9E=90=20=EC=9D=B4?= =?UTF-8?q?=EB=A9=94=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_Dream.json | 2 +- app/modules/robotis_DreamBT.json | 2 +- app/modules/robotis_RB100_Humanoid.json | 2 +- app/modules/robotis_RB100_HumanoidBT.json | 2 +- app/modules/robotis_RB100_RGee.json | 2 +- app/modules/robotis_RB100_RGeeBT.json | 2 +- app/modules/robotis_RB100_car.json | 2 +- app/modules/robotis_RB100_carBT.json | 2 +- app/modules/robotis_carCont.json | 2 +- app/modules/robotis_openCM70.json | 2 +- app/modules/robotis_openCM70BT.json | 2 +- app/modules/robotis_openCM70EDU.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/modules/robotis_Dream.json b/app/modules/robotis_Dream.json index 2bca74960..428ea59af 100644 --- a/app/modules/robotis_Dream.json +++ b/app/modules/robotis_Dream.json @@ -9,7 +9,7 @@ "icon" : "robotis_Dream.png", "module": "robotis_Dream.js", "url": "http://www.robotis.com", - "email": "kjw@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_DreamBT.json b/app/modules/robotis_DreamBT.json index 6a931384b..d3b927c8e 100644 --- a/app/modules/robotis_DreamBT.json +++ b/app/modules/robotis_DreamBT.json @@ -9,7 +9,7 @@ "icon" : "robotis_Dream.png", "module": "robotis_Dream.js", "url": "http://www.robotis.com", - "email": "khg@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_RB100_Humanoid.json b/app/modules/robotis_RB100_Humanoid.json index 55b56063a..9269570fe 100644 --- a/app/modules/robotis_RB100_Humanoid.json +++ b/app/modules/robotis_RB100_Humanoid.json @@ -9,7 +9,7 @@ "icon" : "robotis_RB100im_Humanoid.png", "module": "robotis_RB100_usb.js", "url": "http://www.robotis.com", - "email": "khg@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_RB100_HumanoidBT.json b/app/modules/robotis_RB100_HumanoidBT.json index 692f261d5..5ecaa43cc 100644 --- a/app/modules/robotis_RB100_HumanoidBT.json +++ b/app/modules/robotis_RB100_HumanoidBT.json @@ -9,7 +9,7 @@ "icon" : "robotis_RB100im_Humanoid.png", "module": "robotis_RB100.js", "url": "http://www.robotis.com", - "email": "khg@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_RB100_RGee.json b/app/modules/robotis_RB100_RGee.json index 0e560ab1a..c915b9911 100644 --- a/app/modules/robotis_RB100_RGee.json +++ b/app/modules/robotis_RB100_RGee.json @@ -9,7 +9,7 @@ "icon" : "robotis_RB100im_RGee.png", "module": "robotis_RB100_usb.js", "url": "http://www.robotis.com", - "email": "khg@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_RB100_RGeeBT.json b/app/modules/robotis_RB100_RGeeBT.json index b3d37a2f0..59d473010 100644 --- a/app/modules/robotis_RB100_RGeeBT.json +++ b/app/modules/robotis_RB100_RGeeBT.json @@ -9,7 +9,7 @@ "icon" : "robotis_RB100im_RGee.png", "module": "robotis_RB100.js", "url": "http://www.robotis.com", - "email": "khg@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_RB100_car.json b/app/modules/robotis_RB100_car.json index 42ae9f49b..bf3e488fa 100644 --- a/app/modules/robotis_RB100_car.json +++ b/app/modules/robotis_RB100_car.json @@ -9,7 +9,7 @@ "icon" : "robotis_RB100im_car.png", "module": "robotis_RB100_usb.js", "url": "http://www.robotis.com", - "email": "khg@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_RB100_carBT.json b/app/modules/robotis_RB100_carBT.json index 86db323a0..9ac84d45e 100644 --- a/app/modules/robotis_RB100_carBT.json +++ b/app/modules/robotis_RB100_carBT.json @@ -9,7 +9,7 @@ "icon" : "robotis_RB100im_car.png", "module": "robotis_RB100.js", "url": "http://www.robotis.com", - "email": "khg@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_carCont.json b/app/modules/robotis_carCont.json index b62f654b3..223788bfa 100644 --- a/app/modules/robotis_carCont.json +++ b/app/modules/robotis_carCont.json @@ -9,7 +9,7 @@ "icon" : "robotis_carCont.png", "module": "robotis_carCont.js", "url": "http://www.robotis.com", - "email": "kigate@robotis.com", + "email": "jason@robotis.com", "selectPort" : true, "hardware": { "type": "bluetooth", diff --git a/app/modules/robotis_openCM70.json b/app/modules/robotis_openCM70.json index e354dcd11..08e86f2cf 100644 --- a/app/modules/robotis_openCM70.json +++ b/app/modules/robotis_openCM70.json @@ -9,7 +9,7 @@ "icon" : "robotis_openCM70.png", "module": "robotis_openCM70.js", "url": "http://www.robotis.com", - "email": "kjw@robotis.com", + "email": "jason@robotis.com", "video": "https://goo.gl/QaXNYy", "reconnect" : true, "driver": { diff --git a/app/modules/robotis_openCM70BT.json b/app/modules/robotis_openCM70BT.json index 300d7551e..38bd59559 100644 --- a/app/modules/robotis_openCM70BT.json +++ b/app/modules/robotis_openCM70BT.json @@ -9,7 +9,7 @@ "icon" : "robotis_openCM70.png", "module": "robotis_openCM70.js", "url": "http://www.robotis.com", - "email": "kigate@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", diff --git a/app/modules/robotis_openCM70EDU.json b/app/modules/robotis_openCM70EDU.json index 0a5a4ae5f..c02c9f213 100644 --- a/app/modules/robotis_openCM70EDU.json +++ b/app/modules/robotis_openCM70EDU.json @@ -9,7 +9,7 @@ "icon" : "robotis_openCM70EDU.png", "module": "robotis_openCM70EDU.js", "url": "http://www.robotis.com", - "email": "kjw@robotis.com", + "email": "jason@robotis.com", "reconnect" : true, "driver": { "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", From ea27f744920bcc1bb37fcd34d8b976c3b4c53965 Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 19 Jan 2024 08:27:26 +0900 Subject: [PATCH 06/13] =?UTF-8?q?=EC=8B=A4=EA=B3=BC=EB=A1=9C=EB=B4=87=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../robotis_RB100im_Practical_Assembly.png | Bin 37758 -> 28642 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/modules/robotis_RB100im_Practical_Assembly.png b/app/modules/robotis_RB100im_Practical_Assembly.png index 9a8d9b256c2676a91c824b50a75e1d8f57d29693..5fa23130a232b631c0f45f933dd635449d76b06a 100644 GIT binary patch literal 28642 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 ZRe~p7nAaH@K3DKTDaxwI{E{*W{eKQ`Pmurs literal 37758 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 a;Qs@~tjG+Lx{PH20000 Date: Fri, 19 Jan 2024 08:28:07 +0900 Subject: [PATCH 07/13] =?UTF-8?q?=EC=9E=84=EC=9D=98=EC=9D=98=20=EA=B8=B8?= =?UTF-8?q?=EC=9D=B4=20write=20=ED=8C=A8=ED=82=B7=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_RB100.js | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/app/modules/robotis_RB100.js b/app/modules/robotis_RB100.js index 9ec6c5d74..8407b889b 100644 --- a/app/modules/robotis_RB100.js +++ b/app/modules/robotis_RB100.js @@ -142,6 +142,7 @@ Module.prototype.requestRemoteData = function(handler) { for (var indexA = 0; indexA < this.dataBuffer.length; indexA++) { // 일반형 if (this.dataBuffer[indexA] != undefined) { + // console.log("indexA: " + indexA + " value: " + this.dataBuffer[indexA]); handler.write(indexA, this.dataBuffer[indexA]); } } @@ -331,8 +332,11 @@ Module.prototype.requestLocalData = function() { sendBuffer = this.writeBytePacket(200, address, value); } else if (length == 2) { sendBuffer = this.writeWordPacket(200, address, value); - } else { + } else if (length == 4) { sendBuffer = this.writeDWordPacket(200, address, value); + } else { + console.log(value); + sendBuffer = this.writeCustomLengthPacket(200, address, value, length); } } else if (instruction == INST_READ) { @@ -607,23 +611,29 @@ Module.prototype.writeDWordPacket = function(id, address, value) { return packet; }; -Module.prototype.writeDWordPacket2 = function(id, address, value, value2) { - //console.log("######### writeDWordPacket2"); +Module.prototype.writeCustomLengthPacket = function(id, address, buf, length) { + //console.log("######### writeCustomLengthPacket"); var packet = []; + var i = 0; packet.push(0xff); packet.push(0xff); packet.push(0xfd); packet.push(0x00); packet.push(id); - packet.push(0x09); + packet.push(length + 5); packet.push(0x00); packet.push(INST_WRITE); packet.push(this.getLowByte(address)); packet.push(this.getHighByte(address)); - packet.push(this.getLowByte(this.getLowWord(value))); - packet.push(this.getHighByte(this.getLowWord(value))); - packet.push(this.getLowByte(this.getLowWord(value2))); - packet.push(this.getHighByte(this.getLowWord(value2))); + console.log(buf); + for (i = 0; i < length; i++) { + console.log(buf[i]); + if (typeof(buf[i]) == "number") { + packet.push(buf[i]); + } else if (typeof(buf[i]) == "string") { + packet.push(buf[i].charCodeAt(0)); + } + } //console.log("packet : " + packet); var crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); From c44f658750370217694b2929e0224ba3c529746c Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 19 Jan 2024 09:06:51 +0900 Subject: [PATCH 08/13] =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_RB100.js | 515 ++++++++++++++--------------- app/modules/robotis_RB100_usb.js | 544 +++++++++++++++---------------- 2 files changed, 515 insertions(+), 544 deletions(-) diff --git a/app/modules/robotis_RB100.js b/app/modules/robotis_RB100.js index 8407b889b..1492b2551 100644 --- a/app/modules/robotis_RB100.js +++ b/app/modules/robotis_RB100.js @@ -1,7 +1,6 @@ function Module() { - isReadDataArrived = true; - isConnected = true; - isTemp = true; // add by kjs 20170824 // is address 21 value 8? + this.isReadDataArrived = true; + this.isConnected = true; this.addressToRead = []; this.varTimeout = null; @@ -55,16 +54,16 @@ Module.prototype.init = function(handler, config) { }; Module.prototype.lostController = function(self, callback) { - self.timer = setInterval(function() { + self.timer = setInterval(() => { if (self.connected) { if (self.received == false) { - if (isConnected == false) { + if (this.isConnected == false) { self.connected = false; if (callback) { callback('lost'); } } - isConnected = false; + this.isConnected = false; } self.received = false; } @@ -73,9 +72,8 @@ Module.prototype.lostController = function(self, callback) { Module.prototype.requestInitialData = function() { //console.log("######### requestInitialData"); - isReadDataArrived = true; - isConnected = true; - isTemp = true; // add by kjs 20170824 + this.isReadDataArrived = true; + this.isConnected = true; this.addressToRead = []; this.varTimeout = null; @@ -95,8 +93,6 @@ Module.prototype.requestInitialData = function() { this.receiveLength = -1; this.defaultLength = -1; - var sendbuffer = null; - //this.touchSensor = 0; this.colorSensor = []; this.temperature = []; @@ -129,7 +125,7 @@ Module.prototype.requestInitialData = function() { }; Module.prototype.checkInitialData = function(data, config) { - console.log("######### checkInitialData"); + console.log('######### checkInitialData'); return true; }; @@ -139,8 +135,7 @@ Module.prototype.validateLocalData = function(data) { }; Module.prototype.requestRemoteData = function(handler) { - - for (var indexA = 0; indexA < this.dataBuffer.length; indexA++) { // 일반형 + for (let indexA = 0; indexA < this.dataBuffer.length; indexA++) { // 일반형 if (this.dataBuffer[indexA] != undefined) { // console.log("indexA: " + indexA + " value: " + this.dataBuffer[indexA]); handler.write(indexA, this.dataBuffer[indexA]); @@ -148,24 +143,23 @@ Module.prototype.requestRemoteData = function(handler) { } //실과형 //console.log("###### value : " + this.detectedSound); - for (var i = 0; i < 4; i++) { - handler.write('TOUCH' + i, this.touchSensor[i]); // 접촉 센서 - handler.write('IR' + i, this.irSensor[i]); // 적외선 센서 - handler.write('LIGHT' + i, this.lightSensor[i]); // 조도 센서 - handler.write('COLOR' + i, this.colorSensor[i]); // 칼라 센서 - handler.write('HUMIDTY' + i, this.humidity[i]); // 습도 센서 - handler.write('TEMPERATURE' + i, this.temperature[i]); // 온도 센서 + for (let i = 0; i < 4; i++) { + handler.write(`TOUCH${i}`, this.touchSensor[i]); // 접촉 센서 + handler.write(`IR${i}`, this.irSensor[i]); // 적외선 센서 + handler.write(`LIGHT${i}`, this.lightSensor[i]); // 조도 센서 + handler.write(`COLOR${i}`, this.colorSensor[i]); // 칼라 센서 + handler.write(`HUMIDTY${i}`, this.humidity[i]); // 습도 센서 + handler.write(`TEMPERATURE${i}`, this.temperature[i]); // 온도 센서 } handler.write('DETECTEDSOUNDE', this.detectedSound); // 최종 소리 감지 횟수 handler.write('DETECTINGSOUNDE1', this.detectringSound); // 실시간 소리 감지 횟수 handler.write('USERBUTTONSTATE', this.userButtonState); - }; Module.prototype.handleRemoteData = function(handler) { - var data = handler.read('ROBOTIS_DATA'); + const data = handler.read('ROBOTIS_DATA'); - var setZero = handler.read('setZero'); + const setZero = handler.read('setZero'); if (setZero[0] == 1) { this.robotisBuffer = []; @@ -181,19 +175,18 @@ Module.prototype.handleRemoteData = function(handler) { this.servoPrevAddres4 = []; // add by kjs 20170627 this.servoPrevLength4 = []; // add by kjs 20170627 this.servoPrevValue4 = []; // add by kjs 20170627 - } - for (var index = 0; index < data.length; index++) { - var instruction = data[index][0]; - var address = data[index][1]; - var length = data[index][2]; - var value = data[index][3]; - var doSend = false; - //console.log("###2 : " + address + " and : " + value + " instruction : " + instruction + " length : " + length); + for (let index = 0; index < data.length; index++) { + const instruction = data[index][0]; + const address = data[index][1]; + const length = data[index][2]; + const value = data[index][3]; + let doSend = false; + //console.log("###2 : " + address + " and : " + value + " inst : " + instruction + " length : " + length); if (instruction == INST_NONE) { doSend = false; } else if (instruction == INST_READ) { - if (isReadDataArrived == false && + if (this.isReadDataArrived == false && this.prevInstruction == INST_READ && this.prevAddress == address && this.prevLength == length && @@ -203,7 +196,7 @@ Module.prototype.handleRemoteData = function(handler) { doSend = true; } } else if (instruction == INST_BYPASS_READ) { - if (isReadDataArrived == false && + if (this.isReadDataArrived == false && this.prevInstruction == INST_BYPASS_READ && this.prevAddress == address && this.prevLength == length && @@ -215,7 +208,7 @@ Module.prototype.handleRemoteData = function(handler) { } //console.log("dosend : " + doSend); if (doSend) { - for (var indexA = 0; indexA < this.robotisBuffer.length; indexA++) { + for (let indexA = 0; indexA < this.robotisBuffer.length; indexA++) { if (data[index][0] == this.robotisBuffer[indexA][0] && data[index][1] == this.robotisBuffer[indexA][1] && data[index][2] == this.robotisBuffer[indexA][2] && @@ -225,9 +218,13 @@ Module.prototype.handleRemoteData = function(handler) { } } } - if(instruction == INST_WRITE || instruction == 4 || instruction == 5 || instruction == 6 || instruction == INST_BYPASS_WRITE) { - doSend = true; - } + if (instruction == INST_WRITE || + instruction == 4 || + instruction == 5 || + instruction == 6 || + instruction == INST_BYPASS_WRITE) { + doSend = true; + } if (!doSend) { continue; } @@ -258,7 +255,11 @@ Module.prototype.handleRemoteData = function(handler) { this.prevServoSet(address, value, length); } - if (instruction == INST_WRITE || instruction == INST_DXL_SYNCWRITE || instruction == INST_DXL_REGWRITE || instruction == INST_DXL_ACTION || instruction == INST_BYPASS_WRITE) { + if (instruction == INST_WRITE || + instruction == INST_DXL_SYNCWRITE || + instruction == INST_DXL_REGWRITE || + instruction == INST_DXL_ACTION || + instruction == INST_BYPASS_WRITE) { this.robotisBuffer.push(data[index]); if (instruction == INST_WRITE) { // 만약 bypass mode를 enable 한다고 하면 @@ -283,49 +284,29 @@ Module.prototype.handleRemoteData = function(handler) { }; Module.prototype.requestLocalData = function() { - var sendBuffer = null; - var dataLength = 0; - if (isReadDataArrived == false) { + let sendBuffer = null; + let dataLength = 0; + if (this.isReadDataArrived == false) { //console.log("######## 1"); return sendBuffer; } ///////////////// - isConnected = true; - if (!isConnected) { + this.isConnected = true; + if (!this.isConnected) { this.receiveAddress = -1; return this.readPacket(200, 0, 2); } - if (!isTemp) { // add by kjs 20170824 - sendBuffer = this.writeBytePacket(200, 21, 8); - - dataLength = this.makeWord(sendBuffer[5], sendBuffer[6]); - if (sendBuffer[7] == 0x02) { - this.receiveAddress = 21; - this.receiveLength = 1; - this.defaultLength = 1; - isReadDataArrived = false; - - if (this.varTimeout != null) { - clearTimeout(this.varTimeout); - } - - this.varTimeout = setTimeout(function() { - isReadDataArrived = true; - }, 100); - } - isTemp = true; - } else { - - var data = this.robotisBuffer.shift(); + { + const data = this.robotisBuffer.shift(); if (data == null) { return sendBuffer; } - var instruction = data[0]; - var address = data[1]; - var length = data[2]; - var value = data[3]; - var value_2 = data[4]; + const instruction = data[0]; + const address = data[1]; + const length = data[2]; + let value = data[3]; + const value2 = data[4]; //console.log('send address : ' + address + ', ' + value + ", " + length); // add by kjs 170426 if (instruction == INST_WRITE) { if (length == 1) { @@ -338,49 +319,46 @@ Module.prototype.requestLocalData = function() { console.log(value); sendBuffer = this.writeCustomLengthPacket(200, address, value, length); } - } else if (instruction == INST_READ) { this.addressToRead[address] = 0; sendBuffer = this.readPacket(200, address, length); } else if (instruction == INST_DXL_SYNCWRITE) { //function(ids, address, rLength, values) - //isReadDataArrived = true; - var ids = data[4]; + //this.isReadDataArrived = true; + const ids = data[4]; value = data[5]; - var tmpSendBuffer = this.dxlSyncWritePacket(ids, address, length, value); - var tmp = []; - for(let j = 0; j < tmpSendBuffer / 20; j++){ - for(let i = j*20; i < j*20+20; i++) { + const tmpSendBuffer = this.dxlSyncWritePacket(ids, address, length, value); + const tmp = []; + for (let j = 0; j < tmpSendBuffer / 20; j++) { + for (let i = j * 20; i < j * 20 + 20; i++) { tmp.push(tmpSendBuffer[i]); } sendBuffer.push(tmp); } sendBuffer = this.dxlSyncWritePacket(ids, address, length, value); - } else if(instruction == INST_DXL_REGWRITE) { - var ids = data[4]; + } else if (instruction == INST_DXL_REGWRITE) { + const ids = data[4]; sendBuffer = this.dxlRegWritePacket(ids[0], address, length, value); - } else if(instruction == INST_DXL_ACTION) { + } else if (instruction == INST_DXL_ACTION) { sendBuffer = this.dxlActionWrite(); - } else if(instruction == INST_BYPASS_READ) { - var id = value; + } else if (instruction == INST_BYPASS_READ) { + const id = value; this.addressToRead[address] = 0; sendBuffer = this.readPacket(id, address, length); - } else if(instruction == INST_BYPASS_WRITE) { - var id = value; + } else if (instruction == INST_BYPASS_WRITE) { + const id = value; this.addressToRead[address] = 0; if (length == 1) { - sendBuffer = this.writeBytePacket(id, address, value_2); - } - else if (length == 2) { - sendBuffer = this.writeWordPacket(id, address, value_2); - } - else { - sendBuffer = this.writeDWordPacket(id, address, value_2); + sendBuffer = this.writeBytePacket(id, address, value2); + } else if (length == 2) { + sendBuffer = this.writeWordPacket(id, address, value2); + } else { + sendBuffer = this.writeDWordPacket(id, address, value2); } } - console.log("send buffer : " + sendBuffer) + console.log(`send buffer : ${sendBuffer}`); if (sendBuffer[0] == 0xFF && sendBuffer[1] == 0xFF && sendBuffer[2] == 0xFD && @@ -394,115 +372,125 @@ Module.prototype.requestLocalData = function() { this.receiveAddress = address; this.receiveLength = length; this.defaultLength = data[2]; - isReadDataArrived = false; + this.isReadDataArrived = false; if (this.varTimeout != null) { clearTimeout(this.varTimeout); } - this.varTimeout = setTimeout(function () { - isReadDataArrived = true; + this.varTimeout = setTimeout(() => { + this.isReadDataArrived = true; }, 100); } } } return sendBuffer; }; -Module.prototype.packetChecker = function (data) { - if(data[0] == 0xFF && data[1] == 0xFF && data[2] == 0xFD) - { +Module.prototype.packetChecker = function(data) { + if (data[0] == 0xFF && data[1] == 0xFF && data[2] == 0xFD) { return true; - }else - { + } else { return false; } }; Module.prototype.handleLocalData = function(data) { // data: Native Buffer - for (var i = 0; i < data.length; i++) { - this.receiveBuffer.push(data[i]); - } - - if (this.receiveBuffer.length >= 11 + this.receiveLength) { - isConnected = true; - // console.log('<< 1 : ' + this.receiveLength + ' : ' + this.receiveBuffer); - - // while (this.receiveBuffer.length > 0) { - while (this.receiveBuffer.length >= 11) { - if (this.receiveBuffer.shift() == 0xFF) { - if (this.receiveBuffer.shift() == 0xFF) { - if (this.receiveBuffer.shift() == 0xFD) { - if (this.receiveBuffer.shift() == 0x00) { - var id = this.receiveBuffer.shift(); - if (id == 0xC8 || + for (let i = 0; i < data.length; i++) { + this.receiveBuffer.push(data[i]); + } + + if (this.receiveBuffer.length >= 11 + this.receiveLength) { + this.isConnected = true; + // console.log('<< 1 : ' + this.receiveLength + ' : ' + this.receiveBuffer); + + // while (this.receiveBuffer.length > 0) { + while (this.receiveBuffer.length >= 11) { + if (this.receiveBuffer.shift() == 0xFF) { + if (this.receiveBuffer.shift() == 0xFF) { + if (this.receiveBuffer.shift() == 0xFD) { + if (this.receiveBuffer.shift() == 0x00) { + const id = this.receiveBuffer.shift(); + if (id == 0xC8 || (id >= 100 && id <= 119) || (id >= 1 && id <= 63)) { - var packetLength = this.makeWord(this.receiveBuffer.shift(), this.receiveBuffer.shift()); - // if (packetLength > 4) { - // console.log("?? : " + this.receiveLength + ' / ' + (packetLength - 4)); - if (this.receiveLength == (packetLength - 4)) { - this.receiveBuffer.shift(); // take 0x55 - status check byte - this.receiveBuffer.shift(); // take 0x00 - error check byte - - var valueLength = packetLength - 4; - var returnValue = []; - var tmpValue = 0; - for (var index = 0; index < valueLength / this.defaultLength; index++) { - if (this.defaultLength == 1) { - tmpValue = this.receiveBuffer.shift() + const packetLength = this.makeWord(this.receiveBuffer.shift(), + this.receiveBuffer.shift()); + // if (packetLength > 4) { + // console.log("?? : " + this.receiveLength + ' / ' + (packetLength - 4)); + if (this.receiveLength == (packetLength - 4)) { + this.receiveBuffer.shift(); // take 0x55 - status check byte + this.receiveBuffer.shift(); // take 0x00 - error check byte + + const valueLength = packetLength - 4; + const returnValue = []; + let tmpValue = 0; + for (let index = 0; index < valueLength / this.defaultLength; index++) { + if (this.defaultLength == 1) { + tmpValue = this.receiveBuffer.shift(); returnValue.push(tmpValue); - // returnValue.push(this.receiveBuffer.shift()); - } else if (this.defaultLength == 2) { + // returnValue.push(this.receiveBuffer.shift()); + } else if (this.defaultLength == 2) { tmpValue = this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8); - if(tmpValue > 60000) { + if (tmpValue > 60000) { tmpValue = tmpValue - 65536; } returnValue.push(tmpValue); - //returnValue.push(this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8)); - } else if (this.defaultLength == 4) { - tmpValue = this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8) | (this.receiveBuffer.shift() << 16) | (this.receiveBuffer.shift() << 24); + } else if (this.defaultLength == 4) { + tmpValue = this.receiveBuffer.shift() | + (this.receiveBuffer.shift() << 8) | + (this.receiveBuffer.shift() << 16) | + (this.receiveBuffer.shift() << 24); returnValue.push(tmpValue); - // returnValue.push(this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8) | (this.receiveBuffer.shift() << 16) | (this.receiveBuffer.shift() << 24)); - } - } - - if (this.receiveAddress != -1) { - if (this.varTimeout != null) { - clearTimeout(this.varTimeout); - } - - for (var index = 0; index < returnValue.length; index++) { - this.dataBuffer[this.receiveAddress + index * this.defaultLength] = returnValue[index]; - } - - isReadDataArrived = true; - // console.log('<- ' + new Date().getHours() + ':' + new Date().getMinutes() + ':' + new Date().getMilliseconds() + '\n' - // + this.receiveAddress + ' : ' + returnValue); - } else { - // console.log('<- ' + new Date().getHours() + ':' + new Date().getMinutes() + ':' + new Date().getMilliseconds() + '\n' + '-1'); - } - - this.receiveBuffer.shift(); // take crc check byte - this.receiveBuffer.shift(); // take crc check byte - - // break because this packet has no error. - break; - } else { - for (var i = 0; i < packetLength; i++) { - this.receiveBuffer.shift(); // take bytes of write status - } - } - } - } - } - } - } - } - } + } + } + + if (this.receiveAddress != -1) { + if (this.varTimeout != null) { + clearTimeout(this.varTimeout); + } + + for (let index = 0; index < returnValue.length; index++) { + this.dataBuffer[this.receiveAddress + index * this.defaultLength] = + returnValue[index]; + } + + this.isReadDataArrived = true; + /* + console.log('<- ' + + new Date().getHours() + ':' + + new Date().getMinutes() + ':' + + new Date().getMilliseconds() + '\n' + + this.receiveAddress + ' : ' + returnValue); + */ + } else { + /* + console.log('<- ' + + new Date().getHours() + ':' + + new Date().getMinutes() + ':' + + new Date().getMilliseconds() + '\n' + '-1'); + */ + } + + this.receiveBuffer.shift(); // take crc check byte + this.receiveBuffer.shift(); // take crc check byte + + // break because this packet has no error. + break; + } else { + for (let i = 0; i < packetLength; i++) { + this.receiveBuffer.shift(); // take bytes of write status + } + } + } + } + } + } + } + } + } }; Module.prototype.reset = function() { - this.addressToRead = []; this.varTimeout = null; @@ -534,21 +522,18 @@ Module.prototype.reset = function() { module.exports = new Module(); -var INST_NONE = 0; -var INST_READ = 2; -var INST_WRITE = 3; -var INST_DXL_SYNCWRITE = 4; -var INST_DXL_REGWRITE = 5; -var INST_DXL_ACTION = 6; -var INST_BYPASS_READ = 0xA2; -var INST_BYPASS_WRITE = 0xA3; - -var isReadDataArrived = true; -var isConnected = true; +const INST_NONE = 0; +const INST_READ = 2; +const INST_WRITE = 3; +const INST_DXL_SYNCWRITE = 4; +const INST_DXL_REGWRITE = 5; +const INST_DXL_ACTION = 6; +const INST_BYPASS_READ = 0xA2; +const INST_BYPASS_WRITE = 0xA3; Module.prototype.writeBytePacket = function(id, address, value) { - console.log("######### writeBytepacket"); - var packet = []; + console.log('######### writeBytepacket'); + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -560,15 +545,15 @@ Module.prototype.writeBytePacket = function(id, address, value) { packet.push(this.getLowByte(address)); packet.push(this.getHighByte(address)); packet.push(value); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; Module.prototype.writeWordPacket = function(id, address, value) { - console.log("######### writeWordPacket"); - var packet = []; + console.log('######### writeWordPacket'); + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -581,15 +566,15 @@ Module.prototype.writeWordPacket = function(id, address, value) { packet.push(this.getHighByte(address)); packet.push(this.getLowByte(value)); packet.push(this.getHighByte(value)); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; Module.prototype.writeDWordPacket = function(id, address, value) { - console.log("######### writeDWordPacket"); - var packet = []; + console.log('######### writeDWordPacket'); + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -604,8 +589,8 @@ Module.prototype.writeDWordPacket = function(id, address, value) { packet.push(this.getHighByte(this.getLowWord(value))); packet.push(this.getLowByte(this.getHighWord(value))); packet.push(this.getHighByte(this.getHighWord(value))); - console.log("packet : " + packet); - var crc = this.updateCRC(0, packet, packet.length); + console.log(`packet : ${packet}`); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; @@ -613,8 +598,8 @@ Module.prototype.writeDWordPacket = function(id, address, value) { Module.prototype.writeCustomLengthPacket = function(id, address, buf, length) { //console.log("######### writeCustomLengthPacket"); - var packet = []; - var i = 0; + const packet = []; + let i = 0; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -628,26 +613,28 @@ Module.prototype.writeCustomLengthPacket = function(id, address, buf, length) { console.log(buf); for (i = 0; i < length; i++) { console.log(buf[i]); - if (typeof(buf[i]) == "number") { + if (typeof(buf[i]) == 'number') { packet.push(buf[i]); - } else if (typeof(buf[i]) == "string") { + } else if (typeof(buf[i]) == 'string') { packet.push(buf[i].charCodeAt(0)); } } //console.log("packet : " + packet); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; Module.prototype.dxlRegWritePacket = function(id, address, length, value) { - var packet = []; - var paramLength = length + 5; + const packet = []; + const paramLength = length + 5; + let tmp1 = 0; + let tmp2 = 0; packet.push(0xff); - packet.push(0xff); - packet.push(0xfd); + packet.push(0xff); + packet.push(0xfd); packet.push(0x00); packet.push(this.getLowByte(id)); @@ -659,7 +646,7 @@ Module.prototype.dxlRegWritePacket = function(id, address, length, value) { packet.push(this.getLowByte(address)); packet.push(this.getHighByte(address)); - switch(length) { + switch (length) { case 1: packet.push(this.getLowByte(value)); break; @@ -672,29 +659,29 @@ Module.prototype.dxlRegWritePacket = function(id, address, length, value) { packet.push(this.getHighByte(this.getHighWord(value))); break; case 8: - var tmpV_1 = value / 4294967296; - var tmpV_2 = value % 4294967296; - - packet.push(this.getLowByte(this.getLowWord(tmpV_1))); - packet.push(this.getHighByte(this.getLowWord(tmpV_1))); - packet.push(this.getLowByte(this.getHighWord(tmpV_1))); - packet.push(this.getHighByte(this.getHighWord(tmpV_1))); - - packet.push(this.getLowByte(this.getLowWord(tmpV_2))); - packet.push(this.getHighByte(this.getLowWord(tmpV_2))); - packet.push(this.getLowByte(this.getHighWord(tmpV_2))); - packet.push(this.getHighByte(this.getHighWord(tmpV_2))); + tmp1 = value / 4294967296; + tmp2 = value % 4294967296; + + packet.push(this.getLowByte(this.getLowWord(tmp1))); + packet.push(this.getHighByte(this.getLowWord(tmp1))); + packet.push(this.getLowByte(this.getHighWord(tmp1))); + packet.push(this.getHighByte(this.getHighWord(tmp1))); + + packet.push(this.getLowByte(this.getLowWord(tmp2))); + packet.push(this.getHighByte(this.getLowWord(tmp2))); + packet.push(this.getLowByte(this.getHighWord(tmp2))); + packet.push(this.getHighByte(this.getHighWord(tmp2))); break; } - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); - return packet; -} + return packet; +}; Module.prototype.dxlActionWrite = function() { - var packet = []; + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -707,36 +694,36 @@ Module.prototype.dxlActionWrite = function() { packet.push(0x05); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); - return packet; -} + return packet; +}; Module.prototype.dxlSyncWritePacket = function(ids, address, rLength, values) { - var packet = []; - var paramLength = 7 + ids.length * (rLength + 1); + const packet = []; + const paramLength = 7 + ids.length * (rLength + 1); - packet.push(0xff); - packet.push(0xff); - packet.push(0xfd); - packet.push(0x00); - packet.push(0xfe); + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + packet.push(0xfe); - packet.push(this.getLowByte(paramLength)); - packet.push(this.getHighByte(paramLength)); + packet.push(this.getLowByte(paramLength)); + packet.push(this.getHighByte(paramLength)); - packet.push(0x83); + packet.push(0x83); - packet.push(this.getLowByte(address)); - packet.push(this.getHighByte(address)); + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); - packet.push(this.getLowByte(rLength)); - packet.push(this.getHighByte(rLength)); + packet.push(this.getLowByte(rLength)); + packet.push(this.getHighByte(rLength)); - for(let i = 0; i < ids.length; i++) { + for (let i = 0; i < ids.length; i++) { packet.push(this.getLowByte(ids[i])); - switch(rLength) { + switch (rLength) { case 1: packet.push(this.getLowByte(values[i])); break; @@ -749,15 +736,13 @@ Module.prototype.dxlSyncWritePacket = function(ids, address, rLength, values) { packet.push(this.getHighByte(this.getHighWord(values[i]))); break; } - - - } + } - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); - return packet; -} + return packet; +}; Module.prototype.prevServoCompare = function(address, value, length) { if ((address >= 108 && address <= 111) && value == 7) { //Module @@ -765,7 +750,7 @@ Module.prototype.prevServoCompare = function(address, value, length) { this.servoPrevAddres == address && this.servoPrevLength == length && this.servoPrevValue == value) { - doSend = false; + //doSend = false; return true; } } @@ -775,7 +760,7 @@ Module.prototype.prevServoCompare = function(address, value, length) { this.servoPrevAddres2 == address && this.servoPrevLength2 == length && this.servoPrevValue2 == value) { - doSend = false; + //doSend = false; return true; } } @@ -785,7 +770,7 @@ Module.prototype.prevServoCompare = function(address, value, length) { this.servoPrevAddres3 == address && this.servoPrevLength3 == length && this.servoPrevValue3 == value) { - doSend = false; + //doSend = false; return true; } } @@ -795,12 +780,11 @@ Module.prototype.prevServoCompare = function(address, value, length) { this.servoPrevAddres4 == address && this.servoPrevLength4 == length && this.servoPrevValue4 == value) { - doSend = false; + //doSend = false; return true; } } - -} +}; Module.prototype.prevServoSet = function(address, value, length) { if ((address >= 108 && address <= 111) && value == 7) { //Module @@ -826,12 +810,11 @@ Module.prototype.prevServoSet = function(address, value, length) { this.servoPrevLength4 = length; this.servoPrevValue4 = value; } - -} +}; Module.prototype.readPacket = function(id, address, lengthToRead) { //console.log("######### readPacket"); - var packet = []; + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -844,13 +827,13 @@ Module.prototype.readPacket = function(id, address, lengthToRead) { packet.push(this.getHighByte(address)); packet.push(this.getLowByte(lengthToRead)); packet.push(this.getHighByte(lengthToRead)); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; -var crc_table = [0x0000, +const crcTable = [0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011, 0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022, 0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, @@ -887,7 +870,7 @@ var crc_table = [0x0000, 0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261, 0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231, 0x8213, 0x0216, 0x021C, 0x8219, 0x0208, - 0x820D, 0x8207, 0x0202 + 0x820D, 0x8207, 0x0202, ]; Module.prototype.makeWord = function(a, b) { @@ -910,13 +893,15 @@ Module.prototype.getHighWord = function(a) { return ((a >> 16) & 0xffff); }; -Module.prototype.updateCRC = function(crc_accum, data_blk_ptr, data_blk_size) { - var i, j; +Module.prototype.updateCRC = function(crcAccum, dataBlkPtr, dataBlkSize) { + let i = 0; + let j = 0; + let crc = crcAccum; - for (j = 0; j < data_blk_size; j++) { - i = ((crc_accum >> 8) ^ data_blk_ptr[j]) & 0xff; - crc_accum = (crc_accum << 8) ^ crc_table[i]; + for (j = 0; j < dataBlkSize; j++) { + i = ((crc >> 8) ^ dataBlkPtr[j]) & 0xff; + crc = (crc << 8) ^ crcTable[i]; } - return crc_accum; -}; \ No newline at end of file + return crc; +}; diff --git a/app/modules/robotis_RB100_usb.js b/app/modules/robotis_RB100_usb.js index d53101c34..dd2160877 100644 --- a/app/modules/robotis_RB100_usb.js +++ b/app/modules/robotis_RB100_usb.js @@ -1,7 +1,7 @@ function Module() { - isReadDataArrived = true; - isConnected = true; - isTemp = true; // add by kjs 20170824 // is address 21 value 8? + this.isReadDataArrived = true; + this.isConnected = true; + //isTemp = true; // add by kjs 20170824 // is address 21 value 8? this.addressToRead = []; this.varTimeout = null; @@ -50,21 +50,21 @@ function Module() { } Module.prototype.init = function(handler, config) { - //console.log("######### init"); + //console.log('######### init'); }; Module.prototype.lostController = function(self, callback) { - self.timer = setInterval(function() { + self.timer = setInterval(() => { if (self.connected) { if (self.received == false) { - if (isConnected == false) { + if (this.isConnected == false) { self.connected = false; if (callback) { callback('lost'); } } - isConnected = false; + this.isConnected = false; } self.received = false; } @@ -72,10 +72,10 @@ Module.prototype.lostController = function(self, callback) { }; Module.prototype.requestInitialData = function() { - //console.log("######### requestInitialData"); - isReadDataArrived = true; - isConnected = true; - isTemp = true; // add by kjs 20170824 + //console.log('######### requestInitialData'); + this.isReadDataArrived = true; + this.isConnected = true; + //isTemp = true; // add by kjs 20170824 this.addressToRead = []; this.varTimeout = null; @@ -95,8 +95,6 @@ Module.prototype.requestInitialData = function() { this.receiveLength = -1; this.defaultLength = -1; - var sendbuffer = null; - //this.touchSensor = 0; this.colorSensor = []; this.temperature = []; @@ -129,7 +127,7 @@ Module.prototype.requestInitialData = function() { }; Module.prototype.checkInitialData = function(data, config) { - console.log("######### checkInitialData"); + console.log('######### checkInitialData'); return true; }; @@ -139,32 +137,30 @@ Module.prototype.validateLocalData = function(data) { }; Module.prototype.requestRemoteData = function(handler) { - - for (var indexA = 0; indexA < this.dataBuffer.length; indexA++) { // 일반형 + for (let indexA = 0; indexA < this.dataBuffer.length; indexA++) { // 일반형 if (this.dataBuffer[indexA] != undefined) { handler.write(indexA, this.dataBuffer[indexA]); } } //실과형 - //console.log("###### value : " + this.detectedSound); - for (var i = 0; i < 4; i++) { - handler.write('TOUCH' + i, this.touchSensor[i]); // 접촉 센서 - handler.write('IR' + i, this.irSensor[i]); // 적외선 센서 - handler.write('LIGHT' + i, this.lightSensor[i]); // 조도 센서 - handler.write('COLOR' + i, this.colorSensor[i]); // 칼라 센서 - handler.write('HUMIDTY' + i, this.humidity[i]); // 습도 센서 - handler.write('TEMPERATURE' + i, this.temperature[i]); // 온도 센서 + //console.log('###### value : ' + this.detectedSound); + for (let i = 0; i < 4; i++) { + handler.write(`TOUCH${i}`, this.touchSensor[i]); // 접촉 센서 + handler.write(`IR${i}`, this.irSensor[i]); // 적외선 센서 + handler.write(`LIGHT${i}`, this.lightSensor[i]); // 조도 센서 + handler.write(`COLOR${i}`, this.colorSensor[i]); // 칼라 센서 + handler.write(`HUMIDTY${i}`, this.humidity[i]); // 습도 센서 + handler.write(`TEMPERATURE${i}`, this.temperature[i]); // 온도 센서 } handler.write('DETECTEDSOUNDE', this.detectedSound); // 최종 소리 감지 횟수 handler.write('DETECTINGSOUNDE1', this.detectringSound); // 실시간 소리 감지 횟수 handler.write('USERBUTTONSTATE', this.userButtonState); - }; Module.prototype.handleRemoteData = function(handler) { - var data = handler.read('ROBOTIS_DATA'); + const data = handler.read('ROBOTIS_DATA'); - var setZero = handler.read('setZero'); + const setZero = handler.read('setZero'); if (setZero[0] == 1) { this.robotisBuffer = []; @@ -180,19 +176,18 @@ Module.prototype.handleRemoteData = function(handler) { this.servoPrevAddres4 = []; // add by kjs 20170627 this.servoPrevLength4 = []; // add by kjs 20170627 this.servoPrevValue4 = []; // add by kjs 20170627 - } - for (var index = 0; index < data.length; index++) { - var instruction = data[index][0]; - var address = data[index][1]; - var length = data[index][2]; - var value = data[index][3]; - var doSend = false; - //console.log("###2 : " + address + " and : " + value + " instruction : " + instruction + " length : " + length); + for (let index = 0; index < data.length; index++) { + const instruction = data[index][0]; + const address = data[index][1]; + const length = data[index][2]; + const value = data[index][3]; + let doSend = false; + //console.log('###2 : ' + address + ' and : ' + value + ' inst : ' + instruction + ' length : ' + length); if (instruction == INST_NONE) { doSend = false; } else if (instruction == INST_READ) { - if (isReadDataArrived == false && + if (this.isReadDataArrived == false && this.prevInstruction == INST_READ && this.prevAddress == address && this.prevLength == length && @@ -202,7 +197,7 @@ Module.prototype.handleRemoteData = function(handler) { doSend = true; } } else if (instruction == INST_BYPASS_READ) { - if (isReadDataArrived == false && + if (this.isReadDataArrived == false && this.prevInstruction == INST_BYPASS_READ && this.prevAddress == address && this.prevLength == length && @@ -212,9 +207,9 @@ Module.prototype.handleRemoteData = function(handler) { doSend = true; } } - //console.log("dosend : " + doSend); + //console.log('dosend : ' + doSend); if (doSend) { - for (var indexA = 0; indexA < this.robotisBuffer.length; indexA++) { + for (let indexA = 0; indexA < this.robotisBuffer.length; indexA++) { if (data[index][0] == this.robotisBuffer[indexA][0] && data[index][1] == this.robotisBuffer[indexA][1] && data[index][2] == this.robotisBuffer[indexA][2] && @@ -224,9 +219,13 @@ Module.prototype.handleRemoteData = function(handler) { } } } - if(instruction == INST_WRITE || instruction == 4 || instruction == 5 || instruction == 6 || instruction == INST_BYPASS_WRITE) { - doSend = true; - } + if (instruction == INST_WRITE || + instruction == 4 || + instruction == 5 || + instruction == 6 || + instruction == INST_BYPASS_WRITE) { + doSend = true; + } if (!doSend) { continue; } @@ -257,7 +256,11 @@ Module.prototype.handleRemoteData = function(handler) { this.prevServoSet(address, value, length); } - if (instruction == INST_WRITE || instruction == INST_DXL_SYNCWRITE || instruction == INST_DXL_REGWRITE || instruction == INST_DXL_ACTION || instruction == INST_BYPASS_WRITE) { + if (instruction == INST_WRITE || + instruction == INST_DXL_SYNCWRITE || + instruction == INST_DXL_REGWRITE || + instruction == INST_DXL_ACTION || + instruction == INST_BYPASS_WRITE) { this.robotisBuffer.push(data[index]); if (instruction == INST_WRITE) { // 만약 bypass mode를 enable 한다고 하면 @@ -267,7 +270,6 @@ Module.prototype.handleRemoteData = function(handler) { } } } else if (instruction == INST_READ || instruction == INST_BYPASS_READ) { - if (this.addressToRead[address] == undefined || this.addressToRead[address] == 0) { this.addressToRead[address] = 1; this.robotisBuffer.push(data[index]); @@ -283,50 +285,30 @@ Module.prototype.handleRemoteData = function(handler) { }; Module.prototype.requestLocalData = function() { - var sendBuffer = null; - var dataLength = 0; - if (isReadDataArrived == false) { - //console.log("######## 1"); + let sendBuffer = null; + let dataLength = 0; + if (this.isReadDataArrived == false) { + //console.log('######## 1'); return sendBuffer; } ///////////////// - isConnected = true; - if (!isConnected) { + this.isConnected = true; + if (!this.isConnected) { this.receiveAddress = -1; return this.readPacket(200, 0, 2); } - if (!isTemp) { // add by kjs 20170824 - sendBuffer = this.writeBytePacket(200, 21, 8); - - dataLength = this.makeWord(sendBuffer[5], sendBuffer[6]); - if (sendBuffer[7] == 0x02) { - this.receiveAddress = 21; - this.receiveLength = 1; - this.defaultLength = 1; - isReadDataArrived = false; - - if (this.varTimeout != null) { - clearTimeout(this.varTimeout); - } - - this.varTimeout = setTimeout(function() { - isReadDataArrived = true; - }, 100); - } - isTemp = true; - } else { - - var data = this.robotisBuffer.shift(); + { + const data = this.robotisBuffer.shift(); if (data == null) { return sendBuffer; } - var instruction = data[0]; - var address = data[1]; - var length = data[2]; - var value = data[3]; - var value_2 = data[4]; - //console.log('send address : ' + address + ', ' + value + ", " + length); // add by kjs 170426 + const instruction = data[0]; + const address = data[1]; + const length = data[2]; + let value = data[3]; + const value2 = data[4]; + //console.log('send address : ' + address + ', ' + value + ', ' + length); // add by kjs 170426 if (instruction == INST_WRITE) { if (length == 1) { sendBuffer = this.writeBytePacket(200, address, value); @@ -335,49 +317,46 @@ Module.prototype.requestLocalData = function() { } else { sendBuffer = this.writeDWordPacket(200, address, value); } - } else if (instruction == INST_READ) { this.addressToRead[address] = 0; sendBuffer = this.readPacket(200, address, length); } else if (instruction == INST_DXL_SYNCWRITE) { //function(ids, address, rLength, values) - //isReadDataArrived = true; - var ids = data[4]; + //this.isReadDataArrived = true; + const ids = data[4]; value = data[5]; - var tmpSendBuffer = this.dxlSyncWritePacket(ids, address, length, value); - var tmp = []; - for(let j = 0; j < tmpSendBuffer / 20; j++){ - for(let i = j*20; i < j*20+20; i++) { + const tmpSendBuffer = this.dxlSyncWritePacket(ids, address, length, value); + const tmp = []; + for (let j = 0; j < tmpSendBuffer / 20; j++) { + for (let i = j * 20; i < j * 20 + 20; i++) { tmp.push(tmpSendBuffer[i]); } sendBuffer.push(tmp); } sendBuffer = this.dxlSyncWritePacket(ids, address, length, value); - } else if(instruction == INST_DXL_REGWRITE) { - var ids = data[4]; + } else if (instruction == INST_DXL_REGWRITE) { + const ids = data[4]; sendBuffer = this.dxlRegWritePacket(ids[0], address, length, value); - } else if(instruction == INST_DXL_ACTION) { + } else if (instruction == INST_DXL_ACTION) { sendBuffer = this.dxlActionWrite(); - } else if(instruction == INST_BYPASS_READ) { - var id = value; + } else if (instruction == INST_BYPASS_READ) { + const id = value; this.addressToRead[address] = 0; sendBuffer = this.readPacket(id, address, length); - } else if(instruction == INST_BYPASS_WRITE) { - var id = value; + } else if (instruction == INST_BYPASS_WRITE) { + const id = value; this.addressToRead[address] = 0; if (length == 1) { - sendBuffer = this.writeBytePacket(id, address, value_2); - } - else if (length == 2) { - sendBuffer = this.writeWordPacket(id, address, value_2); - } - else { - sendBuffer = this.writeDWordPacket(id, address, value_2); + sendBuffer = this.writeBytePacket(id, address, value2); + } else if (length == 2) { + sendBuffer = this.writeWordPacket(id, address, value2); + } else { + sendBuffer = this.writeDWordPacket(id, address, value2); } } - console.log("send buffer : " + sendBuffer) + console.log(`send buffer : ${sendBuffer}`); if (sendBuffer[0] == 0xFF && sendBuffer[1] == 0xFF && sendBuffer[2] == 0xFD && @@ -391,122 +370,132 @@ Module.prototype.requestLocalData = function() { this.receiveAddress = address; this.receiveLength = length; this.defaultLength = data[2]; - isReadDataArrived = false; + this.isReadDataArrived = false; if (this.varTimeout != null) { clearTimeout(this.varTimeout); } - this.varTimeout = setTimeout(function () { - isReadDataArrived = true; + this.varTimeout = setTimeout(() => { + this.isReadDataArrived = true; }, 100); } } } return sendBuffer; }; -Module.prototype.packetChecker = function (data) { - if(data[0] == 0xFF && data[1] == 0xFF && data[2] == 0xFD) - { +Module.prototype.packetChecker = function(data) { + if (data[0] == 0xFF && data[1] == 0xFF && data[2] == 0xFD) { return true; - }else - { + } else { return false; } }; Module.prototype.handleLocalData = function(data) { // data: Native Buffer - for (var i = 0; i < data.length; i++) { - this.receiveBuffer.push(data[i]); - } - - if (this.receiveBuffer.length >= 11 + this.receiveLength) { - isConnected = true; - // console.log('<< 1 : ' + this.receiveLength + ' : ' + this.receiveBuffer); - - // while (this.receiveBuffer.length > 0) { - while (this.receiveBuffer.length >= 11) { - if (this.receiveBuffer.shift() == 0xFF) { - if (this.receiveBuffer.shift() == 0xFF) { - if (this.receiveBuffer.shift() == 0xFD) { - if (this.receiveBuffer.shift() == 0x00) { - var id = this.receiveBuffer.shift(); - if (id == 0xC8 || + for (let i = 0; i < data.length; i++) { + this.receiveBuffer.push(data[i]); + } + + if (this.receiveBuffer.length >= 11 + this.receiveLength) { + this.isConnected = true; + // console.log('<< 1 : ' + this.receiveLength + ' : ' + this.receiveBuffer); + + // while (this.receiveBuffer.length > 0) { + while (this.receiveBuffer.length >= 11) { + if (this.receiveBuffer.shift() == 0xFF) { + if (this.receiveBuffer.shift() == 0xFF) { + if (this.receiveBuffer.shift() == 0xFD) { + if (this.receiveBuffer.shift() == 0x00) { + const id = this.receiveBuffer.shift(); + if (id == 0xC8 || (id >= 100 && id <= 119) || (id >= 1 && id <= 63)) { - var packetLength = this.makeWord(this.receiveBuffer.shift(), this.receiveBuffer.shift()); - // if (packetLength > 4) { - // console.log("?? : " + this.receiveLength + ' / ' + (packetLength - 4)); - if (this.receiveLength == (packetLength - 4)) { - this.receiveBuffer.shift(); // take 0x55 - status check byte - this.receiveBuffer.shift(); // take 0x00 - error check byte - - var valueLength = packetLength - 4; - var returnValue = []; - var tmpValue = 0; - for (var index = 0; index < valueLength / this.defaultLength; index++) { - if (this.defaultLength == 1) { - tmpValue = this.receiveBuffer.shift() + const packetLength = this.makeWord(this.receiveBuffer.shift(), + this.receiveBuffer.shift()); + // if (packetLength > 4) { + // console.log('?? : ' + this.receiveLength + ' / ' + (packetLength - 4)); + if (this.receiveLength == (packetLength - 4)) { + this.receiveBuffer.shift(); // take 0x55 - status check byte + this.receiveBuffer.shift(); // take 0x00 - error check byte + + const valueLength = packetLength - 4; + const returnValue = []; + let tmpValue = 0; + for (let index = 0; index < valueLength / this.defaultLength; index++) { + if (this.defaultLength == 1) { + tmpValue = this.receiveBuffer.shift(); returnValue.push(tmpValue); - // returnValue.push(this.receiveBuffer.shift()); - } else if (this.defaultLength == 2) { + // returnValue.push(this.receiveBuffer.shift()); + } else if (this.defaultLength == 2) { tmpValue = this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8); - if(tmpValue > 60000) { + if (tmpValue > 60000) { tmpValue = tmpValue - 65536; } returnValue.push(tmpValue); - //returnValue.push(this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8)); - } else if (this.defaultLength == 4) { - tmpValue = this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8) | (this.receiveBuffer.shift() << 16) | (this.receiveBuffer.shift() << 24); + } else if (this.defaultLength == 4) { + tmpValue = this.receiveBuffer.shift() | + (this.receiveBuffer.shift() << 8) | + (this.receiveBuffer.shift() << 16) | + (this.receiveBuffer.shift() << 24); returnValue.push(tmpValue); - // returnValue.push(this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8) | (this.receiveBuffer.shift() << 16) | (this.receiveBuffer.shift() << 24)); - } - } - - if (this.receiveAddress != -1) { - if (this.varTimeout != null) { - clearTimeout(this.varTimeout); - } - - for (var index = 0; index < returnValue.length; index++) { - this.dataBuffer[this.receiveAddress + index * this.defaultLength] = returnValue[index]; - } - - isReadDataArrived = true; - // console.log('<- ' + new Date().getHours() + ':' + new Date().getMinutes() + ':' + new Date().getMilliseconds() + '\n' - // + this.receiveAddress + ' : ' + returnValue); - } else { - // console.log('<- ' + new Date().getHours() + ':' + new Date().getMinutes() + ':' + new Date().getMilliseconds() + '\n' + '-1'); - } - - this.receiveBuffer.shift(); // take crc check byte - this.receiveBuffer.shift(); // take crc check byte - - // break because this packet has no error. - break; - } else { - for (var i = 0; i < packetLength; i++) { - this.receiveBuffer.shift(); // take bytes of write status - } - } - } - } - } - } - } - - // if (this.receiveBuffer.length > 0) { - // this.receiveBuffer.shift(); - // } - } - - // console.log('data check 2 : ' + data.length + ' / ' + this.receiveBuffer.length); - // console.log('<< 2 : ' + this.receiveBuffer); - } + } + } + + if (this.receiveAddress != -1) { + if (this.varTimeout != null) { + clearTimeout(this.varTimeout); + } + + for (let index = 0; index < returnValue.length; index++) { + this.dataBuffer[this.receiveAddress + + index * this.defaultLength] = returnValue[index]; + } + + this.isReadDataArrived = true; + /* + console.log('<- ' + + new Date().getHours() + ':' + + new Date().getMinutes() + ':' + + new Date().getMilliseconds() + '\n' + + this.receiveAddress + ' : ' + returnValue); + */ + } else { + /* + console.log('<- ' + + new Date().getHours() + ':' + + new Date().getMinutes() + ':' + + new Date().getMilliseconds() + '\n' + '-1'); + */ + } + + this.receiveBuffer.shift(); // take crc check byte + this.receiveBuffer.shift(); // take crc check byte + + // break because this packet has no error. + break; + } else { + for (let i = 0; i < packetLength; i++) { + this.receiveBuffer.shift(); // take bytes of write status + } + } + } + } + } + } + } + + // if (this.receiveBuffer.length > 0) { + // this.receiveBuffer.shift(); + // } + } + + // console.log('data check 2 : ' + data.length + ' / ' + this.receiveBuffer.length); + // console.log('<< 2 : ' + this.receiveBuffer); + } }; Module.prototype.reset = function() { - this.addressToRead = []; this.varTimeout = null; @@ -538,21 +527,18 @@ Module.prototype.reset = function() { module.exports = new Module(); -var INST_NONE = 0; -var INST_READ = 2; -var INST_WRITE = 3; -var INST_DXL_SYNCWRITE = 4; -var INST_DXL_REGWRITE = 5; -var INST_DXL_ACTION = 6; -var INST_BYPASS_READ = 0xA2; -var INST_BYPASS_WRITE = 0xA3; - -var isReadDataArrived = true; -var isConnected = true; +const INST_NONE = 0; +const INST_READ = 2; +const INST_WRITE = 3; +const INST_DXL_SYNCWRITE = 4; +const INST_DXL_REGWRITE = 5; +const INST_DXL_ACTION = 6; +const INST_BYPASS_READ = 0xA2; +const INST_BYPASS_WRITE = 0xA3; Module.prototype.writeBytePacket = function(id, address, value) { - console.log("######### writeBytepacket"); - var packet = []; + console.log('######### writeBytepacket'); + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -564,15 +550,15 @@ Module.prototype.writeBytePacket = function(id, address, value) { packet.push(this.getLowByte(address)); packet.push(this.getHighByte(address)); packet.push(value); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; Module.prototype.writeWordPacket = function(id, address, value) { - console.log("######### writeWordPacket"); - var packet = []; + console.log('######### writeWordPacket'); + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -585,15 +571,15 @@ Module.prototype.writeWordPacket = function(id, address, value) { packet.push(this.getHighByte(address)); packet.push(this.getLowByte(value)); packet.push(this.getHighByte(value)); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; Module.prototype.writeDWordPacket = function(id, address, value) { - console.log("######### writeDWordPacket"); - var packet = []; + console.log('######### writeDWordPacket'); + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -608,16 +594,16 @@ Module.prototype.writeDWordPacket = function(id, address, value) { packet.push(this.getHighByte(this.getLowWord(value))); packet.push(this.getLowByte(this.getHighWord(value))); packet.push(this.getHighByte(this.getHighWord(value))); - console.log("packet : " + packet); - var crc = this.updateCRC(0, packet, packet.length); + console.log(`packet : ${packet}`); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; Module.prototype.writeDWordPacket2 = function(id, address, value, value2) { - //console.log("######### writeDWordPacket2"); - var packet = []; + //console.log('######### writeDWordPacket2'); + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -632,20 +618,22 @@ Module.prototype.writeDWordPacket2 = function(id, address, value, value2) { packet.push(this.getHighByte(this.getLowWord(value))); packet.push(this.getLowByte(this.getLowWord(value2))); packet.push(this.getHighByte(this.getLowWord(value2))); - //console.log("packet : " + packet); - var crc = this.updateCRC(0, packet, packet.length); + //console.log('packet : ' + packet); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; Module.prototype.dxlRegWritePacket = function(id, address, length, value) { - var packet = []; - var paramLength = length + 5; + const packet = []; + const paramLength = length + 5; + let tmp1 = 0; + let tmp2 = 0; packet.push(0xff); - packet.push(0xff); - packet.push(0xfd); + packet.push(0xff); + packet.push(0xfd); packet.push(0x00); packet.push(this.getLowByte(id)); @@ -657,7 +645,7 @@ Module.prototype.dxlRegWritePacket = function(id, address, length, value) { packet.push(this.getLowByte(address)); packet.push(this.getHighByte(address)); - switch(length) { + switch (length) { case 1: packet.push(this.getLowByte(value)); break; @@ -670,29 +658,29 @@ Module.prototype.dxlRegWritePacket = function(id, address, length, value) { packet.push(this.getHighByte(this.getHighWord(value))); break; case 8: - var tmpV_1 = value / 4294967296; - var tmpV_2 = value % 4294967296; - - packet.push(this.getLowByte(this.getLowWord(tmpV_1))); - packet.push(this.getHighByte(this.getLowWord(tmpV_1))); - packet.push(this.getLowByte(this.getHighWord(tmpV_1))); - packet.push(this.getHighByte(this.getHighWord(tmpV_1))); - - packet.push(this.getLowByte(this.getLowWord(tmpV_2))); - packet.push(this.getHighByte(this.getLowWord(tmpV_2))); - packet.push(this.getLowByte(this.getHighWord(tmpV_2))); - packet.push(this.getHighByte(this.getHighWord(tmpV_2))); + tmp1 = value / 4294967296; + tmp2 = value % 4294967296; + + packet.push(this.getLowByte(this.getLowWord(tmp1))); + packet.push(this.getHighByte(this.getLowWord(tmp1))); + packet.push(this.getLowByte(this.getHighWord(tmp1))); + packet.push(this.getHighByte(this.getHighWord(tmp1))); + + packet.push(this.getLowByte(this.getLowWord(tmp2))); + packet.push(this.getHighByte(this.getLowWord(tmp2))); + packet.push(this.getLowByte(this.getHighWord(tmp2))); + packet.push(this.getHighByte(this.getHighWord(tmp2))); break; } - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); - return packet; -} + return packet; +}; Module.prototype.dxlActionWrite = function() { - var packet = []; + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -705,36 +693,36 @@ Module.prototype.dxlActionWrite = function() { packet.push(0x05); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); - return packet; -} + return packet; +}; Module.prototype.dxlSyncWritePacket = function(ids, address, rLength, values) { - var packet = []; - var paramLength = 7 + ids.length * (rLength + 1); + const packet = []; + const paramLength = 7 + ids.length * (rLength + 1); - packet.push(0xff); - packet.push(0xff); - packet.push(0xfd); - packet.push(0x00); - packet.push(0xfe); + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + packet.push(0xfe); - packet.push(this.getLowByte(paramLength)); - packet.push(this.getHighByte(paramLength)); + packet.push(this.getLowByte(paramLength)); + packet.push(this.getHighByte(paramLength)); - packet.push(0x83); + packet.push(0x83); - packet.push(this.getLowByte(address)); - packet.push(this.getHighByte(address)); + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); - packet.push(this.getLowByte(rLength)); - packet.push(this.getHighByte(rLength)); + packet.push(this.getLowByte(rLength)); + packet.push(this.getHighByte(rLength)); - for(let i = 0; i < ids.length; i++) { + for (let i = 0; i < ids.length; i++) { packet.push(this.getLowByte(ids[i])); - switch(rLength) { + switch (rLength) { case 1: packet.push(this.getLowByte(values[i])); break; @@ -747,15 +735,13 @@ Module.prototype.dxlSyncWritePacket = function(ids, address, rLength, values) { packet.push(this.getHighByte(this.getHighWord(values[i]))); break; } - - - } + } - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); - return packet; -} + return packet; +}; Module.prototype.prevServoCompare = function(address, value, length) { if ((address >= 108 && address <= 111) && value == 7) { //Module @@ -763,7 +749,7 @@ Module.prototype.prevServoCompare = function(address, value, length) { this.servoPrevAddres == address && this.servoPrevLength == length && this.servoPrevValue == value) { - doSend = false; + //doSend = false; return true; } } @@ -773,7 +759,7 @@ Module.prototype.prevServoCompare = function(address, value, length) { this.servoPrevAddres2 == address && this.servoPrevLength2 == length && this.servoPrevValue2 == value) { - doSend = false; + //doSend = false; return true; } } @@ -783,7 +769,7 @@ Module.prototype.prevServoCompare = function(address, value, length) { this.servoPrevAddres3 == address && this.servoPrevLength3 == length && this.servoPrevValue3 == value) { - doSend = false; + //doSend = false; return true; } } @@ -793,12 +779,11 @@ Module.prototype.prevServoCompare = function(address, value, length) { this.servoPrevAddres4 == address && this.servoPrevLength4 == length && this.servoPrevValue4 == value) { - doSend = false; + //doSend = false; return true; } } - -} +}; Module.prototype.prevServoSet = function(address, value, length) { if ((address >= 108 && address <= 111) && value == 7) { //Module @@ -824,12 +809,11 @@ Module.prototype.prevServoSet = function(address, value, length) { this.servoPrevLength4 = length; this.servoPrevValue4 = value; } - -} +}; Module.prototype.readPacket = function(id, address, lengthToRead) { - //console.log("######### readPacket"); - var packet = []; + //console.log('######### readPacket'); + const packet = []; packet.push(0xff); packet.push(0xff); packet.push(0xfd); @@ -842,13 +826,13 @@ Module.prototype.readPacket = function(id, address, lengthToRead) { packet.push(this.getHighByte(address)); packet.push(this.getLowByte(lengthToRead)); packet.push(this.getHighByte(lengthToRead)); - var crc = this.updateCRC(0, packet, packet.length); + const crc = this.updateCRC(0, packet, packet.length); packet.push(this.getLowByte(crc)); packet.push(this.getHighByte(crc)); return packet; }; -var crc_table = [0x0000, +const crcTable = [0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011, 0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022, 0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, @@ -885,7 +869,7 @@ var crc_table = [0x0000, 0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261, 0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231, 0x8213, 0x0216, 0x021C, 0x8219, 0x0208, - 0x820D, 0x8207, 0x0202 + 0x820D, 0x8207, 0x0202, ]; Module.prototype.makeWord = function(a, b) { @@ -908,13 +892,15 @@ Module.prototype.getHighWord = function(a) { return ((a >> 16) & 0xffff); }; -Module.prototype.updateCRC = function(crc_accum, data_blk_ptr, data_blk_size) { - var i, j; +Module.prototype.updateCRC = function(crcAccum, dataBlkPtr, dataBlkSize) { + let i = 0; + let j = 0; + let crc = crcAccum; - for (j = 0; j < data_blk_size; j++) { - i = ((crc_accum >> 8) ^ data_blk_ptr[j]) & 0xff; - crc_accum = (crc_accum << 8) ^ crc_table[i]; + for (j = 0; j < dataBlkSize; j++) { + i = ((crc >> 8) ^ dataBlkPtr[j]) & 0xff; + crc = (crc << 8) ^ crcTable[i]; } - return crc_accum; -}; \ No newline at end of file + return crc; +}; From aeb77508c0566e8048aecf03f500da1fddf39145 Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 19 Jan 2024 09:09:04 +0900 Subject: [PATCH 09/13] =?UTF-8?q?=EC=8B=A4=EA=B3=BC=EB=A1=9C=EB=B4=87=20?= =?UTF-8?q?=EC=9C=A0=EB=AC=B4=EC=84=A0=EC=97=B0=EA=B2=B0=EC=9D=84=20?= =?UTF-8?q?=EB=AC=B4=EC=84=A0=EC=97=B0=EA=B2=B0=EB=A1=9C=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../robotis_RB100_Practical_Assembly.json | 25 ------------------- .../robotis_RB100_Practical_AssemblyBT.json | 4 +-- 2 files changed, 2 insertions(+), 27 deletions(-) delete mode 100644 app/modules/robotis_RB100_Practical_Assembly.json diff --git a/app/modules/robotis_RB100_Practical_Assembly.json b/app/modules/robotis_RB100_Practical_Assembly.json deleted file mode 100644 index 951ea4150..000000000 --- a/app/modules/robotis_RB100_Practical_Assembly.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "id": "070A01", - "name": { - "en": "ROBOTIS Practical Course 2025", - "ko": "로보티즈 실과 2025" - }, - "category": "module", - "platform": ["win32"], - "icon" : "robotis_RB100im_Practical_Assembly.png", - "module": "robotis_RB100_usb.js", - "url": "http://www.robotis.com", - "email": "jason@robotis.com", - "reconnect" : true, - "driver": { - "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", - "win32-x64": "ROBOTIS/ROBOTIS CDC Driver.bat" - }, - "hardware": { - "type": "serial", - "control": "slave", - "vendor": "ROBOTIS", - "duration": 15, - "baudRate": 57600 - } -} diff --git a/app/modules/robotis_RB100_Practical_AssemblyBT.json b/app/modules/robotis_RB100_Practical_AssemblyBT.json index e75c87b60..57aac2c0c 100644 --- a/app/modules/robotis_RB100_Practical_AssemblyBT.json +++ b/app/modules/robotis_RB100_Practical_AssemblyBT.json @@ -1,8 +1,8 @@ { "id": "070B01", "name": { - "en": "ROBOTIS Practical Course 2025(무선연결)", - "ko": "로보티즈 실과 2025(무선연결)" + "en": "ROBOTIS Practical Course 2025", + "ko": "로보티즈 실과 2025" }, "category": "module", "platform": ["win32"], From 4e0c642842e37be481976203c821b381dbd0c1dd Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 19 Jan 2024 09:46:33 +0900 Subject: [PATCH 10/13] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20256x256=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../robotis_RB100im_Practical_Assembly.png | Bin 28642 -> 56351 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/modules/robotis_RB100im_Practical_Assembly.png b/app/modules/robotis_RB100im_Practical_Assembly.png index 5fa23130a232b631c0f45f933dd635449d76b06a..f5d94164696039b6f3873f605d8d2ef81c7ad7d3 100644 GIT binary patch literal 56351 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 literal 28642 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 ZRe~p7nAaH@K3DKTDaxwI{E{*W{eKQ`Pmurs From 88e6265a440820835c2be0e963999b47861da093 Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Fri, 16 Feb 2024 18:28:35 +0900 Subject: [PATCH 11/13] =?UTF-8?q?=EB=94=94=EB=B2=84=EA=B7=B8=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EC=82=AD=EC=A0=9C=20/=20=EC=8B=A4=EA=B3=BC?= =?UTF-8?q?=EB=A1=9C=EB=B4=87=20com=20port=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=83=9D=EB=9E=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_RB100.js | 3 --- app/modules/robotis_RB100_Practical_AssemblyBT.json | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/modules/robotis_RB100.js b/app/modules/robotis_RB100.js index 1492b2551..ec5d0006e 100644 --- a/app/modules/robotis_RB100.js +++ b/app/modules/robotis_RB100.js @@ -316,7 +316,6 @@ Module.prototype.requestLocalData = function() { } else if (length == 4) { sendBuffer = this.writeDWordPacket(200, address, value); } else { - console.log(value); sendBuffer = this.writeCustomLengthPacket(200, address, value, length); } } else if (instruction == INST_READ) { @@ -610,9 +609,7 @@ Module.prototype.writeCustomLengthPacket = function(id, address, buf, length) { packet.push(INST_WRITE); packet.push(this.getLowByte(address)); packet.push(this.getHighByte(address)); - console.log(buf); for (i = 0; i < length; i++) { - console.log(buf[i]); if (typeof(buf[i]) == 'number') { packet.push(buf[i]); } else if (typeof(buf[i]) == 'string') { diff --git a/app/modules/robotis_RB100_Practical_AssemblyBT.json b/app/modules/robotis_RB100_Practical_AssemblyBT.json index 57aac2c0c..ef092035b 100644 --- a/app/modules/robotis_RB100_Practical_AssemblyBT.json +++ b/app/modules/robotis_RB100_Practical_AssemblyBT.json @@ -2,7 +2,7 @@ "id": "070B01", "name": { "en": "ROBOTIS Practical Course 2025", - "ko": "로보티즈 실과 2025" + "ko": "2022 개정 교육과정 실과로봇" }, "category": "module", "platform": ["win32"], @@ -15,7 +15,7 @@ "win32-ia32": "ROBOTIS/ROBOTIS CDC Driver.bat", "win32-x64": "ROBOTIS/ROBOTIS CDC Driver.bat" }, - "selectPort" : true, + "selectPort" : false, "hardware": { "type": "serial", "control": "slave", From 0db773072d7a4d8cb182f5d8f581c02f4881c339 Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Wed, 21 Feb 2024 12:57:28 +0900 Subject: [PATCH 12/13] =?UTF-8?q?RB-100=20=EC=A0=9C=EC=96=B4=EA=B8=B0=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0=EC=8B=9C=20=EC=B4=88=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_RB100.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/modules/robotis_RB100.js b/app/modules/robotis_RB100.js index ec5d0006e..db5cf4ea1 100644 --- a/app/modules/robotis_RB100.js +++ b/app/modules/robotis_RB100.js @@ -120,6 +120,8 @@ Module.prototype.requestInitialData = function() { this.robotisBuffer.push([INST_WRITE, 21, 2, 20]); this.robotisBuffer.push([INST_WRITE, 19, 1, 1]); // bypass 모드 켜기 this.robotisBuffer.push([INST_WRITE, 20, 1, 0]); // bypass port를 BLE로 설정 + this.robotisBuffer.push([INST_WRITE, 4250, 1, 1]); // huskylens 텍스트 지우기 + this.robotisBuffer.push([INST_WRITE, 722, 1, 0]); // dxl 토크 끄기 return this.readPacket(200, 0, 2); }; From 449d34fd15c0b921c24f5dc63a274a7065dba1a4 Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Wed, 21 Feb 2024 12:58:03 +0900 Subject: [PATCH 13/13] =?UTF-8?q?=EB=A1=9C=EB=B4=87=EC=95=84=EC=9D=B4=20?= =?UTF-8?q?=EB=AA=85=EC=B9=AD,=20=EC=9D=B4=EB=AF=B8=EC=A7=80,=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../robotis_RB100_Practical_AssemblyBT.json | 6 +- app/modules/robotis_RB100_Practice_Course.js | 908 ++++++++++++++++++ .../robotis_RB100im_Practical_Assembly.png | Bin 56351 -> 16871 bytes 3 files changed, 911 insertions(+), 3 deletions(-) create mode 100644 app/modules/robotis_RB100_Practice_Course.js diff --git a/app/modules/robotis_RB100_Practical_AssemblyBT.json b/app/modules/robotis_RB100_Practical_AssemblyBT.json index ef092035b..7ff42b9f7 100644 --- a/app/modules/robotis_RB100_Practical_AssemblyBT.json +++ b/app/modules/robotis_RB100_Practical_AssemblyBT.json @@ -1,13 +1,13 @@ { "id": "070B01", "name": { - "en": "ROBOTIS Practical Course 2025", - "ko": "2022 개정 교육과정 실과로봇" + "en": "Robot AI", + "ko": "로봇아이(AI)" }, "category": "module", "platform": ["win32"], "icon" : "robotis_RB100im_Practical_Assembly.png", - "module": "robotis_RB100.js", + "module": "robotis_RB100_Practice_Course.js", "url": "http://www.steamcup.org/ko/", "email": "jason@robotis.com", "reconnect" : true, diff --git a/app/modules/robotis_RB100_Practice_Course.js b/app/modules/robotis_RB100_Practice_Course.js new file mode 100644 index 000000000..7c325deed --- /dev/null +++ b/app/modules/robotis_RB100_Practice_Course.js @@ -0,0 +1,908 @@ +function Module() { + this.isReadDataArrived = true; + this.isConnected = true; + this.addressToRead = []; + this.varTimeout = null; + + this.prevInstruction = 0; + this.prevAddress = []; + this.prevLength = []; + this.prevValue = []; + + this.servoPrevAddres = []; // add by kjs 20170627 + this.servoPrevLength = []; // add by kjs 20170627 + this.servoPrevValue = []; // add by kjs 20170627 + this.servoPrevAddres2 = []; // add by kjs 20170627 + this.servoPrevLength2 = []; // add by kjs 20170627 + this.servoPrevValue2 = []; // add by kjs 20170627 + this.servoPrevAddres3 = []; // add by kjs 20170627 + this.servoPrevLength3 = []; // add by kjs 20170627 + this.servoPrevValue3 = []; // add by kjs 20170627 + this.servoPrevAddres4 = []; // add by kjs 20170627 + this.servoPrevLength4 = []; // add by kjs 20170627 + this.servoPrevValue4 = []; // add by kjs 20170627 + + this.receiveBuffer = []; // buffer to receive from H/W + this.dataBuffer = []; // saved sensor value buffer + this.robotisBuffer = []; // buffer to save 'ROBOTIS_DATA' + this.receiveAddress = -1; // to check read packet + this.receiveLength = -1; // to check read packet + this.defaultLength = -1; // to check read packet + + this.isFront = 32; // add by kjs 170511 + this.prevRightValue = 0; + this.prevLeftValue = 0; + this.isRight = false; + + //this.touchSensor = 0; + this.humidity = []; + this.temperature = []; + this.colorSensor = []; + this.touchSensor = []; + this.irSensor = []; + this.lightSensor = []; + this.detectedSound = 0; + this.detectringSound = 0; + this.userButtonState = 0; + this.isUpdate = []; // add by kjs 170623 + this.prevState = []; // add by kjs 170623 +} + +Module.prototype.init = function(handler, config) { + //console.log("######### init"); + +}; + +Module.prototype.lostController = function(self, callback) { + self.timer = setInterval(() => { + if (self.connected) { + if (self.received == false) { + if (this.isConnected == false) { + self.connected = false; + if (callback) { + callback('lost'); + } + } + this.isConnected = false; + } + self.received = false; + } + }, 1000); +}; + +Module.prototype.requestInitialData = function() { + //console.log("######### requestInitialData"); + this.isReadDataArrived = true; + this.isConnected = true; + this.addressToRead = []; + this.varTimeout = null; + + this.prevInstruction = 0; + this.prevAddress = []; + this.prevLength = []; + this.prevValue = []; + + this.servoPrevAddres = []; + this.servoPrevLength = []; + this.servoPrevValue = []; + + this.receiveBuffer = []; + this.dataBuffer = []; + this.robotisBuffer = []; + this.receiveAddress = -1; + this.receiveLength = -1; + this.defaultLength = -1; + + //this.touchSensor = 0; + this.colorSensor = []; + this.temperature = []; + this.humidity = []; + this.touchSensor = []; + this.irSensor = []; + this.lightSensor = []; + this.detectedSound = 0; + this.detectringSound = 0; + this.userButtonState = 0; + + this.servoPrevAddres = []; // add by kjs 20170627 + this.servoPrevLength = []; // add by kjs 20170627 + this.servoPrevValue = []; // add by kjs 20170627 + this.servoPrevAddres2 = []; // add by kjs 20170627 + this.servoPrevLength2 = []; // add by kjs 20170627 + this.servoPrevValue2 = []; // add by kjs 20170627 + this.servoPrevAddres3 = []; // add by kjs 20170627 + this.servoPrevLength3 = []; // add by kjs 20170627 + this.servoPrevValue3 = []; // add by kjs 20170627 + this.servoPrevAddres4 = []; // add by kjs 20170627 + this.servoPrevLength4 = []; // add by kjs 20170627 + this.servoPrevValue4 = []; // add by kjs 20170627 + + this.robotisBuffer.push([INST_WRITE, 21, 2, 20]); + this.robotisBuffer.push([INST_WRITE, 19, 1, 1]); // bypass 모드 켜기 + this.robotisBuffer.push([INST_WRITE, 20, 1, 0]); // bypass port를 BLE로 설정 + this.robotisBuffer.push([INST_WRITE, 4250, 1, 1]); // huskylens 텍스트 지우기 + this.robotisBuffer.push([INST_WRITE, 722, 1, 0]); // dxl 토크 끄기 + this.robotisBuffer.push([INST_WRITE, 163, 2, 3329]); // 얼굴 알라로 바꾸기 + this.robotisBuffer.push([INST_WRITE, 162, 1, 1]); // 화면 업데이트 + + return this.readPacket(200, 0, 2); +}; + +Module.prototype.checkInitialData = function(data, config) { + console.log('######### checkInitialData'); + + return true; +}; + +Module.prototype.validateLocalData = function(data) { + return true; +}; + +Module.prototype.requestRemoteData = function(handler) { + for (let indexA = 0; indexA < this.dataBuffer.length; indexA++) { // 일반형 + if (this.dataBuffer[indexA] != undefined) { + // console.log("indexA: " + indexA + " value: " + this.dataBuffer[indexA]); + handler.write(indexA, this.dataBuffer[indexA]); + } + } + //실과형 + //console.log("###### value : " + this.detectedSound); + for (let i = 0; i < 4; i++) { + handler.write(`TOUCH${i}`, this.touchSensor[i]); // 접촉 센서 + handler.write(`IR${i}`, this.irSensor[i]); // 적외선 센서 + handler.write(`LIGHT${i}`, this.lightSensor[i]); // 조도 센서 + handler.write(`COLOR${i}`, this.colorSensor[i]); // 칼라 센서 + handler.write(`HUMIDTY${i}`, this.humidity[i]); // 습도 센서 + handler.write(`TEMPERATURE${i}`, this.temperature[i]); // 온도 센서 + } + handler.write('DETECTEDSOUNDE', this.detectedSound); // 최종 소리 감지 횟수 + handler.write('DETECTINGSOUNDE1', this.detectringSound); // 실시간 소리 감지 횟수 + handler.write('USERBUTTONSTATE', this.userButtonState); +}; + +Module.prototype.handleRemoteData = function(handler) { + const data = handler.read('ROBOTIS_DATA'); + + const setZero = handler.read('setZero'); + if (setZero[0] == 1) { + this.robotisBuffer = []; + + this.servoPrevAddres = []; // add by kjs 20170627 + this.servoPrevLength = []; // add by kjs 20170627 + this.servoPrevValue = []; // add by kjs 20170627 + this.servoPrevAddres2 = []; // add by kjs 20170627 + this.servoPrevLength2 = []; // add by kjs 20170627 + this.servoPrevValue2 = []; // add by kjs 20170627 + this.servoPrevAddres3 = []; // add by kjs 20170627 + this.servoPrevLength3 = []; // add by kjs 20170627 + this.servoPrevValue3 = []; // add by kjs 20170627 + this.servoPrevAddres4 = []; // add by kjs 20170627 + this.servoPrevLength4 = []; // add by kjs 20170627 + this.servoPrevValue4 = []; // add by kjs 20170627 + } + for (let index = 0; index < data.length; index++) { + const instruction = data[index][0]; + const address = data[index][1]; + const length = data[index][2]; + const value = data[index][3]; + let doSend = false; + //console.log("###2 : " + address + " and : " + value + " inst : " + instruction + " length : " + length); + if (instruction == INST_NONE) { + doSend = false; + } else if (instruction == INST_READ) { + if (this.isReadDataArrived == false && + this.prevInstruction == INST_READ && + this.prevAddress == address && + this.prevLength == length && + this.prevValue == value) { + doSend = false; + } else { + doSend = true; + } + } else if (instruction == INST_BYPASS_READ) { + if (this.isReadDataArrived == false && + this.prevInstruction == INST_BYPASS_READ && + this.prevAddress == address && + this.prevLength == length && + this.prevValue == value) { + doSend = false; + } else { + doSend = true; + } + } + //console.log("dosend : " + doSend); + if (doSend) { + for (let indexA = 0; indexA < this.robotisBuffer.length; indexA++) { + if (data[index][0] == this.robotisBuffer[indexA][0] && + data[index][1] == this.robotisBuffer[indexA][1] && + data[index][2] == this.robotisBuffer[indexA][2] && + data[index][3] == this.robotisBuffer[indexA][3]) { + doSend = false; + break; + } + } + } + if (instruction == INST_WRITE || + instruction == 4 || + instruction == 5 || + instruction == 6 || + instruction == INST_BYPASS_WRITE) { + doSend = true; + } + if (!doSend) { + continue; + } + + if (setZero[0] == 1) { + this.prevInstruction = 0; + this.prevAddress = []; + this.prevLength = []; + this.prevValue = []; + + this.servoPrevAddres = []; // add by kjs 20170627 + this.servoPrevLength = []; // add by kjs 20170627 + this.servoPrevValue = []; // add by kjs 20170627 + this.servoPrevAddres2 = []; // add by kjs 20170627 + this.servoPrevLength2 = []; // add by kjs 20170627 + this.servoPrevValue2 = []; // add by kjs 20170627 + this.servoPrevAddres3 = []; // add by kjs 20170627 + this.servoPrevLength3 = []; // add by kjs 20170627 + this.servoPrevValue3 = []; // add by kjs 20170627 + this.servoPrevAddres4 = []; // add by kjs 20170627 + this.servoPrevLength4 = []; // add by kjs 20170627 + this.servoPrevValue4 = []; // add by kjs 20170627 + } else { + this.prevInstruction = instruction; + this.prevAddress = address; + this.prevLength = length; + this.prevValue = value; + this.prevServoSet(address, value, length); + } + + if (instruction == INST_WRITE || + instruction == INST_DXL_SYNCWRITE || + instruction == INST_DXL_REGWRITE || + instruction == INST_DXL_ACTION || + instruction == INST_BYPASS_WRITE) { + this.robotisBuffer.push(data[index]); + if (instruction == INST_WRITE) { + // 만약 bypass mode를 enable 한다고 하면 + if (address == 19 && value == 1) { + // bypass port를 BLE로 설정 + this.robotisBuffer.push([INST_WRITE, 20, 1, 0]); + } + } + } else if (instruction == INST_READ || instruction == INST_BYPASS_READ) { + if (this.addressToRead[address] == undefined || this.addressToRead[address] == 0) { + this.addressToRead[address] = 1; + this.robotisBuffer.push(data[index]); + } else { + // 10번 이상 읽지 못한다면 에러이므로 강제로 읽을 수 있도록 처리 + this.addressToRead[address] += 1; + if (this.addressToRead[address] >= 10) { + this.addressToRead[address] = 0; + } + } + } + } +}; + +Module.prototype.requestLocalData = function() { + let sendBuffer = null; + let dataLength = 0; + if (this.isReadDataArrived == false) { + //console.log("######## 1"); + return sendBuffer; + } + ///////////////// + this.isConnected = true; + if (!this.isConnected) { + this.receiveAddress = -1; + return this.readPacket(200, 0, 2); + } + + { + const data = this.robotisBuffer.shift(); + if (data == null) { + return sendBuffer; + } + const instruction = data[0]; + const address = data[1]; + const length = data[2]; + let value = data[3]; + const value2 = data[4]; + //console.log('send address : ' + address + ', ' + value + ", " + length); // add by kjs 170426 + if (instruction == INST_WRITE) { + if (length == 1) { + sendBuffer = this.writeBytePacket(200, address, value); + } else if (length == 2) { + sendBuffer = this.writeWordPacket(200, address, value); + } else if (length == 4) { + sendBuffer = this.writeDWordPacket(200, address, value); + } else { + sendBuffer = this.writeCustomLengthPacket(200, address, value, length); + } + } else if (instruction == INST_READ) { + this.addressToRead[address] = 0; + sendBuffer = this.readPacket(200, address, length); + } else if (instruction == INST_DXL_SYNCWRITE) { //function(ids, address, rLength, values) + //this.isReadDataArrived = true; + const ids = data[4]; + value = data[5]; + const tmpSendBuffer = this.dxlSyncWritePacket(ids, address, length, value); + const tmp = []; + for (let j = 0; j < tmpSendBuffer / 20; j++) { + for (let i = j * 20; i < j * 20 + 20; i++) { + tmp.push(tmpSendBuffer[i]); + } + sendBuffer.push(tmp); + } + + sendBuffer = this.dxlSyncWritePacket(ids, address, length, value); + } else if (instruction == INST_DXL_REGWRITE) { + const ids = data[4]; + + sendBuffer = this.dxlRegWritePacket(ids[0], address, length, value); + } else if (instruction == INST_DXL_ACTION) { + sendBuffer = this.dxlActionWrite(); + } else if (instruction == INST_BYPASS_READ) { + const id = value; + this.addressToRead[address] = 0; + sendBuffer = this.readPacket(id, address, length); + } else if (instruction == INST_BYPASS_WRITE) { + const id = value; + this.addressToRead[address] = 0; + if (length == 1) { + sendBuffer = this.writeBytePacket(id, address, value2); + } else if (length == 2) { + sendBuffer = this.writeWordPacket(id, address, value2); + } else { + sendBuffer = this.writeDWordPacket(id, address, value2); + } + } + + console.log(`send buffer : ${sendBuffer}`); + if (sendBuffer[0] == 0xFF && + sendBuffer[1] == 0xFF && + sendBuffer[2] == 0xFD && + sendBuffer[3] == 0x00 && + sendBuffer[4] == 0xC8 || + (sendBuffer[4] >= 100 && sendBuffer[4] <= 119) || + (sendBuffer[4] >= 1 && sendBuffer[4] <= 63)) { + dataLength = this.makeWord(sendBuffer[5], sendBuffer[6]); + + if (sendBuffer[7] == INST_READ) { + this.receiveAddress = address; + this.receiveLength = length; + this.defaultLength = data[2]; + this.isReadDataArrived = false; + if (this.varTimeout != null) { + clearTimeout(this.varTimeout); + } + + this.varTimeout = setTimeout(() => { + this.isReadDataArrived = true; + }, 100); + } + } + } + return sendBuffer; +}; +Module.prototype.packetChecker = function(data) { + if (data[0] == 0xFF && data[1] == 0xFF && data[2] == 0xFD) { + return true; + } else { + return false; + } +}; + +Module.prototype.handleLocalData = function(data) { // data: Native Buffer + for (let i = 0; i < data.length; i++) { + this.receiveBuffer.push(data[i]); + } + + if (this.receiveBuffer.length >= 11 + this.receiveLength) { + this.isConnected = true; + // console.log('<< 1 : ' + this.receiveLength + ' : ' + this.receiveBuffer); + + // while (this.receiveBuffer.length > 0) { + while (this.receiveBuffer.length >= 11) { + if (this.receiveBuffer.shift() == 0xFF) { + if (this.receiveBuffer.shift() == 0xFF) { + if (this.receiveBuffer.shift() == 0xFD) { + if (this.receiveBuffer.shift() == 0x00) { + const id = this.receiveBuffer.shift(); + if (id == 0xC8 || + (id >= 100 && id <= 119) || + (id >= 1 && id <= 63)) { + const packetLength = this.makeWord(this.receiveBuffer.shift(), + this.receiveBuffer.shift()); + // if (packetLength > 4) { + // console.log("?? : " + this.receiveLength + ' / ' + (packetLength - 4)); + if (this.receiveLength == (packetLength - 4)) { + this.receiveBuffer.shift(); // take 0x55 - status check byte + this.receiveBuffer.shift(); // take 0x00 - error check byte + + const valueLength = packetLength - 4; + const returnValue = []; + let tmpValue = 0; + for (let index = 0; index < valueLength / this.defaultLength; index++) { + if (this.defaultLength == 1) { + tmpValue = this.receiveBuffer.shift(); + returnValue.push(tmpValue); + // returnValue.push(this.receiveBuffer.shift()); + } else if (this.defaultLength == 2) { + tmpValue = this.receiveBuffer.shift() | (this.receiveBuffer.shift() << 8); + if (tmpValue > 60000) { + tmpValue = tmpValue - 65536; + } + returnValue.push(tmpValue); + } else if (this.defaultLength == 4) { + tmpValue = this.receiveBuffer.shift() | + (this.receiveBuffer.shift() << 8) | + (this.receiveBuffer.shift() << 16) | + (this.receiveBuffer.shift() << 24); + + returnValue.push(tmpValue); + } + } + + if (this.receiveAddress != -1) { + if (this.varTimeout != null) { + clearTimeout(this.varTimeout); + } + + for (let index = 0; index < returnValue.length; index++) { + this.dataBuffer[this.receiveAddress + index * this.defaultLength] = + returnValue[index]; + } + + this.isReadDataArrived = true; + /* + console.log('<- ' + + new Date().getHours() + ':' + + new Date().getMinutes() + ':' + + new Date().getMilliseconds() + '\n' + + this.receiveAddress + ' : ' + returnValue); + */ + } else { + /* + console.log('<- ' + + new Date().getHours() + ':' + + new Date().getMinutes() + ':' + + new Date().getMilliseconds() + '\n' + '-1'); + */ + } + + this.receiveBuffer.shift(); // take crc check byte + this.receiveBuffer.shift(); // take crc check byte + + // break because this packet has no error. + break; + } else { + for (let i = 0; i < packetLength; i++) { + this.receiveBuffer.shift(); // take bytes of write status + } + } + } + } + } + } + } + } + } +}; + +Module.prototype.reset = function() { + this.addressToRead = []; + this.varTimeout = null; + + this.prevInstruction = 0; + this.prevAddress = []; + this.prevLength = []; + this.prevValue = []; + + this.receiveBuffer = []; + this.dataBuffer = []; + this.robotisBuffer = []; + this.receiveAddress = -1; + this.receiveLength = -1; + this.defaultLength = -1; + + this.servoPrevAddres = []; // add by kjs 20170731 + this.servoPrevLength = []; // add by kjs 20170627 + this.servoPrevValue = []; // add by kjs 20170627 + this.servoPrevAddres2 = []; // add by kjs 20170627 + this.servoPrevLength2 = []; // add by kjs 20170627 + this.servoPrevValue2 = []; // add by kjs 20170627 + this.servoPrevAddres3 = []; // add by kjs 20170627 + this.servoPrevLength3 = []; // add by kjs 20170627 + this.servoPrevValue3 = []; // add by kjs 20170627 + this.servoPrevAddres4 = []; // add by kjs 20170627 + this.servoPrevLength4 = []; // add by kjs 20170627 + this.servoPrevValue4 = []; // add by kjs 20170731 +}; + +module.exports = new Module(); + +const INST_NONE = 0; +const INST_READ = 2; +const INST_WRITE = 3; +const INST_DXL_SYNCWRITE = 4; +const INST_DXL_REGWRITE = 5; +const INST_DXL_ACTION = 6; +const INST_BYPASS_READ = 0xA2; +const INST_BYPASS_WRITE = 0xA3; + +Module.prototype.writeBytePacket = function(id, address, value) { + console.log('######### writeBytepacket'); + const packet = []; + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + packet.push(id); + packet.push(0x06); + packet.push(0x00); + packet.push(INST_WRITE); + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); + packet.push(value); + const crc = this.updateCRC(0, packet, packet.length); + packet.push(this.getLowByte(crc)); + packet.push(this.getHighByte(crc)); + return packet; +}; + +Module.prototype.writeWordPacket = function(id, address, value) { + console.log('######### writeWordPacket'); + const packet = []; + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + packet.push(id); + packet.push(0x07); + packet.push(0x00); + packet.push(INST_WRITE); + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); + packet.push(this.getLowByte(value)); + packet.push(this.getHighByte(value)); + const crc = this.updateCRC(0, packet, packet.length); + packet.push(this.getLowByte(crc)); + packet.push(this.getHighByte(crc)); + return packet; +}; + +Module.prototype.writeDWordPacket = function(id, address, value) { + console.log('######### writeDWordPacket'); + const packet = []; + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + packet.push(id); + packet.push(0x09); + packet.push(0x00); + packet.push(INST_WRITE); + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); + packet.push(this.getLowByte(this.getLowWord(value))); + packet.push(this.getHighByte(this.getLowWord(value))); + packet.push(this.getLowByte(this.getHighWord(value))); + packet.push(this.getHighByte(this.getHighWord(value))); + console.log(`packet : ${packet}`); + const crc = this.updateCRC(0, packet, packet.length); + packet.push(this.getLowByte(crc)); + packet.push(this.getHighByte(crc)); + return packet; +}; + +Module.prototype.writeCustomLengthPacket = function(id, address, buf, length) { + //console.log("######### writeCustomLengthPacket"); + const packet = []; + let i = 0; + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + packet.push(id); + packet.push(length + 5); + packet.push(0x00); + packet.push(INST_WRITE); + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); + for (i = 0; i < length; i++) { + if (typeof(buf[i]) == 'number') { + packet.push(buf[i]); + } else if (typeof(buf[i]) == 'string') { + packet.push(buf[i].charCodeAt(0)); + } + } + //console.log("packet : " + packet); + const crc = this.updateCRC(0, packet, packet.length); + packet.push(this.getLowByte(crc)); + packet.push(this.getHighByte(crc)); + return packet; +}; + +Module.prototype.dxlRegWritePacket = function(id, address, length, value) { + const packet = []; + const paramLength = length + 5; + let tmp1 = 0; + let tmp2 = 0; + + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + + packet.push(this.getLowByte(id)); + packet.push(this.getLowByte(paramLength)); + packet.push(this.getHighByte(paramLength)); + + packet.push(0x04); + + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); + + switch (length) { + case 1: + packet.push(this.getLowByte(value)); + break; + case 2: + break; + case 4: + packet.push(this.getLowByte(this.getLowWord(value))); + packet.push(this.getHighByte(this.getLowWord(value))); + packet.push(this.getLowByte(this.getHighWord(value))); + packet.push(this.getHighByte(this.getHighWord(value))); + break; + case 8: + tmp1 = value / 4294967296; + tmp2 = value % 4294967296; + + packet.push(this.getLowByte(this.getLowWord(tmp1))); + packet.push(this.getHighByte(this.getLowWord(tmp1))); + packet.push(this.getLowByte(this.getHighWord(tmp1))); + packet.push(this.getHighByte(this.getHighWord(tmp1))); + + packet.push(this.getLowByte(this.getLowWord(tmp2))); + packet.push(this.getHighByte(this.getLowWord(tmp2))); + packet.push(this.getLowByte(this.getHighWord(tmp2))); + packet.push(this.getHighByte(this.getHighWord(tmp2))); + break; + } + + const crc = this.updateCRC(0, packet, packet.length); + packet.push(this.getLowByte(crc)); + packet.push(this.getHighByte(crc)); + return packet; +}; + +Module.prototype.dxlActionWrite = function() { + const packet = []; + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + + packet.push(0xfe); + + packet.push(0x03); + packet.push(0x00); + + packet.push(0x05); + + const crc = this.updateCRC(0, packet, packet.length); + packet.push(this.getLowByte(crc)); + packet.push(this.getHighByte(crc)); + return packet; +}; + +Module.prototype.dxlSyncWritePacket = function(ids, address, rLength, values) { + const packet = []; + const paramLength = 7 + ids.length * (rLength + 1); + + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + packet.push(0xfe); + + packet.push(this.getLowByte(paramLength)); + packet.push(this.getHighByte(paramLength)); + + packet.push(0x83); + + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); + + packet.push(this.getLowByte(rLength)); + packet.push(this.getHighByte(rLength)); + + for (let i = 0; i < ids.length; i++) { + packet.push(this.getLowByte(ids[i])); + switch (rLength) { + case 1: + packet.push(this.getLowByte(values[i])); + break; + case 2: + break; + case 4: + packet.push(this.getLowByte(this.getLowWord(values[i]))); + packet.push(this.getHighByte(this.getLowWord(values[i]))); + packet.push(this.getLowByte(this.getHighWord(values[i]))); + packet.push(this.getHighByte(this.getHighWord(values[i]))); + break; + } + } + + const crc = this.updateCRC(0, packet, packet.length); + packet.push(this.getLowByte(crc)); + packet.push(this.getHighByte(crc)); + return packet; +}; + +Module.prototype.prevServoCompare = function(address, value, length) { + if ((address >= 108 && address <= 111) && value == 7) { //Module + if (this.prevInstruction == INST_WRITE && + this.servoPrevAddres == address && + this.servoPrevLength == length && + this.servoPrevValue == value) { + //doSend = false; + return true; + } + } + + if (address >= 128 && address <= 131) { //Mode + if (this.prevInstruction == INST_WRITE && + this.servoPrevAddres2 == address && + this.servoPrevLength2 == length && + this.servoPrevValue2 == value) { + //doSend = false; + return true; + } + } + + if (address >= 140 && address <= 146) { //Speed + if (this.prevInstruction == INST_WRITE && + this.servoPrevAddres3 == address && + this.servoPrevLength3 == length && + this.servoPrevValue3 == value) { + //doSend = false; + return true; + } + } + + if (address >= 156 && address <= 162) { //Position + if (this.prevInstruction4 == INST_WRITE && + this.servoPrevAddres4 == address && + this.servoPrevLength4 == length && + this.servoPrevValue4 == value) { + //doSend = false; + return true; + } + } +}; + +Module.prototype.prevServoSet = function(address, value, length) { + if ((address >= 108 && address <= 111) && value == 7) { //Module + this.servoPrevAddres = address; + this.servoPrevLength = length; + this.servoPrevValue = value; + } + + if (address >= 128 && address <= 131) { //Mode + this.servoPrevAddres2 = address; + this.servoPrevLength2 = length; + this.servoPrevValue2 = value; + } + + if (address >= 140 && address <= 146) { //Speed + this.servoPrevAddres3 = address; + this.servoPrevLength3 = length; + this.servoPrevValue3 = value; + } + + if (address >= 156 && address <= 162) { //Position + this.servoPrevAddres4 = address; + this.servoPrevLength4 = length; + this.servoPrevValue4 = value; + } +}; + +Module.prototype.readPacket = function(id, address, lengthToRead) { + //console.log("######### readPacket"); + const packet = []; + packet.push(0xff); + packet.push(0xff); + packet.push(0xfd); + packet.push(0x00); + packet.push(id); + packet.push(0x07); + packet.push(0x00); + packet.push(INST_READ); + packet.push(this.getLowByte(address)); + packet.push(this.getHighByte(address)); + packet.push(this.getLowByte(lengthToRead)); + packet.push(this.getHighByte(lengthToRead)); + const crc = this.updateCRC(0, packet, packet.length); + packet.push(this.getLowByte(crc)); + packet.push(this.getHighByte(crc)); + return packet; +}; + +const crcTable = [0x0000, + 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011, + 0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, + 0x0022, 0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, + 0x8077, 0x0072, 0x0050, 0x8055, 0x805F, 0x005A, 0x804B, + 0x004E, 0x0044, 0x8041, 0x80C3, 0x00C6, 0x00CC, 0x80C9, + 0x00D8, 0x80DD, 0x80D7, 0x00D2, 0x00F0, 0x80F5, 0x80FF, + 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1, 0x00A0, 0x80A5, + 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1, 0x8093, + 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082, + 0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, + 0x0192, 0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, + 0x01A4, 0x81A1, 0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, + 0x01FE, 0x01F4, 0x81F1, 0x81D3, 0x01D6, 0x01DC, 0x81D9, + 0x01C8, 0x81CD, 0x81C7, 0x01C2, 0x0140, 0x8145, 0x814F, + 0x014A, 0x815B, 0x015E, 0x0154, 0x8151, 0x8173, 0x0176, + 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162, 0x8123, + 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132, + 0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, + 0x8101, 0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, + 0x8317, 0x0312, 0x0330, 0x8335, 0x833F, 0x033A, 0x832B, + 0x032E, 0x0324, 0x8321, 0x0360, 0x8365, 0x836F, 0x036A, + 0x837B, 0x037E, 0x0374, 0x8371, 0x8353, 0x0356, 0x035C, + 0x8359, 0x0348, 0x834D, 0x8347, 0x0342, 0x03C0, 0x83C5, + 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1, 0x83F3, + 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2, + 0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, + 0x03B2, 0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, + 0x0384, 0x8381, 0x0280, 0x8285, 0x828F, 0x028A, 0x829B, + 0x029E, 0x0294, 0x8291, 0x82B3, 0x02B6, 0x02BC, 0x82B9, + 0x02A8, 0x82AD, 0x82A7, 0x02A2, 0x82E3, 0x02E6, 0x02EC, + 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2, 0x02D0, 0x82D5, + 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1, 0x8243, + 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252, + 0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, + 0x8261, 0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, + 0x0234, 0x8231, 0x8213, 0x0216, 0x021C, 0x8219, 0x0208, + 0x820D, 0x8207, 0x0202, +]; + +Module.prototype.makeWord = function(a, b) { + return ((a & 0xff) | ((b & 0xff) << 8)); +}; + +Module.prototype.getLowByte = function(a) { + return (a & 0xff); +}; + +Module.prototype.getHighByte = function(a) { + return ((a >> 8) & 0xff); +}; + +Module.prototype.getLowWord = function(a) { + return (a & 0xffff); +}; + +Module.prototype.getHighWord = function(a) { + return ((a >> 16) & 0xffff); +}; + +Module.prototype.updateCRC = function(crcAccum, dataBlkPtr, dataBlkSize) { + let i = 0; + let j = 0; + let crc = crcAccum; + + for (j = 0; j < dataBlkSize; j++) { + i = ((crc >> 8) ^ dataBlkPtr[j]) & 0xff; + crc = (crc << 8) ^ crcTable[i]; + } + + return crc; +}; diff --git a/app/modules/robotis_RB100im_Practical_Assembly.png b/app/modules/robotis_RB100im_Practical_Assembly.png index f5d94164696039b6f3873f605d8d2ef81c7ad7d3..fb603c39ea28e266c4fa1039305ad6c6068ccb6a 100644 GIT binary patch literal 16871 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

%sG?dGngC;55I5k3#$A`$ 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