如何构建Express应用以在Raspberry Pi3上运行灯条

时间:2018-06-27 02:06:14

标签: javascript node.js express raspberry-pi

我已经在树莓派上设置了一个节点服务器,以在Adafruit Dotstar灯条上显示一系列颜色。该功能的工作方式如下:我向localhost:8000/fade发出HTTP请求,服务器通过运行fade.js文件进行响应,该文件是一个无限循环,通过光带上的不同颜色逐渐消失。不幸的是,我希望能够退出此命令,并通过对localhost:8000/off的另一个请求来关闭灯带。

我已经尝试使用child_process包来运行“淡入​​淡出”代码,同时还监听新的请求。但是,我无法取消“淡入淡出”过程。

下面发布的是我的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 :(得分:0)

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是要杀死那个mofo的东西。