From 0a982a40663dcbf7e7f266a0e35cf4734c3e5de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Ribal=20del=20R=C3=ADo?= Date: Sat, 16 May 2026 22:46:58 +0200 Subject: [PATCH] chore: remove packet sender --- README.md | 4 +- electron-app/build.mjs | 37 ---- electron-app/main.js | 3 +- electron-app/src/menu/README.md | 1 - electron-app/src/menu/menu.js | 41 ----- electron-app/src/processes/README.md | 18 -- packet-sender/go.mod | 34 ---- packet-sender/go.sum | 145 ---------------- packet-sender/main.go | 101 ----------- packet-sender/main_test.go | 206 ----------------------- packet-sender/package.json | 11 -- packet-sender/pkg/board/board.go | 36 ---- packet-sender/pkg/listener/listener.go | 108 ------------ packet-sender/pkg/sender/customSender.go | 105 ------------ packet-sender/pkg/sender/randomSender.go | 179 -------------------- packet-sender/pkg/sender/sender.go | 26 --- packet-sender/testadj.py | 121 ------------- pnpm-workspace.yaml | 1 - 18 files changed, 2 insertions(+), 1175 deletions(-) delete mode 100644 packet-sender/go.mod delete mode 100644 packet-sender/go.sum delete mode 100644 packet-sender/main.go delete mode 100644 packet-sender/main_test.go delete mode 100644 packet-sender/package.json delete mode 100644 packet-sender/pkg/board/board.go delete mode 100644 packet-sender/pkg/listener/listener.go delete mode 100644 packet-sender/pkg/sender/customSender.go delete mode 100644 packet-sender/pkg/sender/randomSender.go delete mode 100644 packet-sender/pkg/sender/sender.go delete mode 100644 packet-sender/testadj.py diff --git a/README.md b/README.md index fca4c0051..6f60c356d 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ Before starting, ensure you have the following installed: - **PNPM** (v10.26.0+) - **Node.js** (v20+) - **Go** (for the backend) -- **Rust/Cargo** (for the packet-sender) --- @@ -26,7 +25,6 @@ Our `pnpm-workspace.yaml` defines the following workspaces: | `testing-view` | TS/React | Web interface for telemetry testing | | `competition-view` | TS/React | UI for the competition | | `backend` | Go | Data ingestion and pod communication server | -| `packet-sender` | Rust | Utility for simulating vehicle packets | | `hyperloop-control-station` | JS | The main Control Station electron desktop application | | `e2e` | TS | End-to-end tests for the whole app (Playwright) | | `@workspace/ui` | TS/React | Shared UI component library (frontend-kit) | @@ -44,7 +42,7 @@ These commands should be executed from the root directory (`/software`). #### Global Development Scripts -- `pnpm dev` – Runs both frontends, the backend (with `dev-config.toml`), and the packet-sender in a single terminal window. +- `pnpm dev` – Runs both frontends and the backend (with `dev-config.toml`) in a single terminal window. - `pnpm dev:main` – Runs frontends and the backend using the standard `config.toml`. #### Turbo Filtering diff --git a/electron-app/build.mjs b/electron-app/build.mjs index a15f0a4c5..4525e24a3 100644 --- a/electron-app/build.mjs +++ b/electron-app/build.mjs @@ -53,43 +53,6 @@ const CONFIG = { }, ], }, - // "packet-sender": { - // type: "go", - // path: join(ROOT, "packet-sender"), - // output: join(__dirname, "binaries"), - // entry: ".", - // commands: ["pnpm run build:ci"], - // platforms: [ - // { - // id: "win64", - // goos: "windows", - // goarch: "amd64", - // ext: ".exe", - // tags: ["win", "windows"], - // }, - // { - // id: "linux64", - // goos: "linux", - // goarch: "amd64", - // ext: "", - // tags: ["linux"], - // }, - // { - // id: "mac64", - // goos: "darwin", - // goarch: "amd64", - // ext: "", - // tags: ["mac", "macos"], - // }, - // { - // id: "macArm", - // goos: "darwin", - // goarch: "arm64", - // ext: "", - // tags: ["mac", "macos"], - // }, - // ], - // }, "testing-view": { type: "frontend", path: join(ROOT, "frontend/testing-view"), diff --git a/electron-app/main.js b/electron-app/main.js index 224aea7dd..b5067bd32 100644 --- a/electron-app/main.js +++ b/electron-app/main.js @@ -9,7 +9,6 @@ import pkg from "electron-updater"; import { getConfigManager } from "./src/config/configInstance.js"; import { setupIpcHandlers } from "./src/ipc/handlers.js"; import { startBackend, stopBackend } from "./src/processes/backend.js"; -import { stopPacketSender } from "./src/processes/packetSender.js"; import { startBlcuProgramming, stopBlcuProgramming } from "./src/processes/blcuProgramming.js"; import { logger } from "./src/utils/logger.js"; import { createLogWindow } from "./src/windows/logWindow.js"; @@ -108,7 +107,7 @@ app.on("window-all-closed", () => { // Cleanup before app quits app.on("before-quit", (e) => { e.preventDefault(); - Promise.all([stopBackend(), stopPacketSender(), stopBlcuProgramming()]) + Promise.all([stopBackend(), stopBlcuProgramming()]) .catch((error) => logger.electron.error("Error during shutdown:", error)) .finally(() => app.exit()); }); diff --git a/electron-app/src/menu/README.md b/electron-app/src/menu/README.md index 9f9e959a1..8f3b95918 100644 --- a/electron-app/src/menu/README.md +++ b/electron-app/src/menu/README.md @@ -40,7 +40,6 @@ Creates and sets the application menu bar. Takes the main window instance as par ## Dependencies -- `../processes/packetSender.js` - For starting/stopping packet sender - `../utils/paths.js` - For resolving binary paths - `electron` - For Menu, dialog, and app APIs diff --git a/electron-app/src/menu/menu.js b/electron-app/src/menu/menu.js index c2000533d..c64b64ff4 100644 --- a/electron-app/src/menu/menu.js +++ b/electron-app/src/menu/menu.js @@ -5,13 +5,6 @@ */ import { Menu, app, dialog } from "electron"; -import fs from "fs"; -import { - getPacketSenderProcess, - startPacketSender, - stopPacketSender, -} from "../processes/packetSender.js"; -import { getBinaryPath } from "../utils/paths.js"; import { loadView } from "../windows/mainWindow.js"; /** @@ -73,40 +66,6 @@ function createMenu(mainWindow) { }, ], }, - { - label: "Tools", - submenu: [ - { - label: "Start Packet Sender", - click: () => { - const packetSenderBin = getBinaryPath("packet-sender"); - if (!fs.existsSync(packetSenderBin)) { - dialog.showMessageBox(mainWindow, { - type: "warning", - title: "Packet Sender Not Available", - message: "Packet sender binary not found", - detail: "This optional tool was not included in the build.", - }); - return; - } - const packetSenderProcess = getPacketSenderProcess(); - if (!packetSenderProcess || packetSenderProcess.killed) { - startPacketSender(); - } - }, - }, - { - label: "Stop Packet Sender", - click: () => { - stopPacketSender(); - const packetSenderProcess = getPacketSenderProcess(); - if (packetSenderProcess && !packetSenderProcess.killed) { - stopPacketSender(); - } - }, - }, - ], - }, { label: "Help", submenu: [ diff --git a/electron-app/src/processes/README.md b/electron-app/src/processes/README.md index 51cfe231a..3be16e5e9 100644 --- a/electron-app/src/processes/README.md +++ b/electron-app/src/processes/README.md @@ -9,7 +9,6 @@ Manages the lifecycle of external binary processes spawned by the Electron appli ## Files - `backend.js` - Backend process management -- `packetSender.js` - Packet sender utility process management ## Backend Process (`backend.js`) @@ -29,23 +28,6 @@ Manages the Go backend process that handles data processing. - Shows error dialogs on startup failures or crashes - Passes config file path via `--config` flag -## Packet Sender Process (`packetSender.js`) - -Manages the packet sender utility tool for testing. - -### Functions - -- `startPacketSender(args)` - Spawns packet sender with optional arguments -- `stopPacketSender()` - Stops the packet sender process -- `restartPacketSender()` - Restarts the packet sender process -- `getPacketSenderProcess()` - Returns the current process instance - -### Behavior - -- Validates binary exists before starting -- Logs stdout/stderr to logger -- Returns `null` if binary not found (optional tool) -- Defaults to `--help` flag when restarted ## Dependencies diff --git a/packet-sender/go.mod b/packet-sender/go.mod deleted file mode 100644 index b513866fd..000000000 --- a/packet-sender/go.mod +++ /dev/null @@ -1,34 +0,0 @@ -module packet_sender - -go 1.23.0 - -toolchain go1.24.2 - -require github.com/HyperloopUPV-H8/h9-backend v0.0.0-00010101000000-000000000000 - -require ( - dario.cat/mergo v1.0.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v1.0.0 // indirect - github.com/cloudflare/circl v1.3.7 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/emirpasic/gods v1.18.1 // indirect - github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-git/go-git/v5 v5.12.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/skeema/knownhosts v1.2.2 // indirect - github.com/xanzy/ssh-agent v0.3.3 // indirect - golang.org/x/crypto v0.36.0 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.38.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/tools v0.13.0 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect -) - -replace github.com/HyperloopUPV-H8/h9-backend => ../backend diff --git a/packet-sender/go.sum b/packet-sender/go.sum deleted file mode 100644 index 688732b2b..000000000 --- a/packet-sender/go.sum +++ /dev/null @@ -1,145 +0,0 @@ -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= -github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= -github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= -github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= -github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/packet-sender/main.go b/packet-sender/main.go deleted file mode 100644 index f748519f3..000000000 --- a/packet-sender/main.go +++ /dev/null @@ -1,101 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net" - boardpkg "packet_sender/pkg/board" - "packet_sender/pkg/listener" - "packet_sender/pkg/sender" - "strings" - - adj_module "github.com/HyperloopUPV-H8/h9-backend/pkg/adj" -) - -func main() { - adj := getADJ() - conns := getConns(adj) - - fmt.Print("[Warning] This program must start before the backend. If the backend is terminated, this program must be restarted. \n \n") - fmt.Println("[Tip] You may send and listen to packets at the same time, on different terminals.") - input := getBinaryInput("Select mode:\n1) Send packets\n2) Listen packets") - - switch input { - case "1": - input := getBinaryInput("Do you want to send random or custom packets?\n1) Random\n2) Custom") - sender.Start(conns, input) - case "2": - listener.Start(conns, adj) - } -} - -func getConns(adj adj_module.ADJ) []boardpkg.BoardConn { - conns := make([]boardpkg.BoardConn, 0) - - for _, board := range adj.Boards { - conn := getConn(board.IP, 0, adj.Info.Addresses["backend"], adj.Info.Ports["UDP"]) - conns = append(conns, boardpkg.BoardConn{ - UDPConn: conn, - Packets: []adj_module.Packet{}, - Board: board, - }) - } - - return conns -} - -func getConn(lip string, lport uint16, rip string, rport uint16) *net.UDPConn { - laddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", lip, lport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - raddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", rip, rport)) - if err != nil { - log.Fatalf("resolve address: %s\n", err) - } - conn, err := net.DialUDP("udp", laddr, raddr) - - if err != nil { - log.Fatal("Error creating udp connection", err) - } - - return conn -} - -// getADJ loads the same ADJ used by backend directly from backend/cmd/adj. -func getADJ() adj_module.ADJ { - // adjPath, err := filepath.Abs(path.Join("..", "backend", "cmd", "adj")) - // if err != nil { - // log.Fatalf("Failed to resolve ADJ path: %v", err) - // } - // adj_module.RepoPath = adjPath + string(filepath.Separator) - - // Uses the same ADJ RepoPath as the backend by default - - adj, err := adj_module.NewADJ("") - if err != nil { - log.Fatalf("Failed to load ADJ: %v\n", err) - } - - return adj -} - -func getBinaryInput(msg string) string { - - fmt.Println(msg) - var input string - _, err := fmt.Scan(&input) - if err != nil { - log.Fatalf("failed to read input: %v", err) - } - - for { - input = strings.TrimSpace(input) - if input != "1" && input != "2" { - log.Fatal("invalid input: use 1 or 2") - } else { - break - } - } - return input -} diff --git a/packet-sender/main_test.go b/packet-sender/main_test.go deleted file mode 100644 index 8b9af7fa0..000000000 --- a/packet-sender/main_test.go +++ /dev/null @@ -1,206 +0,0 @@ -package main - -import ( - "encoding/binary" - boardpkg "packet_sender/pkg/board" - sender "packet_sender/pkg/sender" - "testing" - - "github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction" - adj_module "github.com/HyperloopUPV-H8/h9-backend/pkg/adj" -) - -func TestGetBoardPackets_FiltersOnlyDataPackets(t *testing.T) { - board := adj_module.Board{ - Name: "VCU", - Packets: []adj_module.Packet{ - {Id: abstraction.PacketId(100), Name: "DataA", Type: "data", VariablesIds: []string{"a"}}, - {Id: abstraction.PacketId(200), Name: "OrderA", Type: "order", VariablesIds: []string{"b"}}, - {Id: abstraction.PacketId(300), Name: "StateOrderA", Type: "stateOrder", VariablesIds: []string{"c"}}, - {Id: abstraction.PacketId(400), Name: "DataB", Type: "data", VariablesIds: []string{"d"}}, - }, - } - - bc := boardpkg.BoardConn{Board: board} - boardpkg.LoadDataPackets(&bc) - - if len(bc.Packets) != 2 { - t.Fatalf("expected 2 data packets, got %d", len(bc.Packets)) - } - - if bc.Packets[0].Type != "data" || bc.Packets[1].Type != "data" { - t.Fatalf("expected all packets to be type=data, got %q and %q", bc.Packets[0].Type, bc.Packets[1].Type) - } - - if bc.Packets[0].Id != 100 || bc.Packets[1].Id != 400 { - t.Fatalf("unexpected packet IDs: got %d and %d", bc.Packets[0].Id, bc.Packets[1].Id) - } -} - -func TestGetBoardPackets_EmptyInputProducesEmptyOutput(t *testing.T) { - bc := boardpkg.BoardConn{ - Board: adj_module.Board{ - Name: "EmptyBoard", - Packets: nil, - }, - } - - boardpkg.LoadDataPackets(&bc) - - if len(bc.Packets) != 0 { - t.Fatalf("expected 0 packets, got %d", len(bc.Packets)) - } -} - -func TestCreateRandomPacket_NoPackets_ReturnsNil(t *testing.T) { - bc := boardpkg.BoardConn{Packets: nil} - got := sender.CreateRandomPacket(&bc) - if got != nil { - t.Fatalf("expected nil, got %v", got) - } -} - -func TestCreateRandomPacket_NoVariables_ReturnsNil(t *testing.T) { - bc := boardpkg.BoardConn{ - Packets: []adj_module.Packet{ - { - Id: abstraction.PacketId(42), - Type: "data", - Variables: nil, - VariablesIds: nil, - }, - }, - } - - got := sender.CreateRandomPacket(&bc) - if got != nil { - t.Fatalf("expected nil when packet has no variables, got %v", got) - } -} - -func TestCreateRandomPacket_StringMeasurement_ReturnsNil(t *testing.T) { - bc := boardpkg.BoardConn{ - Packets: []adj_module.Packet{ - { - Id: abstraction.PacketId(7), - Type: "data", - VariablesIds: []string{"s"}, - Variables: []adj_module.Measurement{ - {Id: "s", Name: "S", Type: "string"}, - }, - }, - }, - } - - got := sender.CreateRandomPacket(&bc) - if got != nil { - t.Fatalf("expected nil for string measurement, got %v", got) - } -} - -func TestCreateRandomPacket_BoolPacket_HasIDAndPayload(t *testing.T) { - bc := boardpkg.BoardConn{ - Packets: []adj_module.Packet{ - { - Id: abstraction.PacketId(513), // 0x0201 - Type: "data", - VariablesIds: []string{"b"}, - Variables: []adj_module.Measurement{ - {Id: "b", Name: "B", Type: "bool"}, - }, - }, - }, - } - - got := sender.CreateRandomPacket(&bc) - if got == nil { - t.Fatal("expected non-nil packet") - } - - // 2 bytes ID + 1 byte bool - if len(got) != 3 { - t.Fatalf("expected len=3, got %d", len(got)) - } - - id := binary.LittleEndian.Uint16(got[:2]) - if id != 513 { - t.Fatalf("expected id=513, got %d", id) - } - - if got[2] != 0 && got[2] != 1 { - t.Fatalf("expected bool payload byte 0 or 1, got %d", got[2]) - } -} - -func TestCreateRandomPacket_EnumPacket_HasIDAndEnumByte(t *testing.T) { - bc := boardpkg.BoardConn{ - Packets: []adj_module.Packet{ - { - Id: abstraction.PacketId(10), - Type: "data", - VariablesIds: []string{"mode"}, - Variables: []adj_module.Measurement{ - {Id: "mode", Name: "Mode", Type: "enum(OFF,ON,FAULT)"}, - }, - }, - }, - } - - got := sender.CreateRandomPacket(&bc) - if got == nil { - t.Fatal("expected non-nil packet") - } - - // 2 bytes ID + 1 byte enum - if len(got) != 3 { - t.Fatalf("expected len=3, got %d", len(got)) - } - - id := binary.LittleEndian.Uint16(got[:2]) - if id != 10 { - t.Fatalf("expected id=10, got %d", id) - } - - enumVal := got[2] - if enumVal > 2 { - t.Fatalf("expected enum byte in [0..2], got %d", enumVal) - } -} - -func TestCreateRandomPacket_NumericPacket_HasIDAndNumericPayload(t *testing.T) { - bc := boardpkg.BoardConn{ - Packets: []adj_module.Packet{ - { - Id: abstraction.PacketId(20), - Type: "data", - VariablesIds: []string{"rpm"}, - Variables: []adj_module.Measurement{ - { - Id: "rpm", - Name: "RPM", - Type: "uint16", - WarningRange: []*float64{}, // force fallback path - }, - }, - }, - }, - } - - got := sender.CreateRandomPacket(&bc) - if got == nil { - t.Fatal("expected non-nil packet") - } - - // 2 bytes ID + 2 bytes uint16 - if len(got) != 4 { - t.Fatalf("expected len=4, got %d", len(got)) - } - - id := binary.LittleEndian.Uint16(got[:2]) - if id != 20 { - t.Fatalf("expected id=20, got %d", id) - } - - // just ensure numeric payload exists and is parseable - _ = binary.LittleEndian.Uint16(got[2:4]) -} \ No newline at end of file diff --git a/packet-sender/package.json b/packet-sender/package.json deleted file mode 100644 index 9f0d954e5..000000000 --- a/packet-sender/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "packet-sender", - "version": "1.0.0", - "private": true, - "author": "Hyperloop UPV Team", - "license": "MIT", - "scripts": { - "build": "go build -o packet-sender main.go", - "build:ci": "go build" - } -} diff --git a/packet-sender/pkg/board/board.go b/packet-sender/pkg/board/board.go deleted file mode 100644 index 59d204850..000000000 --- a/packet-sender/pkg/board/board.go +++ /dev/null @@ -1,36 +0,0 @@ -package board - -import ( - "net" - - adj_module "github.com/HyperloopUPV-H8/h9-backend/pkg/adj" -) - -type BoardConn struct { - UDPConn *net.UDPConn - Packets []adj_module.Packet - Board adj_module.Board - - TCPListener *net.TCPListener - TCPConn net.Conn -} - -func LoadDataPackets(boardConn *BoardConn) { - packets := make([]adj_module.Packet, 0) - - for _, packet := range boardConn.Board.Packets { - if packet.Type != "data" { - continue - } - - packets = append(packets, adj_module.Packet{ - Id: packet.Id, - Name: packet.Name, - Type: packet.Type, - Variables: packet.Variables, - VariablesIds: packet.VariablesIds, - }) - } - - boardConn.Packets = packets -} diff --git a/packet-sender/pkg/listener/listener.go b/packet-sender/pkg/listener/listener.go deleted file mode 100644 index 5dd1f1a3d..000000000 --- a/packet-sender/pkg/listener/listener.go +++ /dev/null @@ -1,108 +0,0 @@ -package listener - -import ( - "encoding/binary" - "fmt" - "log" - "net" - boardpkg "packet_sender/pkg/board" - - adj_module "github.com/HyperloopUPV-H8/h9-backend/pkg/adj" -) - -func Start(conns []boardpkg.BoardConn, adj adj_module.ADJ) { - tcpPort := adj.Info.Ports["TCP_SERVER"] - for i := range conns { - if err := startTCPListener(&conns[i], tcpPort); err != nil { - log.Printf("TCP listener error: %v", err) - } - } - - defer func() { - for _, c := range conns { - if c.TCPConn != nil { - c.TCPConn.Close() - } - if c.TCPListener != nil { - c.TCPListener.Close() - } - } - }() - - // Get the list of packets for each board - for i := range conns { - boardpkg.LoadDataPackets(&conns[i]) - go startTCPConnection(&conns[i]) - } - - select {} -} - -func startTCPListener(board *boardpkg.BoardConn, backendPort uint16) error { - - addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", board.Board.IP, backendPort)) - if err != nil { - return fmt.Errorf("resolve tcp addr for %s: %w", board.Board.Name, err) - } - - ln, err := net.ListenTCP("tcp", addr) - if err != nil { - return fmt.Errorf("listen tcp for %s: %w", board.Board.Name, err) - } - - board.TCPListener = ln - log.Printf("[%s] TCP listening on %s", board.Board.Name, ln.Addr().String()) - return nil -} - -func startTCPConnection(board *boardpkg.BoardConn) { - if board.TCPListener == nil { - return - } - - conn, err := board.TCPListener.AcceptTCP() - if err != nil { - log.Printf("[%s] TCP accept error: %v", board.Board.Name, err) - return - } - - board.TCPConn = conn - log.Printf("[%s] TCP connected: local=%s remote=%s", - board.Board.Name, conn.LocalAddr().String(), conn.RemoteAddr().String()) - - go readTCPPackets(board) -} - -func readTCPPackets(board *boardpkg.BoardConn) { - if board.TCPConn == nil { - return - } - - buf := make([]byte, 2048) - - // Read packets in a loop - for { - n, err := board.TCPConn.Read(buf) - if err != nil { - log.Printf("[%s] TCP read closed/error: %v", board.Board.Name, err) - return - } - if n < 2 { - log.Printf("[%s] TCP read %d bytes (too short for packet id)", board.Board.Name, n) - continue - } - - id := binary.LittleEndian.Uint16(buf[:2]) - order := findOrderByID(board, id) - log.Printf("[%s] TCP: packet_id=%d order=%s", board.Board.Name, id, order) - } -} - -func findOrderByID(board *boardpkg.BoardConn, id uint16) string { - for _, p := range board.Board.Packets { - if uint16(p.Id) == id { - return p.Name - } - } - return "unknown" -} \ No newline at end of file diff --git a/packet-sender/pkg/sender/customSender.go b/packet-sender/pkg/sender/customSender.go deleted file mode 100644 index a07386ab7..000000000 --- a/packet-sender/pkg/sender/customSender.go +++ /dev/null @@ -1,105 +0,0 @@ -package sender - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "os" - boardpkg "packet_sender/pkg/board" - "strconv" - "strings" -) - -func CustomSender(conns []boardpkg.BoardConn) { - reader := bufio.NewReader(os.Stdin) - for { - // Show available boards - fmt.Println("Available boards:") - for i, c := range conns { - fmt.Printf("[%d] %s\n", i, c.Board.Name) - } - fmt.Print("Select board index: ") - boardIdxStr, _ := reader.ReadString('\n') - boardIdx, err := strconv.Atoi(strings.TrimSpace(boardIdxStr)) - if err != nil || boardIdx < 0 || boardIdx >= len(conns) { - fmt.Println("Invalid board index") - continue - } - board := &conns[boardIdx] - - // Show available packets - fmt.Println("Available packets:") - for i, p := range board.Packets { - fmt.Printf("[%d] ID: %d, Nombre: %s\n", i, p.Id, p.Name) - } - fmt.Print("Select packet index: ") - packetIdxStr, _ := reader.ReadString('\n') - packetIdx, err := strconv.Atoi(strings.TrimSpace(packetIdxStr)) - if err != nil || packetIdx < 0 || packetIdx >= len(board.Packets) { - fmt.Println("Invalid packet index") - continue - } - packet := board.Packets[packetIdx] - - // Ask values for each variable - buff := bytes.NewBuffer(make([]byte, 0)) - binary.Write(buff, binary.LittleEndian, packet.Id) - - for _, v := range packet.Variables { - fmt.Printf("Enter value for %s (%s): ", v.Name, v.Type) - valStr, _ := reader.ReadString('\n') - valStr = strings.TrimSpace(valStr) - writeUserValueAsBytes(valStr, v.Type, buff) - } - - // Send packet - _, err = board.UDPConn.Write(buff.Bytes()) - if err != nil { - fmt.Println("Error sending packet:", err) - } else { - fmt.Println("Packet sent successfully.") - } - } -} - -func writeUserValueAsBytes(valStr, typ string, buff *bytes.Buffer) { - switch typ { - case "uint8": - v, _ := strconv.ParseUint(valStr, 10, 8) - binary.Write(buff, binary.LittleEndian, uint8(v)) - case "uint16": - v, _ := strconv.ParseUint(valStr, 10, 16) - binary.Write(buff, binary.LittleEndian, uint16(v)) - case "uint32": - v, _ := strconv.ParseUint(valStr, 10, 32) - binary.Write(buff, binary.LittleEndian, uint32(v)) - case "uint64": - v, _ := strconv.ParseUint(valStr, 10, 64) - binary.Write(buff, binary.LittleEndian, uint64(v)) - case "int8": - v, _ := strconv.ParseInt(valStr, 10, 8) - binary.Write(buff, binary.LittleEndian, int8(v)) - case "int16": - v, _ := strconv.ParseInt(valStr, 10, 16) - binary.Write(buff, binary.LittleEndian, int16(v)) - case "int32": - v, _ := strconv.ParseInt(valStr, 10, 32) - binary.Write(buff, binary.LittleEndian, int32(v)) - case "int64": - v, _ := strconv.ParseInt(valStr, 10, 64) - binary.Write(buff, binary.LittleEndian, int64(v)) - case "float32": - v, _ := strconv.ParseFloat(valStr, 32) - binary.Write(buff, binary.LittleEndian, float32(v)) - case "float64": - v, _ := strconv.ParseFloat(valStr, 64) - binary.Write(buff, binary.LittleEndian, v) - case "bool": - v := valStr == "true" || valStr == "1" - binary.Write(buff, binary.LittleEndian, v) - default: - // Add extra handling for enums and other types here. - binary.Write(buff, binary.LittleEndian, uint8(0)) - } -} diff --git a/packet-sender/pkg/sender/randomSender.go b/packet-sender/pkg/sender/randomSender.go deleted file mode 100644 index 2457bee57..000000000 --- a/packet-sender/pkg/sender/randomSender.go +++ /dev/null @@ -1,179 +0,0 @@ -package sender - -import ( - "bytes" - "encoding/binary" - "fmt" - "log" - "math" - "math/rand" - "os" - "os/signal" - boardpkg "packet_sender/pkg/board" - "strings" - "time" -) - -func RandomSender(conns []boardpkg.BoardConn) { - count := make(chan struct{}, 10000) - start := time.Now() - prev := time.Now() - go func() { - ticker := time.NewTicker(10 * time.Millisecond) - defer ticker.Stop() - for range ticker.C { - // Get a random board to send the packet from - randomIndex := rand.Int63n(int64(len(conns))) - randomBoard := conns[randomIndex] - - packet := CreateRandomPacket(&randomBoard) - fmt.Println(time.Since(prev)) - prev = time.Now() - - if len(packet) < 2 { - continue - } - - fmt.Printf("Sending packet ID: %d, size: %d\n", binary.LittleEndian.Uint16(packet), len(packet)) - _, err := randomBoard.UDPConn.Write(packet) - if err != nil { - continue - } - - count <- struct{}{} - } - }() - - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt) - defer signal.Stop(interrupt) - - sent := 0 - for { - select { - case <-count: - sent++ - case <-interrupt: - fmt.Printf("Sent=%d, Elapsed=%v\n", sent, time.Since(start)) - return - } - } -} - -func CreateRandomPacket(board *boardpkg.BoardConn) []byte { - if len(board.Packets) == 0 { - return nil - } - - randomIndex := rand.Int63n(int64(len(board.Packets))) - randomPacket := board.Packets[randomIndex] - - if len(randomPacket.VariablesIds) == 0 { - log.Printf("The packet with ID %d has no measurements\n", randomPacket.Id) - return nil - } - - buff := bytes.NewBuffer(make([]byte, 0)) - - binary.Write(buff, binary.LittleEndian, randomPacket.Id) - - for _, measurement := range randomPacket.Variables { - switch { - case strings.Contains(measurement.Type, "enum"): - n := enumOptionCount(measurement.Type) - binary.Write(buff, binary.LittleEndian, uint8(rand.Intn(n))) - case measurement.Type == "bool": - binary.Write(buff, binary.LittleEndian, rand.Intn(2) == 1) - case measurement.Type == "string": - return nil - default: - var number float64 - // If warning bounds are unavailable, fall back to full type range. - if len(measurement.WarningRange) == 0 { - number = mapNumberToRange(rand.Float64(), nil, measurement.Type) - } else if measurement.WarningRange[0] != nil && measurement.WarningRange[1] != nil { - low := *measurement.WarningRange[0] * 0.8 - high := *measurement.WarningRange[1] * 1.2 - number = mapNumberToRange(rand.Float64(), []*float64{&low, &high}, measurement.Type) - } else { - number = mapNumberToRange(rand.Float64(), nil, measurement.Type) - } - writeNumberAsBytes(number, measurement.Type, buff) - } - } - return buff.Bytes() -} - -func enumOptionCount(t string) int { - trimmed := strings.TrimSuffix(strings.TrimPrefix(t, "enum("), ")") - trimmed = strings.ReplaceAll(trimmed, " ", "") - if trimmed == "" { - return 0 - } - return len(strings.Split(trimmed, ",")) -} - -func mapNumberToRange(number float64, numberRange []*float64, numberType string) float64 { - if len(numberRange) == 0 { - return number * getTypeMaxValue(numberType) - } - return (number * (*numberRange[1] - *numberRange[0])) + *numberRange[0] -} - -func getTypeMaxValue(numberType string) float64 { - switch numberType { - case "uint8": - return math.MaxUint8 - case "uint16": - return math.MaxUint16 - case "uint32": - return math.MaxUint32 - case "uint64": - return math.MaxUint64 - case "int8": - return math.MaxInt8 - case "int16": - return math.MaxInt16 - case "int32": - return math.MaxInt32 - case "int64": - return math.MaxInt64 - case "float32": - return math.MaxFloat32 - case "float64": - return math.MaxFloat64 - case "bool": - return math.MaxUint8 - default: - return math.MaxUint8 - } -} - -func writeNumberAsBytes(number float64, numberType string, buff *bytes.Buffer) { - switch numberType { - case "uint8": - binary.Write(buff, binary.LittleEndian, uint8(number)) - case "uint16": - binary.Write(buff, binary.LittleEndian, uint16(number)) - case "uint32": - binary.Write(buff, binary.LittleEndian, uint32(number)) - case "uint64": - binary.Write(buff, binary.LittleEndian, uint64(number)) - case "int8": - binary.Write(buff, binary.LittleEndian, int8(number)) - case "int16": - binary.Write(buff, binary.LittleEndian, int16(number)) - case "int32": - binary.Write(buff, binary.LittleEndian, int32(number)) - case "int64": - binary.Write(buff, binary.LittleEndian, int64(number)) - case "float32": - binary.Write(buff, binary.LittleEndian, float32(number)) - case "float64": - binary.Write(buff, binary.LittleEndian, number) - case "bool": - binary.Write(buff, binary.LittleEndian, uint8(number)) - default: - binary.Write(buff, binary.LittleEndian, uint8(number)) - } -} diff --git a/packet-sender/pkg/sender/sender.go b/packet-sender/pkg/sender/sender.go deleted file mode 100644 index b06446f43..000000000 --- a/packet-sender/pkg/sender/sender.go +++ /dev/null @@ -1,26 +0,0 @@ -package sender - -import ( - boardpkg "packet_sender/pkg/board" -) - -func Start(conns []boardpkg.BoardConn, input string) { - - // Get the list of packets for each board - for i := range conns { - boardpkg.LoadDataPackets(&conns[i]) - } - - defer func() { - for _, c := range conns { - c.UDPConn.Close() - } - }() - - switch input { - case "1": - RandomSender(conns) - case "2": - CustomSender(conns) - } -} diff --git a/packet-sender/testadj.py b/packet-sender/testadj.py deleted file mode 100644 index 82802cd34..000000000 --- a/packet-sender/testadj.py +++ /dev/null @@ -1,121 +0,0 @@ -import os -import json - - -def validate_json_structure(data): - errors = [] - - if "board_id" in data: - if not isinstance(data["board_id"], int): - errors.append(f"'board_id' debe ser un entero, pero se encontró: {type(data['board_id']).__name__}.") - - if "board_ip" in data: - if not isinstance(data["board_ip"], str): - errors.append(f"'board_ip' debe ser una cadena, pero se encontró: {type(data['board_ip']).__name__}.") - - - if "measurements" in data: - if not isinstance(data["measurements"], list): - errors.append("La clave 'measurements' debe ser una lista.") - else: - for measurement in data["measurements"]: - if isinstance(measurement, dict): - required_keys = ["id", "name", "type", "podUnits", "displayUnits"] - for key in required_keys: - if key not in measurement: - errors.append(f"Falta la clave '{key}' en un objeto de 'measurements'.") - if "id" in measurement and not isinstance(measurement["id"], str): - errors.append(f"El 'id' debe ser una cadena en: {measurement}") - if "name" in measurement and not isinstance(measurement["name"], str): - errors.append(f"El 'name' debe ser una cadena en: {measurement}") - if "type" in measurement and not isinstance(measurement["type"], str): - errors.append(f"El 'type' debe ser una cadena en: {measurement}") - if "safeRange" in measurement and not isinstance(measurement.get("safeRange", []), list): - errors.append(f"'safeRange' debe ser una lista en: {measurement}") - if "warningRange" in measurement and not isinstance(measurement.get("warningRange", []), list): - errors.append(f"'warningRange' debe ser una lista en: {measurement}") - if "displayUnits" in measurement and not isinstance(measurement["displayUnits"], str): - errors.append(f"El 'podUnits' debe ser una cadena en: {measurement}") - if "podUnits" in measurement and not isinstance(measurement["podUnits"], str): - errors.append(f"El 'podUnits' debe ser una cadena en: {measurement}") #esto se puede quitar (json 516) - elif not isinstance(measurement, str): - errors.append("Cada elemento en 'measurements' debe ser un objeto o una cadena (nombre de archivo).") - - - if "packets" in data: - if not isinstance(data["packets"], list): - errors.append("La clave 'packets' debe ser una lista.") - else: - for packet in data["packets"]: - if isinstance(packet, dict): - required_keys = ["id", "name", "type","variable"] - for key in required_keys: - if key not in packet: - errors.append(f"Falta la clave '{key}' en un objeto de 'packets'.") - if "id" in packet and not isinstance(packet["id"], str): - errors.append(f"El 'id' debe ser una cadena en: {packet}") - if "name" in packet and not isinstance(packet["name"], str): - errors.append(f"El 'name' debe ser una cadena en: {packet}") - if "type" in packet and not isinstance(packet["type"], str): - errors.append(f"El 'type' debe ser una cadena en: {packet}") - if "variables" in packet: - if not isinstance(packet["variables"], list): - errors.append(f"'variables' debe ser una lista en: {packet}") - else: - for variable in packet["variables"]: - if not isinstance(variable, dict): - errors.append(f"Cada elemento en 'variables' debe ser un objeto en: {packet}") - if "name" not in variable: - errors.append(f"Falta la clave 'name' en un objeto de 'variables' en: {packet}") - elif not isinstance(packet, str): - errors.append("Cada elemento en 'packets' debe ser un objeto o una cadena (nombre de archivo).") - - return errors - - - -def validate_json_folder(folder_path): - boards_file_path = os.path.join(folder_path, "boards.json") - - try: - with open(boards_file_path, 'r') as boards_file: - boards_data = json.load(boards_file) - boards = boards_data.get("boards", {}) - - - board_keys = list(boards.keys()) - duplicate_keys = [key for key in board_keys if board_keys.count(key) > 1] - - if duplicate_keys: - print(f"Error: El archivo boards.json contiene claves duplicadas: {', '.join(duplicate_keys)}") - return - - except json.JSONDecodeError as e: - print(f"Error al decodificar JSON en {boards_file_path}: {e}") - return - except Exception as e: - print(f"Error al procesar el archivo {boards_file_path}: {e}") - return - - - for board_name, board_file_path in boards.items(): - full_path = os.path.join(folder_path, board_file_path) - try: - with open(full_path, 'r') as board_file: - data = json.load(board_file) - errors = validate_json_structure(data) - if errors: - print(f"Errores encontrados en {full_path} para la placa '{board_name}':") - for error in errors: - print(f"- {error}") - - except json.JSONDecodeError as e: - print(f"Error al decodificar JSON en {full_path}: {e}") - except Exception as e: - print(f"Error al procesar el archivo {full_path}: {e}") - - -if os.path.exists('./adj/') == False: - print("La carpeta ./adj/ no existe") -if __name__ == "__main__": - validate_json_folder("./adj/") diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f0086a994..13a710ed7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,5 +6,4 @@ packages: - "backend" - "electron-app" - - "packet-sender" - "e2e"