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