Compare commits

..

No commits in common. "main" and "v1.9.9-pre-29" have entirely different histories.

14 changed files with 32 additions and 47 deletions

4
Cargo.lock generated
View file

@ -239,7 +239,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]] [[package]]
name = "charge-controller-supervisor" name = "charge-controller-supervisor"
version = "1.9.9-pre-30" version = "1.9.9-pre-29"
dependencies = [ dependencies = [
"bitflags 2.7.0", "bitflags 2.7.0",
"chrono", "chrono",
@ -2205,7 +2205,7 @@ dependencies = [
[[package]] [[package]]
name = "tesla-charge-controller" name = "tesla-charge-controller"
version = "1.9.9-pre-30" version = "1.9.9-pre-29"
dependencies = [ dependencies = [
"chrono", "chrono",
"clap", "clap",

View file

@ -4,7 +4,7 @@ default-members = ["charge-controller-supervisor"]
resolver = "2" resolver = "2"
[workspace.package] [workspace.package]
version = "1.9.9-pre-30" version = "1.9.9-pre-29"
[workspace.lints.clippy] [workspace.lints.clippy]
pedantic = "warn" pedantic = "warn"

View file

@ -101,19 +101,19 @@ impl Controller {
let data = self.inner.refresh().await?; let data = self.inner.refresh().await?;
if let Some(tx) = self.voltage_tx.as_mut() { if let Some(tx) = self.voltage_tx.as_mut() {
if crate::config::access_config() // if crate::config::access_config()
.await // .await
.enable_secondary_control // .enable_secondary_control
{ // {
let target = data.common().target_voltage; let target = data.common().target_voltage;
log::debug!( log::debug!(
"tristar {}: primary: sending target voltage {}", "tristar {}: primary: sending target voltage {}",
self.name, self.name,
target target
); );
tx.send(VoltageCommand::Set(target))?; tx.send(VoltageCommand::Set(target))?;
} // }
} }
*self.data.write_state().await = Some(data); *self.data.write_state().await = Some(data);
@ -137,7 +137,7 @@ impl Controller {
} }
pub fn name(&self) -> &str { pub fn name(&self) -> &str {
self.name.as_str() &self.name
} }
pub fn set_tx_to_secondary(&mut self, tx: tokio::sync::watch::Sender<VoltageCommand>) { pub fn set_tx_to_secondary(&mut self, tx: tokio::sync::watch::Sender<VoltageCommand>) {

View file

@ -840,9 +840,9 @@ impl Tristar {
pub async fn set_target_voltage(&mut self, target_voltage: f64) -> eyre::Result<()> { pub async fn set_target_voltage(&mut self, target_voltage: f64) -> eyre::Result<()> {
let scaled_voltage: u16 = self.scale_voltage(target_voltage); let scaled_voltage: u16 = self.scale_voltage(target_voltage);
self.modbus // self.modbus
.write_single_register(TristarRamAddress::VbRefSlave as u16, scaled_voltage) // .write_single_register(TristarRamAddress::VbRefSlave as u16, scaled_voltage)
.await??; // .await??;
log::debug!( log::debug!(
"tristar {} being set to voltage {target_voltage} (scaled: {scaled_voltage:#X?})", "tristar {} being set to voltage {target_voltage} (scaled: {scaled_voltage:#X?})",

View file

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

View file

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

View file

@ -95,7 +95,6 @@ impl Vehicle {
Ok(state.charge_state) 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<()> { pub async fn set_charging_amps(&self, charging_amps: i64) -> eyre::Result<()> {
self.client self.client
.post(format!( .post(format!(

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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