Compare commits

..

No commits in common. "ec676f678affd49f5fbdbc87de734dfdffedffc8" and "0db12a1ddc6dd1ff6e9c17cd30fc99a5629537b9" have entirely different histories.

8 changed files with 74 additions and 125 deletions

View file

@ -53,7 +53,6 @@
<!-- Summary stats --> <!-- Summary stats -->
<div class="stats-summary"> <div class="stats-summary">
<span id="aircraft-count">0 aircraft</span> <span id="aircraft-count">0 aircraft</span>
<span id="position-summary">0 positioned</span>
<span id="sources-count">0 sources</span> <span id="sources-count">0 sources</span>
<span id="active-clients">1 viewer</span> <span id="active-clients">1 viewer</span>
<span id="connection-status" class="connection-status disconnected">Connecting...</span> <span id="connection-status" class="connection-status disconnected">Connecting...</span>
@ -209,14 +208,6 @@
<h3>Max Range</h3> <h3>Max Range</h3>
<div class="stat-value" id="max-range">0 km</div> <div class="stat-value" id="max-range">0 km</div>
</div> </div>
<div class="stat-card">
<h3>Aircraft with Position</h3>
<div class="stat-value" id="aircraft-with-position">0</div>
</div>
<div class="stat-card">
<h3>Aircraft without Position</h3>
<div class="stat-value" id="aircraft-without-position">0</div>
</div>
</div> </div>
<!-- Charts --> <!-- Charts -->

View file

@ -244,8 +244,6 @@ export class UIManager {
const activeViewersEl = document.getElementById('active-viewers'); const activeViewersEl = document.getElementById('active-viewers');
const maxRangeEl = document.getElementById('max-range'); const maxRangeEl = document.getElementById('max-range');
const messagesSecEl = document.getElementById('messages-sec'); const messagesSecEl = document.getElementById('messages-sec');
const aircraftWithPositionEl = document.getElementById('aircraft-with-position');
const aircraftWithoutPositionEl = document.getElementById('aircraft-without-position');
if (totalAircraftEl) totalAircraftEl.textContent = this.aircraftData.size; if (totalAircraftEl) totalAircraftEl.textContent = this.aircraftData.size;
if (activeSourcesEl) { if (activeSourcesEl) {
@ -255,14 +253,6 @@ export class UIManager {
activeViewersEl.textContent = this.stats.active_clients || 1; activeViewersEl.textContent = this.stats.active_clients || 1;
} }
// Update position tracking statistics from backend
if (aircraftWithPositionEl) {
aircraftWithPositionEl.textContent = this.stats.aircraft_with_position || 0;
}
if (aircraftWithoutPositionEl) {
aircraftWithoutPositionEl.textContent = this.stats.aircraft_without_position || 0;
}
// Calculate max range // Calculate max range
let maxDistance = 0; let maxDistance = 0;
for (const aircraft of this.aircraftData.values()) { for (const aircraft of this.aircraftData.values()) {
@ -280,18 +270,10 @@ export class UIManager {
updateHeaderInfo() { updateHeaderInfo() {
const aircraftCountEl = document.getElementById('aircraft-count'); const aircraftCountEl = document.getElementById('aircraft-count');
const positionSummaryEl = document.getElementById('position-summary');
const sourcesCountEl = document.getElementById('sources-count'); const sourcesCountEl = document.getElementById('sources-count');
const activeClientsEl = document.getElementById('active-clients'); const activeClientsEl = document.getElementById('active-clients');
if (aircraftCountEl) aircraftCountEl.textContent = `${this.aircraftData.size} aircraft`; if (aircraftCountEl) aircraftCountEl.textContent = `${this.aircraftData.size} aircraft`;
// Update position summary in header
if (positionSummaryEl) {
const positioned = this.stats.aircraft_with_position || 0;
positionSummaryEl.textContent = `${positioned} positioned`;
}
if (sourcesCountEl) sourcesCountEl.textContent = `${this.sourcesData.size} sources`; if (sourcesCountEl) sourcesCountEl.textContent = `${this.sourcesData.size} sources`;
// Update active clients count // Update active clients count

11
debian/DEBIAN/prerm vendored
View file

@ -2,8 +2,8 @@
set -e set -e
case "$1" in case "$1" in
remove|deconfigure) remove|upgrade|deconfigure)
# Stop and disable the service on removal # Stop and disable the service
if systemctl is-active --quiet skyview-adsb.service; then if systemctl is-active --quiet skyview-adsb.service; then
systemctl stop skyview-adsb.service systemctl stop skyview-adsb.service
fi fi
@ -12,13 +12,6 @@ case "$1" in
systemctl disable skyview-adsb.service systemctl disable skyview-adsb.service
fi fi
;; ;;
upgrade)
# Only stop service during upgrade, preserve enabled state
if systemctl is-active --quiet skyview-adsb.service; then
systemctl stop skyview-adsb.service
fi
# Don't disable - postinst will restart if service was enabled
;;
esac esac
exit 0 exit 0

View file

@ -795,13 +795,10 @@ func (m *Merger) GetSources() []*Source {
// //
// The statistics include: // The statistics include:
// - total_aircraft: Current number of tracked aircraft // - total_aircraft: Current number of tracked aircraft
// - aircraft_with_position: Number of aircraft with valid position data
// - aircraft_without_position: Number of aircraft without position data
// - total_messages: Sum of all messages processed // - total_messages: Sum of all messages processed
// - active_sources: Number of currently connected sources // - active_sources: Number of currently connected sources
// - aircraft_by_sources: Distribution of aircraft by number of tracking sources // - aircraft_by_sources: Distribution of aircraft by number of tracking sources
// //
// The position statistics help assess data quality and tracking effectiveness.
// The aircraft_by_sources map shows data quality - aircraft tracked by // The aircraft_by_sources map shows data quality - aircraft tracked by
// multiple sources generally have better position accuracy and reliability. // multiple sources generally have better position accuracy and reliability.
// //
@ -813,22 +810,11 @@ func (m *Merger) GetStatistics() map[string]interface{} {
totalMessages := int64(0) totalMessages := int64(0)
activeSources := 0 activeSources := 0
aircraftBySources := make(map[int]int) // Count by number of sources aircraftBySources := make(map[int]int) // Count by number of sources
aircraftWithPosition := 0
aircraftWithoutPosition := 0
for _, state := range m.aircraft { for _, state := range m.aircraft {
totalMessages += state.TotalMessages totalMessages += state.TotalMessages
numSources := len(state.Sources) numSources := len(state.Sources)
aircraftBySources[numSources]++ aircraftBySources[numSources]++
// Check if aircraft has valid position data
if state.Aircraft.PositionValid &&
state.Aircraft.Latitude != 0.0 &&
state.Aircraft.Longitude != 0.0 {
aircraftWithPosition++
} else {
aircraftWithoutPosition++
}
} }
for _, src := range m.sources { for _, src := range m.sources {
@ -839,8 +825,6 @@ func (m *Merger) GetStatistics() map[string]interface{} {
return map[string]interface{}{ return map[string]interface{}{
"total_aircraft": len(m.aircraft), "total_aircraft": len(m.aircraft),
"aircraft_with_position": aircraftWithPosition,
"aircraft_without_position": aircraftWithoutPosition,
"total_messages": totalMessages, "total_messages": totalMessages,
"active_sources": activeSources, "active_sources": activeSources,
"aircraft_by_sources": aircraftBySources, "aircraft_by_sources": aircraftBySources,

View file

@ -614,7 +614,6 @@ func (d *Decoder) decodeCPRPosition(aircraft *Aircraft) {
} }
aircraft.Longitude = lon aircraft.Longitude = lon
aircraft.PositionValid = true
// CPR decoding completed successfully // CPR decoding completed successfully
} }