You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
3.5 KiB
JavaScript

const { SerialPort } = require('serialport')
const express = require('express')
const tmi = require('tmi.js');
const { init, translate, circle, rectangle, to, label } = require("./hpgl.js");
let distance = 3;
const app = express()
const client = new tmi.Client({
channels: ['twitchplaysplotter']
});
client.connect();
const port = new SerialPort({
path: '/dev/ttyUSB0',
baudRate: 9600,
})
const toPlotter = (message) => {
console.log("i will write to plotter ", message);
port.write(message, function (err) {
if (err) {
return console.log('Error on write: ', err.message)
}
console.log('message written: ', message)
})
}
// Open errors will be emitted as an error event
port.on('error', function (err) {
console.log('Error: ', err.message)
})
port.on("open", function () {
console.log('open');
port.on('data', function (data) {
console.log(data);
});
});
// GET /text?message={message}
app.post('/text', (req, res) => {
toPlotter(`SI0.5,0.8;LB${req.query.message};`);
res.send(`SI0.5,0.8;LB${req.query.message};`)
});
// GET /direct?message={message}
app.post('/direct', (req, res) => {
toPlotter(`${req.query.message}`);
res.send(`${req.query.message}`)
});
app.use(express.static('public'))
app.listen(3001, () => {
console.log(`Example app listening on port`)
})
const parseMessage = (message) => {
message = message.trim();
if (message.toLowerCase().startsWith("lb")) {
var words = message.toLowerCase().replace("lb", "");
toPlotter(label(words));
} else if (message.toLowerCase().startsWith("distance")) {
console.log("do: ", message);
var value = Number(message.replace("distance ", ""));
console.log("do the value of ", value);
distance = value;
} else {
switch (message.toLowerCase()) {
case 'init':
toPlotter(init());
break;
case 'reset':
distance = 3;
toPlotter(init());
toPlotter(to(0,0));
toPlotter(init());
break;
case 'pu':
toPlotter(`PU;`);
break;
case 'pd':
toPlotter(`PD;`);
break;
case 'up':
toPlotter(translate(0, distance * -1));
break;
case 'down':
toPlotter(translate(0, distance));
break;
case 'left':
toPlotter(translate(distance * -1, 0));
break;
case 'right':
toPlotter(translate(distance, 0));
break;
case 'rectangle':
toPlotter(rectangle(distance));
break;
case 'circle':
toPlotter(circle(distance));
break;
default:
console.log("Message not recognized");
break;
}
}
}
client.on('message', (channel, tags, message, self) => {
console.log(`${tags['display-name']}: ${message}`);
parseMessage(message)
});
const readline = require('node:readline').createInterface({
input: process.stdin,
output: process.stdout,
});
const askQuestion = message => {
console.log(`sending ${message}! \n`);
readline.question(`What do you want the plotter to do? \n`, askQuestion);
parseMessage(message)
}
readline.question(`What do you want the plotter to do?`, askQuestion);