incremental improvements

This commit is contained in:
2026-02-02 01:37:47 -08:00
parent 7717aa9177
commit 430c1acdef
6 changed files with 91 additions and 18 deletions

68
Cargo.lock generated
View File

@@ -396,6 +396,15 @@ dependencies = [
"num_cpus", "num_cpus",
] ]
[[package]]
name = "deranged"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
dependencies = [
"powerfmt",
]
[[package]] [[package]]
name = "displaydoc" name = "displaydoc"
version = "0.2.5" version = "0.2.5"
@@ -1099,6 +1108,15 @@ dependencies = [
"regex-automata 0.1.10", "regex-automata 0.1.10",
] ]
[[package]]
name = "matchers"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
dependencies = [
"regex-automata 0.4.13",
]
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.6" version = "2.7.6"
@@ -1201,6 +1219,12 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "num-conv"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.19" version = "0.2.19"
@@ -1404,6 +1428,12 @@ dependencies = [
"zerovec", "zerovec",
] ]
[[package]]
name = "powerfmt"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
version = "0.2.21" version = "0.2.21"
@@ -1958,6 +1988,37 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "time"
version = "0.3.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d"
dependencies = [
"deranged",
"itoa",
"num-conv",
"powerfmt",
"serde",
"time-core",
"time-macros",
]
[[package]]
name = "time-core"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b"
[[package]]
name = "time-macros"
version = "0.2.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3"
dependencies = [
"num-conv",
"time-core",
]
[[package]] [[package]]
name = "tinystr" name = "tinystr"
version = "0.8.2" version = "0.8.2"
@@ -2163,7 +2224,7 @@ dependencies = [
"ansi_term", "ansi_term",
"chrono", "chrono",
"lazy_static", "lazy_static",
"matchers", "matchers 0.0.1",
"parking_lot", "parking_lot",
"regex", "regex",
"serde", "serde",
@@ -2182,10 +2243,15 @@ version = "0.3.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e"
dependencies = [ dependencies = [
"matchers 0.2.0",
"nu-ansi-term", "nu-ansi-term",
"once_cell",
"regex-automata 0.4.13",
"sharded-slab", "sharded-slab",
"smallvec", "smallvec",
"thread_local", "thread_local",
"time",
"tracing",
"tracing-core", "tracing-core",
"tracing-log", "tracing-log",
] ]

View File

@@ -19,7 +19,6 @@ tokio-stream = { version = "0.1.11", features = ["sync"] }
byteorder = "1.4.3" byteorder = "1.4.3"
tokio-serial = "5.4.4" tokio-serial = "5.4.4"
bytes = "1.2.1" bytes = "1.2.1"
chrono = "0.4.23"
libc = "0.2.137" libc = "0.2.137"
async-stream = "0.3.6" async-stream = "0.3.6"
itertools = "0.14.0" itertools = "0.14.0"
@@ -29,11 +28,12 @@ serde_json = "1.0.146"
backoff = { version = "0.4.0", features = ["tokio"] } backoff = { version = "0.4.0", features = ["tokio"] }
serde_repr = "0.1.20" serde_repr = "0.1.20"
tracing = "0.1.44" tracing = "0.1.44"
tracing-subscriber = { version = "0.3.22", features = ["fmt"] } tracing-subscriber = { version = "0.3.22", features = ["fmt", "ansi", "time", "env-filter"] }
serialport = "4.8.1" serialport = "4.8.1"
gethostname = "1.1.0" gethostname = "1.1.0"
bitflags = "2.10.0" bitflags = "2.10.0"
influxdb2 = "0.3.9" influxdb2 = "0.3.9"
chrono = "0.4.43"
[dependencies.chrony-candm] [dependencies.chrony-candm]
git = "https://github.com/aws/chrony-candm" git = "https://github.com/aws/chrony-candm"

View File

@@ -107,7 +107,7 @@ impl Default for HwmonConfig {
} }
} }
#[derive(Serialize, Deserialize, Clone)] #[derive(Serialize, Deserialize, Clone, Debug)]
pub struct GpsdConfig { pub struct GpsdConfig {
pub enabled: bool, pub enabled: bool,
pub interval: u64, pub interval: u64,
@@ -124,7 +124,7 @@ impl Default for GpsdConfig {
} }
} }
#[derive(Serialize, Deserialize, Clone)] #[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Prs10Config { pub struct Prs10Config {
pub enabled: bool, pub enabled: bool,
pub port: String, pub port: String,

View File

@@ -3,7 +3,11 @@ use futures::future::join_all;
use std::path::Path; use std::path::Path;
use tokio::sync::broadcast; use tokio::sync::broadcast;
use tracing::{Instrument, debug, error, info, info_span, warn}; use tracing::{Instrument, debug, error, info, info_span, warn};
use tracing_subscriber; use tracing_subscriber::{
self, EnvFilter,
fmt::format::{self, FmtSpan},
prelude::*,
};
use chimemon::*; use chimemon::*;
use sources::{ use sources::{
@@ -34,7 +38,11 @@ struct Args {
#[tokio::main(flavor = "current_thread")] #[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn std::error::Error>> { async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init(); tracing_subscriber::fmt()
.with_env_filter(EnvFilter::try_from_default_env().unwrap_or(EnvFilter::default()))
// .event_format(format::Format::default().pretty())
.with_span_events(FmtSpan::CLOSE)
.init();
let args = Args::parse(); let args = Args::parse();

View File

@@ -20,7 +20,7 @@ use serde_json;
use tokio::net::{TcpStream, ToSocketAddrs, lookup_host}; use tokio::net::{TcpStream, ToSocketAddrs, lookup_host};
use tokio::time::{interval, timeout}; use tokio::time::{interval, timeout};
use tokio_util::codec::{Framed, LinesCodec}; use tokio_util::codec::{Framed, LinesCodec};
use tracing::{debug, debug_span, info, warn}; use tracing::{debug, debug_span, info, instrument, warn};
pub struct GpsdSource { pub struct GpsdSource {
pub config: Config, pub config: Config,
@@ -190,6 +190,7 @@ impl ChimemonSource for GpsdSource {
} }
} }
#[derive(Debug)]
struct GpsdTransport { struct GpsdTransport {
host: SocketAddr, host: SocketAddr,
framed: Option<Framed<TcpStream, LinesCodec>>, framed: Option<Framed<TcpStream, LinesCodec>>,
@@ -381,16 +382,14 @@ impl GpsdTransport {
Ok(self.framed.as_mut().unwrap()) Ok(self.framed.as_mut().unwrap())
} }
#[instrument(level = "debug", skip_all, fields(cmd = cmd.to_string()))]
async fn cmd_response( async fn cmd_response(
&mut self, &mut self,
cmd: &GpsdCommand, cmd: &GpsdCommand,
) -> Result<Vec<UnifiedResponse>, Box<dyn std::error::Error>> { ) -> Result<Vec<UnifiedResponse>, Box<dyn std::error::Error>> {
debug!("Command: `{cmd:?}`");
let mut responses = Vec::new(); let mut responses = Vec::new();
let conn = self.conn().await?; let conn = self.conn().await?;
debug!("Raw command: `{}`", cmd.to_string());
conn.send(cmd.to_string()).await?; conn.send(cmd.to_string()).await?;
for _ in 0..cmd.expected_responses() { for _ in 0..cmd.expected_responses() {
match conn.next().await { match conn.next().await {

View File

@@ -14,7 +14,7 @@ use tokio::sync::OnceCell;
use tokio::time::{interval, timeout}; use tokio::time::{interval, timeout};
use tokio_serial; use tokio_serial;
use tokio_serial::{SerialPort, SerialStream}; use tokio_serial::{SerialPort, SerialStream};
use tracing::{debug, error, info, warn}; use tracing::{debug, debug_span, error, info, instrument, warn};
#[derive(Debug)] #[derive(Debug)]
pub struct Prs10Info { pub struct Prs10Info {
@@ -318,6 +318,7 @@ impl SourceReportDetails for Prs10Stats {
} }
} }
#[derive(Debug)]
pub struct Prs10Monitor { pub struct Prs10Monitor {
rx: ReadHalf<SerialStream>, rx: ReadHalf<SerialStream>,
tx: WriteHalf<SerialStream>, tx: WriteHalf<SerialStream>,
@@ -354,15 +355,15 @@ impl Prs10Monitor {
self.info.get().expect("info() used before run()") self.info.get().expect("info() used before run()")
} }
#[instrument(level = "debug", skip_all, fields(cmd = String::from_utf8_lossy(cmd).to_string()))]
pub async fn cmd_response(&mut self, cmd: &[u8]) -> Result<Vec<u8>, std::io::Error> { pub async fn cmd_response(&mut self, cmd: &[u8]) -> Result<Vec<u8>, std::io::Error> {
debug!("cmd: `{:?}`", String::from_utf8_lossy(cmd));
self.tx.write_all(cmd).await.unwrap(); self.tx.write_all(cmd).await.unwrap();
self.tx.write_u8(b'\r').await.unwrap(); self.tx.write_u8(b'\r').await.unwrap();
let mut reader = BufReader::new(&mut self.rx); let mut reader = BufReader::new(&mut self.rx);
let mut buf = Vec::new(); let mut buf = Vec::new();
let read = timeout(self.config.timeout, reader.read_until(b'\r', &mut buf)).await??; let read = timeout(self.config.timeout, reader.read_until(b'\r', &mut buf)).await??;
buf.truncate(buf.len() - 1); // strip "\r" buf.truncate(buf.len() - 1); // strip "\r"
debug!("cmd response: ({read}) `{buf:?}`"); debug!("response: ({read}) `{buf:?}`");
Ok(buf) Ok(buf)
} }
@@ -461,7 +462,8 @@ impl Prs10Monitor {
debug!("polling stats"); debug!("polling stats");
let start = std::time::Instant::now(); let stats_span = debug_span!("get_stats_serial");
let stats_guard = stats_span.enter();
let ocxo_efc = self.get_ocxo_efc().await?; let ocxo_efc = self.get_ocxo_efc().await?;
let (error_signal_volts, detect_signal_volts) = self.get_detected_signals().await?; let (error_signal_volts, detect_signal_volts) = self.get_detected_signals().await?;
let freq_offset_ppt = self.get_parsed(b"SF?").await?; let freq_offset_ppt = self.get_parsed(b"SF?").await?;
@@ -470,9 +472,7 @@ impl Prs10Monitor {
for i in 1u16..=19 { for i in 1u16..=19 {
analog_values[i as usize] = self.get_analog(i).await? * ANALOG_SCALING[i as usize] analog_values[i as usize] = self.get_analog(i).await? * ANALOG_SCALING[i as usize]
} }
let duration = std::time::Instant::now() - start; drop(stats_guard);
debug!("stats polled in {}ms", duration.as_secs_f64() * 1000.0);
Ok(ChimemonMessage::SourceReport(SourceReport { Ok(ChimemonMessage::SourceReport(SourceReport {
name: "prs10".into(), name: "prs10".into(),