BoneScript is een knooppunt.js bibliotheek voor fysieke computing op embedded Linux, te beginnen met ondersteuning voor BeagleBone.
informatie over de taal is beschikbaar op https://nodejs.org.
om de versie te controleren en te zien of BoneScript zich in uw pad bevindt, kunt u het volgende uitvoeren:
node -pe "require('bonescript').getPlatform().bonescript"
aanvullende documentatie is beschikbaar op https://beagleboard.org/bonescript.
het concept is om Arduino-achtige functies geschreven in JavaScript te gebruiken om het leren hoe fysieke computertaken uit te voeren onder ingebedde Linuxeen om verder ondersteuning te bieden voor het snel maken van GUI ’s voor uw embeddedapplicaties door het gebruik van HTML5/JavaScript webpagina’ s.
globale installatie
BoneScript wordt geïnstalleerd op uw BeagleBone. Om bij te werken naar de laatste revisie, gebruik je ‘ npm ‘op een recente BeagleBoard.org Debian image van https://beagleboard.org/latest-imagesand uitvoeren:
testen op andere distributies is beperkt.
Er zijn een aantal extra installatie stappen die kunnen worden uitgevoerd, maar worden meestal geà nstalleerd door andere mechanismen op de BeagleBoard.org Debian images. Deze setupbackground services (bone101 webserver met bonescript RPC en bonescript autorunservice) evenals configureren omgevingsvariabelen voor deze services en otherglobally draaien scripts.
sudo cp bonescript/etc/default/node /etc/default/nodesudo cp bonescript/etc/profile.d/node.sh /etc/profile.d/node.shsudo cp bonescript/systemd/\* /lib/systemd/systemsudo systemctl enable bonescript.socketsudo systemctl enable bonescript-autorun.service
programma ’s voortdurend opstarten
om uw programma’ s te laten starten bij het opstarten, plaatst u ze gewoon in de map/var/lib/cloud9/autorun. Het verplaatsen van hen uit die map zal de processen te doden. U wordt verwacht dat alleen vallen in al bug-gratis apps in deze map als er geen goede manier om debug op hen uit te voeren.
Note on code state
Er is nog steeds veel ontwikkeling gaande, dus zorg ervoor dat u op een frequente basis terugkomt. Veel van de liefhebbers randapparatuur worden nog niet ondersteund, behalve door het uitvoeren van bestand I/O.
Directory lay-out
- index.js: belangrijkste BoneScript broncode
- autorun.js: Node.JS-app om apps uit te voeren die in de autorun-map
- zijn geplaatst.NPM.Js pakketdescriptor
- server.js: BoneScript web server om te dienen op de remote procedure calls
- dts: Devicetree sjablonen
- enz: Configuratie bestanden worden geplaatst in het doel distro
- src: Bibliotheek source code
- systemd: Configuratie bestanden voor systemd om services te starten
- test: Om geautomatiseerde test code
Template
Voor een BoneScript toepassing, moet u momenteel handmatig ‘vereisen’ thebonescript bibliotheek. Functies worden dan verwezen door het objectprovided terug van require.
Ik begon te proberen Arduino-achtige setup/loop functies te bieden, maar theidea is echt geen goede match voor JavaScript. Het gebruik van JavaScript ‘ s nativeflow werkt het beste, maar de vertrouwde functies zijn genoeg om u een boostin uw fysieke computing productiviteit.
Hier is een voorbeeld:
var b = require('bonescript');b.pinMode('P8_12', b.INPUT);b.pinMode('P8_13', b.OUTPUT);setInterval(copyInputToOutput, 100);function copyInputToOutput() { b.digitalRead('P8_12', writeToOutput); function writeToOutput(x) { b.digitalWrite('P8_13', x.value); }}
De ‘P8_12’ en ‘P8_13’ zijn pin-namen op het bord en het bovenstaande voorbeeld zou de invoerwaarde op P8_12 elke 100 ms naar de uitvoer p8_13 kopiëren.
API
wanneer een callback wordt gegeven, zullen de functies zich asynchroon gedragen.Zonder een callback voorzien, zullen de functies synchroniseren en voltooien alvorens terug te keren.
System
- getPlatform() -> platform
- getEeproms() -> eeproms
- echo(data, ) -> data
- readTextFile(filename, ) -> data
- writeTextFile(filename, data, )
- setDate(date, )
Digital and Analog I/O
- analogRead(pin, ) -> value
- analogWrite(pin, value, , )
- attachInterrupt(pin, handler, mode, )
- detachInterrupt(pin, )
- digitalRead(pin, ) -> value
- digitalWrite(pin, value, )
- pinMode(pin, direction, , , , )
- getPinMode(pin, ) -> pinMode
- shiftOut(dataPin, clockPin, bitOrder, val, )
Serial
Uses https://github.com/voodootikigod/node-serialport
- serialOpen(port, options, )
- serialWrite(port, data, )
- serialParsers is serialport.parsers
I2C
Uses https://github.com/korevec/node-i2c
- i2cOpen(port, address, options, )
- i2cScan(port, )
- i2cWriteByte(port, byte, )
- i2cWriteBytes(port, command, bytes, )
- i2cReadByte(port, )
- i2cReadBytes(port, command, length, )
- i2cStream(port, command, length, )
Robot Control
new in 0.7.0 Runs on BeagleBone Blue; or BeagleBone Black or BeagleBone Black Wireless with BeagleBoard.org Robotica Cape
- rcInitialize()
- rcState(, ) -> staat
- rcLED(leiden, , ) -> waarde
- rcOn(evenement )
- rcMotor(motor, waarde )
- rcServo(optie, waarde )
- rcBMP(, ) -> waarde
- rcIMU(, ) -> waarde
- rcEncoder(encoder, , ) -> waarde
Bits/Bytes, Wiskunde en Trigonometrie en Willekeurige Getallen
- low-bytes(waarde)
- bytes(waarde)
- bitRead(waarde, bitnum)
- bitWrite(waarde, bitnum, bitdata)
- bitSet(waarde, bitnum)
- bitClear(waarde, bitnum)
- bit(bitnum)
- min(x, y)
- max(x, y)
- abs(x)
- beperken(x, a, b)
- kaart(waarde, fromLow, fromHigh, toLow, toHigh)
- pow(x, y)
- sqrt(x)
- sin(radialen).
- cos(radialen).
- tan(radialen).
- randomSeed(x)
- random (max)
Opmerking over de prestaties
Deze code is helemaal unoptimized. De lijst met mogelijke optimalisaties die door mijn hoofd lopen is onthutsend. Het goede nieuws is dat ik denk dat het kan allemaal bedone zonder invloed op de API, vooral dankzij de introspectioncapaciteiten van JavaScript.
Uiteindelijk is dit gepland om real-time gebruik mogelijk te maken, rechtstreeks vanuit Javascript. Het plan is om de mogelijkheid aan te grijpen om deze programmeeromgeving in real-time op verschillende fronten te gebruiken:
- waardoor meerdere lussen mogelijk worden en deze geanalyseerd worden om te bepalen of ze in een PRU kunnen worden gelost. Dit zal het primaire mechanisme voor het verstrekken van real-timeservicing van de IOs.
- het leveren van diensten van hogere orde die gebruik maken van de standaard randapparatuur voor het beoogde gebruik:
- seriële drivers voor I2C, SPI, UARTs, enz.
- analogWrite voor PWMs met behulp van hardware PWMs, timers, kernel GPIO drivers, enz.
- real-time patches toevoegen aan de kernel
De JavaScript-taal biedt een aantal functies die ik echt cool vind voor het uitvoeren van ingebedde programmering en node.js doet wat dingen om dat mogelijk te maken. De primaire is dat de I/O-functies allemaal asynchroon zijn. Forembedded systemen, Dit is vooral handig voor het uitvoeren van lage latency taken die reageren op gebeurtenissen in het systeem. Wat JavaScript zoveel makkelijker maakt dan andere talen om dit te doen, is dat het de volledige context rondom de handler houdt, zodat je je er geen zorgen over hoeft te maken.
0.7.4 key updates
- ingeschakeld BeagleBone AI GPIO functies (digitalRead/digitalWrite/getPinMode)
0.7.3 key updates
grote snelheid bij het laden door lazy-loading niet vaak gebruikte modules
0.7.2 key updates
- https://github.com/beagleboard/bonescript/issues/52
- https://github.com/beagleboard/bonescript/issues/53
0.7.1 key updates
zeer kleine update op een functie scope
0,7.Toets 0 updates
de Meeste van deze correcties is afkomstig van een Google Summer of Code project 2018
- Correcties in PWM-uitgang tijdens analogWrite updates
- extra functie oproepen voor Robot Control voor bibliotheek-ondersteuning op BeagleBone Blauw of Robotics Cape
- ondersteuning Toegevoegd voor node-stijl callbacks met fout en data gescheiden (optioneel)
Plannen
- SPI-ondersteuning
- PRU ondersteuning
- Omgaan array pinnen in pinMode en getPinMode
- het Opslaan van uit gemaakt dtbo en schrijven configuratie naar cape EEPROM