diff --git a/package-lock.json b/package-lock.json index ad220eb..a724092 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "chalk": "^4.1.2", "express": "^4.18.3", "firmata": "^2.3.0", + "johnny-five": "^2.1.0", "nodemon": "^3.1.0", "serialport": "^12.0.0", "socket.io": "^4.7.4" @@ -20,6 +21,7 @@ "devDependencies": { "@types/express": "^4.17.21", "@types/firmata": "^0.19.8", + "@types/johnny-five": "^2.1.9", "@types/nodemon": "^1.19.6", "@types/socket.io": "^3.0.2", "ts-node": "^10.9.2", @@ -424,6 +426,15 @@ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, + "node_modules/@types/johnny-five": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@types/johnny-five/-/johnny-five-2.1.9.tgz", + "integrity": "sha512-pBRdHrz+c5CMIlavQoh0TtPRbEr69euIxXH4hWAQaAXRcxKf3ZbGmX97L0P7Pv45eyLynDDN/TgZcCgh7oWtWg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -744,6 +755,12 @@ "node": ">=8" } }, + "node_modules/browser-serialport": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/browser-serialport/-/browser-serialport-2.1.0.tgz", + "integrity": "sha512-nig20bRxZYaYWvIpg0W4YfsV8WIdNlWoKipDfa+BJZir0fgod2T7z1AuzJhhktddMuhqYE7D6DnDveVPsHRumw==", + "optional": true + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -1117,6 +1134,14 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1726,6 +1751,311 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, + "node_modules/johnny-five": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/johnny-five/-/johnny-five-2.1.0.tgz", + "integrity": "sha512-0Z6qa9Tlt7vUShW8gzewXTJgckhMfbaM7ZhbApOhkAW0PrLIOQms/DjOptE/oitE70tD3O8YJ7OlNSMe+en2DQ==", + "dependencies": { + "chalk": "2.1.0", + "color-convert": "~1.2.2", + "lodash.clonedeep": "^4.3.0", + "lodash.debounce": "^4.0.3", + "nanotimer": "0.3.10", + "temporal": "latest" + }, + "optionalDependencies": { + "browser-serialport": "latest", + "firmata": "^2.2.0", + "serialport": "^8.0.5" + } + }, + "node_modules/johnny-five/node_modules/@serialport/binding-mock": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-8.0.6.tgz", + "integrity": "sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==", + "optional": true, + "dependencies": { + "@serialport/binding-abstract": "^8.0.6", + "debug": "^4.1.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/@serialport/bindings": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-8.0.8.tgz", + "integrity": "sha512-xMJHr7CyOPq+wwC/S2RNI+tY+WZW4gXY3tE8QUOIRp0K7lSyLYOzKdyGUtk2uI0ohDMV3OcB+TEhhffT2S2DHQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@serialport/binding-abstract": "^8.0.6", + "@serialport/parser-readline": "^8.0.6", + "bindings": "^1.5.0", + "debug": "^4.1.1", + "nan": "^2.14.0", + "prebuild-install": "^5.3.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/@serialport/parser-byte-length": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz", + "integrity": "sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==", + "optional": true, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/@serialport/parser-cctalk": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz", + "integrity": "sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==", + "optional": true, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/@serialport/parser-delimiter": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", + "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==", + "optional": true, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/@serialport/parser-readline": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", + "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", + "optional": true, + "dependencies": { + "@serialport/parser-delimiter": "^8.0.6" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/@serialport/parser-ready": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-8.0.6.tgz", + "integrity": "sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==", + "optional": true, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/@serialport/parser-regex": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-8.0.6.tgz", + "integrity": "sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==", + "optional": true, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/@serialport/stream": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-8.0.6.tgz", + "integrity": "sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==", + "optional": true, + "dependencies": { + "debug": "^4.1.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/johnny-five/node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/johnny-five/node_modules/chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dependencies": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/johnny-five/node_modules/color-convert": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.2.2.tgz", + "integrity": "sha512-yXAhpn5+dVTIW1ADPkmcFu3W2c9yZJnmRsbA8tExvSL9NcBI/mEVGECZHVbRln+1K7BL031a4VzkMe9+b9R+Qw==" + }, + "node_modules/johnny-five/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/johnny-five/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/johnny-five/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/johnny-five/node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/johnny-five/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/johnny-five/node_modules/node-abi": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", + "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", + "optional": true, + "dependencies": { + "semver": "^5.4.1" + } + }, + "node_modules/johnny-five/node_modules/prebuild-install": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", + "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/johnny-five/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/johnny-five/node_modules/serialport": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/serialport/-/serialport-8.0.8.tgz", + "integrity": "sha512-GEaMYbAk9chfGyxoVC27PHnKMUMOQOCAg+9umOhAgk88vH0H6DbQ9/Tj3lRwoj7lE+TLra75P/0l1RXMfX4yQg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@serialport/binding-mock": "^8.0.6", + "@serialport/bindings": "^8.0.8", + "@serialport/parser-byte-length": "^8.0.6", + "@serialport/parser-cctalk": "^8.0.6", + "@serialport/parser-delimiter": "^8.0.6", + "@serialport/parser-readline": "^8.0.6", + "@serialport/parser-ready": "^8.0.6", + "@serialport/parser-regex": "^8.0.6", + "@serialport/stream": "^8.0.6", + "debug": "^4.1.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/johnny-five/node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/johnny-five/node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1840,6 +2170,11 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" }, + "node_modules/nanotimer": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/nanotimer/-/nanotimer-0.3.10.tgz", + "integrity": "sha512-6rStzhDIdmUcv3Dcs75YHfFr/RTBs42VWLobMXmgixBKoIFbpZuB9bp90FjZnwdidN4gsGY5rjHkBEato7vyAQ==" + }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -2486,6 +2821,14 @@ "node": ">=6" } }, + "node_modules/temporal": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/temporal/-/temporal-0.7.1.tgz", + "integrity": "sha512-6Xd3c2llgkjGP7kn2LXuiHZ8/cRiIX5EsPcvn8slkAcayWEzf7xuXxd7BcgUm2djmI1DPFUSMFeFwQcLVMLsOw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index acaaa4e..efd68a3 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "chalk": "^4.1.2", "express": "^4.18.3", "firmata": "^2.3.0", + "johnny-five": "^2.1.0", "nodemon": "^3.1.0", "serialport": "^12.0.0", "socket.io": "^4.7.4" @@ -22,6 +23,7 @@ "devDependencies": { "@types/express": "^4.17.21", "@types/firmata": "^0.19.8", + "@types/johnny-five": "^2.1.9", "@types/nodemon": "^1.19.6", "@types/socket.io": "^3.0.2", "ts-node": "^10.9.2", diff --git a/src/controller/index.d.ts b/src/controller/index.d.ts index 353a8a1..8efa507 100644 --- a/src/controller/index.d.ts +++ b/src/controller/index.d.ts @@ -1,11 +1,11 @@ export type digitalValue = 'ON' | 'OFF'; -export type voltage = 'HIGH' | 'LOW'; -export type sPinModes = 'INPUT' | 'OUTPUT' | 'ANALOG' | 'PWM' | 'SERVO' |'SHIFT' |'I2C' |'ONEWIRE' |'STEPPER' |'SERIAL' |'PULLUP' |'IGNORE' |'PING_READ' | 'UNKOWN'; +export type voltage = 'HIGH' | 'LOW' | 'high' | 'low' | 1 | 0; +export type sPinModes = 'INPUT' | 'OUTPUT' | 'ANALOG' | 'PWM' | 'SERVO'; export interface ChannelPins { pin: number, - value: digitalValue + value: boolean } export interface ColorChannel { diff --git a/src/controller/led.ts b/src/controller/led.ts index b78cb9e..c9e9c9d 100644 --- a/src/controller/led.ts +++ b/src/controller/led.ts @@ -1,7 +1,8 @@ import { Request, Response } from "express"; import { board } from "../setup"; import { ChannelPins, digitalValue, voltage } from "."; -import { digitalRead } from "../promises"; +import { analogRead, digitalRead } from "../promises"; +import { Led } from "johnny-five"; export async function readLed (req: Request, res: Response) { @@ -44,12 +45,12 @@ export async function writeLed (req: Request, res: Response) { switch (act) { case 'on': state = 'ON'; - volt = 'HIGH'; + volt = 1; console.log(`${req.hostname} | ${pin} | LED: ${state}`); break; case 'off': state = 'OFF'; - volt = 'LOW'; + volt = 0; console.log(`${req.hostname} | ${pin} | LED: ${state}`); break; default: @@ -60,7 +61,7 @@ export async function writeLed (req: Request, res: Response) { }); } - board.digitalWrite(pin, board[volt]); + board.digitalWrite(pin, volt); res.status(200).json({ status: 200, @@ -79,43 +80,51 @@ export async function writeLed (req: Request, res: Response) { export async function readRgbLed (req: Request, res: Response) { const r: number = Number.parseInt(req.body.r); - const g: number = Number.parseInt(req.body.b); + const g: number = Number.parseInt(req.body.g); const b: number = Number.parseInt(req.body.b); const rgbPins: number[] = Object.values({ r, g, b }); - const pinStates: number[] = []; for (let i = 0; i < rgbPins.length; i++) { const pin = rgbPins[i]; - if (Number.isNaN(pin)) { return res.status(400).json({ status: 400, message: `Invalid pin ${pin} param, it should be integer` }); } - - const state: number = await digitalRead(board, pin); - pinStates.push(state); } + const led = new Led.RGB({ + pins: { + red: r, + green: g, + blue: b + }, + isAnode: true + }) + + led.red = new Led(r); + led.green = new Led(g); + led.blue = new Led(b); + return res.status(200).json({ status: 200, pin_state: { - [r]: pinStates[0], - [g]: pinStates[1], - [b]: pinStates[2] + [r]: led.red.isOn, + [g]: led.green.isOn, + [b]: led.blue.isOn } }); } export async function writeRgbLed (req: Request, res: Response) { const r: ChannelPins = req.body.r; - const g: ChannelPins = req.body.b; + const g: ChannelPins = req.body.g; const b: ChannelPins = req.body.b; const rgbLeds: ChannelPins[] = Object.values({ r, g, b }); - + try { rgbLeds.forEach((led, i) => { if (Number.isNaN(led.pin)) { @@ -124,23 +133,27 @@ export async function writeRgbLed (req: Request, res: Response) { message: `Invalid pin ${led.pin} param, it should be integer` }); } - - switch (led.value) { - case 'ON': - board.analogWrite(led.pin, board.HIGH); - console.log(`${req.hostname} | ${led.pin} | LED: ${led.value}`); - break; - case 'OFF': - board.analogWrite(led.pin, board.LOW); - console.log(`${req.hostname} | ${led.pin} | LED: ${led.value}`); - break; - default: - console.log(`${req.hostname} | ${led.pin} | LED: INVALID VALUE`); - } }) - const pins: string[] = rgbLeds.map(c => `${c.pin}, `); - const values: string[] = rgbLeds.map(c => `${c.value}, `); + const led = new Led.RGB({ + pins: { + red: r.pin, + green: g.pin, + blue: b.pin + }, + isAnode: true + }) + + led.red = new Led(r.pin); + led.green = new Led(g.pin); + led.blue = new Led(b.pin); + + if (r.value == true) led.red.on(); else led.red.off(); + if (g.value == true) led.green.on(); else led.green.off(); + if (b.value == true) led.blue.on(); else led.blue.off(); + + const pins: string = rgbLeds.map(c => c.pin.toString()).join(", "); + const values: string = rgbLeds.map(c => `${c.value}`).join(", "); res.status(200).json({ status: 200, diff --git a/src/controller/pin.ts b/src/controller/pin.ts index 6463bca..dcc6b23 100644 --- a/src/controller/pin.ts +++ b/src/controller/pin.ts @@ -1,6 +1,7 @@ import { Request, Response } from "express"; import { board, suBoard } from "../setup"; import { sPinModes } from "."; +import { Pin } from "johnny-five"; export function readPin (req: Request, res: Response) { const pin: number = Number.parseInt(req.params.p); @@ -34,7 +35,7 @@ export function setPin (req: Request, res: Response) { }); } - board.pinMode(pin, board.MODES[mode]); + board.pinMode(pin, Pin[mode]); suBoard.PINS.pwm.push(pin); suBoard.sort(); diff --git a/src/index.ts b/src/index.ts index 58f1a02..4645227 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,4 +32,8 @@ app.listen(port, host, () => { console.log(chalk.green(`Board at port ${comport} Connected!! \⁠(⁠^⁠o⁠^⁠)⁠/`)); suBoard.connected = true; }) + + board.on('exit', () => { + console.log("Bye bye"); + }) }); \ No newline at end of file diff --git a/src/middleware/connection.ts b/src/middleware/connection.ts index fca7275..14842fd 100644 --- a/src/middleware/connection.ts +++ b/src/middleware/connection.ts @@ -1,5 +1,5 @@ import { NextFunction, Request, Response } from "express"; -import { suBoard } from "../setup"; +import { board, suBoard } from "../setup"; export function isBoardConnected (req: Request, res: Response, next: NextFunction) { if (suBoard.connected) { diff --git a/src/promises/index.ts b/src/promises/index.ts index 643edc5..75fed50 100644 --- a/src/promises/index.ts +++ b/src/promises/index.ts @@ -1,6 +1,6 @@ -import Board, { PIN_MODE } from "firmata"; +import { Board } from "johnny-five"; -export function digitalRead (board: Board, pin: number): Promise { +export function digitalRead (board: Board, pin: number): Promise { return new Promise((resolve, reject) => { board.digitalRead(pin, (val) => { resolve(val); diff --git a/src/setup/index.ts b/src/setup/index.ts index c8001ad..2f7bd4c 100644 --- a/src/setup/index.ts +++ b/src/setup/index.ts @@ -1,7 +1,11 @@ -import Firmata from 'firmata'; import { SuBoard } from './support'; +import { Board } from 'johnny-five'; -export const comport: string = '/dev/ttyUSB1'; -export const board: Firmata = new Firmata(comport); +export const comport: string = '/dev/ttyUSB0'; +export const board: Board = new Board({ + port: comport, + repl: false, + debug: false +}); export const suBoard: SuBoard = new SuBoard(); \ No newline at end of file diff --git a/test/serial/analogReadDigital.ts b/test/serial/analogReadDigital.ts deleted file mode 100644 index a602a23..0000000 --- a/test/serial/analogReadDigital.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Firmata, { PIN_MODE, PIN_STATE } from 'firmata'; - -const board = new Firmata('/dev/ttyUSB2'); - -board.on('ready', async () => { - // board.analogWrite(0, 255); - // board.analogWrite(1, 255); - // board.analogWrite(2, 255); - - board.analogRead(0, (val) => { - console.log(val); - }) - - while (true) { - await new Promise (resolve => setTimeout(resolve, 90)); - } -}) \ No newline at end of file diff --git a/test/serial/blink.js b/test/serial/blink.js deleted file mode 100644 index cfc39e8..0000000 --- a/test/serial/blink.js +++ /dev/null @@ -1,17 +0,0 @@ -const Firmata = require('firmata'); -const board = new Firmata('/dev/ttyUSB0'); - -board.on('ready', async () => { - const led = 12; - - board.pinMode(led, board.MODES.OUTPUT); - - while (true) { - board.digitalWrite(led, board.HIGH); - console.log("ON"); - await new Promise(resolve => setTimeout(resolve, 300)); - board.digitalWrite(led, board.LOW); - console.log("OFF"); - await new Promise(resolve => setTimeout(resolve, 300)); - } -}); \ No newline at end of file diff --git a/test/serial/blink.ts b/test/serial/blink.ts new file mode 100644 index 0000000..541c8a0 --- /dev/null +++ b/test/serial/blink.ts @@ -0,0 +1,13 @@ +import Firmata from 'firmata'; +import { Board, Pin, PinMode } from "johnny-five"; + +const board = new Board({ + port: '/dev/ttyUSB0', + repl: false +}); + +board.on('ready', () => { + board.pinMode(13, Pin.OUTPUT); + + board.digitalWrite(13, 1); +}) \ No newline at end of file diff --git a/test/serial/checkBoard.ts b/test/serial/checkBoard.ts new file mode 100644 index 0000000..8c3f1e6 --- /dev/null +++ b/test/serial/checkBoard.ts @@ -0,0 +1,11 @@ +import { Board } from "johnny-five"; + +const board: Board = new Board({ + port: '/dev/ttyUSB0', + debug: false, + repl: false +}); + +setInterval(() => { + console.log(board.isReady); +}, 400); \ No newline at end of file diff --git a/test/serial/events.ts b/test/serial/events.ts new file mode 100644 index 0000000..2022082 --- /dev/null +++ b/test/serial/events.ts @@ -0,0 +1,27 @@ +import { Board } from "johnny-five"; + +const board: Board = new Board({ + port: '/dev/ttyUSB1', + debug: false, + repl: false +}); + +board.on('ready', () => { + console.log("Board is ready"); +}) + +board.on('close', () => { + console.log("Board is close"); +}) + +board.on('connect', () => { + console.log("Board is connect"); +}) + +board.on('exit', () => { + console.log("Board is exit"); +}) + +board.on('fail', () => { + console.log("Board is fail"); +}) \ No newline at end of file diff --git a/test/serial/monitoringAllPins.ts b/test/serial/monitoringAllPins.ts deleted file mode 100644 index 6c66119..0000000 --- a/test/serial/monitoringAllPins.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Firmata from 'firmata'; - -const board = new Firmata('/dev/ttyUSB2'); - -board.on('ready', async () => { - board.analogRead(2, (val) => { - console.log(board.analogPins[2]); - const output = board.pins.map((p, i) => { - return `Pin ${i}: ${p.value}` - }).join(", "); - - console.log(output); - }) - - while (true) { - await new Promise(resolve => setTimeout(resolve, 200)); - } -}) \ No newline at end of file diff --git a/test/serial/read.js b/test/serial/read.js deleted file mode 100644 index b6405bb..0000000 --- a/test/serial/read.js +++ /dev/null @@ -1,20 +0,0 @@ -const Firmata = require('firmata'); -const board = new Firmata('/dev/ttyUSB0'); - -board.on('ready', async () => { - const led = 12; - - board.pinMode(led, board.MODES.OUTPUT); - - let state = board.LOW; - - board.digitalWrite(led, board.HIGH); - - state = board.pins[led].value; - - while (true) { - console.log(state); - - await new Promise(resolve => setTimeout(resolve, 1000)); - } -}); \ No newline at end of file diff --git a/test/serial/readResistor.ts b/test/serial/readResistor.ts deleted file mode 100644 index 4a4e5ef..0000000 --- a/test/serial/readResistor.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Firmata from 'firmata'; - -const board = new Firmata('/dev/ttyUSB1'); - -board.on('ready', () => { - board.pinMode(0, Firmata.PIN_MODE.INPUT); - - board.analogRead(0, (val) => { - console.log(val); - }) -}) \ No newline at end of file diff --git a/test/serial/rgbLed.js b/test/serial/rgbLed.js new file mode 100644 index 0000000..5781c8f --- /dev/null +++ b/test/serial/rgbLed.js @@ -0,0 +1,25 @@ +const { Board, Led } = require("johnny-five"); + +const board = new Board({ + port: '/dev/ttyUSB0', + repl: false, + debug: false +}) + +board.on('ready', () => { + const led = new Led.RGB([7, 6, 5]); + + let ins = 252; + board.loop(10, () => { + led.color("#0000FF"); + led.intensity(ins); + ins--; + if (ins < 1) { + ins = 255; + } + }) + + board.analogRead(0, (val) => { + console.log(val); + }) +}); \ No newline at end of file diff --git a/test/serial/rgbLed.ts b/test/serial/rgbLed.ts new file mode 100644 index 0000000..cb4980f --- /dev/null +++ b/test/serial/rgbLed.ts @@ -0,0 +1,28 @@ +import { Board, Led } from "johnny-five"; + +const board = new Board({ + port: '/dev/ttyUSB0', + repl: false, + debug: false +}) + +board.on('ready', () => { + const led = new Led.RGB({ + pins: { + red: 7, + green: 6, + blue: 5, + }, + isAnode: true + }) + + let ins = 100; + + board.loop(10, () => { + led.intensity(ins); + ins--; + if (ins < 1) { + ins = 100; + } + }) +}); \ No newline at end of file diff --git a/test/serial/servo.ts b/test/serial/servo.ts deleted file mode 100644 index e69de29..0000000