UNPKG

@dawee/avrgirl-arduino

Version:

A NodeJS library for flashing compiled sketch files to Arduino microcontroller boards.

139 lines (113 loc) 3.44 kB
var AVR109 = require('chip.avr.avr109'); var colors = require('colors'); var fs = require('graceful-fs'); var Serialport = require('serialport'); var async = require('async'); var Protocol = require('./protocol'); var util = require('util'); var Avr109 = function(options) { options.protocol = function() { return AVR109; }; Protocol.call(this, options); }; util.inherits(Avr109, Protocol); /** * Uploads the provided hex file to the board, via the AVR109 protocol * * @param {string, Buffer} hex - path of hex file for uploading, or Buffer of the hex data * @param {function} callback - function to run upon completion/error */ Avr109.prototype._upload = function(file, callback) { var _this = this; var data; try { if (typeof file === 'string') { data = fs.readFileSync(file, { encoding: 'utf8' }); } else { data = file; } } catch (error) { return callback(error); } _this._reset(function(error) { if (error) { return callback(error); } _this.debug('reset complete.'); _this.connection._pollForOpen(function(error) { if (error) { return callback(error); } _this.debug('connected'); _this._write(data, function(error) { var color = (error ? colors.red : colors.green); _this.debug(color('flash complete.')); // Can't close the serialport on avr109 boards >> node-serialport/issues/415 // _this.serialPort.close(); return callback(error); }); }); }); }; /** * Performs the writing part of uploading to an AVR109 bootloaded chip * * @param {buffer} data - hex buffer to write to the chip * @param {function} callback - function to run upon completion/error */ Avr109.prototype._write = function(data, callback) { var _this = this; var options = { signature: _this.board.signature.toString(), debug: false }; _this.chip.init(_this.connection.serialPort, options, function(error, flasher) { if (error) { return callback(error); } _this.debug('flashing, please wait...'); async.series([ flasher.erase.bind(flasher), flasher.program.bind(flasher, data.toString()), function verify(done) { flasher.verify(done); }, flasher.fuseCheck.bind(flasher) ], function(error) { return callback(error); }); }); }; /** * Software resets an Arduino AVR109 bootloaded chip into bootloader mode * * @param {function} callback - function to run upon completion/error */ Avr109.prototype._reset = function(callback) { var _this = this; var conn; if (_this.board.manualReset) { return callback(null); } // creating a temporary connection for resetting only var tempSerialPort = new Serialport(_this.connection.options.port, { baudRate: 1200, autoOpen: false }); _this.connection.serialPort = tempSerialPort; conn = _this.connection; _this.debug('resetting board...'); async.series([ tempSerialPort.open.bind(tempSerialPort), conn._cycleDTR.bind(conn) ], function(error) { if (error) { return callback(error); } async.series([ conn._setUpSerial.bind(conn), conn._pollForPort.bind(conn) ], function(error) { return callback(error); }); }); }; module.exports = Avr109;