From d8b879a4ee844b693af2d7af85e2cd3d6d2712b3 Mon Sep 17 00:00:00 2001 From: Matthew Parlane Date: Thu, 15 Nov 2012 01:09:25 +1300 Subject: [PATCH] Movd back to libusb for full support on windows --- Externals/libusb/include/hidapi.h | 384 ------------------ Externals/libusb/win32/hidapi.lib | Bin 51150 -> 0 bytes Externals/libusb/x64/hidapi.lib | Bin 53880 -> 0 bytes Source/Core/Common/Src/Log.h | 2 +- .../Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp | 381 ++++++----------- .../Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h | 25 +- Source/VSProps/Dolphin.x64.props | 2 +- 7 files changed, 143 insertions(+), 651 deletions(-) delete mode 100644 Externals/libusb/include/hidapi.h delete mode 100644 Externals/libusb/win32/hidapi.lib delete mode 100644 Externals/libusb/x64/hidapi.lib diff --git a/Externals/libusb/include/hidapi.h b/Externals/libusb/include/hidapi.h deleted file mode 100644 index 3cd829b54a..0000000000 --- a/Externals/libusb/include/hidapi.h +++ /dev/null @@ -1,384 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 8/22/2009 - - Copyright 2009, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ - -/** @file - * @defgroup API hidapi API - */ - -#ifndef HIDAPI_H__ -#define HIDAPI_H__ - -#include - -#ifdef _WIN32 - #define HID_API_EXPORT __declspec(dllexport) - #define HID_API_CALL -#else - #define HID_API_EXPORT /**< API export macro */ - #define HID_API_CALL /**< API call macro */ -#endif - -#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/ - -#ifdef __cplusplus -extern "C" { -#endif - struct hid_device_; - typedef struct hid_device_ hid_device; /**< opaque hidapi structure */ - - /** hidapi info structure */ - struct hid_device_info { - /** Platform-specific device path */ - char *path; - /** Device Vendor ID */ - unsigned short vendor_id; - /** Device Product ID */ - unsigned short product_id; - /** Serial Number */ - wchar_t *serial_number; - /** Device Release Number in binary-coded decimal, - also known as Device Version Number */ - unsigned short release_number; - /** Manufacturer String */ - wchar_t *manufacturer_string; - /** Product string */ - wchar_t *product_string; - /** Usage Page for this Device/Interface - (Windows/Mac only). */ - unsigned short usage_page; - /** Usage for this Device/Interface - (Windows/Mac only).*/ - unsigned short usage; - /** The USB interface which this logical device - represents. Valid on both Linux implementations - in all cases, and valid on the Windows implementation - only if the device contains more than one interface. */ - int interface_number; - - /** Pointer to the next device */ - struct hid_device_info *next; - }; - - - /** @brief Initialize the HIDAPI library. - - This function initializes the HIDAPI library. Calling it is not - strictly necessary, as it will be called automatically by - hid_enumerate() and any of the hid_open_*() functions if it is - needed. This function should be called at the beginning of - execution however, if there is a chance of HIDAPI handles - being opened by different threads simultaneously. - - @ingroup API - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_init(void); - - /** @brief Finalize the HIDAPI library. - - This function frees all of the static data associated with - HIDAPI. It should be called at the end of execution to avoid - memory leaks. - - @ingroup API - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_exit(void); - - /** @brief Enumerate the HID Devices. - - This function returns a linked list of all the HID devices - attached to the system which match vendor_id and product_id. - If @p vendor_id and @p product_id are both set to 0, then - all HID devices will be returned. - - @ingroup API - @param vendor_id The Vendor ID (VID) of the types of device - to open. - @param product_id The Product ID (PID) of the types of - device to open. - - @returns - This function returns a pointer to a linked list of type - struct #hid_device, containing information about the HID devices - attached to the system, or NULL in the case of failure. Free - this linked list by calling hid_free_enumeration(). - */ - struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); - - /** @brief Free an enumeration Linked List - - This function frees a linked list created by hid_enumerate(). - - @ingroup API - @param devs Pointer to a list of struct_device returned from - hid_enumerate(). - */ - void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs); - - /** @brief Open a HID device using a Vendor ID (VID), Product ID - (PID) and optionally a serial number. - - If @p serial_number is NULL, the first device with the - specified VID and PID is opened. - - @ingroup API - @param vendor_id The Vendor ID (VID) of the device to open. - @param product_id The Product ID (PID) of the device to open. - @param serial_number The Serial Number of the device to open - (Optionally NULL). - - @returns - This function returns a pointer to a #hid_device object on - success or NULL on failure. - */ - HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); - - /** @brief Open a HID device by its path name. - - The path name be determined by calling hid_enumerate(), or a - platform-specific path name can be used (eg: /dev/hidraw0 on - Linux). - - @ingroup API - @param path The path name of the device to open - - @returns - This function returns a pointer to a #hid_device object on - success or NULL on failure. - */ - HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path); - - /** @brief Write an Output report to a HID device. - - The first byte of @p data[] must contain the Report ID. For - devices which only support a single report, this must be set - to 0x0. The remaining bytes contain the report data. Since - the Report ID is mandatory, calls to hid_write() will always - contain one more byte than the report contains. For example, - if a hid report is 16 bytes long, 17 bytes must be passed to - hid_write(), the Report ID (or 0x0, for devices with a - single report), followed by the report data (16 bytes). In - this example, the length passed in would be 17. - - hid_write() will send the data on the first OUT endpoint, if - one exists. If it does not, it will send the data through - the Control Endpoint (Endpoint 0). - - @ingroup API - @param device A device handle returned from hid_open(). - @param data The data to send, including the report number as - the first byte. - @param length The length in bytes of the data to send. - - @returns - This function returns the actual number of bytes written and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); - int HID_API_EXPORT HID_API_CALL hid_write_report(hid_device *device, const unsigned char *data, size_t length); - - /** @brief Read an Input report from a HID device with timeout. - - Input reports are returned - to the host through the INTERRUPT IN endpoint. The first byte will - contain the Report number if the device uses numbered reports. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into. - @param length The number of bytes to read. For devices with - multiple reports, make sure to read an extra byte for - the report number. - @param milliseconds timeout in milliseconds or -1 for blocking wait. - - @returns - This function returns the actual number of bytes read and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds); - - /** @brief Read an Input report from a HID device. - - Input reports are returned - to the host through the INTERRUPT IN endpoint. The first byte will - contain the Report number if the device uses numbered reports. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into. - @param length The number of bytes to read. For devices with - multiple reports, make sure to read an extra byte for - the report number. - - @returns - This function returns the actual number of bytes read and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length); - - /** @brief Set the device handle to be non-blocking. - - In non-blocking mode calls to hid_read() will return - immediately with a value of 0 if there is no data to be - read. In blocking mode, hid_read() will wait (block) until - there is data to read before returning. - - Nonblocking can be turned on and off at any time. - - @ingroup API - @param device A device handle returned from hid_open(). - @param nonblock enable or not the nonblocking reads - - 1 to enable nonblocking - - 0 to disable nonblocking. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock); - - /** @brief Send a Feature report to the device. - - Feature reports are sent over the Control endpoint as a - Set_Report transfer. The first byte of @p data[] must - contain the Report ID. For devices which only support a - single report, this must be set to 0x0. The remaining bytes - contain the report data. Since the Report ID is mandatory, - calls to hid_send_feature_report() will always contain one - more byte than the report contains. For example, if a hid - report is 16 bytes long, 17 bytes must be passed to - hid_send_feature_report(): the Report ID (or 0x0, for - devices which do not use numbered reports), followed by the - report data (16 bytes). In this example, the length passed - in would be 17. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data The data to send, including the report number as - the first byte. - @param length The length in bytes of the data to send, including - the report number. - - @returns - This function returns the actual number of bytes written and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length); - - /** @brief Get a feature report from a HID device. - - Make sure to set the first byte of @p data[] to the Report - ID of the report to be read. Make sure to allow space for - this extra byte in @p data[]. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into, including - the Report ID. Set the first byte of @p data[] to the - Report ID of the report to be read. - @param length The number of bytes to read, including an - extra byte for the report ID. The buffer can be longer - than the actual report. - - @returns - This function returns the number of bytes read and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length); - - /** @brief Close a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - */ - void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device); - - /** @brief Get The Manufacturer String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get The Product String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get The Serial Number String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get a string from a HID device, based on its string index. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string_index The index of the string to get. - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen); - - /** @brief Get a string describing the last error which occurred. - - @ingroup API - @param device A device handle returned from hid_open(). - - @returns - This function returns a string containing the last error - which occurred or NULL if none has occurred. - */ - HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/Externals/libusb/win32/hidapi.lib b/Externals/libusb/win32/hidapi.lib deleted file mode 100644 index 7fbc90bbca71487e188cf871a337db918d55a809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51150 zcmY$iNi0gvu;bEKKm~@zrbgz5=H|whsNx1tuA!lUA%vO0#lXOz!oa|BXE0%V`*>%E zcmoq(R~I)|UvFOrdlhH*+{}1;6-P%02B@sLo4dECi>HgPLq=wby-7+=4vMrzfWMQE ztFMc@gNLV!b53G$F^aU4ql2rTr?->4r;CF}W{OLEaB7KLYGO%gQ7XDRHy3X=Zzo@G zh&p#1>RcS0o&0@W13Vnz>Ksc-iZYW*OH$FSc5`s{c60S|@`b1jPA%~-Eh#812}&)< zFDgN`-rd2&$u+>s&mHPa_tX;4yp+_6)Rf?oqRhN>bk%;&&VJthE(pg46r~m<78R$a zxFnV&VyO0Wa|`hDae_F+J+&mDC_kk%xdfZp9u6J>UVh&G-cV<|6{V))G2F+&&&SWp z$<^BfZn$q^UTIolGAN9Tu-V|_;P2|?=IZb13fB^xT9lcX<5!xSl!{G@pF@D7tBae5 zC)iB^@$RW5&WQ!k;EsoS#?yr%J}fmaCBF#7%E(NKPtM6NPGyJ(F;nwOb5n~FOJLlh zqWmJLOhsl1gq2p5ni>yNn31U`Q4~ z!X87s7#s%idEh`mk1_uTKC%vTNVu%QYG=xwnWCMf20lk#Ol0+m? zHUd?uz3at^h#1IN|1#87#J7?;}{s?p=y~J7#I`;0us>OC&0+SP#nj=&>RoZ z%nmY7K)?yzyc`AwhLiCO45kSXbu2i{>tJMHh)rN%cnWniFAnnz7#SGSlNcDLCqv9r z!C{^X69dEl6b1(6bci}xn0ZC00RytfH3OmsMmh)>IOw6N6K7yx2qHqA7y|=CCXwpu ziBKoNz`!t-NOenzPzQ3~RwC4iGB7ZlCPJMw0|UbYBGvsSLY*)J1A|y5EG8f{w)o&+ zU|`V1rVcGV>oG7e7-ljs#6#7BYI|(ynSqgkAv2SKAu|hNC$97iN^k447#J=?)!|Cd zUlNs(jw}6R(ApxYO2%?T3mOs$K4-~)CiWnF+Le=34zaIaxtbwS)Wu86*1Hx{=gO=EsP8dMokP1+nOQjK;0|r8B7ceFXuBbG%kXu1GN{x?n5(g9|HqJ`eFtK z)g=&hxboW@Mg|7oB@7If%OL7N{sNl^X(xt2L>U-B&BJV{8kiWUov5Iopzq@9<{0V| z;^XOLrBqs)nWC4InWRLNu#cycvu_BRT7MrGKSy8JU?l~8*N6cBpb#s_P)0>&391PC zzy+!-q!*7x42ux7gO4f$8e4#kC}7H8E(N; zggWekDUWUV1ydF3h!3iKDris%RR}b4gDL_WUrI$4h7adp3M+t;>_-L$24xlo24@CF zK~S=Dwu%WYPAw{q@l7l#$w)1a2`I|XN=+^)jtS4q1a+no3o>KMGxJjN%Zp>s`dAEB z3^sxc3JeVF44~Go^jt7Y|Pt#{kcGNLGYM`FT3~ySOUox`e`5?zy@Ox~?9@AR<{o*Ed8#*F9K4*S%6f zH?6>`peQvtvp7{jH!9hxJUJt=D82;DPRlO}PR=h#RnT?IC(3i^F{_~KmO_@svSdR8 z1HFQjBn4gf6b0Q7X9eBFyu_T!s#IMCU2uYijCooW6y@g@lql$WDmfF1NS91d7d%2C z*u`5x!>cqeRl&%>&_FZBGcP%(G$mCDWC)q5A(L_=5=(M&(~@J5O(N){U>9#t#)9Og zGIKoxM=I)%U??t1W&n+UBr_DGB$1S{;8`0Uj|>b9pt8bIfq_Aofn6{|kb!}P!Pz-J zIK;)-(Z`2D3@XS95_Ai2a|{jvi^CMNfy9F&gTaC#P{r&ZLEnIIXBSsz9|lpVCF>uN4OPX0 ztjgWh&o#&q;u(;o3>?9Z@d1fNiMgpIsYMKOP(7^3dOZEY9DO`p979~;zF|X_hj`4* z(bLD(1?)C`0R{#}hLC`GP-r?iI(x?l1bO-gd4@#B`}qg?I{JX)Xp$gERhVN?d@#tx z&J3aqyn>*95vZVNV1UnQh@l80W<5ahQ3MWnKYth3c&IBGIfMa}4nYR7AsYmDKLrz%JM#$iTqF5Ec^eX~ZA^<#T}ePQf8T;PgL5 zkb!}jA;Q-O6qq1`K794>lqyE>F3U%4b{R1*5VrB8XxTH;}##}>h2jF;u-|e7UJpa z>K_^c_BALZm>L)w!b0MMT!USM!dzXzB>>3R>|jGe{em6cTtP|0(aAq3gh2vo1qWEx z&(+l>KFHO{-yb5=1&*+g$lw51=XhUFUsq6+fc1c6m>HllZk|4_AkTu`0Fq&W$pi%X zyL-BTlMYCn6)x`R?Ct0d(F7{@+Q1e$`y&F~*U<~aGXlq2pCAK+5JPBDW_&=9e}HRH zNMwAJzaJzA)`4?BNX`S4H(mUK!Oj2)Gl8{$g*^kpOc;zA*adUIHi6QQk7Fb#ay;GR zgPk4yd_4VJh%>T>(qA2(@ZZ zwfx9x!2uT>>E{eec;GAtu9`pr3@dlRvF+;Tf~pD@2!a@fz|;;^P_wu80c2 z1-55OPHJ#QX-P_cc^-of)YVeR+MWIVLR|eqKpEIS*b`JuI);QeI(vXCLy%KsP*nQ_ zd%8F~`hgR)Ux+8D=>bbPvd9WOL;bw{{KNeai2+pkg3OacRtCwipn?FNrR9<3gB-&_ z9s?JXu=K5ftRNuBKO)k_H3XXNL5(_)C5p&uKs8eUD3!ar2E(mULRJB3fW!y8`h|ci z36K%Ws0w@o9Gyer1N?nFog?FeT%BD#L6rf_?<%N@LCu-?;Lw18AlKkvR~L9#s$o+W z;uzu@4{;-0p*l{5L9XBy2&kz7a-{}Ng#khSz5yW&deBJMLsl37s)>U^@eXZ!A$$Z2 zK?7v<;QS3rDM9`|a1#wtRA3|{SaHArE9Z=m)q`WzH6kRy$I;Wz*E84`-1>keaARbp z0ijMlp1~fjL5Q>j%TOlB>Oe`@$1xIAaUxWLTI8T`GDTJy9PASs5%1?1=H%n=?Ct6T z&lzSYszCL95WJd3mh(&JLWD!f-z~&oacnW3Z8CZ=eh8mP5VGPO)Jc1UeYB1J~F-S7- z2-+emf-mG^5NF^Kl!8m;WG2ODB<7{$q%ue_@CYivVub-ToR*oGlUbFT0&bI~fUDL3 z$Dm->cxOjHe?L!WM<359S8yK&B+0}8k#r04boF!biG=H7hDrpxI){S$W1&Gla7h-Z zWRSmq2)z9c>K1{FWQ9t?B|udmNP-p?T;n~1<3s&igPk3ry$g^M4yY1v4FgsJ zRRHSdf)sE<6$Chjc*MH}`TNF$+y#^6g35*l`9LH=%D`PnkX~-6EGVmkt0a&h4^$A` zn1<9;AYopZu(OA&uOr+DKA5m)2&8ceQp*n&bn*9f^z?%VtpHRQUYCL@9FTfJs02J{ zp&CKmRFJ$7R37SeP`{`G5|6>5@Qey77JCF47`PY$LtTR+L7@q*1ATm4U0nS_f+E2c zOBy(zySX}sga)}nJB#t4!V}c{0QG-C3K$t+3cw98S0C3fNHYlJV2}bPxB^hn#e-{g zkO44xW>ooLP{{+52bFao{VZ^K$gm-(?-CN^3GM?2Gl0rikSbP$Dpx0e=lB5sfY1P6 zM?Xh*NVgl*_X4S7gR66L^>7UH^bZOKH`qXO>~J|3&tOpVFy0q5qyTA3!ENGzs{+N1 zkFTS%2dHxZDtkfgY;Z>vWEv-29W1Jx9Q|CtEozW77hF2X6*PL_91`#79O4<~8Uc+7 zxP?5JDnYdo$TCoC3EcApnaB%Q=jh_%?-!5cdr)Hoq=XNy1lB@~hr3&!fn5-!h99oR zBP1jsJ~Y@h2viBh2RH@?hx-S)fV#|}zyY_=K^g?$8o-@LQ1d6mA3C%EYMp}A2*TBb z`Z>o3JBGQsfc)U>;p*(o0JB*LuE^ar1e7)7UHpCHLFzy`5tQG-dEW&*JOnaT7_K42 z(aFixCEh8>KOEGL0Qd1gDn#Haz_lc}y$=!>g^RD;ls7VAG1%stSakyeP{~%{q&UwU=#V35L<%&*2^NNmfr=TB7&BO@BTT6P0|&T<@c<`Y(C8Bn z1Bajz0|P^-kH4Qg13v?YAZU#Ohy%h5k_;Sz^8^_fN)po@3kq^FlM_oa^YcO~3sM=R z7&rvy2r@7Pc)IuodqM*)KFrZ4)D>(Fs3HTI5g!l|#30VVA*d?Ez!2c!>EaR(A59Bp z;AP+tWM*Mt@CgX>_XLgla0tce?R079|3#cRkM;>VKCO+QR)5Ry=6EsX?U|?X#pvk}?=mQR1NOU=a z#$7{PgWMdQUE^I`LmWMQz|j})$N&m2P*oORl9&#z%=`mD-9B(|vk5VPM*ibdQp+-v zQ{x%988`$%Ap(j+26+Y!!DvK^K()d##E}6MK%il%lEie#NEX<=9D)oC@#u*SwwlkjIxW$S`mSo(83K$5De8C5wPO2MRVwrUS)M z0Sf~|Sz>%nW^oBP?G%IZnun(gXeuQj7#yge5mK~#X#_4IK+`$Fj`5)67m`?%o(d^g zz%Bz1*f4-XuL_bd+J5MR0sqFhk_bX{(j&9WfK6UZf9^E0IGzJLbF?d zzrPPSK^HPGFoZjMI0k{O@)LsOH*lz+79U{Mpw$8aV7Gv>94ITtgV%1DnZ%cX4S-cn z;7|bd{a}e0rPmh^&Uv6T6pu9#fwI0L3j;#{BpZP;2{$N;{KG)w&H(|gF5uD$6m5uD zLocW?`^53!L+&5R_R^e1eo))EGFx!|Koh4P1lj44|?CR369UEGs}+22_0KCKZhKJ5m5iwBQpiwGlrxb(1;4W&I66sf^|Yl2S;~MSB(Qa zWml4z?&9z3m!FafZl{0>ebBgMNn$!|P!cQ-O8;<2p^qm(Dj`s|2DNL!h59*Yk_`6r z4e$Z=w0(R)lbK)#gJyh764N15pWsSggMmZvBvgkps3j5_5bqx39}3F4e$K8w@X1iH zCqVUm0Jypb)qSAA0EY#r1UmvV#1Ud&JT%T2Kuw}!FiB(^7(jM|s%5M(gi_>yY%5@3 z08QTpF@RDCX!ru06)*-a;=xH7R6c>5ir`iqD8a7=Rei9^Fg_k!D1lmVu=D{h=|L4a zXbKBfS~=&ZqgF}5nz%>`B4GRibM;{+&f4?xW8$s=I zPzeH_-tlt{fp%i{?lnjrTs}d|7*Lr4GTSc%GWP>+3cW`(g>v#CO(9Tm z0m{Ni8Ha&^0ko{Tf)g}9&A=eQxM#u68CJY&->5psF}Sb2vzmdyg8?MoBawb#dXT(? znGoyjz=Y$G3=F+s@%LZ(BOhitcy`FH&2dhs7h_-mEqfGTyy>a1JNRz3O?2j30Y9_Z z)eH=vWyJ!F>zDosT4U37W9h1X0TqT5$_xyCj3D!mmhJUrn>Q!e^oi^9iN~KzWMG&I z7O(hXFLsP?bwB$u&r6<_z7rT2?tsO2scw--oN>}doi&Gd$?spM7#Nh8K<1obiufnT zTojW3fbsvT`jV3j3|V0Dq{Ou+cpq+IPW)MPy!qYy2@DKtz~X`*rXP9!|Hr1->Ay=+o1gT?&|W12o32$D8F?Y<}F53eNy12-$k9NqK{cMozO7pxQT`fsOeUCF@U3l@J^ z+j2&PGwkcjz5If!`hz+d7$$+m-2|7i@~9nst!clcVAA8~iVO@l!Quy#gWlbkf1i8d z)+c49u?vM67?jvR=1+cm!lmF;p2b9UIlaoY$9^y{WP-&*6FasGZLWNrRCzCPbL*@9 z3=EsV;wJNFU*J#*dbQCtMT9d)>ox2F2gsa^9a1+#7AZSyQwj+3c|9+YfguJg9-R4XOPPKAX?Y{bD80;vE(V5W zU~#jy3!6)4PgoHASM0{w`&U&N7~X=#4L2$)xjt|xO8CFCG9~kP0Rw{xC&>IwnR$#B zR)wpTj`81Ai^y;gGSnW~VZv2rUU-dx;W$|R>$R#!`%~IuZ5OQF z@$?e+Y6b=#E|595G`(V#r=1p=*r-17+%w023=FYg@hv;p<~=uMl~H{6iDAO86VVI| zYr*18S59Q#T_z?JRH6E-P4|fu1H)&qcs=h7E6-I^W=1~dopwa<LpGM7p4AOk}aSe$jk=734ghVP~=J#ry0N!@{g;S^YW(-P6cA6@wyzE=G( z68e066$66+56GNj)t4I1bKO|hy8M#4mBr6U28KAWczVE(&g0Wozvjvj{Jrsx;tU3c zrC{;eIgZv_3+A$KUu*or=kbfL3=FTq;+38nvw9a8R!{b>DbU!xqLhKbh!-hY7&$F{!|N4f3;V4+#^7GMWi%%$9m+s*< zcxzp^iGhKe4`fbs{|#r|D@Okw+-ZHY%IqFL1495nJ3~oaF8BAE^9&4g zz~ZyNooO?emv;Alqj{1VQG%Ua;=h z!8IF#W#)e1-6MNQl7RuVyg-1_>71%-u+Xt({YH0w_wU^4%D}J*tbV2t^R;Qc$JYLN zlf&3M^?@J*!*{TF;_gS@?T;LdH>`U0-{r`IRSXQEc8maHU0A{7r$5r)GkLepT)QZk ziGiU-2xRXLFOeTz93frTua>r`eRjIdz;F^QuEP58zPhlH^3D+6d&-g491INH!XWkQ zBPP#%{IBYd%epBqBVYAtGcW{z#To7#|GxQ5rdD<3r4!5FY!YK&m%RTYzP>IIZ&G@@x<2*xolrW;*bCh9WZ+au)t;xYq+ zxdh03CjJSxc+aai+|@T%wm%&_kAa~MEM9k2YenPTwc(<#8Gfr~Zn(|Ba11Q|q4?vj zg9YFI9hm+8o4l;%0R{#xNsu{}k_Cb5#N$@-Pj0K2cU?W0fgu1a9{TQO;W5+FmMtIN zZj+Ajw7ANH63-+OU?)sn19ObiSuVDXC|>bm!)Y3W~Ey;Ih5N!UvUhE-tk6)R@W zVyxlca=z0{-=e{N1_Q%Ku((R)){pw~hukF6s$Sgd(aL0CFqHu9QuW zjpdhn_>_U61}uK!R>8Z^N1n%dJo>ol;B+r#28PcJ3=E$^4gF-Rn1Z5w@bc+2q~+7O z@CDn&DcQyF72lvWs)?{QsvyziqRN62y$sMQY)XtNE=#7+kmA&$vVx-gGKevy;5F>I z&^7D@MbI_u<(cp`?2u*L&=u_vO=No@kLXY+%LK1QFGgC6UIt$?90MLKqtGqI8L2rr zi3OPy8dIK`my}qXN{lJ^{Zy8ilA2abj5&A`T5fU$g(l=DW~Sso%pjaL%AxxkAZw>7 z%pt|eiA5<8o5@aK}lQIMFNZAhVG zl2cNPC=HgB6r!>Uo+O^1lm$F$~;Qzn#|nP_~hLD6pFKCacW6v0p*2teoiXoX{Q+E z5Xz&xJTtF2H<{uRuecyJ8FKm&rNv%xVorQ%y2ZgNQxrCF<_EWeb}_7YOq zP{U{CnR!L2=@jO46gQO=WhPV8lcjl7Ntd8KixhgZC^fM-KaWB~Qi?LmQj5SLMxjZ? zDcLD0*=4DeR$rh@o1dIbv1`iWN%R~3LO-=4nHrr7P=k*`uR)s{78Dwjom!NannQHV z;}4zWq7o`JtwF8)l47D7sQ8^zoJeWe2ug(o`T0Z{gWoO5`6;R3?WV<<#WBVCrA5i9 ziFtYXCE%qtlvXGOMa3CJm2N5E{i+oT#VOee8d-?_s?aT>F+~N*lm}X7ZZ3t1GKosP z*W&VmqRhOKG>Thk$?2do4k#N_$jvRTEG|iqJd0)kpXDLF(n81U!P;*ylidtyf{G3!uJ(HJYY(QanW;&(qg!0V1Jfd3u z_>*liDEU+9qnxVLih{&EP`^zj#6Ur>C^0w{beO+_t%6EwW`P1oFb>QqhHy+2v=wX> z7(n90DppW2G6oxDqM)k)G7PL+B{iu4Y%tUokij5HusFzg2nTAd1;Sde0wm`Vqmg<} zz%WTc#mEHgI}1vEr=VhF05-{p;()?53hr(r8n_eFaCoSI4z8js(&2_v!{LyG2r~)p zN<$+mL>|O!s)R2jMH!ly!CXpqmO*$CVHi9_4Nc6c;c*PtVzU6ABn?f>&8QIC5KC!c z6x{U|22^k-Bui5x9#Kt#yOJttmyp@;WP~W27=E&X4sT*$;AZ#>WpObGurV-zj&9{< z5P`C|7;*&}7`#Boi82&ISzHXDO-rDoVYwMVTe3hbE{5%b3=B?Sb-SS~E(XvVE<3Q; z6F~+B5Q~d}S%`tb3M|GBWpOd63o$U5fyK0;EG`CDAqEB`uo!5Y2Z+VRkSxT&06GGi zn;{*_;$mnQVqnk$tLuicxENLoF)*ls#nwYvTnrb47#KjSthpJkKv`T2uZ0*GKu1q= zGrWhgxENT385lsviE=Y=Kv`T2H&_@L>>0wcOtKhXFfcGMbbl~D(0qg=Ag$AlqtlJ2 z(@mh$O{CLJqSH<0INSgK|NkF%1D%-45YXwS(CMZU(CMZT(CMc0A9Q>$L#LZT_p!Lc zpd;Kx7#J8t7@QeEr>QY8urYwnV*JX$z~BP11d2gNxI>v>>aa9qy);NI=s05^uqcA~ z06LQyY!c+GHqa^ECJg-Gz05FGATvRFeHj=S`a#RLArg71<=`_wA^XJ`WEg}%Cpbdn z7(gez!I=$A415fhf}rDLL1O$uprfnU7(OvDFo4!WDf@;$Y%@;HXs28@Y-$A zX~qnF3=9oC3=9kt85lqtpcrN_Ff@SD*(?Tz29UdEL*+rvV`l&zYz$&?Gt@AEPCEka z-QECYaWiazvbY#dKv~=jprf-vI=C1@yWa$6F=R3Hy8a2s0EG-B9s;r$G8lvz7$CfE z*FR~^77Qg?-T%{?EqF_0n-4I71WG@4hY1A1)pWWEbU%$fY6yhPsYUVNt^_zHL8gEuQHcg727U%MK^7qf25|;x#Pc$6gOdwr z_e6dH10Mso;Gh5h|ARKp^m748vH>AS2Hj)fNo&ez`)QD0hLc;U|;~rgTiYUG=)hr zfDS7KsQ|IK!H4jISX>MT7#J8pEN+G)P!<=%1t^OfyxRaI%f;{jE(W?N0wVSSE(Y4= z01*TE5X9nU;9-QA%*6n52{a8Z2Kl=60Dp@JBLhQNw<(AVmJaxT4K8PG51*;i)*v$~fYDOt*^NIg) zhcONMena}e_ZuE@hnr9QKMX3jg21^6bXYYgp4k{c20DS30aT8# zF@VwxsAOSd0EH+-9jFEZr4=@Codv4F*cbvBAhiJ-Lns3SIM=c<#4HU`i++7>+YAG;CyG0M(QYpc>^Q14F|-1_p*x3=9pR z8tF91Tt)_l%beO4lGATnvxkV$Yx~E^z38WVso>!Nr&uVRo=VSzO?B z4N)fs7gK_=xEVl4z=LGD7>wXzW>6LvgA`I2BH~!_&Ky?gWjZtr~s24ObomXY=WRRk1zxH>N_C@Ht=x?f(-Cu)xm8Yb+CE{ z1_z{8uLV>LM1kA^%C(?UQ3oWzz`$@FnrrVcFf@SbttSi&4Ipw3)0F3vA7^@g4P2i>;aI*>TytTgKa+sVHqC)*PW2s0+e$> ztx+}xP(VS%K$ei?@ZJ;^hHkd*I)wm8r_qli5W)x(2!b%&L?BXOU~cmf zk?!xU|4UED$Hg87-8hi~?jC}+|3g@yECXSIng$RSDB(d^pyUQBz(G7vz<@BQi36fR zav&PHO92vtHPb2x43NPAP%{Z64wK&qmIoylNaqrC<&YIxq=W1Psdr~! zVCV&p)UK_l<5>p74NRa6;hU?#H2hKCoBB zI*S34Quw#maWo&1X{Z%pC=u@F>veq-ki`%l90pMyT~<)njg0|x5fh{-47!R3luXzd7BDb?o6T&XE*!Wc zCBm?qfq?;(LPfx-43u6$jT2~8f*KnPpg|E>SpiC~po|JiPoRvvAM6qa@Qo56Jv_1u z3=&|IKm!5{44@_%vi@*cP`4J8h9J#^rD*!MfG&~)cOM|>8Pqs1Kugb{fdr5nK#iq& zsOcGU`3bmt4YC#FA`k`@t{|F$fuVtkL6U(LRw#n5O3hD$H)_E>YmnnWz3-ING6sGI zZb6Xdsh|W8y75ntfm;w17NDkSPHJ9yNd|)i1GgZ^GElKlTAUgWb^~bB76Yi;{^tMx z|Db*L`8i;PAj3g}UP+ZDsl{NWC8>GfN(_488N&={RK-YNECki*2#0P23_GBGrOt}x4E zVrT%hh6|Y>jocz8h6Yfxy^M*WVIl(qLk$x{1E`p;WnyRm71H%g3=L}`(b51KG-_pH zXxPcXz|h9T&~S)>fuVzm0o*9=WP(%(pawKMXkdW>#NuYy!@vM$aWTAMU|;}+Avd@L z0I|3j>Oi;7frlNNpe!ziJ}8TuVG@+Z#V`-b;$~O`WpOdAgR;08HbGfj3@4y0ZiX{Z z7PxHbb`|LM<>?OP$YKl#gp?1>M+9OIgVH9*nTV_fD&j!V0K%YR4@85~7l;OBEoSJb z9;ihHx*1C!E$M^wfYgBccAG%PgET^la&WQ(r+ly&CIKEIgp}W;ByV^T4;tZtnF?|T zC~1M*0`pT36GH=t-^;|%0CHa+G|E7uN02%k#Ddh}AQq(61Y$v2O&}Ipa57LaI6)U> znUNTr(EE{S6{_G46ro_91P#{7&|sYc4OUS34hdEe3lgj#7GyvS#DWZnfmq;R4Fpww z&2;Dp!?lPGMJBDsofl@{P&e}iL$IF)AXO!(cmv&z#|ExGLHFsgfm@o8 zsuI+o0o}95#sEr}p!6&PzUK{8xUn&;1{Hze(Hl@t9a0JZVqjo^ut1d~s3HYbtFRmc zI`IS~4yrsrVxZg(8X5$Nfx82Ykg;W$ys{i4+BXe z4SuIV`7rgM&H_kiDO5dZs1L+P)Sck02u}YXaR$fRI7u=hC#y9nHU;CaW#jD zp#c;|^PpLBArnIbr~|NwiJ<{Bmbe&NSuSN_XaG5F852VTs3E$NiJ<}1I9tWU&;Yul z^BNOF11Ni5XJTjo-8XrgiJ<|M<~A@fG=Tcko0u3HCNMBCY-VC;n8Luou#JhKVFm*O z14tdH!Mm4nu(zSG&*^UiJ{>o)I87_<#{HC2G9=l3rq|Rps_KKJSgpe>;u(Opt~+1jcyPN z(&z@UxEMeqMxYxmAtOd078gSxBLf3SmYX3I%Hm>3gtE99QlTs^hC(Qdo1qlS;$moo zvbY&qp)4+jiBJ|d_%tAp$y^Kz;bKdnEG~vUP!>1C0VoSx{B^r>bbGLLhYEbZDSa}q z+m|OO5LP${#2yBfSRf;@SJj}_CMW@b0s%yWGB2pA17#XeRSjxkqj$AIdO&JG6ERyb zGas3C3cj2LuBpKZ8M#gYxdW7tL2iLn)%T!v%6%q=29Wz6K~Qq zs1q6vs{mVIy+LpV8haR2wZ$F=IS4et#sbu3G=VISKFR>HG=Ro@K0td(AU-IJK@&@mf)T`m6pSDi7XvRN0|SV~%^(P6 zaWQB>S=BDSBOB1a!L!^!ok*m0JOU0f8Bl7`Yh` z0|!#b4KZGD!wcT-0*^HO3F!5Gff#8hxzp|X2i#OLXJ7!2qOdVI!Y9f>lXQ@@1!@F= zrr98A1C+{O1A3s41T6som7Aat0P#WD8Z;&VN@XA#q!U^GB)G`}l7%!`-Z6j{A)q!{ zKxTsUf^sKXsR_FJGc7f-q_ij%xm^yj0c1M}L(B%TK>d7Ni3ndA3hJ`IKy=w9v9w7_ zN{jMRQ^4&KP!kel+Zt%Q0yd!q>!ZWkA&7PcXsis>gaqjVVUT}8sS%WOKz;^^eTDYX znV2Dir5wx*4b}_{3|!2Ru`q6Ch6Yf|qMI!o+JWfyGw24*%Q6K1 zzuqkt^#6Ldn*dx&1~M`W8;9ipjlhBiZ9vTgr zAS_UN0Hs44PU7(I7bx4NA2jHVlJCJ3!(fK8OaDjgY1}Xki5dc*+_i4wFYO z8$mPs=-qaZognp~+_M9ss18zQW&jV@t1vS(fa(%e zX2=2%HD*WySe==n0pwQ=X2_@w=ptxH`3Pb`%1023i{Ul{0|SV~&2S&e;$nCWWpOjS zhqAaBenVN@4F91lE(UH!m|lJ;i;F=8%Hjr>vLKVesSh+l6AG?pdwCd;I|N=Tp~HIP~m4W7q<4%>s| zkrNWA(Fp28I%26rL3%-z=q}WR0xJHn+chDNjvG@@;x5p4&JXeVeyJ3=EG#0Nz*XzUjf z(I6HiqCqS!22iU2#Nr0K1H|HD0F_H17G#+gh(%UJgNis>NAw!-`Xtmw4XC8RldG{^ zMNYTqCMH+ALL=J)8rh!E$o7Ipwl_4g{h^WV2aRkH9~9Z30e(nigIJKr2C=xnQ*ngK)4*&s7P5pKx9z_16i7)QNTp2VmIjh}%671WZ0 zl;H7T^Wfz;TG0-gnnEkuL4g7C66iR1cv}FuXa~6;l;@E9NI}p<5DJa_FlGkuRDC!! z@*|iT8bGbF7-ohBP`F1kGcLnTJs>rpM$cZvEb1+8Xez_;cEv|tmm{Djf?z+ooPKqq(@8BSj*h z1=!$WWylx! zcMJ>-pq%g?x~%yt149F-zx+|dX|KqK1e*OQy zDOAq)c|NrNIJTG{>^~a00PD z4quei2~I+g6v1G8Aimr8kMUWsYS7FKM4U0q_&}CWcxUSoko~PEz~mV)c>zpb0h2et zY zKQjYE@M|XH|KYt;K{7$%;gB99RDan2>)pK|2}oxVv`pd#XkWo`X3!{oH$+b`OmXMj z0Fdd|K_;s(Gcfe_g8UPh#SnJ9HRacTP`?7Y>>H$liJ5_60>n1Z`Z-1hhTf@v{{8%)dm#{N1^tOUjbO~4qmP)l;DiP`mV6+NkEahuHz|?$@spV4X z6XOG~S)~s&-}v8ppj0j(g8^i0FGy2hKo)23RFH#$z^0aJc7q)Sail|FKv*Z34++86 z1N^NC|NsAg8N&pc^ac&nIAk$rF@SJyH4Ai(t@}pj+=O5M|2O~s&)=fT1oFXyU;qCH z1s`t((V!#?F)pp!l_Rb7Kq*_Ar7KT~T$*L;lVAV;^S6FvWMD|^cI8R4Y<&h6c)-ZO zkfoBvhzKx9Qu)x`3QCpDM>tv!l(2RdD7^oe zz}Us%&~mc$r}m-lAHDI6S&WcXGu^$Q_zrG9$PyUP$p&#KUpFK~j))v%;b(Zwb{w=8 zf&sh-rFZHdkYj=&js)!|>HYQZ|NoW)B|=asuo2BiSUTM}AUaw>Is%B&AwaSYk+g1b zG^BO9v7~kPf+C=sEv?g!Ev%P0WB43Jy7BdN&^hA2@Oy*81`1MWC`@P zf>J<0_;D}|DjT7`;OTUevD^!iEM$A1A_6sfAYxVUstYt3aTUCb2sD%mF$J_*8MOMF4cxc@ z%}%j_hXyW!Z37KfL6%T8L)K3-uz?qYoCnM9W@KOht?XxGP+L}2!PfWxWP+{M2i*_>8X93^@MH$*+7 zR?vVVNMUk*UI~K;VpSN39}gLr6Jda?m;oipvedkk{G#~G6!26v$gv<%ST{X0g+YOV zTM(2%K(_`#);Gsz=9Q!tr6ne(#)Id>)fu=2L8TIC2PLM8)RM%^9Ed_G25v!6l?aM< zxWcsj_~O(O1|bG+K~QlDT7{WhS_HaHjsesw0M#C#3u!>=LH7oNZ3IbxaxW<7fFzPr zq1^@0(l$_z1esElpI^ct%fKxNs*XXI@_53W?VOWXTZ5)ZoJi9rlBy#DY1 z|2EL_I`Hv}@p*~4so-UIpt2RTm9)ILqzEhksw+SjOeH546obP6PRp!Fjzq4TcCWh&bLr@di8?pfx(}Vp+SfVqF;jvqThgt0kn^#!IX)CA(N4zA&iNEA%~HnA)bi=v?8IQoQZ*< znvtPl2@?ZD2O~qnP9_G1PDX}?V@wPTU5pG3Cz%)+dKeiRPJ>!lj0_DInHWH|NyAen z28PLu3=J=t7#OB7GBo^U0^eiQz{1SHFpZI+fuEUyVLBs2gA_9Z!z@OI26biz&_cup zJ!S@m1t9-3Gl14NG&nIcfR-gT_%bsvEM{bANML4QSi;EAki^Wuu#AzRp^%w@VL2m1 zLpd`8!zxCGhAw6XhSiJ=4U?G}7}hW{G)!k^U|7q@(6Ex3fng&fL&F|s2GEkmhNH|3 z44XmjXJ%m7!pP8Y8&oEP!i|}MVJ9O)!*^x|hFy#d4ZoQg7PQFa^ruVpsrWaWgD|vbY#FKv~=j zTc9j1h67L*H^UJqi;Lj`l*P?(1P;s0j>E4vA7vn zSRf(E#UKD>aWjZOSzHVnP!>0X4wS{kpq85%&*0(d0I5n?7+Mch8iAGJ8}Pu{rv)1U>e?|dK>ALMpeFQz@a_+gCTk~K^N;_f z>|kZDjeC7}1VVcsEeA?ob-V894c!A<3JLDHlo*4RcKhytu3-etX@VzFV3U|EaTtzC z>vlZ^I54g)A(|ru3?F?GR0cksfnnI9PFKAa6 zs7WFM9;N}cwjjeakhU{uavCBA+Mof^0othqX$2<2+tZ+60GTPm09qXh8jE6M04?DL zjT(x8H(G#ZZrDJ(zQN}=urcg{?yMF8uW^C2de1Vz+M%F!IA{V^gaNb{8)6%1bs0n* z7b61$q%AJTh~6Rv=>pX_APm|F06NJ4S~)R*TBM*}1BefzLA5xtyg9gw2$E%BNC&N< zgPw!{5n*6x0?UKK1JdFI?Vv<&af0jwna#(@z|bWGas>#3H_m|fuz@$Ffm)m(i$PK# z3^5YKLT_>MB3hWKMMVsvDBO5hD+bgq1DOHZ_Xf5AB(UfI|Nkg$pB?}I|3_~7fGU2_ z*c8ZKSVIRiR}SLC8XBO@rXW77VF8+|0P$_14GGYCdk`PiumE*cKz!H~GN_;h@j>#S zh5>kj2At?Yq6`e+B?6$90cb-04pdB@39`{gjR~>~R-Fm5Xu%)4fdC{9iXScL+DKg{ zhK5cC1_lErh6d1*Z6hXzhRF;J48}|h4O1By7|fX%8bI4vESMM?7J>G2LpK!IFflZM zhKX&V8wl)}7#cwP@4cWK2z;0r8bG~2UnYhI(4?~;6J(by$Q_`q1CC4#4WM%YoR}CI zK$FeRptYW$mIo6<11SDM>OeKpE$|2}XcZ=i1)0hQu^>~~Ad?|e*&r4d18B!FC?vSS z(^?=F7lSz?0|Q70H-j~l#l_$bWpOijLs?u5;ZPPgLo}4d#gGnVaWiB?SzHX|P!>0+ zl>#=IiviR&g4odwmE{7pHNdjm471^4ptdVS-4?hQ=yZ;5SDtQPj^MC>Kwywzu?Q*?UH@QF1ZsVP>LC#ZP$~kAA&7u?VuE}r0xq*4VxV#WG-!?7>jkA3kT@uw zLCF_X#(>x$G0-SJXss=X4H5&%-&X*g`~nhzY|aDCRe^Xgc}-AZ3?58}j1PcX!pQQi zV0nmY&KTCYBGf(xkXu3dAJne~tycz#|Aub-V}vd>WnzLX z9bsmIEE!>Cf-DtbV`69k6{GA-4B(!FAQM9aXj!c!6GH=Nt)w(G|I08jG|XgRVBlq9 zXqXKe@nB+Tm=9X|&BV|E3O|r~P&oin4+=AodQg}=1m{~&^8v(yv?M_+E(RY)1_ls| zn*p?R3B=+8HD(yX7(_)2=U$#GA@Y-nJhSCEp#@X;YTKes?HGevstDhAM~Gc$t&Xjz+{0l4D{5z$L2N=+^) zO9h1>sC&uG7!B=dfkYr!FC{gpG+hOBpb7&>l9};`KLdDSC`2Aa>LnF}7Mg>Ypaw1j zGb3n94$MU%Kq&|`c?aq$f-q!5A7~Z}#A9aA1CJ#@w1CtyGlBxYCvvcU;s^@f_Naz#GqG_S^*kB0I30u(K9oGwl0EHx?XUd0?JJc49NZh*}}{S zng<58cObez`amquihB^v%Af%D8)WnhBm%-r4Drc{IXU^D+z#R^FreBFGLM-NG&TTo z*?pC615DdN)i5(-2P0%rEXWjg2AJ)jO>htqnC+mQULX+=2Kk5qyr2%m17U~=s0IV^ zKp53Mp!OIuBPa=grqQg6LNzem0~#-7W(18&!oryo?jF!;B9N(^@X!Ely#$#Bjlm*B z6oOJQGb3opAxOu^cc6`w5cfgGCqbehH4rh-A}r8^4yHMve8tQN+87PeAzpgu6X?__ z5Ssx!?h0ao)IiJuEfxfcV44GR2{R+8`J&fCmw_HIYbWwxOWXQ9i#>#7S0UX z5rxehkdK%dL9PPncu*Kx!c(>rh0HT?k5(%#5IN0Hk`A zMCloX$)J8SNED<7H7|p51T!OO5d~s0eg!ilXaW#a5`oMShv((TQ1^(# z^D?N%4N?QbsCI#RWz3AAd=4td4l$QQZ|_DfMM3RxW=2r!7G{?u+%7hdHgNw9R6>Hx z2ld)PGzg>G1&VQIMo{k&R0{Gvtp~S%P)lrZNx>Mw$N;xN8qQLM+9k~ZvMU~R_yEWf zFb0Vr*AAc(j+qg(dkIuBW=6zs!3;w=a5`MT#J~W`jUZ!W;dX&Wr63|8lR+$Z76$OS zbRd&K^$G(+9MnA^Sx8E#K@o}1MXy2Pb5nCcL+~IS3=m)BrsgIWfOc_##6Wf-`vNqr z!3<8}pp@%yzJ3)BTP4g z#v7PX!dVsWW*w->s$e%Gn+$5dAj-^Rq2g(nCWFp1V`c>DNvKO!6t)bYoH<^HfoswTB*#;2%5_TDbc#VO9|61P)W$l z*n-rK(uLbK4WtcxQW_}lfXrVA6#=nP?E-}rBE+UM2DxC`1#Yu4rZ9p|5CoaPz@QJe zYa7&LeXzffV;R&cCS)?Gy~)g&fMl{E+~mtplMOLU1}z{WWHRWKFlH1t8^cY04K>*q z!(`Cr6J|z``JnXU5$Mp185*F?V$6&cNNzTTo6HHxiVUV0CW8i&m>EGWKu`$wRyh}A znhe?}$IJ*CfrL7c!5nU~BGhDa43j~N#+VsFi?BfHc{a1kXH1hp%dwdmLFENV4afzS zaFcbQCR<{d4BGU;%m|vB0_9kBC8xcZCW8)4VP>4c#=roIZ;;8>aFflTCR>9|2FbZX zML=v&2s1EbvoSD$W-UN=K_tuB7#KkF84!{9;*z40d{CbPqz9CqK_Z~}OAsGYUm&+G zKx?m<8DZh)=knq&qIJ;;v48=jhKV6QzC5`&r4)411_Q(#kjZ)QiU(vDvdN(3Y0QkE zniFJm`trBW5hgE(nha6{@z*h^2uLkNS0xWJD!CGcU6wGchN#Dm8^6J`B9rz|(~xKA=xhOTUB-OPnHLoPx!O)B$z6kZOS*S9f{N%(O&|!BDCJay^xBQ~q z#1h}s;^M^g)NltQ3z&p^YKc!`afxeDQGStw0Yf~-;g9hinJEGB?x`itpxJnP`*>%E zcmqF&07q9BHxEx=2V`k`6-P%029OSyc#!=8MaakMLG?O$ICunj`FZ<$gEeDOiEIq` zKs{`xxI6ecJNtS2yLf|~-~w_Xigjp)pq}LibBeozhm&i7m!G=}+z=FnXokR!{)1_E zbZ~R=cJp@fMYsW~1X&}}8G#6mu6~~0PVSyidl5>IHG=&PP7=W-pv#IFVA|as{QTV9 z0=#^j;Le7o9f(3?L(tD2gqh*y;Oy<@>g5ED1THgPLq=wby-7+=4%9I4G!bOk z4J>Oxa;sZrPO2j~!-0-r1E0MI%acW^sZbk085JZA>L|s-);MM6=P`f}1&1uVVNgLk z!%D@%!qUb9c)n;WP=98P>?2+VRcXy zo|%`9kOlAK0IiLJ`60wP|tBaefueYy*y^6DYZe~0r4MX#eMS#DP zkE^eXy8~>Z9wH45B&Y-2Q%fM02Z5`gqRN1x{DRb?l1fNghlDy*t!rLsE<~|sURu6` zp%I#A;AX)Wqq%?=$T>O~!7DHMQ4uJwfr2!(s0cQH3lcJiCL@qy1_0B? B|55+| diff --git a/Externals/libusb/x64/hidapi.lib b/Externals/libusb/x64/hidapi.lib deleted file mode 100644 index 0626164cb7fa14c5b1a90f5220bb4afae60bd718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53880 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 loaded_devices; -static std::map loaded_devices_rev; -static std::map opened_devices; - - +#include "errno.h" CWII_IPC_HLE_Device_hid::CWII_IPC_HLE_Device_hid(u32 _DeviceID, const std::string& _rDeviceName) : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) { - //usb_init(); /* initialize the library */ - hid_init(); + usb_init(); /* initialize the library */ + } CWII_IPC_HLE_Device_hid::~CWII_IPC_HLE_Device_hid() { - hid_exit(); + for ( std::map::const_iterator iter = open_devices.begin(); iter != open_devices.end(); ++iter ) + { + usb_close(iter->second); + } + open_devices.clear(); } bool CWII_IPC_HLE_Device_hid::Open(u32 _CommandAddress, u32 _Mode) { - Dolphin_Debugger::PrintCallstack(LogTypes::WII_IPC_HID, LogTypes::LWARNING); DEBUG_LOG(WII_IPC_HID, "HID::Open"); + m_Active = true; Memory::Write_U32(GetDeviceID(), _CommandAddress + 4); return true; } @@ -53,11 +51,48 @@ bool CWII_IPC_HLE_Device_hid::Open(u32 _CommandAddress, u32 _Mode) bool CWII_IPC_HLE_Device_hid::Close(u32 _CommandAddress, bool _bForce) { DEBUG_LOG(WII_IPC_HID, "HID::Close"); + m_Active = false; if (!_bForce) Memory::Write_U32(0, _CommandAddress + 4); return true; } +u32 CWII_IPC_HLE_Device_hid::Update() +{ + u32 work_done = 0; + int ret = -4; + + std::list<_hidevent>::iterator ev = event_list.begin(); + while (ev != event_list.end()) { + + bool ev_finished = false; + + + switch (ev->type) + { + case IOCTL_HID_INTERRUPT_OUT: + case IOCTL_HID_INTERRUPT_IN: + { + ret = usb_reap_async_nocancel(ev->context, 0); + if(ret >= 0) + { + Memory::Write_U32(ret, ev->enq_address + 4); + WII_IPC_HLE_Interface::EnqReply(ev->enq_address); + work_done = ev_finished = true; + } + + break; + } + } + + if (ev_finished) + event_list.erase(ev++); + else + ev++; + } + return work_done; +} + bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) { static u32 replyAddress = 0; @@ -75,6 +110,7 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) { DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Get Attached) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", BufferIn, BufferInSize, BufferOut, BufferOutSize); + //Memory::Write_U32(0xFFFFFFFF, BufferOut); if(!hasRun) { FillOutDevices(BufferOut, BufferOutSize); @@ -133,7 +169,6 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) ERROR CODES: -4 Cant find device specified */ - u32 dev_num = Memory::Read_U32(BufferIn+0x10); u8 requesttype = Memory::Read_U8(BufferIn+0x14); u8 request = Memory::Read_U8(BufferIn+0x15); @@ -142,11 +177,8 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) u16 size = Memory::Read_U16(BufferIn+0x1A); u32 data = Memory::Read_U32(BufferIn+0x1C); - /* //libusb way - static int upto = 0; - int i; - usb_find_busses(); - usb_find_devices(); + usb_find_busses(); /* find all busses */ + usb_find_devices(); /* find all connected devices */ struct usb_dev_handle * dev_handle = GetDeviceByDevNum(dev_num); @@ -155,7 +187,7 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) ReturnValue = -4; break; } - + ReturnValue = usb_control_msg(dev_handle, requesttype, request, value, index, (char*)Memory::GetPointer(data), size, 0); @@ -164,113 +196,68 @@ bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) { ReturnValue += sizeof(usb_ctrl_setup); } - DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control)(%02X, %02X) = %d", - requesttype, request, ReturnValue); + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control)(%02X, %02X) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + requesttype, request, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); - usb_close(dev_handle); - - u8 test_out[0x20]; - Memory::ReadBigEData(test_out, BufferIn, BufferInSize); - char file[0x50]; - snprintf(file, 0x50, "ctrl_ctrlprotocol_%d.bin", upto); - FILE* test = fopen (file, "wb"); - for(i=0;i<0x20;i++) - fwrite(&test_out[i], 1, 1, test); - if (size > 0) - fwrite((char*)Memory::GetPointer(data), 1, size, test); - fclose(test); - upto++; - */ - - hid_device * dev_handle = GetDeviceByDevNumHidLib(dev_num); - - if (dev_handle == NULL) - { - ReturnValue = -4; - DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control)(%02X, %02X) = %d", - requesttype, request, ReturnValue); - break; - } - - // this is our write request - if(request == 0x09) - { - #define rw_buf_size 0x21 - unsigned char buf[rw_buf_size]; - memset(&buf[0], 0, rw_buf_size); - memcpy(&buf[1], (unsigned char*)Memory::GetPointer(data), size); - int success = hid_write_report(dev_handle, buf, size+1); - - DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control) success = %d", success); - } - - ReturnValue = size + sizeof(usb_ctrl_setup); - DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control)(%02X, %02X) = %d", - requesttype, request, ReturnValue); - - - break; - } - case IOCTL_HID_INTERRUPT_IN: - { - - - u32 dev_num = Memory::Read_U32(BufferIn+0x10); - u32 end_point = Memory::Read_U32(BufferIn+0x14); - u32 length = Memory::Read_U32(BufferIn+0x18); - - u32 data = Memory::Read_U32(BufferIn+0x1C); - - hid_device * dev_handle = GetDeviceByDevNumHidLib(dev_num); - - if (dev_handle == NULL) - { - ReturnValue = -4; - DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt In)(%d,%d,%p) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", - end_point, length, data, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); - break; - } - - //ReturnValue = -5; - ReturnValue = hid_read(dev_handle, (unsigned char*)Memory::GetPointer(data), length); - //ReturnValue = usb_interrupt_read(dev_handle, end_point, (char*)Memory::GetPointer(data), length, 1000); - - - FILE* test = fopen ("readdata.bin", "wb"); - fwrite(Memory::GetPointer(data), ReturnValue, 1, test); - fclose(test); - - DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt In)(%d,%d,%p) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", - end_point, length, data, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); - break; } case IOCTL_HID_INTERRUPT_OUT: + case IOCTL_HID_INTERRUPT_IN: { + u32 dev_num = Memory::Read_U32(BufferIn+0x10); u32 end_point = Memory::Read_U32(BufferIn+0x14); u32 length = Memory::Read_U32(BufferIn+0x18); u32 data = Memory::Read_U32(BufferIn+0x1C); - - hid_device * dev_handle = GetDeviceByDevNumHidLib(dev_num); + int ret = 0; + void * context = NULL; + + struct usb_dev_handle * dev_handle = GetDeviceByDevNum(dev_num); if (dev_handle == NULL) { ReturnValue = -4; - DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt Out) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", - ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); - break; + goto int_in_end_print; } - ReturnValue = -5; - //ReturnValue = usb_interrupt_write(dev_handle, end_point, (char*)Memory::GetPointer(data), length, 0); - - DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt Out) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", - ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); + usb_claim_interface(dev_handle,0); + + ret = usb_interrupt_setup_async(dev_handle, &context, end_point); + if (ret< 0) + { + ReturnValue = -4; + goto int_in_end_print; + } + ret = usb_submit_async(context, (char*)Memory::GetPointer(data), length); + if (ret< 0) + { + ReturnValue = -4; + goto int_in_end_print; + } + + ret = usb_reap_async_nocancel(context, 0); + if (ret >= 0) + { + ReturnValue = ret; + } + else + { + _hidevent ev; + ev.enq_address = _CommandAddress; + ev.type = Parameter; + ev.context = context; + event_list.push_back(ev); + return false; + } + + int_in_end_print: + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt %s)(%d,%d,%p) = %d (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + Parameter == IOCTL_HID_INTERRUPT_IN ? "In" : "Out", end_point, length, data, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize); + break; } @@ -294,16 +281,24 @@ bool CWII_IPC_HLE_Device_hid::IOCtlV(u32 _CommandAddress) u32 ReturnValue = 0; SIOCtlVBuffer CommandBuffer(_CommandAddress); - DEBUG_LOG(WII_IPC_HID, "%s - IOCtlV:", GetDeviceName().c_str()); - DEBUG_LOG(WII_IPC_HID, " Parameter: 0x%x", CommandBuffer.Parameter); - DEBUG_LOG(WII_IPC_HID, " NumberIn: 0x%08x", CommandBuffer.NumberInBuffer); - DEBUG_LOG(WII_IPC_HID, " NumberOut: 0x%08x", CommandBuffer.NumberPayloadBuffer); - DEBUG_LOG(WII_IPC_HID, " BufferVector: 0x%08x", CommandBuffer.BufferVector); - DEBUG_LOG(WII_IPC_HID, " PayloadAddr: 0x%08x", CommandBuffer.PayloadBuffer[0].m_Address); - DEBUG_LOG(WII_IPC_HID, " PayloadSize: 0x%08x", CommandBuffer.PayloadBuffer[0].m_Size); - #if defined(_DEBUG) || defined(DEBUGFAST) - DumpAsync(CommandBuffer.BufferVector, CommandBuffer.NumberInBuffer, CommandBuffer.NumberPayloadBuffer); - #endif + switch (CommandBuffer.Parameter) + { + + default: + { + DEBUG_LOG(WII_IPC_HID, "%s - IOCtlV:", GetDeviceName().c_str()); + DEBUG_LOG(WII_IPC_HID, " Parameter: 0x%x", CommandBuffer.Parameter); + DEBUG_LOG(WII_IPC_HID, " NumberIn: 0x%08x", CommandBuffer.NumberInBuffer); + DEBUG_LOG(WII_IPC_HID, " NumberOut: 0x%08x", CommandBuffer.NumberPayloadBuffer); + DEBUG_LOG(WII_IPC_HID, " BufferVector: 0x%08x", CommandBuffer.BufferVector); + DEBUG_LOG(WII_IPC_HID, " PayloadAddr: 0x%08x", CommandBuffer.PayloadBuffer[0].m_Address); + DEBUG_LOG(WII_IPC_HID, " PayloadSize: 0x%08x", CommandBuffer.PayloadBuffer[0].m_Size); + #if defined(_DEBUG) || defined(DEBUGFAST) + DumpAsync(CommandBuffer.BufferVector, CommandBuffer.NumberInBuffer, CommandBuffer.NumberPayloadBuffer); + #endif + } + break; + } Memory::Write_U32(ReturnValue, _CommandAddress + 4); return true; @@ -337,137 +332,15 @@ void CWII_IPC_HLE_Device_hid::ConvertEndpointToWii(WiiHIDEndpointDescriptor *des dest->wMaxPacketSize = Common::swap16(dest->wMaxPacketSize); } -static int x = 0; -u32 CWII_IPC_HLE_Device_hid::GetAvailableID(char* path) -{ - std::string dev_path = path; - if(loaded_devices.find(dev_path) == loaded_devices.end()){ - loaded_devices_rev[x] = dev_path; - loaded_devices[dev_path] = x++; - } - return loaded_devices[dev_path]; -} - -// hidapi version -void CWII_IPC_HLE_Device_hid::FillOutDevicesHidApi(u32 BufferOut, u32 BufferOutSize) -{ - x = 0; - // Enumerate and print the HID devices on the system - struct hid_device_info *devs, *cur_dev; - - int OffsetBuffer = BufferOut; - int OffsetStart = 0; - int c,i,e; // config, interface container, interface, endpoint - - devs = hid_enumerate(0x0, 0x0); - cur_dev = devs; - while (cur_dev) { - - OffsetStart = OffsetBuffer; - OffsetBuffer += 4; // skip length for now, fill at end - - Memory::Write_U32(GetAvailableID(cur_dev->path), OffsetBuffer); //write device num - OffsetBuffer += 4; - - WiiHIDDeviceDescriptor wii_device; - - wii_device.bLength = Common::swap8(0x12); - wii_device.bDescriptorType = Common::swap8(0x1); - wii_device.bcdUSB = Common::swap16(0x0200); - wii_device.bDeviceClass = Common::swap8(0); - wii_device.bDeviceSubClass = Common::swap8(0); - wii_device.bDeviceProtocol = Common::swap8(0); - wii_device.bMaxPacketSize0 = Common::swap8(0x20); - wii_device.idVendor = Common::swap16(cur_dev->vendor_id); - wii_device.idProduct = Common::swap16(cur_dev->product_id); - wii_device.bcdDevice = Common::swap16(cur_dev->release_number); - wii_device.iManufacturer = Common::swap8(0x1); - wii_device.iProduct = Common::swap8(0x2); - wii_device.iSerialNumber = Common::swap8(0); - wii_device.bNumConfigurations = Common::swap8(0x1); - - Memory::WriteBigEData((const u8*)&wii_device, OffsetBuffer, Align(wii_device.bLength, 4)); - - OffsetBuffer += Align(wii_device.bLength, 4); - - - for (c = 0; c < Common::swap8(wii_device.bNumConfigurations); c++) - { - - WiiHIDConfigDescriptor wii_config; - wii_config.bLength = Common::swap8(0x9); - wii_config.bDescriptorType = Common::swap8(0x2); - wii_config.wTotalLength = Common::swap16(0x29); - wii_config.bNumInterfaces = Common::swap8(0x1); - wii_config.bConfigurationValue = Common::swap8(0x1); - wii_config.iConfiguration = Common::swap8(0); - wii_config.bmAttributes = Common::swap8(0x80); - wii_config.MaxPower = Common::swap8(0x96); - - Memory::WriteBigEData((const u8*)&wii_config, OffsetBuffer, Align(Common::swap8(wii_config.bLength), 4)); - OffsetBuffer += Align(Common::swap8(wii_config.bLength), 4); - - for (i = 0; i < wii_config.bNumInterfaces; i++) - { - WiiHIDInterfaceDescriptor wii_interface; - - wii_interface.bLength = Common::swap8(0x9); - wii_interface.bDescriptorType = Common::swap8(0x4); - wii_interface.bInterfaceNumber = Common::swap8(i); - wii_interface.bAlternateSetting = Common::swap8(0); - wii_interface.bNumEndpoints = Common::swap8(0x2); - wii_interface.bInterfaceClass = Common::swap8(0x3); - wii_interface.bInterfaceSubClass = Common::swap8(0); - wii_interface.bInterfaceProtocol = Common::swap8(0); - wii_interface.iInterface = Common::swap8(0); - - Memory::WriteBigEData((const u8*)&wii_interface, OffsetBuffer, Align(Common::swap8(wii_interface.bLength), 4)); - OffsetBuffer += Align(Common::swap8(wii_interface.bLength), 4); - - for (e = 0; e < Common::swap8(wii_interface.bNumEndpoints); e++) - { - WiiHIDEndpointDescriptor wii_endpoint; - wii_endpoint.bLength = Common::swap8(0x7); - wii_endpoint.bDescriptorType = Common::swap8(0x5); - wii_endpoint.bEndpointAddress = Common::swap8(e == 0 ? 0x1 : 0x81); - wii_endpoint.bmAttributes = Common::swap8(0x3); - wii_endpoint.wMaxPacketSize = Common::swap16(0x20); - wii_endpoint.bInterval = Common::swap8(0x1); - - Memory::WriteBigEData((const u8*)&wii_endpoint, OffsetBuffer, Align(Common::swap8(wii_endpoint.bLength), 4)); - OffsetBuffer += Align(Common::swap8(wii_endpoint.bLength), 4); - - } //endpoints - } // interfaces - } // configs - - Memory::Write_U32(OffsetBuffer-OffsetStart, OffsetStart); // fill in length - - NOTICE_LOG(WII_IPC_HID, "Device Found\n type: %04hx %04hx\n path: %s\n serial_number: %ls", - cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number); - NOTICE_LOG(WII_IPC_HID, "\n"); - NOTICE_LOG(WII_IPC_HID, " Manufacturer: %ls\n", cur_dev->manufacturer_string); - NOTICE_LOG(WII_IPC_HID, " Product: %ls\n", cur_dev->product_string); - NOTICE_LOG(WII_IPC_HID, "\n"); - cur_dev = cur_dev->next; - } - Memory::Write_U32(0xFFFFFFFF, OffsetBuffer); // no more devices - - hid_free_enumeration(devs); -} - - -// libusb version void CWII_IPC_HLE_Device_hid::FillOutDevices(u32 BufferOut, u32 BufferOutSize) { - FillOutDevicesHidApi(BufferOut, BufferOutSize); - /*usb_find_busses(); // find all busses - usb_find_devices(); // find all connected devices + usb_find_busses(); /* find all busses */ + usb_find_devices(); /* find all connected devices */ struct usb_bus *bus; struct usb_device *dev; int OffsetBuffer = BufferOut; int OffsetStart = 0; - int c,ic,i,e; // config, interface container, interface, endpoint + int c,ic,i,e; /* config, interface container, interface, endpoint */ for (bus = usb_get_busses(); bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) @@ -527,38 +400,34 @@ void CWII_IPC_HLE_Device_hid::FillOutDevices(u32 BufferOut, u32 BufferOutSize) } // buses Memory::Write_U32(0xFFFFFFFF, OffsetBuffer); // no more devices - */ + } - - int CWII_IPC_HLE_Device_hid::Align(int num, int alignment) { return (num + (alignment-1)) & ~(alignment-1); } -hid_device * CWII_IPC_HLE_Device_hid::GetDeviceByDevNumHidLib(u32 devNum) -{ - if (loaded_devices_rev.find(devNum) == loaded_devices_rev.end()) - return NULL; - if (opened_devices.find(devNum) != opened_devices.end()) - return opened_devices[devNum]; - - hid_device * phPortalHandle = opened_devices[devNum] = hid_open_path(loaded_devices_rev[devNum].c_str()); - return phPortalHandle; -} struct usb_dev_handle * CWII_IPC_HLE_Device_hid::GetDeviceByDevNum(u32 devNum) { + + if (open_devices.find(devNum) != open_devices.end()) + return open_devices[devNum]; + + usb_dev_handle * device = NULL; + for (struct usb_bus *bus = usb_get_busses(); bus; bus = bus->next) { for (struct usb_device *dev = bus->devices; dev; dev = dev->next) { if(dev->devnum == devNum){ - return usb_open(dev); + open_devices[devNum] = device = usb_open(dev); + + return device; } } } - return NULL; + return device; } \ No newline at end of file diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h index 2fc4ba9a22..099f4deff4 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h @@ -19,7 +19,9 @@ #include "WII_IPC_HLE.h" #include "WII_IPC_HLE_Device.h" -#include "hidapi.h" +#include + +/* Connection timed out */ #define ETRANSFER_TIMEDOUT -116 class CWII_IPC_HLE_Device_hid : public IWII_IPC_HLE_Device { @@ -30,13 +32,12 @@ public: virtual bool Open(u32 _CommandAddress, u32 _Mode); virtual bool Close(u32 _CommandAddress, bool _bForce); + virtual u32 Update(); virtual bool IOCtlV(u32 _CommandAddress); virtual bool IOCtl(u32 _CommandAddress); private: - - std::map deviceList; enum { @@ -112,10 +113,7 @@ private: } WiiHIDEndpointDescriptor; - u32 GetAvailableID(char* path); - - void FillOutDevices(u32 BufferOut, u32 BufferOutSize); - void FillOutDevicesHidApi(u32 BufferOut, u32 BufferOutSize); + void CWII_IPC_HLE_Device_hid::FillOutDevices(u32 BufferOut, u32 BufferOutSize); void ConvertDeviceToWii(WiiHIDDeviceDescriptor *dest, struct usb_device_descriptor *src); void ConvertConfigToWii(WiiHIDConfigDescriptor *dest, struct usb_config_descriptor *src); @@ -123,8 +121,17 @@ private: void ConvertEndpointToWii(WiiHIDEndpointDescriptor *dest, struct usb_endpoint_descriptor *src); int Align(int num, int alignment); - hid_device * GetDeviceByDevNumHidLib(u32 devNum); + struct usb_dev_handle * GetDeviceByDevNum(u32 devNum); + std::map open_devices; - + + typedef struct + { + u32 enq_address; + u32 type; + void * context; + } _hidevent; + + std::list<_hidevent> event_list; }; diff --git a/Source/VSProps/Dolphin.x64.props b/Source/VSProps/Dolphin.x64.props index c9cc2eb7ff..fd692daa60 100644 --- a/Source/VSProps/Dolphin.x64.props +++ b/Source/VSProps/Dolphin.x64.props @@ -9,7 +9,7 @@ ..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg64;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName);..\..\..\Externals\libusb\$(PlatformName) - portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;libusb.lib;hidapi.lib;%(AdditionalDependencies) + portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;libusb.lib;%(AdditionalDependencies)