This commit is contained in:
2026-01-09 23:55:14 +01:00
16 changed files with 1514 additions and 0 deletions

View File

@@ -1,4 +1,5 @@
<script>
<<<<<<< HEAD
import { api } from '../lib/api.js';
export let status;
@@ -233,11 +234,160 @@
.metrics {
padding: 16px;
=======
export let status;
$: powerForward = status?.power_forward || 0;
$: powerReflected = status?.power_reflected || 0;
$: swr = status?.swr || 1.0;
$: voltage = status?.voltage || 0;
$: vdd = status?.vdd || 0;
$: current = status?.current || 0;
$: peakCurrent = status?.peak_current || 0;
$: temperature = status?.temperature || 0;
$: harmonicLoadTemp = status?.harmonic_load_temp || 0;
$: fanMode = status?.fan_mode || 'CONTEST';
$: state = status?.state || 'IDLE';
$: bandA = status?.band_a || '0';
$: bandB = status?.band_b || '0';
$: connected = status?.connected || false;
$: displayState = state.replace('TRANSMIT_A', 'TRANSMIT').replace('TRANSMIT_B', 'TRANSMIT');
$: meffa = status?.meffa || 'STANDBY';
async function setFanMode(mode) {
try {
await api.power.setFanMode(mode);
} catch (err) {
console.error('Failed to set fan mode:', err);
alert('Failed to set fan mode');
}
}
</script>
<div class="powergenius-card card">
<h2>
PGXL
<span class="status-indicator" class:status-online={connected} class:status-offline={!connected}></span>
</h2>
<div class="status-row">
<div class="status-label" class:normal={state === 'IDLE'} class:warning={state.includes('TRANSMIT')}>
{displayState}
</div>
</div>
<div class="metrics">
<div class="metric">
<div class="label">FWD PWR (W)</div>
<div class="value">{powerForward.toFixed(1)}</div>
<div class="bar">
<div class="bar-fill" style="width: {Math.min(100, (powerForward / 1500) * 100)}%"></div>
</div>
<div class="scale">
<span>0</span>
<span>1000</span>
<span>2000</span>
</div>
</div>
<div class="metric">
<div class="label">PG XL SWR 1:1.00 use</div>
<div class="value">{swr.toFixed(2)}</div>
</div>
<div class="metric">
<div class="label">Temp / HL Temp</div>
<div class="value">{temperature.toFixed(0)}°C / {harmonicLoadTemp.toFixed(1)}°C</div>
<div class="bar">
<div class="bar-fill" style="width: {(temperature / 80) * 100}%"></div>
</div>
<div class="scale">
<span>25</span>
<span>55</span>
<span>80</span>
</div>
</div>
<div class="metric-row">
<div class="metric small">
<div class="label">VAC</div>
<div class="value">{voltage.toFixed(0)}</div>
</div>
<div class="metric small">
<div class="label">VDD</div>
<div class="value">{vdd.toFixed(1)}</div>
</div>
<div class="metric small">
<div class="label">ID peak</div>
<div class="value">{peakCurrent.toFixed(1)}</div>
</div>
</div>
<div class="fan-speed">
<div class="label">Fan Speed</div>
<select value={fanMode} on:change={(e) => setFanMode(e.target.value)}>
<option value="STANDARD">STANDARD</option>
<option value="CONTEST">CONTEST</option>
<option value="BROADCAST">BROADCAST</option>
</select>
</div>
<div class="band-info">
<div class="label">Band A</div>
<div class="value">{bandA}</div>
</div>
<div class="band-info">
<div class="label">Band B</div>
<div class="value">{bandB}</div>
</div>
</div>
</div>
<style>
.powergenius-card {
min-width: 350px;
}
h2 {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 12px;
font-size: 18px;
font-weight: 500;
color: var(--accent-teal);
}
.status-label {
display: inline-block;
padding: 8px 16px;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
margin-bottom: 16px;
}
.status-label.normal {
background: var(--accent-green);
color: white;
}
.status-label.warning {
background: var(--accent-red);
color: white;
}
.metrics {
>>>>>>> 4ab192418e21065c68d59777493ea03b76c061e7
display: flex;
flex-direction: column;
gap: 16px;
}
<<<<<<< HEAD
/* Power Display */
.power-display {
display: flex;
@@ -439,10 +589,65 @@
}
.band-item {
=======
.metric {
display: flex;
flex-direction: column;
gap: 4px;
}
.metric-row {
display: flex;
gap: 16px;
}
.metric.small {
flex: 1;
}
.value {
font-size: 20px;
font-weight: 300;
color: var(--accent-teal);
}
.bar {
width: 100%;
height: 8px;
background: #555;
border-radius: 4px;
overflow: hidden;
}
.bar-fill {
height: 100%;
background: linear-gradient(90deg, var(--accent-green), var(--accent-red));
transition: width 0.3s ease;
}
.scale {
display: flex;
justify-content: space-between;
font-size: 10px;
color: var(--text-secondary);
}
.fan-speed select {
width: 100%;
padding: 8px;
background: var(--bg-secondary);
color: var(--text-primary);
border: 1px solid var(--border-color);
border-radius: 4px;
}
.band-info {
>>>>>>> 4ab192418e21065c68d59777493ea03b76c061e7
display: flex;
justify-content: space-between;
align-items: center;
}
<<<<<<< HEAD
.band-label {
font-size: 11px;
@@ -489,4 +694,6 @@
border-color: var(--accent-cyan);
box-shadow: 0 0 0 2px rgba(79, 195, 247, 0.2);
}
=======
>>>>>>> 4ab192418e21065c68d59777493ea03b76c061e7
</style>