1

Тема: Библиотека для Wii Remote

Доброе время суток всем присутствующим на форуме!

Появился интерес глубже изучить AutoHotkey, тем более появился повод - приобретение контроллера Wii Remote и огромное желание подключить его к PC прозрачно с помощью AHK.

"Нагуглившись" хочу вынести на обозрение что у меня в итоге выходит:

  • Библиотека для работы с контроллером Nintendo Wii Remote - WiimoteLib. С которой идет сама WiimoteLib.dll и обширная справка.

  • Вызов функций в Dll.

  • Как примеры - библиотека для использования Xbox 360 геймпада.

Если я правильно понимаю, то получается реальным написать что-то подобное "XInput - Xbox 360 Controller API", но для Wiimote? Чтобы в полную меру раскрыть возможности контроллера в AutoHotkey.

Идеи, мысли, пожелания и конструктивная критика приветсвуются. Пока все в очень зачаточном состоянии, так как я не силен в программировании, но буду стараться.

2

Re: Библиотека для Wii Remote

Понимаете, какая тут проблема. Пройдя по ссылке, я увидел, что данный девайс предназначен для тех, кто увлекается играми. В этой ветке таковых немного, соответственно, он мало у кого имеется. Говорить же беспредметно имеет мало смысла. Кроме того, практика показала, что увлекающиеся играми чрезвычайно редко имеют желание подробно изучать программирование (даже и в своих целях), а предпочитают просто получать ответы. Посему не вижу особых перспектив для этой темы, а по-хорошему она вообще должна быть в соседней ветке.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: kharlashkin, 2014-12-25 18:51:56)

Re: Библиотека для Wii Remote

teadrinker пишет:

Понимаете, какая тут проблема. Пройдя по ссылке, я увидел, что данный девайс предназначен для тех, кто увлекается играми. В этой ветке таковых немного, соответственно, он мало у кого имеется. Говорить же беспредметно имеет мало смысла. Кроме того, практика показала, что увлекающиеся играми чрезвычайно редко имеют желание подробно изучать программирование (даже и в своих целях), а предпочитают просто получать ответы. Посему не вижу особых перспектив для этой темы, а по хорошему она вообще должна быть в соседней ветке.

Уже после публикации сообразил, удалить здесь пересоздать там, или как-то можно перенести?

P.S. Хотя девайс и используется в основном для игр, но из-за относительной дешевизны существует довольно много проектов сделанных на нём, которые к играм практически не относятся.

4

Re: Библиотека для Wii Remote

Перенёс.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: Библиотека для Wii Remote

teadrinker пишет:

Перенёс.

Спасибо - так будет лучше

6 (изменено: kharlashkin, 2014-12-27 04:06:01)

Re: Библиотека для Wii Remote

Нашел ещё интересную библиотеку, и она вроде имеет API - WiiUse. Если я правильно понял что из wiiuse.dll можно будет вызывать нужные функции с помощью DllCall?
Кстати, так же нашел HID-драйвер , который переставляет контроллер в Windows как игровое устройство с осями и кнопками. На него уже AHK можно повесить без проблем

7

Re: Библиотека для Wii Remote

kharlashkin пишет:

Нашел ещё интересную библиотеку, и она вроде имеет API - WiiUse. Если я правильно понял что из wiiuse.dll можно будет вызывать нужные функции с помощью DllCall?

А там есть dll? Такое впечатление, что она в исходном коде распространяется.

8 (изменено: kharlashkin, 2014-12-27 11:55:25)

Re: Библиотека для Wii Remote

YMP пишет:

А там есть dll? Такое впечатление, что она в исходном коде распространяется.

Именно для 0.14.0 (которую нашел поздно ночью и плохо соображая) пока не нашел, а вот для 0.12.0 есть на sourceforge.

9

Re: Библиотека для Wii Remote

Хм... Нашел вот что - скрипт работы с Wiimote AutoIt. Известно, что AutoIt имеют одни корни с AutoHotkey - соответственно можно попробовать использовать этот функционал.

10

Re: Библиотека для Wii Remote

Итак, делаюсь соображениями и прошу помощи у гуру
Решил пока попробовать управлять 4-мя светодиодами контроллера Wiimote, т.е. включать/выключать светодиоды по нажатию кнопок.
Документацией по wiiuse пользуюсь отсюда.
Начал писать свою библиотеку по аналогии Xinput.ahk.

Первое - нужно найти контроллер (wiiuse_find):

+ открыть спойлер
WIIUSE_EXPORT int wiiuse_find    (    struct wiimote_t **     wm,
int     max_wiimotes,
int     timeout     
)    

Find a wiimote or wiimotes.

Parameters:
wm An array of wiimote_t structures.
max_wiimotes The number of wiimote structures in wm.
timeout The number of seconds before the search times out.
Returns:
The number of wiimotes found.
See also:
wiimote_connect()
This function will only look for wiimote devices.
When a device is found the address in the structures will be set.
You can then call wiimote_connect() to connect to the found
devices.

Второе - подключить его (wiiuse_connect):

+ открыть спойлер
WIIUSE_EXPORT int wiiuse_connect    (    struct wiimote_t **     wm,
int     wiimotes     
)    

Connect to a wiimote or wiimotes once an address is known.

Parameters:
wm An array of wiimote_t structures.
wiimotes The number of wiimote structures in wm.
Returns:
The number of wiimotes that successfully connected.
See also:
wiiuse_find()
wiiuse_connect_single()

wiiuse_disconnect()

Connect to a number of wiimotes when the address is already set in the wiimote_t structures. These addresses are normally set by the wiiuse_find() function, but can also be set manually.

Третье - сделать управление светодиодами (wiiuse_set_leds):

+ открыть спойлер

WIIUSE_EXPORT void wiiuse_set_leds    (    struct wiimote_t *     wm,
int     leds     
)    

Set the enabled LEDs.

Parameters:
wm Pointer to a wiimote_t structure.
leds What LEDs to enable.
leds is a bitwise or of WIIMOTE_LED_1, WIIMOTE_LED_2, WIIMOTE_LED_3, or WIIMOTE_LED_4.

Четвертое - отключить контроллер (wiiuse_disconnected):

+ открыть спойлер
WIIUSE_EXPORT void wiiuse_disconnected    (    struct wiimote_t *     wm     )     

The wiimote disconnected.

Parameters:
wm Pointer to a wiimote_t structure.

Определение светодиодов:

+ открыть спойлер

WIIMOTE_LED_NONE := 0x00
WIIMOTE_LED_1 := 0x10
WIIMOTE_LED_2 := 0x20
WIIMOTE_LED_3 := 0x40
WIIMOTE_LED_4 := 0x80

Теперь нужно правильно описать вызовы через DllCall.

Wiimote_Init(dll="wiiuse")
{
    global
    if _Wiimote_hm
        return
        
    WIIMOTE_LED_NONE := 0x00
    WIIMOTE_LED_1 := 0x10
    WIIMOTE_LED_2 := 0x20
    WIIMOTE_ED_3 := 0x40
    WIIMOTE_LED_4 := 0x80
    
    _Wiimote_hm := DllCall("LoadLibrary" ,"str",dll)
    
    if !_Wiimote_hm
    {
        MsgBox, Failed to initialize Wiimote: %dll%.dll not found.
        return
    }
    
*/
Тут должны быть вызовы wiiuse_find, wiiuse_connect, wiiuse_disconnect и wiiuse_set_leds
*/

Wiimote_Term() {
    global
    if _Wiimote_hm
        DllCall("FreeLibrary","uint",_Wiimote_hm), _Wiimote_hm := 0
}

11

Re: Библиотека для Wii Remote

Да, о помощи - подскажите как правильно вызывать. Прочитал и посмотрел довольно много всяких примеров, но чего-то сомневаюсь я.
Так же видно, что везде используется параметр - "wm" (Pointer to a wiimote_t structure) - его так же нужно добавить как через DllCall.

12

Re: Библиотека для Wii Remote

Описания на человеческом языке, что делают функции, и как вообще работать с библиотекой, я так понимаю, нет?

13

Re: Библиотека для Wii Remote

YMP пишет:

Описания на человеческом языке, что делают функции, и как вообще работать с библиотекой, я так понимаю, нет?

Не совсем понял что Вы имеете ввиду.
Под спойлерами разве не то, что нужно?

14 (изменено: YMP, 2014-12-30 17:38:16)

Re: Библиотека для Wii Remote

Там определения функций из заголовочного файла. Я имел в виду какое-то общее описание от разработчика. Например, как описания функций Windows API на MSDN. Ну и какое-то вводное описание, как начать работать с библиотекой, как закончить.

Хотя по ссылке в посте 6, как я вижу, есть описания функций. Разве что там более поздняя версия.

15

Re: Библиотека для Wii Remote

YMP пишет:

Хотя по ссылке в посте 6, как я вижу, есть описания функций. Разве что там более поздняя версия.

Так по моей ссылке тоже такое есть

16 (изменено: YMP, 2014-12-30 18:16:48)

Re: Библиотека для Wii Remote

kharlashkin пишет:

Так же видно, что везде используется параметр - "wm" (Pointer to a wiimote_t structure) - его так же нужно добавить как через DllCall.

Это разная вещь в разных функциях. Там, где одна звёздочка, это указатель на структуру, а там, где две — указатель на массив указателей на такие структуры. Зря автор название одинаковое использует.

Сначала, я так понимаю, нужно вызвать wiiuse_init, чтобы создались эти структуры, и получить указатель на массив их указателей.


wm_array_ptr := DllCall( "wiiuse.dll\wiiuse_init", "int", wm_count, "cdecl ptr" )
; Получить из массива указатель на первую структуру.
wm_ptr := NumGet( wm_array_ptr + 0, 0, "ptr" )

Если это прокатит, тогда можно и дальше идти.

17

Re: Библиотека для Wii Remote

YMP пишет:

Если это прокатит, тогда можно и дальше идти.

Не совсем понял что должно было произойти Ошибок не было никаких, "ToolTip" так же ничего не выдал...

18

Re: Библиотека для Wii Remote

По идее нужно посмотреть, чтобы ErrorLevel после DllCall был равен 0. Ну, а возвращённое значение, наоборот, не равно 0. Хотя я не знаю, как ведёт себя wiiuse_init в случае ошибки. По логике, должна бы 0 вернуть.

Имея указатель на массив и указатель на структуру, уже можно вызывать другие функции.

Насколько я понимаю, сначала вызывается wiiuse_init, чтобы создать нужное количество структур и инициализировать их. Потом wiiuse_find, чтобы найти устройства и записать их данные в эти структуры. Потом wiiuse_connect, чтобы подключить устройства. После этого с ними можно работать. Такова рабочая гипотеза на данный момент.

Если у вас одно устройство, тогда что-нибудь вроде этого:


wiiuse_handle := DllCall( "LoadLibrary", "str", "wiiuse.dll", "ptr" )
wm_array_ptr := DllCall( "wiiuse.dll\wiiuse_init", "int", 1, "cdecl ptr" )
wm_found := DllCall( "wiiuse.dll\wiiuse_find", "ptr", wm_array_ptr, "int", 1, "int", 10, "cdecl int" )
wm_connected := DllCall( "wiiuse.dll\wiiuse_connect", "ptr", wm_array_ptr, "int", 1, "cdecl int" )

WIIMOTE_LED_NONE    := 0x00
WIIMOTE_LED_1       := 0x10
WIIMOTE_LED_2       := 0x20
WIIMOTE_LED_3       := 0x40
WIIMOTE_LED_4       := 0x80

wm_ptr := NumGet( wm_array_ptr + 0, 0, "ptr" )

DllCall( "wiiuse.dll\wiiuse_set_leds", "ptr", wm_ptr, "int", WIIMOTE_LED_1 | WIIMOTE_LED_2, "cdecl" )
Sleep, 2000
DllCall( "wiiuse.dll\wiiuse_set_leds", "ptr", wm_ptr, "int", WIIMOTE_LED_NONE, "cdecl" )

; Ну и так далее...

Проверки возвращаемых значений я не стал писать, чтобы не загромождать пример. Какой таймаут имеет смысл ставить в wiiuse_find, мне неизвестно. Поставил 10 чисто с потолка.

19

Re: Библиотека для Wii Remote

YMP пишет:

Если у вас одно устройство, тогда что-нибудь вроде этого:

Скрипт не заработал, но я сомневался что он будет правильным - как говорится "первый блин"...

Нашел реализацию wiiuse python, проверил - скрипты рабочие, обращение к dll правильные. При чем весь функционал в одном скрипте и разработчиком заявлено - что это просто оболочка. Сижу разбираюсь.

20

Re: Библиотека для Wii Remote

Начал вчера разбираться, хочу совета спросить что-ли.

Итак код библиотеки 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")
    )}
}

21 (изменено: kharlashkin, 2015-01-13 13:44:59)

Re: Библиотека для Wii Remote

Докопался до библиотеки создания структур в AutoHotkey - _Struct, наверное это как раз то, чего не хватало "до полного счастья"

22

Re: Библиотека для Wii Remote

Прошу помощи разжевать структуры - примеров мало и что-то малопонятны они мне...
Думаю попробовать двигаться в каком направлении - скрипт python переписываю под AHK. Туда же добавляю все необходимые вызовы dll.
Может кто подскажет примером добавление дубликата структуры?

23

Re: Библиотека для Wii Remote

В AHK понятие "структура" используется исключительно в контексте работы с DllCall. Скрипт на Python разбирать не готов, могу привести пример в рамках AHK.

kharlashkin пишет:

Может кто подскажет примером добавление дубликата структуры?

Что имеется в виду под «дубликатом структуры»?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24

Re: Библиотека для Wii Remote

kharlashkin пишет:

Думаю попробовать двигаться в каком направлении - скрипт python переписываю под AHK. Туда же добавляю все необходимые вызовы dll.

Сомнительное направление. Лучше двигаться шаг за шагом, добиваясь успешного вызова той или иной функции. Так постепенно сформируете свою библиотеку. Конечно, можно подглядеть, как то или это сделано на каких-то других языках, если непонятно, как делать. Но не всё чохом переводить.

Конечно, это дело хозяйское. Лично за себя скажу, что Питоном не владею, так что в переводе помочь не смогу.

25

Re: Библиотека для Wii Remote

YMP пишет:

Сомнительное направление. Лучше двигаться шаг за шагом, добиваясь успешного вызова той или иной функции. Так постепенно сформируете свою библиотеку. Конечно, можно подглядеть, как то или это сделано на каких-то других языках, если непонятно, как делать. Но не всё чохом переводить.

Конечно, это дело хозяйское. Лично за себя скажу, что Питоном не владею, так что в переводе помочь не смогу.

Я как бы в ступоре сейчас нахожусь. Хочется понять куда копать и что делать.

26

Re: Библиотека для Wii Remote

teadrinker пишет:

Что имеется в виду под «дубликатом структуры»?

Насколько я понял из _init_.py, там создаются python структуры, аналогичные C-шным, которые заполняются данными при вызове функций из API, если не прав поправьте меня.
Пример дубликат структуры в python:

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)

27 (изменено: kharlashkin, 2015-01-14 13:47:54)

Re: Библиотека для Wii Remote

Хотя наверное можно и не создавать дубликаты, а считать её непосредственно из dll.

_Wiiuse_hm                := DllCall("LoadLibrary", "Str", dll)
_Wiimote                := DllCall("GetProcAddress", "Ptr", _Wiiuse_hm, "AStr", "wiimote_t")

Wiimote()
{
    global _Wiimote
    
    VarSetCapacity(wiimote,78)    
    
    if ErrorLevel := DllCall(_Wiimote, "UInt", &wiimote)
        return 0

    return {
    (Join,
        unid:                NumGet(wiimote, 0, "Int")
        bdaddr:                NumGet(wiimote, 4, "Int*")
        bdaddr_Str:            NumGet(wiimote, 8, "UChar")*16
        out_sock:            NumGet(wiimote, 27, "Int")
        in_sock:            NumGet(wiimote, 31, "Int")
        state:                NumGet(wiimote, 35, "Int")
        leds:                NumGet(wiimote, 39, "UChar")
        battery_level:        NumGet(wiimote, 40, "Float")
        flags:                NumGet(wiimote, 42, "Int")
        handshake_state:    NumGet(wiimote, 46, "UChar")
        read_req:            NumGet(wiimote, 47, "UInt*")
        accel_calib:        StrGet(wiimote, 50, "Str")
        orient:                StrGet(wiimote, 53, "Str")
        gforce:                StrGet(wiimote, 57, "Str")
        ir:                    StrGet(wiimote, 59, "Str")    
        btns:                NumGet(wiimote, 57, "UShort")
        btns_held:            NumGet(wiimote, 57, "UShort")
        btns_released:      NumGet(wiimote, 57, "UShort")
        orient_threshold:   NumGet(wiimote, 57, "Float")
        accel_threshold:    NumGet(wiimote, 35, "Int")
        lstate:                StrGet(wiimote, 57, "Str")
        event:                NumGet(wiimote, 27, "Int")
        event_buf:            NumGet(wiimote, 8, "UChar")*32
    )}
}

Если такой вариант правильный. подскажите как правильно посчитать размеры (может есть табличка - а то разрозненными кусками по интурнету искать сложно)?

28

Re: Библиотека для Wii Remote

Так это от задачи зависит. Я могу привести пример для какой-либо функции из WinApi, если скажете, какая именно интересует.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

29

Re: Библиотека для Wii Remote

Есть ведь сишные определения этих структур, верно? Там типы понятные, размеры не проблема узнать. Зачем с Питоном путаться?

30

Re: Библиотека для Wii Remote

YMP пишет:

Есть ведь сишные определения этих структур, верно? Там типы понятные, размеры не проблема узнать. Зачем с Питоном путаться?

Вот и спрашиваю табличку С-шных значений и AHK-соответсвий.

teadrinker пишет:

Так это от задачи зависит. Я могу привести пример для какой-либо функции из WinApi, если скажете, какая именно интересует.

По WinAPI нашел очень много всего ещё на этапе копания по DllCall - AHK_DllCall_WinAPI
Но сходу не нашел структуру включающую в себя другую структуру (которая используется и в другом месте).

31

Re: Библиотека для Wii Remote

Таблички нет, но по каким-то конкретным типам могу подсказать.

32

Re: Библиотека для Wii Remote

Вообще-то есть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

33

Re: Библиотека для Wii Remote

Ну, если этого хватит, то отлично.

34 (изменено: kharlashkin, 2015-01-14 14:21:20)

Re: Библиотека для Wii Remote

teadrinker пишет:

Вообще-то есть.

Да ну эту "табличку", я уже почти на память помню Но размеров то там нет. (т.е. UChar = 1, FLOAT = 4 и т.п.)

Заканчиваем оффтопить, а то сейчас teadrinker накажет

35

Re: Библиотека для Wii Remote

Как так нет? Читаем:

Char An 8-bit integer, whose range is -128 (-0x80) to 127 (0x7F). An unsigned character (UChar) can be used with functions that expect a BYTE.

8-bit integer — это и есть размер, 8 бит = 1 байт.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

36

Re: Библиотека для Wii Remote

kharlashkin пишет:

Заканчиваем оффтопить, а то сейчас teadrinker накажет

Сам себя?

37 (изменено: kharlashkin, 2015-01-14 14:44:50)

Re: Библиотека для Wii Remote

teadrinker пишет:

Как так нет? Читаем:

Char An 8-bit integer, whose range is -128 (-0x80) to 127 (0x7F). An unsigned character (UChar) can be used with functions that expect a BYTE.

8-bit integer — это и есть размер, 8 бит = 1 байт.

Точно. Спасибо!

Теперь если "вернуться к нашим баранам", а именно к библиотеке Xinput от уважаемого Lexikos:
1. _XInput_hm - указатель на dll.
2. _XInput_GetState - указатель на функцию, при вызове которой получаем указатель на структуру XINPUT_STATE.
3. И соответственно считываем данные этой структуры и разбираем по байтово:

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")
    )}

Если я правильно себе это представляют - то нужно делать по аналогии?

38

Re: Библиотека для Wii Remote

Начал приводить в нормальный вид библиотеку (аналог Xinput), появилось несколько вопросов:
1. Каким образом читать структуру expansion_t:

int     type
union {
   struct nunchuk_t   nunchuk
   struct classic_ctrl_t   classic
   struct guitar_hero_3_t   gh3
} 

2. Каким образом сделать вот это, я так понимаю нужно считать 18 байт:


WCONST char wiimote_t::bdaddr_str[18]
readable bt address

39 (изменено: kharlashkin, 2015-01-15 12:33:47)

Re: Библиотека для Wii Remote

kharlashkin пишет:

1. Каким образом читать структуру expansion_t:

int     type
union {
   struct nunchuk_t   nunchuk
   struct classic_ctrl_t   classic
   struct guitar_hero_3_t   gh3
} 

Сегодня открылись доки по _Struct (вчера было недоступно), там есть описание каким образом сделать с помощью этой библиотеки в union вставить внутрь структуры.

+ открыть спойлер

Union
Using {} you can create union, for example:
AHKVar:="{Int64 ContentsInt64,Double ContentsDouble,object},...

Struct
Using struct{} you can create structures in union.

Так есть упоминание о вложении структур в структуры, но непонятно мне, кому понятно поделитесь примером с комментариями.

+ открыть спойлер

Same way you can have a structure in structure so you can call for example Label.NextLabel.NextLabel.JumpToLine

kharlashkin пишет:

2. Каким образом сделать вот это, я так понимаю нужно считать 18 байт:


WCONST char wiimote_t::bdaddr_str[18]
readable bt address

С этим что поделать - не знаю.

40 (изменено: kharlashkin, 2015-01-16 17:56:12)

Re: Библиотека для Wii Remote

Предыстория: сегодня свалилось письмо в почту от мелокомягких как обычно с новостями и прочей лабудой. Пройдя по ссылке с конкурсом игр с поддержкой геймпада и просмотрев пару уроков заинтересовался "А есть ли библиотека для Unity под Wiimote?".
Нашлась такая - называется UniWii, и вроде как намного проще функции, без сложных структур и прочего. Надо попробовать вызывать функции из неё - может так:

Wiimote_start := DllCall("uniwii.dll\wiimote_start")
Wiimote_count := DllCall("uniwii.dll\wiimote_count", "Cdecl Int")
Wiimote_rumble := DllCall("uniwii.dll\wiimote_rumble", "Int", Wiimote_count, "Float", 2)

41

Re: Библиотека для Wii Remote

kharlashkin пишет:

Нашлась такая - называется UniWii, и вроде как намного проще функции, без сложных структур и прочего. Надо попробовать вызывать функции из неё - может так:

+ открыть спойлер
Wiimote_start := DllCall("uniwii.dll\wiimote_start")
Wiimote_count := DllCall("uniwii.dll\wiimote_count", "Cdecl Int")
Wiimote_rumble := DllCall("uniwii.dll\wiimote_rumble", "Int", Wiimote_count, "Float", 2)

Не взлетело...

Копаясь, нашел вот такой отзыв о wiiuse:

if you will use multiple wiimotes, don't use wiiuse library. i am working on a stereo system with two wiimotes using wiiuse library but wiiuse made me crazy( it gives delayed ir tracking data ) and i decided to change my library wiiuse from wiiyourself

+ мнение

Кстати тестируя примеры для wiiuse из консоли на С и python, видел что связь между контроллером и ПК действительно "не внушает доверия" и довольно часто пропадают пакеты.

Исследую библиотеку wiiyourself.