Compare commits

...

4 commits

Author SHA1 Message Date
7ffdfd1fc3 ccs: log message when server spawned 2025-01-18 12:00:57 +11:00
9d12bce452 tcc: fix clippy lints 2025-01-18 11:58:22 +11:00
b549ceebab update toolchain 2025-01-18 11:52:32 +11:00
b28026820c rename .gitea -> .forgejo 2025-01-18 11:18:11 +11:00
11 changed files with 29 additions and 14 deletions

View file

@ -137,7 +137,7 @@ impl Controller {
}
pub fn name(&self) -> &str {
&self.name
self.name.as_str()
}
pub fn set_tx_to_secondary(&mut self, tx: tokio::sync::watch::Sender<VoltageCommand>) {

View file

@ -150,6 +150,7 @@ async fn watch(args: Args) -> eyre::Result<()> {
follow_voltage_tx,
));
let server_task = tokio::task::spawn(server.launch());
log::warn!("...started!");
tokio::select! {
v = controller_tasks.next() => {

View file

@ -1,2 +1,3 @@
[toolchain]
channel = "nightly"
channel = "nightly-2025-01-16"
targets = ["aarch64-unknown-linux-musl"]

View file

@ -95,6 +95,7 @@ impl Vehicle {
Ok(state.charge_state)
}
#[expect(dead_code, reason = "active charge control not yet implemented")]
pub async fn set_charging_amps(&self, charging_amps: i64) -> eyre::Result<()> {
self.client
.post(format!(

View file

@ -42,11 +42,11 @@ impl Car {
}
}
pub fn vehicle(&self) -> &http::Vehicle {
pub const fn vehicle(&self) -> &http::Vehicle {
&self.vehicle
}
pub fn state(&self) -> &tokio::sync::RwLock<CarState> {
pub const fn state(&self) -> &tokio::sync::RwLock<CarState> {
&self.state
}
}
@ -153,7 +153,7 @@ impl ChargeState {
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum ChargingState {
Charging,
Stopped,

View file

@ -60,7 +60,7 @@ impl ConfigWatcher {
async fn overwrite_config(config: Config) -> eyre::Result<()> {
*CONFIG
.get()
.ok_or(eyre::eyre!("could not get config"))?
.ok_or_else(|| eyre::eyre!("could not get config"))?
.write()
.await = config;
Ok(())

View file

@ -4,6 +4,7 @@ pub struct VehicleController {
control_state: ChargeRateControllerState,
}
#[expect(dead_code, reason = "not all states are currently in use")]
pub enum ChargeRateControllerState {
Inactive,
Charging { rate_amps: i64 },
@ -14,7 +15,7 @@ pub enum InterfaceRequest {
}
impl VehicleController {
pub fn new(
pub const fn new(
car: std::sync::Arc<crate::api::Car>,
requests: tokio::sync::mpsc::UnboundedReceiver<InterfaceRequest>,
) -> Self {
@ -50,7 +51,10 @@ impl VehicleController {
}
match self.control_state {
ChargeRateControllerState::Inactive => {
if let Some(state) = self.car.state().read().await.charge_state().await {
let car_state = self.car.state().read().await;
let state = car_state.charge_state().await;
if let Some(state) = state {
if state.is_charging() {
self.control_state = ChargeRateControllerState::Charging {
rate_amps: state.charge_amps,
@ -58,10 +62,14 @@ impl VehicleController {
}
}
}
ChargeRateControllerState::Charging { rate_amps } => todo!(),
ChargeRateControllerState::Charging { rate_amps: _ } => todo!(),
}
}
#[expect(
clippy::needless_pass_by_ref_mut,
reason = "this will eventually need to mutate self"
)]
pub async fn process_requests(&mut self, req: InterfaceRequest) {
if let Err(e) = match req {
InterfaceRequest::FlashLights => self.car.vehicle().flash_lights().await,

View file

@ -1,3 +1,5 @@
#![allow(clippy::significant_drop_tightening)]
use std::path::PathBuf;
use clap::Parser;

View file

@ -27,7 +27,7 @@ pub struct ServerState {
}
impl ServerState {
pub fn new(car: Arc<Car>, api_requests: UnboundedSender<InterfaceRequest>) -> Self {
pub const fn new(car: Arc<Car>, api_requests: UnboundedSender<InterfaceRequest>) -> Self {
Self { car, api_requests }
}
}

View file

@ -52,10 +52,12 @@ impl Handler for UiStatic {
data: v.contents().to_vec(),
name: p,
})
.or(UI_DIR_FILES.get_file(&plus_index).map(|v| RawHtml {
.or_else(|| {
UI_DIR_FILES.get_file(&plus_index).map(|v| RawHtml {
data: v.contents().to_vec(),
name: plus_index,
}));
})
});
file.respond_to(req).or_forward((data, Status::NotFound))
}
}