kaelhem / avrbro

A tool to upload .hex files on Arduino boards with Serial API
MIT License
18 stars 9 forks source link
arduino avr javascript

Avrbro

This library use the Serial Api available in Chrome (with experimental flag enabled) to upload compiled .hex files on Arduino boards without Avrdude, directly from a web page!

For the moment it works only with stk500v1 protocol. That means it (should) works with Uno and Nano boards, but not with Leonardo or Mega boards). An implementation of stk500v2 protocol seems to live here...

Install

# with npm
npm i avrbro --save

# or with yarn:
yarn add avrbro

Exemple

import avrbro from 'avrbro'
const { parseHex, openSerial, flash, reset } = avrbro

// Here's just an helper function to use async/await with FileReader...
const readFileAsync = (file) => {
  return new Promise((resolve, reject) => {
    let reader = new FileReader()
    reader.onload = () => {
      resolve(reader.result)
    }
    reader.onerror = reject
    reader.readAsArrayBuffer(file)
  })
}

const flashMyBoard = async () => {
  // connect to device using web serial API
  const serial = await openSerial()
  if (serial) {

    // get .hex buffer
    const response = await fetch('bin/my-firmware.hex')
    const data = await response.blob()
    const fileData = await readFileAsync(data)
    const hexBuffer = parseHex(new TextDecoder("utf-8").decode(fileData))

    // reset the board
    await reset(serial)

    // upload .hex file
    const success = await flash(serial, hexBuffer, { boardName: 'nano' })
    if (success) {
      console.log('.hex file uploaded on board successfully!')
    } else {
      console.log('an error has occurred :(')
    }
  } else {
    console.log('operation canceled by user')
  }
}

flashMyBoard()

Api

isAvailable()

Allow to know if the serial API is available.

Returns: Boolean


openSerial(options)

Open serial connection with device. Once called, the browser will open a dedicated modal window to choose the device.

Params

Returns: Object or null if cancelled. The Object will match {port, reader, writer} where:


closeSerial(serial)

Close serial connection with device.

Params

parseHex(data)

Use Intel HEX file format to parse given data and prepare buffer for upload.

Params

Returns: Buffer


flash(serial, hexBuffer, options)

Flash the device connected on the given serial port with the given .hex file buffer.

Params

Returns: Boolean


reset(serial)

Reset board with cycle DTR.

Params

Contributing

Contributions in any form are welcome! If you find a bug, please file an issue.

License

This project is licensed under the MIT license. See the LICENSE file for more details.

Acknowledgements

All this stuff was made possible thanks to: