Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
bb86970
wip: incitial commit
JavierRibaldelRio Jun 21, 2026
89d7e9f
fix(logging-view): restore slices from competition view
JavierRibaldelRio Jul 5, 2026
8035219
feat(frontend-kit): add segmented control
JavierRibaldelRio Jul 5, 2026
3350db7
feat(logging-view): implment simple and nomal mode change
JavierRibaldelRio Jul 5, 2026
16d2523
docs(logging-view): comment app Slice
JavierRibaldelRio Jul 5, 2026
d574102
feat(logging-view): include previous conecpts
JavierRibaldelRio Jul 5, 2026
34431c9
feat(frontend-kit): add variableBadgeClasses (ints → orange, bool → p…
JavierRibaldelRio Jul 5, 2026
33ff81d
feat(logging-view): include adj
JavierRibaldelRio Jul 5, 2026
1b0b176
feat(logging-view): sidebar (first aproach)
JavierRibaldelRio Jul 5, 2026
e9e6bc5
feat(logging-view): enhance session area to select folder
JavierRibaldelRio Jul 6, 2026
0193995
feat(logging-view): enhance sidebar
JavierRibaldelRio Jul 6, 2026
192bc7a
feat(logging-view): enhance sidebar
JavierRibaldelRio Jul 6, 2026
b30ce36
feat(logging-view): create adj-viewer in a modal
JavierRibaldelRio Jul 6, 2026
187f734
wip(logging-view): create simple mode
JavierRibaldelRio Jul 7, 2026
512fafd
fix(logging-view): simple mode modify select menu to select by boards
JavierRibaldelRio Jul 7, 2026
89577cc
feat(logging-view): sidebar vscode style
JavierRibaldelRio Jul 7, 2026
804a6a8
wip(logging-view):
JavierRibaldelRio Jul 7, 2026
4336d63
wip
JavierRibaldelRio Jul 10, 2026
ec673be
feat(logging-view): enhance names
JavierRibaldelRio Aug 1, 2026
4189701
fix(logging-view): remove title
JavierRibaldelRio Aug 1, 2026
8ff7820
feat(logging-view, simple): order, close and hide charts
JavierRibaldelRio Aug 1, 2026
e32d07e
fix(logging-view): sidebar bigger handler
JavierRibaldelRio Aug 1, 2026
586339c
fix(logging-view): sidebar separator was moved to the right
JavierRibaldelRio Aug 1, 2026
1ff97ad
fix(logging-view): add measurement neame to measurements
JavierRibaldelRio Aug 1, 2026
20478c5
Merge branch 'develop' into control-station/logging-view
JavierRibaldelRio Aug 1, 2026
ff99605
fix(logging-view, simple): enhance performance
JavierRibaldelRio Aug 1, 2026
212901b
fix(logging-view): FFT only to the plot not to each series
JavierRibaldelRio Aug 1, 2026
3db4c7b
fix(logging-view, simple): enhance performance on LCU colossal mesure…
JavierRibaldelRio Aug 1, 2026
68e9f7b
docs(logging-view): sign code
JavierRibaldelRio Aug 1, 2026
f07bd2d
feat(logging-view): series var, start interaction with simple mode
JavierRibaldelRio Aug 1, 2026
738dfe1
feat(logging-view, simple): dark-mode theming for Plotly charts
JavierRibaldelRio Aug 1, 2026
3f39e08
Merge pull request #596 from Hyperloop-UPV/plotly-dark-mode-integration
JavierRibaldelRio Aug 1, 2026
03b3aba
feat(logging-view): drag & drop
JavierRibaldelRio Aug 1, 2026
2402ac8
fix(logging-view, sidebar): close session Slice when seleccting a series
JavierRibaldelRio Aug 1, 2026
f4681b2
fix(logging-view): scroll not working in simple mode, transformations…
JavierRibaldelRio Aug 1, 2026
5514702
feat(logging-view): context menu
JavierRibaldelRio Aug 1, 2026
43936b3
fix(logging-view, sidebar): enhance ui overflow
JavierRibaldelRio Aug 1, 2026
56a0270
feat(frontent-kit): add team logos
JavierRibaldelRio Aug 2, 2026
67c15cd
fix(frontend, frontent-kit): use isotipo from frontent-kit instead of…
JavierRibaldelRio Aug 2, 2026
8bf12da
fix(flashing-view): use port 9002 at dev instead of 9001 (used by com…
JavierRibaldelRio Aug 2, 2026
0bf78c9
fix(logging-view, simple): just keep main title at plotly
JavierRibaldelRio Aug 2, 2026
7079e0e
feat(logging-view): export to png
JavierRibaldelRio Aug 2, 2026
7eab99d
feat(logging-view; simple): redesign stats section
JavierRibaldelRio Aug 2, 2026
40b6324
fix(logging-view, simple): export to png change file name
JavierRibaldelRio Aug 2, 2026
058ad2b
feat(logging-view, simple): implement cronogram for enums and bools
JavierRibaldelRio Aug 2, 2026
8bb6148
feat(logging-view): optimize performance
JavierRibaldelRio Aug 2, 2026
e322dda
feat(logging-view, simple): export to PDF
JavierRibaldelRio Aug 2, 2026
63642e6
feat(logging-view, simple): PDF put link to ADJ and fomat date
JavierRibaldelRio Aug 2, 2026
783b7af
fix(logging-view, simple): pdf change export file name
JavierRibaldelRio Aug 2, 2026
389e1da
fix(logging-view, simple): add spinner to export PDF
JavierRibaldelRio Aug 2, 2026
3beacb5
fix(logging-view, simple): left mode
JavierRibaldelRio Aug 2, 2026
6f517ca
fix(logging-view): enhance PDF format
JavierRibaldelRio Aug 2, 2026
bb7a98a
fix(logging-view): title to pdf
JavierRibaldelRio Aug 2, 2026
7462537
fix(logging-view): enhance performance
JavierRibaldelRio Aug 2, 2026
b5d0261
fix(logging-view): only right graph
JavierRibaldelRio Aug 2, 2026
3f23002
fix(logging-view, normal): explain that normal mode is not working ye…
JavierRibaldelRio Aug 2, 2026
4e3884c
feat(electron-app): include logging view
JavierRibaldelRio Aug 2, 2026
7d10ce0
feat(electron-app): aobut section
JavierRibaldelRio Aug 2, 2026
5e448c2
chore: correct action
JavierRibaldelRio Aug 2, 2026
e91a382
feat: ADJ-viewer
JavierRibaldelRio Aug 2, 2026
6a055dc
fix(logging-view): capitalize title
JavierRibaldelRio Aug 2, 2026
e26e917
feat(ADJ-Viewer): select branch
JavierRibaldelRio Aug 2, 2026
c55b50a
feat(ADJ-view): enhance main page
JavierRibaldelRio Aug 2, 2026
d910447
feat(adj-viewer): network menu
JavierRibaldelRio Aug 2, 2026
f81dbc1
Merge pull request #598 from Hyperloop-UPV/control-station/adj-viewer
JavierRibaldelRio Aug 2, 2026
08fd42a
chore: disable go test
JavierRibaldelRio Aug 2, 2026
67caf78
feat(logging-view): messages
JavierRibaldelRio Aug 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/frontend-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
cache: "pnpm"

- name: Install dependencies
run: pnpm install --frozen-lockfile --filter=testing-view --filter=flashing-view --filter=competition-view --filter=ui --filter=core
run: pnpm install --frozen-lockfile --filter=testing-view --filter=flashing-view --filter=competition-view --filter=logging-view --filter=adj-view --filter=ui --filter=core

- name: Build frontend
run: pnpm build --filter="./frontend/**"
Expand Down
9 changes: 1 addition & 8 deletions .github/workflows/go_test.yaml
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
name: Go tests

on:
pull_request:
branches:
- main
- develop
push:
branches:
- main
- develop
workflow_dispatch:

jobs:
test:
Expand Down
46 changes: 46 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ on:
description: "Include Flashing View"
type: boolean
default: true
include-logging:
description: "Include Logging View"
type: boolean
default: true
include-adj:
description: "Include ADJ Viewer"
type: boolean
default: true


jobs:
Expand All @@ -34,6 +42,8 @@ jobs:
include_testing: ${{ steps.get_version.outputs.include_testing }}
include_competition: ${{ steps.get_version.outputs.include_competition }}
include_flashing: ${{ steps.get_version.outputs.include_flashing }}
include_logging: ${{ steps.get_version.outputs.include_logging }}
include_adj: ${{ steps.get_version.outputs.include_adj }}
steps:
- name: Determine version
id: get_version
Expand All @@ -43,6 +53,8 @@ jobs:
echo "include_testing=${{ github.event.inputs.include-testing }}" >> $GITHUB_OUTPUT
echo "include_competition=${{ github.event.inputs.include-competition }}" >> $GITHUB_OUTPUT
echo "include_flashing=${{ github.event.inputs.include-flashing }}" >> $GITHUB_OUTPUT
echo "include_logging=${{ github.event.inputs.include-logging }}" >> $GITHUB_OUTPUT
echo "include_adj=${{ github.event.inputs.include-adj }}" >> $GITHUB_OUTPUT

create-draft-release:
name: Create Draft Release
Expand Down Expand Up @@ -95,6 +107,12 @@ jobs:
if [ "${{ needs.determine-version.outputs.include_flashing }}" = "true" ]; then
FILTERS="$FILTERS --filter=flashing-view"
fi
if [ "${{ needs.determine-version.outputs.include_logging }}" = "true" ]; then
FILTERS="$FILTERS --filter=logging-view"
fi
if [ "${{ needs.determine-version.outputs.include_adj }}" = "true" ]; then
FILTERS="$FILTERS --filter=adj-view"
fi
pnpm turbo build $FILTERS

- uses: actions/upload-artifact@v4
Expand All @@ -118,6 +136,20 @@ jobs:
path: frontend/flashing-view/dist/**
retention-days: 1

- uses: actions/upload-artifact@v4
if: needs.determine-version.outputs.include_logging == 'true'
with:
name: logging-dist
path: frontend/logging-view/dist/**
retention-days: 1

- uses: actions/upload-artifact@v4
if: needs.determine-version.outputs.include_adj == 'true'
with:
name: adj-dist
path: frontend/adj-view/dist/**
retention-days: 1

build-backend:
name: Build Backend - ${{ matrix.os }}
needs: determine-version
Expand Down Expand Up @@ -300,6 +332,20 @@ jobs:
name: flashing-dist
path: electron-app/renderer/flashing-view

- name: Download logging-view dist
if: needs.determine-version.outputs.include_logging == 'true'
uses: actions/download-artifact@v4
with:
name: logging-dist
path: electron-app/renderer/logging-view

- name: Download adj-view dist
if: needs.determine-version.outputs.include_adj == 'true'
uses: actions/download-artifact@v4
with:
name: adj-dist
path: electron-app/renderer/adj-view

- uses: pnpm/action-setup@v4
with:
version: 10.26.0
Expand Down
2 changes: 2 additions & 0 deletions electron-app/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ renderer
renderer/testing-view/
renderer/flashing-view/
renderer/competition-view/
renderer/logging-view/
renderer/adj-view/
# include mode-selector in the build output
!renderer/mode-selector/
!renderer/mode-selector/**
Expand Down
18 changes: 18 additions & 0 deletions electron-app/build.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,24 @@ const CONFIG = {
"pnpm run build",
],
},
"logging-view": {
type: "frontend",
path: join(ROOT, "frontend/logging-view"),
dest: join(__dirname, "renderer/logging-view"),
commands: [
"pnpm --filter logging-view install --frozen-lockfile",
"pnpm run build",
],
},
"adj-view": {
type: "frontend",
path: join(ROOT, "frontend/adj-view"),
dest: join(__dirname, "renderer/adj-view"),
commands: [
"pnpm --filter adj-view install --frozen-lockfile",
"pnpm run build",
],
},
};

// --- Helpers ---
Expand Down
2 changes: 2 additions & 0 deletions electron-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
"build:testing": "node build.mjs --testing-view",
"build:competition": "node build.mjs --competition-view",
"build:flashing": "node build.mjs --flashing-view",
"build:logging": "node build.mjs --logging-view",
"build:adj": "node build.mjs --adj-view",
"asar:win": "asar list dist/win-unpacked/resources/app.asar | findstr /V node_modules",
"asar:mac": "asar list dist/mac-unpacked/resources/app.asar | findstr /V node_modules",
"asar:linux": "asar list dist/linux-unpacked/resources/app.asar | findstr /V node_modules"
Expand Down
5 changes: 3 additions & 2 deletions electron-app/preload.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ const { contextBridge, ipcRenderer } = require("electron");
contextBridge.exposeInMainWorld("electronAPI", {
// Get the currently loaded view name
getCurrentView: () => ipcRenderer.invoke("get-current-view"),
// Switch to a different view by name
switchView: (view) => ipcRenderer.invoke("switch-view", view),
// Switch to a different view by name, optionally passing query params
// through to the loaded view's URL (e.g. an ADJ commit hash)
switchView: (view, query) => ipcRenderer.invoke("switch-view", view, query),
// Save configuration object to file
saveConfig: (config) => ipcRenderer.invoke("save-config", config),
// Get current configuration object
Expand Down
79 changes: 79 additions & 0 deletions electron-app/renderer/about/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<!doctype html>
<html>

<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>About Logging View</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap');

html,
body {
height: 100%;
margin: 0;
}

body {
font-family: 'Roboto', sans-serif;
display: flex;
align-items: center;
justify-content: center;
background: #111;
color: #edeef0;
user-select: none;
}

.card {
display: flex;
flex-direction: column;
align-items: center;
gap: 16px;
padding: 32px 24px;
text-align: center;
}

.team-logo {
width: clamp(160px, 60vw, 220px);
height: auto;
filter: brightness(0) invert(1);
}

.sw-logo {
width: clamp(64px, 24vw, 84px);
height: auto;
opacity: 0.9;
}

h1 {
margin: 4px 0 0;
font-size: 1.05rem;
font-weight: 700;
}

.author {
margin: 8px 0 0;
font-size: 0.85rem;
font-weight: 500;
opacity: 0.85;
}

.copy {
margin: 0;
font-size: 0.72rem;
opacity: 0.55;
}
</style>
</head>

<body>
<div class="card">
<img src="../mode-selector/src/logo.svg" alt="Hyperloop UPV" class="team-logo" />
<img src="../mode-selector/src/Subsystem.png" alt="Hyperloop UPV Software" class="sw-logo" />
<h1>Hyperloop Control Station — Logging View</h1>
<p class="author">Javier Ribal del Río — H11</p>
<p class="copy">© HyperloopUPV - Software</p>
</div>
</body>

</html>
2 changes: 2 additions & 0 deletions electron-app/renderer/mode-selector/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,8 @@ <h1>Control Station</h1>
{ mode: 'testing', label: 'Testing View' },
{ mode: 'competition', label: 'Competition View' },
{ mode: 'flashing', label: 'Flashing View' },
{ mode: 'logging', label: 'Logging View' },
{ mode: 'adj', label: 'ADJ Viewer' },
];

async function renderButtons() {
Expand Down
2 changes: 2 additions & 0 deletions electron-app/src/app/modeSelector.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ const VALID_MODES = {
testing: "testing-view",
flashing: "flashing-view",
competition: "competition-view",
logging: "logging-view",
adj: "adj-view",
default: "testing-view",
};

Expand Down
8 changes: 6 additions & 2 deletions electron-app/src/ipc/handlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ function setupIpcHandlers() {
{ mode: "testing", label: "Testing View" },
{ mode: "competition", label: "Competition View" },
{ mode: "flashing", label: "Flashing View" },
{ mode: "logging", label: "Logging View" },
{ mode: "adj", label: "ADJ Viewer" },
];
const rendererDir = join(getAppPath(), "renderer");
return ALL_VIEWS.filter(({ mode }) =>
Expand All @@ -116,10 +118,12 @@ function setupIpcHandlers() {
* @description Switches the main window to the specified view.
* @param {import("electron").IpcMainInvokeEvent} event - The IPC event object.
* @param {string} view - The name of the view to switch to (e.g., "ethernet-view", "control-station").
* @param {Record<string, string>} [query] - Optional query params passed through to the
* loaded view's URL (e.g. `{ commit: hash }` so adj-view can auto-load a commit).
* @returns {string} The view name that was loaded.
*/
ipcMain.handle("switch-view", (event, view) => {
loadView(view);
ipcMain.handle("switch-view", (event, view, query) => {
loadView(view, query ? { query } : undefined);
return view;
});

Expand Down
14 changes: 7 additions & 7 deletions electron-app/src/menu/menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
* Defines menu structure with File, Tools, and Help sections with keyboard shortcuts and actions.
*/

import { BrowserWindow, Menu, app, dialog } from "electron";
import { BrowserWindow, Menu, app } from "electron";
import { showAboutWindow } from "../windows/aboutWindow.js";
import { getCurrentView } from "../windows/mainWindow.js";

/**
* Creates the application menu with File, Tools, and Help sections.
Expand Down Expand Up @@ -75,13 +77,11 @@ function createMenu() {
submenu: [
{
label: "About",
// Only meaningful in logging-view — the About window credits its
// author specifically, not the Control Station as a whole.
click: () => {
dialog.showMessageBox(BrowserWindow.getFocusedWindow() ?? undefined, {
type: "info",
title: "About",
message: "Hyperloop UPV Control Station",
detail: `Version ${app.getVersion()}\n\nControl and monitoring software for Hyperloop pod.`,
});
if (getCurrentView() !== "logging-view") return;
showAboutWindow(BrowserWindow.getFocusedWindow());
},
},
],
Expand Down
56 changes: 56 additions & 0 deletions electron-app/src/windows/aboutWindow.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/**
* @module windows/aboutWindow
* @description Small "About" window — team logo, SW logo, and author credit.
* Reachable via the main window's right-click context menu and the
* Help > About application menu item.
*/

import { BrowserWindow } from "electron";
import path from "path";
import { getAppPath } from "../utils/paths.js";
import { logger } from "../utils/logger.js";

let aboutWindow = null;

/**
* Shows the About window, creating it if needed. Reuses a single instance —
* focuses it instead of stacking duplicates if already open.
* @param {BrowserWindow | null} [parentWindow] - Window to center/modal against.
* @returns {void}
*/
function showAboutWindow(parentWindow) {
if (aboutWindow && !aboutWindow.isDestroyed()) {
aboutWindow.focus();
return;
}

aboutWindow = new BrowserWindow({
width: 380,
height: 440,
resizable: false,
minimizable: false,
maximizable: false,
modal: !!parentWindow,
parent: parentWindow ?? undefined,
title: "About Logging View",
backgroundColor: "#111111",
webPreferences: {
preload: path.join(getAppPath(), "preload.js"),
contextIsolation: true,
nodeIntegration: false,
},
});

aboutWindow.setMenuBarVisibility(false);

const aboutPath = path.join(getAppPath(), "renderer", "about", "index.html");
aboutWindow.loadFile(aboutPath).catch((err) => {
logger.electron.error("Failed to load About window:", err);
});

aboutWindow.on("closed", () => {
aboutWindow = null;
});
}

export { showAboutWindow };
1 change: 1 addition & 0 deletions electron-app/src/windows/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* @description Window creation and management exports.
*/

export { showAboutWindow } from "./aboutWindow.js";
export { createLogWindow } from "./logWindow.js";
export { createWindow } from "./mainWindow.js";

Loading
Loading