diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js
index 34b7082..61a6f1c 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js
+++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js
@@ -38,8 +38,8 @@ function renderFt8Message(message) {
while (j < message.length && isAlphaNum(message[j])) j++;
const token = message.slice(i, j);
const grid = token.toUpperCase();
- if (/^[A-R]{2}\\d{2}(?:[A-X]{2})?$/.test(grid)) {
- out += `[${grid}]`;
+ if (/^[A-R]{2}\d{2}(?:[A-X]{2})?$/.test(grid)) {
+ out += `${grid}`;
} else {
out += escapeHtml(token);
}
@@ -60,7 +60,7 @@ function extractFirstGrid(message) {
while (j < message.length && isAlphaNum(message[j])) j++;
const token = message.slice(i, j);
const grid = token.toUpperCase();
- if (/^[A-R]{2}\\d{2}(?:[A-X]{2})?$/.test(grid)) return grid;
+ if (/^[A-R]{2}\d{2}(?:[A-X]{2})?$/.test(grid)) return grid;
i = j;
} else {
i += 1;
diff --git a/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs b/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs
index 039512d..5bc4239 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs
+++ b/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs
@@ -110,6 +110,11 @@ pub async fn decode_events() -> Result {
.into_iter()
.map(trx_core::decode::DecodedMessage::Aprs),
);
+ out.extend(
+ crate::server::audio::snapshot_cw_history()
+ .into_iter()
+ .map(trx_core::decode::DecodedMessage::Cw),
+ );
out.extend(
crate::server::audio::snapshot_ft8_history()
.into_iter()
@@ -355,6 +360,7 @@ pub async fn toggle_ft8_decode(
pub async fn clear_ft8_decode(
rig_tx: web::Data>,
) -> Result {
+ crate::server::audio::clear_ft8_history();
send_command(&rig_tx, RigCommand::ResetFt8Decoder).await
}
@@ -362,6 +368,7 @@ pub async fn clear_ft8_decode(
pub async fn clear_aprs_decode(
rig_tx: web::Data>,
) -> Result {
+ crate::server::audio::clear_aprs_history();
send_command(&rig_tx, RigCommand::ResetAprsDecoder).await
}
@@ -369,6 +376,7 @@ pub async fn clear_aprs_decode(
pub async fn clear_cw_decode(
rig_tx: web::Data>,
) -> Result {
+ crate::server::audio::clear_cw_history();
send_command(&rig_tx, RigCommand::ResetCwDecoder).await
}
diff --git a/src/trx-client/trx-frontend/trx-frontend-http/src/audio.rs b/src/trx-client/trx-frontend/trx-frontend-http/src/audio.rs
index a65b3c7..e2ba45a 100644
--- a/src/trx-client/trx-frontend/trx-frontend-http/src/audio.rs
+++ b/src/trx-client/trx-frontend/trx-frontend-http/src/audio.rs
@@ -9,7 +9,9 @@
//! - Subsequent binary messages: raw Opus packets (RX)
//! - Browser sends binary messages: raw Opus packets (TX)
+use std::collections::VecDeque;
use std::sync::{Mutex, OnceLock};
+use std::time::{Duration, Instant};
use actix_web::{get, web, Error, HttpRequest, HttpResponse};
use actix_ws::Message;
@@ -18,7 +20,7 @@ use tokio::sync::{broadcast, mpsc, watch};
use tracing::warn;
use trx_core::audio::AudioStreamInfo;
-use trx_core::decode::DecodedMessage;
+use trx_core::decode::{AprsPacket, CwEvent, DecodedMessage, Ft8Message};
struct AudioChannels {
rx: broadcast::Sender,
@@ -49,12 +51,108 @@ fn decode_channel() -> &'static Mutex