rpi_sense_hat_server/server.js
2022-09-12 16:44:14 +08:00

167 lines
6.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Sense HAT 服务端
*/
require('dotenv').config() // 读取系统环境变量
// HTTP状态测试路由
const app = require('express')()
app.get('/', (req, res) => res.sendStatus(200))
// 启动HTTP服务
const port = process.env.PORT || 3000
const host = process.env.HOST || 'localhost'
const server = app.listen(port, host, () => {
console.log(`rpi sense hat server is running on port ${port}`)
})
// Sense HAT 初始化
const sensehat = {
led: {
/*
require('sense-hat-led').sync中包含以下方法
sleep(n) 暂停 n 秒
clear() 清除所有
clear(rgb) or clear([r,g,b]) 填充颜色
setPixel(x,y,r,g,b) or setPixel(x,y,rgb) 设置一个点
getPixel(x,y) 返回 [r,g,b] 获取一个点
setPixels([[r,g,b]*64])
getPixels() -> [[r,g,b]*64]
flipH(redraw=true) 水平反转
flipV(redraw=true) 垂直反转
getter and setter rotation 默认为 0
setRotation(r, redraw=true) 设置旋转r 初始为 0r 只能设置为 0/90/180/270
loadImage(filePath, redraw=true)
showLetter(character, textColour=[255,255,255], backColour=[0,0,0])
showMessage(textString, scrollSpeed=0.1(秒), textColour=[255,255,255], backColour=[0,0,0])
flashMessage(textString, speed=0.1(秒), textColour=[255,255,255], backColour=[0,0,0])
# 未实现 # getter and setter lowLight 默认为 true
# 未实现 # getter and setter gamma = Array of length 32 containing Integers between 0 and 31
# 未实现 # gammaReset() 恢复默认 gamma
*/
...require('sense-hat-led').sync,
get pixels() { return sensehat.led.getPixels() },
},
}
sensehat.led.clear()
sensehat.led.setRotation(180)
sensehat.led.loadImage('images/heart.png')
// socketio 服务
const io = require('socket.io')(server, { cors: { origin: '*' } })
io.on('connection', (client) => {
// 初始化客户端led矩阵
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
// 处理客户端请求
client.on('action', ({ action, color, x, y, pixels, image, character, delay, speed, background, text }) => {
x = Number(x)
y = Number(y)
delay = Number(delay || 200)
speed = Number(speed || 0.1)
character = character || ' '
background = background || [0, 0, 0]
switch (action) {
case 'clear':
color = color || [0, 0, 0]
sensehat.led.clear(color)
io.emit('action', { action: 'clear', color })
break
case 'setPixel':
if (color == undefined) color = [255, 255, 255]
sensehat.led.setPixel(x, y, color)
io.emit('action', { action: 'setPixel', x, y, color })
break
case 'getPixel':
color = sensehat.led.getPixel(x, y)
client.emit('action', { action: 'setPixel', x, y, color })
break
case 'setPixels':
pixels.forEach((color, i) => {
let x = i % 8
let y = Math.floor(i / 8)
sensehat.led.setPixel(x, y, color)
})
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'getPixels':
client.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'flipH':
sensehat.led.flipH()
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'flipV':
sensehat.led.flipV()
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'turnLeft':
var heading_angle = (Number(sensehat.led.rotation) + 90) % 360
sensehat.led.rotation = heading_angle
sensehat.led.setRotation(heading_angle)
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'turnRight':
var heading_angle = (Number(sensehat.led.rotation) + 360 - 90) % 360
sensehat.led.rotation = heading_angle
sensehat.led.setRotation(heading_angle)
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'loadImage':
try {
sensehat.led.loadImage(`images/${image}.png`)
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
} catch (error) {
console.error(error)
}
break
case 'showLetter':
if (color == undefined) color = [255, 255, 255]
sensehat.led.showLetter(character, color, background)
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'showMessage':
sensehat.led.showMessage(text, speed, color, background)
sensehat.led.clear()
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'flashMessage':
sensehat.led.flashMessage(text, speed, color, background)
sensehat.led.clear()
io.emit('action', { action: 'setPixels', pixels: sensehat.led.pixels })
break
case 'flash':
if (color == undefined) color = [255, 255, 255]
sensehat.led.clear(color)
io.emit('action', { action: 'clear', color })
setTimeout(() => {
sensehat.led.clear()
io.emit('action', { action: 'clear' })
}, delay)
break
default:
break
}
})
})