feat: Add system date display and setting via API

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
Chris Frankland-Wright 2025-07-30 22:36:19 +01:00
parent af43388e4b
commit 58a1d243e4
5 changed files with 118 additions and 0 deletions

View file

@ -19,6 +19,7 @@ struct ApiStatus {
ltc_timecode: String,
frame_rate: String,
system_clock: String,
system_date: String,
timecode_delta_ms: i64,
timecode_delta_frames: i64,
sync_status: String,
@ -58,6 +59,7 @@ async fn get_status(data: web::Data<AppState>) -> impl Responder {
now_local.second(),
now_local.timestamp_subsec_millis(),
);
let system_date = now_local.format("%Y-%m-%d").to_string();
let avg_delta = state.get_ewma_clock_delta();
let mut delta_frames = 0;
@ -83,6 +85,7 @@ async fn get_status(data: web::Data<AppState>) -> impl Responder {
ltc_timecode,
frame_rate,
system_clock,
system_date,
timecode_delta_ms: avg_delta,
timecode_delta_frames: delta_frames,
sync_status: sync_status.to_string(),
@ -135,6 +138,22 @@ async fn nudge_clock(req: web::Json<NudgeRequest>) -> impl Responder {
}
}
#[derive(Deserialize)]
struct SetDateRequest {
date: String,
}
#[post("/api/set_date")]
async fn set_date(req: web::Json<SetDateRequest>) -> impl Responder {
if system::set_date(&req.date).is_ok() {
HttpResponse::Ok()
.json(serde_json::json!({ "status": "success", "message": "Date update command issued." }))
} else {
HttpResponse::InternalServerError()
.json(serde_json::json!({ "status": "error", "message": "Date update command failed." }))
}
}
#[post("/api/config")]
async fn update_config(
data: web::Data<AppState>,
@ -192,6 +211,7 @@ pub async fn start_api_server(
.service(update_config)
.service(get_logs)
.service(nudge_clock)
.service(set_date)
// Serve frontend static files
.service(fs::Files::new("/", "static/").index_file("index.html"))
})

View file

@ -131,6 +131,33 @@ pub fn nudge_clock(microseconds: i64) -> Result<(), ()> {
}
}
pub fn set_date(date: &str) -> Result<(), ()> {
#[cfg(target_os = "linux")]
{
let success = Command::new("sudo")
.arg("date")
.arg("--set")
.arg(date)
.status()
.map(|s| s.success())
.unwrap_or(false);
if success {
log::info!("Set system date to {}", date);
Ok(())
} else {
log::error!("Failed to set system date");
Err(())
}
}
#[cfg(not(target_os = "linux"))]
{
let _ = date;
log::warn!("Date setting is only supported on Linux.");
Err(())
}
}
#[cfg(test)]
mod tests {
use super::*;