diff options
| author | 1992414357@qq.com <1992414357@qq.com> | 2025-05-29 14:20:04 +0800 |
|---|---|---|
| committer | 1992414357@qq.com <1992414357@qq.com> | 2025-05-29 14:20:04 +0800 |
| commit | 3d23632d7c6330e0ec98dad53656dfed5f5767b0 (patch) | |
| tree | d8d59726ca5b046b55ba502f1b8d5ba3a561a569 /bindings/c/src/data_c/control_message_c.rs | |
| parent | 9d3d6d4195e58c51166811d8357a331d53c4cdd4 (diff) | |
1. 优化了服务器的消息处理方式
2. 将c和c#的绑定移动到了./bindings/文件夹
Diffstat (limited to 'bindings/c/src/data_c/control_message_c.rs')
| -rw-r--r-- | bindings/c/src/data_c/control_message_c.rs | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/bindings/c/src/data_c/control_message_c.rs b/bindings/c/src/data_c/control_message_c.rs new file mode 100644 index 0000000..6868459 --- /dev/null +++ b/bindings/c/src/data_c/control_message_c.rs @@ -0,0 +1,150 @@ +use crate::data_c::common::KeyData; +use crate::{str_c_to_rs, str_rs_to_c}; +use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::ControlMessage; +use std::ffi::{c_char, c_void}; +use std::ptr::null_mut; + +#[repr(C)] +#[allow(unused_imports)] +pub struct ControlMessageC { + pub tag: CtrlMsgCTag, + pub data: CtrlMsgCUnion +} + +#[repr(C)] +#[allow(unused_imports)] +pub enum CtrlMsgCTag { + Msg, Pressed, Released, Axis, Dir, Exit, Err +} + +#[repr(C)] +#[allow(unused_imports)] +pub union CtrlMsgCUnion { + nul: *mut c_void, + key: KeyData, + axis: AxisData, + dir: DirData, + str: StrData +} + +#[repr(C)] +#[allow(unused_imports)] +#[derive(Copy, Clone)] +pub struct AxisData { + key: u8, + ax: f64 +} + +#[repr(C)] +#[allow(unused_imports)] +#[derive(Copy, Clone)] +pub struct DirData { + key: u8, + x: f64, + y: f64 +} + +#[repr(C)] +#[allow(unused_imports)] +#[derive(Copy, Clone)] +pub struct StrData { + str: *const c_char +} + +impl From<ControlMessageC> for ControlMessage { + fn from(msg_c: ControlMessageC) -> Self { + match msg_c.tag { + CtrlMsgCTag::Msg => unsafe { + let str = str_c_to_rs(msg_c.data.str.str); + if str.is_some() { + ControlMessage::Msg(str.unwrap()) + } else { + ControlMessage::Err + } + } + CtrlMsgCTag::Pressed => unsafe { + ControlMessage::Pressed(msg_c.data.key.key) + } + CtrlMsgCTag::Released => unsafe { + ControlMessage::Released(msg_c.data.key.key) + } + CtrlMsgCTag::Axis => unsafe { + let data = msg_c.data.axis; + ControlMessage::Axis(data.key, data.ax) + } + CtrlMsgCTag::Dir => unsafe { + let data = msg_c.data.dir; + ControlMessage::Dir(data.key, (data.x, data.y)) + } + CtrlMsgCTag::Exit => { + ControlMessage::Exit + } + CtrlMsgCTag::Err => { + ControlMessage::Err + } + } + } +} + +impl From<ControlMessage> for ControlMessageC { + fn from(msg_rs: ControlMessage) -> Self { + match msg_rs { + ControlMessage::Msg(str_msg) => { + ControlMessageC { + tag: CtrlMsgCTag::Msg, + data: CtrlMsgCUnion { + str: StrData { str: str_rs_to_c(str_msg).1 }, + } + } + } + ControlMessage::Pressed(key) => { + ControlMessageC { + tag: CtrlMsgCTag::Pressed, + data: CtrlMsgCUnion { + key: KeyData { key }, + } + } + } + ControlMessage::Released(key) => { + ControlMessageC { + tag: CtrlMsgCTag::Released, + data: CtrlMsgCUnion { + key: KeyData { key }, + } + } + } + ControlMessage::Axis(key, ax) => { + ControlMessageC { + tag: CtrlMsgCTag::Axis, + data: CtrlMsgCUnion { + axis: AxisData { key, ax } + } + } + } + ControlMessage::Dir(key, (x, y)) => { + ControlMessageC { + tag: CtrlMsgCTag::Dir, + data: CtrlMsgCUnion { + dir: DirData { key, x, y } + } + } + } + ControlMessage::Exit => { + ControlMessageC { + tag: CtrlMsgCTag::Exit, + data: CtrlMsgCUnion { + nul: null_mut(), + } + } + } + ControlMessage::Err => { + ControlMessageC { + tag: CtrlMsgCTag::Err, + data: CtrlMsgCUnion { + nul: null_mut(), + } + } + } + } + } +}
\ No newline at end of file |
