From a7fe6318e20142630a4ddeda3acf0eabae0f2b4c Mon Sep 17 00:00:00 2001 From: Dakota Date: Mon, 6 Apr 2020 02:22:47 -0400 Subject: [PATCH] WIP: Ardulib not loading object from DOM --- client/public/index.html | 17 +- .../{src => public}/lib/arduino_compressed.js | 0 .../{src => public}/lib/blockly_compressed.js | 0 .../{src => public}/lib/blocks_compressed.js | 0 client/{src => public}/lib/en.js | 0 .../lib/javascript_compressed.js | 0 client/{src => public}/lib/off.cpp.hex | 0 client/{src => public}/lib/on.cpp.hex | 0 client/src/App.css | 91 ++- client/src/App.js | 142 +++- client/src/assets/arduino.png | Bin 0 -> 30049 bytes client/src/assets/maker.png | Bin 0 -> 37552 bytes client/src/assets/science.png | Bin 0 -> 29352 bytes client/src/assets/style.css | 79 ++ client/src/{lib => }/avrgirl-arduino.js | 768 +++++++++--------- client/src/{lib/index.js => scripts.js} | 26 +- 16 files changed, 680 insertions(+), 443 deletions(-) rename client/{src => public}/lib/arduino_compressed.js (100%) rename client/{src => public}/lib/blockly_compressed.js (100%) rename client/{src => public}/lib/blocks_compressed.js (100%) rename client/{src => public}/lib/en.js (100%) rename client/{src => public}/lib/javascript_compressed.js (100%) rename client/{src => public}/lib/off.cpp.hex (100%) rename client/{src => public}/lib/on.cpp.hex (100%) create mode 100644 client/src/assets/arduino.png create mode 100644 client/src/assets/maker.png create mode 100644 client/src/assets/science.png create mode 100644 client/src/assets/style.css rename client/src/{lib => }/avrgirl-arduino.js (99%) rename client/src/{lib/index.js => scripts.js} (61%) diff --git a/client/public/index.html b/client/public/index.html index aa069f27..93f05a51 100644 --- a/client/public/index.html +++ b/client/public/index.html @@ -24,7 +24,22 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + STEM+C + + + + + + + + + + + + + + + diff --git a/client/src/lib/arduino_compressed.js b/client/public/lib/arduino_compressed.js similarity index 100% rename from client/src/lib/arduino_compressed.js rename to client/public/lib/arduino_compressed.js diff --git a/client/src/lib/blockly_compressed.js b/client/public/lib/blockly_compressed.js similarity index 100% rename from client/src/lib/blockly_compressed.js rename to client/public/lib/blockly_compressed.js diff --git a/client/src/lib/blocks_compressed.js b/client/public/lib/blocks_compressed.js similarity index 100% rename from client/src/lib/blocks_compressed.js rename to client/public/lib/blocks_compressed.js diff --git a/client/src/lib/en.js b/client/public/lib/en.js similarity index 100% rename from client/src/lib/en.js rename to client/public/lib/en.js diff --git a/client/src/lib/javascript_compressed.js b/client/public/lib/javascript_compressed.js similarity index 100% rename from client/src/lib/javascript_compressed.js rename to client/public/lib/javascript_compressed.js diff --git a/client/src/lib/off.cpp.hex b/client/public/lib/off.cpp.hex similarity index 100% rename from client/src/lib/off.cpp.hex rename to client/public/lib/off.cpp.hex diff --git a/client/src/lib/on.cpp.hex b/client/public/lib/on.cpp.hex similarity index 100% rename from client/src/lib/on.cpp.hex rename to client/public/lib/on.cpp.hex diff --git a/client/src/App.css b/client/src/App.css index 74b5e053..ac26c54b 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -1,38 +1,79 @@ -.App { - text-align: center; +body { + margin: 0; } -.App-logo { - height: 40vmin; - pointer-events: none; +h3, p { + margin: 0; } -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } +.flex { + display: flex; } -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; +.flex-column { flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); +} + +.space-between { + justify-content: space-between; +} + +#container { + height: 100vh; + background-color: rgb(241, 241, 241); +} + +.vertical-container { + margin: 1.5em; +} + +#nav-container { + margin: 0; + background-color: rgb(32, 145, 173); color: white; + align-items: center; +} + +#title { + flex: 10; + margin: 0.5em; } -.App-link { - color: #61dafb; +#action-btn-container { + flex: 1; + margin: 1em; } -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } +#top-container { + flex: 1; + margin-bottom: 0.75em } + +.card { + background-color: white; + padding: 1em; +} + +#description-container { + height: 100%; +} + +#bottom-container { + flex: 6; + margin-top: 0.75em +} + +#blockly-canvas { + flex: 2; +} + +#models-container { + flex: 1; + margin-left: 1.5em; +} + +#mode-img { + width: auto; + height: auto; +} + diff --git a/client/src/App.js b/client/src/App.js index ce9cbd29..82edcdbf 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -1,26 +1,124 @@ -import React from 'react'; -import logo from './logo.svg'; -import './App.css'; +import React, {useState, useRef} from "react"; +import "./App.css"; +import {getArduino, getJS, compileArduinoCode} from "./scripts"; function App() { - return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - -
-
- ); + const [board, updateBoard] = useState("uno"); + + const alertArduino = () => { + alert(getArduino()); + }; + + const alertJS = () => { + alert(getJS()); + }; + + const alertCompile = () => { + alert(compileArduinoCode()); + }; + + return ( + +
+ +
+
+

Maker Activity X

+

Instructions / Science Brief: + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt + ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat + non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+
+
+
+
+
+

Activity Models

+ +
+ + + + + + + + + + + + +
+
+
+
+ + {/* This xml is for the blocks' menu we will provide. Here are examples on how to include categories and subcategories */} + {/**/} + +); + } -export default App; +export default App; \ No newline at end of file diff --git a/client/src/assets/arduino.png b/client/src/assets/arduino.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4451a5bbe357d6f0377c37ae6a29a680f0a58e GIT binary patch literal 30049 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 literal 0 HcmV?d00001 diff --git a/client/src/assets/science.png b/client/src/assets/science.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe141d26179fe0d16da4a1835a32321a0f92b67 GIT binary patch literal 29352 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 RgVQFTD9NeG!lX?C{|7TGOy~dr literal 0 HcmV?d00001 diff --git a/client/src/assets/style.css b/client/src/assets/style.css new file mode 100644 index 00000000..3fa80890 --- /dev/null +++ b/client/src/assets/style.css @@ -0,0 +1,79 @@ +body { + margin: 0; +} + +h3, p { + margin: 0; +} + +.flex { + display: flex; +} + +.flex-column { + flex-direction: column; +} + +.space-between { + justify-content: space-between; +} + +#container { + height: 100vh; + background-color: rgb(241, 241, 241); +} + +.vertical-container { + margin: 1.5em; +} + +#nav-container { + margin: 0; + background-color: rgb(32, 145, 173); + color: white; + align-items: center; +} + +#title { + flex: 10; + margin: 0.5em; +} + +#action-btn-container { + flex: 1; + margin: 1em; +} + +#top-container { + flex: 1; + margin-bottom: 0.75em +} + +.card { + background-color: white; + padding: 1em; +} + +#description-container { + height: 100%; +} + +#bottom-container { + flex: 6; + margin-top: 0.75em +} + +#blockly-canvas { + flex: 2; +} + +#models-container { + flex: 1; + margin-left: 1.5em; +} + +#mode-img { + width: auto; + height: auto; +} + diff --git a/client/src/lib/avrgirl-arduino.js b/client/src/avrgirl-arduino.js similarity index 99% rename from client/src/lib/avrgirl-arduino.js rename to client/src/avrgirl-arduino.js index 15ca993a..45339890 100644 --- a/client/src/lib/avrgirl-arduino.js +++ b/client/src/avrgirl-arduino.js @@ -1,3 +1,5 @@ +/* eslint-disable */ + (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); @@ -10411,139 +10413,139 @@ module.exports = Array.isArray || function (arr) { /* 22 */ /***/ (function(module, exports, __webpack_require__) { -/* WEBPACK VAR INJECTION */(function(Buffer) {//Intel Hex record types -const DATA = 0, - END_OF_FILE = 1, - EXT_SEGMENT_ADDR = 2, - START_SEGMENT_ADDR = 3, - EXT_LINEAR_ADDR = 4, - START_LINEAR_ADDR = 5; - -const EMPTY_VALUE = 0xFF; - -/* intel_hex.parse(data) - `data` - Intel Hex file (string in ASCII format or Buffer Object) - `bufferSize` - the size of the Buffer containing the data (optional) - - returns an Object with the following properties: - - data - data as a Buffer Object, padded with 0xFF - where data is empty. - - startSegmentAddress - the address provided by the last - start segment address record; null, if not given - - startLinearAddress - the address provided by the last - start linear address record; null, if not given - Special thanks to: http://en.wikipedia.org/wiki/Intel_HEX -*/ -exports.parse = function parseIntelHex(data, bufferSize) { - if(data instanceof Buffer) - data = data.toString("ascii"); - //Initialization - var buf = new Buffer(bufferSize || 8192), - bufLength = 0, //Length of data in the buffer - highAddress = 0, //upper address - startSegmentAddress = null, - startLinearAddress = null, - lineNum = 0, //Line number in the Intel Hex string - pos = 0; //Current position in the Intel Hex string - const SMALLEST_LINE = 11; - while(pos + SMALLEST_LINE <= data.length) - { - //Parse an entire line - if(data.charAt(pos++) != ":") - throw new Error("Line " + (lineNum+1) + - " does not start with a colon (:)."); - else - lineNum++; - //Number of bytes (hex digit pairs) in the data field - var dataLength = parseInt(data.substr(pos, 2), 16); - pos += 2; - //Get 16-bit address (big-endian) - var lowAddress = parseInt(data.substr(pos, 4), 16); - pos += 4; - //Record type - var recordType = parseInt(data.substr(pos, 2), 16); - pos += 2; - //Data field (hex-encoded string) - var dataField = data.substr(pos, dataLength * 2), - dataFieldBuf = new Buffer(dataField, "hex"); - pos += dataLength * 2; - //Checksum - var checksum = parseInt(data.substr(pos, 2), 16); - pos += 2; - //Validate checksum - var calcChecksum = (dataLength + (lowAddress >> 8) + - lowAddress + recordType) & 0xFF; - for(var i = 0; i < dataLength; i++) - calcChecksum = (calcChecksum + dataFieldBuf[i]) & 0xFF; - calcChecksum = (0x100 - calcChecksum) & 0xFF; - if(checksum != calcChecksum) - throw new Error("Invalid checksum on line " + lineNum + - ": got " + checksum + ", but expected " + calcChecksum); - //Parse the record based on its recordType - switch(recordType) - { - case DATA: - var absoluteAddress = highAddress + lowAddress; - //Expand buf, if necessary - if(absoluteAddress + dataLength >= buf.length) - { - var tmp = new Buffer((absoluteAddress + dataLength) * 2); - buf.copy(tmp, 0, 0, bufLength); - buf = tmp; - } - //Write over skipped bytes with EMPTY_VALUE - if(absoluteAddress > bufLength) - buf.fill(EMPTY_VALUE, bufLength, absoluteAddress); - //Write the dataFieldBuf to buf - dataFieldBuf.copy(buf, absoluteAddress); - bufLength = Math.max(bufLength, absoluteAddress + dataLength); - break; - case END_OF_FILE: - if(dataLength != 0) - throw new Error("Invalid EOF record on line " + - lineNum + "."); - return { - "data": buf.slice(0, bufLength), - "startSegmentAddress": startSegmentAddress, - "startLinearAddress": startLinearAddress - }; - break; - case EXT_SEGMENT_ADDR: - if(dataLength != 2 || lowAddress != 0) - throw new Error("Invalid extended segment address record on line " + - lineNum + "."); - highAddress = parseInt(dataField, 16) << 4; - break; - case START_SEGMENT_ADDR: - if(dataLength != 4 || lowAddress != 0) - throw new Error("Invalid start segment address record on line " + - lineNum + "."); - startSegmentAddress = parseInt(dataField, 16); - break; - case EXT_LINEAR_ADDR: - if(dataLength != 2 || lowAddress != 0) - throw new Error("Invalid extended linear address record on line " + - lineNum + "."); - highAddress = parseInt(dataField, 16) << 16; - break; - case START_LINEAR_ADDR: - if(dataLength != 4 || lowAddress != 0) - throw new Error("Invalid start linear address record on line " + - lineNum + "."); - startLinearAddress = parseInt(dataField, 16); - break; - default: - throw new Error("Invalid record type (" + recordType + - ") on line " + lineNum); - break; - } - //Advance to the next line - if(data.charAt(pos) == "\r") - pos++; - if(data.charAt(pos) == "\n") - pos++; - } - throw new Error("Unexpected end of input: missing or invalid EOF record."); +/* WEBPACK VAR INJECTION */(function(Buffer) {//Intel Hex record types +const DATA = 0, + END_OF_FILE = 1, + EXT_SEGMENT_ADDR = 2, + START_SEGMENT_ADDR = 3, + EXT_LINEAR_ADDR = 4, + START_LINEAR_ADDR = 5; + +const EMPTY_VALUE = 0xFF; + +/* intel_hex.parse(data) + `data` - Intel Hex file (string in ASCII format or Buffer Object) + `bufferSize` - the size of the Buffer containing the data (optional) + + returns an Object with the following properties: + - data - data as a Buffer Object, padded with 0xFF + where data is empty. + - startSegmentAddress - the address provided by the last + start segment address record; null, if not given + - startLinearAddress - the address provided by the last + start linear address record; null, if not given + Special thanks to: http://en.wikipedia.org/wiki/Intel_HEX +*/ +exports.parse = function parseIntelHex(data, bufferSize) { + if(data instanceof Buffer) + data = data.toString("ascii"); + //Initialization + var buf = new Buffer(bufferSize || 8192), + bufLength = 0, //Length of data in the buffer + highAddress = 0, //upper address + startSegmentAddress = null, + startLinearAddress = null, + lineNum = 0, //Line number in the Intel Hex string + pos = 0; //Current position in the Intel Hex string + const SMALLEST_LINE = 11; + while(pos + SMALLEST_LINE <= data.length) + { + //Parse an entire line + if(data.charAt(pos++) != ":") + throw new Error("Line " + (lineNum+1) + + " does not start with a colon (:)."); + else + lineNum++; + //Number of bytes (hex digit pairs) in the data field + var dataLength = parseInt(data.substr(pos, 2), 16); + pos += 2; + //Get 16-bit address (big-endian) + var lowAddress = parseInt(data.substr(pos, 4), 16); + pos += 4; + //Record type + var recordType = parseInt(data.substr(pos, 2), 16); + pos += 2; + //Data field (hex-encoded string) + var dataField = data.substr(pos, dataLength * 2), + dataFieldBuf = new Buffer(dataField, "hex"); + pos += dataLength * 2; + //Checksum + var checksum = parseInt(data.substr(pos, 2), 16); + pos += 2; + //Validate checksum + var calcChecksum = (dataLength + (lowAddress >> 8) + + lowAddress + recordType) & 0xFF; + for(var i = 0; i < dataLength; i++) + calcChecksum = (calcChecksum + dataFieldBuf[i]) & 0xFF; + calcChecksum = (0x100 - calcChecksum) & 0xFF; + if(checksum != calcChecksum) + throw new Error("Invalid checksum on line " + lineNum + + ": got " + checksum + ", but expected " + calcChecksum); + //Parse the record based on its recordType + switch(recordType) + { + case DATA: + var absoluteAddress = highAddress + lowAddress; + //Expand buf, if necessary + if(absoluteAddress + dataLength >= buf.length) + { + var tmp = new Buffer((absoluteAddress + dataLength) * 2); + buf.copy(tmp, 0, 0, bufLength); + buf = tmp; + } + //Write over skipped bytes with EMPTY_VALUE + if(absoluteAddress > bufLength) + buf.fill(EMPTY_VALUE, bufLength, absoluteAddress); + //Write the dataFieldBuf to buf + dataFieldBuf.copy(buf, absoluteAddress); + bufLength = Math.max(bufLength, absoluteAddress + dataLength); + break; + case END_OF_FILE: + if(dataLength != 0) + throw new Error("Invalid EOF record on line " + + lineNum + "."); + return { + "data": buf.slice(0, bufLength), + "startSegmentAddress": startSegmentAddress, + "startLinearAddress": startLinearAddress + }; + break; + case EXT_SEGMENT_ADDR: + if(dataLength != 2 || lowAddress != 0) + throw new Error("Invalid extended segment address record on line " + + lineNum + "."); + highAddress = parseInt(dataField, 16) << 4; + break; + case START_SEGMENT_ADDR: + if(dataLength != 4 || lowAddress != 0) + throw new Error("Invalid start segment address record on line " + + lineNum + "."); + startSegmentAddress = parseInt(dataField, 16); + break; + case EXT_LINEAR_ADDR: + if(dataLength != 2 || lowAddress != 0) + throw new Error("Invalid extended linear address record on line " + + lineNum + "."); + highAddress = parseInt(dataField, 16) << 16; + break; + case START_LINEAR_ADDR: + if(dataLength != 4 || lowAddress != 0) + throw new Error("Invalid start linear address record on line " + + lineNum + "."); + startLinearAddress = parseInt(dataField, 16); + break; + default: + throw new Error("Invalid record type (" + recordType + + ") on line " + lineNum); + break; + } + //Advance to the next line + if(data.charAt(pos) == "\r") + pos++; + if(data.charAt(pos) == "\n") + pos++; + } + throw new Error("Unexpected end of input: missing or invalid EOF record."); }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0).Buffer)) @@ -17847,256 +17849,256 @@ module.exports = Avr109; /* 62 */ /***/ (function(module, exports, __webpack_require__) { -/* WEBPACK VAR INJECTION */(function(process, Buffer) {var - intelHex = __webpack_require__(22), - Stream = __webpack_require__(63).Stream, - util = __webpack_require__(8); - -var out = module.exports = {}; - -var d = function(c) { - return (c + '').charCodeAt(0); -}; - -out.Flasher = function(serialport, options) { - var that = this; - this.options = options || {}; - this.sp = serialport; - this.signature = this.options.signature || 'LUFACDC'; - - if (this.options.debug) { - this.sp.on('data', function(d) { - process.stdout.write(' -> '); - - for (var i=0; i 126) { - c = '.'; - } - - process.stdout.write(c + ' [' + d.readUInt8(i).toString(16) + '] '); - } - process.stdout.write('\n'); - }); - } - - this.c = function(value, fn, expectedResponseLength) { - that.cmds.push({ - value : value, - callback : function(data) { - fn && fn(data); - }, - expectedResponseLength: expectedResponseLength - }); - return this; - } - - this.flashChunkSize = 0; - this.bytes = []; - this.cmds = []; -}; - -out.Flasher.prototype = { - run : function(fn) { - var that = this; - process.nextTick(function() { - if (that.running) { return; } - var cmd = that.cmds.shift(); - - if (cmd) { - running = true; - that.options.debug && process.stdout.write('Send: ' + cmd.value); - var response = new Buffer(0); - var onData = function(d) { - response = Buffer.concat([ - response, - d - ]); - - if (cmd.expectedResponseLength === undefined || // optional expected length not passed in - cmd.expectedResponseLength <= response.length) { - that.sp.removeListener('data', onData); - that.running = false; - cmd.callback(response); - - process.nextTick(function() { - if (that.cmds.length > 0) { - that.run(fn); - } else { - fn && fn(); - } - }); - } - }; - - that.sp.on('data', onData); - - that.sp.write(cmd.value); - } - }); - }, - - prepare : function(fn) { - var that = this; - this.c('S', function(d) { - if (d.toString() !== that.signature) { - fn(new Error('Invalid device signature; expecting: ' + that.signature + ' received: ' + d.toString())); - } - }) - .c('V') - .c('v') - .c('p') - .c('a') - .c('b', function(d) { - if ((d.toString() || 'X')[0] != 'Y') { - fn(new Error('Buffered memory access not supported.')); - } - that.flashChunkSize = d.readUInt16BE(1); - }) - .c('t') - .c('TD') - .c('P') - .c('F') - .c('F') - .c('F') - .c('N') - .c('N') - .c('N') - .c('Q') - .c('Q') - .c('Q') - .c([d('A'), 0x03, 0xfc]) - .c([d('g'), 0x00, 0x01, d('E')]) - .c([d('A'), 0x03, 0xff]) - .c([d('g'), 0x00, 0x01, d('E')]) - .c([d('A'), 0x03, 0xff]) - .c([d('g'), 0x00, 0x01, d('E')]) - .c([d('A'), 0x03, 0xff]) - .c([d('g'), 0x00, 0x01, d('E')]) - - this.run(function() { - fn(null, that); - }); - }, - - erase : function(fn) { - this.c('e', function() { - fn && fn(); - }) // erase - - this.run(); - }, - - program : function(fullString, fn) { - - var - that = this, - converter, - bytes = []; - - this.totalBytes = 0; - - this.c([d('A'), 0x00, 0x00], function() { - converter = intelHex.parse(fullString); - - that.totalBytes = converter.data.length; - // buffer the bytes so we can push them in the expected size on 'end' - Array.prototype.push.apply(bytes, converter.data); - // copy this array so we can use it strictly for comparing later - that.allBytes = bytes; - - that.options.debug && console.log('programming', bytes.length, 'bytes'); - that.chunksSent = []; - - for (var i=0; i> 8) & 0xFF, chunk.length & 0xFF, d('F')].concat(chunk)); - } - }); - - this.run(function() { fn && fn() }); - }, - - verify : function(fn) { - var that = this; - // compare flash on device with the chunks we sent - this.c([d('A'), 0x00, 0x00], function() { - - var - index = 0, - compare = function(deviceData) { - var error = null; - index++; - - if (!that.allBytes.length) { - fn && fn(); - return; - } - - var deviceDataLength = deviceData.length; - var localChunk = that.allBytes.splice(0, deviceDataLength); - - // iterate through the bytes sent to compare with the latest bytes received - localChunk.forEach(function(val, idx) { - if (val !== deviceData.readUInt8(idx)) { - error = new Error('Firmware on the device does not match local data'); - } - }); - - if (error) { - return fn(error); - } - - process.nextTick(function() { - var readSize = that.flashChunkSize; - that.options.debug && console.log(that.totalBytes - index*that.flashChunkSize); - if (that.totalBytes - index*that.flashChunkSize < that.flashChunkSize) { - readSize = that.totalBytes - index*that.flashChunkSize; - } - that.c([d('g'), (readSize >> 8) & 0xFF, readSize & 0xFF, d('F')], compare, readSize); - that.run(); - }); - }; - - that.options.debug && console.log('\n\nVerifying flash..') - - that.c([d('g'), (that.flashChunkSize >> 8) & 0xFF, that.flashChunkSize & 0xFF, d('F')], compare, that.flashChunkSize); - that.run(); - }); - that.run(); - }, - - fuseCheck : fuseCheck = function(fn) { - this.options.debug && console.log('checking fuses'); - // fuse check - this.c('F') - .c('F') - .c('F') - .c('N') - .c('N') - .c('N') - .c('Q') - .c('Q') - .c('Q') - .c('L') - .c('E'); - - this.run(function() { - fn(); - }); - } -}; - -out.init = function(serialport, options, fn) { - if (typeof options === 'function' && !fn) { - fn = options; - options = {}; - } - - var flasher = new out.Flasher(serialport, options); - flasher.prepare(fn); -}; +/* WEBPACK VAR INJECTION */(function(process, Buffer) {var + intelHex = __webpack_require__(22), + Stream = __webpack_require__(63).Stream, + util = __webpack_require__(8); + +var out = module.exports = {}; + +var d = function(c) { + return (c + '').charCodeAt(0); +}; + +out.Flasher = function(serialport, options) { + var that = this; + this.options = options || {}; + this.sp = serialport; + this.signature = this.options.signature || 'LUFACDC'; + + if (this.options.debug) { + this.sp.on('data', function(d) { + process.stdout.write(' -> '); + + for (var i=0; i 126) { + c = '.'; + } + + process.stdout.write(c + ' [' + d.readUInt8(i).toString(16) + '] '); + } + process.stdout.write('\n'); + }); + } + + this.c = function(value, fn, expectedResponseLength) { + that.cmds.push({ + value : value, + callback : function(data) { + fn && fn(data); + }, + expectedResponseLength: expectedResponseLength + }); + return this; + } + + this.flashChunkSize = 0; + this.bytes = []; + this.cmds = []; +}; + +out.Flasher.prototype = { + run : function(fn) { + var that = this; + process.nextTick(function() { + if (that.running) { return; } + var cmd = that.cmds.shift(); + + if (cmd) { + running = true; + that.options.debug && process.stdout.write('Send: ' + cmd.value); + var response = new Buffer(0); + var onData = function(d) { + response = Buffer.concat([ + response, + d + ]); + + if (cmd.expectedResponseLength === undefined || // optional expected length not passed in + cmd.expectedResponseLength <= response.length) { + that.sp.removeListener('data', onData); + that.running = false; + cmd.callback(response); + + process.nextTick(function() { + if (that.cmds.length > 0) { + that.run(fn); + } else { + fn && fn(); + } + }); + } + }; + + that.sp.on('data', onData); + + that.sp.write(cmd.value); + } + }); + }, + + prepare : function(fn) { + var that = this; + this.c('S', function(d) { + if (d.toString() !== that.signature) { + fn(new Error('Invalid device signature; expecting: ' + that.signature + ' received: ' + d.toString())); + } + }) + .c('V') + .c('v') + .c('p') + .c('a') + .c('b', function(d) { + if ((d.toString() || 'X')[0] != 'Y') { + fn(new Error('Buffered memory access not supported.')); + } + that.flashChunkSize = d.readUInt16BE(1); + }) + .c('t') + .c('TD') + .c('P') + .c('F') + .c('F') + .c('F') + .c('N') + .c('N') + .c('N') + .c('Q') + .c('Q') + .c('Q') + .c([d('A'), 0x03, 0xfc]) + .c([d('g'), 0x00, 0x01, d('E')]) + .c([d('A'), 0x03, 0xff]) + .c([d('g'), 0x00, 0x01, d('E')]) + .c([d('A'), 0x03, 0xff]) + .c([d('g'), 0x00, 0x01, d('E')]) + .c([d('A'), 0x03, 0xff]) + .c([d('g'), 0x00, 0x01, d('E')]) + + this.run(function() { + fn(null, that); + }); + }, + + erase : function(fn) { + this.c('e', function() { + fn && fn(); + }) // erase + + this.run(); + }, + + program : function(fullString, fn) { + + var + that = this, + converter, + bytes = []; + + this.totalBytes = 0; + + this.c([d('A'), 0x00, 0x00], function() { + converter = intelHex.parse(fullString); + + that.totalBytes = converter.data.length; + // buffer the bytes so we can push them in the expected size on 'end' + Array.prototype.push.apply(bytes, converter.data); + // copy this array so we can use it strictly for comparing later + that.allBytes = bytes; + + that.options.debug && console.log('programming', bytes.length, 'bytes'); + that.chunksSent = []; + + for (var i=0; i> 8) & 0xFF, chunk.length & 0xFF, d('F')].concat(chunk)); + } + }); + + this.run(function() { fn && fn() }); + }, + + verify : function(fn) { + var that = this; + // compare flash on device with the chunks we sent + this.c([d('A'), 0x00, 0x00], function() { + + var + index = 0, + compare = function(deviceData) { + var error = null; + index++; + + if (!that.allBytes.length) { + fn && fn(); + return; + } + + var deviceDataLength = deviceData.length; + var localChunk = that.allBytes.splice(0, deviceDataLength); + + // iterate through the bytes sent to compare with the latest bytes received + localChunk.forEach(function(val, idx) { + if (val !== deviceData.readUInt8(idx)) { + error = new Error('Firmware on the device does not match local data'); + } + }); + + if (error) { + return fn(error); + } + + process.nextTick(function() { + var readSize = that.flashChunkSize; + that.options.debug && console.log(that.totalBytes - index*that.flashChunkSize); + if (that.totalBytes - index*that.flashChunkSize < that.flashChunkSize) { + readSize = that.totalBytes - index*that.flashChunkSize; + } + that.c([d('g'), (readSize >> 8) & 0xFF, readSize & 0xFF, d('F')], compare, readSize); + that.run(); + }); + }; + + that.options.debug && console.log('\n\nVerifying flash..') + + that.c([d('g'), (that.flashChunkSize >> 8) & 0xFF, that.flashChunkSize & 0xFF, d('F')], compare, that.flashChunkSize); + that.run(); + }); + that.run(); + }, + + fuseCheck : fuseCheck = function(fn) { + this.options.debug && console.log('checking fuses'); + // fuse check + this.c('F') + .c('F') + .c('F') + .c('N') + .c('N') + .c('N') + .c('Q') + .c('Q') + .c('Q') + .c('L') + .c('E'); + + this.run(function() { + fn(); + }); + } +}; + +out.init = function(serialport, options, fn) { + if (typeof options === 'function' && !fn) { + fn = options; + options = {}; + } + + var flasher = new out.Flasher(serialport, options); + flasher.prepare(fn); +}; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(0).Buffer)) diff --git a/client/src/lib/index.js b/client/src/scripts.js similarity index 61% rename from client/src/lib/index.js rename to client/src/scripts.js index a42ac820..06cb1fae 100644 --- a/client/src/lib/index.js +++ b/client/src/scripts.js @@ -1,28 +1,30 @@ +import AvrgirlArduino from './avrgirl-arduino'; + var workspace = Blockly.inject('blockly-canvas', {toolbox: document.getElementById('toolbox')}); -function getJS() { +export function getJS() { // Generates Arduino code to display it. - Blockly.JavaScript.INFINITE_LOOP_TRAP = null; - var code = Blockly.JavaScript.workspaceToCode(workspace); + window.Blockly.JavaScript.INFINITE_LOOP_TRAP = null; + var code = window.Blockly.JavaScript.workspaceToCode(workspace); return code; } -function getArduino() { +export function getArduino() { // Generates Arduino code to display it. - Blockly.Arduino.INFINITE_LOOP_TRAP = null; - var code = Blockly.Arduino.workspaceToCode(workspace); + window.Blockly.Arduino.INFINITE_LOOP_TRAP = null; + var code = window.Blockly.Arduino.workspaceToCode(workspace); return code; } -function compileArduinoCode() { - body = { +export function compileArduinoCode() { + let body = { "board": "arduino:avr:uno", "sketch": getArduino() }; // gets compiled hex from server let Hex; - $.post("http://174.138.32.52:3000/compile", body, (data) => { + window.$.post("http://174.138.32.52:3000/compile", body, (data) => { // converting base 64 to hex Hex = atob(data.hex).toString(); console.log(Hex); @@ -46,8 +48,8 @@ function compileArduinoCode() { } -$(document).ready(function() { - $('input[type=radio][name=model-btn]').change(function() { +window.$(document).ready(function() { + window.$('input[type=radio][name=model-btn]').change(function() { document.getElementById('model-img').src = `./assets/${this.value}.png` }); -}) \ No newline at end of file +}); \ No newline at end of file