use std::os::raw::c_char;
use crate::{bindings, SimConnectError};
pub(crate) const CLIENT_EVENT_DISCRIMINANT_START: u32 = 1024;
#[derive(Debug, Copy, Clone, PartialEq, Eq, num_enum::TryFromPrimitive)]
#[repr(u32)]
#[non_exhaustive]
pub enum ClientEventRequest {
Throttle1Set = CLIENT_EVENT_DISCRIMINANT_START,
Throttle2Set,
Throttle3Set,
Throttle4Set,
AxisElevatorSet,
Brakes,
BrakesLeft,
BrakesRight,
AxisLeftBrakeSet,
AxisRightBrakeSet,
ParkingBrakes,
}
impl ClientEventRequest {
pub(crate) fn into_c_char(self) -> *const c_char {
match self {
Self::Throttle1Set => c"THROTTLE1_SET".as_ptr() as *const c_char,
Self::Throttle2Set => c"THROTTLE2_SET".as_ptr() as *const c_char,
Self::Throttle3Set => c"THROTTLE3_SET".as_ptr() as *const c_char,
Self::Throttle4Set => c"THROTTLE4_SET".as_ptr() as *const c_char,
Self::AxisElevatorSet => c"AXIS_ELEVATOR_SET".as_ptr() as *const c_char,
Self::Brakes => c"BRAKES".as_ptr() as *const c_char,
Self::BrakesLeft => c"BRAKES_LEFT".as_ptr() as *const c_char,
Self::BrakesRight => c"BRAKES_RIGHT".as_ptr() as *const c_char,
Self::AxisLeftBrakeSet => c"AXIS_LEFT_BRAKE_SET".as_ptr() as *const c_char,
Self::AxisRightBrakeSet => c"AXIS_RIGHT_BRAKE_SET".as_ptr() as *const c_char,
Self::ParkingBrakes => c"PARKING_BRAKES".as_ptr() as *const c_char,
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum ClientEvent {
Throttle1Set {
value: i32,
},
Throttle2Set {
value: i32,
},
Throttle3Set {
value: i32,
},
Throttle4Set {
value: i32,
},
AxisElevatorSet {
value: i32,
},
Brakes,
BrakesLeft,
BrakesRight,
AxisLeftBrakeSet {
value: i32,
},
AxisRightBrakeSet {
value: i32,
},
ParkingBrakes,
}
impl TryFrom<&bindings::SIMCONNECT_RECV_EVENT> for ClientEvent {
type Error = SimConnectError;
fn try_from(event: &bindings::SIMCONNECT_RECV_EVENT) -> Result<Self, Self::Error> {
let request = ClientEventRequest::try_from(event.uEventID)
.map_err(|_| SimConnectError::UnimplementedEventType(event.uEventID))?;
match request {
ClientEventRequest::Throttle1Set => Ok(Self::Throttle1Set {
value: event.dwData as i32,
}),
ClientEventRequest::Throttle2Set => Ok(Self::Throttle2Set {
value: event.dwData as i32,
}),
ClientEventRequest::Throttle3Set => Ok(Self::Throttle3Set {
value: event.dwData as i32,
}),
ClientEventRequest::Throttle4Set => Ok(Self::Throttle4Set {
value: event.dwData as i32,
}),
ClientEventRequest::AxisElevatorSet => Ok(Self::AxisElevatorSet {
value: event.dwData as i32,
}),
ClientEventRequest::Brakes => Ok(Self::Brakes),
ClientEventRequest::BrakesLeft => Ok(Self::BrakesLeft),
ClientEventRequest::BrakesRight => Ok(Self::BrakesRight),
ClientEventRequest::AxisLeftBrakeSet => Ok(Self::AxisLeftBrakeSet {
value: event.dwData as i32,
}),
ClientEventRequest::AxisRightBrakeSet => Ok(Self::AxisRightBrakeSet {
value: event.dwData as i32,
}),
ClientEventRequest::ParkingBrakes => Ok(Self::ParkingBrakes),
}
}
}
impl From<ClientEvent> for (ClientEventRequest, i32) {
fn from(event: ClientEvent) -> Self {
match event {
ClientEvent::Throttle1Set { value } => (ClientEventRequest::Throttle1Set, value),
ClientEvent::Throttle2Set { value } => (ClientEventRequest::Throttle2Set, value),
ClientEvent::Throttle3Set { value } => (ClientEventRequest::Throttle3Set, value),
ClientEvent::Throttle4Set { value } => (ClientEventRequest::Throttle4Set, value),
ClientEvent::AxisElevatorSet { value } => (ClientEventRequest::AxisElevatorSet, value),
ClientEvent::Brakes => (ClientEventRequest::Brakes, 0),
ClientEvent::BrakesLeft => (ClientEventRequest::BrakesLeft, 0),
ClientEvent::BrakesRight => (ClientEventRequest::BrakesRight, 0),
ClientEvent::AxisLeftBrakeSet { value } => {
(ClientEventRequest::AxisLeftBrakeSet, value)
}
ClientEvent::AxisRightBrakeSet { value } => {
(ClientEventRequest::AxisRightBrakeSet, value)
}
ClientEvent::ParkingBrakes => (ClientEventRequest::ParkingBrakes, 0),
}
}
}