bonescript

Dołącz do czatu pod adresemBuild StatusCoverage Status

BoneScript jest węzłem.biblioteka js do obliczeń fizycznych na wbudowanym Linuksie, począwszy od wsparcia dla BeagleBone.

informacje o języku są dostępne pod adresem https://nodejs.org.

aby sprawdzić wersję i czy BoneScript jest w twojej ścieżce, spróbuj uruchomić:

node -pe "require('bonescript').getPlatform().bonescript"

dodatkowa dokumentacja jest dostępna pod adresem https://beagleboard.org/bonescript.

koncepcją jest użycie funkcji podobnych do Arduino napisanych w języku JavaScript, aby uprościć naukę wykonywania fizycznych zadań obliczeniowych pod wbudowanym Linuxem, aby dodatkowo zapewnić wsparcie dla szybkiego tworzenia GUI dla osadzonych aplikacji za pomocą stron internetowych HTML5/JavaScript.

globalna instalacja

BoneScript jest zainstalowany na BEAGLEBONE. Aby zaktualizować do najnowszej wersji, użyj 'npm’ w ostatnim BeagleBoard.org obraz Debiana z https://beagleboard.org/latest-imagesand wykonaj:

TERM=none sudo npm cache clearTERM=none sudo npm install -g --prefix /usr/local --unsafe-perm bonescriptsudo shutdown -r now

testy na innych dystrybucjach są ograniczone.

istnieje kilka dodatkowych kroków instalacji, które można wykonać, ale są typowo instalowane przez inne mechanizmy na BeagleBoard.org obrazy Debiana. Te usługi setupbackground (serwer sieciowy bone101 z bonescript RPC i bonescript autorunservice), jak również skonfigurować zmienne środowiskowe dla tych usług i Inne skrypty uruchamiane globalnie.

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

ciągłe uruchamianie aplikacji

aby uruchomić aplikacje podczas uruchamiania, wystarczy wrzucić je do folderu/var/lib/cloud9 / autorun. Przeniesienie ich z tego folderu zabije procesy. Oczekuje się, że tylko wrzucasz już wolne od błędów aplikacje do tego folderu, ponieważ nie ma dobrego sposobu na ich debugowanie.

uwaga na temat stanu kodu

nadal jest wiele prac rozwojowych, więc pamiętaj, aby sprawdzać je na bieżąco. Wiele z tych urządzeń peryferyjnych nie jest jeszcze wspieranych przez wykonywanie operacji wejścia/Wyjścia pliku.

układ katalogów

  • indeks.js: główny kod źródłowy BoneScript
  • autorun.js: węzeł.Aplikacja JS do uruchamiania aplikacji upuszczonych w folderze autorun
  • pakiet.json: NPM.Deskryptor pakietu JS
  • serwer.js: BoneScript web server do obsługi zdalnych wywołań procedur
  • dts: Szablony Devicetree
  • etc: pliki konfiguracyjne do umieszczenia w docelowej dystrybucji
  • src: kod źródłowy biblioteki
  • systemd: pliki konfiguracyjne systemd do uruchamiania usług
  • test: automatyczny kod testowy

szablon

w przypadku aplikacji BoneScript należy obecnie ręcznie „wymagać” biblioteka thebonescript. Funkcje są następnie odwoływane przez obiektpostarczone z require.

zacząłem od tego, że próbowałem dostarczyć Arduino-podobne funkcje setup / loop, ale te nie są dobre dla JavaScript. Korzystanie z nativeflow JavaScript działa najlepiej, ale znajome funkcje wystarczą, aby zwiększyć wydajność fizycznego przetwarzania.

oto przykład:

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); }}

'P8_12′ i 'p8_13′ są nazwami pinów na tablicy i powyższy przykład powinien co 100 ms skopiować wartość wejściową w P8_12 do wyjściowego P8_13.

API

gdy jest zapewniona funkcja zwrotna, funkcje będą zachowywać się asynchronicznie.Bez wywołania zwrotnego funkcje zostaną zsynchronizowane i zakończone przed powrotem.

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 Robotics Cape

  • rcinitialize()
  • rcstate(, ) -> stan
  • RCLED(dioda, , ) -> wartość
  • RCON(zdarzenie )
  • rcmotor(silnik, wartość )
  • rcservo (opcja, wartość )
  • rcbmp(, ) -> wartość
  • rcimu(, ) -> wartość
  • rcencoder(koder, , ) -> wartość

Bity/bajty, matematyka , Trygonometria i liczby losowe

  • Niski bajt(wartość)
  • Wysoki bajt(wartość)
  • wyjściowa (wartość bitowa liczba)
  • bitWrite(wartość, bitnum, bitdata)
  • bitSet(wartość, bitnum)
  • bitClear(wartość, bitnum)
  • bit(bitnum)
  • min(x, y)
  • max(x, y)
  • abs(x)
  • constrain(x, a, b)
  • Mapa(wartość, fromlow, fromhigh, tolow, tohigh)
  • pow(x, y)
  • sqrt(x)
  • sin(Radians)
  • cos(Radians)
  • tan(Radians)
  • randomseed(X)
  • random(, max)

uwaga na wydajność

ten kod to całkowicie nieoptymalny. Lista możliwych optymalizacji, które przebiegają przez moją głowę, jest oszałamiająca. Dobrą wiadomością jest to, że myślę, że to wszystko może być bez wpływu na API, przede wszystkim dzięki introspectioncapabilities JavaScript.

docelowo planowane jest włączenie obsługi w czasie rzeczywistym, bezpośrednio z JavaScript. Plan zakłada możliwość korzystania z tego środowiska programowania w czasie rzeczywistym na kilku frontach:

  • Włączanie wielu pętli i analizowanie ich w celu ustalenia, czy można je wyłączyć z PRU. Będzie to podstawowy mechanizm zapewniający obsługę systemu IOs w czasie rzeczywistym.
  • dostarczanie usług wyższego rzędu, które wykorzystują standardowe urządzenia peryferyjne do zamierzonego zastosowania:
    • sterowniki szeregowe dla I2C, SPI, UART, itp.
    • analogWrite dla PWMs za pomocą sprzętowych PWMs, timerów, sterowników GPIO jądra, itp.
  • dodawanie łat w czasie rzeczywistym do jądra

Język JavaScript zapewnia pewne funkcje, które moim zdaniem są naprawdę fajne do programowania wbudowanego i węzła.js robi kilka rzeczy, aby to umożliwić. Podstawowym jest to, że wszystkie funkcje We/Wy są asynchroniczne. W przypadku systemów wbudowanych, jest to szczególnie przydatne do wykonywania zadań o niskim opóźnieniu, które reagują na zdarzenia w systemie. Co sprawia, że JavaScript jest o wiele łatwiejszy niż inne języki, to to, że zachowuje pełny kontekst wokół modułu obsługi, więc nie musisz się o to martwić.

0.7.4 key updates

  • Enabled BEAGLEBONE AI GPIO functions (digitalRead/digitalWrite/getPinMode)

0.7.3 key updates

Big speed-up on loading by lazy-loading threquently used modules

0.7.2 Kluczowe aktualizacje

  • https://github.com/beagleboard/bonescript/issues/52
  • https://github.com/beagleboard/bonescript/issues/53

0.7.1 kluczowe aktualizacje

bardzo niewielka aktualizacja zakresu funkcji

0.7.0 kluczowe aktualizacje

większość z tych poprawek pochodzi z projektu Google Summer of Code 2018

  • poprawki na wyjściu PWM podczas aktualizacji analogWrite
  • Dodano wywołania funkcji dla obsługi Biblioteki Sterowania Robotem na BEAGLEBONE Blue lub Robotyka Cape
  • Dodano obsługę wywołań zwrotnych w stylu węzła z błędem i oddzielonymi danymi (opcjonalnie)

plany

  • obsługa SPI
  • obsługa Pru
  • Obsługa tablicy pinów w pinmode i getpinmode
  • zapisywanie utworzonych dtbo i zapisywanie konfiguracji do pamięci EEPROM

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.