mod ctrl_c; use std::{ borrow::Cow, ffi::{CStr, CString}, thread::sleep, time::Duration, }; use ctrl_c::CtrlC; // use simconnect_rs::SimConnect; use simconnect_sdk::{Notification, SimConnect, SimConnectObject, SystemEventRequest}; #[derive(Debug, Clone, SimConnectObject)] #[simconnect(period = "second")] struct AtcID { #[simconnect(name = "ATC ID")] value: String, } // #[derive(Debug, Clone, SimConnectObject)] // #[simconnect(period = "second")] // #[allow(dead_code)] // struct AirplaneData { // #[simconnect(name = "TITLE")] // title: String, // #[simconnect(name = "ATC ID")] // atc_id: String, // #[simconnect(name = "CATEGORY")] // category: String, // #[simconnect(name = "PLANE LATITUDE", unit = "degrees")] // lat: f64, // #[simconnect(name = "PLANE LONGITUDE", unit = "degrees")] // lon: f64, // #[simconnect(name = "PLANE ALTITUDE", unit = "feet")] // alt: f64, // #[simconnect(name = "SIM ON GROUND")] // sim_on_ground: bool, // } #[derive(Debug, Clone, SimConnectObject)] #[simconnect(period = "second")] struct Fuel { #[simconnect(name = "FUEL TANK CENTER QUANTITY", unit = "gallons")] ft1: f64, #[simconnect(name = "FUEL TANK LEFT MAIN QUANTITY", unit = "gallons")] wt1: f64, #[simconnect(name = "FUEL TANK RIGHT MAIN QUANTITY", unit = "gallons")] wt2: f64, #[simconnect(name = "FUEL TANK EXTERNAL1 QUANTITY", unit = "gallons")] et1: f64, #[simconnect(name = "FUEL TANK EXTERNAL2 QUANTITY", unit = "gallons")] et2: f64, #[simconnect(name = "FUEL TANK CENTER3 QUANTITY", unit = "gallons")] et3: f64, #[simconnect(name = "FUEL TANK CENTER2 QUANTITY", unit = "gallons")] ft2: f64, } fn main() -> Result<(), anyhow::Error> { use tracing::Level; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; use tracing_subscriber::Layer; let fmt = tracing_subscriber::fmt::layer().with_filter(tracing_subscriber::filter::filter_fn( |metadata| metadata.level() < &Level::TRACE, )); tracing_subscriber::registry().with(fmt).init(); let Ok(mut simconnect) = SimConnect::new("Avii's Virtual Airline Manager") else { panic!("Game not running, gotta wait for it here"); }; // .subscribe(SomeEvent); let mut id = 0; let ctrl_c = CtrlC::new(); loop { if let Ok(Some(event)) = simconnect.get_next_dispatch() { match event { Notification::Open => { simconnect.subscribe_to_system_event(SystemEventRequest::FlightLoaded)?; id = simconnect.register_object::()?; simconnect.register_object::()?; let cs = CString::new("FAST")?; let mut buffer = [0i8; 256]; for (i, b) in cs.to_bytes_with_nul().iter().enumerate() { buffer[i] = *b as i8; } simconnect .set_data_on_sim_object_with_id(id, &mut AtcIDCPacked { value: buffer })?; tracing::info!("ATC_ID set"); simconnect.set_data_on_sim_object(&mut Fuel { ft1: 0.0, wt1: 20.0, wt2: 20.0, et1: 0.0, et2: 0.0, et3: 0.0, ft2: 0.0, })?; tracing::info!("FUEL set"); } Notification::Object(object) => { // if let Ok(fuel) = Fuel::try_from(&object) { // // dbg!(fuel); // continue; // } } Notification::SystemEvent(system_event) => { if let simconnect_sdk::SystemEvent::FlightLoaded { .. } = system_event { let cs = CString::new("RAWR")?; let mut buffer = [0i8; 256]; for (i, b) in cs.to_bytes_with_nul().iter().enumerate() { buffer[i] = *b as i8; } simconnect.set_data_on_sim_object_with_id( id, &mut AtcIDCPacked { value: buffer }, )?; tracing::info!("ATC_ID set"); simconnect.set_data_on_sim_object(&mut Fuel { ft1: 0.0, wt1: 20.0, wt2: 20.0, et1: 0.0, et2: 0.0, et3: 0.0, ft2: 0.0, })?; tracing::info!("FUEL set"); } } Notification::Quit => panic!("Sim Quit"), _ => todo!(), } } sleep(Duration::from_millis(1000)); if ctrl_c.count() > 0 { break; } } drop(simconnect); Ok(()) }