Как создать экспресс-приложение для запуска легкой полосы на Raspberry Pi3 - PullRequest
0 голосов
/ 27 июня 2018

Я настроил сервер узлов на Raspberry Pi для отображения последовательности цветов на светлой полосе Adafruit Dotstar. Функциональность работает следующим образом: я делаю HTTP-запрос к localhost:8000/fade, и сервер отвечает запуском файла fade.js, который представляет собой бесконечный цикл, который исчезает через разные цвета на светлой полосе. К сожалению, я хотел бы иметь возможность выйти из этой команды и выключить световую полосу с другим запросом к localhost:8000/off.

Я экспериментировал с пакетом child_process, чтобы запустить код "fade" и одновременно прослушивать новые запросы. Однако я не могу убить процесс "исчезновения".

Ниже приведен код моего app.js. Любые предложения о том, как убить child_process или, возможно, реструктурировать код другим способом для достижения той же цели? Мне просто нужно иметь возможность непрерывно запускать код «исчезать», а также отвечать на новые запросы.

p.s. Это мой первый проект JS, так что будьте спокойны! Любая помощь приветствуется.

app.js:

var express     = require('express'),
    app         = express();

app.get('/', function (req, res) {
  res.send('App is responding to requests');
});

app.get('/fade', function (req, res) {
  var fork = require('child_process').fork;
  child = fork('./sequences/fade.js');
});

app.get('/off', function (req, res) {
  var fork = require('child_process').fork;
  child = fork('./sequences/off.js');
});

app.listen(8000, function () {
  console.log('Example app listening on port 8000!')
})

fade.js:

console.log("running fade.js");
var dotstar     = require('dotstar'),
    SPI         = require('pi-spi'),
    sleep       = require('sleep');

spi = SPI.initialize('/dev/spidev0.0');
const ledStripLength = 30;

const ledStrip = new dotstar.Dotstar(spi, {
  length: ledStripLength
});

while(1) {
    fade(); //where fade is a long sequence of colors
};

1 Ответ

0 голосов
/ 27 июня 2018
var child; // Outer scope, available in both functions.

app.get('/fade', function (req, res) {
  var fork = require('child_process').fork;
  child = fork('./sequences/fade.js');
});

app.get('/off', function (req, res) {
  // (might be a good idea to check if child exists and is running first...)
  child.kill('SIGHUP');
});

Также http://programmergamer.blogspot.com/2013/05/clarification-on-sigint-sigterm-sigkill.html

SIGHUP: ... Процесс должен явно обработать этот сигнал, чтобы он работал. ...

Так что SIGINT, если вы хотите закрыть, не обращаясь с ним на развилке, или SIGKILL, чтобы просто убить этого мофо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...