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);