-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.ts
113 lines (110 loc) · 3.28 KB
/
server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import {ProgramStack} from './lib/programStack'
import {Program} from './lib/program'
const express = require('express')
import {Server as httpServer} from 'http';
const socketIO = require('socket.io')
var SerialPort = require('serialport');
import {join} from 'path'
import { readdirSync, readFileSync } from 'fs';
let app = express();
app.use(express.static(join(__dirname,'..','public')))
app.get('/api/push/:id',(req,res)=>{
if(config[req.params.id]){
stack.pushProgram(new Program(config[req.params.id].code,config[req.params.id].clientCode))
}
res.send('ok')
})
app.get('/api/pop',(req,res)=>{
if(config[res.params.id]){
stack.popProgram()
}
res.send('ok')
})
let http = new httpServer(app);
let io = socketIO(http);
let config = {};
let appIDs = readdirSync(join(__dirname,'..','apps'))
for(let appID of appIDs){
let appConfig = require(join(__dirname,'..','apps/',appID,'app.json'))
config[appID] = {};
config[appID].code = readFileSync(join(__dirname,'..','apps/',appID,appConfig.server)).toString();
config[appID].clientCode = readFileSync(join(__dirname,'..','apps/',appID,appConfig.client)).toString();
config[appID].title = appConfig.title;
config[appID].hidden = appConfig.hidden || false;
}
export let stack = new ProgramStack(new Program(config['random'].code,config['random'].clientCode));
stack.onMessageEvent.on(({program,data})=>{
io.emit('message',{
programID:program.id,
data
})
})
stack.onTerminateEvent.on(()=>{
io.emit('state',stack.programStack.map(({clientCode,id})=>{
return {
clientCode,
id
}
}))
})
stack.onStartEvent.on(()=>{
io.emit('state',stack.programStack.map(({clientCode,id})=>{
return {
clientCode,
id
}
}))
})
io.on('connection',(socket)=>{
socket.emit('state',stack.programStack.map(({clientCode,id})=>{
return {
clientCode,
id
}
}))
socket.emit('apps',Object.keys(config).map((id)=>({
id:id,
title:config[id].title,
hidden:config[id].hidden
})))
socket.on('message',({programID,data})=>{
let program = stack.programStack.find(({id})=>id == programID);
if(program){
program.postMessage(data);
}
})
socket.on('newProgram',({code,clientCode})=>{
stack.pushProgram(new Program(code,clientCode))
})
socket.on('runApp',({id})=>{
stack.swapProgram(0,new Program(config[id].code,config[id].clientCode))
})
})
http.listen(3000);
function pad_array(arr,len,fill) {
return arr.concat(Array(len).fill(fill)).slice(0,len);
}
// setInterval(async ()=>{
// let leds = pad_array(await stack.getState(),180,[0,0,0])
// io.emit('update',leds)
// },1000);
var port = new SerialPort('/dev/ttyUSB0',{
baudRate:57600
});
console.time("update")
let i = 0;
port.on('data',async (d)=>{
console.timeEnd("update")
console.time("update")
console.time("getState")
try {
let leds = await stack.getState()
let lr = pad_array(leds,180,[0,0,0])
for(let led of pad_array(leds,180,[0,0,0])){
port.write(Buffer.from(pad_array(led,3,0)));
}
} catch (error) {
console.log(error);
}
console.timeEnd("getState")
})