diff --git a/README.md b/README.md index eb33d1d..da2c343 100644 --- a/README.md +++ b/README.md @@ -22,5 +22,5 @@ The buttons are actually diconnected, if you want to test, dive through the code # Thanks to : -Simon Lothar for his fx-reverse doc -Cakeisalie5 for his p7 command line tool \ No newline at end of file +- Simon Lothar for his fx-reverse doc +- Cakeisalie5 for his p7 command line tool \ No newline at end of file diff --git a/index.js b/index.js index e55efe3..923d096 100644 --- a/index.js +++ b/index.js @@ -1,14 +1 @@ -'use strict' -/*function test(){ - throw 'geswg'; - console.log('err'); -} - - -try { - test(); - console.log('err'); -} catch(err) { - console.error(err); -}*/ - +'use strict' \ No newline at end of file diff --git a/internal.js b/internal.js index 8578ee5..194e5e9 100644 --- a/internal.js +++ b/internal.js @@ -9,7 +9,11 @@ var p7 = { }; + (function() { + /* ---------------------Global variables--------------------- */ + var checksumTries = 0; + /* ---------------------Utilitaries--------------------- */ /* Sum individual bytes @@ -157,64 +161,85 @@ var p7 = { p7.receive.packet = async function () { console.log("%cReceiving...", "color: orange"); - let checksumError = 0; - let transferInResult = undefined; + let transferInResult = undefined; + try { while (! (transferInResult = await p7.device.transferIn(2, 64)).data.byteLength) console.log('The buffer was empty, trying again!'); - + p7.receiveBuffer.set(new Uint8Array(transferInResult.data.buffer), 0); } catch (err) { throw new Error("Couldn't receive the first 64 bytes of the packet: " + err.message); } - - let packetInfo = {}; - + + let packetInfo = {} packetInfo.length = 6; /* Type (T), Subtype (S), Extended (EX) and Checksum (CS) fields */ - + //Set Type (T) field packetInfo.type = p7.receiveBuffer[0]; - + //Set Subtype (ST) field packetInfo.subtype = p7.receiveBuffer.slice(1, 2).asciiToHex(); - + //Set Extended (EX) field packetInfo.extended = (p7.receiveBuffer[3] === 0x31); - + if (packetInfo.extended) { //Set Data size (DS) field packetInfo.dataSize = p7.receiveBuffer.slice(4, 8).asciiToHex(); - + packetInfo.length += packetInfo.dataSize + 4 /* Data size field */; - - let transfered = 0; - - while (transfered < packetInfo.length) { + + for (let transfered = 64 ; transfered < packetInfo.length ; transfered += 64) { try { transferInResult = await p7.device.transferIn(2, 64); } catch (err) { throw new Error("Couldn't receive the " + transfered + "th and following 64 bytes of the packet: " + err.message) } - - p7.receiveBuffer.set(new Uint8Array(transferInResult.data.buffer), transfered += 64); + + p7.receiveBuffer.set(new Uint8Array(transferInResult.data.buffer), transfered); } } - - /* Compute checksum */ - checksumError = ((packetInfo.checksum = p7.receiveBuffer.slice(packetInfo.length - 2, packetInfo.length).asciiToHex()) !== p7.receiveBuffer.slice(1, packetInfo.length - 2).p7Checksum()); - console.log(checksumError); + /* Compute checksum */ + let checksumError = ((packetInfo.checksum = p7.receiveBuffer.slice(packetInfo.length - 2, packetInfo.length).asciiToHex()) !== p7.receiveBuffer.slice(1, packetInfo.length - 2).p7Checksum()); + + if (checksumError && (checksumTries++) < 3) { + console.log('there was a checksum error'); + try { + packetInfo = await p7.send.packet(p7.make.basicPacket(p7PacketType.error, errorSubtype.resendRequest)); + } catch (err) { + throw new Error("Couldn't send the resend request: " + err.message); + } + } + if (checksumTries === 4) + throw new Error("There were three checksum in a row, the calculator or the cable may be broken!"); + + return packetInfo; } /* ---------------------Packet sending--------------------- */ - /* Doesn't work for now on */ p7.send.packet = async function (length) { - try { - await p7.device.transferOut(1, p7.sendBuffer.slice(0, length)); - } catch (err) { - throw new Error("Couldn't send the packet: " + err.message); + let responsePacketInfo = undefined; + let tries = 0; + console.log("%cSending packet...", "color: green"); + for ( ; tries === 0 || (responsePacketInfo.type === p7PacketType.error && responsePacketInfo.subtype === errorSubtype.resendRequest && tries < 3) ; tries++) { + try { + await p7.device.transferOut(1, p7.sendBuffer.slice(0, length)); + } catch (err) { + throw new Error("Couldn't send the packet: " + err.message); + } + try { + responsePacketInfo = await p7.receive.packet(); + } catch (err) { + throw new Error("Couldn't receive the response packet: " + err.message); + } } + if (tries === 3) + throw new Error("Received three resend request in a row, abandon"); + + return responsePacketInfo; }; /* ---------------------Initialization and exiting--------------------- */ @@ -362,16 +387,18 @@ var p7 = { try { await p7.send.packet(p7.make.basicPacket(p7PacketType.check, checkSubtype.initialization)); - await p7.receive.packet(); } catch (err) { - console.log(err); + console.error(err); + return err; } - - await p7.send.packet(p7.make.basicPacket(p7PacketType.command, sysCommandSubtype.getDeviceInfo)); - - await p7.receive.packet(); + try { + await p7.send.packet(p7.make.basicPacket(p7PacketType.command, sysCommandSubtype.getDeviceInfo)); + } catch (err) { + console.error(err); + return err; + } console.log(p7.decode.extendedAckPacket());