From f6337909bf67e10475fbb31135656ea1864c344f Mon Sep 17 00:00:00 2001 From: Massiles Ghernaout <749-gm213204@users.noreply.www-apps.univ-lehavre.fr> Date: Fri, 21 Nov 2025 15:22:17 +0100 Subject: [PATCH] docker: docker setup for monitor/server --- monitor/server/Dockerfile | 16 +++++++++++++ monitor/server/monitor-arduino.js | 26 ++++++++++++++------- monitor/server/package-lock.json | 10 ++++++++ monitor/server/package.json | 12 +++++++--- monitor/server/run.sh | 38 +++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 monitor/server/Dockerfile create mode 100755 monitor/server/run.sh diff --git a/monitor/server/Dockerfile b/monitor/server/Dockerfile new file mode 100644 index 0000000..cd60af9 --- /dev/null +++ b/monitor/server/Dockerfile @@ -0,0 +1,16 @@ +FROM node:18-slim + +# Create app directory +WORKDIR /app + +# Copy dependency files +COPY package.json package-lock.json* ./ + +# Install dependencies +RUN npm install --production + +# Copy source +COPY monitor-arduino.js . + +# Default command; overridden at runtime +CMD ["node", "monitor-arduino.js"] diff --git a/monitor/server/monitor-arduino.js b/monitor/server/monitor-arduino.js index ebaa62f..6ebeea0 100644 --- a/monitor/server/monitor-arduino.js +++ b/monitor/server/monitor-arduino.js @@ -1,10 +1,25 @@ +#!/usr/bin/env node + const { SerialPort, ReadlineParser } = require("serialport"); const express = require("express"); const http = require("http"); const WebSocket = require("ws"); -const PORT_NAME = "/dev/pts/3"; -const BAUD = 9600; +// --------------------------- +// COMMAND LINE ARGUMENTS +// --------------------------- +// +// Usage: +// node monitor-arduino.js --serial=/dev/ttyUSB0 --baud=9600 --http=8000 +// + +const args = require("minimist")(process.argv.slice(2), { + string: ["serial", "baud", "http"], +}); + +const PORT_NAME = args.serial; +const BAUD = parseInt(args.baud, 10); +const HTTP_PORT = parseInt(args.http, 10); // --------------------------- // SERIAL PORT SETUP @@ -48,13 +63,11 @@ parser.on("data", (raw) => { const line = raw.trim(); console.log("Serial:", line); - // --- JUMP --- if (line === "JUMP") { broadcast({ type: "input", action: "jump" }); return; } - // --- SCORE --- if (line.startsWith("S")) { const value = parseInt(line.substring(1), 10); if (!isNaN(value)) { @@ -63,7 +76,6 @@ parser.on("data", (raw) => { return; } - // --- DEATHS --- if (line.startsWith("D")) { const value = parseInt(line.substring(1), 10); if (!isNaN(value)) { @@ -72,14 +84,12 @@ parser.on("data", (raw) => { return; } - // Optional: forward unknown messages too broadcast({ type: "unknown", raw: line }); }); // --------------------------- -// START HTTP SERVER +// START SERVER // --------------------------- -const HTTP_PORT = 8000; server.listen(HTTP_PORT, () => { console.log(`HTTP/WebSocket server running at http://localhost:${HTTP_PORT}`); }); diff --git a/monitor/server/package-lock.json b/monitor/server/package-lock.json index 68dd97b..55200ad 100644 --- a/monitor/server/package-lock.json +++ b/monitor/server/package-lock.json @@ -6,6 +6,7 @@ "": { "dependencies": { "express": "^5.1.0", + "minimist": "^1.2.8", "serialport": "^13.0.0", "ws": "^8.18.3" } @@ -727,6 +728,15 @@ "url": "https://opencollective.com/express" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/monitor/server/package.json b/monitor/server/package.json index 9a920c4..55fb015 100644 --- a/monitor/server/package.json +++ b/monitor/server/package.json @@ -1,7 +1,13 @@ { + "name": "monitor-arduino", + "version": "1.0.0", + "main": "monitor-arduino.js", + "type": "commonjs", "dependencies": { - "express": "^5.1.0", - "serialport": "^13.0.0", - "ws": "^8.18.3" + "express": "^4.18.2", + "ws": "^8.14.2", + "serialport": "^12.0.0", + "minimist": "^1.2.8" } } + diff --git a/monitor/server/run.sh b/monitor/server/run.sh new file mode 100755 index 0000000..8f9dc9f --- /dev/null +++ b/monitor/server/run.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +set -e + +SERIAL_PORT=${1:-/dev/ttyUSB0} +BAUD=${2:-9600} +HTTP_PORT=${3:-8000} + +IMAGE_NAME="monitor-arduino" + +echo "----------------------------------------" +echo "Building Docker image: $IMAGE_NAME" +echo "Serial Port: $SERIAL_PORT" +echo "Baud Rate: $BAUD" +echo "HTTP Port: $HTTP_PORT" +echo "----------------------------------------" + +docker build -t $IMAGE_NAME . + +EXTRA_FLAGS="" + +# If using /dev/pts/* (virtual serial), we must mount the pts filesystem +if [[ "$SERIAL_PORT" == /dev/pts/* ]]; then + echo "Detected pseudo-tty ($SERIAL_PORT) → enabling --privileged and /dev/pts bind mount" + EXTRA_FLAGS="--privileged -v /dev/pts:/dev/pts" +fi + +echo "Starting container..." + +docker run \ + --rm \ + $EXTRA_FLAGS \ + --device="$SERIAL_PORT" \ + -p "$HTTP_PORT:$HTTP_PORT" \ + $IMAGE_NAME \ + node monitor-arduino.js \ + --serial="$SERIAL_PORT" \ + --baud="$BAUD" \ + --http="$HTTP_PORT" -- GitLab