use infinity_rs::prelude::*;
use infinity_rs::{
sys::{FS_OBJECT_ID_USER_AIRCRAFT, FS_OBJECT_ID_USER_CURRENT},
vars::{AVar, VarParamArray1, empty_param_array},
};
use infinity_rs::VarStruct;
const L_ENABLED: &str = "L:INFINITY_VARS_DEMO_ENABLED";
const L_DO_WRITE: &str = "L:INFINITY_VARS_DEMO_DO_WRITE";
const L_OUT_AIRSPEED: &str = "L:INFINITY_VARS_DEMO_AIRSPEED_KTS";
const L_OUT_AIRSPEED_CUR: &str = "L:INFINITY_VARS_DEMO_AIRSPEED_KTS_CURRENT";
const L_OUT_ENG1_RPM: &str = "L:INFINITY_VARS_DEMO_ENG1_RPM";
const L_OUT_ENG2_RPM: &str = "L:INFINITY_VARS_DEMO_ENG2_RPM";
const L_OUT_ENG1_RPM_LOW: &str = "L:INFINITY_VARS_DEMO_ENG1_RPM_LOWLEVEL";
const L_OUT_CUSTOM: &str = "L:INFINITY_VARS_DEMO_CUSTOM_VALUE";
const L_OUT_SNAPSHOT_ALT: &str = "L:INFINITY_VARS_DEMO_SNAPSHOT_ALT_FT";
const L_OUT_SNAPSHOT_HDG: &str = "L:INFINITY_VARS_DEMO_SNAPSHOT_HDG_DEG";
#[derive(Debug, Clone, Copy, VarStruct)]
struct Snapshot {
#[var(name = "A:PLANE ALTITUDE", unit = "Feet", kind = "A")]
altitude_ft: f64,
#[var(name = "A:PLANE HEADING DEGREES TRUE", unit = "Degrees", kind = "A")]
heading_deg_true: f64,
#[var(name = "A:GENERAL ENG RPM", unit = "RPM", kind = "A", index = 1)]
eng1_rpm: f64,
#[var(
name = "L:INFINITY_VARS_DEMO_CUSTOM_VALUE",
unit = "Number",
kind = "L"
)]
custom_value: f64,
}
pub struct VarsFullApiSystem {
l_enabled: LVar,
l_do_write: LVar,
l_out_airspeed: LVar,
l_out_airspeed_current: LVar,
l_out_eng1_rpm: LVar,
l_out_eng2_rpm: LVar,
l_out_eng1_rpm_low: LVar,
l_out_custom: LVar,
l_out_snapshot_alt: LVar,
l_out_snapshot_hdg: LVar,
a_airspeed: AVar,
a_eng_rpm: AVar,
accum: f32,
}
impl VarsFullApiSystem {
pub fn new() -> Self {
let l_enabled = LVar::new(L_ENABLED, "Bool").expect("LVar create failed");
let l_do_write = LVar::new(L_DO_WRITE, "Bool").expect("LVar create failed");
let l_out_airspeed = LVar::new(L_OUT_AIRSPEED, "Number").expect("LVar create failed");
let l_out_airspeed_current =
LVar::new(L_OUT_AIRSPEED_CUR, "Number").expect("LVar create failed");
let l_out_eng1_rpm = LVar::new(L_OUT_ENG1_RPM, "Number").expect("LVar create failed");
let l_out_eng2_rpm = LVar::new(L_OUT_ENG2_RPM, "Number").expect("LVar create failed");
let l_out_eng1_rpm_low =
LVar::new(L_OUT_ENG1_RPM_LOW, "Number").expect("LVar create failed");
let l_out_custom = LVar::new(L_OUT_CUSTOM, "Number").expect("LVar create failed");
let l_out_snapshot_alt =
LVar::new(L_OUT_SNAPSHOT_ALT, "Number").expect("LVar create failed");
let l_out_snapshot_hdg =
LVar::new(L_OUT_SNAPSHOT_HDG, "Number").expect("LVar create failed");
let a_airspeed = AVar::new("A:AIRSPEED INDICATED", "Knots").expect("AVar create failed");
let a_eng_rpm = AVar::new("A:GENERAL ENG RPM", "RPM").expect("AVar create failed");
Self {
l_enabled,
l_do_write,
l_out_airspeed,
l_out_airspeed_current,
l_out_eng1_rpm,
l_out_eng2_rpm,
l_out_eng1_rpm_low,
l_out_custom,
l_out_snapshot_alt,
l_out_snapshot_hdg,
a_airspeed,
a_eng_rpm,
accum: 0.0,
}
}
fn tick(&mut self) {
if let Ok(v) = self.a_airspeed.get() {
let _ = self.l_out_airspeed.set(v);
}
if let Ok(v) = self.a_airspeed.get_target(FS_OBJECT_ID_USER_CURRENT) {
let _ = self.l_out_airspeed_current.set(v);
}
if let Ok(v) = self.a_eng_rpm.get_indexed(1) {
let _ = self.l_out_eng1_rpm.set(v);
}
if let Ok(v) = self
.a_eng_rpm
.get_indexed_target(2, FS_OBJECT_ID_USER_AIRCRAFT)
{
let _ = self.l_out_eng2_rpm.set(v);
}
let mut param = VarParamArray1::index(1);
if let Ok(v) = self
.a_eng_rpm
.get_with(param.as_raw_mut(), FS_OBJECT_ID_USER_AIRCRAFT)
{
let _ = self.l_out_eng1_rpm_low.set(v);
}
let do_write = self.l_do_write.get().unwrap_or(0.0) >= 0.5;
if do_write {
let next = self.l_out_custom.get().unwrap_or(0.0) + 1.0;
let _ = self.l_out_custom.set(next);
let _ = self
.l_out_custom
.set_target(FS_OBJECT_ID_USER_CURRENT, next);
}
if let Ok(s) = Snapshot::get() {
let _ = self.l_out_snapshot_alt.set(s.altitude_ft);
let _ = self.l_out_snapshot_hdg.set(s.heading_deg_true);
let _ = s.set();
}
let _ = self
.a_airspeed
.get_with(empty_param_array(), FS_OBJECT_ID_USER_AIRCRAFT);
}
}
impl System for VarsFullApiSystem {
fn init(&mut self, _ctx: &Context, _install: &SystemInstall) -> bool {
let _ = self.l_enabled.set(1.0);
let _ = self.l_do_write.set(0.0);
let _ = self.l_out_airspeed.set(0.0);
let _ = self.l_out_airspeed_current.set(0.0);
let _ = self.l_out_eng1_rpm.set(0.0);
let _ = self.l_out_eng2_rpm.set(0.0);
let _ = self.l_out_eng1_rpm_low.set(0.0);
let _ = self.l_out_custom.set(0.0);
let _ = self.l_out_snapshot_alt.set(0.0);
let _ = self.l_out_snapshot_hdg.set(0.0);
true
}
fn update(&mut self, _ctx: &Context, dt: f32) -> bool {
self.accum += dt;
if self.accum >= 0.5 {
self.accum = 0.0;
let enabled = self.l_enabled.get().unwrap_or(0.0) >= 0.5;
if enabled {
self.tick();
}
}
true
}
fn kill(&mut self, _ctx: &Context) -> bool {
true
}
}
infinity_rs::export_system!(
name = vars_full_api,
state = VarsFullApiSystem,
ctor = VarsFullApiSystem::new()
);