diff --git a/internal.js b/internal.js index 0fa1dc1..1da261d 100644 --- a/internal.js +++ b/internal.js @@ -8,7 +8,6 @@ var p7 = { decode: {}, commands: {}, - sendBuffer : new Uint8Array(1032), receiveBuffer : new Uint8Array(1032 + 1) }; @@ -23,7 +22,7 @@ var p7 = { /* Sum individual bytes * NOT + 1, as defined in fxReverse documentation. * Be sure it's under 256! */ - Uint8Array.prototype.p7Checksum = function () { + Array.prototype.p7Checksum = Uint8Array.prototype.p7Checksum = function () { return (((~(this.reduce((accumulator, currentValue) => accumulator + currentValue))) + 1) & 0xFF) } @@ -39,98 +38,54 @@ var p7 = { } /* Convert an ascii array into a string */ - Uint8Array.prototype.asciiToString = function () { + Array.prototype.asciiToString = Uint8Array.prototype.asciiToString = function () { let string = []; this.forEach((element) => string.push(String.fromCharCode(element))); return string.join(''); } /* Convert an ascii array representing an hex number into a number */ - Uint8Array.prototype.asciiToHex = function () { + Array.prototype.asciiToHex = Uint8Array.prototype.asciiToHex = function () { return Number('0x' + this.asciiToString()); } /* ---------------------Packet making--------------------- */ - /* Create a basic (Non-Extended) packet and push it to p7.sendBuffer */ - /* return it's length (6) */ - p7.make.basicPacket = (type, subtype) => { - //Set the Type (T), Subtype (ST) and Extended (EX) fields - p7.sendBuffer.set([type] - .concat(subtype.hexToAscii(2)) - .concat([0x30]) - , 0); + //Add the checksum to a packet + p7.make.checksum = (packet) => packet.concat(packet.slice(1, packet.length).p7Checksum().hexToAscii(2)); - //Set the Checksum (CS) field - p7.sendBuffer.set(p7.sendBuffer.slice(1, 4).p7Checksum().hexToAscii(2), 4); - - //Return the packet length - return 6; + /* Create a basic (Non-Extended) packet */ + /* Return the packet */ + p7.make.basicPacket = (type, subtype) => p7.make.checksum([type] //Type (T) + .concat(subtype.hexToAscii(2)) //Subtype (ST) + .concat([0x30])); //Extended (EX) + + /* Create an extended command packet */ + /* Return the packet */ + p7.make.extendedCommandPacket = (subtype, datatype, fileSize, commandArguments) => { + let data = [0x30, 0x30] //Overwrite (OW) + .concat([0x30, 0x30]) //Data type (DT) ?? + .concat(fileSize.hexToAscii(8)) //File size (FS) + .concat(commandArguments.flatMap((element) => element.length.hexToAscii(2))) //Size of Data {1..6} (SD{1..6}) + .concat(commandArguments.join('').toAscii()); //Data {1..6} (D{1..6}) + + return p7.make.checksum([0x01] //Type (T) + .concat(subtype.hexToAscii(2)) //Subtype (ST) + .concat([0x31]) //Extended (EX) + .concat(data.length.hexToAscii(4)) //Data size (DS) + .concat(data)); //Data (D) } - /* Fill the Data (D) field of a command packet in p7.sendBuffer */ - /* return the Data (D) field length */ - p7.make.commandPacketDataField = function (datatype, fileSize, commandArguments) { - //Set Overwrite (OW), Data type (DT) and File size (FS) fields - p7.sendBuffer.set([0x30, 0x30, /* Overwrite */ - 0x30, 0x30] /* Data type field ?? */ - .concat(fileSize.hexToAscii(8)) /* File size field */ - , 8); - - - let index = 18; - - //Set Size of Data {1-6} (SD{1-6}) fields - commandArguments.forEach(element => p7.sendBuffer.set(element.length.hexToAscii(2), (index += 2))); - - //Set Data {1-6} (D{1-6}) fields - let data = commandArguments.join(''); - p7.sendBuffer.set(data.toAscii(), 32); - - return data.length + 24; /* Overwrite (OW), Data type (DT), File size (FS) and Data size (DS) subfields of the Data (D) field of the packet */; - } - - /* Create an extended command packet and push it to p7.sendBuffer */ - /* return it's length */ - p7.make.extendedCommandPacket = function (subtype, datatype, fileSize, commandArguments) { - let dataSize = p7.make.commandPacketDataField(datatype, fileSize, commandArguments); /* Data field */ - - //Set Type (T), Subtype (ST), Extended (EX) and Data size (DT) fields - p7.sendBuffer.set([0x01] /* Type field */ - .concat(subtype.hexToAscii(2)) /* Subtype field */ - .concat([0x31]) /* Extended field */ - .concat(dataSize.hexToAscii(4)) /* Data size field */ - , 0); - - //Set Checksum (CS) field - p7.sendBuffer.set(p7.sendBuffer.slice(1, dataSize + 8).p7Checksum().hexToAscii(2), dataSize + 8); - - //Return it's length - return dataSize + 10 /* Type (T), Subtype (ST), Extended (EX), Data size (DT) and Checksum (CS) fields */; - } - - /* Create a data packet and push it to p7.sendBuffer */ - /* return it's length */ - p7.make.dataPacket = function (subtype, totalNumber, currentNumber, data) { - /* Set Type (T), Subtype (ST), Extended (EX), Data size (DS), - * Data (D) fields and Data (D) subfields : - * Total Number (TN), Current Number (CN), and Data (DD) */ - p7.sendBuffer.set([0x02] /* Type field */ - .concat(subtype.hexToAscii(2)) /* Subtype (ST) field */ - .concat([0x31]) /* Extended (EX) field */ - .concat( /* Data size (DS) field */ - (data.length + 8 /* Total number (TN) and Current number (CN) subfields */ ).hexToAscii(4)) - .concat(totalNumber.hexToAscii(4)) /* Total number (TN) subfield */ - .concat(currentNumber.hexToAscii(4)) /* Current number (CN) subfield */ - .concat(data) /* Data (DD) subfield */ - , 0); - - //Set Checksum (CS) field - p7.sendBuffer.set(p7.sendBuffer.slice(1, data.length + 16).p7Checksum().hexToAscii(2), data.length + 16); - - //Return it's length - return data.length + 18 /* All other fields and subfields */; - } + /* Create a data packet */ + /* Return the packet */ + p7.make.dataPacket = (subtype, totalNumber, currentNumber, data) => + p7.make.checksum([0x02] //Type field + .concat(subtype.hexToAscii(2)) //Subtype (ST) field + .concat([0x31]) //Extended (EX) field + .concat((data.length + 8 /* Total number (TN) and Current number (CN) subfields */ ).hexToAscii(4)) //Data size (DS) field + .concat(totalNumber.hexToAscii(4)) //Total number (TN) subfield + .concat(currentNumber.hexToAscii(4)) //Current number (CN) subfield + .concat(data)); //Data (DD) subfield /* ---------------------Packet decoding--------------------- */ @@ -198,52 +153,47 @@ var p7 = { p7.receive.packet = function () { console.log("%cReceiving...", "color: orange"); - var packetInfo = {} - var transfered = 0; + var packetInfo = {}; + var transfered = 0; //Already transfered bytes return p7.device.transferIn(2, 64) .then(function receive(transferInResult) { - if (!transferInResult.data.byteLength) { - console.log('The buffer was empty, trying again!'); - return p7.device.transferIn(2, 64).then(receive); - } + if (!transferInResult.data.byteLength) + return p7.device.transferIn(2, 64).then(receive); - p7.receiveBuffer.set(new Uint8Array(transferInResult.data.buffer), 0); + p7.receiveBuffer.set(new Uint8Array(transferInResult.data.buffer), 0); - packetInfo.length = 6; //Type (T), Subtype (S), Extended (EX) and Checksum (CS) fields + packetInfo.length = 6; //Type (T), Subtype (S), Extended (EX) and Checksum (CS) fields - //Set Type (T) field - packetInfo.type = p7.receiveBuffer[0]; + //Set Type (T) field + packetInfo.type = p7.receiveBuffer[0]; - //Set Subtype (ST) field - packetInfo.subtype = p7.receiveBuffer.slice(1, 2).asciiToHex(); + //Set Subtype (ST) field + packetInfo.subtype = p7.receiveBuffer.slice(1, 2).asciiToHex(); - //Set Extended (EX) field - packetInfo.extended = (p7.receiveBuffer[3] === 0x31); - }).then(() => { - if (packetInfo.extended) { - console.log('Packet is extended, receiving...'); - - //Set Data size (DS) field - packetInfo.dataSize = p7.receiveBuffer.slice(4, 8).asciiToHex(); + //Set Extended (EX) field + if ((packetInfo.extended = (p7.receiveBuffer[3] === 0x31))) { + //Set Data size (DS) field + packetInfo.dataSize = p7.receiveBuffer.slice(4, 8).asciiToHex(); - packetInfo.length += packetInfo.dataSize + 4; //Data size field + packetInfo.length += packetInfo.dataSize + 4; //Data size field - var transfered = 64; - + if ((transfered += 64) < packetInfo.length) return p7.device.transferIn(2, 64) .then(function receiveRemainingPackets(transferInResult) { p7.receiveBuffer.set(new Uint8Array(transferInResult.data.buffer), transfered); if ((transfered += 64) < packetInfo.length) return p7.device.transferIn(2, 64).then(receiveRemainingPackets); - }) + }); } }).then(() => { //Compute checksum let checksumError = ((packetInfo.checksum = p7.receiveBuffer.slice(packetInfo.length - 2, packetInfo.length).asciiToHex()) !== p7.receiveBuffer.slice(1, packetInfo.length - 2).p7Checksum()); + /* TODO: handle checksum errors */ console.log(checksumError); + return packetInfo; }).catch((err) => { err.message = "Couldn't receive the " + transfered + " to " + (transfered + 64) + " bytes of the packet: " + err.message; @@ -254,28 +204,12 @@ var p7 = { /* ---------------------Packet sending--------------------- */ - p7.send.packet = async function (length) { - let responsePacketInfo = undefined; - let tries = 0; + p7.send.packet = async function (buffer) { console.log("%cSending packet...", "color: green"); - try { - await p7.device.transferOut(1, p7.sendBuffer.slice(0, length)); - } catch (err) { - err.message = "Couldn't send the packet: " + err.message; - throw err; - } - try { - responsePacketInfo = await p7.receive.packet(); - } catch (err) { - err.message = "Couldn't receive the response packet: " + err.message; - throw err; - } - return responsePacketInfo; + return p7.device.transferOut(1, Uint8Array.from(buffer)) + .then(() => p7.receive.packet()); } - - - p7.send.basicPacket = async (type, subtype) => await p7.send.packet(p7.make.basicPacket(type, subtype)); p7.send.extendedCommandPacket = async (subtype, datatype, fileSize, commandArguments) => await p7.send.packet(p7.make.extendedCommandPacket(subtype, datatype, fileSize, commandArguments)); @@ -457,6 +391,7 @@ var p7 = { document.getElementById('connect').addEventListener('click', async function () { + var time = performance.now(); try { await p7.init(); @@ -474,8 +409,6 @@ var p7 = { console.log(await p7.commands.list('fls0')); - console.log(await p7.commands.createDirectory('test', 'fls0')); - - console.log(await p7.commands.list('fls0')); + console.log(performance.now() - time); }); })(); \ No newline at end of file