80 lines
1.9 KiB
JavaScript
80 lines
1.9 KiB
JavaScript
const fs = require("fs");
|
|
const path = require("path");
|
|
const https = require("https");
|
|
const express = require("express");
|
|
const WebSocket = require("ws");
|
|
|
|
const config = require("./config/config");
|
|
const FluidNCClient = require("./fluidnc/FluidNCClient");
|
|
|
|
const app = express();
|
|
|
|
// Serve frontend
|
|
app.use(express.static(path.join(__dirname, "../web")));
|
|
|
|
// HTTPS server
|
|
const server = https.createServer(
|
|
{
|
|
key: fs.readFileSync(path.join(__dirname, "../cert/key.pem")),
|
|
cert: fs.readFileSync(path.join(__dirname, "../cert/cert.pem"))
|
|
},
|
|
app);
|
|
|
|
// Websocket server (browser connections)
|
|
const wss = new WebSocket.Server({ server });
|
|
|
|
// Create FluidNC WebSocket client
|
|
const fluid = new FluidNCClient(config.fluidnc);
|
|
|
|
// Connected browser clients
|
|
let clients = [];
|
|
|
|
wss.on("connection", (ws) => {
|
|
console.log("[WS] Browser connected");
|
|
clients.push(ws);
|
|
|
|
ws.on("message", (msg) => {
|
|
try {
|
|
const data = JSON.parse(msg);
|
|
|
|
if (data.type === "jog") {
|
|
fluid.jog(data.axis, data.value);
|
|
}
|
|
|
|
if (data.type === "gcode") {
|
|
fluid.sendGcode(data.cmd);
|
|
}
|
|
|
|
if (data.type === "zero") {
|
|
fluid.setZero();
|
|
}
|
|
|
|
} catch (e) {
|
|
console.log("[WS] Error parsing:", e);
|
|
}
|
|
});
|
|
|
|
ws.on("close", () => {
|
|
clients = clients.filter(c => c !== ws);
|
|
console.log("[WS] Browser disconnected");
|
|
});
|
|
});
|
|
|
|
// FluidNC → Browser broadcasting
|
|
fluid.onMessage((msg) => {
|
|
clients.forEach(c => {
|
|
if (c.readyState === WebSocket.OPEN) {
|
|
c.send(msg.toString());
|
|
}
|
|
});
|
|
});
|
|
|
|
// Status polling ("?" every 200ms)
|
|
setInterval(() => {
|
|
fluid.requestStatus();
|
|
}, 200);
|
|
|
|
server.listen(config.server.port, () => {
|
|
console.log("[Server] Running at:");
|
|
console.log(`https://localhost:${config.server.port}`);
|
|
}); |