Coder Social home page Coder Social logo

espruino-ts-boilerplate's Introduction

espruino-ts-boilerplate

An espruino boilerplate using Typescript.

Basic Usage

There are 3 commands you can run:

  1. npm run build Builds the typscript application into a single dist/bundle.js file that can be uploaded directly to the espruino. The bunlder takes care of doing tree shaking, typescript processing and minification, so the file is as small as possible.

  2. npm run build-debug Builds the typescript application just like the provious command, but avoiding minification. This does not mangle variable names or indentation.

  3. npm run upload Builds and uploads the bundle file to the espruino using espruino-cli. The cli parameters are taken from the config/env-config.yaml file.

All three commands have a counterpart in VSCode IDE, so pressing CMD+Shift+B would bring up a dialog with all those commands to select.

Env Configuration

Env configuration handles the parameters for the espruino-cli command. It currently uses:

  • port: the OS port for the espruino device. E.g. /dev/cu.wchusbserial1420 or COM4 or /dev/USBtty0
  • port_speed: determines the connection speed to the device. E.g. 115200
  • board: Especifies the board type. E.g. ESP8266_4MB

App configuration

The app can be configured using the config/app-config.yaml and config/app-config.user.yaml files. All configurations there are taken by the bundler and replaced by the actual values when compiling. That way, there are fewer variables in the espruino code, optimizing it a little bit.

Configurations in app-config.user.yaml overwrite the ones in app-config.yaml. Also, user configuration is not tracked in the repository.

For example:

app-config.yaml

wifi:
    network: mywifi
    password: xxx

app-config.user.yaml

wifi:
    password: mypassword

app.ts

wifi.connect(__CONFIG__.wifi.network, { password: __CONFIG__.wifi.password }, callback);

bundle.js

wifi.connect("mywifi", { password: "mypassword" }, callback);

###ย CONFIG type definitions

The type definitions for the configuration parameters can be created in the types/app.d.ts file. This way, VSCode can autocomplete and validate the parameters.

app.d.ts

// Declare types
declare type __CONFIG__ = {
    // Your network name and password.
    wifi: {
        network: string,
        password: string,
    },
}

// Declare a global variable, for vscode to recognize it as a config container
declare var __CONFIG__:__CONFIG__;

Espruino Modules

Espruino modules must be downloaded, converted to .ts and directly imported from the filesystem. The require('DHT22') syntax (that works in EspruinoIDE) does not work here (as EspruinoIDE downloads the files right before uploading the code to the device).

File system

src/
    modules/
        DHT22.ts
    app.ts

app.ts

import DHT22 from './modules/DHT22';
DHT22.connect(...);

Data in flash memory

Espruino allows saving data into the Flash memory. The best way to achieve this is by using the internal 'Storage' module. For example, require('Storage').write("wifi", E.toArrayBuffer(atob('B/gH/4PA8c/O7/33h7OecN/sBzgBtgAeAAeAAMAA'))); will save a wifi icon by the name of wifi that can be retrieved using require('Storage').readArrayBuffer('wifi').

This boilerplate contains a static-data directory and a StaticData.ts module that can handle the upload (before sending code to Espruino) and the usage (in runtime) of that type of data.

  • static-data/files.js (requireJS module format): contains an array of the data to be uploaded. In the example, images are being stored.

  • static-data/flash-files.js: A nodeJS application that uploads every piece of data found in files.js to the espruino (using the same espruino-cli commands)

  • static-data/generate-file-descriptors: A nodeJS application that generates an index.ts file containing descriptions for every upload (in the example, name, width and height of the image). This file can be imported by the app and be fed to the StaticData class:

app.ts

// SSD1306 128x64 display module
import SSD1306 from './modules/SSD1306';

import StaticData from './modules/StaticData';
import images from '../static-data/index';

const ImagesData = new StaticData(images);

// Setup I2C
const i2c = new I2C();
i2c.setup({ scl: __CONFIG__.SCLPin, sda: __CONFIG__.SDAPin, bitrate: 400000 });

// Create display instance
const display = SSD1306.connect(i2c, function() {
    // Get the image
    const img = ImagesData.getImage('wifi');

    // Draw the image
    display.drawImage(img, 0, 0);
    display.flip();
});

Running the example app

Requirements

  • ESP8266 (NodeMCU) with espruino firmware
  • SSD1306 dosplay connected to I2C

Steps

  1. Configure device parameters in config/env-config.yaml
  2. Upload static data:
cd static-data
node flash-files.js                 ## Uploads files to flash in device
node generate-file-descriptors.js   ## Generate importable descriptors
  1. Build application in debug mode to check output: npm run build-debug
  2. After visually checking output, upload to espruino: npm run upload

You should see the clock running in your display!!!

espruino-ts-boilerplate's People

Contributors

mfgea avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

iammikecohen

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.