Начал вчера разбираться, хочу совета спросить что-ли.
Итак код библиотеки Xinput.ahk:
XInput_Init(dll="xinput1_3")
{
global
if _XInput_hm
return
XINPUT_DEVTYPE_GAMEPAD := 0x01
XINPUT_DEVSUBTYPE_GAMEPAD := 0x01
XINPUT_CAPS_VOICE_SUPPORTED := 0x0004
XINPUT_GAMEPAD_DPAD_UP := 0x0001
XINPUT_GAMEPAD_DPAD_DOWN := 0x0002
XINPUT_GAMEPAD_DPAD_LEFT := 0x0004
XINPUT_GAMEPAD_DPAD_RIGHT := 0x0008
XINPUT_GAMEPAD_START := 0x0010
XINPUT_GAMEPAD_BACK := 0x0020
XINPUT_GAMEPAD_LEFT_THUMB := 0x0040
XINPUT_GAMEPAD_RIGHT_THUMB := 0x0080
XINPUT_GAMEPAD_LEFT_SHOULDER := 0x0100
XINPUT_GAMEPAD_RIGHT_SHOULDER := 0x0200
XINPUT_GAMEPAD_A := 0x1000
XINPUT_GAMEPAD_B := 0x2000
XINPUT_GAMEPAD_X := 0x4000
XINPUT_GAMEPAD_Y := 0x8000
XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE := 7849
XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE := 8689
XINPUT_GAMEPAD_TRIGGER_THRESHOLD := 30
XINPUT_FLAG_GAMEPAD := 0x00000001
_XInput_hm := DllCall("LoadLibrary" ,"str",dll)
if !_XInput_hm
{
MsgBox, Failed to initialize XInput: %dll%.dll not found.
return
}
_XInput_GetState := DllCall("GetProcAddress" ,"ptr",_XInput_hm ,"astr","XInputGetState")
_XInput_SetState := DllCall("GetProcAddress" ,"ptr",_XInput_hm ,"astr","XInputSetState")
_XInput_GetCapabilities := DllCall("GetProcAddress" ,"ptr",_XInput_hm ,"astr","XInputGetCapabilities")
if !(_XInput_GetState && _XInput_SetState && _XInput_GetCapabilities)
{
XInput_Term()
MsgBox, Failed to initialize XInput: function not found.
return
}
}
По аналогии код Wiimote.ahk:
Wiimote_Init(dll="wiiuse")
{
global
if _Wiimote_hm
return
WIIMOTE_LED_NONE := 0x00
WIIMOTE_LED_1 := 0x10
WIIMOTE_LED_2 := 0x20
WIIMOTE_LED_3 := 0x40
WIIMOTE_LED_4 := 0x80
_Wiimote_hm := DllCall("LoadLibrary", "Str", dll)
_Wiimote := DllCall("GetProcAddress", "Ptr", _Wiimote_hm, "AStr", "wiimote_t")
_Wiiuse_init := DllCall("GetProcAddress", "Ptr", _Wiimote_hm, "AStr", "wiiuse_init")
_Wiimote_find := DllCall("GetProcAddress", "Ptr", _Wiimote_hm, "AStr", "wiiuse_find")
_Wiimote_connect := DllCall("GetProcAddress", "Ptr", _Wiimote_hm, "AStr", "wiiuse_connect")
_Wiimote_set_leds := DllCall("GetProcAddress", "Ptr", _Wiimote_hm, "AStr", "wiiuse_set_leds")
_Wiimote_disconnect := DllCall("GetProcAddress", "Ptr", _Wiimote_hm, "AStr", "wiiuse_disconnect")
if !(_Wiimote_hm && _Wiimote && _Wiiuse_init && _Wiimote_find && _Wiimote_connect && _Wiimote_set_leds && _Wiimote_disconnect)
{
MsgBox, Failed to initialize Wiimote: %dll%.dll not found.
return
}
}
Далее непосредственно чтение из dll данных, Xinput.ahk:
XInput_GetState(UserIndex)
{
global _XInput_GetState
VarSetCapacity(xiState,16)
if ErrorLevel := DllCall(_XInput_GetState ,"uint",UserIndex ,"uint",&xiState)
return 0
return {
(Join,
dwPacketNumber: NumGet(xiState, 0, "UInt")
wButtons: NumGet(xiState, 4, "UShort")
bLeftTrigger: NumGet(xiState, 6, "UChar")
bRightTrigger: NumGet(xiState, 7, "UChar")
sThumbLX: NumGet(xiState, 8, "Short")
sThumbLY: NumGet(xiState, 10, "Short")
sThumbRX: NumGet(xiState, 12, "Short")
sThumbRY: NumGet(xiState, 14, "Short")
)}
}
И по аналогии Wiimote.ahk:
{
global _Wiimote_
VarSetCapacity(state,78)
if ErrorLevel := DllCall(_Wiimote, "Ptr", &wiimote)
return 0
return {
(Join,
unid: NumGet(state, 0, "Int"),
bdaddr: NumGet(state, 4, "Int*"),
bdaddr_Str:
{
NumGet(state, 8, "UChar"),
NumGet(state, 9, "UChar"),
NumGet(state, 10, "UChar"),
NumGet(state, 11, "UChar"),
NumGet(state, 12, "UChar"),
NumGet(state, 13, "UChar"),
NumGet(state, 14, "UChar"),
NumGet(state, 15, "UChar"),
NumGet(state, 16, "UChar"),
NumGet(state, 17, "UChar"),
NumGet(state, 19, "UChar"),
NumGet(state, 20, "UChar"),
NumGet(state, 21, "UChar"),
NumGet(state, 22, "UChar"),
NumGet(state, 23, "UChar"),
NumGet(state, 24, "UChar"),
NumGet(state, 25, "UChar"),
NumGet(state, 26, "UChar")
},
out_sock: NumGet(state, 27, "Int"),
in_sock: NumGet(state, 31, "Int"),
state: NumGet(state, 35, "Int"),
leds: NumGet(state, 39, "UChar"),
battery_level: NumGet(state, 40, "Float"),
flags: NumGet(state, 42, "Int"),
handshake_state:NumGet(state, 46, "UChar"),
read_req: NumGet(state, 47, "Int*"),
accel_calib: StrGet(state, 50, "Str"),
orient: StrGet(state, 53, "Str"),
exp: StrGet(state, 57, "Str"),
accel: StrGet(state, 59, "Str"),
)}
}
Код неправильный, нужно переделывать - вот и хочу спросить. делал на основе вот этого:
class wiimote(Structure):
_fields_ = [('unid', c_int),
] + JunkSkip + [
('state', c_int),
('leds', c_byte),
('battery_level', c_float),
('flags', c_int),
('handshake_state', c_byte),
('read_req', c_void_p),
('accel_calib', accel),
('exp', expansion),
('accel', vec3b),
('orient', orient),
('gforce', vec3f),
('ir', ir),
('btns', c_ushort),
('btns_held', c_ushort),
('btns_released', c_ushort),
('orient_threshold', c_float),
('accel_threshold', c_int),
('lstate', wiimote_state),
('event', c_int),
('event_buf', c_byte*32),
]
wiimote_p = POINTER(wiimote)
wiimote_pp = POINTER(wiimote_p)
Вопрос - в python скрипте есть ссылки на структуры которые были описаны ранее (vec3b, expansion и т.д.), нужно и можно вносить подобным образом эти структуры в библиотеки и как потом их использовать при чтении запроса из dll?
Wiimote_vec3b
{
global _Wiimote_vec3b
VarSetCapacity(vec3b,3)
if ErrorLevel := DllCall(_Wiimote_vec3b, "Ptr", &vec3b)
return 0
return {
(Join,
x: NumGet(vec3b, 0, "UChar"),
y: NumGet(vec3b, 1, "UChar"),
z: NumGet(vec3b, 2, "UChar")
)}
}