aboutsummaryrefslogtreecommitdiff
path: root/bindings/c/src/data_c/control_message_c.rs
diff options
context:
space:
mode:
author1992414357@qq.com <1992414357@qq.com>2025-05-29 14:20:04 +0800
committer1992414357@qq.com <1992414357@qq.com>2025-05-29 14:20:04 +0800
commit3d23632d7c6330e0ec98dad53656dfed5f5767b0 (patch)
treed8d59726ca5b046b55ba502f1b8d5ba3a561a569 /bindings/c/src/data_c/control_message_c.rs
parent9d3d6d4195e58c51166811d8357a331d53c4cdd4 (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.rs150
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