From 5d2f0e41d862bfeb06bc75488b6972358a953ec5 Mon Sep 17 00:00:00 2001 From: "Deployment Bot (from Travis CI)" Date: Sat, 31 Aug 2019 16:18:58 +0000 Subject: [PATCH] Deploy felis/USB_Host_Shield_2.0 to github.com/felis/USB_Host_Shield_2.0.git:gh-pages --- _b_t_d_8cpp.html | 21 +- _b_t_d_8cpp__incl.map | 8 +- _b_t_d_8cpp__incl.md5 | 2 +- _b_t_d_8cpp__incl.png | Bin 11253 -> 10782 bytes _b_t_d_8cpp_source.html | 1399 +------------- _b_t_d_8h.html | 34 +- _b_t_d_8h__dep__incl.map | 18 +- _b_t_d_8h__dep__incl.md5 | 2 +- _b_t_d_8h__dep__incl.png | Bin 15268 -> 13917 bytes _b_t_d_8h__incl.map | 6 +- _b_t_d_8h__incl.md5 | 2 +- _b_t_d_8h__incl.png | Bin 9884 -> 9492 bytes _b_t_d_8h_source.html | 409 +---- _b_t_h_i_d_8cpp.html | 23 +- _b_t_h_i_d_8cpp__incl.map | 12 +- _b_t_h_i_d_8cpp__incl.md5 | 2 +- _b_t_h_i_d_8cpp__incl.png | Bin 17122 -> 15498 bytes _b_t_h_i_d_8cpp_source.html | 414 +---- _b_t_h_i_d_8h.html | 28 +- _b_t_h_i_d_8h__dep__incl.map | 2 +- _b_t_h_i_d_8h__dep__incl.md5 | 2 +- _b_t_h_i_d_8h__dep__incl.png | Bin 4241 -> 4157 bytes _b_t_h_i_d_8h__incl.map | 10 +- _b_t_h_i_d_8h__incl.md5 | 2 +- _b_t_h_i_d_8h__incl.png | Bin 14106 -> 12961 bytes _b_t_h_i_d_8h_source.html | 115 +- _p_s3_b_t_8cpp.html | 24 +- _p_s3_b_t_8cpp__incl.map | 14 +- _p_s3_b_t_8cpp__incl.md5 | 2 +- _p_s3_b_t_8cpp__incl.png | Bin 19067 -> 17741 bytes _p_s3_b_t_8cpp_source.html | 654 +------ _p_s3_b_t_8h.html | 28 +- _p_s3_b_t_8h__dep__incl.md5 | 2 +- _p_s3_b_t_8h__dep__incl.png | Bin 3005 -> 2515 bytes _p_s3_b_t_8h__incl.map | 12 +- _p_s3_b_t_8h__incl.md5 | 2 +- _p_s3_b_t_8h__incl.png | Bin 17048 -> 15971 bytes _p_s3_b_t_8h_source.html | 122 +- _p_s3_enums_8h.html | 154 +- _p_s3_enums_8h__dep__incl.map | 6 +- _p_s3_enums_8h__dep__incl.md5 | 2 +- _p_s3_enums_8h__dep__incl.png | Bin 7621 -> 6765 bytes _p_s3_enums_8h__incl.map | 2 +- _p_s3_enums_8h__incl.md5 | 2 +- _p_s3_enums_8h__incl.png | Bin 3077 -> 2680 bytes _p_s3_enums_8h_source.html | 144 +- _p_s3_u_s_b_8cpp.html | 23 +- _p_s3_u_s_b_8cpp__incl.map | 12 +- _p_s3_u_s_b_8cpp__incl.md5 | 2 +- _p_s3_u_s_b_8cpp__incl.png | Bin 16998 -> 14904 bytes _p_s3_u_s_b_8cpp_source.html | 589 +----- _p_s3_u_s_b_8h.html | 29 +- _p_s3_u_s_b_8h__dep__incl.map | 2 +- _p_s3_u_s_b_8h__dep__incl.md5 | 2 +- _p_s3_u_s_b_8h__dep__incl.png | Bin 2868 -> 2503 bytes _p_s3_u_s_b_8h__incl.map | 10 +- _p_s3_u_s_b_8h__incl.md5 | 2 +- _p_s3_u_s_b_8h__incl.png | Bin 15040 -> 13257 bytes _p_s3_u_s_b_8h_source.html | 145 +- _p_s4_b_t_8h.html | 27 +- _p_s4_b_t_8h__incl.map | 16 +- _p_s4_b_t_8h__incl.md5 | 2 +- _p_s4_b_t_8h__incl.png | Bin 26336 -> 25008 bytes _p_s4_b_t_8h_source.html | 107 +- _p_s4_parser_8cpp.html | 46 +- _p_s4_parser_8cpp__incl.map | 6 +- _p_s4_parser_8cpp__incl.md5 | 2 +- _p_s4_parser_8cpp__incl.png | Bin 7852 -> 6946 bytes _p_s4_parser_8cpp_source.html | 168 +- _p_s4_parser_8h.html | 52 +- _p_s4_parser_8h__dep__incl.map | 4 +- _p_s4_parser_8h__dep__incl.md5 | 2 +- _p_s4_parser_8h__dep__incl.png | Bin 7329 -> 5726 bytes _p_s4_parser_8h__incl.map | 4 +- _p_s4_parser_8h__incl.md5 | 2 +- _p_s4_parser_8h__incl.png | Bin 5118 -> 4574 bytes _p_s4_parser_8h_source.html | 269 +-- _p_s4_u_s_b_8h.html | 25 +- _p_s4_u_s_b_8h__incl.map | 12 +- _p_s4_u_s_b_8h__incl.md5 | 2 +- _p_s4_u_s_b_8h__incl.png | Bin 16544 -> 16789 bytes _p_s4_u_s_b_8h_source.html | 104 +- _p_s_buzz_8cpp.html | 23 +- _p_s_buzz_8cpp__incl.map | 12 +- _p_s_buzz_8cpp__incl.md5 | 2 +- _p_s_buzz_8cpp__incl.png | Bin 15068 -> 14378 bytes _p_s_buzz_8cpp_source.html | 97 +- _p_s_buzz_8h.html | 27 +- _p_s_buzz_8h__dep__incl.map | 2 +- _p_s_buzz_8h__dep__incl.md5 | 2 +- _p_s_buzz_8h__dep__incl.png | Bin 2617 -> 2284 bytes _p_s_buzz_8h__incl.map | 10 +- _p_s_buzz_8h__incl.md5 | 2 +- _p_s_buzz_8h__incl.png | Bin 13276 -> 12733 bytes _p_s_buzz_8h_source.html | 119 +- _r_e_a_d_m_e_8md.html | 13 +- _r_e_a_d_m_e_8md_source.html | 399 +--- _s_p_p_8cpp.html | 42 +- _s_p_p_8cpp__incl.map | 10 +- _s_p_p_8cpp__incl.md5 | 2 +- _s_p_p_8cpp__incl.png | Bin 13559 -> 12773 bytes _s_p_p_8cpp_source.html | 846 +-------- _s_p_p_8h.html | 24 +- _s_p_p_8h__dep__incl.map | 2 +- _s_p_p_8h__dep__incl.md5 | 2 +- _s_p_p_8h__dep__incl.png | Bin 2228 -> 1966 bytes _s_p_p_8h__incl.map | 8 +- _s_p_p_8h__incl.md5 | 2 +- _s_p_p_8h__incl.png | Bin 10998 -> 10492 bytes _s_p_p_8h_source.html | 168 +- _u_h_s2__gpio_8cpp.html | 19 +- _u_h_s2__gpio_8cpp__incl.map | 4 +- _u_h_s2__gpio_8cpp__incl.md5 | 2 +- _u_h_s2__gpio_8cpp__incl.png | Bin 4904 -> 4332 bytes _u_h_s2__gpio_8cpp_source.html | 79 +- _u_h_s2__gpio_8h.html | 21 +- _u_h_s2__gpio_8h__dep__incl.map | 2 +- _u_h_s2__gpio_8h__dep__incl.md5 | 2 +- _u_h_s2__gpio_8h__dep__incl.png | Bin 3315 -> 3182 bytes _u_h_s2__gpio_8h__incl.map | 2 +- _u_h_s2__gpio_8h__incl.md5 | 2 +- _u_h_s2__gpio_8h__incl.png | Bin 2595 -> 2339 bytes _u_h_s2__gpio_8h_source.html | 59 +- _usb_8cpp.html | 18 +- _usb_8cpp__incl.map | 2 +- _usb_8cpp__incl.md5 | 2 +- _usb_8cpp__incl.png | Bin 1930 -> 1752 bytes _usb_8cpp_source.html | 865 +-------- _usb_8h.html | 64 +- _usb_8h__dep__incl.map | 98 +- _usb_8h__dep__incl.md5 | 2 +- _usb_8h__dep__incl.png | Bin 140534 -> 133098 bytes _usb_8h_source.html | 63 +- _usb_core_8h.html | 13 +- _usb_core_8h_source.html | 343 +--- _wii_8cpp.html | 87 +- _wii_8cpp__incl.map | 12 +- _wii_8cpp__incl.md5 | 2 +- _wii_8cpp__incl.png | Bin 16433 -> 15588 bytes _wii_8cpp_source.html | 1296 +------------ _wii_8h.html | 39 +- _wii_8h__dep__incl.md5 | 2 +- _wii_8h__dep__incl.png | Bin 1894 -> 1662 bytes _wii_8h__incl.map | 10 +- _wii_8h__incl.md5 | 2 +- _wii_8h__incl.png | Bin 13656 -> 12949 bytes _wii_8h_source.html | 306 +--- _wii_camera_readme_8md.html | 13 +- _wii_camera_readme_8md_source.html | 30 +- _x_b_o_x_o_l_d_8cpp.html | 46 +- _x_b_o_x_o_l_d_8cpp__incl.map | 10 +- _x_b_o_x_o_l_d_8cpp__incl.md5 | 2 +- _x_b_o_x_o_l_d_8cpp__incl.png | Bin 15919 -> 14722 bytes _x_b_o_x_o_l_d_8cpp_source.html | 352 +--- _x_b_o_x_o_l_d_8h.html | 28 +- _x_b_o_x_o_l_d_8h__dep__incl.md5 | 2 +- _x_b_o_x_o_l_d_8h__dep__incl.png | Bin 2884 -> 2555 bytes _x_b_o_x_o_l_d_8h__incl.map | 8 +- _x_b_o_x_o_l_d_8h__incl.md5 | 2 +- _x_b_o_x_o_l_d_8h__incl.png | Bin 13783 -> 12763 bytes _x_b_o_x_o_l_d_8h_source.html | 123 +- _x_b_o_x_o_n_e_8cpp.html | 21 +- _x_b_o_x_o_n_e_8cpp__incl.map | 8 +- _x_b_o_x_o_n_e_8cpp__incl.md5 | 2 +- _x_b_o_x_o_n_e_8cpp__incl.png | Bin 8212 -> 7498 bytes _x_b_o_x_o_n_e_8cpp_source.html | 507 +----- _x_b_o_x_o_n_e_8h.html | 25 +- _x_b_o_x_o_n_e_8h__dep__incl.map | 2 +- _x_b_o_x_o_n_e_8h__dep__incl.md5 | 2 +- _x_b_o_x_o_n_e_8h__dep__incl.png | Bin 3243 -> 2570 bytes _x_b_o_x_o_n_e_8h__incl.map | 6 +- _x_b_o_x_o_n_e_8h__incl.md5 | 2 +- _x_b_o_x_o_n_e_8h__incl.png | Bin 7072 -> 6495 bytes _x_b_o_x_o_n_e_8h_source.html | 158 +- _x_b_o_x_r_e_c_v_8cpp.html | 21 +- _x_b_o_x_r_e_c_v_8cpp__incl.map | 8 +- _x_b_o_x_r_e_c_v_8cpp__incl.md5 | 2 +- _x_b_o_x_r_e_c_v_8cpp__incl.png | Bin 8895 -> 8024 bytes _x_b_o_x_r_e_c_v_8cpp_source.html | 599 +----- _x_b_o_x_r_e_c_v_8h.html | 25 +- _x_b_o_x_r_e_c_v_8h__dep__incl.map | 2 +- _x_b_o_x_r_e_c_v_8h__dep__incl.md5 | 2 +- _x_b_o_x_r_e_c_v_8h__dep__incl.png | Bin 3644 -> 3111 bytes _x_b_o_x_r_e_c_v_8h__incl.map | 6 +- _x_b_o_x_r_e_c_v_8h__incl.md5 | 2 +- _x_b_o_x_r_e_c_v_8h__incl.png | Bin 7478 -> 6837 bytes _x_b_o_x_r_e_c_v_8h_source.html | 151 +- _x_b_o_x_u_s_b_8cpp.html | 23 +- _x_b_o_x_u_s_b_8cpp__incl.map | 12 +- _x_b_o_x_u_s_b_8cpp__incl.md5 | 2 +- _x_b_o_x_u_s_b_8cpp__incl.png | Bin 17222 -> 15252 bytes _x_b_o_x_u_s_b_8cpp_source.html | 377 +--- _x_b_o_x_u_s_b_8h.html | 29 +- _x_b_o_x_u_s_b_8h__dep__incl.map | 2 +- _x_b_o_x_u_s_b_8h__dep__incl.md5 | 2 +- _x_b_o_x_u_s_b_8h__dep__incl.png | Bin 3195 -> 2848 bytes _x_b_o_x_u_s_b_8h__incl.map | 10 +- _x_b_o_x_u_s_b_8h__incl.md5 | 2 +- _x_b_o_x_u_s_b_8h__incl.png | Bin 15038 -> 13466 bytes _x_b_o_x_u_s_b_8h_source.html | 143 +- address_8h.html | 21 +- address_8h_source.html | 310 +--- adk_8cpp.html | 19 +- adk_8cpp__incl.map | 4 +- adk_8cpp__incl.md5 | 2 +- adk_8cpp__incl.png | Bin 3424 -> 3136 bytes adk_8cpp_source.html | 387 +--- adk_8h.html | 21 +- adk_8h__dep__incl.map | 2 +- adk_8h__dep__incl.md5 | 2 +- adk_8h__dep__incl.png | Bin 1941 -> 2086 bytes adk_8h__incl.map | 2 +- adk_8h__incl.md5 | 2 +- adk_8h__incl.png | Bin 2022 -> 1683 bytes adk_8h_source.html | 155 +- annotated.html | 203 +-- ftv2mlastnode.png => arrowdown.png | Bin ftv2plastnode.png => arrowright.png | Bin avrpins_8h.html | 13 +- avrpins_8h_source.html | 1510 +--------------- cdc___x_r21_b1411_8cpp.html | 20 +- cdc___x_r21_b1411_8cpp__incl.map | 6 +- cdc___x_r21_b1411_8cpp__incl.md5 | 2 +- cdc___x_r21_b1411_8cpp__incl.png | Bin 6753 -> 5247 bytes cdc___x_r21_b1411_8cpp_source.html | 226 +-- cdc___x_r21_b1411_8h.html | 22 +- cdc___x_r21_b1411_8h__dep__incl.map | 2 +- cdc___x_r21_b1411_8h__dep__incl.md5 | 2 +- cdc___x_r21_b1411_8h__dep__incl.png | Bin 4015 -> 3046 bytes cdc___x_r21_b1411_8h__incl.map | 4 +- cdc___x_r21_b1411_8h__incl.md5 | 2 +- cdc___x_r21_b1411_8h__incl.png | Bin 4444 -> 3975 bytes cdc___x_r21_b1411_8h_source.html | 279 +-- cdcacm_8cpp.html | 19 +- cdcacm_8cpp__incl.map | 4 +- cdcacm_8cpp__incl.md5 | 2 +- cdcacm_8cpp__incl.png | Bin 3700 -> 3350 bytes cdcacm_8cpp_source.html | 382 +--- cdcacm_8h.html | 25 +- cdcacm_8h__dep__incl.map | 10 +- cdcacm_8h__dep__incl.md5 | 2 +- cdcacm_8h__dep__incl.png | Bin 10409 -> 9677 bytes cdcacm_8h__incl.map | 2 +- cdcacm_8h__incl.md5 | 2 +- cdcacm_8h__incl.png | Bin 1991 -> 2097 bytes cdcacm_8h_source.html | 278 +-- cdcftdi_8cpp.html | 19 +- cdcftdi_8cpp__incl.map | 4 +- cdcftdi_8cpp__incl.md5 | 2 +- cdcftdi_8cpp__incl.png | Bin 3391 -> 3043 bytes cdcftdi_8cpp_source.html | 423 +---- cdcftdi_8h.html | 21 +- cdcftdi_8h__dep__incl.map | 2 +- cdcftdi_8h__dep__incl.md5 | 2 +- cdcftdi_8h__dep__incl.png | Bin 2049 -> 1846 bytes cdcftdi_8h__incl.map | 2 +- cdcftdi_8h__incl.md5 | 2 +- cdcftdi_8h__incl.png | Bin 2132 -> 1927 bytes cdcftdi_8h_source.html | 182 +- cdcprolific_8cpp.html | 20 +- cdcprolific_8cpp__incl.map | 6 +- cdcprolific_8cpp__incl.md5 | 2 +- cdcprolific_8cpp__incl.png | Bin 4513 -> 4730 bytes cdcprolific_8cpp_source.html | 262 +-- cdcprolific_8h.html | 56 +- cdcprolific_8h__dep__incl.map | 2 +- cdcprolific_8h__dep__incl.md5 | 2 +- cdcprolific_8h__dep__incl.png | Bin 2527 -> 2401 bytes cdcprolific_8h__incl.map | 4 +- cdcprolific_8h__incl.md5 | 2 +- cdcprolific_8h__incl.png | Bin 3760 -> 3355 bytes cdcprolific_8h_source.html | 173 +- class_a_c_m-members.html | 13 +- class_a_c_m.html | 28 +- class_a_c_m__coll__graph.map | 14 +- class_a_c_m__coll__graph.md5 | 2 +- class_a_c_m__coll__graph.png | Bin 18116 -> 19180 bytes class_a_c_m__inherit__graph.map | 8 +- class_a_c_m__inherit__graph.md5 | 2 +- class_a_c_m__inherit__graph.png | Bin 10499 -> 9117 bytes class_a_d_k-members.html | 13 +- class_a_d_k.html | 24 +- class_a_d_k__coll__graph.map | 10 +- class_a_d_k__coll__graph.md5 | 2 +- class_a_d_k__coll__graph.png | Bin 11759 -> 11849 bytes class_a_d_k__inherit__graph.map | 4 +- class_a_d_k__inherit__graph.md5 | 2 +- class_a_d_k__inherit__graph.png | Bin 5876 -> 5307 bytes class_address_pool-members.html | 13 +- class_address_pool.html | 17 +- class_address_pool__inherit__graph.map | 4 +- class_address_pool__inherit__graph.md5 | 2 +- class_address_pool__inherit__graph.png | Bin 7425 -> 8020 bytes class_address_pool_impl-members.html | 13 +- class_address_pool_impl.html | 25 +- class_address_pool_impl__coll__graph.map | 2 +- class_address_pool_impl__coll__graph.md5 | 2 +- class_address_pool_impl__coll__graph.png | Bin 5570 -> 5355 bytes class_address_pool_impl__inherit__graph.map | 2 +- class_address_pool_impl__inherit__graph.md5 | 2 +- class_address_pool_impl__inherit__graph.png | Bin 5570 -> 5355 bytes class_b_t_d-members.html | 13 +- class_b_t_d.html | 99 +- class_b_t_d__coll__graph.map | 10 +- class_b_t_d__coll__graph.md5 | 2 +- class_b_t_d__coll__graph.png | Bin 11649 -> 11611 bytes class_b_t_d__inherit__graph.map | 4 +- class_b_t_d__inherit__graph.md5 | 2 +- class_b_t_d__inherit__graph.png | Bin 5760 -> 5101 bytes class_b_t_h_i_d-members.html | 15 +- class_b_t_h_i_d.html | 54 +- class_b_t_h_i_d__coll__graph.map | 14 +- class_b_t_h_i_d__coll__graph.md5 | 2 +- class_b_t_h_i_d__coll__graph.png | Bin 15645 -> 15553 bytes class_b_t_h_i_d__inherit__graph.map | 4 +- class_b_t_h_i_d__inherit__graph.md5 | 2 +- class_b_t_h_i_d__inherit__graph.png | Bin 4218 -> 3749 bytes class_bluetooth_service-members.html | 15 +- class_bluetooth_service.html | 42 +- class_bluetooth_service__coll__graph.map | 12 +- class_bluetooth_service__coll__graph.md5 | 2 +- class_bluetooth_service__coll__graph.png | Bin 14452 -> 14338 bytes class_bluetooth_service__inherit__graph.map | 10 +- class_bluetooth_service__inherit__graph.md5 | 2 +- class_bluetooth_service__inherit__graph.png | Bin 9636 -> 9021 bytes class_bulk_only-members.html | 13 +- class_bulk_only.html | 24 +- class_bulk_only__coll__graph.map | 10 +- class_bulk_only__coll__graph.md5 | 2 +- class_bulk_only__coll__graph.png | Bin 12087 -> 12058 bytes class_bulk_only__inherit__graph.map | 4 +- class_bulk_only__inherit__graph.md5 | 2 +- class_bulk_only__inherit__graph.png | Bin 6221 -> 5622 bytes class_byte_skipper-members.html | 13 +- class_byte_skipper.html | 21 +- class_c_d_c_async_oper-members.html | 13 +- class_c_d_c_async_oper.html | 13 +- class_config_desc_parser-members.html | 13 +- class_config_desc_parser.html | 21 +- class_config_desc_parser__coll__graph.map | 2 +- class_config_desc_parser__coll__graph.md5 | 2 +- class_config_desc_parser__coll__graph.png | Bin 6427 -> 5798 bytes class_config_desc_parser__inherit__graph.map | 2 +- class_config_desc_parser__inherit__graph.md5 | 2 +- class_config_desc_parser__inherit__graph.png | Bin 6427 -> 5798 bytes class_f_t_d_i-members.html | 13 +- class_f_t_d_i.html | 21 +- class_f_t_d_i__coll__graph.map | 4 +- class_f_t_d_i__coll__graph.md5 | 2 +- class_f_t_d_i__coll__graph.png | Bin 5632 -> 4985 bytes class_f_t_d_i__inherit__graph.map | 4 +- class_f_t_d_i__inherit__graph.md5 | 2 +- class_f_t_d_i__inherit__graph.png | Bin 5632 -> 4985 bytes class_f_t_d_i_async_oper-members.html | 13 +- class_f_t_d_i_async_oper.html | 13 +- class_h_i_d_boot-members.html | 13 +- class_h_i_d_boot.html | 27 +- class_h_i_d_boot__coll__graph.map | 10 +- class_h_i_d_boot__coll__graph.md5 | 2 +- class_h_i_d_boot__coll__graph.png | Bin 13646 -> 11859 bytes class_h_i_d_boot__inherit__graph.map | 6 +- class_h_i_d_boot__inherit__graph.md5 | 2 +- class_h_i_d_boot__inherit__graph.png | Bin 9416 -> 7894 bytes class_h_i_d_composite-members.html | 13 +- class_h_i_d_composite.html | 26 +- class_h_i_d_composite__coll__graph.map | 12 +- class_h_i_d_composite__coll__graph.md5 | 2 +- class_h_i_d_composite__coll__graph.png | Bin 20213 -> 15878 bytes class_h_i_d_composite__inherit__graph.map | 6 +- class_h_i_d_composite__inherit__graph.md5 | 2 +- class_h_i_d_composite__inherit__graph.png | Bin 8875 -> 7426 bytes class_h_i_d_report_parser-members.html | 13 +- class_h_i_d_report_parser.html | 18 +- class_h_i_d_report_parser__inherit__graph.map | 6 +- class_h_i_d_report_parser__inherit__graph.md5 | 2 +- class_h_i_d_report_parser__inherit__graph.png | Bin 8781 -> 7443 bytes class_h_i_d_universal-members.html | 13 +- class_h_i_d_universal.html | 28 +- class_h_i_d_universal__coll__graph.map | 12 +- class_h_i_d_universal__coll__graph.md5 | 2 +- class_h_i_d_universal__coll__graph.png | Bin 19734 -> 15669 bytes class_h_i_d_universal__inherit__graph.map | 10 +- class_h_i_d_universal__inherit__graph.md5 | 2 +- class_h_i_d_universal__inherit__graph.png | Bin 10751 -> 10413 bytes class_hex_dumper-members.html | 13 +- class_hex_dumper.html | 15 +- class_hex_dumper__coll__graph.md5 | 2 +- class_hex_dumper__coll__graph.png | Bin 5554 -> 4817 bytes class_hex_dumper__inherit__graph.md5 | 2 +- class_hex_dumper__inherit__graph.png | Bin 5554 -> 4817 bytes class_keyboard_report_parser-members.html | 13 +- class_keyboard_report_parser.html | 21 +- class_keyboard_report_parser__coll__graph.map | 6 +- class_keyboard_report_parser__coll__graph.md5 | 2 +- class_keyboard_report_parser__coll__graph.png | Bin 8493 -> 8743 bytes ...keyboard_report_parser__inherit__graph.map | 2 +- ...keyboard_report_parser__inherit__graph.md5 | 2 +- ...keyboard_report_parser__inherit__graph.png | Bin 4395 -> 3437 bytes class_m_a_x3421e-members.html | 13 +- class_m_a_x3421e.html | 44 +- class_m_a_x3421e__inherit__graph.map | 2 +- class_m_a_x3421e__inherit__graph.md5 | 2 +- class_m_a_x3421e__inherit__graph.png | Bin 4677 -> 4088 bytes class_max___l_c_d-members.html | 13 +- class_max___l_c_d.html | 13 +- class_max___l_c_d__coll__graph.md5 | 2 +- class_max___l_c_d__coll__graph.png | Bin 2281 -> 1935 bytes class_max___l_c_d__inherit__graph.md5 | 2 +- class_max___l_c_d__inherit__graph.png | Bin 2281 -> 1935 bytes class_mouse_report_parser-members.html | 13 +- class_mouse_report_parser.html | 20 +- class_mouse_report_parser__coll__graph.map | 4 +- class_mouse_report_parser__coll__graph.md5 | 2 +- class_mouse_report_parser__coll__graph.png | Bin 7225 -> 7185 bytes class_mouse_report_parser__inherit__graph.map | 2 +- class_mouse_report_parser__inherit__graph.md5 | 2 +- class_mouse_report_parser__inherit__graph.png | Bin 3570 -> 3166 bytes class_multi_byte_value_parser-members.html | 13 +- class_multi_byte_value_parser.html | 21 +- class_p_l2303-members.html | 13 +- class_p_l2303.html | 28 +- class_p_l2303__coll__graph.map | 16 +- class_p_l2303__coll__graph.md5 | 2 +- class_p_l2303__coll__graph.png | Bin 22084 -> 20885 bytes class_p_l2303__inherit__graph.map | 6 +- class_p_l2303__inherit__graph.md5 | 2 +- class_p_l2303__inherit__graph.png | Bin 8255 -> 6847 bytes class_p_s3_b_t-members.html | 15 +- class_p_s3_b_t.html | 89 +- class_p_s3_b_t__coll__graph.map | 14 +- class_p_s3_b_t__coll__graph.md5 | 2 +- class_p_s3_b_t__coll__graph.png | Bin 15994 -> 15869 bytes class_p_s3_b_t__inherit__graph.map | 2 +- class_p_s3_b_t__inherit__graph.md5 | 2 +- class_p_s3_b_t__inherit__graph.png | Bin 3215 -> 2547 bytes class_p_s3_u_s_b-members.html | 13 +- class_p_s3_u_s_b.html | 109 +- class_p_s3_u_s_b__coll__graph.map | 8 +- class_p_s3_u_s_b__coll__graph.md5 | 2 +- class_p_s3_u_s_b__coll__graph.png | Bin 10325 -> 9233 bytes class_p_s3_u_s_b__inherit__graph.map | 2 +- class_p_s3_u_s_b__inherit__graph.md5 | 2 +- class_p_s3_u_s_b__inherit__graph.png | Bin 3782 -> 3019 bytes class_p_s4_b_t-members.html | 15 +- class_p_s4_b_t.html | 45 +- class_p_s4_b_t__coll__graph.map | 18 +- class_p_s4_b_t__coll__graph.md5 | 2 +- class_p_s4_b_t__coll__graph.png | Bin 21824 -> 19041 bytes class_p_s4_b_t__inherit__graph.map | 6 +- class_p_s4_b_t__inherit__graph.md5 | 2 +- class_p_s4_b_t__inherit__graph.png | Bin 7181 -> 6434 bytes class_p_s4_parser-members.html | 13 +- class_p_s4_parser.html | 80 +- class_p_s4_parser__inherit__graph.map | 2 +- class_p_s4_parser__inherit__graph.md5 | 2 +- class_p_s4_parser__inherit__graph.png | Bin 4304 -> 4443 bytes class_p_s4_u_s_b-members.html | 13 +- class_p_s4_u_s_b.html | 48 +- class_p_s4_u_s_b__coll__graph.map | 16 +- class_p_s4_u_s_b__coll__graph.md5 | 2 +- class_p_s4_u_s_b__coll__graph.png | Bin 24139 -> 19326 bytes class_p_s4_u_s_b__inherit__graph.map | 10 +- class_p_s4_u_s_b__inherit__graph.md5 | 2 +- class_p_s4_u_s_b__inherit__graph.png | Bin 12830 -> 10390 bytes class_p_s_buzz-members.html | 13 +- class_p_s_buzz.html | 61 +- class_p_s_buzz__coll__graph.map | 14 +- class_p_s_buzz__coll__graph.md5 | 2 +- class_p_s_buzz__coll__graph.png | Bin 21459 -> 17131 bytes class_p_s_buzz__inherit__graph.map | 8 +- class_p_s_buzz__inherit__graph.md5 | 2 +- class_p_s_buzz__inherit__graph.png | Bin 9179 -> 8794 bytes class_p_t_p_list_parser-members.html | 13 +- class_p_t_p_list_parser.html | 29 +- class_report_desc_parser-members.html | 15 +- class_report_desc_parser.html | 32 +- class_report_desc_parser2-members.html | 15 +- class_report_desc_parser2.html | 32 +- class_report_desc_parser2__coll__graph.map | 10 +- class_report_desc_parser2__coll__graph.md5 | 2 +- class_report_desc_parser2__coll__graph.png | Bin 13989 -> 14484 bytes class_report_desc_parser2__inherit__graph.map | 4 +- class_report_desc_parser2__inherit__graph.md5 | 2 +- class_report_desc_parser2__inherit__graph.png | Bin 6656 -> 5984 bytes class_report_desc_parser__coll__graph.map | 10 +- class_report_desc_parser__coll__graph.md5 | 2 +- class_report_desc_parser__coll__graph.png | Bin 13821 -> 14323 bytes class_report_desc_parser__inherit__graph.map | 4 +- class_report_desc_parser__inherit__graph.md5 | 2 +- class_report_desc_parser__inherit__graph.png | Bin 6457 -> 5826 bytes class_report_desc_parser_base-members.html | 15 +- class_report_desc_parser_base.html | 674 +------ ...s_report_desc_parser_base__coll__graph.map | 8 +- ...s_report_desc_parser_base__coll__graph.md5 | 2 +- ...s_report_desc_parser_base__coll__graph.png | Bin 11535 -> 12002 bytes ...eport_desc_parser_base__inherit__graph.map | 6 +- ...eport_desc_parser_base__inherit__graph.md5 | 2 +- ...eport_desc_parser_base__inherit__graph.png | Bin 8893 -> 8448 bytes class_s_p_p-members.html | 15 +- class_s_p_p.html | 53 +- class_s_p_p__coll__graph.map | 14 +- class_s_p_p__coll__graph.md5 | 2 +- class_s_p_p__coll__graph.png | Bin 17661 -> 17830 bytes class_s_p_p__inherit__graph.map | 2 +- class_s_p_p__inherit__graph.md5 | 2 +- class_s_p_p__inherit__graph.png | Bin 4632 -> 4392 bytes class_s_pi-members.html | 13 +- class_s_pi.html | 15 +- class_sink_parser-members.html | 13 +- class_sink_parser.html | 15 +- class_sink_parser__coll__graph.md5 | 2 +- class_sink_parser__coll__graph.png | Bin 5536 -> 4688 bytes class_sink_parser__inherit__graph.md5 | 2 +- class_sink_parser__inherit__graph.png | Bin 5536 -> 4688 bytes class_u_h_s2___g_p_i_o-members.html | 13 +- class_u_h_s2___g_p_i_o.html | 21 +- class_u_s_b-members.html | 13 +- class_u_s_b.html | 29 +- class_u_s_b__coll__graph.map | 2 +- class_u_s_b__coll__graph.md5 | 2 +- class_u_s_b__coll__graph.png | Bin 2713 -> 2154 bytes class_u_s_b__inherit__graph.map | 2 +- class_u_s_b__inherit__graph.md5 | 2 +- class_u_s_b__inherit__graph.png | Bin 2713 -> 2154 bytes class_u_s_b_device_config-members.html | 13 +- class_u_s_b_device_config.html | 35 +- class_u_s_b_device_config__inherit__graph.map | 38 +- class_u_s_b_device_config__inherit__graph.md5 | 2 +- class_u_s_b_device_config__inherit__graph.png | Bin 41334 -> 38708 bytes class_u_s_b_h___m_i_d_i-members.html | 13 +- class_u_s_b_h___m_i_d_i.html | 22 +- class_u_s_b_h___m_i_d_i__coll__graph.map | 8 +- class_u_s_b_h___m_i_d_i__coll__graph.md5 | 2 +- class_u_s_b_h___m_i_d_i__coll__graph.png | Bin 10360 -> 9288 bytes class_u_s_b_h___m_i_d_i__inherit__graph.map | 2 +- class_u_s_b_h___m_i_d_i__inherit__graph.md5 | 2 +- class_u_s_b_h___m_i_d_i__inherit__graph.png | Bin 3829 -> 3076 bytes class_u_s_b_h_i_d-members.html | 13 +- class_u_s_b_h_i_d.html | 28 +- class_u_s_b_h_i_d__coll__graph.map | 8 +- class_u_s_b_h_i_d__coll__graph.md5 | 2 +- class_u_s_b_h_i_d__coll__graph.png | Bin 10967 -> 9349 bytes class_u_s_b_h_i_d__inherit__graph.map | 14 +- class_u_s_b_h_i_d__inherit__graph.md5 | 2 +- class_u_s_b_h_i_d__inherit__graph.png | Bin 17937 -> 14352 bytes class_u_s_b_hub-members.html | 13 +- class_u_s_b_hub.html | 19 +- class_u_s_b_hub__coll__graph.map | 2 +- class_u_s_b_hub__coll__graph.md5 | 2 +- class_u_s_b_hub__coll__graph.png | Bin 3670 -> 2947 bytes class_u_s_b_hub__inherit__graph.map | 2 +- class_u_s_b_hub__inherit__graph.md5 | 2 +- class_u_s_b_hub__inherit__graph.png | Bin 3670 -> 2947 bytes class_u_s_b_read_parser-members.html | 13 +- class_u_s_b_read_parser.html | 19 +- class_u_s_b_read_parser__inherit__graph.map | 8 +- class_u_s_b_read_parser__inherit__graph.md5 | 2 +- class_u_s_b_read_parser__inherit__graph.png | Bin 14311 -> 13142 bytes class_universal_report_parser-members.html | 13 +- class_universal_report_parser.html | 19 +- ...s_universal_report_parser__coll__graph.map | 2 +- ...s_universal_report_parser__coll__graph.md5 | 2 +- ...s_universal_report_parser__coll__graph.png | Bin 4116 -> 3332 bytes ...niversal_report_parser__inherit__graph.map | 2 +- ...niversal_report_parser__inherit__graph.md5 | 2 +- ...niversal_report_parser__inherit__graph.png | Bin 4116 -> 3332 bytes class_usb_config_xtracter-members.html | 13 +- class_usb_config_xtracter.html | 29 +- class_usb_config_xtracter__inherit__graph.map | 28 +- class_usb_config_xtracter__inherit__graph.md5 | 2 +- class_usb_config_xtracter__inherit__graph.png | Bin 26370 -> 23973 bytes class_w_i_i-members.html | 15 +- class_w_i_i.html | 122 +- class_w_i_i__coll__graph.map | 14 +- class_w_i_i__coll__graph.md5 | 2 +- class_w_i_i__coll__graph.png | Bin 15562 -> 15516 bytes class_w_i_i__inherit__graph.map | 2 +- class_w_i_i__inherit__graph.md5 | 2 +- class_w_i_i__inherit__graph.png | Bin 2732 -> 2228 bytes class_x_b_o_x_o_l_d-members.html | 13 +- class_x_b_o_x_o_l_d.html | 58 +- class_x_b_o_x_o_l_d__coll__graph.map | 8 +- class_x_b_o_x_o_l_d__coll__graph.md5 | 2 +- class_x_b_o_x_o_l_d__coll__graph.png | Bin 10354 -> 9243 bytes class_x_b_o_x_o_l_d__inherit__graph.map | 2 +- class_x_b_o_x_o_l_d__inherit__graph.md5 | 2 +- class_x_b_o_x_o_l_d__inherit__graph.png | Bin 3805 -> 3026 bytes class_x_b_o_x_o_n_e-members.html | 13 +- class_x_b_o_x_o_n_e.html | 69 +- class_x_b_o_x_o_n_e__coll__graph.map | 10 +- class_x_b_o_x_o_n_e__coll__graph.md5 | 2 +- class_x_b_o_x_o_n_e__coll__graph.png | Bin 12089 -> 11985 bytes class_x_b_o_x_o_n_e__inherit__graph.map | 4 +- class_x_b_o_x_o_n_e__inherit__graph.md5 | 2 +- class_x_b_o_x_o_n_e__inherit__graph.png | Bin 6225 -> 5574 bytes class_x_b_o_x_r_e_c_v-members.html | 13 +- class_x_b_o_x_r_e_c_v.html | 91 +- class_x_b_o_x_r_e_c_v__coll__graph.map | 8 +- class_x_b_o_x_r_e_c_v__coll__graph.md5 | 2 +- class_x_b_o_x_r_e_c_v__coll__graph.png | Bin 10791 -> 9593 bytes class_x_b_o_x_r_e_c_v__inherit__graph.map | 2 +- class_x_b_o_x_r_e_c_v__inherit__graph.md5 | 2 +- class_x_b_o_x_r_e_c_v__inherit__graph.png | Bin 4254 -> 3338 bytes class_x_b_o_x_u_s_b-members.html | 13 +- class_x_b_o_x_u_s_b.html | 70 +- class_x_b_o_x_u_s_b__coll__graph.map | 8 +- class_x_b_o_x_u_s_b__coll__graph.md5 | 2 +- class_x_b_o_x_u_s_b__coll__graph.png | Bin 10518 -> 9452 bytes class_x_b_o_x_u_s_b__inherit__graph.map | 2 +- class_x_b_o_x_u_s_b__inherit__graph.md5 | 2 +- class_x_b_o_x_u_s_b__inherit__graph.png | Bin 3977 -> 3166 bytes class_x_r21_b1411-members.html | 13 +- class_x_r21_b1411.html | 31 +- class_x_r21_b1411__coll__graph.map | 16 +- class_x_r21_b1411__coll__graph.md5 | 2 +- class_x_r21_b1411__coll__graph.png | Bin 22352 -> 21055 bytes class_x_r21_b1411__inherit__graph.map | 6 +- class_x_r21_b1411__inherit__graph.md5 | 2 +- class_x_r21_b1411__inherit__graph.png | Bin 8528 -> 6995 bytes classes.html | 15 +- confdescparser_8h.html | 13 +- confdescparser_8h_source.html | 243 +-- controller_enums_8h.html | 273 +-- controller_enums_8h__dep__incl.map | 42 +- controller_enums_8h__dep__incl.md5 | 2 +- controller_enums_8h__dep__incl.png | Bin 36195 -> 33187 bytes controller_enums_8h_source.html | 161 +- ftv2doc.png => doc.png | Bin doxygen.css | 123 +- dynsections.js | 54 +- files.html | 173 +- ftv2folderclosed.png => folderclosed.png | Bin ftv2folderopen.png => folderopen.png | Bin ftv2blank.png | Bin 86 -> 0 bytes ftv2cl.png | Bin 453 -> 0 bytes ftv2lastnode.png | Bin 86 -> 0 bytes ftv2link.png | Bin 746 -> 0 bytes ftv2mnode.png | Bin 246 -> 0 bytes ftv2mo.png | Bin 403 -> 0 bytes ftv2node.png | Bin 86 -> 0 bytes ftv2ns.png | Bin 388 -> 0 bytes ftv2pnode.png | Bin 229 -> 0 bytes ftv2vertline.png | Bin 86 -> 0 bytes functions.html | 13 +- functions_a.html | 13 +- functions_b.html | 13 +- functions_c.html | 13 +- functions_d.html | 13 +- functions_e.html | 13 +- functions_enum.html | 13 +- functions_eval.html | 13 +- functions_f.html | 13 +- functions_func.html | 13 +- functions_func_b.html | 13 +- functions_func_c.html | 13 +- functions_func_d.html | 13 +- functions_func_e.html | 13 +- functions_func_f.html | 13 +- functions_func_g.html | 13 +- functions_func_h.html | 13 +- functions_func_i.html | 13 +- functions_func_k.html | 13 +- functions_func_l.html | 13 +- functions_func_m.html | 16 +- functions_func_n.html | 13 +- functions_func_o.html | 13 +- functions_func_p.html | 13 +- functions_func_r.html | 13 +- functions_func_s.html | 13 +- functions_func_t.html | 13 +- functions_func_u.html | 13 +- functions_func_v.html | 13 +- functions_func_w.html | 15 +- functions_func_x.html | 13 +- functions_g.html | 13 +- functions_h.html | 13 +- functions_i.html | 13 +- functions_k.html | 13 +- functions_l.html | 13 +- functions_m.html | 18 +- functions_n.html | 13 +- functions_o.html | 13 +- functions_p.html | 15 +- functions_q.html | 13 +- functions_r.html | 13 +- functions_s.html | 13 +- functions_t.html | 13 +- functions_type.html | 15 +- functions_u.html | 15 +- functions_v.html | 13 +- functions_vars.html | 13 +- functions_vars_a.html | 13 +- functions_vars_b.html | 13 +- functions_vars_c.html | 13 +- functions_vars_d.html | 13 +- functions_vars_e.html | 13 +- functions_vars_f.html | 13 +- functions_vars_g.html | 13 +- functions_vars_h.html | 13 +- functions_vars_i.html | 13 +- functions_vars_k.html | 13 +- functions_vars_l.html | 13 +- functions_vars_m.html | 13 +- functions_vars_n.html | 13 +- functions_vars_o.html | 13 +- functions_vars_p.html | 15 +- functions_vars_q.html | 13 +- functions_vars_r.html | 13 +- functions_vars_s.html | 13 +- functions_vars_t.html | 13 +- functions_vars_u.html | 13 +- functions_vars_v.html | 13 +- functions_vars_w.html | 13 +- functions_vars_x.html | 13 +- functions_vars_y.html | 13 +- functions_w.html | 15 +- functions_x.html | 13 +- functions_y.html | 13 +- globals.html | 13 +- globals_a.html | 13 +- globals_b.html | 13 +- globals_c.html | 13 +- globals_d.html | 13 +- globals_defs.html | 13 +- globals_defs_a.html | 13 +- globals_defs_b.html | 13 +- globals_defs_c.html | 13 +- globals_defs_d.html | 13 +- globals_defs_e.html | 13 +- globals_defs_f.html | 13 +- globals_defs_g.html | 13 +- globals_defs_h.html | 13 +- globals_defs_i.html | 13 +- globals_defs_j.html | 13 +- globals_defs_k.html | 13 +- globals_defs_l.html | 13 +- globals_defs_m.html | 13 +- globals_defs_n.html | 13 +- globals_defs_o.html | 13 +- globals_defs_p.html | 13 +- globals_defs_r.html | 13 +- globals_defs_s.html | 13 +- globals_defs_t.html | 13 +- globals_defs_u.html | 13 +- globals_defs_v.html | 13 +- globals_defs_w.html | 13 +- globals_defs_x.html | 13 +- globals_e.html | 13 +- globals_enum.html | 13 +- globals_eval.html | 13 +- globals_f.html | 13 +- globals_func.html | 13 +- globals_g.html | 13 +- globals_h.html | 13 +- globals_i.html | 13 +- globals_j.html | 13 +- globals_k.html | 13 +- globals_l.html | 13 +- globals_m.html | 13 +- globals_n.html | 13 +- globals_o.html | 13 +- globals_p.html | 15 +- globals_r.html | 13 +- globals_s.html | 13 +- globals_t.html | 13 +- globals_type.html | 17 +- globals_u.html | 15 +- globals_v.html | 13 +- globals_vars.html | 13 +- globals_vars_r.html | 13 +- globals_vars_u.html | 13 +- globals_vars_w.html | 13 +- globals_vars_x.html | 13 +- globals_w.html | 13 +- globals_x.html | 13 +- globals_y.html | 13 +- globals_z.html | 13 +- graph_legend.html | 52 +- graph_legend.png | Bin 19871 -> 17247 bytes hexdump_8h.html | 13 +- hexdump_8h_source.html | 84 +- hidboot_8cpp.html | 21 +- hidboot_8cpp__incl.map | 8 +- hidboot_8cpp__incl.md5 | 2 +- hidboot_8cpp__incl.png | Bin 8914 -> 8390 bytes hidboot_8cpp_source.html | 226 +-- hidboot_8h.html | 26 +- hidboot_8h__dep__incl.map | 6 +- hidboot_8h__dep__incl.md5 | 2 +- hidboot_8h__dep__incl.png | Bin 8673 -> 7823 bytes hidboot_8h__incl.map | 6 +- hidboot_8h__incl.md5 | 2 +- hidboot_8h__incl.png | Bin 6918 -> 7847 bytes hidboot_8h_source.html | 687 +------ hidcomposite_8cpp.html | 21 +- hidcomposite_8cpp__incl.map | 8 +- hidcomposite_8cpp__incl.md5 | 2 +- hidcomposite_8cpp__incl.png | Bin 9897 -> 10276 bytes hidcomposite_8cpp_source.html | 430 +---- hidcomposite_8h.html | 23 +- hidcomposite_8h__dep__incl.map | 2 +- hidcomposite_8h__dep__incl.md5 | 2 +- hidcomposite_8h__dep__incl.png | Bin 3213 -> 2862 bytes hidcomposite_8h__incl.map | 6 +- hidcomposite_8h__incl.md5 | 2 +- hidcomposite_8h__incl.png | Bin 8872 -> 7737 bytes hidcomposite_8h_source.html | 123 +- hidescriptorparser_8cpp.html | 21 +- hidescriptorparser_8cpp__incl.map | 8 +- hidescriptorparser_8cpp__incl.md5 | 2 +- hidescriptorparser_8cpp__incl.png | Bin 11423 -> 9693 bytes hidescriptorparser_8cpp_source.html | 1607 +---------------- hidescriptorparser_8h.html | 23 +- hidescriptorparser_8h__dep__incl.map | 2 +- hidescriptorparser_8h__dep__incl.md5 | 2 +- hidescriptorparser_8h__dep__incl.png | Bin 3612 -> 3537 bytes hidescriptorparser_8h__incl.map | 6 +- hidescriptorparser_8h__incl.md5 | 2 +- hidescriptorparser_8h__incl.png | Bin 9106 -> 7951 bytes hidescriptorparser_8h_source.html | 203 +-- hiduniversal_8cpp.html | 21 +- hiduniversal_8cpp__incl.map | 8 +- hiduniversal_8cpp__incl.md5 | 2 +- hiduniversal_8cpp__incl.png | Bin 9829 -> 9343 bytes hiduniversal_8cpp_source.html | 440 +---- hiduniversal_8h.html | 26 +- hiduniversal_8h__dep__incl.map | 8 +- hiduniversal_8h__dep__incl.md5 | 2 +- hiduniversal_8h__dep__incl.png | Bin 8979 -> 8980 bytes hiduniversal_8h__incl.map | 6 +- hiduniversal_8h__incl.md5 | 2 +- hiduniversal_8h__incl.png | Bin 8697 -> 8357 bytes hiduniversal_8h_source.html | 123 +- hidusagestr_8h.html | 51 +- hidusagestr_8h__dep__incl.map | 60 +- hidusagestr_8h__dep__incl.md5 | 2 +- hidusagestr_8h__dep__incl.png | Bin 54612 -> 52063 bytes hidusagestr_8h__incl.map | 2 +- hidusagestr_8h__incl.md5 | 2 +- hidusagestr_8h__incl.png | Bin 2519 -> 2543 bytes hidusagestr_8h_source.html | 992 +--------- hidusagetitlearrays_8cpp.html | 19 +- hidusagetitlearrays_8cpp__incl.map | 4 +- hidusagetitlearrays_8cpp__incl.md5 | 2 +- hidusagetitlearrays_8cpp__incl.png | Bin 5370 -> 4771 bytes hidusagetitlearrays_8cpp_source.html | 1063 +---------- hierarchy.html | 231 +-- index.html | 50 +- inherit_graph_0.map | 2 +- inherit_graph_0.png | Bin 1903 -> 1397 bytes inherit_graph_1.map | 6 +- inherit_graph_1.png | Bin 8557 -> 8442 bytes inherit_graph_10.map | 2 +- inherit_graph_10.png | Bin 1582 -> 1157 bytes inherit_graph_11.map | 2 +- inherit_graph_11.png | Bin 1842 -> 1588 bytes inherit_graph_12.map | 2 +- inherit_graph_12.png | Bin 1704 -> 1206 bytes inherit_graph_13.map | 4 +- inherit_graph_13.png | Bin 3388 -> 2551 bytes inherit_graph_14.map | 2 +- inherit_graph_14.png | Bin 2243 -> 1850 bytes inherit_graph_15.map | 2 +- inherit_graph_15.png | Bin 781 -> 663 bytes inherit_graph_16.map | 2 +- inherit_graph_16.png | Bin 1756 -> 1428 bytes inherit_graph_17.map | 4 +- inherit_graph_17.png | Bin 7854 -> 6836 bytes inherit_graph_18.map | 2 +- inherit_graph_18.png | Bin 2714 -> 2010 bytes inherit_graph_19.map | 2 +- inherit_graph_19.png | Bin 1276 -> 1030 bytes inherit_graph_2.map | 2 +- inherit_graph_2.png | Bin 1224 -> 1032 bytes inherit_graph_20.map | 8 +- inherit_graph_20.png | Bin 8658 -> 7180 bytes inherit_graph_21.map | 2 +- inherit_graph_21.png | Bin 1426 -> 1209 bytes inherit_graph_22.map | 2 +- inherit_graph_22.png | Bin 1030 -> 980 bytes inherit_graph_23.map | 2 +- inherit_graph_23.png | Bin 1732 -> 1311 bytes inherit_graph_24.map | 2 +- inherit_graph_24.png | Bin 1123 -> 1004 bytes inherit_graph_25.map | 2 +- inherit_graph_25.png | Bin 1020 -> 921 bytes inherit_graph_26.map | 2 +- inherit_graph_26.png | Bin 1288 -> 1050 bytes inherit_graph_27.map | 2 +- inherit_graph_27.png | Bin 1629 -> 1224 bytes inherit_graph_28.map | 4 +- inherit_graph_28.png | Bin 3604 -> 3113 bytes inherit_graph_29.map | 2 +- inherit_graph_29.png | Bin 1943 -> 1931 bytes inherit_graph_3.map | 2 +- inherit_graph_3.png | Bin 1310 -> 1180 bytes inherit_graph_30.map | 2 +- inherit_graph_30.png | Bin 1595 -> 1247 bytes inherit_graph_31.map | 2 +- inherit_graph_31.png | Bin 1453 -> 1159 bytes inherit_graph_32.map | 2 +- inherit_graph_32.png | Bin 1790 -> 1673 bytes inherit_graph_33.map | 2 +- inherit_graph_33.png | Bin 1543 -> 1190 bytes inherit_graph_34.map | 2 +- inherit_graph_34.png | Bin 1359 -> 1090 bytes inherit_graph_35.map | 2 +- inherit_graph_35.png | Bin 1061 -> 908 bytes inherit_graph_36.map | 2 +- inherit_graph_36.png | Bin 1381 -> 1045 bytes inherit_graph_37.map | 2 +- inherit_graph_37.png | Bin 1124 -> 964 bytes inherit_graph_38.map | 2 +- inherit_graph_38.png | Bin 1633 -> 1455 bytes inherit_graph_39.png | Bin 1086 -> 906 bytes inherit_graph_4.map | 2 +- inherit_graph_4.png | Bin 2029 -> 1817 bytes inherit_graph_40.map | 2 +- inherit_graph_40.png | Bin 2010 -> 1501 bytes inherit_graph_41.map | 2 +- inherit_graph_41.png | Bin 1036 -> 827 bytes inherit_graph_42.map | 2 +- inherit_graph_42.png | Bin 2411 -> 1907 bytes inherit_graph_43.map | 2 +- inherit_graph_43.png | Bin 1951 -> 1580 bytes inherit_graph_44.map | 2 +- inherit_graph_44.png | Bin 1446 -> 1180 bytes inherit_graph_45.map | 2 +- inherit_graph_45.png | Bin 1142 -> 1054 bytes inherit_graph_46.map | 2 +- inherit_graph_46.png | Bin 1378 -> 1106 bytes inherit_graph_47.map | 2 +- inherit_graph_47.png | Bin 2355 -> 2202 bytes inherit_graph_48.map | 2 +- inherit_graph_48.png | Bin 1912 -> 1634 bytes inherit_graph_49.map | 2 +- inherit_graph_49.png | Bin 2204 -> 1646 bytes inherit_graph_5.map | 2 +- inherit_graph_5.png | Bin 1162 -> 957 bytes inherit_graph_50.map | 2 +- inherit_graph_50.png | Bin 1755 -> 1448 bytes inherit_graph_51.map | 2 +- inherit_graph_51.png | Bin 2364 -> 1954 bytes inherit_graph_52.map | 2 +- inherit_graph_52.png | Bin 1409 -> 1140 bytes inherit_graph_53.map | 2 +- inherit_graph_53.png | Bin 1841 -> 1481 bytes inherit_graph_54.map | 58 +- inherit_graph_54.png | Bin 103362 -> 99847 bytes inherit_graph_55.map | 10 +- inherit_graph_55.png | Bin 16173 -> 14648 bytes inherit_graph_6.map | 2 +- inherit_graph_6.png | Bin 970 -> 846 bytes inherit_graph_7.map | 2 +- inherit_graph_7.png | Bin 1005 -> 830 bytes inherit_graph_8.png | Bin 946 -> 825 bytes inherit_graph_9.map | 2 +- inherit_graph_9.png | Bin 1793 -> 1300 bytes inherits.html | 221 ++- jquery.js | 57 +- macros_8h.html | 38 +- macros_8h__dep__incl.map | 2 +- macros_8h__dep__incl.md5 | 2 +- macros_8h__dep__incl.png | Bin 2413 -> 2247 bytes macros_8h_source.html | 102 +- masstorage_8cpp.html | 19 +- masstorage_8cpp__incl.map | 4 +- masstorage_8cpp__incl.md5 | 2 +- masstorage_8cpp__incl.png | Bin 4925 -> 4511 bytes masstorage_8cpp_source.html | 1033 +---------- masstorage_8h.html | 21 +- masstorage_8h__dep__incl.map | 2 +- masstorage_8h__dep__incl.md5 | 2 +- masstorage_8h__dep__incl.png | Bin 3295 -> 2997 bytes masstorage_8h__incl.map | 2 +- masstorage_8h__incl.md5 | 2 +- masstorage_8h__incl.png | Bin 2540 -> 2391 bytes masstorage_8h_source.html | 674 +------ max3421e_8h.html | 13 +- max3421e_8h_source.html | 250 +-- max___l_c_d_8cpp.html | 31 +- max___l_c_d_8cpp__incl.map | 4 +- max___l_c_d_8cpp__incl.md5 | 2 +- max___l_c_d_8cpp__incl.png | Bin 8988 -> 8179 bytes max___l_c_d_8cpp_source.html | 270 +-- max___l_c_d_8h.html | 23 +- max___l_c_d_8h__dep__incl.map | 2 +- max___l_c_d_8h__dep__incl.md5 | 2 +- max___l_c_d_8h__dep__incl.png | Bin 2832 -> 2582 bytes max___l_c_d_8h__incl.map | 2 +- max___l_c_d_8h__incl.md5 | 2 +- max___l_c_d_8h__incl.png | Bin 4540 -> 4217 bytes max___l_c_d_8h_source.html | 121 +- ...era_readme.html => md_WiiCameraReadme.html | 13 +- message_8cpp.html | 18 +- message_8cpp__incl.map | 2 +- message_8cpp__incl.md5 | 2 +- message_8cpp__incl.png | Bin 2522 -> 2562 bytes message_8cpp_source.html | 138 +- message_8h.html | 13 +- message_8h_source.html | 100 +- pages.html | 15 +- parsetools_8cpp.html | 18 +- parsetools_8cpp__incl.map | 2 +- parsetools_8cpp__incl.md5 | 2 +- parsetools_8cpp__incl.png | Bin 2509 -> 2512 bytes parsetools_8cpp_source.html | 92 +- parsetools_8h.html | 23 +- parsetools_8h_source.html | 191 +- printhex_8h.html | 13 +- printhex_8h_source.html | 106 +- search/all_0.html | 2 +- search/all_1.html | 2 +- search/all_10.html | 2 +- search/all_10.js | 4 +- search/all_11.html | 2 +- search/all_12.html | 2 +- search/all_12.js | 6 +- search/all_13.html | 2 +- search/all_14.html | 2 +- search/all_15.html | 2 +- search/all_15.js | 7 +- search/all_16.html | 2 +- search/all_17.html | 2 +- search/all_17.js | 4 +- search/all_18.html | 2 +- search/all_19.html | 2 +- search/all_1a.html | 2 +- search/all_2.html | 2 +- search/all_3.html | 2 +- search/all_4.html | 2 +- search/all_5.html | 2 +- search/all_6.html | 2 +- search/all_7.html | 2 +- search/all_8.html | 2 +- search/all_9.html | 2 +- search/all_a.html | 2 +- search/all_b.html | 2 +- search/all_c.html | 2 +- search/all_d.html | 2 +- search/all_d.js | 2 +- search/all_e.html | 2 +- search/all_f.html | 2 +- search/all_f.js | 2 +- search/classes_0.html | 2 +- search/classes_1.html | 2 +- search/classes_10.html | 2 +- search/classes_2.html | 2 +- search/classes_3.html | 2 +- search/classes_4.html | 2 +- search/classes_5.html | 2 +- search/classes_6.html | 2 +- search/classes_7.html | 2 +- search/classes_8.html | 2 +- search/classes_9.html | 2 +- search/classes_a.html | 2 +- search/classes_b.html | 2 +- search/classes_c.html | 2 +- search/classes_d.html | 2 +- search/classes_e.html | 2 +- search/classes_f.html | 2 +- search/defines_0.html | 2 +- search/defines_1.html | 2 +- search/defines_10.html | 2 +- search/defines_11.html | 2 +- search/defines_12.html | 2 +- search/defines_13.html | 2 +- search/defines_14.html | 2 +- search/defines_15.html | 2 +- search/defines_16.html | 2 +- search/defines_17.html | 2 +- search/defines_2.html | 2 +- search/defines_3.html | 2 +- search/defines_4.html | 2 +- search/defines_5.html | 2 +- search/defines_6.html | 2 +- search/defines_7.html | 2 +- search/defines_8.html | 2 +- search/defines_9.html | 2 +- search/defines_a.html | 2 +- search/defines_b.html | 2 +- search/defines_c.html | 2 +- search/defines_d.html | 2 +- search/defines_e.html | 2 +- search/defines_f.html | 2 +- search/enums_0.html | 2 +- search/enums_1.html | 2 +- search/enums_2.html | 2 +- search/enums_3.html | 2 +- search/enums_4.html | 2 +- search/enums_5.html | 2 +- search/enums_6.html | 2 +- search/enums_7.html | 2 +- search/enums_8.html | 2 +- search/enums_9.html | 2 +- search/enums_a.html | 2 +- search/enumvalues_0.html | 2 +- search/enumvalues_1.html | 2 +- search/enumvalues_10.html | 2 +- search/enumvalues_11.html | 2 +- search/enumvalues_12.html | 2 +- search/enumvalues_13.html | 2 +- search/enumvalues_14.html | 2 +- search/enumvalues_15.html | 2 +- search/enumvalues_16.html | 2 +- search/enumvalues_2.html | 2 +- search/enumvalues_3.html | 2 +- search/enumvalues_4.html | 2 +- search/enumvalues_5.html | 2 +- search/enumvalues_6.html | 2 +- search/enumvalues_7.html | 2 +- search/enumvalues_8.html | 2 +- search/enumvalues_9.html | 2 +- search/enumvalues_a.html | 2 +- search/enumvalues_b.html | 2 +- search/enumvalues_c.html | 2 +- search/enumvalues_d.html | 2 +- search/enumvalues_e.html | 2 +- search/enumvalues_f.html | 2 +- search/files_0.html | 2 +- search/files_1.html | 2 +- search/files_2.html | 2 +- search/files_3.html | 2 +- search/files_4.html | 2 +- search/files_5.html | 2 +- search/files_6.html | 2 +- search/files_7.html | 2 +- search/files_8.html | 2 +- search/files_9.html | 2 +- search/files_a.html | 2 +- search/files_b.html | 2 +- search/functions_0.html | 2 +- search/functions_1.html | 2 +- search/functions_10.html | 2 +- search/functions_11.html | 2 +- search/functions_12.html | 2 +- search/functions_13.html | 2 +- search/functions_14.html | 2 +- search/functions_14.js | 2 +- search/functions_15.html | 2 +- search/functions_2.html | 2 +- search/functions_3.html | 2 +- search/functions_4.html | 2 +- search/functions_5.html | 2 +- search/functions_6.html | 2 +- search/functions_7.html | 2 +- search/functions_8.html | 2 +- search/functions_9.html | 2 +- search/functions_a.html | 2 +- search/functions_b.html | 2 +- search/functions_b.js | 3 +- search/functions_c.html | 2 +- search/functions_d.html | 2 +- search/functions_d.js | 2 +- search/functions_e.html | 2 +- search/functions_f.html | 2 +- search/functions_f.js | 2 +- search/pages_0.html | 2 +- search/pages_0.js | 2 +- search/pages_1.html | 26 + search/pages_1.js | 4 + search/search.js | 100 +- search/searchdata.js | 42 + search/typedefs_0.html | 2 +- search/typedefs_1.html | 2 +- search/typedefs_2.html | 2 +- search/typedefs_3.html | 2 +- search/typedefs_4.html | 2 +- search/typedefs_4.js | 2 +- search/typedefs_5.html | 2 +- search/typedefs_6.html | 2 +- search/typedefs_6.js | 4 +- search/variables_0.html | 2 +- search/variables_1.html | 2 +- search/variables_10.html | 2 +- search/variables_11.html | 2 +- search/variables_11.js | 4 +- search/variables_12.html | 2 +- search/variables_13.html | 2 +- search/variables_14.html | 2 +- search/variables_15.html | 2 +- search/variables_16.html | 2 +- search/variables_17.html | 2 +- search/variables_18.html | 2 +- search/variables_2.html | 2 +- search/variables_3.html | 2 +- search/variables_4.html | 2 +- search/variables_5.html | 2 +- search/variables_6.html | 2 +- search/variables_7.html | 2 +- search/variables_8.html | 2 +- search/variables_9.html | 2 +- search/variables_a.html | 2 +- search/variables_b.html | 2 +- search/variables_c.html | 2 +- search/variables_d.html | 2 +- search/variables_e.html | 2 +- search/variables_f.html | 2 +- search/variables_f.js | 2 +- settings_8h.html | 21 +- settings_8h__incl.map | 4 +- settings_8h__incl.md5 | 2 +- settings_8h__incl.png | Bin 9505 -> 8777 bytes settings_8h_source.html | 216 +-- sink__parser_8h.html | 13 +- sink__parser_8h_source.html | 64 +- ftv2splitbar.png => splitbar.png | Bin ...t_a_c_m___f_u_n_c___d_e_s_c_r-members.html | 13 +- struct_a_c_m___f_u_n_c___d_e_s_c_r.html | 13 +- struct_b_a_s_i_c_c_d_b-members.html | 13 +- struct_b_a_s_i_c_c_d_b.html | 13 +- ...g_m_n_t___f_u_n_c___d_e_s_c_r-members.html | 13 +- ...l_l___m_g_m_n_t___f_u_n_c___d_e_s_c_r.html | 13 +- struct_c_d_b10-members.html | 13 +- struct_c_d_b10.html | 13 +- struct_c_d_b12-members.html | 13 +- struct_c_d_b12.html | 13 +- struct_c_d_b6-members.html | 13 +- struct_c_d_b6.html | 13 +- struct_c_d_b___l_b_a32__16-members.html | 13 +- struct_c_d_b___l_b_a32__16.html | 13 +- struct_c_d_b___l_b_a64__16-members.html | 13 +- struct_c_d_b___l_b_a64__16.html | 13 +- ...s_s___n_o_t_i_f_i_c_a_t_i_o_n-members.html | 13 +- ...t_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n.html | 13 +- struct_capacity-members.html | 13 +- struct_capacity.html | 13 +- struct_command_block_wrapper-members.html | 13 +- struct_command_block_wrapper.html | 19 +- struct_command_block_wrapper__coll__graph.map | 2 +- struct_command_block_wrapper__coll__graph.md5 | 2 +- struct_command_block_wrapper__coll__graph.png | Bin 5028 -> 4245 bytes ..._command_block_wrapper__inherit__graph.map | 2 +- ..._command_block_wrapper__inherit__graph.md5 | 2 +- ..._command_block_wrapper__inherit__graph.png | Bin 5028 -> 4245 bytes ...ct_command_block_wrapper_base-members.html | 13 +- struct_command_block_wrapper_base.html | 16 +- ...and_block_wrapper_base__inherit__graph.map | 2 +- ...and_block_wrapper_base__inherit__graph.md5 | 2 +- ...and_block_wrapper_base__inherit__graph.png | Bin 5015 -> 4319 bytes struct_command_status_wrapper-members.html | 13 +- struct_command_status_wrapper.html | 13 +- struct_ep_info-members.html | 13 +- struct_ep_info.html | 13 +- ...o_r___l_e_n___a_n_d___t_y_p_e-members.html | 13 +- ...r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e.html | 13 +- struct_hid_item_prefix-members.html | 13 +- struct_hid_item_prefix.html | 13 +- struct_hub_descriptor-members.html | 13 +- struct_hub_descriptor.html | 13 +- struct_hub_event-members.html | 13 +- struct_hub_event.html | 13 +- struct_inquiry_response-members.html | 13 +- struct_inquiry_response.html | 13 +- struct_k_b_d_i_n_f_o-members.html | 13 +- struct_k_b_d_i_n_f_o.html | 13 +- struct_k_b_d_l_e_d_s-members.html | 13 +- struct_k_b_d_l_e_d_s.html | 13 +- struct_l_i_n_e___c_o_d_i_n_g-members.html | 13 +- struct_l_i_n_e___c_o_d_i_n_g.html | 13 +- struct_m_o_d_i_f_i_e_r_k_e_y_s-members.html | 13 +- struct_m_o_d_i_f_i_e_r_k_e_y_s.html | 13 +- struct_m_o_u_s_e_i_n_f_o-members.html | 13 +- struct_m_o_u_s_e_i_n_f_o.html | 13 +- struct_main_item_i_o_feature-members.html | 13 +- struct_main_item_i_o_feature.html | 13 +- struct_multi_value_buffer-members.html | 18 +- struct_multi_value_buffer.html | 47 +- struct_p_s4_data-members.html | 13 +- struct_p_s4_data.html | 18 +- struct_p_s4_data__coll__graph.map | 6 +- struct_p_s4_data__coll__graph.md5 | 2 +- struct_p_s4_data__coll__graph.png | Bin 7291 -> 7380 bytes struct_p_s4_output-members.html | 13 +- struct_p_s4_output.html | 13 +- struct_p_s4_status-members.html | 13 +- struct_p_s4_status.html | 13 +- struct_request_sense_responce-members.html | 13 +- struct_request_sense_responce.html | 13 +- struct_s_e_t_u_p___p_k_t-members.html | 13 +- struct_s_e_t_u_p___p_k_t.html | 13 +- ...n_g_e_r___f_u_n_c___d_e_s_c_r-members.html | 13 +- ...l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r.html | 13 +- ...t_i_o_n___d_e_s_c_r_i_p_t_o_r-members.html | 13 +- ...g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r.html | 13 +- ...v_i_c_e___d_e_s_c_r_i_p_t_o_r-members.html | 13 +- ...b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html | 13 +- ...o_i_n_t___d_e_s_c_r_i_p_t_o_r-members.html | 13 +- ...e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r.html | 13 +- ...__h_i_d___d_e_s_c_r_i_p_t_o_r-members.html | 13 +- ...t_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html | 13 +- ...f_a_c_e___d_e_s_c_r_i_p_t_o_r-members.html | 13 +- ...n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r.html | 13 +- struct_usb_device-members.html | 13 +- struct_usb_device.html | 17 +- struct_usb_device__coll__graph.map | 4 +- struct_usb_device__coll__graph.md5 | 2 +- struct_usb_device__coll__graph.png | Bin 5566 -> 6178 bytes struct_usb_device_address-members.html | 13 +- struct_usb_device_address.html | 13 +- structtouchpad_x_y-members.html | 13 +- structtouchpad_x_y.html | 13 +- structtty__features-members.html | 13 +- structtty__features.html | 13 +- union_p_s4_buttons-members.html | 13 +- union_p_s4_buttons.html | 13 +- union_p_s_b_u_z_z_buttons-members.html | 13 +- union_p_s_b_u_z_z_buttons.html | 13 +- usb__ch9_8h.html | 13 +- usb__ch9_8h_source.html | 188 +- usbh__midi_8cpp.html | 19 +- usbh__midi_8cpp__incl.map | 4 +- usbh__midi_8cpp__incl.md5 | 2 +- usbh__midi_8cpp__incl.png | Bin 4086 -> 3602 bytes usbh__midi_8cpp_source.html | 657 +------ usbh__midi_8h.html | 21 +- usbh__midi_8h__dep__incl.map | 2 +- usbh__midi_8h__dep__incl.md5 | 2 +- usbh__midi_8h__dep__incl.png | Bin 2578 -> 2288 bytes usbh__midi_8h__incl.map | 2 +- usbh__midi_8h__incl.md5 | 2 +- usbh__midi_8h__incl.png | Bin 2125 -> 1998 bytes usbh__midi_8h_source.html | 107 +- usbhid_8cpp.html | 20 +- usbhid_8cpp__incl.map | 6 +- usbhid_8cpp__incl.md5 | 2 +- usbhid_8cpp__incl.png | Bin 8485 -> 8007 bytes usbhid_8cpp_source.html | 127 +- usbhid_8h.html | 52 +- usbhid_8h__dep__incl.map | 56 +- usbhid_8h__dep__incl.md5 | 2 +- usbhid_8h__dep__incl.png | Bin 49358 -> 46636 bytes usbhid_8h__incl.map | 4 +- usbhid_8h__incl.md5 | 2 +- usbhid_8h__incl.png | Bin 6750 -> 6609 bytes usbhid_8h_source.html | 228 +-- usbhost_8h.html | 17 +- usbhost_8h_source.html | 615 +------ usbhub_8cpp.html | 19 +- usbhub_8cpp__incl.map | 4 +- usbhub_8cpp__incl.md5 | 2 +- usbhub_8cpp__incl.png | Bin 3296 -> 2962 bytes usbhub_8cpp_source.html | 442 +---- usbhub_8h.html | 21 +- usbhub_8h__dep__incl.map | 2 +- usbhub_8h__dep__incl.md5 | 2 +- usbhub_8h__dep__incl.png | Bin 2307 -> 2063 bytes usbhub_8h__incl.map | 2 +- usbhub_8h__incl.md5 | 2 +- usbhub_8h__incl.png | Bin 2067 -> 1761 bytes usbhub_8h_source.html | 275 +-- version__helper_8h.html | 80 +- version__helper_8h__dep__incl.map | 2 +- version__helper_8h__dep__incl.md5 | 2 +- version__helper_8h__dep__incl.png | Bin 2701 -> 2404 bytes version__helper_8h__incl.md5 | 2 +- version__helper_8h__incl.png | Bin 5551 -> 5141 bytes version__helper_8h_source.html | 216 +-- xbox_enums_8h.html | 69 +- xbox_enums_8h__dep__incl.map | 12 +- xbox_enums_8h__dep__incl.md5 | 2 +- xbox_enums_8h__dep__incl.png | Bin 11830 -> 10810 bytes xbox_enums_8h__incl.map | 2 +- xbox_enums_8h__incl.md5 | 2 +- xbox_enums_8h__incl.png | Bin 2978 -> 2633 bytes xbox_enums_8h_source.html | 77 +- 1366 files changed, 7168 insertions(+), 34283 deletions(-) rename ftv2mlastnode.png => arrowdown.png (100%) rename ftv2plastnode.png => arrowright.png (100%) rename ftv2doc.png => doc.png (100%) rename ftv2folderclosed.png => folderclosed.png (100%) rename ftv2folderopen.png => folderopen.png (100%) delete mode 100644 ftv2blank.png delete mode 100644 ftv2cl.png delete mode 100644 ftv2lastnode.png delete mode 100644 ftv2link.png delete mode 100644 ftv2mnode.png delete mode 100644 ftv2mo.png delete mode 100644 ftv2node.png delete mode 100644 ftv2ns.png delete mode 100644 ftv2pnode.png delete mode 100644 ftv2vertline.png rename md__wii_camera_readme.html => md_WiiCameraReadme.html (73%) create mode 100644 search/pages_1.html create mode 100644 search/pages_1.js create mode 100644 search/searchdata.js rename ftv2splitbar.png => splitbar.png (100%) diff --git a/_b_t_d_8cpp.html b/_b_t_d_8cpp.html index 82105023..c652f3a7 100644 --- a/_b_t_d_8cpp.html +++ b/_b_t_d_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -85,13 +86,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTD.cpp File Reference
-
#include "BTD.h"
+
#include "BTD.h"
Include dependency graph for BTD.cpp:
- + + + + +

Go to the source code of this file.

@@ -100,7 +105,7 @@ Include dependency graph for BTD.cpp:
diff --git a/_b_t_d_8cpp__incl.map b/_b_t_d_8cpp__incl.map index 9ae84451..f7186e4f 100644 --- a/_b_t_d_8cpp__incl.map +++ b/_b_t_d_8cpp__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/_b_t_d_8cpp__incl.md5 b/_b_t_d_8cpp__incl.md5 index 2f6b90ad..a355a3b6 100644 --- a/_b_t_d_8cpp__incl.md5 +++ b/_b_t_d_8cpp__incl.md5 @@ -1 +1 @@ -9e3efe583f76e28914f4f8835557cb98 \ No newline at end of file +958bad8ed4b3f7ba0b3843a14e09d10f \ No newline at end of file diff --git a/_b_t_d_8cpp__incl.png b/_b_t_d_8cpp__incl.png index 3e56e52f0bd92b6c07e0dd15b43b12a932d86732..b753a3bff201eae0724a94b5cae67b002edfb33b 100644 GIT binary patch literal 10782 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 adN8X#j8#rjdIKbBkdmCbY=w-)hyMTrGe}wh literal 11253 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 diff --git a/_b_t_d_8cpp_source.html b/_b_t_d_8cpp_source.html index 75d85d94..9c94b9d3 100644 --- a/_b_t_d_8cpp_source.html +++ b/_b_t_d_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -85,1391 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTD.cpp
-Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
-
2 
-
3  This software may be distributed and modified under the terms of the GNU
-
4  General Public License version 2 (GPL2) as published by the Free Software
-
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
-
6  this file. Please note that GPL2 Section 2[b] requires that all works based
-
7  on this software must also be made publicly available under the terms of
-
8  the GPL2 ("Copyleft").
-
9 
-
10  Contact information
-
11  -------------------
-
12 
-
13  Kristian Lauszus, TKJ Electronics
-
14  Web : http://www.tkjelectronics.com
-
15  e-mail : kristianl@tkjelectronics.com
-
16  */
-
17 
-
18 #include "BTD.h"
-
19 // To enable serial debugging see "settings.h"
-
20 //#define EXTRADEBUG // Uncomment to get even more debugging data
-
21 
-
22 const uint8_t BTD::BTD_CONTROL_PIPE = 0;
-
23 const uint8_t BTD::BTD_EVENT_PIPE = 1;
-
24 const uint8_t BTD::BTD_DATAIN_PIPE = 2;
-
25 const uint8_t BTD::BTD_DATAOUT_PIPE = 3;
-
26 
- -
28 connectToWii(false),
-
29 pairWithWii(false),
-
30 connectToHIDDevice(false),
-
31 pairWithHIDDevice(false),
-
32 pUsb(p), // Pointer to USB class instance - mandatory
-
33 bAddress(0), // Device address - mandatory
-
34 bNumEP(1), // If config descriptor needs to be parsed
-
35 qNextPollTime(0), // Reset NextPollTime
-
36 pollInterval(0),
-
37 bPollEnable(false) // Don't start polling before dongle is connected
-
38 {
-
39  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
-
40  btService[i] = NULL;
-
41 
-
42  Initialize(); // Set all variables, endpoint structs etc. to default values
-
43 
-
44  if(pUsb) // Register in USB subsystem
-
45  pUsb->RegisterDeviceClass(this); // Set devConfig[] entry
-
46 }
-
47 
-
48 uint8_t BTD::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
-
49  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
-
50  uint8_t buf[constBufSize];
-
51  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
-
52  uint8_t rcode;
-
53  UsbDevice *p = NULL;
-
54  EpInfo *oldep_ptr = NULL;
-
55 
-
56  Initialize(); // Set all variables, endpoint structs etc. to default values
-
57 
-
58  AddressPool &addrPool = pUsb->GetAddressPool(); // Get memory address of USB device address pool
-
59 #ifdef EXTRADEBUG
-
60  Notify(PSTR("\r\nBTD ConfigureDevice"), 0x80);
-
61 #endif
-
62 
-
63  if(bAddress) { // Check if address has already been assigned to an instance
-
64 #ifdef DEBUG_USB_HOST
-
65  Notify(PSTR("\r\nAddress in use"), 0x80);
-
66 #endif
- -
68  }
-
69 
-
70  p = addrPool.GetUsbDevicePtr(0); // Get pointer to pseudo device with address 0 assigned
-
71  if(!p) {
-
72 #ifdef DEBUG_USB_HOST
-
73  Notify(PSTR("\r\nAddress not found"), 0x80);
-
74 #endif
- -
76  }
-
77 
-
78  if(!p->epinfo) {
-
79 #ifdef DEBUG_USB_HOST
-
80  Notify(PSTR("\r\nepinfo is null"), 0x80);
-
81 #endif
- -
83  }
-
84 
-
85  oldep_ptr = p->epinfo; // Save old pointer to EP_RECORD of address 0
-
86  p->epinfo = epInfo; // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
-
87  p->lowspeed = lowspeed;
-
88  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
-
89 
-
90  p->epinfo = oldep_ptr; // Restore p->epinfo
-
91 
-
92  if(rcode)
-
93  goto FailGetDevDescr;
-
94 
-
95  bAddress = addrPool.AllocAddress(parent, false, port); // Allocate new address according to device class
-
96 
-
97  if(!bAddress) {
-
98 #ifdef DEBUG_USB_HOST
-
99  Notify(PSTR("\r\nOut of address space"), 0x80);
-
100 #endif
- -
102  }
-
103 
-
104  if (udd->bDeviceClass == 0x09) // Some dongles have an USB hub inside
-
105  goto FailHub;
-
106 
-
107  epInfo[0].maxPktSize = udd->bMaxPacketSize0; // Extract Max Packet Size from device descriptor
-
108  epInfo[1].epAddr = udd->bNumConfigurations; // Steal and abuse from epInfo structure to save memory
-
109 
-
110  VID = udd->idVendor;
-
111  PID = udd->idProduct;
-
112 
- -
114 
-
115 FailHub:
-
116 #ifdef DEBUG_USB_HOST
-
117  Notify(PSTR("\r\nPlease create a hub instance in your code: \"USBHub Hub1(&Usb);\""), 0x80);
-
118 #endif
-
119  pUsb->setAddr(bAddress, 0, 0); // Reset address
- -
121  Release();
-
122  return rcode;
-
123 
-
124 FailGetDevDescr:
-
125 #ifdef DEBUG_USB_HOST
-
126  NotifyFailGetDevDescr(rcode);
-
127 #endif
-
128  if(rcode != hrJERR)
- -
130  Release();
-
131  return rcode;
-
132 };
-
133 
-
134 uint8_t BTD::Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed) {
-
135  uint8_t rcode;
-
136  uint8_t num_of_conf = epInfo[1].epAddr; // Number of configurations
-
137  epInfo[1].epAddr = 0;
-
138 
-
139  AddressPool &addrPool = pUsb->GetAddressPool();
-
140 #ifdef EXTRADEBUG
-
141  Notify(PSTR("\r\nBTD Init"), 0x80);
-
142 #endif
-
143  UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
-
144 
-
145  if(!p) {
-
146 #ifdef DEBUG_USB_HOST
-
147  Notify(PSTR("\r\nAddress not found"), 0x80);
-
148 #endif
- -
150  }
-
151 
-
152  delay(300); // Assign new address to the device
-
153 
-
154  rcode = pUsb->setAddr(0, 0, bAddress); // Assign new address to the device
-
155  if(rcode) {
-
156 #ifdef DEBUG_USB_HOST
-
157  Notify(PSTR("\r\nsetAddr: "), 0x80);
-
158  D_PrintHex<uint8_t > (rcode, 0x80);
-
159 #endif
-
160  p->lowspeed = false;
-
161  goto Fail;
-
162  }
-
163 #ifdef EXTRADEBUG
-
164  Notify(PSTR("\r\nAddr: "), 0x80);
-
165  D_PrintHex<uint8_t > (bAddress, 0x80);
-
166 #endif
-
167 
-
168  p->lowspeed = false;
-
169 
-
170  p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
-
171  if(!p) {
-
172 #ifdef DEBUG_USB_HOST
-
173  Notify(PSTR("\r\nAddress not found"), 0x80);
-
174 #endif
- -
176  }
-
177 
-
178  p->lowspeed = lowspeed;
-
179 
-
180  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo); // Assign epInfo to epinfo pointer - only EP0 is known
-
181  if(rcode)
-
182  goto FailSetDevTblEntry;
-
183 
-
184  if(VID == PS3_VID && (PID == PS3_PID || PID == PS3NAVIGATION_PID || PID == PS3MOVE_PID)) {
-
185  delay(100);
-
186  rcode = pUsb->setConf(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, 1); // We only need the Control endpoint, so we don't have to initialize the other endpoints of device
-
187  if(rcode)
-
188  goto FailSetConfDescr;
-
189 
-
190 #ifdef DEBUG_USB_HOST
-
191  if(PID == PS3_PID || PID == PS3NAVIGATION_PID) {
-
192  if(PID == PS3_PID)
-
193  Notify(PSTR("\r\nDualshock 3 Controller Connected"), 0x80);
-
194  else // It must be a navigation controller
-
195  Notify(PSTR("\r\nNavigation Controller Connected"), 0x80);
-
196  } else // It must be a Motion controller
-
197  Notify(PSTR("\r\nMotion Controller Connected"), 0x80);
-
198 #endif
-
199 
-
200  if(my_bdaddr[0] == 0x00 && my_bdaddr[1] == 0x00 && my_bdaddr[2] == 0x00 && my_bdaddr[3] == 0x00 && my_bdaddr[4] == 0x00 && my_bdaddr[5] == 0x00) {
-
201 #ifdef DEBUG_USB_HOST
-
202  Notify(PSTR("\r\nPlease plug in the dongle before trying to pair with the PS3 Controller\r\nor set the Bluetooth address in the constructor of the PS3BT class"), 0x80);
-
203 #endif
-
204  } else {
-
205  if(PID == PS3_PID || PID == PS3NAVIGATION_PID)
-
206  setBdaddr(my_bdaddr); // Set internal Bluetooth address
-
207  else
-
208  setMoveBdaddr(my_bdaddr); // Set internal Bluetooth address
-
209 #ifdef DEBUG_USB_HOST
-
210  Notify(PSTR("\r\nBluetooth Address was set to: "), 0x80);
-
211  for(int8_t i = 5; i > 0; i--) {
-
212  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
-
213  Notify(PSTR(":"), 0x80);
-
214  }
-
215  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
-
216 #endif
-
217  }
-
218 
-
219  pUsb->setConf(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, 0); // Reset configuration value
-
220  pUsb->setAddr(bAddress, 0, 0); // Reset address
-
221  Release(); // Release device
- -
223  } else {
-
224  // Check if attached device is a Bluetooth dongle and fill endpoint data structure
-
225  // First interface in the configuration must have Bluetooth assigned Class/Subclass/Protocol
-
226  // And 3 endpoints - interrupt-IN, bulk-IN, bulk-OUT, not necessarily in this order
-
227  for(uint8_t i = 0; i < num_of_conf; i++) {
-
228  if((VID == IOGEAR_GBU521_VID && PID == IOGEAR_GBU521_PID) || (VID == BELKIN_F8T065BF_VID && PID == BELKIN_F8T065BF_PID)) {
-
229  ConfigDescParser<USB_CLASS_VENDOR_SPECIFIC, WI_SUBCLASS_RF, WI_PROTOCOL_BT, CP_MASK_COMPARE_ALL> confDescrParser(this); // Workaround issue with some dongles
-
230  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
-
231  } else {
-
232  ConfigDescParser<USB_CLASS_WIRELESS_CTRL, WI_SUBCLASS_RF, WI_PROTOCOL_BT, CP_MASK_COMPARE_ALL> confDescrParser(this); // Set class id according to the specification
-
233  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
-
234  }
-
235  if(rcode) // Check error code
-
236  goto FailGetConfDescr;
-
237  if(bNumEP >= BTD_MAX_ENDPOINTS) // All endpoints extracted
-
238  break;
-
239  }
-
240 
- -
242  goto FailUnknownDevice;
-
243 
-
244  // Assign epInfo to epinfo pointer - this time all 3 endpoins
-
245  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
-
246  if(rcode)
-
247  goto FailSetDevTblEntry;
-
248 
-
249  // Set Configuration Value
-
250  rcode = pUsb->setConf(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bConfNum);
-
251  if(rcode)
-
252  goto FailSetConfDescr;
-
253 
-
254  hci_num_reset_loops = 100; // only loop 100 times before trying to send the hci reset command
-
255  hci_counter = 0;
-
256  hci_state = HCI_INIT_STATE;
-
257  waitingForConnection = false;
-
258  bPollEnable = true;
-
259 
-
260 #ifdef DEBUG_USB_HOST
-
261  Notify(PSTR("\r\nBluetooth Dongle Initialized"), 0x80);
-
262 #endif
-
263  }
-
264  return 0; // Successful configuration
-
265 
-
266  /* Diagnostic messages */
-
267 FailSetDevTblEntry:
-
268 #ifdef DEBUG_USB_HOST
- -
270  goto Fail;
-
271 #endif
-
272 
-
273 FailGetConfDescr:
-
274 #ifdef DEBUG_USB_HOST
- -
276  goto Fail;
-
277 #endif
-
278 
-
279 FailSetConfDescr:
-
280 #ifdef DEBUG_USB_HOST
- -
282 #endif
-
283  goto Fail;
-
284 
-
285 FailUnknownDevice:
-
286 #ifdef DEBUG_USB_HOST
-
287  NotifyFailUnknownDevice(VID, PID);
-
288 #endif
-
289  pUsb->setAddr(bAddress, 0, 0); // Reset address
- -
291 Fail:
-
292 #ifdef DEBUG_USB_HOST
-
293  Notify(PSTR("\r\nBTD Init Failed, error code: "), 0x80);
-
294  NotifyFail(rcode);
-
295 #endif
-
296  Release();
-
297  return rcode;
-
298 }
-
299 
-
300 void BTD::Initialize() {
-
301  uint8_t i;
-
302  for(i = 0; i < BTD_MAX_ENDPOINTS; i++) {
-
303  epInfo[i].epAddr = 0;
-
304  epInfo[i].maxPktSize = (i) ? 0 : 8;
-
305  epInfo[i].bmSndToggle = 0;
-
306  epInfo[i].bmRcvToggle = 0;
- -
308  }
-
309  for(i = 0; i < BTD_NUM_SERVICES; i++) {
-
310  if(btService[i])
-
311  btService[i]->Reset(); // Reset all Bluetooth services
-
312  }
-
313 
-
314  connectToWii = false;
-
315  incomingWii = false;
-
316  connectToHIDDevice = false;
-
317  incomingHIDDevice = false;
-
318  incomingPS4 = false;
-
319  bAddress = 0; // Clear device address
-
320  bNumEP = 1; // Must have to be reset to 1
-
321  qNextPollTime = 0; // Reset next poll time
-
322  pollInterval = 0;
-
323  bPollEnable = false; // Don't start polling before dongle is connected
-
324 }
-
325 
-
326 /* Extracts interrupt-IN, bulk-IN, bulk-OUT endpoint information from config descriptor */
-
327 void BTD::EndpointXtract(uint8_t conf, uint8_t iface __attribute__((unused)), uint8_t alt, uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
-
328  //ErrorMessage<uint8_t>(PSTR("Conf.Val"),conf);
-
329  //ErrorMessage<uint8_t>(PSTR("Iface Num"),iface);
-
330  //ErrorMessage<uint8_t>(PSTR("Alt.Set"),alt);
-
331 
-
332  if(alt) // Wrong interface - by BT spec, no alt setting
-
333  return;
-
334 
-
335  bConfNum = conf;
-
336  uint8_t index;
-
337 
-
338  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80) { // Interrupt In endpoint found
-
339  index = BTD_EVENT_PIPE;
- -
341  } else if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_BULK) // Bulk endpoint found
-
342  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? BTD_DATAIN_PIPE : BTD_DATAOUT_PIPE;
-
343  else
-
344  return;
-
345 
-
346  // Fill the rest of endpoint data structure
-
347  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
-
348  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
-
349 #ifdef EXTRADEBUG
- -
351 #endif
-
352  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
-
353  pollInterval = pep->bInterval;
-
354  bNumEP++;
-
355 }
-
356 
-
357 void BTD::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr __attribute__((unused))) {
-
358 #ifdef EXTRADEBUG
-
359  Notify(PSTR("\r\nEndpoint descriptor:"), 0x80);
-
360  Notify(PSTR("\r\nLength:\t\t"), 0x80);
-
361  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
-
362  Notify(PSTR("\r\nType:\t\t"), 0x80);
-
363  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
-
364  Notify(PSTR("\r\nAddress:\t"), 0x80);
-
365  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
-
366  Notify(PSTR("\r\nAttributes:\t"), 0x80);
-
367  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
-
368  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
-
369  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
-
370  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
-
371  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
-
372 #endif
-
373 }
-
374 
-
375 /* Performs a cleanup after failed Init() attempt */
-
376 uint8_t BTD::Release() {
-
377  Initialize(); // Set all variables, endpoint structs etc. to default values
- -
379  return 0;
-
380 }
-
381 
-
382 uint8_t BTD::Poll() {
-
383  if(!bPollEnable)
-
384  return 0;
-
385  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) { // Don't poll if shorter than polling interval
-
386  qNextPollTime = (uint32_t)millis() + pollInterval; // Set new poll time
-
387  HCI_event_task(); // Poll the HCI event pipe
-
388  HCI_task(); // HCI state machine
-
389  ACL_event_task(); // Poll the ACL input pipe too
-
390  }
-
391  return 0;
-
392 }
-
393 
- -
395  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
-
396  if(btService[i])
-
397  btService[i]->disconnect();
-
398 };
-
399 
-
400 void BTD::HCI_event_task() {
-
401  uint16_t length = BULK_MAXPKTSIZE; // Request more than 16 bytes anyway, the inTransfer routine will take care of this
-
402  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_EVENT_PIPE ].epAddr, &length, hcibuf, pollInterval); // Input on endpoint 1
-
403 
-
404  if(!rcode || rcode == hrNAK) { // Check for errors
-
405  switch(hcibuf[0]) { // Switch on event type
-
406  case EV_COMMAND_COMPLETE:
-
407  if(!hcibuf[5]) { // Check if command succeeded
-
408  hci_set_flag(HCI_FLAG_CMD_COMPLETE); // Set command complete flag
-
409  if((hcibuf[3] == 0x01) && (hcibuf[4] == 0x10)) { // Parameters from read local version information
-
410  hci_version = hcibuf[6]; // Used to check if it supports 2.0+EDR - see http://www.bluetooth.org/Technical/AssignedNumbers/hci.htm
- -
412  } else if((hcibuf[3] == 0x09) && (hcibuf[4] == 0x10)) { // Parameters from read local bluetooth address
-
413  for(uint8_t i = 0; i < 6; i++)
-
414  my_bdaddr[i] = hcibuf[6 + i];
- -
416  }
-
417  }
-
418  break;
-
419 
-
420  case EV_COMMAND_STATUS:
-
421  if(hcibuf[2]) { // Show status on serial if not OK
-
422 #ifdef DEBUG_USB_HOST
-
423  Notify(PSTR("\r\nHCI Command Failed: "), 0x80);
-
424  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
-
425 #endif
-
426  }
-
427  break;
-
428 
-
429  case EV_INQUIRY_COMPLETE:
-
430  if(inquiry_counter >= 5 && (pairWithWii || pairWithHIDDevice)) {
-
431  inquiry_counter = 0;
-
432 #ifdef DEBUG_USB_HOST
-
433  if(pairWithWii)
-
434  Notify(PSTR("\r\nCouldn't find Wiimote"), 0x80);
-
435  else
-
436  Notify(PSTR("\r\nCouldn't find HID device"), 0x80);
-
437 #endif
-
438  connectToWii = false;
-
439  pairWithWii = false;
-
440  connectToHIDDevice = false;
-
441  pairWithHIDDevice = false;
-
442  hci_state = HCI_SCANNING_STATE;
-
443  }
-
444  inquiry_counter++;
-
445  break;
-
446 
-
447  case EV_INQUIRY_RESULT:
-
448  if(hcibuf[2]) { // Check that there is more than zero responses
-
449 #ifdef EXTRADEBUG
-
450  Notify(PSTR("\r\nNumber of responses: "), 0x80);
-
451  Notify(hcibuf[2], 0x80);
-
452 #endif
-
453  for(uint8_t i = 0; i < hcibuf[2]; i++) {
-
454  uint8_t offset = 8 * hcibuf[2] + 3 * i;
-
455 
-
456  for(uint8_t j = 0; j < 3; j++)
-
457  classOfDevice[j] = hcibuf[j + 4 + offset];
-
458 
-
459 #ifdef EXTRADEBUG
-
460  Notify(PSTR("\r\nClass of device: "), 0x80);
-
461  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
-
462  Notify(PSTR(" "), 0x80);
-
463  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
-
464  Notify(PSTR(" "), 0x80);
-
465  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
-
466 #endif
-
467 
-
468  if(pairWithWii && classOfDevice[2] == 0x00 && (classOfDevice[1] & 0x05) && (classOfDevice[0] & 0x0C)) { // See http://wiibrew.org/wiki/Wiimote#SDP_information
-
469  checkRemoteName = true; // Check remote name to distinguish between the different controllers
-
470 
-
471  for(uint8_t j = 0; j < 6; j++)
-
472  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
-
473 
- -
475  break;
-
476  } else if(pairWithHIDDevice && (classOfDevice[1] & 0x05) && (classOfDevice[0] & 0xC8)) { // Check if it is a mouse, keyboard or a gamepad - see: http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
-
477 #ifdef DEBUG_USB_HOST
-
478  if(classOfDevice[0] & 0x80)
-
479  Notify(PSTR("\r\nMouse found"), 0x80);
-
480  if(classOfDevice[0] & 0x40)
-
481  Notify(PSTR("\r\nKeyboard found"), 0x80);
-
482  if(classOfDevice[0] & 0x08)
-
483  Notify(PSTR("\r\nGamepad found"), 0x80);
-
484 #endif
-
485 
-
486  for(uint8_t j = 0; j < 6; j++)
-
487  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
-
488 
- -
490  break;
-
491  }
-
492  }
-
493  }
-
494  break;
-
495 
-
496  case EV_CONNECT_COMPLETE:
- -
498  if(!hcibuf[2]) { // Check if connected OK
-
499 #ifdef EXTRADEBUG
-
500  Notify(PSTR("\r\nConnection established"), 0x80);
-
501 #endif
-
502  hci_handle = hcibuf[3] | ((hcibuf[4] & 0x0F) << 8); // Store the handle for the ACL connection
-
503  hci_set_flag(HCI_FLAG_CONNECT_COMPLETE); // Set connection complete flag
-
504  } else {
-
505  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
506 #ifdef DEBUG_USB_HOST
-
507  Notify(PSTR("\r\nConnection Failed: "), 0x80);
-
508  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
-
509 #endif
-
510  }
-
511  break;
-
512 
- -
514  if(!hcibuf[2]) { // Check if disconnected OK
-
515  hci_set_flag(HCI_FLAG_DISCONNECT_COMPLETE); // Set disconnect command complete flag
-
516  hci_clear_flag(HCI_FLAG_CONNECT_COMPLETE); // Clear connection complete flag
-
517  }
-
518  break;
-
519 
- -
521  if(!hcibuf[2]) { // Check if reading is OK
-
522  for(uint8_t i = 0; i < min(sizeof (remote_name), sizeof (hcibuf) - 9); i++) {
-
523  remote_name[i] = hcibuf[9 + i];
-
524  if(remote_name[i] == '\0') // End of string
-
525  break;
-
526  }
-
527  // TODO: Altid sæt '\0' i remote name!
- -
529  }
-
530  break;
-
531 
-
532  case EV_INCOMING_CONNECT:
-
533  for(uint8_t i = 0; i < 6; i++)
-
534  disc_bdaddr[i] = hcibuf[i + 2];
-
535 
-
536  for(uint8_t i = 0; i < 3; i++)
-
537  classOfDevice[i] = hcibuf[i + 8];
-
538 
-
539  if((classOfDevice[1] & 0x05) && (classOfDevice[0] & 0xC8)) { // Check if it is a mouse, keyboard or a gamepad
-
540 #ifdef DEBUG_USB_HOST
-
541  if(classOfDevice[0] & 0x80)
-
542  Notify(PSTR("\r\nMouse is connecting"), 0x80);
-
543  if(classOfDevice[0] & 0x40)
-
544  Notify(PSTR("\r\nKeyboard is connecting"), 0x80);
-
545  if(classOfDevice[0] & 0x08)
-
546  Notify(PSTR("\r\nGamepad is connecting"), 0x80);
-
547 #endif
-
548  incomingHIDDevice = true;
-
549  }
-
550 
-
551 #ifdef EXTRADEBUG
-
552  Notify(PSTR("\r\nClass of device: "), 0x80);
-
553  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
-
554  Notify(PSTR(" "), 0x80);
-
555  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
-
556  Notify(PSTR(" "), 0x80);
-
557  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
-
558 #endif
- -
560  break;
-
561 
-
562  case EV_PIN_CODE_REQUEST:
-
563  if(pairWithWii) {
-
564 #ifdef DEBUG_USB_HOST
-
565  Notify(PSTR("\r\nPairing with Wiimote"), 0x80);
-
566 #endif
- -
568  } else if(btdPin != NULL) {
-
569 #ifdef DEBUG_USB_HOST
-
570  Notify(PSTR("\r\nBluetooth pin is set too: "), 0x80);
-
571  NotifyStr(btdPin, 0x80);
-
572 #endif
- -
574  } else {
-
575 #ifdef DEBUG_USB_HOST
-
576  Notify(PSTR("\r\nNo pin was set"), 0x80);
-
577 #endif
- -
579  }
-
580  break;
-
581 
-
582  case EV_LINK_KEY_REQUEST:
-
583 #ifdef DEBUG_USB_HOST
-
584  Notify(PSTR("\r\nReceived Key Request"), 0x80);
-
585 #endif
- -
587  break;
-
588 
- -
590  if(!hcibuf[2]) { // Check if pairing was successful
-
591  if(pairWithWii && !connectToWii) {
-
592 #ifdef DEBUG_USB_HOST
-
593  Notify(PSTR("\r\nPairing successful with Wiimote"), 0x80);
-
594 #endif
-
595  connectToWii = true; // Used to indicate to the Wii service, that it should connect to this device
-
596  } else if(pairWithHIDDevice && !connectToHIDDevice) {
-
597 #ifdef DEBUG_USB_HOST
-
598  Notify(PSTR("\r\nPairing successful with HID device"), 0x80);
-
599 #endif
-
600  connectToHIDDevice = true; // Used to indicate to the BTHID service, that it should connect to this device
-
601  }
-
602  } else {
-
603 #ifdef DEBUG_USB_HOST
-
604  Notify(PSTR("\r\nPairing Failed: "), 0x80);
-
605  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
-
606 #endif
- -
608  hci_state = HCI_DISCONNECT_STATE;
-
609  }
-
610  break;
-
611  /* We will just ignore the following events */
-
612  case EV_NUM_COMPLETE_PKT:
-
613  case EV_ROLE_CHANGED:
- -
615  case EV_LOOPBACK_COMMAND:
- - -
618  case EV_MAX_SLOTS_CHANGE:
- - - - -
623  break;
-
624 #ifdef EXTRADEBUG
-
625  default:
-
626  if(hcibuf[0] != 0x00) {
-
627  Notify(PSTR("\r\nUnmanaged HCI Event: "), 0x80);
-
628  D_PrintHex<uint8_t > (hcibuf[0], 0x80);
-
629  }
-
630  break;
-
631 #endif
-
632  } // Switch
-
633  }
-
634 #ifdef EXTRADEBUG
-
635  else {
-
636  Notify(PSTR("\r\nHCI event error: "), 0x80);
-
637  D_PrintHex<uint8_t > (rcode, 0x80);
-
638  }
-
639 #endif
-
640 }
-
641 
-
642 /* Poll Bluetooth and print result */
-
643 void BTD::HCI_task() {
-
644  switch(hci_state) {
-
645  case HCI_INIT_STATE:
-
646  hci_counter++;
-
647  if(hci_counter > hci_num_reset_loops) { // wait until we have looped x times to clear any old events
-
648  hci_reset();
-
649  hci_state = HCI_RESET_STATE;
-
650  hci_counter = 0;
-
651  }
-
652  break;
-
653 
-
654  case HCI_RESET_STATE:
-
655  hci_counter++;
- -
657  hci_counter = 0;
-
658 #ifdef DEBUG_USB_HOST
-
659  Notify(PSTR("\r\nHCI Reset complete"), 0x80);
-
660 #endif
-
661  hci_state = HCI_CLASS_STATE;
- -
663  } else if(hci_counter > hci_num_reset_loops) {
-
664  hci_num_reset_loops *= 10;
-
665  if(hci_num_reset_loops > 2000)
-
666  hci_num_reset_loops = 2000;
-
667 #ifdef DEBUG_USB_HOST
-
668  Notify(PSTR("\r\nNo response to HCI Reset"), 0x80);
-
669 #endif
-
670  hci_state = HCI_INIT_STATE;
-
671  hci_counter = 0;
-
672  }
-
673  break;
-
674 
-
675  case HCI_CLASS_STATE:
- -
677 #ifdef DEBUG_USB_HOST
-
678  Notify(PSTR("\r\nWrite class of device"), 0x80);
-
679 #endif
-
680  hci_state = HCI_BDADDR_STATE;
-
681  hci_read_bdaddr();
-
682  }
-
683  break;
-
684 
-
685  case HCI_BDADDR_STATE:
- -
687 #ifdef DEBUG_USB_HOST
-
688  Notify(PSTR("\r\nLocal Bluetooth Address: "), 0x80);
-
689  for(int8_t i = 5; i > 0; i--) {
-
690  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
-
691  Notify(PSTR(":"), 0x80);
-
692  }
-
693  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
-
694 #endif
- -
696  hci_state = HCI_LOCAL_VERSION_STATE;
-
697  }
-
698  break;
-
699 
-
700  case HCI_LOCAL_VERSION_STATE: // The local version is used by the PS3BT class
- -
702  if(btdName != NULL) {
- -
704  hci_state = HCI_SET_NAME_STATE;
-
705  } else
-
706  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
707  }
-
708  break;
-
709 
-
710  case HCI_SET_NAME_STATE:
- -
712 #ifdef DEBUG_USB_HOST
-
713  Notify(PSTR("\r\nThe name is set to: "), 0x80);
-
714  NotifyStr(btdName, 0x80);
-
715 #endif
-
716  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
717  }
-
718  break;
-
719 
- -
721  if(pairWithHIDDevice || pairWithWii) { // Check if it should try to connect to a Wiimote
-
722 #ifdef DEBUG_USB_HOST
-
723  if(pairWithWii)
-
724  Notify(PSTR("\r\nStarting inquiry\r\nPress 1 & 2 on the Wiimote\r\nOr press the SYNC button if you are using a Wii U Pro Controller or a Wii Balance Board"), 0x80);
-
725  else
-
726  Notify(PSTR("\r\nPlease enable discovery of your device"), 0x80);
-
727 #endif
-
728  hci_inquiry();
-
729  hci_state = HCI_INQUIRY_STATE;
-
730  } else
-
731  hci_state = HCI_SCANNING_STATE; // Don't try to connect to a Wiimote
-
732  break;
-
733 
-
734  case HCI_INQUIRY_STATE:
- -
736  hci_inquiry_cancel(); // Stop inquiry
-
737 #ifdef DEBUG_USB_HOST
-
738  if(pairWithWii)
-
739  Notify(PSTR("\r\nWiimote found"), 0x80);
-
740  else
-
741  Notify(PSTR("\r\nHID device found"), 0x80);
-
742 
-
743  Notify(PSTR("\r\nNow just create the instance like so:"), 0x80);
-
744  if(pairWithWii)
-
745  Notify(PSTR("\r\nWII Wii(&Btd);"), 0x80);
-
746  else
-
747  Notify(PSTR("\r\nBTHID bthid(&Btd);"), 0x80);
-
748 
-
749  Notify(PSTR("\r\nAnd then press any button on the "), 0x80);
-
750  if(pairWithWii)
-
751  Notify(PSTR("Wiimote"), 0x80);
-
752  else
-
753  Notify(PSTR("device"), 0x80);
-
754 #endif
-
755  if(checkRemoteName) {
-
756  hci_remote_name(); // We need to know the name to distinguish between the Wiimote, the new Wiimote with Motion Plus inside, a Wii U Pro Controller and a Wii Balance Board
-
757  hci_state = HCI_REMOTE_NAME_STATE;
-
758  } else
-
759  hci_state = HCI_CONNECT_DEVICE_STATE;
-
760  }
-
761  break;
-
762 
- - -
765 #ifdef DEBUG_USB_HOST
-
766  if(pairWithWii)
-
767  Notify(PSTR("\r\nConnecting to Wiimote"), 0x80);
-
768  else
-
769  Notify(PSTR("\r\nConnecting to HID device"), 0x80);
-
770 #endif
-
771  checkRemoteName = false;
-
772  hci_connect();
-
773  hci_state = HCI_CONNECTED_DEVICE_STATE;
-
774  }
-
775  break;
-
776 
- - - -
780 #ifdef DEBUG_USB_HOST
-
781  if(pairWithWii)
-
782  Notify(PSTR("\r\nConnected to Wiimote"), 0x80);
-
783  else
-
784  Notify(PSTR("\r\nConnected to HID device"), 0x80);
-
785 #endif
-
786  hci_authentication_request(); // This will start the pairing with the Wiimote
-
787  hci_state = HCI_SCANNING_STATE;
-
788  } else {
-
789 #ifdef DEBUG_USB_HOST
-
790  Notify(PSTR("\r\nTrying to connect one more time..."), 0x80);
-
791 #endif
-
792  hci_connect(); // Try to connect one more time
-
793  }
-
794  }
-
795  break;
-
796 
-
797  case HCI_SCANNING_STATE:
- -
799 #ifdef DEBUG_USB_HOST
-
800  Notify(PSTR("\r\nWait For Incoming Connection Request"), 0x80);
-
801 #endif
- -
803  waitingForConnection = true;
-
804  hci_state = HCI_CONNECT_IN_STATE;
-
805  }
-
806  break;
-
807 
- - -
810  waitingForConnection = false;
-
811 #ifdef DEBUG_USB_HOST
-
812  Notify(PSTR("\r\nIncoming Connection Request"), 0x80);
-
813 #endif
-
814  hci_remote_name();
-
815  hci_state = HCI_REMOTE_NAME_STATE;
- -
817  hci_state = HCI_DISCONNECT_STATE;
-
818  break;
-
819 
- - -
822 #ifdef DEBUG_USB_HOST
-
823  Notify(PSTR("\r\nRemote Name: "), 0x80);
-
824  for(uint8_t i = 0; i < strlen(remote_name); i++)
-
825  Notifyc(remote_name[i], 0x80);
-
826 #endif
-
827  if(strncmp((const char*)remote_name, "Nintendo", 8) == 0) {
-
828  incomingWii = true;
-
829  motionPlusInside = false;
-
830  wiiUProController = false;
-
831  pairWiiUsingSync = false;
-
832 #ifdef DEBUG_USB_HOST
-
833  Notify(PSTR("\r\nWiimote is connecting"), 0x80);
-
834 #endif
-
835  if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-TR", 22) == 0) {
-
836 #ifdef DEBUG_USB_HOST
-
837  Notify(PSTR(" with Motion Plus Inside"), 0x80);
-
838 #endif
-
839  motionPlusInside = true;
-
840  } else if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-UC", 22) == 0) {
-
841 #ifdef DEBUG_USB_HOST
-
842  Notify(PSTR(" - Wii U Pro Controller"), 0x80);
-
843 #endif
-
844  wiiUProController = motionPlusInside = pairWiiUsingSync = true;
-
845  } else if(strncmp((const char*)remote_name, "Nintendo RVL-WBC-01", 19) == 0) {
-
846 #ifdef DEBUG_USB_HOST
-
847  Notify(PSTR(" - Wii Balance Board"), 0x80);
-
848 #endif
-
849  pairWiiUsingSync = true;
-
850  }
-
851  }
-
852  if(classOfDevice[2] == 0 && classOfDevice[1] == 0x25 && classOfDevice[0] == 0x08 && strncmp((const char*)remote_name, "Wireless Controller", 19) == 0) {
-
853 #ifdef DEBUG_USB_HOST
-
854  Notify(PSTR("\r\nPS4 controller is connecting"), 0x80);
-
855 #endif
-
856  incomingPS4 = true;
-
857  }
-
858  if(pairWithWii && checkRemoteName)
-
859  hci_state = HCI_CONNECT_DEVICE_STATE;
-
860  else {
- -
862  hci_state = HCI_CONNECTED_STATE;
-
863  }
-
864  }
-
865  break;
-
866 
-
867  case HCI_CONNECTED_STATE:
- -
869 #ifdef DEBUG_USB_HOST
-
870  Notify(PSTR("\r\nConnected to Device: "), 0x80);
-
871  for(int8_t i = 5; i > 0; i--) {
-
872  D_PrintHex<uint8_t > (disc_bdaddr[i], 0x80);
-
873  Notify(PSTR(":"), 0x80);
-
874  }
-
875  D_PrintHex<uint8_t > (disc_bdaddr[0], 0x80);
-
876 #endif
-
877  if(incomingPS4)
-
878  connectToHIDDevice = true; // We should always connect to the PS4 controller
-
879 
-
880  // Clear these flags for a new connection
-
881  l2capConnectionClaimed = false;
-
882  sdpConnectionClaimed = false;
-
883  rfcommConnectionClaimed = false;
-
884 
-
885  hci_event_flag = 0;
-
886  hci_state = HCI_DONE_STATE;
-
887  }
-
888  break;
-
889 
-
890  case HCI_DONE_STATE:
-
891  hci_counter++;
-
892  if(hci_counter > 1000) { // Wait until we have looped 1000 times to make sure that the L2CAP connection has been started
-
893  hci_counter = 0;
-
894  hci_state = HCI_SCANNING_STATE;
-
895  }
-
896  break;
-
897 
- - -
900 #ifdef DEBUG_USB_HOST
-
901  Notify(PSTR("\r\nHCI Disconnected from Device"), 0x80);
-
902 #endif
-
903  hci_event_flag = 0; // Clear all flags
-
904 
-
905  // Reset all buffers
-
906  memset(hcibuf, 0, BULK_MAXPKTSIZE);
-
907  memset(l2capinbuf, 0, BULK_MAXPKTSIZE);
-
908 
- -
910  connectToHIDDevice = incomingHIDDevice = pairWithHIDDevice = checkRemoteName = false;
-
911  incomingPS4 = false;
-
912 
-
913  hci_state = HCI_SCANNING_STATE;
-
914  }
-
915  break;
-
916  default:
-
917  break;
-
918  }
-
919 }
-
920 
-
921 void BTD::ACL_event_task() {
-
922  uint16_t length = BULK_MAXPKTSIZE;
-
923  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_DATAIN_PIPE ].epAddr, &length, l2capinbuf, pollInterval); // Input on endpoint 2
-
924 
-
925  if(!rcode) { // Check for errors
-
926  if(length > 0) { // Check if any data was read
-
927  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
-
928  if(btService[i])
-
929  btService[i]->ACLData(l2capinbuf);
-
930  }
-
931  }
-
932  }
-
933 #ifdef EXTRADEBUG
-
934  else if(rcode != hrNAK) {
-
935  Notify(PSTR("\r\nACL data in error: "), 0x80);
-
936  D_PrintHex<uint8_t > (rcode, 0x80);
-
937  }
-
938 #endif
-
939  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
-
940  if(btService[i])
-
941  btService[i]->Run();
-
942 }
-
943 
-
944 /************************************************************/
-
945 /* HCI Commands */
-
946 
-
947 /************************************************************/
-
948 void BTD::HCI_Command(uint8_t* data, uint16_t nbytes) {
- -
950  pUsb->ctrlReq(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bmREQ_HCI_OUT, 0x00, 0x00, 0x00, 0x00, nbytes, nbytes, data, NULL);
-
951 }
-
952 
- -
954  hci_event_flag = 0; // Clear all the flags
-
955  hcibuf[0] = 0x03; // HCI OCF = 3
-
956  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
957  hcibuf[2] = 0x00;
-
958 
-
959  HCI_Command(hcibuf, 3);
-
960 }
-
961 
- - -
964  hcibuf[0] = 0x1A; // HCI OCF = 1A
-
965  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
966  hcibuf[2] = 0x01; // parameter length = 1
-
967  if(btdName != NULL)
-
968  hcibuf[3] = 0x03; // Inquiry Scan enabled. Page Scan enabled.
-
969  else
-
970  hcibuf[3] = 0x02; // Inquiry Scan disabled. Page Scan enabled.
-
971 
-
972  HCI_Command(hcibuf, 4);
-
973 }
-
974 
- -
976  hcibuf[0] = 0x1A; // HCI OCF = 1A
-
977  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
978  hcibuf[2] = 0x01; // parameter length = 1
-
979  hcibuf[3] = 0x00; // Inquiry Scan disabled. Page Scan disabled.
-
980 
-
981  HCI_Command(hcibuf, 4);
-
982 }
-
983 
- - -
986  hcibuf[0] = 0x09; // HCI OCF = 9
-
987  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
-
988  hcibuf[2] = 0x00;
-
989 
-
990  HCI_Command(hcibuf, 3);
-
991 }
-
992 
- - -
995  hcibuf[0] = 0x01; // HCI OCF = 1
-
996  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
-
997  hcibuf[2] = 0x00;
-
998 
-
999  HCI_Command(hcibuf, 3);
-
1000 }
-
1001 
- - -
1004  hcibuf[0] = 0x09; // HCI OCF = 9
-
1005  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1006  hcibuf[2] = 0x07; // parameter length 7
-
1007  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
1008  hcibuf[4] = disc_bdaddr[1];
-
1009  hcibuf[5] = disc_bdaddr[2];
-
1010  hcibuf[6] = disc_bdaddr[3];
-
1011  hcibuf[7] = disc_bdaddr[4];
-
1012  hcibuf[8] = disc_bdaddr[5];
-
1013  hcibuf[9] = 0x00; // Switch role to master
-
1014 
-
1015  HCI_Command(hcibuf, 10);
-
1016 }
-
1017 
- - -
1020  hcibuf[0] = 0x19; // HCI OCF = 19
-
1021  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1022  hcibuf[2] = 0x0A; // parameter length = 10
-
1023  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
1024  hcibuf[4] = disc_bdaddr[1];
-
1025  hcibuf[5] = disc_bdaddr[2];
-
1026  hcibuf[6] = disc_bdaddr[3];
-
1027  hcibuf[7] = disc_bdaddr[4];
-
1028  hcibuf[8] = disc_bdaddr[5];
-
1029  hcibuf[9] = 0x01; // Page Scan Repetition Mode
-
1030  hcibuf[10] = 0x00; // Reserved
-
1031  hcibuf[11] = 0x00; // Clock offset - low byte
-
1032  hcibuf[12] = 0x00; // Clock offset - high byte
-
1033 
-
1034  HCI_Command(hcibuf, 13);
-
1035 }
-
1036 
-
1037 void BTD::hci_set_local_name(const char* name) {
-
1038  hcibuf[0] = 0x13; // HCI OCF = 13
-
1039  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
1040  hcibuf[2] = strlen(name) + 1; // parameter length = the length of the string + end byte
-
1041  uint8_t i;
-
1042  for(i = 0; i < strlen(name); i++)
-
1043  hcibuf[i + 3] = name[i];
-
1044  hcibuf[i + 3] = 0x00; // End of string
-
1045 
-
1046  HCI_Command(hcibuf, 4 + strlen(name));
-
1047 }
-
1048 
- - -
1051  hcibuf[0] = 0x01;
-
1052  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1053  hcibuf[2] = 0x05; // Parameter Total Length = 5
-
1054  hcibuf[3] = 0x33; // LAP: Genera/Unlimited Inquiry Access Code (GIAC = 0x9E8B33) - see https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
-
1055  hcibuf[4] = 0x8B;
-
1056  hcibuf[5] = 0x9E;
-
1057  hcibuf[6] = 0x30; // Inquiry time = 61.44 sec (maximum)
-
1058  hcibuf[7] = 0x0A; // 10 number of responses
-
1059 
-
1060  HCI_Command(hcibuf, 8);
-
1061 }
-
1062 
- -
1064  hcibuf[0] = 0x02;
-
1065  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1066  hcibuf[2] = 0x00; // Parameter Total Length = 0
-
1067 
-
1068  HCI_Command(hcibuf, 3);
-
1069 }
-
1070 
- -
1072  hci_connect(disc_bdaddr); // Use last discovered device
-
1073 }
-
1074 
-
1075 void BTD::hci_connect(uint8_t *bdaddr) {
- -
1077  hcibuf[0] = 0x05;
-
1078  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1079  hcibuf[2] = 0x0D; // parameter Total Length = 13
-
1080  hcibuf[3] = bdaddr[0]; // 6 octet bdaddr (LSB)
-
1081  hcibuf[4] = bdaddr[1];
-
1082  hcibuf[5] = bdaddr[2];
-
1083  hcibuf[6] = bdaddr[3];
-
1084  hcibuf[7] = bdaddr[4];
-
1085  hcibuf[8] = bdaddr[5];
-
1086  hcibuf[9] = 0x18; // DM1 or DH1 may be used
-
1087  hcibuf[10] = 0xCC; // DM3, DH3, DM5, DH5 may be used
-
1088  hcibuf[11] = 0x01; // Page repetition mode R1
-
1089  hcibuf[12] = 0x00; // Reserved
-
1090  hcibuf[13] = 0x00; // Clock offset
-
1091  hcibuf[14] = 0x00; // Invalid clock offset
-
1092  hcibuf[15] = 0x00; // Do not allow role switch
-
1093 
-
1094  HCI_Command(hcibuf, 16);
-
1095 }
-
1096 
- -
1098  hcibuf[0] = 0x0D; // HCI OCF = 0D
-
1099  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1100  hcibuf[2] = 0x17; // parameter length 23
-
1101  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
1102  hcibuf[4] = disc_bdaddr[1];
-
1103  hcibuf[5] = disc_bdaddr[2];
-
1104  hcibuf[6] = disc_bdaddr[3];
-
1105  hcibuf[7] = disc_bdaddr[4];
-
1106  hcibuf[8] = disc_bdaddr[5];
-
1107  if(pairWithWii) {
-
1108  hcibuf[9] = 6; // Pin length is the length of the Bluetooth address
-
1109  if(pairWiiUsingSync) {
-
1110 #ifdef DEBUG_USB_HOST
-
1111  Notify(PSTR("\r\nPairing with Wii controller via SYNC"), 0x80);
-
1112 #endif
-
1113  for(uint8_t i = 0; i < 6; i++)
-
1114  hcibuf[10 + i] = my_bdaddr[i]; // The pin is the Bluetooth dongles Bluetooth address backwards
-
1115  } else {
-
1116  for(uint8_t i = 0; i < 6; i++)
-
1117  hcibuf[10 + i] = disc_bdaddr[i]; // The pin is the Wiimote's Bluetooth address backwards
-
1118  }
-
1119  for(uint8_t i = 16; i < 26; i++)
-
1120  hcibuf[i] = 0x00; // The rest should be 0
-
1121  } else {
-
1122  hcibuf[9] = strlen(btdPin); // Length of pin
-
1123  uint8_t i;
-
1124  for(i = 0; i < strlen(btdPin); i++) // The maximum size of the pin is 16
-
1125  hcibuf[i + 10] = btdPin[i];
-
1126  for(; i < 16; i++)
-
1127  hcibuf[i + 10] = 0x00; // The rest should be 0
-
1128  }
-
1129 
-
1130  HCI_Command(hcibuf, 26);
-
1131 }
-
1132 
- -
1134  hcibuf[0] = 0x0E; // HCI OCF = 0E
-
1135  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1136  hcibuf[2] = 0x06; // parameter length 6
-
1137  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
1138  hcibuf[4] = disc_bdaddr[1];
-
1139  hcibuf[5] = disc_bdaddr[2];
-
1140  hcibuf[6] = disc_bdaddr[3];
-
1141  hcibuf[7] = disc_bdaddr[4];
-
1142  hcibuf[8] = disc_bdaddr[5];
-
1143 
-
1144  HCI_Command(hcibuf, 9);
-
1145 }
-
1146 
- -
1148  hcibuf[0] = 0x0C; // HCI OCF = 0C
-
1149  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1150  hcibuf[2] = 0x06; // parameter length 6
-
1151  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
1152  hcibuf[4] = disc_bdaddr[1];
-
1153  hcibuf[5] = disc_bdaddr[2];
-
1154  hcibuf[6] = disc_bdaddr[3];
-
1155  hcibuf[7] = disc_bdaddr[4];
-
1156  hcibuf[8] = disc_bdaddr[5];
-
1157 
-
1158  HCI_Command(hcibuf, 9);
-
1159 }
-
1160 
- -
1162  hcibuf[0] = 0x11; // HCI OCF = 11
-
1163  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1164  hcibuf[2] = 0x02; // parameter length = 2
-
1165  hcibuf[3] = (uint8_t)(hci_handle & 0xFF); //connection handle - low byte
-
1166  hcibuf[4] = (uint8_t)((hci_handle >> 8) & 0x0F); //connection handle - high byte
-
1167 
-
1168  HCI_Command(hcibuf, 5);
-
1169 }
-
1170 
-
1171 void BTD::hci_disconnect(uint16_t handle) { // This is called by the different services
- -
1173  hcibuf[0] = 0x06; // HCI OCF = 6
-
1174  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1175  hcibuf[2] = 0x03; // parameter length = 3
-
1176  hcibuf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte
-
1177  hcibuf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte
-
1178  hcibuf[5] = 0x13; // reason
-
1179 
-
1180  HCI_Command(hcibuf, 6);
-
1181 }
-
1182 
-
1183 void BTD::hci_write_class_of_device() { // See http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
-
1184  hcibuf[0] = 0x24; // HCI OCF = 24
-
1185  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
1186  hcibuf[2] = 0x03; // parameter length = 3
-
1187  hcibuf[3] = 0x04; // Robot
-
1188  hcibuf[4] = 0x08; // Toy
-
1189  hcibuf[5] = 0x00;
-
1190 
-
1191  HCI_Command(hcibuf, 6);
-
1192 }
-
1193 /*******************************************************************
-
1194  * *
-
1195  * HCI ACL Data Packet *
-
1196  * *
-
1197  * buf[0] buf[1] buf[2] buf[3]
-
1198  * 0 4 8 11 12 16 24 31 MSB
-
1199  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1200  * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet
-
1201  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1202  *
-
1203  * buf[4] buf[5] buf[6] buf[7]
-
1204  * 0 8 16 31 MSB
-
1205  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1206  * | Length | Channel ID | Basic L2CAP header
-
1207  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1208  *
-
1209  * buf[8] buf[9] buf[10] buf[11]
-
1210  * 0 8 16 31 MSB
-
1211  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1212  * | Code | Identifier | Length | Control frame (C-frame)
-
1213  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format)
-
1214  */
-
1215 /************************************************************/
-
1216 /* L2CAP Commands */
-
1217 
-
1218 /************************************************************/
-
1219 void BTD::L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow, uint8_t channelHigh) {
-
1220  uint8_t buf[8 + nbytes];
-
1221  buf[0] = (uint8_t)(handle & 0xff); // HCI handle with PB,BC flag
-
1222  buf[1] = (uint8_t)(((handle >> 8) & 0x0f) | 0x20);
-
1223  buf[2] = (uint8_t)((4 + nbytes) & 0xff); // HCI ACL total data length
-
1224  buf[3] = (uint8_t)((4 + nbytes) >> 8);
-
1225  buf[4] = (uint8_t)(nbytes & 0xff); // L2CAP header: Length
-
1226  buf[5] = (uint8_t)(nbytes >> 8);
-
1227  buf[6] = channelLow;
-
1228  buf[7] = channelHigh;
-
1229 
-
1230  for(uint16_t i = 0; i < nbytes; i++) // L2CAP C-frame
-
1231  buf[8 + i] = data[i];
-
1232 
-
1233  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ BTD_DATAOUT_PIPE ].epAddr, (8 + nbytes), buf);
-
1234  if(rcode) {
-
1235  delay(100); // This small delay prevents it from overflowing if it fails
-
1236 #ifdef DEBUG_USB_HOST
-
1237  Notify(PSTR("\r\nError sending L2CAP message: 0x"), 0x80);
-
1238  D_PrintHex<uint8_t > (rcode, 0x80);
-
1239  Notify(PSTR(" - Channel ID: "), 0x80);
-
1240  D_PrintHex<uint8_t > (channelHigh, 0x80);
-
1241  Notify(PSTR(" "), 0x80);
-
1242  D_PrintHex<uint8_t > (channelLow, 0x80);
-
1243 #endif
-
1244  }
-
1245 }
-
1246 
-
1247 void BTD::l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm) {
-
1248  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_REQUEST; // Code
-
1249  l2capoutbuf[1] = rxid; // Identifier
-
1250  l2capoutbuf[2] = 0x04; // Length
-
1251  l2capoutbuf[3] = 0x00;
-
1252  l2capoutbuf[4] = (uint8_t)(psm & 0xff); // PSM
-
1253  l2capoutbuf[5] = (uint8_t)(psm >> 8);
-
1254  l2capoutbuf[6] = scid[0]; // Source CID
-
1255  l2capoutbuf[7] = scid[1];
-
1256 
-
1257  L2CAP_Command(handle, l2capoutbuf, 8);
-
1258 }
-
1259 
-
1260 void BTD::l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result) {
-
1261  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code
-
1262  l2capoutbuf[1] = rxid; // Identifier
-
1263  l2capoutbuf[2] = 0x08; // Length
-
1264  l2capoutbuf[3] = 0x00;
-
1265  l2capoutbuf[4] = dcid[0]; // Destination CID
-
1266  l2capoutbuf[5] = dcid[1];
-
1267  l2capoutbuf[6] = scid[0]; // Source CID
-
1268  l2capoutbuf[7] = scid[1];
-
1269  l2capoutbuf[8] = result; // Result: Pending or Success
-
1270  l2capoutbuf[9] = 0x00;
-
1271  l2capoutbuf[10] = 0x00; // No further information
-
1272  l2capoutbuf[11] = 0x00;
-
1273 
-
1274  L2CAP_Command(handle, l2capoutbuf, 12);
-
1275 }
-
1276 
-
1277 void BTD::l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid) {
-
1278  l2capoutbuf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code
-
1279  l2capoutbuf[1] = rxid; // Identifier
-
1280  l2capoutbuf[2] = 0x08; // Length
-
1281  l2capoutbuf[3] = 0x00;
-
1282  l2capoutbuf[4] = dcid[0]; // Destination CID
-
1283  l2capoutbuf[5] = dcid[1];
-
1284  l2capoutbuf[6] = 0x00; // Flags
-
1285  l2capoutbuf[7] = 0x00;
-
1286  l2capoutbuf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) - Hint
-
1287  l2capoutbuf[9] = 0x02; // Config Opt: length
-
1288  l2capoutbuf[10] = 0xFF; // MTU
-
1289  l2capoutbuf[11] = 0xFF;
-
1290 
-
1291  L2CAP_Command(handle, l2capoutbuf, 12);
-
1292 }
-
1293 
-
1294 void BTD::l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid) {
-
1295  l2capoutbuf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code
-
1296  l2capoutbuf[1] = rxid; // Identifier
-
1297  l2capoutbuf[2] = 0x0A; // Length
-
1298  l2capoutbuf[3] = 0x00;
-
1299  l2capoutbuf[4] = scid[0]; // Source CID
-
1300  l2capoutbuf[5] = scid[1];
-
1301  l2capoutbuf[6] = 0x00; // Flag
-
1302  l2capoutbuf[7] = 0x00;
-
1303  l2capoutbuf[8] = 0x00; // Result
-
1304  l2capoutbuf[9] = 0x00;
-
1305  l2capoutbuf[10] = 0x01; // Config
-
1306  l2capoutbuf[11] = 0x02;
-
1307  l2capoutbuf[12] = 0xA0;
-
1308  l2capoutbuf[13] = 0x02;
-
1309 
-
1310  L2CAP_Command(handle, l2capoutbuf, 14);
-
1311 }
-
1312 
-
1313 void BTD::l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
-
1314  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code
-
1315  l2capoutbuf[1] = rxid; // Identifier
-
1316  l2capoutbuf[2] = 0x04; // Length
-
1317  l2capoutbuf[3] = 0x00;
-
1318  l2capoutbuf[4] = dcid[0];
-
1319  l2capoutbuf[5] = dcid[1];
-
1320  l2capoutbuf[6] = scid[0];
-
1321  l2capoutbuf[7] = scid[1];
-
1322 
-
1323  L2CAP_Command(handle, l2capoutbuf, 8);
-
1324 }
-
1325 
-
1326 void BTD::l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
-
1327  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code
-
1328  l2capoutbuf[1] = rxid; // Identifier
-
1329  l2capoutbuf[2] = 0x04; // Length
-
1330  l2capoutbuf[3] = 0x00;
-
1331  l2capoutbuf[4] = dcid[0];
-
1332  l2capoutbuf[5] = dcid[1];
-
1333  l2capoutbuf[6] = scid[0];
-
1334  l2capoutbuf[7] = scid[1];
-
1335 
-
1336  L2CAP_Command(handle, l2capoutbuf, 8);
-
1337 }
-
1338 
-
1339 void BTD::l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh) {
-
1340  l2capoutbuf[0] = L2CAP_CMD_INFORMATION_RESPONSE; // Code
-
1341  l2capoutbuf[1] = rxid; // Identifier
-
1342  l2capoutbuf[2] = 0x08; // Length
-
1343  l2capoutbuf[3] = 0x00;
-
1344  l2capoutbuf[4] = infoTypeLow;
-
1345  l2capoutbuf[5] = infoTypeHigh;
-
1346  l2capoutbuf[6] = 0x00; // Result = success
-
1347  l2capoutbuf[7] = 0x00; // Result = success
-
1348  l2capoutbuf[8] = 0x00;
-
1349  l2capoutbuf[9] = 0x00;
-
1350  l2capoutbuf[10] = 0x00;
-
1351  l2capoutbuf[11] = 0x00;
-
1352 
-
1353  L2CAP_Command(handle, l2capoutbuf, 12);
-
1354 }
-
1355 
-
1356 /* PS3 Commands - only set Bluetooth address is implemented in this library */
-
1357 void BTD::setBdaddr(uint8_t* bdaddr) {
-
1358  /* Set the internal Bluetooth address */
-
1359  uint8_t buf[8];
-
1360  buf[0] = 0x01;
-
1361  buf[1] = 0x00;
-
1362 
-
1363  for(uint8_t i = 0; i < 6; i++)
-
1364  buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
-
1365 
-
1366  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
-
1367  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
-
1368 }
-
1369 
-
1370 void BTD::setMoveBdaddr(uint8_t* bdaddr) {
-
1371  /* Set the internal Bluetooth address */
-
1372  uint8_t buf[11];
-
1373  buf[0] = 0x05;
-
1374  buf[7] = 0x10;
-
1375  buf[8] = 0x01;
-
1376  buf[9] = 0x02;
-
1377  buf[10] = 0x12;
-
1378 
-
1379  for(uint8_t i = 0; i < 6; i++)
-
1380  buf[i + 1] = bdaddr[i];
-
1381 
-
1382  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x05), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
-
1383  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
-
1384 }
-
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:525
+Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16  */
17 
18 #include "BTD.h"
19 // To enable serial debugging see "settings.h"
20 //#define EXTRADEBUG // Uncomment to get even more debugging data
21 
22 const uint8_t BTD::BTD_CONTROL_PIPE = 0;
23 const uint8_t BTD::BTD_EVENT_PIPE = 1;
24 const uint8_t BTD::BTD_DATAIN_PIPE = 2;
25 const uint8_t BTD::BTD_DATAOUT_PIPE = 3;
26 
28 connectToWii(false),
29 pairWithWii(false),
30 connectToHIDDevice(false),
31 pairWithHIDDevice(false),
32 pUsb(p), // Pointer to USB class instance - mandatory
33 bAddress(0), // Device address - mandatory
34 bNumEP(1), // If config descriptor needs to be parsed
35 qNextPollTime(0), // Reset NextPollTime
36 pollInterval(0),
37 bPollEnable(false) // Don't start polling before dongle is connected
38 {
39  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
40  btService[i] = NULL;
41 
42  Initialize(); // Set all variables, endpoint structs etc. to default values
43 
44  if(pUsb) // Register in USB subsystem
45  pUsb->RegisterDeviceClass(this); // Set devConfig[] entry
46 }
47 
48 uint8_t BTD::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
49  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
50  uint8_t buf[constBufSize];
51  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
52  uint8_t rcode;
53  UsbDevice *p = NULL;
54  EpInfo *oldep_ptr = NULL;
55 
56  Initialize(); // Set all variables, endpoint structs etc. to default values
57 
58  AddressPool &addrPool = pUsb->GetAddressPool(); // Get memory address of USB device address pool
59 #ifdef EXTRADEBUG
60  Notify(PSTR("\r\nBTD ConfigureDevice"), 0x80);
61 #endif
62 
63  if(bAddress) { // Check if address has already been assigned to an instance
64 #ifdef DEBUG_USB_HOST
65  Notify(PSTR("\r\nAddress in use"), 0x80);
66 #endif
68  }
69 
70  p = addrPool.GetUsbDevicePtr(0); // Get pointer to pseudo device with address 0 assigned
71  if(!p) {
72 #ifdef DEBUG_USB_HOST
73  Notify(PSTR("\r\nAddress not found"), 0x80);
74 #endif
76  }
77 
78  if(!p->epinfo) {
79 #ifdef DEBUG_USB_HOST
80  Notify(PSTR("\r\nepinfo is null"), 0x80);
81 #endif
83  }
84 
85  oldep_ptr = p->epinfo; // Save old pointer to EP_RECORD of address 0
86  p->epinfo = epInfo; // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
87  p->lowspeed = lowspeed;
88  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
89 
90  p->epinfo = oldep_ptr; // Restore p->epinfo
91 
92  if(rcode)
93  goto FailGetDevDescr;
94 
95  bAddress = addrPool.AllocAddress(parent, false, port); // Allocate new address according to device class
96 
97  if(!bAddress) {
98 #ifdef DEBUG_USB_HOST
99  Notify(PSTR("\r\nOut of address space"), 0x80);
100 #endif
102  }
103 
104  if (udd->bDeviceClass == 0x09) // Some dongles have an USB hub inside
105  goto FailHub;
106 
107  epInfo[0].maxPktSize = udd->bMaxPacketSize0; // Extract Max Packet Size from device descriptor
108  epInfo[1].epAddr = udd->bNumConfigurations; // Steal and abuse from epInfo structure to save memory
109 
110  VID = udd->idVendor;
111  PID = udd->idProduct;
112 
114 
115 FailHub:
116 #ifdef DEBUG_USB_HOST
117  Notify(PSTR("\r\nPlease create a hub instance in your code: \"USBHub Hub1(&Usb);\""), 0x80);
118 #endif
119  pUsb->setAddr(bAddress, 0, 0); // Reset address
121  Release();
122  return rcode;
123 
124 FailGetDevDescr:
125 #ifdef DEBUG_USB_HOST
126  NotifyFailGetDevDescr(rcode);
127 #endif
128  if(rcode != hrJERR)
130  Release();
131  return rcode;
132 };
133 
134 uint8_t BTD::Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed) {
135  uint8_t rcode;
136  uint8_t num_of_conf = epInfo[1].epAddr; // Number of configurations
137  epInfo[1].epAddr = 0;
138 
139  AddressPool &addrPool = pUsb->GetAddressPool();
140 #ifdef EXTRADEBUG
141  Notify(PSTR("\r\nBTD Init"), 0x80);
142 #endif
143  UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
144 
145  if(!p) {
146 #ifdef DEBUG_USB_HOST
147  Notify(PSTR("\r\nAddress not found"), 0x80);
148 #endif
150  }
151 
152  delay(300); // Assign new address to the device
153 
154  rcode = pUsb->setAddr(0, 0, bAddress); // Assign new address to the device
155  if(rcode) {
156 #ifdef DEBUG_USB_HOST
157  Notify(PSTR("\r\nsetAddr: "), 0x80);
158  D_PrintHex<uint8_t > (rcode, 0x80);
159 #endif
160  p->lowspeed = false;
161  goto Fail;
162  }
163 #ifdef EXTRADEBUG
164  Notify(PSTR("\r\nAddr: "), 0x80);
165  D_PrintHex<uint8_t > (bAddress, 0x80);
166 #endif
167 
168  p->lowspeed = false;
169 
170  p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
171  if(!p) {
172 #ifdef DEBUG_USB_HOST
173  Notify(PSTR("\r\nAddress not found"), 0x80);
174 #endif
176  }
177 
178  p->lowspeed = lowspeed;
179 
180  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo); // Assign epInfo to epinfo pointer - only EP0 is known
181  if(rcode)
182  goto FailSetDevTblEntry;
183 
184  if(VID == PS3_VID && (PID == PS3_PID || PID == PS3NAVIGATION_PID || PID == PS3MOVE_PID)) {
185  delay(100);
186  rcode = pUsb->setConf(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, 1); // We only need the Control endpoint, so we don't have to initialize the other endpoints of device
187  if(rcode)
188  goto FailSetConfDescr;
189 
190 #ifdef DEBUG_USB_HOST
191  if(PID == PS3_PID || PID == PS3NAVIGATION_PID) {
192  if(PID == PS3_PID)
193  Notify(PSTR("\r\nDualshock 3 Controller Connected"), 0x80);
194  else // It must be a navigation controller
195  Notify(PSTR("\r\nNavigation Controller Connected"), 0x80);
196  } else // It must be a Motion controller
197  Notify(PSTR("\r\nMotion Controller Connected"), 0x80);
198 #endif
199 
200  if(my_bdaddr[0] == 0x00 && my_bdaddr[1] == 0x00 && my_bdaddr[2] == 0x00 && my_bdaddr[3] == 0x00 && my_bdaddr[4] == 0x00 && my_bdaddr[5] == 0x00) {
201 #ifdef DEBUG_USB_HOST
202  Notify(PSTR("\r\nPlease plug in the dongle before trying to pair with the PS3 Controller\r\nor set the Bluetooth address in the constructor of the PS3BT class"), 0x80);
203 #endif
204  } else {
205  if(PID == PS3_PID || PID == PS3NAVIGATION_PID)
206  setBdaddr(my_bdaddr); // Set internal Bluetooth address
207  else
208  setMoveBdaddr(my_bdaddr); // Set internal Bluetooth address
209 #ifdef DEBUG_USB_HOST
210  Notify(PSTR("\r\nBluetooth Address was set to: "), 0x80);
211  for(int8_t i = 5; i > 0; i--) {
212  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
213  Notify(PSTR(":"), 0x80);
214  }
215  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
216 #endif
217  }
218 
219  pUsb->setConf(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, 0); // Reset configuration value
220  pUsb->setAddr(bAddress, 0, 0); // Reset address
221  Release(); // Release device
223  } else {
224  // Check if attached device is a Bluetooth dongle and fill endpoint data structure
225  // First interface in the configuration must have Bluetooth assigned Class/Subclass/Protocol
226  // And 3 endpoints - interrupt-IN, bulk-IN, bulk-OUT, not necessarily in this order
227  for(uint8_t i = 0; i < num_of_conf; i++) {
228  if((VID == IOGEAR_GBU521_VID && PID == IOGEAR_GBU521_PID) || (VID == BELKIN_F8T065BF_VID && PID == BELKIN_F8T065BF_PID)) {
229  ConfigDescParser<USB_CLASS_VENDOR_SPECIFIC, WI_SUBCLASS_RF, WI_PROTOCOL_BT, CP_MASK_COMPARE_ALL> confDescrParser(this); // Workaround issue with some dongles
230  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
231  } else {
232  ConfigDescParser<USB_CLASS_WIRELESS_CTRL, WI_SUBCLASS_RF, WI_PROTOCOL_BT, CP_MASK_COMPARE_ALL> confDescrParser(this); // Set class id according to the specification
233  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
234  }
235  if(rcode) // Check error code
236  goto FailGetConfDescr;
237  if(bNumEP >= BTD_MAX_ENDPOINTS) // All endpoints extracted
238  break;
239  }
240 
242  goto FailUnknownDevice;
243 
244  // Assign epInfo to epinfo pointer - this time all 3 endpoins
245  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
246  if(rcode)
247  goto FailSetDevTblEntry;
248 
249  // Set Configuration Value
250  rcode = pUsb->setConf(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bConfNum);
251  if(rcode)
252  goto FailSetConfDescr;
253 
254  hci_num_reset_loops = 100; // only loop 100 times before trying to send the hci reset command
255  hci_counter = 0;
256  hci_state = HCI_INIT_STATE;
257  waitingForConnection = false;
258  bPollEnable = true;
259 
260 #ifdef DEBUG_USB_HOST
261  Notify(PSTR("\r\nBluetooth Dongle Initialized"), 0x80);
262 #endif
263  }
264  return 0; // Successful configuration
265 
266  /* Diagnostic messages */
267 FailSetDevTblEntry:
268 #ifdef DEBUG_USB_HOST
270  goto Fail;
271 #endif
272 
273 FailGetConfDescr:
274 #ifdef DEBUG_USB_HOST
276  goto Fail;
277 #endif
278 
279 FailSetConfDescr:
280 #ifdef DEBUG_USB_HOST
282 #endif
283  goto Fail;
284 
285 FailUnknownDevice:
286 #ifdef DEBUG_USB_HOST
287  NotifyFailUnknownDevice(VID, PID);
288 #endif
289  pUsb->setAddr(bAddress, 0, 0); // Reset address
291 Fail:
292 #ifdef DEBUG_USB_HOST
293  Notify(PSTR("\r\nBTD Init Failed, error code: "), 0x80);
294  NotifyFail(rcode);
295 #endif
296  Release();
297  return rcode;
298 }
299 
300 void BTD::Initialize() {
301  uint8_t i;
302  for(i = 0; i < BTD_MAX_ENDPOINTS; i++) {
303  epInfo[i].epAddr = 0;
304  epInfo[i].maxPktSize = (i) ? 0 : 8;
305  epInfo[i].bmSndToggle = 0;
306  epInfo[i].bmRcvToggle = 0;
308  }
309  for(i = 0; i < BTD_NUM_SERVICES; i++) {
310  if(btService[i])
311  btService[i]->Reset(); // Reset all Bluetooth services
312  }
313 
314  connectToWii = false;
315  incomingWii = false;
316  connectToHIDDevice = false;
317  incomingHIDDevice = false;
318  incomingPS4 = false;
319  bAddress = 0; // Clear device address
320  bNumEP = 1; // Must have to be reset to 1
321  qNextPollTime = 0; // Reset next poll time
322  pollInterval = 0;
323  bPollEnable = false; // Don't start polling before dongle is connected
324 }
325 
326 /* Extracts interrupt-IN, bulk-IN, bulk-OUT endpoint information from config descriptor */
327 void BTD::EndpointXtract(uint8_t conf, uint8_t iface __attribute__((unused)), uint8_t alt, uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
328  //ErrorMessage<uint8_t>(PSTR("Conf.Val"),conf);
329  //ErrorMessage<uint8_t>(PSTR("Iface Num"),iface);
330  //ErrorMessage<uint8_t>(PSTR("Alt.Set"),alt);
331 
332  if(alt) // Wrong interface - by BT spec, no alt setting
333  return;
334 
335  bConfNum = conf;
336  uint8_t index;
337 
338  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80) { // Interrupt In endpoint found
339  index = BTD_EVENT_PIPE;
341  } else if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_BULK) // Bulk endpoint found
342  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? BTD_DATAIN_PIPE : BTD_DATAOUT_PIPE;
343  else
344  return;
345 
346  // Fill the rest of endpoint data structure
347  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
348  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
349 #ifdef EXTRADEBUG
351 #endif
352  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
353  pollInterval = pep->bInterval;
354  bNumEP++;
355 }
356 
357 void BTD::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr __attribute__((unused))) {
358 #ifdef EXTRADEBUG
359  Notify(PSTR("\r\nEndpoint descriptor:"), 0x80);
360  Notify(PSTR("\r\nLength:\t\t"), 0x80);
361  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
362  Notify(PSTR("\r\nType:\t\t"), 0x80);
363  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
364  Notify(PSTR("\r\nAddress:\t"), 0x80);
365  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
366  Notify(PSTR("\r\nAttributes:\t"), 0x80);
367  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
368  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
369  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
370  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
371  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
372 #endif
373 }
374 
375 /* Performs a cleanup after failed Init() attempt */
376 uint8_t BTD::Release() {
377  Initialize(); // Set all variables, endpoint structs etc. to default values
379  return 0;
380 }
381 
382 uint8_t BTD::Poll() {
383  if(!bPollEnable)
384  return 0;
385  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) { // Don't poll if shorter than polling interval
386  qNextPollTime = (uint32_t)millis() + pollInterval; // Set new poll time
387  HCI_event_task(); // Poll the HCI event pipe
388  HCI_task(); // HCI state machine
389  ACL_event_task(); // Poll the ACL input pipe too
390  }
391  return 0;
392 }
393 
395  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
396  if(btService[i])
397  btService[i]->disconnect();
398 };
399 
400 void BTD::HCI_event_task() {
401  uint16_t length = BULK_MAXPKTSIZE; // Request more than 16 bytes anyway, the inTransfer routine will take care of this
402  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_EVENT_PIPE ].epAddr, &length, hcibuf, pollInterval); // Input on endpoint 1
403 
404  if(!rcode || rcode == hrNAK) { // Check for errors
405  switch(hcibuf[0]) { // Switch on event type
406  case EV_COMMAND_COMPLETE:
407  if(!hcibuf[5]) { // Check if command succeeded
408  hci_set_flag(HCI_FLAG_CMD_COMPLETE); // Set command complete flag
409  if((hcibuf[3] == 0x01) && (hcibuf[4] == 0x10)) { // Parameters from read local version information
410  hci_version = hcibuf[6]; // Used to check if it supports 2.0+EDR - see http://www.bluetooth.org/Technical/AssignedNumbers/hci.htm
412  } else if((hcibuf[3] == 0x09) && (hcibuf[4] == 0x10)) { // Parameters from read local bluetooth address
413  for(uint8_t i = 0; i < 6; i++)
414  my_bdaddr[i] = hcibuf[6 + i];
416  }
417  }
418  break;
419 
420  case EV_COMMAND_STATUS:
421  if(hcibuf[2]) { // Show status on serial if not OK
422 #ifdef DEBUG_USB_HOST
423  Notify(PSTR("\r\nHCI Command Failed: "), 0x80);
424  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
425 #endif
426  }
427  break;
428 
429  case EV_INQUIRY_COMPLETE:
430  if(inquiry_counter >= 5 && (pairWithWii || pairWithHIDDevice)) {
431  inquiry_counter = 0;
432 #ifdef DEBUG_USB_HOST
433  if(pairWithWii)
434  Notify(PSTR("\r\nCouldn't find Wiimote"), 0x80);
435  else
436  Notify(PSTR("\r\nCouldn't find HID device"), 0x80);
437 #endif
438  connectToWii = false;
439  pairWithWii = false;
440  connectToHIDDevice = false;
441  pairWithHIDDevice = false;
442  hci_state = HCI_SCANNING_STATE;
443  }
444  inquiry_counter++;
445  break;
446 
447  case EV_INQUIRY_RESULT:
448  if(hcibuf[2]) { // Check that there is more than zero responses
449 #ifdef EXTRADEBUG
450  Notify(PSTR("\r\nNumber of responses: "), 0x80);
451  Notify(hcibuf[2], 0x80);
452 #endif
453  for(uint8_t i = 0; i < hcibuf[2]; i++) {
454  uint8_t offset = 8 * hcibuf[2] + 3 * i;
455 
456  for(uint8_t j = 0; j < 3; j++)
457  classOfDevice[j] = hcibuf[j + 4 + offset];
458 
459 #ifdef EXTRADEBUG
460  Notify(PSTR("\r\nClass of device: "), 0x80);
461  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
462  Notify(PSTR(" "), 0x80);
463  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
464  Notify(PSTR(" "), 0x80);
465  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
466 #endif
467 
468  if(pairWithWii && classOfDevice[2] == 0x00 && (classOfDevice[1] & 0x05) && (classOfDevice[0] & 0x0C)) { // See http://wiibrew.org/wiki/Wiimote#SDP_information
469  checkRemoteName = true; // Check remote name to distinguish between the different controllers
470 
471  for(uint8_t j = 0; j < 6; j++)
472  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
473 
475  break;
476  } else if(pairWithHIDDevice && (classOfDevice[1] & 0x05) && (classOfDevice[0] & 0xC8)) { // Check if it is a mouse, keyboard or a gamepad - see: http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
477 #ifdef DEBUG_USB_HOST
478  if(classOfDevice[0] & 0x80)
479  Notify(PSTR("\r\nMouse found"), 0x80);
480  if(classOfDevice[0] & 0x40)
481  Notify(PSTR("\r\nKeyboard found"), 0x80);
482  if(classOfDevice[0] & 0x08)
483  Notify(PSTR("\r\nGamepad found"), 0x80);
484 #endif
485 
486  for(uint8_t j = 0; j < 6; j++)
487  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
488 
490  break;
491  }
492  }
493  }
494  break;
495 
496  case EV_CONNECT_COMPLETE:
498  if(!hcibuf[2]) { // Check if connected OK
499 #ifdef EXTRADEBUG
500  Notify(PSTR("\r\nConnection established"), 0x80);
501 #endif
502  hci_handle = hcibuf[3] | ((hcibuf[4] & 0x0F) << 8); // Store the handle for the ACL connection
503  hci_set_flag(HCI_FLAG_CONNECT_COMPLETE); // Set connection complete flag
504  } else {
505  hci_state = HCI_CHECK_DEVICE_SERVICE;
506 #ifdef DEBUG_USB_HOST
507  Notify(PSTR("\r\nConnection Failed: "), 0x80);
508  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
509 #endif
510  }
511  break;
512 
514  if(!hcibuf[2]) { // Check if disconnected OK
515  hci_set_flag(HCI_FLAG_DISCONNECT_COMPLETE); // Set disconnect command complete flag
516  hci_clear_flag(HCI_FLAG_CONNECT_COMPLETE); // Clear connection complete flag
517  }
518  break;
519 
521  if(!hcibuf[2]) { // Check if reading is OK
522  for(uint8_t i = 0; i < min(sizeof (remote_name), sizeof (hcibuf) - 9); i++) {
523  remote_name[i] = hcibuf[9 + i];
524  if(remote_name[i] == '\0') // End of string
525  break;
526  }
527  // TODO: Altid sæt '\0' i remote name!
529  }
530  break;
531 
532  case EV_INCOMING_CONNECT:
533  for(uint8_t i = 0; i < 6; i++)
534  disc_bdaddr[i] = hcibuf[i + 2];
535 
536  for(uint8_t i = 0; i < 3; i++)
537  classOfDevice[i] = hcibuf[i + 8];
538 
539  if((classOfDevice[1] & 0x05) && (classOfDevice[0] & 0xC8)) { // Check if it is a mouse, keyboard or a gamepad
540 #ifdef DEBUG_USB_HOST
541  if(classOfDevice[0] & 0x80)
542  Notify(PSTR("\r\nMouse is connecting"), 0x80);
543  if(classOfDevice[0] & 0x40)
544  Notify(PSTR("\r\nKeyboard is connecting"), 0x80);
545  if(classOfDevice[0] & 0x08)
546  Notify(PSTR("\r\nGamepad is connecting"), 0x80);
547 #endif
548  incomingHIDDevice = true;
549  }
550 
551 #ifdef EXTRADEBUG
552  Notify(PSTR("\r\nClass of device: "), 0x80);
553  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
554  Notify(PSTR(" "), 0x80);
555  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
556  Notify(PSTR(" "), 0x80);
557  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
558 #endif
560  break;
561 
562  case EV_PIN_CODE_REQUEST:
563  if(pairWithWii) {
564 #ifdef DEBUG_USB_HOST
565  Notify(PSTR("\r\nPairing with Wiimote"), 0x80);
566 #endif
568  } else if(btdPin != NULL) {
569 #ifdef DEBUG_USB_HOST
570  Notify(PSTR("\r\nBluetooth pin is set too: "), 0x80);
571  NotifyStr(btdPin, 0x80);
572 #endif
574  } else {
575 #ifdef DEBUG_USB_HOST
576  Notify(PSTR("\r\nNo pin was set"), 0x80);
577 #endif
579  }
580  break;
581 
582  case EV_LINK_KEY_REQUEST:
583 #ifdef DEBUG_USB_HOST
584  Notify(PSTR("\r\nReceived Key Request"), 0x80);
585 #endif
587  break;
588 
590  if(!hcibuf[2]) { // Check if pairing was successful
591  if(pairWithWii && !connectToWii) {
592 #ifdef DEBUG_USB_HOST
593  Notify(PSTR("\r\nPairing successful with Wiimote"), 0x80);
594 #endif
595  connectToWii = true; // Used to indicate to the Wii service, that it should connect to this device
596  } else if(pairWithHIDDevice && !connectToHIDDevice) {
597 #ifdef DEBUG_USB_HOST
598  Notify(PSTR("\r\nPairing successful with HID device"), 0x80);
599 #endif
600  connectToHIDDevice = true; // Used to indicate to the BTHID service, that it should connect to this device
601  }
602  } else {
603 #ifdef DEBUG_USB_HOST
604  Notify(PSTR("\r\nPairing Failed: "), 0x80);
605  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
606 #endif
608  hci_state = HCI_DISCONNECT_STATE;
609  }
610  break;
611  /* We will just ignore the following events */
612  case EV_NUM_COMPLETE_PKT:
613  case EV_ROLE_CHANGED:
615  case EV_LOOPBACK_COMMAND:
618  case EV_MAX_SLOTS_CHANGE:
623  break;
624 #ifdef EXTRADEBUG
625  default:
626  if(hcibuf[0] != 0x00) {
627  Notify(PSTR("\r\nUnmanaged HCI Event: "), 0x80);
628  D_PrintHex<uint8_t > (hcibuf[0], 0x80);
629  }
630  break;
631 #endif
632  } // Switch
633  }
634 #ifdef EXTRADEBUG
635  else {
636  Notify(PSTR("\r\nHCI event error: "), 0x80);
637  D_PrintHex<uint8_t > (rcode, 0x80);
638  }
639 #endif
640 }
641 
642 /* Poll Bluetooth and print result */
643 void BTD::HCI_task() {
644  switch(hci_state) {
645  case HCI_INIT_STATE:
646  hci_counter++;
647  if(hci_counter > hci_num_reset_loops) { // wait until we have looped x times to clear any old events
648  hci_reset();
649  hci_state = HCI_RESET_STATE;
650  hci_counter = 0;
651  }
652  break;
653 
654  case HCI_RESET_STATE:
655  hci_counter++;
657  hci_counter = 0;
658 #ifdef DEBUG_USB_HOST
659  Notify(PSTR("\r\nHCI Reset complete"), 0x80);
660 #endif
661  hci_state = HCI_CLASS_STATE;
663  } else if(hci_counter > hci_num_reset_loops) {
664  hci_num_reset_loops *= 10;
665  if(hci_num_reset_loops > 2000)
666  hci_num_reset_loops = 2000;
667 #ifdef DEBUG_USB_HOST
668  Notify(PSTR("\r\nNo response to HCI Reset"), 0x80);
669 #endif
670  hci_state = HCI_INIT_STATE;
671  hci_counter = 0;
672  }
673  break;
674 
675  case HCI_CLASS_STATE:
677 #ifdef DEBUG_USB_HOST
678  Notify(PSTR("\r\nWrite class of device"), 0x80);
679 #endif
680  hci_state = HCI_BDADDR_STATE;
681  hci_read_bdaddr();
682  }
683  break;
684 
685  case HCI_BDADDR_STATE:
687 #ifdef DEBUG_USB_HOST
688  Notify(PSTR("\r\nLocal Bluetooth Address: "), 0x80);
689  for(int8_t i = 5; i > 0; i--) {
690  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
691  Notify(PSTR(":"), 0x80);
692  }
693  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
694 #endif
696  hci_state = HCI_LOCAL_VERSION_STATE;
697  }
698  break;
699 
700  case HCI_LOCAL_VERSION_STATE: // The local version is used by the PS3BT class
702  if(btdName != NULL) {
704  hci_state = HCI_SET_NAME_STATE;
705  } else
706  hci_state = HCI_CHECK_DEVICE_SERVICE;
707  }
708  break;
709 
710  case HCI_SET_NAME_STATE:
712 #ifdef DEBUG_USB_HOST
713  Notify(PSTR("\r\nThe name is set to: "), 0x80);
714  NotifyStr(btdName, 0x80);
715 #endif
716  hci_state = HCI_CHECK_DEVICE_SERVICE;
717  }
718  break;
719 
721  if(pairWithHIDDevice || pairWithWii) { // Check if it should try to connect to a Wiimote
722 #ifdef DEBUG_USB_HOST
723  if(pairWithWii)
724  Notify(PSTR("\r\nStarting inquiry\r\nPress 1 & 2 on the Wiimote\r\nOr press the SYNC button if you are using a Wii U Pro Controller or a Wii Balance Board"), 0x80);
725  else
726  Notify(PSTR("\r\nPlease enable discovery of your device"), 0x80);
727 #endif
728  hci_inquiry();
729  hci_state = HCI_INQUIRY_STATE;
730  } else
731  hci_state = HCI_SCANNING_STATE; // Don't try to connect to a Wiimote
732  break;
733 
734  case HCI_INQUIRY_STATE:
736  hci_inquiry_cancel(); // Stop inquiry
737 #ifdef DEBUG_USB_HOST
738  if(pairWithWii)
739  Notify(PSTR("\r\nWiimote found"), 0x80);
740  else
741  Notify(PSTR("\r\nHID device found"), 0x80);
742 
743  Notify(PSTR("\r\nNow just create the instance like so:"), 0x80);
744  if(pairWithWii)
745  Notify(PSTR("\r\nWII Wii(&Btd);"), 0x80);
746  else
747  Notify(PSTR("\r\nBTHID bthid(&Btd);"), 0x80);
748 
749  Notify(PSTR("\r\nAnd then press any button on the "), 0x80);
750  if(pairWithWii)
751  Notify(PSTR("Wiimote"), 0x80);
752  else
753  Notify(PSTR("device"), 0x80);
754 #endif
755  if(checkRemoteName) {
756  hci_remote_name(); // We need to know the name to distinguish between the Wiimote, the new Wiimote with Motion Plus inside, a Wii U Pro Controller and a Wii Balance Board
757  hci_state = HCI_REMOTE_NAME_STATE;
758  } else
759  hci_state = HCI_CONNECT_DEVICE_STATE;
760  }
761  break;
762 
765 #ifdef DEBUG_USB_HOST
766  if(pairWithWii)
767  Notify(PSTR("\r\nConnecting to Wiimote"), 0x80);
768  else
769  Notify(PSTR("\r\nConnecting to HID device"), 0x80);
770 #endif
771  checkRemoteName = false;
772  hci_connect();
773  hci_state = HCI_CONNECTED_DEVICE_STATE;
774  }
775  break;
776 
780 #ifdef DEBUG_USB_HOST
781  if(pairWithWii)
782  Notify(PSTR("\r\nConnected to Wiimote"), 0x80);
783  else
784  Notify(PSTR("\r\nConnected to HID device"), 0x80);
785 #endif
786  hci_authentication_request(); // This will start the pairing with the Wiimote
787  hci_state = HCI_SCANNING_STATE;
788  } else {
789 #ifdef DEBUG_USB_HOST
790  Notify(PSTR("\r\nTrying to connect one more time..."), 0x80);
791 #endif
792  hci_connect(); // Try to connect one more time
793  }
794  }
795  break;
796 
797  case HCI_SCANNING_STATE:
799 #ifdef DEBUG_USB_HOST
800  Notify(PSTR("\r\nWait For Incoming Connection Request"), 0x80);
801 #endif
803  waitingForConnection = true;
804  hci_state = HCI_CONNECT_IN_STATE;
805  }
806  break;
807 
810  waitingForConnection = false;
811 #ifdef DEBUG_USB_HOST
812  Notify(PSTR("\r\nIncoming Connection Request"), 0x80);
813 #endif
814  hci_remote_name();
815  hci_state = HCI_REMOTE_NAME_STATE;
817  hci_state = HCI_DISCONNECT_STATE;
818  break;
819 
822 #ifdef DEBUG_USB_HOST
823  Notify(PSTR("\r\nRemote Name: "), 0x80);
824  for(uint8_t i = 0; i < strlen(remote_name); i++)
825  Notifyc(remote_name[i], 0x80);
826 #endif
827  if(strncmp((const char*)remote_name, "Nintendo", 8) == 0) {
828  incomingWii = true;
829  motionPlusInside = false;
830  wiiUProController = false;
831  pairWiiUsingSync = false;
832 #ifdef DEBUG_USB_HOST
833  Notify(PSTR("\r\nWiimote is connecting"), 0x80);
834 #endif
835  if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-TR", 22) == 0) {
836 #ifdef DEBUG_USB_HOST
837  Notify(PSTR(" with Motion Plus Inside"), 0x80);
838 #endif
839  motionPlusInside = true;
840  } else if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-UC", 22) == 0) {
841 #ifdef DEBUG_USB_HOST
842  Notify(PSTR(" - Wii U Pro Controller"), 0x80);
843 #endif
844  wiiUProController = motionPlusInside = pairWiiUsingSync = true;
845  } else if(strncmp((const char*)remote_name, "Nintendo RVL-WBC-01", 19) == 0) {
846 #ifdef DEBUG_USB_HOST
847  Notify(PSTR(" - Wii Balance Board"), 0x80);
848 #endif
849  pairWiiUsingSync = true;
850  }
851  }
852  if(classOfDevice[2] == 0 && classOfDevice[1] == 0x25 && classOfDevice[0] == 0x08 && strncmp((const char*)remote_name, "Wireless Controller", 19) == 0) {
853 #ifdef DEBUG_USB_HOST
854  Notify(PSTR("\r\nPS4 controller is connecting"), 0x80);
855 #endif
856  incomingPS4 = true;
857  }
858  if(pairWithWii && checkRemoteName)
859  hci_state = HCI_CONNECT_DEVICE_STATE;
860  else {
862  hci_state = HCI_CONNECTED_STATE;
863  }
864  }
865  break;
866 
867  case HCI_CONNECTED_STATE:
869 #ifdef DEBUG_USB_HOST
870  Notify(PSTR("\r\nConnected to Device: "), 0x80);
871  for(int8_t i = 5; i > 0; i--) {
872  D_PrintHex<uint8_t > (disc_bdaddr[i], 0x80);
873  Notify(PSTR(":"), 0x80);
874  }
875  D_PrintHex<uint8_t > (disc_bdaddr[0], 0x80);
876 #endif
877  if(incomingPS4)
878  connectToHIDDevice = true; // We should always connect to the PS4 controller
879 
880  // Clear these flags for a new connection
881  l2capConnectionClaimed = false;
882  sdpConnectionClaimed = false;
883  rfcommConnectionClaimed = false;
884 
885  hci_event_flag = 0;
886  hci_state = HCI_DONE_STATE;
887  }
888  break;
889 
890  case HCI_DONE_STATE:
891  hci_counter++;
892  if(hci_counter > 1000) { // Wait until we have looped 1000 times to make sure that the L2CAP connection has been started
893  hci_counter = 0;
894  hci_state = HCI_SCANNING_STATE;
895  }
896  break;
897 
900 #ifdef DEBUG_USB_HOST
901  Notify(PSTR("\r\nHCI Disconnected from Device"), 0x80);
902 #endif
903  hci_event_flag = 0; // Clear all flags
904 
905  // Reset all buffers
906  memset(hcibuf, 0, BULK_MAXPKTSIZE);
907  memset(l2capinbuf, 0, BULK_MAXPKTSIZE);
908 
910  connectToHIDDevice = incomingHIDDevice = pairWithHIDDevice = checkRemoteName = false;
911  incomingPS4 = false;
912 
913  hci_state = HCI_SCANNING_STATE;
914  }
915  break;
916  default:
917  break;
918  }
919 }
920 
921 void BTD::ACL_event_task() {
922  uint16_t length = BULK_MAXPKTSIZE;
923  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_DATAIN_PIPE ].epAddr, &length, l2capinbuf, pollInterval); // Input on endpoint 2
924 
925  if(!rcode) { // Check for errors
926  if(length > 0) { // Check if any data was read
927  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
928  if(btService[i])
929  btService[i]->ACLData(l2capinbuf);
930  }
931  }
932  }
933 #ifdef EXTRADEBUG
934  else if(rcode != hrNAK) {
935  Notify(PSTR("\r\nACL data in error: "), 0x80);
936  D_PrintHex<uint8_t > (rcode, 0x80);
937  }
938 #endif
939  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
940  if(btService[i])
941  btService[i]->Run();
942 }
943 
944 /************************************************************/
945 /* HCI Commands */
946 
947 /************************************************************/
948 void BTD::HCI_Command(uint8_t* data, uint16_t nbytes) {
950  pUsb->ctrlReq(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bmREQ_HCI_OUT, 0x00, 0x00, 0x00, 0x00, nbytes, nbytes, data, NULL);
951 }
952 
954  hci_event_flag = 0; // Clear all the flags
955  hcibuf[0] = 0x03; // HCI OCF = 3
956  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
957  hcibuf[2] = 0x00;
958 
959  HCI_Command(hcibuf, 3);
960 }
961 
964  hcibuf[0] = 0x1A; // HCI OCF = 1A
965  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
966  hcibuf[2] = 0x01; // parameter length = 1
967  if(btdName != NULL)
968  hcibuf[3] = 0x03; // Inquiry Scan enabled. Page Scan enabled.
969  else
970  hcibuf[3] = 0x02; // Inquiry Scan disabled. Page Scan enabled.
971 
972  HCI_Command(hcibuf, 4);
973 }
974 
976  hcibuf[0] = 0x1A; // HCI OCF = 1A
977  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
978  hcibuf[2] = 0x01; // parameter length = 1
979  hcibuf[3] = 0x00; // Inquiry Scan disabled. Page Scan disabled.
980 
981  HCI_Command(hcibuf, 4);
982 }
983 
986  hcibuf[0] = 0x09; // HCI OCF = 9
987  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
988  hcibuf[2] = 0x00;
989 
990  HCI_Command(hcibuf, 3);
991 }
992 
995  hcibuf[0] = 0x01; // HCI OCF = 1
996  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
997  hcibuf[2] = 0x00;
998 
999  HCI_Command(hcibuf, 3);
1000 }
1001 
1004  hcibuf[0] = 0x09; // HCI OCF = 9
1005  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1006  hcibuf[2] = 0x07; // parameter length 7
1007  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1008  hcibuf[4] = disc_bdaddr[1];
1009  hcibuf[5] = disc_bdaddr[2];
1010  hcibuf[6] = disc_bdaddr[3];
1011  hcibuf[7] = disc_bdaddr[4];
1012  hcibuf[8] = disc_bdaddr[5];
1013  hcibuf[9] = 0x00; // Switch role to master
1014 
1015  HCI_Command(hcibuf, 10);
1016 }
1017 
1020  hcibuf[0] = 0x19; // HCI OCF = 19
1021  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1022  hcibuf[2] = 0x0A; // parameter length = 10
1023  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1024  hcibuf[4] = disc_bdaddr[1];
1025  hcibuf[5] = disc_bdaddr[2];
1026  hcibuf[6] = disc_bdaddr[3];
1027  hcibuf[7] = disc_bdaddr[4];
1028  hcibuf[8] = disc_bdaddr[5];
1029  hcibuf[9] = 0x01; // Page Scan Repetition Mode
1030  hcibuf[10] = 0x00; // Reserved
1031  hcibuf[11] = 0x00; // Clock offset - low byte
1032  hcibuf[12] = 0x00; // Clock offset - high byte
1033 
1034  HCI_Command(hcibuf, 13);
1035 }
1036 
1037 void BTD::hci_set_local_name(const char* name) {
1038  hcibuf[0] = 0x13; // HCI OCF = 13
1039  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
1040  hcibuf[2] = strlen(name) + 1; // parameter length = the length of the string + end byte
1041  uint8_t i;
1042  for(i = 0; i < strlen(name); i++)
1043  hcibuf[i + 3] = name[i];
1044  hcibuf[i + 3] = 0x00; // End of string
1045 
1046  HCI_Command(hcibuf, 4 + strlen(name));
1047 }
1048 
1051  hcibuf[0] = 0x01;
1052  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1053  hcibuf[2] = 0x05; // Parameter Total Length = 5
1054  hcibuf[3] = 0x33; // LAP: Genera/Unlimited Inquiry Access Code (GIAC = 0x9E8B33) - see https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
1055  hcibuf[4] = 0x8B;
1056  hcibuf[5] = 0x9E;
1057  hcibuf[6] = 0x30; // Inquiry time = 61.44 sec (maximum)
1058  hcibuf[7] = 0x0A; // 10 number of responses
1059 
1060  HCI_Command(hcibuf, 8);
1061 }
1062 
1064  hcibuf[0] = 0x02;
1065  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1066  hcibuf[2] = 0x00; // Parameter Total Length = 0
1067 
1068  HCI_Command(hcibuf, 3);
1069 }
1070 
1072  hci_connect(disc_bdaddr); // Use last discovered device
1073 }
1074 
1075 void BTD::hci_connect(uint8_t *bdaddr) {
1077  hcibuf[0] = 0x05;
1078  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1079  hcibuf[2] = 0x0D; // parameter Total Length = 13
1080  hcibuf[3] = bdaddr[0]; // 6 octet bdaddr (LSB)
1081  hcibuf[4] = bdaddr[1];
1082  hcibuf[5] = bdaddr[2];
1083  hcibuf[6] = bdaddr[3];
1084  hcibuf[7] = bdaddr[4];
1085  hcibuf[8] = bdaddr[5];
1086  hcibuf[9] = 0x18; // DM1 or DH1 may be used
1087  hcibuf[10] = 0xCC; // DM3, DH3, DM5, DH5 may be used
1088  hcibuf[11] = 0x01; // Page repetition mode R1
1089  hcibuf[12] = 0x00; // Reserved
1090  hcibuf[13] = 0x00; // Clock offset
1091  hcibuf[14] = 0x00; // Invalid clock offset
1092  hcibuf[15] = 0x00; // Do not allow role switch
1093 
1094  HCI_Command(hcibuf, 16);
1095 }
1096 
1098  hcibuf[0] = 0x0D; // HCI OCF = 0D
1099  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1100  hcibuf[2] = 0x17; // parameter length 23
1101  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1102  hcibuf[4] = disc_bdaddr[1];
1103  hcibuf[5] = disc_bdaddr[2];
1104  hcibuf[6] = disc_bdaddr[3];
1105  hcibuf[7] = disc_bdaddr[4];
1106  hcibuf[8] = disc_bdaddr[5];
1107  if(pairWithWii) {
1108  hcibuf[9] = 6; // Pin length is the length of the Bluetooth address
1109  if(pairWiiUsingSync) {
1110 #ifdef DEBUG_USB_HOST
1111  Notify(PSTR("\r\nPairing with Wii controller via SYNC"), 0x80);
1112 #endif
1113  for(uint8_t i = 0; i < 6; i++)
1114  hcibuf[10 + i] = my_bdaddr[i]; // The pin is the Bluetooth dongles Bluetooth address backwards
1115  } else {
1116  for(uint8_t i = 0; i < 6; i++)
1117  hcibuf[10 + i] = disc_bdaddr[i]; // The pin is the Wiimote's Bluetooth address backwards
1118  }
1119  for(uint8_t i = 16; i < 26; i++)
1120  hcibuf[i] = 0x00; // The rest should be 0
1121  } else {
1122  hcibuf[9] = strlen(btdPin); // Length of pin
1123  uint8_t i;
1124  for(i = 0; i < strlen(btdPin); i++) // The maximum size of the pin is 16
1125  hcibuf[i + 10] = btdPin[i];
1126  for(; i < 16; i++)
1127  hcibuf[i + 10] = 0x00; // The rest should be 0
1128  }
1129 
1130  HCI_Command(hcibuf, 26);
1131 }
1132 
1134  hcibuf[0] = 0x0E; // HCI OCF = 0E
1135  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1136  hcibuf[2] = 0x06; // parameter length 6
1137  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1138  hcibuf[4] = disc_bdaddr[1];
1139  hcibuf[5] = disc_bdaddr[2];
1140  hcibuf[6] = disc_bdaddr[3];
1141  hcibuf[7] = disc_bdaddr[4];
1142  hcibuf[8] = disc_bdaddr[5];
1143 
1144  HCI_Command(hcibuf, 9);
1145 }
1146 
1148  hcibuf[0] = 0x0C; // HCI OCF = 0C
1149  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1150  hcibuf[2] = 0x06; // parameter length 6
1151  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1152  hcibuf[4] = disc_bdaddr[1];
1153  hcibuf[5] = disc_bdaddr[2];
1154  hcibuf[6] = disc_bdaddr[3];
1155  hcibuf[7] = disc_bdaddr[4];
1156  hcibuf[8] = disc_bdaddr[5];
1157 
1158  HCI_Command(hcibuf, 9);
1159 }
1160 
1162  hcibuf[0] = 0x11; // HCI OCF = 11
1163  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1164  hcibuf[2] = 0x02; // parameter length = 2
1165  hcibuf[3] = (uint8_t)(hci_handle & 0xFF); //connection handle - low byte
1166  hcibuf[4] = (uint8_t)((hci_handle >> 8) & 0x0F); //connection handle - high byte
1167 
1168  HCI_Command(hcibuf, 5);
1169 }
1170 
1171 void BTD::hci_disconnect(uint16_t handle) { // This is called by the different services
1173  hcibuf[0] = 0x06; // HCI OCF = 6
1174  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1175  hcibuf[2] = 0x03; // parameter length = 3
1176  hcibuf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte
1177  hcibuf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte
1178  hcibuf[5] = 0x13; // reason
1179 
1180  HCI_Command(hcibuf, 6);
1181 }
1182 
1183 void BTD::hci_write_class_of_device() { // See http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
1184  hcibuf[0] = 0x24; // HCI OCF = 24
1185  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
1186  hcibuf[2] = 0x03; // parameter length = 3
1187  hcibuf[3] = 0x04; // Robot
1188  hcibuf[4] = 0x08; // Toy
1189  hcibuf[5] = 0x00;
1190 
1191  HCI_Command(hcibuf, 6);
1192 }
1193 /*******************************************************************
1194  * *
1195  * HCI ACL Data Packet *
1196  * *
1197  * buf[0] buf[1] buf[2] buf[3]
1198  * 0 4 8 11 12 16 24 31 MSB
1199  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1200  * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet
1201  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1202  *
1203  * buf[4] buf[5] buf[6] buf[7]
1204  * 0 8 16 31 MSB
1205  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1206  * | Length | Channel ID | Basic L2CAP header
1207  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1208  *
1209  * buf[8] buf[9] buf[10] buf[11]
1210  * 0 8 16 31 MSB
1211  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1212  * | Code | Identifier | Length | Control frame (C-frame)
1213  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format)
1214  */
1215 /************************************************************/
1216 /* L2CAP Commands */
1217 
1218 /************************************************************/
1219 void BTD::L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow, uint8_t channelHigh) {
1220  uint8_t buf[8 + nbytes];
1221  buf[0] = (uint8_t)(handle & 0xff); // HCI handle with PB,BC flag
1222  buf[1] = (uint8_t)(((handle >> 8) & 0x0f) | 0x20);
1223  buf[2] = (uint8_t)((4 + nbytes) & 0xff); // HCI ACL total data length
1224  buf[3] = (uint8_t)((4 + nbytes) >> 8);
1225  buf[4] = (uint8_t)(nbytes & 0xff); // L2CAP header: Length
1226  buf[5] = (uint8_t)(nbytes >> 8);
1227  buf[6] = channelLow;
1228  buf[7] = channelHigh;
1229 
1230  for(uint16_t i = 0; i < nbytes; i++) // L2CAP C-frame
1231  buf[8 + i] = data[i];
1232 
1233  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ BTD_DATAOUT_PIPE ].epAddr, (8 + nbytes), buf);
1234  if(rcode) {
1235  delay(100); // This small delay prevents it from overflowing if it fails
1236 #ifdef DEBUG_USB_HOST
1237  Notify(PSTR("\r\nError sending L2CAP message: 0x"), 0x80);
1238  D_PrintHex<uint8_t > (rcode, 0x80);
1239  Notify(PSTR(" - Channel ID: "), 0x80);
1240  D_PrintHex<uint8_t > (channelHigh, 0x80);
1241  Notify(PSTR(" "), 0x80);
1242  D_PrintHex<uint8_t > (channelLow, 0x80);
1243 #endif
1244  }
1245 }
1246 
1247 void BTD::l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm) {
1248  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_REQUEST; // Code
1249  l2capoutbuf[1] = rxid; // Identifier
1250  l2capoutbuf[2] = 0x04; // Length
1251  l2capoutbuf[3] = 0x00;
1252  l2capoutbuf[4] = (uint8_t)(psm & 0xff); // PSM
1253  l2capoutbuf[5] = (uint8_t)(psm >> 8);
1254  l2capoutbuf[6] = scid[0]; // Source CID
1255  l2capoutbuf[7] = scid[1];
1256 
1257  L2CAP_Command(handle, l2capoutbuf, 8);
1258 }
1259 
1260 void BTD::l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result) {
1261  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code
1262  l2capoutbuf[1] = rxid; // Identifier
1263  l2capoutbuf[2] = 0x08; // Length
1264  l2capoutbuf[3] = 0x00;
1265  l2capoutbuf[4] = dcid[0]; // Destination CID
1266  l2capoutbuf[5] = dcid[1];
1267  l2capoutbuf[6] = scid[0]; // Source CID
1268  l2capoutbuf[7] = scid[1];
1269  l2capoutbuf[8] = result; // Result: Pending or Success
1270  l2capoutbuf[9] = 0x00;
1271  l2capoutbuf[10] = 0x00; // No further information
1272  l2capoutbuf[11] = 0x00;
1273 
1274  L2CAP_Command(handle, l2capoutbuf, 12);
1275 }
1276 
1277 void BTD::l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid) {
1278  l2capoutbuf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code
1279  l2capoutbuf[1] = rxid; // Identifier
1280  l2capoutbuf[2] = 0x08; // Length
1281  l2capoutbuf[3] = 0x00;
1282  l2capoutbuf[4] = dcid[0]; // Destination CID
1283  l2capoutbuf[5] = dcid[1];
1284  l2capoutbuf[6] = 0x00; // Flags
1285  l2capoutbuf[7] = 0x00;
1286  l2capoutbuf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) - Hint
1287  l2capoutbuf[9] = 0x02; // Config Opt: length
1288  l2capoutbuf[10] = 0xFF; // MTU
1289  l2capoutbuf[11] = 0xFF;
1290 
1291  L2CAP_Command(handle, l2capoutbuf, 12);
1292 }
1293 
1294 void BTD::l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid) {
1295  l2capoutbuf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code
1296  l2capoutbuf[1] = rxid; // Identifier
1297  l2capoutbuf[2] = 0x0A; // Length
1298  l2capoutbuf[3] = 0x00;
1299  l2capoutbuf[4] = scid[0]; // Source CID
1300  l2capoutbuf[5] = scid[1];
1301  l2capoutbuf[6] = 0x00; // Flag
1302  l2capoutbuf[7] = 0x00;
1303  l2capoutbuf[8] = 0x00; // Result
1304  l2capoutbuf[9] = 0x00;
1305  l2capoutbuf[10] = 0x01; // Config
1306  l2capoutbuf[11] = 0x02;
1307  l2capoutbuf[12] = 0xA0;
1308  l2capoutbuf[13] = 0x02;
1309 
1310  L2CAP_Command(handle, l2capoutbuf, 14);
1311 }
1312 
1313 void BTD::l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
1314  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code
1315  l2capoutbuf[1] = rxid; // Identifier
1316  l2capoutbuf[2] = 0x04; // Length
1317  l2capoutbuf[3] = 0x00;
1318  l2capoutbuf[4] = dcid[0];
1319  l2capoutbuf[5] = dcid[1];
1320  l2capoutbuf[6] = scid[0];
1321  l2capoutbuf[7] = scid[1];
1322 
1323  L2CAP_Command(handle, l2capoutbuf, 8);
1324 }
1325 
1326 void BTD::l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
1327  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code
1328  l2capoutbuf[1] = rxid; // Identifier
1329  l2capoutbuf[2] = 0x04; // Length
1330  l2capoutbuf[3] = 0x00;
1331  l2capoutbuf[4] = dcid[0];
1332  l2capoutbuf[5] = dcid[1];
1333  l2capoutbuf[6] = scid[0];
1334  l2capoutbuf[7] = scid[1];
1335 
1336  L2CAP_Command(handle, l2capoutbuf, 8);
1337 }
1338 
1339 void BTD::l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh) {
1340  l2capoutbuf[0] = L2CAP_CMD_INFORMATION_RESPONSE; // Code
1341  l2capoutbuf[1] = rxid; // Identifier
1342  l2capoutbuf[2] = 0x08; // Length
1343  l2capoutbuf[3] = 0x00;
1344  l2capoutbuf[4] = infoTypeLow;
1345  l2capoutbuf[5] = infoTypeHigh;
1346  l2capoutbuf[6] = 0x00; // Result = success
1347  l2capoutbuf[7] = 0x00; // Result = success
1348  l2capoutbuf[8] = 0x00;
1349  l2capoutbuf[9] = 0x00;
1350  l2capoutbuf[10] = 0x00;
1351  l2capoutbuf[11] = 0x00;
1352 
1353  L2CAP_Command(handle, l2capoutbuf, 12);
1354 }
1355 
1356 /* PS3 Commands - only set Bluetooth address is implemented in this library */
1357 void BTD::setBdaddr(uint8_t* bdaddr) {
1358  /* Set the internal Bluetooth address */
1359  uint8_t buf[8];
1360  buf[0] = 0x01;
1361  buf[1] = 0x00;
1362 
1363  for(uint8_t i = 0; i < 6; i++)
1364  buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
1365 
1366  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
1367  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
1368 }
1369 
1370 void BTD::setMoveBdaddr(uint8_t* bdaddr) {
1371  /* Set the internal Bluetooth address */
1372  uint8_t buf[11];
1373  buf[0] = 0x05;
1374  buf[7] = 0x10;
1375  buf[8] = 0x01;
1376  buf[9] = 0x02;
1377  buf[10] = 0x12;
1378 
1379  for(uint8_t i = 0; i < 6; i++)
1380  buf[i + 1] = bdaddr[i];
1381 
1382  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x05), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
1383  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
1384 }
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:525
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:801
uint8_t bmRcvToggle
Definition: address.h:48
bool incomingWii
Definition: BTD.h:474
@@ -1674,7 +291,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_b_t_d_8h.html b/_b_t_d_8h.html index 34a99f99..93cb8f0c 100644 --- a/_b_t_d_8h.html +++ b/_b_t_d_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -88,21 +89,34 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTD.h File Reference
-
#include "Usb.h"
-#include "usbhid.h"
+
#include "Usb.h"
+#include "usbhid.h"
Include dependency graph for BTD.h:
- + + + +
This graph shows which files directly or indirectly include this file:
- + + + + + + + + + + +

Go to the source code of this file.

@@ -2051,7 +2065,7 @@ Macros diff --git a/_b_t_d_8h__dep__incl.map b/_b_t_d_8h__dep__incl.map index 8d8be02b..d582d1ce 100644 --- a/_b_t_d_8h__dep__incl.map +++ b/_b_t_d_8h__dep__incl.map @@ -1,12 +1,12 @@ - - - - - + + + + + - - - - + + + + diff --git a/_b_t_d_8h__dep__incl.md5 b/_b_t_d_8h__dep__incl.md5 index c136623d..3f896a89 100644 --- a/_b_t_d_8h__dep__incl.md5 +++ b/_b_t_d_8h__dep__incl.md5 @@ -1 +1 @@ -a586d33041837831328e4bd5a24cb1bb \ No newline at end of file +1cf25c5527b32b2a9e530f3758fe7f24 \ No newline at end of file diff --git a/_b_t_d_8h__dep__incl.png b/_b_t_d_8h__dep__incl.png index 4a015f96155444ecccae01578ab900aed2472c10..a69a37b7bf936e071f5475c56e668f7e8b83514d 100644 GIT binary patch literal 13917 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 D0B;n2 diff --git a/_b_t_d_8h__incl.map b/_b_t_d_8h__incl.map index 07d46fbb..5dafafca 100644 --- a/_b_t_d_8h__incl.map +++ b/_b_t_d_8h__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/_b_t_d_8h__incl.md5 b/_b_t_d_8h__incl.md5 index 3b7065e7..e21490e4 100644 --- a/_b_t_d_8h__incl.md5 +++ b/_b_t_d_8h__incl.md5 @@ -1 +1 @@ -c23324ec95734679d4f49067f5869150 \ No newline at end of file +197d6a6ff2afdc0a0703304559fc9c13 \ No newline at end of file diff --git a/_b_t_d_8h__incl.png b/_b_t_d_8h__incl.png index 3334808dc402e6566687e718a97746e97450d3e6..914dd3ca6e9ce265c4a99381f2144034c271dfb9 100644 GIT binary patch literal 9492 zcmZX4by!r<*Y40r2?#@X!w?Dx(jd~EBPBz3cMUZl5{gPI4bnYyIY>!MgEUBkbi+M< zx4!$kd;U1*InSAW_FjAMwcht#D@IF0kr0m>4+H`cDl5tB0M|Yc2n`Dt9k}BXm!<$N z*cPga@}P%*zwEYepFki+kg~k2p5K@Kul_Q6`b)hdZGsqrd!+<7Rejm^)vbJ&c1>2w zHrHBjjg8XZsdBBKjysrtjHcCN0+KVj{P}gY>0FmySVtxe#4T@9Dbx!(fj|^EhCJH^LuNgu;Ub@&{U=qxJ6Jt zJv}lIJq@gi5?vtotc3e8cs{?W@Lq2$EfuR#PzQE`}wJ*3)vs7b`ud16<)>* zc*c={LCfE=LeN3Pm}9?x2mKjLTWIm+U}H;+0foMqhW^No}@nbPok+pORz+f3JvJD>iK zY?@M6>xJqW+&nz$?vKASvOkI~t8TwN9#~#pW|9)iRb0zud8~T_ zt*@_t!l9w2q(mts9R)MtOQG#mQC5~+gR;YT3`|{zpBfPb}dD292^YW)H3mn*VdgP>rU+*TNXD> zX&ZjH^B|kMf9Oa^N~+g|h7u`kQ?KsNkATUQ+izSPvwSTrJBmsiZtrhI3A&0-(7xkN zoL9RnmZd%`Si0KgHU0x8n+Ulur7w_TqzsdTA?tm9w-`!Wzk|c6dg49bzr$NM!a)xw(&1>ww>L|g{Z{21nv2=PgqSQ^oMjmzJmKNLY3a&w`qnl! z8XYF3iD(-q78Al>DUwa#IfnXZ^(OOrwzN!gaTyk$V9HACJt{3#^}cW!0!jMPX=qGU zSJz72i6VX$33*(9};C{))7*el+?Y_C9Shg5FS!QIyIC*Zf2H{ znVAq}RbNvx(|p#y)(fvFamejsz#P(ID>H83=Fp^XjVQ3}euw+!%_as8pZ5CWa2rk% zuq^S_mGH_+dz3WFW^KNH=w_!>9DyL^Hjx`8U_+IZIXT&DM@A9JLP4Qe_;PY`L5qQh z%;bDbc2T6TyZgW-1Xkd!-+LxW1Z-ybtLB>~o#T^{i=w}HvK*grdH5@BP?(zdu}qb` z8P9qDjwvE;&P`?J9UuD^l~e3x1K2E60JSE|2K( z!I66lfwJXOC~pE;j=uUAf*cjGelkX+=LVp9jx|(ESY8Q3U(XtD={e<_*(7|Ep=@9No^hfG} z&psc1%+A^@G^Z&hnAqEE%Nzk+en3nvE}EJxntP43anL*;tf{ktpK2#>7ZRUhyoUPw zPa5%(kghs6b2&N=7@GM@2%n|PTkJfe$GnpP8)zq54N@A5G_+q(&~ft^-ghl5taOGA zXq7Q-Vb)a1GuylU9kubm4()DtmCP-Gtlmz~&9OHHC=ld3$f)|fQdU0*R zcWm%f0Hd%z)jxg}-`xCT@Nmg8_h2~#(uFc7PAn}Y4Q$BN zDU*_}3c~NZT72QLHigmn0tkH_9h^40iR$2++me#PlTBA$D+V-*M$|`a99=dD96rsa zTG)EAcwuVF{qCKN3}$-O+n6kjbvJaoL#NPQh0$o*49{w8$qKN17T`Ya|`8#6<$BI!dS}Qy~6=)Wnci-Dm#nG%R58h z8?$Sk+g4xyeO=1N%}uXmC}vUANn)U{&oW5|0fi!w8~vYlGlM+j4w2TBQAtUYy89rM z+cIuxeLZ3)N1GHM|C}SM%&6Jx-C`(Jbc7kf5WXm?r1VpuA7vd+{&p4A&ti48v9U=K zSukdIu<%kinF>u6%1cjAq@_lM9tE4Pe|4~Ur%BMI4t92H9xr@+TEl9)dwVS> z1nfV;tv9|=tIxOkCz6rFM30V+3Lo-WK)AYMLqmABwi&XulT%X~U&WGEmxAe&dT=(E zzefPUYw+5fU53~|H5S!xpUu+lmOJZlzW2J&RDgm}2r)Dig@^w%Ae5yn z>@k~soE#(Wz~4gRrva3U!r&>*x54o3moJ4!C(^fnvBHx`T1MVSlQW|o0?vT zi@PqizAnDq?F?IAw+fT#TsvZBX2!$EKP%%(`l+7r9C+j8>h@v@-XU#!Efg+*sf(Cg zAbbtIJGwm?;b3L$+cy6dwY95Jw1JW zeE{x}bPT*W;N|6Q11|gX4T6G#H#}bEEN{aY)$+>978imY-K(uezl{A?i?A8@RK6IS zpBLxiDsFBzI&{(2Ch<3gLMe%fvsF`63f7TwIm<_W0aNJc=w6S(WMrpT;-|J&AcEV3 zJhX8~h%l)0*T-XO9u^iB9v&VcAt6rAB3rt(!-viOaWphE(*8HS_s3U3$Ecq_OKNL% zN7Ch)$0R8!DQDi~V9>}CgchTA_9B0ic{Ke_NRSr!l-Pf76h#dNpPx;?k@ow$Jeu>e z)Ua}@z)(+biw}tYgpls>aor1ZfBzSl9VBoZ4TgbVq;ooVfB*iyySd;Yd-wC_&$Hd> z-CrsHg>cGria{XJ`;>WicX!eldFI3)-QB!z+JATIB=Z^<2D$;5OVTx`nvb*7pC@vL zjGcqS*2bo}v2ie6*m1G717!~8God6Ww{~@X=%I1VFDTglwKEZrfS3gK zc-to0oM3SyVBRqJ+^9R*Vx#I z?E80xOvYCK6WXTMwWSBCwLPbk%eA$Y>*pl`NUn8{7nD(Hnhd4+@^~O(yy)L#J4#A^ zVqyWmn!S5nf6K%|;(GO9E21{`{m-+gRarj*SUjyJ1v3hE*hV4gd+@T2^J?ka*lZbu7F*P&eW>_XV z^(!~j!t)gH)N!M;io4_AEXBn>^BB-=@l{sD^WQV$Xf_j*>(A$ekLsPjX@_<&#T8MjLXxQ|c`Y$l zR>JcX4MXm{4;I@fxVSA?(G;OWLxUYc#d_&Llq`&Edi?Wu(_=cZy3?((viH)%xfP!i z(IWSwX=%&!xZ~x<)HC;c$gHgixs#%D3$+yW^!$vC4dqb&fq{$18+Hrw9e{CSV|hW@ z0Oo!Ti|N)OiYBKNjoJw}^IKtvkB2)gg$xfTG?>fcPIeRO0s&!YhzJC*$UnQgPR+u3 zBr*ADXqJ7HK_#>G&Srsu(|?BS>+64~2}am+y3e5Hyx&;0h+Runn{sI8(j|_u`s`D6 zI)ikC0nspBIBTihRM|ME3l|qrs*vS(&;T9B(Ofyi22U9jx69L9l-s9kbRI9aQ&*WJcv*Tbh?S#xQ0YO2Yi`Y@wbF~gWaVj-K2~_`2Jik zijrS6(PZ;0<l%Seif~#4xm7{*y)mFh- zv9G8uDM@c`*0Y%>(@0(RKU$qC*1bamL6Yw^%g5{ve;5B8D78Te{|tka9eWr7yGhxd z_Lz^+?a`y77rrjK3OxgWHR55ZnXNNU09g{#ZP&)Lf&skQ%jH5>hxzQx`{{$F8vt)R z++e%gA=YN#_b2$Z3EF6Cu&b-48mQ>k@*E{r;dvs1tYy)9bJ;%r4%WRnF-{{v4|i2;gD>VldDf6~ZsnE8*c`+C%rayY^0tJ3xdbBrr0qtnBSI^BA%M zFmJb#Aw#G?$%cUuWl^0Ou*1cdQmPsTuu>WG<EzDo z>1kqcp}?d$W#PrhquTdaKpeTUdWAmil=Zf|rc*{Fzz0p1fcz4r!#%05@6}5AuDfeH z$*m6UHPo`Vc}0{RJU&Lj#{~=Nr^uCN#E&)E)QI>8)Y(X1IHRb4Ri`Vgi!hk`6TJqw zeKw;M;lJ>LDJwv~Boc%rFZ>t5Ms{pJ!>_{n(a6|1AW&S}bhMKoue{0ro*|UKY}x$c z_!zt7f}hbBO_n@r7GT(Gy@5q~)Fsi%ub6RrdkJIyUmV*n|FtGbWdqQ-zI^?96?A`d z*ijj%qIuo?-mt>t5kCIfkso>(BO4n+4Z_PCe9*KBytco;pO>3UP4f`cbZ~I6SOvqd zmw5VA+g84G@?f^McVuLwzu*3BXA%#QE4{YPLU}%YD-s2ZCZan&Kkso5COo}TkH!mv zVPPk%96^etk*Ho`i6&xfBxj==Qk|Yb8Ww}f%o*YXKYb_LPU0GUtff4>k&D5vT}O*+`>YGSqpoV1tI7|W~P)KeX*X384npA{rhjK z9Q**Ze)sNO-)?w#cqaUnr1(0bp}|*2N5|XS8_ou(Z2|uNiPQJ@_iSuz>)zVhiNi{6 zZdFRG%$3&9(kd$tK|O(i9uN1yT^-wMlEUHeV=(~%H!VjhDyrA7U+3iH$jZt#Qy-k~&wKtEbocN;2@EbSnsFz6 z+y({_5)!hGtRMr)=CREUG((!_P%v>;EdXGFQS#c_tYBo@gSrl z&(Ajr-pav*PKCmR4YC+y-w1OPwbivX?`@jrPS6$~XJzFWonirYh~d^I3~?-J=OGIAC_G)$Ujdgd9_J7eH{8RaAaiAMEX!G`P^& z-+uL7TyYb%YF5Ytp5qY_)z{U15p}mvQ0M{mJf;-|l;hF)llyk2`e zAdLYcpktl7bZ>Wezg101Ny+8q<*Qim)BWLPKwKQvTKfIlAv~Pw@$s^4kL@FS1xDh3 zBKq-qKd>JI&-Y++U%!XZ%9gMQO*9m|($=2@q>fG`gj88lf_87u&uu9Eg>k*pY>hSk zxETT3PP&{XKE98O3%S<-XS*v@CaDSnnRzU^E{mwz%3_nJMAJv1gCY@+vhh{Rr;?K< z-`5jOxkc*0t^lQXnch(Q^;LF@v82nFS!e6m(Fi#hBI+7&OO2nRm=iyDqwGa5sbI`x zctA9Dcdu^p#IbRN8gW0tHEA>MzY z54X0I@)4j=DnXl0VNsA_1zE?{pOnSLgg3!w%q+b=zpxSNOdv*y-wlO@R8#kw3ky4d z)&>)sk|F+~$YA;!$!&e``)DcXB3{oUl{jivwsdjOCz9IE;{q|~pMB>x>_O{=)PLN+C|Mz@l$q; zd(wif=ZCu7lYs9!YR4|)?ka+ATZF^o-5Ki>XiTL8FjJV{a&r& zuW?s;@p^}g12|Eo5g6|?d}Z0(S6uu6kgnP1>>YPMsu)Li^T0GTu3G(ZjE%+lO=iU4 z_bh5HT?C);W4lot>c=had4uxe>wJthi)5sji61?j`#&4N8YNQOUv5a(jClH1@QyuE7@&m72YZmyy$%b9MGa;|Br+bj}YG#c1*I z`|K{`yrli%5t3?&>;<1wL?rG`abCRG;Lz-0)<+A7Jp0?V`22Zt$GwA&BPTe+b>!}N z19f%scy|6I2C_K;igeYAbc2gNtwbX$yUnxlgH#Hk z_)1_(6VnY;!CPOT5G+vYBo8bkWC*a5qhm(LgA{#niHOjn-9*J8Cnrd}3!$n?enmw+ zAK!DgwrA;pN3hMja{DcMF*qpdIsXc!maPnoksi$6*Uu$#;9d>2Vc$3RZ4l!-m~gE8 zYTDrP=V*<8c0S{fX>(9c7swY8laRRGUXJug@_<#lP^nqp+u$AUL+K;dHBCJRPlsUY8DQv}C7U1iQJAuylb^x$?%qp-6&2_$s;hu+=agmR7bVl$L0q(IpuQ=@x)+zDjNoOUz4O%LvhJu`>SceOrJxE=s2qxv}whtE@Tz8_v!uF=P?n zysXJNdRHoWp89wC%>bcvU0Z9bY_Z-rJA~}^5q>iQfPsy}8XK-1RMf=~ue`he6=^FN5u01>xT^<-TYAg~>pHv*96HwmYqgGc-F} zTvp+dTePWx4X=28a)m;0UOtf`zy$=DREgP<4^vfjb!MdnR{e&$x;Hh}SwM7_^m9|T zShXOE#%g=3O(Ym0Bxs9mYa3fPC;gs+5jPi!%=3MosPuEgBPf_j^Lnva|LSt>M*A;E z!RVcV((#NXN;0s0V4yT{fc)VCj#z@f8C_iTK3r_k*H=GmziE?MmI!H$*6QQuD#piK z?V`(7QyoxN5|#F}`Mc6Jpg7Nk>4gfdqNbTYTr8&&?BV0)RxY0K5N%W`=yCtjjbi(l zj8Abq<786GR%e9X`xFOf*LyeNJ;NarS+i#9vi;BMGr*Gq`M=B;o{nohv*JF3z3zgh zxuVZHi$o6!HGyQ>w=A=}gO=MCUq?6EE`e-=2P78Z`(7@7&9X{Ye8Po-3&sRXr{}5# zI+m0^o5K~dfwN1&DHlC7Z{RokOFl#6Sn!b3F+8$DMU2z4YO9*5;2S?g*|8M6y4 z!2`+kyZ|(v*%|1LWYHw4NaL?t8bu@9+@ zezV-t_9`F{X4}77fSTgJ?Kl>0c62VC?t5EfNr0nk6Ca+Mg4c)2F?IM>KJMyttduOs zy7m#I4%~Cfr)$k0e9|Go< zmQ5jdgJI5pHuT}w+xl%3=%7%Amwg*_j?*EFH{fucR4RY?-PyN@@JpxjtS4NQQQMIP z7Zz_}P&rh1n4wOQUV6E)=IUK51#k!CVWlpYpRq2HV1JMMha-xM`8`BMn-ZxL)(i~b zG0KMaE20OxyR=UPt<4?#`=yhTBu5=(l$G|y#EhC6vm3pQV32HMMz`4p{`6Lx>d>Sl z#KBbLqfA;NA`m04#YmYc zEa;JZhk&4=QjOnHeyL$M;CCt}NhSX=tVigUwMYG*Fl>gX?Ib=izBPO!nHNY7q^RPf zs%lo{6*PkWq>Tb9lJ*R`uE0NrX<>2tRs5o~G$R0yhqF(;e9D}%-f^0dCHGB;|5{J{ zv*RBUeACR&JXTQ%B~6>KL{G%U;nGsIWwgS$VuMXlU4!xZX3OOjGQf|skF4P1*}UuR zQ%kY%a3k!H^K)mBf{z>P6Wcp;+gmg7YZ$>PTmPEfIGqAzc%tyszhZ^!Q+rN02Mvw2 zk`hbG&Ggt97)%X+FaRnknCnhcMXO`F#t6zdK7RQ^3j&dXol_^sfFp>V%%E56cVtm$ zN@<#H-Tpsw`{<}!8B!^z8L|EJ=@S+@+WTHWujYh6@&~LVa|F1` zHnZSTOiZ$TDQ{YQ_Iu)Knok)*E}29`E)Eu2EUNvM+Jl3o0{?>zHk&9=62Qm+&=4gt zZ%c2Q`@d-xa&aLSP-U8{sstDrvo-N`ia)m+aFR*TyJ~6n#h_$snapLKoAjmrua zwFo1CsAB)w*f>+`9~d|}I%28>as}=8*Sk26>1oBh>;R(MEJ03A-i)uQsi`6nxJ9MZAUtZi=UUrYY_wasULE}ll@qwjx9Z%DFCt*x%I{!4Gf#Ks!82Q~50#p@EV z6cL`zSHU8HJYl`_JYW?Z5T&@!UdR1eB~Y^R(U;=CG8+J+6L$ICSXU>spbIcRfUD~k z>!~I~W}7@Y3h0?RQGGHUg0{mzr3vK)gyjQFu#0opwlM-*iRAy*`TT!%9pTCt`L-jO zhz*>{iHQlnz{fRAjOfe?cmoRyUx#cSS9S-GkdUag2)xU76?gejgnkBWh5u7E^sl#- b2Q)(V-OG1eFI#~!Cy??h4fzT=^YH%xU~Osf literal 9884 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

5cX5 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 z832$x - + USB Host Shield 2.0: BTD.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0

- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -85,396 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTD.h
-Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
-
2 
-
3  This software may be distributed and modified under the terms of the GNU
-
4  General Public License version 2 (GPL2) as published by the Free Software
-
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
-
6  this file. Please note that GPL2 Section 2[b] requires that all works based
-
7  on this software must also be made publicly available under the terms of
-
8  the GPL2 ("Copyleft").
-
9 
-
10  Contact information
-
11  -------------------
-
12 
-
13  Kristian Lauszus, TKJ Electronics
-
14  Web : http://www.tkjelectronics.com
-
15  e-mail : kristianl@tkjelectronics.com
-
16  */
-
17 
-
18 #ifndef _btd_h_
-
19 #define _btd_h_
-
20 
-
21 #include "Usb.h"
-
22 #include "usbhid.h"
-
23 
-
24 //PID and VID of the Sony PS3 devices
-
25 #define PS3_VID 0x054C // Sony Corporation
-
26 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
-
27 #define PS3NAVIGATION_PID 0x042F // Navigation controller
-
28 #define PS3MOVE_PID 0x03D5 // Motion controller
-
29 
-
30 // These dongles do not present themselves correctly, so we have to check for them manually
-
31 #define IOGEAR_GBU521_VID 0x0A5C
-
32 #define IOGEAR_GBU521_PID 0x21E8
-
33 #define BELKIN_F8T065BF_VID 0x050D
-
34 #define BELKIN_F8T065BF_PID 0x065A
-
35 
-
36 /* Bluetooth dongle data taken from descriptors */
-
37 #define BULK_MAXPKTSIZE 64 // Max size for ACL data
-
38 
-
39 // Used in control endpoint header for HCI Commands
-
40 #define bmREQ_HCI_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
-
41 
-
42 /* Bluetooth HCI states for hci_task() */
-
43 #define HCI_INIT_STATE 0
-
44 #define HCI_RESET_STATE 1
-
45 #define HCI_CLASS_STATE 2
-
46 #define HCI_BDADDR_STATE 3
-
47 #define HCI_LOCAL_VERSION_STATE 4
-
48 #define HCI_SET_NAME_STATE 5
-
49 #define HCI_CHECK_DEVICE_SERVICE 6
-
50 
-
51 #define HCI_INQUIRY_STATE 7 // These three states are only used if it should pair and connect to a device
-
52 #define HCI_CONNECT_DEVICE_STATE 8
-
53 #define HCI_CONNECTED_DEVICE_STATE 9
-
54 
-
55 #define HCI_SCANNING_STATE 10
-
56 #define HCI_CONNECT_IN_STATE 11
-
57 #define HCI_REMOTE_NAME_STATE 12
-
58 #define HCI_CONNECTED_STATE 13
-
59 #define HCI_DISABLE_SCAN_STATE 14
-
60 #define HCI_DONE_STATE 15
-
61 #define HCI_DISCONNECT_STATE 16
-
62 
-
63 /* HCI event flags*/
-
64 #define HCI_FLAG_CMD_COMPLETE (1UL << 0)
-
65 #define HCI_FLAG_CONNECT_COMPLETE (1UL << 1)
-
66 #define HCI_FLAG_DISCONNECT_COMPLETE (1UL << 2)
-
67 #define HCI_FLAG_REMOTE_NAME_COMPLETE (1UL << 3)
-
68 #define HCI_FLAG_INCOMING_REQUEST (1UL << 4)
-
69 #define HCI_FLAG_READ_BDADDR (1UL << 5)
-
70 #define HCI_FLAG_READ_VERSION (1UL << 6)
-
71 #define HCI_FLAG_DEVICE_FOUND (1UL << 7)
-
72 #define HCI_FLAG_CONNECT_EVENT (1UL << 8)
-
73 
-
74 /* Macros for HCI event flag tests */
-
75 #define hci_check_flag(flag) (hci_event_flag & (flag))
-
76 #define hci_set_flag(flag) (hci_event_flag |= (flag))
-
77 #define hci_clear_flag(flag) (hci_event_flag &= ~(flag))
-
78 
-
79 /* HCI Events managed */
-
80 #define EV_INQUIRY_COMPLETE 0x01
-
81 #define EV_INQUIRY_RESULT 0x02
-
82 #define EV_CONNECT_COMPLETE 0x03
-
83 #define EV_INCOMING_CONNECT 0x04
-
84 #define EV_DISCONNECT_COMPLETE 0x05
-
85 #define EV_AUTHENTICATION_COMPLETE 0x06
-
86 #define EV_REMOTE_NAME_COMPLETE 0x07
-
87 #define EV_ENCRYPTION_CHANGE 0x08
-
88 #define EV_CHANGE_CONNECTION_LINK 0x09
-
89 #define EV_ROLE_CHANGED 0x12
-
90 #define EV_NUM_COMPLETE_PKT 0x13
-
91 #define EV_PIN_CODE_REQUEST 0x16
-
92 #define EV_LINK_KEY_REQUEST 0x17
-
93 #define EV_LINK_KEY_NOTIFICATION 0x18
-
94 #define EV_DATA_BUFFER_OVERFLOW 0x1A
-
95 #define EV_MAX_SLOTS_CHANGE 0x1B
-
96 #define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C
-
97 #define EV_QOS_SETUP_COMPLETE 0x0D
-
98 #define EV_COMMAND_COMPLETE 0x0E
-
99 #define EV_COMMAND_STATUS 0x0F
-
100 #define EV_LOOPBACK_COMMAND 0x19
-
101 #define EV_PAGE_SCAN_REP_MODE 0x20
-
102 
-
103 /* Bluetooth states for the different Bluetooth drivers */
-
104 #define L2CAP_WAIT 0
-
105 #define L2CAP_DONE 1
-
106 
-
107 /* Used for HID Control channel */
-
108 #define L2CAP_CONTROL_CONNECT_REQUEST 2
-
109 #define L2CAP_CONTROL_CONFIG_REQUEST 3
-
110 #define L2CAP_CONTROL_SUCCESS 4
-
111 #define L2CAP_CONTROL_DISCONNECT 5
-
112 
-
113 /* Used for HID Interrupt channel */
-
114 #define L2CAP_INTERRUPT_SETUP 6
-
115 #define L2CAP_INTERRUPT_CONNECT_REQUEST 7
-
116 #define L2CAP_INTERRUPT_CONFIG_REQUEST 8
-
117 #define L2CAP_INTERRUPT_DISCONNECT 9
-
118 
-
119 /* Used for SDP channel */
-
120 #define L2CAP_SDP_WAIT 10
-
121 #define L2CAP_SDP_SUCCESS 11
-
122 
-
123 /* Used for RFCOMM channel */
-
124 #define L2CAP_RFCOMM_WAIT 12
-
125 #define L2CAP_RFCOMM_SUCCESS 13
-
126 
-
127 #define L2CAP_DISCONNECT_RESPONSE 14 // Used for both SDP and RFCOMM channel
-
128 
-
129 /* Bluetooth states used by some drivers */
-
130 #define TURN_ON_LED 17
-
131 #define PS3_ENABLE_SIXAXIS 18
-
132 #define WII_CHECK_MOTION_PLUS_STATE 19
-
133 #define WII_CHECK_EXTENSION_STATE 20
-
134 #define WII_INIT_MOTION_PLUS_STATE 21
-
135 
-
136 /* L2CAP event flags for HID Control channel */
-
137 #define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST (1UL << 0)
-
138 #define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS (1UL << 1)
-
139 #define L2CAP_FLAG_CONTROL_CONNECTED (1UL << 2)
-
140 #define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE (1UL << 3)
-
141 
-
142 /* L2CAP event flags for HID Interrupt channel */
-
143 #define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST (1UL << 4)
-
144 #define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS (1UL << 5)
-
145 #define L2CAP_FLAG_INTERRUPT_CONNECTED (1UL << 6)
-
146 #define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE (1UL << 7)
-
147 
-
148 /* L2CAP event flags for SDP channel */
-
149 #define L2CAP_FLAG_CONNECTION_SDP_REQUEST (1UL << 8)
-
150 #define L2CAP_FLAG_CONFIG_SDP_SUCCESS (1UL << 9)
-
151 #define L2CAP_FLAG_DISCONNECT_SDP_REQUEST (1UL << 10)
-
152 
-
153 /* L2CAP event flags for RFCOMM channel */
-
154 #define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST (1UL << 11)
-
155 #define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS (1UL << 12)
-
156 #define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST (1UL << 13)
-
157 
-
158 #define L2CAP_FLAG_DISCONNECT_RESPONSE (1UL << 14)
-
159 
-
160 /* Macros for L2CAP event flag tests */
-
161 #define l2cap_check_flag(flag) (l2cap_event_flag & (flag))
-
162 #define l2cap_set_flag(flag) (l2cap_event_flag |= (flag))
-
163 #define l2cap_clear_flag(flag) (l2cap_event_flag &= ~(flag))
-
164 
-
165 /* L2CAP signaling commands */
-
166 #define L2CAP_CMD_COMMAND_REJECT 0x01
-
167 #define L2CAP_CMD_CONNECTION_REQUEST 0x02
-
168 #define L2CAP_CMD_CONNECTION_RESPONSE 0x03
-
169 #define L2CAP_CMD_CONFIG_REQUEST 0x04
-
170 #define L2CAP_CMD_CONFIG_RESPONSE 0x05
-
171 #define L2CAP_CMD_DISCONNECT_REQUEST 0x06
-
172 #define L2CAP_CMD_DISCONNECT_RESPONSE 0x07
-
173 #define L2CAP_CMD_INFORMATION_REQUEST 0x0A
-
174 #define L2CAP_CMD_INFORMATION_RESPONSE 0x0B
-
175 
-
176 // Used For Connection Response - Remember to Include High Byte
-
177 #define PENDING 0x01
-
178 #define SUCCESSFUL 0x00
-
179 
-
180 /* Bluetooth L2CAP PSM - see http://www.bluetooth.org/Technical/AssignedNumbers/logical_link.htm */
-
181 #define SDP_PSM 0x01 // Service Discovery Protocol PSM Value
-
182 #define RFCOMM_PSM 0x03 // RFCOMM PSM Value
-
183 #define HID_CTRL_PSM 0x11 // HID_Control PSM Value
-
184 #define HID_INTR_PSM 0x13 // HID_Interrupt PSM Value
-
185 
-
186 // Used to determine if it is a Bluetooth dongle
-
187 #define WI_SUBCLASS_RF 0x01 // RF Controller
-
188 #define WI_PROTOCOL_BT 0x01 // Bluetooth Programming Interface
-
189 
-
190 #define BTD_MAX_ENDPOINTS 4
-
191 #define BTD_NUM_SERVICES 4 // Max number of Bluetooth services - if you need more than 4 simply increase this number
-
192 
-
193 #define PAIR 1
-
194 
-
195 class BluetoothService;
-
196 
-
201 class BTD : public USBDeviceConfig, public UsbConfigXtracter {
-
202 public:
-
207  BTD(USB *p);
-
208 
-
217  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
-
225  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
-
230  uint8_t Release();
-
235  uint8_t Poll();
-
236 
-
241  virtual uint8_t GetAddress() {
-
242  return bAddress;
-
243  };
-
244 
-
249  virtual bool isReady() {
-
250  return bPollEnable;
-
251  };
-
252 
-
258  virtual bool DEVCLASSOK(uint8_t klass) {
-
259  return (klass == USB_CLASS_WIRELESS_CTRL);
-
260  };
-
261 
-
269  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
-
270  if((vid == IOGEAR_GBU521_VID && pid == IOGEAR_GBU521_PID) || (vid == BELKIN_F8T065BF_VID && pid == BELKIN_F8T065BF_PID))
-
271  return true;
-
272  if(my_bdaddr[0] != 0x00 || my_bdaddr[1] != 0x00 || my_bdaddr[2] != 0x00 || my_bdaddr[3] != 0x00 || my_bdaddr[4] != 0x00 || my_bdaddr[5] != 0x00) { // Check if Bluetooth address is set
-
273  if(vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID))
-
274  return true;
-
275  }
-
276  return false;
-
277  };
-
289  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
-
293  void disconnect();
-
294 
- -
301  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
-
302  if(!btService[i]) {
-
303  btService[i] = pService;
-
304  return i; // Return ID
-
305  }
-
306  }
-
307  return -1; // Error registering BluetoothService
-
308  };
-
309 
-
316  void HCI_Command(uint8_t* data, uint16_t nbytes);
-
318  void hci_reset();
-
320  void hci_read_bdaddr();
- -
327  void hci_set_local_name(const char* name);
-
329  void hci_write_scan_enable();
-
331  void hci_write_scan_disable();
-
333  void hci_remote_name();
-
335  void hci_accept_connection();
-
340  void hci_disconnect(uint16_t handle);
- - - - -
357  void hci_inquiry();
-
359  void hci_inquiry_cancel();
-
361  void hci_connect();
-
366  void hci_connect(uint8_t *bdaddr);
- -
380  void L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow = 0x01, uint8_t channelHigh = 0x00);
-
388  void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm);
-
397  void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result);
-
404  void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid);
-
411  void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid);
-
419  void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid);
-
427  void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid);
-
434  void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh);
- - - - -
445 
-
447  const char* btdName;
-
449  const char* btdPin;
-
450 
-
452  uint8_t my_bdaddr[6];
-
454  uint16_t hci_handle;
-
456  uint8_t disc_bdaddr[6];
-
458  char remote_name[30];
-
464  uint8_t hci_version;
-
465 
- -
468  pairWithWii = true;
-
469  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
470  };
-
472  bool connectToWii;
- - - - -
481 
-
483  void pairWithHID() {
-
484  waitingForConnection = false;
-
485  pairWithHIDDevice = true;
-
486  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
487  };
-
489  bool connectToHIDDevice;
- - -
494 
-
499  uint8_t readPollInterval() {
-
500  return pollInterval;
-
501  };
-
502 
-
503 protected:
-
505  USB *pUsb;
-
507  uint8_t bAddress;
- -
510 
-
512  uint8_t bConfNum;
-
514  uint8_t bNumEP;
-
516  uint32_t qNextPollTime;
-
517 
-
519  static const uint8_t BTD_CONTROL_PIPE;
-
521  static const uint8_t BTD_EVENT_PIPE;
-
523  static const uint8_t BTD_DATAIN_PIPE;
-
525  static const uint8_t BTD_DATAOUT_PIPE;
-
526 
- -
532 
-
533 private:
-
534  void Initialize(); // Set all variables, endpoint structs etc. to default values
- -
536 
-
537  uint16_t PID, VID; // PID and VID of device connected
-
538 
-
539  uint8_t pollInterval;
-
540  bool bPollEnable;
-
541 
-
542  bool pairWiiUsingSync; // True if pairing was done using the Wii SYNC button.
-
543  bool checkRemoteName; // Used to check remote device's name before connecting.
-
544  bool incomingPS4; // True if a PS4 controller is connecting
-
545  uint8_t classOfDevice[3]; // Class of device of last device
-
546 
-
547  /* Variables used by high level HCI task */
-
548  uint8_t hci_state; // Current state of Bluetooth HCI connection
-
549  uint16_t hci_counter; // Counter used for Bluetooth HCI reset loops
-
550  uint16_t hci_num_reset_loops; // This value indicate how many times it should read before trying to reset
-
551  uint16_t hci_event_flag; // HCI flags of received Bluetooth events
-
552  uint8_t inquiry_counter;
-
553 
-
554  uint8_t hcibuf[BULK_MAXPKTSIZE]; // General purpose buffer for HCI data
-
555  uint8_t l2capinbuf[BULK_MAXPKTSIZE]; // General purpose buffer for L2CAP in data
-
556  uint8_t l2capoutbuf[14]; // General purpose buffer for L2CAP out data
-
557 
-
558  /* State machines */
-
559  void HCI_event_task(); // Poll the HCI event pipe
-
560  void HCI_task(); // HCI state machine
-
561  void ACL_event_task(); // ACL input pipe
-
562 
-
563  /* Used to set the Bluetooth Address internally to the PS3 Controllers */
-
564  void setBdaddr(uint8_t* BDADDR);
-
565  void setMoveBdaddr(uint8_t* BDADDR);
-
566 };
-
567 
- -
570 public:
- -
572  if(pBtd)
-
573  pBtd->registerBluetoothService(this); // Register it as a Bluetooth service
-
574  };
-
579  virtual void ACLData(uint8_t* ACLData) = 0;
-
581  virtual void Run() = 0;
-
583  virtual void Reset() = 0;
-
585  virtual void disconnect() = 0;
-
586 
-
591  void attachOnInit(void (*funcOnInit)(void)) {
-
592  pFuncOnInit = funcOnInit; // TODO: This really belong in a class of it's own as it is repeated several times
-
593  };
-
594 
-
595 protected:
-
601  virtual void onInit() = 0;
-
602 
-
604  bool checkHciHandle(uint8_t *buf, uint16_t handle) {
-
605  return (buf[0] == (handle & 0xFF)) && (buf[1] == ((handle >> 8) | 0x20));
-
606  }
-
607 
-
609  void (*pFuncOnInit)(void);
-
610 
- -
613 
-
615  uint16_t hci_handle;
-
616 
- -
619 
-
621  uint8_t identifier;
-
622 };
-
623 
-
624 #endif
-
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:525
-
void(* pFuncOnInit)(void)
Definition: BTD.h:609
+Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16  */
17 
18 #ifndef _btd_h_
19 #define _btd_h_
20 
21 #include "Usb.h"
22 #include "usbhid.h"
23 
24 //PID and VID of the Sony PS3 devices
25 #define PS3_VID 0x054C // Sony Corporation
26 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
27 #define PS3NAVIGATION_PID 0x042F // Navigation controller
28 #define PS3MOVE_PID 0x03D5 // Motion controller
29 
30 // These dongles do not present themselves correctly, so we have to check for them manually
31 #define IOGEAR_GBU521_VID 0x0A5C
32 #define IOGEAR_GBU521_PID 0x21E8
33 #define BELKIN_F8T065BF_VID 0x050D
34 #define BELKIN_F8T065BF_PID 0x065A
35 
36 /* Bluetooth dongle data taken from descriptors */
37 #define BULK_MAXPKTSIZE 64 // Max size for ACL data
38 
39 // Used in control endpoint header for HCI Commands
40 #define bmREQ_HCI_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
41 
42 /* Bluetooth HCI states for hci_task() */
43 #define HCI_INIT_STATE 0
44 #define HCI_RESET_STATE 1
45 #define HCI_CLASS_STATE 2
46 #define HCI_BDADDR_STATE 3
47 #define HCI_LOCAL_VERSION_STATE 4
48 #define HCI_SET_NAME_STATE 5
49 #define HCI_CHECK_DEVICE_SERVICE 6
50 
51 #define HCI_INQUIRY_STATE 7 // These three states are only used if it should pair and connect to a device
52 #define HCI_CONNECT_DEVICE_STATE 8
53 #define HCI_CONNECTED_DEVICE_STATE 9
54 
55 #define HCI_SCANNING_STATE 10
56 #define HCI_CONNECT_IN_STATE 11
57 #define HCI_REMOTE_NAME_STATE 12
58 #define HCI_CONNECTED_STATE 13
59 #define HCI_DISABLE_SCAN_STATE 14
60 #define HCI_DONE_STATE 15
61 #define HCI_DISCONNECT_STATE 16
62 
63 /* HCI event flags*/
64 #define HCI_FLAG_CMD_COMPLETE (1UL << 0)
65 #define HCI_FLAG_CONNECT_COMPLETE (1UL << 1)
66 #define HCI_FLAG_DISCONNECT_COMPLETE (1UL << 2)
67 #define HCI_FLAG_REMOTE_NAME_COMPLETE (1UL << 3)
68 #define HCI_FLAG_INCOMING_REQUEST (1UL << 4)
69 #define HCI_FLAG_READ_BDADDR (1UL << 5)
70 #define HCI_FLAG_READ_VERSION (1UL << 6)
71 #define HCI_FLAG_DEVICE_FOUND (1UL << 7)
72 #define HCI_FLAG_CONNECT_EVENT (1UL << 8)
73 
74 /* Macros for HCI event flag tests */
75 #define hci_check_flag(flag) (hci_event_flag & (flag))
76 #define hci_set_flag(flag) (hci_event_flag |= (flag))
77 #define hci_clear_flag(flag) (hci_event_flag &= ~(flag))
78 
79 /* HCI Events managed */
80 #define EV_INQUIRY_COMPLETE 0x01
81 #define EV_INQUIRY_RESULT 0x02
82 #define EV_CONNECT_COMPLETE 0x03
83 #define EV_INCOMING_CONNECT 0x04
84 #define EV_DISCONNECT_COMPLETE 0x05
85 #define EV_AUTHENTICATION_COMPLETE 0x06
86 #define EV_REMOTE_NAME_COMPLETE 0x07
87 #define EV_ENCRYPTION_CHANGE 0x08
88 #define EV_CHANGE_CONNECTION_LINK 0x09
89 #define EV_ROLE_CHANGED 0x12
90 #define EV_NUM_COMPLETE_PKT 0x13
91 #define EV_PIN_CODE_REQUEST 0x16
92 #define EV_LINK_KEY_REQUEST 0x17
93 #define EV_LINK_KEY_NOTIFICATION 0x18
94 #define EV_DATA_BUFFER_OVERFLOW 0x1A
95 #define EV_MAX_SLOTS_CHANGE 0x1B
96 #define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C
97 #define EV_QOS_SETUP_COMPLETE 0x0D
98 #define EV_COMMAND_COMPLETE 0x0E
99 #define EV_COMMAND_STATUS 0x0F
100 #define EV_LOOPBACK_COMMAND 0x19
101 #define EV_PAGE_SCAN_REP_MODE 0x20
102 
103 /* Bluetooth states for the different Bluetooth drivers */
104 #define L2CAP_WAIT 0
105 #define L2CAP_DONE 1
106 
107 /* Used for HID Control channel */
108 #define L2CAP_CONTROL_CONNECT_REQUEST 2
109 #define L2CAP_CONTROL_CONFIG_REQUEST 3
110 #define L2CAP_CONTROL_SUCCESS 4
111 #define L2CAP_CONTROL_DISCONNECT 5
112 
113 /* Used for HID Interrupt channel */
114 #define L2CAP_INTERRUPT_SETUP 6
115 #define L2CAP_INTERRUPT_CONNECT_REQUEST 7
116 #define L2CAP_INTERRUPT_CONFIG_REQUEST 8
117 #define L2CAP_INTERRUPT_DISCONNECT 9
118 
119 /* Used for SDP channel */
120 #define L2CAP_SDP_WAIT 10
121 #define L2CAP_SDP_SUCCESS 11
122 
123 /* Used for RFCOMM channel */
124 #define L2CAP_RFCOMM_WAIT 12
125 #define L2CAP_RFCOMM_SUCCESS 13
126 
127 #define L2CAP_DISCONNECT_RESPONSE 14 // Used for both SDP and RFCOMM channel
128 
129 /* Bluetooth states used by some drivers */
130 #define TURN_ON_LED 17
131 #define PS3_ENABLE_SIXAXIS 18
132 #define WII_CHECK_MOTION_PLUS_STATE 19
133 #define WII_CHECK_EXTENSION_STATE 20
134 #define WII_INIT_MOTION_PLUS_STATE 21
135 
136 /* L2CAP event flags for HID Control channel */
137 #define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST (1UL << 0)
138 #define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS (1UL << 1)
139 #define L2CAP_FLAG_CONTROL_CONNECTED (1UL << 2)
140 #define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE (1UL << 3)
141 
142 /* L2CAP event flags for HID Interrupt channel */
143 #define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST (1UL << 4)
144 #define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS (1UL << 5)
145 #define L2CAP_FLAG_INTERRUPT_CONNECTED (1UL << 6)
146 #define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE (1UL << 7)
147 
148 /* L2CAP event flags for SDP channel */
149 #define L2CAP_FLAG_CONNECTION_SDP_REQUEST (1UL << 8)
150 #define L2CAP_FLAG_CONFIG_SDP_SUCCESS (1UL << 9)
151 #define L2CAP_FLAG_DISCONNECT_SDP_REQUEST (1UL << 10)
152 
153 /* L2CAP event flags for RFCOMM channel */
154 #define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST (1UL << 11)
155 #define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS (1UL << 12)
156 #define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST (1UL << 13)
157 
158 #define L2CAP_FLAG_DISCONNECT_RESPONSE (1UL << 14)
159 
160 /* Macros for L2CAP event flag tests */
161 #define l2cap_check_flag(flag) (l2cap_event_flag & (flag))
162 #define l2cap_set_flag(flag) (l2cap_event_flag |= (flag))
163 #define l2cap_clear_flag(flag) (l2cap_event_flag &= ~(flag))
164 
165 /* L2CAP signaling commands */
166 #define L2CAP_CMD_COMMAND_REJECT 0x01
167 #define L2CAP_CMD_CONNECTION_REQUEST 0x02
168 #define L2CAP_CMD_CONNECTION_RESPONSE 0x03
169 #define L2CAP_CMD_CONFIG_REQUEST 0x04
170 #define L2CAP_CMD_CONFIG_RESPONSE 0x05
171 #define L2CAP_CMD_DISCONNECT_REQUEST 0x06
172 #define L2CAP_CMD_DISCONNECT_RESPONSE 0x07
173 #define L2CAP_CMD_INFORMATION_REQUEST 0x0A
174 #define L2CAP_CMD_INFORMATION_RESPONSE 0x0B
175 
176 // Used For Connection Response - Remember to Include High Byte
177 #define PENDING 0x01
178 #define SUCCESSFUL 0x00
179 
180 /* Bluetooth L2CAP PSM - see http://www.bluetooth.org/Technical/AssignedNumbers/logical_link.htm */
181 #define SDP_PSM 0x01 // Service Discovery Protocol PSM Value
182 #define RFCOMM_PSM 0x03 // RFCOMM PSM Value
183 #define HID_CTRL_PSM 0x11 // HID_Control PSM Value
184 #define HID_INTR_PSM 0x13 // HID_Interrupt PSM Value
185 
186 // Used to determine if it is a Bluetooth dongle
187 #define WI_SUBCLASS_RF 0x01 // RF Controller
188 #define WI_PROTOCOL_BT 0x01 // Bluetooth Programming Interface
189 
190 #define BTD_MAX_ENDPOINTS 4
191 #define BTD_NUM_SERVICES 4 // Max number of Bluetooth services - if you need more than 4 simply increase this number
192 
193 #define PAIR 1
194 
195 class BluetoothService;
196 
201 class BTD : public USBDeviceConfig, public UsbConfigXtracter {
202 public:
207  BTD(USB *p);
208 
217  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
225  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
230  uint8_t Release();
235  uint8_t Poll();
236 
241  virtual uint8_t GetAddress() {
242  return bAddress;
243  };
244 
249  virtual bool isReady() {
250  return bPollEnable;
251  };
252 
258  virtual bool DEVCLASSOK(uint8_t klass) {
259  return (klass == USB_CLASS_WIRELESS_CTRL);
260  };
261 
269  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
270  if((vid == IOGEAR_GBU521_VID && pid == IOGEAR_GBU521_PID) || (vid == BELKIN_F8T065BF_VID && pid == BELKIN_F8T065BF_PID))
271  return true;
272  if(my_bdaddr[0] != 0x00 || my_bdaddr[1] != 0x00 || my_bdaddr[2] != 0x00 || my_bdaddr[3] != 0x00 || my_bdaddr[4] != 0x00 || my_bdaddr[5] != 0x00) { // Check if Bluetooth address is set
273  if(vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID))
274  return true;
275  }
276  return false;
277  };
289  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
293  void disconnect();
294 
301  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
302  if(!btService[i]) {
303  btService[i] = pService;
304  return i; // Return ID
305  }
306  }
307  return -1; // Error registering BluetoothService
308  };
309 
316  void HCI_Command(uint8_t* data, uint16_t nbytes);
318  void hci_reset();
320  void hci_read_bdaddr();
327  void hci_set_local_name(const char* name);
329  void hci_write_scan_enable();
331  void hci_write_scan_disable();
333  void hci_remote_name();
335  void hci_accept_connection();
340  void hci_disconnect(uint16_t handle);
357  void hci_inquiry();
359  void hci_inquiry_cancel();
361  void hci_connect();
366  void hci_connect(uint8_t *bdaddr);
380  void L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow = 0x01, uint8_t channelHigh = 0x00);
388  void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm);
397  void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result);
404  void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid);
411  void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid);
419  void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid);
427  void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid);
434  void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh);
445 
447  const char* btdName;
449  const char* btdPin;
450 
452  uint8_t my_bdaddr[6];
454  uint16_t hci_handle;
456  uint8_t disc_bdaddr[6];
458  char remote_name[30];
464  uint8_t hci_version;
465 
468  pairWithWii = true;
469  hci_state = HCI_CHECK_DEVICE_SERVICE;
470  };
472  bool connectToWii;
481 
483  void pairWithHID() {
484  waitingForConnection = false;
485  pairWithHIDDevice = true;
486  hci_state = HCI_CHECK_DEVICE_SERVICE;
487  };
489  bool connectToHIDDevice;
494 
499  uint8_t readPollInterval() {
500  return pollInterval;
501  };
502 
503 protected:
505  USB *pUsb;
507  uint8_t bAddress;
510 
512  uint8_t bConfNum;
514  uint8_t bNumEP;
516  uint32_t qNextPollTime;
517 
519  static const uint8_t BTD_CONTROL_PIPE;
521  static const uint8_t BTD_EVENT_PIPE;
523  static const uint8_t BTD_DATAIN_PIPE;
525  static const uint8_t BTD_DATAOUT_PIPE;
526 
532 
533 private:
534  void Initialize(); // Set all variables, endpoint structs etc. to default values
536 
537  uint16_t PID, VID; // PID and VID of device connected
538 
539  uint8_t pollInterval;
540  bool bPollEnable;
541 
542  bool pairWiiUsingSync; // True if pairing was done using the Wii SYNC button.
543  bool checkRemoteName; // Used to check remote device's name before connecting.
544  bool incomingPS4; // True if a PS4 controller is connecting
545  uint8_t classOfDevice[3]; // Class of device of last device
546 
547  /* Variables used by high level HCI task */
548  uint8_t hci_state; // Current state of Bluetooth HCI connection
549  uint16_t hci_counter; // Counter used for Bluetooth HCI reset loops
550  uint16_t hci_num_reset_loops; // This value indicate how many times it should read before trying to reset
551  uint16_t hci_event_flag; // HCI flags of received Bluetooth events
552  uint8_t inquiry_counter;
553 
554  uint8_t hcibuf[BULK_MAXPKTSIZE]; // General purpose buffer for HCI data
555  uint8_t l2capinbuf[BULK_MAXPKTSIZE]; // General purpose buffer for L2CAP in data
556  uint8_t l2capoutbuf[14]; // General purpose buffer for L2CAP out data
557 
558  /* State machines */
559  void HCI_event_task(); // Poll the HCI event pipe
560  void HCI_task(); // HCI state machine
561  void ACL_event_task(); // ACL input pipe
562 
563  /* Used to set the Bluetooth Address internally to the PS3 Controllers */
564  void setBdaddr(uint8_t* BDADDR);
565  void setMoveBdaddr(uint8_t* BDADDR);
566 };
567 
570 public:
571  BluetoothService(BTD *p) : pBtd(p) {
572  if(pBtd)
573  pBtd->registerBluetoothService(this); // Register it as a Bluetooth service
574  };
579  virtual void ACLData(uint8_t* ACLData) = 0;
581  virtual void Run() = 0;
583  virtual void Reset() = 0;
585  virtual void disconnect() = 0;
586 
591  void attachOnInit(void (*funcOnInit)(void)) {
592  pFuncOnInit = funcOnInit; // TODO: This really belong in a class of it's own as it is repeated several times
593  };
594 
595 protected:
601  virtual void onInit() = 0;
602 
604  bool checkHciHandle(uint8_t *buf, uint16_t handle) {
605  return (buf[0] == (handle & 0xFF)) && (buf[1] == ((handle >> 8) | 0x20));
606  }
607 
609  void (*pFuncOnInit)(void);
610 
613 
615  uint16_t hci_handle;
616 
619 
621  uint8_t identifier;
622 };
623 
624 #endif
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:525
bool incomingWii
Definition: BTD.h:474
void hci_connect()
Definition: BTD.cpp:1071
uint8_t bNumEP
Definition: BTD.h:514
@@ -511,7 +123,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTD(USB *p)
Definition: BTD.cpp:27
char remote_name[30]
Definition: BTD.h:458
uint8_t readPollInterval()
Definition: BTD.h:499
-
virtual void Reset()=0
static const uint8_t BTD_DATAIN_PIPE
Definition: BTD.h:523
void hci_set_local_name(const char *name)
Definition: BTD.cpp:1037
void hci_write_scan_enable()
Definition: BTD.cpp:962
@@ -527,7 +138,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#define IOGEAR_GBU521_PID
Definition: BTD.h:32
bool connectToWii
Definition: BTD.h:470
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:48
-
virtual void disconnect()=0
bool wiiUProController
Definition: BTD.h:480
uint16_t hci_handle
Definition: BTD.h:454
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:134
@@ -537,7 +147,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
void hci_read_bdaddr()
Definition: BTD.cpp:984
void hci_inquiry_cancel()
Definition: BTD.cpp:1063
-
virtual void Run()=0
uint8_t my_bdaddr[6]
Definition: BTD.h:452
void attachOnInit(void(*funcOnInit)(void))
Definition: BTD.h:591
uint8_t Poll()
Definition: BTD.cpp:382
@@ -559,7 +168,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
void hci_write_class_of_device()
Definition: BTD.cpp:1183
uint16_t hci_handle
Definition: BTD.h:615
void hci_pin_code_negative_request_reply()
Definition: BTD.cpp:1133
-
virtual void ACLData(uint8_t *ACLData)=0
virtual bool DEVCLASSOK(uint8_t klass)
Definition: BTD.h:258
uint32_t l2cap_event_flag
Definition: BTD.h:618
#define HCI_CHECK_DEVICE_SERVICE
Definition: BTD.h:49
@@ -577,14 +185,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
void hci_read_local_version_information()
Definition: BTD.cpp:993
void hci_accept_connection()
Definition: BTD.cpp:1002
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:604
-
virtual void onInit()=0
void HCI_Command(uint8_t *data, uint16_t nbytes)
Definition: BTD.cpp:948
diff --git a/_b_t_h_i_d_8cpp.html b/_b_t_h_i_d_8cpp.html index 03981507..7f3b1c76 100644 --- a/_b_t_h_i_d_8cpp.html +++ b/_b_t_h_i_d_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTHID.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -85,13 +86,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTHID.cpp File Reference
-
#include "BTHID.h"
+
#include "BTHID.h"
Include dependency graph for BTHID.cpp:
- + + + + + + +

Go to the source code of this file.

@@ -100,7 +107,7 @@ Include dependency graph for BTHID.cpp:
diff --git a/_b_t_h_i_d_8cpp__incl.map b/_b_t_h_i_d_8cpp__incl.map index abe5c26b..f4a1def3 100644 --- a/_b_t_h_i_d_8cpp__incl.map +++ b/_b_t_h_i_d_8cpp__incl.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/_b_t_h_i_d_8cpp__incl.md5 b/_b_t_h_i_d_8cpp__incl.md5 index d91744b5..457a9283 100644 --- a/_b_t_h_i_d_8cpp__incl.md5 +++ b/_b_t_h_i_d_8cpp__incl.md5 @@ -1 +1 @@ -ffc3552818b1f5c07d20197253d93a66 \ No newline at end of file +2fddcbac34cc48df9a24e3c113c74570 \ No newline at end of file diff --git a/_b_t_h_i_d_8cpp__incl.png b/_b_t_h_i_d_8cpp__incl.png index fb10c3dc7c9d46e709ec861925cd4491e472219e..03e6136e0c46c9104314b2450e78ec006d4b9a3c 100644 GIT binary patch literal 15498 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 diff --git a/_b_t_h_i_d_8cpp_source.html b/_b_t_h_i_d_8cpp_source.html index 3b5afec4..ee4cb1b6 100644 --- a/_b_t_h_i_d_8cpp_source.html +++ b/_b_t_h_i_d_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTHID.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -85,406 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTHID.cpp
-Go to the documentation of this file.
1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
-
2 
-
3  This software may be distributed and modified under the terms of the GNU
-
4  General Public License version 2 (GPL2) as published by the Free Software
-
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
-
6  this file. Please note that GPL2 Section 2[b] requires that all works based
-
7  on this software must also be made publicly available under the terms of
-
8  the GPL2 ("Copyleft").
-
9 
-
10  Contact information
-
11  -------------------
-
12 
-
13  Kristian Lauszus, TKJ Electronics
-
14  Web : http://www.tkjelectronics.com
-
15  e-mail : kristianl@tkjelectronics.com
-
16  */
-
17 
-
18 #include "BTHID.h"
-
19 // To enable serial debugging see "settings.h"
-
20 //#define EXTRADEBUG // Uncomment to get even more debugging data
-
21 //#define PRINTREPORT // Uncomment to print the report send by the HID device
-
22 
-
23 BTHID::BTHID(BTD *p, bool pair, const char *pin) :
-
24 BluetoothService(p), // Pointer to USB class instance - mandatory
-
25 protocolMode(USB_HID_BOOT_PROTOCOL) {
-
26  for(uint8_t i = 0; i < NUM_PARSERS; i++)
-
27  pRptParser[i] = NULL;
-
28 
- -
30  pBtd->btdPin = pin;
-
31 
-
32  /* Set device cid for the control and intterrupt channelse - LSB */
-
33  control_dcid[0] = 0x70; // 0x0070
-
34  control_dcid[1] = 0x00;
-
35  interrupt_dcid[0] = 0x71; // 0x0071
-
36  interrupt_dcid[1] = 0x00;
-
37 
-
38  Reset();
-
39 }
-
40 
-
41 void BTHID::Reset() {
-
42  connected = false;
-
43  activeConnection = false;
-
44  l2cap_event_flag = 0; // Reset flags
-
45  l2cap_state = L2CAP_WAIT;
-
46  ResetBTHID();
-
47 }
-
48 
-
49 void BTHID::disconnect() { // Use this void to disconnect the device
-
50  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
- -
52  Reset();
-
53  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
-
54 }
-
55 
-
56 void BTHID::ACLData(uint8_t* l2capinbuf) {
-
57  if(!pBtd->l2capConnectionClaimed && pBtd->incomingHIDDevice && !connected && !activeConnection) {
-
58  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
-
59  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
-
60  pBtd->incomingHIDDevice = false;
-
61  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
-
62  activeConnection = true;
-
63  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
-
64  l2cap_state = L2CAP_WAIT;
-
65  }
-
66  }
-
67  }
-
68 
-
69  if(checkHciHandle(l2capinbuf, hci_handle)) { // acl_handle_ok
-
70  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
-
71  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
-
72 #ifdef DEBUG_USB_HOST
-
73  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
-
74  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
-
75  Notify(PSTR(" "), 0x80);
-
76  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
-
77  Notify(PSTR(" "), 0x80);
-
78  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
-
79  Notify(PSTR(" "), 0x80);
-
80  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
-
81  Notify(PSTR(" "), 0x80);
-
82  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
-
83  Notify(PSTR(" "), 0x80);
-
84  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
-
85 #endif
-
86  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_RESPONSE) {
-
87  if(((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) && ((l2capinbuf[18] | (l2capinbuf[19] << 8)) == SUCCESSFUL)) { // Success
-
88  if(l2capinbuf[14] == control_dcid[0] && l2capinbuf[15] == control_dcid[1]) {
-
89  //Notify(PSTR("\r\nHID Control Connection Complete"), 0x80);
-
90  identifier = l2capinbuf[9];
-
91  control_scid[0] = l2capinbuf[12];
-
92  control_scid[1] = l2capinbuf[13];
- -
94  } else if(l2capinbuf[14] == interrupt_dcid[0] && l2capinbuf[15] == interrupt_dcid[1]) {
-
95  //Notify(PSTR("\r\nHID Interrupt Connection Complete"), 0x80);
-
96  identifier = l2capinbuf[9];
-
97  interrupt_scid[0] = l2capinbuf[12];
-
98  interrupt_scid[1] = l2capinbuf[13];
- -
100  }
-
101  }
-
102  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
-
103 #ifdef EXTRADEBUG
-
104  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
-
105  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
-
106  Notify(PSTR(" "), 0x80);
-
107  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
-
108  Notify(PSTR(" SCID: "), 0x80);
-
109  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
-
110  Notify(PSTR(" "), 0x80);
-
111  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
-
112  Notify(PSTR(" Identifier: "), 0x80);
-
113  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
-
114 #endif
-
115  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
-
116  identifier = l2capinbuf[9];
-
117  control_scid[0] = l2capinbuf[14];
-
118  control_scid[1] = l2capinbuf[15];
- -
120  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
-
121  identifier = l2capinbuf[9];
-
122  interrupt_scid[0] = l2capinbuf[14];
-
123  interrupt_scid[1] = l2capinbuf[15];
- -
125  }
-
126  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
-
127  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
-
128  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
129  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
-
130  identifier = l2capinbuf[9];
- -
132  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
133  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
-
134  identifier = l2capinbuf[9];
- -
136  }
-
137  }
-
138  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
-
139  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
140  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
- -
142  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
143  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
- -
145  }
-
146  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
-
147  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
148 #ifdef DEBUG_USB_HOST
-
149  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
-
150 #endif
-
151  identifier = l2capinbuf[9];
- -
153  Reset();
-
154  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
155 #ifdef DEBUG_USB_HOST
-
156  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
-
157 #endif
-
158  identifier = l2capinbuf[9];
- -
160  Reset();
-
161  }
-
162  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
-
163  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
-
164  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
-
165  identifier = l2capinbuf[9];
- -
167  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
-
168  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
-
169  identifier = l2capinbuf[9];
- -
171  }
-
172  }
-
173 #ifdef EXTRADEBUG
-
174  else {
-
175  identifier = l2capinbuf[9];
-
176  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
-
177  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
-
178  }
-
179 #endif
-
180  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
-
181 #ifdef PRINTREPORT
-
182  Notify(PSTR("\r\nL2CAP Interrupt: "), 0x80);
-
183  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
-
184  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
-
185  Notify(PSTR(" "), 0x80);
-
186  }
-
187 #endif
-
188  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
-
189  uint16_t length = ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]);
-
190  ParseBTHIDData((uint8_t)(length - 1), &l2capinbuf[9]);
-
191 
-
192  switch(l2capinbuf[9]) {
-
193  case 0x01: // Keyboard or Joystick events
-
194  if(pRptParser[KEYBOARD_PARSER_ID])
-
195  pRptParser[KEYBOARD_PARSER_ID]->Parse(reinterpret_cast<USBHID *>(this), 0, (uint8_t)(length - 2), &l2capinbuf[10]); // Use reinterpret_cast again to extract the instance
-
196  break;
-
197 
-
198  case 0x02: // Mouse events
-
199  if(pRptParser[MOUSE_PARSER_ID])
-
200  pRptParser[MOUSE_PARSER_ID]->Parse(reinterpret_cast<USBHID *>(this), 0, (uint8_t)(length - 2), &l2capinbuf[10]); // Use reinterpret_cast again to extract the instance
-
201  break;
-
202 #ifdef EXTRADEBUG
-
203  default:
-
204  Notify(PSTR("\r\nUnknown Report type: "), 0x80);
-
205  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
-
206  break;
-
207 #endif
-
208  }
-
209  }
-
210  } else if(l2capinbuf[6] == control_dcid[0] && l2capinbuf[7] == control_dcid[1]) { // l2cap_control
-
211 #ifdef PRINTREPORT
-
212  Notify(PSTR("\r\nL2CAP Control: "), 0x80);
-
213  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
-
214  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
-
215  Notify(PSTR(" "), 0x80);
-
216  }
-
217 #endif
-
218  }
-
219 #ifdef EXTRADEBUG
-
220  else {
-
221  Notify(PSTR("\r\nUnsupported L2CAP Data - Channel ID: "), 0x80);
-
222  D_PrintHex<uint8_t > (l2capinbuf[7], 0x80);
-
223  Notify(PSTR(" "), 0x80);
-
224  D_PrintHex<uint8_t > (l2capinbuf[6], 0x80);
-
225 
-
226  Notify(PSTR("\r\nData: "), 0x80);
-
227  Notify(PSTR("\r\n"), 0x80);
-
228  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
-
229  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
-
230  Notify(PSTR(" "), 0x80);
-
231  }
-
232  }
-
233 #endif
-
234  L2CAP_task();
-
235  }
-
236 }
-
237 
-
238 void BTHID::L2CAP_task() {
-
239  switch(l2cap_state) {
-
240  /* These states are used if the HID device is the host */
- - -
243 #ifdef DEBUG_USB_HOST
-
244  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
-
245 #endif
-
246  setProtocol(); // Set protocol before establishing HID interrupt channel
-
247  l2cap_state = L2CAP_INTERRUPT_SETUP;
-
248  }
-
249  break;
-
250 
- - -
253 #ifdef DEBUG_USB_HOST
-
254  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
-
255 #endif
- -
257  delay(1);
- -
259  identifier++;
-
260  delay(1);
- -
262 
-
263  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
-
264  }
-
265  break;
-
266 
-
267  /* These states are used if the Arduino is the host */
- - -
270 #ifdef DEBUG_USB_HOST
-
271  Notify(PSTR("\r\nSend HID Control Config Request"), 0x80);
-
272 #endif
-
273  identifier++;
- -
275  l2cap_state = L2CAP_CONTROL_CONFIG_REQUEST;
-
276  }
-
277  break;
-
278 
- - -
281  setProtocol(); // Set protocol before establishing HID interrupt channel
-
282  delay(1); // Short delay between commands - just to be sure
-
283 #ifdef DEBUG_USB_HOST
-
284  Notify(PSTR("\r\nSend HID Interrupt Connection Request"), 0x80);
-
285 #endif
-
286  identifier++;
- -
288  l2cap_state = L2CAP_INTERRUPT_CONNECT_REQUEST;
-
289  }
-
290  break;
-
291 
- - -
294 #ifdef DEBUG_USB_HOST
-
295  Notify(PSTR("\r\nSend HID Interrupt Config Request"), 0x80);
-
296 #endif
-
297  identifier++;
- -
299  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
-
300  }
-
301  break;
-
302 
- -
304  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
-
305 #ifdef DEBUG_USB_HOST
-
306  Notify(PSTR("\r\nHID Channels Established"), 0x80);
-
307 #endif
-
308  pBtd->connectToHIDDevice = false;
-
309  pBtd->pairWithHIDDevice = false;
-
310  connected = true;
-
311  onInit();
-
312  l2cap_state = L2CAP_DONE;
-
313  }
-
314  break;
-
315 
-
316  case L2CAP_DONE:
-
317  break;
-
318 
- - -
321 #ifdef DEBUG_USB_HOST
-
322  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
-
323 #endif
-
324  identifier++;
- -
326  l2cap_state = L2CAP_CONTROL_DISCONNECT;
-
327  }
-
328  break;
-
329 
- - -
332 #ifdef DEBUG_USB_HOST
-
333  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
-
334 #endif
- -
336  hci_handle = -1; // Reset handle
-
337  l2cap_event_flag = 0; // Reset flags
-
338  l2cap_state = L2CAP_WAIT;
-
339  }
-
340  break;
-
341  }
-
342 }
-
343 
-
344 void BTHID::Run() {
-
345  switch(l2cap_state) {
-
346  case L2CAP_WAIT:
-
347  if(pBtd->connectToHIDDevice && !pBtd->l2capConnectionClaimed && !connected && !activeConnection) {
- -
349  activeConnection = true;
-
350 #ifdef DEBUG_USB_HOST
-
351  Notify(PSTR("\r\nSend HID Control Connection Request"), 0x80);
-
352 #endif
-
353  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
-
354  l2cap_event_flag = 0; // Reset flags
-
355  identifier = 0;
- -
357  l2cap_state = L2CAP_CONTROL_CONNECT_REQUEST;
- -
359 #ifdef DEBUG_USB_HOST
-
360  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
-
361 #endif
- -
363  delay(1);
- -
365  identifier++;
-
366  delay(1);
- -
368  l2cap_state = L2CAP_CONTROL_SUCCESS;
-
369  }
-
370  break;
-
371  }
-
372 }
-
373 
-
374 /************************************************************/
-
375 /* HID Commands */
-
376 
-
377 /************************************************************/
-
378 void BTHID::setProtocol() {
-
379 #ifdef DEBUG_USB_HOST
-
380  Notify(PSTR("\r\nSet protocol mode: "), 0x80);
-
381  D_PrintHex<uint8_t > (protocolMode, 0x80);
-
382 #endif
-
383  if (protocolMode != USB_HID_BOOT_PROTOCOL && protocolMode != HID_RPT_PROTOCOL) {
-
384 #ifdef DEBUG_USB_HOST
-
385  Notify(PSTR("\r\nNot a valid protocol mode. Using Boot protocol instead."), 0x80);
-
386 #endif
-
387  protocolMode = USB_HID_BOOT_PROTOCOL; // Use Boot Protocol by default
-
388  }
-
389  uint8_t command = 0x70 | protocolMode; // Set Protocol, see Bluetooth HID specs page 33
-
390  pBtd->L2CAP_Command(hci_handle, &command, 1, control_scid[0], control_scid[1]);
-
391 }
-
392 
-
393 void BTHID::setLeds(uint8_t data) {
-
394  uint8_t buf[3];
-
395  buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
-
396  buf[1] = 0x01; // Report ID
-
397  buf[2] = data;
- -
399 }
-
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
Definition: BTD.h:140
+Go to the documentation of this file.
1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16  */
17 
18 #include "BTHID.h"
19 // To enable serial debugging see "settings.h"
20 //#define EXTRADEBUG // Uncomment to get even more debugging data
21 //#define PRINTREPORT // Uncomment to print the report send by the HID device
22 
23 BTHID::BTHID(BTD *p, bool pair, const char *pin) :
24 BluetoothService(p), // Pointer to USB class instance - mandatory
25 protocolMode(USB_HID_BOOT_PROTOCOL) {
26  for(uint8_t i = 0; i < NUM_PARSERS; i++)
27  pRptParser[i] = NULL;
28 
30  pBtd->btdPin = pin;
31 
32  /* Set device cid for the control and intterrupt channelse - LSB */
33  control_dcid[0] = 0x70; // 0x0070
34  control_dcid[1] = 0x00;
35  interrupt_dcid[0] = 0x71; // 0x0071
36  interrupt_dcid[1] = 0x00;
37 
38  Reset();
39 }
40 
41 void BTHID::Reset() {
42  connected = false;
43  activeConnection = false;
44  l2cap_event_flag = 0; // Reset flags
45  l2cap_state = L2CAP_WAIT;
46  ResetBTHID();
47 }
48 
49 void BTHID::disconnect() { // Use this void to disconnect the device
50  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
52  Reset();
53  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
54 }
55 
56 void BTHID::ACLData(uint8_t* l2capinbuf) {
57  if(!pBtd->l2capConnectionClaimed && pBtd->incomingHIDDevice && !connected && !activeConnection) {
58  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
59  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
60  pBtd->incomingHIDDevice = false;
61  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
62  activeConnection = true;
63  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
64  l2cap_state = L2CAP_WAIT;
65  }
66  }
67  }
68 
69  if(checkHciHandle(l2capinbuf, hci_handle)) { // acl_handle_ok
70  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
71  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
72 #ifdef DEBUG_USB_HOST
73  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
74  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
75  Notify(PSTR(" "), 0x80);
76  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
77  Notify(PSTR(" "), 0x80);
78  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
79  Notify(PSTR(" "), 0x80);
80  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
81  Notify(PSTR(" "), 0x80);
82  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
83  Notify(PSTR(" "), 0x80);
84  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
85 #endif
86  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_RESPONSE) {
87  if(((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) && ((l2capinbuf[18] | (l2capinbuf[19] << 8)) == SUCCESSFUL)) { // Success
88  if(l2capinbuf[14] == control_dcid[0] && l2capinbuf[15] == control_dcid[1]) {
89  //Notify(PSTR("\r\nHID Control Connection Complete"), 0x80);
90  identifier = l2capinbuf[9];
91  control_scid[0] = l2capinbuf[12];
92  control_scid[1] = l2capinbuf[13];
94  } else if(l2capinbuf[14] == interrupt_dcid[0] && l2capinbuf[15] == interrupt_dcid[1]) {
95  //Notify(PSTR("\r\nHID Interrupt Connection Complete"), 0x80);
96  identifier = l2capinbuf[9];
97  interrupt_scid[0] = l2capinbuf[12];
98  interrupt_scid[1] = l2capinbuf[13];
100  }
101  }
102  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
103 #ifdef EXTRADEBUG
104  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
105  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
106  Notify(PSTR(" "), 0x80);
107  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
108  Notify(PSTR(" SCID: "), 0x80);
109  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
110  Notify(PSTR(" "), 0x80);
111  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
112  Notify(PSTR(" Identifier: "), 0x80);
113  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
114 #endif
115  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
116  identifier = l2capinbuf[9];
117  control_scid[0] = l2capinbuf[14];
118  control_scid[1] = l2capinbuf[15];
120  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
121  identifier = l2capinbuf[9];
122  interrupt_scid[0] = l2capinbuf[14];
123  interrupt_scid[1] = l2capinbuf[15];
125  }
126  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
127  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
128  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
129  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
130  identifier = l2capinbuf[9];
132  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
133  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
134  identifier = l2capinbuf[9];
136  }
137  }
138  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
139  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
140  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
142  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
143  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
145  }
146  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
147  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
148 #ifdef DEBUG_USB_HOST
149  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
150 #endif
151  identifier = l2capinbuf[9];
153  Reset();
154  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
155 #ifdef DEBUG_USB_HOST
156  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
157 #endif
158  identifier = l2capinbuf[9];
160  Reset();
161  }
162  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
163  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
164  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
165  identifier = l2capinbuf[9];
167  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
168  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
169  identifier = l2capinbuf[9];
171  }
172  }
173 #ifdef EXTRADEBUG
174  else {
175  identifier = l2capinbuf[9];
176  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
177  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
178  }
179 #endif
180  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
181 #ifdef PRINTREPORT
182  Notify(PSTR("\r\nL2CAP Interrupt: "), 0x80);
183  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
184  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
185  Notify(PSTR(" "), 0x80);
186  }
187 #endif
188  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
189  uint16_t length = ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]);
190  ParseBTHIDData((uint8_t)(length - 1), &l2capinbuf[9]);
191 
192  switch(l2capinbuf[9]) {
193  case 0x01: // Keyboard or Joystick events
194  if(pRptParser[KEYBOARD_PARSER_ID])
195  pRptParser[KEYBOARD_PARSER_ID]->Parse(reinterpret_cast<USBHID *>(this), 0, (uint8_t)(length - 2), &l2capinbuf[10]); // Use reinterpret_cast again to extract the instance
196  break;
197 
198  case 0x02: // Mouse events
199  if(pRptParser[MOUSE_PARSER_ID])
200  pRptParser[MOUSE_PARSER_ID]->Parse(reinterpret_cast<USBHID *>(this), 0, (uint8_t)(length - 2), &l2capinbuf[10]); // Use reinterpret_cast again to extract the instance
201  break;
202 #ifdef EXTRADEBUG
203  default:
204  Notify(PSTR("\r\nUnknown Report type: "), 0x80);
205  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
206  break;
207 #endif
208  }
209  }
210  } else if(l2capinbuf[6] == control_dcid[0] && l2capinbuf[7] == control_dcid[1]) { // l2cap_control
211 #ifdef PRINTREPORT
212  Notify(PSTR("\r\nL2CAP Control: "), 0x80);
213  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
214  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
215  Notify(PSTR(" "), 0x80);
216  }
217 #endif
218  }
219 #ifdef EXTRADEBUG
220  else {
221  Notify(PSTR("\r\nUnsupported L2CAP Data - Channel ID: "), 0x80);
222  D_PrintHex<uint8_t > (l2capinbuf[7], 0x80);
223  Notify(PSTR(" "), 0x80);
224  D_PrintHex<uint8_t > (l2capinbuf[6], 0x80);
225 
226  Notify(PSTR("\r\nData: "), 0x80);
227  Notify(PSTR("\r\n"), 0x80);
228  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
229  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
230  Notify(PSTR(" "), 0x80);
231  }
232  }
233 #endif
234  L2CAP_task();
235  }
236 }
237 
238 void BTHID::L2CAP_task() {
239  switch(l2cap_state) {
240  /* These states are used if the HID device is the host */
243 #ifdef DEBUG_USB_HOST
244  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
245 #endif
246  setProtocol(); // Set protocol before establishing HID interrupt channel
247  l2cap_state = L2CAP_INTERRUPT_SETUP;
248  }
249  break;
250 
253 #ifdef DEBUG_USB_HOST
254  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
255 #endif
257  delay(1);
259  identifier++;
260  delay(1);
262 
263  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
264  }
265  break;
266 
267  /* These states are used if the Arduino is the host */
270 #ifdef DEBUG_USB_HOST
271  Notify(PSTR("\r\nSend HID Control Config Request"), 0x80);
272 #endif
273  identifier++;
275  l2cap_state = L2CAP_CONTROL_CONFIG_REQUEST;
276  }
277  break;
278 
281  setProtocol(); // Set protocol before establishing HID interrupt channel
282  delay(1); // Short delay between commands - just to be sure
283 #ifdef DEBUG_USB_HOST
284  Notify(PSTR("\r\nSend HID Interrupt Connection Request"), 0x80);
285 #endif
286  identifier++;
288  l2cap_state = L2CAP_INTERRUPT_CONNECT_REQUEST;
289  }
290  break;
291 
294 #ifdef DEBUG_USB_HOST
295  Notify(PSTR("\r\nSend HID Interrupt Config Request"), 0x80);
296 #endif
297  identifier++;
299  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
300  }
301  break;
302 
304  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
305 #ifdef DEBUG_USB_HOST
306  Notify(PSTR("\r\nHID Channels Established"), 0x80);
307 #endif
308  pBtd->connectToHIDDevice = false;
309  pBtd->pairWithHIDDevice = false;
310  connected = true;
311  onInit();
312  l2cap_state = L2CAP_DONE;
313  }
314  break;
315 
316  case L2CAP_DONE:
317  break;
318 
321 #ifdef DEBUG_USB_HOST
322  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
323 #endif
324  identifier++;
326  l2cap_state = L2CAP_CONTROL_DISCONNECT;
327  }
328  break;
329 
332 #ifdef DEBUG_USB_HOST
333  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
334 #endif
336  hci_handle = -1; // Reset handle
337  l2cap_event_flag = 0; // Reset flags
338  l2cap_state = L2CAP_WAIT;
339  }
340  break;
341  }
342 }
343 
344 void BTHID::Run() {
345  switch(l2cap_state) {
346  case L2CAP_WAIT:
347  if(pBtd->connectToHIDDevice && !pBtd->l2capConnectionClaimed && !connected && !activeConnection) {
349  activeConnection = true;
350 #ifdef DEBUG_USB_HOST
351  Notify(PSTR("\r\nSend HID Control Connection Request"), 0x80);
352 #endif
353  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
354  l2cap_event_flag = 0; // Reset flags
355  identifier = 0;
357  l2cap_state = L2CAP_CONTROL_CONNECT_REQUEST;
359 #ifdef DEBUG_USB_HOST
360  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
361 #endif
363  delay(1);
365  identifier++;
366  delay(1);
368  l2cap_state = L2CAP_CONTROL_SUCCESS;
369  }
370  break;
371  }
372 }
373 
374 /************************************************************/
375 /* HID Commands */
376 
377 /************************************************************/
378 void BTHID::setProtocol() {
379 #ifdef DEBUG_USB_HOST
380  Notify(PSTR("\r\nSet protocol mode: "), 0x80);
381  D_PrintHex<uint8_t > (protocolMode, 0x80);
382 #endif
383  if (protocolMode != USB_HID_BOOT_PROTOCOL && protocolMode != HID_RPT_PROTOCOL) {
384 #ifdef DEBUG_USB_HOST
385  Notify(PSTR("\r\nNot a valid protocol mode. Using Boot protocol instead."), 0x80);
386 #endif
387  protocolMode = USB_HID_BOOT_PROTOCOL; // Use Boot Protocol by default
388  }
389  uint8_t command = 0x70 | protocolMode; // Set Protocol, see Bluetooth HID specs page 33
390  pBtd->L2CAP_Command(hci_handle, &command, 1, control_scid[0], control_scid[1]);
391 }
392 
393 void BTHID::setLeds(uint8_t data) {
394  uint8_t buf[3];
395  buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
396  buf[1] = 0x01; // Report ID
397  buf[2] = data;
399 }
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
Definition: BTD.h:140
#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS
Definition: BTD.h:144
#define L2CAP_INTERRUPT_CONFIG_REQUEST
Definition: BTD.h:116
#define L2CAP_INTERRUPT_SETUP
Definition: BTD.h:114
@@ -563,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_b_t_h_i_d_8h.html b/_b_t_h_i_d_8h.html index 59ded7ea..7c35c6e3 100644 --- a/_b_t_h_i_d_8h.html +++ b/_b_t_h_i_d_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTHID.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -88,21 +89,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTHID.h File Reference
-
#include "BTD.h"
-#include "hidboot.h"
+
#include "BTD.h"
+#include "hidboot.h"
Include dependency graph for BTHID.h:
- + + + + + +
This graph shows which files directly or indirectly include this file:
- + + +

Go to the source code of this file.

@@ -169,7 +177,7 @@ Macros diff --git a/_b_t_h_i_d_8h__dep__incl.map b/_b_t_h_i_d_8h__dep__incl.map index 4d5dd102..1b72a609 100644 --- a/_b_t_h_i_d_8h__dep__incl.map +++ b/_b_t_h_i_d_8h__dep__incl.map @@ -1,4 +1,4 @@ - + diff --git a/_b_t_h_i_d_8h__dep__incl.md5 b/_b_t_h_i_d_8h__dep__incl.md5 index ca89e4dc..053bda1f 100644 --- a/_b_t_h_i_d_8h__dep__incl.md5 +++ b/_b_t_h_i_d_8h__dep__incl.md5 @@ -1 +1 @@ -98e640defd09cdb6bea449a9af48374c \ No newline at end of file +0205aeed5db75f7b218ba6ecd920ddcd \ No newline at end of file diff --git a/_b_t_h_i_d_8h__dep__incl.png b/_b_t_h_i_d_8h__dep__incl.png index 2dd5a0d4e30f125aa272caf2f6b4ce2fa9d6e8fd..6ad24e96bab3916ba9ff116b6291672d8f8d4b22 100644 GIT binary patch literal 4157 zcmYjV2{e>Z->0NZc4LXLWmn0TB}S*M|bk?$?q&prK4l}W26T)56Rh>MVWKClFx4a7N2v6-h^64%WgB; zjor@|YSZDa91p4>h&0%h_x~&aPlcQg97_m#Sy(_!ELeg!^9FLPs>2>O+KpP;tXgw( zU!Anty#fV)FsOu!IFoOXisWD18gOQO^?fNPCv_ofcqb~$TTv;?^*#PFF_OI?O^T!a zlujEz=!_@?4AN1P21ol0^vd1zB&J`9GAjeOC&^uvl?9oanmT2Op6i=V(Nf9hcW`riOL`daKtRQly`2F%ru{#{;nJ58 z2t+1HBH;Eveap+KFRchPMds7Iyu1ty3?g!JtecygjNfxda@3>nc=;T4e}ms0jb7hq z(|;il$Y`^-eUgAG>)6z8=eHJ)3l}a_S%&D+ zFMDFUj`szIh(zC`1K-OCJY7~+*4FOsLNVKTk_z_DJ9*~Nz10|X|6e~ooq71&K>o;0WCJ08^!4k3=Ax9wc~MuUPw*! zAy^BwudJ4=!cOPl>Kb==7+QFUH)xtl8##TE{KT8r!lk!y+z;hAqs zN*K?w2}Rq;@fLLfD~=9+rVI=Z>p`LP!0f5=TmoK65U@{&$UOqsCuWfJZo1LqBU!3P z9^c$Ng*JJan|t^By-fP#QU|_D`>s4=K~;yISQek);N~~m;0CJRxwA2m?5zJ=LU8GG zbNO)g_fUH>eL+saSgyH+MfdEi?YbfZau2ul=Z}t^U7iTqsMy%Y57eE=E8*rDMp~hg zW@zs}89!edNz5Pnyp6zxr%IXd6k)61t*T;Q!z2*t*JvA~xI{jA2L%WuHXpwwkos$n zx}@$C0Exxva;pWczY*E9o={`1V2f!jGjBw+Y~2$VU++)k-SY`((1*WxB*kX@W`V8j zbp*^Jj=Dpc?_s0hN(?ehm_2Udk0f(6pG3u#GsV1TUR|3!IQUr@|Lkk>>Z(1?QkC9Kh`=wTos^+{ zQOr>1;v?f2t67G$a#sH(7co&s;qc=$M$W8Ao$h+;W?2p)0ykK1;3DeGYb zUjByNVV2@U@z3tbo3%|?F+ZE+1phXw;I{Nw zxaGaOc?`OGytlTL0F63aR>3uVc4sLscV`#uJb&r_uY#tgh>X9LOfivX7Z*(wyrxfn z6sE8imKjBrl$5AUkVv-_9uA$eqoHXVV=rJcn^-sHkA_KpesVxO%xzlWeI8xu&vhIN z3JQMZuDp76;?Y>vJ4qr%Z~0*CXnC4XS{`GHweH^K*9=2MT~Jc=JqnSjL0c<=VxB=D zo{mVd(>=4#=eD+dVzKu2b~GXFZ|8-CJ~5U$@-ZGCwmNP(v?Vwgno8eM4)Vl+xvLD| zFKmL9r?FvT}|wKIK?|JWQK@2KYMbS4a4wWQ2)&r~|($L3~q z)Y+f-@MEmVOZgWt>l14Mfoqw{&#=0+Hr@nv2n$PsRt+ zw6!egj0s;X6p7>#=VaX6G=4D{j-fO)ra2uQM7XS|sv({WX@%Rb6q_*}?gvIxRWZXB zuez*Ei~~yjHmuag$N$C@72OKkxywlo^$_QarSFkH$8>=Kg%YUW^+1a0>qU1x#!6nl z&h9!QDXOK#h@#~6)FK3*FPkNs)#RmuP0r|^1PR7KnZ)ic~a*`l~uX=8&$uL zS^dlsG@38Izcoj!%CjeE#tAAqU!(1eOuB4*f4^XL9Ed%@2dvQNXrs@U8du%KYFE{4 zOpoTrR#j0)MyK3JDjJ7-d+vG$kK=N4nd8{5Do}GSU4l-b6({f8+d}Qg`kpf?^>;<+ z&T*cj+YqAG)u%cxefoMZ7Z*pWTg(&*M4SS}FbQeG9Vg2*hp{KuFJ6pIv^8#zW!~;B zxjTXPcNNXmpMf?|KO4C>GES7b&Qo`;Lo}L(JvGL|jBb%q>RmBz!CWZ~I@u<wb|+LPj)aplam~YyqJiRk|wE3ufCf~U!Qv)qv-6CX8;>gCY#L4X9#Jn z<6TG2O3P3$U`}X8wZxTiX|O@)ekG4^cncc`M~^&eKctqZkbwOzyfxKDNZ#G8F*O$- zX1gC`2nLBsNdCeB6<%fSnqUhn{pSHW%%5TYCk0o&+DcjsFaqX;ZGY(U-CeeDcJ5%i zKPBXpG4W_+MZw1hAEV<-7m!nY1*Cs=wsnVH7#+ZHJ3U%V-1!A*F|+sUSNaDJ{Nd)i zVs&-XC#EnD1Kje{SjKCBaK{056KODqQ$|nXQ#xUBN#hT{KAvd_c^U3QkN|`g6)hBY zbnv$akJP@sC&6IQDo}br_gIQb(QnzJ{nU?^a_ns3zk=Ai{2Zx1)KC@-50V*^! zlv$ad2SYu-Vee)t%^Y%cpbk#JT$EkylJ}bC1A>rf*J;;XZCh`O2sw`p54BtOYhwV# z2=TKdMn@knkM*z$s2cOOL+U}S>ByCFA5W4GLvb;zmdGI(qmwe*K9b*ZAg8G03Y<}Y z;{0X7sT|;i#2Y76B~8rVY|>(Ug3cK0hICtRZyBG`FAHE?|8oRHZA*|< zuuVEhJ+c6vPfIS~f`uH&4`=g678PCHo-nZh*7H@c=?6pfrHTUA$PqO)8a#4G%)svX z=cq+oK}kvV%<}@S1fT(+_J?E4sNifBv;-gzzY4Fkn(Q2bPhcwqQ<}f;Mv=nieicJF#TUHI&2M49AL#^&Q{Q9ky0{N=Rnu z+g(A{dOlzk(h8LfQtzmL18;!ntD+APz<$}kOjXRWq~)e6PQaaqMb(a>ZRof ziItV=mI?{R(&6Eln|^<0NQ7es0&P>OmN>^oX-*~_?^|0+rq(y!4) ztxeTnA7HRB9Q@oNrQ^?#n&m}b_T!VG3BLia9VLylv^03d!k7V|01rNButZ296E*XlHkOeQxlv&c6`d}B zBT`aKvKQS~Lob5K+A@grGsHT;m6kB7Vn;^@yMVw<`CSxW5{>j)`x-xskY>o!P86k} zx|+4nFs1L9M!9?JU->F1%cd=WDKIb)QRn=u+UwVF*4yf80{~~4%W^;dPDrMZQEURL zk3E&Jduvn3u>yTY8oQsC0zYM~BkC+$-G-(Y95qp4F8igs8>c(LzgqJ!n?SoFAthB` z@A7e6qpPpaKt)|WYj1no(bmR>RAt@V^v2c7ihpfxuDh+ZwRU@Z+Y^mO$IWOID4p0N z_4V~@0pM=X8EZWOm`Sqh3|$e@P*cOprmYt5v_9F9yp%!w+Sb;lvZEZR_2_GQTG|J~ z;c7)?XQ!3`1TvhSo=#|JN@urR&98DC#tgAv`UVw}$Mt>3aMDlVap z5BGvfHwM1!1KSDr2ptF$`q6Yun4x-!dOBQJBpQ^EUUG#hMFA5rAX6EMR zcm)Lo&pUULHd|ds@@fYM2iM=479vn6)R(EL4BJ{K{R)#5E-7PtL_|cTLE$4MlMUp( zFRAHXKsC4ZU$yISqfGR%L$zf{JTn*z3kyU?h;N0L8Pe|iAD7CZA=vKbthIN$Sy?ZD z-uIelhli`1#6>?qFW)3N_ffF>=~Jgf(qI6cz;YG}dY%1T-L@8xB;tqCF`bOfy!)84MZ$;CBRY9j1EOwM0l z_q_8)*~q)Sxmk6S+?hDnGt*_~`QX8YqvPX1N@qt$lKbyZ*AFFo<(Xqy1Y!j>g5LG_ z8&bj^J(97*9Pg=2tY+6_u00cVq2?8|weedwd3FOa8CIaFxO;e*nwdocTxLGiL>mf& z!7BFCf7=L$ZP9aba>6YwW9`GKXFxFplMMiK;pXOk`}XZq9h}>qG3jN{ZEk-4e-unJ zboX3xax#EUgoDkX_Pg@Q_EX`1AfbgY1SK=Hu6WX{3kRY5$bd(PC fKP>6_$yvrtbBUi<|E2@?0dz+C#(LE{4w3%{zg!K` literal 4241 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 diff --git a/_b_t_h_i_d_8h__incl.map b/_b_t_h_i_d_8h__incl.map index 6e608b91..49aa9685 100644 --- a/_b_t_h_i_d_8h__incl.map +++ b/_b_t_h_i_d_8h__incl.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/_b_t_h_i_d_8h__incl.md5 b/_b_t_h_i_d_8h__incl.md5 index 2da3208f..aefec681 100644 --- a/_b_t_h_i_d_8h__incl.md5 +++ b/_b_t_h_i_d_8h__incl.md5 @@ -1 +1 @@ -bdc3422037e4ec0232315326aaf394cb \ No newline at end of file +d78862557f9f3bddfcdcfa91190beeac \ No newline at end of file diff --git a/_b_t_h_i_d_8h__incl.png b/_b_t_h_i_d_8h__incl.png index aa67112c6be3c12a95fa29b821de9663e939e355..189bfc762f8ec56efee10a6697d8965f7f8aaf9a 100644 GIT binary patch literal 12961 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 - + USB Host Shield 2.0: BTHID.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -85,107 +86,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BTHID.h
-Go to the documentation of this file.
1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
-
2 
-
3  This software may be distributed and modified under the terms of the GNU
-
4  General Public License version 2 (GPL2) as published by the Free Software
-
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
-
6  this file. Please note that GPL2 Section 2[b] requires that all works based
-
7  on this software must also be made publicly available under the terms of
-
8  the GPL2 ("Copyleft").
-
9 
-
10  Contact information
-
11  -------------------
-
12 
-
13  Kristian Lauszus, TKJ Electronics
-
14  Web : http://www.tkjelectronics.com
-
15  e-mail : kristianl@tkjelectronics.com
-
16  */
-
17 
-
18 #ifndef _bthid_h_
-
19 #define _bthid_h_
-
20 
-
21 #include "BTD.h"
-
22 #include "hidboot.h"
-
23 
-
24 #define KEYBOARD_PARSER_ID 0
-
25 #define MOUSE_PARSER_ID 1
-
26 #define NUM_PARSERS 2
-
27 
-
29 class BTHID : public BluetoothService {
-
30 public:
-
37  BTHID(BTD *p, bool pair = false, const char *pin = "0000");
-
38 
-
41  void disconnect();
- -
50  if (id >= NUM_PARSERS)
-
51  return NULL;
-
52  return pRptParser[id];
-
53  };
-
54 
-
61  bool SetReportParser(uint8_t id, HIDReportParser *prs) {
-
62  if (id >= NUM_PARSERS)
-
63  return false;
-
64  pRptParser[id] = prs;
-
65  return true;
-
66  };
-
67 
-
72  void setProtocolMode(uint8_t mode) {
-
73  protocolMode = mode;
-
74  };
-
75 
-
81  void setLeds(struct KBDLEDS data) {
-
82  setLeds(*((uint8_t*)&data));
-
83  };
-
84  void setLeds(uint8_t data);
-
88  bool connected;
-
89 
-
91  void pair(void) {
-
92  if(pBtd)
-
93  pBtd->pairWithHID();
-
94  };
-
95 
-
96 protected:
-
102  void ACLData(uint8_t* ACLData);
-
104  void Run();
-
106  void Reset();
-
112  void onInit() {
-
113  if(pFuncOnInit)
-
114  pFuncOnInit(); // Call the user function
-
115  OnInitBTHID();
-
116  };
-
125  virtual void ParseBTHIDData(uint8_t len __attribute__((unused)), uint8_t *buf __attribute__((unused))) {
-
126  return;
-
127  };
-
129  virtual void OnInitBTHID() {
-
130  return;
-
131  };
-
133  virtual void ResetBTHID() {
-
134  return;
-
135  }
-
139  uint8_t control_scid[2];
-
140 
-
142  uint8_t interrupt_scid[2];
-
143 
-
144 private:
-
145  HIDReportParser *pRptParser[NUM_PARSERS]; // Pointer to HIDReportParsers.
-
146 
-
148  void setProtocol();
-
149  uint8_t protocolMode;
-
150 
-
151  void L2CAP_task(); // L2CAP state machine
-
152 
-
153  bool activeConnection; // Used to indicate if it already has established a connection
-
154 
-
155  /* Variables used for L2CAP communication */
-
156  uint8_t control_dcid[2]; // L2CAP device CID for HID_Control - Always 0x0070
-
157  uint8_t interrupt_dcid[2]; // L2CAP device CID for HID_Interrupt - Always 0x0071
-
158  uint8_t l2cap_state;
-
159 };
-
160 #endif
- +Go to the documentation of this file.
1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16  */
17 
18 #ifndef _bthid_h_
19 #define _bthid_h_
20 
21 #include "BTD.h"
22 #include "hidboot.h"
23 
24 #define KEYBOARD_PARSER_ID 0
25 #define MOUSE_PARSER_ID 1
26 #define NUM_PARSERS 2
27 
29 class BTHID : public BluetoothService {
30 public:
37  BTHID(BTD *p, bool pair = false, const char *pin = "0000");
38 
41  void disconnect();
50  if (id >= NUM_PARSERS)
51  return NULL;
52  return pRptParser[id];
53  };
54 
61  bool SetReportParser(uint8_t id, HIDReportParser *prs) {
62  if (id >= NUM_PARSERS)
63  return false;
64  pRptParser[id] = prs;
65  return true;
66  };
67 
72  void setProtocolMode(uint8_t mode) {
73  protocolMode = mode;
74  };
75 
81  void setLeds(struct KBDLEDS data) {
82  setLeds(*((uint8_t*)&data));
83  };
84  void setLeds(uint8_t data);
88  bool connected;
89 
91  void pair(void) {
92  if(pBtd)
93  pBtd->pairWithHID();
94  };
95 
96 protected:
102  void ACLData(uint8_t* ACLData);
104  void Run();
106  void Reset();
112  void onInit() {
113  if(pFuncOnInit)
114  pFuncOnInit(); // Call the user function
115  OnInitBTHID();
116  };
125  virtual void ParseBTHIDData(uint8_t len __attribute__((unused)), uint8_t *buf __attribute__((unused))) {
126  return;
127  };
129  virtual void OnInitBTHID() {
130  return;
131  };
133  virtual void ResetBTHID() {
134  return;
135  }
139  uint8_t control_scid[2];
140 
142  uint8_t interrupt_scid[2];
143 
144 private:
145  HIDReportParser *pRptParser[NUM_PARSERS]; // Pointer to HIDReportParsers.
146 
148  void setProtocol();
149  uint8_t protocolMode;
150 
151  void L2CAP_task(); // L2CAP state machine
152 
153  bool activeConnection; // Used to indicate if it already has established a connection
154 
155  /* Variables used for L2CAP communication */
156  uint8_t control_dcid[2]; // L2CAP device CID for HID_Control - Always 0x0070
157  uint8_t interrupt_dcid[2]; // L2CAP device CID for HID_Interrupt - Always 0x0071
158  uint8_t l2cap_state;
159 };
160 #endif
-
void(* pFuncOnInit)(void)
Definition: BTD.h:609
virtual void OnInitBTHID()
Definition: BTHID.h:129
void ACLData(uint8_t *ACLData)
Definition: BTHID.cpp:56
Definition: BTD.h:201
@@ -200,6 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
void disconnect()
Definition: BTHID.cpp:49
HIDReportParser * GetReportParser(uint8_t id)
Definition: BTHID.h:49
virtual void ParseBTHIDData(uint8_t len, uint8_t *buf)
Definition: BTHID.h:125
+
void(* pFuncOnInit)(void)
Definition: BTD.h:609
BTD * pBtd
Definition: BTD.h:612
void setLeds(struct KBDLEDS data)
Definition: BTHID.h:81
#define NUM_PARSERS
Definition: BTHID.h:26
@@ -216,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s3_b_t_8cpp.html b/_p_s3_b_t_8cpp.html index 6686f87f..4c8fdca9 100644 --- a/_p_s3_b_t_8cpp.html +++ b/_p_s3_b_t_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3BT.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -85,13 +86,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3BT.cpp File Reference
-
#include "PS3BT.h"
+
#include "PS3BT.h"
Include dependency graph for PS3BT.cpp:
- + + + + + + + +

Go to the source code of this file.

@@ -100,7 +108,7 @@ Include dependency graph for PS3BT.cpp:
diff --git a/_p_s3_b_t_8cpp__incl.map b/_p_s3_b_t_8cpp__incl.map index 38ed14ac..66b9764a 100644 --- a/_p_s3_b_t_8cpp__incl.map +++ b/_p_s3_b_t_8cpp__incl.map @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + diff --git a/_p_s3_b_t_8cpp__incl.md5 b/_p_s3_b_t_8cpp__incl.md5 index b8b94cf7..47f6eaf8 100644 --- a/_p_s3_b_t_8cpp__incl.md5 +++ b/_p_s3_b_t_8cpp__incl.md5 @@ -1 +1 @@ -964b669494a92fbaa23b013c5991517e \ No newline at end of file +50d55f1029d7b23c50d71899212fd03f \ No newline at end of file diff --git a/_p_s3_b_t_8cpp__incl.png b/_p_s3_b_t_8cpp__incl.png index ab96e57b9d2888e09ca4a10e4ab5ce264771be45..406ff57f60bfeeaeb8f28a9e2ca4b8bddb963740 100644 GIT binary patch literal 17741 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 literal 19067 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 - + USB Host Shield 2.0: PS3BT.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -85,645 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3BT.cpp
-Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
-
2 
-
3  This software may be distributed and modified under the terms of the GNU
-
4  General Public License version 2 (GPL2) as published by the Free Software
-
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
-
6  this file. Please note that GPL2 Section 2[b] requires that all works based
-
7  on this software must also be made publicly available under the terms of
-
8  the GPL2 ("Copyleft").
-
9 
-
10  Contact information
-
11  -------------------
-
12 
-
13  Kristian Lauszus, TKJ Electronics
-
14  Web : http://www.tkjelectronics.com
-
15  e-mail : kristianl@tkjelectronics.com
-
16  */
-
17 
-
18 #include "PS3BT.h"
-
19 // To enable serial debugging see "settings.h"
-
20 //#define EXTRADEBUG // Uncomment to get even more debugging data
-
21 //#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
-
22 
-
23 PS3BT::PS3BT(BTD *p, uint8_t btadr5, uint8_t btadr4, uint8_t btadr3, uint8_t btadr2, uint8_t btadr1, uint8_t btadr0) :
-
24 BluetoothService(p) // Pointer to USB class instance - mandatory
-
25 {
-
26  pBtd->my_bdaddr[5] = btadr5; // Change to your dongle's Bluetooth address instead
-
27  pBtd->my_bdaddr[4] = btadr4;
-
28  pBtd->my_bdaddr[3] = btadr3;
-
29  pBtd->my_bdaddr[2] = btadr2;
-
30  pBtd->my_bdaddr[1] = btadr1;
-
31  pBtd->my_bdaddr[0] = btadr0;
-
32 
-
33  HIDBuffer[0] = 0x52; // HID BT Set_report (0x50) | Report Type (Output 0x02)
-
34  HIDBuffer[1] = 0x01; // Report ID
-
35 
-
36  // Needed for PS3 Move Controller commands to work via bluetooth
-
37  HIDMoveBuffer[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
-
38  HIDMoveBuffer[1] = 0x02; // Report ID
-
39 
-
40  /* Set device cid for the control and intterrupt channelse - LSB */
-
41  control_dcid[0] = 0x40; // 0x0040
-
42  control_dcid[1] = 0x00;
-
43  interrupt_dcid[0] = 0x41; // 0x0041
-
44  interrupt_dcid[1] = 0x00;
-
45 
-
46  Reset();
-
47 }
-
48 
- -
50  return (ButtonState & pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]));
-
51 }
-
52 
- -
54  uint32_t button = pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]);
-
55  bool click = (ButtonClickState & button);
-
56  ButtonClickState &= ~button; // Clear "click" event
-
57  return click;
-
58 }
-
59 
- -
61  return (uint8_t)(l2capinbuf[pgm_read_byte(&PS3_ANALOG_BUTTONS[(uint8_t)a])]);
-
62 }
-
63 
- -
65  return (uint8_t)(l2capinbuf[(uint8_t)a + 15]);
-
66 }
-
67 
- -
69  if(PS3Connected) {
-
70  if(a == aX || a == aY || a == aZ || a == gZ)
-
71  return ((l2capinbuf[(uint16_t)a] << 8) | l2capinbuf[(uint16_t)a + 1]);
-
72  else
-
73  return 0;
-
74  } else if(PS3MoveConnected) {
-
75  if(a == mXmove || a == mYmove) // These are all 12-bits long
-
76  return (((l2capinbuf[(uint16_t)a] & 0x0F) << 8) | (l2capinbuf[(uint16_t)a + 1]));
-
77  else if(a == mZmove || a == tempMove) // The tempearature is also 12 bits long
-
78  return ((l2capinbuf[(uint16_t)a] << 4) | ((l2capinbuf[(uint16_t)a + 1] & 0xF0) >> 4));
-
79  else // aXmove, aYmove, aZmove, gXmove, gYmove and gZmove
-
80  return (l2capinbuf[(uint16_t)a] | (l2capinbuf[(uint16_t)a + 1] << 8));
-
81  } else
-
82  return 0;
-
83 }
-
84 
- -
86  float accXval, accYval, accZval;
-
87 
-
88  if(PS3Connected) {
-
89  // Data for the Kionix KXPC4 used in the DualShock 3
-
90  const float zeroG = 511.5f; // 1.65/3.3*1023 (1.65V)
-
91  accXval = -((float)getSensor(aX) - zeroG);
-
92  accYval = -((float)getSensor(aY) - zeroG);
-
93  accZval = -((float)getSensor(aZ) - zeroG);
-
94  } else if(PS3MoveConnected) {
-
95  // It's a Kionix KXSC4 inside the Motion controller
-
96  const uint16_t zeroG = 0x8000;
-
97  accXval = -(int16_t)(getSensor(aXmove) - zeroG);
-
98  accYval = (int16_t)(getSensor(aYmove) - zeroG);
-
99  accZval = (int16_t)(getSensor(aZmove) - zeroG);
-
100  } else
-
101  return 0;
-
102 
-
103  // Convert to 360 degrees resolution
-
104  // atan2 outputs the value of -Ï€ to Ï€ (radians)
-
105  // We are then converting it to 0 to 2Ï€ and then to degrees
-
106  if(a == Pitch)
-
107  return (atan2f(accYval, accZval) + PI) * RAD_TO_DEG;
-
108  else
-
109  return (atan2f(accXval, accZval) + PI) * RAD_TO_DEG;
-
110 }
-
111 
-
112 float PS3BT::get9DOFValues(SensorEnum a) { // Thanks to Manfred Piendl
-
113  if(!PS3MoveConnected)
-
114  return 0;
-
115  int16_t value = getSensor(a);
-
116  if(a == mXmove || a == mYmove || a == mZmove) {
-
117  if(value > 2047)
-
118  value -= 0x1000;
-
119  return (float)value / 3.2f; // unit: muT = 10^(-6) Tesla
-
120  } else if(a == aXmove || a == aYmove || a == aZmove) {
-
121  if(value < 0)
-
122  value += 0x8000;
-
123  else
-
124  value -= 0x8000;
-
125  return (float)value / 442.0f; // unit: m/(s^2)
-
126  } else if(a == gXmove || a == gYmove || a == gZmove) {
-
127  if(value < 0)
-
128  value += 0x8000;
-
129  else
-
130  value -= 0x8000;
-
131  if(a == gXmove)
-
132  return (float)value / 11.6f; // unit: deg/s
-
133  else if(a == gYmove)
-
134  return (float)value / 11.2f; // unit: deg/s
-
135  else // gZmove
-
136  return (float)value / 9.6f; // unit: deg/s
-
137  } else
-
138  return 0;
-
139 }
-
140 
- -
142  if(PS3MoveConnected) {
-
143  int16_t input = getSensor(tempMove);
-
144 
-
145  String output = String(input / 100);
-
146  output += ".";
-
147  if(input % 100 < 10)
-
148  output += "0";
-
149  output += String(input % 100);
-
150 
-
151  return output;
-
152  } else
-
153  return "Error";
-
154 }
-
155 
- -
157  return (l2capinbuf[(uint16_t)c >> 8] == ((uint8_t)c & 0xff));
-
158 }
-
159 
- -
161  char statusOutput[102]; // Max string length plus null character
- -
163  strcpy_P(statusOutput, PSTR("\r\nConnectionStatus: "));
-
164 
-
165  if(getStatus(Plugged)) strcat_P(statusOutput, PSTR("Plugged"));
-
166  else if(getStatus(Unplugged)) strcat_P(statusOutput, PSTR("Unplugged"));
-
167  else strcat_P(statusOutput, PSTR("Error"));
-
168 
-
169  strcat_P(statusOutput, PSTR(" - PowerRating: "));
-
170 
-
171  if(getStatus(Charging)) strcat_P(statusOutput, PSTR("Charging"));
-
172  else if(getStatus(NotCharging)) strcat_P(statusOutput, PSTR("Not Charging"));
-
173  else if(getStatus(Shutdown)) strcat_P(statusOutput, PSTR("Shutdown"));
-
174  else if(getStatus(Dying)) strcat_P(statusOutput, PSTR("Dying"));
-
175  else if(getStatus(Low)) strcat_P(statusOutput, PSTR("Low"));
-
176  else if(getStatus(High)) strcat_P(statusOutput, PSTR("High"));
-
177  else if(getStatus(Full)) strcat_P(statusOutput, PSTR("Full"));
-
178  else strcat_P(statusOutput, PSTR("Error"));
-
179 
-
180  strcat_P(statusOutput, PSTR(" - WirelessStatus: "));
-
181 
-
182  if(getStatus(CableRumble)) strcat_P(statusOutput, PSTR("Cable - Rumble is on"));
-
183  else if(getStatus(Cable)) strcat_P(statusOutput, PSTR("Cable - Rumble is off"));
-
184  else if(getStatus(BluetoothRumble)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is on"));
-
185  else if(getStatus(Bluetooth)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is off"));
-
186  else strcat_P(statusOutput, PSTR("Error"));
-
187  } else if(PS3MoveConnected) {
-
188  strcpy_P(statusOutput, PSTR("\r\nPowerRating: "));
-
189 
-
190  if(getStatus(MoveCharging)) strcat_P(statusOutput, PSTR("Charging"));
-
191  else if(getStatus(MoveNotCharging)) strcat_P(statusOutput, PSTR("Not Charging"));
-
192  else if(getStatus(MoveShutdown)) strcat_P(statusOutput, PSTR("Shutdown"));
-
193  else if(getStatus(MoveDying)) strcat_P(statusOutput, PSTR("Dying"));
-
194  else if(getStatus(MoveLow)) strcat_P(statusOutput, PSTR("Low"));
-
195  else if(getStatus(MoveHigh)) strcat_P(statusOutput, PSTR("High"));
-
196  else if(getStatus(MoveFull)) strcat_P(statusOutput, PSTR("Full"));
-
197  else strcat_P(statusOutput, PSTR("Error"));
-
198  } else
-
199  strcpy_P(statusOutput, PSTR("\r\nError"));
-
200 
-
201  USB_HOST_SERIAL.write(statusOutput);
-
202 }
-
203 
-
204 void PS3BT::Reset() {
-
205  PS3Connected = false;
-
206  PS3MoveConnected = false;
-
207  PS3NavigationConnected = false;
-
208  activeConnection = false;
-
209  l2cap_event_flag = 0; // Reset flags
-
210  l2cap_state = L2CAP_WAIT;
-
211 
-
212  // Needed for PS3 Dualshock Controller commands to work via Bluetooth
-
213  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
-
214  HIDBuffer[i + 2] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // First two bytes reserved for report type and ID
-
215 }
-
216 
-
217 void PS3BT::disconnect() { // Use this void to disconnect any of the controllers
-
218  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
-
219  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, interrupt_scid, interrupt_dcid);
-
220  Reset();
-
221  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
-
222 }
-
223 
-
224 void PS3BT::ACLData(uint8_t* ACLData) {
- -
226  if(ACLData[8] == L2CAP_CMD_CONNECTION_REQUEST) {
-
227  if((ACLData[12] | (ACLData[13] << 8)) == HID_CTRL_PSM) {
-
228  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
-
229  activeConnection = true;
-
230  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
-
231  l2cap_state = L2CAP_WAIT;
-
232  remote_name_first = pBtd->remote_name[0]; // Store the first letter in remote name for the connection
-
233 #ifdef DEBUG_USB_HOST
-
234  if(pBtd->hci_version < 3) { // Check the HCI Version of the Bluetooth dongle
-
235  Notify(PSTR("\r\nYour dongle may not support reading the analog buttons, sensors and status\r\nYour HCI Version is: "), 0x80);
-
236  Notify(pBtd->hci_version, 0x80);
-
237  Notify(PSTR("\r\nBut should be at least 3\r\nThis means that it doesn't support Bluetooth Version 2.0+EDR"), 0x80);
-
238  }
-
239 #endif
-
240  }
-
241  }
-
242  }
-
243 
-
244  if(checkHciHandle(ACLData, hci_handle)) { // acl_handle_ok
-
245  memcpy(l2capinbuf, ACLData, BULK_MAXPKTSIZE);
-
246  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
-
247  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
-
248 #ifdef DEBUG_USB_HOST
-
249  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
-
250  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
-
251  Notify(PSTR(" "), 0x80);
-
252  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
-
253  Notify(PSTR(" Data: "), 0x80);
-
254  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
-
255  Notify(PSTR(" "), 0x80);
-
256  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
-
257  Notify(PSTR(" "), 0x80);
-
258  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
-
259  Notify(PSTR(" "), 0x80);
-
260  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
-
261 #endif
-
262  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
-
263 #ifdef EXTRADEBUG
-
264  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
-
265  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
-
266  Notify(PSTR(" "), 0x80);
-
267  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
-
268  Notify(PSTR(" SCID: "), 0x80);
-
269  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
-
270  Notify(PSTR(" "), 0x80);
-
271  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
-
272  Notify(PSTR(" Identifier: "), 0x80);
-
273  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
-
274 #endif
-
275  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
-
276  identifier = l2capinbuf[9];
-
277  control_scid[0] = l2capinbuf[14];
-
278  control_scid[1] = l2capinbuf[15];
- -
280  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
-
281  identifier = l2capinbuf[9];
-
282  interrupt_scid[0] = l2capinbuf[14];
-
283  interrupt_scid[1] = l2capinbuf[15];
- -
285  }
-
286  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
-
287  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
-
288  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
289  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
- -
291  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
292  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
- -
294  }
-
295  }
-
296  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
-
297  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
298  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
-
299  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], control_scid);
-
300  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
301  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
-
302  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], interrupt_scid);
-
303  }
-
304  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
-
305  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
306 #ifdef DEBUG_USB_HOST
-
307  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
-
308 #endif
-
309  identifier = l2capinbuf[9];
-
310  pBtd->l2cap_disconnection_response(hci_handle, identifier, control_dcid, control_scid);
-
311  Reset();
-
312  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
313 #ifdef DEBUG_USB_HOST
-
314  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
-
315 #endif
-
316  identifier = l2capinbuf[9];
-
317  pBtd->l2cap_disconnection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid);
-
318  Reset();
-
319  }
-
320  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
-
321  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
-
322  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
-
323  identifier = l2capinbuf[9];
- -
325  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
-
326  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
-
327  identifier = l2capinbuf[9];
- -
329  }
-
330  }
-
331 #ifdef EXTRADEBUG
-
332  else {
-
333  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
-
334  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
-
335  }
-
336 #endif
-
337  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
-
338  //Notify(PSTR("\r\nL2CAP Interrupt"), 0x80);
- -
340  /* Read Report */
-
341  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
-
342  lastMessageTime = (uint32_t)millis(); // Store the last message time
-
343 
- -
345  ButtonState = (uint32_t)(l2capinbuf[11] | ((uint16_t)l2capinbuf[12] << 8) | ((uint32_t)l2capinbuf[13] << 16));
-
346  else if(PS3MoveConnected)
-
347  ButtonState = (uint32_t)(l2capinbuf[10] | ((uint16_t)l2capinbuf[11] << 8) | ((uint32_t)l2capinbuf[12] << 16));
-
348 
-
349  //Notify(PSTR("\r\nButtonState", 0x80);
-
350  //PrintHex<uint32_t>(ButtonState, 0x80);
-
351 
-
352  if(ButtonState != OldButtonState) {
-
353  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
-
354  OldButtonState = ButtonState;
-
355  }
-
356 
-
357 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
-
358  for(uint8_t i = 10; i < 58; i++) {
-
359  D_PrintHex<uint8_t > (l2capinbuf[i], 0x80);
-
360  Notify(PSTR(" "), 0x80);
-
361  }
-
362  Notify(PSTR("\r\n"), 0x80);
-
363 #endif
-
364  }
-
365  }
-
366  }
-
367  L2CAP_task();
-
368  }
-
369 }
-
370 
-
371 void PS3BT::L2CAP_task() {
-
372  switch(l2cap_state) {
-
373  case L2CAP_WAIT:
- -
375 #ifdef DEBUG_USB_HOST
-
376  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
-
377 #endif
-
378  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, PENDING);
-
379  delay(1);
-
380  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, SUCCESSFUL);
-
381  identifier++;
-
382  delay(1);
- -
384  l2cap_state = L2CAP_CONTROL_SUCCESS;
-
385  }
-
386  break;
-
387 
- - -
390 #ifdef DEBUG_USB_HOST
-
391  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
-
392 #endif
-
393  l2cap_state = L2CAP_INTERRUPT_SETUP;
-
394  }
-
395  break;
-
396 
- - -
399 #ifdef DEBUG_USB_HOST
-
400  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
-
401 #endif
-
402  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, PENDING);
-
403  delay(1);
-
404  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, SUCCESSFUL);
-
405  identifier++;
-
406  delay(1);
-
407  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
-
408 
-
409  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
-
410  }
-
411  break;
-
412 
- -
414  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
-
415 #ifdef DEBUG_USB_HOST
-
416  Notify(PSTR("\r\nHID Interrupt Successfully Configured"), 0x80);
-
417 #endif
-
418  if(remote_name_first == 'M') { // First letter in Motion Controller ('M')
-
419  memset(l2capinbuf, 0, BULK_MAXPKTSIZE); // Reset l2cap in buffer as it sometimes read it as a button has been pressed
-
420  l2cap_state = TURN_ON_LED;
-
421  } else
-
422  l2cap_state = PS3_ENABLE_SIXAXIS;
-
423  timer = (uint32_t)millis();
-
424  }
-
425  break;
-
426 
-
427  /* These states are handled in Run() */
-
428 
- - -
431 #ifdef DEBUG_USB_HOST
-
432  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
-
433 #endif
-
434  identifier++;
-
435  pBtd->l2cap_disconnection_request(hci_handle, identifier, control_scid, control_dcid);
-
436  l2cap_state = L2CAP_CONTROL_DISCONNECT;
-
437  }
-
438  break;
-
439 
- - -
442 #ifdef DEBUG_USB_HOST
-
443  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
-
444 #endif
- -
446  hci_handle = -1; // Reset handle
-
447  l2cap_event_flag = 0; // Reset flags
-
448  l2cap_state = L2CAP_WAIT;
-
449  }
-
450  break;
-
451  }
-
452 }
-
453 
-
454 void PS3BT::Run() {
-
455  switch(l2cap_state) {
-
456  case PS3_ENABLE_SIXAXIS:
-
457  if((int32_t)((uint32_t)millis() - timer) > 1000) { // loop 1 second before sending the command
-
458  memset(l2capinbuf, 0, BULK_MAXPKTSIZE); // Reset l2cap in buffer as it sometimes read it as a button has been pressed
-
459  for(uint8_t i = 15; i < 19; i++)
-
460  l2capinbuf[i] = 0x7F; // Set the analog joystick values to center position
-
461  enable_sixaxis();
-
462  l2cap_state = TURN_ON_LED;
-
463  timer = (uint32_t)millis();
-
464  }
-
465  break;
-
466 
-
467  case TURN_ON_LED:
-
468  if((int32_t)((uint32_t)millis() - timer) > 1000) { // loop 1 second before sending the command
-
469  if(remote_name_first == 'P') { // First letter in PLAYSTATION(R)3 Controller ('P')
-
470 #ifdef DEBUG_USB_HOST
-
471  Notify(PSTR("\r\nDualshock 3 Controller Enabled\r\n"), 0x80);
-
472 #endif
-
473  PS3Connected = true;
-
474  } else if(remote_name_first == 'N') { // First letter in Navigation Controller ('N')
-
475 #ifdef DEBUG_USB_HOST
-
476  Notify(PSTR("\r\nNavigation Controller Enabled\r\n"), 0x80);
-
477 #endif
-
478  PS3NavigationConnected = true;
-
479  } else if(remote_name_first == 'M') { // First letter in Motion Controller ('M')
-
480  timer = (uint32_t)millis();
-
481 #ifdef DEBUG_USB_HOST
-
482  Notify(PSTR("\r\nMotion Controller Enabled\r\n"), 0x80);
-
483 #endif
-
484  PS3MoveConnected = true;
-
485  }
-
486  ButtonState = 0; // Clear all values
-
487  OldButtonState = 0;
-
488  ButtonClickState = 0;
-
489 
-
490  onInit(); // Turn on the LED on the controller
-
491  l2cap_state = L2CAP_DONE;
-
492  }
-
493  break;
-
494 
-
495  case L2CAP_DONE:
-
496  if(PS3MoveConnected) { // The Bulb and rumble values, has to be send at approximately every 5th second for it to stay on
-
497  if((int32_t)((uint32_t)millis() - timer) > 4000) { // Send at least every 4th second
-
498  HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE); // The Bulb and rumble values, has to be written again and again, for it to stay turned on
-
499  timer = (uint32_t)millis();
-
500  }
-
501  }
-
502  break;
-
503  }
-
504 }
-
505 
-
506 /************************************************************/
-
507 /* HID Commands */
-
508 /************************************************************/
-
509 
-
510 // Playstation Sixaxis Dualshock and Navigation Controller commands
-
511 
-
512 void PS3BT::HID_Command(uint8_t* data, uint8_t nbytes) {
-
513  if((int32_t)((uint32_t)millis() - timerHID) <= 150) // Check if is has been more than 150ms since last command
-
514  delay((uint32_t)(150 - ((uint32_t)millis() - timerHID))); // There have to be a delay between commands
-
515  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]); // Both the Navigation and Dualshock controller sends data via the control channel
-
516  timerHID = (uint32_t)millis();
-
517 }
-
518 
- -
520  HIDBuffer[3] = 0x00; // Rumble bytes
-
521  HIDBuffer[4] = 0x00;
-
522  HIDBuffer[5] = 0x00;
-
523  HIDBuffer[6] = 0x00;
-
524 
-
525  HIDBuffer[11] = 0x00; // LED byte
-
526 
-
527  HID_Command(HIDBuffer, HID_BUFFERSIZE);
-
528 }
-
529 
- -
531  uint8_t rumbleBuf[HID_BUFFERSIZE];
-
532  memcpy(rumbleBuf, HIDBuffer, HID_BUFFERSIZE);
-
533  rumbleBuf[3] = 0x00;
-
534  rumbleBuf[4] = 0x00;
-
535  rumbleBuf[5] = 0x00;
-
536  rumbleBuf[6] = 0x00;
-
537  HID_Command(rumbleBuf, HID_BUFFERSIZE);
-
538 }
-
539 
- -
541  uint8_t power[2] = {0xff, 0x00}; // Defaults to RumbleLow
-
542  if(mode == RumbleHigh) {
-
543  power[0] = 0x00;
-
544  power[1] = 0xff;
-
545  }
-
546  setRumbleOn(0xfe, power[0], 0xfe, power[1]);
-
547 }
-
548 
-
549 void PS3BT::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower) {
-
550  uint8_t rumbleBuf[HID_BUFFERSIZE];
-
551  memcpy(rumbleBuf, HIDBuffer, HID_BUFFERSIZE);
-
552  rumbleBuf[3] = rightDuration;
-
553  rumbleBuf[4] = rightPower;
-
554  rumbleBuf[5] = leftDuration;
-
555  rumbleBuf[6] = leftPower;
-
556  HID_Command(rumbleBuf, HID_BUFFERSIZE);
-
557 }
-
558 
-
559 void PS3BT::setLedRaw(uint8_t value) {
-
560  HIDBuffer[11] = value << 1;
-
561  HID_Command(HIDBuffer, HID_BUFFERSIZE);
-
562 }
-
563 
- -
565  HIDBuffer[11] &= ~((uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1));
-
566  HID_Command(HIDBuffer, HID_BUFFERSIZE);
-
567 }
-
568 
- -
570  if(a == OFF)
-
571  setLedRaw(0);
-
572  else {
-
573  HIDBuffer[11] |= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
-
574  HID_Command(HIDBuffer, HID_BUFFERSIZE);
-
575  }
-
576 }
-
577 
- -
579  HIDBuffer[11] ^= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
-
580  HID_Command(HIDBuffer, HID_BUFFERSIZE);
-
581 }
-
582 
-
583 void PS3BT::enable_sixaxis() { // Command used to enable the Dualshock 3 and Navigation controller to send data via Bluetooth
-
584  uint8_t cmd_buf[6];
-
585  cmd_buf[0] = 0x53; // HID BT Set_report (0x50) | Report Type (Feature 0x03)
-
586  cmd_buf[1] = 0xF4; // Report ID
-
587  cmd_buf[2] = 0x42; // Special PS3 Controller enable commands
-
588  cmd_buf[3] = 0x03;
-
589  cmd_buf[4] = 0x00;
-
590  cmd_buf[5] = 0x00;
-
591 
-
592  HID_Command(cmd_buf, 6);
-
593 }
-
594 
-
595 // Playstation Move Controller commands
-
596 
-
597 void PS3BT::HIDMove_Command(uint8_t* data, uint8_t nbytes) {
-
598  if((int32_t)((uint32_t)millis() - timerHID) <= 150)// Check if is has been less than 150ms since last command
-
599  delay((uint32_t)(150 - ((uint32_t)millis() - timerHID))); // There have to be a delay between commands
-
600  pBtd->L2CAP_Command(hci_handle, data, nbytes, interrupt_scid[0], interrupt_scid[1]); // The Move controller sends it's data via the intterrupt channel
-
601  timerHID = (uint32_t)millis();
-
602 }
-
603 
-
604 void PS3BT::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { // Use this to set the Color using RGB values
-
605  // Set the Bulb's values into the write buffer
-
606  HIDMoveBuffer[3] = r;
-
607  HIDMoveBuffer[4] = g;
-
608  HIDMoveBuffer[5] = b;
-
609 
-
610  HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE);
-
611 }
-
612 
-
613 void PS3BT::moveSetBulb(ColorsEnum color) { // Use this to set the Color using the predefined colors in enum
-
614  moveSetBulb((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color));
-
615 }
-
616 
-
617 void PS3BT::moveSetRumble(uint8_t rumble) {
-
618 #ifdef DEBUG_USB_HOST
-
619  if(rumble < 64 && rumble != 0) // The rumble value has to at least 64, or approximately 25% (64/255*100)
-
620  Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"), 0x80);
-
621 #endif
-
622  // Set the rumble value into the write buffer
-
623  HIDMoveBuffer[7] = rumble;
-
624 
-
625  HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE);
-
626 }
-
627 
- -
629  if(pFuncOnInit)
-
630  pFuncOnInit(); // Call the user function
-
631  else {
-
632  if(PS3MoveConnected)
-
633  moveSetBulb(Red);
-
634  else // Dualshock 3 or Navigation controller
-
635  setLedOn(static_cast<LEDEnum>(LED1));
-
636  }
-
637 }
-
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
Definition: BTD.h:140
-
void(* pFuncOnInit)(void)
Definition: BTD.h:609
+Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16  */
17 
18 #include "PS3BT.h"
19 // To enable serial debugging see "settings.h"
20 //#define EXTRADEBUG // Uncomment to get even more debugging data
21 //#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
22 
23 PS3BT::PS3BT(BTD *p, uint8_t btadr5, uint8_t btadr4, uint8_t btadr3, uint8_t btadr2, uint8_t btadr1, uint8_t btadr0) :
24 BluetoothService(p) // Pointer to USB class instance - mandatory
25 {
26  pBtd->my_bdaddr[5] = btadr5; // Change to your dongle's Bluetooth address instead
27  pBtd->my_bdaddr[4] = btadr4;
28  pBtd->my_bdaddr[3] = btadr3;
29  pBtd->my_bdaddr[2] = btadr2;
30  pBtd->my_bdaddr[1] = btadr1;
31  pBtd->my_bdaddr[0] = btadr0;
32 
33  HIDBuffer[0] = 0x52; // HID BT Set_report (0x50) | Report Type (Output 0x02)
34  HIDBuffer[1] = 0x01; // Report ID
35 
36  // Needed for PS3 Move Controller commands to work via bluetooth
37  HIDMoveBuffer[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
38  HIDMoveBuffer[1] = 0x02; // Report ID
39 
40  /* Set device cid for the control and intterrupt channelse - LSB */
41  control_dcid[0] = 0x40; // 0x0040
42  control_dcid[1] = 0x00;
43  interrupt_dcid[0] = 0x41; // 0x0041
44  interrupt_dcid[1] = 0x00;
45 
46  Reset();
47 }
48 
50  return (ButtonState & pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]));
51 }
52 
54  uint32_t button = pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]);
55  bool click = (ButtonClickState & button);
56  ButtonClickState &= ~button; // Clear "click" event
57  return click;
58 }
59 
61  return (uint8_t)(l2capinbuf[pgm_read_byte(&PS3_ANALOG_BUTTONS[(uint8_t)a])]);
62 }
63 
65  return (uint8_t)(l2capinbuf[(uint8_t)a + 15]);
66 }
67 
69  if(PS3Connected) {
70  if(a == aX || a == aY || a == aZ || a == gZ)
71  return ((l2capinbuf[(uint16_t)a] << 8) | l2capinbuf[(uint16_t)a + 1]);
72  else
73  return 0;
74  } else if(PS3MoveConnected) {
75  if(a == mXmove || a == mYmove) // These are all 12-bits long
76  return (((l2capinbuf[(uint16_t)a] & 0x0F) << 8) | (l2capinbuf[(uint16_t)a + 1]));
77  else if(a == mZmove || a == tempMove) // The tempearature is also 12 bits long
78  return ((l2capinbuf[(uint16_t)a] << 4) | ((l2capinbuf[(uint16_t)a + 1] & 0xF0) >> 4));
79  else // aXmove, aYmove, aZmove, gXmove, gYmove and gZmove
80  return (l2capinbuf[(uint16_t)a] | (l2capinbuf[(uint16_t)a + 1] << 8));
81  } else
82  return 0;
83 }
84 
86  float accXval, accYval, accZval;
87 
88  if(PS3Connected) {
89  // Data for the Kionix KXPC4 used in the DualShock 3
90  const float zeroG = 511.5f; // 1.65/3.3*1023 (1.65V)
91  accXval = -((float)getSensor(aX) - zeroG);
92  accYval = -((float)getSensor(aY) - zeroG);
93  accZval = -((float)getSensor(aZ) - zeroG);
94  } else if(PS3MoveConnected) {
95  // It's a Kionix KXSC4 inside the Motion controller
96  const uint16_t zeroG = 0x8000;
97  accXval = -(int16_t)(getSensor(aXmove) - zeroG);
98  accYval = (int16_t)(getSensor(aYmove) - zeroG);
99  accZval = (int16_t)(getSensor(aZmove) - zeroG);
100  } else
101  return 0;
102 
103  // Convert to 360 degrees resolution
104  // atan2 outputs the value of -Ï€ to Ï€ (radians)
105  // We are then converting it to 0 to 2Ï€ and then to degrees
106  if(a == Pitch)
107  return (atan2f(accYval, accZval) + PI) * RAD_TO_DEG;
108  else
109  return (atan2f(accXval, accZval) + PI) * RAD_TO_DEG;
110 }
111 
112 float PS3BT::get9DOFValues(SensorEnum a) { // Thanks to Manfred Piendl
113  if(!PS3MoveConnected)
114  return 0;
115  int16_t value = getSensor(a);
116  if(a == mXmove || a == mYmove || a == mZmove) {
117  if(value > 2047)
118  value -= 0x1000;
119  return (float)value / 3.2f; // unit: muT = 10^(-6) Tesla
120  } else if(a == aXmove || a == aYmove || a == aZmove) {
121  if(value < 0)
122  value += 0x8000;
123  else
124  value -= 0x8000;
125  return (float)value / 442.0f; // unit: m/(s^2)
126  } else if(a == gXmove || a == gYmove || a == gZmove) {
127  if(value < 0)
128  value += 0x8000;
129  else
130  value -= 0x8000;
131  if(a == gXmove)
132  return (float)value / 11.6f; // unit: deg/s
133  else if(a == gYmove)
134  return (float)value / 11.2f; // unit: deg/s
135  else // gZmove
136  return (float)value / 9.6f; // unit: deg/s
137  } else
138  return 0;
139 }
140 
142  if(PS3MoveConnected) {
143  int16_t input = getSensor(tempMove);
144 
145  String output = String(input / 100);
146  output += ".";
147  if(input % 100 < 10)
148  output += "0";
149  output += String(input % 100);
150 
151  return output;
152  } else
153  return "Error";
154 }
155 
157  return (l2capinbuf[(uint16_t)c >> 8] == ((uint8_t)c & 0xff));
158 }
159 
161  char statusOutput[102]; // Max string length plus null character
163  strcpy_P(statusOutput, PSTR("\r\nConnectionStatus: "));
164 
165  if(getStatus(Plugged)) strcat_P(statusOutput, PSTR("Plugged"));
166  else if(getStatus(Unplugged)) strcat_P(statusOutput, PSTR("Unplugged"));
167  else strcat_P(statusOutput, PSTR("Error"));
168 
169  strcat_P(statusOutput, PSTR(" - PowerRating: "));
170 
171  if(getStatus(Charging)) strcat_P(statusOutput, PSTR("Charging"));
172  else if(getStatus(NotCharging)) strcat_P(statusOutput, PSTR("Not Charging"));
173  else if(getStatus(Shutdown)) strcat_P(statusOutput, PSTR("Shutdown"));
174  else if(getStatus(Dying)) strcat_P(statusOutput, PSTR("Dying"));
175  else if(getStatus(Low)) strcat_P(statusOutput, PSTR("Low"));
176  else if(getStatus(High)) strcat_P(statusOutput, PSTR("High"));
177  else if(getStatus(Full)) strcat_P(statusOutput, PSTR("Full"));
178  else strcat_P(statusOutput, PSTR("Error"));
179 
180  strcat_P(statusOutput, PSTR(" - WirelessStatus: "));
181 
182  if(getStatus(CableRumble)) strcat_P(statusOutput, PSTR("Cable - Rumble is on"));
183  else if(getStatus(Cable)) strcat_P(statusOutput, PSTR("Cable - Rumble is off"));
184  else if(getStatus(BluetoothRumble)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is on"));
185  else if(getStatus(Bluetooth)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is off"));
186  else strcat_P(statusOutput, PSTR("Error"));
187  } else if(PS3MoveConnected) {
188  strcpy_P(statusOutput, PSTR("\r\nPowerRating: "));
189 
190  if(getStatus(MoveCharging)) strcat_P(statusOutput, PSTR("Charging"));
191  else if(getStatus(MoveNotCharging)) strcat_P(statusOutput, PSTR("Not Charging"));
192  else if(getStatus(MoveShutdown)) strcat_P(statusOutput, PSTR("Shutdown"));
193  else if(getStatus(MoveDying)) strcat_P(statusOutput, PSTR("Dying"));
194  else if(getStatus(MoveLow)) strcat_P(statusOutput, PSTR("Low"));
195  else if(getStatus(MoveHigh)) strcat_P(statusOutput, PSTR("High"));
196  else if(getStatus(MoveFull)) strcat_P(statusOutput, PSTR("Full"));
197  else strcat_P(statusOutput, PSTR("Error"));
198  } else
199  strcpy_P(statusOutput, PSTR("\r\nError"));
200 
201  USB_HOST_SERIAL.write(statusOutput);
202 }
203 
204 void PS3BT::Reset() {
205  PS3Connected = false;
206  PS3MoveConnected = false;
207  PS3NavigationConnected = false;
208  activeConnection = false;
209  l2cap_event_flag = 0; // Reset flags
210  l2cap_state = L2CAP_WAIT;
211 
212  // Needed for PS3 Dualshock Controller commands to work via Bluetooth
213  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
214  HIDBuffer[i + 2] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // First two bytes reserved for report type and ID
215 }
216 
217 void PS3BT::disconnect() { // Use this void to disconnect any of the controllers
218  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
219  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, interrupt_scid, interrupt_dcid);
220  Reset();
221  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
222 }
223 
224 void PS3BT::ACLData(uint8_t* ACLData) {
226  if(ACLData[8] == L2CAP_CMD_CONNECTION_REQUEST) {
227  if((ACLData[12] | (ACLData[13] << 8)) == HID_CTRL_PSM) {
228  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
229  activeConnection = true;
230  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
231  l2cap_state = L2CAP_WAIT;
232  remote_name_first = pBtd->remote_name[0]; // Store the first letter in remote name for the connection
233 #ifdef DEBUG_USB_HOST
234  if(pBtd->hci_version < 3) { // Check the HCI Version of the Bluetooth dongle
235  Notify(PSTR("\r\nYour dongle may not support reading the analog buttons, sensors and status\r\nYour HCI Version is: "), 0x80);
236  Notify(pBtd->hci_version, 0x80);
237  Notify(PSTR("\r\nBut should be at least 3\r\nThis means that it doesn't support Bluetooth Version 2.0+EDR"), 0x80);
238  }
239 #endif
240  }
241  }
242  }
243 
244  if(checkHciHandle(ACLData, hci_handle)) { // acl_handle_ok
245  memcpy(l2capinbuf, ACLData, BULK_MAXPKTSIZE);
246  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
247  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
248 #ifdef DEBUG_USB_HOST
249  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
250  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
251  Notify(PSTR(" "), 0x80);
252  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
253  Notify(PSTR(" Data: "), 0x80);
254  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
255  Notify(PSTR(" "), 0x80);
256  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
257  Notify(PSTR(" "), 0x80);
258  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
259  Notify(PSTR(" "), 0x80);
260  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
261 #endif
262  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
263 #ifdef EXTRADEBUG
264  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
265  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
266  Notify(PSTR(" "), 0x80);
267  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
268  Notify(PSTR(" SCID: "), 0x80);
269  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
270  Notify(PSTR(" "), 0x80);
271  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
272  Notify(PSTR(" Identifier: "), 0x80);
273  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
274 #endif
275  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
276  identifier = l2capinbuf[9];
277  control_scid[0] = l2capinbuf[14];
278  control_scid[1] = l2capinbuf[15];
280  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
281  identifier = l2capinbuf[9];
282  interrupt_scid[0] = l2capinbuf[14];
283  interrupt_scid[1] = l2capinbuf[15];
285  }
286  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
287  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
288  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
289  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
291  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
292  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
294  }
295  }
296  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
297  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
298  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
299  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], control_scid);
300  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
301  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
302  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], interrupt_scid);
303  }
304  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
305  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
306 #ifdef DEBUG_USB_HOST
307  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
308 #endif
309  identifier = l2capinbuf[9];
310  pBtd->l2cap_disconnection_response(hci_handle, identifier, control_dcid, control_scid);
311  Reset();
312  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
313 #ifdef DEBUG_USB_HOST
314  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
315 #endif
316  identifier = l2capinbuf[9];
317  pBtd->l2cap_disconnection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid);
318  Reset();
319  }
320  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
321  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
322  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
323  identifier = l2capinbuf[9];
325  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
326  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
327  identifier = l2capinbuf[9];
329  }
330  }
331 #ifdef EXTRADEBUG
332  else {
333  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
334  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
335  }
336 #endif
337  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
338  //Notify(PSTR("\r\nL2CAP Interrupt"), 0x80);
340  /* Read Report */
341  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
342  lastMessageTime = (uint32_t)millis(); // Store the last message time
343 
345  ButtonState = (uint32_t)(l2capinbuf[11] | ((uint16_t)l2capinbuf[12] << 8) | ((uint32_t)l2capinbuf[13] << 16));
346  else if(PS3MoveConnected)
347  ButtonState = (uint32_t)(l2capinbuf[10] | ((uint16_t)l2capinbuf[11] << 8) | ((uint32_t)l2capinbuf[12] << 16));
348 
349  //Notify(PSTR("\r\nButtonState", 0x80);
350  //PrintHex<uint32_t>(ButtonState, 0x80);
351 
352  if(ButtonState != OldButtonState) {
353  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
354  OldButtonState = ButtonState;
355  }
356 
357 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
358  for(uint8_t i = 10; i < 58; i++) {
359  D_PrintHex<uint8_t > (l2capinbuf[i], 0x80);
360  Notify(PSTR(" "), 0x80);
361  }
362  Notify(PSTR("\r\n"), 0x80);
363 #endif
364  }
365  }
366  }
367  L2CAP_task();
368  }
369 }
370 
371 void PS3BT::L2CAP_task() {
372  switch(l2cap_state) {
373  case L2CAP_WAIT:
375 #ifdef DEBUG_USB_HOST
376  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
377 #endif
378  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, PENDING);
379  delay(1);
380  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, SUCCESSFUL);
381  identifier++;
382  delay(1);
384  l2cap_state = L2CAP_CONTROL_SUCCESS;
385  }
386  break;
387 
390 #ifdef DEBUG_USB_HOST
391  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
392 #endif
393  l2cap_state = L2CAP_INTERRUPT_SETUP;
394  }
395  break;
396 
399 #ifdef DEBUG_USB_HOST
400  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
401 #endif
402  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, PENDING);
403  delay(1);
404  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, SUCCESSFUL);
405  identifier++;
406  delay(1);
407  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
408 
409  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
410  }
411  break;
412 
414  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
415 #ifdef DEBUG_USB_HOST
416  Notify(PSTR("\r\nHID Interrupt Successfully Configured"), 0x80);
417 #endif
418  if(remote_name_first == 'M') { // First letter in Motion Controller ('M')
419  memset(l2capinbuf, 0, BULK_MAXPKTSIZE); // Reset l2cap in buffer as it sometimes read it as a button has been pressed
420  l2cap_state = TURN_ON_LED;
421  } else
422  l2cap_state = PS3_ENABLE_SIXAXIS;
423  timer = (uint32_t)millis();
424  }
425  break;
426 
427  /* These states are handled in Run() */
428 
431 #ifdef DEBUG_USB_HOST
432  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
433 #endif
434  identifier++;
435  pBtd->l2cap_disconnection_request(hci_handle, identifier, control_scid, control_dcid);
436  l2cap_state = L2CAP_CONTROL_DISCONNECT;
437  }
438  break;
439 
442 #ifdef DEBUG_USB_HOST
443  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
444 #endif
446  hci_handle = -1; // Reset handle
447  l2cap_event_flag = 0; // Reset flags
448  l2cap_state = L2CAP_WAIT;
449  }
450  break;
451  }
452 }
453 
454 void PS3BT::Run() {
455  switch(l2cap_state) {
456  case PS3_ENABLE_SIXAXIS:
457  if((int32_t)((uint32_t)millis() - timer) > 1000) { // loop 1 second before sending the command
458  memset(l2capinbuf, 0, BULK_MAXPKTSIZE); // Reset l2cap in buffer as it sometimes read it as a button has been pressed
459  for(uint8_t i = 15; i < 19; i++)
460  l2capinbuf[i] = 0x7F; // Set the analog joystick values to center position
461  enable_sixaxis();
462  l2cap_state = TURN_ON_LED;
463  timer = (uint32_t)millis();
464  }
465  break;
466 
467  case TURN_ON_LED:
468  if((int32_t)((uint32_t)millis() - timer) > 1000) { // loop 1 second before sending the command
469  if(remote_name_first == 'P') { // First letter in PLAYSTATION(R)3 Controller ('P')
470 #ifdef DEBUG_USB_HOST
471  Notify(PSTR("\r\nDualshock 3 Controller Enabled\r\n"), 0x80);
472 #endif
473  PS3Connected = true;
474  } else if(remote_name_first == 'N') { // First letter in Navigation Controller ('N')
475 #ifdef DEBUG_USB_HOST
476  Notify(PSTR("\r\nNavigation Controller Enabled\r\n"), 0x80);
477 #endif
478  PS3NavigationConnected = true;
479  } else if(remote_name_first == 'M') { // First letter in Motion Controller ('M')
480  timer = (uint32_t)millis();
481 #ifdef DEBUG_USB_HOST
482  Notify(PSTR("\r\nMotion Controller Enabled\r\n"), 0x80);
483 #endif
484  PS3MoveConnected = true;
485  }
486  ButtonState = 0; // Clear all values
487  OldButtonState = 0;
488  ButtonClickState = 0;
489 
490  onInit(); // Turn on the LED on the controller
491  l2cap_state = L2CAP_DONE;
492  }
493  break;
494 
495  case L2CAP_DONE:
496  if(PS3MoveConnected) { // The Bulb and rumble values, has to be send at approximately every 5th second for it to stay on
497  if((int32_t)((uint32_t)millis() - timer) > 4000) { // Send at least every 4th second
498  HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE); // The Bulb and rumble values, has to be written again and again, for it to stay turned on
499  timer = (uint32_t)millis();
500  }
501  }
502  break;
503  }
504 }
505 
506 /************************************************************/
507 /* HID Commands */
508 /************************************************************/
509 
510 // Playstation Sixaxis Dualshock and Navigation Controller commands
511 
512 void PS3BT::HID_Command(uint8_t* data, uint8_t nbytes) {
513  if((int32_t)((uint32_t)millis() - timerHID) <= 150) // Check if is has been more than 150ms since last command
514  delay((uint32_t)(150 - ((uint32_t)millis() - timerHID))); // There have to be a delay between commands
515  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]); // Both the Navigation and Dualshock controller sends data via the control channel
516  timerHID = (uint32_t)millis();
517 }
518 
520  HIDBuffer[3] = 0x00; // Rumble bytes
521  HIDBuffer[4] = 0x00;
522  HIDBuffer[5] = 0x00;
523  HIDBuffer[6] = 0x00;
524 
525  HIDBuffer[11] = 0x00; // LED byte
526 
527  HID_Command(HIDBuffer, HID_BUFFERSIZE);
528 }
529 
531  uint8_t rumbleBuf[HID_BUFFERSIZE];
532  memcpy(rumbleBuf, HIDBuffer, HID_BUFFERSIZE);
533  rumbleBuf[3] = 0x00;
534  rumbleBuf[4] = 0x00;
535  rumbleBuf[5] = 0x00;
536  rumbleBuf[6] = 0x00;
537  HID_Command(rumbleBuf, HID_BUFFERSIZE);
538 }
539 
541  uint8_t power[2] = {0xff, 0x00}; // Defaults to RumbleLow
542  if(mode == RumbleHigh) {
543  power[0] = 0x00;
544  power[1] = 0xff;
545  }
546  setRumbleOn(0xfe, power[0], 0xfe, power[1]);
547 }
548 
549 void PS3BT::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower) {
550  uint8_t rumbleBuf[HID_BUFFERSIZE];
551  memcpy(rumbleBuf, HIDBuffer, HID_BUFFERSIZE);
552  rumbleBuf[3] = rightDuration;
553  rumbleBuf[4] = rightPower;
554  rumbleBuf[5] = leftDuration;
555  rumbleBuf[6] = leftPower;
556  HID_Command(rumbleBuf, HID_BUFFERSIZE);
557 }
558 
559 void PS3BT::setLedRaw(uint8_t value) {
560  HIDBuffer[11] = value << 1;
561  HID_Command(HIDBuffer, HID_BUFFERSIZE);
562 }
563 
565  HIDBuffer[11] &= ~((uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1));
566  HID_Command(HIDBuffer, HID_BUFFERSIZE);
567 }
568 
570  if(a == OFF)
571  setLedRaw(0);
572  else {
573  HIDBuffer[11] |= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
574  HID_Command(HIDBuffer, HID_BUFFERSIZE);
575  }
576 }
577 
579  HIDBuffer[11] ^= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
580  HID_Command(HIDBuffer, HID_BUFFERSIZE);
581 }
582 
583 void PS3BT::enable_sixaxis() { // Command used to enable the Dualshock 3 and Navigation controller to send data via Bluetooth
584  uint8_t cmd_buf[6];
585  cmd_buf[0] = 0x53; // HID BT Set_report (0x50) | Report Type (Feature 0x03)
586  cmd_buf[1] = 0xF4; // Report ID
587  cmd_buf[2] = 0x42; // Special PS3 Controller enable commands
588  cmd_buf[3] = 0x03;
589  cmd_buf[4] = 0x00;
590  cmd_buf[5] = 0x00;
591 
592  HID_Command(cmd_buf, 6);
593 }
594 
595 // Playstation Move Controller commands
596 
597 void PS3BT::HIDMove_Command(uint8_t* data, uint8_t nbytes) {
598  if((int32_t)((uint32_t)millis() - timerHID) <= 150)// Check if is has been less than 150ms since last command
599  delay((uint32_t)(150 - ((uint32_t)millis() - timerHID))); // There have to be a delay between commands
600  pBtd->L2CAP_Command(hci_handle, data, nbytes, interrupt_scid[0], interrupt_scid[1]); // The Move controller sends it's data via the intterrupt channel
601  timerHID = (uint32_t)millis();
602 }
603 
604 void PS3BT::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { // Use this to set the Color using RGB values
605  // Set the Bulb's values into the write buffer
606  HIDMoveBuffer[3] = r;
607  HIDMoveBuffer[4] = g;
608  HIDMoveBuffer[5] = b;
609 
610  HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE);
611 }
612 
613 void PS3BT::moveSetBulb(ColorsEnum color) { // Use this to set the Color using the predefined colors in enum
614  moveSetBulb((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color));
615 }
616 
617 void PS3BT::moveSetRumble(uint8_t rumble) {
618 #ifdef DEBUG_USB_HOST
619  if(rumble < 64 && rumble != 0) // The rumble value has to at least 64, or approximately 25% (64/255*100)
620  Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"), 0x80);
621 #endif
622  // Set the rumble value into the write buffer
623  HIDMoveBuffer[7] = rumble;
624 
625  HIDMove_Command(HIDMoveBuffer, HID_BUFFERSIZE);
626 }
627 
629  if(pFuncOnInit)
630  pFuncOnInit(); // Call the user function
631  else {
632  if(PS3MoveConnected)
633  moveSetBulb(Red);
634  else // Dualshock 3 or Navigation controller
635  setLedOn(static_cast<LEDEnum>(LED1));
636  }
637 }
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
Definition: BTD.h:140
bool incomingWii
Definition: BTD.h:474
Definition: PS3Enums.h:124
@@ -800,6 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
uint8_t my_bdaddr[6]
Definition: BTD.h:452
void setRumbleOn(RumbleEnum mode)
Definition: PS3BT.cpp:540
+
void(* pFuncOnInit)(void)
Definition: BTD.h:609
float get9DOFValues(SensorEnum a)
Definition: PS3BT.cpp:112
const uint8_t PS3_LEDS[]
Definition: PS3Enums.h:43
#define l2cap_check_flag(flag)
Definition: BTD.h:161
@@ -867,7 +231,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s3_b_t_8h.html b/_p_s3_b_t_8h.html index bcfa6707..507e3c7c 100644 --- a/_p_s3_b_t_8h.html +++ b/_p_s3_b_t_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3BT.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -88,21 +89,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3BT.h File Reference
-
#include "BTD.h"
-#include "PS3Enums.h"
+
#include "BTD.h"
+#include "PS3Enums.h"
Include dependency graph for PS3BT.h:
- + + + + + + +
This graph shows which files directly or indirectly include this file:
- + +

Go to the source code of this file.

@@ -137,7 +145,7 @@ Macros diff --git a/_p_s3_b_t_8h__dep__incl.md5 b/_p_s3_b_t_8h__dep__incl.md5 index fd5774bf..80c124ec 100644 --- a/_p_s3_b_t_8h__dep__incl.md5 +++ b/_p_s3_b_t_8h__dep__incl.md5 @@ -1 +1 @@ -bb28c7be8b59850aa707116e8edbd78a \ No newline at end of file +eba794dfcd5eea5cd385cf4d1f0cee96 \ No newline at end of file diff --git a/_p_s3_b_t_8h__dep__incl.png b/_p_s3_b_t_8h__dep__incl.png index e1c830e1bb65fbcef293c398a5c5be3cbf2d7b6e..fabe3366b516e032c70c82134967612ab70aef1b 100644 GIT binary patch literal 2515 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 - - - - - - + + + + + + diff --git a/_p_s3_b_t_8h__incl.md5 b/_p_s3_b_t_8h__incl.md5 index 2a9f54b2..dbb83515 100644 --- a/_p_s3_b_t_8h__incl.md5 +++ b/_p_s3_b_t_8h__incl.md5 @@ -1 +1 @@ -fcbf970a34bdbf333c6b320a0d740460 \ No newline at end of file +90cb54a3b8ad4256770707efdc9f2bdc \ No newline at end of file diff --git a/_p_s3_b_t_8h__incl.png b/_p_s3_b_t_8h__incl.png index 6b3dbd49967acbcfdecee5c987391d6b6e83eed9..e2e8bf73ca3e49fab8d64e0480438845df890384 100644 GIT binary patch literal 15971 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 FzX1NW*fjtE literal 17048 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 - + USB Host Shield 2.0: PS3BT.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0

- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -85,114 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3BT.h
-Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
-
2 
-
3  This software may be distributed and modified under the terms of the GNU
-
4  General Public License version 2 (GPL2) as published by the Free Software
-
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
-
6  this file. Please note that GPL2 Section 2[b] requires that all works based
-
7  on this software must also be made publicly available under the terms of
-
8  the GPL2 ("Copyleft").
-
9 
-
10  Contact information
-
11  -------------------
-
12 
-
13  Kristian Lauszus, TKJ Electronics
-
14  Web : http://www.tkjelectronics.com
-
15  e-mail : kristianl@tkjelectronics.com
-
16  */
-
17 
-
18 #ifndef _ps3bt_h_
-
19 #define _ps3bt_h_
-
20 
-
21 #include "BTD.h"
-
22 #include "PS3Enums.h"
-
23 
-
24 #define HID_BUFFERSIZE 50 // Size of the buffer for the Playstation Motion Controller
-
25 
-
32 class PS3BT : public BluetoothService {
-
33 public:
-
41  PS3BT(BTD *pBtd, uint8_t btadr5 = 0, uint8_t btadr4 = 0, uint8_t btadr3 = 0, uint8_t btadr2 = 0, uint8_t btadr1 = 0, uint8_t btadr0 = 0);
-
42 
-
45  void disconnect();
-
59  bool getButtonPress(ButtonEnum b);
-
60  bool getButtonClick(ButtonEnum b);
-
71  uint8_t getAnalogButton(ButtonEnum a);
-
77  uint8_t getAnalogHat(AnalogHatEnum a);
-
86  int16_t getSensor(SensorEnum a);
-
92  float getAngle(AngleEnum a);
-
98  float get9DOFValues(SensorEnum a);
-
104  bool getStatus(StatusEnum c);
-
106  void printStatusString();
-
111  String getTemperature();
-
112 
-
114  void setAllOff();
-
116  void setRumbleOff();
-
121  void setRumbleOn(RumbleEnum mode);
-
129  void setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower);
-
130 
-
135  void setLedRaw(uint8_t value);
-
136 
-
138  void setLedOff() {
-
139  setLedRaw(0);
-
140  };
-
145  void setLedOff(LEDEnum a);
-
150  void setLedOn(LEDEnum a);
-
155  void setLedToggle(LEDEnum a);
-
156 
-
161  void moveSetBulb(uint8_t r, uint8_t g, uint8_t b);
-
166  void moveSetBulb(ColorsEnum color);
-
171  void moveSetRumble(uint8_t rumble);
-
172 
-
174  uint32_t getLastMessageTime() {
-
175  return lastMessageTime;
-
176  };
-
180  bool PS3Connected;
- - -
185 
-
186 protected:
-
192  void ACLData(uint8_t* ACLData);
-
194  void Run();
-
196  void Reset();
-
202  void onInit();
-
205 private:
-
206 
-
207  void L2CAP_task(); // L2CAP state machine
-
208 
-
209  /* Variables filled from HCI event management */
-
210  char remote_name_first; // First letter in remote name
-
211  bool activeConnection; // Used to indicate if it's already has established a connection
-
212 
-
213  /* Variables used by high level L2CAP task */
-
214  uint8_t l2cap_state;
-
215 
-
216  uint32_t lastMessageTime; // Variable used to store the millis value of the last message.
-
217 
-
218  uint32_t ButtonState;
-
219  uint32_t OldButtonState;
-
220  uint32_t ButtonClickState;
-
221 
-
222  uint32_t timer; // Timer used to limit time between messages and also used to continuously set PS3 Move controller Bulb and rumble values
-
223  uint32_t timerHID; // Timer used see if there has to be a delay before a new HID command
-
224 
-
225  uint8_t l2capinbuf[BULK_MAXPKTSIZE]; // General purpose buffer for L2CAP in data
-
226  uint8_t HIDBuffer[HID_BUFFERSIZE]; // Used to store HID commands
-
227  uint8_t HIDMoveBuffer[HID_BUFFERSIZE]; // Used to store HID commands for the Move controller
-
228 
-
229  /* L2CAP Channels */
-
230  uint8_t control_scid[2]; // L2CAP source CID for HID_Control
-
231  uint8_t control_dcid[2]; // 0x0040
-
232  uint8_t interrupt_scid[2]; // L2CAP source CID for HID_Interrupt
-
233  uint8_t interrupt_dcid[2]; // 0x0041
-
234 
-
235  /* HID Commands */
-
236  void HID_Command(uint8_t* data, uint8_t nbytes);
-
237  void HIDMove_Command(uint8_t* data, uint8_t nbytes);
-
238  void enable_sixaxis(); // Command used to enable the Dualshock 3 and Navigation controller to send data via Bluetooth
-
239 };
-
240 #endif
-
bool PS3NavigationConnected
Definition: PS3BT.h:184
+Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16  */
17 
18 #ifndef _ps3bt_h_
19 #define _ps3bt_h_
20 
21 #include "BTD.h"
22 #include "PS3Enums.h"
23 
24 #define HID_BUFFERSIZE 50 // Size of the buffer for the Playstation Motion Controller
25 
32 class PS3BT : public BluetoothService {
33 public:
41  PS3BT(BTD *pBtd, uint8_t btadr5 = 0, uint8_t btadr4 = 0, uint8_t btadr3 = 0, uint8_t btadr2 = 0, uint8_t btadr1 = 0, uint8_t btadr0 = 0);
42 
45  void disconnect();
59  bool getButtonPress(ButtonEnum b);
60  bool getButtonClick(ButtonEnum b);
71  uint8_t getAnalogButton(ButtonEnum a);
77  uint8_t getAnalogHat(AnalogHatEnum a);
86  int16_t getSensor(SensorEnum a);
92  float getAngle(AngleEnum a);
98  float get9DOFValues(SensorEnum a);
104  bool getStatus(StatusEnum c);
106  void printStatusString();
111  String getTemperature();
112 
114  void setAllOff();
116  void setRumbleOff();
121  void setRumbleOn(RumbleEnum mode);
129  void setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower);
130 
135  void setLedRaw(uint8_t value);
136 
138  void setLedOff() {
139  setLedRaw(0);
140  };
145  void setLedOff(LEDEnum a);
150  void setLedOn(LEDEnum a);
155  void setLedToggle(LEDEnum a);
156 
161  void moveSetBulb(uint8_t r, uint8_t g, uint8_t b);
166  void moveSetBulb(ColorsEnum color);
171  void moveSetRumble(uint8_t rumble);
172 
174  uint32_t getLastMessageTime() {
175  return lastMessageTime;
176  };
180  bool PS3Connected;
185 
186 protected:
192  void ACLData(uint8_t* ACLData);
194  void Run();
196  void Reset();
202  void onInit();
205 private:
206 
207  void L2CAP_task(); // L2CAP state machine
208 
209  /* Variables filled from HCI event management */
210  char remote_name_first; // First letter in remote name
211  bool activeConnection; // Used to indicate if it's already has established a connection
212 
213  /* Variables used by high level L2CAP task */
214  uint8_t l2cap_state;
215 
216  uint32_t lastMessageTime; // Variable used to store the millis value of the last message.
217 
218  uint32_t ButtonState;
219  uint32_t OldButtonState;
220  uint32_t ButtonClickState;
221 
222  uint32_t timer; // Timer used to limit time between messages and also used to continuously set PS3 Move controller Bulb and rumble values
223  uint32_t timerHID; // Timer used see if there has to be a delay before a new HID command
224 
225  uint8_t l2capinbuf[BULK_MAXPKTSIZE]; // General purpose buffer for L2CAP in data
226  uint8_t HIDBuffer[HID_BUFFERSIZE]; // Used to store HID commands
227  uint8_t HIDMoveBuffer[HID_BUFFERSIZE]; // Used to store HID commands for the Move controller
228 
229  /* L2CAP Channels */
230  uint8_t control_scid[2]; // L2CAP source CID for HID_Control
231  uint8_t control_dcid[2]; // 0x0040
232  uint8_t interrupt_scid[2]; // L2CAP source CID for HID_Interrupt
233  uint8_t interrupt_dcid[2]; // 0x0041
234 
235  /* HID Commands */
236  void HID_Command(uint8_t* data, uint8_t nbytes);
237  void HIDMove_Command(uint8_t* data, uint8_t nbytes);
238  void enable_sixaxis(); // Command used to enable the Dualshock 3 and Navigation controller to send data via Bluetooth
239 };
240 #endif
bool PS3NavigationConnected
Definition: PS3BT.h:184
bool getStatus(StatusEnum c)
Definition: PS3BT.cpp:156
void Run()
Definition: PS3BT.cpp:454
Definition: BTD.h:201
@@ -242,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s3_enums_8h.html b/_p_s3_enums_8h.html index 2beaa776..4849fb7d 100644 --- a/_p_s3_enums_8h.html +++ b/_p_s3_enums_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3Enums.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -89,20 +90,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3Enums.h File Reference
-
#include "controllerEnums.h"
+
#include "controllerEnums.h"
Include dependency graph for PS3Enums.h:
- + +
This graph shows which files directly or indirectly include this file:
- + + + + +

Go to the source code of this file.

@@ -116,32 +122,32 @@ Macros -

Enumerations

enum  StatusEnum {
+
enum  StatusEnum {
  Plugged = (38 << 8) | 0x02, Unplugged = (38 << 8) | 0x03, Charging = (39 << 8) | 0xEE, NotCharging = (39 << 8) | 0xF1, -
+
  Shutdown = (39 << 8) | 0x01, Dying = (39 << 8) | 0x02, Low = (39 << 8) | 0x03, High = (39 << 8) | 0x04, -
+
  Full = (39 << 8) | 0x05, MoveCharging = (21 << 8) | 0xEE, MoveNotCharging = (21 << 8) | 0xF1, MoveShutdown = (21 << 8) | 0x01, -
+
  MoveDying = (21 << 8) | 0x02, MoveLow = (21 << 8) | 0x03, MoveHigh = (21 << 8) | 0x04, MoveFull = (21 << 8) | 0x05, -
+
  CableRumble = (40 << 8) | 0x10, Cable = (40 << 8) | 0x12, BluetoothRumble = (40 << 8) | 0x14, Bluetooth = (40 << 8) | 0x16 -
+
}
 
@@ -198,45 +204,45 @@ Variables
- - - - - - - - - - - - - - - - - - - -
Enumerator
Plugged  +
Enumerator
Plugged 
Unplugged  +
Unplugged 
Charging  +
Charging 
NotCharging  +
NotCharging 
Shutdown  +
Shutdown 
Dying  +
Dying 
Low  +
Low 
High  +
High 
Full  +
Full 
MoveCharging  +
MoveCharging 
MoveNotCharging  +
MoveNotCharging 
MoveShutdown  +
MoveShutdown 
MoveDying  +
MoveDying 
MoveLow  +
MoveLow 
MoveHigh  +
MoveHigh 
MoveFull  +
MoveFull 
CableRumble  +
CableRumble 
Cable  +
Cable 
BluetoothRumble  +
BluetoothRumble 
Bluetooth  +
Bluetooth 
@@ -254,18 +260,7 @@ Variables
-Initial value:
= {
-
0x00, 0x00, 0x00, 0x00, 0x00,
-
0x00, 0x00, 0x00, 0x00, 0x00,
-
0xff, 0x27, 0x10, 0x00, 0x32,
-
0xff, 0x27, 0x10, 0x00, 0x32,
-
0xff, 0x27, 0x10, 0x00, 0x32,
-
0xff, 0x27, 0x10, 0x00, 0x32,
-
0x00, 0x00, 0x00, 0x00, 0x00,
-
0x00, 0x00, 0x00, 0x00, 0x00,
-
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-
}
-

Report buffer for all PS3 commands

+Initial value:
= {
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0x27, 0x10, 0x00, 0x32,
0xff, 0x27, 0x10, 0x00, 0x32,
0xff, 0x27, 0x10, 0x00, 0x32,
0xff, 0x27, 0x10, 0x00, 0x32,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}

Report buffer for all PS3 commands

Definition at line 27 of file PS3Enums.h.

@@ -280,21 +275,7 @@ Variables
-Initial value:
= {
-
0x00,
-
0x01,
-
0x02,
-
0x04,
-
0x08,
-
-
0x09,
-
0x0A,
-
0x0C,
-
0x0D,
-
0x0E,
-
0x0F,
-
}
-

Used to set the LEDs on the controllers

+Initial value:
= {
0x00,
0x01,
0x02,
0x04,
0x08,
0x09,
0x0A,
0x0C,
0x0D,
0x0E,
0x0F,
}

Used to set the LEDs on the controllers

Definition at line 43 of file PS3Enums.h.

@@ -309,32 +290,7 @@ Variables
-Initial value:
= {
-
0x10,
-
0x20,
-
0x40,
-
0x80,
-
-
0x01,
-
0x08,
-
0x02,
-
0x04,
-
-
0x0100,
-
0x0200,
-
0x0400,
-
0x0800,
-
-
0x1000,
-
0x2000,
-
0x4000,
-
0x8000,
-
-
0x010000,
-
0x080000,
-
0x100000,
-
}
-

Buttons on the controllers. Note: that the location is shifted 9 when it's connected via USB.

+Initial value:
= {
0x10,
0x20,
0x40,
0x80,
0x01,
0x08,
0x02,
0x04,
0x0100,
0x0200,
0x0400,
0x0800,
0x1000,
0x2000,
0x4000,
0x8000,
0x010000,
0x080000,
0x100000,
}

Buttons on the controllers. Note: that the location is shifted 9 when it's connected via USB.

Definition at line 62 of file PS3Enums.h.

@@ -349,27 +305,7 @@ Variables
-Initial value:
= {
-
23,
-
24,
-
25,
-
26,
-
0, 0, 0, 0,
-
-
27,
-
28,
-
29,
-
30,
-
31,
-
32,
-
33,
-
34,
-
0, 0,
-
-
-
15,
-
}
-

Analog buttons on the controllers. Note: that the location is shifted 9 when it's connected via USB.

+Initial value:
= {
23,
24,
25,
26,
0, 0, 0, 0,
27,
28,
29,
30,
31,
32,
33,
34,
0, 0,
15,
}

Analog buttons on the controllers. Note: that the location is shifted 9 when it's connected via USB.

Definition at line 92 of file PS3Enums.h.

@@ -380,7 +316,7 @@ Variables diff --git a/_p_s3_enums_8h__dep__incl.map b/_p_s3_enums_8h__dep__incl.map index e82ffee3..763a7d9c 100644 --- a/_p_s3_enums_8h__dep__incl.map +++ b/_p_s3_enums_8h__dep__incl.map @@ -1,6 +1,6 @@ - - + + - + diff --git a/_p_s3_enums_8h__dep__incl.md5 b/_p_s3_enums_8h__dep__incl.md5 index 1a523eaa..7e6c593e 100644 --- a/_p_s3_enums_8h__dep__incl.md5 +++ b/_p_s3_enums_8h__dep__incl.md5 @@ -1 +1 @@ -632aeb814444892cb4235318575b2052 \ No newline at end of file +2ee6fe4e5f4f5bb8864f711284e44ace \ No newline at end of file diff --git a/_p_s3_enums_8h__dep__incl.png b/_p_s3_enums_8h__dep__incl.png index 5397db6c9700fc0e8e0e83765f3b5c8fa4ae1d56..db1f5fde22e04e76066a7ec72e46f3ef884d6da9 100644 GIT binary patch literal 6765 zcmb`MbzD?mxA0Lw6c8As89+cnKvG~N6$XZGk&+q^qKKH+O>da@Kv)5XC?X}PTu605+)L{1s=?HOfaPBKAK(&D567a3N zdk6USjFs5{4tLCzVNjf#zwfMuf;b!;Iu=Ff3mwn2-C18f9rr1MgZ*S`nmJm9JS}Z) z!=rnT4!;b2MERCrw6xSCT2jTkL*``c*UtnQ#=-5mc;>oxZ8Uz_{4C_C&dP5+WB%E?)H*SS2L3ScK&b_R z6G)~6mBIT!9!qvB3;GC(W8p)vK!}fz&&kQTAWm!^tivVe;UN-C!qA1_tpA+^<>BIL zNfLl#NrK$8b#wytE8b|b{APInJ%U!~PHDp_-Mm?hLs(cCmgEK52F?EnJVOINj}l>J;iE30aZk z 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 literal 7621 zcmY*;1z1&EwDqAu={z)ofFhC-(p@6mjdYjN-G>foDUnhnrAr#5yIZ;?Bo6Q|?)~3; z-~IRw3-+0N?>X0+YtAvof+;CTV?82!1c5-XWMw2&z_<)Pjp(T0_r|9;MqogF_eNR* za{us?(_EMcflzwNN{Fhte>%wYQX{mOI?Ud+KYSJbhzVKZvlC`Kd-w~2*4G9aQjSeM zFf!$U)SSMwpAsmQflgKemFBc*bl0!DACp-$1xOLJ_DU!#lS<;#p#?=C5F#TJif&99 zY5w)PGumDq6LA}V`$6+)S*M!#gV*2ErSoG0*JgDJlc)fi@Vm`a2}>OGcAY0Dc)=oZ zm*`?NGTz8fa5-`*w^={u<;7=bv;H7Q_GdTgHkz-o6Kj0J`>8t0)tMqJ#n6|Oii%3C z@!h0==NWpf!*XcSf~%m@fVH&{M628gp+G*3_6NDfU{@r`$*e^-#zCmIh>uVpE;>H7 zC^|AMmIgVnQyLf1SRIMwn(f2x1omD`Obj|Yy2$(YuR^iNQ6Wmt2xnUTggH1lm34I= zySceFoph6HRhnYh+S#4gjAlJ1VL3ZMl<%AT-n{*!=t3cf~CzR9mT4D(`XwXuL{Cyzs@nYz`=yFL6Fd}J99*X*qndMbar;GOnuk2w6;cs z=(Tv0#>dA)xvU9MF`+rdq-A>bpP#S)?n|umzT)7vn+p~X!!{nt5uIuBa3LYjBoTwh zU7m^1THV&GF%kJs6>Qfo`$jf2@C~vfARx%ReLGpQ_4~I`cNFR6WSK7t4-XG~6~|A+ z*f@8HyHFuB!ewjdiGTow%jSTnoZKVGN?Q;bW%~Eb>4)!*TJNb=S65Sc9H_9Vg`&>R z-ZL9CK{+jkI$L~hUiFxpnXN9mElWB&vWba{$7f|Nv2q#CgTTBc7|2Q(TNeL_{PbC)d6`n)f879|2NPQPJDi*QV>x95OSb^`)R-ZM7qe z@|TQ^%+Im>H@O<$lvP!Osw{?SX=rjHqleyju^6^QwcZ{$Xw^H@yB^GiTwi-;!drcB z`C8zA-jrxnAbMTww@rT2tZ+Lr@IG!s<8@qt?C$Q4EG$G}k#id@HF?O$%C=RS^_P2` zngh4obPsWa;r@bN7c?v^*nNF{ly_IS4dOm6RPIO3e_#3an{r&<+?Xsjd`Pzw6%_>& z+Qr%m544#sT^&f{oN4yrSzBKR>E!VK+1^Zr$xOWqBLxKo-vr-*-H*as|NbVA)0O@G zsJJ*>?~^VPzUBQ$;+KJWd31q6LGh`n;UgnTynKA`uFrNZ_YChNKs0rAb^h$AAz}!+ zy1Me&LX@fn@&TEd`ehq;7qzV@khiaced8`Ya|)H4H#f~q&CHB{eS8k(G{*!h9Aws? zY6unmR+hH5uZnCxTNKUCqOGm1Ij;Of*q^OJ!=V!J&&VJz00|!+ zjy}l#P2+nz*o_sQ=hol>?-uHu!lR=n_wSE8aH^9RbrTjRCy9<)ZdhFRX99xIaMoh| z;BWvODdK| zqUqm@3n>qe`Vo6eNd|KCdiaM|+?y*`r@w@f%xw5E6%+!B%7zh#h1nCry1VA*$w9RO z_4n0OqABZ(7f2=pCCOXE9#84>L8(KZnU8G`d7S3M!bwL*aB-2hvU7!9V=ov9EZWMd zPQ}`7x~jHpb>?aAHzyhm-T%;d~iuxfNC`of~SV}{628~SUy5Lu$KEzZInSA_#Y-(h3 z^5+xQp=)c_@VmddxFl|bSXeKm>JZzt;x4b_#|ux7ulF!yWUmmS*pHjYAUSGZ*}N`z z^JdcoZ>E))bhoZfn#iKqzkGp*!w3i*uis~l?&JCdbxz|>rlGVl{bC{$cV z9+_jbiH(jXJl$-zo|s*w=rKNA(0r08%WvyY<#T=ZR{m3}e-K(3*&su%@KYfIWqtkF z-rn2rNdAcKZsOx6xjiSj{70PT$d-%KB<2I?+fxj~-(L9)1Dm4KsRKL9V5cW1Y2jQp zDsjoKNd6ZoeaDxP7(h9$hOcWg1K zg`nKrWA?EX74d6>JV;OCq4yyY_!wb4%b5G4E%FQ@Wk*I2hI#Xho?)F9v<9A5&sYrL z(9=y6*ZFK!CiPVQzv_usY;N{B<`Y$%AhbL9NuA@WNz>VwQsR}!dmPws@XTyq`3IY4 z#LTIXn01;YSHjhi+*0>*b?U@f9L%#e@DF8;Y(52VOh+RuFw7_ucy~&p5=2APZ@k;59Wv0 zJ7GBNzD;E#hn5@H=OB4oDV3F5#pMUy=Pp)oZ?{>ig8ZXONEmu|FgI)dLI464ULrX; zsfzpfG3Ip3;qgJtq$pQ*{PX7?QOozfj~NtwG5Fm=!DWS}`@3bQ9TfzHY=h|44m6B| zm}$-Tnd@j=n4vpe(OV@KyhmuNRtH-T^=?Hx3#rtSf-R9Si6!X z*43FjV=e1iYVLn2;sD6Avq0>xAtA41)oOFNC;C zJAk1AtgynTx|oizsu0&6CSVt^u%J?+?}hk6LtaXz_k~!a3EOyKtfcAhr=302J<;T5 zVvTg3MZ?q5);8pL_P()k%<A-QTuuwz>c>><`3Jfv|F(R%P`k+{W z8M1tGLfTvJQXBvAqx}W!y|~qzpANHP81AZ~K0-+4oe~YXN{CCQN(uUgbND+J6+y*txmTVI0&B+?Vj$4 z=+Z9Ed(p&DRm1=Fqev;cj0Zegpsc%8e@*5K`6K$3=*aUWS-!Dk8ASzRP4GGp;7k?c zC;Ve6|ITTot>H-ic>8By*Mm7h2Gff5_h{Pa`t06@2n3sp?46zSw2}KE8w9;xxG(YH z?}UyCA^7c1NSD{v;?2>&2}ITVfk)zoX=XMB;{JGnaanDnh<*^$CAzlPx!N(Skp`~T zAj9M7W_g{1@sF=XWG`G7>Xbt-FV{6P{=Fl`umHKKR4MytS&6pUK?%{op=cOQiFOeR z{`A{sL82dvMxkFh@7V2{PL_#{&6b3{r^6+Dg_!LP7DB&#SBRQ^>@AWBCcu(7rsgV$ zEodb?eG0Jm<6;<>1{F&P538`$d=z&q520W2>S5|~yL9A^p}xle(|)`b31|VGjt;@` z;g_rcekoYGNeq8_T}CSaZ#~{ATwWQ!bpIxlKNVgW^N@~gW0?fEp; z>qYB2&vT|4+gU^;zfB==Ck`yB@VyEl!TGCzCOFn6f+?SiA{`^rKO0xJf>6>6aftlEsBim(cW~K zw2MoXDEGp`Lb>Crn3|?05=2EsrGaAHw{LK8Qpa3bIo`<^`EgF`+Lr^KgC>0v{^l+{ z>YLlQtyA9G+S)}WB@&X7C@lI7$kjU0`EOFJFQg?UpD;3_^~6$3TUkB7I9!ZOWK^W( z=GJhDQYr3C=dxMZ*gyer58%;-W-rZe(EwY2Zfc@XR#t}i*Sl0mlnx{l2inMTZPxGYO(AL&= z25`Mb%vn-D@`B}?d zxa!UFkMB_zH6N<;6bI(B$5T={7y^Y1y`U!OSXhz<2LDh4bPSBqGcE`XEv;B0K9t)Q z3KE6y(>Rs1w6uhj)aQ~C%vdTxjv1bqbxa{mTPU4^kdTmm==JI8>6661m4k!tDVamt zWG*h@#k1kVv$Lee#>QGdEb+$1#vG591Oe}P!oYwUNy0isQK(XkOF|L`JXBLtqj~-u zgMd+CV!y1kR7zc)=FGtCZVj94jOC+0ejJpUnQ7qazhq)x!_M_%C^$ZYGpf4gh{ty3Cn6$ZYETf; z>G`=CwI7^a^%-Hh384Pk?(V!^t05$*k&%xxI4!VWym&D_W7#V66rUIucf_nNz2Yz< zGxK)eu9>HEYTvZv$Vr7M$@X+}(DrP5bYN*I>+0&NqS|JWX9)3TbQJ8^dJecw>Bu22 z>hbMg5BI-|K2ZJ(luxg#q%7U!qj`n!3e>*FCH$d-tV|SVqg;fteT*bI5}`%-^XHe- zjcdrrVJd}k_|e&pfPmN3oV>?zPI61ANdQ~-0|K_@0t`XY*|}hZCGElLX8^NI{`b== zTiY+ZJ~}sWp?2@S;W7z3J39ZVRgi7x|(cu)=gQ{VhN`6IVmb?K2D~gJAP|YMsb+Hj->rv*Wcq+PQALgGE&PO zOcP8J)}oV zyv`EX5z5a|`!mye@0{Y>3@w*ADW1giyT2hSQd>j|-kRifJ4}8S#J~W^0SZUjj~)|i zn+(Upg#+I|MfbpXu|+>1BBF4G7pQ3Y<<&`6#A)(hWd&bx3HIO!FA&V=erB92gnm)M z=H|YK6#}lLQj8qM4j;aU3kL{t384;K<0g#eg}vLGQu^`Z*wWH6KrSCJPq&e=c9Vfr zW2Is!8JUi74zFcg;?E^~!IMAzS>?4U#w#KgynJ(F#lKI+75|=0>8?KzqnMZ)N9Rg$ zqZP+oeJ;MwX_Mv78_R9bj>APfu|~18061I@NPgy~=DvaPbT=1PJe<-LRb&v6Tz70Q zFY??)n(J^qdmKnn+4KRycyg3w=k!8Ja8S_q5qn&p&aQlQZ@WcQb~>_?=Y(=!uO$2v z6DfIPsv^*yN<3}Za&)9Q(dGle0VhBdcymOFz>K{n94UF6Ekr%({VwO_Fk`~3{UR;?iSi&L!*6G=A~ox`dR-ARozps} z@t2)#ew$}7FY};hozgx+POJM13_?zSZzP@wg@|GB^QTRbl;J0bRS%exgk0(r5{w!} zYLzF??tjLk7F?vIDly}31UGV$b%y+Fvb`a@)TCa9|Ho3u+q@<8vzvMvcTLFTp(zi*i zhWEwherjrj0R8~p;`A{&`Q6b{Gq1;=r|(QmxO$!?$pJ4=4Gaw8`ZqwAZd+`0tDfWa zx?lz<4v&Zk1(M3|#=`XCg|fCbtfYh)GE$n zm-^Nxe29jY){L>PhsSHApIL%l00`Rt^haRk=Wpy_Phru22ikl3`Ij$GH@CKWeBme3 z8tUp@?HwJn4`8P{J}s>eVCBY3RV}UFA9~5!6-I4{HQ-alWLU&&JzpA0>2rvYyTd>w z{dR0CQ7#{n(`N^SQlp+2%A(@pQ3_70v8M~Ieuh<9@$ms0{V68x!5E+kqCXrwBqomM z0hI?Q2)^z?1u%D5Y%I>g;vya~acH4pHX-C{bep?{g+5!zte`q>?^NqZ`DG)XH zx3c}rJv==2tEUZ2KypwH;b3E%qoAOGNz90*c%5K3Q=Z%7b8S@01<;*xO1dHm|Mdbv z6bAX}p|wz6c-bvj-;M`ly&=8nk!5CKQ3XyXDm4u}LI84h-5$wh*`Q}&;D8Lw&ZZFo zN>YvBUtd>eiS>nLja<<46~EJ3u=(x9!F>98&8gqrmBrv4$a!w(-@R0ScY^98%7oX7 zA}`-p^V2ChqGiWXeI>)ZBbtIi9w3h~W}d-`BMT6#VjXHfErx105Nt-&B>AmAC{1LEuQr zCPuYbEj%((TvQZ+iHQlwI>8SSUubG-=6(J8NL^k1*~^z*U~RD-931Kz8~1)oJ3DiL zErJTss<9=VD%A(|$YE`BFyj&^%#H6i@6QT_bBl`5r%Uz4y}iA|p8UGScY|?!m0zKnQSgc~#YTKlaFtpz#I!kse8V@1R1r&ioNMx2+L40vc#* z3%I(zu8bAFs}ol@Ff<%~*mjRun||u)>CFIiqou8#)-81-NgH48@9)pjF&gz@dEfTP z!o`I%5(YB{6ErY6ne@`2DOJ$p&zFuX0H19EptL<+X=7$$ig->K@sJ<%-29|_UKB}k z^z%&~oDca_Ra+5TKFjrktQK9U>->^WiiGO;Sp1IJPIq}o!le*$_Fk$UQ%6UJ0 z6Y2_mu17BB)2)BS7Wb2o7sPn*obXBwyW&3_Ci1PWtpz5%(A;f~E!PWWkp&}4V&JzAkanrjr#rYM@=e~uad!QOEQ jybM1Gkc~r3@BLuB9R{crh*aQQ79uODAW - + diff --git a/_p_s3_enums_8h__incl.md5 b/_p_s3_enums_8h__incl.md5 index 1892a863..a2b68ead 100644 --- a/_p_s3_enums_8h__incl.md5 +++ b/_p_s3_enums_8h__incl.md5 @@ -1 +1 @@ -8cf971386ed8276013189d149241a27d \ No newline at end of file +1b975049347183489796e6dc1da09be9 \ No newline at end of file diff --git a/_p_s3_enums_8h__incl.png b/_p_s3_enums_8h__incl.png index 69fd697046c459adb6d49ea3bf37d337ee639cde..b70aa1bfa9f6066979624155a819c4e231c80352 100644 GIT binary patch literal 2680 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 diff --git a/_p_s3_enums_8h_source.html b/_p_s3_enums_8h_source.html index 593cf160..a57c8678 100644 --- a/_p_s3_enums_8h_source.html +++ b/_p_s3_enums_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3Enums.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -85,136 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3Enums.h
-Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
-
2 
-
3  This software may be distributed and modified under the terms of the GNU
-
4  General Public License version 2 (GPL2) as published by the Free Software
-
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
-
6  this file. Please note that GPL2 Section 2[b] requires that all works based
-
7  on this software must also be made publicly available under the terms of
-
8  the GPL2 ("Copyleft").
-
9 
-
10  Contact information
-
11  -------------------
-
12 
-
13  Kristian Lauszus, TKJ Electronics
-
14  Web : http://www.tkjelectronics.com
-
15  e-mail : kristianl@tkjelectronics.com
-
16  */
-
17 
-
18 #ifndef _ps3enums_h
-
19 #define _ps3enums_h
-
20 
-
21 #include "controllerEnums.h"
-
22 
-
24 #define PS3_REPORT_BUFFER_SIZE 48
-
25 
-
27 const uint8_t PS3_REPORT_BUFFER[PS3_REPORT_BUFFER_SIZE] PROGMEM = {
-
28  0x00, 0x00, 0x00, 0x00, 0x00,
-
29  0x00, 0x00, 0x00, 0x00, 0x00,
-
30  0xff, 0x27, 0x10, 0x00, 0x32,
-
31  0xff, 0x27, 0x10, 0x00, 0x32,
-
32  0xff, 0x27, 0x10, 0x00, 0x32,
-
33  0xff, 0x27, 0x10, 0x00, 0x32,
-
34  0x00, 0x00, 0x00, 0x00, 0x00,
-
35  0x00, 0x00, 0x00, 0x00, 0x00,
-
36  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-
37 };
-
38 
-
40 #define MOVE_REPORT_BUFFER_SIZE 7
-
41 
-
43 const uint8_t PS3_LEDS[] PROGMEM = {
-
44  0x00, // OFF
-
45  0x01, // LED1
-
46  0x02, // LED2
-
47  0x04, // LED3
-
48  0x08, // LED4
-
49 
-
50  0x09, // LED5
-
51  0x0A, // LED6
-
52  0x0C, // LED7
-
53  0x0D, // LED8
-
54  0x0E, // LED9
-
55  0x0F, // LED10
-
56 };
-
57 
-
62 const uint32_t PS3_BUTTONS[] PROGMEM = {
-
63  0x10, // UP
-
64  0x20, // RIGHT
-
65  0x40, // DOWN
-
66  0x80, // LEFT
-
67 
-
68  0x01, // SELECT
-
69  0x08, // START
-
70  0x02, // L3
-
71  0x04, // R3
-
72 
-
73  0x0100, // L2
-
74  0x0200, // R2
-
75  0x0400, // L1
-
76  0x0800, // R1
-
77 
-
78  0x1000, // TRIANGLE
-
79  0x2000, // CIRCLE
-
80  0x4000, // CROSS
-
81  0x8000, // SQUARE
-
82 
-
83  0x010000, // PS
-
84  0x080000, // MOVE - covers 12 bits - we only need to read the top 8
-
85  0x100000, // T - covers 12 bits - we only need to read the top 8
-
86 };
-
87 
-
92 const uint8_t PS3_ANALOG_BUTTONS[] PROGMEM = {
-
93  23, // UP_ANALOG
-
94  24, // RIGHT_ANALOG
-
95  25, // DOWN_ANALOG
-
96  26, // LEFT_ANALOG
-
97  0, 0, 0, 0, // Skip SELECT, L3, R3 and START
-
98 
-
99  27, // L2_ANALOG
-
100  28, // R2_ANALOG
-
101  29, // L1_ANALOG
-
102  30, // R1_ANALOG
-
103  31, // TRIANGLE_ANALOG
-
104  32, // CIRCLE_ANALOG
-
105  33, // CROSS_ANALOG
-
106  34, // SQUARE_ANALOG
-
107  0, 0, // Skip PS and MOVE
-
108 
-
109  // Playstation Move Controller
-
110  15, // T_ANALOG - Both at byte 14 (last reading) and byte 15 (current reading)
-
111 };
-
112 
- -
114  // Note that the location is shifted 9 when it's connected via USB
-
115  // Byte location | bit location
-
116  Plugged = (38 << 8) | 0x02,
-
117  Unplugged = (38 << 8) | 0x03,
-
118 
-
119  Charging = (39 << 8) | 0xEE,
-
120  NotCharging = (39 << 8) | 0xF1,
-
121  Shutdown = (39 << 8) | 0x01,
-
122  Dying = (39 << 8) | 0x02,
-
123  Low = (39 << 8) | 0x03,
-
124  High = (39 << 8) | 0x04,
-
125  Full = (39 << 8) | 0x05,
-
126 
-
127  MoveCharging = (21 << 8) | 0xEE,
-
128  MoveNotCharging = (21 << 8) | 0xF1,
-
129  MoveShutdown = (21 << 8) | 0x01,
-
130  MoveDying = (21 << 8) | 0x02,
-
131  MoveLow = (21 << 8) | 0x03,
-
132  MoveHigh = (21 << 8) | 0x04,
-
133  MoveFull = (21 << 8) | 0x05,
-
134 
-
135  CableRumble = (40 << 8) | 0x10, // Operating by USB and rumble is turned on
-
136  Cable = (40 << 8) | 0x12, // Operating by USB and rumble is turned off
-
137  BluetoothRumble = (40 << 8) | 0x14, // Operating by Bluetooth and rumble is turned on
-
138  Bluetooth = (40 << 8) | 0x16, // Operating by Bluetooth and rumble is turned off
-
139 };
-
140 
-
141 #endif
-
Definition: PS3Enums.h:124
+Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16  */
17 
18 #ifndef _ps3enums_h
19 #define _ps3enums_h
20 
21 #include "controllerEnums.h"
22 
24 #define PS3_REPORT_BUFFER_SIZE 48
25 
27 const uint8_t PS3_REPORT_BUFFER[PS3_REPORT_BUFFER_SIZE] PROGMEM = {
28  0x00, 0x00, 0x00, 0x00, 0x00,
29  0x00, 0x00, 0x00, 0x00, 0x00,
30  0xff, 0x27, 0x10, 0x00, 0x32,
31  0xff, 0x27, 0x10, 0x00, 0x32,
32  0xff, 0x27, 0x10, 0x00, 0x32,
33  0xff, 0x27, 0x10, 0x00, 0x32,
34  0x00, 0x00, 0x00, 0x00, 0x00,
35  0x00, 0x00, 0x00, 0x00, 0x00,
36  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
37 };
38 
40 #define MOVE_REPORT_BUFFER_SIZE 7
41 
43 const uint8_t PS3_LEDS[] PROGMEM = {
44  0x00, // OFF
45  0x01, // LED1
46  0x02, // LED2
47  0x04, // LED3
48  0x08, // LED4
49 
50  0x09, // LED5
51  0x0A, // LED6
52  0x0C, // LED7
53  0x0D, // LED8
54  0x0E, // LED9
55  0x0F, // LED10
56 };
57 
62 const uint32_t PS3_BUTTONS[] PROGMEM = {
63  0x10, // UP
64  0x20, // RIGHT
65  0x40, // DOWN
66  0x80, // LEFT
67 
68  0x01, // SELECT
69  0x08, // START
70  0x02, // L3
71  0x04, // R3
72 
73  0x0100, // L2
74  0x0200, // R2
75  0x0400, // L1
76  0x0800, // R1
77 
78  0x1000, // TRIANGLE
79  0x2000, // CIRCLE
80  0x4000, // CROSS
81  0x8000, // SQUARE
82 
83  0x010000, // PS
84  0x080000, // MOVE - covers 12 bits - we only need to read the top 8
85  0x100000, // T - covers 12 bits - we only need to read the top 8
86 };
87 
92 const uint8_t PS3_ANALOG_BUTTONS[] PROGMEM = {
93  23, // UP_ANALOG
94  24, // RIGHT_ANALOG
95  25, // DOWN_ANALOG
96  26, // LEFT_ANALOG
97  0, 0, 0, 0, // Skip SELECT, L3, R3 and START
98 
99  27, // L2_ANALOG
100  28, // R2_ANALOG
101  29, // L1_ANALOG
102  30, // R1_ANALOG
103  31, // TRIANGLE_ANALOG
104  32, // CIRCLE_ANALOG
105  33, // CROSS_ANALOG
106  34, // SQUARE_ANALOG
107  0, 0, // Skip PS and MOVE
108 
109  // Playstation Move Controller
110  15, // T_ANALOG - Both at byte 14 (last reading) and byte 15 (current reading)
111 };
112 
114  // Note that the location is shifted 9 when it's connected via USB
115  // Byte location | bit location
116  Plugged = (38 << 8) | 0x02,
117  Unplugged = (38 << 8) | 0x03,
118 
119  Charging = (39 << 8) | 0xEE,
120  NotCharging = (39 << 8) | 0xF1,
121  Shutdown = (39 << 8) | 0x01,
122  Dying = (39 << 8) | 0x02,
123  Low = (39 << 8) | 0x03,
124  High = (39 << 8) | 0x04,
125  Full = (39 << 8) | 0x05,
126 
127  MoveCharging = (21 << 8) | 0xEE,
128  MoveNotCharging = (21 << 8) | 0xF1,
129  MoveShutdown = (21 << 8) | 0x01,
130  MoveDying = (21 << 8) | 0x02,
131  MoveLow = (21 << 8) | 0x03,
132  MoveHigh = (21 << 8) | 0x04,
133  MoveFull = (21 << 8) | 0x05,
134 
135  CableRumble = (40 << 8) | 0x10, // Operating by USB and rumble is turned on
136  Cable = (40 << 8) | 0x12, // Operating by USB and rumble is turned off
137  BluetoothRumble = (40 << 8) | 0x14, // Operating by Bluetooth and rumble is turned on
138  Bluetooth = (40 << 8) | 0x16, // Operating by Bluetooth and rumble is turned off
139 };
140 
141 #endif
Definition: PS3Enums.h:124
@@ -246,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s3_u_s_b_8cpp.html b/_p_s3_u_s_b_8cpp.html index 0aa48c40..b0864d76 100644 --- a/_p_s3_u_s_b_8cpp.html +++ b/_p_s3_u_s_b_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3USB.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -85,13 +86,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3USB.cpp File Reference
-
#include "PS3USB.h"
+
#include "PS3USB.h"
Include dependency graph for PS3USB.cpp:
- + + + + + + +

Go to the source code of this file.

@@ -100,7 +107,7 @@ Include dependency graph for PS3USB.cpp:
diff --git a/_p_s3_u_s_b_8cpp__incl.map b/_p_s3_u_s_b_8cpp__incl.map index e7fc8aa1..8125e244 100644 --- a/_p_s3_u_s_b_8cpp__incl.map +++ b/_p_s3_u_s_b_8cpp__incl.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/_p_s3_u_s_b_8cpp__incl.md5 b/_p_s3_u_s_b_8cpp__incl.md5 index 2046ae3d..a9693dff 100644 --- a/_p_s3_u_s_b_8cpp__incl.md5 +++ b/_p_s3_u_s_b_8cpp__incl.md5 @@ -1 +1 @@ -a191ea756244e178ed7c52102de0f63b \ No newline at end of file +6fe7e16b5e65f19d54865f8f0649448b \ No newline at end of file diff --git a/_p_s3_u_s_b_8cpp__incl.png b/_p_s3_u_s_b_8cpp__incl.png index feac891f6809044781ee59a7d9b5c75fe6767efc..80c553443ffcf988e79842a771c5b3a1a9bf3746 100644 GIT binary patch literal 14904 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 OA@b5HQpIqi5B~%AJrEB7 literal 16998 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 diff --git a/_p_s3_u_s_b_8cpp_source.html b/_p_s3_u_s_b_8cpp_source.html index fae90355..3a4a6c93 100644 --- a/_p_s3_u_s_b_8cpp_source.html +++ b/_p_s3_u_s_b_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3USB.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -85,581 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3USB.cpp
-Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
-
2 
-
3  This software may be distributed and modified under the terms of the GNU
-
4  General Public License version 2 (GPL2) as published by the Free Software
-
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
-
6  this file. Please note that GPL2 Section 2[b] requires that all works based
-
7  on this software must also be made publicly available under the terms of
-
8  the GPL2 ("Copyleft").
-
9 
-
10  Contact information
-
11  -------------------
-
12 
-
13  Kristian Lauszus, TKJ Electronics
-
14  Web : http://www.tkjelectronics.com
-
15  e-mail : kristianl@tkjelectronics.com
-
16  */
-
17 
-
18 #include "PS3USB.h"
-
19 // To enable serial debugging see "settings.h"
-
20 //#define EXTRADEBUG // Uncomment to get even more debugging data
-
21 //#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
-
22 
-
23 PS3USB::PS3USB(USB *p, uint8_t btadr5, uint8_t btadr4, uint8_t btadr3, uint8_t btadr2, uint8_t btadr1, uint8_t btadr0) :
-
24 pUsb(p), // pointer to USB class instance - mandatory
-
25 bAddress(0), // device address - mandatory
-
26 bPollEnable(false) // don't start polling before dongle is connected
-
27 {
-
28  for(uint8_t i = 0; i < PS3_MAX_ENDPOINTS; i++) {
-
29  epInfo[i].epAddr = 0;
-
30  epInfo[i].maxPktSize = (i) ? 0 : 8;
-
31  epInfo[i].bmSndToggle = 0;
-
32  epInfo[i].bmRcvToggle = 0;
- -
34  }
-
35 
-
36  if(pUsb) // register in USB subsystem
-
37  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
-
38 
-
39  my_bdaddr[5] = btadr5; // Change to your dongle's Bluetooth address instead
-
40  my_bdaddr[4] = btadr4;
-
41  my_bdaddr[3] = btadr3;
-
42  my_bdaddr[2] = btadr2;
-
43  my_bdaddr[1] = btadr1;
-
44  my_bdaddr[0] = btadr0;
-
45 }
-
46 
-
47 uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
-
48  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
-
49  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
-
50  uint8_t rcode;
-
51  UsbDevice *p = NULL;
-
52  EpInfo *oldep_ptr = NULL;
-
53  uint16_t PID;
-
54  uint16_t VID;
-
55 
-
56  // get memory address of USB device address pool
-
57  AddressPool &addrPool = pUsb->GetAddressPool();
-
58 #ifdef EXTRADEBUG
-
59  Notify(PSTR("\r\nPS3USB Init"), 0x80);
-
60 #endif
-
61  // check if address has already been assigned to an instance
-
62  if(bAddress) {
-
63 #ifdef DEBUG_USB_HOST
-
64  Notify(PSTR("\r\nAddress in use"), 0x80);
-
65 #endif
- -
67  }
-
68 
-
69  // Get pointer to pseudo device with address 0 assigned
-
70  p = addrPool.GetUsbDevicePtr(0);
-
71 
-
72  if(!p) {
-
73 #ifdef DEBUG_USB_HOST
-
74  Notify(PSTR("\r\nAddress not found"), 0x80);
-
75 #endif
- -
77  }
-
78 
-
79  if(!p->epinfo) {
-
80 #ifdef DEBUG_USB_HOST
-
81  Notify(PSTR("\r\nepinfo is null"), 0x80);
-
82 #endif
- -
84  }
-
85 
-
86  // Save old pointer to EP_RECORD of address 0
-
87  oldep_ptr = p->epinfo;
-
88 
-
89  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
-
90  p->epinfo = epInfo;
-
91 
-
92  p->lowspeed = lowspeed;
-
93 
-
94  // Get device descriptor
-
95  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
-
96  // Restore p->epinfo
-
97  p->epinfo = oldep_ptr;
-
98 
-
99  if(rcode)
-
100  goto FailGetDevDescr;
-
101 
-
102  VID = udd->idVendor;
-
103  PID = udd->idProduct;
-
104 
-
105  if(VID != PS3_VID || (PID != PS3_PID && PID != PS3NAVIGATION_PID && PID != PS3MOVE_PID))
-
106  goto FailUnknownDevice;
-
107 
-
108  // Allocate new address according to device class
-
109  bAddress = addrPool.AllocAddress(parent, false, port);
-
110 
-
111  if(!bAddress)
- -
113 
-
114  // Extract Max Packet Size from device descriptor
-
115  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
-
116 
-
117  // Assign new address to the device
-
118  rcode = pUsb->setAddr(0, 0, bAddress);
-
119  if(rcode) {
-
120  p->lowspeed = false;
-
121  addrPool.FreeAddress(bAddress);
-
122  bAddress = 0;
-
123 #ifdef DEBUG_USB_HOST
-
124  Notify(PSTR("\r\nsetAddr: "), 0x80);
-
125  D_PrintHex<uint8_t > (rcode, 0x80);
-
126 #endif
-
127  return rcode;
-
128  }
-
129 #ifdef EXTRADEBUG
-
130  Notify(PSTR("\r\nAddr: "), 0x80);
-
131  D_PrintHex<uint8_t > (bAddress, 0x80);
-
132 #endif
-
133  //delay(300); // Spec says you should wait at least 200ms
-
134 
-
135  p->lowspeed = false;
-
136 
-
137  //get pointer to assigned address record
-
138  p = addrPool.GetUsbDevicePtr(bAddress);
-
139  if(!p)
- -
141 
-
142  p->lowspeed = lowspeed;
-
143 
-
144  // Assign epInfo to epinfo pointer - only EP0 is known
-
145  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
-
146  if(rcode)
-
147  goto FailSetDevTblEntry;
-
148 
-
149 
-
150  /* The application will work in reduced host mode, so we can save program and data
-
151  memory space. After verifying the PID and VID we will use known values for the
-
152  configuration values for device, interface, endpoints and HID for the PS3 Controllers */
-
153 
-
154  /* Initialize data structures for endpoints of device */
-
155  epInfo[ PS3_OUTPUT_PIPE ].epAddr = 0x02; // PS3 output endpoint
- -
157  epInfo[ PS3_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
- - - -
161  epInfo[ PS3_INPUT_PIPE ].epAddr = 0x01; // PS3 report endpoint
- -
163  epInfo[ PS3_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
- - - -
167 
-
168  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
-
169  if(rcode)
-
170  goto FailSetDevTblEntry;
-
171 
-
172  delay(200); //Give time for address change
-
173 
-
174  rcode = pUsb->setConf(bAddress, epInfo[ PS3_CONTROL_PIPE ].epAddr, 1);
-
175  if(rcode)
-
176  goto FailSetConfDescr;
-
177 
-
178  if(PID == PS3_PID || PID == PS3NAVIGATION_PID) {
-
179  if(PID == PS3_PID) {
-
180 #ifdef DEBUG_USB_HOST
-
181  Notify(PSTR("\r\nDualshock 3 Controller Connected"), 0x80);
-
182 #endif
-
183  PS3Connected = true;
-
184  } else { // must be a navigation controller
-
185 #ifdef DEBUG_USB_HOST
-
186  Notify(PSTR("\r\nNavigation Controller Connected"), 0x80);
-
187 #endif
-
188  PS3NavigationConnected = true;
-
189  }
-
190  enable_sixaxis(); // The PS3 controller needs a special command before it starts sending data
-
191 
-
192  // Needed for PS3 Dualshock and Navigation commands to work
-
193  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
-
194  writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]);
-
195 
-
196  for(uint8_t i = 6; i < 10; i++)
-
197  readBuf[i] = 0x7F; // Set the analog joystick values to center position
-
198  } else { // must be a Motion controller
-
199 #ifdef DEBUG_USB_HOST
-
200  Notify(PSTR("\r\nMotion Controller Connected"), 0x80);
-
201 #endif
-
202  PS3MoveConnected = true;
-
203  writeBuf[0] = 0x02; // Set report ID, this is needed for Move commands to work
-
204  }
-
205  if(my_bdaddr[0] != 0x00 || my_bdaddr[1] != 0x00 || my_bdaddr[2] != 0x00 || my_bdaddr[3] != 0x00 || my_bdaddr[4] != 0x00 || my_bdaddr[5] != 0x00) {
-
206  if(PS3MoveConnected)
-
207  setMoveBdaddr(my_bdaddr); // Set internal Bluetooth address
-
208  else
-
209  setBdaddr(my_bdaddr); // Set internal Bluetooth address
-
210 
-
211 #ifdef DEBUG_USB_HOST
-
212  Notify(PSTR("\r\nBluetooth Address was set to: "), 0x80);
-
213  for(int8_t i = 5; i > 0; i--) {
-
214  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
-
215  Notify(PSTR(":"), 0x80);
-
216  }
-
217  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
-
218 #endif
-
219  }
-
220  onInit();
-
221 
-
222  bPollEnable = true;
-
223  Notify(PSTR("\r\n"), 0x80);
-
224  timer = (uint32_t)millis();
-
225  return 0; // Successful configuration
-
226 
-
227  /* Diagnostic messages */
-
228 FailGetDevDescr:
-
229 #ifdef DEBUG_USB_HOST
- -
231  goto Fail;
-
232 #endif
-
233 
-
234 FailSetDevTblEntry:
-
235 #ifdef DEBUG_USB_HOST
- -
237  goto Fail;
-
238 #endif
-
239 
-
240 FailSetConfDescr:
-
241 #ifdef DEBUG_USB_HOST
- -
243 #endif
-
244  goto Fail;
-
245 
-
246 FailUnknownDevice:
-
247 #ifdef DEBUG_USB_HOST
-
248  NotifyFailUnknownDevice(VID, PID);
-
249 #endif
- -
251 
-
252 Fail:
-
253 #ifdef DEBUG_USB_HOST
-
254  Notify(PSTR("\r\nPS3 Init Failed, error code: "), 0x80);
-
255  NotifyFail(rcode);
-
256 #endif
-
257  Release();
-
258  return rcode;
-
259 }
-
260 
-
261 /* Performs a cleanup after failed Init() attempt */
-
262 uint8_t PS3USB::Release() {
-
263  PS3Connected = false;
-
264  PS3MoveConnected = false;
-
265  PS3NavigationConnected = false;
- -
267  bAddress = 0;
-
268  bPollEnable = false;
-
269  return 0;
-
270 }
-
271 
-
272 uint8_t PS3USB::Poll() {
-
273  if(!bPollEnable)
-
274  return 0;
-
275 
- -
277  uint16_t BUFFER_SIZE = EP_MAXPKTSIZE;
-
278  pUsb->inTransfer(bAddress, epInfo[ PS3_INPUT_PIPE ].epAddr, &BUFFER_SIZE, readBuf); // input on endpoint 1
-
279  if((int32_t)((uint32_t)millis() - timer) > 100) { // Loop 100ms before processing data
-
280  readReport();
-
281 #ifdef PRINTREPORT
-
282  printReport(); // Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
-
283 #endif
-
284  }
-
285  } else if(PS3MoveConnected) { // One can only set the color of the bulb, set the rumble, set and get the bluetooth address and calibrate the magnetometer via USB
-
286  if((int32_t)((uint32_t)millis() - timer) > 4000) { // Send at least every 4th second
-
287  Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE); // The Bulb and rumble values, has to be written again and again, for it to stay turned on
-
288  timer = (uint32_t)millis();
-
289  }
-
290  }
-
291  return 0;
-
292 }
-
293 
-
294 void PS3USB::readReport() {
-
295  ButtonState = (uint32_t)(readBuf[2] | ((uint16_t)readBuf[3] << 8) | ((uint32_t)readBuf[4] << 16));
-
296 
-
297  //Notify(PSTR("\r\nButtonState", 0x80);
-
298  //PrintHex<uint32_t>(ButtonState, 0x80);
-
299 
-
300  if(ButtonState != OldButtonState) {
-
301  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
-
302  OldButtonState = ButtonState;
-
303  }
-
304 }
-
305 
-
306 void PS3USB::printReport() { // Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
-
307 #ifdef PRINTREPORT
-
308  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++) {
-
309  D_PrintHex<uint8_t > (readBuf[i], 0x80);
-
310  Notify(PSTR(" "), 0x80);
-
311  }
-
312  Notify(PSTR("\r\n"), 0x80);
-
313 #endif
-
314 }
-
315 
- -
317  return (ButtonState & pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]));
-
318 }
-
319 
- -
321  uint32_t button = pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]);
-
322  bool click = (ButtonClickState & button);
-
323  ButtonClickState &= ~button; // Clear "click" event
-
324  return click;
-
325 }
-
326 
- -
328  return (uint8_t)(readBuf[(pgm_read_byte(&PS3_ANALOG_BUTTONS[(uint8_t)a])) - 9]);
-
329 }
-
330 
- -
332  return (uint8_t)(readBuf[((uint8_t)a + 6)]);
-
333 }
-
334 
- -
336  return ((readBuf[((uint16_t)a) - 9] << 8) | readBuf[((uint16_t)a + 1) - 9]);
-
337 }
-
338 
- -
340  if(PS3Connected) {
-
341  float accXval, accYval, accZval;
-
342 
-
343  // Data for the Kionix KXPC4 used in the DualShock 3
-
344  const float zeroG = 511.5f; // 1.65/3.3*1023 (1,65V)
-
345  accXval = -((float)getSensor(aX) - zeroG);
-
346  accYval = -((float)getSensor(aY) - zeroG);
-
347  accZval = -((float)getSensor(aZ) - zeroG);
-
348 
-
349  // Convert to 360 degrees resolution
-
350  // atan2 outputs the value of -Ï€ to Ï€ (radians)
-
351  // We are then converting it to 0 to 2Ï€ and then to degrees
-
352  if(a == Pitch)
-
353  return (atan2f(accYval, accZval) + PI) * RAD_TO_DEG;
-
354  else
-
355  return (atan2f(accXval, accZval) + PI) * RAD_TO_DEG;
-
356  } else
-
357  return 0;
-
358 }
-
359 
- -
361  return (readBuf[((uint16_t)c >> 8) - 9] == ((uint8_t)c & 0xff));
-
362 }
-
363 
- -
365  char statusOutput[102]; // Max string length plus null character
- -
367  strcpy_P(statusOutput, PSTR("\r\nConnectionStatus: "));
-
368 
-
369  if(getStatus(Plugged)) strcat_P(statusOutput, PSTR("Plugged"));
-
370  else if(getStatus(Unplugged)) strcat_P(statusOutput, PSTR("Unplugged"));
-
371  else strcat_P(statusOutput, PSTR("Error"));
-
372 
-
373  strcat_P(statusOutput, PSTR(" - PowerRating: "));
-
374 
-
375  if(getStatus(Charging)) strcat_P(statusOutput, PSTR("Charging"));
-
376  else if(getStatus(NotCharging)) strcat_P(statusOutput, PSTR("Not Charging"));
-
377  else if(getStatus(Shutdown)) strcat_P(statusOutput, PSTR("Shutdown"));
-
378  else if(getStatus(Dying)) strcat_P(statusOutput, PSTR("Dying"));
-
379  else if(getStatus(Low)) strcat_P(statusOutput, PSTR("Low"));
-
380  else if(getStatus(High)) strcat_P(statusOutput, PSTR("High"));
-
381  else if(getStatus(Full)) strcat_P(statusOutput, PSTR("Full"));
-
382  else strcat_P(statusOutput, PSTR("Error"));
-
383 
-
384  strcat_P(statusOutput, PSTR(" - WirelessStatus: "));
-
385 
-
386  if(getStatus(CableRumble)) strcat_P(statusOutput, PSTR("Cable - Rumble is on"));
-
387  else if(getStatus(Cable)) strcat_P(statusOutput, PSTR("Cable - Rumble is off"));
-
388  else if(getStatus(BluetoothRumble)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is on"));
-
389  else if(getStatus(Bluetooth)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is off"));
-
390  else strcat_P(statusOutput, PSTR("Error"));
-
391  } else
-
392  strcpy_P(statusOutput, PSTR("\r\nError"));
-
393 
-
394  USB_HOST_SERIAL.write(statusOutput);
-
395 }
-
396 
-
397 /* Playstation Sixaxis Dualshock and Navigation Controller commands */
-
398 void PS3USB::PS3_Command(uint8_t *data, uint16_t nbytes) {
-
399  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x01), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
-
400  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL);
-
401 }
-
402 
- -
404  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
-
405  writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // Reset buffer
-
406 
-
407  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
-
408 }
-
409 
- -
411  uint8_t rumbleBuf[EP_MAXPKTSIZE];
-
412  memcpy(rumbleBuf, writeBuf, EP_MAXPKTSIZE);
-
413  rumbleBuf[1] = 0x00;
-
414  rumbleBuf[2] = 0x00; // Low mode off
-
415  rumbleBuf[3] = 0x00;
-
416  rumbleBuf[4] = 0x00; // High mode off
-
417  PS3_Command(rumbleBuf, PS3_REPORT_BUFFER_SIZE);
-
418 }
-
419 
- -
421  if((mode & 0x30) > 0x00) {
-
422  uint8_t power[2] = {0xff, 0x00}; // Defaults to RumbleLow
-
423  if(mode == RumbleHigh) {
-
424  power[0] = 0x00;
-
425  power[1] = 0xff;
-
426  }
-
427  setRumbleOn(0xfe, power[0], 0xfe, power[1]);
-
428  }
-
429 }
-
430 
-
431 void PS3USB::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower) {
-
432  uint8_t rumbleBuf[EP_MAXPKTSIZE];
-
433  memcpy(rumbleBuf, writeBuf, EP_MAXPKTSIZE);
-
434  rumbleBuf[1] = rightDuration;
-
435  rumbleBuf[2] = rightPower;
-
436  rumbleBuf[3] = leftDuration;
-
437  rumbleBuf[4] = leftPower;
-
438  PS3_Command(rumbleBuf, PS3_REPORT_BUFFER_SIZE);
-
439 }
-
440 
-
441 void PS3USB::setLedRaw(uint8_t value) {
-
442  writeBuf[9] = value << 1;
-
443  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
-
444 }
-
445 
- -
447  writeBuf[9] &= ~((uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1));
-
448  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
-
449 }
-
450 
- -
452  if(a == OFF)
-
453  setLedRaw(0);
-
454  else {
-
455  writeBuf[9] |= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
-
456  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
-
457  }
-
458 }
-
459 
- -
461  writeBuf[9] ^= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
-
462  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
-
463 }
-
464 
-
465 void PS3USB::setBdaddr(uint8_t *bdaddr) {
-
466  /* Set the internal Bluetooth address */
-
467  uint8_t buf[8];
-
468  buf[0] = 0x01;
-
469  buf[1] = 0x00;
-
470 
-
471  for(uint8_t i = 0; i < 6; i++)
-
472  buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
-
473 
-
474  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
-
475  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
-
476 }
-
477 
-
478 void PS3USB::getBdaddr(uint8_t *bdaddr) {
-
479  uint8_t buf[8];
-
480 
-
481  // bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
-
482  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
-
483 
-
484  for(uint8_t i = 0; i < 6; i++)
-
485  bdaddr[5 - i] = buf[i + 2]; // Copy into buffer reversed, so it is LSB first
-
486 }
-
487 
-
488 void PS3USB::enable_sixaxis() { // Command used to enable the Dualshock 3 and Navigation controller to send data via USB
-
489  uint8_t cmd_buf[4];
-
490  cmd_buf[0] = 0x42; // Special PS3 Controller enable commands
-
491  cmd_buf[1] = 0x0c;
-
492  cmd_buf[2] = 0x00;
-
493  cmd_buf[3] = 0x00;
-
494 
-
495  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF4), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data)
-
496  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF4, 0x03, 0x00, 4, 4, cmd_buf, NULL);
-
497 }
-
498 
-
499 /* Playstation Move Controller commands */
-
500 void PS3USB::Move_Command(uint8_t *data, uint16_t nbytes) {
-
501  pUsb->outTransfer(bAddress, epInfo[ PS3_OUTPUT_PIPE ].epAddr, nbytes, data);
-
502 }
-
503 
-
504 void PS3USB::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { // Use this to set the Color using RGB values
-
505  // Set the Bulb's values into the write buffer
-
506  writeBuf[2] = r;
-
507  writeBuf[3] = g;
-
508  writeBuf[4] = b;
-
509 
-
510  Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
-
511 }
-
512 
-
513 void PS3USB::moveSetBulb(ColorsEnum color) { // Use this to set the Color using the predefined colors in "enums.h"
-
514  moveSetBulb((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color));
-
515 }
-
516 
-
517 void PS3USB::moveSetRumble(uint8_t rumble) {
-
518 #ifdef DEBUG_USB_HOST
-
519  if(rumble < 64 && rumble != 0) // The rumble value has to at least 64, or approximately 25% (64/255*100)
-
520  Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"), 0x80);
-
521 #endif
-
522  writeBuf[6] = rumble; // Set the rumble value into the write buffer
-
523 
-
524  Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
-
525 }
-
526 
-
527 void PS3USB::setMoveBdaddr(uint8_t *bdaddr) {
-
528  /* Set the internal Bluetooth address */
-
529  uint8_t buf[11];
-
530  buf[0] = 0x05;
-
531  buf[7] = 0x10;
-
532  buf[8] = 0x01;
-
533  buf[9] = 0x02;
-
534  buf[10] = 0x12;
-
535 
-
536  for(uint8_t i = 0; i < 6; i++)
-
537  buf[i + 1] = bdaddr[i];
-
538 
-
539  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x05), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
-
540  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
-
541 }
-
542 
-
543 void PS3USB::getMoveBdaddr(uint8_t *bdaddr) {
-
544  uint8_t buf[16];
-
545 
-
546  // bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0x04), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
-
547  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x04, 0x03, 0x00, 16, 16, buf, NULL);
-
548 
-
549  for(uint8_t i = 0; i < 6; i++)
-
550  bdaddr[i] = buf[10 + i];
-
551 }
-
552 
-
553 void PS3USB::getMoveCalibration(uint8_t *data) {
-
554  uint8_t buf[49];
-
555 
-
556  for(uint8_t i = 0; i < 3; i++) {
-
557  // bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0x10), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
-
558  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x10, 0x03, 0x00, 49, 49, buf, NULL);
-
559 
-
560  for(uint8_t j = 0; j < 49; j++)
-
561  data[49 * i + j] = buf[j];
-
562  }
-
563 }
-
564 
-
565 void PS3USB::onInit() {
-
566  if(pFuncOnInit)
-
567  pFuncOnInit(); // Call the user function
-
568  else {
-
569  if(PS3MoveConnected)
-
570  moveSetBulb(Red);
-
571  else // Dualshock 3 or Navigation controller
-
572  setLedOn(static_cast<LEDEnum>(LED1));
-
573  }
-
574 }
-
uint8_t bmRcvToggle
Definition: address.h:48
+Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16  */
17 
18 #include "PS3USB.h"
19 // To enable serial debugging see "settings.h"
20 //#define EXTRADEBUG // Uncomment to get even more debugging data
21 //#define PRINTREPORT // Uncomment to print the report send by the PS3 Controllers
22 
23 PS3USB::PS3USB(USB *p, uint8_t btadr5, uint8_t btadr4, uint8_t btadr3, uint8_t btadr2, uint8_t btadr1, uint8_t btadr0) :
24 pUsb(p), // pointer to USB class instance - mandatory
25 bAddress(0), // device address - mandatory
26 bPollEnable(false) // don't start polling before dongle is connected
27 {
28  for(uint8_t i = 0; i < PS3_MAX_ENDPOINTS; i++) {
29  epInfo[i].epAddr = 0;
30  epInfo[i].maxPktSize = (i) ? 0 : 8;
31  epInfo[i].bmSndToggle = 0;
32  epInfo[i].bmRcvToggle = 0;
34  }
35 
36  if(pUsb) // register in USB subsystem
37  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
38 
39  my_bdaddr[5] = btadr5; // Change to your dongle's Bluetooth address instead
40  my_bdaddr[4] = btadr4;
41  my_bdaddr[3] = btadr3;
42  my_bdaddr[2] = btadr2;
43  my_bdaddr[1] = btadr1;
44  my_bdaddr[0] = btadr0;
45 }
46 
47 uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
48  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
49  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
50  uint8_t rcode;
51  UsbDevice *p = NULL;
52  EpInfo *oldep_ptr = NULL;
53  uint16_t PID;
54  uint16_t VID;
55 
56  // get memory address of USB device address pool
57  AddressPool &addrPool = pUsb->GetAddressPool();
58 #ifdef EXTRADEBUG
59  Notify(PSTR("\r\nPS3USB Init"), 0x80);
60 #endif
61  // check if address has already been assigned to an instance
62  if(bAddress) {
63 #ifdef DEBUG_USB_HOST
64  Notify(PSTR("\r\nAddress in use"), 0x80);
65 #endif
67  }
68 
69  // Get pointer to pseudo device with address 0 assigned
70  p = addrPool.GetUsbDevicePtr(0);
71 
72  if(!p) {
73 #ifdef DEBUG_USB_HOST
74  Notify(PSTR("\r\nAddress not found"), 0x80);
75 #endif
77  }
78 
79  if(!p->epinfo) {
80 #ifdef DEBUG_USB_HOST
81  Notify(PSTR("\r\nepinfo is null"), 0x80);
82 #endif
84  }
85 
86  // Save old pointer to EP_RECORD of address 0
87  oldep_ptr = p->epinfo;
88 
89  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
90  p->epinfo = epInfo;
91 
92  p->lowspeed = lowspeed;
93 
94  // Get device descriptor
95  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
96  // Restore p->epinfo
97  p->epinfo = oldep_ptr;
98 
99  if(rcode)
100  goto FailGetDevDescr;
101 
102  VID = udd->idVendor;
103  PID = udd->idProduct;
104 
105  if(VID != PS3_VID || (PID != PS3_PID && PID != PS3NAVIGATION_PID && PID != PS3MOVE_PID))
106  goto FailUnknownDevice;
107 
108  // Allocate new address according to device class
109  bAddress = addrPool.AllocAddress(parent, false, port);
110 
111  if(!bAddress)
113 
114  // Extract Max Packet Size from device descriptor
115  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
116 
117  // Assign new address to the device
118  rcode = pUsb->setAddr(0, 0, bAddress);
119  if(rcode) {
120  p->lowspeed = false;
121  addrPool.FreeAddress(bAddress);
122  bAddress = 0;
123 #ifdef DEBUG_USB_HOST
124  Notify(PSTR("\r\nsetAddr: "), 0x80);
125  D_PrintHex<uint8_t > (rcode, 0x80);
126 #endif
127  return rcode;
128  }
129 #ifdef EXTRADEBUG
130  Notify(PSTR("\r\nAddr: "), 0x80);
131  D_PrintHex<uint8_t > (bAddress, 0x80);
132 #endif
133  //delay(300); // Spec says you should wait at least 200ms
134 
135  p->lowspeed = false;
136 
137  //get pointer to assigned address record
138  p = addrPool.GetUsbDevicePtr(bAddress);
139  if(!p)
141 
142  p->lowspeed = lowspeed;
143 
144  // Assign epInfo to epinfo pointer - only EP0 is known
145  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
146  if(rcode)
147  goto FailSetDevTblEntry;
148 
149 
150  /* The application will work in reduced host mode, so we can save program and data
151  memory space. After verifying the PID and VID we will use known values for the
152  configuration values for device, interface, endpoints and HID for the PS3 Controllers */
153 
154  /* Initialize data structures for endpoints of device */
155  epInfo[ PS3_OUTPUT_PIPE ].epAddr = 0x02; // PS3 output endpoint
157  epInfo[ PS3_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
161  epInfo[ PS3_INPUT_PIPE ].epAddr = 0x01; // PS3 report endpoint
163  epInfo[ PS3_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
167 
168  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
169  if(rcode)
170  goto FailSetDevTblEntry;
171 
172  delay(200); //Give time for address change
173 
174  rcode = pUsb->setConf(bAddress, epInfo[ PS3_CONTROL_PIPE ].epAddr, 1);
175  if(rcode)
176  goto FailSetConfDescr;
177 
178  if(PID == PS3_PID || PID == PS3NAVIGATION_PID) {
179  if(PID == PS3_PID) {
180 #ifdef DEBUG_USB_HOST
181  Notify(PSTR("\r\nDualshock 3 Controller Connected"), 0x80);
182 #endif
183  PS3Connected = true;
184  } else { // must be a navigation controller
185 #ifdef DEBUG_USB_HOST
186  Notify(PSTR("\r\nNavigation Controller Connected"), 0x80);
187 #endif
188  PS3NavigationConnected = true;
189  }
190  enable_sixaxis(); // The PS3 controller needs a special command before it starts sending data
191 
192  // Needed for PS3 Dualshock and Navigation commands to work
193  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
194  writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]);
195 
196  for(uint8_t i = 6; i < 10; i++)
197  readBuf[i] = 0x7F; // Set the analog joystick values to center position
198  } else { // must be a Motion controller
199 #ifdef DEBUG_USB_HOST
200  Notify(PSTR("\r\nMotion Controller Connected"), 0x80);
201 #endif
202  PS3MoveConnected = true;
203  writeBuf[0] = 0x02; // Set report ID, this is needed for Move commands to work
204  }
205  if(my_bdaddr[0] != 0x00 || my_bdaddr[1] != 0x00 || my_bdaddr[2] != 0x00 || my_bdaddr[3] != 0x00 || my_bdaddr[4] != 0x00 || my_bdaddr[5] != 0x00) {
206  if(PS3MoveConnected)
207  setMoveBdaddr(my_bdaddr); // Set internal Bluetooth address
208  else
209  setBdaddr(my_bdaddr); // Set internal Bluetooth address
210 
211 #ifdef DEBUG_USB_HOST
212  Notify(PSTR("\r\nBluetooth Address was set to: "), 0x80);
213  for(int8_t i = 5; i > 0; i--) {
214  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
215  Notify(PSTR(":"), 0x80);
216  }
217  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
218 #endif
219  }
220  onInit();
221 
222  bPollEnable = true;
223  Notify(PSTR("\r\n"), 0x80);
224  timer = (uint32_t)millis();
225  return 0; // Successful configuration
226 
227  /* Diagnostic messages */
228 FailGetDevDescr:
229 #ifdef DEBUG_USB_HOST
231  goto Fail;
232 #endif
233 
234 FailSetDevTblEntry:
235 #ifdef DEBUG_USB_HOST
237  goto Fail;
238 #endif
239 
240 FailSetConfDescr:
241 #ifdef DEBUG_USB_HOST
243 #endif
244  goto Fail;
245 
246 FailUnknownDevice:
247 #ifdef DEBUG_USB_HOST
248  NotifyFailUnknownDevice(VID, PID);
249 #endif
251 
252 Fail:
253 #ifdef DEBUG_USB_HOST
254  Notify(PSTR("\r\nPS3 Init Failed, error code: "), 0x80);
255  NotifyFail(rcode);
256 #endif
257  Release();
258  return rcode;
259 }
260 
261 /* Performs a cleanup after failed Init() attempt */
262 uint8_t PS3USB::Release() {
263  PS3Connected = false;
264  PS3MoveConnected = false;
265  PS3NavigationConnected = false;
267  bAddress = 0;
268  bPollEnable = false;
269  return 0;
270 }
271 
272 uint8_t PS3USB::Poll() {
273  if(!bPollEnable)
274  return 0;
275 
277  uint16_t BUFFER_SIZE = EP_MAXPKTSIZE;
278  pUsb->inTransfer(bAddress, epInfo[ PS3_INPUT_PIPE ].epAddr, &BUFFER_SIZE, readBuf); // input on endpoint 1
279  if((int32_t)((uint32_t)millis() - timer) > 100) { // Loop 100ms before processing data
280  readReport();
281 #ifdef PRINTREPORT
282  printReport(); // Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
283 #endif
284  }
285  } else if(PS3MoveConnected) { // One can only set the color of the bulb, set the rumble, set and get the bluetooth address and calibrate the magnetometer via USB
286  if((int32_t)((uint32_t)millis() - timer) > 4000) { // Send at least every 4th second
287  Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE); // The Bulb and rumble values, has to be written again and again, for it to stay turned on
288  timer = (uint32_t)millis();
289  }
290  }
291  return 0;
292 }
293 
294 void PS3USB::readReport() {
295  ButtonState = (uint32_t)(readBuf[2] | ((uint16_t)readBuf[3] << 8) | ((uint32_t)readBuf[4] << 16));
296 
297  //Notify(PSTR("\r\nButtonState", 0x80);
298  //PrintHex<uint32_t>(ButtonState, 0x80);
299 
300  if(ButtonState != OldButtonState) {
301  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
302  OldButtonState = ButtonState;
303  }
304 }
305 
306 void PS3USB::printReport() { // Uncomment "#define PRINTREPORT" to print the report send by the PS3 Controllers
307 #ifdef PRINTREPORT
308  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++) {
309  D_PrintHex<uint8_t > (readBuf[i], 0x80);
310  Notify(PSTR(" "), 0x80);
311  }
312  Notify(PSTR("\r\n"), 0x80);
313 #endif
314 }
315 
317  return (ButtonState & pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]));
318 }
319 
321  uint32_t button = pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]);
322  bool click = (ButtonClickState & button);
323  ButtonClickState &= ~button; // Clear "click" event
324  return click;
325 }
326 
328  return (uint8_t)(readBuf[(pgm_read_byte(&PS3_ANALOG_BUTTONS[(uint8_t)a])) - 9]);
329 }
330 
332  return (uint8_t)(readBuf[((uint8_t)a + 6)]);
333 }
334 
336  return ((readBuf[((uint16_t)a) - 9] << 8) | readBuf[((uint16_t)a + 1) - 9]);
337 }
338 
340  if(PS3Connected) {
341  float accXval, accYval, accZval;
342 
343  // Data for the Kionix KXPC4 used in the DualShock 3
344  const float zeroG = 511.5f; // 1.65/3.3*1023 (1,65V)
345  accXval = -((float)getSensor(aX) - zeroG);
346  accYval = -((float)getSensor(aY) - zeroG);
347  accZval = -((float)getSensor(aZ) - zeroG);
348 
349  // Convert to 360 degrees resolution
350  // atan2 outputs the value of -Ï€ to Ï€ (radians)
351  // We are then converting it to 0 to 2Ï€ and then to degrees
352  if(a == Pitch)
353  return (atan2f(accYval, accZval) + PI) * RAD_TO_DEG;
354  else
355  return (atan2f(accXval, accZval) + PI) * RAD_TO_DEG;
356  } else
357  return 0;
358 }
359 
361  return (readBuf[((uint16_t)c >> 8) - 9] == ((uint8_t)c & 0xff));
362 }
363 
365  char statusOutput[102]; // Max string length plus null character
367  strcpy_P(statusOutput, PSTR("\r\nConnectionStatus: "));
368 
369  if(getStatus(Plugged)) strcat_P(statusOutput, PSTR("Plugged"));
370  else if(getStatus(Unplugged)) strcat_P(statusOutput, PSTR("Unplugged"));
371  else strcat_P(statusOutput, PSTR("Error"));
372 
373  strcat_P(statusOutput, PSTR(" - PowerRating: "));
374 
375  if(getStatus(Charging)) strcat_P(statusOutput, PSTR("Charging"));
376  else if(getStatus(NotCharging)) strcat_P(statusOutput, PSTR("Not Charging"));
377  else if(getStatus(Shutdown)) strcat_P(statusOutput, PSTR("Shutdown"));
378  else if(getStatus(Dying)) strcat_P(statusOutput, PSTR("Dying"));
379  else if(getStatus(Low)) strcat_P(statusOutput, PSTR("Low"));
380  else if(getStatus(High)) strcat_P(statusOutput, PSTR("High"));
381  else if(getStatus(Full)) strcat_P(statusOutput, PSTR("Full"));
382  else strcat_P(statusOutput, PSTR("Error"));
383 
384  strcat_P(statusOutput, PSTR(" - WirelessStatus: "));
385 
386  if(getStatus(CableRumble)) strcat_P(statusOutput, PSTR("Cable - Rumble is on"));
387  else if(getStatus(Cable)) strcat_P(statusOutput, PSTR("Cable - Rumble is off"));
388  else if(getStatus(BluetoothRumble)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is on"));
389  else if(getStatus(Bluetooth)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is off"));
390  else strcat_P(statusOutput, PSTR("Error"));
391  } else
392  strcpy_P(statusOutput, PSTR("\r\nError"));
393 
394  USB_HOST_SERIAL.write(statusOutput);
395 }
396 
397 /* Playstation Sixaxis Dualshock and Navigation Controller commands */
398 void PS3USB::PS3_Command(uint8_t *data, uint16_t nbytes) {
399  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x01), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
400  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL);
401 }
402 
404  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
405  writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // Reset buffer
406 
407  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
408 }
409 
411  uint8_t rumbleBuf[EP_MAXPKTSIZE];
412  memcpy(rumbleBuf, writeBuf, EP_MAXPKTSIZE);
413  rumbleBuf[1] = 0x00;
414  rumbleBuf[2] = 0x00; // Low mode off
415  rumbleBuf[3] = 0x00;
416  rumbleBuf[4] = 0x00; // High mode off
417  PS3_Command(rumbleBuf, PS3_REPORT_BUFFER_SIZE);
418 }
419 
421  if((mode & 0x30) > 0x00) {
422  uint8_t power[2] = {0xff, 0x00}; // Defaults to RumbleLow
423  if(mode == RumbleHigh) {
424  power[0] = 0x00;
425  power[1] = 0xff;
426  }
427  setRumbleOn(0xfe, power[0], 0xfe, power[1]);
428  }
429 }
430 
431 void PS3USB::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower) {
432  uint8_t rumbleBuf[EP_MAXPKTSIZE];
433  memcpy(rumbleBuf, writeBuf, EP_MAXPKTSIZE);
434  rumbleBuf[1] = rightDuration;
435  rumbleBuf[2] = rightPower;
436  rumbleBuf[3] = leftDuration;
437  rumbleBuf[4] = leftPower;
438  PS3_Command(rumbleBuf, PS3_REPORT_BUFFER_SIZE);
439 }
440 
441 void PS3USB::setLedRaw(uint8_t value) {
442  writeBuf[9] = value << 1;
443  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
444 }
445 
447  writeBuf[9] &= ~((uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1));
448  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
449 }
450 
452  if(a == OFF)
453  setLedRaw(0);
454  else {
455  writeBuf[9] |= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
456  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
457  }
458 }
459 
461  writeBuf[9] ^= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
462  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
463 }
464 
465 void PS3USB::setBdaddr(uint8_t *bdaddr) {
466  /* Set the internal Bluetooth address */
467  uint8_t buf[8];
468  buf[0] = 0x01;
469  buf[1] = 0x00;
470 
471  for(uint8_t i = 0; i < 6; i++)
472  buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
473 
474  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
475  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
476 }
477 
478 void PS3USB::getBdaddr(uint8_t *bdaddr) {
479  uint8_t buf[8];
480 
481  // bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0xF5), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
482  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
483 
484  for(uint8_t i = 0; i < 6; i++)
485  bdaddr[5 - i] = buf[i + 2]; // Copy into buffer reversed, so it is LSB first
486 }
487 
488 void PS3USB::enable_sixaxis() { // Command used to enable the Dualshock 3 and Navigation controller to send data via USB
489  uint8_t cmd_buf[4];
490  cmd_buf[0] = 0x42; // Special PS3 Controller enable commands
491  cmd_buf[1] = 0x0c;
492  cmd_buf[2] = 0x00;
493  cmd_buf[3] = 0x00;
494 
495  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0xF4), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data)
496  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF4, 0x03, 0x00, 4, 4, cmd_buf, NULL);
497 }
498 
499 /* Playstation Move Controller commands */
500 void PS3USB::Move_Command(uint8_t *data, uint16_t nbytes) {
501  pUsb->outTransfer(bAddress, epInfo[ PS3_OUTPUT_PIPE ].epAddr, nbytes, data);
502 }
503 
504 void PS3USB::moveSetBulb(uint8_t r, uint8_t g, uint8_t b) { // Use this to set the Color using RGB values
505  // Set the Bulb's values into the write buffer
506  writeBuf[2] = r;
507  writeBuf[3] = g;
508  writeBuf[4] = b;
509 
510  Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
511 }
512 
513 void PS3USB::moveSetBulb(ColorsEnum color) { // Use this to set the Color using the predefined colors in "enums.h"
514  moveSetBulb((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color));
515 }
516 
517 void PS3USB::moveSetRumble(uint8_t rumble) {
518 #ifdef DEBUG_USB_HOST
519  if(rumble < 64 && rumble != 0) // The rumble value has to at least 64, or approximately 25% (64/255*100)
520  Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"), 0x80);
521 #endif
522  writeBuf[6] = rumble; // Set the rumble value into the write buffer
523 
524  Move_Command(writeBuf, MOVE_REPORT_BUFFER_SIZE);
525 }
526 
527 void PS3USB::setMoveBdaddr(uint8_t *bdaddr) {
528  /* Set the internal Bluetooth address */
529  uint8_t buf[11];
530  buf[0] = 0x05;
531  buf[7] = 0x10;
532  buf[8] = 0x01;
533  buf[9] = 0x02;
534  buf[10] = 0x12;
535 
536  for(uint8_t i = 0; i < 6; i++)
537  buf[i + 1] = bdaddr[i];
538 
539  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x05), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
540  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
541 }
542 
543 void PS3USB::getMoveBdaddr(uint8_t *bdaddr) {
544  uint8_t buf[16];
545 
546  // bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0x04), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
547  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x04, 0x03, 0x00, 16, 16, buf, NULL);
548 
549  for(uint8_t i = 0; i < 6; i++)
550  bdaddr[i] = buf[10 + i];
551 }
552 
553 void PS3USB::getMoveCalibration(uint8_t *data) {
554  uint8_t buf[49];
555 
556  for(uint8_t i = 0; i < 3; i++) {
557  // bmRequest = Device to host (0x80) | Class (0x20) | Interface (0x01) = 0xA1, bRequest = Get Report (0x01), Report ID (0x10), Report Type (Feature 0x03), interface (0x00), datalength, datalength, data
558  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x10, 0x03, 0x00, 49, 49, buf, NULL);
559 
560  for(uint8_t j = 0; j < 49; j++)
561  data[49 * i + j] = buf[j];
562  }
563 }
564 
565 void PS3USB::onInit() {
566  if(pFuncOnInit)
567  pFuncOnInit(); // Call the user function
568  else {
569  if(PS3MoveConnected)
570  moveSetBulb(Red);
571  else // Dualshock 3 or Navigation controller
572  setLedOn(static_cast<LEDEnum>(LED1));
573  }
574 }
uint8_t bmRcvToggle
Definition: address.h:48
Definition: PS3Enums.h:124
void getBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:478
@@ -790,7 +217,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s3_u_s_b_8h.html b/_p_s3_u_s_b_8h.html index b354d41e..e28bd4dd 100644 --- a/_p_s3_u_s_b_8h.html +++ b/_p_s3_u_s_b_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3USB.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
+
USB Host Shield 2.0
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
+
@@ -88,22 +89,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS3USB.h File Reference
-
#include "Usb.h"
-#include "usbhid.h"
-#include "PS3Enums.h"
+
#include "Usb.h"
+#include "usbhid.h"
+#include "PS3Enums.h"
Include dependency graph for PS3USB.h:
- + + + + + +
This graph shows which files directly or indirectly include this file:
- + +

Go to the source code of this file.

@@ -266,7 +273,7 @@ Macros diff --git a/_p_s3_u_s_b_8h__dep__incl.map b/_p_s3_u_s_b_8h__dep__incl.map index d6176217..667ba04f 100644 --- a/_p_s3_u_s_b_8h__dep__incl.map +++ b/_p_s3_u_s_b_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/_p_s3_u_s_b_8h__dep__incl.md5 b/_p_s3_u_s_b_8h__dep__incl.md5 index b91d38d1..12e5013f 100644 --- a/_p_s3_u_s_b_8h__dep__incl.md5 +++ b/_p_s3_u_s_b_8h__dep__incl.md5 @@ -1 +1 @@ -10cd044b5bf58467538f65c844ab1455 \ No newline at end of file +0475266e9b2a94b52ed82e482fd5e58c \ No newline at end of file diff --git a/_p_s3_u_s_b_8h__dep__incl.png b/_p_s3_u_s_b_8h__dep__incl.png index 9f37dc52d2b7468bafed00f5da423cd11796350a..3e3167b129cfd2014f0f7f049441b048669b348b 100644 GIT binary patch literal 2503 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 literal 2868 zcmbtWc{G%JAAb^&(omDNMzT$IO~M<>Ehb8~C{5SC8)O~HSVG7$BrzG|&M>;jNQ_Cc zOk%i(F)3U2;TBnAMw{tA_jb-b?;r1f@AI7J_dDnLE$6#^KA&%f-6f=ixV$(301{T` z&pCi|F!ES-|ufNkMaRPe8K9R`Q;eGa!Js|11<`QQ;kO& zG@#8j$HXSvsUD7_!dwG!^Y+Juii>}&RJpUB3hb_mI~~X#7s{Y3>I5|i$>$fq#U2Ys z8w!_cn%BU!UPB6s!;yBs3C)u`2&>G`JcSGR+c2~Xdn1`eKy38iA`*=c7tQR2C<&+F z?u0H23sfa>F-KtQXG~@pInB>2D+8ulv1iYoEmcz}_F0{5dDj@s9cjOftZ_!!*-gKH zpN6Qcv~+TEa&{g<-t*=DiQjk~5ur8jdmsCPR0{7{8 z6$g!iyu7^drbECkQBmDrpI^RyeSBgG^@*H^9nx~r?8&u}X4%Y31Zjt+_*Qd3hylf^4P+%1&U-r3oSe%p}-!7Po` z1q@bXWo7MdL|=STG7KgqIXPKOsl~OH;|~?@WZ@AzrrVQtGI5Gijlu8ksa^m>w*CFP zFPqr6bdNyT3!Jdo+T4U5Jb0|YI`bdTN!8VwrlzKPdIRX(Z(FO6D3pSNg3hk4kg
  • nZ_YvDn6W&Qjs@z`(#nGX}I! zTGtgkGW%L&7w@f_cOGz${KC|08per{%FE0B*hKwm6IkfNYYOYxZh)C{xVpM}Cy;S&KNPz8 z{YwOp+v5$!w@b{%#zrXVj9R`+R#z8;;n8tNqNJoGwk1AN+ckM_{zrQ_beD*Ts)~v~ zZH&+7S5;L-yziH5hS&_gXP1Ts1S~8r{?XqLuIx(WeH?yNUOwK8scmTii^Ig&*ccA) zo}8TYJOK=R5j_9y}Nt8(W;6 zon2jRyR{WkVNG$^{?x0>;c#{(GnmZxU}^zLd3g<}IJ@N3Foy$Hn-GYXm2qRDKky{s zN4#$mliOE%`m~uDaUu56rIJtU>v%Kl*ExfHCbmsaQ&Uq#Wp1bjm0y^&oS&O}q`WZ{9f{-*ZGx&phvK}J zv$|eIo67I)NKO4g`W=(70)tiDy$eGbs_sJ%E2EAAYhPXv2x-o&G=+D(qWq0qta2*( z1By=M^Y>lT2RFU(!q7?2p80yuwFDhb87NI~zNV=f0{%8E#Qgj>8)An{P=+|+}`fU$>B#wubO?bijfuCDZS$MPKZj?$W}vd_$mgezf9F8 z4m(Qy^{uTAC!?{ZXZ>J;g~F3P-BX+{3%fxnZo6F^tQM!;baL$Z`vla z8ME3*r_*V)iB@cJMF96jwUm_9{QNwK84!>%I@h~J+ zJFnFYU5)z24~9S>zF#&M2KPv7!L_xq>$4VDua1n-f{+0)s=B}#S5;ysL>f^_679zoG9IM}oDgAkHpSiiYfq?-Sg26$A znb{Cw zZqO^XK}NEq1034a)WrJ4W#aHYmM%U%s*XfFeqmuDpfMNq(*KI$DKq&6khH?*#Vzbv z8a9JS94rcy?$O6JHQHdZ=Km8#$YfHD@H}bBO^h> z)sTMo^;e&s5i^b5>;^dxtwa}2!Nz&xAg8~tC0}~v<$Tk`^~Mc7M2JxP%0#oKh6Zp( zr!ei#o#VwfV`84v-XfaZ^z`$4zp@gdFRzey9twj^j*pLzj`rwaqN0NR{oNmcXNoYH zda`Z<4vvmqaS^$rFEeNfT1+qOKHqQ3zreM$&>XUbh=>S}$HT0QyR^pLynGqzNCSDl zy}cb&yrH2XP_w3|-Baw)=%tsbdp0&UN=(>bmm7uf#DG7O7>LEx|Z~Kp>n9{oA`N$=GlF<%|RBQ1R5V zGVX1WJvoPrJ@sU}4rEV2KF75>RGx5Ek{bkz$f5cz*zbVIol5wDwY9}@ykcX&jyFZL zeV)xsPfuqs%1bqcri(j{zgWh}dUS&v z=L%DY{7YX&lNcLN7%p6>x7KicxMgCAL>d|zqBILCJ26vOI(qatcM)2o9%6l_>mOzL cNog}}girSzJ0t{l)$EU)uMay8r+H diff --git a/_p_s3_u_s_b_8h__incl.map b/_p_s3_u_s_b_8h__incl.map index 10cb6bb5..a496e764 100644 --- a/_p_s3_u_s_b_8h__incl.map +++ b/_p_s3_u_s_b_8h__incl.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/_p_s3_u_s_b_8h__incl.md5 b/_p_s3_u_s_b_8h__incl.md5 index 41473e73..8fa52d90 100644 --- a/_p_s3_u_s_b_8h__incl.md5 +++ b/_p_s3_u_s_b_8h__incl.md5 @@ -1 +1 @@ -798f542812638555960f82da216a8f12 \ No newline at end of file +6e3e4f5a4587d0eabc83a6049ce6f258 \ No newline at end of file diff --git a/_p_s3_u_s_b_8h__incl.png b/_p_s3_u_s_b_8h__incl.png index 70e36f0ee4f26c69fdad203cde1e12b38af0b5cc..95bbe266cb4bf8cb889cf402b5412fb3ef883f25 100644 GIT binary patch literal 13257 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 WkLQpiItx6T15uDsl`fSu3;rL0rU9)0 literal 15040 zcmaL8byU_*^zZwiNGJ``T_PaeE!`<0DLm2*(k!U$wjMA&CUFl2rv{31I{!?-&X) zKboJNP7u}c@o^@nBkj2O_){Y3Vm9MpLfKTV=wl{?F?{@3La2d(&Do|D5&=ipv7%<0 zpC7DWK!CCxWey@6HMiR5R(I|dvT7bW^|DP~SmA0EB6~_dv{y9T7{Wm>;s_DRL}C8x z)VoLS4_o)iTBkW5CkxB>z(DxzkqlH`US5chsp-bPA9|5UwIX9Y} zoAY4~Xl~|%g@=cNZ_YNmutG>_Xb?Vs{;W}B_O_(7G&&(6;O9?LENpCp$NL)yBv|x& z8m|*M4-Y;S71i!s)jMo@4TziDop|q9lB-#7N?KYtiRU%U$B!R1YAuq@1aXBWLroqk z<`)+U4;ShJb91S*wY67|k0Zgn#KpxyAPhQtX=*IBM@i*E zETJvMyV*)8T4?u~B_AIj8U_Zr7cl`r=!~u#vXzxpMMXusmUWANPEHQ>)IyRg7J9HK z_)M{JXvOO(yig_IV6ono%lYI>>^iw0TjVrq@j!pSqNe8S9^A9@^Gc69$8X2WMAX#O z5N~g9i2K9EOcIwZx$D(Yc&o>q!EA+oMNLh7Vx{AuCd6BoT0~cucsP~&B`Rtpb@%^F zQEaU5>gpF~H#fQucm45nvo+>8k2gCc^jft@8$IE^g@vZE>lA)$;nVMW=cRqGMou=XE+--JdGv^0;MlJX#FSl}YRv7$_G19EeKNb9uO+Z(-dKB8w@gM8uc14*%!B!@lt8$mj$s2HE$>K+AG1JxYQ)gfW+Vu7bNdUP)}DMnf1a*Au*9 zmV#)sdGg1^#=?A}CMO{w;d4HLK)yhszW@IH!{5rw&HYG;@w=xdPwHYaue=;pPfw4} z! zk`nq(A$|4f@%RZ0i9&A&7aiSaecgcFL)b6s7MOG+Stt%;kIzf^3iBC;oc#RGj*b_d zfvCM#&;AHFF{iu7=xlXM4>TIFnweg!6$7`4+^Ch_ylfQIh5#O{O04H%GG`c0z$x$GgFX&tGFahyvidtplJZMf;TBnJ z-^o^DTl@I$67=j^mBl$~LZWW?D14W#`T}hYOKCtG|nFSKAHa;#Jv-OXN~G zP9NT4W~l<#SrjWu-kG2A=;sUn)Ya-y#r##$sZ~UIH#f2I%S;(wP%vUw5;L(z)ixI& z-wSkHXRObkU%3ZLNET0T$7F*?n_UFSSXf}-QHOt5=v%o5PLjgIzi~h9*3fQgB!q#1 z0;lbOgj)f3zC+U0;-+wo5*ejdC`Toc9QJ$V2~9q&(T9k4x%218Velv=H8orkzZ*iC z_6-JjSz&E$`~Vc4$gAZyJ%Ud;XGFwgrP3)<5n;^NcY&+dr(6e1yaW{D_2)#&ReO7T z?IYzR!x>LVf{$Ep8XClKIgfaoA6?OgQ>6;*bM1sBCu)K>X=0h_wVe?pA|HJp?u?8NVE@GL`@X`*N~cGy99`wSg_(${Ko>gQka_cI!PZ z3gPujtvdOMkiNtOJEuAk#nDgCGZg#osuxu-RjkdE&NLt;irQ?d&-Q$q1{PkgeZIze zt!CzjBZ--%F%bxmGA56?;%f7~nQG+hr{~GT@XbLcD;tQ%9C{(T`?qKL%=HK`U^x30Zb6Mopl1 z0q?>#e2#bYG>XJYCS6^$d3~bKU^KiK?)lJYu+h_ZwvdL=jWuL*^|ub=>2Bryk2Pvb z-D0VTSFfm?ua?p(ezE*6(_#HtT>RbKqXvD-xISOb4X?>j=O>=k_;yXmCQW?*$!RaV zqN3t=60g)(n3ykHMaHE^jO!E0NWUPFlb2{$>Z)V#SjPOPFp6ArRxfuhjil&r#O!g<*&ifm9eaj`3Vzrh& zC$1bARo2Dc$dPj9&ciKL?#_n;ydfLRp*;3J+l5;Dpm4eF2qM-mUvqlFR}n#zj5@c3 zzVJ=tOeZ)K_EQ-9JvgWxJ?|^{P`aIOqZ`UY41>7#RyV7`*gF-ZA)&E)f-d;HgKRwDzO7-;| zE#ZKp3DIKN9eX0LB@9&n_qB?ONUI2CX{z`o;l#LIh37;0^**K zm9;-wyqxyEgMZ#|gQ+*Pd0_wE-r`RU1}BUr36}c%8(u%&u_p02 zMD;9D7N5Nq>gSzpY!q&OaP+!>6~)?LSwZA=Yz_>?5e!UJM=jBD`(CCj|3eNMFty@I z5Nx@Sb-I(G*D?N!Xk~5kbieqo&GE7djZ6#*RU_@8|IV@ zCYgYltCusxj@Y0Q*8g|pEHys-L03KwRCCFg`V*6=Pkb5VvS|JASpXui6bf&ilF9hI78w$6NIh4cjnzeG6Y_ zg^2F%kqWmfvB4x}+`K$E_dpd!aPm1jbI~+k`+w>`x&6y{hW6GpWM{{Qu_sb+SlH7O zQP->GjPMBa-8yM}|K@_#G9gvQAqq;XxBnXv(paVM7BZk&GBU5sl9CrB?o4sViujv5 zGv&jDVZxbc9=BW_%jpqN(>Fdp?E-lD+y&&*G=ms)=$}{ZWWP9m$41aSDRgwSxS$~F zMS(WMx6MDQ?)Rsjl9a#Tq~DdkD#v8O2u5OTYlfqcxNKL~liQ>V6Cdb%|2==_7k;OC zrlNOw>yMzl3B7G*mT_fH>pbY+X_HhwJa{P70}CfnggknBR$M|NC{v^fdUcdMI+4Bg zv6Qe4lOOgmU$IAl8?#p`=0CIT$3;BstlK@jb~{V8;C_;nVlgo2P? z=^gWnc&|aPrw0_HL4-Uy*czB->fQ{`TTGFFZxSO4ukhdWT09*tgFkczfQ)dpxE!xvXhk?`tAS5iP`dpBeFzsMnVtn z9p~qm>7QA`As@7|@cGJUqW_=~q=eM1EC*zfOGlNyweCCp6Wun}+QKXzaqwFmVF(1f z-fNvpFc2Od^6Tq=>)hm7w7rpfBJ%P|*|ntwQR`qEIq#$$PWoEpIzI;@e*O>PGkRW1 zbmh$(JL+>xPov1*Fbim#(U=}APi>qYam!H)Rhc`u3Am#!dm8b-z)uEqdFSe}a7^oZ}@tDGQ%lcyG%+pB^P4GqS3H}1#=1`OI$#^?O1{;9)`DcC z>@?+vHg0035YhI49T`pGHcEAXNQN(0ibu=JN@8n^YAPv*Fy?F~7m=^1EJ;!{Qf}^szPtBsZLKVbg0L?>h6g4m)llr6d*i4K0b&4 zNXW=*`}-kV1BuxsCANQw%x9DyG7IN5c~#Br`0Tf-1CaJmUcS_EP%Fj;S-r-uuZS!9 zXm10Y zPi@_v=~68aw=xs*IwJM;^?`>wK~lIssdV>|&38Tq3ZiIfnE__!iek*MeL3iP0!?_T&R z1mqxDT6I=T%*?-6fBV{Q^}o$MrKOEEL5VInv%n3`Ia4;w%gdW>bf5#t;pPGo9t&(? zVd2@%*w|PSw>|ak#b0-}L6XYK%J4E3QnXdjj*XL(#NFlLmT>~xWbLaLFqa2& zFF~pdW&`?gd%gCis5V+(aua+aK7s-D13ZA(DzAKYz_keWJ3Et}MSdwEE=vi)ywq6DOTvU++M zE^cmBUc70I0&hbilt@-<8(ZjC9~G+_e9;l)1Fu4MOM|a`**(3FYxd$-{`o!e={j1 zW#F5G!(5(RiUwdMv3*~k2Pc)QeB*d}ddj|k1aUv zN{-G8*iPCRht=XANCmLmN_bRanv(3>Y*)ga;WTI%vzo4MSw$&x9v62{PtWvh`Q>>| z4rOi|{DlXDWkFg%k)ei;F2nB?FTwT!M&9CV9)FFRzvdbm8mo&9_CdkHKEA#$15k)U z03DdF@2D&Od%o6|lA;ym_a-xW@Ct`?kAuTQa0*VyI z9G955aes3TtQiJ^g@dy(nkfSDhIt7`%EW{QrbDCg+k0$AUG02&FE6jJU%!3<1_&aZ zq7I%S!J=X_oW{lr1%v5jc!;d5tl5G39rtMcitqfqGOy}@g7cv!et$nLlSx!4Pf>B^ zKCY6hYvX;*__*?)uPlTD?zjyN4N2_g*gfF{fs2dUHylz@QfE&qEp9kEjo+dLtxX#I zv$HA6^xAYcY5-)(y)!w(KvBkoA{{rMqgXB0lX=OJqJ5bxP&&JWgRmM63TbN-LfVIi zQ6};g$}1J1G%~^=^NuQP+h9}FPRdWk5Hjk?i}yxg+kC55mT-X3CQd`zA0O_>utU+Y zuqeG0NYUDRd*Ol80wfO{F@a@e3}IpED@R|(vcx3i<$I=z)hoa4DTA;kd(6S>-B*ly> zx^PgxO**0VqBAT71%G}0tc}iFGQWZ_{1_+?$iMb54E@kbJ6w7iUCz;UoiizBrqG0g zq-}o?<|^Z1V2qCyC%#O4{-_^(M8fw+TuO>t*VzZKNzo>oAOAHAj(rd}+kQp{%@XE= z?mhJ&X~Hoy8eE%*F6w9e*1l3zql-45kSzv);f>uBEK;IzPFE=h~KTq zh{dSg8^-zWu#PNVT2)zBB`$t%_13|>`J_Vy7f%X*QGjy>f)R|y!9j&=Rs32c04bWW zf{Oig&Z<5x-Vjzq1W{IQ;07gkthzMK&NX0AhOx9gmAmsf$}cNY4E_1D3IXMjsIrnS zGkfABI>@>$ylc92tls(5{@d=CyZ{6#EmqrgY>+G(3?!HWbf;(fZ4SDy@ z9JGFTfTCxxmyqJ$GK7(MxXt ziF0!37aQY!Y&ZA_map|(U3oNG-T5Mj!@IWzEO)FdMLpa-_!ZUEeC&6u&OyDR`?H<< z2`K>&kMOr6i$2x2X1431ge9eNOeTsG43mF1Cf+x+7vkHbi~(lxR8u1_}Fc9c)V-k&ut%|ztN-eXP80R_FGOV0dFlQaw&J$ zUWMjD>_%U#?e6Grq=!3R_NK6>`(6TS>RXLE24VkbbYT(mGFzS!M?2*eOZ0l1gIV_L z+sgpO+54%LfB@I)vjJNK#D?#)vy%Z%q&bKtCPPH>F;IPdymWyNll$qQL<4uUW|qaHD)M)CSF}~c)PYMXB9eFu#MusJBVwmuuDTpR zF8$M5Pa;09&S(ghlGG?R|@eI%N9z_j){CAWa5wo5OIr2y~dY^4SmmD*e>O_Rf4 z@2eHBSLQS6qPn`3(*2aM1%#S_n}-HW)AmT&4ffM|S5^wh$|BX%q}zjxhJuQ!N$O1- zLFbAW(!YPAv(Qj@ zVA|R`ma2~CfdR59mn^QA2SJRj2r4ojIS$#GHD-l;+}K!gFCg^vVV`u^@{5cLdm|1@ zYkB;IVV+6KbLs{l$&?zSX^V+TDNibugryebaYXR_pTR-(fzzISz}~vLf;}oN=9J7v zbGqF7pz)~;Ac3($Q(888!%n;Tgr}&W7>L* z9c}6Z!x0$^>-p)tIdOA00E1|N0ztb&pv~Pvnt?@`>}lppEUAR{Z0u8IWEbUaJ)L7? zulZeP&#`?YBGBm6TZ1R^t;uQkv8`><4%OMK1zci=Ypf9C-}QEMuq6F38;Qb)0N8mx zZ(efNPge$P2Ghq!LP?iljh8U1n>KK|&ctNt1tC)LKy}ehQc{vnT%5)AZILx%BnzEd zbHqD^E&w6`pC{7{3z+`U`*B36DPRg6{d9MB>_vL|Vw%hnmZRf#5~np~>jQ_fr(k=z^rD_ZZ2kmS0TQ0kAX~-#z~0HAV8VO;AD+zUBn1-gyBZ zw}2b9Pg$8HcxWB0uD-eXeAb<^z2WZY(aGgeFt861G56GBp-eC+U52qA z=}?f1f^2(ymOUBFpwHx_#lgZA{PS>B9nL@CYjP67cbXmU0?)j?+7m8;U+I@G5D}qv zeZ7G`TYt*=)iC%5CD4Qne39f`rx`#0&@p#9kHgFDZE@!tL!4F-C9}u-Xix?1xV=DU z*JY%q?@Z^%0pUxB%2!c>Nn%YL96=H1YxcqP2MQG8``Ddbwv_%V4Ke>ubTLp-Q9gHf zS2K6UnRX!@AD<0o<6(j3yCc%(f66$10lMA$Q@znCT1Wtq$fhr595V&OouBRd$fbC8 z{@ZIhxjS|ujh2K#`10jvXrT)HDN%ZlvJ3V^Ksr=S4aNYf!epI}vy#acQeF-Zhw@EW zNQee_rFvTmA_y=igws>h_uMf&z`2To;Sus;ht}7#A;7jb*n^X{9|9qd2Am>wkt%m; zHD{+_uccDYs|5y(1hDKhfR3mrC`iI!>a2~0B_t@@a*IXDyQhj#og*Sler)t^Fj+5~ z+(FqO5PZ{TEr3Flv>{qBY*b&76^!<|TDveAm4xA^bV4eOM2x@o6_~@@~~I)6h62>A(0^=st@-oix73}`$cimpXpGMPmg;D{!>rN zrs)R<}!jgQ^$b$4NRkwl)(UL*e*Ma+pAtvEY%XmRjv9}*7 zi>yV-6wioZxFjQ9z-;z*u_*!b0#l;1G4h0s06W{{ge~y2i1Whd=dyhp@JQ?H3JOnS}j@p%vRw zW7{AATA3ZX?PqrDr8wS~BcwFKGLyL~&!_9VxKsIIVW9H#O#|XyCmS}5tqWNH8Q4-nW zX1vz+bdm5}PzL&mTv2keTI&oHdwY=^619D9+FmKU$u30TM4XXuSN$#z!$IiQ4f_J- z{-JlZxSU#;5@R$6$rOvO*b!g=9`AlkBpPno{4*8Ne-{o)YHFGL23k1)$=UBPCQ^5-`uO&Oe$~`;+pZ+Kq0tG7KsvyrdYW+coc1e@{)l1x4VU91F{vR#p8j z1oKq>J6QE{-R|MEt7{Yq3Q%Zn9~-OO4wda*cBTmOI2B7O3bl*|(T0(Ao429SHm7Sw zMFmqp|I`fr6R4|>$jSvW3$?q^FFvO7q}HHY-nOcqGBLX(@9k@z69?w;f!sy8Ny@LN zdB^0-PZ$1PR%5FyV+A)bsnfe2lrjBx;;hJgqNCXU0RaYQn|-PA3M)>#GUxzbDP zN98fmwEG&iHd&a0%P!qC&4D3&J+&VT6&8jg7G&_Qb5Z~<+|MLhErU=YqZN^t*S`7W z`%B>QgsX%4W3w|eji^A67^{a%*~@P@K@3lx`j0S!eXdrZsV6V&|3j>1a6d^=$CAB!7kJF1NhEipU0PZ?mMH??+PRw6?-pTX1cw%S zqYxn`He$2Zp>us*;Do5~^(!S%s(jJc_W?8urht1eS~_A;X!9xJ$POJ?ZT+2 zsD$A%zX0NbxI`@_B_F`yX6NTSdV1ghE-ff1P}E#$_jw5;^!Vn}TjNikuy~w~!ekN| z*l(-G)G&f!0cVo{oI>ByG8`nP6oP_!j{xxq7!4-DfVbu1;%Z-6(eu0v7b0!{?F+wl zbQA#u9MH}HWC;FM11(*hz=cO|_`|YUG2>&vd^z|QnC)l9hq<{qfP2L7D1<^YWjgvs zMgi^ZLN~Sj^Nr-G)gM$dOl{7-5?0mewNqjg7KK{HtayeRqoBO`?C7Xpb%~0Is4w^6 z{J-H8z2F8pFK-G^2=xuzZl_o$g@+^GZ6)eyh>OF81_gZqAOuM${16w)o{sbOEwhJ* zM=g-mBqS&IIUX+$ef#!JLrDo8GqhV)K_PM|l{=Q-^dR2AHuA#ZPxs}(~&X?mdjFlq-ce17)7v0=OgSgm4 zL_?rVj{h)cbK}7#rZTVs7W6L=F@;7(8gp7Let8Lp^aT*uv#Wghw0G7p=Y$(ta#r=M_8Ax$fHpZE8bCDU<>j*lW^VgSTdfc6_U|Iz#-n<7cXw9;JjWAB zD;M5&>#33_t8Y-5^a>uH6=E@-BPC0ZT}8y}_-DcIS8cwe%tAs&2FdyPdGUi?LBG}l zC=4W}EqQ(R^sIcI=2veXBf|-6kO`<`X}{i+Fsf5Du1SS#9v z=v-L-!0@_w0E!!PfTmoOm1D;Ldw(^LKBcWrGf>-v2z`X{5;0E>TRWJ81>4YTt*)ho z-}|;a{_12+1c+#+orgL_PT8qH*Qm_V)6?4=Epm5tb+!Ng4Feo=cXucb8P;o1#RvqW zHTbtXwmXrJ3Z!y$E5~4(cBhKBGyRGA(^s_VsiH`@m(9f`Bp3igdgfgg7WB1NOSCKHz(qLp zE6B>mJ+1Wj7xgec3(o*Oiknu?2=E+Zcj1;)nOj%@d8ODR9|Hr5`Apd>;CIw?OCJDp zJG(kwY6=ACzCVL=E3tmx-cq(9Wb%q=hN10!Tz7fF1BaOXJTZ=CvFaru1qJ44O)-0; z!$dP)U8KM*0&rUhsHnXgy^*&2lkcBpY(iTxB#_xQFTpMY=I`IXZ{8uoz5oXwDLp-s zK_xCI-~c@9A03SjTu;E+nceQ*US@SQ7VvEFkY}Oc(PD!}vokX}1w}N_%I)r&lxS26 zFDC&~?G030gn-irMMn1Sj%8OG4q)eAsJ^GAExOu4LO~J#_|d0dP*9H9a-Iz+dvNMq z&Z&Wk1}g|YU=(My~@gveL9?N>*lVer@g4u8#{ve4@fXsn0k^z2QVCWN8d7pSdIF^D+ zND15bK;Z?1R$~v$k2TJx20&rD8qT@g4iNMjIGU4LjSYYp(>+i;NPL5mTT}A~DX-Q; zpAtPocRbw{8rEd}%N0wXhzOKt*(tmE^a;^xGEM&~eFw+d+rX)v;Uzc-63J27Wg{Y4 z>6^elr3e1rKYvnincDF{T^*$KXyc7GF@zsJOs&|*Nq!BAXdN2puojm5+o?1%2FuMY z7S%WD^sbIh{V4nAPrswLA_z)|!vRwm!Lp@^4B!-_UR*pF%?-_+->3Ae)=eE$TbTdx z0>Z-j=8KipWczdxI$pB(f0VBx8k8|0L);{@qoc@%hF9%LM%spHsH!W7iH7F=S8|ho z59?OS&hg*%jSZKb5dy#NUf;A}t0aajCG{ClI<>u1aiFI3^Y{Nq8(&m1xE&>p*U@pb zaklj?Nnq(MV@ubQ;lCRLbMt}Eb3e{JFg-zOD1X>Il~Mx8p^}ntNm*Ij*1}auSCTy2;-RS--N2nk*`Uf2pzLH&C1aBCeMn9z=w^9C{!4ZG`{Wr=~%Tjg14skd9)Z^77~) z4b_^$NC&zB=kpYDOm}evf7@ahHdhD;FZssrdl` zz?&rAnKv>C&Eh*jm>rnIG1)CG++{j4TSd+dAnZoM-$VkqVfgQQjD~hdq~LNSNTDih zHz;M(c!G|j5KJey4!D2VF53gtuzs~-4ei6wlmEM>sjQ4`G&mccmBm8H&4TlA>#)U3 zDLl_N++%ThiH#OIz}1pC2#kspJ5hg<=3+TTGal&s+Gi_Qeosz9^5s9|bV&vUtkQF< zr4_~`By_624T_NWOGzO*I2__G_Lb4971iG!^V*dB<7eEAP zYTB?nr*gA2_5+;hN^~Q+40Ofq9sYqf_t)(1j}43<*@8_={umUnM$f$u1c!hZR;5Fw zr8z+ET4A*$D&M~&4Jg{Omlvn9N>!y3;3Xo*JFJA+@bW`@8pxJHUGyO6ngDbSqY${u>3>PA}ooB99Oa*6MUA5*P0RTN7aqZdSIn{_Vftv|(j?UF*v3 z|HeG;PvOC$=CE&o#L%Q5a5(J)$i_FY<71I8-`o42Ot#M06sSuFEnONu{GNwT{%nH*;!VZdTnK(=C5e`HKe;I&){J8SV=jMsbn$ZDo!6Bj2j;Qk(C z_&*h2$lJBqmb(|*!xtSfROO~aA8--Kit=kWcejmzjO>`hr49HIP!+J5_bqO%aGS{M z1JWCx)G0B9F%+N$`TW^nbL%aThij~H6c%zbaZCrstMcBM8;>lnSI=lTbRVs+v-tTB ziLJC&dq$&WZR@i`7F!>1L2yv-`9M~trvQv7Ae`XcM<7A~N+OC6AK;IUE&;3b0n@a$ zJ@k!UlPx4R>Dj+5Ho&hQSol^{G|;xhzXSy|+jPQ-iStJ}KU94~!|#PEPFW=-gz@GL zuh4@1fHnsM_IrOYK@YCgl63DfWez_kduG+^cBg&5b@ zSp)+%*|r|esoMd>fu;}SWI1rdEFI6XyfD0`=nTCV5a5D80@xJB3=!HAL;^2?_L^?Q zm6??_?wB$94}>qH6lfl?zp}uos}oqvu@JSmI(*W6>Lodr5EkZ<&(Qq@#Z^#0p!Q>f zGoGjf7@UTlK30&CG4T&3^sSH3bD`|!{5C>Nnv&(u*Z8~TwkIr>WLeWCFq^`lJO+?B zv;8))OO_mvpkAM@Q1IMhKg*sQ>|1Dh#B^(z)P-IO7z!H6eL+nH#-N&t8KJ zd7X_LA9vT_aK28_ob7|U5}6pll4m<0@qXxz&NaEqfokmN{ATG|oQ>xHnSR!+kC#&k(CL`(`*DBRE3%nVXkz3m8!gP?NN zlOy#IH;s;ciE03yAdRO@FVPRnERp^GUZqxqo1Ls#pa7ex2m!_A>zj+t&Ax|}2Yc`^ zTumCbGCTMA3#VuETrseM{hqb?x-PjX<91M}3aGK?@|e>U$5a4R4eh<` z`CH!htPK=Vh#d9?RjEo5MTIy*1mle;wmHy|aw4;L&7pO^QFiE|_{ zT8SCojbk;H+nxy&DYqXH{Gz50ZPGSr&=8nxR)xOpPyQp&XHWP<+ny~!ZDT|8UGkIt zo}5bqf~)Jec>MW6GD2e`3xa>YaiRI$`G_F1$tWqfx5i;AC@h&`tFcz$`uqE3?zs$nnwj|*<| zF&jWcw7Rwi^YZ0OE^h8MK)u+P1)WbwQ`7##Taki~xFFuYNO+5fhX^zgKw|R+h<>yK zMlY#fHJOsBp;33*NI$KXpfKVG58MR!1d|VxlF-IiN56!BYtLYoadxyt= zbajdD?(Y6!)Kvm^&XQ#V08XX=_x!4ihC1qPH=#t*GVrmB} ztctIF7<}&6XaI^KAR_vJANQ2cRYt!T76`yXCUIEegZoej5D@;MGFi+r0YqHG_UTz= z=|5wSgotQ5m3UEfJGbi^;TPpfn1_e_|6aQk>Wc<`6e#tN%iyxZsE)pK-A?Ux0o&RSK b_kzvL(PRkWCobShDnv?5UbIa3%lH2U2N{ki diff --git a/_p_s3_u_s_b_8h_source.html b/_p_s3_u_s_b_8h_source.html index 660833e5..ca41061e 100644 --- a/_p_s3_u_s_b_8h_source.html +++ b/_p_s3_u_s_b_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3USB.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,137 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS3USB.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _ps3usb_h_
    -
    19 #define _ps3usb_h_
    -
    20 
    -
    21 #include "Usb.h"
    -
    22 #include "usbhid.h"
    -
    23 #include "PS3Enums.h"
    -
    24 
    -
    25 /* PS3 data taken from descriptors */
    -
    26 #define EP_MAXPKTSIZE 64 // max size for data via USB
    -
    27 
    -
    28 /* Names we give to the 3 ps3 pipes - this is only used for setting the bluetooth address into the ps3 controllers */
    -
    29 #define PS3_CONTROL_PIPE 0
    -
    30 #define PS3_OUTPUT_PIPE 1
    -
    31 #define PS3_INPUT_PIPE 2
    -
    32 
    -
    33 //PID and VID of the different devices
    -
    34 #define PS3_VID 0x054C // Sony Corporation
    -
    35 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
    -
    36 #define PS3NAVIGATION_PID 0x042F // Navigation controller
    -
    37 #define PS3MOVE_PID 0x03D5 // Motion controller
    -
    38 
    -
    39 #define PS3_MAX_ENDPOINTS 3
    -
    40 
    -
    49 class PS3USB : public USBDeviceConfig {
    -
    50 public:
    -
    58  PS3USB(USB *pUsb, uint8_t btadr5 = 0, uint8_t btadr4 = 0, uint8_t btadr3 = 0, uint8_t btadr2 = 0, uint8_t btadr1 = 0, uint8_t btadr0 = 0);
    -
    59 
    -
    68  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    73  uint8_t Release();
    -
    78  uint8_t Poll();
    -
    79 
    -
    84  virtual uint8_t GetAddress() {
    -
    85  return bAddress;
    -
    86  };
    -
    87 
    -
    92  virtual bool isReady() {
    -
    93  return bPollEnable;
    -
    94  };
    -
    95 
    -
    102  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    103  return (vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID));
    -
    104  };
    -
    112  void setBdaddr(uint8_t *bdaddr);
    -
    118  void getBdaddr(uint8_t *bdaddr);
    -
    119 
    -
    125  void setMoveBdaddr(uint8_t *bdaddr);
    -
    131  void getMoveBdaddr(uint8_t *bdaddr);
    -
    136  void getMoveCalibration(uint8_t *data);
    -
    137 
    -
    149  bool getButtonPress(ButtonEnum b);
    -
    150  bool getButtonClick(ButtonEnum b);
    -
    161  uint8_t getAnalogButton(ButtonEnum a);
    -
    167  uint8_t getAnalogHat(AnalogHatEnum a);
    -
    174  uint16_t getSensor(SensorEnum a);
    -
    180  float getAngle(AngleEnum a);
    -
    186  bool getStatus(StatusEnum c);
    -
    188  void printStatusString();
    -
    189 
    -
    191  void setAllOff();
    -
    193  void setRumbleOff();
    -
    198  void setRumbleOn(RumbleEnum mode);
    -
    206  void setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower);
    -
    207 
    -
    212  void setLedRaw(uint8_t value);
    -
    213 
    -
    215  void setLedOff() {
    -
    216  setLedRaw(0);
    -
    217  }
    -
    222  void setLedOff(LEDEnum a);
    -
    227  void setLedOn(LEDEnum a);
    -
    232  void setLedToggle(LEDEnum a);
    -
    233 
    -
    238  void moveSetBulb(uint8_t r, uint8_t g, uint8_t b);
    -
    243  void moveSetBulb(ColorsEnum color);
    -
    248  void moveSetRumble(uint8_t rumble);
    -
    249 
    -
    254  void attachOnInit(void (*funcOnInit)(void)) {
    -
    255  pFuncOnInit = funcOnInit;
    -
    256  };
    -
    260  bool PS3Connected;
    - - -
    265 
    -
    266 protected:
    - -
    270  uint8_t bAddress;
    - -
    273 
    -
    274 private:
    -
    280  void onInit();
    -
    281  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    282 
    -
    283  bool bPollEnable;
    -
    284 
    -
    285  uint32_t timer; // used to continuously set PS3 Move controller Bulb and rumble values
    -
    286 
    -
    287  uint32_t ButtonState;
    -
    288  uint32_t OldButtonState;
    -
    289  uint32_t ButtonClickState;
    -
    290 
    -
    291  uint8_t my_bdaddr[6]; // Change to your dongles Bluetooth address in the constructor
    -
    292  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    -
    293  uint8_t writeBuf[EP_MAXPKTSIZE]; // General purpose buffer for output data
    -
    294 
    -
    295  void readReport(); // read incoming data
    -
    296  void printReport(); // print incoming date - Uncomment for debugging
    -
    297 
    -
    298  /* Private commands */
    -
    299  void PS3_Command(uint8_t *data, uint16_t nbytes);
    -
    300  void enable_sixaxis(); // Command used to enable the Dualshock 3 and Navigation controller to send data via USB
    -
    301  void Move_Command(uint8_t *data, uint16_t nbytes);
    -
    302 };
    -
    303 #endif
    -
    void getBdaddr(uint8_t *bdaddr)
    Definition: PS3USB.cpp:478
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _ps3usb_h_
    19 #define _ps3usb_h_
    20 
    21 #include "Usb.h"
    22 #include "usbhid.h"
    23 #include "PS3Enums.h"
    24 
    25 /* PS3 data taken from descriptors */
    26 #define EP_MAXPKTSIZE 64 // max size for data via USB
    27 
    28 /* Names we give to the 3 ps3 pipes - this is only used for setting the bluetooth address into the ps3 controllers */
    29 #define PS3_CONTROL_PIPE 0
    30 #define PS3_OUTPUT_PIPE 1
    31 #define PS3_INPUT_PIPE 2
    32 
    33 //PID and VID of the different devices
    34 #define PS3_VID 0x054C // Sony Corporation
    35 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
    36 #define PS3NAVIGATION_PID 0x042F // Navigation controller
    37 #define PS3MOVE_PID 0x03D5 // Motion controller
    38 
    39 #define PS3_MAX_ENDPOINTS 3
    40 
    49 class PS3USB : public USBDeviceConfig {
    50 public:
    58  PS3USB(USB *pUsb, uint8_t btadr5 = 0, uint8_t btadr4 = 0, uint8_t btadr3 = 0, uint8_t btadr2 = 0, uint8_t btadr1 = 0, uint8_t btadr0 = 0);
    59 
    68  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    73  uint8_t Release();
    78  uint8_t Poll();
    79 
    84  virtual uint8_t GetAddress() {
    85  return bAddress;
    86  };
    87 
    92  virtual bool isReady() {
    93  return bPollEnable;
    94  };
    95 
    102  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    103  return (vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID));
    104  };
    112  void setBdaddr(uint8_t *bdaddr);
    118  void getBdaddr(uint8_t *bdaddr);
    119 
    125  void setMoveBdaddr(uint8_t *bdaddr);
    131  void getMoveBdaddr(uint8_t *bdaddr);
    136  void getMoveCalibration(uint8_t *data);
    137 
    149  bool getButtonPress(ButtonEnum b);
    150  bool getButtonClick(ButtonEnum b);
    161  uint8_t getAnalogButton(ButtonEnum a);
    167  uint8_t getAnalogHat(AnalogHatEnum a);
    174  uint16_t getSensor(SensorEnum a);
    180  float getAngle(AngleEnum a);
    186  bool getStatus(StatusEnum c);
    188  void printStatusString();
    189 
    191  void setAllOff();
    193  void setRumbleOff();
    198  void setRumbleOn(RumbleEnum mode);
    206  void setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower);
    207 
    212  void setLedRaw(uint8_t value);
    213 
    215  void setLedOff() {
    216  setLedRaw(0);
    217  }
    222  void setLedOff(LEDEnum a);
    227  void setLedOn(LEDEnum a);
    232  void setLedToggle(LEDEnum a);
    233 
    238  void moveSetBulb(uint8_t r, uint8_t g, uint8_t b);
    243  void moveSetBulb(ColorsEnum color);
    248  void moveSetRumble(uint8_t rumble);
    249 
    254  void attachOnInit(void (*funcOnInit)(void)) {
    255  pFuncOnInit = funcOnInit;
    256  };
    260  bool PS3Connected;
    265 
    266 protected:
    270  uint8_t bAddress;
    273 
    274 private:
    280  void onInit();
    281  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    282 
    283  bool bPollEnable;
    284 
    285  uint32_t timer; // used to continuously set PS3 Move controller Bulb and rumble values
    286 
    287  uint32_t ButtonState;
    288  uint32_t OldButtonState;
    289  uint32_t ButtonClickState;
    290 
    291  uint8_t my_bdaddr[6]; // Change to your dongles Bluetooth address in the constructor
    292  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    293  uint8_t writeBuf[EP_MAXPKTSIZE]; // General purpose buffer for output data
    294 
    295  void readReport(); // read incoming data
    296  void printReport(); // print incoming date - Uncomment for debugging
    297 
    298  /* Private commands */
    299  void PS3_Command(uint8_t *data, uint16_t nbytes);
    300  void enable_sixaxis(); // Command used to enable the Dualshock 3 and Navigation controller to send data via USB
    301  void Move_Command(uint8_t *data, uint16_t nbytes);
    302 };
    303 #endif
    void getBdaddr(uint8_t *bdaddr)
    Definition: PS3USB.cpp:478
    Definition: PS3USB.h:49
    void setLedRaw(uint8_t value)
    Definition: PS3USB.cpp:441
    bool PS3NavigationConnected
    Definition: PS3USB.h:264
    @@ -277,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s4_b_t_8h.html b/_p_s4_b_t_8h.html index dfd82cb9..07a1d372 100644 --- a/_p_s4_b_t_8h.html +++ b/_p_s4_b_t_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4BT.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,14 +88,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4BT.h File Reference
    -
    #include "BTHID.h"
    -#include "PS4Parser.h"
    +
    #include "BTHID.h"
    +#include "PS4Parser.h"
    Include dependency graph for PS4BT.h:
    - + + + + + + + + +

    Go to the source code of this file.

    @@ -109,7 +118,7 @@ Classes diff --git a/_p_s4_b_t_8h__incl.map b/_p_s4_b_t_8h__incl.map index 17981d6e..f2f326c3 100644 --- a/_p_s4_b_t_8h__incl.map +++ b/_p_s4_b_t_8h__incl.map @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/_p_s4_b_t_8h__incl.md5 b/_p_s4_b_t_8h__incl.md5 index a743a9b4..13fdf4c6 100644 --- a/_p_s4_b_t_8h__incl.md5 +++ b/_p_s4_b_t_8h__incl.md5 @@ -1 +1 @@ -2d2bb40edda0b80e02c0310684b09c06 \ No newline at end of file +57aad865c1c7b4a544a7eac684f0ffd9 \ No newline at end of file diff --git a/_p_s4_b_t_8h__incl.png b/_p_s4_b_t_8h__incl.png index 218917b844d6a5fe646d7b83fec26f89d18f5468..083220ee54042dfdf7002e13f73ae0001ec5bdfa 100644 GIT binary patch literal 25008 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 literal 26336 zcmZ^L1yoe+*Y6P0UD8OWln6+7Nh%#uA_yqm4MUd*s0fIFNDC;9gruNS0wN*ZAt0T1 z&;NekTKBH|-PiRlbeJ>eJhk`!#hzGQZB;@%T08^-L8z{#bPs_*%Z2|laj@W(C+Y&Y z@B_={uBsB^3iao0b73k1aRZ^QB(LwAwK?r$eE-)K_Kpu#fDRfq3y*$5TvM%Mjp-5A z)M!chi$-O$Cr(dlMjMT$4N8sm+`?Ii%w@agJ8$B|e54d~R&Wmq*O^c{>dmb1yPFnw5(SXS&J9UXr3eV1JdA zh(SV0J!VxzLqUn1O5nkFZ=9^UhrMLAiZ_s6p4u^RHzzJ!QUx4qLUv{a9OklIHYK?A zZ4tq+%I%*zvNt_uzJA4FWMq6LWQ#>lPme(O`T321vM2sv-VnaO?>Rm(k!L^fhWgec zg8lt{NAu{|Slo#kr|67Z_U-NM=+^}vbXK%pny&rx*&IhRGWz9iw>{I!q^+$T*P^fR zH2`j{Jzo8o96q^CkU&^ixYA=qo6oG4AXD@SI>LFp5{;Xi`*`W4rInLY{PD3b>J<|c z6L=VvjE`jGM^clIhLQDGz#t^x-2|VUl=Vl z8gKC6^gmcPD6Dt+^EsA5(%b6t`~+UK&tOx>DP}wnBGG;&<@fR2C093w>Za*z4^v3m zRfR>9H+*K>C;I^sQqnN^VRLr4WnAyd?0>i!o0djVX4%TfYxDux(h^+bh3G0T_4~Ix z%KemyiHVwqW^N%_77Ovv&Ti<0RlzazImsNdL?vTsWo6;?U}N=9vm^|DZhJe)ZK2zG z;EnWnqZcpgV=Y52C|OmLklEP`dwY9}1F33kB(X|M>s(x1Z7Hm(g7*FN^isYgQj8Ub zZf0g?7;@z~Ix!#eVO{+QI;_@)3u0npQ?8PG7IK5m4);7%blymP=}x2@s<4#Z-}pr= z=l0Ehr9YeUMR7$%^5w-D>+Rc=85tQhNr}&inY|QmGPnChMMbSnH;KLAGeL(FC*nAQ zv$nQ2{?QH}9uF5$?>eWDv7+xusPpI%2LT}=8bVoF8Ha!X9ymKt#M~=9B4VgHz=xWS zj(07cQ~@@6qF~5n;O1lv=${QO~Pv*M*f!&BY8H&+FRSbA= zcs&%5Bnrlg>i^$!{eK0P!LAY|_VDoVaiXw)aG0!}oW6NeBP-*clj!kqa&qEeqL)2r zHeK@C^;KA18&#E;&m#La67lANGzCQ`Z~6BU0(x=Xn+GKA1|qiTLuxSXr=B5MvRBk% zPx-t|E3Nk^U-MpPj9`vnu}@VwI%LqWwL5yf{Id&PVSG?3lS6 zsGOZO(;i?mzoV`}#;7!StgtVCKfxyF2rPS!iHSHpRoI-CqzRNEPUZZoVr`wGvCfRt zy&L23?A<%f{f#=Rn`RQQ<$6hQ^v~#cczCX1V1H0O+I|XaOn=i#H3kp$UgXr2Lf~$f zHca^3fNW2x6dIb`&-aJpwOjaEGC@omW7+rpf{?2$8VbmN)KOo)XJ9{j^(wYGfU{#{ zMDB@~&&C-2x0eCdqa`Ht(*9;o4#@I&S0!L~IgMp0JFF^VVrnXOM2$ICgzT?s`yTSq zc&sogbwn9D{Q6KeVS7W#Oz&=t>%{JYPvs*mt``DKVcOZRE2(3gL#sfG;bFb zckdmki7OYp`>fa+yfIjoA$_=YhNr+RHqWATe@HCGRr|pMX88Pqu@u+1k9A@_f0|QC zNlD|c;S+sgAY!IXmYjL2pesf8v^xPqP3>#j8|ifh+`^(4H?u3fHm-|%u39=zddF_L z;tV;!o+~UfA&(mzjD}FdLVNq(72G-K@Hh7H<=N%&!LL*tT)#GNaijwu%;K#$)%NVJ z=j@6msLyk0SqpPpkZBj2+3c8ZS~ocjBYC2TL5{;Y)l8Q>*CA%T_?75*tB%w;I$tnW z>9m!mE|r8{iY_UM$~jsoMg_8&v5_#@2a`|!J4aWh3o2Q5c1yN9vxFpgC*t1D5($Y1 zzlmZ=5_3&vyz{&?RN86iHf+xh1w{DK&_aug(GE8=kc*2xuOz$#-rb`?O`VX)Upk#? zmEJ7Z-QBh0v%lPeVq!Lu?@XP>2WgwUgJPY2Kq5o7$yrjuh>ebQGfse3zvLHeg zO~sP?R5=>pyx^nBOU>_+@Oc_e$@{s|`w3SPeM1*)2Uk48Ar2m|zYnAy4P0U`^n@T| z$z`o2>Bkc2f0GUk6~B@^x!eW6@u`Mo9+RS&h-bhhHZ6rfIG8T=x z;EOw1cgTx9Sm!A0TwJh1t}1qq-O!f@WIJJ0{|T=p5Rq(_`bf^tKRr!C-q-)Pe6X{U zv*5P)_2&7>iZbk;|I~BCQ%%>CO+LYi2s$a)M!hkaar=0!P~Nzf4~J8G$`1C9vAlZB z$k$A<-{aM5=y-T>edn@wP8c|}&+)e=Zg&f`64-G|{J3SOA*T6i@Y*N)s|ZP-2QLDo z_%~3dkzD?(osZ=-&PP`x>>BFUCV*nk4!YD%q<*`ktieC{4rj0|ML(4B})gK2`OY zJ(xzkroa;#mBb0Gx4tjA8;MwzXOs5t*EigYRx;1EVtwzFfwpC zEwo4WtWNq6{%QWEtT%M_*KJo5Uta#mBqo7mG>=V*f{Z?}H5_xFDI?*_?@!5sfya*) zSMH8bXDmzl?eU|Q=GwJk9(!GJ*V!oAd=@2X2*;7fXVFGYgdJa>rKcx{qiZPKcAIM_ zr=V2-B51(wN5jH0PjdZ8B{79G&p!>RR+E>1-)*J;o5sKiP9*xP*R)n!6MFT5Cz7wz zK1D%rNem5r>;Mr7UEa=8oe`-ZLquP6*@IwyjeJg0JeI;rO3B}GgJSQ?%0I!UQ>yiT z|5SbbYOr$#O5bAM%hr*39K~zYf=V*h58oNh)fke+Qe0k&ISk*=GjNCzEq<=gqqs2^ zzkB$k_B=$2kywgx@M8h_<#9*m2TQ$=X%s@i7YA%f3{4m^ImE^Lt?xP(&;kxM-_PwR zIYCO*Uz@1m`W%$W+A2VXYxU?+OpTN3-2UUn(0i1dTR$ov|1^eBq!3R5z8zsrEiO5ELvZkVrf6bVb2H6k?ixYvvt;$u z#`*3<<(eDI)TIRklBjuV;OVNl2rI&3XTH6=w`U`X*)JJ* zEI7%W_VcYg#_6VUd)Gx67gIL*e_$b`%>SX}BjR~OwbGhdP{97VxjE&<3oL}V?~YZ& z6OEbe=_YK(-fdj2^3o72#62aA9@bbQ?S zMD+LX-><}67-_|x5-2JviaeR1h`%nN5**wzygrLQ!5PECh3htQu<-qENt{10Xh-Wi88XB;+UYSN^@3wzcSlS+KPm{!V?d zJ$m#g+wvtp*Trv(mOvWe3AV|V z@z){y3it?Cd>~Q~xkfm&%mq+jq|}HQF*`dOO37Jjs=F`v^h~8E)-ML0_9QVBS+>e_+6aCB{@wNb*bRw9w*CBhzvUu| zkPeQDxbsxK-UDrUd9=X5z#CNYPUhImuft6hXcYjw_4g;GH~L92zSquiux#P`_xTz=)my0M zYf4Zs{>emjSV{^hfaA)*6L*B1r>BUo6eGWReJDK5Jiu&muXPG3DJd%}E5!Bd*8yAT zJouo*5(YbQb8E}m-X2?4R#uJeIo`KooGtQq5@|?rsOzy|J-_z#wF8c;bQoeupcDIG zXqVP9YWVZL*6w^)JWt&nk7a`GKh5!g`>f~MBkhPjHon`pKbr5tKR!LpgI57Iqa!xQ zt1zzfn}?>RlKUTRCmNI*rr(w0)XtKFQrWQLfyIKv$B!Q&_PP4{`?K)y-~pUzKbi@# zT>kuLeYCX7=kEg%r!j&D4<76s94MQc(+3~VVF#Wpz5LqC{pL>4)D$lR6o9NomH*#%&|(^4 z%64f}8ZYlpUywoBnh+VOoGxV9=oxEG9hIU{kpAL6rGS7y_qT7QDg$~26P^Dq18$PV zzIr;{m>wVy7Z>+xXUBE&hj0u+j9TOGO9vdL#Si`XL5QmMVk;{Jkd(M7oJ~OsIuw8gGoTt*48?fNM~BPx?)hAt9tc5Hf@hmO+?s@7_|oN;U0<4` zfE7FCWR25xm1M@mNc`)0cHds0C_3Pb-d7LV0`XsEfd)fNOiUc2|45M@EV@p^ z6G8%lN;sK(#+3*l>5M-;B1A_=N5vO}aib?UtjW-OExP^HAq=MAV`jrLV?FC;IExdr zLSA?Dt@KV_LddWx$qtwx2QL~k_o>g!ck(@dOgl8R!5?)emlo}A4v_^`=$pe3S{%F%V!7k|CR z3`@z%qFm{$>LN!>Uo)6q0MYWb^evZD?j5ioFn!O}vJGYTc8BD|q|1 zl_X!Dd|6q7H2}QT)y8t=Q6L)nv;QdqMuBL~QTBiVy|{XLg%y`O5sSlh{NGA1P=;bK z0Joi45zn>xK5sQ8#fJLvu|{_N*NKU^fT1x%u3Y&Z1k%6cm+tCLw4K{@&PQ^^^5?xE zQN4ye(-VreVddx;`s`UlTBurfedEMv1G_$y_ST!@{o)>vMECy1@0_fZqR>%6nwBRq z9EubTI}`@8463;vfgLbEUbW`xS&e%1IdgMoQu6$%g1OAwrO|KSno!HO;6M5y5n9pu zC*J3;d%7w1P%tDywwpKcWn|1Moqkc4nTg@?8u=^gB>QWsPv3s(9N*cgNkPSPH2)|l zh?(jpZD`14MqJ2MVwZhRxq|O8e!-Z0H61)eJrGW(`z8@a6~lnt37~|wmt@ORrWLCV z)9k(>)AHzg8P9sE&g;4J6F-NccH9RKLTrA2yrIUn-dvyVz@ec)Um0>mNI+MM3vhMe zd&V7y(GnSevNwMg>Fu_Ky%d-!DkE~*n3uS}4e0=lCq-8ZWPHZ3m0#*G?s-u`v$clfCl3jlDg`WSHA$8g|EAleu)U7g7O!NJxxC4t^C$86*mLubG;XthjTH=FiT3tK!@FeYajFZ~uKj3_B3#+| zH_$`Mc!>_P)G_=#_+iS&BKFSkyD#75xy;mX@jRdVp7A>^G{&^(7A_h<#rzSlYGDY&asWfOV5J8A1XY_=W|XX7a{ z8|wGnpC1282a4plqF=TpCV3?M6u>UU|De=O`jFlJxY*GWtiRfE-7@JpM$|^Jip>%T)83E{AhRGZ9r* z^0J##cTx;x*|QcGANDr9(0zQcVK)Dj)bjY`;0seo)|VnZvy`m!q^-&rJUz0K{GuX? z{k2cDsL(MJq7zo(qEllTAs>?$*R)Xon~aB-Sbe>i5EMU1pZwz70LQMdj-++Wz~K$52HMHi!09 zB%G&|)cbAT#!9_hxT6YdqdM4xj*6u@WQlXD4ro!<&(b=l`5T5cwFq~5nEs5n1flom zgz&YlW;zf9X5U}d5)BNjwK_YzYh2ZiUut+FXPNUzmgV)A-d-|<_-#!yQVguX7>||Z zFa7-#7+7T;>!ZwYFrA~7(?XNp+y)irZs5TvBMxR@mc(sxMn=MMqS$A&RUd_;0RMbq zT`ZYjd>Gpi9klz)(r9<1f)jNrH-07OKENSVy~%v-8+oyS764K| zdtH+8b8+WHO7qPWC8zdxxqHKs`>R#xs>y#IN%GypPD7UHeLP(|KdCgK=nP)#KBNX7&7SO>P@2w`?0X&e^KO(c^itmK4C0Y$W9{xB0u_>o;DdzkfffR|87f|8Wd)*$`$BE4aU%6%V1aHPwN6ci3tx!|4@ax9>Dn73uX%ev zB8mT}tE>Ai{Z~D}=^Ns{qAzaZw})Sgc3bL$s2wfF$Cofpl&BxtGdR%*r;UHPpD;8t z6T^G+RjB_#wbO1xPKZp>)}(+@Q#SAv+kY(bqGE6|pUwowhGG0-W|`+a=_;LAA1){a z1{T5qn&?yd`2Osgjh+J0!PD*f@o^ET`>XJD^k0+(OL(o%yb_$VrI!@7*dQZ8h&Vn> zTwm5-`se5BU8|=fhcxi^evf#YZsGoS4oRCXxGO`K}FS9mnrfXs-FP1o)Za5aDyN3q2s+wkWa$@re7+x5=3zJiPStdVmd(z@EOT~i zlD@XXDzc@8B%X?}?Qo0S_1`0cD8k8@v!ey(6p9@D=e^VqA1zyLPa$5gjuM(?Ac>e- zA~VG--xd{Z;;I$vV*#&KsFP|Ommsa8;=ejtY8ScE45H=g=mrK=9*c8TrQq<1<>|$# z9}tQuF^NIZMT3%?VU`mv3hW(#w3l85h?V z{9B0y?ey>|N$k$>TFk1fbdKQ3bK?XeZD zuX6%T+UT|7x;5c(aIG6n+P}V|^PTg@6i_WBMp6r6aLm5{NPL!2Jo!ocYNtc*-TSz2 zHQ^e91UJ$(<~EvgqMnpKGi1+&YGi(OX!4mx>6_2GToiH~wj?AZx$nQ$%d?RI4J1l} zcO@zI@afZ-r_)o$32~KQrp)Wi6i{hpu7i||r$nMbjZJu}l_|O0tYd^CV|(Z|8ynS% z_31vwtbx11qu#JzLqlY@?1Q5!E3b{$yCp~{E+TUkrI%LvV9-$nyCV}D`D#mWq&+2Y zVXfY3Wva~nJDJ@@NH_Nt3c$kfSq9S*Gk!L-MK&rraU_|xoQt3$$1MUAE{eBBYIv%u z_zAS5kRPg5pwu=_cpj83DHfKVPCES4gE>V_$kocJR*{7dK;FpOcD-TwI;*%Z)!rVS z+lC>%f+7>M__56M)EW63vtib{?=zFELj_u=A}cHZTG=S1((_R|W%_vNR zk)no(Rl*`C4aF?Q+dg+we~BRo86;#wA4OnvhKRkgg@KF#`#GPwQMl9jm>2! zB%m!<@i1$k?{{dg3&?yq`Iqbl;tcisvM>FL(l<&(Y5;!XTnsC-rVjB zzhqsmhX{v}A76_oZLMb8cYMQ5rDX*LcP{GW9|KS~2?^n8%*Y68$H9D5*0X#01Yk1H z8Q<5CH?lg9=;Ev(}H*bR-;bTkA=rRY{Z=vq)CwESohu%$|^-Q|o%+1SV!NkOD zn=})9odrZWSOj=@Ti-dW{0opa=%1W4E6BNalHB08E8r)J#R-tr*UxVb*aydo%*xWd zg`3%2%u3i7zZeReBFJ&XK$cL#UR%Spwz@HVQXGJD2C_k3KAepkRQK=3RK|l_NTP4t zm>47$=V*CP^XycTo?^$`z2WoC-XJ_N$%%Ug=A+WbgXLRx1>_YhOY&VDeWY@^3 z?HL=RI#{RFiC*}B2wtk>&fflhEW}A|divbrA`*!1{D7lv<0kK$;Ni$i5WM{+F_G|v zfMvhNG_cDqGc9%nPxEM_qF5G})*juB;XU(MTX^%~Uhf^|Fgb*zWRpbtmxWzHuXTM) zY;2HqxO;u-v)?C8n#;>e zhv9d)&QG2QJ(&=J5;z&z_x*b(5|`Y{);0oW&i2n|zdafTo`ACZh1v+7OEf);DP*Qd z0XwjMNT9a!tvjMBYihcVcNf0xKhv*~{pTxne0J6`JfbF zI+DO3lMC(}2rNCxvX@*lha<)JcXoE*z@wR)n^(d_@z~xw^*O&N%|H`GLqo%}ydVf| z@cGM_nx5Vj(`B=~_OnnE`1B0ObOlqjdU|@A*9?Ra{~=?ql4D}5z(ZA17SI-omH^JD z0nMG|A9Rtn0^Io=6?N}{Ug8P-VNks3l^%QrqDaU1@83d@Rqeo#k}*4L)jc$%cliL_ z%71_Li&V&E7A`TdJuE}U-XVUF zo;OT;`SSY0(vm^`QQXL%k>Y@i-c+B`=0C54`@ymF(6rj&i;{|pFfpT)m4x@^SK#w> zE`1HoZXq6Z#*k{Ns9=4v?IFTK`~!B){mi5Hq9y1|7))&sf$gO{<^OEiA4kdi3h207 zySuxn`!B4m^#&eI`%u2HJRLu|ELYN65V-iPm#-pZQ}yaMxUVomcMlIAfxz(T$)xCs z&n-#G%%NYu>}#J+_p!0F3pIIf*&r2|Q?s)z=Ir%;{qJH-K+Th>B_o0;rIJPf2Y$sVlIEO?)dK)onJ2WBrhG6 zPT14D_st=|$4_-J8}f;@e&s$xquh%B_vOO!ayJ|Mg&5^9*lu2pm75tIXP2#xo4E5f zYiZ5Hm?eF-)BOIN9p&fcy#k}43LBXaC;&F#@uSYr>;^xW5DcMxAn(J>Zd_8G##&N* zTparStiflgsSzj@1onW}n-UHX4zym26uZ-@s;VLoITaT9KS~2EP^9w4nB7Zj*r!|` zt&e}c-)o(ontBEb6!_893WkOMmV)x~pf%WH$+j;p(>40NXHRqB$;a<4o8UFeRg6Xt zRXB6*mEk5ckTt8%%*^qw~RA1FW|YS_D*Cgc60CH=kHIVFRWmX_8x zslOLz|1%qIx^!gpd&aGRi8~=70g63}&;AE^#l^)n{L$9b&c8oiyEr?laF^sKwl9lc zfAA7=7&svE3Ij!#a47w`rLhsxzRC~dQgi~9dP2m(!4 zPfsOt^Q`krNQ7WC5k}}b6enh?#u5TFP=Tq zU2sRc0p3A~d(p&9D*pZw99plDVHnsf($dYtD_m!iAJW*;Uc86`OwPv1$tokm$ZJ?8 z7lB0x_A;{tVKOo@*ONUv0tN|+s;a72x9pPwGyjVl@53=!(8`ve1mmH&+dSs;)KpS3 zvhbYX)8g-<9xMIIAX>4ouvCIwPVwEX^ z^*u3aysBzEi|Zcf@=%~`{xJO4QcsWcllziJ_vmQ4kf`V*37_rnpp?A4!|Ay*E8h)h zwCd9*+vWc3Zz!z@&Mx=}zt_7hP&+v}b$|I1mLVM=n)>pk(UL7$EE4FiWEyhvRL6y~ z&0w$9tY`jD{se}t4d$LBSPV+nRzPMRfGCv=s?WpkKYnDOLJMdddp)HSIlPmcAXD*5 zh#D9^HCREyuy47|D|HVKKd%C8(sH`a%fZQ6*uFO-yPe+B%;chc^pfAA&)C>l5RRC& zc9wYV&c8pcOe7?2B9DiWLqC7oPEAd{BInc|DWO-^_xyab?juif&(DSedi@iBVg?CJ zaCn;b$)mC7plR(^FgE#Ec1_ge#w45@lphSQlr`~4{2BgjtKg}>+lINFL(Vdhh$>Oy zmXlb`!4^xxz)rEpoZfdMy>FZ-a#aw7?A4;@xvj!9*%fS?;M|Hyn*SGHar9RH7E%ke zfgwG1^%xKl{_F2XE%(V-oWX4olSGEInnhx5*`U0IiH;IxXBQSaRHX10b}u-f?G}WL{0UYFrqRl+eCGGCTVvVn2IO?=O?fH-;dA z2cKggkknk$PpPlx+x&AuFcb6(N(D;Jm}ugkRURw12suXos6(+6^r%3==+;U-oDaH+u`>|J8DtqSEd_mQ@TUD zwNs=mkh>l6i-c|5WJI5wqIGv`2?hE#;nnT#p-)sdL}c6|ZkuRie!vy2Qh2_J7T8s_uV(Fu2w zOZsSchGB>SBWS%o`9VQnAMfMGy`c};wSG))j_5VZ>o_pnpoEP1{10B*O2R_!`0GA=`3lMJ9kX-l<`%8 zP11KbBVsUjJ+2hkp7M(Y@|0P!Nv@03@x^4_!eDJVRQ)7Gxi3iO(EB-<5y$8M48c=Y zv{TJeZaUgiW&4wq?hNbCpAZ&SR#mtt>ic()jZ;)sBGhO^eCX%UwK;QTf=pT1ml#-B zEqTwg-fL~apgaLEw@(J(|M^_(d-A}-eMNis-q#T_mI9RX60I;*H=at{VXzI)et>6; z-6#)5@ZOn^|NL12MJvU|X7I%6-kNG*h*n7~v$nJQ?#+c%d^bG5sJMcQnCxaWVpsj$W`I~|2*e> zZz@}7Piy(E#}j8w*ZtMHN-$xvIMLGCv#BHsFs&p#!om zu{%4jBnTVEev;cv)(Q-MDwJ$Fw&CQr@Gt4aX^7{)$DWRITFJE)21QhAupYMP$a;a# zsG}=hXI(!Dq=Mxi3xW@0I8hgYIfs{9VLLBgU)>H5zhDH9rR--68-Rq+B!pWUFW^G4#Tr{(eh2CqO(E%gR!>sTWb%_BUemqR2b$0hT!TQV$M(epdnV(;zpvXw+ zeG|Z5vR6`=wYBeG-CDT;dtS&-`0TDR7Ys|_iy(oNG#&V-=WfKli&5z&9eb>F7Y6}6 zhMasDrcs5Ak!eOti*%K%b;$YtPoXjs55vbx?p<4xZor&{)zsj^*&*WLdJEQbnZ(~1 zTbr7ok+Npp`G|(|Vq4sF28|aRWk-Cz7jX16)}pDUbM0r!D`C63 zKvQxpCEnua>uPMugFjK$dHzHV1vxjT)%`WK$Y0bY#f;KZy92WK-7fq^TF&oz7(H$d z%7iB|$Oo@6zQ{JtXq^i$8|N?Q#N5~G<3rb?i9;d+j^>5@_eCGtEtQt>8|2F4zLNm& z1%&Sn5q{hnhdCsi69YI%?H&1ONsJd%RaGvtO9!08KX2QokL~Z%cXqzZePY%q6Qj>B zDapjafrWyyS>5c+Z+-b2ZrMA^<`(C@24#<&^ZmkflQ~K}12tCvL80(evzdEJ2`Z8i z@oFoa{^vRsj$B~TNGQ|8S6B7Ze;It#05*#v0^6nY+soUQztpCIOvMH9XMB7R7R24e zNZKIO{Px{;+Y1HxvfN8P2 zdxSxCydXs#hl`Qj=jxJ|jpI>CxweM~D<)Z=RMneClQt=haF#-dVE7!S9zk-{SB0F10J*HCIHuc$? zHzdHSmDb$-fCO9(f@}h;EEorfkjNt0s6H6G5~-gbnOcD`ErY6Y;gD(x%$n;$H@@MA zInr26FvLqm5jw@ABvdf27E4FP4Zg+91GmEb--Ln!p>HW97KKCVt3P$7Z;Q;;+p4KOJ#iw=^}K0eR<5I@AR4va()BSlNLQxAJcO$|mT}ZJ-A# zyY2)fP!A=gQ-g8=zF_oQw=lkE`rtrXY`JV~>f1$yFJxiu*krO%Te zuOF*$>4ZyDMUOk=MVpO8SPi}v-TB8WbDWt`<@4MNMkb@LU?_SlLCilZZ3VHXu- zcQ_8VH4gW%k#Qdf!UrL4nvEH01SthPe7Fe9){aX%!+?#rI17pS+bSDg#`o0xNHEY> zQjh?8YGi#crLK{Z3hlkXgCIR1%Y^EO@Vca2-*k?MiFu`A6lO;~do-ik)*gO(p>9G$ z(;&hX<{I8zhYX$nP5w|gsz%S9l13`vXcEL?agU9$PdfM7Ao@wwt zur|CgYklHgA(5_AZRA*D9ITx}BKlYva?$05G&se`foS>2fOoigA`6aYK_0U(a}HZj zMZ;`+p8hI+GtZ_kld^jv_5IDoo%LUJW%o~%0t(*6Si7K3ijLEB-I*4~XKHcqLAHhq zzWZEgvgaf?Z=VzB_mvnhdpQysq&);PZB{ml(a-}kiwXKKgSLHPOFYeqK_@|vVi7NdwD*s_tjo$KFPZ&r6x62$(CILTszsz2d9rlVtf~3T zsPs2{5B8CjmB)W=6oJ%r`Af7q_@!WMmwfBxYaT2F6xHO_Jh%s2lXxd5WXMQqJ4p&^ znl+TOqCPl?6hZ+3aq_&Amqwi~HP+Yf-@7g^#2hVjE=~;*2pJ|p(J_<@c%4do2wcZF zFC7fXKGxh;?n&au!JF?+7?bPesl18mw_s-W5Cnc22UE&V7^rSk7sH)9*J^lLtvlvl zP<8Bp(GWrFeYYh2ISW?KKty69H-zati~k+^K-~slRK=ii2lP&q|JS@;kO@@yE1!NG z-=hzQ<+)gdWo?3Th1&eo(v7LlSve-SZW{n6!7AaRCLY!!m`=zxrdeEUg7TiXUY?Tu z@4O3)49Z!E@~QUm@sP1dPvfnvjgjER&#u!NEC>((EKkWYC+6oL5)>@5aMGY@xjc1( z4!ZD~)7W`9zLBLyISU{II!7zScxz7Hf1RDp4VKG<*;%y$j$E(@VqUxU<=fqc>!A}9 z8aGl4-WJ6WOE1_}ncVMy4S33pGuu(GmNX@%PfO<%%+ z(Q_{~jFe+Z;c5OhH^{v7J-l2C%(}mc!bYGy3=52okXDe0!FCVG$z*+?p+L|Aq(sv1 zcOjuDQ}Udo_OTsViO~T4n>UH#pFU$Sn}e+kSuG-@wWcJl$eT){`}uPRK!^YICctHC zn%|L{-M}Je<<_Vdxy%@X3$zDX;$Vb0_H1kq(GgIN^bbz3jTEKahLUJ*b*S-&e)&@% z@zeXouqgyENEs|-stk`lmoQe8Y32oykqKKl6k*@J+gOz08ZibnIkoUR!u~A3wsmv& zb({a9bs4bc>W`1>t}+KIpO&7I( zABrl4KF4R7nYbW;K7H$V*R*uUZXsdPmdteCU}f5DWu6Sm-=|1N13dY0d7e4dzP*tp8^Q?NuJpX>mVN&$(9YxFyrbebkEwH+dBGjh5k+VW_D?X&g{=(a z*be0>zmg3JP8TvT;us1f=(r(zNN8>jRQ~qhDceYEEA~TStlV7U-$cqEfS&-u2JE_m zf`Vyi#`G4mn0a9?4UXGnXD)@utGDa&DUqlh)|%QgqK{V z8!1E1cd?_081TS62yKrQ6JuIlc4R*wG^l86qt!rTmO~Jku$UOwp`VHepA(h3rM=-C z8y+UJwzdY_q$>Cehsw>w%$xlw1203ERKX&=6w=htz|7699y~KNM2hHhwwwU(=O9=M zg|GhY>=X&NtoO0K{@WEVf(VU|CxqHyk11Px9&jp_(FZA26&39RI$je!z1`R)y2l0x~OcyoaF<_v3E9_=3aP{))5@s37X(ZmX!-zb7+ z_3NYoEBoC$gTmLR#&SCZAcT@X`mz24fa=#Z6wvWM^n|W$8SOWpd*HPq3qwO0IM{Q` z%Wd$_wA@?jur4tGoaZ`my;XZj+oPZ$1FD{2rFtd66r`(2?c$cMR$`{v+M_+50#ln@0^HGGDGMp&kDnh4KAO z6Ed$ZQtjblHcSf3`qTZ#WN&1&N`h?_syi2YVj%%>u9=gq4}Q5uL_}4lv!EE$h-w3s zmd1Yi^Z)|mGk2sj_S>h>?+JotH>$hLO1_m=$LLegnKz~K`v&mr0yom`P5qASXuB(- zXJM{`n647~W|vmYp@2ZcFtyznyBm`bSiW=pXKybqdKdz_kZa=dd4cqbPR&*y)T0iGWui4YLVaR6js zV*R;ye8-~EQyvII>L|Uln}R!7>!bgojI;80JPgakaj(C`g&?haHvyRPdvlyB>ny^1 zl(4nz*8p4W`tBS)O@^+N+{#K&VoNA#Pf4;RZif{Y%OB8P4b;sXBEfC>UTYFNBjG*m zu-(z$o{o+P=(py`)`XJ6Mkyes%MUtY0I%w+v!t-_ZQ_FUMlXMbhIZZh;#8yotmQ8ZEdkDeTzakD}Y%FM_QV>&|VjZFvxh}L;Wy_ z?I?R6D6rjNOiZVy8Ny6SsTeFV2!by`cy~`C8wov~yC*9*-4=1gnik=7qI&lBH&5iV z`yP*#F)sISMI3A>f^hx$c^<1dXR6Tg(TuU@>foy_U7X@HZBFL5^>??or+t-F3qL|h zVr{Jhu@F;dK*fuHBh$tItwmG!D>!OUnrXx&xlVtw?**IBU@nG*nr8jomDE9iF%c0F z*Eq4c%v;V0EE+{3<#dmd!Jc9bEm~?CeVyQOGgN>%hDr+yBA2UA;hhB>pS3^~dIZA* zc{H)A9FKvsD7qKSOT8N_EmO#p{$o2)Fzf(%0Im1m>Vu_CA1{$Tjf;ta*z)OKa3@I~ zPqhy^YJWhtYQ0;8B=$0pLoAX_2yo9EIX0jeh3)BS!GJ?qNcu*OzmaAvEH*U7XuyH6_U%(Udves-qvw{gR>x%TbQZ5qD^4F|0V0ho}IC#@vyQxITbW=SNFD zJvY_hyA9~rbFX&6U^+W{2G(RNNeV>QN<`XkN~71!&3AyXjKaWfNBI}iN94yTNlEc@ zpAqZm*w-pDztc!VUfQqf>Zq~Z%aUOL+ak=P+f}esqxX~dA0<$DQ$E7fc6%xUP@9?E z0g1PgQfK@0G%4^?sL+zmg?o_<>`SAM&w|p+DKH$~NEbd{WgV?XYMdWV;(*_c&)8M1 z;DF?y$z9p&=3|Al*yp<3D0k5w zFdpim8xj(f7EL@py7;KCaVSaywhI?{HQMr9@4(Jh+M=fghS|2SDGXr1RW;UWQM&Wt zK@bsC{6N69L+sR#hx;+OO&Q&wpK1CzlYy*e8XU2Zl2guz&P z-)UOOk5O7f&flL1b^&d~bKPrz+9CkpSAD$HR>BPU#3*1Yf*_d7R#q0J31j{`>v znbWV7QjCCTarAK5bMa92Gk~;ne_Ja`YyPaRQhW}0`EC7F0LA3)ujPP^q<^+IRcUPg z#_gBc7NI*k*N^w_`@ptQvQ9(t2tCrYH*Y?rcXM+YFNy&GcZHzSROae4I|^@r#E=fG@r%k@QNs<_t*>8=9DWbuvZO$tzM&G=qV2`$ zknb)FrPHsdkF@xD<_@c@)h;vCR8%S`4A9PnYXHSU+hh~Q30J#(a>>_wr`{cWxC8+j&hsWtTXtKI#kVmwZs{);_T2u#SN zOo6lS_8KV;MvbQ7>k;rD^-F~UuMEw<2K9cou>Ss8x@SZ`Bo6k>*?F6Iz?LKKX!e2U zW)JPJzg5QHX3Krf{^kDtE&zpAsB6T1wwZw$E8IUQ#L>I0p)g8)>-{ZY-*4PG$=2BL zI~GJkM`POFCgLeCd`~M<*$%)CT2GG~jOI6G&NeYn=eiq4s|bw;a~+d& zIU!FKIPOm`zDZ_ecP-)F4&pUBef#z;PW*KyDA)Ghz-IgM=MO#jl|MlqzOACJhGyIC z*$z(LdjErlzI85bg(+$pBhr9?TVMRSB#m-h6NaX|)~Dw5z}5%zis9OBl*;EMzy z&!RiO^l%7km~n+pRAKTvK@7h%<5!s9pi}Xkv)rSG7_>n2boEzjFc@SnUN78*;2By zBfH-A{NCsD=kNEg3Fd2q`dHORpW*4Fs7^#~{_nZ5Y9oA2dXj$OzZu3kv@wj)6!Olw=9G~H*og3cvmXn7H8oW zy|0ugn~xX^256yqUi$FyrF`9-OVs!B-@*F(qg`BIHJ`M3ZCFcA4j11p(4A7#*C%uA z4gB955H8nFm!y`JjakXoGdIW2&QiupGXjX=*f)XiP0xWH%9lthOMVi22j-x!PsM$g z^hACIt}s7;?z;fJ>W)#<&>=MHhsK2LY+*|F>nPqFdgV#CvgL%%w?QYN52v`o!=k8I zPmJ`76D|qAWn;a3^mw!~$_IKx5_*L4zuz)EVwD=G^Hqed9hz;Mn9w8cdKL@P_N!hf zNzW{r*Lp=n33=0BL zH}SjXni!Rx{Sf}YQKN;K^%L1QInBybO@Pjd9}92od86THg91eK1C zWYKG5n%hgo@0aoRWgU~4nYFvSEDq-I#Q%A=sY^n>rRuu{{4|*}$~i$9RaJYMNZ0b5 zn8zOyFX?J-o*eSlC19d4dJHakkD1&76&U#~$ekrG_&qv_@g)xnRfT`4u>VFD1rj;v zQ?SSuau{DmB{(+IR>7t?afXGZ!xD>9MHM2dpXwFjp>e?G=B+zNetvc~bw@`g^YfeA z{MsBbOG{T^;53HtITbyF8ciuh_E-&@oNf^TBcr9~#jt34)p;Y_m~CH15^P;!eYYA- zYLi}-@2epS(jsn z0gIX82<=$RcQgYpE(-@k?#pn_X z#yT=akMqHU_|JJ-T^icGX+h&LF;0bLsV!d$lP$;h_xHm)=Ze z(U>T#%*t1Stc*k;rMX#Y=-aoHA5Awq-Z}Mec=;hCJtpT5 zqww^8Shd3Vy`&Tahbh+?XZM|!uIjh6k`%1SwF_^MjIa=pSp&I?nb2k$AJO8 zyqfb&$+)VjGppl^rNhVctz@#u0wO?-&wT&R2-#S7wbg?MRt(D%W+yzVvI&hrS8TVI zhyxZddG zBwE#cVCYS4xcJVd9d~Q12ke9dA8WVZs-(956ewq9(ITiC@c;ffiJCXpn2fDz499fL z{eANE>Cn>OXV0Fg&oy;bepI--UOhARqtp+3J(-_|Ft0UL)HK5LbwiQY*i`}oEMtF^ zm!=ezAS4Q4r{1*2jlF>VoFI5csjDw5U7zmG&0F9VS!Gc?-m;RVhSfP z1(*EK_q3GN)dmRsL=&01y86#|b|i4|4gTcU@AUpFc=EG;o9kdlqV<_z4WZSFpw*ri zENVcK&8v7as5O$JVHCu74vB+9>UqR~ZH0^`uDW7Sl^?ulq>QvCH` z5ecZraIJ8X#`MZcEVn{nHt;3^JH@N=JeWCAk1I@{%?4^2&Alv;_5+5|k*B3?Q|Y=~ zJ)`O9h=L}ct?d7mw}Q_-c2J$k$dIhK(j@(FXxo1+1}KcBNevJ0-@pHRef{!?B+*X* zcubw01wp6mKx7I!dMzCt$IxRAAU0M4qEZR0vr4c?s{~3U+R)IDJo{5%Tm`vOT3VWz zySsah>&WHQJoe{=d1`8XLV>BlMrGcz;#wcZzk%-zJ&vIp`~VNmNC6g>l( zb=<{^7c2h#yT_lRIZ8k*r+xw4KMFK8j@1o7#j^F6DMldMZ$V1S{~Xi(m(0U)*c!@_e06wJV52k*6j z&1vF{%uKY~&#Ry-e;3jKOfq};KAJJ4_|nFq9Yh^Fz*3bo3c(QoAS&y+=HI3k7E%q= z0sF2wLQ@a#GeV%>HngW7`lZic5TTPP*&ZX;-DU;$@f5it$xO1=d8Fa-Raz$goT_>h5> zH42F0!=57ry06sNfOq^o)bsXj@Nl~QuAbNb94jlYq~s3%&^19%Ab7^-R+PumNLk+O za8W>srOe|pvLxC^A>UGN!vdnA85n0#d+nta*1}>S-^`48EhkYiqP+YH(8B)CcQL7| zso8BWeE1xKhIvg76A!rV>@F@Y7Z@Mw z85`rl6On@mR-s5B+_C|4E;=Cr49ZY_uapucTz?F+lHR&?OT?y$3z%IR8X93h7Oe4{ zI%z#V&inZB=GA2^?*^QgyI39ZPaS`i9BjeUgA5uMA%s-}|fd{-PGGRKpQ` znWO!C)pe?Y(nkKR{uQpfvoH1B-9^X2ba7>>S?L>)ynyp4A}LuDvJZ8m*+`ky3vdmg zqNDTlTD!={hch!bzm}x&xumqz43PKZYoVc`j(6{Vfk`w9@bk~r(MmG{_t!}14)`xR zrlzKr07JD0NN?apDdynd(81;abJPud276js!u(c##6N^(wB*g3S^OcG`ndt8ou=!{T&j*u4c(3>pjaNCU(fGb+gCAP!4yOgWKU$`h)H{A?ZCKlXAuIx;hE% zK6c;zdz2HCwR7u}8}lzOIf9~{C@cq?C?q1x3Zz3@4-cSvo^mr>5D}qt zuWFjk8yic2C6X4i7( znG-P}Y>O3m@0tiOlU&fD2&j)s4$2;L7OMDT^X267i+GIUfq??4W5 z#&bi8)9Pq_N$pF2KV3>nikG+d^^g!nU?)zmtpTLN;*He4LrM7+s^teg>5I`>3JqS! zDEgEfUev{OxeowR zDc!Rb#X<#g={ZQq5SL&z8EpyAe^M6xPgHVgKhq z4F*pS4-I&QoA>TruJKfg%G1iUa~Vq^+_ZSklKA(}j}H>S9Ek^jCk{G)ZMB0*0C{CD%Kh|PRy8?5Jt%U&UccXorhj~ zo8Q&dmj2EafXq^q`%2H`q?H+(S(9gmSFS-Ua9aqkJP@++7#2O>W16>Dd{%#ITQ+CK zY;N}74VK0b4Md+6^4(gZ**l1w{!uD%^;$9Pb)se%GBS_7|IXesHTPeXer^BoWZ%xR zAvI&HR?6{`BeAik!gG zQZ%qxYyFLJu-6atPU(yc>vll@Y?`i9OmBp86cs)AS<}mOhWL1t;UDXPs~(z;jv}{! zb^71Jvx83S2YF5nLYRj8r;#NkJkV8N{mxZ;t(glEdSsz{N@c1^-Ley!wL#WczBsW4Jj27QR?oQn>+ueq~zt?ZTH>nk!AwhA(kb6MwW81xYz|~2;AT> zK{j67uOB;VaaLc-2q%5juNdj;S4~KeiLOFv3{-=L`<2otiFIq~b>iM0))MPl{q-wHi75lQ zRIMG9ArULm8L*!7=ww7cYCaWtp3Zp>reU?3S~PD~mLKvQVK5RlI9VAP#cL7nqxZ-c z7W&`0d_Px~ZzJB)%uGJ#Uj;M9sl|3oC+l|n?}1pgXcca5T4}#xj~Ljt)0+RC%A?R2 zwqkm3-&I7MGu?XgA4iuTmkwCfgyX5`Y{$fdg14C`pJ-}mK}!!P6$G%!R!RB#snrEa zEG%#qCox@`^_o-X_)+RZ@@mREC^Rp3-tJSx!*|sZogMLFg_pQcqN?yr_{3EPu3$1i ziD2F^aHfCtD`629Ed}pITwAv*pPO6HhlI8lxw%|7(`%R^n^N}Lj2ifn?;U>DSx^YW zl`iJQXJGiB_x7?%9Gl&1eJqAkNPohSNN?ducLW0gY;O4~tE$Qa2bbL4J$!8UDU`LQ6+G0u*qx}iD_3Du0=0+p z@@0#`(sXVNh9yUf)vAn_;Z0H@qA0w`a1G)m19u2TO--Zsc5xu<>+I~eb)iZWoRW7t z<^yAP4mU#Wmxo2!t?*!;?!6jqK%Dnm#)dFD2r2Tz}xN0~T}b z2ipvLOF3xB0Dj9Re9e@9Kw)hiG(Ep1M9XcdQ80~g<`u%Yv_gw=EB2_=dISdSU8PIp zX7)xF-2gjLLNyBWsnhRV3Kf)mx{7Bb)5l$Z)_+g#=;T!;hIa<_ueP1*IOqL!dC1?{ zocj6iA&Zi<(w;J~_)|@VDmALmd=X6f`Yv$$Echv*gLg(7_WpLh5Jw|Xl$g*PE}z>R zNMSNw4X(S`_eytGR)<7FqI&ONw_Y6QuF$WL@s}&oLWZWMv{JQeu;s%NwAR+_C27iqPB+ ztvHk=mM3@eHBYYk)>ai5S;G7ikq@|?5L#>e^D#L_J8qTh=Kh@*jc6{6r(c= z>h(yPm2Ma$V;7;pI^eCZU85W*(3Pr|xmX*xePwB+pDmW9vDfchUb05+=6`ZAFdbUD zyBU&_6vfZeqcm03G`?>~${TReyL^eATRtGdssWnGy}WIR zurxhplA0UJyM46V>;v!1_cAh^o;imnHy^5KJ!|WD2sO|X#($blWh{yd3La_hmQtpq zNSIbHlUiEUeu7ZD*tb91xEpy78T*9xamq&)NI z4mS#F8%7OuUo}x+JN-c1!Q#KZh0*w8571Yf$0DwfFpk|ISANn30R6boxYLar7r|*e z^f_cLDv?_Tqai74f4*t%9dP4ocSE2j=HN?jX1R3}zEmDA?&)=BQ{_=Cv(Z(vv-_aA zvp?ci)Saqr)OGSK9vwL_z{#c%sL+@3A!14Dq^obcrSX{(lo*O+vUcbwFeWuj*@ji+&X=*d3m;NUKY{LZdhkqO7?^~|(ek^PEtIJARg zcD_1*Pw+xCtA<@ znZgKXU6}6`FrD0{LbxA1$b*&^zQsX%S14(?rg)N5YKUmKS}JfWP{dN21Djw8D(f6D zviRMb`jxG%!a=ISPK8fMsJO!S4{1;4ibirD!y7^Xc@2+#XZtB6H;?(FSL2v@(S-Zr zLJI0q0V&ailmE6J0I;`Md{Vf{}^hqjFCHd3k?cu}Zyle`8UpT2knY>E(JF zFoRQ7KbUUV$k!+4QEh|dLPb$=Zm|08y4DB;?t8Tl7yEb-r183jXmTQI0$2(Se?fdJ za>D&B2GCrSGU~Qy23Ih8=h)fURlmE`36VK&I|36Jk_;24$e9K0D&T;~^x{0p{j-I6=`s74sd9IH{pzc8jo$g z^g+_ux$~cv^N;2Ac&%8=qEtvX8Nm%EaIS}ap(pRZRWnhRE3^?& zouS@)UaM3ijRAj&KYrY?{Wt$=bIbW6v?5r+yqfEkq7aa0Md5;saN;fh7B=jT_E7QM zX|)J=2l4vI*2Vv(|Hv?QCOkZ&qSC%AA}k;f72D0Cs?HzQNfPm>T++NCKc5AK8bL!2 z+mrEu>HGI;1j01BP~g0@9NlZ)^O!MoJ%280XDvOkcIp?%YbFj{WlKK9%JqWApt{NM zOkyVit~l8KmLln-7ktDU5V(Hb%w`?R-U;y~99nfGCt)q;D+Ezz- zL7p1Cwf6SGt}p|}JgRg4n2$H3s4R85dZY^k)RwCA1h$5pO*(7)Xpal(Avr9#lO@C@Ht*j6h6rV-eR)BB~ z-qT}-S&?U*=_^d54GR=I(>=?u?xiK8)*jj)?qA^qT|JN+L2?oCNGUAu&i%akqraU3 zdxuz(yTMibNg7~8n21v8DNL6@;SzAq@&FvbCU9N%^Q&$h*U>Ij*3;u>BQYtj@feKS z`~Fr9uzuFm)IhKM8)Oxx=rodcd$eQkOEU0{d#p-nGnE6yf_mlT*YJAYx=gvo;e1YM z6i&_v_iP>%!(Ki<9Hg$LK;2&_P+n%H6(D&D^ zKX*DcZJk^c6;R?ufKWcYO^I{uvlfXX!;=`SQrqAohoqpLG1ZZYfa4< zOO=VLDk}^^pGAmZKPRoCMzF?rDnvMECtuQS?dTx4uYet176c`w%ey0x-UDY4S5bk6 zqcY-va_Kl81IP?m7TN)O3oK5BEYM`)<^|9-z^^J#pX6EME* zl~p+50z}Z!(a|lVl}-aY^Z*EWkvr~7npsszDBv&5p77D~_Fnp)pK1_a0#2#`c!kc{Oi zQD6}JRFIkdcXU;$|I`g$6%3C)cXYhDRc;-yQd;W;ww~l-`Q~P3fQGrdgMCeg?-kMt}okwZfU!{CoEa1L|pR&7(}m8Lx~wi1LN$q6(`xCt@Q&iZ8R)2ED=vpAr| zA4jg~^8zUfQ=pUi4!-~P?b|KG!{n$rJjX=V-znAw7+1!5kcl0)PkMJeEE^27>V}`~Neb;0%=+YG%S2DjBbN2xq8> ziQ7j!z3c2uyu{{Ed6sm`RTbfk - + USB Host Shield 2.0: PS4BT.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,98 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4BT.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _ps4bt_h_
    -
    19 #define _ps4bt_h_
    -
    20 
    -
    21 #include "BTHID.h"
    -
    22 #include "PS4Parser.h"
    -
    23 
    -
    28 class PS4BT : public BTHID, public PS4Parser {
    -
    29 public:
    -
    36  PS4BT(BTD *p, bool pair = false, const char *pin = "0000") :
    -
    37  BTHID(p, pair, pin) {
    - -
    39  };
    -
    40 
    -
    45  bool connected() {
    -
    46  return BTHID::connected;
    -
    47  };
    -
    48 
    -
    49 protected:
    -
    56  virtual void ParseBTHIDData(uint8_t len, uint8_t *buf) {
    -
    57  PS4Parser::Parse(len, buf);
    -
    58  };
    -
    59 
    -
    65  virtual void OnInitBTHID() {
    - -
    67  enable_sixaxis(); // Make the controller send out the entire output report
    -
    68  if (pFuncOnInit)
    -
    69  pFuncOnInit(); // Call the user function
    -
    70  else
    -
    71  setLed(Blue);
    -
    72  };
    -
    73 
    -
    75  virtual void ResetBTHID() {
    - -
    77  };
    -
    81  virtual void sendOutputReport(PS4Output *output) { // Source: https://github.com/chrippa/ds4drv
    -
    82  uint8_t buf[79];
    -
    83  memset(buf, 0, sizeof(buf));
    -
    84 
    -
    85  buf[0] = 0x52; // HID BT Set_report (0x50) | Report Type (Output 0x02)
    -
    86  buf[1] = 0x11; // Report ID
    -
    87  buf[2] = 0x80;
    -
    88  buf[4]= 0xFF;
    -
    89 
    -
    90  buf[7] = output->smallRumble; // Small Rumble
    -
    91  buf[8] = output->bigRumble; // Big rumble
    -
    92 
    -
    93  buf[9] = output->r; // Red
    -
    94  buf[10] = output->g; // Green
    -
    95  buf[11] = output->b; // Blue
    -
    96 
    -
    97  buf[12] = output->flashOn; // Time to flash bright (255 = 2.5 seconds)
    -
    98  buf[13] = output->flashOff; // Time to flash dark (255 = 2.5 seconds)
    -
    99 
    -
    100  output->reportChanged = false;
    -
    101 
    -
    102  // The PS4 console actually set the four last bytes to a CRC32 checksum, but it seems like it is actually not needed
    -
    103 
    -
    104  HID_Command(buf, sizeof(buf));
    -
    105  };
    -
    108 private:
    -
    109  void enable_sixaxis() { // Command used to make the PS4 controller send out the entire output report
    -
    110  uint8_t buf[2];
    -
    111  buf[0] = 0x43; // HID BT Get_report (0x40) | Report Type (Feature 0x03)
    -
    112  buf[1] = 0x02; // Report ID
    -
    113 
    -
    114  HID_Command(buf, 2);
    -
    115  };
    -
    116 
    -
    117  void HID_Command(uint8_t *data, uint8_t nbytes) {
    -
    118  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]);
    -
    119  };
    -
    120 };
    -
    121 #endif
    -
    void(* pFuncOnInit)(void)
    Definition: BTD.h:609
    -
    void Reset()
    Definition: PS4Parser.cpp:130
    +Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _ps4bt_h_
    19 #define _ps4bt_h_
    20 
    21 #include "BTHID.h"
    22 #include "PS4Parser.h"
    23 
    28 class PS4BT : public BTHID, public PS4Parser {
    29 public:
    36  PS4BT(BTD *p, bool pair = false, const char *pin = "0000") :
    37  BTHID(p, pair, pin) {
    39  };
    40 
    45  bool connected() {
    46  return BTHID::connected;
    47  };
    48 
    49 protected:
    56  virtual void ParseBTHIDData(uint8_t len, uint8_t *buf) {
    57  PS4Parser::Parse(len, buf);
    58  };
    59 
    65  virtual void OnInitBTHID() {
    67  enable_sixaxis(); // Make the controller send out the entire output report
    68  if (pFuncOnInit)
    69  pFuncOnInit(); // Call the user function
    70  else
    71  setLed(Blue);
    72  };
    73 
    75  virtual void ResetBTHID() {
    77  };
    81  virtual void sendOutputReport(PS4Output *output) { // Source: https://github.com/chrippa/ds4drv
    82  uint8_t buf[79];
    83  memset(buf, 0, sizeof(buf));
    84 
    85  buf[0] = 0x52; // HID BT Set_report (0x50) | Report Type (Output 0x02)
    86  buf[1] = 0x11; // Report ID
    87  buf[2] = 0x80;
    88  buf[4]= 0xFF;
    89 
    90  buf[7] = output->smallRumble; // Small Rumble
    91  buf[8] = output->bigRumble; // Big rumble
    92 
    93  buf[9] = output->r; // Red
    94  buf[10] = output->g; // Green
    95  buf[11] = output->b; // Blue
    96 
    97  buf[12] = output->flashOn; // Time to flash bright (255 = 2.5 seconds)
    98  buf[13] = output->flashOff; // Time to flash dark (255 = 2.5 seconds)
    99 
    100  output->reportChanged = false;
    101 
    102  // The PS4 console actually set the four last bytes to a CRC32 checksum, but it seems like it is actually not needed
    103 
    104  HID_Command(buf, sizeof(buf));
    105  };
    108 private:
    109  void enable_sixaxis() { // Command used to make the PS4 controller send out the entire output report
    110  uint8_t buf[2];
    111  buf[0] = 0x43; // HID BT Get_report (0x40) | Report Type (Feature 0x03)
    112  buf[1] = 0x02; // Report ID
    113 
    114  HID_Command(buf, 2);
    115  };
    116 
    117  void HID_Command(uint8_t *data, uint8_t nbytes) {
    118  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]);
    119  };
    120 };
    121 #endif
    void Reset()
    Definition: PS4Parser.cpp:130
    Definition: BTD.h:201
    uint8_t b
    Definition: PS4Parser.h:118
    void setLed(uint8_t r, uint8_t g, uint8_t b)
    Definition: PS4Parser.h:320
    @@ -193,6 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    virtual void ParseBTHIDData(uint8_t len, uint8_t *buf)
    Definition: PS4BT.h:56
    uint8_t bigRumble
    Definition: PS4Parser.h:117
    uint8_t flashOff
    Definition: PS4Parser.h:119
    +
    void(* pFuncOnInit)(void)
    Definition: BTD.h:609
    uint8_t smallRumble
    Definition: PS4Parser.h:117
    @@ -212,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s4_parser_8cpp.html b/_p_s4_parser_8cpp.html index c37cdde2..1e1b4e32 100644 --- a/_p_s4_parser_8cpp.html +++ b/_p_s4_parser_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,32 +88,35 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4Parser.cpp File Reference
    -
    #include "PS4Parser.h"
    +
    #include "PS4Parser.h"
    Include dependency graph for PS4Parser.cpp:
    - + + + +

    Go to the source code of this file.

    -

    Enumerations

    enum  DPADEnum {
    +
    enum  DPADEnum {
      DPAD_UP = 0x0, DPAD_UP_RIGHT = 0x1, DPAD_RIGHT = 0x2, DPAD_RIGHT_DOWN = 0x3, -
    +
      DPAD_DOWN = 0x4, DPAD_DOWN_LEFT = 0x5, DPAD_LEFT = 0x6, DPAD_LEFT_UP = 0x7, -
    +
      DPAD_OFF = 0x8 -
    +
    }
     
    @@ -127,23 +131,23 @@ Enumerations
    - - - - - - - - -
    Enumerator
    DPAD_UP  +
    Enumerator
    DPAD_UP 
    DPAD_UP_RIGHT  +
    DPAD_UP_RIGHT 
    DPAD_RIGHT  +
    DPAD_RIGHT 
    DPAD_RIGHT_DOWN  +
    DPAD_RIGHT_DOWN 
    DPAD_DOWN  +
    DPAD_DOWN 
    DPAD_DOWN_LEFT  +
    DPAD_DOWN_LEFT 
    DPAD_LEFT  +
    DPAD_LEFT 
    DPAD_LEFT_UP  +
    DPAD_LEFT_UP 
    DPAD_OFF  +
    DPAD_OFF 
    @@ -156,7 +160,7 @@ Enumerations diff --git a/_p_s4_parser_8cpp__incl.map b/_p_s4_parser_8cpp__incl.map index c8ab6336..a426c81a 100644 --- a/_p_s4_parser_8cpp__incl.map +++ b/_p_s4_parser_8cpp__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/_p_s4_parser_8cpp__incl.md5 b/_p_s4_parser_8cpp__incl.md5 index b54e7156..1f9ffe4e 100644 --- a/_p_s4_parser_8cpp__incl.md5 +++ b/_p_s4_parser_8cpp__incl.md5 @@ -1 +1 @@ -7b7a6c8921078ff071fc05959848bb21 \ No newline at end of file +03082f2d3fd4c67e7d5789f05b2dd70a \ No newline at end of file diff --git a/_p_s4_parser_8cpp__incl.png b/_p_s4_parser_8cpp__incl.png index 5db104c42333a73ffb18afdd2469be388a84557d..0daabf52b905d99ed24b703fd84a7efd3c300c2d 100644 GIT binary patch literal 6946 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 S-3u^&hA7CWNS8?(2mc54XeR{# diff --git a/_p_s4_parser_8cpp_source.html b/_p_s4_parser_8cpp_source.html index 53619c40..de76aec1 100644 --- a/_p_s4_parser_8cpp_source.html +++ b/_p_s4_parser_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,160 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4Parser.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #include "PS4Parser.h"
    -
    19 
    -
    20 enum DPADEnum {
    -
    21  DPAD_UP = 0x0,
    - -
    23  DPAD_RIGHT = 0x2,
    - -
    25  DPAD_DOWN = 0x4,
    - -
    27  DPAD_LEFT = 0x6,
    -
    28  DPAD_LEFT_UP = 0x7,
    -
    29  DPAD_OFF = 0x8,
    -
    30 };
    -
    31 
    -
    32 // To enable serial debugging see "settings.h"
    -
    33 //#define PRINTREPORT // Uncomment to print the report send by the PS4 Controller
    -
    34 
    -
    35 bool PS4Parser::checkDpad(ButtonEnum b) {
    -
    36  switch (b) {
    -
    37  case UP:
    -
    38  return ps4Data.btn.dpad == DPAD_LEFT_UP || ps4Data.btn.dpad == DPAD_UP || ps4Data.btn.dpad == DPAD_UP_RIGHT;
    -
    39  case RIGHT:
    -
    40  return ps4Data.btn.dpad == DPAD_UP_RIGHT || ps4Data.btn.dpad == DPAD_RIGHT || ps4Data.btn.dpad == DPAD_RIGHT_DOWN;
    -
    41  case DOWN:
    -
    42  return ps4Data.btn.dpad == DPAD_RIGHT_DOWN || ps4Data.btn.dpad == DPAD_DOWN || ps4Data.btn.dpad == DPAD_DOWN_LEFT;
    -
    43  case LEFT:
    -
    44  return ps4Data.btn.dpad == DPAD_DOWN_LEFT || ps4Data.btn.dpad == DPAD_LEFT || ps4Data.btn.dpad == DPAD_LEFT_UP;
    -
    45  default:
    -
    46  return false;
    -
    47  }
    -
    48 }
    -
    49 
    - -
    51  if (b <= LEFT) // Dpad
    -
    52  return checkDpad(b);
    -
    53  else
    -
    54  return ps4Data.btn.val & (1UL << pgm_read_byte(&PS4_BUTTONS[(uint8_t)b]));
    -
    55 }
    -
    56 
    - -
    58  uint32_t mask = 1UL << pgm_read_byte(&PS4_BUTTONS[(uint8_t)b]);
    -
    59  bool click = buttonClickState.val & mask;
    -
    60  buttonClickState.val &= ~mask; // Clear "click" event
    -
    61  return click;
    -
    62 }
    -
    63 
    - -
    65  if (b == L2) // These are the only analog buttons on the controller
    -
    66  return ps4Data.trigger[0];
    -
    67  else if (b == R2)
    -
    68  return ps4Data.trigger[1];
    -
    69  return 0;
    -
    70 }
    -
    71 
    - -
    73  return ps4Data.hatValue[(uint8_t)a];
    -
    74 }
    -
    75 
    -
    76 void PS4Parser::Parse(uint8_t len, uint8_t *buf) {
    -
    77  if (len > 1 && buf) {
    -
    78 #ifdef PRINTREPORT
    -
    79  Notify(PSTR("\r\n"), 0x80);
    -
    80  for (uint8_t i = 0; i < len; i++) {
    -
    81  D_PrintHex<uint8_t > (buf[i], 0x80);
    -
    82  Notify(PSTR(" "), 0x80);
    -
    83  }
    -
    84 #endif
    -
    85 
    -
    86  if (buf[0] == 0x01) // Check report ID
    -
    87  memcpy(&ps4Data, buf + 1, min((uint8_t)(len - 1), MFK_CASTUINT8T sizeof(ps4Data)));
    -
    88  else if (buf[0] == 0x11) { // This report is send via Bluetooth, it has an offset of 2 compared to the USB data
    -
    89  if (len < 4) {
    -
    90 #ifdef DEBUG_USB_HOST
    -
    91  Notify(PSTR("\r\nReport is too short: "), 0x80);
    -
    92  D_PrintHex<uint8_t > (len, 0x80);
    -
    93 #endif
    -
    94  return;
    -
    95  }
    -
    96  memcpy(&ps4Data, buf + 3, min((uint8_t)(len - 3), MFK_CASTUINT8T sizeof(ps4Data)));
    -
    97  } else {
    -
    98 #ifdef DEBUG_USB_HOST
    -
    99  Notify(PSTR("\r\nUnknown report id: "), 0x80);
    -
    100  D_PrintHex<uint8_t > (buf[0], 0x80);
    -
    101 #endif
    -
    102  return;
    -
    103  }
    -
    104 
    -
    105  if (ps4Data.btn.val != oldButtonState.val) { // Check if anything has changed
    -
    106  buttonClickState.val = ps4Data.btn.val & ~oldButtonState.val; // Update click state variable
    -
    107  oldButtonState.val = ps4Data.btn.val;
    -
    108 
    -
    109  // The DPAD buttons does not set the different bits, but set a value corresponding to the buttons pressed, we will simply set the bits ourself
    -
    110  uint8_t newDpad = 0;
    -
    111  if (checkDpad(UP))
    -
    112  newDpad |= 1 << UP;
    -
    113  if (checkDpad(RIGHT))
    -
    114  newDpad |= 1 << RIGHT;
    -
    115  if (checkDpad(DOWN))
    -
    116  newDpad |= 1 << DOWN;
    -
    117  if (checkDpad(LEFT))
    -
    118  newDpad |= 1 << LEFT;
    -
    119  if (newDpad != oldDpad) {
    -
    120  buttonClickState.dpad = newDpad & ~oldDpad; // Override values
    -
    121  oldDpad = newDpad;
    -
    122  }
    -
    123  }
    -
    124  }
    -
    125 
    -
    126  if (ps4Output.reportChanged)
    -
    127  sendOutputReport(&ps4Output); // Send output report
    -
    128 }
    -
    129 
    - -
    131  uint8_t i;
    -
    132  for (i = 0; i < sizeof(ps4Data.hatValue); i++)
    -
    133  ps4Data.hatValue[i] = 127; // Center value
    -
    134  ps4Data.btn.val = 0;
    -
    135  oldButtonState.val = 0;
    -
    136  for (i = 0; i < sizeof(ps4Data.trigger); i++)
    -
    137  ps4Data.trigger[i] = 0;
    -
    138  for (i = 0; i < sizeof(ps4Data.xy)/sizeof(ps4Data.xy[0]); i++) {
    -
    139  for (uint8_t j = 0; j < sizeof(ps4Data.xy[0].finger)/sizeof(ps4Data.xy[0].finger[0]); j++)
    -
    140  ps4Data.xy[i].finger[j].touching = 1; // The bit is cleared if the finger is touching the touchpad
    -
    141  }
    -
    142 
    -
    143  ps4Data.btn.dpad = DPAD_OFF;
    -
    144  oldButtonState.dpad = DPAD_OFF;
    -
    145  buttonClickState.dpad = 0;
    -
    146  oldDpad = 0;
    -
    147 
    -
    148  ps4Output.bigRumble = ps4Output.smallRumble = 0;
    -
    149  ps4Output.r = ps4Output.g = ps4Output.b = 0;
    -
    150  ps4Output.flashOn = ps4Output.flashOff = 0;
    -
    151  ps4Output.reportChanged = false;
    -
    152 };
    -
    153 
    - +Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #include "PS4Parser.h"
    19 
    20 enum DPADEnum {
    21  DPAD_UP = 0x0,
    23  DPAD_RIGHT = 0x2,
    25  DPAD_DOWN = 0x4,
    27  DPAD_LEFT = 0x6,
    28  DPAD_LEFT_UP = 0x7,
    29  DPAD_OFF = 0x8,
    30 };
    31 
    32 // To enable serial debugging see "settings.h"
    33 //#define PRINTREPORT // Uncomment to print the report send by the PS4 Controller
    34 
    35 bool PS4Parser::checkDpad(ButtonEnum b) {
    36  switch (b) {
    37  case UP:
    38  return ps4Data.btn.dpad == DPAD_LEFT_UP || ps4Data.btn.dpad == DPAD_UP || ps4Data.btn.dpad == DPAD_UP_RIGHT;
    39  case RIGHT:
    40  return ps4Data.btn.dpad == DPAD_UP_RIGHT || ps4Data.btn.dpad == DPAD_RIGHT || ps4Data.btn.dpad == DPAD_RIGHT_DOWN;
    41  case DOWN:
    42  return ps4Data.btn.dpad == DPAD_RIGHT_DOWN || ps4Data.btn.dpad == DPAD_DOWN || ps4Data.btn.dpad == DPAD_DOWN_LEFT;
    43  case LEFT:
    44  return ps4Data.btn.dpad == DPAD_DOWN_LEFT || ps4Data.btn.dpad == DPAD_LEFT || ps4Data.btn.dpad == DPAD_LEFT_UP;
    45  default:
    46  return false;
    47  }
    48 }
    49 
    51  if (b <= LEFT) // Dpad
    52  return checkDpad(b);
    53  else
    54  return ps4Data.btn.val & (1UL << pgm_read_byte(&PS4_BUTTONS[(uint8_t)b]));
    55 }
    56 
    58  uint32_t mask = 1UL << pgm_read_byte(&PS4_BUTTONS[(uint8_t)b]);
    59  bool click = buttonClickState.val & mask;
    60  buttonClickState.val &= ~mask; // Clear "click" event
    61  return click;
    62 }
    63 
    65  if (b == L2) // These are the only analog buttons on the controller
    66  return ps4Data.trigger[0];
    67  else if (b == R2)
    68  return ps4Data.trigger[1];
    69  return 0;
    70 }
    71 
    73  return ps4Data.hatValue[(uint8_t)a];
    74 }
    75 
    76 void PS4Parser::Parse(uint8_t len, uint8_t *buf) {
    77  if (len > 1 && buf) {
    78 #ifdef PRINTREPORT
    79  Notify(PSTR("\r\n"), 0x80);
    80  for (uint8_t i = 0; i < len; i++) {
    81  D_PrintHex<uint8_t > (buf[i], 0x80);
    82  Notify(PSTR(" "), 0x80);
    83  }
    84 #endif
    85 
    86  if (buf[0] == 0x01) // Check report ID
    87  memcpy(&ps4Data, buf + 1, min((uint8_t)(len - 1), MFK_CASTUINT8T sizeof(ps4Data)));
    88  else if (buf[0] == 0x11) { // This report is send via Bluetooth, it has an offset of 2 compared to the USB data
    89  if (len < 4) {
    90 #ifdef DEBUG_USB_HOST
    91  Notify(PSTR("\r\nReport is too short: "), 0x80);
    92  D_PrintHex<uint8_t > (len, 0x80);
    93 #endif
    94  return;
    95  }
    96  memcpy(&ps4Data, buf + 3, min((uint8_t)(len - 3), MFK_CASTUINT8T sizeof(ps4Data)));
    97  } else {
    98 #ifdef DEBUG_USB_HOST
    99  Notify(PSTR("\r\nUnknown report id: "), 0x80);
    100  D_PrintHex<uint8_t > (buf[0], 0x80);
    101 #endif
    102  return;
    103  }
    104 
    105  if (ps4Data.btn.val != oldButtonState.val) { // Check if anything has changed
    106  buttonClickState.val = ps4Data.btn.val & ~oldButtonState.val; // Update click state variable
    107  oldButtonState.val = ps4Data.btn.val;
    108 
    109  // The DPAD buttons does not set the different bits, but set a value corresponding to the buttons pressed, we will simply set the bits ourself
    110  uint8_t newDpad = 0;
    111  if (checkDpad(UP))
    112  newDpad |= 1 << UP;
    113  if (checkDpad(RIGHT))
    114  newDpad |= 1 << RIGHT;
    115  if (checkDpad(DOWN))
    116  newDpad |= 1 << DOWN;
    117  if (checkDpad(LEFT))
    118  newDpad |= 1 << LEFT;
    119  if (newDpad != oldDpad) {
    120  buttonClickState.dpad = newDpad & ~oldDpad; // Override values
    121  oldDpad = newDpad;
    122  }
    123  }
    124  }
    125 
    126  if (ps4Output.reportChanged)
    127  sendOutputReport(&ps4Output); // Send output report
    128 }
    129 
    131  uint8_t i;
    132  for (i = 0; i < sizeof(ps4Data.hatValue); i++)
    133  ps4Data.hatValue[i] = 127; // Center value
    134  ps4Data.btn.val = 0;
    135  oldButtonState.val = 0;
    136  for (i = 0; i < sizeof(ps4Data.trigger); i++)
    137  ps4Data.trigger[i] = 0;
    138  for (i = 0; i < sizeof(ps4Data.xy)/sizeof(ps4Data.xy[0]); i++) {
    139  for (uint8_t j = 0; j < sizeof(ps4Data.xy[0].finger)/sizeof(ps4Data.xy[0].finger[0]); j++)
    140  ps4Data.xy[i].finger[j].touching = 1; // The bit is cleared if the finger is touching the touchpad
    141  }
    142 
    143  ps4Data.btn.dpad = DPAD_OFF;
    144  oldButtonState.dpad = DPAD_OFF;
    145  buttonClickState.dpad = 0;
    146  oldDpad = 0;
    147 
    148  ps4Output.bigRumble = ps4Output.smallRumble = 0;
    149  ps4Output.r = ps4Output.g = ps4Output.b = 0;
    150  ps4Output.flashOn = ps4Output.flashOff = 0;
    151  ps4Output.reportChanged = false;
    152 };
    153 
    void Reset()
    Definition: PS4Parser.cpp:130
    uint32_t val
    Definition: PS4Parser.h:71
    @@ -290,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s4_parser_8h.html b/_p_s4_parser_8h.html index 207b3451..f3186963 100644 --- a/_p_s4_parser_8h.html +++ b/_p_s4_parser_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,21 +89,26 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4Parser.h File Reference
    -
    #include "Usb.h"
    -#include "controllerEnums.h"
    +
    #include "Usb.h"
    +#include "controllerEnums.h"
    Include dependency graph for PS4Parser.h:
    - + + +
    This graph shows which files directly or indirectly include this file:
    - + + + +

    Go to the source code of this file.

    @@ -137,31 +143,7 @@ Variables
    -Initial value:
    = {
    -
    UP,
    - -
    DOWN,
    -
    LEFT,
    -
    -
    0x0C,
    -
    0x0D,
    -
    0x0E,
    -
    0x0F,
    -
    -
    0x0A,
    -
    0x0B,
    -
    0x08,
    -
    0x09,
    -
    -
    0x07,
    -
    0x06,
    -
    0x05,
    -
    0x04,
    -
    -
    0x10,
    -
    0x11,
    -
    }
    - +Initial value:
    = {
    UP,
    DOWN,
    LEFT,
    0x0C,
    0x0D,
    0x0E,
    0x0F,
    0x0A,
    0x0B,
    0x08,
    0x09,
    0x07,
    0x06,
    0x05,
    0x04,
    0x10,
    0x11,
    }
    @@ -176,7 +158,7 @@ Variables diff --git a/_p_s4_parser_8h__dep__incl.map b/_p_s4_parser_8h__dep__incl.map index dee1d670..ae9e045f 100644 --- a/_p_s4_parser_8h__dep__incl.map +++ b/_p_s4_parser_8h__dep__incl.map @@ -1,5 +1,5 @@ - - + + diff --git a/_p_s4_parser_8h__dep__incl.md5 b/_p_s4_parser_8h__dep__incl.md5 index 8fd62cc2..2dc29627 100644 --- a/_p_s4_parser_8h__dep__incl.md5 +++ b/_p_s4_parser_8h__dep__incl.md5 @@ -1 +1 @@ -5e56bd64aa04badca5d0648201af05fb \ No newline at end of file +4d5a405a295dec480becbdb408726c5e \ No newline at end of file diff --git a/_p_s4_parser_8h__dep__incl.png b/_p_s4_parser_8h__dep__incl.png index ce787819f82c684a3eac1fb6d597c9a9a5144e0b..a33fed99c380776e8a4ee81452768326dbdefde9 100644 GIT binary patch literal 5726 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 JRLUgie*hRhA - - + + diff --git a/_p_s4_parser_8h__incl.md5 b/_p_s4_parser_8h__incl.md5 index 493b39f0..a7437e13 100644 --- a/_p_s4_parser_8h__incl.md5 +++ b/_p_s4_parser_8h__incl.md5 @@ -1 +1 @@ -559da26f56bdca12a84aceb0d7a5a74b \ No newline at end of file +29a4989044a63001a938d41ea83d3491 \ No newline at end of file diff --git a/_p_s4_parser_8h__incl.png b/_p_s4_parser_8h__incl.png index a254877fd6eda1cff6274b699ab4ef6c02fd0545..98252f4994c8ac04c9111848aa21af519318f8a4 100644 GIT binary patch literal 4574 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 - + USB Host Shield 2.0: PS4Parser.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,256 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4Parser.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _ps4parser_h_
    -
    19 #define _ps4parser_h_
    -
    20 
    -
    21 #include "Usb.h"
    -
    22 #include "controllerEnums.h"
    -
    23 
    -
    25 const uint8_t PS4_BUTTONS[] PROGMEM = {
    -
    26  UP, // UP
    -
    27  RIGHT, // RIGHT
    -
    28  DOWN, // DOWN
    -
    29  LEFT, // LEFT
    -
    30 
    -
    31  0x0C, // SHARE
    -
    32  0x0D, // OPTIONS
    -
    33  0x0E, // L3
    -
    34  0x0F, // R3
    -
    35 
    -
    36  0x0A, // L2
    -
    37  0x0B, // R2
    -
    38  0x08, // L1
    -
    39  0x09, // R1
    -
    40 
    -
    41  0x07, // TRIANGLE
    -
    42  0x06, // CIRCLE
    -
    43  0x05, // CROSS
    -
    44  0x04, // SQUARE
    -
    45 
    -
    46  0x10, // PS
    -
    47  0x11, // TOUCHPAD
    -
    48 };
    -
    49 
    -
    50 union PS4Buttons {
    -
    51  struct {
    -
    52  uint8_t dpad : 4;
    -
    53  uint8_t square : 1;
    -
    54  uint8_t cross : 1;
    -
    55  uint8_t circle : 1;
    -
    56  uint8_t triangle : 1;
    -
    57 
    -
    58  uint8_t l1 : 1;
    -
    59  uint8_t r1 : 1;
    -
    60  uint8_t l2 : 1;
    -
    61  uint8_t r2 : 1;
    -
    62  uint8_t share : 1;
    -
    63  uint8_t options : 1;
    -
    64  uint8_t l3 : 1;
    -
    65  uint8_t r3 : 1;
    -
    66 
    -
    67  uint8_t ps : 1;
    -
    68  uint8_t touchpad : 1;
    -
    69  uint8_t reportCounter : 6;
    -
    70  } __attribute__((packed));
    -
    71  uint32_t val : 24;
    -
    72 } __attribute__((packed));
    -
    73 
    -
    74 struct touchpadXY {
    -
    75  uint8_t dummy; // I can not figure out what this data is for, it seems to change randomly, maybe a timestamp?
    -
    76  struct {
    -
    77  uint8_t counter : 7; // Increments every time a finger is touching the touchpad
    -
    78  uint8_t touching : 1; // The top bit is cleared if the finger is touching the touchpad
    -
    79  uint16_t x : 12;
    -
    80  uint16_t y : 12;
    -
    81  } __attribute__((packed)) finger[2]; // 0 = first finger, 1 = second finger
    -
    82 } __attribute__((packed));
    -
    83 
    -
    84 struct PS4Status {
    -
    85  uint8_t battery : 4;
    -
    86  uint8_t usb : 1;
    -
    87  uint8_t audio : 1;
    -
    88  uint8_t mic : 1;
    -
    89  uint8_t unknown : 1; // Extension port?
    -
    90 } __attribute__((packed));
    -
    91 
    -
    92 struct PS4Data {
    -
    93  /* Button and joystick values */
    -
    94  uint8_t hatValue[4];
    - -
    96  uint8_t trigger[2];
    -
    97 
    -
    98  /* Gyro and accelerometer values */
    -
    99  uint8_t dummy[3]; // First two looks random, while the third one might be some kind of status - it increments once in a while
    -
    100  int16_t gyroY, gyroZ, gyroX;
    -
    101  int16_t accX, accZ, accY;
    -
    102 
    -
    103  uint8_t dummy2[5];
    - -
    105  uint8_t dummy3[3];
    -
    106 
    -
    107  /* The rest is data for the touchpad */
    -
    108  touchpadXY xy[3]; // It looks like it sends out three coordinates each time, this might be because the microcontroller inside the PS4 controller is much faster than the Bluetooth connection.
    -
    109  // The last data is read from the last position in the array while the oldest measurement is from the first position.
    -
    110  // The first position will also keep it's value after the finger is released, while the other two will set them to zero.
    -
    111  // Note that if you read fast enough from the device, then only the first one will contain any data.
    -
    112 
    -
    113  // The last three bytes are always: 0x00, 0x80, 0x00
    -
    114 } __attribute__((packed));
    -
    115 
    -
    116 struct PS4Output {
    -
    117  uint8_t bigRumble, smallRumble; // Rumble
    -
    118  uint8_t r, g, b; // RGB
    -
    119  uint8_t flashOn, flashOff; // Time to flash bright/dark (255 = 2.5 seconds)
    -
    120  bool reportChanged; // The data is send when data is received from the controller
    -
    121 } __attribute__((packed));
    -
    122 
    -
    124 class PS4Parser {
    -
    125 public:
    - -
    128  Reset();
    -
    129  };
    -
    130 
    -
    142  bool getButtonPress(ButtonEnum b);
    -
    143  bool getButtonClick(ButtonEnum b);
    -
    153  uint8_t getAnalogButton(ButtonEnum b);
    -
    154 
    -
    160  uint8_t getAnalogHat(AnalogHatEnum a);
    -
    161 
    -
    170  uint16_t getX(uint8_t finger = 0, uint8_t xyId = 0) {
    -
    171  return ps4Data.xy[xyId].finger[finger].x;
    -
    172  };
    -
    173 
    -
    182  uint16_t getY(uint8_t finger = 0, uint8_t xyId = 0) {
    -
    183  return ps4Data.xy[xyId].finger[finger].y;
    -
    184  };
    -
    185 
    -
    194  bool isTouching(uint8_t finger = 0, uint8_t xyId = 0) {
    -
    195  return !(ps4Data.xy[xyId].finger[finger].touching); // The bit is cleared when a finger is touching the touchpad
    -
    196  };
    -
    197 
    -
    206  uint8_t getTouchCounter(uint8_t finger = 0, uint8_t xyId = 0) {
    -
    207  return ps4Data.xy[xyId].finger[finger].counter;
    -
    208  };
    -
    209 
    -
    215  float getAngle(AngleEnum a) {
    -
    216  if (a == Pitch)
    -
    217  return (atan2f(ps4Data.accY, ps4Data.accZ) + PI) * RAD_TO_DEG;
    -
    218  else
    -
    219  return (atan2f(ps4Data.accX, ps4Data.accZ) + PI) * RAD_TO_DEG;
    -
    220  };
    -
    221 
    -
    227  int16_t getSensor(SensorEnum s) {
    -
    228  switch(s) {
    -
    229  case gX:
    -
    230  return ps4Data.gyroX;
    -
    231  case gY:
    -
    232  return ps4Data.gyroY;
    -
    233  case gZ:
    -
    234  return ps4Data.gyroZ;
    -
    235  case aX:
    -
    236  return ps4Data.accX;
    -
    237  case aY:
    -
    238  return ps4Data.accY;
    -
    239  case aZ:
    -
    240  return ps4Data.accZ;
    -
    241  default:
    -
    242  return 0;
    -
    243  }
    -
    244  };
    -
    245 
    -
    250  uint8_t getBatteryLevel() {
    -
    251  return ps4Data.status.battery;
    -
    252  };
    -
    253 
    -
    258  bool getUsbStatus() {
    -
    259  return ps4Data.status.usb;
    -
    260  };
    -
    261 
    -
    266  bool getAudioStatus() {
    -
    267  return ps4Data.status.audio;
    -
    268  };
    -
    269 
    -
    274  bool getMicStatus() {
    -
    275  return ps4Data.status.mic;
    -
    276  };
    -
    277 
    -
    279  void setAllOff() {
    -
    280  setRumbleOff();
    -
    281  setLedOff();
    -
    282  };
    -
    283 
    -
    285  void setRumbleOff() {
    -
    286  setRumbleOn(0, 0);
    -
    287  };
    -
    288 
    -
    293  void setRumbleOn(RumbleEnum mode) {
    -
    294  if (mode == RumbleLow)
    -
    295  setRumbleOn(0x00, 0xFF);
    -
    296  else
    -
    297  setRumbleOn(0xFF, 0x00);
    -
    298  };
    -
    299 
    -
    305  void setRumbleOn(uint8_t bigRumble, uint8_t smallRumble) {
    -
    306  ps4Output.bigRumble = bigRumble;
    -
    307  ps4Output.smallRumble = smallRumble;
    -
    308  ps4Output.reportChanged = true;
    -
    309  };
    -
    310 
    -
    312  void setLedOff() {
    -
    313  setLed(0, 0, 0);
    -
    314  };
    -
    315 
    -
    320  void setLed(uint8_t r, uint8_t g, uint8_t b) {
    -
    321  ps4Output.r = r;
    -
    322  ps4Output.g = g;
    -
    323  ps4Output.b = b;
    -
    324  ps4Output.reportChanged = true;
    -
    325  };
    -
    326 
    -
    331  void setLed(ColorsEnum color) {
    -
    332  setLed((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color));
    -
    333  };
    -
    334 
    -
    340  void setLedFlash(uint8_t flashOn, uint8_t flashOff) {
    -
    341  ps4Output.flashOn = flashOn;
    -
    342  ps4Output.flashOff = flashOff;
    -
    343  ps4Output.reportChanged = true;
    -
    344  };
    -
    347 protected:
    -
    353  void Parse(uint8_t len, uint8_t *buf);
    -
    354 
    -
    356  void Reset();
    -
    357 
    -
    362  virtual void sendOutputReport(PS4Output *output) = 0;
    -
    363 
    -
    364 private:
    -
    365  bool checkDpad(ButtonEnum b); // Used to check PS4 DPAD buttons
    -
    366 
    -
    367  PS4Data ps4Data;
    -
    368  PS4Buttons oldButtonState, buttonClickState;
    -
    369  PS4Output ps4Output;
    -
    370  uint8_t oldDpad;
    -
    371 };
    -
    372 #endif
    -
    uint8_t getBatteryLevel()
    Definition: PS4Parser.h:250
    +Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _ps4parser_h_
    19 #define _ps4parser_h_
    20 
    21 #include "Usb.h"
    22 #include "controllerEnums.h"
    23 
    25 const uint8_t PS4_BUTTONS[] PROGMEM = {
    26  UP, // UP
    27  RIGHT, // RIGHT
    28  DOWN, // DOWN
    29  LEFT, // LEFT
    30 
    31  0x0C, // SHARE
    32  0x0D, // OPTIONS
    33  0x0E, // L3
    34  0x0F, // R3
    35 
    36  0x0A, // L2
    37  0x0B, // R2
    38  0x08, // L1
    39  0x09, // R1
    40 
    41  0x07, // TRIANGLE
    42  0x06, // CIRCLE
    43  0x05, // CROSS
    44  0x04, // SQUARE
    45 
    46  0x10, // PS
    47  0x11, // TOUCHPAD
    48 };
    49 
    50 union PS4Buttons {
    51  struct {
    52  uint8_t dpad : 4;
    53  uint8_t square : 1;
    54  uint8_t cross : 1;
    55  uint8_t circle : 1;
    56  uint8_t triangle : 1;
    57 
    58  uint8_t l1 : 1;
    59  uint8_t r1 : 1;
    60  uint8_t l2 : 1;
    61  uint8_t r2 : 1;
    62  uint8_t share : 1;
    63  uint8_t options : 1;
    64  uint8_t l3 : 1;
    65  uint8_t r3 : 1;
    66 
    67  uint8_t ps : 1;
    68  uint8_t touchpad : 1;
    69  uint8_t reportCounter : 6;
    70  } __attribute__((packed));
    71  uint32_t val : 24;
    72 } __attribute__((packed));
    73 
    74 struct touchpadXY {
    75  uint8_t dummy; // I can not figure out what this data is for, it seems to change randomly, maybe a timestamp?
    76  struct {
    77  uint8_t counter : 7; // Increments every time a finger is touching the touchpad
    78  uint8_t touching : 1; // The top bit is cleared if the finger is touching the touchpad
    79  uint16_t x : 12;
    80  uint16_t y : 12;
    81  } __attribute__((packed)) finger[2]; // 0 = first finger, 1 = second finger
    82 } __attribute__((packed));
    83 
    84 struct PS4Status {
    85  uint8_t battery : 4;
    86  uint8_t usb : 1;
    87  uint8_t audio : 1;
    88  uint8_t mic : 1;
    89  uint8_t unknown : 1; // Extension port?
    90 } __attribute__((packed));
    91 
    92 struct PS4Data {
    93  /* Button and joystick values */
    94  uint8_t hatValue[4];
    96  uint8_t trigger[2];
    97 
    98  /* Gyro and accelerometer values */
    99  uint8_t dummy[3]; // First two looks random, while the third one might be some kind of status - it increments once in a while
    100  int16_t gyroY, gyroZ, gyroX;
    101  int16_t accX, accZ, accY;
    102 
    103  uint8_t dummy2[5];
    105  uint8_t dummy3[3];
    106 
    107  /* The rest is data for the touchpad */
    108  touchpadXY xy[3]; // It looks like it sends out three coordinates each time, this might be because the microcontroller inside the PS4 controller is much faster than the Bluetooth connection.
    109  // The last data is read from the last position in the array while the oldest measurement is from the first position.
    110  // The first position will also keep it's value after the finger is released, while the other two will set them to zero.
    111  // Note that if you read fast enough from the device, then only the first one will contain any data.
    112 
    113  // The last three bytes are always: 0x00, 0x80, 0x00
    114 } __attribute__((packed));
    115 
    116 struct PS4Output {
    117  uint8_t bigRumble, smallRumble; // Rumble
    118  uint8_t r, g, b; // RGB
    119  uint8_t flashOn, flashOff; // Time to flash bright/dark (255 = 2.5 seconds)
    120  bool reportChanged; // The data is send when data is received from the controller
    121 } __attribute__((packed));
    122 
    124 class PS4Parser {
    125 public:
    128  Reset();
    129  };
    130 
    142  bool getButtonPress(ButtonEnum b);
    143  bool getButtonClick(ButtonEnum b);
    153  uint8_t getAnalogButton(ButtonEnum b);
    154 
    160  uint8_t getAnalogHat(AnalogHatEnum a);
    161 
    170  uint16_t getX(uint8_t finger = 0, uint8_t xyId = 0) {
    171  return ps4Data.xy[xyId].finger[finger].x;
    172  };
    173 
    182  uint16_t getY(uint8_t finger = 0, uint8_t xyId = 0) {
    183  return ps4Data.xy[xyId].finger[finger].y;
    184  };
    185 
    194  bool isTouching(uint8_t finger = 0, uint8_t xyId = 0) {
    195  return !(ps4Data.xy[xyId].finger[finger].touching); // The bit is cleared when a finger is touching the touchpad
    196  };
    197 
    206  uint8_t getTouchCounter(uint8_t finger = 0, uint8_t xyId = 0) {
    207  return ps4Data.xy[xyId].finger[finger].counter;
    208  };
    209 
    215  float getAngle(AngleEnum a) {
    216  if (a == Pitch)
    217  return (atan2f(ps4Data.accY, ps4Data.accZ) + PI) * RAD_TO_DEG;
    218  else
    219  return (atan2f(ps4Data.accX, ps4Data.accZ) + PI) * RAD_TO_DEG;
    220  };
    221 
    227  int16_t getSensor(SensorEnum s) {
    228  switch(s) {
    229  case gX:
    230  return ps4Data.gyroX;
    231  case gY:
    232  return ps4Data.gyroY;
    233  case gZ:
    234  return ps4Data.gyroZ;
    235  case aX:
    236  return ps4Data.accX;
    237  case aY:
    238  return ps4Data.accY;
    239  case aZ:
    240  return ps4Data.accZ;
    241  default:
    242  return 0;
    243  }
    244  };
    245 
    250  uint8_t getBatteryLevel() {
    251  return ps4Data.status.battery;
    252  };
    253 
    258  bool getUsbStatus() {
    259  return ps4Data.status.usb;
    260  };
    261 
    266  bool getAudioStatus() {
    267  return ps4Data.status.audio;
    268  };
    269 
    274  bool getMicStatus() {
    275  return ps4Data.status.mic;
    276  };
    277 
    279  void setAllOff() {
    280  setRumbleOff();
    281  setLedOff();
    282  };
    283 
    285  void setRumbleOff() {
    286  setRumbleOn(0, 0);
    287  };
    288 
    293  void setRumbleOn(RumbleEnum mode) {
    294  if (mode == RumbleLow)
    295  setRumbleOn(0x00, 0xFF);
    296  else
    297  setRumbleOn(0xFF, 0x00);
    298  };
    299 
    305  void setRumbleOn(uint8_t bigRumble, uint8_t smallRumble) {
    306  ps4Output.bigRumble = bigRumble;
    307  ps4Output.smallRumble = smallRumble;
    308  ps4Output.reportChanged = true;
    309  };
    310 
    312  void setLedOff() {
    313  setLed(0, 0, 0);
    314  };
    315 
    320  void setLed(uint8_t r, uint8_t g, uint8_t b) {
    321  ps4Output.r = r;
    322  ps4Output.g = g;
    323  ps4Output.b = b;
    324  ps4Output.reportChanged = true;
    325  };
    326 
    331  void setLed(ColorsEnum color) {
    332  setLed((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color));
    333  };
    334 
    340  void setLedFlash(uint8_t flashOn, uint8_t flashOff) {
    341  ps4Output.flashOn = flashOn;
    342  ps4Output.flashOff = flashOff;
    343  ps4Output.reportChanged = true;
    344  };
    347 protected:
    353  void Parse(uint8_t len, uint8_t *buf);
    354 
    356  void Reset();
    357 
    362  virtual void sendOutputReport(PS4Output *output) = 0;
    363 
    364 private:
    365  bool checkDpad(ButtonEnum b); // Used to check PS4 DPAD buttons
    366 
    367  PS4Data ps4Data;
    368  PS4Buttons oldButtonState, buttonClickState;
    369  PS4Output ps4Output;
    370  uint8_t oldDpad;
    371 };
    372 #endif
    uint8_t getBatteryLevel()
    Definition: PS4Parser.h:250
    uint32_t val
    Definition: PS4Parser.h:71
    uint16_t getY(uint8_t finger=0, uint8_t xyId=0)
    Definition: PS4Parser.h:182
    @@ -348,7 +100,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    void setLed(ColorsEnum color)
    Definition: PS4Parser.h:331
    void setRumbleOn(uint8_t bigRumble, uint8_t smallRumble)
    Definition: PS4Parser.h:305
    -
    uint8_t touching
    Definition: PS4Parser.h:78
    int16_t getSensor(SensorEnum s)
    Definition: PS4Parser.h:227
    uint8_t flashOn
    Definition: PS4Parser.h:119
    @@ -368,8 +119,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    bool reportChanged
    Definition: PS4Parser.h:120
    uint8_t ps
    Definition: PS4Parser.h:67
    bool isTouching(uint8_t finger=0, uint8_t xyId=0)
    Definition: PS4Parser.h:194
    -
    uint8_t counter
    Definition: PS4Parser.h:77
    -
    uint16_t y
    Definition: PS4Parser.h:80
    const uint8_t PS4_BUTTONS[]
    Definition: PS4Parser.h:25
    @@ -384,7 +133,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    void setLedOff()
    Definition: PS4Parser.h:312
    uint8_t dpad
    Definition: PS4Parser.h:52
    -
    struct touchpadXY::@30 finger[2]
    ColorsEnum
    int16_t gyroZ
    Definition: PS4Parser.h:100
    @@ -403,7 +151,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4Buttons btn
    Definition: PS4Parser.h:95
    SensorEnum
    uint8_t circle
    Definition: PS4Parser.h:55
    -
    uint16_t x
    Definition: PS4Parser.h:79
    int16_t accZ
    Definition: PS4Parser.h:101
    void setLedFlash(uint8_t flashOn, uint8_t flashOff)
    Definition: PS4Parser.h:340
    @@ -417,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s4_u_s_b_8h.html b/_p_s4_u_s_b_8h.html index 9ba07cd6..eb7dce74 100644 --- a/_p_s4_u_s_b_8h.html +++ b/_p_s4_u_s_b_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4USB.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,14 +89,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4USB.h File Reference
    -
    #include "hiduniversal.h"
    -#include "PS4Parser.h"
    +
    #include "hiduniversal.h"
    +#include "PS4Parser.h"
    Include dependency graph for PS4USB.h:
    - + + + + + + +

    Go to the source code of this file.

    @@ -162,7 +169,7 @@ Macros diff --git a/_p_s4_u_s_b_8h__incl.map b/_p_s4_u_s_b_8h__incl.map index 6adb2977..479efdd9 100644 --- a/_p_s4_u_s_b_8h__incl.map +++ b/_p_s4_u_s_b_8h__incl.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/_p_s4_u_s_b_8h__incl.md5 b/_p_s4_u_s_b_8h__incl.md5 index 6f81f265..9a8140ab 100644 --- a/_p_s4_u_s_b_8h__incl.md5 +++ b/_p_s4_u_s_b_8h__incl.md5 @@ -1 +1 @@ -6a42e5c2a682226199a7b2c36de96295 \ No newline at end of file +3d9cec3e6d601d983fe2992427af4c58 \ No newline at end of file diff --git a/_p_s4_u_s_b_8h__incl.png b/_p_s4_u_s_b_8h__incl.png index 37e0baf36249e16568036bc89294d7415b752be9..126e64cd297e7b35acafa2a11475bce88059007f 100644 GIT binary patch literal 16789 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 diff --git a/_p_s4_u_s_b_8h_source.html b/_p_s4_u_s_b_8h_source.html index c3edaee2..c37d3cd4 100644 --- a/_p_s4_u_s_b_8h_source.html +++ b/_p_s4_u_s_b_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4USB.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,95 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PS4USB.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _ps4usb_h_
    -
    19 #define _ps4usb_h_
    -
    20 
    -
    21 #include "hiduniversal.h"
    -
    22 #include "PS4Parser.h"
    -
    23 
    -
    24 #define PS4_VID 0x054C // Sony Corporation
    -
    25 #define PS4_PID 0x05C4 // PS4 Controller
    -
    26 #define PS4_PID_SLIM 0x09CC // PS4 Slim Controller
    -
    27 
    -
    32 class PS4USB : public HIDUniversal, public PS4Parser {
    -
    33 public:
    -
    38  PS4USB(USB *p) :
    -
    39  HIDUniversal(p) {
    - -
    41  };
    -
    42 
    -
    47  bool connected() {
    -
    48  return HIDUniversal::isReady() && HIDUniversal::VID == PS4_VID && (HIDUniversal::PID == PS4_PID || HIDUniversal::PID == PS4_PID_SLIM);
    -
    49  };
    -
    50 
    -
    55  void attachOnInit(void (*funcOnInit)(void)) {
    -
    56  pFuncOnInit = funcOnInit;
    -
    57  };
    -
    58 
    -
    59 protected:
    -
    68  virtual void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
    - -
    70  PS4Parser::Parse(len, buf);
    -
    71  };
    -
    72 
    -
    78  virtual uint8_t OnInitSuccessful() {
    - - -
    81  if (pFuncOnInit)
    -
    82  pFuncOnInit(); // Call the user function
    -
    83  else
    -
    84  setLed(Blue);
    -
    85  };
    -
    86  return 0;
    -
    87  };
    -
    91  virtual void sendOutputReport(PS4Output *output) { // Source: https://github.com/chrippa/ds4drv
    -
    92  uint8_t buf[32];
    -
    93  memset(buf, 0, sizeof(buf));
    -
    94 
    -
    95  buf[0] = 0x05; // Report ID
    -
    96  buf[1]= 0xFF;
    -
    97 
    -
    98  buf[4] = output->smallRumble; // Small Rumble
    -
    99  buf[5] = output->bigRumble; // Big rumble
    -
    100 
    -
    101  buf[6] = output->r; // Red
    -
    102  buf[7] = output->g; // Green
    -
    103  buf[8] = output->b; // Blue
    -
    104 
    -
    105  buf[9] = output->flashOn; // Time to flash bright (255 = 2.5 seconds)
    -
    106  buf[10] = output->flashOff; // Time to flash dark (255 = 2.5 seconds)
    -
    107 
    -
    108  output->reportChanged = false;
    -
    109 
    -
    110  // The PS4 console actually set the four last bytes to a CRC32 checksum, but it seems like it is actually not needed
    -
    111 
    -
    112  pUsb->outTransfer(bAddress, epInfo[ hidInterfaces[0].epIndex[epInterruptOutIndex] ].epAddr, sizeof(buf), buf);
    -
    113  };
    -
    123  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    124  return (vid == PS4_VID && (pid == PS4_PID || HIDUniversal::PID == PS4_PID_SLIM));
    -
    125  };
    -
    128 private:
    -
    129  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    130 };
    -
    131 #endif
    -
    uint16_t PID
    Definition: hiduniversal.h:69
    +Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _ps4usb_h_
    19 #define _ps4usb_h_
    20 
    21 #include "hiduniversal.h"
    22 #include "PS4Parser.h"
    23 
    24 #define PS4_VID 0x054C // Sony Corporation
    25 #define PS4_PID 0x05C4 // PS4 Controller
    26 #define PS4_PID_SLIM 0x09CC // PS4 Slim Controller
    27 
    32 class PS4USB : public HIDUniversal, public PS4Parser {
    33 public:
    38  PS4USB(USB *p) :
    39  HIDUniversal(p) {
    41  };
    42 
    47  bool connected() {
    48  return HIDUniversal::isReady() && HIDUniversal::VID == PS4_VID && (HIDUniversal::PID == PS4_PID || HIDUniversal::PID == PS4_PID_SLIM);
    49  };
    50 
    55  void attachOnInit(void (*funcOnInit)(void)) {
    56  pFuncOnInit = funcOnInit;
    57  };
    58 
    59 protected:
    68  virtual void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
    70  PS4Parser::Parse(len, buf);
    71  };
    72 
    78  virtual uint8_t OnInitSuccessful() {
    81  if (pFuncOnInit)
    82  pFuncOnInit(); // Call the user function
    83  else
    84  setLed(Blue);
    85  };
    86  return 0;
    87  };
    91  virtual void sendOutputReport(PS4Output *output) { // Source: https://github.com/chrippa/ds4drv
    92  uint8_t buf[32];
    93  memset(buf, 0, sizeof(buf));
    94 
    95  buf[0] = 0x05; // Report ID
    96  buf[1]= 0xFF;
    97 
    98  buf[4] = output->smallRumble; // Small Rumble
    99  buf[5] = output->bigRumble; // Big rumble
    100 
    101  buf[6] = output->r; // Red
    102  buf[7] = output->g; // Green
    103  buf[8] = output->b; // Blue
    104 
    105  buf[9] = output->flashOn; // Time to flash bright (255 = 2.5 seconds)
    106  buf[10] = output->flashOff; // Time to flash dark (255 = 2.5 seconds)
    107 
    108  output->reportChanged = false;
    109 
    110  // The PS4 console actually set the four last bytes to a CRC32 checksum, but it seems like it is actually not needed
    111 
    112  pUsb->outTransfer(bAddress, epInfo[epInterruptOutIndex].epAddr, sizeof(buf), buf);
    113  };
    123  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    124  return (vid == PS4_VID && (pid == PS4_PID || HIDUniversal::PID == PS4_PID_SLIM));
    125  };
    128 private:
    129  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    130 };
    131 #endif
    uint16_t PID
    Definition: hiduniversal.h:69
    virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: PS4USB.h:123
    Definition: usbhid.h:143
    void Reset()
    Definition: PS4Parser.cpp:130
    @@ -186,7 +99,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Definition: PS4USB.h:32
    uint8_t flashOn
    Definition: PS4Parser.h:119
    -
    HIDInterface hidInterfaces[maxHidInterfaces]
    Definition: hiduniversal.h:65
    uint16_t VID
    Definition: hiduniversal.h:69
    uint8_t g
    Definition: PS4Parser.h:118
    bool reportChanged
    Definition: PS4Parser.h:120
    @@ -217,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s_buzz_8cpp.html b/_p_s_buzz_8cpp.html index cbce8dd8..700d6c01 100644 --- a/_p_s_buzz_8cpp.html +++ b/_p_s_buzz_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PSBuzz.cpp File Reference
    -
    #include "PSBuzz.h"
    +
    #include "PSBuzz.h"
    Include dependency graph for PSBuzz.cpp:
    - + + + + + + +

    Go to the source code of this file.

    @@ -100,7 +107,7 @@ Include dependency graph for PSBuzz.cpp:
    diff --git a/_p_s_buzz_8cpp__incl.map b/_p_s_buzz_8cpp__incl.map index 6b6dca0b..987cb529 100644 --- a/_p_s_buzz_8cpp__incl.map +++ b/_p_s_buzz_8cpp__incl.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/_p_s_buzz_8cpp__incl.md5 b/_p_s_buzz_8cpp__incl.md5 index 12166ef9..b600c9e8 100644 --- a/_p_s_buzz_8cpp__incl.md5 +++ b/_p_s_buzz_8cpp__incl.md5 @@ -1 +1 @@ -e0ea176f5f8a648337d4d3cc906b2e53 \ No newline at end of file +4060fd39043c7564a19c22e4b422acd8 \ No newline at end of file diff --git a/_p_s_buzz_8cpp__incl.png b/_p_s_buzz_8cpp__incl.png index f37d28bc00483067ea8de6bd31649b33f70fca6a..3f05ab6573b16a01a2e2661984e393cb9a5edbce 100644 GIT binary patch literal 14378 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 diff --git a/_p_s_buzz_8cpp_source.html b/_p_s_buzz_8cpp_source.html index ede35247..f3a729a4 100644 --- a/_p_s_buzz_8cpp_source.html +++ b/_p_s_buzz_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,89 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PSBuzz.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #include "PSBuzz.h"
    -
    19 
    -
    20 // To enable serial debugging see "settings.h"
    -
    21 //#define PRINTREPORT // Uncomment to print the report send by the PS Buzz Controllers
    -
    22 
    -
    23 void PSBuzz::ParseHIDData(USBHID *hid __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len, uint8_t *buf) {
    -
    24  if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID && len > 2 && buf) {
    -
    25 #ifdef PRINTREPORT
    -
    26  Notify(PSTR("\r\n"), 0x80);
    -
    27  for (uint8_t i = 0; i < len; i++) {
    -
    28  D_PrintHex<uint8_t > (buf[i], 0x80);
    -
    29  Notify(PSTR(" "), 0x80);
    -
    30  }
    -
    31 #endif
    -
    32  memcpy(&psbuzzButtons, buf + 2, min((uint8_t)(len - 2), MFK_CASTUINT8T sizeof(psbuzzButtons)));
    -
    33 
    -
    34  if (psbuzzButtons.val != oldButtonState.val) { // Check if anything has changed
    -
    35  buttonClickState.val = psbuzzButtons.val & ~oldButtonState.val; // Update click state variable
    -
    36  oldButtonState.val = psbuzzButtons.val;
    -
    37  }
    -
    38  }
    -
    39 };
    -
    40 
    - - -
    43  Reset();
    -
    44  if (pFuncOnInit)
    -
    45  pFuncOnInit(); // Call the user function
    -
    46  else
    -
    47  setLedOnAll(); // Turn the LED on, on all four controllers
    -
    48  };
    -
    49  return 0;
    -
    50 };
    -
    51 
    -
    52 bool PSBuzz::getButtonPress(ButtonEnum b, uint8_t controller) {
    -
    53  return psbuzzButtons.val & (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller
    -
    54 };
    -
    55 
    -
    56 bool PSBuzz::getButtonClick(ButtonEnum b, uint8_t controller) {
    -
    57  uint32_t mask = (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller
    -
    58  bool click = buttonClickState.val & mask;
    -
    59  buttonClickState.val &= ~mask; // Clear "click" event
    -
    60  return click;
    -
    61 };
    -
    62 
    -
    63 // Source: http://www.developerfusion.com/article/84338/making-usb-c-friendly/ and https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
    -
    64 void PSBuzz::setLedRaw(bool value, uint8_t controller) {
    -
    65  ledState[controller] = value; // Save value for next time it is called
    -
    66 
    -
    67  uint8_t buf[7];
    -
    68  buf[0] = 0x00;
    -
    69  buf[1] = ledState[0] ? 0xFF : 0x00;
    -
    70  buf[2] = ledState[1] ? 0xFF : 0x00;
    -
    71  buf[3] = ledState[2] ? 0xFF : 0x00;
    -
    72  buf[4] = ledState[3] ? 0xFF : 0x00;
    -
    73  buf[5] = 0x00;
    -
    74  buf[6] = 0x00;
    -
    75 
    -
    76  PSBuzz_Command(buf, sizeof(buf));
    -
    77 };
    -
    78 
    -
    79 void PSBuzz::PSBuzz_Command(uint8_t *data, uint16_t nbytes) {
    -
    80  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x00), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
    -
    81  pUsb->ctrlReq(bAddress, epInfo[0].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    -
    82 };
    -
    uint16_t PID
    Definition: hiduniversal.h:69
    +Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #include "PSBuzz.h"
    19 
    20 // To enable serial debugging see "settings.h"
    21 //#define PRINTREPORT // Uncomment to print the report send by the PS Buzz Controllers
    22 
    23 void PSBuzz::ParseHIDData(USBHID *hid __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len, uint8_t *buf) {
    24  if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID && len > 2 && buf) {
    25 #ifdef PRINTREPORT
    26  Notify(PSTR("\r\n"), 0x80);
    27  for (uint8_t i = 0; i < len; i++) {
    28  D_PrintHex<uint8_t > (buf[i], 0x80);
    29  Notify(PSTR(" "), 0x80);
    30  }
    31 #endif
    32  memcpy(&psbuzzButtons, buf + 2, min((uint8_t)(len - 2), MFK_CASTUINT8T sizeof(psbuzzButtons)));
    33 
    34  if (psbuzzButtons.val != oldButtonState.val) { // Check if anything has changed
    35  buttonClickState.val = psbuzzButtons.val & ~oldButtonState.val; // Update click state variable
    36  oldButtonState.val = psbuzzButtons.val;
    37  }
    38  }
    39 };
    40 
    43  Reset();
    44  if (pFuncOnInit)
    45  pFuncOnInit(); // Call the user function
    46  else
    47  setLedOnAll(); // Turn the LED on, on all four controllers
    48  };
    49  return 0;
    50 };
    51 
    52 bool PSBuzz::getButtonPress(ButtonEnum b, uint8_t controller) {
    53  return psbuzzButtons.val & (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller
    54 };
    55 
    56 bool PSBuzz::getButtonClick(ButtonEnum b, uint8_t controller) {
    57  uint32_t mask = (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller
    58  bool click = buttonClickState.val & mask;
    59  buttonClickState.val &= ~mask; // Clear "click" event
    60  return click;
    61 };
    62 
    63 // Source: http://www.developerfusion.com/article/84338/making-usb-c-friendly/ and https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
    64 void PSBuzz::setLedRaw(bool value, uint8_t controller) {
    65  ledState[controller] = value; // Save value for next time it is called
    66 
    67  uint8_t buf[7];
    68  buf[0] = 0x00;
    69  buf[1] = ledState[0] ? 0xFF : 0x00;
    70  buf[2] = ledState[1] ? 0xFF : 0x00;
    71  buf[3] = ledState[2] ? 0xFF : 0x00;
    72  buf[4] = ledState[3] ? 0xFF : 0x00;
    73  buf[5] = 0x00;
    74  buf[6] = 0x00;
    75 
    76  PSBuzz_Command(buf, sizeof(buf));
    77 };
    78 
    79 void PSBuzz::PSBuzz_Command(uint8_t *data, uint16_t nbytes) {
    80  // bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x00), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
    81  pUsb->ctrlReq(bAddress, epInfo[0].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    82 };
    uint16_t PID
    Definition: hiduniversal.h:69
    Definition: usbhid.h:143
    USB * pUsb
    Definition: usbhid.h:145
    void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: PSBuzz.cpp:23
    @@ -196,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s_buzz_8h.html b/_p_s_buzz_8h.html index 0fbe6830..8af28df2 100644 --- a/_p_s_buzz_8h.html +++ b/_p_s_buzz_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,21 +89,27 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PSBuzz.h File Reference
    -
    #include "hiduniversal.h"
    -#include "controllerEnums.h"
    +
    #include "hiduniversal.h"
    +#include "controllerEnums.h"
    Include dependency graph for PSBuzz.h:
    - + + + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -155,7 +162,7 @@ Macros diff --git a/_p_s_buzz_8h__dep__incl.map b/_p_s_buzz_8h__dep__incl.map index 18cbe6ec..4b2f91a5 100644 --- a/_p_s_buzz_8h__dep__incl.map +++ b/_p_s_buzz_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/_p_s_buzz_8h__dep__incl.md5 b/_p_s_buzz_8h__dep__incl.md5 index c02fe703..5caa0d46 100644 --- a/_p_s_buzz_8h__dep__incl.md5 +++ b/_p_s_buzz_8h__dep__incl.md5 @@ -1 +1 @@ -b1edc92eb077ae74eaa6c13520327464 \ No newline at end of file +88928a152c2f379aa7b4a52bc6f3da10 \ No newline at end of file diff --git a/_p_s_buzz_8h__dep__incl.png b/_p_s_buzz_8h__dep__incl.png index 22e0e65c564d824e7f3146467f720bc1e4ccec00..7730f098acdf398856d904e545b02e8cd3d8dcdb 100644 GIT binary patch literal 2284 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 literal 2617 zcmbtWc|6ox8~^3Xo;`%{UW1#)HY1_MHui}!6Jlh|Sf@d<-?Ch?MRvv5vW z3V*~f6>AsBkXskJgZDPh6u%r9T{=HJzBiXW7eLq=8X~_vW5CO-T`3V=E-+Ol<&*p$ zSbwm;q^z8rmiE-5d_qnP-aa!!pMM@AAt4dm2bDI13dJJ|7Z)A$R&VV+Kon9alykAt z@4oD_n7BKCULAaLt3UrTH$UWWq@1)9&yayYqHJ92tS?F^$;fn%kDmnc(enL$eUG0! zxdqFvulI9vb3-B%($mu|6>M$a-oJl8URcRjT|DwBVz}zrv)RGH!P+P164U|hYu6rC zRGih}MWIkKGBW%7`}+F&!2OPnj=H+K*;x!0`#wB899&LMPp72`R@n#$2n2kZSAaqX zhKAJ8CI;OOrSdVIK6pI-&Yj)8Ju_3&^{p*JULGsZ(9i&pm8F0Gj#n4oG4k^Ew!`#K zPJWwh_S@XtjPC2564`iA)ajrM0HTR3z)Pn(g4VsQ)m2w4mK9js4!nN-x~8W}HZmk6 z1bF%RGv3QuXX-BmRfRZg=iutElmTN*Db&Y22Rb-Uxq-IcR!9%XE=owlQ~7AK|fZO zmmNfUTyvvDkaic+rN0IF8?BzsaTtWgB#WGi+8_}in50DCv)fz!ycO}Glbd?ko6p*rG zkXSH_gyOL&cJS8P8)x;0_Uz3voM06W6_YwENHHUK}4k zM~PA&nbuH;{ce9$nbGlKp`tn`mi>5Ue}SgDFPE410i&FSB~nF2rGG{Ad!3%!!0s3y z@N)l45&-Z>Q?(rGIz zjmtb?DqO9h`#Uef7|5)=pq;I`)(Zh!BX;gu7f*|bi16{%y}02G2x*;3q^lbx{}+}D z+(qrK^-1CyJG5RN-*nvqBU95aJ3FMhy6x?4P=u-WNh6-qZ{Hdk7(7f$5+j{n=N{mj zoS0DiB|W25Y7{Nd%L{tS+|2B7_ao}cmBE)UwcXv_?dXU2n1QSh|YHpx}7|(qfn_aF)>3nphSDA*&aO{ z;P54T1-n#*iED%>+f=atQ`6HYg@wWMQYs=MBIpc8CUIqHi3#|=w<&h+_OY;Oy5uim zI79U~mpA+kl+L?%LD%IF+}baWgY9r^h92n0gBXJSGErtQy5ii&2#im!$qNj>=R z!OfRudi)Fr2Zx7;$J+Y33YV#o(W~L%Hve^@W+H`R4dH+7LYkVgHZ(N!ZSkvGBpzkP z{P{gRJ(nn$k&(g5Bk?pZ(xcG^D)fGJb!(n^H#fIQu?0+5 zNK8Var0);GxU8%!uw1-(Z$5eI>7sA5*1bbWCTMc<^31D#zj6!+4i2VZstJp0qR3+t z_%1$XpEYXv=?izk;{R!(t%*!#VPU!1awnFk&uwU6Xb4Jb4W@Z%YpeQ=+p9MiclVFG zySsJHy=9?GG#V!dM+3PA{)ZsPim!$aZ|LQ`UYaokyaMUo(P38?Vku8r5dwMI)YSC+ z`CMG^e#Qi2Y#a;Hn3{_6^(9%9 zQ%|Y3P!hYBIEO5B4n*pb824yA!dNUe;PA(OIk#p8xhw<= diff --git a/_p_s_buzz_8h__incl.map b/_p_s_buzz_8h__incl.map index 3b284d68..00d5a656 100644 --- a/_p_s_buzz_8h__incl.map +++ b/_p_s_buzz_8h__incl.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/_p_s_buzz_8h__incl.md5 b/_p_s_buzz_8h__incl.md5 index 581c44ba..801930e6 100644 --- a/_p_s_buzz_8h__incl.md5 +++ b/_p_s_buzz_8h__incl.md5 @@ -1 +1 @@ -9962a3586f77be3d87353d14649331ad \ No newline at end of file +460aa9dc1a3fdb1c5075c5daa680120f \ No newline at end of file diff --git a/_p_s_buzz_8h__incl.png b/_p_s_buzz_8h__incl.png index 71d0ea81b43f1e8051f638f28b4032c421b37d90..724fcd48cf791352d6ecd0110dd32b3da9d38203 100644 GIT binary patch literal 12733 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 H8Tx+!Tiit; diff --git a/_p_s_buzz_8h_source.html b/_p_s_buzz_8h_source.html index 20e99ce7..642f24df 100644 --- a/_p_s_buzz_8h_source.html +++ b/_p_s_buzz_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,111 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    PSBuzz.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _psbuzz_h_
    -
    19 #define _psbuzz_h_
    -
    20 
    -
    21 #include "hiduniversal.h"
    -
    22 #include "controllerEnums.h"
    -
    23 
    -
    24 #define PSBUZZ_VID 0x054C // Sony Corporation
    -
    25 #define PSBUZZ_PID 0x1000 // PS Buzz Controller
    -
    26 
    - -
    29  struct {
    -
    30  uint8_t red : 1;
    -
    31  uint8_t yellow : 1;
    -
    32  uint8_t green : 1;
    -
    33  uint8_t orange : 1;
    -
    34  uint8_t blue : 1;
    -
    35  } __attribute__((packed)) btn[4];
    -
    36  uint32_t val : 20;
    -
    37 } __attribute__((packed));
    -
    38 
    -
    43 class PSBuzz : public HIDUniversal {
    -
    44 public:
    -
    49  PSBuzz(USB *p) :
    -
    50  HIDUniversal(p) {
    -
    51  Reset();
    -
    52  };
    -
    53 
    -
    58  bool connected() {
    - -
    60  };
    -
    61 
    -
    66  void attachOnInit(void (*funcOnInit)(void)) {
    -
    67  pFuncOnInit = funcOnInit;
    -
    68  };
    -
    69 
    -
    82  bool getButtonPress(ButtonEnum b, uint8_t controller = 0);
    -
    83  bool getButtonClick(ButtonEnum b, uint8_t controller = 0);
    -
    95  void setLedRaw(bool value, uint8_t controller = 0);
    -
    96 
    -
    98  void setLedOffAll() {
    -
    99  for (uint8_t i = 1; i < 4; i++) // Skip first as it will be set in setLedRaw
    -
    100  ledState[i] = false; // Just an easy way to set all four off at the same time
    -
    101  setLedRaw(false); // Turn the LED off, on all four controllers
    -
    102  };
    -
    103 
    -
    108  void setLedOff(uint8_t controller = 0) {
    -
    109  setLedRaw(false, controller);
    -
    110  };
    -
    111 
    -
    112 
    -
    114  void setLedOnAll() {
    -
    115  for (uint8_t i = 1; i < 4; i++) // Skip first as it will be set in setLedRaw
    -
    116  ledState[i] = true; // Just an easy way to set all four off at the same time
    -
    117  setLedRaw(true); // Turn the LED on, on all four controllers
    -
    118  };
    -
    119 
    -
    124  void setLedOn(uint8_t controller = 0) {
    -
    125  setLedRaw(true, controller);
    -
    126  };
    -
    127 
    -
    132  void setLedToggle(uint8_t controller = 0) {
    -
    133  setLedRaw(!ledState[controller], controller);
    -
    134  };
    -
    137 protected:
    -
    146  void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    -
    147 
    -
    153  uint8_t OnInitSuccessful();
    -
    157  void Reset() {
    -
    158  psbuzzButtons.val = 0;
    -
    159  oldButtonState.val = 0;
    -
    160  buttonClickState.val = 0;
    -
    161  for (uint8_t i = 0; i < sizeof(ledState); i++)
    -
    162  ledState[i] = 0;
    -
    163  };
    -
    164 
    -
    172  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    173  return (vid == PSBUZZ_VID && pid == PSBUZZ_PID);
    -
    174  };
    -
    177 private:
    -
    178  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    179 
    -
    180  void PSBuzz_Command(uint8_t *data, uint16_t nbytes);
    -
    181 
    -
    182  PSBUZZButtons psbuzzButtons, oldButtonState, buttonClickState;
    -
    183  bool ledState[4];
    -
    184 };
    -
    185 #endif
    -
    uint16_t PID
    Definition: hiduniversal.h:69
    +Go to the documentation of this file.
    1 /* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _psbuzz_h_
    19 #define _psbuzz_h_
    20 
    21 #include "hiduniversal.h"
    22 #include "controllerEnums.h"
    23 
    24 #define PSBUZZ_VID 0x054C // Sony Corporation
    25 #define PSBUZZ_PID 0x1000 // PS Buzz Controller
    26 
    29  struct {
    30  uint8_t red : 1;
    31  uint8_t yellow : 1;
    32  uint8_t green : 1;
    33  uint8_t orange : 1;
    34  uint8_t blue : 1;
    35  } __attribute__((packed)) btn[4];
    36  uint32_t val : 20;
    37 } __attribute__((packed));
    38 
    43 class PSBuzz : public HIDUniversal {
    44 public:
    49  PSBuzz(USB *p) :
    50  HIDUniversal(p) {
    51  Reset();
    52  };
    53 
    58  bool connected() {
    60  };
    61 
    66  void attachOnInit(void (*funcOnInit)(void)) {
    67  pFuncOnInit = funcOnInit;
    68  };
    69 
    82  bool getButtonPress(ButtonEnum b, uint8_t controller = 0);
    83  bool getButtonClick(ButtonEnum b, uint8_t controller = 0);
    95  void setLedRaw(bool value, uint8_t controller = 0);
    96 
    98  void setLedOffAll() {
    99  for (uint8_t i = 1; i < 4; i++) // Skip first as it will be set in setLedRaw
    100  ledState[i] = false; // Just an easy way to set all four off at the same time
    101  setLedRaw(false); // Turn the LED off, on all four controllers
    102  };
    103 
    108  void setLedOff(uint8_t controller = 0) {
    109  setLedRaw(false, controller);
    110  };
    111 
    112 
    114  void setLedOnAll() {
    115  for (uint8_t i = 1; i < 4; i++) // Skip first as it will be set in setLedRaw
    116  ledState[i] = true; // Just an easy way to set all four off at the same time
    117  setLedRaw(true); // Turn the LED on, on all four controllers
    118  };
    119 
    124  void setLedOn(uint8_t controller = 0) {
    125  setLedRaw(true, controller);
    126  };
    127 
    132  void setLedToggle(uint8_t controller = 0) {
    133  setLedRaw(!ledState[controller], controller);
    134  };
    137 protected:
    146  void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    147 
    153  uint8_t OnInitSuccessful();
    157  void Reset() {
    158  psbuzzButtons.val = 0;
    159  oldButtonState.val = 0;
    160  buttonClickState.val = 0;
    161  for (uint8_t i = 0; i < sizeof(ledState); i++)
    162  ledState[i] = 0;
    163  };
    164 
    172  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    173  return (vid == PSBUZZ_VID && pid == PSBUZZ_PID);
    174  };
    177 private:
    178  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    179 
    180  void PSBuzz_Command(uint8_t *data, uint16_t nbytes);
    181 
    182  PSBUZZButtons psbuzzButtons, oldButtonState, buttonClickState;
    183  bool ledState[4];
    184 };
    185 #endif
    uint16_t PID
    Definition: hiduniversal.h:69
    Definition: usbhid.h:143
    uint8_t red
    Definition: PSBuzz.h:30
    void setLedToggle(uint8_t controller=0)
    Definition: PSBuzz.h:132
    @@ -224,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_r_e_a_d_m_e_8md.html b/_r_e_a_d_m_e_8md.html index 5ecda0dd..a5b29531 100644 --- a/_r_e_a_d_m_e_8md.html +++ b/_r_e_a_d_m_e_8md.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: README.md File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -92,7 +93,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_r_e_a_d_m_e_8md_source.html b/_r_e_a_d_m_e_8md_source.html index 471ffb57..087be603 100644 --- a/_r_e_a_d_m_e_8md_source.html +++ b/_r_e_a_d_m_e_8md_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: README.md Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,396 +86,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    README.md
    -Go to the documentation of this file.
    1 # USB Host Library Rev.2.0
    -
    2 
    -
    3 The code is released under the GNU General Public License.
    -
    4 __________
    -
    5 [![Build Status](https://travis-ci.org/felis/USB_Host_Shield_2.0.svg?branch=master)](https://travis-ci.org/felis/USB_Host_Shield_2.0)
    -
    6 
    -
    7 # Summary
    -
    8 This is Revision 2.0 of MAX3421E-based USB Host Shield Library for AVR's.
    -
    9 
    -
    10 Project main web site is: <http://www.circuitsathome.com>.
    -
    11 
    -
    12 Some information can also be found at: <http://blog.tkjelectronics.dk/>.
    -
    13 
    -
    14 The shield can be purchased at the main site: <http://www.circuitsathome.com/products-page/arduino-shields> or from [TKJ Electronics](http://tkjelectronics.com/): <http://shop.tkjelectronics.dk/product_info.php?products_id=43>.
    -
    15 
    -
    16 ![USB Host Shield](http://shop.tkjelectronics.dk/images/USB_Host_Shield1.jpg)
    -
    17 
    -
    18 For more information about the hardware see the [Hardware Manual](http://www.circuitsathome.com/usb-host-shield-hardware-manual).
    -
    19 
    -
    20 # Developed By
    -
    21 
    -
    22 * __Oleg Mazurov, Circuits\@Home__ - <mazurov@circuitsathome.com>
    -
    23 * __Alexei Glushchenko, Circuits\@Home__ - <alex-gl@mail.ru>
    -
    24  * Developers of the USB Core, HID, FTDI, ADK, ACM, and PL2303 libraries
    -
    25 * __Kristian Lauszus, TKJ Electronics__ - <kristianl@tkjelectronics.com>
    -
    26  * Developer of the [BTD](#bluetooth-libraries), [BTHID](#bthid-library), [SPP](#spp-library), [PS4](#ps4-library), [PS3](#ps3-library), [Wii](#wii-library), [Xbox](#xbox-library), and [PSBuzz](#ps-buzz-library) libraries
    -
    27 * __Andrew Kroll__ - <xxxajk@gmail.com>
    -
    28  * Major contributor to mass storage code
    -
    29 * __guruthree__
    -
    30  * [Xbox ONE](#xbox-one-library) controller support
    -
    31 * __Yuuichi Akagawa__ - [\@YuuichiAkagawa](https://twitter.com/yuuichiakagawa)
    -
    32  * Developer of the [MIDI](#midi-library) library
    -
    33 
    -
    34 # Donate
    -
    35 
    -
    36 Help yourself by helping us support you! Many thousands of hours have been spent developing the USB Host Shield library. Since you find it useful, please consider donating via the button below. Donations will allow us to support you by ensuring hardware that you have can be acquired in order to add support for your microcontroller board.
    -
    37 
    -
    38 <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=donate@circuitsathome.com&amp;lc=US&amp;item_name=Donate%20to%20the%20USB%20Host%20Library%20project&amp;no_note=0&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHostedGuest"><img src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" alt="PayPal - The safer, easier way to pay online!" /></a>
    -
    39 
    -
    40 # Table of Contents
    -
    41 
    -
    42 * [How to include the library](#how-to-include-the-library)
    -
    43  * [Arduino Library Manager](#arduino-library-manager)
    -
    44  * [Manual installation](#manual-installation)
    -
    45 * [How to use the library](#how-to-use-the-library)
    -
    46  * [Documentation](#documentation)
    -
    47  * [Enable debugging](#enable-debugging)
    -
    48  * [Boards](#boards)
    -
    49  * [Bluetooth libraries](#bluetooth-libraries)
    -
    50  * [BTHID library](#bthid-library)
    -
    51  * [SPP library](#spp-library)
    -
    52  * [PS4 Library](#ps4-library)
    -
    53  * [PS3 Library](#ps3-library)
    -
    54  * [Xbox Libraries](#xbox-libraries)
    -
    55  * [Xbox library](#xbox-library)
    -
    56  * [Xbox 360 Library](#xbox-360-library)
    -
    57  * [Xbox ONE Library](#xbox-one-library)
    -
    58  * [Wii library](#wii-library)
    -
    59  * [PS Buzz Library](#ps-buzz-library)
    -
    60  * [HID Libraries](#hid-libraries)
    -
    61  * [MIDI Library](#midi-library)
    -
    62 * [Interface modifications](#interface-modifications)
    -
    63 * [FAQ](#faq)
    -
    64 
    -
    65 # How to include the library
    -
    66 
    -
    67 ### Arduino Library Manager
    -
    68 
    -
    69 First install Arduino IDE version 1.6.2 or newer, then simply use the Arduino Library Manager to install the library.
    -
    70 
    -
    71 Please see the following page for instructions: <http://www.arduino.cc/en/Guide/Libraries#toc3>.
    -
    72 
    -
    73 ### Manual installation
    -
    74 
    -
    75 First download the library by clicking on the following link: <https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip>.
    -
    76 
    -
    77 Then uncompress the zip folder and rename the directory to "USB\_Host\_Shield\_20", as any special characters are not supported by the Arduino IDE.
    -
    78 
    -
    79 Now open up the Arduino IDE and open "File>Preferences". There you will see the location of your sketchbook. Open that directory and create a directory called "libraries" inside that directory.
    -
    80 Now move the "USB\_Host\_Shield\_20" directory to the "libraries" directory.
    -
    81 
    -
    82 The final structure should look like this:
    -
    83 
    -
    84 * Arduino/
    -
    85  * libraries/
    -
    86  * USB\_Host\_Shield\_20/
    -
    87 
    -
    88 Now quit the Arduino IDE and reopen it.
    -
    89 
    -
    90 Now you should be able to go open all the examples codes by navigating to "File>Examples>USB\_Host\_Shield\_20" and then select the example you will like to open.
    -
    91 
    -
    92 For more information visit the following sites: <http://arduino.cc/en/Guide/Libraries> and <https://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use>.
    -
    93 
    -
    94 # How to use the library
    -
    95 
    -
    96 ### Documentation
    -
    97 
    -
    98 Documentation for the library can be found at the following link: <https://felis.github.io/USB_Host_Shield_2.0/>.
    -
    99 
    -
    100 ### Enable debugging
    -
    101 
    -
    102 By default serial debugging is disabled. To turn it on simply change ```ENABLE_UHS_DEBUGGING``` to 1 in [settings.h](settings.h) like so:
    -
    103 
    -
    104 ```C++
    -
    105 #define ENABLE_UHS_DEBUGGING 1
    -
    106 ```
    -
    107 
    -
    108 ### Boards
    -
    109 
    -
    110 Currently the following boards are supported by the library:
    -
    111 
    -
    112 * All official Arduino AVR boards (Uno, Duemilanove, Mega, Mega 2560, Mega ADK, Leonardo etc.)
    -
    113 * Arduino Due, Intel Galileo, Intel Galileo 2, and Intel Edison
    -
    114  * Note that the Intel Galileo uses pin 2 and 3 as INT and SS pin respectively by default, so some modifications to the shield are needed. See the "Interface modifications" section in the [hardware manual](https://www.circuitsathome.com/usb-host-shield-hardware-manual) for more information.
    -
    115  * Note native USB host is not supported on any of these platforms. You will have to use the shield for now.
    -
    116 * Teensy (Teensy++ 1.0, Teensy 2.0, Teensy++ 2.0, Teensy 3.x, and Teensy LC)
    -
    117  * Note if you are using the Teensy 3.x you should download this SPI library as well: <https://github.com/xxxajk/spi4teensy3>. You should then add ```#include <spi4teensy3.h>``` to your .ino file.
    -
    118 * Balanduino
    -
    119 * Sanguino
    -
    120 * Black Widdow
    -
    121 * RedBearLab nRF51822
    -
    122 * Digilent chipKIT
    -
    123  * Please see: <http://www.circuitsathome.com/mcu/usb/running-usb-host-code-on-digilent-chipkit-board>.
    -
    124 * STM32F4
    -
    125  * Currently the [NUCLEO-F446RE](http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF262063) is supported featuring the STM32F446. Take a look at the following example code: <https://github.com/Lauszus/Nucleo_F446RE_USBHost>.
    -
    126 * ESP8266 is supported using the [ESP8266 Arduino core](https://github.com/esp8266/Arduino)
    -
    127  * Note it uses pin 15 and 5 for SS and INT respectively
    -
    128  * Also please be aware that:
    -
    129  * GPIO16 is **NOT** usable, as it will be used for some other purposes. For example, reset the SoC itself from sleep mode.
    -
    130  * GPIO6 to 11 is also **NOT** usable, as they are used to connect SPI flash chip and it is used for storing the executable binary content.
    -
    131 * ESP32 is supported using the [arduino-esp32](https://github.com/espressif/arduino-esp32/)
    -
    132  * GPIO5 : SS, GPIO17 : INT, GPIO18 : SCK, GPIO19 : MISO, GPIO23 : MOSI
    -
    133 
    -
    134 The following boards need to be activated manually in [settings.h](settings.h):
    -
    135 
    -
    136 * Arduino Mega ADK
    -
    137  * If you are using Arduino 1.5.5 or newer there is no need to activate the Arduino Mega ADK manually
    -
    138 * Black Widdow
    -
    139 
    -
    140 Simply set the corresponding value to 1 instead of 0.
    -
    141 
    -
    142 ### [Bluetooth libraries](BTD.cpp)
    -
    143 
    -
    144 The [BTD library](BTD.cpp) is a general purpose library for an ordinary Bluetooth dongle.
    -
    145 This library make it easy to add support for different Bluetooth services like a PS3 or a Wii controller or SPP which is a virtual serial port via Bluetooth.
    -
    146 Some different examples can be found in the [example directory](examples/Bluetooth).
    -
    147 
    -
    148 The BTD library also makes it possible to use multiple services at once, the following example sketch is an example of this:
    -
    149 [PS3SPP.ino](examples/Bluetooth/PS3SPP/PS3SPP.ino).
    -
    150 
    -
    151 ### [BTHID library](BTHID.cpp)
    -
    152 
    -
    153 The [Bluetooth HID library](BTHID.cpp) allows you to connect HID devices via Bluetooth to the USB Host Shield.
    -
    154 
    -
    155 Currently HID mice and keyboards are supported.
    -
    156 
    -
    157 It uses the standard Boot protocol by default, but it is also able to use the Report protocol as well. You would simply have to call ```setProtocolMode()``` and then parse ```HID_RPT_PROTOCOL``` as an argument. You will then have to modify the parser for your device. See the example: [BTHID.ino](examples/Bluetooth/BTHID/BTHID.ino) for more information.
    -
    158 
    -
    159 The [PS4 library](#ps4-library) also uses this class to handle all Bluetooth communication.
    -
    160 
    -
    161 For information see the following blog post: <http://blog.tkjelectronics.dk/2013/12/bluetooth-hid-devices-now-supported-by-the-usb-host-library/>.
    -
    162 
    -
    163 ### [SPP library](SPP.cpp)
    -
    164 
    -
    165 SPP stands for "Serial Port Profile" and is a Bluetooth protocol that implements a virtual comport which allows you to send data back and forth from your computer/phone to your Arduino via Bluetooth.
    -
    166 It has been tested successfully on Windows, Mac OS X, Linux, and Android.
    -
    167 
    -
    168 Take a look at the [SPP.ino](examples/Bluetooth/SPP/SPP.ino) example for more information.
    -
    169 
    -
    170 More information can be found at these blog posts:
    -
    171 
    -
    172 * <http://www.circuitsathome.com/mcu/bluetooth-rfcommspp-service-support-for-usb-host-2-0-library-released>
    -
    173 * <http://blog.tkjelectronics.dk/2012/07/rfcommspp-library-for-arduino/>
    -
    174 
    -
    175 To implement the SPP protocol I used a Bluetooth sniffing tool called [PacketLogger](http://www.tkjelectronics.com/uploads/PacketLogger.zip) developed by Apple.
    -
    176 It enables me to see the Bluetooth communication between my Mac and any device.
    -
    177 
    -
    178 ### PS4 Library
    -
    179 
    -
    180 The PS4BT library is split up into the [PS4BT](PS4BT.h) and the [PS4USB](PS4USB.h) library. These allow you to use the Sony PS4 controller via Bluetooth and USB.
    -
    181 
    -
    182 The [PS4BT.ino](examples/Bluetooth/PS4BT/PS4BT.ino) and [PS4USB.ino](examples/PS4USB/PS4USB.ino) examples shows how to easily read the buttons, joysticks, touchpad and IMU on the controller via Bluetooth and USB respectively. It is also possible to control the rumble and light on the controller and get the battery level.
    -
    183 
    -
    184 Before you can use the PS4 controller via Bluetooth you will need to pair with it.
    -
    185 
    -
    186 Simply create the PS4BT instance like so: ```PS4BT PS4(&Btd, PAIR);``` and then hold down the Share button and then hold down the PS without releasing the Share button. The PS4 controller will then start to blink rapidly indicating that it is in pairing mode.
    -
    187 
    -
    188 It should then automatically pair the dongle with your controller. This only have to be done once.
    -
    189 
    -
    190 For information see the following blog post: <http://blog.tkjelectronics.dk/2014/01/ps4-controller-now-supported-by-the-usb-host-library/>.
    -
    191 
    -
    192 Also check out this excellent Wiki by Frank Zhao about the PS4 controller: <http://eleccelerator.com/wiki/index.php?title=DualShock_4> and this Linux driver: <https://github.com/chrippa/ds4drv>.
    -
    193 
    -
    194 Several guides on how to use the PS4 library has been written by Dr. James E. Barger and are available at the following link: <https://sites.google.com/view/vbatc-engineeringtechnology2/control-system-tutorials/ps4-tutorials>.
    -
    195 
    -
    196 ### PS3 Library
    -
    197 
    -
    198 These libraries consist of the [PS3BT](PS3BT.cpp) and [PS3USB](PS3USB.cpp). These libraries allows you to use a Dualshock 3, Navigation or a Motion controller with the USB Host Shield both via Bluetooth and USB.
    -
    199 
    -
    200 In order to use your Playstation controller via Bluetooth you have to set the Bluetooth address of the dongle internally to your PS3 Controller. This can be achieved by first plugging in the Bluetooth dongle and wait a few seconds. Now plug in the controller via USB and wait until the LEDs start to flash. The library has now written the Bluetooth address of the dongle to the PS3 controller.
    -
    201 
    -
    202 Finally simply plug in the Bluetooth dongle again and press PS on the PS3 controller. After a few seconds it should be connected to the dongle and ready to use.
    -
    203 
    -
    204 __Note:__ You will have to plug in the Bluetooth dongle before connecting the controller, as the library needs to read the address of the dongle. Alternatively you could set it in code like so: [PS3BT.ino#L20](examples/Bluetooth/PS3BT/PS3BT.ino#L20).
    -
    205 
    -
    206 For more information about the PS3 protocol see the official wiki: <https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information>.
    -
    207 
    -
    208 Also take a look at the blog posts:
    -
    209 
    -
    210 * <http://blog.tkjelectronics.dk/2012/01/ps3-controller-bt-library-for-arduino/>
    -
    211 * <http://www.circuitsathome.com/mcu/sony-ps3-controller-support-added-to-usb-host-library>
    -
    212 * <http://www.circuitsathome.com/mcu/arduino/interfacing-ps3-controllers-via-usb>
    -
    213 
    -
    214 A special thanks go to the following people:
    -
    215 
    -
    216 1. _Richard Ibbotson_ who made this excellent guide: <http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part>
    -
    217 2. _Tomoyuki Tanaka_ for releasing his code for the Arduino USB Host shield connected to the wiimote: <http://www.circuitsathome.com/mcu/rc-car-controlled-by-wii-remote-on-arduino>
    -
    218 
    -
    219 Also a big thanks all the people behind these sites about the Motion controller:
    -
    220 
    -
    221 * <http://thp.io/2010/psmove/>
    -
    222 * <http://www.copenhagengamecollective.org/unimove/>
    -
    223 * <https://github.com/thp/psmoveapi>
    -
    224 * <http://code.google.com/p/moveonpc/>
    -
    225 
    -
    226 ### Xbox Libraries
    -
    227 
    -
    228 The library supports both the original Xbox controller via USB and the Xbox 360 controller both via USB and wirelessly.
    -
    229 
    -
    230 #### Xbox library
    -
    231 
    -
    232 The [XBOXOLD](XBOXOLD.cpp) class implements support for the original Xbox controller via USB.
    -
    233 
    -
    234 All the information are from the following sites:
    -
    235 
    -
    236 * <https://github.com/torvalds/linux/blob/master/Documentation/input/xpad.txt>
    -
    237 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
    -
    238 * <http://euc.jp/periphs/xbox-controller.ja.html>
    -
    239 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL#L15>
    -
    240 
    -
    241 #### Xbox 360 Library
    -
    242 
    -
    243 The library support one Xbox 360 via USB or up to four Xbox 360 controllers wirelessly by using a [Xbox 360 wireless receiver](http://blog.tkjelectronics.dk/wp-content/uploads/xbox360-wireless-receiver.jpg).
    -
    244 
    -
    245 To use it via USB use the [XBOXUSB](XBOXUSB.cpp) library or to use it wirelessly use the [XBOXRECV](XBOXRECV.cpp) library.
    -
    246 
    -
    247 __Note that a Wireless controller can NOT be used via USB!__
    -
    248 
    -
    249 Examples code can be found in the [examples directory](examples/Xbox).
    -
    250 
    -
    251 Also see the following blog posts:
    -
    252 
    -
    253 * <http://www.circuitsathome.com/mcu/xbox360-controller-support-added-to-usb-host-shield-2-0-library>
    -
    254 * <http://blog.tkjelectronics.dk/2012/07/xbox-360-controller-support-added-to-the-usb-host-library/>
    -
    255 * <http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/>
    -
    256 
    -
    257 All the information regarding the Xbox 360 controller protocol are form these sites:
    -
    258 
    -
    259 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/UsbInfo>
    -
    260 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/WirelessUsbInfo>
    -
    261 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL>
    -
    262 
    -
    263 #### Xbox ONE Library
    -
    264 
    -
    265 An Xbox ONE controller is supported via USB in the [XBOXONE](XBOXONE.cpp) class. It is heavily based on the 360 library above. In addition to cross referencing the above, information on the protocol was found at:
    -
    266 
    -
    267 * <https://github.com/quantus/xbox-one-controller-protocol>
    -
    268 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
    -
    269 * <https://github.com/kylelemons/xbox/blob/master/xbox.go>
    -
    270 
    -
    271 ### [Wii library](Wii.cpp)
    -
    272 
    -
    273 The [Wii](Wii.cpp) library support the Wiimote, but also the Nunchuch and Motion Plus extensions via Bluetooth. The Wii U Pro Controller and Wii Balance Board are also supported via Bluetooth.
    -
    274 
    -
    275 First you have to pair with the controller, this is done automatically by the library if you create the instance like so:
    -
    276 
    -
    277 ```C++
    -
    278 WII Wii(&Btd, PAIR);
    -
    279 ```
    -
    280 
    -
    281 And then press 1 & 2 at once on the Wiimote or the SYNC buttons if you are using a Wii U Pro Controller or a Wii Balance Board.
    -
    282 
    -
    283 After that you can simply create the instance like so:
    -
    284 
    -
    285 ```C++
    -
    286 WII Wii(&Btd);
    -
    287 ```
    -
    288 
    -
    289 Then just press any button on the Wiimote and it will then connect to the dongle.
    -
    290 
    -
    291 Take a look at the example for more information: [Wii.ino](examples/Bluetooth/Wii/Wii.ino).
    -
    292 
    -
    293 Also take a look at the blog post:
    -
    294 
    -
    295 * <http://blog.tkjelectronics.dk/2012/08/wiimote-added-to-usb-host-library/>
    -
    296 
    -
    297 The Wii IR camera can also be used, but you will have to activate the code for it manually as it is quite large. Simply set ```ENABLE_WII_IR_CAMERA``` to 1 in [settings.h](settings.h).
    -
    298 
    -
    299 The [WiiIRCamera.ino](examples/Bluetooth/WiiIRCamera/WiiIRCamera.ino) example shows how it can be used.
    -
    300 
    -
    301 All the information about the Wii controllers are from these sites:
    -
    302 
    -
    303 * <http://wiibrew.org/wiki/Wiimote>
    -
    304 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers>
    -
    305 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Nunchuck>
    -
    306 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus>
    -
    307 * <http://wiibrew.org/wiki/Wii_Balance_Board>
    -
    308 * The old library created by _Tomoyuki Tanaka_: <https://github.com/moyuchin/WiiRemote_on_Arduino> also helped a lot.
    -
    309 
    -
    310 ### [PS Buzz Library](PSBuzz.cpp)
    -
    311 
    -
    312 This library implements support for the Playstation Buzz controllers via USB.
    -
    313 
    -
    314 It is essentially just a wrapper around the [HIDUniversal](hiduniversal.cpp) which takes care of the initializing and reading of the controllers. The [PSBuzz](PSBuzz.cpp) class simply inherits this and parses the data, so it is easy for users to read the buttons and turn the big red button on the controllers on and off.
    -
    315 
    -
    316 The example [PSBuzz.ino](examples/PSBuzz/PSBuzz.ino) shows how one can do this with just a few lines of code.
    -
    317 
    -
    318 More information about the controller can be found at the following sites:
    -
    319 
    -
    320 * http://www.developerfusion.com/article/84338/making-usb-c-friendly/
    -
    321 * https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
    -
    322 
    -
    323 ### HID Libraries
    -
    324 
    -
    325 HID devices are also supported by the library. However these require you to write your own driver. A few example are provided in the [examples/HID](examples/HID) directory. Including an example for the [SteelSeries SRW-S1 Steering Wheel](examples/HID/SRWS1/SRWS1.ino).
    -
    326 
    -
    327 ### [MIDI Library](usbh_midi.cpp)
    -
    328 
    -
    329 The library support MIDI devices.
    -
    330 You can convert USB MIDI keyboard to legacy serial MIDI.
    -
    331 
    -
    332 * [USB_MIDI_converter.ino](examples/USBH_MIDI/USB_MIDI_converter/USB_MIDI_converter.ino)
    -
    333 * [USB_MIDI_converter_multi.ino](examples/USBH_MIDI/USB_MIDI_converter_multi/USB_MIDI_converter_multi.ino)
    -
    334 
    -
    335 For information see the following page: <http://yuuichiakagawa.github.io/USBH_MIDI/>.
    -
    336 
    -
    337 # Interface modifications
    -
    338 
    -
    339 The shield is using SPI for communicating with the MAX3421E USB host controller. It uses the SCK, MISO and MOSI pins via the ICSP on your board.
    -
    340 
    -
    341 Note this means that it uses pin 13, 12, 11 on an Arduino Uno, so these pins can not be used for anything else than SPI communication!
    -
    342 
    -
    343 Furthermore it uses one pin as SS and one INT pin. These are by default located on pin 10 and 9 respectively. They can easily be reconfigured in case you need to use them for something else by cutting the jumper on the shield and then solder a wire from the pad to the new pin.
    -
    344 
    -
    345 After that you need modify the following entry in [UsbCore.h](UsbCore.h):
    -
    346 
    -
    347 ```C++
    -
    348 typedef MAX3421e<P10, P9> MAX3421E;
    -
    349 ```
    -
    350 
    -
    351 For instance if you have rerouted SS to pin 7 it should read:
    -
    352 
    -
    353 ```C++
    -
    354 typedef MAX3421e<P7, P9> MAX3421E;
    -
    355 ```
    -
    356 
    -
    357 See the "Interface modifications" section in the [hardware manual](https://www.circuitsathome.com/usb-host-shield-hardware-manual) for more information.
    -
    358 
    -
    359 # FAQ
    -
    360 
    -
    361 > When I plug my device into the USB connector nothing happens?
    -
    362 
    -
    363 * Try to connect a external power supply to the Arduino - this solves the problem in most cases.
    -
    364 * You can also use a powered hub between the device and the USB Host Shield. You should then include the USB hub library: ```#include <usbhub.h>``` and create the instance like so: ```USBHub Hub1(&Usb);```.
    -
    365 
    -
    366 > When I connecting my PS3 controller I get a output like this:
    -
    367 
    -
    368 ```
    -
    369 Dualshock 3 Controller Enabled
    -
    370 
    -
    371 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    -
    372 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    -
    373 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    -
    374 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    -
    375 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    -
    376 ```
    -
    377 
    -
    378 * This means that your dongle does not support 2.0+EDR, so you will need another dongle. Please see the following [list](https://github.com/felis/USB_Host_Shield_2.0/wiki/Bluetooth-dongles) for tested working dongles.
    -
    379 
    -
    380 > When compiling I am getting the following error: "fatal error: SPI.h: No such file or directory".
    -
    381 
    -
    382 * Please make sure to include the SPI library like so: ```#include <SPI.h>``` in your .ino file.
    - -
    Definition: UsbCore.h:210
    -
    +Go to the documentation of this file.
    1 # USB Host Library Rev.2.0
    2 
    3 The code is released under the GNU General Public License.
    4 __________
    5 [![Build Status](https://travis-ci.org/felis/USB_Host_Shield_2.0.svg?branch=master)](https://travis-ci.org/felis/USB_Host_Shield_2.0)
    6 
    7 # Summary
    8 This is Revision 2.0 of MAX3421E-based USB Host Shield Library for AVR's.
    9 
    10 Project main web site is: <http://www.circuitsathome.com>.
    11 
    12 Some information can also be found at: <http://blog.tkjelectronics.dk/>.
    13 
    14 The shield can be purchased at the main site: <http://www.circuitsathome.com/products-page/arduino-shields> or from [TKJ Electronics](http://tkjelectronics.com/): <http://shop.tkjelectronics.dk/product_info.php?products_id=43>.
    15 
    16 ![USB Host Shield](http://shop.tkjelectronics.dk/images/USB_Host_Shield1.jpg)
    17 
    18 For more information about the hardware see the [Hardware Manual](http://www.circuitsathome.com/usb-host-shield-hardware-manual).
    19 
    20 # Developed By
    21 
    22 * __Oleg Mazurov, Circuits\@Home__ - <mazurov@circuitsathome.com>
    23 * __Alexei Glushchenko, Circuits\@Home__ - <alex-gl@mail.ru>
    24  * Developers of the USB Core, HID, FTDI, ADK, ACM, and PL2303 libraries
    25 * __Kristian Lauszus, TKJ Electronics__ - <kristianl@tkjelectronics.com>
    26  * Developer of the [BTD](#bluetooth-libraries), [BTHID](#bthid-library), [SPP](#spp-library), [PS4](#ps4-library), [PS3](#ps3-library), [Wii](#wii-library), [Xbox](#xbox-library), and [PSBuzz](#ps-buzz-library) libraries
    27 * __Andrew Kroll__ - <xxxajk@gmail.com>
    28  * Major contributor to mass storage code
    29 * __guruthree__
    30  * [Xbox ONE](#xbox-one-library) controller support
    31 * __Yuuichi Akagawa__ - [\@YuuichiAkagawa](https://twitter.com/yuuichiakagawa)
    32  * Developer of the [MIDI](#midi-library) library
    33 
    34 # Donate
    35 
    36 Help yourself by helping us support you! Many thousands of hours have been spent developing the USB Host Shield library. Since you find it useful, please consider donating via the button below. Donations will allow us to support you by ensuring hardware that you have can be acquired in order to add support for your microcontroller board.
    37 
    38 <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=donate@circuitsathome.com&amp;lc=US&amp;item_name=Donate%20to%20the%20USB%20Host%20Library%20project&amp;no_note=0&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHostedGuest"><img src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" alt="PayPal - The safer, easier way to pay online!" /></a>
    39 
    40 # Table of Contents
    41 
    42 * [How to include the library](#how-to-include-the-library)
    43  * [Arduino Library Manager](#arduino-library-manager)
    44  * [Manual installation](#manual-installation)
    45 * [How to use the library](#how-to-use-the-library)
    46  * [Documentation](#documentation)
    47  * [Enable debugging](#enable-debugging)
    48  * [Boards](#boards)
    49  * [Bluetooth libraries](#bluetooth-libraries)
    50  * [BTHID library](#bthid-library)
    51  * [SPP library](#spp-library)
    52  * [PS4 Library](#ps4-library)
    53  * [PS3 Library](#ps3-library)
    54  * [Xbox Libraries](#xbox-libraries)
    55  * [Xbox library](#xbox-library)
    56  * [Xbox 360 Library](#xbox-360-library)
    57  * [Xbox ONE Library](#xbox-one-library)
    58  * [Wii library](#wii-library)
    59  * [PS Buzz Library](#ps-buzz-library)
    60  * [HID Libraries](#hid-libraries)
    61  * [MIDI Library](#midi-library)
    62 * [Interface modifications](#interface-modifications)
    63 * [FAQ](#faq)
    64 
    65 # How to include the library
    66 
    67 ### Arduino Library Manager
    68 
    69 First install Arduino IDE version 1.6.2 or newer, then simply use the Arduino Library Manager to install the library.
    70 
    71 Please see the following page for instructions: <http://www.arduino.cc/en/Guide/Libraries#toc3>.
    72 
    73 ### Manual installation
    74 
    75 First download the library by clicking on the following link: <https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip>.
    76 
    77 Then uncompress the zip folder and rename the directory to "USB\_Host\_Shield\_20", as any special characters are not supported by the Arduino IDE.
    78 
    79 Now open up the Arduino IDE and open "File>Preferences". There you will see the location of your sketchbook. Open that directory and create a directory called "libraries" inside that directory.
    80 Now move the "USB\_Host\_Shield\_20" directory to the "libraries" directory.
    81 
    82 The final structure should look like this:
    83 
    84 * Arduino/
    85  * libraries/
    86  * USB\_Host\_Shield\_20/
    87 
    88 Now quit the Arduino IDE and reopen it.
    89 
    90 Now you should be able to go open all the examples codes by navigating to "File>Examples>USB\_Host\_Shield\_20" and then select the example you will like to open.
    91 
    92 For more information visit the following sites: <http://arduino.cc/en/Guide/Libraries> and <https://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use>.
    93 
    94 # How to use the library
    95 
    96 ### Documentation
    97 
    98 Documentation for the library can be found at the following link: <https://felis.github.io/USB_Host_Shield_2.0/>.
    99 
    100 ### Enable debugging
    101 
    102 By default serial debugging is disabled. To turn it on simply change ```ENABLE_UHS_DEBUGGING``` to 1 in [settings.h](settings.h) like so:
    103 
    104 ```C++
    105 #define ENABLE_UHS_DEBUGGING 1
    106 ```
    107 
    108 ### Boards
    109 
    110 Currently the following boards are supported by the library:
    111 
    112 * All official Arduino AVR boards (Uno, Duemilanove, Mega, Mega 2560, Mega ADK, Leonardo etc.)
    113 * Arduino Due, Intel Galileo, Intel Galileo 2, and Intel Edison
    114  * Note that the Intel Galileo uses pin 2 and 3 as INT and SS pin respectively by default, so some modifications to the shield are needed. See the "Interface modifications" section in the [hardware manual](https://www.circuitsathome.com/usb-host-shield-hardware-manual) for more information.
    115  * Note native USB host is not supported on any of these platforms. You will have to use the shield for now.
    116 * Teensy (Teensy++ 1.0, Teensy 2.0, Teensy++ 2.0, Teensy 3.x, and Teensy LC)
    117  * Note if you are using the Teensy 3.x you should download this SPI library as well: <https://github.com/xxxajk/spi4teensy3>. You should then add ```#include <spi4teensy3.h>``` to your .ino file.
    118 * Balanduino
    119 * Sanguino
    120 * Black Widdow
    121 * RedBearLab nRF51822
    122 * Digilent chipKIT
    123  * Please see: <http://www.circuitsathome.com/mcu/usb/running-usb-host-code-on-digilent-chipkit-board>.
    124 * STM32F4
    125  * Currently the [NUCLEO-F446RE](http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF262063) is supported featuring the STM32F446. Take a look at the following example code: <https://github.com/Lauszus/Nucleo_F446RE_USBHost>.
    126 * ESP8266 is supported using the [ESP8266 Arduino core](https://github.com/esp8266/Arduino)
    127  * Note it uses pin 15 and 5 for SS and INT respectively
    128  * Also please be aware that:
    129  * GPIO16 is **NOT** usable, as it will be used for some other purposes. For example, reset the SoC itself from sleep mode.
    130  * GPIO6 to 11 is also **NOT** usable, as they are used to connect SPI flash chip and it is used for storing the executable binary content.
    131 * ESP32 is supported using the [arduino-esp32](https://github.com/espressif/arduino-esp32/)
    132  * GPIO5 : SS, GPIO17 : INT, GPIO18 : SCK, GPIO19 : MISO, GPIO23 : MOSI
    133 
    134 The following boards need to be activated manually in [settings.h](settings.h):
    135 
    136 * Arduino Mega ADK
    137  * If you are using Arduino 1.5.5 or newer there is no need to activate the Arduino Mega ADK manually
    138 * Black Widdow
    139 
    140 Simply set the corresponding value to 1 instead of 0.
    141 
    142 ### [Bluetooth libraries](BTD.cpp)
    143 
    144 The [BTD library](BTD.cpp) is a general purpose library for an ordinary Bluetooth dongle.
    145 This library make it easy to add support for different Bluetooth services like a PS3 or a Wii controller or SPP which is a virtual serial port via Bluetooth.
    146 Some different examples can be found in the [example directory](examples/Bluetooth).
    147 
    148 The BTD library also makes it possible to use multiple services at once, the following example sketch is an example of this:
    149 [PS3SPP.ino](examples/Bluetooth/PS3SPP/PS3SPP.ino).
    150 
    151 ### [BTHID library](BTHID.cpp)
    152 
    153 The [Bluetooth HID library](BTHID.cpp) allows you to connect HID devices via Bluetooth to the USB Host Shield.
    154 
    155 Currently HID mice and keyboards are supported.
    156 
    157 It uses the standard Boot protocol by default, but it is also able to use the Report protocol as well. You would simply have to call ```setProtocolMode()``` and then parse ```HID_RPT_PROTOCOL``` as an argument. You will then have to modify the parser for your device. See the example: [BTHID.ino](examples/Bluetooth/BTHID/BTHID.ino) for more information.
    158 
    159 The [PS4 library](#ps4-library) also uses this class to handle all Bluetooth communication.
    160 
    161 For information see the following blog post: <http://blog.tkjelectronics.dk/2013/12/bluetooth-hid-devices-now-supported-by-the-usb-host-library/>.
    162 
    163 ### [SPP library](SPP.cpp)
    164 
    165 SPP stands for "Serial Port Profile" and is a Bluetooth protocol that implements a virtual comport which allows you to send data back and forth from your computer/phone to your Arduino via Bluetooth.
    166 It has been tested successfully on Windows, Mac OS X, Linux, and Android.
    167 
    168 Take a look at the [SPP.ino](examples/Bluetooth/SPP/SPP.ino) example for more information.
    169 
    170 More information can be found at these blog posts:
    171 
    172 * <http://www.circuitsathome.com/mcu/bluetooth-rfcommspp-service-support-for-usb-host-2-0-library-released>
    173 * <http://blog.tkjelectronics.dk/2012/07/rfcommspp-library-for-arduino/>
    174 
    175 To implement the SPP protocol I used a Bluetooth sniffing tool called [PacketLogger](http://www.tkjelectronics.com/uploads/PacketLogger.zip) developed by Apple.
    176 It enables me to see the Bluetooth communication between my Mac and any device.
    177 
    178 ### PS4 Library
    179 
    180 The PS4BT library is split up into the [PS4BT](PS4BT.h) and the [PS4USB](PS4USB.h) library. These allow you to use the Sony PS4 controller via Bluetooth and USB.
    181 
    182 The [PS4BT.ino](examples/Bluetooth/PS4BT/PS4BT.ino) and [PS4USB.ino](examples/PS4USB/PS4USB.ino) examples shows how to easily read the buttons, joysticks, touchpad and IMU on the controller via Bluetooth and USB respectively. It is also possible to control the rumble and light on the controller and get the battery level.
    183 
    184 Before you can use the PS4 controller via Bluetooth you will need to pair with it.
    185 
    186 Simply create the PS4BT instance like so: ```PS4BT PS4(&Btd, PAIR);``` and then hold down the Share button and then hold down the PS without releasing the Share button. The PS4 controller will then start to blink rapidly indicating that it is in pairing mode.
    187 
    188 It should then automatically pair the dongle with your controller. This only have to be done once.
    189 
    190 For information see the following blog post: <http://blog.tkjelectronics.dk/2014/01/ps4-controller-now-supported-by-the-usb-host-library/>.
    191 
    192 Also check out this excellent Wiki by Frank Zhao about the PS4 controller: <http://eleccelerator.com/wiki/index.php?title=DualShock_4> and this Linux driver: <https://github.com/chrippa/ds4drv>.
    193 
    194 Several guides on how to use the PS4 library has been written by Dr. James E. Barger and are available at the following link: <https://sites.google.com/view/vbatc-engineeringtechnology2/control-system-tutorials/ps4-tutorials>.
    195 
    196 ### PS3 Library
    197 
    198 These libraries consist of the [PS3BT](PS3BT.cpp) and [PS3USB](PS3USB.cpp). These libraries allows you to use a Dualshock 3, Navigation or a Motion controller with the USB Host Shield both via Bluetooth and USB.
    199 
    200 In order to use your Playstation controller via Bluetooth you have to set the Bluetooth address of the dongle internally to your PS3 Controller. This can be achieved by first plugging in the Bluetooth dongle and wait a few seconds. Now plug in the controller via USB and wait until the LEDs start to flash. The library has now written the Bluetooth address of the dongle to the PS3 controller.
    201 
    202 Finally simply plug in the Bluetooth dongle again and press PS on the PS3 controller. After a few seconds it should be connected to the dongle and ready to use.
    203 
    204 __Note:__ You will have to plug in the Bluetooth dongle before connecting the controller, as the library needs to read the address of the dongle. Alternatively you could set it in code like so: [PS3BT.ino#L20](examples/Bluetooth/PS3BT/PS3BT.ino#L20).
    205 
    206 For more information about the PS3 protocol see the official wiki: <https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information>.
    207 
    208 Also take a look at the blog posts:
    209 
    210 * <http://blog.tkjelectronics.dk/2012/01/ps3-controller-bt-library-for-arduino/>
    211 * <http://www.circuitsathome.com/mcu/sony-ps3-controller-support-added-to-usb-host-library>
    212 * <http://www.circuitsathome.com/mcu/arduino/interfacing-ps3-controllers-via-usb>
    213 
    214 A special thanks go to the following people:
    215 
    216 1. _Richard Ibbotson_ who made this excellent guide: <http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part>
    217 2. _Tomoyuki Tanaka_ for releasing his code for the Arduino USB Host shield connected to the wiimote: <http://www.circuitsathome.com/mcu/rc-car-controlled-by-wii-remote-on-arduino>
    218 
    219 Also a big thanks all the people behind these sites about the Motion controller:
    220 
    221 * <http://thp.io/2010/psmove/>
    222 * <http://www.copenhagengamecollective.org/unimove/>
    223 * <https://github.com/thp/psmoveapi>
    224 * <http://code.google.com/p/moveonpc/>
    225 
    226 ### Xbox Libraries
    227 
    228 The library supports both the original Xbox controller via USB and the Xbox 360 controller both via USB and wirelessly.
    229 
    230 #### Xbox library
    231 
    232 The [XBOXOLD](XBOXOLD.cpp) class implements support for the original Xbox controller via USB.
    233 
    234 All the information are from the following sites:
    235 
    236 * <https://github.com/torvalds/linux/blob/master/Documentation/input/xpad.txt>
    237 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
    238 * <http://euc.jp/periphs/xbox-controller.ja.html>
    239 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL#L15>
    240 
    241 #### Xbox 360 Library
    242 
    243 The library support one Xbox 360 via USB or up to four Xbox 360 controllers wirelessly by using a [Xbox 360 wireless receiver](http://blog.tkjelectronics.dk/wp-content/uploads/xbox360-wireless-receiver.jpg).
    244 
    245 To use it via USB use the [XBOXUSB](XBOXUSB.cpp) library or to use it wirelessly use the [XBOXRECV](XBOXRECV.cpp) library.
    246 
    247 __Note that a Wireless controller can NOT be used via USB!__
    248 
    249 Examples code can be found in the [examples directory](examples/Xbox).
    250 
    251 Also see the following blog posts:
    252 
    253 * <http://www.circuitsathome.com/mcu/xbox360-controller-support-added-to-usb-host-shield-2-0-library>
    254 * <http://blog.tkjelectronics.dk/2012/07/xbox-360-controller-support-added-to-the-usb-host-library/>
    255 * <http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/>
    256 
    257 All the information regarding the Xbox 360 controller protocol are form these sites:
    258 
    259 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/UsbInfo>
    260 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/WirelessUsbInfo>
    261 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL>
    262 
    263 #### Xbox ONE Library
    264 
    265 An Xbox ONE controller is supported via USB in the [XBOXONE](XBOXONE.cpp) class. It is heavily based on the 360 library above. In addition to cross referencing the above, information on the protocol was found at:
    266 
    267 * <https://github.com/quantus/xbox-one-controller-protocol>
    268 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
    269 * <https://github.com/kylelemons/xbox/blob/master/xbox.go>
    270 
    271 ### [Wii library](Wii.cpp)
    272 
    273 The [Wii](Wii.cpp) library support the Wiimote, but also the Nunchuch and Motion Plus extensions via Bluetooth. The Wii U Pro Controller and Wii Balance Board are also supported via Bluetooth.
    274 
    275 First you have to pair with the controller, this is done automatically by the library if you create the instance like so:
    276 
    277 ```C++
    278 WII Wii(&Btd, PAIR);
    279 ```
    280 
    281 And then press 1 & 2 at once on the Wiimote or the SYNC buttons if you are using a Wii U Pro Controller or a Wii Balance Board.
    282 
    283 After that you can simply create the instance like so:
    284 
    285 ```C++
    286 WII Wii(&Btd);
    287 ```
    288 
    289 Then just press any button on the Wiimote and it will then connect to the dongle.
    290 
    291 Take a look at the example for more information: [Wii.ino](examples/Bluetooth/Wii/Wii.ino).
    292 
    293 Also take a look at the blog post:
    294 
    295 * <http://blog.tkjelectronics.dk/2012/08/wiimote-added-to-usb-host-library/>
    296 
    297 The Wii IR camera can also be used, but you will have to activate the code for it manually as it is quite large. Simply set ```ENABLE_WII_IR_CAMERA``` to 1 in [settings.h](settings.h).
    298 
    299 The [WiiIRCamera.ino](examples/Bluetooth/WiiIRCamera/WiiIRCamera.ino) example shows how it can be used.
    300 
    301 All the information about the Wii controllers are from these sites:
    302 
    303 * <http://wiibrew.org/wiki/Wiimote>
    304 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers>
    305 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Nunchuck>
    306 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus>
    307 * <http://wiibrew.org/wiki/Wii_Balance_Board>
    308 * The old library created by _Tomoyuki Tanaka_: <https://github.com/moyuchin/WiiRemote_on_Arduino> also helped a lot.
    309 
    310 ### [PS Buzz Library](PSBuzz.cpp)
    311 
    312 This library implements support for the Playstation Buzz controllers via USB.
    313 
    314 It is essentially just a wrapper around the [HIDUniversal](hiduniversal.cpp) which takes care of the initializing and reading of the controllers. The [PSBuzz](PSBuzz.cpp) class simply inherits this and parses the data, so it is easy for users to read the buttons and turn the big red button on the controllers on and off.
    315 
    316 The example [PSBuzz.ino](examples/PSBuzz/PSBuzz.ino) shows how one can do this with just a few lines of code.
    317 
    318 More information about the controller can be found at the following sites:
    319 
    320 * http://www.developerfusion.com/article/84338/making-usb-c-friendly/
    321 * https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
    322 
    323 ### HID Libraries
    324 
    325 HID devices are also supported by the library. However these require you to write your own driver. A few example are provided in the [examples/HID](examples/HID) directory. Including an example for the [SteelSeries SRW-S1 Steering Wheel](examples/HID/SRWS1/SRWS1.ino).
    326 
    327 ### [MIDI Library](usbh_midi.cpp)
    328 
    329 The library support MIDI devices.
    330 You can convert USB MIDI keyboard to legacy serial MIDI.
    331 
    332 * [USB_MIDI_converter.ino](examples/USBH_MIDI/USB_MIDI_converter/USB_MIDI_converter.ino)
    333 * [USB_MIDI_converter_multi.ino](examples/USBH_MIDI/USB_MIDI_converter_multi/USB_MIDI_converter_multi.ino)
    334 
    335 For information see the following page: <http://yuuichiakagawa.github.io/USBH_MIDI/>.
    336 
    337 # Interface modifications
    338 
    339 The shield is using SPI for communicating with the MAX3421E USB host controller. It uses the SCK, MISO and MOSI pins via the ICSP on your board.
    340 
    341 Note this means that it uses pin 13, 12, 11 on an Arduino Uno, so these pins can not be used for anything else than SPI communication!
    342 
    343 Furthermore it uses one pin as SS and one INT pin. These are by default located on pin 10 and 9 respectively. They can easily be reconfigured in case you need to use them for something else by cutting the jumper on the shield and then solder a wire from the pad to the new pin.
    344 
    345 After that you need modify the following entry in [UsbCore.h](UsbCore.h):
    346 
    347 ```C++
    348 typedef MAX3421e<P10, P9> MAX3421E;
    349 ```
    350 
    351 For instance if you have rerouted SS to pin 7 it should read:
    352 
    353 ```C++
    354 typedef MAX3421e<P7, P9> MAX3421E;
    355 ```
    356 
    357 See the "Interface modifications" section in the [hardware manual](https://www.circuitsathome.com/usb-host-shield-hardware-manual) for more information.
    358 
    359 # FAQ
    360 
    361 > When I plug my device into the USB connector nothing happens?
    362 
    363 * Try to connect a external power supply to the Arduino - this solves the problem in most cases.
    364 * You can also use a powered hub between the device and the USB Host Shield. You should then include the USB hub library: ```#include <usbhub.h>``` and create the instance like so: ```USBHub Hub1(&Usb);```.
    365 
    366 > When I connecting my PS3 controller I get a output like this:
    367 
    368 ```
    369 Dualshock 3 Controller Enabled
    370 
    371 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    372 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    373 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    374 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    375 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
    376 ```
    377 
    378 * This means that your dongle does not support 2.0+EDR, so you will need another dongle. Please see the following [list](https://github.com/felis/USB_Host_Shield_2.0/wiki/Bluetooth-dongles) for tested working dongles.
    379 
    380 > When compiling I am getting the following error: "fatal error: SPI.h: No such file or directory".
    381 
    382 * Please make sure to include the SPI library like so: ```#include <SPI.h>``` in your .ino file.
    diff --git a/_s_p_p_8cpp.html b/_s_p_p_8cpp.html index 5f65f2b1..0fe47026 100644 --- a/_s_p_p_8cpp.html +++ b/_s_p_p_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPP.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -87,13 +88,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    SPP.cpp File Reference
    -
    #include "SPP.h"
    +
    #include "SPP.h"
    Include dependency graph for SPP.cpp:
    - + + + + + +

    Go to the source code of this file.

    @@ -113,25 +119,7 @@ Variables
    -Initial value:
    = {
    -
    0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
    -
    0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
    -
    0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
    -
    0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51, 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
    -
    0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
    -
    0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
    -
    0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
    -
    0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
    -
    0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95, 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
    -
    0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
    -
    0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD, 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
    -
    0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
    -
    0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5, 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
    -
    0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
    -
    0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD, 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
    -
    0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
    -
    }
    -
    +Initial value:
    = {
    0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
    0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
    0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
    0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51, 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
    0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
    0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
    0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
    0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
    0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95, 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
    0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
    0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD, 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
    0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
    0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5, 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
    0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
    0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD, 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
    0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
    }

    Definition at line 26 of file SPP.cpp.

    @@ -141,7 +129,7 @@ Variables diff --git a/_s_p_p_8cpp__incl.map b/_s_p_p_8cpp__incl.map index 809eca67..1406ed7c 100644 --- a/_s_p_p_8cpp__incl.map +++ b/_s_p_p_8cpp__incl.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/_s_p_p_8cpp__incl.md5 b/_s_p_p_8cpp__incl.md5 index ee84cbbd..2e490ec2 100644 --- a/_s_p_p_8cpp__incl.md5 +++ b/_s_p_p_8cpp__incl.md5 @@ -1 +1 @@ -92b48e8c203cabe9cbc2a2cb2aaccf77 \ No newline at end of file +13ec96c550e18a5b87013a932cc6a9c2 \ No newline at end of file diff --git a/_s_p_p_8cpp__incl.png b/_s_p_p_8cpp__incl.png index 791216adf30828083309cf23d698223de5662ba4..1ec1f2318fc4cc52efeb644555630a4c0551e5ca 100644 GIT binary patch literal 12773 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 F{|~Z)SjYeX literal 13559 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 diff --git a/_s_p_p_8cpp_source.html b/_s_p_p_8cpp_source.html index e6b994c7..fc9e7d86 100644 --- a/_s_p_p_8cpp_source.html +++ b/_s_p_p_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPP.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,837 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    SPP.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #include "SPP.h"
    -
    19 // To enable serial debugging see "settings.h"
    -
    20 //#define EXTRADEBUG // Uncomment to get even more debugging data
    -
    21 //#define PRINTREPORT // Uncomment to print the report sent to the Arduino
    -
    22 
    -
    23 /*
    -
    24  * CRC (reversed crc) lookup table as calculated by the table generator in ETSI TS 101 369 V6.3.0.
    -
    25  */
    -
    26 const uint8_t rfcomm_crc_table[256] PROGMEM = {/* reversed, 8-bit, poly=0x07 */
    -
    27  0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
    -
    28  0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
    -
    29  0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
    -
    30  0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51, 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
    -
    31  0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
    -
    32  0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
    -
    33  0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
    -
    34  0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
    -
    35  0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95, 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
    -
    36  0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
    -
    37  0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD, 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
    -
    38  0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
    -
    39  0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5, 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
    -
    40  0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
    -
    41  0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD, 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
    -
    42  0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
    -
    43 };
    -
    44 
    -
    45 SPP::SPP(BTD *p, const char* name, const char* pin) :
    -
    46 BluetoothService(p) // Pointer to BTD class instance - mandatory
    -
    47 {
    -
    48  pBtd->btdName = name;
    -
    49  pBtd->btdPin = pin;
    -
    50 
    -
    51  /* Set device cid for the SDP and RFCOMM channelse */
    -
    52  sdp_dcid[0] = 0x50; // 0x0050
    -
    53  sdp_dcid[1] = 0x00;
    -
    54  rfcomm_dcid[0] = 0x51; // 0x0051
    -
    55  rfcomm_dcid[1] = 0x00;
    -
    56 
    -
    57  Reset();
    -
    58 }
    -
    59 
    -
    60 void SPP::Reset() {
    -
    61  connected = false;
    -
    62  RFCOMMConnected = false;
    -
    63  SDPConnected = false;
    -
    64  waitForLastCommand = false;
    -
    65  l2cap_sdp_state = L2CAP_SDP_WAIT;
    -
    66  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT;
    -
    67  l2cap_event_flag = 0;
    -
    68  sppIndex = 0;
    -
    69  creditSent = false;
    -
    70 }
    -
    71 
    - -
    73  connected = false;
    -
    74  // First the two L2CAP channels has to be disconnected and then the HCI connection
    -
    75  if(RFCOMMConnected)
    -
    76  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, rfcomm_scid, rfcomm_dcid);
    -
    77  if(RFCOMMConnected && SDPConnected)
    -
    78  delay(1); // Add delay between commands
    -
    79  if(SDPConnected)
    -
    80  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, sdp_scid, sdp_dcid);
    -
    81  l2cap_sdp_state = L2CAP_DISCONNECT_RESPONSE;
    -
    82 }
    -
    83 
    -
    84 void SPP::ACLData(uint8_t* l2capinbuf) {
    -
    85  if(!connected) {
    -
    86  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    -
    87  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == SDP_PSM && !pBtd->sdpConnectionClaimed) {
    -
    88  pBtd->sdpConnectionClaimed = true;
    -
    89  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    -
    90  l2cap_sdp_state = L2CAP_SDP_WAIT; // Reset state
    -
    91  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == RFCOMM_PSM && !pBtd->rfcommConnectionClaimed) {
    - -
    93  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    -
    94  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT; // Reset state
    -
    95  }
    -
    96  }
    -
    97  }
    -
    98 
    -
    99  if(checkHciHandle(l2capinbuf, hci_handle)) { // acl_handle_ok
    -
    100  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
    -
    101  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
    -
    102 #ifdef DEBUG_USB_HOST
    -
    103  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
    -
    104  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    105  Notify(PSTR(" "), 0x80);
    -
    106  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    -
    107  Notify(PSTR(" Data: "), 0x80);
    -
    108  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
    -
    109  Notify(PSTR(" "), 0x80);
    -
    110  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
    -
    111  Notify(PSTR(" "), 0x80);
    -
    112  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    -
    113  Notify(PSTR(" "), 0x80);
    -
    114  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    115 #endif
    -
    116  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    -
    117 #ifdef EXTRADEBUG
    -
    118  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
    -
    119  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    120  Notify(PSTR(" "), 0x80);
    -
    121  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    -
    122  Notify(PSTR(" SCID: "), 0x80);
    -
    123  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    -
    124  Notify(PSTR(" "), 0x80);
    -
    125  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    126  Notify(PSTR(" Identifier: "), 0x80);
    -
    127  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    -
    128 #endif
    -
    129  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == SDP_PSM) { // It doesn't matter if it receives another reqeust, since it waits for the channel to disconnect in the L2CAP_SDP_DONE state, and the l2cap_event_flag will be cleared if so
    -
    130  identifier = l2capinbuf[9];
    -
    131  sdp_scid[0] = l2capinbuf[14];
    -
    132  sdp_scid[1] = l2capinbuf[15];
    - -
    134  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == RFCOMM_PSM) { // ----- || -----
    -
    135  identifier = l2capinbuf[9];
    -
    136  rfcomm_scid[0] = l2capinbuf[14];
    -
    137  rfcomm_scid[1] = l2capinbuf[15];
    - -
    139  }
    -
    140  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
    -
    141  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
    -
    142  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
    -
    143  //Notify(PSTR("\r\nSDP Configuration Complete"), 0x80);
    - -
    145  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
    -
    146  //Notify(PSTR("\r\nRFCOMM Configuration Complete"), 0x80);
    - -
    148  }
    -
    149  }
    -
    150  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
    -
    151  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
    -
    152  //Notify(PSTR("\r\nSDP Configuration Request"), 0x80);
    -
    153  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], sdp_scid);
    -
    154  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
    -
    155  //Notify(PSTR("\r\nRFCOMM Configuration Request"), 0x80);
    -
    156  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], rfcomm_scid);
    -
    157  }
    -
    158  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
    -
    159  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
    -
    160  //Notify(PSTR("\r\nDisconnect Request: SDP Channel"), 0x80);
    -
    161  identifier = l2capinbuf[9];
    - -
    163  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
    -
    164  //Notify(PSTR("\r\nDisconnect Request: RFCOMM Channel"), 0x80);
    -
    165  identifier = l2capinbuf[9];
    - -
    167  }
    -
    168  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
    -
    169  if(l2capinbuf[12] == sdp_scid[0] && l2capinbuf[13] == sdp_scid[1]) {
    -
    170  //Notify(PSTR("\r\nDisconnect Response: SDP Channel"), 0x80);
    -
    171  identifier = l2capinbuf[9];
    - -
    173  } else if(l2capinbuf[12] == rfcomm_scid[0] && l2capinbuf[13] == rfcomm_scid[1]) {
    -
    174  //Notify(PSTR("\r\nDisconnect Response: RFCOMM Channel"), 0x80);
    -
    175  identifier = l2capinbuf[9];
    - -
    177  }
    -
    178  } else if(l2capinbuf[8] == L2CAP_CMD_INFORMATION_REQUEST) {
    -
    179 #ifdef DEBUG_USB_HOST
    -
    180  Notify(PSTR("\r\nInformation request"), 0x80);
    -
    181 #endif
    -
    182  identifier = l2capinbuf[9];
    -
    183  pBtd->l2cap_information_response(hci_handle, identifier, l2capinbuf[12], l2capinbuf[13]);
    -
    184  }
    -
    185 #ifdef EXTRADEBUG
    -
    186  else {
    -
    187  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
    -
    188  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
    -
    189  }
    -
    190 #endif
    -
    191  } else if(l2capinbuf[6] == sdp_dcid[0] && l2capinbuf[7] == sdp_dcid[1]) { // SDP
    -
    192  if(l2capinbuf[8] == SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU) {
    -
    193  if(((l2capinbuf[16] << 8 | l2capinbuf[17]) == SERIALPORT_UUID) || ((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000 && (l2capinbuf[18] << 8 | l2capinbuf[19]) == SERIALPORT_UUID)) { // Check if it's sending the full UUID, see: https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm, we will just check the first four bytes
    -
    194  if(firstMessage) {
    -
    195  serialPortResponse1(l2capinbuf[9], l2capinbuf[10]);
    -
    196  firstMessage = false;
    -
    197  } else {
    -
    198  serialPortResponse2(l2capinbuf[9], l2capinbuf[10]); // Serialport continuation state
    -
    199  firstMessage = true;
    -
    200  }
    -
    201  } else if(((l2capinbuf[16] << 8 | l2capinbuf[17]) == L2CAP_UUID) || ((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000 && (l2capinbuf[18] << 8 | l2capinbuf[19]) == L2CAP_UUID)) {
    -
    202  if(firstMessage) {
    -
    203  l2capResponse1(l2capinbuf[9], l2capinbuf[10]);
    -
    204  firstMessage = false;
    -
    205  } else {
    -
    206  l2capResponse2(l2capinbuf[9], l2capinbuf[10]); // L2CAP continuation state
    -
    207  firstMessage = true;
    -
    208  }
    -
    209  } else
    -
    210  serviceNotSupported(l2capinbuf[9], l2capinbuf[10]); // The service is not supported
    -
    211 #ifdef EXTRADEBUG
    -
    212  Notify(PSTR("\r\nUUID: "), 0x80);
    -
    213  uint16_t uuid;
    -
    214  if((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000) // Check if it's sending the UUID as a 128-bit UUID
    -
    215  uuid = (l2capinbuf[18] << 8 | l2capinbuf[19]);
    -
    216  else // Short UUID
    -
    217  uuid = (l2capinbuf[16] << 8 | l2capinbuf[17]);
    -
    218  D_PrintHex<uint16_t > (uuid, 0x80);
    -
    219 
    -
    220  Notify(PSTR("\r\nLength: "), 0x80);
    -
    221  uint16_t length = l2capinbuf[11] << 8 | l2capinbuf[12];
    -
    222  D_PrintHex<uint16_t > (length, 0x80);
    -
    223  Notify(PSTR("\r\nData: "), 0x80);
    -
    224  for(uint8_t i = 0; i < length; i++) {
    -
    225  D_PrintHex<uint8_t > (l2capinbuf[13 + i], 0x80);
    -
    226  Notify(PSTR(" "), 0x80);
    -
    227  }
    -
    228 #endif
    -
    229  }
    -
    230 #ifdef EXTRADEBUG
    -
    231  else {
    -
    232  Notify(PSTR("\r\nUnknown PDU: "), 0x80);
    -
    233  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
    -
    234  }
    -
    235 #endif
    -
    236  } else if(l2capinbuf[6] == rfcomm_dcid[0] && l2capinbuf[7] == rfcomm_dcid[1]) { // RFCOMM
    -
    237  rfcommChannel = l2capinbuf[8] & 0xF8;
    -
    238  rfcommDirection = l2capinbuf[8] & 0x04;
    -
    239  rfcommCommandResponse = l2capinbuf[8] & 0x02;
    -
    240  rfcommChannelType = l2capinbuf[9] & 0xEF;
    -
    241  rfcommPfBit = l2capinbuf[9] & 0x10;
    -
    242 
    -
    243  if(rfcommChannel >> 3 != 0x00)
    -
    244  rfcommChannelConnection = rfcommChannel;
    -
    245 
    -
    246 #ifdef EXTRADEBUG
    -
    247  Notify(PSTR("\r\nRFCOMM Channel: "), 0x80);
    -
    248  D_PrintHex<uint8_t > (rfcommChannel >> 3, 0x80);
    -
    249  Notify(PSTR(" Direction: "), 0x80);
    -
    250  D_PrintHex<uint8_t > (rfcommDirection >> 2, 0x80);
    -
    251  Notify(PSTR(" CommandResponse: "), 0x80);
    -
    252  D_PrintHex<uint8_t > (rfcommCommandResponse >> 1, 0x80);
    -
    253  Notify(PSTR(" ChannelType: "), 0x80);
    -
    254  D_PrintHex<uint8_t > (rfcommChannelType, 0x80);
    -
    255  Notify(PSTR(" PF_BIT: "), 0x80);
    -
    256  D_PrintHex<uint8_t > (rfcommPfBit, 0x80);
    -
    257 #endif
    -
    258  if(rfcommChannelType == RFCOMM_DISC) {
    -
    259 #ifdef DEBUG_USB_HOST
    -
    260  Notify(PSTR("\r\nReceived Disconnect RFCOMM Command on channel: "), 0x80);
    -
    261  D_PrintHex<uint8_t > (rfcommChannel >> 3, 0x80);
    -
    262 #endif
    -
    263  connected = false;
    -
    264  sendRfcomm(rfcommChannel, rfcommDirection, rfcommCommandResponse, RFCOMM_UA, rfcommPfBit, rfcommbuf, 0x00); // UA Command
    -
    265  }
    -
    266  if(connected) {
    -
    267  /* Read the incoming message */
    -
    268  if(rfcommChannelType == RFCOMM_UIH && rfcommChannel == rfcommChannelConnection) {
    -
    269  uint8_t length = l2capinbuf[10] >> 1; // Get length
    -
    270  uint8_t offset = l2capinbuf[4] - length - 4; // Check if there is credit
    -
    271  if(checkFcs(&l2capinbuf[8], l2capinbuf[11 + length + offset])) {
    -
    272  uint8_t i = 0;
    -
    273  for(; i < length; i++) {
    -
    274  if(rfcommAvailable + i >= sizeof (rfcommDataBuffer)) {
    -
    275 #ifdef DEBUG_USB_HOST
    -
    276  Notify(PSTR("\r\nWarning: Buffer is full!"), 0x80);
    -
    277 #endif
    -
    278  break;
    -
    279  }
    -
    280  rfcommDataBuffer[rfcommAvailable + i] = l2capinbuf[11 + i + offset];
    -
    281  }
    -
    282  rfcommAvailable += i;
    -
    283 #ifdef EXTRADEBUG
    -
    284  Notify(PSTR("\r\nRFCOMM Data Available: "), 0x80);
    -
    285  Notify(rfcommAvailable, 0x80);
    -
    286  if(offset) {
    -
    287  Notify(PSTR(" - Credit: 0x"), 0x80);
    -
    288  D_PrintHex<uint8_t > (l2capinbuf[11], 0x80);
    -
    289  }
    -
    290 #endif
    -
    291  }
    -
    292 #ifdef DEBUG_USB_HOST
    -
    293  else
    -
    294  Notify(PSTR("\r\nError in FCS checksum!"), 0x80);
    -
    295 #endif
    -
    296 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send to the Arduino via Bluetooth
    -
    297  for(uint8_t i = 0; i < length; i++)
    -
    298  Notifyc(l2capinbuf[i + 11 + offset], 0x80);
    -
    299 #endif
    -
    300  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_RPN_CMD) { // UIH Remote Port Negotiation Command
    -
    301 #ifdef DEBUG_USB_HOST
    -
    302  Notify(PSTR("\r\nReceived UIH Remote Port Negotiation Command"), 0x80);
    -
    303 #endif
    -
    304  rfcommbuf[0] = BT_RFCOMM_RPN_RSP; // Command
    -
    305  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
    -
    306  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
    -
    307  rfcommbuf[3] = l2capinbuf[14]; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
    -
    308  rfcommbuf[4] = l2capinbuf[15]; // Priority
    -
    309  rfcommbuf[5] = l2capinbuf[16]; // Timer
    -
    310  rfcommbuf[6] = l2capinbuf[17]; // Max Fram Size LSB
    -
    311  rfcommbuf[7] = l2capinbuf[18]; // Max Fram Size MSB
    -
    312  rfcommbuf[8] = l2capinbuf[19]; // MaxRatransm.
    -
    313  rfcommbuf[9] = l2capinbuf[20]; // Number of Frames
    -
    314  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A); // UIH Remote Port Negotiation Response
    -
    315  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_CMD) { // UIH Modem Status Command
    -
    316 #ifdef DEBUG_USB_HOST
    -
    317  Notify(PSTR("\r\nSend UIH Modem Status Response"), 0x80);
    -
    318 #endif
    -
    319  rfcommbuf[0] = BT_RFCOMM_MSC_RSP; // UIH Modem Status Response
    -
    320  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
    -
    321  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
    -
    322  rfcommbuf[3] = l2capinbuf[14];
    -
    323  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
    -
    324  }
    -
    325  } else {
    -
    326  if(rfcommChannelType == RFCOMM_SABM) { // SABM Command - this is sent twice: once for channel 0 and then for the channel to establish
    -
    327 #ifdef DEBUG_USB_HOST
    -
    328  Notify(PSTR("\r\nReceived SABM Command"), 0x80);
    -
    329 #endif
    -
    330  sendRfcomm(rfcommChannel, rfcommDirection, rfcommCommandResponse, RFCOMM_UA, rfcommPfBit, rfcommbuf, 0x00); // UA Command
    -
    331  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_PN_CMD) { // UIH Parameter Negotiation Command
    -
    332 #ifdef DEBUG_USB_HOST
    -
    333  Notify(PSTR("\r\nReceived UIH Parameter Negotiation Command"), 0x80);
    -
    334 #endif
    -
    335  rfcommbuf[0] = BT_RFCOMM_PN_RSP; // UIH Parameter Negotiation Response
    -
    336  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
    -
    337  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
    -
    338  rfcommbuf[3] = 0xE0; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
    -
    339  rfcommbuf[4] = 0x00; // Priority
    -
    340  rfcommbuf[5] = 0x00; // Timer
    -
    341  rfcommbuf[6] = BULK_MAXPKTSIZE - 14; // Max Fram Size LSB - set to the size of received data (50)
    -
    342  rfcommbuf[7] = 0x00; // Max Fram Size MSB
    -
    343  rfcommbuf[8] = 0x00; // MaxRatransm.
    -
    344  rfcommbuf[9] = 0x00; // Number of Frames
    -
    345  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A);
    -
    346  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_CMD) { // UIH Modem Status Command
    -
    347 #ifdef DEBUG_USB_HOST
    -
    348  Notify(PSTR("\r\nSend UIH Modem Status Response"), 0x80);
    -
    349 #endif
    -
    350  rfcommbuf[0] = BT_RFCOMM_MSC_RSP; // UIH Modem Status Response
    -
    351  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
    -
    352  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
    -
    353  rfcommbuf[3] = l2capinbuf[14];
    -
    354  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
    -
    355 
    -
    356  delay(1);
    -
    357 #ifdef DEBUG_USB_HOST
    -
    358  Notify(PSTR("\r\nSend UIH Modem Status Command"), 0x80);
    -
    359 #endif
    -
    360  rfcommbuf[0] = BT_RFCOMM_MSC_CMD; // UIH Modem Status Command
    -
    361  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
    -
    362  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
    -
    363  rfcommbuf[3] = 0x8D; // Can receive frames (YES), Ready to Communicate (YES), Ready to Receive (YES), Incomig Call (NO), Data is Value (YES)
    -
    364 
    -
    365  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
    -
    366  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_RSP) { // UIH Modem Status Response
    -
    367  if(!creditSent) {
    -
    368 #ifdef DEBUG_USB_HOST
    -
    369  Notify(PSTR("\r\nSend UIH Command with credit"), 0x80);
    -
    370 #endif
    -
    371  sendRfcommCredit(rfcommChannelConnection, rfcommDirection, 0, RFCOMM_UIH, 0x10, sizeof (rfcommDataBuffer)); // Send credit
    -
    372  creditSent = true;
    -
    373  timer = (uint32_t)millis();
    -
    374  waitForLastCommand = true;
    -
    375  }
    -
    376  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[10] == 0x01) { // UIH Command with credit
    -
    377 #ifdef DEBUG_USB_HOST
    -
    378  Notify(PSTR("\r\nReceived UIH Command with credit"), 0x80);
    -
    379 #endif
    -
    380  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_RPN_CMD) { // UIH Remote Port Negotiation Command
    -
    381 #ifdef DEBUG_USB_HOST
    -
    382  Notify(PSTR("\r\nReceived UIH Remote Port Negotiation Command"), 0x80);
    -
    383 #endif
    -
    384  rfcommbuf[0] = BT_RFCOMM_RPN_RSP; // Command
    -
    385  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
    -
    386  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
    -
    387  rfcommbuf[3] = l2capinbuf[14]; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
    -
    388  rfcommbuf[4] = l2capinbuf[15]; // Priority
    -
    389  rfcommbuf[5] = l2capinbuf[16]; // Timer
    -
    390  rfcommbuf[6] = l2capinbuf[17]; // Max Fram Size LSB
    -
    391  rfcommbuf[7] = l2capinbuf[18]; // Max Fram Size MSB
    -
    392  rfcommbuf[8] = l2capinbuf[19]; // MaxRatransm.
    -
    393  rfcommbuf[9] = l2capinbuf[20]; // Number of Frames
    -
    394  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A); // UIH Remote Port Negotiation Response
    -
    395 #ifdef DEBUG_USB_HOST
    -
    396  Notify(PSTR("\r\nRFCOMM Connection is now established\r\n"), 0x80);
    -
    397 #endif
    -
    398  onInit();
    -
    399  }
    -
    400 #ifdef EXTRADEBUG
    -
    401  else if(rfcommChannelType != RFCOMM_DISC) {
    -
    402  Notify(PSTR("\r\nUnsupported RFCOMM Data - ChannelType: "), 0x80);
    -
    403  D_PrintHex<uint8_t > (rfcommChannelType, 0x80);
    -
    404  Notify(PSTR(" Command: "), 0x80);
    -
    405  D_PrintHex<uint8_t > (l2capinbuf[11], 0x80);
    -
    406  }
    -
    407 #endif
    -
    408  }
    -
    409  }
    -
    410 #ifdef EXTRADEBUG
    -
    411  else {
    -
    412  Notify(PSTR("\r\nUnsupported L2CAP Data - Channel ID: "), 0x80);
    -
    413  D_PrintHex<uint8_t > (l2capinbuf[7], 0x80);
    -
    414  Notify(PSTR(" "), 0x80);
    -
    415  D_PrintHex<uint8_t > (l2capinbuf[6], 0x80);
    -
    416  }
    -
    417 #endif
    -
    418  SDP_task();
    -
    419  RFCOMM_task();
    -
    420  }
    -
    421 }
    -
    422 
    -
    423 void SPP::Run() {
    -
    424  if(waitForLastCommand && (int32_t)((uint32_t)millis() - timer) > 100) { // We will only wait 100ms and see if the UIH Remote Port Negotiation Command is send, as some deviced don't send it
    -
    425 #ifdef DEBUG_USB_HOST
    -
    426  Notify(PSTR("\r\nRFCOMM Connection is now established - Automatic\r\n"), 0x80);
    -
    427 #endif
    -
    428  onInit();
    -
    429  }
    -
    430  send(); // Send all bytes currently in the buffer
    -
    431 }
    -
    432 
    -
    433 void SPP::onInit() {
    -
    434  creditSent = false;
    -
    435  waitForLastCommand = false;
    -
    436  connected = true; // The RFCOMM channel is now established
    -
    437  sppIndex = 0;
    -
    438  if(pFuncOnInit)
    -
    439  pFuncOnInit(); // Call the user function
    -
    440 };
    -
    441 
    -
    442 void SPP::SDP_task() {
    -
    443  switch(l2cap_sdp_state) {
    -
    444  case L2CAP_SDP_WAIT:
    - - -
    447 #ifdef DEBUG_USB_HOST
    -
    448  Notify(PSTR("\r\nSDP Incoming Connection Request"), 0x80);
    -
    449 #endif
    - -
    451  delay(1);
    - -
    453  identifier++;
    -
    454  delay(1);
    - -
    456  l2cap_sdp_state = L2CAP_SDP_SUCCESS;
    - - -
    459  SDPConnected = false;
    -
    460 #ifdef DEBUG_USB_HOST
    -
    461  Notify(PSTR("\r\nDisconnected SDP Channel"), 0x80);
    -
    462 #endif
    - -
    464  }
    -
    465  break;
    -
    466  case L2CAP_SDP_SUCCESS:
    - - -
    469 #ifdef DEBUG_USB_HOST
    -
    470  Notify(PSTR("\r\nSDP Successfully Configured"), 0x80);
    -
    471 #endif
    -
    472  firstMessage = true; // Reset bool
    -
    473  SDPConnected = true;
    -
    474  l2cap_sdp_state = L2CAP_SDP_WAIT;
    -
    475  }
    -
    476  break;
    -
    477 
    -
    478  case L2CAP_DISCONNECT_RESPONSE: // This is for both disconnection response from the RFCOMM and SDP channel if they were connected
    - -
    480 #ifdef DEBUG_USB_HOST
    -
    481  Notify(PSTR("\r\nDisconnected L2CAP Connection"), 0x80);
    -
    482 #endif
    - -
    484  hci_handle = -1; // Reset handle
    -
    485  Reset();
    -
    486  }
    -
    487  break;
    -
    488  }
    -
    489 }
    -
    490 
    -
    491 void SPP::RFCOMM_task() {
    -
    492  switch(l2cap_rfcomm_state) {
    -
    493  case L2CAP_RFCOMM_WAIT:
    - - -
    496 #ifdef DEBUG_USB_HOST
    -
    497  Notify(PSTR("\r\nRFCOMM Incoming Connection Request"), 0x80);
    -
    498 #endif
    -
    499  pBtd->l2cap_connection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid, PENDING);
    -
    500  delay(1);
    -
    501  pBtd->l2cap_connection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid, SUCCESSFUL);
    -
    502  identifier++;
    -
    503  delay(1);
    - -
    505  l2cap_rfcomm_state = L2CAP_RFCOMM_SUCCESS;
    - - -
    508  RFCOMMConnected = false;
    -
    509  connected = false;
    -
    510 #ifdef DEBUG_USB_HOST
    -
    511  Notify(PSTR("\r\nDisconnected RFCOMM Channel"), 0x80);
    -
    512 #endif
    -
    513  pBtd->l2cap_disconnection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid);
    -
    514  }
    -
    515  break;
    - - - -
    519 #ifdef DEBUG_USB_HOST
    -
    520  Notify(PSTR("\r\nRFCOMM Successfully Configured"), 0x80);
    -
    521 #endif
    -
    522  rfcommAvailable = 0; // Reset number of bytes available
    -
    523  bytesRead = 0; // Reset number of bytes received
    -
    524  RFCOMMConnected = true;
    -
    525  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT;
    -
    526  }
    -
    527  break;
    -
    528  }
    -
    529 }
    -
    530 /************************************************************/
    -
    531 /* SDP Commands */
    -
    532 
    -
    533 /************************************************************/
    -
    534 void SPP::SDP_Command(uint8_t* data, uint8_t nbytes) { // See page 223 in the Bluetooth specs
    -
    535  pBtd->L2CAP_Command(hci_handle, data, nbytes, sdp_scid[0], sdp_scid[1]);
    -
    536 }
    -
    537 
    -
    538 void SPP::serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow) { // See page 235 in the Bluetooth specs
    - -
    540  l2capoutbuf[1] = transactionIDHigh;
    -
    541  l2capoutbuf[2] = transactionIDLow;
    -
    542  l2capoutbuf[3] = 0x00; // MSB Parameter Length
    -
    543  l2capoutbuf[4] = 0x05; // LSB Parameter Length = 5
    -
    544  l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
    -
    545  l2capoutbuf[6] = 0x02; // LSB AttributeListsByteCount = 2
    -
    546 
    -
    547  /* Attribute ID/Value Sequence: */
    -
    548  l2capoutbuf[7] = 0x35; // Data element sequence - length in next byte
    -
    549  l2capoutbuf[8] = 0x00; // Length = 0
    -
    550  l2capoutbuf[9] = 0x00; // No continuation state
    -
    551 
    -
    552  SDP_Command(l2capoutbuf, 10);
    -
    553 }
    -
    554 
    -
    555 void SPP::serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
    - -
    557  l2capoutbuf[1] = transactionIDHigh;
    -
    558  l2capoutbuf[2] = transactionIDLow;
    -
    559  l2capoutbuf[3] = 0x00; // MSB Parameter Length
    -
    560  l2capoutbuf[4] = 0x2B; // LSB Parameter Length = 43
    -
    561  l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
    -
    562  l2capoutbuf[6] = 0x26; // LSB AttributeListsByteCount = 38
    -
    563 
    -
    564  /* Attribute ID/Value Sequence: */
    -
    565  l2capoutbuf[7] = 0x36; // Data element sequence - length in next two bytes
    -
    566  l2capoutbuf[8] = 0x00; // MSB Length
    -
    567  l2capoutbuf[9] = 0x3C; // LSB Length = 60
    -
    568 
    -
    569  l2capoutbuf[10] = 0x36; // Data element sequence - length in next two bytes
    -
    570  l2capoutbuf[11] = 0x00; // MSB Length
    -
    571  l2capoutbuf[12] = 0x39; // LSB Length = 57
    -
    572 
    -
    573  l2capoutbuf[13] = 0x09; // Unsigned Integer - length 2 bytes
    -
    574  l2capoutbuf[14] = 0x00; // MSB ServiceRecordHandle
    -
    575  l2capoutbuf[15] = 0x00; // LSB ServiceRecordHandle
    -
    576  l2capoutbuf[16] = 0x0A; // Unsigned int - length 4 bytes
    -
    577  l2capoutbuf[17] = 0x00; // ServiceRecordHandle value - TODO: Is this related to HCI_Handle?
    -
    578  l2capoutbuf[18] = 0x01;
    -
    579  l2capoutbuf[19] = 0x00;
    -
    580  l2capoutbuf[20] = 0x06;
    -
    581 
    -
    582  l2capoutbuf[21] = 0x09; // Unsigned Integer - length 2 bytes
    -
    583  l2capoutbuf[22] = 0x00; // MSB ServiceClassIDList
    -
    584  l2capoutbuf[23] = 0x01; // LSB ServiceClassIDList
    -
    585  l2capoutbuf[24] = 0x35; // Data element sequence - length in next byte
    -
    586  l2capoutbuf[25] = 0x03; // Length = 3
    -
    587  l2capoutbuf[26] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
    -
    588  l2capoutbuf[27] = 0x11; // MSB SerialPort
    -
    589  l2capoutbuf[28] = 0x01; // LSB SerialPort
    -
    590 
    -
    591  l2capoutbuf[29] = 0x09; // Unsigned Integer - length 2 bytes
    -
    592  l2capoutbuf[30] = 0x00; // MSB ProtocolDescriptorList
    -
    593  l2capoutbuf[31] = 0x04; // LSB ProtocolDescriptorList
    -
    594  l2capoutbuf[32] = 0x35; // Data element sequence - length in next byte
    -
    595  l2capoutbuf[33] = 0x0C; // Length = 12
    -
    596 
    -
    597  l2capoutbuf[34] = 0x35; // Data element sequence - length in next byte
    -
    598  l2capoutbuf[35] = 0x03; // Length = 3
    -
    599  l2capoutbuf[36] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
    -
    600  l2capoutbuf[37] = 0x01; // MSB L2CAP
    -
    601  l2capoutbuf[38] = 0x00; // LSB L2CAP
    -
    602 
    -
    603  l2capoutbuf[39] = 0x35; // Data element sequence - length in next byte
    -
    604  l2capoutbuf[40] = 0x05; // Length = 5
    -
    605  l2capoutbuf[41] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
    -
    606  l2capoutbuf[42] = 0x00; // MSB RFCOMM
    -
    607  l2capoutbuf[43] = 0x03; // LSB RFCOMM
    -
    608  l2capoutbuf[44] = 0x08; // Unsigned Integer - length 1 byte
    -
    609 
    -
    610  l2capoutbuf[45] = 0x02; // ContinuationState - Two more bytes
    -
    611  l2capoutbuf[46] = 0x00; // MSB length
    -
    612  l2capoutbuf[47] = 0x19; // LSB length = 25 more bytes to come
    -
    613 
    -
    614  SDP_Command(l2capoutbuf, 48);
    -
    615 }
    -
    616 
    -
    617 void SPP::serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
    - -
    619  l2capoutbuf[1] = transactionIDHigh;
    -
    620  l2capoutbuf[2] = transactionIDLow;
    -
    621  l2capoutbuf[3] = 0x00; // MSB Parameter Length
    -
    622  l2capoutbuf[4] = 0x1C; // LSB Parameter Length = 28
    -
    623  l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
    -
    624  l2capoutbuf[6] = 0x19; // LSB AttributeListsByteCount = 25
    -
    625 
    -
    626  /* Attribute ID/Value Sequence: */
    -
    627  l2capoutbuf[7] = 0x01; // Channel 1 - TODO: Try different values, so multiple servers can be used at once
    -
    628 
    -
    629  l2capoutbuf[8] = 0x09; // Unsigned Integer - length 2 bytes
    -
    630  l2capoutbuf[9] = 0x00; // MSB LanguageBaseAttributeIDList
    -
    631  l2capoutbuf[10] = 0x06; // LSB LanguageBaseAttributeIDList
    -
    632  l2capoutbuf[11] = 0x35; // Data element sequence - length in next byte
    -
    633  l2capoutbuf[12] = 0x09; // Length = 9
    -
    634 
    -
    635  // Identifier representing the natural language = en = English - see: "ISO 639:1988"
    -
    636  l2capoutbuf[13] = 0x09; // Unsigned Integer - length 2 bytes
    -
    637  l2capoutbuf[14] = 0x65; // 'e'
    -
    638  l2capoutbuf[15] = 0x6E; // 'n'
    -
    639 
    -
    640  // "The second element of each triplet contains an identifier that specifies a character encoding used for the language"
    -
    641  // Encoding is set to 106 (UTF-8) - see: http://www.iana.org/assignments/character-sets/character-sets.xhtml
    -
    642  l2capoutbuf[16] = 0x09; // Unsigned Integer - length 2 bytes
    -
    643  l2capoutbuf[17] = 0x00; // MSB of character encoding
    -
    644  l2capoutbuf[18] = 0x6A; // LSB of character encoding (106)
    -
    645 
    -
    646  // Attribute ID that serves as the base attribute ID for the natural language in the service record
    -
    647  // "To facilitate the retrieval of human-readable universal attributes in a principal language, the base attribute ID value for the primary language supported by a service record shall be 0x0100"
    -
    648  l2capoutbuf[19] = 0x09; // Unsigned Integer - length 2 bytes
    -
    649  l2capoutbuf[20] = 0x01;
    -
    650  l2capoutbuf[21] = 0x00;
    -
    651 
    -
    652  l2capoutbuf[22] = 0x09; // Unsigned Integer - length 2 bytes
    -
    653  l2capoutbuf[23] = 0x01; // MSB ServiceDescription
    -
    654  l2capoutbuf[24] = 0x00; // LSB ServiceDescription
    -
    655 
    -
    656  l2capoutbuf[25] = 0x25; // Text string - length in next byte
    -
    657  l2capoutbuf[26] = 0x05; // Name length
    -
    658  l2capoutbuf[27] = 'T';
    -
    659  l2capoutbuf[28] = 'K';
    -
    660  l2capoutbuf[29] = 'J';
    -
    661  l2capoutbuf[30] = 'S';
    -
    662  l2capoutbuf[31] = 'P';
    -
    663  l2capoutbuf[32] = 0x00; // No continuation state
    -
    664 
    -
    665  SDP_Command(l2capoutbuf, 33);
    -
    666 }
    -
    667 
    -
    668 void SPP::l2capResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
    -
    669  serialPortResponse1(transactionIDHigh, transactionIDLow); // These has to send all the supported functions, since it only supports virtual serialport it just sends the message again
    -
    670 }
    -
    671 
    -
    672 void SPP::l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
    -
    673  serialPortResponse2(transactionIDHigh, transactionIDLow); // Same data as serialPortResponse2
    -
    674 }
    -
    675 /************************************************************/
    -
    676 /* RFCOMM Commands */
    -
    677 
    -
    678 /************************************************************/
    -
    679 void SPP::RFCOMM_Command(uint8_t* data, uint8_t nbytes) {
    -
    680  pBtd->L2CAP_Command(hci_handle, data, nbytes, rfcomm_scid[0], rfcomm_scid[1]);
    -
    681 }
    -
    682 
    -
    683 void SPP::sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t* data, uint8_t length) {
    -
    684  l2capoutbuf[0] = channel | direction | CR | extendAddress; // RFCOMM Address
    -
    685  l2capoutbuf[1] = channelType | pfBit; // RFCOMM Control
    -
    686  l2capoutbuf[2] = length << 1 | 0x01; // Length and format (always 0x01 bytes format)
    -
    687  uint8_t i = 0;
    -
    688  for(; i < length; i++)
    -
    689  l2capoutbuf[i + 3] = data[i];
    -
    690  l2capoutbuf[i + 3] = calcFcs(l2capoutbuf);
    -
    691 #ifdef EXTRADEBUG
    -
    692  Notify(PSTR(" - RFCOMM Data: "), 0x80);
    -
    693  for(i = 0; i < length + 4; i++) {
    -
    694  D_PrintHex<uint8_t > (l2capoutbuf[i], 0x80);
    -
    695  Notify(PSTR(" "), 0x80);
    -
    696  }
    -
    697 #endif
    -
    698  RFCOMM_Command(l2capoutbuf, length + 4);
    -
    699 }
    -
    700 
    -
    701 void SPP::sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit) {
    -
    702  l2capoutbuf[0] = channel | direction | CR | extendAddress; // RFCOMM Address
    -
    703  l2capoutbuf[1] = channelType | pfBit; // RFCOMM Control
    -
    704  l2capoutbuf[2] = 0x01; // Length = 0
    -
    705  l2capoutbuf[3] = credit; // Credit
    -
    706  l2capoutbuf[4] = calcFcs(l2capoutbuf);
    -
    707 #ifdef EXTRADEBUG
    -
    708  Notify(PSTR(" - RFCOMM Credit Data: "), 0x80);
    -
    709  for(uint8_t i = 0; i < 5; i++) {
    -
    710  D_PrintHex<uint8_t > (l2capoutbuf[i], 0x80);
    -
    711  Notify(PSTR(" "), 0x80);
    -
    712  }
    -
    713 #endif
    -
    714  RFCOMM_Command(l2capoutbuf, 5);
    -
    715 }
    -
    716 
    -
    717 /* CRC on 2 bytes */
    -
    718 uint8_t SPP::crc(uint8_t *data) {
    -
    719  return (pgm_read_byte(&rfcomm_crc_table[pgm_read_byte(&rfcomm_crc_table[0xFF ^ data[0]]) ^ data[1]]));
    -
    720 }
    -
    721 
    -
    722 /* Calculate FCS */
    -
    723 uint8_t SPP::calcFcs(uint8_t *data) {
    -
    724  uint8_t temp = crc(data);
    -
    725  if((data[1] & 0xEF) == RFCOMM_UIH)
    -
    726  return (0xFF - temp); // FCS on 2 bytes
    -
    727  else
    -
    728  return (0xFF - pgm_read_byte(&rfcomm_crc_table[temp ^ data[2]])); // FCS on 3 bytes
    -
    729 }
    -
    730 
    -
    731 /* Check FCS */
    -
    732 bool SPP::checkFcs(uint8_t *data, uint8_t fcs) {
    -
    733  uint8_t temp = crc(data);
    -
    734  if((data[1] & 0xEF) != RFCOMM_UIH)
    -
    735  temp = pgm_read_byte(&rfcomm_crc_table[temp ^ data[2]]); // FCS on 3 bytes
    -
    736  return (pgm_read_byte(&rfcomm_crc_table[temp ^ fcs]) == 0xCF);
    -
    737 }
    -
    738 
    -
    739 /* Serial commands */
    -
    740 #if defined(ARDUINO) && ARDUINO >=100
    -
    741 
    -
    742 size_t SPP::write(uint8_t data) {
    -
    743  return write(&data, 1);
    -
    744 }
    -
    745 #else
    -
    746 
    -
    747 void SPP::write(uint8_t data) {
    -
    748  write(&data, 1);
    -
    749 }
    -
    750 #endif
    -
    751 
    -
    752 #if defined(ARDUINO) && ARDUINO >=100
    -
    753 
    -
    754 size_t SPP::write(const uint8_t *data, size_t size) {
    -
    755 #else
    -
    756 
    -
    757 void SPP::write(const uint8_t *data, size_t size) {
    -
    758 #endif
    -
    759  for(uint8_t i = 0; i < size; i++) {
    -
    760  if(sppIndex >= sizeof (sppOutputBuffer) / sizeof (sppOutputBuffer[0]))
    -
    761  send(); // Send the current data in the buffer
    -
    762  sppOutputBuffer[sppIndex++] = data[i]; // All the bytes are put into a buffer and then send using the send() function
    -
    763  }
    -
    764 #if defined(ARDUINO) && ARDUINO >=100
    -
    765  return size;
    -
    766 #endif
    -
    767 }
    -
    768 
    -
    769 void SPP::send() {
    -
    770  if(!connected || !sppIndex)
    -
    771  return;
    -
    772  uint8_t length; // This is the length of the string we are sending
    -
    773  uint8_t offset = 0; // This is used to keep track of where we are in the string
    -
    774 
    -
    775  l2capoutbuf[0] = rfcommChannelConnection | 0 | 0 | extendAddress; // RFCOMM Address
    -
    776  l2capoutbuf[1] = RFCOMM_UIH; // RFCOMM Control
    -
    777 
    -
    778  while(sppIndex) { // We will run this while loop until this variable is 0
    -
    779  if(sppIndex > (sizeof (l2capoutbuf) - 4)) // Check if the string is larger than the outgoing buffer
    -
    780  length = sizeof (l2capoutbuf) - 4;
    -
    781  else
    -
    782  length = sppIndex;
    -
    783 
    -
    784  l2capoutbuf[2] = length << 1 | 1; // Length
    -
    785  uint8_t i = 0;
    -
    786  for(; i < length; i++)
    -
    787  l2capoutbuf[i + 3] = sppOutputBuffer[i + offset];
    -
    788  l2capoutbuf[i + 3] = calcFcs(l2capoutbuf); // Calculate checksum
    -
    789 
    -
    790  RFCOMM_Command(l2capoutbuf, length + 4);
    -
    791 
    -
    792  sppIndex -= length;
    -
    793  offset += length; // Increment the offset
    -
    794  }
    -
    795 }
    -
    796 
    -
    797 int SPP::available(void) {
    -
    798  return rfcommAvailable;
    -
    799 };
    -
    800 
    -
    801 void SPP::discard(void) {
    -
    802  rfcommAvailable = 0;
    -
    803 }
    -
    804 
    -
    805 int SPP::peek(void) {
    -
    806  if(rfcommAvailable == 0) // Don't read if there is nothing in the buffer
    -
    807  return -1;
    -
    808  return rfcommDataBuffer[0];
    -
    809 }
    -
    810 
    -
    811 int SPP::read(void) {
    -
    812  if(rfcommAvailable == 0) // Don't read if there is nothing in the buffer
    -
    813  return -1;
    -
    814  uint8_t output = rfcommDataBuffer[0];
    -
    815  for(uint8_t i = 1; i < rfcommAvailable; i++)
    -
    816  rfcommDataBuffer[i - 1] = rfcommDataBuffer[i]; // Shift the buffer one left
    -
    817  rfcommAvailable--;
    -
    818  bytesRead++;
    -
    819  if(bytesRead > (sizeof (rfcommDataBuffer) - 5)) { // We will send the command just before it runs out of credit
    -
    820  bytesRead = 0;
    -
    821  sendRfcommCredit(rfcommChannelConnection, rfcommDirection, 0, RFCOMM_UIH, 0x10, sizeof (rfcommDataBuffer)); // Send more credit
    -
    822 #ifdef EXTRADEBUG
    -
    823  Notify(PSTR("\r\nSent "), 0x80);
    -
    824  Notify((uint8_t)sizeof (rfcommDataBuffer), 0x80);
    -
    825  Notify(PSTR(" more credit"), 0x80);
    -
    826 #endif
    -
    827  }
    -
    828  return output;
    -
    829 }
    -
    void(* pFuncOnInit)(void)
    Definition: BTD.h:609
    -
    size_t write(uint8_t data)
    Definition: SPP.cpp:742
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #include "SPP.h"
    19 // To enable serial debugging see "settings.h"
    20 //#define EXTRADEBUG // Uncomment to get even more debugging data
    21 //#define PRINTREPORT // Uncomment to print the report sent to the Arduino
    22 
    23 /*
    24  * CRC (reversed crc) lookup table as calculated by the table generator in ETSI TS 101 369 V6.3.0.
    25  */
    26 const uint8_t rfcomm_crc_table[256] PROGMEM = {/* reversed, 8-bit, poly=0x07 */
    27  0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
    28  0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
    29  0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
    30  0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51, 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
    31  0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
    32  0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
    33  0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
    34  0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
    35  0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95, 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
    36  0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
    37  0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD, 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
    38  0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
    39  0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5, 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
    40  0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
    41  0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD, 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
    42  0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
    43 };
    44 
    45 SPP::SPP(BTD *p, const char* name, const char* pin) :
    46 BluetoothService(p) // Pointer to BTD class instance - mandatory
    47 {
    48  pBtd->btdName = name;
    49  pBtd->btdPin = pin;
    50 
    51  /* Set device cid for the SDP and RFCOMM channelse */
    52  sdp_dcid[0] = 0x50; // 0x0050
    53  sdp_dcid[1] = 0x00;
    54  rfcomm_dcid[0] = 0x51; // 0x0051
    55  rfcomm_dcid[1] = 0x00;
    56 
    57  Reset();
    58 }
    59 
    60 void SPP::Reset() {
    61  connected = false;
    62  RFCOMMConnected = false;
    63  SDPConnected = false;
    64  waitForLastCommand = false;
    65  l2cap_sdp_state = L2CAP_SDP_WAIT;
    66  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT;
    67  l2cap_event_flag = 0;
    68  sppIndex = 0;
    69  creditSent = false;
    70 }
    71 
    73  connected = false;
    74  // First the two L2CAP channels has to be disconnected and then the HCI connection
    75  if(RFCOMMConnected)
    76  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, rfcomm_scid, rfcomm_dcid);
    77  if(RFCOMMConnected && SDPConnected)
    78  delay(1); // Add delay between commands
    79  if(SDPConnected)
    80  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, sdp_scid, sdp_dcid);
    81  l2cap_sdp_state = L2CAP_DISCONNECT_RESPONSE;
    82 }
    83 
    84 void SPP::ACLData(uint8_t* l2capinbuf) {
    85  if(!connected) {
    86  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    87  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == SDP_PSM && !pBtd->sdpConnectionClaimed) {
    88  pBtd->sdpConnectionClaimed = true;
    89  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    90  l2cap_sdp_state = L2CAP_SDP_WAIT; // Reset state
    91  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == RFCOMM_PSM && !pBtd->rfcommConnectionClaimed) {
    93  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    94  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT; // Reset state
    95  }
    96  }
    97  }
    98 
    99  if(checkHciHandle(l2capinbuf, hci_handle)) { // acl_handle_ok
    100  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
    101  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
    102 #ifdef DEBUG_USB_HOST
    103  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
    104  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    105  Notify(PSTR(" "), 0x80);
    106  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    107  Notify(PSTR(" Data: "), 0x80);
    108  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
    109  Notify(PSTR(" "), 0x80);
    110  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
    111  Notify(PSTR(" "), 0x80);
    112  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    113  Notify(PSTR(" "), 0x80);
    114  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    115 #endif
    116  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    117 #ifdef EXTRADEBUG
    118  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
    119  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    120  Notify(PSTR(" "), 0x80);
    121  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    122  Notify(PSTR(" SCID: "), 0x80);
    123  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    124  Notify(PSTR(" "), 0x80);
    125  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    126  Notify(PSTR(" Identifier: "), 0x80);
    127  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    128 #endif
    129  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == SDP_PSM) { // It doesn't matter if it receives another reqeust, since it waits for the channel to disconnect in the L2CAP_SDP_DONE state, and the l2cap_event_flag will be cleared if so
    130  identifier = l2capinbuf[9];
    131  sdp_scid[0] = l2capinbuf[14];
    132  sdp_scid[1] = l2capinbuf[15];
    134  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == RFCOMM_PSM) { // ----- || -----
    135  identifier = l2capinbuf[9];
    136  rfcomm_scid[0] = l2capinbuf[14];
    137  rfcomm_scid[1] = l2capinbuf[15];
    139  }
    140  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
    141  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
    142  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
    143  //Notify(PSTR("\r\nSDP Configuration Complete"), 0x80);
    145  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
    146  //Notify(PSTR("\r\nRFCOMM Configuration Complete"), 0x80);
    148  }
    149  }
    150  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
    151  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
    152  //Notify(PSTR("\r\nSDP Configuration Request"), 0x80);
    153  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], sdp_scid);
    154  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
    155  //Notify(PSTR("\r\nRFCOMM Configuration Request"), 0x80);
    156  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], rfcomm_scid);
    157  }
    158  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
    159  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
    160  //Notify(PSTR("\r\nDisconnect Request: SDP Channel"), 0x80);
    161  identifier = l2capinbuf[9];
    163  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
    164  //Notify(PSTR("\r\nDisconnect Request: RFCOMM Channel"), 0x80);
    165  identifier = l2capinbuf[9];
    167  }
    168  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
    169  if(l2capinbuf[12] == sdp_scid[0] && l2capinbuf[13] == sdp_scid[1]) {
    170  //Notify(PSTR("\r\nDisconnect Response: SDP Channel"), 0x80);
    171  identifier = l2capinbuf[9];
    173  } else if(l2capinbuf[12] == rfcomm_scid[0] && l2capinbuf[13] == rfcomm_scid[1]) {
    174  //Notify(PSTR("\r\nDisconnect Response: RFCOMM Channel"), 0x80);
    175  identifier = l2capinbuf[9];
    177  }
    178  } else if(l2capinbuf[8] == L2CAP_CMD_INFORMATION_REQUEST) {
    179 #ifdef DEBUG_USB_HOST
    180  Notify(PSTR("\r\nInformation request"), 0x80);
    181 #endif
    182  identifier = l2capinbuf[9];
    183  pBtd->l2cap_information_response(hci_handle, identifier, l2capinbuf[12], l2capinbuf[13]);
    184  }
    185 #ifdef EXTRADEBUG
    186  else {
    187  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
    188  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
    189  }
    190 #endif
    191  } else if(l2capinbuf[6] == sdp_dcid[0] && l2capinbuf[7] == sdp_dcid[1]) { // SDP
    192  if(l2capinbuf[8] == SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU) {
    193  if(((l2capinbuf[16] << 8 | l2capinbuf[17]) == SERIALPORT_UUID) || ((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000 && (l2capinbuf[18] << 8 | l2capinbuf[19]) == SERIALPORT_UUID)) { // Check if it's sending the full UUID, see: https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm, we will just check the first four bytes
    194  if(firstMessage) {
    195  serialPortResponse1(l2capinbuf[9], l2capinbuf[10]);
    196  firstMessage = false;
    197  } else {
    198  serialPortResponse2(l2capinbuf[9], l2capinbuf[10]); // Serialport continuation state
    199  firstMessage = true;
    200  }
    201  } else if(((l2capinbuf[16] << 8 | l2capinbuf[17]) == L2CAP_UUID) || ((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000 && (l2capinbuf[18] << 8 | l2capinbuf[19]) == L2CAP_UUID)) {
    202  if(firstMessage) {
    203  l2capResponse1(l2capinbuf[9], l2capinbuf[10]);
    204  firstMessage = false;
    205  } else {
    206  l2capResponse2(l2capinbuf[9], l2capinbuf[10]); // L2CAP continuation state
    207  firstMessage = true;
    208  }
    209  } else
    210  serviceNotSupported(l2capinbuf[9], l2capinbuf[10]); // The service is not supported
    211 #ifdef EXTRADEBUG
    212  Notify(PSTR("\r\nUUID: "), 0x80);
    213  uint16_t uuid;
    214  if((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000) // Check if it's sending the UUID as a 128-bit UUID
    215  uuid = (l2capinbuf[18] << 8 | l2capinbuf[19]);
    216  else // Short UUID
    217  uuid = (l2capinbuf[16] << 8 | l2capinbuf[17]);
    218  D_PrintHex<uint16_t > (uuid, 0x80);
    219 
    220  Notify(PSTR("\r\nLength: "), 0x80);
    221  uint16_t length = l2capinbuf[11] << 8 | l2capinbuf[12];
    222  D_PrintHex<uint16_t > (length, 0x80);
    223  Notify(PSTR("\r\nData: "), 0x80);
    224  for(uint8_t i = 0; i < length; i++) {
    225  D_PrintHex<uint8_t > (l2capinbuf[13 + i], 0x80);
    226  Notify(PSTR(" "), 0x80);
    227  }
    228 #endif
    229  }
    230 #ifdef EXTRADEBUG
    231  else {
    232  Notify(PSTR("\r\nUnknown PDU: "), 0x80);
    233  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
    234  }
    235 #endif
    236  } else if(l2capinbuf[6] == rfcomm_dcid[0] && l2capinbuf[7] == rfcomm_dcid[1]) { // RFCOMM
    237  rfcommChannel = l2capinbuf[8] & 0xF8;
    238  rfcommDirection = l2capinbuf[8] & 0x04;
    239  rfcommCommandResponse = l2capinbuf[8] & 0x02;
    240  rfcommChannelType = l2capinbuf[9] & 0xEF;
    241  rfcommPfBit = l2capinbuf[9] & 0x10;
    242 
    243  if(rfcommChannel >> 3 != 0x00)
    244  rfcommChannelConnection = rfcommChannel;
    245 
    246 #ifdef EXTRADEBUG
    247  Notify(PSTR("\r\nRFCOMM Channel: "), 0x80);
    248  D_PrintHex<uint8_t > (rfcommChannel >> 3, 0x80);
    249  Notify(PSTR(" Direction: "), 0x80);
    250  D_PrintHex<uint8_t > (rfcommDirection >> 2, 0x80);
    251  Notify(PSTR(" CommandResponse: "), 0x80);
    252  D_PrintHex<uint8_t > (rfcommCommandResponse >> 1, 0x80);
    253  Notify(PSTR(" ChannelType: "), 0x80);
    254  D_PrintHex<uint8_t > (rfcommChannelType, 0x80);
    255  Notify(PSTR(" PF_BIT: "), 0x80);
    256  D_PrintHex<uint8_t > (rfcommPfBit, 0x80);
    257 #endif
    258  if(rfcommChannelType == RFCOMM_DISC) {
    259 #ifdef DEBUG_USB_HOST
    260  Notify(PSTR("\r\nReceived Disconnect RFCOMM Command on channel: "), 0x80);
    261  D_PrintHex<uint8_t > (rfcommChannel >> 3, 0x80);
    262 #endif
    263  connected = false;
    264  sendRfcomm(rfcommChannel, rfcommDirection, rfcommCommandResponse, RFCOMM_UA, rfcommPfBit, rfcommbuf, 0x00); // UA Command
    265  }
    266  if(connected) {
    267  /* Read the incoming message */
    268  if(rfcommChannelType == RFCOMM_UIH && rfcommChannel == rfcommChannelConnection) {
    269  uint8_t length = l2capinbuf[10] >> 1; // Get length
    270  uint8_t offset = l2capinbuf[4] - length - 4; // Check if there is credit
    271  if(checkFcs(&l2capinbuf[8], l2capinbuf[11 + length + offset])) {
    272  uint8_t i = 0;
    273  for(; i < length; i++) {
    274  if(rfcommAvailable + i >= sizeof (rfcommDataBuffer)) {
    275 #ifdef DEBUG_USB_HOST
    276  Notify(PSTR("\r\nWarning: Buffer is full!"), 0x80);
    277 #endif
    278  break;
    279  }
    280  rfcommDataBuffer[rfcommAvailable + i] = l2capinbuf[11 + i + offset];
    281  }
    282  rfcommAvailable += i;
    283 #ifdef EXTRADEBUG
    284  Notify(PSTR("\r\nRFCOMM Data Available: "), 0x80);
    285  Notify(rfcommAvailable, 0x80);
    286  if(offset) {
    287  Notify(PSTR(" - Credit: 0x"), 0x80);
    288  D_PrintHex<uint8_t > (l2capinbuf[11], 0x80);
    289  }
    290 #endif
    291  }
    292 #ifdef DEBUG_USB_HOST
    293  else
    294  Notify(PSTR("\r\nError in FCS checksum!"), 0x80);
    295 #endif
    296 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send to the Arduino via Bluetooth
    297  for(uint8_t i = 0; i < length; i++)
    298  Notifyc(l2capinbuf[i + 11 + offset], 0x80);
    299 #endif
    300  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_RPN_CMD) { // UIH Remote Port Negotiation Command
    301 #ifdef DEBUG_USB_HOST
    302  Notify(PSTR("\r\nReceived UIH Remote Port Negotiation Command"), 0x80);
    303 #endif
    304  rfcommbuf[0] = BT_RFCOMM_RPN_RSP; // Command
    305  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
    306  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
    307  rfcommbuf[3] = l2capinbuf[14]; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
    308  rfcommbuf[4] = l2capinbuf[15]; // Priority
    309  rfcommbuf[5] = l2capinbuf[16]; // Timer
    310  rfcommbuf[6] = l2capinbuf[17]; // Max Fram Size LSB
    311  rfcommbuf[7] = l2capinbuf[18]; // Max Fram Size MSB
    312  rfcommbuf[8] = l2capinbuf[19]; // MaxRatransm.
    313  rfcommbuf[9] = l2capinbuf[20]; // Number of Frames
    314  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A); // UIH Remote Port Negotiation Response
    315  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_CMD) { // UIH Modem Status Command
    316 #ifdef DEBUG_USB_HOST
    317  Notify(PSTR("\r\nSend UIH Modem Status Response"), 0x80);
    318 #endif
    319  rfcommbuf[0] = BT_RFCOMM_MSC_RSP; // UIH Modem Status Response
    320  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
    321  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
    322  rfcommbuf[3] = l2capinbuf[14];
    323  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
    324  }
    325  } else {
    326  if(rfcommChannelType == RFCOMM_SABM) { // SABM Command - this is sent twice: once for channel 0 and then for the channel to establish
    327 #ifdef DEBUG_USB_HOST
    328  Notify(PSTR("\r\nReceived SABM Command"), 0x80);
    329 #endif
    330  sendRfcomm(rfcommChannel, rfcommDirection, rfcommCommandResponse, RFCOMM_UA, rfcommPfBit, rfcommbuf, 0x00); // UA Command
    331  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_PN_CMD) { // UIH Parameter Negotiation Command
    332 #ifdef DEBUG_USB_HOST
    333  Notify(PSTR("\r\nReceived UIH Parameter Negotiation Command"), 0x80);
    334 #endif
    335  rfcommbuf[0] = BT_RFCOMM_PN_RSP; // UIH Parameter Negotiation Response
    336  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
    337  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
    338  rfcommbuf[3] = 0xE0; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
    339  rfcommbuf[4] = 0x00; // Priority
    340  rfcommbuf[5] = 0x00; // Timer
    341  rfcommbuf[6] = BULK_MAXPKTSIZE - 14; // Max Fram Size LSB - set to the size of received data (50)
    342  rfcommbuf[7] = 0x00; // Max Fram Size MSB
    343  rfcommbuf[8] = 0x00; // MaxRatransm.
    344  rfcommbuf[9] = 0x00; // Number of Frames
    345  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A);
    346  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_CMD) { // UIH Modem Status Command
    347 #ifdef DEBUG_USB_HOST
    348  Notify(PSTR("\r\nSend UIH Modem Status Response"), 0x80);
    349 #endif
    350  rfcommbuf[0] = BT_RFCOMM_MSC_RSP; // UIH Modem Status Response
    351  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
    352  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
    353  rfcommbuf[3] = l2capinbuf[14];
    354  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
    355 
    356  delay(1);
    357 #ifdef DEBUG_USB_HOST
    358  Notify(PSTR("\r\nSend UIH Modem Status Command"), 0x80);
    359 #endif
    360  rfcommbuf[0] = BT_RFCOMM_MSC_CMD; // UIH Modem Status Command
    361  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
    362  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
    363  rfcommbuf[3] = 0x8D; // Can receive frames (YES), Ready to Communicate (YES), Ready to Receive (YES), Incomig Call (NO), Data is Value (YES)
    364 
    365  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
    366  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_RSP) { // UIH Modem Status Response
    367  if(!creditSent) {
    368 #ifdef DEBUG_USB_HOST
    369  Notify(PSTR("\r\nSend UIH Command with credit"), 0x80);
    370 #endif
    371  sendRfcommCredit(rfcommChannelConnection, rfcommDirection, 0, RFCOMM_UIH, 0x10, sizeof (rfcommDataBuffer)); // Send credit
    372  creditSent = true;
    373  timer = (uint32_t)millis();
    374  waitForLastCommand = true;
    375  }
    376  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[10] == 0x01) { // UIH Command with credit
    377 #ifdef DEBUG_USB_HOST
    378  Notify(PSTR("\r\nReceived UIH Command with credit"), 0x80);
    379 #endif
    380  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_RPN_CMD) { // UIH Remote Port Negotiation Command
    381 #ifdef DEBUG_USB_HOST
    382  Notify(PSTR("\r\nReceived UIH Remote Port Negotiation Command"), 0x80);
    383 #endif
    384  rfcommbuf[0] = BT_RFCOMM_RPN_RSP; // Command
    385  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
    386  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
    387  rfcommbuf[3] = l2capinbuf[14]; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
    388  rfcommbuf[4] = l2capinbuf[15]; // Priority
    389  rfcommbuf[5] = l2capinbuf[16]; // Timer
    390  rfcommbuf[6] = l2capinbuf[17]; // Max Fram Size LSB
    391  rfcommbuf[7] = l2capinbuf[18]; // Max Fram Size MSB
    392  rfcommbuf[8] = l2capinbuf[19]; // MaxRatransm.
    393  rfcommbuf[9] = l2capinbuf[20]; // Number of Frames
    394  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A); // UIH Remote Port Negotiation Response
    395 #ifdef DEBUG_USB_HOST
    396  Notify(PSTR("\r\nRFCOMM Connection is now established\r\n"), 0x80);
    397 #endif
    398  onInit();
    399  }
    400 #ifdef EXTRADEBUG
    401  else if(rfcommChannelType != RFCOMM_DISC) {
    402  Notify(PSTR("\r\nUnsupported RFCOMM Data - ChannelType: "), 0x80);
    403  D_PrintHex<uint8_t > (rfcommChannelType, 0x80);
    404  Notify(PSTR(" Command: "), 0x80);
    405  D_PrintHex<uint8_t > (l2capinbuf[11], 0x80);
    406  }
    407 #endif
    408  }
    409  }
    410 #ifdef EXTRADEBUG
    411  else {
    412  Notify(PSTR("\r\nUnsupported L2CAP Data - Channel ID: "), 0x80);
    413  D_PrintHex<uint8_t > (l2capinbuf[7], 0x80);
    414  Notify(PSTR(" "), 0x80);
    415  D_PrintHex<uint8_t > (l2capinbuf[6], 0x80);
    416  }
    417 #endif
    418  SDP_task();
    419  RFCOMM_task();
    420  }
    421 }
    422 
    423 void SPP::Run() {
    424  if(waitForLastCommand && (int32_t)((uint32_t)millis() - timer) > 100) { // We will only wait 100ms and see if the UIH Remote Port Negotiation Command is send, as some deviced don't send it
    425 #ifdef DEBUG_USB_HOST
    426  Notify(PSTR("\r\nRFCOMM Connection is now established - Automatic\r\n"), 0x80);
    427 #endif
    428  onInit();
    429  }
    430  send(); // Send all bytes currently in the buffer
    431 }
    432 
    433 void SPP::onInit() {
    434  creditSent = false;
    435  waitForLastCommand = false;
    436  connected = true; // The RFCOMM channel is now established
    437  sppIndex = 0;
    438  if(pFuncOnInit)
    439  pFuncOnInit(); // Call the user function
    440 };
    441 
    442 void SPP::SDP_task() {
    443  switch(l2cap_sdp_state) {
    444  case L2CAP_SDP_WAIT:
    447 #ifdef DEBUG_USB_HOST
    448  Notify(PSTR("\r\nSDP Incoming Connection Request"), 0x80);
    449 #endif
    451  delay(1);
    453  identifier++;
    454  delay(1);
    456  l2cap_sdp_state = L2CAP_SDP_SUCCESS;
    459  SDPConnected = false;
    460 #ifdef DEBUG_USB_HOST
    461  Notify(PSTR("\r\nDisconnected SDP Channel"), 0x80);
    462 #endif
    464  }
    465  break;
    466  case L2CAP_SDP_SUCCESS:
    469 #ifdef DEBUG_USB_HOST
    470  Notify(PSTR("\r\nSDP Successfully Configured"), 0x80);
    471 #endif
    472  firstMessage = true; // Reset bool
    473  SDPConnected = true;
    474  l2cap_sdp_state = L2CAP_SDP_WAIT;
    475  }
    476  break;
    477 
    478  case L2CAP_DISCONNECT_RESPONSE: // This is for both disconnection response from the RFCOMM and SDP channel if they were connected
    480 #ifdef DEBUG_USB_HOST
    481  Notify(PSTR("\r\nDisconnected L2CAP Connection"), 0x80);
    482 #endif
    484  hci_handle = -1; // Reset handle
    485  Reset();
    486  }
    487  break;
    488  }
    489 }
    490 
    491 void SPP::RFCOMM_task() {
    492  switch(l2cap_rfcomm_state) {
    493  case L2CAP_RFCOMM_WAIT:
    496 #ifdef DEBUG_USB_HOST
    497  Notify(PSTR("\r\nRFCOMM Incoming Connection Request"), 0x80);
    498 #endif
    499  pBtd->l2cap_connection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid, PENDING);
    500  delay(1);
    501  pBtd->l2cap_connection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid, SUCCESSFUL);
    502  identifier++;
    503  delay(1);
    505  l2cap_rfcomm_state = L2CAP_RFCOMM_SUCCESS;
    508  RFCOMMConnected = false;
    509  connected = false;
    510 #ifdef DEBUG_USB_HOST
    511  Notify(PSTR("\r\nDisconnected RFCOMM Channel"), 0x80);
    512 #endif
    513  pBtd->l2cap_disconnection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid);
    514  }
    515  break;
    519 #ifdef DEBUG_USB_HOST
    520  Notify(PSTR("\r\nRFCOMM Successfully Configured"), 0x80);
    521 #endif
    522  rfcommAvailable = 0; // Reset number of bytes available
    523  bytesRead = 0; // Reset number of bytes received
    524  RFCOMMConnected = true;
    525  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT;
    526  }
    527  break;
    528  }
    529 }
    530 /************************************************************/
    531 /* SDP Commands */
    532 
    533 /************************************************************/
    534 void SPP::SDP_Command(uint8_t* data, uint8_t nbytes) { // See page 223 in the Bluetooth specs
    535  pBtd->L2CAP_Command(hci_handle, data, nbytes, sdp_scid[0], sdp_scid[1]);
    536 }
    537 
    538 void SPP::serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow) { // See page 235 in the Bluetooth specs
    540  l2capoutbuf[1] = transactionIDHigh;
    541  l2capoutbuf[2] = transactionIDLow;
    542  l2capoutbuf[3] = 0x00; // MSB Parameter Length
    543  l2capoutbuf[4] = 0x05; // LSB Parameter Length = 5
    544  l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
    545  l2capoutbuf[6] = 0x02; // LSB AttributeListsByteCount = 2
    546 
    547  /* Attribute ID/Value Sequence: */
    548  l2capoutbuf[7] = 0x35; // Data element sequence - length in next byte
    549  l2capoutbuf[8] = 0x00; // Length = 0
    550  l2capoutbuf[9] = 0x00; // No continuation state
    551 
    552  SDP_Command(l2capoutbuf, 10);
    553 }
    554 
    555 void SPP::serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
    557  l2capoutbuf[1] = transactionIDHigh;
    558  l2capoutbuf[2] = transactionIDLow;
    559  l2capoutbuf[3] = 0x00; // MSB Parameter Length
    560  l2capoutbuf[4] = 0x2B; // LSB Parameter Length = 43
    561  l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
    562  l2capoutbuf[6] = 0x26; // LSB AttributeListsByteCount = 38
    563 
    564  /* Attribute ID/Value Sequence: */
    565  l2capoutbuf[7] = 0x36; // Data element sequence - length in next two bytes
    566  l2capoutbuf[8] = 0x00; // MSB Length
    567  l2capoutbuf[9] = 0x3C; // LSB Length = 60
    568 
    569  l2capoutbuf[10] = 0x36; // Data element sequence - length in next two bytes
    570  l2capoutbuf[11] = 0x00; // MSB Length
    571  l2capoutbuf[12] = 0x39; // LSB Length = 57
    572 
    573  l2capoutbuf[13] = 0x09; // Unsigned Integer - length 2 bytes
    574  l2capoutbuf[14] = 0x00; // MSB ServiceRecordHandle
    575  l2capoutbuf[15] = 0x00; // LSB ServiceRecordHandle
    576  l2capoutbuf[16] = 0x0A; // Unsigned int - length 4 bytes
    577  l2capoutbuf[17] = 0x00; // ServiceRecordHandle value - TODO: Is this related to HCI_Handle?
    578  l2capoutbuf[18] = 0x01;
    579  l2capoutbuf[19] = 0x00;
    580  l2capoutbuf[20] = 0x06;
    581 
    582  l2capoutbuf[21] = 0x09; // Unsigned Integer - length 2 bytes
    583  l2capoutbuf[22] = 0x00; // MSB ServiceClassIDList
    584  l2capoutbuf[23] = 0x01; // LSB ServiceClassIDList
    585  l2capoutbuf[24] = 0x35; // Data element sequence - length in next byte
    586  l2capoutbuf[25] = 0x03; // Length = 3
    587  l2capoutbuf[26] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
    588  l2capoutbuf[27] = 0x11; // MSB SerialPort
    589  l2capoutbuf[28] = 0x01; // LSB SerialPort
    590 
    591  l2capoutbuf[29] = 0x09; // Unsigned Integer - length 2 bytes
    592  l2capoutbuf[30] = 0x00; // MSB ProtocolDescriptorList
    593  l2capoutbuf[31] = 0x04; // LSB ProtocolDescriptorList
    594  l2capoutbuf[32] = 0x35; // Data element sequence - length in next byte
    595  l2capoutbuf[33] = 0x0C; // Length = 12
    596 
    597  l2capoutbuf[34] = 0x35; // Data element sequence - length in next byte
    598  l2capoutbuf[35] = 0x03; // Length = 3
    599  l2capoutbuf[36] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
    600  l2capoutbuf[37] = 0x01; // MSB L2CAP
    601  l2capoutbuf[38] = 0x00; // LSB L2CAP
    602 
    603  l2capoutbuf[39] = 0x35; // Data element sequence - length in next byte
    604  l2capoutbuf[40] = 0x05; // Length = 5
    605  l2capoutbuf[41] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
    606  l2capoutbuf[42] = 0x00; // MSB RFCOMM
    607  l2capoutbuf[43] = 0x03; // LSB RFCOMM
    608  l2capoutbuf[44] = 0x08; // Unsigned Integer - length 1 byte
    609 
    610  l2capoutbuf[45] = 0x02; // ContinuationState - Two more bytes
    611  l2capoutbuf[46] = 0x00; // MSB length
    612  l2capoutbuf[47] = 0x19; // LSB length = 25 more bytes to come
    613 
    614  SDP_Command(l2capoutbuf, 48);
    615 }
    616 
    617 void SPP::serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
    619  l2capoutbuf[1] = transactionIDHigh;
    620  l2capoutbuf[2] = transactionIDLow;
    621  l2capoutbuf[3] = 0x00; // MSB Parameter Length
    622  l2capoutbuf[4] = 0x1C; // LSB Parameter Length = 28
    623  l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
    624  l2capoutbuf[6] = 0x19; // LSB AttributeListsByteCount = 25
    625 
    626  /* Attribute ID/Value Sequence: */
    627  l2capoutbuf[7] = 0x01; // Channel 1 - TODO: Try different values, so multiple servers can be used at once
    628 
    629  l2capoutbuf[8] = 0x09; // Unsigned Integer - length 2 bytes
    630  l2capoutbuf[9] = 0x00; // MSB LanguageBaseAttributeIDList
    631  l2capoutbuf[10] = 0x06; // LSB LanguageBaseAttributeIDList
    632  l2capoutbuf[11] = 0x35; // Data element sequence - length in next byte
    633  l2capoutbuf[12] = 0x09; // Length = 9
    634 
    635  // Identifier representing the natural language = en = English - see: "ISO 639:1988"
    636  l2capoutbuf[13] = 0x09; // Unsigned Integer - length 2 bytes
    637  l2capoutbuf[14] = 0x65; // 'e'
    638  l2capoutbuf[15] = 0x6E; // 'n'
    639 
    640  // "The second element of each triplet contains an identifier that specifies a character encoding used for the language"
    641  // Encoding is set to 106 (UTF-8) - see: http://www.iana.org/assignments/character-sets/character-sets.xhtml
    642  l2capoutbuf[16] = 0x09; // Unsigned Integer - length 2 bytes
    643  l2capoutbuf[17] = 0x00; // MSB of character encoding
    644  l2capoutbuf[18] = 0x6A; // LSB of character encoding (106)
    645 
    646  // Attribute ID that serves as the base attribute ID for the natural language in the service record
    647  // "To facilitate the retrieval of human-readable universal attributes in a principal language, the base attribute ID value for the primary language supported by a service record shall be 0x0100"
    648  l2capoutbuf[19] = 0x09; // Unsigned Integer - length 2 bytes
    649  l2capoutbuf[20] = 0x01;
    650  l2capoutbuf[21] = 0x00;
    651 
    652  l2capoutbuf[22] = 0x09; // Unsigned Integer - length 2 bytes
    653  l2capoutbuf[23] = 0x01; // MSB ServiceDescription
    654  l2capoutbuf[24] = 0x00; // LSB ServiceDescription
    655 
    656  l2capoutbuf[25] = 0x25; // Text string - length in next byte
    657  l2capoutbuf[26] = 0x05; // Name length
    658  l2capoutbuf[27] = 'T';
    659  l2capoutbuf[28] = 'K';
    660  l2capoutbuf[29] = 'J';
    661  l2capoutbuf[30] = 'S';
    662  l2capoutbuf[31] = 'P';
    663  l2capoutbuf[32] = 0x00; // No continuation state
    664 
    665  SDP_Command(l2capoutbuf, 33);
    666 }
    667 
    668 void SPP::l2capResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
    669  serialPortResponse1(transactionIDHigh, transactionIDLow); // These has to send all the supported functions, since it only supports virtual serialport it just sends the message again
    670 }
    671 
    672 void SPP::l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
    673  serialPortResponse2(transactionIDHigh, transactionIDLow); // Same data as serialPortResponse2
    674 }
    675 /************************************************************/
    676 /* RFCOMM Commands */
    677 
    678 /************************************************************/
    679 void SPP::RFCOMM_Command(uint8_t* data, uint8_t nbytes) {
    680  pBtd->L2CAP_Command(hci_handle, data, nbytes, rfcomm_scid[0], rfcomm_scid[1]);
    681 }
    682 
    683 void SPP::sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t* data, uint8_t length) {
    684  l2capoutbuf[0] = channel | direction | CR | extendAddress; // RFCOMM Address
    685  l2capoutbuf[1] = channelType | pfBit; // RFCOMM Control
    686  l2capoutbuf[2] = length << 1 | 0x01; // Length and format (always 0x01 bytes format)
    687  uint8_t i = 0;
    688  for(; i < length; i++)
    689  l2capoutbuf[i + 3] = data[i];
    690  l2capoutbuf[i + 3] = calcFcs(l2capoutbuf);
    691 #ifdef EXTRADEBUG
    692  Notify(PSTR(" - RFCOMM Data: "), 0x80);
    693  for(i = 0; i < length + 4; i++) {
    694  D_PrintHex<uint8_t > (l2capoutbuf[i], 0x80);
    695  Notify(PSTR(" "), 0x80);
    696  }
    697 #endif
    698  RFCOMM_Command(l2capoutbuf, length + 4);
    699 }
    700 
    701 void SPP::sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit) {
    702  l2capoutbuf[0] = channel | direction | CR | extendAddress; // RFCOMM Address
    703  l2capoutbuf[1] = channelType | pfBit; // RFCOMM Control
    704  l2capoutbuf[2] = 0x01; // Length = 0
    705  l2capoutbuf[3] = credit; // Credit
    706  l2capoutbuf[4] = calcFcs(l2capoutbuf);
    707 #ifdef EXTRADEBUG
    708  Notify(PSTR(" - RFCOMM Credit Data: "), 0x80);
    709  for(uint8_t i = 0; i < 5; i++) {
    710  D_PrintHex<uint8_t > (l2capoutbuf[i], 0x80);
    711  Notify(PSTR(" "), 0x80);
    712  }
    713 #endif
    714  RFCOMM_Command(l2capoutbuf, 5);
    715 }
    716 
    717 /* CRC on 2 bytes */
    718 uint8_t SPP::crc(uint8_t *data) {
    719  return (pgm_read_byte(&rfcomm_crc_table[pgm_read_byte(&rfcomm_crc_table[0xFF ^ data[0]]) ^ data[1]]));
    720 }
    721 
    722 /* Calculate FCS */
    723 uint8_t SPP::calcFcs(uint8_t *data) {
    724  uint8_t temp = crc(data);
    725  if((data[1] & 0xEF) == RFCOMM_UIH)
    726  return (0xFF - temp); // FCS on 2 bytes
    727  else
    728  return (0xFF - pgm_read_byte(&rfcomm_crc_table[temp ^ data[2]])); // FCS on 3 bytes
    729 }
    730 
    731 /* Check FCS */
    732 bool SPP::checkFcs(uint8_t *data, uint8_t fcs) {
    733  uint8_t temp = crc(data);
    734  if((data[1] & 0xEF) != RFCOMM_UIH)
    735  temp = pgm_read_byte(&rfcomm_crc_table[temp ^ data[2]]); // FCS on 3 bytes
    736  return (pgm_read_byte(&rfcomm_crc_table[temp ^ fcs]) == 0xCF);
    737 }
    738 
    739 /* Serial commands */
    740 #if defined(ARDUINO) && ARDUINO >=100
    741 
    742 size_t SPP::write(uint8_t data) {
    743  return write(&data, 1);
    744 }
    745 #else
    746 
    747 void SPP::write(uint8_t data) {
    748  write(&data, 1);
    749 }
    750 #endif
    751 
    752 #if defined(ARDUINO) && ARDUINO >=100
    753 
    754 size_t SPP::write(const uint8_t *data, size_t size) {
    755 #else
    756 
    757 void SPP::write(const uint8_t *data, size_t size) {
    758 #endif
    759  for(uint8_t i = 0; i < size; i++) {
    760  if(sppIndex >= sizeof (sppOutputBuffer) / sizeof (sppOutputBuffer[0]))
    761  send(); // Send the current data in the buffer
    762  sppOutputBuffer[sppIndex++] = data[i]; // All the bytes are put into a buffer and then send using the send() function
    763  }
    764 #if defined(ARDUINO) && ARDUINO >=100
    765  return size;
    766 #endif
    767 }
    768 
    769 void SPP::send() {
    770  if(!connected || !sppIndex)
    771  return;
    772  uint8_t length; // This is the length of the string we are sending
    773  uint8_t offset = 0; // This is used to keep track of where we are in the string
    774 
    775  l2capoutbuf[0] = rfcommChannelConnection | 0 | 0 | extendAddress; // RFCOMM Address
    776  l2capoutbuf[1] = RFCOMM_UIH; // RFCOMM Control
    777 
    778  while(sppIndex) { // We will run this while loop until this variable is 0
    779  if(sppIndex > (sizeof (l2capoutbuf) - 4)) // Check if the string is larger than the outgoing buffer
    780  length = sizeof (l2capoutbuf) - 4;
    781  else
    782  length = sppIndex;
    783 
    784  l2capoutbuf[2] = length << 1 | 1; // Length
    785  uint8_t i = 0;
    786  for(; i < length; i++)
    787  l2capoutbuf[i + 3] = sppOutputBuffer[i + offset];
    788  l2capoutbuf[i + 3] = calcFcs(l2capoutbuf); // Calculate checksum
    789 
    790  RFCOMM_Command(l2capoutbuf, length + 4);
    791 
    792  sppIndex -= length;
    793  offset += length; // Increment the offset
    794  }
    795 }
    796 
    797 int SPP::available(void) {
    798  return rfcommAvailable;
    799 };
    800 
    801 void SPP::discard(void) {
    802  rfcommAvailable = 0;
    803 }
    804 
    805 int SPP::peek(void) {
    806  if(rfcommAvailable == 0) // Don't read if there is nothing in the buffer
    807  return -1;
    808  return rfcommDataBuffer[0];
    809 }
    810 
    811 int SPP::read(void) {
    812  if(rfcommAvailable == 0) // Don't read if there is nothing in the buffer
    813  return -1;
    814  uint8_t output = rfcommDataBuffer[0];
    815  for(uint8_t i = 1; i < rfcommAvailable; i++)
    816  rfcommDataBuffer[i - 1] = rfcommDataBuffer[i]; // Shift the buffer one left
    817  rfcommAvailable--;
    818  bytesRead++;
    819  if(bytesRead > (sizeof (rfcommDataBuffer) - 5)) { // We will send the command just before it runs out of credit
    820  bytesRead = 0;
    821  sendRfcommCredit(rfcommChannelConnection, rfcommDirection, 0, RFCOMM_UIH, 0x10, sizeof (rfcommDataBuffer)); // Send more credit
    822 #ifdef EXTRADEBUG
    823  Notify(PSTR("\r\nSent "), 0x80);
    824  Notify((uint8_t)sizeof (rfcommDataBuffer), 0x80);
    825  Notify(PSTR(" more credit"), 0x80);
    826 #endif
    827  }
    828  return output;
    829 }
    size_t write(uint8_t data)
    Definition: SPP.cpp:742
    void onInit()
    Definition: SPP.cpp:433
    const char * btdName
    Definition: BTD.h:447
    #define BT_RFCOMM_RPN_RSP
    Definition: SPP.h:44
    @@ -953,6 +124,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    void hci_disconnect(uint16_t handle)
    Definition: BTD.cpp:1171
    void Reset()
    Definition: SPP.cpp:60
    +
    void(* pFuncOnInit)(void)
    Definition: BTD.h:609
    #define L2CAP_FLAG_DISCONNECT_SDP_REQUEST
    Definition: BTD.h:151
    #define RFCOMM_UIH
    Definition: SPP.h:32
    int available(void)
    Definition: SPP.cpp:797
    @@ -1001,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_s_p_p_8h.html b/_s_p_p_8h.html index 93cd3779..48c17338 100644 --- a/_s_p_p_8h.html +++ b/_s_p_p_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPP.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,20 +89,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    SPP.h File Reference
    -
    #include "BTD.h"
    +
    #include "BTD.h"
    Include dependency graph for SPP.h:
    - + + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -360,7 +366,7 @@ Macros diff --git a/_s_p_p_8h__dep__incl.map b/_s_p_p_8h__dep__incl.map index c9e085c0..3133729f 100644 --- a/_s_p_p_8h__dep__incl.map +++ b/_s_p_p_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/_s_p_p_8h__dep__incl.md5 b/_s_p_p_8h__dep__incl.md5 index 7717c9a2..c4196b87 100644 --- a/_s_p_p_8h__dep__incl.md5 +++ b/_s_p_p_8h__dep__incl.md5 @@ -1 +1 @@ -1f51bc8d7e57994b0706c73aa078945c \ No newline at end of file +8fa503e9bcede23521cf22418b0e794e \ No newline at end of file diff --git a/_s_p_p_8h__dep__incl.png b/_s_p_p_8h__dep__incl.png index 83656373376337e4d427fc9ae73ad676f8e585d3..78a4adfd80868fa64ca15a251428258f0368fd32 100644 GIT binary patch literal 1966 zcmb_dc{JNw9uK2sg3^bIwf0U>Pic|ZHI}r9pwAN?AyLcl>>6t5sI``;Fp{>GQd9+1 zt$LL-b|RJ*r9mx?R%s)MUDfcKs2&}?>-$t3pL}QxuDX^BBFoK?hhYw2zP8qdb+ka6J)0Fc@6!T8pR; zf}MlI!Sz37=jEL^_Xcje0vf>~O|vP(RZXF2r%C(nx1e6|JohD?AayNHX7EeJ5J^I+IGJroMMo zT{dri`BHgoY%C}!$O?s$z<7B@F7}^%+R|cI*o>)vjHwR_4(?bQDT_SV4ns#m^EXRj zW@cj9Jt?uDCj>y!;A2lQ+?2jr1*6dRo@`k^eaI;p-s-BImzRRKp6mvnkN)MC+_PRS z`Ltq!20d_<-7M_n!p|_` zzzwI5SXogac#SvPGdSotzTsRWb!~OV8i{09yw@WA83u#pvp&39jv??rinFh0*^e6Y z0Xz3ASMEQ01kO1}OFmNOa=ESXd@Xr-d7BR(;|#!Qf|{C|`trFax!u_#_uaKGj!aTL zNd@(Oc@J1(_L4%OvoyJ-;gXxqHQAY-^%LY+PEVB;zV}#w%Z_dNAei z5J$eVFAG}Z5E)%dq7Pt|ZyhjKJtigbPuS8&drQ8XTXg4WyQbSz$HqxwS(5zU=Paic zJn9E-^cavoQvKCEDMaPm_Rm{sJ_m=^U%&E2u3mNBxsdv^hR&G39KtSLvT1NhbiUZv zZmbZUr~!>mnEF%Q)`hR%u-zLuV(tF%lxpgGbtHvOPgaA74SOkz=zrb+4DoLGe(PSu1}XAa92u7O4roXbYWM~qKx=vV#44VW(a5ne+>z_6;#>Obi3AFyV_lw@;V6b z(`dXvQ0rd17~OXkXljOm!&od9q)g1HU>*w&4ef3Y99i33c6-a+j%S?T-Cf6tiHrLY z2oM|&chYzQrSVb&LH5nBt%d&N<;9BQ%?>R_!KPot>eMwf6rR&Q97BP z#y*Omjg5`9ZLZgsncoaUW`2EMSzfNPX=ZHf;hqT1&!s3SDUr$K8zW0yZP$1aTPs%- z%?SAw@gjcD3t)fSKR;Y%Dbe=sL^10ai7Abqz#DWdM6?6I8{B{L#PvHxKeevz;`QsM zE#Y%{RH|-aQIWM4XS&vbPT$5&?kg0#68K>@j({-3dg?-*mc)i_rf5Cgh^K71-? zi1b_doW-ZD1R=rEw#X9ceip0i+u=cFuSPPC9w5YMQr7%$?Hvge1%&mM{#sxT3}6t_ L))~=YgH8D-Zt2l! literal 2228 zcmbuBX)qgFAI3we*os)P#UzcRqcW{4O*o3wIQ}!9Z|GV`>uAWpq9|qRxhfy zh6s6WEf-BwOIuW|4cB&4mEPRBGw*vpyx-nAbI$+6IcMgX`9II^oHQiDT37%i0001l zZQvFToa)G#;lPue)hGR038$R&v9q=S{QPS??XAlP0Dyru7N$3&2wP=ga0yp1m9$aR z>C_b{0J;5WvCu5qTS9^eKj?Xe#pBg_&v$u&C{2$PYnAuRqAV!Nu;U6Mq+BooiLu2NmGEy02s%#dsvf$W8U?bl;hO&WQEu(`UfCNymC5oz@6~y`=@u zDZ$XAD8mFWzh=Ioo2vQiYsn3HAoS(Z+_Ey^((#qySP4rvH`$TVQ59-^jr@4nd{|i&RIYFcGNuM+9P+{VCC8VTA=9jydcb2HQMIrWNP@Sbz>k9Q4YSthqTiYd1?vUNV_% zVo^dMB=&om*x2wxAP~R7D4Cq1`xuNmqRb$vq~r{`{Wf)BZ+TeUp5Rn(iA0LVCnSi; z$qAPsQWh3GTr{Lm(1oFD?c?L)Uw^V6#D3o!o|FQEMXD!Pjnpcd1INe5J0+*+^t8-O zAz6ca!1ng`yAD|XoRR5`{nhn#@|S^>O4^3EE(i*R?p!B~2PDh{B@O!YfB0}_WMo8C zMkZr_gEpFu8k?%SVejsq)zf2iM(E_E){J=6y|HU>c-$n~0*AY5U|_Jl{l(m^H(HX# zV!;uJNJ^Q}{ok31PL1UEjjr}cq(bxsHE4#7om~QnboF49egaTZUT$S#0?5dDr7WKx z*h-&x|2~;Qv7ihNDr#z;!sGGJoOHLC%S3+_Q3{-m+_9?p^L(|5E zJpcEba{Bc2@)|*+|A&g6K23*(jYtm13w_c4hiN#r{MU_-G9ZvqZpz{+lUYm>v#Dus zFPsj##N{&SKl4K2x1gWxi%h{drL$*=>xxQUDxG6k=7O-PsELJo*XsVv1p1*_%u&50 zF07TVaZ3b{l!K4=qV~p=0pel~*?V^{|IDoNzYHT$>TWmz;)bV_v^%8lhbBEKc2 zhBFXUfjcU~gToEYxRdSCthUWavpWo#%p9Cse?v{B9$s~-B0FOAs{;4>Mxpb%d>IVO z3kEA_XiT(d0wX^Jd%g^v2iX%&zk{i~D~-wUe0V>(0>>5^8e(s4-DL9{hrK=hA1wTj z#{A8T|9c}Z30twTAKg5s%naVy*{QpPsp=`GE)LRY#kXBuEn&9fQFP z{PBn0(9qDt+?-JNeD)GGXEfVhSMZ&IqobqRrAxQg#cNYj;q@~PF)`iG8aq4jRaI58 z8vt~8I8tKwV9S-;gmW;@w}1zr4ayQMt-1OuMxUFT8;L@t9Wp-|emwX#p8*S7(3=ls ziy6i%yp}i%a-fy87hAMBMl9(MD0*fMPArqG^V<;Gv`Q2q6_N$`ce8 zR=2q5^YK-P%=4L`7mbaQg%q;?{`yQ?*e7FqlwBGM9vrMO-y1_~S)kDvE?`+%Wx(Fz zprAEr5?!;pimrQbx9_z7x1upTUb^f4t}1{0XLRfA)=ebRL`+Pq3g&@GCzK@p!D88C zv4?pNcF7G+_0?OfUB)tl!Dzd2%5L~x{a6~1nk{FJ#dcI*CpvuTdvpRpHIqtAN%8gb zqqML$>8)WSvEktpJG*^-0P?_q%6@0Mt2V9CHKn0JqlQSVY-tf27#KifFbRk{^XTZV z+2IRAUKhQBf&>7M@%S{sUo@ZA)$v`qaz!s?01fl zkEaWvj-otWQ9DY5RBFCeb>(;|Y>K1Q(x1o5|INjrfYw|@UG?^MxPXvQ&EDR*7T1^-}cGP*y>HzPVHVOkjmcK`qY diff --git a/_s_p_p_8h__incl.map b/_s_p_p_8h__incl.map index e0216b1a..93d857c5 100644 --- a/_s_p_p_8h__incl.map +++ b/_s_p_p_8h__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/_s_p_p_8h__incl.md5 b/_s_p_p_8h__incl.md5 index 7a7361a7..f139a88d 100644 --- a/_s_p_p_8h__incl.md5 +++ b/_s_p_p_8h__incl.md5 @@ -1 +1 @@ -cce7880029982b20bba729fb2e78917d \ No newline at end of file +ebaf4a19e87d528fa81f6393cdd2bc87 \ No newline at end of file diff --git a/_s_p_p_8h__incl.png b/_s_p_p_8h__incl.png index 27935b341c75b85a3d47e9bc4b86e94052453f3a..d35d49e02b97b4f9de4d789696f44226bf260329 100644 GIT binary patch literal 10492 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 literal 10998 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 - + USB Host Shield 2.0: SPP.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,160 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    SPP.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _spp_h_
    -
    19 #define _spp_h_
    -
    20 
    -
    21 #include "BTD.h"
    -
    22 
    -
    23 /* Used for SDP */
    -
    24 #define SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU 0x06 // See the RFCOMM specs
    -
    25 #define SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU 0x07 // See the RFCOMM specs
    -
    26 #define SERIALPORT_UUID 0x1101 // See http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm
    -
    27 #define L2CAP_UUID 0x0100
    -
    28 
    -
    29 /* Used for RFCOMM */
    -
    30 #define RFCOMM_SABM 0x2F
    -
    31 #define RFCOMM_UA 0x63
    -
    32 #define RFCOMM_UIH 0xEF
    -
    33 //#define RFCOMM_DM 0x0F
    -
    34 #define RFCOMM_DISC 0x43
    -
    35 
    -
    36 #define extendAddress 0x01 // Always 1
    -
    37 
    -
    38 // Multiplexer message types
    -
    39 #define BT_RFCOMM_PN_CMD 0x83
    -
    40 #define BT_RFCOMM_PN_RSP 0x81
    -
    41 #define BT_RFCOMM_MSC_CMD 0xE3
    -
    42 #define BT_RFCOMM_MSC_RSP 0xE1
    -
    43 #define BT_RFCOMM_RPN_CMD 0x93
    -
    44 #define BT_RFCOMM_RPN_RSP 0x91
    -
    45 /*
    -
    46 #define BT_RFCOMM_TEST_CMD 0x23
    -
    47 #define BT_RFCOMM_TEST_RSP 0x21
    -
    48 #define BT_RFCOMM_FCON_CMD 0xA3
    -
    49 #define BT_RFCOMM_FCON_RSP 0xA1
    -
    50 #define BT_RFCOMM_FCOFF_CMD 0x63
    -
    51 #define BT_RFCOMM_FCOFF_RSP 0x61
    -
    52 #define BT_RFCOMM_RLS_CMD 0x53
    -
    53 #define BT_RFCOMM_RLS_RSP 0x51
    -
    54 #define BT_RFCOMM_NSC_RSP 0x11
    -
    55  */
    -
    56 
    -
    61 class SPP : public BluetoothService, public Stream {
    -
    62 public:
    -
    69  SPP(BTD *p, const char *name = "Arduino", const char *pin = "0000");
    -
    70 
    -
    73  void disconnect();
    -
    80  operator bool() {
    -
    81  return connected;
    -
    82  }
    -
    84  bool connected;
    -
    85 
    -
    91  int available(void);
    -
    92 
    -
    94  void flush(void) {
    -
    95  send();
    -
    96  };
    -
    101  int peek(void);
    -
    106  int read(void);
    -
    107 
    -
    108 #if defined(ARDUINO) && ARDUINO >=100
    -
    109 
    -
    114  size_t write(uint8_t data);
    -
    121  size_t write(const uint8_t* data, size_t size);
    -
    123 #if !defined(RBL_NRF51822)
    -
    124  using Print::write;
    -
    125 #endif
    -
    126 #else
    -
    127 
    -
    131  void write(uint8_t data);
    -
    137  void write(const uint8_t* data, size_t size);
    -
    138 #endif
    -
    139 
    -
    141  void discard(void);
    -
    147  void send(void);
    -
    150 protected:
    -
    156  void ACLData(uint8_t* ACLData);
    -
    158  void Run();
    -
    160  void Reset();
    -
    166  void onInit();
    -
    169 private:
    -
    170  /* Set true when a channel is created */
    -
    171  bool SDPConnected;
    -
    172  bool RFCOMMConnected;
    -
    173 
    -
    174  /* Variables used by L2CAP state machines */
    -
    175  uint8_t l2cap_sdp_state;
    -
    176  uint8_t l2cap_rfcomm_state;
    -
    177 
    -
    178  uint8_t l2capoutbuf[BULK_MAXPKTSIZE]; // General purpose buffer for l2cap out data
    -
    179  uint8_t rfcommbuf[10]; // Buffer for RFCOMM Commands
    -
    180 
    -
    181  /* L2CAP Channels */
    -
    182  uint8_t sdp_scid[2]; // L2CAP source CID for SDP
    -
    183  uint8_t sdp_dcid[2]; // 0x0050
    -
    184  uint8_t rfcomm_scid[2]; // L2CAP source CID for RFCOMM
    -
    185  uint8_t rfcomm_dcid[2]; // 0x0051
    -
    186 
    -
    187  /* RFCOMM Variables */
    -
    188  uint8_t rfcommChannel;
    -
    189  uint8_t rfcommChannelConnection; // This is the channel the SPP channel will be running at
    -
    190  uint8_t rfcommDirection;
    -
    191  uint8_t rfcommCommandResponse;
    -
    192  uint8_t rfcommChannelType;
    -
    193  uint8_t rfcommPfBit;
    -
    194 
    -
    195  uint32_t timer;
    -
    196  bool waitForLastCommand;
    -
    197  bool creditSent;
    -
    198 
    -
    199  uint8_t rfcommDataBuffer[100]; // Create a 100 sized buffer for incoming data
    -
    200  uint8_t sppOutputBuffer[100]; // Create a 100 sized buffer for outgoing SPP data
    -
    201  uint8_t sppIndex;
    -
    202  uint8_t rfcommAvailable;
    -
    203 
    -
    204  bool firstMessage; // Used to see if it's the first SDP request received
    -
    205  uint8_t bytesRead; // Counter to see when it's time to send more credit
    -
    206 
    -
    207  /* State machines */
    -
    208  void SDP_task(); // SDP state machine
    -
    209  void RFCOMM_task(); // RFCOMM state machine
    -
    210 
    -
    211  /* SDP Commands */
    -
    212  void SDP_Command(uint8_t *data, uint8_t nbytes);
    -
    213  void serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    -
    214  void serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    -
    215  void serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    -
    216  void l2capResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    -
    217  void l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    -
    218 
    -
    219  /* RFCOMM Commands */
    -
    220  void RFCOMM_Command(uint8_t *data, uint8_t nbytes);
    -
    221  void sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t *data, uint8_t length);
    -
    222  void sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit);
    -
    223  uint8_t calcFcs(uint8_t *data);
    -
    224  bool checkFcs(uint8_t *data, uint8_t fcs);
    -
    225  uint8_t crc(uint8_t *data);
    -
    226 };
    -
    227 #endif
    -
    size_t write(uint8_t data)
    Definition: SPP.cpp:742
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _spp_h_
    19 #define _spp_h_
    20 
    21 #include "BTD.h"
    22 
    23 /* Used for SDP */
    24 #define SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU 0x06 // See the RFCOMM specs
    25 #define SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU 0x07 // See the RFCOMM specs
    26 #define SERIALPORT_UUID 0x1101 // See http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm
    27 #define L2CAP_UUID 0x0100
    28 
    29 /* Used for RFCOMM */
    30 #define RFCOMM_SABM 0x2F
    31 #define RFCOMM_UA 0x63
    32 #define RFCOMM_UIH 0xEF
    33 //#define RFCOMM_DM 0x0F
    34 #define RFCOMM_DISC 0x43
    35 
    36 #define extendAddress 0x01 // Always 1
    37 
    38 // Multiplexer message types
    39 #define BT_RFCOMM_PN_CMD 0x83
    40 #define BT_RFCOMM_PN_RSP 0x81
    41 #define BT_RFCOMM_MSC_CMD 0xE3
    42 #define BT_RFCOMM_MSC_RSP 0xE1
    43 #define BT_RFCOMM_RPN_CMD 0x93
    44 #define BT_RFCOMM_RPN_RSP 0x91
    45 /*
    46 #define BT_RFCOMM_TEST_CMD 0x23
    47 #define BT_RFCOMM_TEST_RSP 0x21
    48 #define BT_RFCOMM_FCON_CMD 0xA3
    49 #define BT_RFCOMM_FCON_RSP 0xA1
    50 #define BT_RFCOMM_FCOFF_CMD 0x63
    51 #define BT_RFCOMM_FCOFF_RSP 0x61
    52 #define BT_RFCOMM_RLS_CMD 0x53
    53 #define BT_RFCOMM_RLS_RSP 0x51
    54 #define BT_RFCOMM_NSC_RSP 0x11
    55  */
    56 
    61 class SPP : public BluetoothService, public Stream {
    62 public:
    69  SPP(BTD *p, const char *name = "Arduino", const char *pin = "0000");
    70 
    73  void disconnect();
    80  operator bool() {
    81  return connected;
    82  }
    84  bool connected;
    85 
    91  int available(void);
    92 
    94  void flush(void) {
    95  send();
    96  };
    101  int peek(void);
    106  int read(void);
    107 
    108 #if defined(ARDUINO) && ARDUINO >=100
    109 
    114  size_t write(uint8_t data);
    121  size_t write(const uint8_t* data, size_t size);
    123 #if !defined(RBL_NRF51822)
    124  using Print::write;
    125 #endif
    126 #else
    127 
    131  void write(uint8_t data);
    137  void write(const uint8_t* data, size_t size);
    138 #endif
    139 
    141  void discard(void);
    147  void send(void);
    150 protected:
    156  void ACLData(uint8_t* ACLData);
    158  void Run();
    160  void Reset();
    166  void onInit();
    169 private:
    170  /* Set true when a channel is created */
    171  bool SDPConnected;
    172  bool RFCOMMConnected;
    173 
    174  /* Variables used by L2CAP state machines */
    175  uint8_t l2cap_sdp_state;
    176  uint8_t l2cap_rfcomm_state;
    177 
    178  uint8_t l2capoutbuf[BULK_MAXPKTSIZE]; // General purpose buffer for l2cap out data
    179  uint8_t rfcommbuf[10]; // Buffer for RFCOMM Commands
    180 
    181  /* L2CAP Channels */
    182  uint8_t sdp_scid[2]; // L2CAP source CID for SDP
    183  uint8_t sdp_dcid[2]; // 0x0050
    184  uint8_t rfcomm_scid[2]; // L2CAP source CID for RFCOMM
    185  uint8_t rfcomm_dcid[2]; // 0x0051
    186 
    187  /* RFCOMM Variables */
    188  uint8_t rfcommChannel;
    189  uint8_t rfcommChannelConnection; // This is the channel the SPP channel will be running at
    190  uint8_t rfcommDirection;
    191  uint8_t rfcommCommandResponse;
    192  uint8_t rfcommChannelType;
    193  uint8_t rfcommPfBit;
    194 
    195  uint32_t timer;
    196  bool waitForLastCommand;
    197  bool creditSent;
    198 
    199  uint8_t rfcommDataBuffer[100]; // Create a 100 sized buffer for incoming data
    200  uint8_t sppOutputBuffer[100]; // Create a 100 sized buffer for outgoing SPP data
    201  uint8_t sppIndex;
    202  uint8_t rfcommAvailable;
    203 
    204  bool firstMessage; // Used to see if it's the first SDP request received
    205  uint8_t bytesRead; // Counter to see when it's time to send more credit
    206 
    207  /* State machines */
    208  void SDP_task(); // SDP state machine
    209  void RFCOMM_task(); // RFCOMM state machine
    210 
    211  /* SDP Commands */
    212  void SDP_Command(uint8_t *data, uint8_t nbytes);
    213  void serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    214  void serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    215  void serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    216  void l2capResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    217  void l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
    218 
    219  /* RFCOMM Commands */
    220  void RFCOMM_Command(uint8_t *data, uint8_t nbytes);
    221  void sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t *data, uint8_t length);
    222  void sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit);
    223  uint8_t calcFcs(uint8_t *data);
    224  bool checkFcs(uint8_t *data, uint8_t fcs);
    225  uint8_t crc(uint8_t *data);
    226 };
    227 #endif
    size_t write(uint8_t data)
    Definition: SPP.cpp:742
    void onInit()
    Definition: SPP.cpp:433
    SPP(BTD *p, const char *name="Arduino", const char *pin="0000")
    Definition: SPP.cpp:45
    Definition: BTD.h:201
    @@ -262,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_u_h_s2__gpio_8cpp.html b/_u_h_s2__gpio_8cpp.html index d733f2e8..644958d5 100644 --- a/_u_h_s2__gpio_8cpp.html +++ b/_u_h_s2__gpio_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UHS2_gpio.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    UHS2_gpio.cpp File Reference
    -
    #include "UHS2_gpio.h"
    +
    #include "UHS2_gpio.h"
    Include dependency graph for UHS2_gpio.cpp:
    - + + +

    Go to the source code of this file.

    @@ -100,7 +103,7 @@ Include dependency graph for UHS2_gpio.cpp:
    diff --git a/_u_h_s2__gpio_8cpp__incl.map b/_u_h_s2__gpio_8cpp__incl.map index be3fc23e..e6dfb4cc 100644 --- a/_u_h_s2__gpio_8cpp__incl.map +++ b/_u_h_s2__gpio_8cpp__incl.map @@ -1,4 +1,4 @@ - - + + diff --git a/_u_h_s2__gpio_8cpp__incl.md5 b/_u_h_s2__gpio_8cpp__incl.md5 index 7486a2d4..495959c8 100644 --- a/_u_h_s2__gpio_8cpp__incl.md5 +++ b/_u_h_s2__gpio_8cpp__incl.md5 @@ -1 +1 @@ -5cebe117c82aae024c0d654d4011616a \ No newline at end of file +5fafb4b045fd272c2cc9ebe047206021 \ No newline at end of file diff --git a/_u_h_s2__gpio_8cpp__incl.png b/_u_h_s2__gpio_8cpp__incl.png index 7cbae3c7ce469f8f4a380d187b7a9f88408b4a35..73717f561ec16ee35f88f1383c847d35ab2713ff 100644 GIT binary patch literal 4332 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 literal 4904 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 NQGcMLQUQA!@_*}oOFIAn diff --git a/_u_h_s2__gpio_8cpp_source.html b/_u_h_s2__gpio_8cpp_source.html index 3080c6d0..1c927537 100644 --- a/_u_h_s2__gpio_8cpp_source.html +++ b/_u_h_s2__gpio_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UHS2_gpio.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,70 +86,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    UHS2_gpio.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This program is free software; you can redistribute it and/or modify
    -
    4 it under the terms of the GNU General Public License as published by
    -
    5 the Free Software Foundation; either version 2 of the License, or
    -
    6 (at your option) any later version.
    -
    7 
    -
    8 This program is distributed in the hope that it will be useful,
    -
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    -
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    -
    11 GNU General Public License for more details.
    -
    12 
    -
    13 You should have received a copy of the GNU General Public License
    -
    14 along with this program; if not, write to the Free Software
    -
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    16 
    -
    17 Contact information
    -
    18 -------------------
    -
    19 
    -
    20 Circuits At Home, LTD
    -
    21 Web : http://www.circuitsathome.com
    -
    22 e-mail : support@circuitsathome.com
    -
    23 
    -
    24 UHS2_GPIO implements "wiring" style GPIO access. Implemented by Brian Walton brian@riban.co.uk
    -
    25  */
    -
    26 
    -
    27 #include "UHS2_gpio.h"
    -
    28 
    -
    32 UHS2_GPIO::UHS2_GPIO(USB *pUsb) : m_pUsb(pUsb)
    -
    33 {
    -
    34 }
    -
    35 
    -
    40 void UHS2_GPIO::digitalWrite(uint8_t pin, uint8_t val) {
    -
    41  if(pin > 7)
    -
    42  return;
    -
    43  uint8_t nValue = m_pUsb->gpioRdOutput();
    -
    44  uint8_t nMask = 1 << pin;
    -
    45  nValue &= (~nMask);
    -
    46  if(val)
    -
    47  nValue |= (nMask);
    -
    48  m_pUsb->gpioWr(nValue);
    -
    49 }
    -
    50 
    -
    55 int UHS2_GPIO::digitalRead(uint8_t pin) {
    -
    56  if(pin > 7)
    -
    57  return -1;
    -
    58  uint8_t nMask = 1 << pin;
    -
    59  uint8_t nValue = m_pUsb->gpioRd();
    -
    60  return ((nValue & nMask)?1:0);
    -
    61 }
    -
    62 
    -
    68 int UHS2_GPIO::digitalReadOutput(uint8_t pin) {
    -
    69  if(pin > 7)
    -
    70  return -1;
    -
    71  uint8_t nMask = 1 << pin;
    -
    72  uint8_t nValue = m_pUsb->gpioRdOutput();
    -
    73  return ((nValue & nMask)?1:0);
    -
    74 }
    -
    int digitalReadOutput(uint8_t pin)
    Read the value from a GPIO output pin.
    Definition: UHS2_gpio.cpp:68
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This program is free software; you can redistribute it and/or modify
    4 it under the terms of the GNU General Public License as published by
    5 the Free Software Foundation; either version 2 of the License, or
    6 (at your option) any later version.
    7 
    8 This program is distributed in the hope that it will be useful,
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11 GNU General Public License for more details.
    12 
    13 You should have received a copy of the GNU General Public License
    14 along with this program; if not, write to the Free Software
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    16 
    17 Contact information
    18 -------------------
    19 
    20 Circuits At Home, LTD
    21 Web : http://www.circuitsathome.com
    22 e-mail : support@circuitsathome.com
    23 
    24 UHS2_GPIO implements "wiring" style GPIO access. Implemented by Brian Walton brian@riban.co.uk
    25  */
    26 
    27 #include "UHS2_gpio.h"
    28 
    32 UHS2_GPIO::UHS2_GPIO(USB *pUsb) : m_pUsb(pUsb)
    33 {
    34 }
    35 
    40 void UHS2_GPIO::digitalWrite(uint8_t pin, uint8_t val) {
    41  if(pin > 7)
    42  return;
    43  uint8_t nValue = m_pUsb->gpioRdOutput();
    44  uint8_t nMask = 1 << pin;
    45  nValue &= (~nMask);
    46  if(val)
    47  nValue |= (nMask);
    48  m_pUsb->gpioWr(nValue);
    49 }
    50 
    55 int UHS2_GPIO::digitalRead(uint8_t pin) {
    56  if(pin > 7)
    57  return -1;
    58  uint8_t nMask = 1 << pin;
    59  uint8_t nValue = m_pUsb->gpioRd();
    60  return ((nValue & nMask)?1:0);
    61 }
    62 
    68 int UHS2_GPIO::digitalReadOutput(uint8_t pin) {
    69  if(pin > 7)
    70  return -1;
    71  uint8_t nMask = 1 << pin;
    72  uint8_t nValue = m_pUsb->gpioRdOutput();
    73  return ((nValue & nMask)?1:0);
    74 }
    int digitalReadOutput(uint8_t pin)
    Read the value from a GPIO output pin.
    Definition: UHS2_gpio.cpp:68
    int digitalRead(uint8_t pin)
    Read the value from a GPIO input pin.
    Definition: UHS2_gpio.cpp:55
    -
    uint8_t gpioRdOutput()
    Reads the current GPI output values.
    Definition: usbhost.h:403
    -
    void gpioWr(uint8_t data)
    Definition: usbhost.h:275
    -
    uint8_t gpioRd()
    Reads the current GPI input values.
    Definition: usbhost.h:390
    +
    uint8_t gpioRdOutput()
    Reads the current GPI output values.
    Definition: usbhost.h:397
    +
    void gpioWr(uint8_t data)
    Definition: usbhost.h:269
    +
    uint8_t gpioRd()
    Reads the current GPI input values.
    Definition: usbhost.h:384
    void digitalWrite(uint8_t pin, uint8_t val)
    Set a GPIO output value.
    Definition: UHS2_gpio.cpp:40
    UHS2_GPIO(USB *pUsb)
    Implement an instance of a UHS2_GPIO object.
    Definition: UHS2_gpio.cpp:32
    Definition: UsbCore.h:210
    @@ -157,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_u_h_s2__gpio_8h.html b/_u_h_s2__gpio_8h.html index 9e6dad32..77a08868 100644 --- a/_u_h_s2__gpio_8h.html +++ b/_u_h_s2__gpio_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UHS2_gpio.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,20 +88,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    UHS2_gpio.h File Reference
    -
    #include "Usb.h"
    +
    #include "Usb.h"
    Include dependency graph for UHS2_gpio.h:
    - + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -115,7 +118,7 @@ Classes diff --git a/_u_h_s2__gpio_8h__dep__incl.map b/_u_h_s2__gpio_8h__dep__incl.map index 1c7a5990..40c1ea6a 100644 --- a/_u_h_s2__gpio_8h__dep__incl.map +++ b/_u_h_s2__gpio_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/_u_h_s2__gpio_8h__dep__incl.md5 b/_u_h_s2__gpio_8h__dep__incl.md5 index dce6d804..775c25d5 100644 --- a/_u_h_s2__gpio_8h__dep__incl.md5 +++ b/_u_h_s2__gpio_8h__dep__incl.md5 @@ -1 +1 @@ -51334fbe4521a42c144b2eda1f0a1d4e \ No newline at end of file +06938a8200dab1f59b6abb10b81505aa \ No newline at end of file diff --git a/_u_h_s2__gpio_8h__dep__incl.png b/_u_h_s2__gpio_8h__dep__incl.png index 09b087eb089126b4c870d27e3685eaf73eb86513..d862a7fbc53ed3c53f3cb4bdd1f6298ace8d9e72 100644 GIT binary patch literal 3182 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 Y18Y~!h`tpDejq@mMpq5r!kwS|2N%OFFaQ7m literal 3315 zcmcIn`9G9j8=j<1MAovazF}sNC1l2$G$LD;u{FL3Q3he`Qxt}f7#cCkSl;Yo-$xjG zgfNyNWwP&E_V?+Bcl!h0=lMM6e9rmdJokOhbzj$Ya7G4q*;x2lKp+sCE<)P`=!1dJ z<17=<)&>hk|QGg5gHl^i6JcU5(i3AHrIZG5O z-4y(YjHJ`)a)c*-en=?qNszaSt${(T$tMN=7y-p69MM$$>(8Ve>Q|f21FI^sj0f=E zA%4os8>__>Q7Dw?XgvfX5(zCVDr!r~GAp?#4_+czCfr0)g=Klm&q_-vEiXQmIm?hScV%mbNxjwHMWqT_WmXm4}$3 zqVN9pQp5!zR~MH?6Xv+KyrQBw9L|3x4P%h1EUTtw&@F%U>Qw@PfTkQ)Xo$9d`Ervm zo|2OCQtNMR?Uqjua-RH-=acTe#Cp2^A-Y8JufG`4G7Ww^bj)zRWvM&8rnvY9J3BiF zguf>R1_!KB`N;G_+uByA()-&UYd@$N85zwH>_t}Px%KsFzsr@eM+Y}OHKo~w+!v?) z-@jX^)Qi@hzKgV}>FLc@0W=5{9ue_0gNe2sByO;!pT51j)+SPIBmJ<2vUoadDo*|A z?D_NOfm~QwU*m9+P-tQoBS=kT>|;%hm2@(iR;($VTw7K3POv5?$C=TI_w%Gi@%*mH z$q}!ZVlW0LC*y|I12$c}yxulX+1-&&)_X$r^zk_bGLqmf6*)vXlx_e(OY`d(q|@({ z`k;h+w~aSxWQVl0G-SNi$9xne#NM6>l9ZUp&C46IJ>o1WDJide2IS}G=k4P&MGf3p zo*H8phBqoMPg3G^TaY#0lK6W|OH0%!RaI4YclUw7ifT{R_x_U=Pv7fbcXM%>U0N~& z<1b&nJT*0?mjoqjX`BwbC@g%`A)cGG}0yKO9)#1d`8@msIRYYQ{vc>egFMSEiusdyrKrHTHmFOUUfA7 zv>w^}$o5J+^q2ql@bJ?Z3TNJ&YG%@^AE7yE0q`t(W0 zCqQTAcDrQ2^&t(y6$JIg-dY1Cb4&k|nn%@QHxP|uhLz6#b#0+od_`4t^w+PzgoNwvEdws!*1fn; zukJ*v`pd|m33F3tmtAmp6uhY2E9JVfi8Uu<4D^Zy&1`=Mt%KR-_lT)suSXc@3^b$KWUsuCvVNxqIYq>*{tS z^2<^FE6(Cp*ek8aXmt9g)}V#cvm9YEXoD?88qhI&x1-l_amRZLMSx<8iZ%`pTY&KoYrH%DC|DJKtm)}GksT23aD0s0~mi5(ps58eudigMywy1JsN z_DiGXdU=DPZI3%0(;t8fE@~byc&vHQLzsLf(CFx>Q|<{+Sy>q?muQ8#xw%)h&E30g z053T{dPJ`e|_5{N95PlNL@0!r7# z#Yqyb*}anZQhwkZnO=N9=g<;bP-hrXr5-986B7gMhqCfJ9a5T#PZVwN`*%B6*WAj= zN?`g{0B|mAZw7JWzd5$yzI`vr5A;s&E=vAI4-K3O+1UvguiBa# z6;aXWS|9DM_`x4qTaV!(76*riz+WPFRaI0{dS@`czPW?*A3l62D^uXUv$4KjW+fGs z!HK(e?V2`_>frn^3LCsKQ9t{0gZ>AG&NrRj!{yb~ju^?P)6C3Y=e$Kk(y!i)o%L2p zNXi)&J^PkO6z1e?vb$lPkBm=Ai3)aJn4j-X=TfExcr-LL01jrX;wgY82Qu+51 z8z+1pfp{+TjpAfXF+^vN;DNBUb#%6OcK+C>g-}|Dqru96V-^p5 zO|2e4(=v^GvV2TwQOc^AA&FBmT9WC73;jpRt`|B-Mq?9b%;i=>{QURw{hRh%V+1hE x - + diff --git a/_u_h_s2__gpio_8h__incl.md5 b/_u_h_s2__gpio_8h__incl.md5 index 29b3251d..56f165c8 100644 --- a/_u_h_s2__gpio_8h__incl.md5 +++ b/_u_h_s2__gpio_8h__incl.md5 @@ -1 +1 @@ -2c9161c2a6abcd83c0adca7c1b8a33b7 \ No newline at end of file +e72e517fae3443dc9284720e8b3abfc0 \ No newline at end of file diff --git a/_u_h_s2__gpio_8h__incl.png b/_u_h_s2__gpio_8h__incl.png index 3623a86f58770bbaa076359d91dbc72b50912e9d..c397057d0c7be44c7d1b8177afe2ce12b194c870 100644 GIT binary patch literal 2339 zcmb_eXH=8R7X4641PRS&p-aD_;6p%#U@(SWgghi5L6Kg>2;@R&v2dvZk!Fmcgc2}7 z2nYrd4It8_1XOyF&Z9|?W})1V^~(M8e!e|x&RJ{9nptPh*=OQytWAUkB?SQh5H>SK zqCk%W`(4NZ&>H$QdV-GM)xrb`?Cm$|+oCi8fDD)+FWccWm$UpWQ~l)XHE+NY2=WJ` z5U}qreCMPi#SKhGN66lv^unPt4Wu!QW6;xvqYObY<(T2QssgA*S{}&o4YY zoNni9ZJmtBt?w%|lox%}WKR3&u0^BKWb}g*&1tS14g&c-&u!Gg!omQ6PN%z83~)G{ z;N4$aE7dGkS4RiZ$S4aIss)3MM4w-r&#d(yW+fyfq@<+KXvzYkF)=ZDd3n;fSD|aO z)6?!jK|yYAQ|%x=#b!G6(uD*dwadD+0q9JXqSUyxS#9u<>loI3%MNRwYATm$2GW|J$^VI={l&CVNM3=ZA&**BFe#8k^{ZH${FTY5c?=V`Gka2 zkN)t`Izj1#LLjZ3oib8VPK}i6`iv?=8Y;;+f2PPMG?a`~n4qx2MMkhLE-r+9um^7w zer@_YIXU_G&^_*4E9v#{@K9D(PDX!SUtb5gs?fSoJ~UG0lh)vJ_w3`wiGkpHhdP3R zJ$Gv>Wcy^$eRXwG<3u8n=+pROeJmJg=$??xjb%+NuiL*j<&X|3%w=L``~+d-PzW*!mnS$t63IK zz|c^g9UT$7+m6isn{UH(^zSQ0o37w^S<_v?)CV)hTg}p8->v}3<>BgKXepgeezuQdI^E2|qLDH}IK5 zA%Q_bZv)@#T=V_AAg(&G3z4e@xSLdx2X0a2ugZ}Kmx z(AU=P5!?qC;r!t26`@QDVrmt+xB{cQ(0D?`Iu>zB) z)#m;qG)l)5O#jk~lMnx^K>v@4Ke|Jn_`Q_-@L{+5#W!U{lBXabDkk>OKeer(Zf{qU zR6FLk%HR*U$HN0W&2s+dlJtvWX_?-MnY=tZg?44!^|)lHu!soHefR2(7P%8WJ-M<_ zA1l%88o)TSZgP8jsdZy5-`#6(;Rn8tw`V2+8DKn>;QzMAd+04?9Nk_%kf+)%TbY_};b%d0W{|{LuDl%PAsG z5yC!6vKHCi+3GwZNJgBb72FnvLcawgttX@cc>qVpRnN-7+x!Z)nbmFqM-exj%9RwS zNOA<~v(DM|^_y>G9#tBqfYMo^D)#!Ao`EnRdSrTKlYHgMm6z8U!$r}7Z7E2FHuo0= z1xnSN!%<$G>}%JqHE;p-GfFBddISyKfcqgv!(PGO?EN|dvdC8I-+Y(v7YU2eY}>f_ zMy3C&xZ>y6zvieJLShd;M1Gq-l*1|N@rKE+488Qj??ek7b2xo;vqh@Cy*;=^S6iEl zhe;+qNl(|-(wd|{UN*F;2@MTxYH9*iJ2EnIXJ-c=iAML2kB@V?T*`SYd!yQvC~JVC z+wn);n(N8}Q$Jg9P}UOy0O{s4#gWo>fi)wb;MRq2brt`P!yQp4CMF_{jfb)>GyC0U zK+%*;V)<5?)5KE+m<$XY4lk+maKvEVGvmJ0hA@kYRCRTO*Je9KQGfSp;IFsUqGdf&wnZcO9F^f8O2m8_4#v%-)L>f%3?n=$ygBpZgv3x z*|PA{JWemmQf0XA9{k4DZnq1^Yxpmu1flKipHV1NQ&ao1)3q<3>`tC0)Lu=&WA{8PzNrgv*Frdv$WpC$x0^uvDP|93LC?(sZ_ WMB94}75jm|9>C1V8d-*LdH5$F>3XLC literal 2595 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 - + USB Host Shield 2.0: UHS2_gpio.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,51 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    UHS2_gpio.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This program is free software; you can redistribute it and/or modify
    -
    4 it under the terms of the GNU General Public License as published by
    -
    5 the Free Software Foundation; either version 2 of the License, or
    -
    6 (at your option) any later version.
    -
    7 
    -
    8 This program is distributed in the hope that it will be useful,
    -
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    -
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    -
    11 GNU General Public License for more details.
    -
    12 
    -
    13 You should have received a copy of the GNU General Public License
    -
    14 along with this program; if not, write to the Free Software
    -
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    16 
    -
    17 Contact information
    -
    18 -------------------
    -
    19 
    -
    20 Circuits At Home, LTD
    -
    21 Web : http://www.circuitsathome.com
    -
    22 e-mail : support@circuitsathome.com
    -
    23 
    -
    24 UHS2_GPIO implements "wiring" style GPIO access. Implemented by Brian Walton brian@riban.co.uk
    -
    25  */
    -
    26 
    -
    27 #if !defined(__USB2_GPIO_H__)
    -
    28 #define __USB2_GPIO_H__
    -
    29 
    -
    30 #include "Usb.h"
    -
    31 
    -
    32 class UHS2_GPIO {
    -
    33 public:
    -
    34  UHS2_GPIO(USB *pUsb);
    -
    35 
    -
    36  void digitalWrite(uint8_t pin, uint8_t val);
    -
    37  int digitalRead(uint8_t pin);
    -
    38  int digitalReadOutput(uint8_t pin);
    -
    39 
    -
    40 private:
    -
    41  USB* m_pUsb;
    -
    42 };
    -
    43 
    -
    44 #endif // __USB2_GPIO_H__
    -
    int digitalReadOutput(uint8_t pin)
    Read the value from a GPIO output pin.
    Definition: UHS2_gpio.cpp:68
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This program is free software; you can redistribute it and/or modify
    4 it under the terms of the GNU General Public License as published by
    5 the Free Software Foundation; either version 2 of the License, or
    6 (at your option) any later version.
    7 
    8 This program is distributed in the hope that it will be useful,
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11 GNU General Public License for more details.
    12 
    13 You should have received a copy of the GNU General Public License
    14 along with this program; if not, write to the Free Software
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    16 
    17 Contact information
    18 -------------------
    19 
    20 Circuits At Home, LTD
    21 Web : http://www.circuitsathome.com
    22 e-mail : support@circuitsathome.com
    23 
    24 UHS2_GPIO implements "wiring" style GPIO access. Implemented by Brian Walton brian@riban.co.uk
    25  */
    26 
    27 #if !defined(__USB2_GPIO_H__)
    28 #define __USB2_GPIO_H__
    29 
    30 #include "Usb.h"
    31 
    32 class UHS2_GPIO {
    33 public:
    34  UHS2_GPIO(USB *pUsb);
    35 
    36  void digitalWrite(uint8_t pin, uint8_t val);
    37  int digitalRead(uint8_t pin);
    38  int digitalReadOutput(uint8_t pin);
    39 
    40 private:
    41  USB* m_pUsb;
    42 };
    43 
    44 #endif // __USB2_GPIO_H__
    int digitalReadOutput(uint8_t pin)
    Read the value from a GPIO output pin.
    Definition: UHS2_gpio.cpp:68
    int digitalRead(uint8_t pin)
    Read the value from a GPIO input pin.
    Definition: UHS2_gpio.cpp:55
    void digitalWrite(uint8_t pin, uint8_t val)
    Set a GPIO output value.
    Definition: UHS2_gpio.cpp:40
    @@ -141,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_usb_8cpp.html b/_usb_8cpp.html index c75ed938..e37ba3d0 100644 --- a/_usb_8cpp.html +++ b/_usb_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Usb.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Usb.cpp File Reference
    -
    #include "Usb.h"
    +
    #include "Usb.h"
    Include dependency graph for Usb.cpp:
    - + +

    Go to the source code of this file.

    @@ -100,7 +102,7 @@ Include dependency graph for Usb.cpp:
    diff --git a/_usb_8cpp__incl.map b/_usb_8cpp__incl.map index 7b104a59..bfb3e69f 100644 --- a/_usb_8cpp__incl.map +++ b/_usb_8cpp__incl.map @@ -1,3 +1,3 @@ - + diff --git a/_usb_8cpp__incl.md5 b/_usb_8cpp__incl.md5 index e440b831..f71e6530 100644 --- a/_usb_8cpp__incl.md5 +++ b/_usb_8cpp__incl.md5 @@ -1 +1 @@ -86d6ea84d3f0ddc03b2836246a892476 \ No newline at end of file +983a9d4c5eeb9a3736dcb2d9192937eb \ No newline at end of file diff --git a/_usb_8cpp__incl.png b/_usb_8cpp__incl.png index bb5ebe3366f4fd32185e76081d7e58354b4f036c..6eb1063189f8dbe96d7a1b89d5c9321e0b6b02b9 100644 GIT binary patch literal 1752 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 - + USB Host Shield 2.0: Usb.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,851 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Usb.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 /* USB functions */
    -
    18 
    -
    19 #include "Usb.h"
    -
    20 
    -
    21 static uint8_t usb_error = 0;
    -
    22 static uint8_t usb_task_state;
    -
    23 
    -
    24 /* constructor */
    -
    25 USB::USB() : bmHubPre(0) {
    -
    26  usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; //set up state machine
    -
    27  init();
    -
    28 }
    -
    29 
    -
    30 /* Initialize data structures */
    -
    31 void USB::init() {
    -
    32  //devConfigIndex = 0;
    -
    33  bmHubPre = 0;
    -
    34 }
    -
    35 
    -
    36 uint8_t USB::getUsbTaskState(void) {
    -
    37  return ( usb_task_state);
    -
    38 }
    -
    39 
    -
    40 void USB::setUsbTaskState(uint8_t state) {
    -
    41  usb_task_state = state;
    -
    42 }
    -
    43 
    -
    44 EpInfo* USB::getEpInfoEntry(uint8_t addr, uint8_t ep) {
    -
    45  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
    -
    46 
    -
    47  if(!p || !p->epinfo)
    -
    48  return NULL;
    -
    49 
    -
    50  EpInfo *pep = p->epinfo;
    -
    51 
    -
    52  for(uint8_t i = 0; i < p->epcount; i++) {
    -
    53  if((pep)->epAddr == ep)
    -
    54  return pep;
    -
    55 
    -
    56  pep++;
    -
    57  }
    -
    58  return NULL;
    -
    59 }
    -
    60 
    -
    61 /* set device table entry */
    -
    62 
    -
    63 /* each device is different and has different number of endpoints. This function plugs endpoint record structure, defined in application, to devtable */
    -
    64 uint8_t USB::setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr) {
    -
    65  if(!eprecord_ptr)
    - -
    67 
    -
    68  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
    -
    69 
    -
    70  if(!p)
    - -
    72 
    -
    73  p->address.devAddress = addr;
    -
    74  p->epinfo = eprecord_ptr;
    -
    75  p->epcount = epcount;
    -
    76 
    -
    77  return 0;
    -
    78 }
    -
    79 
    -
    80 uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit) {
    -
    81  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
    -
    82 
    -
    83  if(!p)
    - -
    85 
    -
    86  if(!p->epinfo)
    - -
    88 
    -
    89  *ppep = getEpInfoEntry(addr, ep);
    -
    90 
    -
    91  if(!*ppep)
    - -
    93 
    -
    94  *nak_limit = (0x0001UL << (((*ppep)->bmNakPower > USB_NAK_MAX_POWER) ? USB_NAK_MAX_POWER : (*ppep)->bmNakPower));
    -
    95  (*nak_limit)--;
    -
    96  /*
    -
    97  USBTRACE2("\r\nAddress: ", addr);
    -
    98  USBTRACE2(" EP: ", ep);
    -
    99  USBTRACE2(" NAK Power: ",(*ppep)->bmNakPower);
    -
    100  USBTRACE2(" NAK Limit: ", nak_limit);
    -
    101  USBTRACE("\r\n");
    -
    102  */
    -
    103  regWr(rPERADDR, addr); //set peripheral address
    -
    104 
    -
    105  uint8_t mode = regRd(rMODE);
    -
    106 
    -
    107  //Serial.print("\r\nMode: ");
    -
    108  //Serial.println( mode, HEX);
    -
    109  //Serial.print("\r\nLS: ");
    -
    110  //Serial.println(p->lowspeed, HEX);
    -
    111 
    -
    112 
    -
    113 
    -
    114  // Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise
    -
    115  regWr(rMODE, (p->lowspeed) ? mode | bmLOWSPEED | bmHubPre : mode & ~(bmHUBPRE | bmLOWSPEED));
    -
    116 
    -
    117  return 0;
    -
    118 }
    -
    119 
    -
    120 /* Control transfer. Sets address, endpoint, fills control packet with necessary data, dispatches control packet, and initiates bulk IN transfer, */
    -
    121 /* depending on request. Actual requests are defined as inlines */
    -
    122 /* return codes: */
    -
    123 /* 00 = success */
    -
    124 
    -
    125 /* 01-0f = non-zero HRSLT */
    -
    126 uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
    -
    127  uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) {
    -
    128  bool direction = false; //request direction, IN or OUT
    -
    129  uint8_t rcode;
    -
    130  SETUP_PKT setup_pkt;
    -
    131 
    -
    132  EpInfo *pep = NULL;
    -
    133  uint16_t nak_limit = 0;
    -
    134 
    -
    135  rcode = SetAddress(addr, ep, &pep, &nak_limit);
    -
    136 
    -
    137  if(rcode)
    -
    138  return rcode;
    -
    139 
    -
    140  direction = ((bmReqType & 0x80) > 0);
    -
    141 
    -
    142  /* fill in setup packet */
    -
    143  setup_pkt.ReqType_u.bmRequestType = bmReqType;
    -
    144  setup_pkt.bRequest = bRequest;
    -
    145  setup_pkt.wVal_u.wValueLo = wValLo;
    -
    146  setup_pkt.wVal_u.wValueHi = wValHi;
    -
    147  setup_pkt.wIndex = wInd;
    -
    148  setup_pkt.wLength = total;
    -
    149 
    -
    150  bytesWr(rSUDFIFO, 8, (uint8_t*) & setup_pkt); //transfer to setup packet FIFO
    -
    151 
    -
    152  rcode = dispatchPkt(tokSETUP, ep, nak_limit); //dispatch packet
    -
    153 
    -
    154  if(rcode) //return HRSLT if not zero
    -
    155  return ( rcode);
    -
    156 
    -
    157  if(dataptr != NULL) //data stage, if present
    -
    158  {
    -
    159  if(direction) //IN transfer
    -
    160  {
    -
    161  uint16_t left = total;
    -
    162 
    -
    163  pep->bmRcvToggle = 1; //bmRCVTOG1;
    -
    164 
    -
    165  while(left) {
    -
    166  // Bytes read into buffer
    -
    167 #if defined(ESP8266) || defined(ESP32)
    -
    168  yield(); // needed in order to reset the watchdog timer on the ESP8266
    -
    169 #endif
    -
    170  uint16_t read = nbytes;
    -
    171  //uint16_t read = (left<nbytes) ? left : nbytes;
    -
    172 
    -
    173  rcode = InTransfer(pep, nak_limit, &read, dataptr);
    -
    174  if(rcode == hrTOGERR) {
    -
    175  // yes, we flip it wrong here so that next time it is actually correct!
    -
    176  pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
    -
    177  continue;
    -
    178  }
    -
    179 
    -
    180  if(rcode)
    -
    181  return rcode;
    -
    182 
    -
    183  // Invoke callback function if inTransfer completed successfully and callback function pointer is specified
    -
    184  if(!rcode && p)
    -
    185  ((USBReadParser*)p)->Parse(read, dataptr, total - left);
    -
    186 
    -
    187  left -= read;
    -
    188 
    -
    189  if(read < nbytes)
    -
    190  break;
    -
    191  }
    -
    192  } else //OUT transfer
    -
    193  {
    -
    194  pep->bmSndToggle = 1; //bmSNDTOG1;
    -
    195  rcode = OutTransfer(pep, nak_limit, nbytes, dataptr);
    -
    196  }
    -
    197  if(rcode) //return error
    -
    198  return ( rcode);
    -
    199  }
    -
    200  // Status stage
    -
    201  return dispatchPkt((direction) ? tokOUTHS : tokINHS, ep, nak_limit); //GET if direction
    -
    202 }
    -
    203 
    -
    204 /* IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
    -
    205 /* Keep sending INs and writes data to memory area pointed by 'data' */
    -
    206 
    -
    207 /* rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error,
    -
    208  fe USB xfer timeout */
    -
    209 uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) {
    -
    210  EpInfo *pep = NULL;
    -
    211  uint16_t nak_limit = 0;
    -
    212 
    -
    213  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
    -
    214 
    -
    215  if(rcode) {
    -
    216  USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81);
    -
    217  USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81);
    -
    218  USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81);
    -
    219  return rcode;
    -
    220  }
    -
    221  return InTransfer(pep, nak_limit, nbytesptr, data, bInterval);
    -
    222 }
    -
    223 
    -
    224 uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) {
    -
    225  uint8_t rcode = 0;
    -
    226  uint8_t pktsize;
    -
    227 
    -
    228  uint16_t nbytes = *nbytesptr;
    -
    229  //printf("Requesting %i bytes ", nbytes);
    -
    230  uint8_t maxpktsize = pep->maxPktSize;
    -
    231 
    -
    232  *nbytesptr = 0;
    -
    233  regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
    -
    234 
    -
    235  // use a 'break' to exit this loop
    -
    236  while(1) {
    -
    237 #if defined(ESP8266) || defined(ESP32)
    -
    238  yield(); // needed in order to reset the watchdog timer on the ESP8266
    -
    239 #endif
    -
    240  rcode = dispatchPkt(tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS.
    -
    241  if(rcode == hrTOGERR) {
    -
    242  // yes, we flip it wrong here so that next time it is actually correct!
    -
    243  pep->bmRcvToggle = (regRd(rHRSL) & bmRCVTOGRD) ? 0 : 1;
    -
    244  regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
    -
    245  continue;
    -
    246  }
    -
    247  if(rcode) {
    -
    248  //printf(">>>>>>>> Problem! dispatchPkt %2.2x\r\n", rcode);
    -
    249  break; //should be 0, indicating ACK. Else return error code.
    -
    250  }
    -
    251  /* check for RCVDAVIRQ and generate error if not present
    -
    252  * the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred.
    -
    253  * Need to add handling for that
    -
    254  *
    -
    255  * NOTE: I've seen this happen with SPI corruption -- xxxajk
    -
    256  */
    -
    257  if((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) {
    -
    258  //printf(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n");
    -
    259  rcode = 0xf0; //receive error
    -
    260  break;
    -
    261  }
    -
    262  pktsize = regRd(rRCVBC); //number of received bytes
    -
    263  //printf("Got %i bytes \r\n", pktsize);
    -
    264  // This would be OK, but...
    -
    265  //assert(pktsize <= nbytes);
    -
    266  if(pktsize > nbytes) {
    -
    267  // This can happen. Use of assert on Arduino locks up the Arduino.
    -
    268  // So I will trim the value, and hope for the best.
    -
    269  //printf(">>>>>>>> Problem! Wanted %i bytes but got %i.\r\n", nbytes, pktsize);
    -
    270  pktsize = nbytes;
    -
    271  }
    -
    272 
    -
    273  int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr);
    -
    274 
    -
    275  if(mem_left < 0)
    -
    276  mem_left = 0;
    -
    277 
    -
    278  data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data);
    -
    279 
    -
    280  regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer
    -
    281  *nbytesptr += pktsize; // add this packet's byte count to total transfer length
    -
    282 
    -
    283  /* The transfer is complete under two conditions: */
    -
    284  /* 1. The device sent a short packet (L.T. maxPacketSize) */
    -
    285  /* 2. 'nbytes' have been transferred. */
    -
    286  if((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) // have we transferred 'nbytes' bytes?
    -
    287  {
    -
    288  // Save toggle value
    -
    289  pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0;
    -
    290  //printf("\r\n");
    -
    291  rcode = 0;
    -
    292  break;
    -
    293  } else if(bInterval > 0)
    -
    294  delay(bInterval); // Delay according to polling interval
    -
    295  } //while( 1 )
    -
    296  return ( rcode);
    -
    297 }
    -
    298 
    -
    299 /* OUT transfer to arbitrary endpoint. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
    -
    300 /* Handles NAK bug per Maxim Application Note 4000 for single buffer transfer */
    -
    301 
    -
    302 /* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */
    -
    303 uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) {
    -
    304  EpInfo *pep = NULL;
    -
    305  uint16_t nak_limit = 0;
    -
    306 
    -
    307  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
    -
    308 
    -
    309  if(rcode)
    -
    310  return rcode;
    -
    311 
    -
    312  return OutTransfer(pep, nak_limit, nbytes, data);
    -
    313 }
    -
    314 
    -
    315 uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) {
    -
    316  uint8_t rcode = hrSUCCESS, retry_count;
    -
    317  uint8_t *data_p = data; //local copy of the data pointer
    -
    318  uint16_t bytes_tosend, nak_count;
    -
    319  uint16_t bytes_left = nbytes;
    -
    320 
    -
    321  uint8_t maxpktsize = pep->maxPktSize;
    -
    322 
    -
    323  if(maxpktsize < 1 || maxpktsize > 64)
    - -
    325 
    -
    326  uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT;
    -
    327 
    -
    328  regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
    -
    329 
    -
    330  while(bytes_left) {
    -
    331 #if defined(ESP8266) || defined(ESP32)
    -
    332  yield(); // needed in order to reset the watchdog timer on the ESP8266
    -
    333 #endif
    -
    334  retry_count = 0;
    -
    335  nak_count = 0;
    -
    336  bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left;
    -
    337  bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO
    -
    338  regWr(rSNDBC, bytes_tosend); //set number of bytes
    -
    339  regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet
    -
    340  while(!(regRd(rHIRQ) & bmHXFRDNIRQ)){
    -
    341 #if defined(ESP8266) || defined(ESP32)
    -
    342  yield(); // needed in order to reset the watchdog timer on the ESP8266
    -
    343 #endif
    -
    344  } //wait for the completion IRQ
    -
    345  regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
    -
    346  rcode = (regRd(rHRSL) & 0x0f);
    -
    347 
    -
    348  while(rcode && ((int32_t)((uint32_t)millis() - timeout) < 0L)) {
    -
    349 #if defined(ESP8266) || defined(ESP32)
    -
    350  yield(); // needed in order to reset the watchdog timer on the ESP8266
    -
    351 #endif
    -
    352  switch(rcode) {
    -
    353  case hrNAK:
    -
    354  nak_count++;
    -
    355  if(nak_limit && (nak_count == nak_limit))
    -
    356  goto breakout;
    -
    357  //return ( rcode);
    -
    358  break;
    -
    359  case hrTIMEOUT:
    -
    360  retry_count++;
    -
    361  if(retry_count == USB_RETRY_LIMIT)
    -
    362  goto breakout;
    -
    363  //return ( rcode);
    -
    364  break;
    -
    365  case hrTOGERR:
    -
    366  // yes, we flip it wrong here so that next time it is actually correct!
    -
    367  pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
    -
    368  regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
    -
    369  break;
    -
    370  default:
    -
    371  goto breakout;
    -
    372  }//switch( rcode
    -
    373 
    -
    374  /* process NAK according to Host out NAK bug */
    -
    375  regWr(rSNDBC, 0);
    -
    376  regWr(rSNDFIFO, *data_p);
    -
    377  regWr(rSNDBC, bytes_tosend);
    -
    378  regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet
    -
    379  while(!(regRd(rHIRQ) & bmHXFRDNIRQ)){
    -
    380 #if defined(ESP8266) || defined(ESP32)
    -
    381  yield(); // needed in order to reset the watchdog timer on the ESP8266
    -
    382 #endif
    -
    383  } //wait for the completion IRQ
    -
    384  regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
    -
    385  rcode = (regRd(rHRSL) & 0x0f);
    -
    386  }//while( rcode && ....
    -
    387  bytes_left -= bytes_tosend;
    -
    388  data_p += bytes_tosend;
    -
    389  }//while( bytes_left...
    -
    390 breakout:
    -
    391 
    -
    392  pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle
    -
    393  return ( rcode); //should be 0 in all cases
    -
    394 }
    -
    395 /* dispatch USB packet. Assumes peripheral address is set and relevant buffer is loaded/empty */
    -
    396 /* If NAK, tries to re-send up to nak_limit times */
    -
    397 /* If nak_limit == 0, do not count NAKs, exit after timeout */
    -
    398 /* If bus timeout, re-sends up to USB_RETRY_LIMIT times */
    -
    399 
    -
    400 /* return codes 0x00-0x0f are HRSLT( 0x00 being success ), 0xff means timeout */
    -
    401 uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) {
    -
    402  uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT;
    -
    403  uint8_t tmpdata;
    -
    404  uint8_t rcode = hrSUCCESS;
    -
    405  uint8_t retry_count = 0;
    -
    406  uint16_t nak_count = 0;
    -
    407 
    -
    408  while((int32_t)((uint32_t)millis() - timeout) < 0L) {
    -
    409 #if defined(ESP8266) || defined(ESP32)
    -
    410  yield(); // needed in order to reset the watchdog timer on the ESP8266
    -
    411 #endif
    -
    412  regWr(rHXFR, (token | ep)); //launch the transfer
    - -
    414 
    -
    415  while((int32_t)((uint32_t)millis() - timeout) < 0L) //wait for transfer completion
    -
    416  {
    -
    417 #if defined(ESP8266) || defined(ESP32)
    -
    418  yield(); // needed in order to reset the watchdog timer on the ESP8266
    -
    419 #endif
    -
    420  tmpdata = regRd(rHIRQ);
    -
    421 
    -
    422  if(tmpdata & bmHXFRDNIRQ) {
    -
    423  regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt
    -
    424  rcode = 0x00;
    -
    425  break;
    -
    426  }//if( tmpdata & bmHXFRDNIRQ
    -
    427 
    -
    428  }//while ( millis() < timeout
    -
    429 
    -
    430  //if (rcode != 0x00) //exit if timeout
    -
    431  // return ( rcode);
    -
    432 
    -
    433  rcode = (regRd(rHRSL) & 0x0f); //analyze transfer result
    -
    434 
    -
    435  switch(rcode) {
    -
    436  case hrNAK:
    -
    437  nak_count++;
    -
    438  if(nak_limit && (nak_count == nak_limit))
    -
    439  return (rcode);
    -
    440  break;
    -
    441  case hrTIMEOUT:
    -
    442  retry_count++;
    -
    443  if(retry_count == USB_RETRY_LIMIT)
    -
    444  return (rcode);
    -
    445  break;
    -
    446  default:
    -
    447  return (rcode);
    -
    448  }//switch( rcode
    -
    449 
    -
    450  }//while( timeout > millis()
    -
    451  return ( rcode);
    -
    452 }
    -
    453 
    -
    454 /* USB main task. Performs enumeration/cleanup */
    -
    455 void USB::Task(void) //USB state machine
    -
    456 {
    -
    457  uint8_t rcode;
    -
    458  uint8_t tmpdata;
    -
    459  static uint32_t delay = 0;
    -
    460  //USB_DEVICE_DESCRIPTOR buf;
    -
    461  bool lowspeed = false;
    -
    462 
    -
    463  MAX3421E::Task();
    -
    464 
    -
    465  tmpdata = getVbusState();
    -
    466 
    -
    467  /* modify USB task state if Vbus changed */
    -
    468  switch(tmpdata) {
    -
    469  case SE1: //illegal state
    -
    470  usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL;
    -
    471  lowspeed = false;
    -
    472  break;
    -
    473  case SE0: //disconnected
    -
    474  if((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED)
    -
    475  usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE;
    -
    476  lowspeed = false;
    -
    477  break;
    -
    478  case LSHOST:
    -
    479 
    -
    480  lowspeed = true;
    -
    481  //intentional fallthrough
    -
    482  case FSHOST: //attached
    -
    483  if((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) {
    -
    484  delay = (uint32_t)millis() + USB_SETTLE_DELAY;
    -
    485  usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE;
    -
    486  }
    -
    487  break;
    -
    488  }// switch( tmpdata
    -
    489 
    -
    490  for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
    -
    491  if(devConfig[i])
    -
    492  rcode = devConfig[i]->Poll();
    -
    493 
    -
    494  switch(usb_task_state) {
    - -
    496  init();
    -
    497 
    -
    498  for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
    -
    499  if(devConfig[i])
    -
    500  rcode = devConfig[i]->Release();
    -
    501 
    -
    502  usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE;
    -
    503  break;
    -
    504  case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: //just sit here
    -
    505  break;
    -
    506  case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here
    -
    507  break;
    -
    508  case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device
    -
    509  if((int32_t)((uint32_t)millis() - delay) >= 0L)
    -
    510  usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE;
    -
    511  else break; // don't fall through
    - -
    513  regWr(rHCTL, bmBUSRST); //issue bus reset
    - -
    515  break;
    - -
    517  if((regRd(rHCTL) & bmBUSRST) == 0) {
    -
    518  tmpdata = regRd(rMODE) | bmSOFKAENAB; //start SOF generation
    -
    519  regWr(rMODE, tmpdata);
    -
    520  usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF;
    -
    521  //delay = (uint32_t)millis() + 20; //20ms wait after reset per USB spec
    -
    522  }
    -
    523  break;
    -
    524  case USB_ATTACHED_SUBSTATE_WAIT_SOF: //todo: change check order
    -
    525  if(regRd(rHIRQ) & bmFRAMEIRQ) {
    -
    526  //when first SOF received _and_ 20ms has passed we can continue
    -
    527  /*
    -
    528  if (delay < (uint32_t)millis()) //20ms passed
    -
    529  usb_task_state = USB_STATE_CONFIGURING;
    -
    530  */
    -
    531  usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET;
    -
    532  delay = (uint32_t)millis() + 20;
    -
    533  }
    -
    534  break;
    - -
    536  if((int32_t)((uint32_t)millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING;
    -
    537  else break; // don't fall through
    - -
    539 
    -
    540  //Serial.print("\r\nConf.LS: ");
    -
    541  //Serial.println(lowspeed, HEX);
    -
    542 
    -
    543  rcode = Configuring(0, 0, lowspeed);
    -
    544 
    -
    545  if(rcode) {
    - -
    547  usb_error = rcode;
    -
    548  usb_task_state = USB_STATE_ERROR;
    -
    549  }
    -
    550  } else
    -
    551  usb_task_state = USB_STATE_RUNNING;
    -
    552  break;
    -
    553  case USB_STATE_RUNNING:
    -
    554  break;
    -
    555  case USB_STATE_ERROR:
    -
    556  //MAX3421E::Init();
    -
    557  break;
    -
    558  } // switch( usb_task_state )
    -
    559 }
    -
    560 
    -
    561 uint8_t USB::DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    562  //uint8_t buf[12];
    -
    563  uint8_t rcode;
    -
    564  UsbDevice *p0 = NULL, *p = NULL;
    -
    565 
    -
    566  // Get pointer to pseudo device with address 0 assigned
    -
    567  p0 = addrPool.GetUsbDevicePtr(0);
    -
    568 
    -
    569  if(!p0)
    - -
    571 
    -
    572  if(!p0->epinfo)
    - -
    574 
    -
    575  p0->lowspeed = (lowspeed) ? true : false;
    -
    576 
    -
    577  // Allocate new address according to device class
    -
    578  uint8_t bAddress = addrPool.AllocAddress(parent, false, port);
    -
    579 
    -
    580  if(!bAddress)
    - -
    582 
    -
    583  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    584 
    -
    585  if(!p)
    - -
    587 
    -
    588  p->lowspeed = lowspeed;
    -
    589 
    -
    590  // Assign new address to the device
    -
    591  rcode = setAddr(0, 0, bAddress);
    -
    592 
    -
    593  if(rcode) {
    -
    594  addrPool.FreeAddress(bAddress);
    -
    595  bAddress = 0;
    -
    596  return rcode;
    -
    597  }
    -
    598  return 0;
    -
    599 };
    -
    600 
    -
    601 uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed) {
    -
    602  //printf("AttemptConfig: parent = %i, port = %i\r\n", parent, port);
    -
    603  uint8_t retries = 0;
    -
    604 
    -
    605 again:
    -
    606  uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed);
    - -
    608  if(parent == 0) {
    -
    609  // Send a bus reset on the root interface.
    -
    610  regWr(rHCTL, bmBUSRST); //issue bus reset
    -
    611  delay(102); // delay 102ms, compensate for clock inaccuracy.
    -
    612  } else {
    -
    613  // reset parent port
    -
    614  devConfig[parent]->ResetHubPort(port);
    -
    615  }
    -
    616  } else if(rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
    -
    617  delay(100);
    -
    618  retries++;
    -
    619  goto again;
    -
    620  } else if(rcode)
    -
    621  return rcode;
    -
    622 
    -
    623  rcode = devConfig[driver]->Init(parent, port, lowspeed);
    -
    624  if(rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
    -
    625  delay(100);
    -
    626  retries++;
    -
    627  goto again;
    -
    628  }
    -
    629  if(rcode) {
    -
    630  // Issue a bus reset, because the device may be in a limbo state
    -
    631  if(parent == 0) {
    -
    632  // Send a bus reset on the root interface.
    -
    633  regWr(rHCTL, bmBUSRST); //issue bus reset
    -
    634  delay(102); // delay 102ms, compensate for clock inaccuracy.
    -
    635  } else {
    -
    636  // reset parent port
    -
    637  devConfig[parent]->ResetHubPort(port);
    -
    638  }
    -
    639  }
    -
    640  return rcode;
    -
    641 }
    -
    642 
    -
    643 /*
    -
    644  * This is broken. We need to enumerate differently.
    -
    645  * It causes major problems with several devices if detected in an unexpected order.
    -
    646  *
    -
    647  *
    -
    648  * Oleg - I wouldn't do anything before the newly connected device is considered sane.
    -
    649  * i.e.(delays are not indicated for brevity):
    -
    650  * 1. reset
    -
    651  * 2. GetDevDescr();
    -
    652  * 3a. If ACK, continue with allocating address, addressing, etc.
    -
    653  * 3b. Else reset again, count resets, stop at some number (5?).
    -
    654  * 4. When max.number of resets is reached, toggle power/fail
    -
    655  * If desired, this could be modified by performing two resets with GetDevDescr() in the middle - however, from my experience, if a device answers to GDD()
    -
    656  * it doesn't need to be reset again
    -
    657  * New steps proposal:
    -
    658  * 1: get address pool instance. exit on fail
    -
    659  * 2: pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf). exit on fail.
    -
    660  * 3: bus reset, 100ms delay
    -
    661  * 4: set address
    -
    662  * 5: pUsb->setEpInfoEntry(bAddress, 1, epInfo), exit on fail
    -
    663  * 6: while (configurations) {
    -
    664  * for(each configuration) {
    -
    665  * for (each driver) {
    -
    666  * 6a: Ask device if it likes configuration. Returns 0 on OK.
    -
    667  * If successful, the driver configured device.
    -
    668  * The driver now owns the endpoints, and takes over managing them.
    -
    669  * The following will need codes:
    -
    670  * Everything went well, instance consumed, exit with success.
    -
    671  * Instance already in use, ignore it, try next driver.
    -
    672  * Not a supported device, ignore it, try next driver.
    -
    673  * Not a supported configuration for this device, ignore it, try next driver.
    -
    674  * Could not configure device, fatal, exit with fail.
    -
    675  * }
    -
    676  * }
    -
    677  * }
    -
    678  * 7: for(each driver) {
    -
    679  * 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID
    -
    680  * 8: if we get here, no driver likes the device plugged in, so exit failure.
    -
    681  *
    -
    682  */
    -
    683 uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    684  //uint8_t bAddress = 0;
    -
    685  //printf("Configuring: parent = %i, port = %i\r\n", parent, port);
    -
    686  uint8_t devConfigIndex;
    -
    687  uint8_t rcode = 0;
    -
    688  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    -
    689  USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR *>(buf);
    -
    690  UsbDevice *p = NULL;
    -
    691  EpInfo *oldep_ptr = NULL;
    -
    692  EpInfo epInfo;
    -
    693 
    -
    694  epInfo.epAddr = 0;
    -
    695  epInfo.maxPktSize = 8;
    -
    696  epInfo.bmSndToggle = 0;
    -
    697  epInfo.bmRcvToggle = 0;
    -
    698  epInfo.bmNakPower = USB_NAK_MAX_POWER;
    -
    699 
    -
    700  //delay(2000);
    -
    701  AddressPool &addrPool = GetAddressPool();
    -
    702  // Get pointer to pseudo device with address 0 assigned
    -
    703  p = addrPool.GetUsbDevicePtr(0);
    -
    704  if(!p) {
    -
    705  //printf("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n");
    - -
    707  }
    -
    708 
    -
    709  // Save old pointer to EP_RECORD of address 0
    -
    710  oldep_ptr = p->epinfo;
    -
    711 
    -
    712  // Temporary assign new pointer to epInfo to p->epinfo in order to
    -
    713  // avoid toggle inconsistence
    -
    714 
    -
    715  p->epinfo = &epInfo;
    -
    716 
    -
    717  p->lowspeed = lowspeed;
    -
    718  // Get device descriptor
    -
    719  rcode = getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf);
    -
    720 
    -
    721  // Restore p->epinfo
    -
    722  p->epinfo = oldep_ptr;
    -
    723 
    -
    724  if(rcode) {
    -
    725  //printf("Configuring error: Can't get USB_DEVICE_DESCRIPTOR\r\n");
    -
    726  return rcode;
    -
    727  }
    -
    728 
    -
    729  // to-do?
    -
    730  // Allocate new address according to device class
    -
    731  //bAddress = addrPool.AllocAddress(parent, false, port);
    -
    732 
    -
    733  uint16_t vid = udd->idVendor;
    -
    734  uint16_t pid = udd->idProduct;
    -
    735  uint8_t klass = udd->bDeviceClass;
    -
    736  uint8_t subklass = udd->bDeviceSubClass;
    -
    737  // Attempt to configure if VID/PID or device class matches with a driver
    -
    738  // Qualify with subclass too.
    -
    739  //
    -
    740  // VID/PID & class tests default to false for drivers not yet ported
    -
    741  // subclass defaults to true, so you don't have to define it if you don't have to.
    -
    742  //
    -
    743  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
    -
    744  if(!devConfig[devConfigIndex]) continue; // no driver
    -
    745  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
    -
    746  if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) {
    -
    747  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
    - -
    749  break;
    -
    750  }
    -
    751  }
    -
    752 
    -
    753  if(devConfigIndex < USB_NUMDEVICES) {
    -
    754  return rcode;
    -
    755  }
    -
    756 
    -
    757 
    -
    758  // blindly attempt to configure
    -
    759  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
    -
    760  if(!devConfig[devConfigIndex]) continue;
    -
    761  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
    -
    762  if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) continue; // If this is true it means it must have returned USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED above
    -
    763  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
    -
    764 
    -
    765  //printf("ERROR ENUMERATING %2.2x\r\n", rcode);
    - -
    767  // in case of an error dev_index should be reset to 0
    -
    768  // in order to start from the very beginning the
    -
    769  // next time the program gets here
    -
    770  //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE)
    -
    771  // devConfigIndex = 0;
    -
    772  return rcode;
    -
    773  }
    -
    774  }
    -
    775  // if we get here that means that the device class is not supported by any of registered classes
    -
    776  rcode = DefaultAddressing(parent, port, lowspeed);
    -
    777 
    -
    778  return rcode;
    -
    779 }
    -
    780 
    -
    781 uint8_t USB::ReleaseDevice(uint8_t addr) {
    -
    782  if(!addr)
    -
    783  return 0;
    -
    784 
    -
    785  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
    -
    786  if(!devConfig[i]) continue;
    -
    787  if(devConfig[i]->GetAddress() == addr)
    -
    788  return devConfig[i]->Release();
    -
    789  }
    -
    790  return 0;
    -
    791 }
    -
    792 
    -
    793 #if 1
    -
    794 //get device descriptor
    -
    795 
    -
    796 uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
    -
    797  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, NULL));
    -
    798 }
    -
    799 //get configuration descriptor
    -
    800 
    -
    801 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
    -
    802  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, NULL));
    -
    803 }
    -
    804 
    -
    805 /* Requests Configuration Descriptor. Sends two Get Conf Descr requests. The first one gets the total length of all descriptors, then the second one requests this
    -
    806  total length. The length of the first request can be shorter ( 4 bytes ), however, there are devices which won't work unless this length is set to 9 */
    -
    807 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) {
    -
    808  const uint8_t bufSize = 64;
    -
    809  uint8_t buf[bufSize];
    -
    810  USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR *>(buf);
    -
    811 
    -
    812  uint8_t ret = getConfDescr(addr, ep, 9, conf, buf);
    -
    813 
    -
    814  if(ret)
    -
    815  return ret;
    -
    816 
    -
    817  uint16_t total = ucd->wTotalLength;
    -
    818 
    -
    819  //USBTRACE2("\r\ntotal conf.size:", total);
    -
    820 
    -
    821  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p));
    -
    822 }
    -
    823 
    -
    824 //get string descriptor
    -
    825 
    -
    826 uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) {
    -
    827  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, NULL));
    -
    828 }
    -
    829 //set address
    -
    830 
    -
    831 uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
    -
    832  uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL);
    -
    833  //delay(2); //per USB 2.0 sect.9.2.6.3
    -
    834  delay(300); // Older spec says you should wait at least 200ms
    -
    835  return rcode;
    -
    836  //return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
    -
    837 }
    -
    838 //set configuration
    -
    839 
    -
    840 uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
    -
    841  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
    -
    842 }
    -
    843 
    -
    844 #endif // defined(USB_METHODS_INLINE)
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 /* USB functions */
    18 
    19 #include "Usb.h"
    20 
    21 static uint8_t usb_error = 0;
    22 static uint8_t usb_task_state;
    23 
    24 /* constructor */
    25 USB::USB() : bmHubPre(0) {
    26  usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; //set up state machine
    27  init();
    28 }
    29 
    30 /* Initialize data structures */
    31 void USB::init() {
    32  //devConfigIndex = 0;
    33  bmHubPre = 0;
    34 }
    35 
    36 uint8_t USB::getUsbTaskState(void) {
    37  return ( usb_task_state);
    38 }
    39 
    40 void USB::setUsbTaskState(uint8_t state) {
    41  usb_task_state = state;
    42 }
    43 
    44 EpInfo* USB::getEpInfoEntry(uint8_t addr, uint8_t ep) {
    45  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
    46 
    47  if(!p || !p->epinfo)
    48  return NULL;
    49 
    50  EpInfo *pep = p->epinfo;
    51 
    52  for(uint8_t i = 0; i < p->epcount; i++) {
    53  if((pep)->epAddr == ep)
    54  return pep;
    55 
    56  pep++;
    57  }
    58  return NULL;
    59 }
    60 
    61 /* set device table entry */
    62 
    63 /* each device is different and has different number of endpoints. This function plugs endpoint record structure, defined in application, to devtable */
    64 uint8_t USB::setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr) {
    65  if(!eprecord_ptr)
    67 
    68  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
    69 
    70  if(!p)
    72 
    73  p->address.devAddress = addr;
    74  p->epinfo = eprecord_ptr;
    75  p->epcount = epcount;
    76 
    77  return 0;
    78 }
    79 
    80 uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit) {
    81  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
    82 
    83  if(!p)
    85 
    86  if(!p->epinfo)
    88 
    89  *ppep = getEpInfoEntry(addr, ep);
    90 
    91  if(!*ppep)
    93 
    94  *nak_limit = (0x0001UL << (((*ppep)->bmNakPower > USB_NAK_MAX_POWER) ? USB_NAK_MAX_POWER : (*ppep)->bmNakPower));
    95  (*nak_limit)--;
    96  /*
    97  USBTRACE2("\r\nAddress: ", addr);
    98  USBTRACE2(" EP: ", ep);
    99  USBTRACE2(" NAK Power: ",(*ppep)->bmNakPower);
    100  USBTRACE2(" NAK Limit: ", nak_limit);
    101  USBTRACE("\r\n");
    102  */
    103  regWr(rPERADDR, addr); //set peripheral address
    104 
    105  uint8_t mode = regRd(rMODE);
    106 
    107  //Serial.print("\r\nMode: ");
    108  //Serial.println( mode, HEX);
    109  //Serial.print("\r\nLS: ");
    110  //Serial.println(p->lowspeed, HEX);
    111 
    112 
    113 
    114  // Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise
    115  regWr(rMODE, (p->lowspeed) ? mode | bmLOWSPEED | bmHubPre : mode & ~(bmHUBPRE | bmLOWSPEED));
    116 
    117  return 0;
    118 }
    119 
    120 /* Control transfer. Sets address, endpoint, fills control packet with necessary data, dispatches control packet, and initiates bulk IN transfer, */
    121 /* depending on request. Actual requests are defined as inlines */
    122 /* return codes: */
    123 /* 00 = success */
    124 
    125 /* 01-0f = non-zero HRSLT */
    126 uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
    127  uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) {
    128  bool direction = false; //request direction, IN or OUT
    129  uint8_t rcode;
    130  SETUP_PKT setup_pkt;
    131 
    132  EpInfo *pep = NULL;
    133  uint16_t nak_limit = 0;
    134 
    135  rcode = SetAddress(addr, ep, &pep, &nak_limit);
    136 
    137  if(rcode)
    138  return rcode;
    139 
    140  direction = ((bmReqType & 0x80) > 0);
    141 
    142  /* fill in setup packet */
    143  setup_pkt.ReqType_u.bmRequestType = bmReqType;
    144  setup_pkt.bRequest = bRequest;
    145  setup_pkt.wVal_u.wValueLo = wValLo;
    146  setup_pkt.wVal_u.wValueHi = wValHi;
    147  setup_pkt.wIndex = wInd;
    148  setup_pkt.wLength = total;
    149 
    150  bytesWr(rSUDFIFO, 8, (uint8_t*) & setup_pkt); //transfer to setup packet FIFO
    151 
    152  rcode = dispatchPkt(tokSETUP, ep, nak_limit); //dispatch packet
    153 
    154  if(rcode) //return HRSLT if not zero
    155  return ( rcode);
    156 
    157  if(dataptr != NULL) //data stage, if present
    158  {
    159  if(direction) //IN transfer
    160  {
    161  uint16_t left = total;
    162 
    163  pep->bmRcvToggle = 1; //bmRCVTOG1;
    164 
    165  while(left) {
    166  // Bytes read into buffer
    167 #if defined(ESP8266) || defined(ESP32)
    168  yield(); // needed in order to reset the watchdog timer on the ESP8266
    169 #endif
    170  uint16_t read = nbytes;
    171  //uint16_t read = (left<nbytes) ? left : nbytes;
    172 
    173  rcode = InTransfer(pep, nak_limit, &read, dataptr);
    174  if(rcode == hrTOGERR) {
    175  // yes, we flip it wrong here so that next time it is actually correct!
    176  pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
    177  continue;
    178  }
    179 
    180  if(rcode)
    181  return rcode;
    182 
    183  // Invoke callback function if inTransfer completed successfully and callback function pointer is specified
    184  if(!rcode && p)
    185  ((USBReadParser*)p)->Parse(read, dataptr, total - left);
    186 
    187  left -= read;
    188 
    189  if(read < nbytes)
    190  break;
    191  }
    192  } else //OUT transfer
    193  {
    194  pep->bmSndToggle = 1; //bmSNDTOG1;
    195  rcode = OutTransfer(pep, nak_limit, nbytes, dataptr);
    196  }
    197  if(rcode) //return error
    198  return ( rcode);
    199  }
    200  // Status stage
    201  return dispatchPkt((direction) ? tokOUTHS : tokINHS, ep, nak_limit); //GET if direction
    202 }
    203 
    204 /* IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
    205 /* Keep sending INs and writes data to memory area pointed by 'data' */
    206 
    207 /* rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error,
    208  fe USB xfer timeout */
    209 uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) {
    210  EpInfo *pep = NULL;
    211  uint16_t nak_limit = 0;
    212 
    213  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
    214 
    215  if(rcode) {
    216  USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81);
    217  USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81);
    218  USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81);
    219  return rcode;
    220  }
    221  return InTransfer(pep, nak_limit, nbytesptr, data, bInterval);
    222 }
    223 
    224 uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) {
    225  uint8_t rcode = 0;
    226  uint8_t pktsize;
    227 
    228  uint16_t nbytes = *nbytesptr;
    229  //printf("Requesting %i bytes ", nbytes);
    230  uint8_t maxpktsize = pep->maxPktSize;
    231 
    232  *nbytesptr = 0;
    233  regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
    234 
    235  // use a 'break' to exit this loop
    236  while(1) {
    237 #if defined(ESP8266) || defined(ESP32)
    238  yield(); // needed in order to reset the watchdog timer on the ESP8266
    239 #endif
    240  rcode = dispatchPkt(tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS.
    241  if(rcode == hrTOGERR) {
    242  // yes, we flip it wrong here so that next time it is actually correct!
    243  pep->bmRcvToggle = (regRd(rHRSL) & bmRCVTOGRD) ? 0 : 1;
    244  regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
    245  continue;
    246  }
    247  if(rcode) {
    248  //printf(">>>>>>>> Problem! dispatchPkt %2.2x\r\n", rcode);
    249  break; //should be 0, indicating ACK. Else return error code.
    250  }
    251  /* check for RCVDAVIRQ and generate error if not present
    252  * the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred.
    253  * Need to add handling for that
    254  *
    255  * NOTE: I've seen this happen with SPI corruption -- xxxajk
    256  */
    257  if((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) {
    258  //printf(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n");
    259  rcode = 0xf0; //receive error
    260  break;
    261  }
    262  pktsize = regRd(rRCVBC); //number of received bytes
    263  //printf("Got %i bytes \r\n", pktsize);
    264  // This would be OK, but...
    265  //assert(pktsize <= nbytes);
    266  if(pktsize > nbytes) {
    267  // This can happen. Use of assert on Arduino locks up the Arduino.
    268  // So I will trim the value, and hope for the best.
    269  //printf(">>>>>>>> Problem! Wanted %i bytes but got %i.\r\n", nbytes, pktsize);
    270  pktsize = nbytes;
    271  }
    272 
    273  int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr);
    274 
    275  if(mem_left < 0)
    276  mem_left = 0;
    277 
    278  data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data);
    279 
    280  regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer
    281  *nbytesptr += pktsize; // add this packet's byte count to total transfer length
    282 
    283  /* The transfer is complete under two conditions: */
    284  /* 1. The device sent a short packet (L.T. maxPacketSize) */
    285  /* 2. 'nbytes' have been transferred. */
    286  if((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) // have we transferred 'nbytes' bytes?
    287  {
    288  // Save toggle value
    289  pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0;
    290  //printf("\r\n");
    291  rcode = 0;
    292  break;
    293  } else if(bInterval > 0)
    294  delay(bInterval); // Delay according to polling interval
    295  } //while( 1 )
    296  return ( rcode);
    297 }
    298 
    299 /* OUT transfer to arbitrary endpoint. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
    300 /* Handles NAK bug per Maxim Application Note 4000 for single buffer transfer */
    301 
    302 /* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */
    303 uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) {
    304  EpInfo *pep = NULL;
    305  uint16_t nak_limit = 0;
    306 
    307  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
    308 
    309  if(rcode)
    310  return rcode;
    311 
    312  return OutTransfer(pep, nak_limit, nbytes, data);
    313 }
    314 
    315 uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) {
    316  uint8_t rcode = hrSUCCESS, retry_count;
    317  uint8_t *data_p = data; //local copy of the data pointer
    318  uint16_t bytes_tosend, nak_count;
    319  uint16_t bytes_left = nbytes;
    320 
    321  uint8_t maxpktsize = pep->maxPktSize;
    322 
    323  if(maxpktsize < 1 || maxpktsize > 64)
    325 
    326  uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT;
    327 
    328  regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
    329 
    330  while(bytes_left) {
    331 #if defined(ESP8266) || defined(ESP32)
    332  yield(); // needed in order to reset the watchdog timer on the ESP8266
    333 #endif
    334  retry_count = 0;
    335  nak_count = 0;
    336  bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left;
    337  bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO
    338  regWr(rSNDBC, bytes_tosend); //set number of bytes
    339  regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet
    340  while(!(regRd(rHIRQ) & bmHXFRDNIRQ)){
    341 #if defined(ESP8266) || defined(ESP32)
    342  yield(); // needed in order to reset the watchdog timer on the ESP8266
    343 #endif
    344  } //wait for the completion IRQ
    345  regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
    346  rcode = (regRd(rHRSL) & 0x0f);
    347 
    348  while(rcode && ((int32_t)((uint32_t)millis() - timeout) < 0L)) {
    349 #if defined(ESP8266) || defined(ESP32)
    350  yield(); // needed in order to reset the watchdog timer on the ESP8266
    351 #endif
    352  switch(rcode) {
    353  case hrNAK:
    354  nak_count++;
    355  if(nak_limit && (nak_count == nak_limit))
    356  goto breakout;
    357  //return ( rcode);
    358  break;
    359  case hrTIMEOUT:
    360  retry_count++;
    361  if(retry_count == USB_RETRY_LIMIT)
    362  goto breakout;
    363  //return ( rcode);
    364  break;
    365  case hrTOGERR:
    366  // yes, we flip it wrong here so that next time it is actually correct!
    367  pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
    368  regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
    369  break;
    370  default:
    371  goto breakout;
    372  }//switch( rcode
    373 
    374  /* process NAK according to Host out NAK bug */
    375  regWr(rSNDBC, 0);
    376  regWr(rSNDFIFO, *data_p);
    377  regWr(rSNDBC, bytes_tosend);
    378  regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet
    379  while(!(regRd(rHIRQ) & bmHXFRDNIRQ)){
    380 #if defined(ESP8266) || defined(ESP32)
    381  yield(); // needed in order to reset the watchdog timer on the ESP8266
    382 #endif
    383  } //wait for the completion IRQ
    384  regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
    385  rcode = (regRd(rHRSL) & 0x0f);
    386  }//while( rcode && ....
    387  bytes_left -= bytes_tosend;
    388  data_p += bytes_tosend;
    389  }//while( bytes_left...
    390 breakout:
    391 
    392  pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle
    393  return ( rcode); //should be 0 in all cases
    394 }
    395 /* dispatch USB packet. Assumes peripheral address is set and relevant buffer is loaded/empty */
    396 /* If NAK, tries to re-send up to nak_limit times */
    397 /* If nak_limit == 0, do not count NAKs, exit after timeout */
    398 /* If bus timeout, re-sends up to USB_RETRY_LIMIT times */
    399 
    400 /* return codes 0x00-0x0f are HRSLT( 0x00 being success ), 0xff means timeout */
    401 uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) {
    402  uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT;
    403  uint8_t tmpdata;
    404  uint8_t rcode = hrSUCCESS;
    405  uint8_t retry_count = 0;
    406  uint16_t nak_count = 0;
    407 
    408  while((int32_t)((uint32_t)millis() - timeout) < 0L) {
    409 #if defined(ESP8266) || defined(ESP32)
    410  yield(); // needed in order to reset the watchdog timer on the ESP8266
    411 #endif
    412  regWr(rHXFR, (token | ep)); //launch the transfer
    414 
    415  while((int32_t)((uint32_t)millis() - timeout) < 0L) //wait for transfer completion
    416  {
    417 #if defined(ESP8266) || defined(ESP32)
    418  yield(); // needed in order to reset the watchdog timer on the ESP8266
    419 #endif
    420  tmpdata = regRd(rHIRQ);
    421 
    422  if(tmpdata & bmHXFRDNIRQ) {
    423  regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt
    424  rcode = 0x00;
    425  break;
    426  }//if( tmpdata & bmHXFRDNIRQ
    427 
    428  }//while ( millis() < timeout
    429 
    430  //if (rcode != 0x00) //exit if timeout
    431  // return ( rcode);
    432 
    433  rcode = (regRd(rHRSL) & 0x0f); //analyze transfer result
    434 
    435  switch(rcode) {
    436  case hrNAK:
    437  nak_count++;
    438  if(nak_limit && (nak_count == nak_limit))
    439  return (rcode);
    440  break;
    441  case hrTIMEOUT:
    442  retry_count++;
    443  if(retry_count == USB_RETRY_LIMIT)
    444  return (rcode);
    445  break;
    446  default:
    447  return (rcode);
    448  }//switch( rcode
    449 
    450  }//while( timeout > millis()
    451  return ( rcode);
    452 }
    453 
    454 /* USB main task. Performs enumeration/cleanup */
    455 void USB::Task(void) //USB state machine
    456 {
    457  uint8_t rcode;
    458  uint8_t tmpdata;
    459  static uint32_t delay = 0;
    460  //USB_DEVICE_DESCRIPTOR buf;
    461  bool lowspeed = false;
    462 
    463  MAX3421E::Task();
    464 
    465  tmpdata = getVbusState();
    466 
    467  /* modify USB task state if Vbus changed */
    468  switch(tmpdata) {
    469  case SE1: //illegal state
    470  usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL;
    471  lowspeed = false;
    472  break;
    473  case SE0: //disconnected
    474  if((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED)
    475  usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE;
    476  lowspeed = false;
    477  break;
    478  case LSHOST:
    479 
    480  lowspeed = true;
    481  //intentional fallthrough
    482  case FSHOST: //attached
    483  if((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) {
    484  delay = (uint32_t)millis() + USB_SETTLE_DELAY;
    485  usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE;
    486  }
    487  break;
    488  }// switch( tmpdata
    489 
    490  for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
    491  if(devConfig[i])
    492  rcode = devConfig[i]->Poll();
    493 
    494  switch(usb_task_state) {
    496  init();
    497 
    498  for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
    499  if(devConfig[i])
    500  rcode = devConfig[i]->Release();
    501 
    502  usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE;
    503  break;
    504  case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: //just sit here
    505  break;
    506  case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here
    507  break;
    508  case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device
    509  if((int32_t)((uint32_t)millis() - delay) >= 0L)
    510  usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE;
    511  else break; // don't fall through
    513  regWr(rHCTL, bmBUSRST); //issue bus reset
    515  break;
    517  if((regRd(rHCTL) & bmBUSRST) == 0) {
    518  tmpdata = regRd(rMODE) | bmSOFKAENAB; //start SOF generation
    519  regWr(rMODE, tmpdata);
    520  usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF;
    521  //delay = (uint32_t)millis() + 20; //20ms wait after reset per USB spec
    522  }
    523  break;
    524  case USB_ATTACHED_SUBSTATE_WAIT_SOF: //todo: change check order
    525  if(regRd(rHIRQ) & bmFRAMEIRQ) {
    526  //when first SOF received _and_ 20ms has passed we can continue
    527  /*
    528  if (delay < (uint32_t)millis()) //20ms passed
    529  usb_task_state = USB_STATE_CONFIGURING;
    530  */
    531  usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET;
    532  delay = (uint32_t)millis() + 20;
    533  }
    534  break;
    536  if((int32_t)((uint32_t)millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING;
    537  else break; // don't fall through
    539 
    540  //Serial.print("\r\nConf.LS: ");
    541  //Serial.println(lowspeed, HEX);
    542 
    543  rcode = Configuring(0, 0, lowspeed);
    544 
    545  if(rcode) {
    547  usb_error = rcode;
    548  usb_task_state = USB_STATE_ERROR;
    549  }
    550  } else
    551  usb_task_state = USB_STATE_RUNNING;
    552  break;
    553  case USB_STATE_RUNNING:
    554  break;
    555  case USB_STATE_ERROR:
    556  //MAX3421E::Init();
    557  break;
    558  } // switch( usb_task_state )
    559 }
    560 
    561 uint8_t USB::DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed) {
    562  //uint8_t buf[12];
    563  uint8_t rcode;
    564  UsbDevice *p0 = NULL, *p = NULL;
    565 
    566  // Get pointer to pseudo device with address 0 assigned
    567  p0 = addrPool.GetUsbDevicePtr(0);
    568 
    569  if(!p0)
    571 
    572  if(!p0->epinfo)
    574 
    575  p0->lowspeed = (lowspeed) ? true : false;
    576 
    577  // Allocate new address according to device class
    578  uint8_t bAddress = addrPool.AllocAddress(parent, false, port);
    579 
    580  if(!bAddress)
    582 
    583  p = addrPool.GetUsbDevicePtr(bAddress);
    584 
    585  if(!p)
    587 
    588  p->lowspeed = lowspeed;
    589 
    590  // Assign new address to the device
    591  rcode = setAddr(0, 0, bAddress);
    592 
    593  if(rcode) {
    594  addrPool.FreeAddress(bAddress);
    595  bAddress = 0;
    596  return rcode;
    597  }
    598  return 0;
    599 };
    600 
    601 uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed) {
    602  //printf("AttemptConfig: parent = %i, port = %i\r\n", parent, port);
    603  uint8_t retries = 0;
    604 
    605 again:
    606  uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed);
    608  if(parent == 0) {
    609  // Send a bus reset on the root interface.
    610  regWr(rHCTL, bmBUSRST); //issue bus reset
    611  delay(102); // delay 102ms, compensate for clock inaccuracy.
    612  } else {
    613  // reset parent port
    614  devConfig[parent]->ResetHubPort(port);
    615  }
    616  } else if(rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
    617  delay(100);
    618  retries++;
    619  goto again;
    620  } else if(rcode)
    621  return rcode;
    622 
    623  rcode = devConfig[driver]->Init(parent, port, lowspeed);
    624  if(rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
    625  delay(100);
    626  retries++;
    627  goto again;
    628  }
    629  if(rcode) {
    630  // Issue a bus reset, because the device may be in a limbo state
    631  if(parent == 0) {
    632  // Send a bus reset on the root interface.
    633  regWr(rHCTL, bmBUSRST); //issue bus reset
    634  delay(102); // delay 102ms, compensate for clock inaccuracy.
    635  } else {
    636  // reset parent port
    637  devConfig[parent]->ResetHubPort(port);
    638  }
    639  }
    640  return rcode;
    641 }
    642 
    643 /*
    644  * This is broken. We need to enumerate differently.
    645  * It causes major problems with several devices if detected in an unexpected order.
    646  *
    647  *
    648  * Oleg - I wouldn't do anything before the newly connected device is considered sane.
    649  * i.e.(delays are not indicated for brevity):
    650  * 1. reset
    651  * 2. GetDevDescr();
    652  * 3a. If ACK, continue with allocating address, addressing, etc.
    653  * 3b. Else reset again, count resets, stop at some number (5?).
    654  * 4. When max.number of resets is reached, toggle power/fail
    655  * If desired, this could be modified by performing two resets with GetDevDescr() in the middle - however, from my experience, if a device answers to GDD()
    656  * it doesn't need to be reset again
    657  * New steps proposal:
    658  * 1: get address pool instance. exit on fail
    659  * 2: pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf). exit on fail.
    660  * 3: bus reset, 100ms delay
    661  * 4: set address
    662  * 5: pUsb->setEpInfoEntry(bAddress, 1, epInfo), exit on fail
    663  * 6: while (configurations) {
    664  * for(each configuration) {
    665  * for (each driver) {
    666  * 6a: Ask device if it likes configuration. Returns 0 on OK.
    667  * If successful, the driver configured device.
    668  * The driver now owns the endpoints, and takes over managing them.
    669  * The following will need codes:
    670  * Everything went well, instance consumed, exit with success.
    671  * Instance already in use, ignore it, try next driver.
    672  * Not a supported device, ignore it, try next driver.
    673  * Not a supported configuration for this device, ignore it, try next driver.
    674  * Could not configure device, fatal, exit with fail.
    675  * }
    676  * }
    677  * }
    678  * 7: for(each driver) {
    679  * 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID
    680  * 8: if we get here, no driver likes the device plugged in, so exit failure.
    681  *
    682  */
    683 uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) {
    684  //uint8_t bAddress = 0;
    685  //printf("Configuring: parent = %i, port = %i\r\n", parent, port);
    686  uint8_t devConfigIndex;
    687  uint8_t rcode = 0;
    688  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    689  USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR *>(buf);
    690  UsbDevice *p = NULL;
    691  EpInfo *oldep_ptr = NULL;
    692  EpInfo epInfo;
    693 
    694  epInfo.epAddr = 0;
    695  epInfo.maxPktSize = 8;
    696  epInfo.bmSndToggle = 0;
    697  epInfo.bmRcvToggle = 0;
    698  epInfo.bmNakPower = USB_NAK_MAX_POWER;
    699 
    700  //delay(2000);
    701  AddressPool &addrPool = GetAddressPool();
    702  // Get pointer to pseudo device with address 0 assigned
    703  p = addrPool.GetUsbDevicePtr(0);
    704  if(!p) {
    705  //printf("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n");
    707  }
    708 
    709  // Save old pointer to EP_RECORD of address 0
    710  oldep_ptr = p->epinfo;
    711 
    712  // Temporary assign new pointer to epInfo to p->epinfo in order to
    713  // avoid toggle inconsistence
    714 
    715  p->epinfo = &epInfo;
    716 
    717  p->lowspeed = lowspeed;
    718  // Get device descriptor
    719  rcode = getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf);
    720 
    721  // Restore p->epinfo
    722  p->epinfo = oldep_ptr;
    723 
    724  if(rcode) {
    725  //printf("Configuring error: Can't get USB_DEVICE_DESCRIPTOR\r\n");
    726  return rcode;
    727  }
    728 
    729  // to-do?
    730  // Allocate new address according to device class
    731  //bAddress = addrPool.AllocAddress(parent, false, port);
    732 
    733  uint16_t vid = udd->idVendor;
    734  uint16_t pid = udd->idProduct;
    735  uint8_t klass = udd->bDeviceClass;
    736  uint8_t subklass = udd->bDeviceSubClass;
    737  // Attempt to configure if VID/PID or device class matches with a driver
    738  // Qualify with subclass too.
    739  //
    740  // VID/PID & class tests default to false for drivers not yet ported
    741  // subclass defaults to true, so you don't have to define it if you don't have to.
    742  //
    743  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
    744  if(!devConfig[devConfigIndex]) continue; // no driver
    745  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
    746  if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) {
    747  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
    749  break;
    750  }
    751  }
    752 
    753  if(devConfigIndex < USB_NUMDEVICES) {
    754  return rcode;
    755  }
    756 
    757 
    758  // blindly attempt to configure
    759  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
    760  if(!devConfig[devConfigIndex]) continue;
    761  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
    762  if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) continue; // If this is true it means it must have returned USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED above
    763  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
    764 
    765  //printf("ERROR ENUMERATING %2.2x\r\n", rcode);
    767  // in case of an error dev_index should be reset to 0
    768  // in order to start from the very beginning the
    769  // next time the program gets here
    770  //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE)
    771  // devConfigIndex = 0;
    772  return rcode;
    773  }
    774  }
    775  // if we get here that means that the device class is not supported by any of registered classes
    776  rcode = DefaultAddressing(parent, port, lowspeed);
    777 
    778  return rcode;
    779 }
    780 
    781 uint8_t USB::ReleaseDevice(uint8_t addr) {
    782  if(!addr)
    783  return 0;
    784 
    785  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
    786  if(!devConfig[i]) continue;
    787  if(devConfig[i]->GetAddress() == addr)
    788  return devConfig[i]->Release();
    789  }
    790  return 0;
    791 }
    792 
    793 #if 1
    794 //get device descriptor
    795 
    796 uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
    797  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, NULL));
    798 }
    799 //get configuration descriptor
    800 
    801 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
    802  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, NULL));
    803 }
    804 
    805 /* Requests Configuration Descriptor. Sends two Get Conf Descr requests. The first one gets the total length of all descriptors, then the second one requests this
    806  total length. The length of the first request can be shorter ( 4 bytes ), however, there are devices which won't work unless this length is set to 9 */
    807 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) {
    808  const uint8_t bufSize = 64;
    809  uint8_t buf[bufSize];
    810  USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR *>(buf);
    811 
    812  uint8_t ret = getConfDescr(addr, ep, 9, conf, buf);
    813 
    814  if(ret)
    815  return ret;
    816 
    817  uint16_t total = ucd->wTotalLength;
    818 
    819  //USBTRACE2("\r\ntotal conf.size:", total);
    820 
    821  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p));
    822 }
    823 
    824 //get string descriptor
    825 
    826 uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) {
    827  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, NULL));
    828 }
    829 //set address
    830 
    831 uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
    832  uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL);
    833  //delay(2); //per USB 2.0 sect.9.2.6.3
    834  delay(300); // Older spec says you should wait at least 200ms
    835  return rcode;
    836  //return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
    837 }
    838 //set configuration
    839 
    840 uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
    841  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
    842 }
    843 
    844 #endif // defined(USB_METHODS_INLINE)
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    uint8_t bmRcvToggle
    Definition: address.h:48
    virtual uint8_t Poll()
    Definition: UsbCore.h:149
    @@ -966,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #define hrJERR
    Definition: max3421e.h:227
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: UsbCore.h:141
    -
    uint8_t Task()
    Definition: usbhost.h:544
    +
    uint8_t Task()
    Definition: usbhost.h:538
    #define hrSUCCESS
    Definition: max3421e.h:214
    #define USB_STATE_ERROR
    Definition: UsbCore.h:132
    uint8_t bmRequestType
    Definition: UsbCore.h:179
    @@ -999,7 +156,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #define rSNDBC
    Definition: max3421e.h:48
    #define rHRSL
    Definition: max3421e.h:203
    #define USB_ATTACHED_SUBSTATE_RESET_DEVICE
    Definition: UsbCore.h:124
    -
    uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:323
    +
    uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:317
    #define tokINHS
    Definition: max3421e.h:198
    #define bmLOWSPEED
    Definition: max3421e.h:171
    virtual void ResetHubPort(uint8_t port)
    Definition: UsbCore.h:157
    @@ -1036,7 +193,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit)
    Definition: Usb.cpp:401
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: UsbCore.h:137
    #define bmSNDTOG0
    Definition: max3421e.h:189
    -
    uint8_t regRd(uint8_t reg)
    Definition: usbhost.h:284
    +
    uint8_t regRd(uint8_t reg)
    Definition: usbhost.h:278
    uint8_t maxPktSize
    Definition: address.h:41
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:226
    #define USB_ERROR_INVALID_ARGUMENT
    Definition: UsbCore.h:97
    @@ -1072,7 +229,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_usb_8h.html b/_usb_8h.html index 127961a9..7f13d5b2 100644 --- a/_usb_8h.html +++ b/_usb_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Usb.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -90,7 +91,56 @@ This graph shows which files directly or indirectly include this file:
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Go to the source code of this file.

    @@ -99,7 +149,7 @@ This graph shows which files directly or indirectly include this file: diff --git a/_usb_8h__dep__incl.map b/_usb_8h__dep__incl.map index ecef921b..0318b392 100644 --- a/_usb_8h__dep__incl.map +++ b/_usb_8h__dep__incl.map @@ -1,51 +1,51 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_usb_8h__dep__incl.md5 b/_usb_8h__dep__incl.md5 index b41a3e43..d05d3dae 100644 --- a/_usb_8h__dep__incl.md5 +++ b/_usb_8h__dep__incl.md5 @@ -1 +1 @@ -03547f0a42b1834a5e9c578b39482572 \ No newline at end of file +02dd4b5bb74a4b06471e56603cb1a320 \ No newline at end of file diff --git a/_usb_8h__dep__incl.png b/_usb_8h__dep__incl.png index c2d3dd810e6fce5da0157ff542a280ae34b5c22e..fb2d7566f181b9ff48a932d197b397cca9c3cf75 100644 GIT binary patch literal 133098 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 z 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

    vg+FBOiHQcuG9`7_k*v&4@% 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�t$V)Envj$PubNL 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

    pa{T8@bOV~E3=AC%|scun6t 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 diff --git a/_usb_8h_source.html b/_usb_8h_source.html index d2b3c585..0966b20f 100644 --- a/_usb_8h_source.html +++ b/_usb_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Usb.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> -
     All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

    @@ -85,55 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Usb.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This program is free software; you can redistribute it and/or modify
    -
    4 it under the terms of the GNU General Public License as published by
    -
    5 the Free Software Foundation; either version 2 of the License, or
    -
    6 (at your option) any later version.
    -
    7 
    -
    8 This program is distributed in the hope that it will be useful,
    -
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    -
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    -
    11 GNU General Public License for more details.
    -
    12 
    -
    13 You should have received a copy of the GNU General Public License
    -
    14 along with this program; if not, write to the Free Software
    -
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    16 
    -
    17 Contact information
    -
    18 -------------------
    -
    19 
    -
    20 Circuits At Home, LTD
    -
    21 Web : http://www.circuitsathome.com
    -
    22 e-mail : support@circuitsathome.com
    -
    23  */
    -
    24 /* USB functions */
    -
    25 #ifndef _usb_h_
    -
    26 #define _usb_h_
    -
    27 
    -
    28 // WARNING: Do not change the order of includes, or stuff will break!
    -
    29 #include <inttypes.h>
    -
    30 #include <stddef.h>
    -
    31 #include <stdio.h>
    -
    32 
    -
    33 // None of these should ever be included by a driver, or a user's sketch.
    -
    34 #include "settings.h"
    -
    35 #include "printhex.h"
    -
    36 #include "message.h"
    -
    37 #include "hexdump.h"
    -
    38 #include "sink_parser.h"
    -
    39 #include "max3421e.h"
    -
    40 #include "address.h"
    -
    41 #include "avrpins.h"
    -
    42 #include "usb_ch9.h"
    -
    43 #include "usbhost.h"
    -
    44 #include "UsbCore.h"
    -
    45 #include "parsetools.h"
    -
    46 #include "confdescparser.h"
    -
    47 
    -
    48 #endif //_usb_h_
    - +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This program is free software; you can redistribute it and/or modify
    4 it under the terms of the GNU General Public License as published by
    5 the Free Software Foundation; either version 2 of the License, or
    6 (at your option) any later version.
    7 
    8 This program is distributed in the hope that it will be useful,
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11 GNU General Public License for more details.
    12 
    13 You should have received a copy of the GNU General Public License
    14 along with this program; if not, write to the Free Software
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    16 
    17 Contact information
    18 -------------------
    19 
    20 Circuits At Home, LTD
    21 Web : http://www.circuitsathome.com
    22 e-mail : support@circuitsathome.com
    23  */
    24 /* USB functions */
    25 #ifndef _usb_h_
    26 #define _usb_h_
    27 
    28 // WARNING: Do not change the order of includes, or stuff will break!
    29 #include <inttypes.h>
    30 #include <stddef.h>
    31 #include <stdio.h>
    32 
    33 // None of these should ever be included by a driver, or a user's sketch.
    34 #include "settings.h"
    35 #include "printhex.h"
    36 #include "message.h"
    37 #include "hexdump.h"
    38 #include "sink_parser.h"
    39 #include "max3421e.h"
    40 #include "address.h"
    41 #include "avrpins.h"
    42 #include "usb_ch9.h"
    43 #include "usbhost.h"
    44 #include "UsbCore.h"
    45 #include "parsetools.h"
    46 #include "confdescparser.h"
    47 
    48 #endif //_usb_h_
    @@ -151,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_usb_core_8h.html b/_usb_core_8h.html index f0e6f370..97ed3c35 100644 --- a/_usb_core_8h.html +++ b/_usb_core_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UsbCore.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -1074,7 +1075,7 @@ Typedefs diff --git a/_usb_core_8h_source.html b/_usb_core_8h_source.html index c3babd81..8555e335 100644 --- a/_usb_core_8h_source.html +++ b/_usb_core_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UsbCore.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,367 +86,42 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    UsbCore.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This program is free software; you can redistribute it and/or modify
    -
    4 it under the terms of the GNU General Public License as published by
    -
    5 the Free Software Foundation; either version 2 of the License, or
    -
    6 (at your option) any later version.
    -
    7 
    -
    8 This program is distributed in the hope that it will be useful,
    -
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    -
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    -
    11 GNU General Public License for more details.
    -
    12 
    -
    13 You should have received a copy of the GNU General Public License
    -
    14 along with this program; if not, write to the Free Software
    -
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    16 
    -
    17 Contact information
    -
    18 -------------------
    -
    19 
    -
    20 Circuits At Home, LTD
    -
    21 Web : http://www.circuitsathome.com
    -
    22 e-mail : support@circuitsathome.com
    -
    23  */
    -
    24 
    -
    25 #if !defined(_usb_h_) || defined(USBCORE_H)
    -
    26 #error "Never include UsbCore.h directly; include Usb.h instead"
    -
    27 #else
    -
    28 #define USBCORE_H
    -
    29 
    -
    30 // Not used anymore? If anyone uses this, please let us know so that this may be
    -
    31 // moved to the proper place, settings.h.
    -
    32 //#define USB_METHODS_INLINE
    -
    33 
    -
    34 /* shield pins. First parameter - SS pin, second parameter - INT pin */
    -
    35 #ifdef BOARD_BLACK_WIDDOW
    -
    36 typedef MAX3421e<P6, P3> MAX3421E; // Black Widow
    -
    37 #elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
    -
    38 #if EXT_RAM
    -
    39 typedef MAX3421e<P20, P7> MAX3421E; // Teensy++ 2.0 with XMEM2
    -
    40 #else
    -
    41 typedef MAX3421e<P9, P8> MAX3421E; // Teensy++ 1.0 and 2.0
    -
    42 #endif
    -
    43 #elif defined(BOARD_MEGA_ADK)
    -
    44 typedef MAX3421e<P53, P54> MAX3421E; // Arduino Mega ADK
    -
    45 #elif defined(ARDUINO_AVR_BALANDUINO)
    -
    46 typedef MAX3421e<P20, P19> MAX3421E; // Balanduino
    -
    47 #elif defined(__ARDUINO_X86__) && PLATFORM_ID == 0x06
    -
    48 typedef MAX3421e<P3, P2> MAX3421E; // The Intel Galileo supports much faster read and write speed at pin 2 and 3
    -
    49 #elif defined(ESP8266)
    -
    50 typedef MAX3421e<P15, P5> MAX3421E; // ESP8266 boards
    -
    51 #elif defined(ESP32)
    -
    52 typedef MAX3421e<P5, P17> MAX3421E; // ESP32 boards
    -
    53 #elif (defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__))
    -
    54 typedef MAX3421e<Pb4, Pb3> MAX3421E; // Sanguino
    -
    55 #else
    -
    56 typedef MAX3421e<P10, P9> MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo, Due etc.), Intel Edison, Intel Galileo 2 or Teensy 2.0 and 3.x
    -
    57 #endif
    -
    58 
    -
    59 /* Common setup data constant combinations */
    -
    60 #define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //get descriptor request type
    -
    61 #define bmREQ_SET USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //set request type for all but 'set feature' and 'set interface'
    -
    62 #define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE //get interface request type
    -
    63 
    -
    64 // D7 data transfer direction (0 - host-to-device, 1 - device-to-host)
    -
    65 // D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved)
    -
    66 // D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved)
    -
    67 
    -
    68 // USB Device Classes
    -
    69 #define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors
    -
    70 #define USB_CLASS_AUDIO 0x01 // Audio
    -
    71 #define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control
    -
    72 #define USB_CLASS_HID 0x03 // HID
    -
    73 #define USB_CLASS_PHYSICAL 0x05 // Physical
    -
    74 #define USB_CLASS_IMAGE 0x06 // Image
    -
    75 #define USB_CLASS_PRINTER 0x07 // Printer
    -
    76 #define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage
    -
    77 #define USB_CLASS_HUB 0x09 // Hub
    -
    78 #define USB_CLASS_CDC_DATA 0x0a // CDC-Data
    -
    79 #define USB_CLASS_SMART_CARD 0x0b // Smart-Card
    -
    80 #define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security
    -
    81 #define USB_CLASS_VIDEO 0x0e // Video
    -
    82 #define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare
    -
    83 #define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device
    -
    84 #define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller
    -
    85 #define USB_CLASS_MISC 0xef // Miscellaneous
    -
    86 #define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific
    -
    87 #define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific
    -
    88 
    -
    89 // Additional Error Codes
    -
    90 #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1
    -
    91 #define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2
    -
    92 #define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3
    -
    93 #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4
    -
    94 #define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5
    -
    95 #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6
    -
    96 #define USB_ERROR_EPINFO_IS_NULL 0xD7
    -
    97 #define USB_ERROR_INVALID_ARGUMENT 0xD8
    -
    98 #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9
    -
    99 #define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA
    -
    100 #define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB
    -
    101 #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET 0xE0
    -
    102 #define USB_ERROR_FailGetDevDescr 0xE1
    -
    103 #define USB_ERROR_FailSetDevTblEntry 0xE2
    -
    104 #define USB_ERROR_FailGetConfDescr 0xE3
    -
    105 #define USB_ERROR_TRANSFER_TIMEOUT 0xFF
    -
    106 
    -
    107 #define USB_XFER_TIMEOUT 5000 // (5000) USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec
    -
    108 //#define USB_NAK_LIMIT 32000 // NAK limit for a transfer. 0 means NAKs are not counted
    -
    109 #define USB_RETRY_LIMIT 3 // 3 retry limit for a transfer
    -
    110 #define USB_SETTLE_DELAY 200 // settle delay in milliseconds
    -
    111 
    -
    112 #define USB_NUMDEVICES 16 //number of USB devices
    -
    113 //#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller
    -
    114 #define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms
    -
    115 
    -
    116 /* USB state machine states */
    -
    117 #define USB_STATE_MASK 0xf0
    -
    118 
    -
    119 #define USB_STATE_DETACHED 0x10
    -
    120 #define USB_DETACHED_SUBSTATE_INITIALIZE 0x11
    -
    121 #define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12
    -
    122 #define USB_DETACHED_SUBSTATE_ILLEGAL 0x13
    -
    123 #define USB_ATTACHED_SUBSTATE_SETTLE 0x20
    -
    124 #define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30
    -
    125 #define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40
    -
    126 #define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50
    -
    127 #define USB_ATTACHED_SUBSTATE_WAIT_RESET 0x51
    -
    128 #define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60
    -
    129 #define USB_STATE_ADDRESSING 0x70
    -
    130 #define USB_STATE_CONFIGURING 0x80
    -
    131 #define USB_STATE_RUNNING 0x90
    -
    132 #define USB_STATE_ERROR 0xa0
    -
    133 
    - -
    135 public:
    -
    136 
    -
    137  virtual uint8_t Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) {
    -
    138  return 0;
    -
    139  }
    -
    140 
    -
    141  virtual uint8_t ConfigureDevice(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) {
    -
    142  return 0;
    -
    143  }
    -
    144 
    -
    145  virtual uint8_t Release() {
    -
    146  return 0;
    -
    147  }
    -
    148 
    -
    149  virtual uint8_t Poll() {
    -
    150  return 0;
    -
    151  }
    -
    152 
    -
    153  virtual uint8_t GetAddress() {
    -
    154  return 0;
    -
    155  }
    -
    156 
    -
    157  virtual void ResetHubPort(uint8_t port __attribute__((unused))) {
    -
    158  return;
    -
    159  } // Note used for hubs only!
    -
    160 
    -
    161  virtual bool VIDPIDOK(uint16_t vid __attribute__((unused)), uint16_t pid __attribute__((unused))) {
    -
    162  return false;
    -
    163  }
    -
    164 
    -
    165  virtual bool DEVCLASSOK(uint8_t klass __attribute__((unused))) {
    -
    166  return false;
    -
    167  }
    -
    168 
    -
    169  virtual bool DEVSUBCLASSOK(uint8_t subklass __attribute__((unused))) {
    -
    170  return true;
    -
    171  }
    -
    172 
    -
    173 };
    -
    174 
    -
    175 /* USB Setup Packet Structure */
    -
    176 typedef struct {
    -
    177 
    -
    178  union { // offset description
    -
    179  uint8_t bmRequestType; // 0 Bit-map of request type
    -
    180 
    -
    181  struct {
    -
    182  uint8_t recipient : 5; // Recipient of the request
    -
    183  uint8_t type : 2; // Type of request
    -
    184  uint8_t direction : 1; // Direction of data X-fer
    -
    185  } __attribute__((packed));
    -
    186  } ReqType_u;
    -
    187  uint8_t bRequest; // 1 Request
    -
    188 
    -
    189  union {
    -
    190  uint16_t wValue; // 2 Depends on bRequest
    -
    191 
    -
    192  struct {
    -
    193  uint8_t wValueLo;
    -
    194  uint8_t wValueHi;
    -
    195  } __attribute__((packed));
    -
    196  } wVal_u;
    -
    197  uint16_t wIndex; // 4 Depends on bRequest
    -
    198  uint16_t wLength; // 6 Depends on bRequest
    -
    199 } __attribute__((packed)) SETUP_PKT, *PSETUP_PKT;
    -
    200 
    -
    201 
    -
    202 
    -
    203 // Base class for incoming data parser
    -
    204 
    - -
    206 public:
    -
    207  virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) = 0;
    -
    208 };
    -
    209 
    -
    210 class USB : public MAX3421E {
    - -
    212  USBDeviceConfig* devConfig[USB_NUMDEVICES];
    -
    213  uint8_t bmHubPre;
    -
    214 
    -
    215 public:
    -
    216  USB(void);
    -
    217 
    -
    218  void SetHubPreMask() {
    -
    219  bmHubPre |= bmHUBPRE;
    -
    220  };
    -
    221 
    - -
    223  bmHubPre &= (~bmHUBPRE);
    -
    224  };
    -
    225 
    - -
    227  return (AddressPool&)addrPool;
    -
    228  };
    -
    229 
    - -
    231  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
    -
    232  if(!devConfig[i]) {
    -
    233  devConfig[i] = pdev;
    -
    234  return 0;
    -
    235  }
    -
    236  }
    - -
    238  };
    -
    239 
    - -
    241  addrPool.ForEachUsbDevice(pfunc);
    -
    242  };
    -
    243  uint8_t getUsbTaskState(void);
    -
    244  void setUsbTaskState(uint8_t state);
    -
    245 
    -
    246  EpInfo* getEpInfoEntry(uint8_t addr, uint8_t ep);
    -
    247  uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr);
    -
    248 
    -
    249  /* Control requests */
    -
    250  uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
    -
    251  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr);
    -
    252 
    -
    253  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p);
    -
    254 
    -
    255  uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr);
    -
    256  uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr);
    -
    257  uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value);
    -
    258 
    -
    259  uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, bool direction);
    -
    260  uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit);
    -
    261  uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval = 0);
    -
    262  uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data);
    -
    263  uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit);
    -
    264 
    -
    265  void Task(void);
    -
    266 
    -
    267  uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed);
    -
    268  uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed);
    -
    269  uint8_t ReleaseDevice(uint8_t addr);
    -
    270 
    -
    271  uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
    -
    272  uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p);
    -
    273 
    -
    274 private:
    -
    275  void init();
    -
    276  uint8_t SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit);
    -
    277  uint8_t OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data);
    -
    278  uint8_t InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0);
    -
    279  uint8_t AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed);
    -
    280 };
    -
    281 
    -
    282 #if 0 //defined(USB_METHODS_INLINE)
    -
    283 //get device descriptor
    -
    284 
    -
    285 inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
    -
    286  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr));
    -
    287 }
    -
    288 //get configuration descriptor
    -
    289 
    -
    290 inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
    -
    291  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr));
    -
    292 }
    -
    293 //get string descriptor
    -
    294 
    -
    295 inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) {
    -
    296  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr));
    -
    297 }
    -
    298 //set address
    -
    299 
    -
    300 inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
    -
    301  return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, NULL));
    -
    302 }
    -
    303 //set configuration
    -
    304 
    -
    305 inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
    -
    306  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, NULL));
    -
    307 }
    -
    308 
    -
    309 #endif // defined(USB_METHODS_INLINE)
    -
    310 
    -
    311 #endif /* USBCORE_H */
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This program is free software; you can redistribute it and/or modify
    4 it under the terms of the GNU General Public License as published by
    5 the Free Software Foundation; either version 2 of the License, or
    6 (at your option) any later version.
    7 
    8 This program is distributed in the hope that it will be useful,
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11 GNU General Public License for more details.
    12 
    13 You should have received a copy of the GNU General Public License
    14 along with this program; if not, write to the Free Software
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    16 
    17 Contact information
    18 -------------------
    19 
    20 Circuits At Home, LTD
    21 Web : http://www.circuitsathome.com
    22 e-mail : support@circuitsathome.com
    23  */
    24 
    25 #if !defined(_usb_h_) || defined(USBCORE_H)
    26 #error "Never include UsbCore.h directly; include Usb.h instead"
    27 #else
    28 #define USBCORE_H
    29 
    30 // Not used anymore? If anyone uses this, please let us know so that this may be
    31 // moved to the proper place, settings.h.
    32 //#define USB_METHODS_INLINE
    33 
    34 /* shield pins. First parameter - SS pin, second parameter - INT pin */
    35 #ifdef BOARD_BLACK_WIDDOW
    36 typedef MAX3421e<P6, P3> MAX3421E; // Black Widow
    37 #elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
    38 #if EXT_RAM
    39 typedef MAX3421e<P20, P7> MAX3421E; // Teensy++ 2.0 with XMEM2
    40 #else
    41 typedef MAX3421e<P9, P8> MAX3421E; // Teensy++ 1.0 and 2.0
    42 #endif
    43 #elif defined(BOARD_MEGA_ADK)
    44 typedef MAX3421e<P53, P54> MAX3421E; // Arduino Mega ADK
    45 #elif defined(ARDUINO_AVR_BALANDUINO)
    46 typedef MAX3421e<P20, P19> MAX3421E; // Balanduino
    47 #elif defined(__ARDUINO_X86__) && PLATFORM_ID == 0x06
    48 typedef MAX3421e<P3, P2> MAX3421E; // The Intel Galileo supports much faster read and write speed at pin 2 and 3
    49 #elif defined(ESP8266)
    50 typedef MAX3421e<P15, P5> MAX3421E; // ESP8266 boards
    51 #elif defined(ESP32)
    52 typedef MAX3421e<P5, P17> MAX3421E; // ESP32 boards
    53 #elif (defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__))
    54 typedef MAX3421e<Pb4, Pb3> MAX3421E; // Sanguino
    55 #else
    56 typedef MAX3421e<P10, P9> MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo, Due etc.), Intel Edison, Intel Galileo 2 or Teensy 2.0 and 3.x
    57 #endif
    58 
    59 /* Common setup data constant combinations */
    60 #define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //get descriptor request type
    61 #define bmREQ_SET USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //set request type for all but 'set feature' and 'set interface'
    62 #define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE //get interface request type
    63 
    64 // D7 data transfer direction (0 - host-to-device, 1 - device-to-host)
    65 // D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved)
    66 // D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved)
    67 
    68 // USB Device Classes
    69 #define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors
    70 #define USB_CLASS_AUDIO 0x01 // Audio
    71 #define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control
    72 #define USB_CLASS_HID 0x03 // HID
    73 #define USB_CLASS_PHYSICAL 0x05 // Physical
    74 #define USB_CLASS_IMAGE 0x06 // Image
    75 #define USB_CLASS_PRINTER 0x07 // Printer
    76 #define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage
    77 #define USB_CLASS_HUB 0x09 // Hub
    78 #define USB_CLASS_CDC_DATA 0x0a // CDC-Data
    79 #define USB_CLASS_SMART_CARD 0x0b // Smart-Card
    80 #define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security
    81 #define USB_CLASS_VIDEO 0x0e // Video
    82 #define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare
    83 #define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device
    84 #define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller
    85 #define USB_CLASS_MISC 0xef // Miscellaneous
    86 #define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific
    87 #define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific
    88 
    89 // Additional Error Codes
    90 #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1
    91 #define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2
    92 #define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3
    93 #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4
    94 #define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5
    95 #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6
    96 #define USB_ERROR_EPINFO_IS_NULL 0xD7
    97 #define USB_ERROR_INVALID_ARGUMENT 0xD8
    98 #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9
    99 #define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA
    100 #define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB
    101 #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET 0xE0
    102 #define USB_ERROR_FailGetDevDescr 0xE1
    103 #define USB_ERROR_FailSetDevTblEntry 0xE2
    104 #define USB_ERROR_FailGetConfDescr 0xE3
    105 #define USB_ERROR_TRANSFER_TIMEOUT 0xFF
    106 
    107 #define USB_XFER_TIMEOUT 5000 // (5000) USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec
    108 //#define USB_NAK_LIMIT 32000 // NAK limit for a transfer. 0 means NAKs are not counted
    109 #define USB_RETRY_LIMIT 3 // 3 retry limit for a transfer
    110 #define USB_SETTLE_DELAY 200 // settle delay in milliseconds
    111 
    112 #define USB_NUMDEVICES 16 //number of USB devices
    113 //#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller
    114 #define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms
    115 
    116 /* USB state machine states */
    117 #define USB_STATE_MASK 0xf0
    118 
    119 #define USB_STATE_DETACHED 0x10
    120 #define USB_DETACHED_SUBSTATE_INITIALIZE 0x11
    121 #define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12
    122 #define USB_DETACHED_SUBSTATE_ILLEGAL 0x13
    123 #define USB_ATTACHED_SUBSTATE_SETTLE 0x20
    124 #define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30
    125 #define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40
    126 #define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50
    127 #define USB_ATTACHED_SUBSTATE_WAIT_RESET 0x51
    128 #define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60
    129 #define USB_STATE_ADDRESSING 0x70
    130 #define USB_STATE_CONFIGURING 0x80
    131 #define USB_STATE_RUNNING 0x90
    132 #define USB_STATE_ERROR 0xa0
    133 
    135 public:
    136 
    137  virtual uint8_t Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) {
    138  return 0;
    139  }
    140 
    141  virtual uint8_t ConfigureDevice(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) {
    142  return 0;
    143  }
    144 
    145  virtual uint8_t Release() {
    146  return 0;
    147  }
    148 
    149  virtual uint8_t Poll() {
    150  return 0;
    151  }
    152 
    153  virtual uint8_t GetAddress() {
    154  return 0;
    155  }
    156 
    157  virtual void ResetHubPort(uint8_t port __attribute__((unused))) {
    158  return;
    159  } // Note used for hubs only!
    160 
    161  virtual bool VIDPIDOK(uint16_t vid __attribute__((unused)), uint16_t pid __attribute__((unused))) {
    162  return false;
    163  }
    164 
    165  virtual bool DEVCLASSOK(uint8_t klass __attribute__((unused))) {
    166  return false;
    167  }
    168 
    169  virtual bool DEVSUBCLASSOK(uint8_t subklass __attribute__((unused))) {
    170  return true;
    171  }
    172 
    173 };
    174 
    175 /* USB Setup Packet Structure */
    176 typedef struct {
    177 
    178  union { // offset description
    179  uint8_t bmRequestType; // 0 Bit-map of request type
    180 
    181  struct {
    182  uint8_t recipient : 5; // Recipient of the request
    183  uint8_t type : 2; // Type of request
    184  uint8_t direction : 1; // Direction of data X-fer
    185  } __attribute__((packed));
    186  } ReqType_u;
    187  uint8_t bRequest; // 1 Request
    188 
    189  union {
    190  uint16_t wValue; // 2 Depends on bRequest
    191 
    192  struct {
    193  uint8_t wValueLo;
    194  uint8_t wValueHi;
    195  } __attribute__((packed));
    196  } wVal_u;
    197  uint16_t wIndex; // 4 Depends on bRequest
    198  uint16_t wLength; // 6 Depends on bRequest
    199 } __attribute__((packed)) SETUP_PKT, *PSETUP_PKT;
    200 
    201 
    202 
    203 // Base class for incoming data parser
    204 
    206 public:
    207  virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) = 0;
    208 };
    209 
    210 class USB : public MAX3421E {
    212  USBDeviceConfig* devConfig[USB_NUMDEVICES];
    213  uint8_t bmHubPre;
    214 
    215 public:
    216  USB(void);
    217 
    218  void SetHubPreMask() {
    219  bmHubPre |= bmHUBPRE;
    220  };
    221 
    223  bmHubPre &= (~bmHUBPRE);
    224  };
    225 
    227  return (AddressPool&)addrPool;
    228  };
    229 
    231  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
    232  if(!devConfig[i]) {
    233  devConfig[i] = pdev;
    234  return 0;
    235  }
    236  }
    238  };
    239 
    241  addrPool.ForEachUsbDevice(pfunc);
    242  };
    243  uint8_t getUsbTaskState(void);
    244  void setUsbTaskState(uint8_t state);
    245 
    246  EpInfo* getEpInfoEntry(uint8_t addr, uint8_t ep);
    247  uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr);
    248 
    249  /* Control requests */
    250  uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
    251  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr);
    252 
    253  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p);
    254 
    255  uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr);
    256  uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr);
    257  uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value);
    258 
    259  uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, bool direction);
    260  uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit);
    261  uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval = 0);
    262  uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data);
    263  uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit);
    264 
    265  void Task(void);
    266 
    267  uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed);
    268  uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed);
    269  uint8_t ReleaseDevice(uint8_t addr);
    270 
    271  uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
    272  uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p);
    273 
    274 private:
    275  void init();
    276  uint8_t SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit);
    277  uint8_t OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data);
    278  uint8_t InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0);
    279  uint8_t AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed);
    280 };
    281 
    282 #if 0 //defined(USB_METHODS_INLINE)
    283 //get device descriptor
    284 
    285 inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
    286  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr));
    287 }
    288 //get configuration descriptor
    289 
    290 inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
    291  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr));
    292 }
    293 //get string descriptor
    294 
    295 inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) {
    296  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr));
    297 }
    298 //set address
    299 
    300 inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
    301  return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, NULL));
    302 }
    303 //set configuration
    304 
    305 inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
    306  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, NULL));
    307 }
    308 
    309 #endif // defined(USB_METHODS_INLINE)
    310 
    311 #endif /* USBCORE_H */
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    uint16_t wValue
    Definition: UsbCore.h:190
    virtual uint8_t Poll()
    Definition: UsbCore.h:149
    #define bmHUBPRE
    Definition: max3421e.h:172
    virtual uint8_t GetAddress()
    Definition: UsbCore.h:153
    -
    EpInfo * getEpInfoEntry(uint8_t addr, uint8_t ep)
    Definition: Usb.cpp:44
    #define USB_DESCRIPTOR_STRING
    Definition: usb_ch9.h:72
    uint16_t wLength
    Definition: UsbCore.h:198
    #define USB_REQUEST_GET_DESCRIPTOR
    Definition: usb_ch9.h:44
    #define USB_DESCRIPTOR_DEVICE
    Definition: usb_ch9.h:70
    -
    uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, bool direction)
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:840
    #define USB_NUMDEVICES
    Definition: UsbCore.h:112
    -
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: UsbCore.h:141
    uint8_t bmRequestType
    Definition: UsbCore.h:179
    -
    uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p)
    Definition: Usb.cpp:126
    #define USB_DESCRIPTOR_CONFIGURATION
    Definition: usb_ch9.h:71
    void ResetHubPreMask()
    Definition: UsbCore.h:222
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:831
    -
    USB(void)
    Definition: Usb.cpp:25
    -
    void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
    Definition: address.h:97
    uint16_t wIndex
    Definition: UsbCore.h:197
    void SetHubPreMask()
    Definition: UsbCore.h:218
    Definition: address.h:39
    -
    void setUsbTaskState(uint8_t state)
    Definition: Usb.cpp:40
    -
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:303
    #define bmREQ_GET_DESCR
    Definition: UsbCore.h:60
    virtual void ResetHubPort(uint8_t port)
    Definition: UsbCore.h:157
    #define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS
    Definition: UsbCore.h:92
    uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
    Definition: Usb.cpp:826
    #define USB_REQUEST_SET_ADDRESS
    Definition: usb_ch9.h:43
    -
    uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit)
    MAX3421e< P10, P9 > MAX3421E
    Definition: UsbCore.h:56
    -
    uint8_t getUsbTaskState(void)
    Definition: Usb.cpp:36
    -
    void Task(void)
    Definition: Usb.cpp:455
    virtual bool DEVSUBCLASSOK(uint8_t subklass)
    Definition: UsbCore.h:169
    -
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:209
    void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
    Definition: address.h:199
    -
    uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit)
    Definition: Usb.cpp:401
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: UsbCore.h:137
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:226
    virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: UsbCore.h:161
    -
    uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: Usb.cpp:683
    Definition: UsbCore.h:210
    uint8_t bRequest
    Definition: UsbCore.h:187
    virtual uint8_t Release()
    Definition: UsbCore.h:145
    @@ -455,16 +131,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
    Definition: UsbCore.h:240
    #define USB_REQUEST_SET_CONFIGURATION
    Definition: usb_ch9.h:47
    uint8_t wValueHi
    Definition: UsbCore.h:194
    -
    uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: Usb.cpp:561
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:796
    uint8_t wValueLo
    Definition: UsbCore.h:193
    -
    uint8_t ReleaseDevice(uint8_t addr)
    Definition: Usb.cpp:781
    +
    void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
    Definition: address.h:97
    diff --git a/_wii_8cpp.html b/_wii_8cpp.html index 23c6c15c..57d46c5c 100644 --- a/_wii_8cpp.html +++ b/_wii_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Wii.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -87,13 +88,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Wii.cpp File Reference
    -
    #include "Wii.h"
    +
    #include "Wii.h"
    Include dependency graph for Wii.cpp:
    - + + + + + + +

    Go to the source code of this file.

    @@ -117,21 +124,7 @@ Variables
    -Initial value:
    = {
    -
    0x00,
    -
    0x10,
    -
    0x20,
    -
    0x40,
    -
    0x80,
    -
    -
    0x90,
    -
    0xA0,
    -
    0xC0,
    -
    0xD0,
    -
    0xE0,
    -
    0xF0,
    -
    }
    -
    +Initial value:
    = {
    0x00,
    0x10,
    0x20,
    0x40,
    0x80,
    0x90,
    0xA0,
    0xC0,
    0xD0,
    0xE0,
    0xF0,
    }

    Definition at line 25 of file Wii.cpp.

    @@ -145,26 +138,7 @@ Variables
    -Initial value:
    = {
    -
    0x00008,
    -
    0x00002,
    -
    0x00004,
    -
    0x00001,
    -
    -
    0,
    -
    0x00010,
    -
    0x00100,
    -
    0x00200,
    -
    -
    0x01000,
    -
    0x08000,
    -
    0x10000,
    -
    0x20000,
    -
    -
    0x00400,
    -
    0x00800,
    -
    }
    -
    +Initial value:
    = {
    0x00008,
    0x00002,
    0x00004,
    0x00001,
    0,
    0x00010,
    0x00100,
    0x00200,
    0x01000,
    0x08000,
    0x10000,
    0x20000,
    0x00400,
    0x00800,
    }

    Definition at line 40 of file Wii.cpp.

    @@ -178,32 +152,7 @@ Variables
    -Initial value:
    = {
    -
    0x00100,
    -
    0x00080,
    -
    0x00040,
    -
    0x00200,
    -
    -
    0,
    -
    0x00004,
    -
    0x20000,
    -
    0x10000,
    -
    -
    0x00010,
    -
    0x00008,
    -
    0, 0,
    -
    -
    0x04000,
    -
    0x01000,
    -
    0x00800,
    -
    0x02000,
    -
    -
    0x00020,
    -
    0x00002,
    -
    0x08000,
    -
    0x00400,
    -
    }
    -
    +Initial value:
    = {
    0x00100,
    0x00080,
    0x00040,
    0x00200,
    0,
    0x00004,
    0x20000,
    0x10000,
    0x00010,
    0x00008,
    0, 0,
    0x04000,
    0x01000,
    0x00800,
    0x02000,
    0x00020,
    0x00002,
    0x08000,
    0x00400,
    }

    Definition at line 59 of file Wii.cpp.

    @@ -213,7 +162,7 @@ Variables diff --git a/_wii_8cpp__incl.map b/_wii_8cpp__incl.map index 1540b5b4..946f5cdc 100644 --- a/_wii_8cpp__incl.map +++ b/_wii_8cpp__incl.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/_wii_8cpp__incl.md5 b/_wii_8cpp__incl.md5 index ede72cbe..90a48635 100644 --- a/_wii_8cpp__incl.md5 +++ b/_wii_8cpp__incl.md5 @@ -1 +1 @@ -aa63a87439bccd881956e23a15da5c5b \ No newline at end of file +38127c822874d8407cb01375c5f2f11b \ No newline at end of file diff --git a/_wii_8cpp__incl.png b/_wii_8cpp__incl.png index 03a40788d4f7fc67d8914a30b143d0b30bd05951..f211dcd96cbf6ff50bd8b8625987450a2d79e2f2 100644 GIT binary patch literal 15588 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%0D{b7=l%_PMUfqs}h`YK;FZ!Wgp|CqU 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 Y(BUelB@=-E0|4^usj6JLj7jkS0%@eHS^xk5 diff --git a/_wii_8cpp_source.html b/_wii_8cpp_source.html index cc3ac847..25578cd1 100644 --- a/_wii_8cpp_source.html +++ b/_wii_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Wii.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

    @@ -85,1288 +86,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Wii.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16 
    -
    17  IR camera support added by Allan Glover (adglover9.81@gmail.com) and Kristian Lauszus
    -
    18  */
    -
    19 
    -
    20 #include "Wii.h"
    -
    21 // To enable serial debugging see "settings.h"
    -
    22 //#define EXTRADEBUG // Uncomment to get even more debugging data
    -
    23 //#define PRINTREPORT // Uncomment to print the report send by the Wii controllers
    -
    24 
    -
    25 const uint8_t WII_LEDS[] PROGMEM = {
    -
    26  0x00, // OFF
    -
    27  0x10, // LED1
    -
    28  0x20, // LED2
    -
    29  0x40, // LED3
    -
    30  0x80, // LED4
    -
    31 
    -
    32  0x90, // LED5
    -
    33  0xA0, // LED6
    -
    34  0xC0, // LED7
    -
    35  0xD0, // LED8
    -
    36  0xE0, // LED9
    -
    37  0xF0, // LED10
    -
    38 };
    -
    39 
    -
    40 const uint32_t WII_BUTTONS[] PROGMEM = {
    -
    41  0x00008, // UP
    -
    42  0x00002, // RIGHT
    -
    43  0x00004, // DOWN
    -
    44  0x00001, // LEFT
    -
    45 
    -
    46  0, // Skip
    -
    47  0x00010, // PLUS
    -
    48  0x00100, // TWO
    -
    49  0x00200, // ONE
    -
    50 
    -
    51  0x01000, // MINUS
    -
    52  0x08000, // HOME
    -
    53  0x10000, // Z
    -
    54  0x20000, // C
    -
    55 
    -
    56  0x00400, // B
    -
    57  0x00800, // A
    -
    58 };
    -
    59 const uint32_t WII_PROCONTROLLER_BUTTONS[] PROGMEM = {
    -
    60  0x00100, // UP
    -
    61  0x00080, // RIGHT
    -
    62  0x00040, // DOWN
    -
    63  0x00200, // LEFT
    -
    64 
    -
    65  0, // Skip
    -
    66  0x00004, // PLUS
    -
    67  0x20000, // L3
    -
    68  0x10000, // R3
    -
    69 
    -
    70  0x00010, // MINUS
    -
    71  0x00008, // HOME
    -
    72  0, 0, // Skip
    -
    73 
    -
    74  0x04000, // B
    -
    75  0x01000, // A
    -
    76  0x00800, // X
    -
    77  0x02000, // Y
    -
    78 
    -
    79  0x00020, // L
    -
    80  0x00002, // R
    -
    81  0x08000, // ZL
    -
    82  0x00400, // ZR
    -
    83 };
    -
    84 
    -
    85 WII::WII(BTD *p, bool pair) :
    -
    86 BluetoothService(p) // Pointer to USB class instance - mandatory
    -
    87 {
    - -
    89 
    -
    90  HIDBuffer[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    91 
    -
    92  /* Set device cid for the control and intterrupt channelse - LSB */
    -
    93  control_dcid[0] = 0x60; // 0x0060
    -
    94  control_dcid[1] = 0x00;
    -
    95  interrupt_dcid[0] = 0x61; // 0x0061
    -
    96  interrupt_dcid[1] = 0x00;
    -
    97 
    -
    98  Reset();
    -
    99 }
    -
    100 
    -
    101 void WII::Reset() {
    -
    102  wiimoteConnected = false;
    -
    103  nunchuckConnected = false;
    -
    104  motionPlusConnected = false;
    -
    105  activateNunchuck = false;
    -
    106  motionValuesReset = false;
    -
    107  activeConnection = false;
    -
    108  motionPlusInside = false;
    -
    109  pBtd->wiiUProController = false;
    - -
    111  wiiBalanceBoardConnected = false;
    -
    112  l2cap_event_flag = 0; // Reset flags
    -
    113  l2cap_state = L2CAP_WAIT;
    -
    114 }
    -
    115 
    -
    116 void WII::disconnect() { // Use this void to disconnect any of the controllers
    -
    117  if(!motionPlusInside) { // The old Wiimote needs a delay after the first command or it will automatically reconnect
    -
    118  if(motionPlusConnected) {
    -
    119 #ifdef DEBUG_USB_HOST
    -
    120  Notify(PSTR("\r\nDeactivating Motion Plus"), 0x80);
    -
    121 #endif
    -
    122  initExtension1(); // This will disable the Motion Plus extension
    -
    123  }
    -
    124  timer = (uint32_t)millis() + 1000; // We have to wait for the message before the rest of the channels can be deactivated
    -
    125  } else
    -
    126  timer = (uint32_t)millis(); // Don't wait
    -
    127  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
    -
    128  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, interrupt_scid, interrupt_dcid);
    -
    129  Reset();
    -
    130  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
    -
    131 }
    -
    132 
    -
    133 void WII::ACLData(uint8_t* l2capinbuf) {
    -
    134  if(!pBtd->l2capConnectionClaimed && pBtd->incomingWii && !wiimoteConnected && !activeConnection) {
    -
    135  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    -
    136  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
    -
    137  motionPlusInside = pBtd->motionPlusInside;
    -
    138  pBtd->incomingWii = false;
    -
    139  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
    -
    140  activeConnection = true;
    -
    141  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    -
    142  l2cap_state = L2CAP_WAIT;
    -
    143  }
    -
    144  }
    -
    145  }
    -
    146 
    -
    147  if(checkHciHandle(l2capinbuf, hci_handle)) { // acl_handle_ok
    -
    148  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
    -
    149  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
    -
    150 #ifdef DEBUG_USB_HOST
    -
    151  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
    -
    152  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    153  Notify(PSTR(" "), 0x80);
    -
    154  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    -
    155  Notify(PSTR(" "), 0x80);
    -
    156  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
    -
    157  Notify(PSTR(" "), 0x80);
    -
    158  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
    -
    159  Notify(PSTR(" "), 0x80);
    -
    160  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    -
    161  Notify(PSTR(" "), 0x80);
    -
    162  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    163 #endif
    -
    164  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_RESPONSE) {
    -
    165  if(((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) && ((l2capinbuf[18] | (l2capinbuf[19] << 8)) == SUCCESSFUL)) { // Success
    -
    166  if(l2capinbuf[14] == control_dcid[0] && l2capinbuf[15] == control_dcid[1]) {
    -
    167  //Notify(PSTR("\r\nHID Control Connection Complete"), 0x80);
    -
    168  identifier = l2capinbuf[9];
    -
    169  control_scid[0] = l2capinbuf[12];
    -
    170  control_scid[1] = l2capinbuf[13];
    - -
    172  } else if(l2capinbuf[14] == interrupt_dcid[0] && l2capinbuf[15] == interrupt_dcid[1]) {
    -
    173  //Notify(PSTR("\r\nHID Interrupt Connection Complete"), 0x80);
    -
    174  identifier = l2capinbuf[9];
    -
    175  interrupt_scid[0] = l2capinbuf[12];
    -
    176  interrupt_scid[1] = l2capinbuf[13];
    - -
    178  }
    -
    179  }
    -
    180  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    -
    181 #ifdef EXTRADEBUG
    -
    182  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
    -
    183  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    184  Notify(PSTR(" "), 0x80);
    -
    185  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    -
    186  Notify(PSTR(" SCID: "), 0x80);
    -
    187  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    -
    188  Notify(PSTR(" "), 0x80);
    -
    189  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    190  Notify(PSTR(" Identifier: "), 0x80);
    -
    191  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    -
    192 #endif
    -
    193  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
    -
    194  identifier = l2capinbuf[9];
    -
    195  control_scid[0] = l2capinbuf[14];
    -
    196  control_scid[1] = l2capinbuf[15];
    - -
    198  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
    -
    199  identifier = l2capinbuf[9];
    -
    200  interrupt_scid[0] = l2capinbuf[14];
    -
    201  interrupt_scid[1] = l2capinbuf[15];
    - -
    203  }
    -
    204  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
    -
    205  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
    -
    206  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    -
    207  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
    -
    208  identifier = l2capinbuf[9];
    - -
    210  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    -
    211  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
    -
    212  identifier = l2capinbuf[9];
    - -
    214  }
    -
    215  }
    -
    216  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
    -
    217  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    -
    218  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
    -
    219  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], control_scid);
    -
    220  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    -
    221  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
    -
    222  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], interrupt_scid);
    -
    223  }
    -
    224  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
    -
    225  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    -
    226 #ifdef DEBUG_USB_HOST
    -
    227  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
    -
    228 #endif
    -
    229  identifier = l2capinbuf[9];
    -
    230  pBtd->l2cap_disconnection_response(hci_handle, identifier, control_dcid, control_scid);
    -
    231  Reset();
    -
    232  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    -
    233 #ifdef DEBUG_USB_HOST
    -
    234  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
    -
    235 #endif
    -
    236  identifier = l2capinbuf[9];
    -
    237  pBtd->l2cap_disconnection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid);
    -
    238  Reset();
    -
    239  }
    -
    240  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
    -
    241  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
    -
    242  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
    -
    243  identifier = l2capinbuf[9];
    - -
    245  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
    -
    246  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
    -
    247  identifier = l2capinbuf[9];
    - -
    249  }
    -
    250  }
    -
    251 #ifdef EXTRADEBUG
    -
    252  else {
    -
    253  identifier = l2capinbuf[9];
    -
    254  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
    -
    255  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
    -
    256  }
    -
    257 #endif
    -
    258  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
    -
    259  //Notify(PSTR("\r\nL2CAP Interrupt"), 0x80);
    -
    260  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
    -
    261  if((l2capinbuf[9] >= 0x20 && l2capinbuf[9] <= 0x22) || (l2capinbuf[9] >= 0x30 && l2capinbuf[9] <= 0x37) || l2capinbuf[9] == 0x3e || l2capinbuf[9] == 0x3f) { // These reports include the buttons
    -
    262  if((l2capinbuf[9] >= 0x20 && l2capinbuf[9] <= 0x22) || l2capinbuf[9] == 0x31 || l2capinbuf[9] == 0x33) // These reports have no extensions bytes
    -
    263  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8));
    - -
    265  ButtonState = (uint32_t)(((~l2capinbuf[23]) & 0xFE) | ((uint16_t)(~l2capinbuf[24]) << 8) | ((uint32_t)((~l2capinbuf[25]) & 0x03) << 16));
    -
    266  else if(motionPlusConnected) {
    -
    267  if(l2capinbuf[20] & 0x02) // Only update the Wiimote buttons, since the extension bytes are from the Motion Plus
    -
    268  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)(ButtonState & 0xFFFF0000)));
    -
    269  else if(nunchuckConnected) // Update if it's a report from the Nunchuck
    -
    270  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)((~l2capinbuf[20]) & 0x0C) << 14));
    -
    271  //else if(classicControllerConnected) // Update if it's a report from the Classic Controller
    -
    272  } else if(nunchuckConnected) // The Nunchuck is directly connected
    -
    273  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)((~l2capinbuf[20]) & 0x03) << 16));
    -
    274  //else if(classicControllerConnected) // The Classic Controller is directly connected
    -
    275  else if(!unknownExtensionConnected)
    -
    276  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8));
    -
    277 #ifdef PRINTREPORT
    -
    278  Notify(PSTR("ButtonState: "), 0x80);
    -
    279  D_PrintHex<uint32_t > (ButtonState, 0x80);
    -
    280  Notify(PSTR("\r\n"), 0x80);
    -
    281 #endif
    -
    282  if(ButtonState != OldButtonState) {
    -
    283  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    -
    284  OldButtonState = ButtonState;
    -
    285  }
    -
    286  }
    -
    287  if(l2capinbuf[9] == 0x31 || l2capinbuf[9] == 0x33 || l2capinbuf[9] == 0x35 || l2capinbuf[9] == 0x37) { // Read the accelerometer
    -
    288  accXwiimote = ((l2capinbuf[12] << 2) | (l2capinbuf[10] & 0x60 >> 5)) - 500;
    -
    289  accYwiimote = ((l2capinbuf[13] << 2) | (l2capinbuf[11] & 0x20 >> 4)) - 500;
    -
    290  accZwiimote = ((l2capinbuf[14] << 2) | (l2capinbuf[11] & 0x40 >> 5)) - 500;
    -
    291  }
    -
    292  switch(l2capinbuf[9]) {
    -
    293  case 0x20: // Status Information - (a1) 20 BB BB LF 00 00 VV
    -
    294 #ifdef EXTRADEBUG
    -
    295  Notify(PSTR("\r\nStatus report was received"), 0x80);
    -
    296 #endif
    -
    297  wiiState = l2capinbuf[12]; // (0x01: Battery is nearly empty), (0x02: An Extension Controller is connected), (0x04: Speaker enabled), (0x08: IR enabled), (0x10: LED1, 0x20: LED2, 0x40: LED3, 0x80: LED4)
    -
    298  batteryLevel = l2capinbuf[15]; // Update battery level
    -
    299 
    -
    300  if(!checkBatteryLevel) { // If this is true it means that the user must have called getBatteryLevel()
    -
    301  if(l2capinbuf[12] & 0x02) { // Check if a extension is connected
    -
    302 #ifdef DEBUG_USB_HOST
    -
    303  if(!unknownExtensionConnected)
    -
    304  Notify(PSTR("\r\nExtension connected"), 0x80);
    -
    305 #endif
    -
    306  unknownExtensionConnected = true;
    -
    307 #ifdef WIICAMERA
    -
    308  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    -
    309 #endif
    -
    310  setReportMode(false, 0x35); // Also read the extension
    -
    311  } else {
    -
    312 #ifdef DEBUG_USB_HOST
    -
    313  Notify(PSTR("\r\nExtension disconnected"), 0x80);
    -
    314 #endif
    -
    315  if(motionPlusConnected) {
    -
    316 #ifdef DEBUG_USB_HOST
    -
    317  Notify(PSTR(" - from Motion Plus"), 0x80);
    -
    318 #endif
    - -
    320  if(!activateNunchuck) // If it's already trying to initialize the Nunchuck don't set it to false
    -
    321  nunchuckConnected = false;
    -
    322  //else if(classicControllerConnected)
    -
    323  } else if(nunchuckConnected) {
    -
    324 #ifdef DEBUG_USB_HOST
    -
    325  Notify(PSTR(" - Nunchuck"), 0x80);
    -
    326 #endif
    -
    327  nunchuckConnected = false; // It must be the Nunchuck controller then
    - -
    329  onInit();
    -
    330 #ifdef WIICAMERA
    -
    331  if(!isIRCameraEnabled()) // We still want to read from the IR camera, so do not change the report mode
    -
    332 #endif
    -
    333  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
    -
    334  } else {
    -
    335 #ifdef WIICAMERA
    -
    336  if(!isIRCameraEnabled()) // We still want to read from the IR camera, so do not change the report mode
    -
    337 #endif
    -
    338  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
    -
    339  }
    -
    340  }
    -
    341  }
    -
    342  else {
    -
    343 #ifdef EXTRADEBUG
    -
    344  Notify(PSTR("\r\nChecking battery level"), 0x80);
    -
    345 #endif
    -
    346  checkBatteryLevel = false; // Check for extensions by default
    -
    347  }
    -
    348 #ifdef DEBUG_USB_HOST
    -
    349  if(l2capinbuf[12] & 0x01)
    -
    350  Notify(PSTR("\r\nWARNING: Battery is nearly empty"), 0x80);
    -
    351 #endif
    -
    352 
    -
    353  break;
    -
    354  case 0x21: // Read Memory Data
    -
    355  if((l2capinbuf[12] & 0x0F) == 0) { // No error
    -
    356  uint8_t reportLength = (l2capinbuf[12] >> 4) + 1; // // Bit 4-7 is the length - 1
    -
    357  // See: http://wiibrew.org/wiki/Wiimote/Extension_Controllers
    -
    358  if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x00) {
    -
    359 #ifdef DEBUG_USB_HOST
    -
    360  Notify(PSTR("\r\nNunchuck connected"), 0x80);
    -
    361 #endif
    - -
    363  } else if(l2capinbuf[16] == 0x00 && (l2capinbuf[17] == 0xA6 || l2capinbuf[17] == 0xA4) && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x05) {
    -
    364 #ifdef DEBUG_USB_HOST
    -
    365  Notify(PSTR("\r\nMotion Plus connected"), 0x80);
    -
    366 #endif
    - -
    368  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x04 && l2capinbuf[20] == 0x05) {
    -
    369 #ifdef DEBUG_USB_HOST
    -
    370  Notify(PSTR("\r\nMotion Plus activated in normal mode"), 0x80);
    -
    371 #endif
    -
    372  motionPlusConnected = true;
    -
    373 #ifdef WIICAMERA
    -
    374  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    -
    375 #endif
    -
    376  setReportMode(false, 0x35); // Also read the extension
    -
    377  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x05 && l2capinbuf[20] == 0x05) {
    -
    378 #ifdef DEBUG_USB_HOST
    -
    379  Notify(PSTR("\r\nMotion Plus activated in Nunchuck pass-through mode"), 0x80);
    -
    380 #endif
    -
    381  activateNunchuck = false;
    -
    382  motionPlusConnected = true;
    -
    383  nunchuckConnected = true;
    -
    384 #ifdef WIICAMERA
    -
    385  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    -
    386 #endif
    -
    387  setReportMode(false, 0x35); // Also read the extension
    -
    388  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA6 && l2capinbuf[18] == 0x20 && (l2capinbuf[19] == 0x00 || l2capinbuf[19] == 0x04 || l2capinbuf[19] == 0x05 || l2capinbuf[19] == 0x07) && l2capinbuf[20] == 0x05) {
    -
    389 #ifdef DEBUG_USB_HOST
    -
    390  Notify(PSTR("\r\nInactive Wii Motion Plus"), 0x80);
    -
    391  Notify(PSTR("\r\nPlease unplug the Motion Plus, disconnect the Wiimote and then replug the Motion Plus Extension"), 0x80);
    -
    392 #endif
    -
    393  stateCounter = 300; // Skip the rest in "WII_CHECK_MOTION_PLUS_STATE"
    -
    394  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x01 && l2capinbuf[20] == 0x20) {
    -
    395 #ifdef DEBUG_USB_HOST
    -
    396  Notify(PSTR("\r\nWii U Pro Controller connected"), 0x80);
    -
    397 #endif
    - -
    399  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x04 && l2capinbuf[20] == 0x02) {
    -
    400 #ifdef DEBUG_USB_HOST
    -
    401  Notify(PSTR("\r\nWii Balance Board connected"), 0x80);
    -
    402 #endif
    -
    403  setReportMode(false, 0x32); // Read the Wii Balance Board extension
    - -
    405  }
    -
    406  // Wii Balance Board calibration reports (24 bits in total)
    -
    407  else if(l2capinbuf[13] == 0x00 && l2capinbuf[14] == 0x24 && reportLength == 16) { // First 16-bit
    -
    408  for(uint8_t i = 0; i < 2; i++) {
    -
    409  for(uint8_t j = 0; j < 4; j++)
    -
    410  wiiBalanceBoardCal[i][j] = l2capinbuf[16 + 8 * i + 2 * j] | l2capinbuf[15 + 8 * i + 2 * j] << 8;
    -
    411  }
    -
    412  } else if(l2capinbuf[13] == 0x00 && l2capinbuf[14] == 0x34 && reportLength == 8) { // Last 8-bit
    -
    413  for(uint8_t j = 0; j < 4; j++)
    -
    414  wiiBalanceBoardCal[2][j] = l2capinbuf[16 + 2 * j] | l2capinbuf[15 + 2 * j] << 8;
    -
    415 #ifdef DEBUG_USB_HOST
    -
    416  Notify(PSTR("\r\nWii Balance Board calibration values read successfully"), 0x80);
    -
    417 #endif
    - - -
    420  }
    -
    421 #ifdef DEBUG_USB_HOST
    -
    422  else {
    -
    423  Notify(PSTR("\r\nUnknown Device: "), 0x80);
    -
    424  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    425  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    426  Notify(PSTR("\r\nData: "), 0x80);
    -
    427  for(uint8_t i = 0; i < reportLength; i++) {
    -
    428  D_PrintHex<uint8_t > (l2capinbuf[15 + i], 0x80);
    -
    429  Notify(PSTR(" "), 0x80);
    -
    430  }
    -
    431  }
    -
    432 #endif
    -
    433  }
    -
    434 #ifdef EXTRADEBUG
    -
    435  else {
    -
    436  Notify(PSTR("\r\nReport Error: "), 0x80);
    -
    437  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    438  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    439  }
    -
    440 #endif
    -
    441  break;
    -
    442  case 0x22: // Acknowledge output report, return function result
    -
    443 #ifdef DEBUG_USB_HOST
    -
    444  if(l2capinbuf[13] != 0x00) { // Check if there is an error
    -
    445  Notify(PSTR("\r\nCommand failed: "), 0x80);
    -
    446  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    -
    447  }
    -
    448 #endif
    -
    449  break;
    -
    450  case 0x30: // Core buttons - (a1) 30 BB BB
    -
    451  break;
    -
    452  case 0x31: // Core Buttons and Accelerometer - (a1) 31 BB BB AA AA AA
    -
    453  break;
    -
    454  case 0x32: // Core Buttons with 8 Extension bytes - (a1) 32 BB BB EE EE EE EE EE EE EE EE
    -
    455  // See: http://wiibrew.org/wiki/Wii_Balance_Board#Data_Format
    -
    456  wiiBalanceBoardRaw[TopRight] = l2capinbuf[13] | l2capinbuf[12] << 8; // Top right
    -
    457  wiiBalanceBoardRaw[BotRight] = l2capinbuf[15] | l2capinbuf[14] << 8; // Bottom right
    -
    458  wiiBalanceBoardRaw[TopLeft] = l2capinbuf[17] | l2capinbuf[16] << 8; // Top left
    -
    459  wiiBalanceBoardRaw[BotLeft] = l2capinbuf[19] | l2capinbuf[18] << 8; // Bottom left
    -
    460  break;
    -
    461  case 0x33: // Core Buttons with Accelerometer and 12 IR bytes - (a1) 33 BB BB AA AA AA II II II II II II II II II II II II
    -
    462 #ifdef WIICAMERA
    -
    463  // Read the IR data
    -
    464  IR_object_x1 = (l2capinbuf[15] | ((uint16_t)(l2capinbuf[17] & 0x30) << 4)); // x position
    -
    465  IR_object_y1 = (l2capinbuf[16] | ((uint16_t)(l2capinbuf[17] & 0xC0) << 2)); // y position
    -
    466  IR_object_s1 = (l2capinbuf[17] & 0x0F); // Size value, 0-15
    -
    467 
    -
    468  IR_object_x2 = (l2capinbuf[18] | ((uint16_t)(l2capinbuf[20] & 0x30) << 4));
    -
    469  IR_object_y2 = (l2capinbuf[19] | ((uint16_t)(l2capinbuf[20] & 0xC0) << 2));
    -
    470  IR_object_s2 = (l2capinbuf[20] & 0x0F);
    -
    471 
    -
    472  IR_object_x3 = (l2capinbuf[21] | ((uint16_t)(l2capinbuf[23] & 0x30) << 4));
    -
    473  IR_object_y3 = (l2capinbuf[22] | ((uint16_t)(l2capinbuf[23] & 0xC0) << 2));
    -
    474  IR_object_s3 = (l2capinbuf[23] & 0x0F);
    -
    475 
    -
    476  IR_object_x4 = (l2capinbuf[24] | ((uint16_t)(l2capinbuf[26] & 0x30) << 4));
    -
    477  IR_object_y4 = (l2capinbuf[25] | ((uint16_t)(l2capinbuf[26] & 0xC0) << 2));
    -
    478  IR_object_s4 = (l2capinbuf[26] & 0x0F);
    -
    479 #endif
    -
    480  break;
    -
    481  case 0x34: // Core Buttons with 19 Extension bytes - (a1) 34 BB BB EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE
    -
    482  break;
    -
    483  /* 0x3e and 0x3f both give unknown report types when report mode is 0x3e or 0x3f with mode number 0x05 */
    -
    484  case 0x3E: // Core Buttons with Accelerometer and 32 IR bytes
    -
    485  // (a1) 31 BB BB AA AA AA II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II
    -
    486  // corresponds to output report mode 0x3e
    -
    487 
    -
    488  /**** for reading in full mode: DOES NOT WORK YET ****/
    -
    489  /* When it works it will also have intensity and bounding box data */
    -
    490  /*
    -
    491  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
    -
    492  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
    -
    493  IR_object_s1 = (l2capinbuf[15] & 0x0F);
    -
    494  */
    -
    495  break;
    -
    496  case 0x3F:
    -
    497  /*
    -
    498  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
    -
    499  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
    -
    500  IR_object_s1 = (l2capinbuf[15] & 0x0F);
    -
    501  */
    -
    502  break;
    -
    503  case 0x35: // Core Buttons and Accelerometer with 16 Extension Bytes
    -
    504  // (a1) 35 BB BB AA AA AA EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE
    -
    505 #if 1 // Set this to 0 if you don't want to use an extension, this reduceds the size of the library a lot!
    -
    506  if(motionPlusConnected) {
    -
    507  if(l2capinbuf[20] & 0x02) { // Check if it's a report from the Motion controller or the extension
    -
    508  if(motionValuesReset) { // We will only use the values when the gyro value has been set
    -
    509  gyroYawRaw = ((l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6)) - gyroYawZero);
    -
    510  gyroRollRaw = ((l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6)) - gyroRollZero);
    -
    511  gyroPitchRaw = ((l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6)) - gyroPitchZero);
    -
    512 
    -
    513  yawGyroSpeed = (float)gyroYawRaw / ((float)gyroYawZero / yawGyroScale);
    -
    514  rollGyroSpeed = -(float)gyroRollRaw / ((float)gyroRollZero / rollGyroScale); // We invert these values so they will fit the acc values
    - -
    516 
    -
    517  /* The onboard gyro has two ranges for slow and fast mode */
    -
    518  if(!(l2capinbuf[18] & 0x02)) // Check if fast mode is used
    -
    519  yawGyroSpeed *= 4.545;
    -
    520  if(!(l2capinbuf[18] & 0x01)) // Check if fast mode is used
    -
    521  pitchGyroSpeed *= 4.545;
    -
    522  if(!(l2capinbuf[19] & 0x02)) // Check if fast mode is used
    -
    523  rollGyroSpeed *= 4.545;
    -
    524 
    -
    525  compPitch = (0.93f * (compPitch + (pitchGyroSpeed * (float)((uint32_t)micros() - timer) / 1000000.0f)))+(0.07f * getWiimotePitch()); // Use a complimentary filter to calculate the angle
    -
    526  compRoll = (0.93f * (compRoll + (rollGyroSpeed * (float)((uint32_t)micros() - timer) / 1000000.0f)))+(0.07f * getWiimoteRoll());
    -
    527 
    -
    528  gyroYaw += (yawGyroSpeed * ((float)((uint32_t)micros() - timer) / 1000000.0f));
    -
    529  gyroRoll += (rollGyroSpeed * ((float)((uint32_t)micros() - timer) / 1000000.0f));
    -
    530  gyroPitch += (pitchGyroSpeed * ((float)((uint32_t)micros() - timer) / 1000000.0f));
    -
    531  timer = (uint32_t)micros();
    -
    532  /*
    -
    533  // Uncomment these lines to tune the gyro scale variabels
    -
    534  Notify(PSTR("\r\ngyroYaw: "), 0x80);
    -
    535  Notify(gyroYaw, 0x80);
    -
    536  Notify(PSTR("\tgyroRoll: "), 0x80);
    -
    537  Notify(gyroRoll, 0x80);
    -
    538  Notify(PSTR("\tgyroPitch: "), 0x80);
    -
    539  Notify(gyroPitch, 0x80);
    -
    540  */
    -
    541  /*
    -
    542  Notify(PSTR("\twiimoteRoll: "), 0x80);
    -
    543  Notify(wiimoteRoll, 0x80);
    -
    544  Notify(PSTR("\twiimotePitch: "), 0x80);
    -
    545  Notify(wiimotePitch, 0x80);
    -
    546  */
    -
    547  } else {
    -
    548  if((int32_t)((uint32_t)micros() - timer) > 1000000) { // Loop for 1 sec before resetting the values
    -
    549 #ifdef DEBUG_USB_HOST
    -
    550  Notify(PSTR("\r\nThe gyro values has been reset"), 0x80);
    -
    551 #endif
    -
    552  gyroYawZero = (l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6));
    -
    553  gyroRollZero = (l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6));
    -
    554  gyroPitchZero = (l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6));
    -
    555 
    -
    556  rollGyroScale = 500; // You might need to adjust these
    -
    557  pitchGyroScale = 400;
    -
    558  yawGyroScale = 415;
    -
    559 
    -
    560  gyroYaw = 0;
    -
    561  gyroRoll = 0;
    -
    562  gyroPitch = 0;
    -
    563 
    -
    564  motionValuesReset = true;
    -
    565  timer = (uint32_t)micros();
    -
    566  }
    -
    567  }
    -
    568  } else {
    -
    569  if(nunchuckConnected) {
    -
    570  hatValues[HatX] = l2capinbuf[15];
    -
    571  hatValues[HatY] = l2capinbuf[16];
    -
    572  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x10 >> 3)) - 416;
    -
    573  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x20 >> 4)) - 416;
    -
    574  accZnunchuck = (((l2capinbuf[19] & 0xFE) << 2) | (l2capinbuf[20] & 0xC0 >> 5)) - 416;
    -
    575  }
    -
    576  //else if(classicControllerConnected) { }
    -
    577  }
    -
    578  if(l2capinbuf[19] & 0x01) {
    -
    579  if(!extensionConnected) {
    -
    580  extensionConnected = true;
    -
    581  unknownExtensionConnected = true;
    -
    582 #ifdef DEBUG_USB_HOST
    -
    583  Notify(PSTR("\r\nExtension connected to Motion Plus"), 0x80);
    -
    584 #endif
    -
    585  }
    -
    586  } else {
    -
    587  if(extensionConnected && !unknownExtensionConnected) {
    -
    588  extensionConnected = false;
    -
    589  unknownExtensionConnected = true;
    -
    590 #ifdef DEBUG_USB_HOST
    -
    591  Notify(PSTR("\r\nExtension disconnected from Motion Plus"), 0x80);
    -
    592 #endif
    -
    593  nunchuckConnected = false; // There is no extension connected to the Motion Plus if this report is sent
    -
    594  }
    -
    595  }
    -
    596 
    -
    597  } else if(nunchuckConnected) {
    -
    598  hatValues[HatX] = l2capinbuf[15];
    -
    599  hatValues[HatY] = l2capinbuf[16];
    -
    600  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x0C >> 2)) - 416;
    -
    601  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x30 >> 4)) - 416;
    -
    602  accZnunchuck = ((l2capinbuf[19] << 2) | (l2capinbuf[20] & 0xC0 >> 6)) - 416;
    -
    603  } else if(wiiUProControllerConnected) {
    -
    604  hatValues[LeftHatX] = (l2capinbuf[15] | l2capinbuf[16] << 8);
    -
    605  hatValues[RightHatX] = (l2capinbuf[17] | l2capinbuf[18] << 8);
    -
    606  hatValues[LeftHatY] = (l2capinbuf[19] | l2capinbuf[20] << 8);
    -
    607  hatValues[RightHatY] = (l2capinbuf[21] | l2capinbuf[22] << 8);
    -
    608  }
    -
    609 #endif
    -
    610  break;
    -
    611 #ifdef DEBUG_USB_HOST
    -
    612  default:
    -
    613  Notify(PSTR("\r\nUnknown Report type: "), 0x80);
    -
    614  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    -
    615  break;
    -
    616 #endif
    -
    617  }
    -
    618  }
    -
    619  }
    -
    620  L2CAP_task();
    -
    621  }
    -
    622 }
    -
    623 
    -
    624 void WII::L2CAP_task() {
    -
    625  switch(l2cap_state) {
    -
    626  /* These states are used if the Wiimote is the host */
    - - -
    629 #ifdef DEBUG_USB_HOST
    -
    630  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
    -
    631 #endif
    -
    632  l2cap_state = L2CAP_INTERRUPT_SETUP;
    -
    633  }
    -
    634  break;
    -
    635 
    - - -
    638 #ifdef DEBUG_USB_HOST
    -
    639  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
    -
    640 #endif
    -
    641  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, PENDING);
    -
    642  delay(1);
    -
    643  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, SUCCESSFUL);
    -
    644  identifier++;
    -
    645  delay(1);
    -
    646  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
    -
    647 
    -
    648  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
    -
    649  }
    -
    650  break;
    -
    651 
    -
    652  /* These states are used if the Arduino is the host */
    - - -
    655 #ifdef DEBUG_USB_HOST
    -
    656  Notify(PSTR("\r\nSend HID Control Config Request"), 0x80);
    -
    657 #endif
    -
    658  identifier++;
    - -
    660  l2cap_state = L2CAP_CONTROL_CONFIG_REQUEST;
    -
    661  }
    -
    662  break;
    -
    663 
    - - -
    666 #ifdef DEBUG_USB_HOST
    -
    667  Notify(PSTR("\r\nSend HID Interrupt Connection Request"), 0x80);
    -
    668 #endif
    -
    669  identifier++;
    - -
    671  l2cap_state = L2CAP_INTERRUPT_CONNECT_REQUEST;
    -
    672  }
    -
    673  break;
    -
    674 
    - - -
    677 #ifdef DEBUG_USB_HOST
    -
    678  Notify(PSTR("\r\nSend HID Interrupt Config Request"), 0x80);
    -
    679 #endif
    -
    680  identifier++;
    -
    681  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
    -
    682  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
    -
    683  }
    -
    684  break;
    -
    685 
    - -
    687  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
    -
    688 #ifdef DEBUG_USB_HOST
    -
    689  Notify(PSTR("\r\nHID Channels Established"), 0x80);
    -
    690 #endif
    -
    691  pBtd->connectToWii = false;
    -
    692  pBtd->pairWithWii = false;
    -
    693  stateCounter = 0;
    -
    694  l2cap_state = WII_CHECK_MOTION_PLUS_STATE;
    -
    695  }
    -
    696  break;
    -
    697 
    -
    698  /* The next states are in run() */
    -
    699 
    - -
    701  if(l2cap_check_flag(L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE) && ((int32_t)((uint32_t)millis() - timer) >= 0L)) {
    -
    702 #ifdef DEBUG_USB_HOST
    -
    703  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
    -
    704 #endif
    -
    705  identifier++;
    -
    706  pBtd->l2cap_disconnection_request(hci_handle, identifier, control_scid, control_dcid);
    -
    707  l2cap_state = L2CAP_CONTROL_DISCONNECT;
    -
    708  }
    -
    709  break;
    -
    710 
    - - -
    713 #ifdef DEBUG_USB_HOST
    -
    714  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
    -
    715 #endif
    - -
    717  hci_handle = -1; // Reset handle
    -
    718  l2cap_event_flag = 0; // Reset flags
    -
    719  l2cap_state = L2CAP_WAIT;
    -
    720  }
    -
    721  break;
    -
    722  }
    -
    723 }
    -
    724 
    -
    725 void WII::Run() {
    -
    726  if(l2cap_state == L2CAP_INTERRUPT_DISCONNECT && ((int32_t)((uint32_t)millis() - timer) >= 0L))
    -
    727  L2CAP_task(); // Call the rest of the disconnection routine after we have waited long enough
    -
    728 
    -
    729  switch(l2cap_state) {
    -
    730  case L2CAP_WAIT:
    -
    731  if(pBtd->connectToWii && !pBtd->l2capConnectionClaimed && !wiimoteConnected && !activeConnection) {
    - -
    733  activeConnection = true;
    -
    734  motionPlusInside = pBtd->motionPlusInside;
    -
    735 #ifdef DEBUG_USB_HOST
    -
    736  Notify(PSTR("\r\nSend HID Control Connection Request"), 0x80);
    -
    737 #endif
    -
    738  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    -
    739  l2cap_event_flag = 0; // Reset flags
    -
    740  identifier = 0;
    - -
    742  l2cap_state = L2CAP_CONTROL_CONNECT_REQUEST;
    - -
    744 #ifdef DEBUG_USB_HOST
    -
    745  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
    -
    746 #endif
    -
    747  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, PENDING);
    -
    748  delay(1);
    -
    749  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, SUCCESSFUL);
    -
    750  identifier++;
    -
    751  delay(1);
    - -
    753  l2cap_state = L2CAP_CONTROL_SUCCESS;
    -
    754  }
    -
    755  break;
    -
    756 
    - -
    758 #ifdef DEBUG_USB_HOST
    -
    759  if(stateCounter == 0) // Only print onnce
    -
    760  Notify(PSTR("\r\nChecking if a Motion Plus is connected"), 0x80);
    -
    761 #endif
    -
    762  stateCounter++;
    -
    763  if(stateCounter % 200 == 0)
    -
    764  checkMotionPresent(); // Check if there is a motion plus connected
    - -
    766  stateCounter = 0;
    -
    767  l2cap_state = WII_INIT_MOTION_PLUS_STATE;
    -
    768  timer = (uint32_t)micros();
    -
    769 
    -
    770  if(unknownExtensionConnected) {
    -
    771 #ifdef DEBUG_USB_HOST
    -
    772  Notify(PSTR("\r\nA extension is also connected"), 0x80);
    -
    773 #endif
    -
    774  activateNunchuck = true; // For we will just set this to true as this the only extension supported so far
    -
    775  }
    -
    776 
    -
    777  } else if(stateCounter == 601) { // We will try three times to check for the motion plus
    -
    778 #ifdef DEBUG_USB_HOST
    -
    779  Notify(PSTR("\r\nNo Motion Plus was detected"), 0x80);
    -
    780 #endif
    -
    781  stateCounter = 0;
    -
    782  l2cap_state = WII_CHECK_EXTENSION_STATE;
    -
    783  }
    -
    784  break;
    -
    785 
    -
    786  case WII_CHECK_EXTENSION_STATE: // This is used to check if there is anything plugged in to the extension port
    -
    787 #ifdef DEBUG_USB_HOST
    -
    788  if(stateCounter == 0) // Only print onnce
    -
    789  Notify(PSTR("\r\nChecking if there is any extension connected"), 0x80);
    -
    790 #endif
    -
    791  stateCounter++; // We use this counter as there has to be a short delay between the commands
    -
    792  if(stateCounter == 1)
    -
    793  statusRequest(); // See if a new device has connected
    -
    794  if(stateCounter == 100) {
    -
    795  if(unknownExtensionConnected) // Check if there is a extension is connected to the port
    -
    796  initExtension1();
    -
    797  else
    -
    798  stateCounter = 499;
    -
    799  } else if(stateCounter == 200)
    -
    800  initExtension2();
    -
    801  else if(stateCounter == 300) {
    -
    802  readExtensionType();
    -
    803  unknownExtensionConnected = false;
    -
    804  } else if(stateCounter == 400) {
    - -
    806 #ifdef DEBUG_USB_HOST
    -
    807  Notify(PSTR("\r\nReading Wii Balance Board calibration values"), 0x80);
    -
    808 #endif
    -
    809  readWiiBalanceBoardCalibration();
    -
    810  } else
    -
    811  stateCounter = 499;
    -
    812  } else if(stateCounter == 500) {
    -
    813  stateCounter = 0;
    -
    814  l2cap_state = TURN_ON_LED;
    -
    815  }
    -
    816  break;
    -
    817 
    - -
    819  stateCounter++;
    -
    820  if(stateCounter == 1)
    -
    821  initMotionPlus();
    -
    822  else if(stateCounter == 100)
    -
    823  activateMotionPlus();
    -
    824  else if(stateCounter == 200)
    -
    825  readExtensionType(); // Check if it has been activated
    -
    826  else if(stateCounter == 300) {
    -
    827  stateCounter = 0;
    -
    828  unknownExtensionConnected = false; // The motion plus will send a status report when it's activated, we will set this to false so it doesn't reinitialize the Motion Plus
    -
    829  l2cap_state = TURN_ON_LED;
    -
    830  }
    -
    831  break;
    -
    832 
    -
    833  case TURN_ON_LED:
    - -
    835  nunchuckConnected = true;
    -
    836  wiimoteConnected = true;
    -
    837  onInit();
    -
    838  l2cap_state = L2CAP_DONE;
    -
    839  break;
    -
    840 
    -
    841  case L2CAP_DONE:
    -
    842  if(unknownExtensionConnected) {
    -
    843 #ifdef DEBUG_USB_HOST
    -
    844  if(stateCounter == 0) // Only print once
    -
    845  Notify(PSTR("\r\nChecking extension port"), 0x80);
    -
    846 #endif
    -
    847  stateCounter++; // We will use this counter as there has to be a short delay between the commands
    -
    848  if(stateCounter == 50)
    -
    849  statusRequest();
    -
    850  else if(stateCounter == 100)
    -
    851  initExtension1();
    -
    852  else if(stateCounter == 150)
    -
    853  if((extensionConnected && motionPlusConnected) || (unknownExtensionConnected && !motionPlusConnected))
    -
    854  initExtension2();
    -
    855  else
    -
    856  stateCounter = 299; // There is no extension connected
    -
    857  else if(stateCounter == 200)
    -
    858  readExtensionType();
    -
    859  else if(stateCounter == 250) {
    - -
    861 #ifdef DEBUG_USB_HOST
    -
    862  Notify(PSTR("\r\nNunchuck was reconnected"), 0x80);
    -
    863 #endif
    -
    864  activateNunchuck = true;
    -
    865  nunchuckConnected = true;
    -
    866  }
    - -
    868  stateCounter = 449;
    -
    869  } else if(stateCounter == 300) {
    -
    870  if(motionPlusConnected) {
    -
    871 #ifdef DEBUG_USB_HOST
    -
    872  Notify(PSTR("\r\nReactivating the Motion Plus"), 0x80);
    -
    873 #endif
    -
    874  initMotionPlus();
    -
    875  } else
    -
    876  stateCounter = 449;
    -
    877  } else if(stateCounter == 350)
    -
    878  activateMotionPlus();
    -
    879  else if(stateCounter == 400)
    -
    880  readExtensionType(); // Check if it has been activated
    -
    881  else if(stateCounter == 450) {
    -
    882  onInit();
    -
    883  stateCounter = 0;
    -
    884  unknownExtensionConnected = false;
    -
    885  }
    -
    886  } else
    -
    887  stateCounter = 0;
    -
    888  break;
    -
    889  }
    -
    890 }
    -
    891 
    -
    892 /************************************************************/
    -
    893 /* HID Commands */
    -
    894 /************************************************************/
    -
    895 
    -
    896 void WII::HID_Command(uint8_t* data, uint8_t nbytes) {
    -
    897  if(motionPlusInside)
    -
    898  pBtd->L2CAP_Command(hci_handle, data, nbytes, interrupt_scid[0], interrupt_scid[1]); // It's the new Wiimote with the Motion Plus Inside or Wii U Pro controller
    -
    899  else
    -
    900  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]);
    -
    901 }
    -
    902 
    - -
    904  HIDBuffer[1] = 0x11;
    -
    905  HIDBuffer[2] = 0x00;
    -
    906  HID_Command(HIDBuffer, 3);
    -
    907 }
    -
    908 
    - -
    910  HIDBuffer[1] = 0x11;
    -
    911  HIDBuffer[2] &= ~0x01; // Bit 0 control the rumble
    -
    912  HID_Command(HIDBuffer, 3);
    -
    913 }
    -
    914 
    - -
    916  HIDBuffer[1] = 0x11;
    -
    917  HIDBuffer[2] |= 0x01; // Bit 0 control the rumble
    -
    918  HID_Command(HIDBuffer, 3);
    -
    919 }
    -
    920 
    - -
    922  HIDBuffer[1] = 0x11;
    -
    923  HIDBuffer[2] ^= 0x01; // Bit 0 control the rumble
    -
    924  HID_Command(HIDBuffer, 3);
    -
    925 }
    -
    926 
    -
    927 void WII::setLedRaw(uint8_t value) {
    -
    928  HIDBuffer[1] = 0x11;
    -
    929  HIDBuffer[2] = value | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    930  HID_Command(HIDBuffer, 3);
    -
    931 }
    -
    932 
    - -
    934  HIDBuffer[1] = 0x11;
    -
    935  HIDBuffer[2] &= ~(pgm_read_byte(&WII_LEDS[(uint8_t)a]));
    -
    936  HID_Command(HIDBuffer, 3);
    -
    937 }
    -
    938 
    - -
    940  if(a == OFF)
    -
    941  setLedRaw(0);
    -
    942  else {
    -
    943  HIDBuffer[1] = 0x11;
    -
    944  HIDBuffer[2] |= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
    -
    945  HID_Command(HIDBuffer, 3);
    -
    946  }
    -
    947 }
    -
    948 
    - -
    950  HIDBuffer[1] = 0x11;
    -
    951  HIDBuffer[2] ^= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
    -
    952  HID_Command(HIDBuffer, 3);
    -
    953 }
    -
    954 
    - -
    956  HIDBuffer[1] = 0x11;
    -
    957  HIDBuffer[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    958  if(wiimoteConnected)
    -
    959  HIDBuffer[2] |= 0x10; // If it's connected LED1 will light up
    - -
    961  HIDBuffer[2] |= 0x20; // If it's connected LED2 will light up
    - -
    963  HIDBuffer[2] |= 0x40; // If it's connected LED3 will light up
    -
    964 
    -
    965  HID_Command(HIDBuffer, 3);
    -
    966 }
    -
    967 
    - -
    969  checkBatteryLevel = true; // This is needed so the library knows that the status response is a response to this function
    -
    970  statusRequest(); // This will update the battery level
    -
    971  return batteryLevel;
    -
    972 };
    -
    973 
    -
    974 void WII::setReportMode(bool continuous, uint8_t mode) {
    -
    975 #ifdef EXTRADEBUG
    -
    976  Notify(PSTR("\r\nReport mode was changed to: "), 0x80);
    -
    977  D_PrintHex<uint8_t > (mode, 0x80);
    -
    978 #endif
    -
    979  uint8_t cmd_buf[4];
    -
    980  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    981  cmd_buf[1] = 0x12;
    -
    982  if(continuous)
    -
    983  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    984  else
    -
    985  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    986  cmd_buf[3] = mode;
    -
    987  HID_Command(cmd_buf, 4);
    -
    988 }
    -
    989 
    -
    990 void WII::statusRequest() {
    -
    991  uint8_t cmd_buf[3];
    -
    992  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    993  cmd_buf[1] = 0x15;
    -
    994  cmd_buf[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    995  HID_Command(cmd_buf, 3);
    -
    996 }
    -
    997 
    -
    998 /************************************************************/
    -
    999 /* Memmory Commands */
    -
    1000 /************************************************************/
    -
    1001 
    -
    1002 void WII::writeData(uint32_t offset, uint8_t size, uint8_t* data) {
    -
    1003  uint8_t cmd_buf[23];
    -
    1004  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    1005  cmd_buf[1] = 0x16; // Write data
    -
    1006  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Write to memory, clear bit 2 to write to EEPROM
    -
    1007  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
    -
    1008  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
    -
    1009  cmd_buf[5] = (uint8_t)(offset & 0xFF);
    -
    1010  cmd_buf[6] = size;
    -
    1011  uint8_t i = 0;
    -
    1012  for(; i < size; i++)
    -
    1013  cmd_buf[7 + i] = data[i];
    -
    1014  for(; i < 16; i++) // Set the rest to zero
    -
    1015  cmd_buf[7 + i] = 0x00;
    -
    1016  HID_Command(cmd_buf, 23);
    -
    1017 }
    -
    1018 
    -
    1019 void WII::initExtension1() {
    -
    1020  uint8_t buf[1];
    -
    1021  buf[0] = 0x55;
    -
    1022  writeData(0xA400F0, 1, buf);
    -
    1023 }
    -
    1024 
    -
    1025 void WII::initExtension2() {
    -
    1026  uint8_t buf[1];
    -
    1027  buf[0] = 0x00;
    -
    1028  writeData(0xA400FB, 1, buf);
    -
    1029 }
    -
    1030 
    -
    1031 void WII::initMotionPlus() {
    -
    1032  uint8_t buf[1];
    -
    1033  buf[0] = 0x55;
    -
    1034  writeData(0xA600F0, 1, buf);
    -
    1035 }
    -
    1036 
    -
    1037 void WII::activateMotionPlus() {
    -
    1038  uint8_t buf[1];
    -
    1039  if(pBtd->wiiUProController) {
    -
    1040 #ifdef DEBUG_USB_HOST
    -
    1041  Notify(PSTR("\r\nActivating Wii U Pro Controller"), 0x80);
    -
    1042 #endif
    -
    1043  buf[0] = 0x00; // It seems like you can send anything but 0x04, 0x05, and 0x07
    -
    1044  } else if(activateNunchuck) {
    -
    1045 #ifdef DEBUG_USB_HOST
    -
    1046  Notify(PSTR("\r\nActivating Motion Plus in pass-through mode"), 0x80);
    -
    1047 #endif
    -
    1048  buf[0] = 0x05; // Activate nunchuck pass-through mode
    -
    1049  }//else if(classicControllerConnected && extensionConnected)
    -
    1050  //buf[0] = 0x07;
    -
    1051  else {
    -
    1052 #ifdef DEBUG_USB_HOST
    -
    1053  Notify(PSTR("\r\nActivating Motion Plus in normal mode"), 0x80);
    -
    1054 #endif
    -
    1055  buf[0] = 0x04; // Don't use any extension
    -
    1056  }
    -
    1057  writeData(0xA600FE, 1, buf);
    -
    1058 }
    -
    1059 
    -
    1060 void WII::readData(uint32_t offset, uint16_t size, bool EEPROM) {
    -
    1061  uint8_t cmd_buf[8];
    -
    1062  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    1063  cmd_buf[1] = 0x17; // Read data
    -
    1064  if(EEPROM)
    -
    1065  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Read from EEPROM
    -
    1066  else
    -
    1067  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Read from memory
    -
    1068  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
    -
    1069  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
    -
    1070  cmd_buf[5] = (uint8_t)(offset & 0xFF);
    -
    1071  cmd_buf[6] = (uint8_t)((size & 0xFF00) >> 8);
    -
    1072  cmd_buf[7] = (uint8_t)(size & 0xFF);
    -
    1073 
    -
    1074  HID_Command(cmd_buf, 8);
    -
    1075 }
    -
    1076 
    -
    1077 void WII::readExtensionType() {
    -
    1078  readData(0xA400FA, 6, false);
    -
    1079 }
    -
    1080 
    -
    1081 void WII::readCalData() {
    -
    1082  readData(0x0016, 8, true);
    -
    1083 }
    -
    1084 
    -
    1085 void WII::checkMotionPresent() {
    -
    1086  readData(0xA600FA, 6, false);
    -
    1087 }
    -
    1088 
    -
    1089 void WII::readWiiBalanceBoardCalibration() {
    -
    1090  readData(0xA40024, 24, false);
    -
    1091 }
    -
    1092 
    -
    1093 /************************************************************/
    -
    1094 /* WII Commands */
    -
    1095 /************************************************************/
    -
    1096 
    -
    1097 bool WII::getButtonPress(ButtonEnum b) { // Return true when a button is pressed
    - -
    1099  return (ButtonState & pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]));
    -
    1100  else
    -
    1101  return (ButtonState & pgm_read_dword(&WII_BUTTONS[(uint8_t)b]));
    -
    1102 }
    -
    1103 
    -
    1104 bool WII::getButtonClick(ButtonEnum b) { // Only return true when a button is clicked
    -
    1105  uint32_t button;
    - -
    1107  button = pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]);
    -
    1108  else
    -
    1109  button = pgm_read_dword(&WII_BUTTONS[(uint8_t)b]);
    -
    1110  bool click = (ButtonClickState & button);
    -
    1111  ButtonClickState &= ~button; // clear "click" event
    -
    1112  return click;
    -
    1113 }
    -
    1114 
    - -
    1116  if(!nunchuckConnected)
    -
    1117  return 127; // Return center position
    -
    1118  else {
    -
    1119  uint8_t output = hatValues[(uint8_t)a];
    -
    1120  if(output == 0xFF || output == 0x00) // The joystick will only read 255 or 0 when the cable is unplugged or initializing, so we will just return the center position
    -
    1121  return 127;
    -
    1122  else
    -
    1123  return output;
    -
    1124  }
    -
    1125 }
    -
    1126 
    - - -
    1129  return 2000;
    -
    1130  else {
    -
    1131  uint16_t output = hatValues[(uint8_t)a];
    -
    1132  if(output == 0x00) // The joystick will only read 0 when it is first initializing, so we will just return the center position
    -
    1133  return 2000;
    -
    1134  else
    -
    1135  return output;
    -
    1136  }
    -
    1137 }
    -
    1138 
    -
    1139 void WII::onInit() {
    -
    1140  if(pFuncOnInit)
    -
    1141  pFuncOnInit(); // Call the user function
    -
    1142  else
    -
    1143  setLedStatus();
    -
    1144 }
    -
    1145 
    -
    1146 /************************************************************/
    -
    1147 /* Wii Balance Board Commands */
    -
    1148 /************************************************************/
    -
    1149 
    - -
    1151  // Use interpolating between two points - based on: https://github.com/skorokithakis/gr8w8upd8m8/blob/master/gr8w8upd8m8.py
    -
    1152  // wiiBalanceBoardCal[pos][0] is calibration values for 0 kg
    -
    1153  // wiiBalanceBoardCal[pos][1] is calibration values for 17 kg
    -
    1154  // wiiBalanceBoardCal[pos][2] is calibration values for 34 kg
    -
    1155  if(wiiBalanceBoardRaw[pos] < wiiBalanceBoardCal[0][pos])
    -
    1156  return 0.0f; // Below 0 kg
    -
    1157  else if(wiiBalanceBoardRaw[pos] < wiiBalanceBoardCal[1][pos]) // Between 0 and 17 kg
    -
    1158  return 17.0f * (float)(wiiBalanceBoardRaw[pos] - wiiBalanceBoardCal[0][pos]) / (float)(wiiBalanceBoardCal[1][pos] - wiiBalanceBoardCal[0][pos]);
    -
    1159  else // More than 17 kg
    -
    1160  return 17.0f + 17.0f * (float)(wiiBalanceBoardRaw[pos] - wiiBalanceBoardCal[1][pos]) / (float)(wiiBalanceBoardCal[2][pos] - wiiBalanceBoardCal[1][pos]);
    -
    1161 };
    -
    1162 
    - - -
    1165 };
    -
    1166 
    -
    1167 /************************************************************/
    -
    1168 /* The following functions are for the IR camera */
    -
    1169 /************************************************************/
    -
    1170 
    -
    1171 #ifdef WIICAMERA
    -
    1172 
    -
    1173 void WII::IRinitialize() { // Turns on and initialises the IR camera
    -
    1174 
    -
    1175  enableIRCamera1();
    -
    1176 #ifdef DEBUG_USB_HOST
    -
    1177  Notify(PSTR("\r\nEnable IR Camera1 Complete"), 0x80);
    -
    1178 #endif
    -
    1179  delay(80);
    -
    1180 
    -
    1181  enableIRCamera2();
    -
    1182 #ifdef DEBUG_USB_HOST
    -
    1183  Notify(PSTR("\r\nEnable IR Camera2 Complete"), 0x80);
    -
    1184 #endif
    -
    1185  delay(80);
    -
    1186 
    -
    1187  write0x08Value();
    -
    1188 #ifdef DEBUG_USB_HOST
    -
    1189  Notify(PSTR("\r\nWrote hex number 0x08"), 0x80);
    -
    1190 #endif
    -
    1191  delay(80);
    -
    1192 
    -
    1193  writeSensitivityBlock1();
    -
    1194 #ifdef DEBUG_USB_HOST
    -
    1195  Notify(PSTR("\r\nWrote Sensitivity Block 1"), 0x80);
    -
    1196 #endif
    -
    1197  delay(80);
    -
    1198 
    -
    1199  writeSensitivityBlock2();
    -
    1200 #ifdef DEBUG_USB_HOST
    -
    1201  Notify(PSTR("\r\nWrote Sensitivity Block 2"), 0x80);
    -
    1202 #endif
    -
    1203  delay(80);
    -
    1204 
    -
    1205  uint8_t mode_num = 0x03;
    -
    1206  setWiiModeNumber(mode_num); // Change input for whatever mode you want i.e. 0x01, 0x03, or 0x05
    -
    1207 #ifdef DEBUG_USB_HOST
    -
    1208  Notify(PSTR("\r\nSet Wii Mode Number To 0x"), 0x80);
    -
    1209  D_PrintHex<uint8_t > (mode_num, 0x80);
    -
    1210 #endif
    -
    1211  delay(80);
    -
    1212 
    -
    1213  write0x08Value();
    -
    1214 #ifdef DEBUG_USB_HOST
    -
    1215  Notify(PSTR("\r\nWrote Hex Number 0x08"), 0x80);
    -
    1216 #endif
    -
    1217  delay(80);
    -
    1218 
    -
    1219  setReportMode(false, 0x33);
    -
    1220  //setReportMode(false, 0x3f); // For full reporting mode, doesn't work yet
    -
    1221 #ifdef DEBUG_USB_HOST
    -
    1222  Notify(PSTR("\r\nSet Report Mode to 0x33"), 0x80);
    -
    1223 #endif
    -
    1224  delay(80);
    -
    1225 
    -
    1226  statusRequest(); // Used to update wiiState - call isIRCameraEnabled() afterwards to check if it actually worked
    -
    1227 #ifdef DEBUG_USB_HOST
    -
    1228  Notify(PSTR("\r\nIR Initialized"), 0x80);
    -
    1229 #endif
    -
    1230 }
    -
    1231 
    -
    1232 void WII::enableIRCamera1() {
    -
    1233  uint8_t cmd_buf[3];
    -
    1234  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    1235  cmd_buf[1] = 0x13; // Output report 13
    -
    1236  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
    -
    1237  HID_Command(cmd_buf, 3);
    -
    1238 }
    -
    1239 
    -
    1240 void WII::enableIRCamera2() {
    -
    1241  uint8_t cmd_buf[3];
    -
    1242  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    1243  cmd_buf[1] = 0x1A; // Output report 1A
    -
    1244  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
    -
    1245  HID_Command(cmd_buf, 3);
    -
    1246 }
    -
    1247 
    -
    1248 void WII::writeSensitivityBlock1() {
    -
    1249  uint8_t buf[9];
    -
    1250  buf[0] = 0x00;
    -
    1251  buf[1] = 0x00;
    -
    1252  buf[2] = 0x00;
    -
    1253  buf[3] = 0x00;
    -
    1254  buf[4] = 0x00;
    -
    1255  buf[5] = 0x00;
    -
    1256  buf[6] = 0x90;
    -
    1257  buf[7] = 0x00;
    -
    1258  buf[8] = 0x41;
    -
    1259 
    -
    1260  writeData(0xB00000, 9, buf);
    -
    1261 }
    -
    1262 
    -
    1263 void WII::writeSensitivityBlock2() {
    -
    1264  uint8_t buf[2];
    -
    1265  buf[0] = 0x40;
    -
    1266  buf[1] = 0x00;
    -
    1267 
    -
    1268  writeData(0xB0001A, 2, buf);
    -
    1269 }
    -
    1270 
    -
    1271 void WII::write0x08Value() {
    -
    1272  uint8_t cmd = 0x08;
    -
    1273  writeData(0xb00030, 1, &cmd);
    -
    1274 }
    -
    1275 
    -
    1276 void WII::setWiiModeNumber(uint8_t mode_number) { // mode_number in hex i.e. 0x03 for extended mode
    -
    1277  writeData(0xb00033, 1, &mode_number);
    -
    1278 }
    -
    1279 #endif
    -
    bool wiimoteConnected
    Definition: Wii.h:191
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16 
    17  IR camera support added by Allan Glover (adglover9.81@gmail.com) and Kristian Lauszus
    18  */
    19 
    20 #include "Wii.h"
    21 // To enable serial debugging see "settings.h"
    22 //#define EXTRADEBUG // Uncomment to get even more debugging data
    23 //#define PRINTREPORT // Uncomment to print the report send by the Wii controllers
    24 
    25 const uint8_t WII_LEDS[] PROGMEM = {
    26  0x00, // OFF
    27  0x10, // LED1
    28  0x20, // LED2
    29  0x40, // LED3
    30  0x80, // LED4
    31 
    32  0x90, // LED5
    33  0xA0, // LED6
    34  0xC0, // LED7
    35  0xD0, // LED8
    36  0xE0, // LED9
    37  0xF0, // LED10
    38 };
    39 
    40 const uint32_t WII_BUTTONS[] PROGMEM = {
    41  0x00008, // UP
    42  0x00002, // RIGHT
    43  0x00004, // DOWN
    44  0x00001, // LEFT
    45 
    46  0, // Skip
    47  0x00010, // PLUS
    48  0x00100, // TWO
    49  0x00200, // ONE
    50 
    51  0x01000, // MINUS
    52  0x08000, // HOME
    53  0x10000, // Z
    54  0x20000, // C
    55 
    56  0x00400, // B
    57  0x00800, // A
    58 };
    59 const uint32_t WII_PROCONTROLLER_BUTTONS[] PROGMEM = {
    60  0x00100, // UP
    61  0x00080, // RIGHT
    62  0x00040, // DOWN
    63  0x00200, // LEFT
    64 
    65  0, // Skip
    66  0x00004, // PLUS
    67  0x20000, // L3
    68  0x10000, // R3
    69 
    70  0x00010, // MINUS
    71  0x00008, // HOME
    72  0, 0, // Skip
    73 
    74  0x04000, // B
    75  0x01000, // A
    76  0x00800, // X
    77  0x02000, // Y
    78 
    79  0x00020, // L
    80  0x00002, // R
    81  0x08000, // ZL
    82  0x00400, // ZR
    83 };
    84 
    85 WII::WII(BTD *p, bool pair) :
    86 BluetoothService(p) // Pointer to USB class instance - mandatory
    87 {
    89 
    90  HIDBuffer[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    91 
    92  /* Set device cid for the control and intterrupt channelse - LSB */
    93  control_dcid[0] = 0x60; // 0x0060
    94  control_dcid[1] = 0x00;
    95  interrupt_dcid[0] = 0x61; // 0x0061
    96  interrupt_dcid[1] = 0x00;
    97 
    98  Reset();
    99 }
    100 
    101 void WII::Reset() {
    102  wiimoteConnected = false;
    103  nunchuckConnected = false;
    104  motionPlusConnected = false;
    105  activateNunchuck = false;
    106  motionValuesReset = false;
    107  activeConnection = false;
    108  motionPlusInside = false;
    109  pBtd->wiiUProController = false;
    111  wiiBalanceBoardConnected = false;
    112  l2cap_event_flag = 0; // Reset flags
    113  l2cap_state = L2CAP_WAIT;
    114 }
    115 
    116 void WII::disconnect() { // Use this void to disconnect any of the controllers
    117  if(!motionPlusInside) { // The old Wiimote needs a delay after the first command or it will automatically reconnect
    118  if(motionPlusConnected) {
    119 #ifdef DEBUG_USB_HOST
    120  Notify(PSTR("\r\nDeactivating Motion Plus"), 0x80);
    121 #endif
    122  initExtension1(); // This will disable the Motion Plus extension
    123  }
    124  timer = (uint32_t)millis() + 1000; // We have to wait for the message before the rest of the channels can be deactivated
    125  } else
    126  timer = (uint32_t)millis(); // Don't wait
    127  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
    128  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, interrupt_scid, interrupt_dcid);
    129  Reset();
    130  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
    131 }
    132 
    133 void WII::ACLData(uint8_t* l2capinbuf) {
    134  if(!pBtd->l2capConnectionClaimed && pBtd->incomingWii && !wiimoteConnected && !activeConnection) {
    135  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    136  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
    137  motionPlusInside = pBtd->motionPlusInside;
    138  pBtd->incomingWii = false;
    139  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
    140  activeConnection = true;
    141  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    142  l2cap_state = L2CAP_WAIT;
    143  }
    144  }
    145  }
    146 
    147  if(checkHciHandle(l2capinbuf, hci_handle)) { // acl_handle_ok
    148  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
    149  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
    150 #ifdef DEBUG_USB_HOST
    151  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
    152  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    153  Notify(PSTR(" "), 0x80);
    154  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    155  Notify(PSTR(" "), 0x80);
    156  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
    157  Notify(PSTR(" "), 0x80);
    158  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
    159  Notify(PSTR(" "), 0x80);
    160  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    161  Notify(PSTR(" "), 0x80);
    162  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    163 #endif
    164  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_RESPONSE) {
    165  if(((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) && ((l2capinbuf[18] | (l2capinbuf[19] << 8)) == SUCCESSFUL)) { // Success
    166  if(l2capinbuf[14] == control_dcid[0] && l2capinbuf[15] == control_dcid[1]) {
    167  //Notify(PSTR("\r\nHID Control Connection Complete"), 0x80);
    168  identifier = l2capinbuf[9];
    169  control_scid[0] = l2capinbuf[12];
    170  control_scid[1] = l2capinbuf[13];
    172  } else if(l2capinbuf[14] == interrupt_dcid[0] && l2capinbuf[15] == interrupt_dcid[1]) {
    173  //Notify(PSTR("\r\nHID Interrupt Connection Complete"), 0x80);
    174  identifier = l2capinbuf[9];
    175  interrupt_scid[0] = l2capinbuf[12];
    176  interrupt_scid[1] = l2capinbuf[13];
    178  }
    179  }
    180  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    181 #ifdef EXTRADEBUG
    182  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
    183  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    184  Notify(PSTR(" "), 0x80);
    185  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    186  Notify(PSTR(" SCID: "), 0x80);
    187  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    188  Notify(PSTR(" "), 0x80);
    189  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    190  Notify(PSTR(" Identifier: "), 0x80);
    191  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    192 #endif
    193  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
    194  identifier = l2capinbuf[9];
    195  control_scid[0] = l2capinbuf[14];
    196  control_scid[1] = l2capinbuf[15];
    198  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
    199  identifier = l2capinbuf[9];
    200  interrupt_scid[0] = l2capinbuf[14];
    201  interrupt_scid[1] = l2capinbuf[15];
    203  }
    204  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
    205  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
    206  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    207  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
    208  identifier = l2capinbuf[9];
    210  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    211  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
    212  identifier = l2capinbuf[9];
    214  }
    215  }
    216  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
    217  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    218  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
    219  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], control_scid);
    220  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    221  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
    222  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], interrupt_scid);
    223  }
    224  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
    225  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    226 #ifdef DEBUG_USB_HOST
    227  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
    228 #endif
    229  identifier = l2capinbuf[9];
    230  pBtd->l2cap_disconnection_response(hci_handle, identifier, control_dcid, control_scid);
    231  Reset();
    232  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    233 #ifdef DEBUG_USB_HOST
    234  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
    235 #endif
    236  identifier = l2capinbuf[9];
    237  pBtd->l2cap_disconnection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid);
    238  Reset();
    239  }
    240  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
    241  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
    242  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
    243  identifier = l2capinbuf[9];
    245  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
    246  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
    247  identifier = l2capinbuf[9];
    249  }
    250  }
    251 #ifdef EXTRADEBUG
    252  else {
    253  identifier = l2capinbuf[9];
    254  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
    255  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
    256  }
    257 #endif
    258  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
    259  //Notify(PSTR("\r\nL2CAP Interrupt"), 0x80);
    260  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
    261  if((l2capinbuf[9] >= 0x20 && l2capinbuf[9] <= 0x22) || (l2capinbuf[9] >= 0x30 && l2capinbuf[9] <= 0x37) || l2capinbuf[9] == 0x3e || l2capinbuf[9] == 0x3f) { // These reports include the buttons
    262  if((l2capinbuf[9] >= 0x20 && l2capinbuf[9] <= 0x22) || l2capinbuf[9] == 0x31 || l2capinbuf[9] == 0x33) // These reports have no extensions bytes
    263  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8));
    265  ButtonState = (uint32_t)(((~l2capinbuf[23]) & 0xFE) | ((uint16_t)(~l2capinbuf[24]) << 8) | ((uint32_t)((~l2capinbuf[25]) & 0x03) << 16));
    266  else if(motionPlusConnected) {
    267  if(l2capinbuf[20] & 0x02) // Only update the Wiimote buttons, since the extension bytes are from the Motion Plus
    268  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)(ButtonState & 0xFFFF0000)));
    269  else if(nunchuckConnected) // Update if it's a report from the Nunchuck
    270  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)((~l2capinbuf[20]) & 0x0C) << 14));
    271  //else if(classicControllerConnected) // Update if it's a report from the Classic Controller
    272  } else if(nunchuckConnected) // The Nunchuck is directly connected
    273  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)((~l2capinbuf[20]) & 0x03) << 16));
    274  //else if(classicControllerConnected) // The Classic Controller is directly connected
    275  else if(!unknownExtensionConnected)
    276  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8));
    277 #ifdef PRINTREPORT
    278  Notify(PSTR("ButtonState: "), 0x80);
    279  D_PrintHex<uint32_t > (ButtonState, 0x80);
    280  Notify(PSTR("\r\n"), 0x80);
    281 #endif
    282  if(ButtonState != OldButtonState) {
    283  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    284  OldButtonState = ButtonState;
    285  }
    286  }
    287  if(l2capinbuf[9] == 0x31 || l2capinbuf[9] == 0x33 || l2capinbuf[9] == 0x35 || l2capinbuf[9] == 0x37) { // Read the accelerometer
    288  accXwiimote = ((l2capinbuf[12] << 2) | (l2capinbuf[10] & 0x60 >> 5)) - 500;
    289  accYwiimote = ((l2capinbuf[13] << 2) | (l2capinbuf[11] & 0x20 >> 4)) - 500;
    290  accZwiimote = ((l2capinbuf[14] << 2) | (l2capinbuf[11] & 0x40 >> 5)) - 500;
    291  }
    292  switch(l2capinbuf[9]) {
    293  case 0x20: // Status Information - (a1) 20 BB BB LF 00 00 VV
    294 #ifdef EXTRADEBUG
    295  Notify(PSTR("\r\nStatus report was received"), 0x80);
    296 #endif
    297  wiiState = l2capinbuf[12]; // (0x01: Battery is nearly empty), (0x02: An Extension Controller is connected), (0x04: Speaker enabled), (0x08: IR enabled), (0x10: LED1, 0x20: LED2, 0x40: LED3, 0x80: LED4)
    298  batteryLevel = l2capinbuf[15]; // Update battery level
    299 
    300  if(!checkBatteryLevel) { // If this is true it means that the user must have called getBatteryLevel()
    301  if(l2capinbuf[12] & 0x02) { // Check if a extension is connected
    302 #ifdef DEBUG_USB_HOST
    303  if(!unknownExtensionConnected)
    304  Notify(PSTR("\r\nExtension connected"), 0x80);
    305 #endif
    306  unknownExtensionConnected = true;
    307 #ifdef WIICAMERA
    308  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    309 #endif
    310  setReportMode(false, 0x35); // Also read the extension
    311  } else {
    312 #ifdef DEBUG_USB_HOST
    313  Notify(PSTR("\r\nExtension disconnected"), 0x80);
    314 #endif
    315  if(motionPlusConnected) {
    316 #ifdef DEBUG_USB_HOST
    317  Notify(PSTR(" - from Motion Plus"), 0x80);
    318 #endif
    320  if(!activateNunchuck) // If it's already trying to initialize the Nunchuck don't set it to false
    321  nunchuckConnected = false;
    322  //else if(classicControllerConnected)
    323  } else if(nunchuckConnected) {
    324 #ifdef DEBUG_USB_HOST
    325  Notify(PSTR(" - Nunchuck"), 0x80);
    326 #endif
    327  nunchuckConnected = false; // It must be the Nunchuck controller then
    329  onInit();
    330 #ifdef WIICAMERA
    331  if(!isIRCameraEnabled()) // We still want to read from the IR camera, so do not change the report mode
    332 #endif
    333  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
    334  } else {
    335 #ifdef WIICAMERA
    336  if(!isIRCameraEnabled()) // We still want to read from the IR camera, so do not change the report mode
    337 #endif
    338  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
    339  }
    340  }
    341  }
    342  else {
    343 #ifdef EXTRADEBUG
    344  Notify(PSTR("\r\nChecking battery level"), 0x80);
    345 #endif
    346  checkBatteryLevel = false; // Check for extensions by default
    347  }
    348 #ifdef DEBUG_USB_HOST
    349  if(l2capinbuf[12] & 0x01)
    350  Notify(PSTR("\r\nWARNING: Battery is nearly empty"), 0x80);
    351 #endif
    352 
    353  break;
    354  case 0x21: // Read Memory Data
    355  if((l2capinbuf[12] & 0x0F) == 0) { // No error
    356  uint8_t reportLength = (l2capinbuf[12] >> 4) + 1; // // Bit 4-7 is the length - 1
    357  // See: http://wiibrew.org/wiki/Wiimote/Extension_Controllers
    358  if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x00) {
    359 #ifdef DEBUG_USB_HOST
    360  Notify(PSTR("\r\nNunchuck connected"), 0x80);
    361 #endif
    363  } else if(l2capinbuf[16] == 0x00 && (l2capinbuf[17] == 0xA6 || l2capinbuf[17] == 0xA4) && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x05) {
    364 #ifdef DEBUG_USB_HOST
    365  Notify(PSTR("\r\nMotion Plus connected"), 0x80);
    366 #endif
    368  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x04 && l2capinbuf[20] == 0x05) {
    369 #ifdef DEBUG_USB_HOST
    370  Notify(PSTR("\r\nMotion Plus activated in normal mode"), 0x80);
    371 #endif
    372  motionPlusConnected = true;
    373 #ifdef WIICAMERA
    374  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    375 #endif
    376  setReportMode(false, 0x35); // Also read the extension
    377  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x05 && l2capinbuf[20] == 0x05) {
    378 #ifdef DEBUG_USB_HOST
    379  Notify(PSTR("\r\nMotion Plus activated in Nunchuck pass-through mode"), 0x80);
    380 #endif
    381  activateNunchuck = false;
    382  motionPlusConnected = true;
    383  nunchuckConnected = true;
    384 #ifdef WIICAMERA
    385  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    386 #endif
    387  setReportMode(false, 0x35); // Also read the extension
    388  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA6 && l2capinbuf[18] == 0x20 && (l2capinbuf[19] == 0x00 || l2capinbuf[19] == 0x04 || l2capinbuf[19] == 0x05 || l2capinbuf[19] == 0x07) && l2capinbuf[20] == 0x05) {
    389 #ifdef DEBUG_USB_HOST
    390  Notify(PSTR("\r\nInactive Wii Motion Plus"), 0x80);
    391  Notify(PSTR("\r\nPlease unplug the Motion Plus, disconnect the Wiimote and then replug the Motion Plus Extension"), 0x80);
    392 #endif
    393  stateCounter = 300; // Skip the rest in "WII_CHECK_MOTION_PLUS_STATE"
    394  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x01 && l2capinbuf[20] == 0x20) {
    395 #ifdef DEBUG_USB_HOST
    396  Notify(PSTR("\r\nWii U Pro Controller connected"), 0x80);
    397 #endif
    399  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x04 && l2capinbuf[20] == 0x02) {
    400 #ifdef DEBUG_USB_HOST
    401  Notify(PSTR("\r\nWii Balance Board connected"), 0x80);
    402 #endif
    403  setReportMode(false, 0x32); // Read the Wii Balance Board extension
    405  }
    406  // Wii Balance Board calibration reports (24 bits in total)
    407  else if(l2capinbuf[13] == 0x00 && l2capinbuf[14] == 0x24 && reportLength == 16) { // First 16-bit
    408  for(uint8_t i = 0; i < 2; i++) {
    409  for(uint8_t j = 0; j < 4; j++)
    410  wiiBalanceBoardCal[i][j] = l2capinbuf[16 + 8 * i + 2 * j] | l2capinbuf[15 + 8 * i + 2 * j] << 8;
    411  }
    412  } else if(l2capinbuf[13] == 0x00 && l2capinbuf[14] == 0x34 && reportLength == 8) { // Last 8-bit
    413  for(uint8_t j = 0; j < 4; j++)
    414  wiiBalanceBoardCal[2][j] = l2capinbuf[16 + 2 * j] | l2capinbuf[15 + 2 * j] << 8;
    415 #ifdef DEBUG_USB_HOST
    416  Notify(PSTR("\r\nWii Balance Board calibration values read successfully"), 0x80);
    417 #endif
    420  }
    421 #ifdef DEBUG_USB_HOST
    422  else {
    423  Notify(PSTR("\r\nUnknown Device: "), 0x80);
    424  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    425  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    426  Notify(PSTR("\r\nData: "), 0x80);
    427  for(uint8_t i = 0; i < reportLength; i++) {
    428  D_PrintHex<uint8_t > (l2capinbuf[15 + i], 0x80);
    429  Notify(PSTR(" "), 0x80);
    430  }
    431  }
    432 #endif
    433  }
    434 #ifdef EXTRADEBUG
    435  else {
    436  Notify(PSTR("\r\nReport Error: "), 0x80);
    437  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    438  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    439  }
    440 #endif
    441  break;
    442  case 0x22: // Acknowledge output report, return function result
    443 #ifdef DEBUG_USB_HOST
    444  if(l2capinbuf[13] != 0x00) { // Check if there is an error
    445  Notify(PSTR("\r\nCommand failed: "), 0x80);
    446  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    447  }
    448 #endif
    449  break;
    450  case 0x30: // Core buttons - (a1) 30 BB BB
    451  break;
    452  case 0x31: // Core Buttons and Accelerometer - (a1) 31 BB BB AA AA AA
    453  break;
    454  case 0x32: // Core Buttons with 8 Extension bytes - (a1) 32 BB BB EE EE EE EE EE EE EE EE
    455  // See: http://wiibrew.org/wiki/Wii_Balance_Board#Data_Format
    456  wiiBalanceBoardRaw[TopRight] = l2capinbuf[13] | l2capinbuf[12] << 8; // Top right
    457  wiiBalanceBoardRaw[BotRight] = l2capinbuf[15] | l2capinbuf[14] << 8; // Bottom right
    458  wiiBalanceBoardRaw[TopLeft] = l2capinbuf[17] | l2capinbuf[16] << 8; // Top left
    459  wiiBalanceBoardRaw[BotLeft] = l2capinbuf[19] | l2capinbuf[18] << 8; // Bottom left
    460  break;
    461  case 0x33: // Core Buttons with Accelerometer and 12 IR bytes - (a1) 33 BB BB AA AA AA II II II II II II II II II II II II
    462 #ifdef WIICAMERA
    463  // Read the IR data
    464  IR_object_x1 = (l2capinbuf[15] | ((uint16_t)(l2capinbuf[17] & 0x30) << 4)); // x position
    465  IR_object_y1 = (l2capinbuf[16] | ((uint16_t)(l2capinbuf[17] & 0xC0) << 2)); // y position
    466  IR_object_s1 = (l2capinbuf[17] & 0x0F); // Size value, 0-15
    467 
    468  IR_object_x2 = (l2capinbuf[18] | ((uint16_t)(l2capinbuf[20] & 0x30) << 4));
    469  IR_object_y2 = (l2capinbuf[19] | ((uint16_t)(l2capinbuf[20] & 0xC0) << 2));
    470  IR_object_s2 = (l2capinbuf[20] & 0x0F);
    471 
    472  IR_object_x3 = (l2capinbuf[21] | ((uint16_t)(l2capinbuf[23] & 0x30) << 4));
    473  IR_object_y3 = (l2capinbuf[22] | ((uint16_t)(l2capinbuf[23] & 0xC0) << 2));
    474  IR_object_s3 = (l2capinbuf[23] & 0x0F);
    475 
    476  IR_object_x4 = (l2capinbuf[24] | ((uint16_t)(l2capinbuf[26] & 0x30) << 4));
    477  IR_object_y4 = (l2capinbuf[25] | ((uint16_t)(l2capinbuf[26] & 0xC0) << 2));
    478  IR_object_s4 = (l2capinbuf[26] & 0x0F);
    479 #endif
    480  break;
    481  case 0x34: // Core Buttons with 19 Extension bytes - (a1) 34 BB BB EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE
    482  break;
    483  /* 0x3e and 0x3f both give unknown report types when report mode is 0x3e or 0x3f with mode number 0x05 */
    484  case 0x3E: // Core Buttons with Accelerometer and 32 IR bytes
    485  // (a1) 31 BB BB AA AA AA II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II
    486  // corresponds to output report mode 0x3e
    487 
    488  /**** for reading in full mode: DOES NOT WORK YET ****/
    489  /* When it works it will also have intensity and bounding box data */
    490  /*
    491  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
    492  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
    493  IR_object_s1 = (l2capinbuf[15] & 0x0F);
    494  */
    495  break;
    496  case 0x3F:
    497  /*
    498  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
    499  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
    500  IR_object_s1 = (l2capinbuf[15] & 0x0F);
    501  */
    502  break;
    503  case 0x35: // Core Buttons and Accelerometer with 16 Extension Bytes
    504  // (a1) 35 BB BB AA AA AA EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE
    505 #if 1 // Set this to 0 if you don't want to use an extension, this reduceds the size of the library a lot!
    506  if(motionPlusConnected) {
    507  if(l2capinbuf[20] & 0x02) { // Check if it's a report from the Motion controller or the extension
    508  if(motionValuesReset) { // We will only use the values when the gyro value has been set
    509  gyroYawRaw = ((l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6)) - gyroYawZero);
    510  gyroRollRaw = ((l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6)) - gyroRollZero);
    511  gyroPitchRaw = ((l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6)) - gyroPitchZero);
    512 
    513  yawGyroSpeed = (float)gyroYawRaw / ((float)gyroYawZero / yawGyroScale);
    514  rollGyroSpeed = -(float)gyroRollRaw / ((float)gyroRollZero / rollGyroScale); // We invert these values so they will fit the acc values
    516 
    517  /* The onboard gyro has two ranges for slow and fast mode */
    518  if(!(l2capinbuf[18] & 0x02)) // Check if fast mode is used
    519  yawGyroSpeed *= 4.545;
    520  if(!(l2capinbuf[18] & 0x01)) // Check if fast mode is used
    521  pitchGyroSpeed *= 4.545;
    522  if(!(l2capinbuf[19] & 0x02)) // Check if fast mode is used
    523  rollGyroSpeed *= 4.545;
    524 
    525  compPitch = (0.93f * (compPitch + (pitchGyroSpeed * (float)((uint32_t)micros() - timer) / 1000000.0f)))+(0.07f * getWiimotePitch()); // Use a complimentary filter to calculate the angle
    526  compRoll = (0.93f * (compRoll + (rollGyroSpeed * (float)((uint32_t)micros() - timer) / 1000000.0f)))+(0.07f * getWiimoteRoll());
    527 
    528  gyroYaw += (yawGyroSpeed * ((float)((uint32_t)micros() - timer) / 1000000.0f));
    529  gyroRoll += (rollGyroSpeed * ((float)((uint32_t)micros() - timer) / 1000000.0f));
    530  gyroPitch += (pitchGyroSpeed * ((float)((uint32_t)micros() - timer) / 1000000.0f));
    531  timer = (uint32_t)micros();
    532  /*
    533  // Uncomment these lines to tune the gyro scale variabels
    534  Notify(PSTR("\r\ngyroYaw: "), 0x80);
    535  Notify(gyroYaw, 0x80);
    536  Notify(PSTR("\tgyroRoll: "), 0x80);
    537  Notify(gyroRoll, 0x80);
    538  Notify(PSTR("\tgyroPitch: "), 0x80);
    539  Notify(gyroPitch, 0x80);
    540  */
    541  /*
    542  Notify(PSTR("\twiimoteRoll: "), 0x80);
    543  Notify(wiimoteRoll, 0x80);
    544  Notify(PSTR("\twiimotePitch: "), 0x80);
    545  Notify(wiimotePitch, 0x80);
    546  */
    547  } else {
    548  if((int32_t)((uint32_t)micros() - timer) > 1000000) { // Loop for 1 sec before resetting the values
    549 #ifdef DEBUG_USB_HOST
    550  Notify(PSTR("\r\nThe gyro values has been reset"), 0x80);
    551 #endif
    552  gyroYawZero = (l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6));
    553  gyroRollZero = (l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6));
    554  gyroPitchZero = (l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6));
    555 
    556  rollGyroScale = 500; // You might need to adjust these
    557  pitchGyroScale = 400;
    558  yawGyroScale = 415;
    559 
    560  gyroYaw = 0;
    561  gyroRoll = 0;
    562  gyroPitch = 0;
    563 
    564  motionValuesReset = true;
    565  timer = (uint32_t)micros();
    566  }
    567  }
    568  } else {
    569  if(nunchuckConnected) {
    570  hatValues[HatX] = l2capinbuf[15];
    571  hatValues[HatY] = l2capinbuf[16];
    572  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x10 >> 3)) - 416;
    573  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x20 >> 4)) - 416;
    574  accZnunchuck = (((l2capinbuf[19] & 0xFE) << 2) | (l2capinbuf[20] & 0xC0 >> 5)) - 416;
    575  }
    576  //else if(classicControllerConnected) { }
    577  }
    578  if(l2capinbuf[19] & 0x01) {
    579  if(!extensionConnected) {
    580  extensionConnected = true;
    581  unknownExtensionConnected = true;
    582 #ifdef DEBUG_USB_HOST
    583  Notify(PSTR("\r\nExtension connected to Motion Plus"), 0x80);
    584 #endif
    585  }
    586  } else {
    587  if(extensionConnected && !unknownExtensionConnected) {
    588  extensionConnected = false;
    589  unknownExtensionConnected = true;
    590 #ifdef DEBUG_USB_HOST
    591  Notify(PSTR("\r\nExtension disconnected from Motion Plus"), 0x80);
    592 #endif
    593  nunchuckConnected = false; // There is no extension connected to the Motion Plus if this report is sent
    594  }
    595  }
    596 
    597  } else if(nunchuckConnected) {
    598  hatValues[HatX] = l2capinbuf[15];
    599  hatValues[HatY] = l2capinbuf[16];
    600  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x0C >> 2)) - 416;
    601  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x30 >> 4)) - 416;
    602  accZnunchuck = ((l2capinbuf[19] << 2) | (l2capinbuf[20] & 0xC0 >> 6)) - 416;
    603  } else if(wiiUProControllerConnected) {
    604  hatValues[LeftHatX] = (l2capinbuf[15] | l2capinbuf[16] << 8);
    605  hatValues[RightHatX] = (l2capinbuf[17] | l2capinbuf[18] << 8);
    606  hatValues[LeftHatY] = (l2capinbuf[19] | l2capinbuf[20] << 8);
    607  hatValues[RightHatY] = (l2capinbuf[21] | l2capinbuf[22] << 8);
    608  }
    609 #endif
    610  break;
    611 #ifdef DEBUG_USB_HOST
    612  default:
    613  Notify(PSTR("\r\nUnknown Report type: "), 0x80);
    614  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    615  break;
    616 #endif
    617  }
    618  }
    619  }
    620  L2CAP_task();
    621  }
    622 }
    623 
    624 void WII::L2CAP_task() {
    625  switch(l2cap_state) {
    626  /* These states are used if the Wiimote is the host */
    629 #ifdef DEBUG_USB_HOST
    630  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
    631 #endif
    632  l2cap_state = L2CAP_INTERRUPT_SETUP;
    633  }
    634  break;
    635 
    638 #ifdef DEBUG_USB_HOST
    639  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
    640 #endif
    641  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, PENDING);
    642  delay(1);
    643  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, SUCCESSFUL);
    644  identifier++;
    645  delay(1);
    646  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
    647 
    648  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
    649  }
    650  break;
    651 
    652  /* These states are used if the Arduino is the host */
    655 #ifdef DEBUG_USB_HOST
    656  Notify(PSTR("\r\nSend HID Control Config Request"), 0x80);
    657 #endif
    658  identifier++;
    660  l2cap_state = L2CAP_CONTROL_CONFIG_REQUEST;
    661  }
    662  break;
    663 
    666 #ifdef DEBUG_USB_HOST
    667  Notify(PSTR("\r\nSend HID Interrupt Connection Request"), 0x80);
    668 #endif
    669  identifier++;
    671  l2cap_state = L2CAP_INTERRUPT_CONNECT_REQUEST;
    672  }
    673  break;
    674 
    677 #ifdef DEBUG_USB_HOST
    678  Notify(PSTR("\r\nSend HID Interrupt Config Request"), 0x80);
    679 #endif
    680  identifier++;
    681  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
    682  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
    683  }
    684  break;
    685 
    687  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
    688 #ifdef DEBUG_USB_HOST
    689  Notify(PSTR("\r\nHID Channels Established"), 0x80);
    690 #endif
    691  pBtd->connectToWii = false;
    692  pBtd->pairWithWii = false;
    693  stateCounter = 0;
    694  l2cap_state = WII_CHECK_MOTION_PLUS_STATE;
    695  }
    696  break;
    697 
    698  /* The next states are in run() */
    699 
    701  if(l2cap_check_flag(L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE) && ((int32_t)((uint32_t)millis() - timer) >= 0L)) {
    702 #ifdef DEBUG_USB_HOST
    703  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
    704 #endif
    705  identifier++;
    706  pBtd->l2cap_disconnection_request(hci_handle, identifier, control_scid, control_dcid);
    707  l2cap_state = L2CAP_CONTROL_DISCONNECT;
    708  }
    709  break;
    710 
    713 #ifdef DEBUG_USB_HOST
    714  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
    715 #endif
    717  hci_handle = -1; // Reset handle
    718  l2cap_event_flag = 0; // Reset flags
    719  l2cap_state = L2CAP_WAIT;
    720  }
    721  break;
    722  }
    723 }
    724 
    725 void WII::Run() {
    726  if(l2cap_state == L2CAP_INTERRUPT_DISCONNECT && ((int32_t)((uint32_t)millis() - timer) >= 0L))
    727  L2CAP_task(); // Call the rest of the disconnection routine after we have waited long enough
    728 
    729  switch(l2cap_state) {
    730  case L2CAP_WAIT:
    731  if(pBtd->connectToWii && !pBtd->l2capConnectionClaimed && !wiimoteConnected && !activeConnection) {
    733  activeConnection = true;
    734  motionPlusInside = pBtd->motionPlusInside;
    735 #ifdef DEBUG_USB_HOST
    736  Notify(PSTR("\r\nSend HID Control Connection Request"), 0x80);
    737 #endif
    738  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    739  l2cap_event_flag = 0; // Reset flags
    740  identifier = 0;
    742  l2cap_state = L2CAP_CONTROL_CONNECT_REQUEST;
    744 #ifdef DEBUG_USB_HOST
    745  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
    746 #endif
    747  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, PENDING);
    748  delay(1);
    749  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, SUCCESSFUL);
    750  identifier++;
    751  delay(1);
    753  l2cap_state = L2CAP_CONTROL_SUCCESS;
    754  }
    755  break;
    756 
    758 #ifdef DEBUG_USB_HOST
    759  if(stateCounter == 0) // Only print onnce
    760  Notify(PSTR("\r\nChecking if a Motion Plus is connected"), 0x80);
    761 #endif
    762  stateCounter++;
    763  if(stateCounter % 200 == 0)
    764  checkMotionPresent(); // Check if there is a motion plus connected
    766  stateCounter = 0;
    767  l2cap_state = WII_INIT_MOTION_PLUS_STATE;
    768  timer = (uint32_t)micros();
    769 
    770  if(unknownExtensionConnected) {
    771 #ifdef DEBUG_USB_HOST
    772  Notify(PSTR("\r\nA extension is also connected"), 0x80);
    773 #endif
    774  activateNunchuck = true; // For we will just set this to true as this the only extension supported so far
    775  }
    776 
    777  } else if(stateCounter == 601) { // We will try three times to check for the motion plus
    778 #ifdef DEBUG_USB_HOST
    779  Notify(PSTR("\r\nNo Motion Plus was detected"), 0x80);
    780 #endif
    781  stateCounter = 0;
    782  l2cap_state = WII_CHECK_EXTENSION_STATE;
    783  }
    784  break;
    785 
    786  case WII_CHECK_EXTENSION_STATE: // This is used to check if there is anything plugged in to the extension port
    787 #ifdef DEBUG_USB_HOST
    788  if(stateCounter == 0) // Only print onnce
    789  Notify(PSTR("\r\nChecking if there is any extension connected"), 0x80);
    790 #endif
    791  stateCounter++; // We use this counter as there has to be a short delay between the commands
    792  if(stateCounter == 1)
    793  statusRequest(); // See if a new device has connected
    794  if(stateCounter == 100) {
    795  if(unknownExtensionConnected) // Check if there is a extension is connected to the port
    796  initExtension1();
    797  else
    798  stateCounter = 499;
    799  } else if(stateCounter == 200)
    800  initExtension2();
    801  else if(stateCounter == 300) {
    802  readExtensionType();
    803  unknownExtensionConnected = false;
    804  } else if(stateCounter == 400) {
    806 #ifdef DEBUG_USB_HOST
    807  Notify(PSTR("\r\nReading Wii Balance Board calibration values"), 0x80);
    808 #endif
    809  readWiiBalanceBoardCalibration();
    810  } else
    811  stateCounter = 499;
    812  } else if(stateCounter == 500) {
    813  stateCounter = 0;
    814  l2cap_state = TURN_ON_LED;
    815  }
    816  break;
    817 
    819  stateCounter++;
    820  if(stateCounter == 1)
    821  initMotionPlus();
    822  else if(stateCounter == 100)
    823  activateMotionPlus();
    824  else if(stateCounter == 200)
    825  readExtensionType(); // Check if it has been activated
    826  else if(stateCounter == 300) {
    827  stateCounter = 0;
    828  unknownExtensionConnected = false; // The motion plus will send a status report when it's activated, we will set this to false so it doesn't reinitialize the Motion Plus
    829  l2cap_state = TURN_ON_LED;
    830  }
    831  break;
    832 
    833  case TURN_ON_LED:
    835  nunchuckConnected = true;
    836  wiimoteConnected = true;
    837  onInit();
    838  l2cap_state = L2CAP_DONE;
    839  break;
    840 
    841  case L2CAP_DONE:
    842  if(unknownExtensionConnected) {
    843 #ifdef DEBUG_USB_HOST
    844  if(stateCounter == 0) // Only print once
    845  Notify(PSTR("\r\nChecking extension port"), 0x80);
    846 #endif
    847  stateCounter++; // We will use this counter as there has to be a short delay between the commands
    848  if(stateCounter == 50)
    849  statusRequest();
    850  else if(stateCounter == 100)
    851  initExtension1();
    852  else if(stateCounter == 150)
    853  if((extensionConnected && motionPlusConnected) || (unknownExtensionConnected && !motionPlusConnected))
    854  initExtension2();
    855  else
    856  stateCounter = 299; // There is no extension connected
    857  else if(stateCounter == 200)
    858  readExtensionType();
    859  else if(stateCounter == 250) {
    861 #ifdef DEBUG_USB_HOST
    862  Notify(PSTR("\r\nNunchuck was reconnected"), 0x80);
    863 #endif
    864  activateNunchuck = true;
    865  nunchuckConnected = true;
    866  }
    868  stateCounter = 449;
    869  } else if(stateCounter == 300) {
    870  if(motionPlusConnected) {
    871 #ifdef DEBUG_USB_HOST
    872  Notify(PSTR("\r\nReactivating the Motion Plus"), 0x80);
    873 #endif
    874  initMotionPlus();
    875  } else
    876  stateCounter = 449;
    877  } else if(stateCounter == 350)
    878  activateMotionPlus();
    879  else if(stateCounter == 400)
    880  readExtensionType(); // Check if it has been activated
    881  else if(stateCounter == 450) {
    882  onInit();
    883  stateCounter = 0;
    884  unknownExtensionConnected = false;
    885  }
    886  } else
    887  stateCounter = 0;
    888  break;
    889  }
    890 }
    891 
    892 /************************************************************/
    893 /* HID Commands */
    894 /************************************************************/
    895 
    896 void WII::HID_Command(uint8_t* data, uint8_t nbytes) {
    897  if(motionPlusInside)
    898  pBtd->L2CAP_Command(hci_handle, data, nbytes, interrupt_scid[0], interrupt_scid[1]); // It's the new Wiimote with the Motion Plus Inside or Wii U Pro controller
    899  else
    900  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]);
    901 }
    902 
    904  HIDBuffer[1] = 0x11;
    905  HIDBuffer[2] = 0x00;
    906  HID_Command(HIDBuffer, 3);
    907 }
    908 
    910  HIDBuffer[1] = 0x11;
    911  HIDBuffer[2] &= ~0x01; // Bit 0 control the rumble
    912  HID_Command(HIDBuffer, 3);
    913 }
    914 
    916  HIDBuffer[1] = 0x11;
    917  HIDBuffer[2] |= 0x01; // Bit 0 control the rumble
    918  HID_Command(HIDBuffer, 3);
    919 }
    920 
    922  HIDBuffer[1] = 0x11;
    923  HIDBuffer[2] ^= 0x01; // Bit 0 control the rumble
    924  HID_Command(HIDBuffer, 3);
    925 }
    926 
    927 void WII::setLedRaw(uint8_t value) {
    928  HIDBuffer[1] = 0x11;
    929  HIDBuffer[2] = value | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    930  HID_Command(HIDBuffer, 3);
    931 }
    932 
    934  HIDBuffer[1] = 0x11;
    935  HIDBuffer[2] &= ~(pgm_read_byte(&WII_LEDS[(uint8_t)a]));
    936  HID_Command(HIDBuffer, 3);
    937 }
    938 
    940  if(a == OFF)
    941  setLedRaw(0);
    942  else {
    943  HIDBuffer[1] = 0x11;
    944  HIDBuffer[2] |= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
    945  HID_Command(HIDBuffer, 3);
    946  }
    947 }
    948 
    950  HIDBuffer[1] = 0x11;
    951  HIDBuffer[2] ^= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
    952  HID_Command(HIDBuffer, 3);
    953 }
    954 
    956  HIDBuffer[1] = 0x11;
    957  HIDBuffer[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
    958  if(wiimoteConnected)
    959  HIDBuffer[2] |= 0x10; // If it's connected LED1 will light up
    961  HIDBuffer[2] |= 0x20; // If it's connected LED2 will light up
    963  HIDBuffer[2] |= 0x40; // If it's connected LED3 will light up
    964 
    965  HID_Command(HIDBuffer, 3);
    966 }
    967 
    969  checkBatteryLevel = true; // This is needed so the library knows that the status response is a response to this function
    970  statusRequest(); // This will update the battery level
    971  return batteryLevel;
    972 };
    973 
    974 void WII::setReportMode(bool continuous, uint8_t mode) {
    975 #ifdef EXTRADEBUG
    976  Notify(PSTR("\r\nReport mode was changed to: "), 0x80);
    977  D_PrintHex<uint8_t > (mode, 0x80);
    978 #endif
    979  uint8_t cmd_buf[4];
    980  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    981  cmd_buf[1] = 0x12;
    982  if(continuous)
    983  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    984  else
    985  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    986  cmd_buf[3] = mode;
    987  HID_Command(cmd_buf, 4);
    988 }
    989 
    990 void WII::statusRequest() {
    991  uint8_t cmd_buf[3];
    992  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    993  cmd_buf[1] = 0x15;
    994  cmd_buf[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
    995  HID_Command(cmd_buf, 3);
    996 }
    997 
    998 /************************************************************/
    999 /* Memmory Commands */
    1000 /************************************************************/
    1001 
    1002 void WII::writeData(uint32_t offset, uint8_t size, uint8_t* data) {
    1003  uint8_t cmd_buf[23];
    1004  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    1005  cmd_buf[1] = 0x16; // Write data
    1006  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Write to memory, clear bit 2 to write to EEPROM
    1007  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
    1008  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
    1009  cmd_buf[5] = (uint8_t)(offset & 0xFF);
    1010  cmd_buf[6] = size;
    1011  uint8_t i = 0;
    1012  for(; i < size; i++)
    1013  cmd_buf[7 + i] = data[i];
    1014  for(; i < 16; i++) // Set the rest to zero
    1015  cmd_buf[7 + i] = 0x00;
    1016  HID_Command(cmd_buf, 23);
    1017 }
    1018 
    1019 void WII::initExtension1() {
    1020  uint8_t buf[1];
    1021  buf[0] = 0x55;
    1022  writeData(0xA400F0, 1, buf);
    1023 }
    1024 
    1025 void WII::initExtension2() {
    1026  uint8_t buf[1];
    1027  buf[0] = 0x00;
    1028  writeData(0xA400FB, 1, buf);
    1029 }
    1030 
    1031 void WII::initMotionPlus() {
    1032  uint8_t buf[1];
    1033  buf[0] = 0x55;
    1034  writeData(0xA600F0, 1, buf);
    1035 }
    1036 
    1037 void WII::activateMotionPlus() {
    1038  uint8_t buf[1];
    1039  if(pBtd->wiiUProController) {
    1040 #ifdef DEBUG_USB_HOST
    1041  Notify(PSTR("\r\nActivating Wii U Pro Controller"), 0x80);
    1042 #endif
    1043  buf[0] = 0x00; // It seems like you can send anything but 0x04, 0x05, and 0x07
    1044  } else if(activateNunchuck) {
    1045 #ifdef DEBUG_USB_HOST
    1046  Notify(PSTR("\r\nActivating Motion Plus in pass-through mode"), 0x80);
    1047 #endif
    1048  buf[0] = 0x05; // Activate nunchuck pass-through mode
    1049  }//else if(classicControllerConnected && extensionConnected)
    1050  //buf[0] = 0x07;
    1051  else {
    1052 #ifdef DEBUG_USB_HOST
    1053  Notify(PSTR("\r\nActivating Motion Plus in normal mode"), 0x80);
    1054 #endif
    1055  buf[0] = 0x04; // Don't use any extension
    1056  }
    1057  writeData(0xA600FE, 1, buf);
    1058 }
    1059 
    1060 void WII::readData(uint32_t offset, uint16_t size, bool EEPROM) {
    1061  uint8_t cmd_buf[8];
    1062  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    1063  cmd_buf[1] = 0x17; // Read data
    1064  if(EEPROM)
    1065  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Read from EEPROM
    1066  else
    1067  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Read from memory
    1068  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
    1069  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
    1070  cmd_buf[5] = (uint8_t)(offset & 0xFF);
    1071  cmd_buf[6] = (uint8_t)((size & 0xFF00) >> 8);
    1072  cmd_buf[7] = (uint8_t)(size & 0xFF);
    1073 
    1074  HID_Command(cmd_buf, 8);
    1075 }
    1076 
    1077 void WII::readExtensionType() {
    1078  readData(0xA400FA, 6, false);
    1079 }
    1080 
    1081 void WII::readCalData() {
    1082  readData(0x0016, 8, true);
    1083 }
    1084 
    1085 void WII::checkMotionPresent() {
    1086  readData(0xA600FA, 6, false);
    1087 }
    1088 
    1089 void WII::readWiiBalanceBoardCalibration() {
    1090  readData(0xA40024, 24, false);
    1091 }
    1092 
    1093 /************************************************************/
    1094 /* WII Commands */
    1095 /************************************************************/
    1096 
    1097 bool WII::getButtonPress(ButtonEnum b) { // Return true when a button is pressed
    1099  return (ButtonState & pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]));
    1100  else
    1101  return (ButtonState & pgm_read_dword(&WII_BUTTONS[(uint8_t)b]));
    1102 }
    1103 
    1104 bool WII::getButtonClick(ButtonEnum b) { // Only return true when a button is clicked
    1105  uint32_t button;
    1107  button = pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]);
    1108  else
    1109  button = pgm_read_dword(&WII_BUTTONS[(uint8_t)b]);
    1110  bool click = (ButtonClickState & button);
    1111  ButtonClickState &= ~button; // clear "click" event
    1112  return click;
    1113 }
    1114 
    1116  if(!nunchuckConnected)
    1117  return 127; // Return center position
    1118  else {
    1119  uint8_t output = hatValues[(uint8_t)a];
    1120  if(output == 0xFF || output == 0x00) // The joystick will only read 255 or 0 when the cable is unplugged or initializing, so we will just return the center position
    1121  return 127;
    1122  else
    1123  return output;
    1124  }
    1125 }
    1126 
    1129  return 2000;
    1130  else {
    1131  uint16_t output = hatValues[(uint8_t)a];
    1132  if(output == 0x00) // The joystick will only read 0 when it is first initializing, so we will just return the center position
    1133  return 2000;
    1134  else
    1135  return output;
    1136  }
    1137 }
    1138 
    1139 void WII::onInit() {
    1140  if(pFuncOnInit)
    1141  pFuncOnInit(); // Call the user function
    1142  else
    1143  setLedStatus();
    1144 }
    1145 
    1146 /************************************************************/
    1147 /* Wii Balance Board Commands */
    1148 /************************************************************/
    1149 
    1151  // Use interpolating between two points - based on: https://github.com/skorokithakis/gr8w8upd8m8/blob/master/gr8w8upd8m8.py
    1152  // wiiBalanceBoardCal[pos][0] is calibration values for 0 kg
    1153  // wiiBalanceBoardCal[pos][1] is calibration values for 17 kg
    1154  // wiiBalanceBoardCal[pos][2] is calibration values for 34 kg
    1155  if(wiiBalanceBoardRaw[pos] < wiiBalanceBoardCal[0][pos])
    1156  return 0.0f; // Below 0 kg
    1157  else if(wiiBalanceBoardRaw[pos] < wiiBalanceBoardCal[1][pos]) // Between 0 and 17 kg
    1158  return 17.0f * (float)(wiiBalanceBoardRaw[pos] - wiiBalanceBoardCal[0][pos]) / (float)(wiiBalanceBoardCal[1][pos] - wiiBalanceBoardCal[0][pos]);
    1159  else // More than 17 kg
    1160  return 17.0f + 17.0f * (float)(wiiBalanceBoardRaw[pos] - wiiBalanceBoardCal[1][pos]) / (float)(wiiBalanceBoardCal[2][pos] - wiiBalanceBoardCal[1][pos]);
    1161 };
    1162 
    1165 };
    1166 
    1167 /************************************************************/
    1168 /* The following functions are for the IR camera */
    1169 /************************************************************/
    1170 
    1171 #ifdef WIICAMERA
    1172 
    1173 void WII::IRinitialize() { // Turns on and initialises the IR camera
    1174 
    1175  enableIRCamera1();
    1176 #ifdef DEBUG_USB_HOST
    1177  Notify(PSTR("\r\nEnable IR Camera1 Complete"), 0x80);
    1178 #endif
    1179  delay(80);
    1180 
    1181  enableIRCamera2();
    1182 #ifdef DEBUG_USB_HOST
    1183  Notify(PSTR("\r\nEnable IR Camera2 Complete"), 0x80);
    1184 #endif
    1185  delay(80);
    1186 
    1187  write0x08Value();
    1188 #ifdef DEBUG_USB_HOST
    1189  Notify(PSTR("\r\nWrote hex number 0x08"), 0x80);
    1190 #endif
    1191  delay(80);
    1192 
    1193  writeSensitivityBlock1();
    1194 #ifdef DEBUG_USB_HOST
    1195  Notify(PSTR("\r\nWrote Sensitivity Block 1"), 0x80);
    1196 #endif
    1197  delay(80);
    1198 
    1199  writeSensitivityBlock2();
    1200 #ifdef DEBUG_USB_HOST
    1201  Notify(PSTR("\r\nWrote Sensitivity Block 2"), 0x80);
    1202 #endif
    1203  delay(80);
    1204 
    1205  uint8_t mode_num = 0x03;
    1206  setWiiModeNumber(mode_num); // Change input for whatever mode you want i.e. 0x01, 0x03, or 0x05
    1207 #ifdef DEBUG_USB_HOST
    1208  Notify(PSTR("\r\nSet Wii Mode Number To 0x"), 0x80);
    1209  D_PrintHex<uint8_t > (mode_num, 0x80);
    1210 #endif
    1211  delay(80);
    1212 
    1213  write0x08Value();
    1214 #ifdef DEBUG_USB_HOST
    1215  Notify(PSTR("\r\nWrote Hex Number 0x08"), 0x80);
    1216 #endif
    1217  delay(80);
    1218 
    1219  setReportMode(false, 0x33);
    1220  //setReportMode(false, 0x3f); // For full reporting mode, doesn't work yet
    1221 #ifdef DEBUG_USB_HOST
    1222  Notify(PSTR("\r\nSet Report Mode to 0x33"), 0x80);
    1223 #endif
    1224  delay(80);
    1225 
    1226  statusRequest(); // Used to update wiiState - call isIRCameraEnabled() afterwards to check if it actually worked
    1227 #ifdef DEBUG_USB_HOST
    1228  Notify(PSTR("\r\nIR Initialized"), 0x80);
    1229 #endif
    1230 }
    1231 
    1232 void WII::enableIRCamera1() {
    1233  uint8_t cmd_buf[3];
    1234  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    1235  cmd_buf[1] = 0x13; // Output report 13
    1236  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
    1237  HID_Command(cmd_buf, 3);
    1238 }
    1239 
    1240 void WII::enableIRCamera2() {
    1241  uint8_t cmd_buf[3];
    1242  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    1243  cmd_buf[1] = 0x1A; // Output report 1A
    1244  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
    1245  HID_Command(cmd_buf, 3);
    1246 }
    1247 
    1248 void WII::writeSensitivityBlock1() {
    1249  uint8_t buf[9];
    1250  buf[0] = 0x00;
    1251  buf[1] = 0x00;
    1252  buf[2] = 0x00;
    1253  buf[3] = 0x00;
    1254  buf[4] = 0x00;
    1255  buf[5] = 0x00;
    1256  buf[6] = 0x90;
    1257  buf[7] = 0x00;
    1258  buf[8] = 0x41;
    1259 
    1260  writeData(0xB00000, 9, buf);
    1261 }
    1262 
    1263 void WII::writeSensitivityBlock2() {
    1264  uint8_t buf[2];
    1265  buf[0] = 0x40;
    1266  buf[1] = 0x00;
    1267 
    1268  writeData(0xB0001A, 2, buf);
    1269 }
    1270 
    1271 void WII::write0x08Value() {
    1272  uint8_t cmd = 0x08;
    1273  writeData(0xb00030, 1, &cmd);
    1274 }
    1275 
    1276 void WII::setWiiModeNumber(uint8_t mode_number) { // mode_number in hex i.e. 0x03 for extended mode
    1277  writeData(0xb00033, 1, &mode_number);
    1278 }
    1279 #endif
    bool wiimoteConnected
    Definition: Wii.h:191
    #define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
    Definition: BTD.h:140
    -
    void(* pFuncOnInit)(void)
    Definition: BTD.h:609
    bool incomingWii
    Definition: BTD.h:474
    void onInit()
    Definition: Wii.cpp:1139
    @@ -1440,6 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    bool getButtonClick(ButtonEnum b)
    Definition: Wii.cpp:1104
    int16_t accYwiimote
    Definition: Wii.h:230
    bool wiiUProControllerConnected
    Definition: Wii.h:202
    +
    void(* pFuncOnInit)(void)
    Definition: BTD.h:609
    #define WII_FLAG_CALIBRATE_BALANCE_BOARD
    Definition: Wii.h:29
    #define l2cap_check_flag(flag)
    Definition: BTD.h:161
    @@ -1510,7 +232,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_wii_8h.html b/_wii_8h.html index cc9217f8..175d749a 100644 --- a/_wii_8h.html +++ b/_wii_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Wii.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -89,21 +90,27 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Wii.h File Reference
    -
    #include "BTD.h"
    -#include "controllerEnums.h"
    +
    #include "BTD.h"
    +#include "controllerEnums.h"
    Include dependency graph for Wii.h:
    - + + + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -250,10 +257,10 @@ Enumerations

    Enum used to read the joystick on the Nunchuck.

    - -
    Enumerator
    HatX  +
    Enumerator
    HatX 

    Read the x-axis on the Nunchuck joystick.

    HatY  +
    HatY 

    Read the y-axis on the Nunchuck joystick.

    @@ -273,13 +280,13 @@ Enumerations

    Enum used to read the weight on Wii Balance Board.

    - - - -
    Enumerator
    TopRight  +
    Enumerator
    TopRight 
    BotRight  +
    BotRight 
    TopLeft  +
    TopLeft 
    BotLeft  +
    BotLeft 
    @@ -292,7 +299,7 @@ Enumerations diff --git a/_wii_8h__dep__incl.md5 b/_wii_8h__dep__incl.md5 index 1300a3e5..141f0cf4 100644 --- a/_wii_8h__dep__incl.md5 +++ b/_wii_8h__dep__incl.md5 @@ -1 +1 @@ -4f5ed0d059dbe61d52339b9d9d877c07 \ No newline at end of file +68e486939ecaf1de2be16bf264fe38d3 \ No newline at end of file diff --git a/_wii_8h__dep__incl.png b/_wii_8h__dep__incl.png index 39cb1dfd6114e76503adfc1e2e1d97de8e6508a0..ab5864894641c681a74e12ebab6ec275bd0375fa 100644 GIT binary patch delta 1628 zcmV-i2BZ1r4*m>~HGc*(Nkl&> zI-1Yt>zz#v3=R$s4h~jqCd%{m>(>t-J~W%nKbw@)EH5tufMlLL*REZwJ)`WrfIh z2nB3N=asvrHdwP0SR#xKiH~=sVbL`l$a5xMA zTU%R^NTjEyM@%P+i;H*f-kqMFHX4m~yIrc>KtfM~Ab-qe^YiD=0f1o`o6W{B3;=jM zp5ESGf)MrKMN!n=y?aTL92y#0U0szbH<0#vYq3~79uLQH$z)Qm*C&%nmSsI24?k(e zuxHO6zR=dzmd$1*%uPzq?(S{?aJ$_)oeltWI-SeqYHe-h@gP zT4uA{?CjszM#tyrc880vJt~!IYU&NP(eZgsO}%MqQVG?3zA!iUHXcvm86A^nJf2!u zSbyQTLU9lwaJ$2J62Rn1(|>LocRDdmT}+;jAHOLSN*AIEg~F>>|9twCz>okA&(EI| zfxtT2Zo#d&S@rbkUl?-0;rZmr(oTzt99M8U7ct}@)u)hhux!4o>vy4=O6A(xi00;R zf8y3w968|ryn+zw>bg8V9mG6nqpT+=o`3Q}@st;er@T-+<%QxYFBDICp?Jy*#Zz7= zp7KKRloyJpyih#lh2kkM6i<1fc*+aKQ)U$Z(^t~>iFbq~|7dRht=^-QynpIgUgtx*W^=&mJhfV_$z-Bwny-HO@`a}9t*tG->Twg(R$@MXW>Unms(em`GzI2<;c4JyrBj^nOgy?XHAL5)Up`}S?2 z<*i${Iy*bt+uJW*yqL@7%EzmvYJbmxfq_6E5R1hCz~}RwK7E?sz9kxshC-o%fq{xW zOiWC8z23RGxkw~Z{M0f#JG->B6bgmjy?b}_=FN)n>L`8)eDvrMhRY({r;0DPa=eF+_*6^GQu|yI@z|j?(XhzI9w70faT?7zRWPpp+kqt$A8PiZ+7=x z|HT!Np21+yU@&B}*&|1eAcS-}T_%$`eE4uM7!;B#DHKDJWICNL2?Br+OsCT%NtTb7 z=SR<4?koH@5DtgKXfy(V(P+GP?;c5#e7qtD4jg#@{{4^fNF*W@_U+qOFkwlCX=Z+^4;+~e*F0G@G#z#>VnB+Dp`dVwGWyMXq59)@st;h a;`uM}Q7ta5NeEN`0000 z#{ZgB6lia6=h7@z=BMZ>EJV+hP+3`d{``5iT3uajGMPq4N15u_*qF&=>h10I`Ftjm z2>{r_0!${8&wuCRC8Y)M03bZ)9G*=_jo+PU~uQoogBAw{P^*tq@?}(_XEJ>h zL&L+vyMK4@27o<#_O!IL$Ye5=N+pxYIBsXdh7ACKVHjVDG4QrO)6>&4Gc&8IsoTqkI?+ODoHy|9oXlP8bZ z?OuiAa(THGalfeN=ZhBv^OvH6DEmd~IXg?$)%60v`1njm#}LY{k$Sebf1a5k0YEC1 z)PL0xD7!}LX|)nksRRHhD%jLC5D3g7>l&Ts^fcMr?4+o9rb?1jYpV-c@8~>3B>_Mp z!K_vsS?}mPtyVnr+7Cqq+uA-)Oa##Mj>z-JkLivM_x$`HpCvR+zkE4>CILjA4GsN^ zgEURo)*>3Zh&-P^@1_@BhzbU2hhzBr_kVE&383&C9rY8$NH7@Yf}2z-vDw1xYTiNN zX|we$by1O`=B-u~3kKf4cZk5u%&bC@!d9oI$i&2d;^Kb)i=%V>eG!Py8)%wVC@$C6 z_ag2zR<0+Ap29-(6c(bVun;|kh3F|PL{DKMdI}5CQ&@E7NV!H5Iu#3=zl3J zL{DKMdI}5CQ(%OC>D$@a86O`X?H&^nvLuqEX!mmU>eW!SKkiTP`Fyjpv(KJAi*^#x z=KlTrU%q?^jfA-m!)!JqN+)X6*48eF#LD~>J%xqnxdf%9rTO{!Z1wKlyBLNI4-Yfd zuV24n7}nO-=Jk4+yKULR+OlF#qkqxZ+uIum{JuZ<_3PIXiKMl)m8sh8_W1btef##M zrKMfJejNbV!rHQ8PlLfQH#bKR1ONmAfwynpo;`b(^>jEKd-v{@$z&NB8F%j70RXnJ zwyfB5)22;owc2jC1Hij??=mwpOG--Kym>=W6ad)m_JV=}2pO(n$1O!s6@L{KSy@>d zH*P$0<_z;Ybf#r}eZ5MhlFQ{~Wo0Buh7F?d1OTJa*wxhq0IjX92M!!yepHX+I7yN{ zJw1$PWGX8wtyXJeV`E!eo7?Taefu{1(!+-j8yXsHHd|9u6FU&X23JPtBCw{W1~}Zo z`Sj^ixm+F$26Z}JZEY=0(|<>g9=&<x`^$COk=6}s9mFm{5TN;gq zc^pY$VWGp}XlZHTGH3xnsZ_G-?7qIf&~eM`Kmc&N-Abi0LU2W_a-Co_8f`Y)!Gi~x zYEDj0PEO9NSFa*_S}d0F@o@k+efso`8#kOzr_<@YaN)wp$Ozl!(xppYueZCqyS%*o z)TvVuf-7Sc^OL6O>VN8L0BCM*W+SDgr4ot6@Aos+u=5iDJRT2C)4zWGx^m@;QmIT$ zO)V}i{`vDK+tOmOWM^k*WMo{tcrg$Ngbl7@ey-9p8iYM!g$*vtVoz~>i=32{lym3K zaS5)1zsOTAmp^*+h)Zx4{6(HoMf4OFvEmtKeOp*qh&~T~`9JvaqrqSZjr`%6pPzr? z#0lnMk^gH92E&3UhH-ihngEEE`6+q|i&*je7a3^CYdW{oH2?qr07*qoM6N<$f@Vme AQ~&?~ diff --git a/_wii_8h__incl.map b/_wii_8h__incl.map index c40cf68f..cc608b3a 100644 --- a/_wii_8h__incl.map +++ b/_wii_8h__incl.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/_wii_8h__incl.md5 b/_wii_8h__incl.md5 index 58df1c31..6bc35bec 100644 --- a/_wii_8h__incl.md5 +++ b/_wii_8h__incl.md5 @@ -1 +1 @@ -1bab26d12347d67d2975eed4e0e08f43 \ No newline at end of file +a8d2a81727ce46fe1f181ac702c5895a \ No newline at end of file diff --git a/_wii_8h__incl.png b/_wii_8h__incl.png index 56c185714481afec6002fdbbd590b78456843f2e..b26a29a2815bd0672227892e5f02350f415a3412 100644 GIT binary patch literal 12949 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 - + USB Host Shield 2.0: Wii.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,298 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Wii.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16 
    -
    17  IR camera support added by Allan Glover (adglover9.81@gmail.com) and Kristian Lauszus
    -
    18  */
    -
    19 
    -
    20 #ifndef _wii_h_
    -
    21 #define _wii_h_
    -
    22 
    -
    23 #include "BTD.h"
    -
    24 #include "controllerEnums.h"
    -
    25 
    -
    26 /* Wii event flags */
    -
    27 #define WII_FLAG_MOTION_PLUS_CONNECTED (1 << 0)
    -
    28 #define WII_FLAG_NUNCHUCK_CONNECTED (1 << 1)
    -
    29 #define WII_FLAG_CALIBRATE_BALANCE_BOARD (1 << 2)
    -
    30 
    -
    31 #define wii_check_flag(flag) (wii_event_flag & (flag))
    -
    32 #define wii_set_flag(flag) (wii_event_flag |= (flag))
    -
    33 #define wii_clear_flag(flag) (wii_event_flag &= ~(flag))
    -
    34 
    -
    36 enum HatEnum {
    -
    38  HatX = 0,
    -
    40  HatY = 1,
    -
    41 };
    -
    42 
    - -
    45  TopRight = 0,
    -
    46  BotRight = 1,
    -
    47  TopLeft = 2,
    -
    48  BotLeft = 3,
    -
    49 };
    -
    50 
    -
    56 class WII : public BluetoothService {
    -
    57 public:
    -
    64  WII(BTD *p, bool pair = false);
    -
    65 
    -
    68  void disconnect();
    -
    82  bool getButtonPress(ButtonEnum b);
    -
    83  bool getButtonClick(ButtonEnum b);
    -
    89  void pair(void) {
    -
    90  if(pBtd)
    - -
    92  };
    -
    98  uint8_t getAnalogHat(HatEnum a);
    -
    104  uint16_t getAnalogHat(AnalogHatEnum a);
    -
    105 
    -
    110  float getPitch() {
    - -
    112  return compPitch;
    -
    113  return getWiimotePitch();
    -
    114  };
    -
    115 
    -
    120  float getRoll() {
    - -
    122  return compRoll;
    -
    123  return getWiimoteRoll();
    -
    124  };
    -
    125 
    -
    132  float getYaw() {
    -
    133  return gyroYaw;
    -
    134  };
    -
    135 
    -
    137  void setAllOff();
    -
    139  void setRumbleOff();
    -
    141  void setRumbleOn();
    -
    143  void setRumbleToggle();
    -
    144 
    -
    149  void setLedRaw(uint8_t value);
    -
    150 
    -
    152  void setLedOff() {
    -
    153  setLedRaw(0);
    -
    154  };
    -
    159  void setLedOff(LEDEnum a);
    -
    164  void setLedOn(LEDEnum a);
    -
    169  void setLedToggle(LEDEnum a);
    -
    177  void setLedStatus();
    -
    178 
    -
    183  uint8_t getBatteryLevel();
    -
    184 
    -
    189  uint8_t getWiiState() {
    -
    190  return wiiState;
    -
    191  };
    -
    196  bool wiimoteConnected;
    - - - - -
    207  /* IMU Data, might be usefull if you need to do something more advanced than just calculating the angle */
    -
    208 
    -
    212  float getWiimotePitch() {
    -
    213  return (atan2f(accYwiimote, accZwiimote) + PI) * RAD_TO_DEG;
    -
    214  };
    -
    215 
    -
    216  float getWiimoteRoll() {
    -
    217  return (atan2f(accXwiimote, accZwiimote) + PI) * RAD_TO_DEG;
    -
    218  };
    - -
    225  return (atan2f(accYnunchuck, accZnunchuck) + PI) * RAD_TO_DEG;
    -
    226  };
    -
    227 
    -
    228  float getNunchuckRoll() {
    -
    229  return (atan2f(accXnunchuck, accZnunchuck) + PI) * RAD_TO_DEG;
    -
    230  };
    - - -
    239  /* Variables for the gyro inside the Motion Plus */
    -
    241  float gyroPitch;
    -
    243  float gyroRoll;
    -
    245  float gyroYaw;
    -
    246 
    - - - -
    256  uint16_t pitchGyroScale;
    -
    257  uint16_t rollGyroScale;
    -
    258  uint16_t yawGyroScale;
    -
    263  int16_t gyroYawRaw;
    -
    264  int16_t gyroRollRaw;
    -
    265  int16_t gyroPitchRaw;
    -
    270  int16_t gyroYawZero;
    -
    271  int16_t gyroRollZero;
    -
    272  int16_t gyroPitchZero;
    -
    282  float getWeight(BalanceBoardEnum pos);
    -
    283 
    -
    288  float getTotalWeight();
    -
    289 
    - -
    296  return wiiBalanceBoardRaw[pos];
    -
    297  };
    -
    300 #ifdef WIICAMERA
    -
    301 
    -
    305  void IRinitialize();
    -
    306 
    -
    311  uint16_t getIRx1() {
    -
    312  return IR_object_x1;
    -
    313  };
    -
    314 
    -
    319  uint16_t getIRy1() {
    -
    320  return IR_object_y1;
    -
    321  };
    -
    322 
    -
    327  uint8_t getIRs1() {
    -
    328  return IR_object_s1;
    -
    329  };
    -
    330 
    -
    335  uint16_t getIRx2() {
    -
    336  return IR_object_x2;
    -
    337  };
    -
    338 
    -
    343  uint16_t getIRy2() {
    -
    344  return IR_object_y2;
    -
    345  };
    -
    346 
    -
    351  uint8_t getIRs2() {
    -
    352  return IR_object_s2;
    -
    353  };
    -
    354 
    -
    359  uint16_t getIRx3() {
    -
    360  return IR_object_x3;
    -
    361  };
    -
    362 
    -
    367  uint16_t getIRy3() {
    -
    368  return IR_object_y3;
    -
    369  };
    -
    370 
    -
    375  uint8_t getIRs3() {
    -
    376  return IR_object_s3;
    -
    377  };
    -
    378 
    -
    383  uint16_t getIRx4() {
    -
    384  return IR_object_x4;
    -
    385  };
    -
    386 
    -
    391  uint16_t getIRy4() {
    -
    392  return IR_object_y4;
    -
    393  };
    -
    394 
    -
    399  uint8_t getIRs4() {
    -
    400  return IR_object_s4;
    -
    401  };
    -
    402 
    - -
    409  return (wiiState & 0x08);
    -
    410  };
    -
    412 #endif
    -
    413 
    -
    414 protected:
    -
    420  void ACLData(uint8_t* ACLData);
    -
    422  void Run();
    -
    424  void Reset();
    -
    430  void onInit();
    -
    433 private:
    -
    434 
    -
    435  void L2CAP_task(); // L2CAP state machine
    -
    436 
    -
    437  /* Variables filled from HCI event management */
    -
    438  bool activeConnection; // Used to indicate if it's already has established a connection
    -
    439 
    -
    440  /* Variables used by high level L2CAP task */
    -
    441  uint8_t l2cap_state;
    -
    442  uint8_t wii_event_flag; // Used for Wii flags
    -
    443 
    -
    444  uint32_t ButtonState;
    -
    445  uint32_t OldButtonState;
    -
    446  uint32_t ButtonClickState;
    -
    447  uint16_t hatValues[4];
    -
    448 
    -
    449  uint8_t HIDBuffer[3]; // Used to store HID commands
    -
    450 
    -
    451  uint16_t stateCounter;
    -
    452  bool unknownExtensionConnected;
    -
    453  bool extensionConnected;
    -
    454  bool checkBatteryLevel; // Set to true when getBatteryLevel() is called otherwise if should be false
    -
    455  bool motionPlusInside; // True if it's a new Wiimote with the Motion Plus extension build into it
    -
    456 
    -
    457  /* L2CAP Channels */
    -
    458  uint8_t control_scid[2]; // L2CAP source CID for HID_Control
    -
    459  uint8_t control_dcid[2]; // 0x0060
    -
    460  uint8_t interrupt_scid[2]; // L2CAP source CID for HID_Interrupt
    -
    461  uint8_t interrupt_dcid[2]; // 0x0061
    -
    462 
    -
    463  /* HID Commands */
    -
    464  void HID_Command(uint8_t* data, uint8_t nbytes);
    -
    465  void setReportMode(bool continuous, uint8_t mode);
    -
    466 
    -
    467  void writeData(uint32_t offset, uint8_t size, uint8_t* data);
    -
    468  void initExtension1();
    -
    469  void initExtension2();
    -
    470 
    -
    471  void statusRequest(); // Used to update the Wiimote state and battery level
    -
    472 
    -
    473  void readData(uint32_t offset, uint16_t size, bool EEPROM);
    -
    474  void readExtensionType();
    -
    475  void readCalData();
    -
    476  void readWiiBalanceBoardCalibration(); // Used by the library to read the Wii Balance Board calibration values
    -
    477 
    -
    478  void checkMotionPresent(); // Used to see if a Motion Plus is connected to the Wiimote
    -
    479  void initMotionPlus();
    -
    480  void activateMotionPlus();
    -
    481 
    -
    482  uint16_t wiiBalanceBoardRaw[4]; // Wii Balance Board raw values
    -
    483  uint16_t wiiBalanceBoardCal[3][4]; // Wii Balance Board calibration values
    -
    484 
    -
    485  float compPitch; // Fusioned angle using a complimentary filter if the Motion Plus is connected
    -
    486  float compRoll; // Fusioned angle using a complimentary filter if the Motion Plus is connected
    -
    487 
    -
    488  bool activateNunchuck;
    -
    489  bool motionValuesReset; // This bool is true when the gyro values has been reset
    -
    490  uint32_t timer;
    -
    491 
    -
    492  uint8_t wiiState; // Stores the value in l2capinbuf[12] - (0x01: Battery is nearly empty), (0x02: An Extension Controller is connected), (0x04: Speaker enabled), (0x08: IR enabled), (0x10: LED1, 0x20: LED2, 0x40: LED3, 0x80: LED4)
    -
    493  uint8_t batteryLevel;
    -
    494 
    -
    495 #ifdef WIICAMERA
    -
    496  /* Private function and variables for the readings from the IR Camera */
    -
    497  void enableIRCamera1(); // Sets bit 2 of output report 13
    -
    498  void enableIRCamera2(); // Sets bit 2 of output report 1A
    -
    499  void writeSensitivityBlock1();
    -
    500  void writeSensitivityBlock2();
    -
    501  void write0x08Value();
    -
    502  void setWiiModeNumber(uint8_t mode_number);
    -
    503 
    -
    504  uint16_t IR_object_x1; // IR x position 10 bits
    -
    505  uint16_t IR_object_y1; // IR y position 10 bits
    -
    506  uint8_t IR_object_s1; // IR size value
    -
    507  uint16_t IR_object_x2;
    -
    508  uint16_t IR_object_y2;
    -
    509  uint8_t IR_object_s2;
    -
    510  uint16_t IR_object_x3; // IR x position 10 bits
    -
    511  uint16_t IR_object_y3; // IR y position 10 bits
    -
    512  uint8_t IR_object_s3; // IR size value
    -
    513  uint16_t IR_object_x4;
    -
    514  uint16_t IR_object_y4;
    -
    515  uint8_t IR_object_s4;
    -
    516 #endif
    -
    517 };
    -
    518 #endif
    -
    bool wiimoteConnected
    Definition: Wii.h:191
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16 
    17  IR camera support added by Allan Glover (adglover9.81@gmail.com) and Kristian Lauszus
    18  */
    19 
    20 #ifndef _wii_h_
    21 #define _wii_h_
    22 
    23 #include "BTD.h"
    24 #include "controllerEnums.h"
    25 
    26 /* Wii event flags */
    27 #define WII_FLAG_MOTION_PLUS_CONNECTED (1 << 0)
    28 #define WII_FLAG_NUNCHUCK_CONNECTED (1 << 1)
    29 #define WII_FLAG_CALIBRATE_BALANCE_BOARD (1 << 2)
    30 
    31 #define wii_check_flag(flag) (wii_event_flag & (flag))
    32 #define wii_set_flag(flag) (wii_event_flag |= (flag))
    33 #define wii_clear_flag(flag) (wii_event_flag &= ~(flag))
    34 
    36 enum HatEnum {
    38  HatX = 0,
    40  HatY = 1,
    41 };
    42 
    45  TopRight = 0,
    46  BotRight = 1,
    47  TopLeft = 2,
    48  BotLeft = 3,
    49 };
    50 
    56 class WII : public BluetoothService {
    57 public:
    64  WII(BTD *p, bool pair = false);
    65 
    68  void disconnect();
    82  bool getButtonPress(ButtonEnum b);
    83  bool getButtonClick(ButtonEnum b);
    89  void pair(void) {
    90  if(pBtd)
    92  };
    98  uint8_t getAnalogHat(HatEnum a);
    104  uint16_t getAnalogHat(AnalogHatEnum a);
    105 
    110  float getPitch() {
    112  return compPitch;
    113  return getWiimotePitch();
    114  };
    115 
    120  float getRoll() {
    122  return compRoll;
    123  return getWiimoteRoll();
    124  };
    125 
    132  float getYaw() {
    133  return gyroYaw;
    134  };
    135 
    137  void setAllOff();
    139  void setRumbleOff();
    141  void setRumbleOn();
    143  void setRumbleToggle();
    144 
    149  void setLedRaw(uint8_t value);
    150 
    152  void setLedOff() {
    153  setLedRaw(0);
    154  };
    159  void setLedOff(LEDEnum a);
    164  void setLedOn(LEDEnum a);
    169  void setLedToggle(LEDEnum a);
    177  void setLedStatus();
    178 
    183  uint8_t getBatteryLevel();
    184 
    189  uint8_t getWiiState() {
    190  return wiiState;
    191  };
    196  bool wiimoteConnected;
    207  /* IMU Data, might be usefull if you need to do something more advanced than just calculating the angle */
    208 
    212  float getWiimotePitch() {
    213  return (atan2f(accYwiimote, accZwiimote) + PI) * RAD_TO_DEG;
    214  };
    215 
    216  float getWiimoteRoll() {
    217  return (atan2f(accXwiimote, accZwiimote) + PI) * RAD_TO_DEG;
    218  };
    225  return (atan2f(accYnunchuck, accZnunchuck) + PI) * RAD_TO_DEG;
    226  };
    227 
    228  float getNunchuckRoll() {
    229  return (atan2f(accXnunchuck, accZnunchuck) + PI) * RAD_TO_DEG;
    230  };
    239  /* Variables for the gyro inside the Motion Plus */
    241  float gyroPitch;
    243  float gyroRoll;
    245  float gyroYaw;
    246 
    256  uint16_t pitchGyroScale;
    257  uint16_t rollGyroScale;
    258  uint16_t yawGyroScale;
    263  int16_t gyroYawRaw;
    264  int16_t gyroRollRaw;
    265  int16_t gyroPitchRaw;
    270  int16_t gyroYawZero;
    271  int16_t gyroRollZero;
    272  int16_t gyroPitchZero;
    282  float getWeight(BalanceBoardEnum pos);
    283 
    288  float getTotalWeight();
    289 
    296  return wiiBalanceBoardRaw[pos];
    297  };
    300 #ifdef WIICAMERA
    301 
    305  void IRinitialize();
    306 
    311  uint16_t getIRx1() {
    312  return IR_object_x1;
    313  };
    314 
    319  uint16_t getIRy1() {
    320  return IR_object_y1;
    321  };
    322 
    327  uint8_t getIRs1() {
    328  return IR_object_s1;
    329  };
    330 
    335  uint16_t getIRx2() {
    336  return IR_object_x2;
    337  };
    338 
    343  uint16_t getIRy2() {
    344  return IR_object_y2;
    345  };
    346 
    351  uint8_t getIRs2() {
    352  return IR_object_s2;
    353  };
    354 
    359  uint16_t getIRx3() {
    360  return IR_object_x3;
    361  };
    362 
    367  uint16_t getIRy3() {
    368  return IR_object_y3;
    369  };
    370 
    375  uint8_t getIRs3() {
    376  return IR_object_s3;
    377  };
    378 
    383  uint16_t getIRx4() {
    384  return IR_object_x4;
    385  };
    386 
    391  uint16_t getIRy4() {
    392  return IR_object_y4;
    393  };
    394 
    399  uint8_t getIRs4() {
    400  return IR_object_s4;
    401  };
    402 
    409  return (wiiState & 0x08);
    410  };
    412 #endif
    413 
    414 protected:
    420  void ACLData(uint8_t* ACLData);
    422  void Run();
    424  void Reset();
    430  void onInit();
    433 private:
    434 
    435  void L2CAP_task(); // L2CAP state machine
    436 
    437  /* Variables filled from HCI event management */
    438  bool activeConnection; // Used to indicate if it's already has established a connection
    439 
    440  /* Variables used by high level L2CAP task */
    441  uint8_t l2cap_state;
    442  uint8_t wii_event_flag; // Used for Wii flags
    443 
    444  uint32_t ButtonState;
    445  uint32_t OldButtonState;
    446  uint32_t ButtonClickState;
    447  uint16_t hatValues[4];
    448 
    449  uint8_t HIDBuffer[3]; // Used to store HID commands
    450 
    451  uint16_t stateCounter;
    452  bool unknownExtensionConnected;
    453  bool extensionConnected;
    454  bool checkBatteryLevel; // Set to true when getBatteryLevel() is called otherwise if should be false
    455  bool motionPlusInside; // True if it's a new Wiimote with the Motion Plus extension build into it
    456 
    457  /* L2CAP Channels */
    458  uint8_t control_scid[2]; // L2CAP source CID for HID_Control
    459  uint8_t control_dcid[2]; // 0x0060
    460  uint8_t interrupt_scid[2]; // L2CAP source CID for HID_Interrupt
    461  uint8_t interrupt_dcid[2]; // 0x0061
    462 
    463  /* HID Commands */
    464  void HID_Command(uint8_t* data, uint8_t nbytes);
    465  void setReportMode(bool continuous, uint8_t mode);
    466 
    467  void writeData(uint32_t offset, uint8_t size, uint8_t* data);
    468  void initExtension1();
    469  void initExtension2();
    470 
    471  void statusRequest(); // Used to update the Wiimote state and battery level
    472 
    473  void readData(uint32_t offset, uint16_t size, bool EEPROM);
    474  void readExtensionType();
    475  void readCalData();
    476  void readWiiBalanceBoardCalibration(); // Used by the library to read the Wii Balance Board calibration values
    477 
    478  void checkMotionPresent(); // Used to see if a Motion Plus is connected to the Wiimote
    479  void initMotionPlus();
    480  void activateMotionPlus();
    481 
    482  uint16_t wiiBalanceBoardRaw[4]; // Wii Balance Board raw values
    483  uint16_t wiiBalanceBoardCal[3][4]; // Wii Balance Board calibration values
    484 
    485  float compPitch; // Fusioned angle using a complimentary filter if the Motion Plus is connected
    486  float compRoll; // Fusioned angle using a complimentary filter if the Motion Plus is connected
    487 
    488  bool activateNunchuck;
    489  bool motionValuesReset; // This bool is true when the gyro values has been reset
    490  uint32_t timer;
    491 
    492  uint8_t wiiState; // Stores the value in l2capinbuf[12] - (0x01: Battery is nearly empty), (0x02: An Extension Controller is connected), (0x04: Speaker enabled), (0x08: IR enabled), (0x10: LED1, 0x20: LED2, 0x40: LED3, 0x80: LED4)
    493  uint8_t batteryLevel;
    494 
    495 #ifdef WIICAMERA
    496  /* Private function and variables for the readings from the IR Camera */
    497  void enableIRCamera1(); // Sets bit 2 of output report 13
    498  void enableIRCamera2(); // Sets bit 2 of output report 1A
    499  void writeSensitivityBlock1();
    500  void writeSensitivityBlock2();
    501  void write0x08Value();
    502  void setWiiModeNumber(uint8_t mode_number);
    503 
    504  uint16_t IR_object_x1; // IR x position 10 bits
    505  uint16_t IR_object_y1; // IR y position 10 bits
    506  uint8_t IR_object_s1; // IR size value
    507  uint16_t IR_object_x2;
    508  uint16_t IR_object_y2;
    509  uint8_t IR_object_s2;
    510  uint16_t IR_object_x3; // IR x position 10 bits
    511  uint16_t IR_object_y3; // IR y position 10 bits
    512  uint8_t IR_object_s3; // IR size value
    513  uint16_t IR_object_x4;
    514  uint16_t IR_object_y4;
    515  uint8_t IR_object_s4;
    516 #endif
    517 };
    518 #endif
    bool wiimoteConnected
    Definition: Wii.h:191
    void onInit()
    Definition: Wii.cpp:1139
    int16_t gyroPitchRaw
    Definition: Wii.h:265
    uint16_t rollGyroScale
    Definition: Wii.h:257
    @@ -470,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_wii_camera_readme_8md.html b/_wii_camera_readme_8md.html index 2eba6dd0..ff934b29 100644 --- a/_wii_camera_readme_8md.html +++ b/_wii_camera_readme_8md.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: WiiCameraReadme.md File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -92,7 +93,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_wii_camera_readme_8md_source.html b/_wii_camera_readme_8md_source.html index be5d46f5..9d1d4dd9 100644 --- a/_wii_camera_readme_8md_source.html +++ b/_wii_camera_readme_8md_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: WiiCameraReadme.md Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,27 +86,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    WiiCameraReadme.md
    -Go to the documentation of this file.
    1 Please see <http://wiibrew.org/wiki/Wiimote#IR_Camera> for the complete capabilities of the Wii camera. The IR camera code was written based on the above website and with support from Kristian Lauszus.
    -
    2 
    -
    3 This library is large, if you run into memory problems when uploading to the Arduino, disable serial debugging.
    -
    4 
    -
    5 To enable the IR camera code, simply set ```ENABLE_WII_IR_CAMERA``` to 1 in [settings.h](settings.h).
    -
    6 
    -
    7 This library implements the following settings:
    -
    8 
    -
    9 * Report sensitivity mode: 00 00 00 00 00 00 90 00 41 40 00 Suggested by inio (high sensitivity)
    -
    10 * Data Format: Extended mode (0x03). Full mode is not working yet. The output reports 0x3e and 0x3f need tampering with
    -
    11  * In this mode the camera outputs x and y coordinates and a size dimension for the 4 brightest points.
    -
    12 
    -
    13 Again, read through <http://wiibrew.org/wiki/Wiimote#IR_Camera> to get an understanding of the camera and its settings.
    -
    #define ENABLE_WII_IR_CAMERA
    Definition: settings.h:70
    -
    Definition: PS3Enums.h:125
    -
    +Go to the documentation of this file.
    1 Please see <http://wiibrew.org/wiki/Wiimote#IR_Camera> for the complete capabilities of the Wii camera. The IR camera code was written based on the above website and with support from Kristian Lauszus.
    2 
    3 This library is large, if you run into memory problems when uploading to the Arduino, disable serial debugging.
    4 
    5 To enable the IR camera code, simply set ```ENABLE_WII_IR_CAMERA``` to 1 in [settings.h](settings.h).
    6 
    7 This library implements the following settings:
    8 
    9 * Report sensitivity mode: 00 00 00 00 00 00 90 00 41 40 00 Suggested by inio (high sensitivity)
    10 * Data Format: Extended mode (0x03). Full mode is not working yet. The output reports 0x3e and 0x3f need tampering with
    11  * In this mode the camera outputs x and y coordinates and a size dimension for the 4 brightest points.
    12 
    13 Again, read through <http://wiibrew.org/wiki/Wiimote#IR_Camera> to get an understanding of the camera and its settings.
    diff --git a/_x_b_o_x_o_l_d_8cpp.html b/_x_b_o_x_o_l_d_8cpp.html index b495ff16..fffb6942 100644 --- a/_x_b_o_x_o_l_d_8cpp.html +++ b/_x_b_o_x_o_l_d_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXOLD.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -87,13 +88,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXOLD.cpp File Reference
    -
    #include "XBOXOLD.h"
    +
    #include "XBOXOLD.h"
    Include dependency graph for XBOXOLD.cpp:
    - + + + + + +

    Go to the source code of this file.

    @@ -113,29 +119,7 @@ Variables
    -Initial value:
    = {
    -
    0x01,
    -
    0x08,
    -
    0x02,
    -
    0x04,
    -
    -
    0x20,
    -
    0x10,
    -
    0x40,
    -
    0x80,
    -
    -
    -
    4,
    -
    5,
    -
    6,
    -
    7,
    -
    -
    1,
    -
    0,
    -
    2,
    -
    3,
    -
    }
    -

    Buttons on the controllers

    +Initial value:
    = {
    0x01,
    0x08,
    0x02,
    0x04,
    0x20,
    0x10,
    0x40,
    0x80,
    4,
    5,
    6,
    7,
    1,
    0,
    2,
    3,
    }

    Buttons on the controllers

    Definition at line 24 of file XBOXOLD.cpp.

    @@ -146,7 +130,7 @@ Variables diff --git a/_x_b_o_x_o_l_d_8cpp__incl.map b/_x_b_o_x_o_l_d_8cpp__incl.map index 388f26c8..cc79d3e0 100644 --- a/_x_b_o_x_o_l_d_8cpp__incl.map +++ b/_x_b_o_x_o_l_d_8cpp__incl.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/_x_b_o_x_o_l_d_8cpp__incl.md5 b/_x_b_o_x_o_l_d_8cpp__incl.md5 index 2c058871..4e66fc26 100644 --- a/_x_b_o_x_o_l_d_8cpp__incl.md5 +++ b/_x_b_o_x_o_l_d_8cpp__incl.md5 @@ -1 +1 @@ -1e06a0f3d0d0fe8ad8419d72a053f465 \ No newline at end of file +6e170bd84842a4541b9931c43ed0f42c \ No newline at end of file diff --git a/_x_b_o_x_o_l_d_8cpp__incl.png b/_x_b_o_x_o_l_d_8cpp__incl.png index efd10041c4e013e8f519a57b1f546838b0e6ef1e..a81a928432848dc752c9e1462804d890baa88d61 100644 GIT binary patch literal 14722 zcmch8byQSQxGyLIDh-kYNQcyrLn|#Hjf6DPEggb1LyClScOwc2(nBLiBMl=Vh;-N6 z<9lztd+%F!z5m{Fv1A=)&OT@FZ-3wSiw##(k;i>N`2Yo{bmwBe;m9ewnZJ?!ni?ug0#PcWpUC^Jr$Bu>X z#EV`!rYf;5M>d}{u0=|es#@CUk*qw$6`Qq)sf`MWshJ_l55IKp=(-Xbn zU3?m5Im^)0uY6sn*FO6`!l(1T!=61WgDs~SzIbuao~PJ!O$mEnW8V>&d9%6@NFB++ zg9-A46d@r5EkCX2Oc%d-6GU|vMTC<7*c{C#q@o&hCr2pm^B3_EZ31{PB0zKligfsZZH##>kV#h7Hx9- z9Yn!r$?AS?X=P=8xcd9tLrwo{j)S7Q;OhPZR zqoV`8wY7C~_RABwSjc@(&r>-+#SmSI;4GJ+Y)RVRzkkC#{-l`A)tdJ@UthQnr3ZCP-L~F5*(fz_?a+Xm!|cAnLAzfpvJn=1)~hvjbzKK*gZq;@ z#w%dz8Ut=6h=_@6&AK1V{QNmNmkl0ye4Ln=S-CxiN{D36^Y1)7S32Ab5ka`OxA!hQ z97`^mJdjR0Y&qSjb#yki9(iox$Zy?D`-0uP+N z?PG###jM*4%|a)Ceg>zckmFGBVi^1F-z(549bOAbc^JHe#KyrvfLql1oxkBQZiUoY zeh+GEYa4h=Vb03IA@k-9Z)aE6qd9Kl)@bn5({s09rj5GR20wnO&mY{!74X_KiE;n4 z*g~aKZPY#c#je(Fn(Nob#*-xDCb#>q8XUX96S&;oT>IpUen}!W!;607`q{Y6zoxb} zFf%iAOgu)v#rIThcd=!(Sd|usN)QJNp9XPte)wpuySsbu;GoPiqqvwQGAas;x4nekxpD0zq}WI`L8^LYT*EwbA#KtKMNQ?9r2#Cg%rhGoNjU z|1LBadjxoTdLp{JS1yjXBOT)7tRyJ#;?_lE>_JpL-xcdUOLXypo3{(Wo2y-!=?IBZ7kXH?}4a$ zYdv=K-F9XliTj>t+53WN+@CfMFkNVJ*Zt-NMO!oG2g~5LHF00*BbT=QLu~B!Gy%IB z??X#je7Rzk%o?9#+q26{WP+*$h}|OOwuU=?k%zrJSojX)zKN4lHF;{FmL-S9$0hKGKCXD$^lI{+nEcZZchE7_7|9=fQz^ z`ryF>0&?;`kpCiWlp%Kl(Ig}!W|}>#OIM*3G^*GVOX$3*7c7RHKi|_yH{u2ALSq=@ zEA?!*ED*iBJqyj*uGA0clEdU;iKLF?|4)+rm-S+Zu;^r*5@FbMKKY1e*rQZT|80W& z|NhY)^Jr*QFi)t(;0baxpQwAgvy*rJtLD3ih{uK3VR$=1&w{h~+`U3{iQu@?gee0Z z!2zo)T_1erT;F6(cy~)%mk5Ek`E1Smk)1)#EmV#5$0xF`_jH*ri16u>EBYB@Q&O-M z7}iP7LY%w0U@80rmCCp1e69!5noTDztm7r`FXOh#uMQ#K;hmKS~(Eet;{ zC?;mBfg_x~1hz47ws5WE6k5rov#=*zoMr#tAh z+-(p{e0-L_LG*}D{;!CYwYBJgt9${BptJ_Ak9;^(q}?uBA-c)TA7Ss(7L#Vm(WGP-ozBN*V!RfgM(pWGmN?Y& zuYq)TS0K6pR*n$Z35|`gh;FkgX}T9$`LyNuAd5#3GT;zC9F3QuUlG9=LkRTyLPFm6 z&Nt<~r z*@&;^F$C1q-+Q7d@~5E`6cj_fz2R^fdS)WH?qD*fo~30`o`JT4tgP%%N5`{$pFcCT zf38oLsvDMkcUyXUVyKG0P#ebTkVVyhvKUNeo6Oy6L?C2HNk|ZXc6Rg{92a!;_0wjr zwM(n2EYWmrZOe>$3C$i)GOI$Op~;Df2od+Ke?Oqk=4-t?CDUL|fY#~`k#ZXi8F{Zg z>h^GQa!O80(ym^tsNh&fBJ;s;aZU=T0#cZsI!|JsK%cbd*x(hJ9>JG77t0w{yyQio5Hag&UhA%M~#LiC@9Fv z$r;+x(lX}%=+Pr*cXw?{z0xu;(#F1*+Ub7DlLQ4u=QnSp+}*#-A`xa#KR?@KQ&w*7 za8NS`1_!nOR!7Rv2Ub>cYG`T_5)^1$TzO8V8aytdo%1>-HI=5J<}!@rvl@N}4f|;9PXWp!Ha@=2*8tGk)q3rldHMQ2sXyMCBfC8x38(>WN#WbJ z>yuYt|LE9>HbIuu=IR}!+x)L7wXx_dtD$5f7mG;NCr`|&Mchm-Pj_|fFaI|0>Vl%9 z>+LOkxnz+r1_dR}{^uu)3eb>5I?%^Qczb)-3fN8YfE5C>@T$%d_weArEHyP1)y?^F zzMxfI`1I)$ugBWJBSEJ{vGwik!B2H{lYh(0RNmfFZPH+^q}Vvcf*vBCQ@18(@#L%P z#;4~A%+MZNfB4pomzP%!Xw)W}Q_n$-tVO?z$-~0Jvi|EA!pL_=;AA5^VC&!B5vNkx zQC;AriR;bC%=~#cA~{0JsgIzM@YAg}RD>V~oIPC=`5_AsCJ1tUos|yp>Hk$grZ(v| ztVXiB`{EgJ36+8s3dLq-_`O&oJDxN8?RgEAK>OF;ezwHQiHX68xTTn8Pe~zb0}Bi7nXiW& zQJtDV5h)k4lL7+s~xeg`@=iWWnnpU-Wg7Y`wX_nW~JEwzp@TrV}8K>+Pa) za_cG8RN4cN?0jS`;&WmU8bcMATc$VwYU}1u1+n~#G1xn5(c#r7?jDmFp6yM4k_Y$5 zh5pKBh&GVaS)Fz?xl88D$Hl!*bfe*=h#7snK4MRdWsbAk+Dt3znbrN#IQGjXAFg`| zR+uh(-3tin`t#=-HSXJtGV=1y)UoR7_&BxvmZ>lzB0S`rQ-G}5Dh3Yu5BRpTa+r@v zL?KTzqW0}2h2MVn2$;)2Q1+1`5EV6i9H^&d5==wGzxR{HWv%^B0z|hv>M!7SP%Fy> z&}TpI>J0U*F?kj+lrkE%?L35e+)m*7niP&a`mL;-eS^!aycrn!5DPqmULFm(nF>r5 zLLX1AS^O9Ap3ZP@CH%8ogy6(o=^^xDcz#U{j%Ja){N+ijZi`RiK++c67W}CZp|@I6 z_Q7lw;b0PNI#=Ic^F`qNV*2GXZTundRO$u>!|v9INS6;Va&rJHg&Y@rLJA6O_Kw`v z>2b>U?eT}=ByR#87bH;Q^Jg%|hJqrPXkY##|a;*le_3T@}`{g>ch2TRZ zAj>bk^}N45eH)}INgbFa-le?Ym$3ZnbvSsH<@v9L;IX1R3*Zb43}jKHJ6%JmEl{5$ zN#&nz2{Ph52wml5*uX#;&)W;3%`qkdrDPmI?K%wb9h{NZaP$3D5|T$r$nxr*uAZ>N z6^0i?V9KPS{Z4x)J66ui?T_qdc<>e%9gD0#lsp4>BZ$s|-CP~gNSrOpa~QzTxZCEZ zX1)_rgEg?h$!CuJ@ZrHw%08!&SMHfes^!U=`!t@Ei!{S`mO^Nef#^(|N5od^d381-brzuC#6_n zr@8?spZYOLj5o0p=zaJC+#6E`qMDVs(uE&@K)}TbC@Adv%HR|^G~^nCIdJptNZQ8) zd!QyfmVT);gahU!m??J2zd0r`QAzhJFKJa3URYUj3Un*brpYTBIyIyC>rL3Su`!mF zmG7T9p>YBiiuuElwz#V+qRPwfSqo&l-wvDZ(|_WMhC;;7$X-^8gk)r}r10coE&BVS zT@%)-5Cvzr{8@a9{`)t6jhXCcx-!1VcWC(3>-=kUtbOB*`?^$MEPcvMn4(ho`}fY| z#LP!en>{#j2@}+DXld?A7`v_#V0)2^op}?>zRoPcDzdS5Tb-%jApvPcw{cHE8ez^a z9p*Nr3!2=~W>47s0`&`$cy~Jmd}S9GVG&P%+H}E8e#4xCXCOr@DzXCv#ipD-_3(R| zFaq5^{mVp+EHn&2LQIn3LEvwyN8?V z_rdlLmZ86kws#H+5BA=IrxP7}*`r><1S|e;Iu^aLb*Q-!s%oaY%gb(MCHn2cHrz*( zOtJ6{qDRh|M0;El?7IcerKgGmyI@DE%8sGgHl11U3irg!1yxkYL*$gSY}Ed3{*B?f z6#h~c1H&C$>IC)f9=WOJ=G`q@`MLy`r>rCrt^#N?){jeSA4&Svy5^bY9yq*yC%yP0}Ux2yGF0XNBG zKjjQHN+F@4Yvkf0@yyzS47iGrCBMTbdHD=K@kx-FbwRauCqECoIW$2~d_zjDk z1EFE3OOiS6Q@*8IVWOTi=A9u9{3%1qo0+hiGbBxw@yM4FU#gMFm>9LIP`kzXdxp(p z--Wm!!XIL{r(GW>+0v3TCk;5S4H$kqo(iyjoJ#RS)P<2HTOLFkAqB>`u)$#W+8-t*@%~y%LauZ@0RKsIaE0p{1m@-0qTv9D7mdE; z?~5lZE4(>39k;z#nH3X*i-}Kz^J>nDdCklR=DhsiA+~P&!D056-%ysgFF9J>B_Z~F zN|X}*FjDOpxxAb+5)icrh=`tZ--(UzUSi(dntQI!*1ZM>J~fu#!+6O)euTx9mtI|+ zA>&5;L(7gukbwA*{848`{_UGv_7?;8Bq>&syrw4o?4q=aU%y@}XNmnRap-%^3os96 ze}BK6L%6OWT;|TJSFaQbkDU~@{o;_n#}zZg*gAjY8sbnw=nw~+8L(KI7vajxz36Zm%1GxdV9 z`0vKj#4UI9^^LnCgp7Mp?)h^jpHoMx36r5`nzx;Vc@Hyvv}0-8Vt=SPVPN@Eh|&z# z_KYkjA8GMPbbXWXbPsqs#HmuXnFv$K8j{JDm;p3BVWFR zZ52I7WNv!FX(Ut zoie?-I^Wyh4~&b$N0C%zW$d!TalM+CUnl$*#b~M*#UsDiP18SqjOHg{TDN0C6 zT2!LRNW>O9deRb*3~h_jmn?ip<`_7#u@Xu)wDGKFAK44qxI$KT_Rinq#V#wI_X-cP z18yjEsth^+p&Xx@3fC@w$(BS5_%{~SESYD|&@u5K5dia+*l!@?Bmwplaz5VDHUNZW zI6mzZWqOtSt29-~YZ8E~I>6msE>9f9y!M`|pNz`Wt^kg+(d{=8mtj)~n2J?!gO?&k z3mY1jI+@UyyWCf$n#IohtFnD-Z!+i9EdW0T^FCmVrIm~Y*y9;}{Bq0b;`mH57v*KZ z+sz+zS67E4fM!LcK+RFG`p;4uEnqgEfoELwLgE&Re0jTzOPwt@8^*$Icp<*MbbE-2 z@1&xrXeO1bR&A~os_pse=~J{-bT2F{ERB9K-Q+&{eniQ5bad2yCN0EVMpQ^h=eL)GyY0ndxovsv zQuo%DE#|wzqN1rMV`;F9qvs~OZEeQYnA^N^tBro=yeO2Lm6gT8&!2dGG_I<6sja2O zYNVs3#pCPio4H+e>E!Es>Emvr1ZlD#M;H+I)@6qled_UBcW>xlJHTwvJYB-W!#gHI z%O07YNv^+b2y10A9MpCgKWdq7;4-vUgivy8gI4Q(Dx2WB-=mY06ISk9-}>Tj-^2VC zrYKe#I}I92F_5^ua!pK1q7xOR8ZTDWVULT7>N?(@ri)iV%UQ&&JUjFH_3PJTpfK$3 z?~{vq*axqY^I1k~7#?nnR5z$QZmNqcR7J1;MxQF5IJBao;x(V;kjeKn0dr3M z&n6%N9mnc;Runm;rEC`}f>h(Xk?EPz)+T8;RY3s&cuZbJUS81mRK9R;Utc~zmIzu6 zLkg81IAjlQO_rxNH#bj>Xk>eA-MnH>s0Gtk2U;N@2lb+O7eIdJ2uNs4Hnp-iESVa% zJ!$ga6=(@~F~>jZR+{HxnDnzQVei*-iVq1?S)6vX#KpZ^?&gsrPnel80XcD`D?VCs zQhPBmp@l#oSRdJZ(|WEt@~l|prY9zrz|3WW84oTK_UDh^XS)r%0WWMi(x(oqjc-M1 ziQqT@Hx@;Q6PTe-Fvq3~(MmmDW?(D;0vTP1F4`A3VARDhFud9qjjaFo_xgspo~8?O zDpNe9Lr9gpfSm4<(LZhDy*W!5*d1EdhSoZ zRt7IIs=n7uKGeO)pFz-Z95YvEXCB*YKv6e)>~wI8$TRny?egKkLxk^AhWh{5vJXNQ6w% zncaFj-xqJVzh??f=DtM-Ej_uw);$Ip`3MWORM^3x(r860Lx@yhDH6(Fsuf#N5uPGg zX=;Vzx_%_>;&P9aa~4Zg)hbHYDvZEf?Ps}$+8)XG^yU;1()?!EVl-`SjgasLduM8; zkFBwU3{7UUpEDc1_UljXV%JKs6Zax}3-^vbw+<#oM;l;cT*-+CbRqZmeit+BZIx34 z{p4jq@di1MloUts076|u16@Z4>2d$f3Tk1ody8einK~=X zDx;P-3cl7*<)TZCpb%ZkFYw?Ip}6od940YN19__JG2F{#?^#ON*J5YhJoM zleoO_ph1B-Vf&kHLt)<#3Dp|!nx49PWsS`^MnREL4@>sd>!TCw6{!SaWM3bTeOx4S zb?Yp;-E@yBvd8>vs~pK}lR%)Uab6K=z|~OZ3t?hPB8ZB@UChtxuQ63;Wh+HA?-q3~ zED)Oaxbf-Dg^;JGAxsUeAgQTlJUz;9N;Rf`^^3=6-;zX;6}NYH(>Q$_{aLU>Y{o%J z6n>oH5+P#-6P@cA8Cm${z^%_u07$A7anbu+Tqm28Pv(C?3Cyf19b@%JD8dyI!$J0Y zBlvdZU`-kjqk%$8^MOhqKMBJF38XbrVdQs*UPr10gLlj~6dgAzn&<{m^wTQ;M~knW za@vuA<9r{IgH#IVnZ;^N16kfD4YMuXXl5{Xn|3iiXlN8qP+kCsxwImAS!xg_m9JPB z_$R3H<()dOFGDkWq!r9TM5(CMzdRi3&X-r+KXWO4?yEIX+d#IO?olsI$f!Z6kaA? znB@{E`nU)8udfzAJOaBjmRfT!;P#XynNw*^1R~{@cR~{`z!-aZ`cPe8KXlLe5QJ^H z)d&wGvr2ozQdU=!`z`8opEZ1Y)b(x8;nIvm!M#X2j*68*x|D(Tz|6h<-Yyh2f7Ot+ z3O>k>il63YhAc5QK6egGup2v;+ETlRW+eRmJjJ{w`SuX9CWU?#k_rRGnOnh-tXu%9WSNAR*%L{!{pdtL=A?Ia9 z{`!jGVGFcuxOulV5U5OMTUz>-A5vJrgv`x7LfhL^hd&R7GJ+KLs)0sto&rnlP|ZN9 z6C3CqS;?u4md|%6u+YT(tiQsMQz zs1p;*sPWuYPE67^op0of?C=i9FE$-Y`Q8}NMgWJiz+yk}Gf@(UGZ~kG{S@^_UA@>N zwI8e=6y%pbKV1pOi+0`_Z~=a(wDhBmKfW2SEpd2U92H`fUbDxHCnK%&d;`?AxG5plF#PSLXu3&Xv?pkIr5x^0^eeq1~JOD?7cw7Ooj1|k(9oGRO(MwY&pWMs6h$|2|d@Hv~_b`X9PRvp+4!S zbvkH#at32h@rlsj($ZZpfqlcnLKb3}>U`TD-3^QSUcUjYpP=AYLN1W0e0=b@j9bl{ z+7%KCPG0qG91@Ukn&!gu*Q2}A>=(rdZ%+dbfgb<^&6ZZ;b1k9Cp`{N;Hu=XM*K<%I zkS7j-{nJZ#V5P_UVeY(y_1{K;FEPte6i6u zP(Y!Kek!B_6Z7bQQPV%`c9#=W<=VTt^j!FK*^^9rV~y2~9I1&_h!6AEqPrdf)(;p2 z1hmCsJdk1JD=V!ToIDP;KnX?mv_vfVzY6P)!s__>lSYh2?d3~2&;bm>>+HDnLX52gY?ylcB@!Y|cw{NqJg;Su=zhuWdBNg9C?;3gs> zZ9@+ZY{Bj{?;SS*)jcqf#@VADDU#?T=r9|yyleu4!IrzpjAeX$n(`|C8Y2OU1CE-9 z0I30l-(i*gwn!_ktZm-Cfm+l92gIziv-4BXb^_x|5o@yx5;F{+77x${jbFdg2?~1Wy5)lt|z{S=n3Z^7+E&f91tt*hB&ZU)b9Vejupluu?(IFaX053M@v; zi!Hu;hlgElx7SXx=L1PkTu%QQ0#SPf{EG60X)J6{RdxZVjLX%T%Y2jjLn1iFZp&%b zRJ|Q{H@W#S*Pu$KNN5xpw-lGoTjuiZ4LMl58^4bmeY(K5WYb^AH!VJIJ0;G4y;q-$ z0GQXjCwg?798H;n^oh~Oq$DWdT?!BMf!bgROedP(RFsr7*>#SW{xh1NY6P~YRN%#0 zbyrZp9_;H=`_}5Qlcuo%Oi;>z5i#0WTdM`EOy=xMvQr??PV^M-xQ@$8-?T-jl(}am z^0Bke*cTThD7*$}WyxMX`r_=0`eS}R13Npr*58i_3BjN<@7@M6usJy#co)kVysF#p zv3sVbrixY^AGr*rmRjF}vCwJau!Mw!BDw>Neb(34^8lL?IqeSoet>eI7ZWpZ>0d!2 zgMsq8Jy9F?La*0R-xcX~|9}q$T*k8gBYV>UnD?EzhDX&- z3r&Suj=;oraL{IzIWnkebONQPzXR?h@9!@$Rb?2(rdh-~AQwjy11DyofAZv^Mkz@g ztz?+;$*INz;KS-0zPZ%+>6Fto_+TT%VwahaM^)Y_P^i;N5giYXdM z5|zU#Hs$5(CU|gv72Ls4*{2po~u^En$2g07luO- zG&7^y*wkbO3=t7gQRAgMz{HW`d-^w#yaGE8x*-3!<@!WozA-+W)<4B=DCJ1dW^CHo znSdVZ5~Mx{hrCndZS3|V{P~f7?PfRGE98jeF562bAu<8{ zhSZH1btNKN+Bm?+%(wWGp*)ptZv3EWbwc|%PE)%0OPbt%C9d8h5hXIyuGlM^)4Z-ny^rYJ6?3po4s_g18V z=6??$e1mYAp~S_g@{>Olk#$zzSwQ3e)!Dg5)+FbcgXcxW*KtvoqfNrdqa!TKy2!UX zzYtr=GK?YQS&ML>OQ(%SZ;ULBeJZw@5X+YmlDiLOY9S5>{iKN79$)$;gx~NnT~V>S zH-BXQI?#(lHaEEm36=x1 z{UhZ86#}L(EdrAX4{dXQ_sgC4{x(_I^*Hla^5NAsVt0i(v@f=h)mjY7a2Q^QU<6^_ z3K5Mx#=Yq|zi46*n-8xWOq!pkPfXO}FU?&C3()xv-43PLNQbXNz4i`K&r>3IUAi@1 zEbf1Eo|bDis8#e{jPbQIpTXcQswb{5pe@~{Yb7SIIvwYqciT!ZSmIlb#D z=A{;anpxY4hhSzS^f4)f`JI;f3jvVPCxGCpIiI(EfR&7e3Z@4IrIjjSNxIAU-0ZA#d+%c_#; zMd$p;Ql`4O+YEZ!1MTPt_MFe0#e9w*Y=|&Q9huc2P=R5BBPY4t2Z{}7h2pJ%Im>?D z3nziup{u;QzBf*CIREEQxGb;kD)2@9Gq+ga7tW!K1{Mxp^;Q5iqZPN$% z7Q5mZ9s&vp0pKTp+B4$t;9$;+(_NE^!AJ3ZyvfozdQA}mc0V{a(tvxzWUQdt<<_6> z&K)rveNP*kM>JwyW+&z_fTxtx>xolSy=OjI(7$Muu88f}$k?8I0{Qzl7A1<|7z%*; zXA+(2uEX(tOg8OKFbf{w8givY%}27L!m21iP^hSQU`i%HG13a7_?hHV*E|prWX_i! z5L8DJwQYARw^h98!BxU3p7d4Q!oD!rfTt4^n=P{GR zcv8~j+?<>Vj{zJbCAXaJ9|tbOcy|KUK?D4=Cu{NWb>|K9!+zbuEZ@VN{J zQ1Nbq8i>OEeoZ`saXXxt!t1Q2anv0!AfSf{A?0kOl98=*Bh=_Bft&xx*;rm*j}Z6u zw{tV3Cu|s``@vxta`n9gE)CRUAgnVoWdgy^Nz2gS#iBIoTiK&JPiTMx2hesaL#b4_ zRl(4(bfH6K3A04Y-}Ev9`7E)3HeU`U)292@YF00>BTuI%7Mu540HNs~8a9Rii|m)n2J4kbJZe7xT4;OX0@Qa)PyKJjsYb-f z&_tUrgbx8Y8cItF0k*c9Hx?Wqnj&n8^0Qn38w!pe_{%B|I03$}U~HDEAYh{`FYmzT zPz&&^h_9|f=sAloCgtN4_clj0GhlR5)+G%_aOC_~j%f1zM`mX9HKtvSKDFR%gy`e= zzV~S&>CE$VGI#SAkU;x*cyW3QxjeZJ+p^WmEXe)SpYX|NZnnYc{;OBV!Z9OQckYS< z@-5d@4CFiD`@%%~vlKuf>UmSfny=S{JsLMU3`-O8LUgr*KA`8d{@lt0%*LhuCCHW4=O5jFqwN- zhv*``C}WyITUPl2O_UaUxB_EOnRfWUn*^bofId^l2&-)Bup$~OP=CIstCmqm%VC#}FnZn*7tgE(%unN2VRplMo*u1} zGPI}Rc&!8vZt+HXOw&%W=^ag!MNO1Oflo zbt*FJVX0QpfyTX(mS_5|MeRs*KxL)~lvfY$?982t4rh;Oq~o0V(Rhi`0LRAWcro=< zHLaa`c^6?PQv!}~^&^@^BHxpt_8L>FcHjUWR#VII`P$bc{sedofSD?+yu3wahlDhF z<@ywVV$LX?gWP;`UYKBXlo0R+THcbO1bJD{iLuZC7(n^OQuu${q2a{Qek_~k=AV$? zSE2!ZPOZ5+?M=(;eoxjX<#)^ltiZi#(WDz39e~Jz^1p$DNcpCV1avRn_k%kDFDi|( z9~2XCL*`dec-Af1xi3h zOm_+Rja?3YJtrX{F( z+j6L`sKCg+^>jt`;ouQR3zf)1LPJs1g5qU(NC@i<5cchWZfk8n-Mg`SuaugaT3uaz z^hd)}?9t9;c>arY!L!4Wi$l+w^Nnn9!bJoDZxxTh z`6xg{@VS+QyvOAAT1^r66$D3JA~lOuK*hjdVq!x12T)fU7JZazjSUPSRmN>Vk<=i@ zHWp6&uj+AyhOqk%Q73h<>MuSZ$ihTKR*i2j$Q&0d^lk=9BOvDfX?t?r7hCIJq)z1Ca+1sM5dh6d)I1XnI81`z*pEZCab~K`6+6RiiK8@UZ~e zzzbLuzv2ZGMCI&*(2~;1iO&xqxc;w}=gR=k_D?B|@ka=7s1ohDtcpyPlu6M40Ltl< AwR%z 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 - + USB Host Shield 2.0: XBOXOLD.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,344 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXOLD.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #include "XBOXOLD.h"
    -
    19 // To enable serial debugging see "settings.h"
    -
    20 //#define EXTRADEBUG // Uncomment to get even more debugging data
    -
    21 //#define PRINTREPORT // Uncomment to print the report send by the Xbox controller
    -
    22 
    -
    24 const uint8_t XBOXOLD_BUTTONS[] PROGMEM = {
    -
    25  0x01, // UP
    -
    26  0x08, // RIGHT
    -
    27  0x02, // DOWN
    -
    28  0x04, // LEFT
    -
    29 
    -
    30  0x20, // BACK
    -
    31  0x10, // START
    -
    32  0x40, // L3
    -
    33  0x80, // R3
    -
    34 
    -
    35  // A, B, X, Y, BLACK, WHITE, L1, and R1 are analog buttons
    -
    36  4, // BLACK
    -
    37  5, // WHTIE
    -
    38  6, // L1
    -
    39  7, // R1
    -
    40 
    -
    41  1, // B
    -
    42  0, // A
    -
    43  2, // X
    -
    44  3, // Y
    -
    45 };
    -
    46 
    - -
    48 pUsb(p), // pointer to USB class instance - mandatory
    -
    49 bAddress(0), // device address - mandatory
    -
    50 bPollEnable(false) { // don't start polling before dongle is connected
    -
    51  for(uint8_t i = 0; i < XBOX_MAX_ENDPOINTS; i++) {
    -
    52  epInfo[i].epAddr = 0;
    -
    53  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    54  epInfo[i].bmSndToggle = 0;
    -
    55  epInfo[i].bmRcvToggle = 0;
    - -
    57  }
    -
    58 
    -
    59  if(pUsb) // register in USB subsystem
    -
    60  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    -
    61 }
    -
    62 
    -
    63 uint8_t XBOXOLD::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    64  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    -
    65  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    66  uint8_t rcode;
    -
    67  UsbDevice *p = NULL;
    -
    68  EpInfo *oldep_ptr = NULL;
    -
    69  uint16_t PID;
    -
    70  uint16_t VID;
    -
    71 
    -
    72  // get memory address of USB device address pool
    -
    73  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    74 #ifdef EXTRADEBUG
    -
    75  Notify(PSTR("\r\nXBOXUSB Init"), 0x80);
    -
    76 #endif
    -
    77  // check if address has already been assigned to an instance
    -
    78  if(bAddress) {
    -
    79 #ifdef DEBUG_USB_HOST
    -
    80  Notify(PSTR("\r\nAddress in use"), 0x80);
    -
    81 #endif
    - -
    83  }
    -
    84 
    -
    85  // Get pointer to pseudo device with address 0 assigned
    -
    86  p = addrPool.GetUsbDevicePtr(0);
    -
    87 
    -
    88  if(!p) {
    -
    89 #ifdef DEBUG_USB_HOST
    -
    90  Notify(PSTR("\r\nAddress not found"), 0x80);
    -
    91 #endif
    - -
    93  }
    -
    94 
    -
    95  if(!p->epinfo) {
    -
    96 #ifdef DEBUG_USB_HOST
    -
    97  Notify(PSTR("\r\nepinfo is null"), 0x80);
    -
    98 #endif
    - -
    100  }
    -
    101 
    -
    102  // Save old pointer to EP_RECORD of address 0
    -
    103  oldep_ptr = p->epinfo;
    -
    104 
    -
    105  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    106  p->epinfo = epInfo;
    -
    107 
    -
    108  p->lowspeed = lowspeed;
    -
    109 
    -
    110  // Get device descriptor
    -
    111  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    -
    112  // Restore p->epinfo
    -
    113  p->epinfo = oldep_ptr;
    -
    114 
    -
    115  if(rcode)
    -
    116  goto FailGetDevDescr;
    -
    117 
    -
    118  VID = udd->idVendor;
    -
    119  PID = udd->idProduct;
    -
    120 
    -
    121  if((VID != XBOX_VID && VID != MADCATZ_VID && VID != JOYTECH_VID) || (PID != XBOX_OLD_PID1 && PID != XBOX_OLD_PID2 && PID != XBOX_OLD_PID3 && PID != XBOX_OLD_PID4)) // Check if VID and PID match
    -
    122  goto FailUnknownDevice;
    -
    123 
    -
    124  // Allocate new address according to device class
    -
    125  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    126 
    -
    127  if(!bAddress)
    - -
    129 
    -
    130  // Extract Max Packet Size from device descriptor
    -
    131  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    -
    132 
    -
    133  // Assign new address to the device
    -
    134  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    135  if(rcode) {
    -
    136  p->lowspeed = false;
    -
    137  addrPool.FreeAddress(bAddress);
    -
    138  bAddress = 0;
    -
    139 #ifdef DEBUG_USB_HOST
    -
    140  Notify(PSTR("\r\nsetAddr: "), 0x80);
    -
    141  D_PrintHex<uint8_t > (rcode, 0x80);
    -
    142 #endif
    -
    143  return rcode;
    -
    144  }
    -
    145 #ifdef EXTRADEBUG
    -
    146  Notify(PSTR("\r\nAddr: "), 0x80);
    -
    147  D_PrintHex<uint8_t > (bAddress, 0x80);
    -
    148 #endif
    -
    149  //delay(300); // Spec says you should wait at least 200ms
    -
    150 
    -
    151  p->lowspeed = false;
    -
    152 
    -
    153  //get pointer to assigned address record
    -
    154  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    155  if(!p)
    - -
    157 
    -
    158  p->lowspeed = lowspeed;
    -
    159 
    -
    160  // Assign epInfo to epinfo pointer - only EP0 is known
    -
    161  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    162  if(rcode)
    -
    163  goto FailSetDevTblEntry;
    -
    164 
    -
    165  /* The application will work in reduced host mode, so we can save program and data
    -
    166  memory space. After verifying the VID we will use known values for the
    -
    167  configuration values for device, interface, endpoints and HID for the XBOX controllers */
    -
    168 
    -
    169  /* Initialize data structures for endpoints of device */
    -
    170  epInfo[ XBOX_INPUT_PIPE ].epAddr = 0x01; // XBOX report endpoint
    - -
    172  epInfo[ XBOX_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    176  epInfo[ XBOX_OUTPUT_PIPE ].epAddr = 0x02; // XBOX output endpoint
    - -
    178  epInfo[ XBOX_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    182 
    -
    183  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
    -
    184  if(rcode)
    -
    185  goto FailSetDevTblEntry;
    -
    186 
    -
    187  delay(200); // Give time for address change
    -
    188 
    -
    189  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_CONTROL_PIPE ].epAddr, 1);
    -
    190  if(rcode)
    -
    191  goto FailSetConfDescr;
    -
    192 
    -
    193 #ifdef DEBUG_USB_HOST
    -
    194  Notify(PSTR("\r\nXbox Controller Connected\r\n"), 0x80);
    -
    195 #endif
    -
    196  if(pFuncOnInit)
    -
    197  pFuncOnInit(); // Call the user function
    -
    198  XboxConnected = true;
    -
    199  bPollEnable = true;
    -
    200  return 0; // Successful configuration
    -
    201 
    -
    202  /* Diagnostic messages */
    -
    203 FailGetDevDescr:
    -
    204 #ifdef DEBUG_USB_HOST
    - -
    206  goto Fail;
    -
    207 #endif
    -
    208 
    -
    209 FailSetDevTblEntry:
    -
    210 #ifdef DEBUG_USB_HOST
    - -
    212  goto Fail;
    -
    213 #endif
    -
    214 
    -
    215 FailSetConfDescr:
    -
    216 #ifdef DEBUG_USB_HOST
    - -
    218 #endif
    -
    219  goto Fail;
    -
    220 
    -
    221 FailUnknownDevice:
    -
    222 #ifdef DEBUG_USB_HOST
    -
    223  NotifyFailUnknownDevice(VID, PID);
    -
    224 #endif
    - -
    226 
    -
    227 Fail:
    -
    228 #ifdef DEBUG_USB_HOST
    -
    229  Notify(PSTR("\r\nXbox Init Failed, error code: "), 0x80);
    -
    230  NotifyFail(rcode);
    -
    231 #endif
    -
    232  Release();
    -
    233  return rcode;
    -
    234 }
    -
    235 
    -
    236 /* Performs a cleanup after failed Init() attempt */
    -
    237 uint8_t XBOXOLD::Release() {
    -
    238  XboxConnected = false;
    - -
    240  bAddress = 0;
    -
    241  bPollEnable = false;
    -
    242  return 0;
    -
    243 }
    -
    244 
    -
    245 uint8_t XBOXOLD::Poll() {
    -
    246  if(!bPollEnable)
    -
    247  return 0;
    -
    248  uint16_t BUFFER_SIZE = EP_MAXPKTSIZE;
    -
    249  pUsb->inTransfer(bAddress, epInfo[ XBOX_INPUT_PIPE ].epAddr, &BUFFER_SIZE, readBuf); // input on endpoint 1
    -
    250  readReport();
    -
    251 #ifdef PRINTREPORT
    -
    252  printReport(BUFFER_SIZE); // Uncomment "#define PRINTREPORT" to print the report send by the Xbox controller
    -
    253 #endif
    -
    254  return 0;
    -
    255 }
    -
    256 
    -
    257 void XBOXOLD::readReport() {
    -
    258  ButtonState = readBuf[2];
    -
    259 
    -
    260  for(uint8_t i = 0; i < sizeof (buttonValues); i++)
    -
    261  buttonValues[i] = readBuf[i + 4]; // A, B, X, Y, BLACK, WHITE, L1, and R1
    -
    262 
    -
    263  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[12] << 8) | readBuf[13]);
    -
    264  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[14] << 8) | readBuf[15]);
    -
    265  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[16] << 8) | readBuf[17]);
    -
    266  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[18] << 8) | readBuf[19]);
    -
    267 
    -
    268  //Notify(PSTR("\r\nButtonState"), 0x80);
    -
    269  //PrintHex<uint8_t>(ButtonState, 0x80);
    -
    270 
    -
    271  if(ButtonState != OldButtonState || memcmp(buttonValues, oldButtonValues, sizeof (buttonValues)) != 0) {
    -
    272  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    -
    273  OldButtonState = ButtonState;
    -
    274 
    -
    275  for(uint8_t i = 0; i < sizeof (buttonValues); i++) {
    -
    276  if(oldButtonValues[i] == 0 && buttonValues[i] != 0)
    -
    277  buttonClicked[i] = true; // Update A, B, X, Y, BLACK, WHITE, L1, and R1 click state
    -
    278  oldButtonValues[i] = buttonValues[i];
    -
    279  }
    -
    280  }
    -
    281 }
    -
    282 
    -
    283 void XBOXOLD::printReport(uint16_t length __attribute__((unused))) { //Uncomment "#define PRINTREPORT" to print the report send by the Xbox controller
    -
    284 #ifdef PRINTREPORT
    -
    285  if(readBuf == NULL)
    -
    286  return;
    -
    287  for(uint8_t i = 0; i < length; i++) {
    -
    288  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    -
    289  Notify(PSTR(" "), 0x80);
    -
    290  }
    -
    291  Notify(PSTR("\r\n"), 0x80);
    -
    292 #endif
    -
    293 }
    -
    294 
    - -
    296  uint8_t button = pgm_read_byte(&XBOXOLD_BUTTONS[(uint8_t)b]);
    -
    297  if(b == A || b == B || b == X || b == Y || b == BLACK || b == WHITE || b == L1 || b == R1) // A, B, X, Y, BLACK, WHITE, L1, and R1 are analog buttons
    -
    298  return buttonValues[button]; // Analog buttons
    -
    299  return (ButtonState & button); // Digital buttons
    -
    300 }
    -
    301 
    - -
    303  uint8_t button = pgm_read_byte(&XBOXOLD_BUTTONS[(uint8_t)b]);
    -
    304  if(b == A || b == B || b == X || b == Y || b == BLACK || b == WHITE || b == L1 || b == R1) { // A, B, X, Y, BLACK, WHITE, L1, and R1 are analog buttons
    -
    305  if(buttonClicked[button]) {
    -
    306  buttonClicked[button] = false;
    -
    307  return true;
    -
    308  }
    -
    309  return false;
    -
    310  }
    -
    311 
    -
    312  bool click = (ButtonClickState & button);
    -
    313  ButtonClickState &= ~button; // clear "click" event
    -
    314  return click;
    -
    315 }
    -
    316 
    - -
    318  return hatValue[a];
    -
    319 }
    -
    320 
    -
    321 /* Xbox Controller commands */
    -
    322 void XBOXOLD::XboxCommand(uint8_t* data, uint16_t nbytes) {
    -
    323  //bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x00), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
    -
    324  pUsb->ctrlReq(bAddress, epInfo[XBOX_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    -
    325 }
    -
    326 
    -
    327 void XBOXOLD::setRumbleOn(uint8_t lValue, uint8_t rValue) {
    -
    328  uint8_t writeBuf[6];
    -
    329 
    -
    330  writeBuf[0] = 0x00;
    -
    331  writeBuf[1] = 0x06;
    -
    332  writeBuf[2] = 0x00;
    -
    333  writeBuf[3] = rValue; // small weight
    -
    334  writeBuf[4] = 0x00;
    -
    335  writeBuf[5] = lValue; // big weight
    -
    336 
    -
    337  XboxCommand(writeBuf, 6);
    -
    338 }
    - +Go to the documentation of this file.
    1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #include "XBOXOLD.h"
    19 // To enable serial debugging see "settings.h"
    20 //#define EXTRADEBUG // Uncomment to get even more debugging data
    21 //#define PRINTREPORT // Uncomment to print the report send by the Xbox controller
    22 
    24 const uint8_t XBOXOLD_BUTTONS[] PROGMEM = {
    25  0x01, // UP
    26  0x08, // RIGHT
    27  0x02, // DOWN
    28  0x04, // LEFT
    29 
    30  0x20, // BACK
    31  0x10, // START
    32  0x40, // L3
    33  0x80, // R3
    34 
    35  // A, B, X, Y, BLACK, WHITE, L1, and R1 are analog buttons
    36  4, // BLACK
    37  5, // WHTIE
    38  6, // L1
    39  7, // R1
    40 
    41  1, // B
    42  0, // A
    43  2, // X
    44  3, // Y
    45 };
    46 
    48 pUsb(p), // pointer to USB class instance - mandatory
    49 bAddress(0), // device address - mandatory
    50 bPollEnable(false) { // don't start polling before dongle is connected
    51  for(uint8_t i = 0; i < XBOX_MAX_ENDPOINTS; i++) {
    52  epInfo[i].epAddr = 0;
    53  epInfo[i].maxPktSize = (i) ? 0 : 8;
    54  epInfo[i].bmSndToggle = 0;
    55  epInfo[i].bmRcvToggle = 0;
    57  }
    58 
    59  if(pUsb) // register in USB subsystem
    60  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    61 }
    62 
    63 uint8_t XBOXOLD::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    64  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    65  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    66  uint8_t rcode;
    67  UsbDevice *p = NULL;
    68  EpInfo *oldep_ptr = NULL;
    69  uint16_t PID;
    70  uint16_t VID;
    71 
    72  // get memory address of USB device address pool
    73  AddressPool &addrPool = pUsb->GetAddressPool();
    74 #ifdef EXTRADEBUG
    75  Notify(PSTR("\r\nXBOXUSB Init"), 0x80);
    76 #endif
    77  // check if address has already been assigned to an instance
    78  if(bAddress) {
    79 #ifdef DEBUG_USB_HOST
    80  Notify(PSTR("\r\nAddress in use"), 0x80);
    81 #endif
    83  }
    84 
    85  // Get pointer to pseudo device with address 0 assigned
    86  p = addrPool.GetUsbDevicePtr(0);
    87 
    88  if(!p) {
    89 #ifdef DEBUG_USB_HOST
    90  Notify(PSTR("\r\nAddress not found"), 0x80);
    91 #endif
    93  }
    94 
    95  if(!p->epinfo) {
    96 #ifdef DEBUG_USB_HOST
    97  Notify(PSTR("\r\nepinfo is null"), 0x80);
    98 #endif
    100  }
    101 
    102  // Save old pointer to EP_RECORD of address 0
    103  oldep_ptr = p->epinfo;
    104 
    105  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    106  p->epinfo = epInfo;
    107 
    108  p->lowspeed = lowspeed;
    109 
    110  // Get device descriptor
    111  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    112  // Restore p->epinfo
    113  p->epinfo = oldep_ptr;
    114 
    115  if(rcode)
    116  goto FailGetDevDescr;
    117 
    118  VID = udd->idVendor;
    119  PID = udd->idProduct;
    120 
    121  if((VID != XBOX_VID && VID != MADCATZ_VID && VID != JOYTECH_VID) || (PID != XBOX_OLD_PID1 && PID != XBOX_OLD_PID2 && PID != XBOX_OLD_PID3 && PID != XBOX_OLD_PID4)) // Check if VID and PID match
    122  goto FailUnknownDevice;
    123 
    124  // Allocate new address according to device class
    125  bAddress = addrPool.AllocAddress(parent, false, port);
    126 
    127  if(!bAddress)
    129 
    130  // Extract Max Packet Size from device descriptor
    131  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    132 
    133  // Assign new address to the device
    134  rcode = pUsb->setAddr(0, 0, bAddress);
    135  if(rcode) {
    136  p->lowspeed = false;
    137  addrPool.FreeAddress(bAddress);
    138  bAddress = 0;
    139 #ifdef DEBUG_USB_HOST
    140  Notify(PSTR("\r\nsetAddr: "), 0x80);
    141  D_PrintHex<uint8_t > (rcode, 0x80);
    142 #endif
    143  return rcode;
    144  }
    145 #ifdef EXTRADEBUG
    146  Notify(PSTR("\r\nAddr: "), 0x80);
    147  D_PrintHex<uint8_t > (bAddress, 0x80);
    148 #endif
    149  //delay(300); // Spec says you should wait at least 200ms
    150 
    151  p->lowspeed = false;
    152 
    153  //get pointer to assigned address record
    154  p = addrPool.GetUsbDevicePtr(bAddress);
    155  if(!p)
    157 
    158  p->lowspeed = lowspeed;
    159 
    160  // Assign epInfo to epinfo pointer - only EP0 is known
    161  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    162  if(rcode)
    163  goto FailSetDevTblEntry;
    164 
    165  /* The application will work in reduced host mode, so we can save program and data
    166  memory space. After verifying the VID we will use known values for the
    167  configuration values for device, interface, endpoints and HID for the XBOX controllers */
    168 
    169  /* Initialize data structures for endpoints of device */
    170  epInfo[ XBOX_INPUT_PIPE ].epAddr = 0x01; // XBOX report endpoint
    172  epInfo[ XBOX_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    176  epInfo[ XBOX_OUTPUT_PIPE ].epAddr = 0x02; // XBOX output endpoint
    178  epInfo[ XBOX_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    182 
    183  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
    184  if(rcode)
    185  goto FailSetDevTblEntry;
    186 
    187  delay(200); // Give time for address change
    188 
    189  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_CONTROL_PIPE ].epAddr, 1);
    190  if(rcode)
    191  goto FailSetConfDescr;
    192 
    193 #ifdef DEBUG_USB_HOST
    194  Notify(PSTR("\r\nXbox Controller Connected\r\n"), 0x80);
    195 #endif
    196  if(pFuncOnInit)
    197  pFuncOnInit(); // Call the user function
    198  XboxConnected = true;
    199  bPollEnable = true;
    200  return 0; // Successful configuration
    201 
    202  /* Diagnostic messages */
    203 FailGetDevDescr:
    204 #ifdef DEBUG_USB_HOST
    206  goto Fail;
    207 #endif
    208 
    209 FailSetDevTblEntry:
    210 #ifdef DEBUG_USB_HOST
    212  goto Fail;
    213 #endif
    214 
    215 FailSetConfDescr:
    216 #ifdef DEBUG_USB_HOST
    218 #endif
    219  goto Fail;
    220 
    221 FailUnknownDevice:
    222 #ifdef DEBUG_USB_HOST
    223  NotifyFailUnknownDevice(VID, PID);
    224 #endif
    226 
    227 Fail:
    228 #ifdef DEBUG_USB_HOST
    229  Notify(PSTR("\r\nXbox Init Failed, error code: "), 0x80);
    230  NotifyFail(rcode);
    231 #endif
    232  Release();
    233  return rcode;
    234 }
    235 
    236 /* Performs a cleanup after failed Init() attempt */
    237 uint8_t XBOXOLD::Release() {
    238  XboxConnected = false;
    240  bAddress = 0;
    241  bPollEnable = false;
    242  return 0;
    243 }
    244 
    245 uint8_t XBOXOLD::Poll() {
    246  if(!bPollEnable)
    247  return 0;
    248  uint16_t BUFFER_SIZE = EP_MAXPKTSIZE;
    249  pUsb->inTransfer(bAddress, epInfo[ XBOX_INPUT_PIPE ].epAddr, &BUFFER_SIZE, readBuf); // input on endpoint 1
    250  readReport();
    251 #ifdef PRINTREPORT
    252  printReport(BUFFER_SIZE); // Uncomment "#define PRINTREPORT" to print the report send by the Xbox controller
    253 #endif
    254  return 0;
    255 }
    256 
    257 void XBOXOLD::readReport() {
    258  ButtonState = readBuf[2];
    259 
    260  for(uint8_t i = 0; i < sizeof (buttonValues); i++)
    261  buttonValues[i] = readBuf[i + 4]; // A, B, X, Y, BLACK, WHITE, L1, and R1
    262 
    263  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[12] << 8) | readBuf[13]);
    264  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[14] << 8) | readBuf[15]);
    265  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[16] << 8) | readBuf[17]);
    266  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[18] << 8) | readBuf[19]);
    267 
    268  //Notify(PSTR("\r\nButtonState"), 0x80);
    269  //PrintHex<uint8_t>(ButtonState, 0x80);
    270 
    271  if(ButtonState != OldButtonState || memcmp(buttonValues, oldButtonValues, sizeof (buttonValues)) != 0) {
    272  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    273  OldButtonState = ButtonState;
    274 
    275  for(uint8_t i = 0; i < sizeof (buttonValues); i++) {
    276  if(oldButtonValues[i] == 0 && buttonValues[i] != 0)
    277  buttonClicked[i] = true; // Update A, B, X, Y, BLACK, WHITE, L1, and R1 click state
    278  oldButtonValues[i] = buttonValues[i];
    279  }
    280  }
    281 }
    282 
    283 void XBOXOLD::printReport(uint16_t length __attribute__((unused))) { //Uncomment "#define PRINTREPORT" to print the report send by the Xbox controller
    284 #ifdef PRINTREPORT
    285  if(readBuf == NULL)
    286  return;
    287  for(uint8_t i = 0; i < length; i++) {
    288  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    289  Notify(PSTR(" "), 0x80);
    290  }
    291  Notify(PSTR("\r\n"), 0x80);
    292 #endif
    293 }
    294 
    296  uint8_t button = pgm_read_byte(&XBOXOLD_BUTTONS[(uint8_t)b]);
    297  if(b == A || b == B || b == X || b == Y || b == BLACK || b == WHITE || b == L1 || b == R1) // A, B, X, Y, BLACK, WHITE, L1, and R1 are analog buttons
    298  return buttonValues[button]; // Analog buttons
    299  return (ButtonState & button); // Digital buttons
    300 }
    301 
    303  uint8_t button = pgm_read_byte(&XBOXOLD_BUTTONS[(uint8_t)b]);
    304  if(b == A || b == B || b == X || b == Y || b == BLACK || b == WHITE || b == L1 || b == R1) { // A, B, X, Y, BLACK, WHITE, L1, and R1 are analog buttons
    305  if(buttonClicked[button]) {
    306  buttonClicked[button] = false;
    307  return true;
    308  }
    309  return false;
    310  }
    311 
    312  bool click = (ButtonClickState & button);
    313  ButtonClickState &= ~button; // clear "click" event
    314  return click;
    315 }
    316 
    318  return hatValue[a];
    319 }
    320 
    321 /* Xbox Controller commands */
    322 void XBOXOLD::XboxCommand(uint8_t* data, uint16_t nbytes) {
    323  //bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x00), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
    324  pUsb->ctrlReq(bAddress, epInfo[XBOX_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    325 }
    326 
    327 void XBOXOLD::setRumbleOn(uint8_t lValue, uint8_t rValue) {
    328  uint8_t writeBuf[6];
    329 
    330  writeBuf[0] = 0x00;
    331  writeBuf[1] = 0x06;
    332  writeBuf[2] = 0x00;
    333  writeBuf[3] = rValue; // small weight
    334  writeBuf[4] = 0x00;
    335  writeBuf[5] = lValue; // big weight
    336 
    337  XboxCommand(writeBuf, 6);
    338 }
    uint8_t bmRcvToggle
    Definition: address.h:48
    @@ -509,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_x_b_o_x_o_l_d_8h.html b/_x_b_o_x_o_l_d_8h.html index 54a03ecb..1bc4c694 100644 --- a/_x_b_o_x_o_l_d_8h.html +++ b/_x_b_o_x_o_l_d_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXOLD.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,22 +89,27 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXOLD.h File Reference
    -
    #include "Usb.h"
    -#include "usbhid.h"
    -#include "controllerEnums.h"
    +
    #include "Usb.h"
    +#include "usbhid.h"
    +#include "controllerEnums.h"
    Include dependency graph for XBOXOLD.h:
    - + + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -314,7 +320,7 @@ Macros diff --git a/_x_b_o_x_o_l_d_8h__dep__incl.md5 b/_x_b_o_x_o_l_d_8h__dep__incl.md5 index 0678f7d2..cc366f2a 100644 --- a/_x_b_o_x_o_l_d_8h__dep__incl.md5 +++ b/_x_b_o_x_o_l_d_8h__dep__incl.md5 @@ -1 +1 @@ -4624e3aee3651b0e57e6bf6ae6dd27ec \ No newline at end of file +82c0a98cce5027def9ffaed26c3bac43 \ No newline at end of file diff --git a/_x_b_o_x_o_l_d_8h__dep__incl.png b/_x_b_o_x_o_l_d_8h__dep__incl.png index 0fd16d4266088a427ffcf1fc76d5fa0b7cd0a949..cfb8c228ed8bf81424e4297ac93bb299580cc288 100644 GIT binary patch literal 2555 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 diff --git a/_x_b_o_x_o_l_d_8h__incl.map b/_x_b_o_x_o_l_d_8h__incl.map index 4f26bc54..b1091a74 100644 --- a/_x_b_o_x_o_l_d_8h__incl.map +++ b/_x_b_o_x_o_l_d_8h__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/_x_b_o_x_o_l_d_8h__incl.md5 b/_x_b_o_x_o_l_d_8h__incl.md5 index 38a1f448..00cfe4cd 100644 --- a/_x_b_o_x_o_l_d_8h__incl.md5 +++ b/_x_b_o_x_o_l_d_8h__incl.md5 @@ -1 +1 @@ -39fa3dc5976d45480763fa92b986dad2 \ No newline at end of file +6f0fa83f2b72b0b7a7795b417af236ee \ No newline at end of file diff --git a/_x_b_o_x_o_l_d_8h__incl.png b/_x_b_o_x_o_l_d_8h__incl.png index ab135e7ca7cd677d82ab51ce3de4b2d039d590fa..7f9c416320c2489da2e346d9bf4c8f01831bf428 100644 GIT binary patch literal 12763 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 UJlGh4lUk5ZVzQzY!k_*B511Sg{r~^~ diff --git a/_x_b_o_x_o_l_d_8h_source.html b/_x_b_o_x_o_l_d_8h_source.html index 9f2fb331..d53195d6 100644 --- a/_x_b_o_x_o_l_d_8h_source.html +++ b/_x_b_o_x_o_l_d_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXOLD.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,115 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXOLD.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _xboxold_h_
    -
    19 #define _xboxold_h_
    -
    20 
    -
    21 #include "Usb.h"
    -
    22 #include "usbhid.h"
    -
    23 #include "controllerEnums.h"
    -
    24 
    -
    25 /* Data Xbox taken from descriptors */
    -
    26 #define EP_MAXPKTSIZE 32 // Max size for data via USB
    -
    27 
    -
    28 /* Names we give to the 3 Xbox pipes */
    -
    29 #define XBOX_CONTROL_PIPE 0
    -
    30 #define XBOX_INPUT_PIPE 1
    -
    31 #define XBOX_OUTPUT_PIPE 2
    -
    32 
    -
    33 // PID and VID of the different devices
    -
    34 #define XBOX_VID 0x045E // Microsoft Corporation
    -
    35 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz controllers
    -
    36 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    -
    37 
    -
    38 #define XBOX_OLD_PID1 0x0202 // Original Microsoft Xbox controller (US)
    -
    39 #define XBOX_OLD_PID2 0x0285 // Original Microsoft Xbox controller (Japan)
    -
    40 #define XBOX_OLD_PID3 0x0287 // Microsoft Microsoft Xbox Controller S
    -
    41 #define XBOX_OLD_PID4 0x0289 // Smaller Microsoft Xbox controller (US)
    -
    42 
    -
    43 #define XBOX_MAX_ENDPOINTS 3
    -
    44 
    -
    46 class XBOXOLD : public USBDeviceConfig {
    -
    47 public:
    -
    52  XBOXOLD(USB *pUsb);
    -
    53 
    -
    62  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    67  uint8_t Release();
    -
    72  uint8_t Poll();
    -
    73 
    -
    78  virtual uint8_t GetAddress() {
    -
    79  return bAddress;
    -
    80  };
    -
    81 
    -
    86  virtual bool isReady() {
    -
    87  return bPollEnable;
    -
    88  };
    -
    89 
    -
    96  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    97  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID) && (pid == XBOX_OLD_PID1 || pid == XBOX_OLD_PID2 || pid == XBOX_OLD_PID3 || pid == XBOX_OLD_PID4));
    -
    98  };
    -
    112  uint8_t getButtonPress(ButtonEnum b);
    -
    113  bool getButtonClick(ButtonEnum b);
    -
    122  int16_t getAnalogHat(AnalogHatEnum a);
    -
    123 
    -
    125  void setRumbleOff() {
    -
    126  setRumbleOn(0, 0);
    -
    127  };
    -
    133  void setRumbleOn(uint8_t lValue, uint8_t rValue);
    -
    134 
    -
    139  void attachOnInit(void (*funcOnInit)(void)) {
    -
    140  pFuncOnInit = funcOnInit;
    -
    141  };
    -
    145  bool XboxConnected;
    -
    146 
    -
    147 protected:
    - -
    151  uint8_t bAddress;
    - -
    154 
    -
    155 private:
    -
    161  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    162 
    -
    163  bool bPollEnable;
    -
    164 
    -
    165  /* Variables to store the digital buttons */
    -
    166  uint8_t ButtonState;
    -
    167  uint8_t OldButtonState;
    -
    168  uint8_t ButtonClickState;
    -
    169 
    -
    170  /* Variables to store the analog buttons */
    -
    171  uint8_t buttonValues[8]; // A, B, X, Y, BLACK, WHITE, L1, and R1
    -
    172  uint8_t oldButtonValues[8];
    -
    173  bool buttonClicked[8];
    -
    174 
    -
    175  int16_t hatValue[4]; // Joystick values
    -
    176 
    -
    177  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    -
    178 
    -
    179  void readReport(); // Read incoming data
    -
    180  void printReport(uint16_t length); // Print incoming date
    -
    181 
    -
    182  /* Private commands */
    -
    183  void XboxCommand(uint8_t* data, uint16_t nbytes);
    -
    184 };
    -
    185 #endif
    -
    uint8_t Release()
    Definition: XBOXOLD.cpp:237
    +Go to the documentation of this file.
    1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _xboxold_h_
    19 #define _xboxold_h_
    20 
    21 #include "Usb.h"
    22 #include "usbhid.h"
    23 #include "controllerEnums.h"
    24 
    25 /* Data Xbox taken from descriptors */
    26 #define EP_MAXPKTSIZE 32 // Max size for data via USB
    27 
    28 /* Names we give to the 3 Xbox pipes */
    29 #define XBOX_CONTROL_PIPE 0
    30 #define XBOX_INPUT_PIPE 1
    31 #define XBOX_OUTPUT_PIPE 2
    32 
    33 // PID and VID of the different devices
    34 #define XBOX_VID 0x045E // Microsoft Corporation
    35 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz controllers
    36 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    37 
    38 #define XBOX_OLD_PID1 0x0202 // Original Microsoft Xbox controller (US)
    39 #define XBOX_OLD_PID2 0x0285 // Original Microsoft Xbox controller (Japan)
    40 #define XBOX_OLD_PID3 0x0287 // Microsoft Microsoft Xbox Controller S
    41 #define XBOX_OLD_PID4 0x0289 // Smaller Microsoft Xbox controller (US)
    42 
    43 #define XBOX_MAX_ENDPOINTS 3
    44 
    46 class XBOXOLD : public USBDeviceConfig {
    47 public:
    52  XBOXOLD(USB *pUsb);
    53 
    62  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    67  uint8_t Release();
    72  uint8_t Poll();
    73 
    78  virtual uint8_t GetAddress() {
    79  return bAddress;
    80  };
    81 
    86  virtual bool isReady() {
    87  return bPollEnable;
    88  };
    89 
    96  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    97  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID) && (pid == XBOX_OLD_PID1 || pid == XBOX_OLD_PID2 || pid == XBOX_OLD_PID3 || pid == XBOX_OLD_PID4));
    98  };
    112  uint8_t getButtonPress(ButtonEnum b);
    113  bool getButtonClick(ButtonEnum b);
    122  int16_t getAnalogHat(AnalogHatEnum a);
    123 
    125  void setRumbleOff() {
    126  setRumbleOn(0, 0);
    127  };
    133  void setRumbleOn(uint8_t lValue, uint8_t rValue);
    134 
    139  void attachOnInit(void (*funcOnInit)(void)) {
    140  pFuncOnInit = funcOnInit;
    141  };
    145  bool XboxConnected;
    146 
    147 protected:
    151  uint8_t bAddress;
    154 
    155 private:
    161  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    162 
    163  bool bPollEnable;
    164 
    165  /* Variables to store the digital buttons */
    166  uint8_t ButtonState;
    167  uint8_t OldButtonState;
    168  uint8_t ButtonClickState;
    169 
    170  /* Variables to store the analog buttons */
    171  uint8_t buttonValues[8]; // A, B, X, Y, BLACK, WHITE, L1, and R1
    172  uint8_t oldButtonValues[8];
    173  bool buttonClicked[8];
    174 
    175  int16_t hatValue[4]; // Joystick values
    176 
    177  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    178 
    179  void readReport(); // Read incoming data
    180  void printReport(uint16_t length); // Print incoming date
    181 
    182  /* Private commands */
    183  void XboxCommand(uint8_t* data, uint16_t nbytes);
    184 };
    185 #endif
    uint8_t Release()
    Definition: XBOXOLD.cpp:237
    void attachOnInit(void(*funcOnInit)(void))
    Definition: XBOXOLD.h:139
    AnalogHatEnum
    virtual uint8_t GetAddress()
    Definition: XBOXOLD.h:78
    @@ -233,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_x_b_o_x_o_n_e_8cpp.html b/_x_b_o_x_o_n_e_8cpp.html index 71c45875..bdf23aa2 100644 --- a/_x_b_o_x_o_n_e_8cpp.html +++ b/_x_b_o_x_o_n_e_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXONE.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXONE.cpp File Reference
    -
    #include "XBOXONE.h"
    +
    #include "XBOXONE.h"
    Include dependency graph for XBOXONE.cpp:
    - + + + + +

    Go to the source code of this file.

    @@ -100,7 +105,7 @@ Include dependency graph for XBOXONE.cpp:
    diff --git a/_x_b_o_x_o_n_e_8cpp__incl.map b/_x_b_o_x_o_n_e_8cpp__incl.map index 1f1506d7..ffe5640e 100644 --- a/_x_b_o_x_o_n_e_8cpp__incl.map +++ b/_x_b_o_x_o_n_e_8cpp__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/_x_b_o_x_o_n_e_8cpp__incl.md5 b/_x_b_o_x_o_n_e_8cpp__incl.md5 index 4610a8db..adfce4de 100644 --- a/_x_b_o_x_o_n_e_8cpp__incl.md5 +++ b/_x_b_o_x_o_n_e_8cpp__incl.md5 @@ -1 +1 @@ -0999cb6609525753554c8ffa1f8467d6 \ No newline at end of file +a31c4a2760319c972359266d1c3ccfe5 \ No newline at end of file diff --git a/_x_b_o_x_o_n_e_8cpp__incl.png b/_x_b_o_x_o_n_e_8cpp__incl.png index 3a7d7bfe1bc289a5b8ef3ce2ac7412c29c4934fd..2b11d73fcd3f2b94321db840d6a217fce543d3aa 100644 GIT binary patch literal 7498 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 YW{|S|7y(KRVDm#V5=caen4$Oo0^G6TDgXcg diff --git a/_x_b_o_x_o_n_e_8cpp_source.html b/_x_b_o_x_o_n_e_8cpp_source.html index d7b260ed..d5e43b23 100644 --- a/_x_b_o_x_o_n_e_8cpp_source.html +++ b/_x_b_o_x_o_n_e_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXONE.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,499 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXONE.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2  Copyright (C) 2015 guruthree
    -
    3 
    -
    4  This software may be distributed and modified under the terms of the GNU
    -
    5  General Public License version 2 (GPL2) as published by the Free Software
    -
    6  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    7  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    8  on this software must also be made publicly available under the terms of
    -
    9  the GPL2 ("Copyleft").
    -
    10 
    -
    11  Contact information
    -
    12  -------------------
    -
    13 
    -
    14  Kristian Lauszus, TKJ Electronics
    -
    15  Web : http://www.tkjelectronics.com
    -
    16  e-mail : kristianl@tkjelectronics.com
    -
    17 
    -
    18  guruthree
    -
    19  Web : https://github.com/guruthree/
    -
    20  */
    -
    21 
    -
    22 #include "XBOXONE.h"
    -
    23 // To enable serial debugging see "settings.h"
    -
    24 //#define EXTRADEBUG // Uncomment to get even more debugging data
    -
    25 //#define PRINTREPORT // Uncomment to print the report send by the Xbox ONE Controller
    -
    26 
    - -
    28 pUsb(p), // pointer to USB class instance - mandatory
    -
    29 bAddress(0), // device address - mandatory
    -
    30 bNumEP(1), // If config descriptor needs to be parsed
    -
    31 qNextPollTime(0), // Reset NextPollTime
    -
    32 pollInterval(0),
    -
    33 bPollEnable(false) { // don't start polling before dongle is connected
    -
    34  for(uint8_t i = 0; i < XBOX_ONE_MAX_ENDPOINTS; i++) {
    -
    35  epInfo[i].epAddr = 0;
    -
    36  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    37  epInfo[i].bmSndToggle = 0;
    -
    38  epInfo[i].bmRcvToggle = 0;
    - -
    40  }
    -
    41 
    -
    42  if(pUsb) // register in USB subsystem
    -
    43  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    -
    44 }
    -
    45 
    -
    46 uint8_t XBOXONE::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    47  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    -
    48  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    49  uint8_t rcode;
    -
    50  UsbDevice *p = NULL;
    -
    51  EpInfo *oldep_ptr = NULL;
    -
    52  uint16_t PID, VID;
    -
    53  uint8_t num_of_conf; // Number of configurations
    -
    54 
    -
    55  // get memory address of USB device address pool
    -
    56  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    57 #ifdef EXTRADEBUG
    -
    58  Notify(PSTR("\r\nXBOXONE Init"), 0x80);
    -
    59 #endif
    -
    60  // check if address has already been assigned to an instance
    -
    61  if(bAddress) {
    -
    62 #ifdef DEBUG_USB_HOST
    -
    63  Notify(PSTR("\r\nAddress in use"), 0x80);
    -
    64 #endif
    - -
    66  }
    -
    67 
    -
    68  // Get pointer to pseudo device with address 0 assigned
    -
    69  p = addrPool.GetUsbDevicePtr(0);
    -
    70 
    -
    71  if(!p) {
    -
    72 #ifdef DEBUG_USB_HOST
    -
    73  Notify(PSTR("\r\nAddress not found"), 0x80);
    -
    74 #endif
    - -
    76  }
    -
    77 
    -
    78  if(!p->epinfo) {
    -
    79 #ifdef DEBUG_USB_HOST
    -
    80  Notify(PSTR("\r\nepinfo is null"), 0x80);
    -
    81 #endif
    - -
    83  }
    -
    84 
    -
    85  // Save old pointer to EP_RECORD of address 0
    -
    86  oldep_ptr = p->epinfo;
    -
    87 
    -
    88  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    89  p->epinfo = epInfo;
    -
    90 
    -
    91  p->lowspeed = lowspeed;
    -
    92 
    -
    93  // Get device descriptor
    -
    94  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    -
    95  // Restore p->epinfo
    -
    96  p->epinfo = oldep_ptr;
    -
    97 
    -
    98  if(rcode)
    -
    99  goto FailGetDevDescr;
    -
    100 
    -
    101  VID = udd->idVendor;
    -
    102  PID = udd->idProduct;
    -
    103 
    -
    104  if(!VIDPIDOK(VID, PID)) // Check VID
    -
    105  goto FailUnknownDevice;
    -
    106 
    -
    107  // Allocate new address according to device class
    -
    108  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    109 
    -
    110  if(!bAddress)
    - -
    112 
    -
    113  // Extract Max Packet Size from device descriptor
    -
    114  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    -
    115 
    -
    116  // Assign new address to the device
    -
    117  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    118  if(rcode) {
    -
    119  p->lowspeed = false;
    -
    120  addrPool.FreeAddress(bAddress);
    -
    121  bAddress = 0;
    -
    122 #ifdef DEBUG_USB_HOST
    -
    123  Notify(PSTR("\r\nsetAddr: "), 0x80);
    -
    124  D_PrintHex<uint8_t > (rcode, 0x80);
    -
    125 #endif
    -
    126  return rcode;
    -
    127  }
    -
    128 #ifdef EXTRADEBUG
    -
    129  Notify(PSTR("\r\nAddr: "), 0x80);
    -
    130  D_PrintHex<uint8_t > (bAddress, 0x80);
    -
    131 #endif
    -
    132  //delay(300); // Spec says you should wait at least 200ms
    -
    133 
    -
    134  p->lowspeed = false;
    -
    135 
    -
    136  //get pointer to assigned address record
    -
    137  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    138  if(!p)
    - -
    140 
    -
    141  p->lowspeed = lowspeed;
    -
    142 
    -
    143  // Assign epInfo to epinfo pointer - only EP0 is known
    -
    144  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    145  if(rcode)
    -
    146  goto FailSetDevTblEntry;
    -
    147 
    -
    148  num_of_conf = udd->bNumConfigurations; // Number of configurations
    -
    149 
    -
    150  USBTRACE2("NC:", num_of_conf);
    -
    151 
    -
    152  // Check if attached device is a Xbox One controller and fill endpoint data structure
    -
    153  for(uint8_t i = 0; i < num_of_conf; i++) {
    -
    154  ConfigDescParser<0, 0, 0, 0> confDescrParser(this); // Allow all devices, as we have already verified that it is a Xbox One controller from the VID and PID
    -
    155  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    156  if(rcode) // Check error code
    -
    157  goto FailGetConfDescr;
    -
    158  if(bNumEP >= XBOX_ONE_MAX_ENDPOINTS) // All endpoints extracted
    -
    159  break;
    -
    160  }
    -
    161 
    - -
    163  goto FailUnknownDevice;
    -
    164 
    -
    165  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    -
    166  if(rcode)
    -
    167  goto FailSetDevTblEntry;
    -
    168 
    -
    169  delay(200); // Give time for address change
    -
    170 
    -
    171  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_ONE_CONTROL_PIPE ].epAddr, bConfNum);
    -
    172  if(rcode)
    -
    173  goto FailSetConfDescr;
    -
    174 
    -
    175 #ifdef DEBUG_USB_HOST
    -
    176  Notify(PSTR("\r\nXbox One Controller Connected\r\n"), 0x80);
    -
    177 #endif
    -
    178 
    -
    179  delay(200); // let things settle
    -
    180 
    -
    181  // Initialize the controller for input
    -
    182  cmdCounter = 0; // Reset the counter used when sending out the commands
    -
    183  uint8_t writeBuf[5];
    -
    184  writeBuf[0] = 0x05;
    -
    185  writeBuf[1] = 0x20;
    -
    186  // Byte 2 is set in "XboxCommand"
    -
    187  writeBuf[3] = 0x01;
    -
    188  writeBuf[4] = 0x00;
    -
    189  rcode = XboxCommand(writeBuf, 5);
    -
    190  if (rcode)
    -
    191  goto Fail;
    -
    192 
    -
    193  onInit();
    -
    194  XboxOneConnected = true;
    -
    195  bPollEnable = true;
    -
    196  return 0; // Successful configuration
    -
    197 
    -
    198  /* Diagnostic messages */
    -
    199 FailGetDevDescr:
    -
    200 #ifdef DEBUG_USB_HOST
    - -
    202  goto Fail;
    -
    203 #endif
    -
    204 
    -
    205 FailSetDevTblEntry:
    -
    206 #ifdef DEBUG_USB_HOST
    - -
    208  goto Fail;
    -
    209 #endif
    -
    210 
    -
    211 FailGetConfDescr:
    -
    212 #ifdef DEBUG_USB_HOST
    - -
    214  goto Fail;
    -
    215 #endif
    -
    216 
    -
    217 FailSetConfDescr:
    -
    218 #ifdef DEBUG_USB_HOST
    - -
    220 #endif
    -
    221  goto Fail;
    -
    222 
    -
    223 FailUnknownDevice:
    -
    224 #ifdef DEBUG_USB_HOST
    -
    225  NotifyFailUnknownDevice(VID, PID);
    -
    226 #endif
    - -
    228 
    -
    229 Fail:
    -
    230 #ifdef DEBUG_USB_HOST
    -
    231  Notify(PSTR("\r\nXbox One Init Failed, error code: "), 0x80);
    -
    232  NotifyFail(rcode);
    -
    233 #endif
    -
    234  Release();
    -
    235  return rcode;
    -
    236 }
    -
    237 
    -
    238 /* Extracts endpoint information from config descriptor */
    -
    239 void XBOXONE::EndpointXtract(uint8_t conf,
    -
    240  uint8_t iface __attribute__((unused)),
    -
    241  uint8_t alt __attribute__((unused)),
    -
    242  uint8_t proto __attribute__((unused)),
    -
    243  const USB_ENDPOINT_DESCRIPTOR *pep)
    -
    244 {
    -
    245 
    -
    246  bConfNum = conf;
    -
    247  uint8_t index;
    -
    248 
    -
    249  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT) { // Interrupt endpoint
    -
    250  index = (pep->bEndpointAddress & 0x80) == 0x80 ? XBOX_ONE_INPUT_PIPE : XBOX_ONE_OUTPUT_PIPE; // Set the endpoint index
    -
    251  } else
    -
    252  return;
    -
    253 
    -
    254  // Fill the rest of endpoint data structure
    -
    255  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    256  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    257 #ifdef EXTRADEBUG
    - -
    259 #endif
    -
    260  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
    -
    261  pollInterval = pep->bInterval;
    -
    262  bNumEP++;
    -
    263 }
    -
    264 
    - -
    266  __attribute__((unused)))
    -
    267 {
    -
    268 #ifdef EXTRADEBUG
    -
    269  Notify(PSTR("\r\nEndpoint descriptor:"), 0x80);
    -
    270  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    -
    271  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    -
    272  Notify(PSTR("\r\nType:\t\t"), 0x80);
    -
    273  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    -
    274  Notify(PSTR("\r\nAddress:\t"), 0x80);
    -
    275  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    -
    276  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    -
    277  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    -
    278  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    -
    279  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    -
    280  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    -
    281  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    -
    282 #endif
    -
    283 }
    -
    284 
    -
    285 /* Performs a cleanup after failed Init() attempt */
    -
    286 uint8_t XBOXONE::Release() {
    -
    287  XboxOneConnected = false;
    - -
    289  bAddress = 0; // Clear device address
    -
    290  bNumEP = 1; // Must have to be reset to 1
    -
    291  qNextPollTime = 0; // Reset next poll time
    -
    292  pollInterval = 0;
    -
    293  bPollEnable = false;
    -
    294 #ifdef DEBUG_USB_HOST
    -
    295  Notify(PSTR("\r\nXbox One Controller Disconnected\r\n"), 0x80);
    -
    296 #endif
    -
    297  return 0;
    -
    298 }
    -
    299 
    -
    300 uint8_t XBOXONE::Poll() {
    -
    301  uint8_t rcode = 0;
    -
    302 
    -
    303  if(!bPollEnable)
    -
    304  return 0;
    -
    305 
    -
    306  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) { // Do not poll if shorter than polling interval
    -
    307  qNextPollTime = (uint32_t)millis() + pollInterval; // Set new poll time
    -
    308  uint16_t length = (uint16_t)epInfo[ XBOX_ONE_INPUT_PIPE ].maxPktSize; // Read the maximum packet size from the endpoint
    -
    309  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ XBOX_ONE_INPUT_PIPE ].epAddr, &length, readBuf, pollInterval);
    -
    310  if(!rcode) {
    -
    311  readReport();
    -
    312 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send by the Xbox ONE Controller
    -
    313  for(uint8_t i = 0; i < length; i++) {
    -
    314  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    -
    315  Notify(PSTR(" "), 0x80);
    -
    316  }
    -
    317  Notify(PSTR("\r\n"), 0x80);
    -
    318 #endif
    -
    319  }
    -
    320 #ifdef DEBUG_USB_HOST
    -
    321  else if(rcode != hrNAK) { // Not a matter of no update to send
    -
    322  Notify(PSTR("\r\nXbox One Poll Failed, error code: "), 0x80);
    -
    323  NotifyFail(rcode);
    -
    324  }
    -
    325 #endif
    -
    326  }
    -
    327  return rcode;
    -
    328 }
    -
    329 
    -
    330 void XBOXONE::readReport() {
    -
    331  if(readBuf[0] == 0x07) {
    -
    332  // The XBOX button has a separate message
    -
    333  if(readBuf[4] == 1)
    -
    334  ButtonState |= pgm_read_word(&XBOX_BUTTONS[XBOX]);
    -
    335  else
    -
    336  ButtonState &= ~pgm_read_word(&XBOX_BUTTONS[XBOX]);
    -
    337 
    -
    338  if(ButtonState != OldButtonState) {
    -
    339  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    -
    340  OldButtonState = ButtonState;
    -
    341  }
    -
    342  }
    -
    343  if(readBuf[0] != 0x20) { // Check if it's the correct report, otherwise return - the controller also sends different status reports
    -
    344 #ifdef EXTRADEBUG
    -
    345  Notify(PSTR("\r\nXbox Poll: "), 0x80);
    -
    346  D_PrintHex<uint8_t > (readBuf[0], 0x80); // 0x03 is a heart beat report!
    -
    347 #endif
    -
    348  return;
    -
    349  }
    -
    350 
    -
    351  uint16_t xbox = ButtonState & pgm_read_word(&XBOX_BUTTONS[XBOX]); // Since the XBOX button is separate, save it and add it back in
    -
    352  // xbox button from before, dpad, abxy, start/back, sync, stick click, shoulder buttons
    -
    353  ButtonState = xbox | (((uint16_t)readBuf[5] & 0xF) << 8) | (readBuf[4] & 0xF0) | (((uint16_t)readBuf[4] & 0x0C) << 10) | ((readBuf[4] & 0x01) << 3) | (((uint16_t)readBuf[5] & 0xC0) << 8) | ((readBuf[5] & 0x30) >> 4);
    -
    354 
    -
    355  triggerValue[0] = (uint16_t)(((uint16_t)readBuf[7] << 8) | readBuf[6]);
    -
    356  triggerValue[1] = (uint16_t)(((uint16_t)readBuf[9] << 8) | readBuf[8]);
    -
    357 
    -
    358  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
    -
    359  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
    -
    360  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[15] << 8) | readBuf[14]);
    -
    361  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[17] << 8) | readBuf[16]);
    -
    362 
    -
    363  //Notify(PSTR("\r\nButtonState"), 0x80);
    -
    364  //PrintHex<uint16_t>(ButtonState, 0x80);
    -
    365 
    -
    366  if(ButtonState != OldButtonState) {
    -
    367  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    -
    368  OldButtonState = ButtonState;
    -
    369  }
    -
    370 
    -
    371  // Handle click detection for triggers
    -
    372  if(triggerValue[0] != 0 && triggerValueOld[0] == 0)
    -
    373  L2Clicked = true;
    -
    374  triggerValueOld[0] = triggerValue[0];
    -
    375  if(triggerValue[1] != 0 && triggerValueOld[1] == 0)
    -
    376  R2Clicked = true;
    -
    377  triggerValueOld[1] = triggerValue[1];
    -
    378 }
    -
    379 
    - -
    381  if(b == L2) // These are analog buttons
    -
    382  return triggerValue[0];
    -
    383  else if(b == R2)
    -
    384  return triggerValue[1];
    -
    385  return (bool)(ButtonState & ((uint16_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b])));
    -
    386 }
    -
    387 
    - -
    389  if(b == L2) {
    -
    390  if(L2Clicked) {
    -
    391  L2Clicked = false;
    -
    392  return true;
    -
    393  }
    -
    394  return false;
    -
    395  } else if(b == R2) {
    -
    396  if(R2Clicked) {
    -
    397  R2Clicked = false;
    -
    398  return true;
    -
    399  }
    -
    400  return false;
    -
    401  }
    -
    402  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    -
    403  bool click = (ButtonClickState & button);
    -
    404  ButtonClickState &= ~button; // Clear "click" event
    -
    405  return click;
    -
    406 }
    -
    407 
    - -
    409  return hatValue[a];
    -
    410 }
    -
    411 
    -
    412 /* Xbox Controller commands */
    -
    413 uint8_t XBOXONE::XboxCommand(uint8_t* data, uint16_t nbytes) {
    -
    414  data[2] = cmdCounter++; // Increment the output command counter
    -
    415  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ XBOX_ONE_OUTPUT_PIPE ].epAddr, nbytes, data);
    -
    416 #ifdef DEBUG_USB_HOST
    -
    417  Notify(PSTR("\r\nXboxCommand, Return: "), 0x80);
    -
    418  D_PrintHex<uint8_t > (rcode, 0x80);
    -
    419 #endif
    -
    420  return rcode;
    -
    421 }
    -
    422 
    -
    423 // The Xbox One packets are described at: https://github.com/quantus/xbox-one-controller-protocol
    -
    424 void XBOXONE::onInit() {
    -
    425  // A short buzz to show the controller is active
    -
    426  uint8_t writeBuf[13];
    -
    427 
    -
    428  // Activate rumble
    -
    429  writeBuf[0] = 0x09;
    -
    430  writeBuf[1] = 0x00;
    -
    431  // Byte 2 is set in "XboxCommand"
    -
    432 
    -
    433  // Single rumble effect
    -
    434  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
    -
    435  writeBuf[4] = 0x00; // Mode
    -
    436  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
    -
    437  writeBuf[6] = 0x04; // lT force
    -
    438  writeBuf[7] = 0x04; // rT force
    -
    439  writeBuf[8] = 0x20; // L force
    -
    440  writeBuf[9] = 0x20; // R force
    -
    441  writeBuf[10] = 0x80; // Length of pulse
    -
    442  writeBuf[11] = 0x00; // Off period
    -
    443  writeBuf[12] = 0x00; // Repeat count
    -
    444  XboxCommand(writeBuf, 13);
    -
    445 
    -
    446  if(pFuncOnInit)
    -
    447  pFuncOnInit(); // Call the user function
    -
    448 }
    -
    449 
    - -
    451  uint8_t writeBuf[13];
    -
    452 
    -
    453  // Activate rumble
    -
    454  writeBuf[0] = 0x09;
    -
    455  writeBuf[1] = 0x00;
    -
    456  // Byte 2 is set in "XboxCommand"
    -
    457 
    -
    458  // Continuous rumble effect
    -
    459  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
    -
    460  writeBuf[4] = 0x00; // Mode
    -
    461  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
    -
    462  writeBuf[6] = 0x00; // lT force
    -
    463  writeBuf[7] = 0x00; // rT force
    -
    464  writeBuf[8] = 0x00; // L force
    -
    465  writeBuf[9] = 0x00; // R force
    -
    466  writeBuf[10] = 0x00; // On period
    -
    467  writeBuf[11] = 0x00; // Off period
    -
    468  writeBuf[12] = 0x00; // Repeat count
    -
    469  XboxCommand(writeBuf, 13);
    -
    470 }
    -
    471 
    -
    472 void XBOXONE::setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor) {
    -
    473  uint8_t writeBuf[13];
    -
    474 
    -
    475  // Activate rumble
    -
    476  writeBuf[0] = 0x09;
    -
    477  writeBuf[1] = 0x00;
    -
    478  // Byte 2 is set in "XboxCommand"
    -
    479 
    -
    480  // Continuous rumble effect
    -
    481  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
    -
    482  writeBuf[4] = 0x00; // Mode
    -
    483  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
    -
    484  writeBuf[6] = leftTrigger; // lT force
    -
    485  writeBuf[7] = rightTrigger; // rT force
    -
    486  writeBuf[8] = leftMotor; // L force
    -
    487  writeBuf[9] = rightMotor; // R force
    -
    488  writeBuf[10] = 0xFF; // On period
    -
    489  writeBuf[11] = 0x00; // Off period
    -
    490  writeBuf[12] = 0xFF; // Repeat count
    -
    491  XboxCommand(writeBuf, 13);
    -
    492 }
    -
    uint8_t bConfNum
    Definition: XBOXONE.h:186
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2  Copyright (C) 2015 guruthree
    3 
    4  This software may be distributed and modified under the terms of the GNU
    5  General Public License version 2 (GPL2) as published by the Free Software
    6  Foundation and appearing in the file GPL2.TXT included in the packaging of
    7  this file. Please note that GPL2 Section 2[b] requires that all works based
    8  on this software must also be made publicly available under the terms of
    9  the GPL2 ("Copyleft").
    10 
    11  Contact information
    12  -------------------
    13 
    14  Kristian Lauszus, TKJ Electronics
    15  Web : http://www.tkjelectronics.com
    16  e-mail : kristianl@tkjelectronics.com
    17 
    18  guruthree
    19  Web : https://github.com/guruthree/
    20  */
    21 
    22 #include "XBOXONE.h"
    23 // To enable serial debugging see "settings.h"
    24 //#define EXTRADEBUG // Uncomment to get even more debugging data
    25 //#define PRINTREPORT // Uncomment to print the report send by the Xbox ONE Controller
    26 
    28 pUsb(p), // pointer to USB class instance - mandatory
    29 bAddress(0), // device address - mandatory
    30 bNumEP(1), // If config descriptor needs to be parsed
    31 qNextPollTime(0), // Reset NextPollTime
    32 pollInterval(0),
    33 bPollEnable(false) { // don't start polling before dongle is connected
    34  for(uint8_t i = 0; i < XBOX_ONE_MAX_ENDPOINTS; i++) {
    35  epInfo[i].epAddr = 0;
    36  epInfo[i].maxPktSize = (i) ? 0 : 8;
    37  epInfo[i].bmSndToggle = 0;
    38  epInfo[i].bmRcvToggle = 0;
    40  }
    41 
    42  if(pUsb) // register in USB subsystem
    43  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    44 }
    45 
    46 uint8_t XBOXONE::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    47  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    48  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    49  uint8_t rcode;
    50  UsbDevice *p = NULL;
    51  EpInfo *oldep_ptr = NULL;
    52  uint16_t PID, VID;
    53  uint8_t num_of_conf; // Number of configurations
    54 
    55  // get memory address of USB device address pool
    56  AddressPool &addrPool = pUsb->GetAddressPool();
    57 #ifdef EXTRADEBUG
    58  Notify(PSTR("\r\nXBOXONE Init"), 0x80);
    59 #endif
    60  // check if address has already been assigned to an instance
    61  if(bAddress) {
    62 #ifdef DEBUG_USB_HOST
    63  Notify(PSTR("\r\nAddress in use"), 0x80);
    64 #endif
    66  }
    67 
    68  // Get pointer to pseudo device with address 0 assigned
    69  p = addrPool.GetUsbDevicePtr(0);
    70 
    71  if(!p) {
    72 #ifdef DEBUG_USB_HOST
    73  Notify(PSTR("\r\nAddress not found"), 0x80);
    74 #endif
    76  }
    77 
    78  if(!p->epinfo) {
    79 #ifdef DEBUG_USB_HOST
    80  Notify(PSTR("\r\nepinfo is null"), 0x80);
    81 #endif
    83  }
    84 
    85  // Save old pointer to EP_RECORD of address 0
    86  oldep_ptr = p->epinfo;
    87 
    88  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    89  p->epinfo = epInfo;
    90 
    91  p->lowspeed = lowspeed;
    92 
    93  // Get device descriptor
    94  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    95  // Restore p->epinfo
    96  p->epinfo = oldep_ptr;
    97 
    98  if(rcode)
    99  goto FailGetDevDescr;
    100 
    101  VID = udd->idVendor;
    102  PID = udd->idProduct;
    103 
    104  if(!VIDPIDOK(VID, PID)) // Check VID
    105  goto FailUnknownDevice;
    106 
    107  // Allocate new address according to device class
    108  bAddress = addrPool.AllocAddress(parent, false, port);
    109 
    110  if(!bAddress)
    112 
    113  // Extract Max Packet Size from device descriptor
    114  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    115 
    116  // Assign new address to the device
    117  rcode = pUsb->setAddr(0, 0, bAddress);
    118  if(rcode) {
    119  p->lowspeed = false;
    120  addrPool.FreeAddress(bAddress);
    121  bAddress = 0;
    122 #ifdef DEBUG_USB_HOST
    123  Notify(PSTR("\r\nsetAddr: "), 0x80);
    124  D_PrintHex<uint8_t > (rcode, 0x80);
    125 #endif
    126  return rcode;
    127  }
    128 #ifdef EXTRADEBUG
    129  Notify(PSTR("\r\nAddr: "), 0x80);
    130  D_PrintHex<uint8_t > (bAddress, 0x80);
    131 #endif
    132  //delay(300); // Spec says you should wait at least 200ms
    133 
    134  p->lowspeed = false;
    135 
    136  //get pointer to assigned address record
    137  p = addrPool.GetUsbDevicePtr(bAddress);
    138  if(!p)
    140 
    141  p->lowspeed = lowspeed;
    142 
    143  // Assign epInfo to epinfo pointer - only EP0 is known
    144  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    145  if(rcode)
    146  goto FailSetDevTblEntry;
    147 
    148  num_of_conf = udd->bNumConfigurations; // Number of configurations
    149 
    150  USBTRACE2("NC:", num_of_conf);
    151 
    152  // Check if attached device is a Xbox One controller and fill endpoint data structure
    153  for(uint8_t i = 0; i < num_of_conf; i++) {
    154  ConfigDescParser<0, 0, 0, 0> confDescrParser(this); // Allow all devices, as we have already verified that it is a Xbox One controller from the VID and PID
    155  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    156  if(rcode) // Check error code
    157  goto FailGetConfDescr;
    158  if(bNumEP >= XBOX_ONE_MAX_ENDPOINTS) // All endpoints extracted
    159  break;
    160  }
    161 
    163  goto FailUnknownDevice;
    164 
    165  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    166  if(rcode)
    167  goto FailSetDevTblEntry;
    168 
    169  delay(200); // Give time for address change
    170 
    171  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_ONE_CONTROL_PIPE ].epAddr, bConfNum);
    172  if(rcode)
    173  goto FailSetConfDescr;
    174 
    175 #ifdef DEBUG_USB_HOST
    176  Notify(PSTR("\r\nXbox One Controller Connected\r\n"), 0x80);
    177 #endif
    178 
    179  delay(200); // let things settle
    180 
    181  // Initialize the controller for input
    182  cmdCounter = 0; // Reset the counter used when sending out the commands
    183  uint8_t writeBuf[5];
    184  writeBuf[0] = 0x05;
    185  writeBuf[1] = 0x20;
    186  // Byte 2 is set in "XboxCommand"
    187  writeBuf[3] = 0x01;
    188  writeBuf[4] = 0x00;
    189  rcode = XboxCommand(writeBuf, 5);
    190  if (rcode)
    191  goto Fail;
    192 
    193  onInit();
    194  XboxOneConnected = true;
    195  bPollEnable = true;
    196  return 0; // Successful configuration
    197 
    198  /* Diagnostic messages */
    199 FailGetDevDescr:
    200 #ifdef DEBUG_USB_HOST
    202  goto Fail;
    203 #endif
    204 
    205 FailSetDevTblEntry:
    206 #ifdef DEBUG_USB_HOST
    208  goto Fail;
    209 #endif
    210 
    211 FailGetConfDescr:
    212 #ifdef DEBUG_USB_HOST
    214  goto Fail;
    215 #endif
    216 
    217 FailSetConfDescr:
    218 #ifdef DEBUG_USB_HOST
    220 #endif
    221  goto Fail;
    222 
    223 FailUnknownDevice:
    224 #ifdef DEBUG_USB_HOST
    225  NotifyFailUnknownDevice(VID, PID);
    226 #endif
    228 
    229 Fail:
    230 #ifdef DEBUG_USB_HOST
    231  Notify(PSTR("\r\nXbox One Init Failed, error code: "), 0x80);
    232  NotifyFail(rcode);
    233 #endif
    234  Release();
    235  return rcode;
    236 }
    237 
    238 /* Extracts endpoint information from config descriptor */
    239 void XBOXONE::EndpointXtract(uint8_t conf,
    240  uint8_t iface __attribute__((unused)),
    241  uint8_t alt __attribute__((unused)),
    242  uint8_t proto __attribute__((unused)),
    243  const USB_ENDPOINT_DESCRIPTOR *pep)
    244 {
    245 
    246  bConfNum = conf;
    247  uint8_t index;
    248 
    249  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT) { // Interrupt endpoint
    250  index = (pep->bEndpointAddress & 0x80) == 0x80 ? XBOX_ONE_INPUT_PIPE : XBOX_ONE_OUTPUT_PIPE; // Set the endpoint index
    251  } else
    252  return;
    253 
    254  // Fill the rest of endpoint data structure
    255  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    256  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    257 #ifdef EXTRADEBUG
    259 #endif
    260  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
    261  pollInterval = pep->bInterval;
    262  bNumEP++;
    263 }
    264 
    266  __attribute__((unused)))
    267 {
    268 #ifdef EXTRADEBUG
    269  Notify(PSTR("\r\nEndpoint descriptor:"), 0x80);
    270  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    271  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    272  Notify(PSTR("\r\nType:\t\t"), 0x80);
    273  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    274  Notify(PSTR("\r\nAddress:\t"), 0x80);
    275  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    276  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    277  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    278  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    279  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    280  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    281  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    282 #endif
    283 }
    284 
    285 /* Performs a cleanup after failed Init() attempt */
    286 uint8_t XBOXONE::Release() {
    287  XboxOneConnected = false;
    289  bAddress = 0; // Clear device address
    290  bNumEP = 1; // Must have to be reset to 1
    291  qNextPollTime = 0; // Reset next poll time
    292  pollInterval = 0;
    293  bPollEnable = false;
    294 #ifdef DEBUG_USB_HOST
    295  Notify(PSTR("\r\nXbox One Controller Disconnected\r\n"), 0x80);
    296 #endif
    297  return 0;
    298 }
    299 
    300 uint8_t XBOXONE::Poll() {
    301  uint8_t rcode = 0;
    302 
    303  if(!bPollEnable)
    304  return 0;
    305 
    306  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) { // Do not poll if shorter than polling interval
    307  qNextPollTime = (uint32_t)millis() + pollInterval; // Set new poll time
    308  uint16_t length = (uint16_t)epInfo[ XBOX_ONE_INPUT_PIPE ].maxPktSize; // Read the maximum packet size from the endpoint
    309  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ XBOX_ONE_INPUT_PIPE ].epAddr, &length, readBuf, pollInterval);
    310  if(!rcode) {
    311  readReport();
    312 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send by the Xbox ONE Controller
    313  for(uint8_t i = 0; i < length; i++) {
    314  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    315  Notify(PSTR(" "), 0x80);
    316  }
    317  Notify(PSTR("\r\n"), 0x80);
    318 #endif
    319  }
    320 #ifdef DEBUG_USB_HOST
    321  else if(rcode != hrNAK) { // Not a matter of no update to send
    322  Notify(PSTR("\r\nXbox One Poll Failed, error code: "), 0x80);
    323  NotifyFail(rcode);
    324  }
    325 #endif
    326  }
    327  return rcode;
    328 }
    329 
    330 void XBOXONE::readReport() {
    331  if(readBuf[0] == 0x07) {
    332  // The XBOX button has a separate message
    333  if(readBuf[4] == 1)
    334  ButtonState |= pgm_read_word(&XBOX_BUTTONS[XBOX]);
    335  else
    336  ButtonState &= ~pgm_read_word(&XBOX_BUTTONS[XBOX]);
    337 
    338  if(ButtonState != OldButtonState) {
    339  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    340  OldButtonState = ButtonState;
    341  }
    342  }
    343  if(readBuf[0] != 0x20) { // Check if it's the correct report, otherwise return - the controller also sends different status reports
    344 #ifdef EXTRADEBUG
    345  Notify(PSTR("\r\nXbox Poll: "), 0x80);
    346  D_PrintHex<uint8_t > (readBuf[0], 0x80); // 0x03 is a heart beat report!
    347 #endif
    348  return;
    349  }
    350 
    351  uint16_t xbox = ButtonState & pgm_read_word(&XBOX_BUTTONS[XBOX]); // Since the XBOX button is separate, save it and add it back in
    352  // xbox button from before, dpad, abxy, start/back, sync, stick click, shoulder buttons
    353  ButtonState = xbox | (((uint16_t)readBuf[5] & 0xF) << 8) | (readBuf[4] & 0xF0) | (((uint16_t)readBuf[4] & 0x0C) << 10) | ((readBuf[4] & 0x01) << 3) | (((uint16_t)readBuf[5] & 0xC0) << 8) | ((readBuf[5] & 0x30) >> 4);
    354 
    355  triggerValue[0] = (uint16_t)(((uint16_t)readBuf[7] << 8) | readBuf[6]);
    356  triggerValue[1] = (uint16_t)(((uint16_t)readBuf[9] << 8) | readBuf[8]);
    357 
    358  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
    359  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
    360  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[15] << 8) | readBuf[14]);
    361  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[17] << 8) | readBuf[16]);
    362 
    363  //Notify(PSTR("\r\nButtonState"), 0x80);
    364  //PrintHex<uint16_t>(ButtonState, 0x80);
    365 
    366  if(ButtonState != OldButtonState) {
    367  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    368  OldButtonState = ButtonState;
    369  }
    370 
    371  // Handle click detection for triggers
    372  if(triggerValue[0] != 0 && triggerValueOld[0] == 0)
    373  L2Clicked = true;
    374  triggerValueOld[0] = triggerValue[0];
    375  if(triggerValue[1] != 0 && triggerValueOld[1] == 0)
    376  R2Clicked = true;
    377  triggerValueOld[1] = triggerValue[1];
    378 }
    379 
    381  if(b == L2) // These are analog buttons
    382  return triggerValue[0];
    383  else if(b == R2)
    384  return triggerValue[1];
    385  return (bool)(ButtonState & ((uint16_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b])));
    386 }
    387 
    389  if(b == L2) {
    390  if(L2Clicked) {
    391  L2Clicked = false;
    392  return true;
    393  }
    394  return false;
    395  } else if(b == R2) {
    396  if(R2Clicked) {
    397  R2Clicked = false;
    398  return true;
    399  }
    400  return false;
    401  }
    402  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    403  bool click = (ButtonClickState & button);
    404  ButtonClickState &= ~button; // Clear "click" event
    405  return click;
    406 }
    407 
    409  return hatValue[a];
    410 }
    411 
    412 /* Xbox Controller commands */
    413 uint8_t XBOXONE::XboxCommand(uint8_t* data, uint16_t nbytes) {
    414  data[2] = cmdCounter++; // Increment the output command counter
    415  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ XBOX_ONE_OUTPUT_PIPE ].epAddr, nbytes, data);
    416 #ifdef DEBUG_USB_HOST
    417  Notify(PSTR("\r\nXboxCommand, Return: "), 0x80);
    418  D_PrintHex<uint8_t > (rcode, 0x80);
    419 #endif
    420  return rcode;
    421 }
    422 
    423 // The Xbox One packets are described at: https://github.com/quantus/xbox-one-controller-protocol
    424 void XBOXONE::onInit() {
    425  // A short buzz to show the controller is active
    426  uint8_t writeBuf[13];
    427 
    428  // Activate rumble
    429  writeBuf[0] = 0x09;
    430  writeBuf[1] = 0x00;
    431  // Byte 2 is set in "XboxCommand"
    432 
    433  // Single rumble effect
    434  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
    435  writeBuf[4] = 0x00; // Mode
    436  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
    437  writeBuf[6] = 0x04; // lT force
    438  writeBuf[7] = 0x04; // rT force
    439  writeBuf[8] = 0x20; // L force
    440  writeBuf[9] = 0x20; // R force
    441  writeBuf[10] = 0x80; // Length of pulse
    442  writeBuf[11] = 0x00; // Off period
    443  writeBuf[12] = 0x00; // Repeat count
    444  XboxCommand(writeBuf, 13);
    445 
    446  if(pFuncOnInit)
    447  pFuncOnInit(); // Call the user function
    448 }
    449 
    451  uint8_t writeBuf[13];
    452 
    453  // Activate rumble
    454  writeBuf[0] = 0x09;
    455  writeBuf[1] = 0x00;
    456  // Byte 2 is set in "XboxCommand"
    457 
    458  // Continuous rumble effect
    459  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
    460  writeBuf[4] = 0x00; // Mode
    461  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
    462  writeBuf[6] = 0x00; // lT force
    463  writeBuf[7] = 0x00; // rT force
    464  writeBuf[8] = 0x00; // L force
    465  writeBuf[9] = 0x00; // R force
    466  writeBuf[10] = 0x00; // On period
    467  writeBuf[11] = 0x00; // Off period
    468  writeBuf[12] = 0x00; // Repeat count
    469  XboxCommand(writeBuf, 13);
    470 }
    471 
    472 void XBOXONE::setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor) {
    473  uint8_t writeBuf[13];
    474 
    475  // Activate rumble
    476  writeBuf[0] = 0x09;
    477  writeBuf[1] = 0x00;
    478  // Byte 2 is set in "XboxCommand"
    479 
    480  // Continuous rumble effect
    481  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
    482  writeBuf[4] = 0x00; // Mode
    483  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
    484  writeBuf[6] = leftTrigger; // lT force
    485  writeBuf[7] = rightTrigger; // rT force
    486  writeBuf[8] = leftMotor; // L force
    487  writeBuf[9] = rightMotor; // R force
    488  writeBuf[10] = 0xFF; // On period
    489  writeBuf[11] = 0x00; // Off period
    490  writeBuf[12] = 0xFF; // Repeat count
    491  XboxCommand(writeBuf, 13);
    492 }
    uint8_t bConfNum
    Definition: XBOXONE.h:186
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    uint8_t bmRcvToggle
    Definition: address.h:48
    @@ -667,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_x_b_o_x_o_n_e_8h.html b/_x_b_o_x_o_n_e_8h.html index 97cfc60a..b1afb7f6 100644 --- a/_x_b_o_x_o_n_e_8h.html +++ b/_x_b_o_x_o_n_e_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXONE.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,21 +89,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXONE.h File Reference
    -
    #include "Usb.h"
    -#include "xboxEnums.h"
    +
    #include "Usb.h"
    +#include "xboxEnums.h"
    Include dependency graph for XBOXONE.h:
    - + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -505,7 +510,7 @@ Macros diff --git a/_x_b_o_x_o_n_e_8h__dep__incl.map b/_x_b_o_x_o_n_e_8h__dep__incl.map index 2efde3dd..eb200c31 100644 --- a/_x_b_o_x_o_n_e_8h__dep__incl.map +++ b/_x_b_o_x_o_n_e_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/_x_b_o_x_o_n_e_8h__dep__incl.md5 b/_x_b_o_x_o_n_e_8h__dep__incl.md5 index 4639e8d1..c13f788f 100644 --- a/_x_b_o_x_o_n_e_8h__dep__incl.md5 +++ b/_x_b_o_x_o_n_e_8h__dep__incl.md5 @@ -1 +1 @@ -4f8e8092fb9211eccf14c4eb31202c8c \ No newline at end of file +fd61d6c8f3280fcb7695abf658ecef71 \ No newline at end of file diff --git a/_x_b_o_x_o_n_e_8h__dep__incl.png b/_x_b_o_x_o_n_e_8h__dep__incl.png index 4eac9f458633f3a35edc4d1cbe6176f4163853d0..3f0b18426115fdb1e9d46a8ad0c143f45f993748 100644 GIT binary patch literal 2570 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 R@YexcIvNJ>3iXE}{{k!HP?G=v diff --git a/_x_b_o_x_o_n_e_8h__incl.map b/_x_b_o_x_o_n_e_8h__incl.map index d9c4a3b2..05cb8c11 100644 --- a/_x_b_o_x_o_n_e_8h__incl.map +++ b/_x_b_o_x_o_n_e_8h__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/_x_b_o_x_o_n_e_8h__incl.md5 b/_x_b_o_x_o_n_e_8h__incl.md5 index 9559824e..14781353 100644 --- a/_x_b_o_x_o_n_e_8h__incl.md5 +++ b/_x_b_o_x_o_n_e_8h__incl.md5 @@ -1 +1 @@ -871b5087aaf7d6965a4fb3162dfe2354 \ No newline at end of file +0dde0ce6aa02e651aff1df3147ecf48a \ No newline at end of file diff --git a/_x_b_o_x_o_n_e_8h__incl.png b/_x_b_o_x_o_n_e_8h__incl.png index 4c221e0f874267807a417d828fcc400818e5749e..0f51394d60f3b68d2499945ccc5e3d78412b932a 100644 GIT binary patch literal 6495 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 literal 7072 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 X(-0ug^Em|^xj__URHe%#-+cHlU2fB8 diff --git a/_x_b_o_x_o_n_e_8h_source.html b/_x_b_o_x_o_n_e_8h_source.html index aa911bc2..75fcb596 100644 --- a/_x_b_o_x_o_n_e_8h_source.html +++ b/_x_b_o_x_o_n_e_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXONE.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,150 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXONE.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2  Copyright (C) 2015 guruthree
    -
    3 
    -
    4  This software may be distributed and modified under the terms of the GNU
    -
    5  General Public License version 2 (GPL2) as published by the Free Software
    -
    6  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    7  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    8  on this software must also be made publicly available under the terms of
    -
    9  the GPL2 ("Copyleft").
    -
    10 
    -
    11  Contact information
    -
    12  -------------------
    -
    13 
    -
    14  Kristian Lauszus, TKJ Electronics
    -
    15  Web : http://www.tkjelectronics.com
    -
    16  e-mail : kristianl@tkjelectronics.com
    -
    17 
    -
    18  guruthree
    -
    19  Web : https://github.com/guruthree/
    -
    20  */
    -
    21 
    -
    22 
    -
    23 #ifndef _xboxone_h_
    -
    24 #define _xboxone_h_
    -
    25 
    -
    26 #include "Usb.h"
    -
    27 #include "xboxEnums.h"
    -
    28 
    -
    29 /* Xbox One data taken from descriptors */
    -
    30 #define XBOX_ONE_EP_MAXPKTSIZE 64 // Max size for data via USB
    -
    31 
    -
    32 /* Names we give to the 3 XboxONE pipes */
    -
    33 #define XBOX_ONE_CONTROL_PIPE 0
    -
    34 #define XBOX_ONE_OUTPUT_PIPE 1
    -
    35 #define XBOX_ONE_INPUT_PIPE 2
    -
    36 
    -
    37 #define XBOX_ONE_MAX_ENDPOINTS 3
    -
    38 
    -
    39 // PID and VID of the different versions of the controller - see: https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
    -
    40 
    -
    41 // Official controllers
    -
    42 #define XBOX_VID1 0x045E // Microsoft Corporation
    -
    43 #define XBOX_ONE_PID1 0x02D1 // Microsoft X-Box One pad
    -
    44 #define XBOX_ONE_PID2 0x02DD // Microsoft X-Box One pad (Firmware 2015)
    -
    45 #define XBOX_ONE_PID3 0x02E3 // Microsoft X-Box One Elite pad
    -
    46 #define XBOX_ONE_PID4 0x02EA // Microsoft X-Box One S pad
    -
    47 #define XBOX_ONE_PID13 0x0B0A // Microsoft X-Box One Adaptive Controller
    -
    48 
    -
    49 // Unofficial controllers
    -
    50 #define XBOX_VID2 0x0738 // Mad Catz
    -
    51 #define XBOX_VID3 0x0E6F // Afterglow
    -
    52 #define XBOX_VID4 0x0F0D // HORIPAD ONE
    -
    53 #define XBOX_VID5 0x1532 // Razer
    -
    54 #define XBOX_VID6 0x24C6 // PowerA
    -
    55 
    -
    56 #define XBOX_ONE_PID5 0x4A01 // Mad Catz FightStick TE 2 - might have different mapping for triggers?
    -
    57 #define XBOX_ONE_PID6 0x0139 // Afterglow Prismatic Wired Controller
    -
    58 #define XBOX_ONE_PID7 0x0146 // Rock Candy Wired Controller for Xbox One
    -
    59 #define XBOX_ONE_PID8 0x0067 // HORIPAD ONE
    -
    60 #define XBOX_ONE_PID9 0x0A03 // Razer Wildcat
    -
    61 #define XBOX_ONE_PID10 0x541A // PowerA Xbox One Mini Wired Controller
    -
    62 #define XBOX_ONE_PID11 0x542A // Xbox ONE spectra
    -
    63 #define XBOX_ONE_PID12 0x543A // PowerA Xbox One wired controller
    -
    64 
    -
    66 class XBOXONE : public USBDeviceConfig, public UsbConfigXtracter {
    -
    67 public:
    -
    72  XBOXONE(USB *pUsb);
    -
    73 
    -
    82  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    87  virtual uint8_t Release();
    -
    92  virtual uint8_t Poll();
    -
    93 
    -
    98  virtual uint8_t GetAddress() {
    -
    99  return bAddress;
    -
    100  };
    -
    101 
    -
    106  virtual bool isReady() {
    -
    107  return bPollEnable;
    -
    108  };
    -
    109 
    -
    114  uint8_t readPollInterval() {
    -
    115  return pollInterval;
    -
    116  };
    -
    117 
    -
    124  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    125  return ((vid == XBOX_VID1 || vid == XBOX_VID2 || vid == XBOX_VID3 || vid == XBOX_VID4 || vid == XBOX_VID5 || vid == XBOX_VID6) &&
    -
    126  (pid == XBOX_ONE_PID1 || pid == XBOX_ONE_PID2 || pid == XBOX_ONE_PID3 || pid == XBOX_ONE_PID4 ||
    -
    127  pid == XBOX_ONE_PID5 || pid == XBOX_ONE_PID6 || pid == XBOX_ONE_PID7 || pid == XBOX_ONE_PID8 ||
    -
    128  pid == XBOX_ONE_PID9 || pid == XBOX_ONE_PID10 || pid == XBOX_ONE_PID11 || pid == XBOX_ONE_PID12 || pid == XBOX_ONE_PID13));
    -
    129  };
    -
    143  uint16_t getButtonPress(ButtonEnum b);
    -
    144  bool getButtonClick(ButtonEnum b);
    -
    145 
    -
    151  int16_t getAnalogHat(AnalogHatEnum a);
    -
    152 
    -
    157  void attachOnInit(void (*funcOnInit)(void)) {
    -
    158  pFuncOnInit = funcOnInit;
    -
    159  };
    -
    160 
    -
    162  void setRumbleOff();
    -
    163 
    -
    171  void setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor);
    - -
    176 
    -
    177 protected:
    - -
    181  uint8_t bAddress;
    - -
    184 
    -
    186  uint8_t bConfNum;
    -
    188  uint8_t bNumEP;
    -
    190  uint32_t qNextPollTime;
    -
    191 
    -
    201  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    - -
    209 
    -
    210 private:
    -
    215  void onInit();
    -
    216  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    217 
    -
    218  uint8_t pollInterval;
    -
    219  bool bPollEnable;
    -
    220 
    -
    221  /* Variables to store the buttons */
    -
    222  uint16_t ButtonState;
    -
    223  uint16_t OldButtonState;
    -
    224  uint16_t ButtonClickState;
    -
    225  int16_t hatValue[4];
    -
    226  uint16_t triggerValue[2];
    -
    227  uint16_t triggerValueOld[2];
    -
    228 
    -
    229  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    -
    230  bool R2Clicked;
    -
    231 
    -
    232  uint8_t readBuf[XBOX_ONE_EP_MAXPKTSIZE]; // General purpose buffer for input data
    -
    233  uint8_t cmdCounter;
    -
    234 
    -
    235  void readReport(); // Used to read the incoming data
    -
    236 
    -
    237  /* Private commands */
    -
    238  uint8_t XboxCommand(uint8_t* data, uint16_t nbytes);
    -
    239 };
    -
    240 #endif
    -
    uint8_t bConfNum
    Definition: XBOXONE.h:186
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2  Copyright (C) 2015 guruthree
    3 
    4  This software may be distributed and modified under the terms of the GNU
    5  General Public License version 2 (GPL2) as published by the Free Software
    6  Foundation and appearing in the file GPL2.TXT included in the packaging of
    7  this file. Please note that GPL2 Section 2[b] requires that all works based
    8  on this software must also be made publicly available under the terms of
    9  the GPL2 ("Copyleft").
    10 
    11  Contact information
    12  -------------------
    13 
    14  Kristian Lauszus, TKJ Electronics
    15  Web : http://www.tkjelectronics.com
    16  e-mail : kristianl@tkjelectronics.com
    17 
    18  guruthree
    19  Web : https://github.com/guruthree/
    20  */
    21 
    22 
    23 #ifndef _xboxone_h_
    24 #define _xboxone_h_
    25 
    26 #include "Usb.h"
    27 #include "xboxEnums.h"
    28 
    29 /* Xbox One data taken from descriptors */
    30 #define XBOX_ONE_EP_MAXPKTSIZE 64 // Max size for data via USB
    31 
    32 /* Names we give to the 3 XboxONE pipes */
    33 #define XBOX_ONE_CONTROL_PIPE 0
    34 #define XBOX_ONE_OUTPUT_PIPE 1
    35 #define XBOX_ONE_INPUT_PIPE 2
    36 
    37 #define XBOX_ONE_MAX_ENDPOINTS 3
    38 
    39 // PID and VID of the different versions of the controller - see: https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
    40 
    41 // Official controllers
    42 #define XBOX_VID1 0x045E // Microsoft Corporation
    43 #define XBOX_ONE_PID1 0x02D1 // Microsoft X-Box One pad
    44 #define XBOX_ONE_PID2 0x02DD // Microsoft X-Box One pad (Firmware 2015)
    45 #define XBOX_ONE_PID3 0x02E3 // Microsoft X-Box One Elite pad
    46 #define XBOX_ONE_PID4 0x02EA // Microsoft X-Box One S pad
    47 #define XBOX_ONE_PID13 0x0B0A // Microsoft X-Box One Adaptive Controller
    48 
    49 // Unofficial controllers
    50 #define XBOX_VID2 0x0738 // Mad Catz
    51 #define XBOX_VID3 0x0E6F // Afterglow
    52 #define XBOX_VID4 0x0F0D // HORIPAD ONE
    53 #define XBOX_VID5 0x1532 // Razer
    54 #define XBOX_VID6 0x24C6 // PowerA
    55 
    56 #define XBOX_ONE_PID5 0x4A01 // Mad Catz FightStick TE 2 - might have different mapping for triggers?
    57 #define XBOX_ONE_PID6 0x0139 // Afterglow Prismatic Wired Controller
    58 #define XBOX_ONE_PID7 0x0146 // Rock Candy Wired Controller for Xbox One
    59 #define XBOX_ONE_PID8 0x0067 // HORIPAD ONE
    60 #define XBOX_ONE_PID9 0x0A03 // Razer Wildcat
    61 #define XBOX_ONE_PID10 0x541A // PowerA Xbox One Mini Wired Controller
    62 #define XBOX_ONE_PID11 0x542A // Xbox ONE spectra
    63 #define XBOX_ONE_PID12 0x543A // PowerA Xbox One wired controller
    64 
    66 class XBOXONE : public USBDeviceConfig, public UsbConfigXtracter {
    67 public:
    72  XBOXONE(USB *pUsb);
    73 
    82  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    87  virtual uint8_t Release();
    92  virtual uint8_t Poll();
    93 
    98  virtual uint8_t GetAddress() {
    99  return bAddress;
    100  };
    101 
    106  virtual bool isReady() {
    107  return bPollEnable;
    108  };
    109 
    114  uint8_t readPollInterval() {
    115  return pollInterval;
    116  };
    117 
    124  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    125  return ((vid == XBOX_VID1 || vid == XBOX_VID2 || vid == XBOX_VID3 || vid == XBOX_VID4 || vid == XBOX_VID5 || vid == XBOX_VID6) &&
    126  (pid == XBOX_ONE_PID1 || pid == XBOX_ONE_PID2 || pid == XBOX_ONE_PID3 || pid == XBOX_ONE_PID4 ||
    127  pid == XBOX_ONE_PID5 || pid == XBOX_ONE_PID6 || pid == XBOX_ONE_PID7 || pid == XBOX_ONE_PID8 ||
    128  pid == XBOX_ONE_PID9 || pid == XBOX_ONE_PID10 || pid == XBOX_ONE_PID11 || pid == XBOX_ONE_PID12 || pid == XBOX_ONE_PID13));
    129  };
    143  uint16_t getButtonPress(ButtonEnum b);
    144  bool getButtonClick(ButtonEnum b);
    145 
    151  int16_t getAnalogHat(AnalogHatEnum a);
    152 
    157  void attachOnInit(void (*funcOnInit)(void)) {
    158  pFuncOnInit = funcOnInit;
    159  };
    160 
    162  void setRumbleOff();
    163 
    171  void setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor);
    176 
    177 protected:
    181  uint8_t bAddress;
    184 
    186  uint8_t bConfNum;
    188  uint8_t bNumEP;
    190  uint32_t qNextPollTime;
    191 
    201  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    209 
    210 private:
    215  void onInit();
    216  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    217 
    218  uint8_t pollInterval;
    219  bool bPollEnable;
    220 
    221  /* Variables to store the buttons */
    222  uint16_t ButtonState;
    223  uint16_t OldButtonState;
    224  uint16_t ButtonClickState;
    225  int16_t hatValue[4];
    226  uint16_t triggerValue[2];
    227  uint16_t triggerValueOld[2];
    228 
    229  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    230  bool R2Clicked;
    231 
    232  uint8_t readBuf[XBOX_ONE_EP_MAXPKTSIZE]; // General purpose buffer for input data
    233  uint8_t cmdCounter;
    234 
    235  void readReport(); // Used to read the incoming data
    236 
    237  /* Private commands */
    238  uint8_t XboxCommand(uint8_t* data, uint16_t nbytes);
    239 };
    240 #endif
    uint8_t bConfNum
    Definition: XBOXONE.h:186
    #define XBOX_ONE_PID5
    Definition: XBOXONE.h:56
    #define XBOX_ONE_PID10
    Definition: XBOXONE.h:61
    #define XBOX_ONE_PID9
    Definition: XBOXONE.h:60
    @@ -287,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_x_b_o_x_r_e_c_v_8cpp.html b/_x_b_o_x_r_e_c_v_8cpp.html index b74d582f..9dbaaf3a 100644 --- a/_x_b_o_x_r_e_c_v_8cpp.html +++ b/_x_b_o_x_r_e_c_v_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXRECV.cpp File Reference
    -
    #include "XBOXRECV.h"
    +
    #include "XBOXRECV.h"
    Include dependency graph for XBOXRECV.cpp:
    - + + + + +

    Go to the source code of this file.

    @@ -100,7 +105,7 @@ Include dependency graph for XBOXRECV.cpp:
    diff --git a/_x_b_o_x_r_e_c_v_8cpp__incl.map b/_x_b_o_x_r_e_c_v_8cpp__incl.map index 30ae15e4..eec4ecc3 100644 --- a/_x_b_o_x_r_e_c_v_8cpp__incl.map +++ b/_x_b_o_x_r_e_c_v_8cpp__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/_x_b_o_x_r_e_c_v_8cpp__incl.md5 b/_x_b_o_x_r_e_c_v_8cpp__incl.md5 index 1c1fdc93..b0488834 100644 --- a/_x_b_o_x_r_e_c_v_8cpp__incl.md5 +++ b/_x_b_o_x_r_e_c_v_8cpp__incl.md5 @@ -1 +1 @@ -bfbd5b9c880d6b279e7fd3a120aaed59 \ No newline at end of file +afd0356fb2e414737dbcea38c7c8282b \ No newline at end of file diff --git a/_x_b_o_x_r_e_c_v_8cpp__incl.png b/_x_b_o_x_r_e_c_v_8cpp__incl.png index a536b6d2165f5e25388772ae0a6a054ba6915e6b..c5fd77b577fe6bb656d7ca49f508f58f4015e8b5 100644 GIT binary patch literal 8024 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 E0q**)tN;K2 literal 8895 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 diff --git a/_x_b_o_x_r_e_c_v_8cpp_source.html b/_x_b_o_x_r_e_c_v_8cpp_source.html index b1eb2a55..573b8e3a 100644 --- a/_x_b_o_x_r_e_c_v_8cpp_source.html +++ b/_x_b_o_x_r_e_c_v_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,591 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXRECV.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16 
    -
    17  getBatteryLevel and checkStatus functions made by timstamp.co.uk found using BusHound from Perisoft.net
    -
    18  */
    -
    19 
    -
    20 #include "XBOXRECV.h"
    -
    21 // To enable serial debugging see "settings.h"
    -
    22 //#define EXTRADEBUG // Uncomment to get even more debugging data
    -
    23 //#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
    -
    24 
    - -
    26 pUsb(p), // pointer to USB class instance - mandatory
    -
    27 bAddress(0), // device address - mandatory
    -
    28 bPollEnable(false) { // don't start polling before dongle is connected
    -
    29  for(uint8_t i = 0; i < XBOX_MAX_ENDPOINTS; i++) {
    -
    30  epInfo[i].epAddr = 0;
    -
    31  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    32  epInfo[i].bmSndToggle = 0;
    -
    33  epInfo[i].bmRcvToggle = 0;
    - -
    35  }
    -
    36 
    -
    37  if(pUsb) // register in USB subsystem
    -
    38  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    -
    39 }
    -
    40 
    -
    41 uint8_t XBOXRECV::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    42  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    43  uint8_t buf[constBufSize];
    -
    44  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    45  uint8_t rcode;
    -
    46  UsbDevice *p = NULL;
    -
    47  EpInfo *oldep_ptr = NULL;
    -
    48  uint16_t PID, VID;
    -
    49 
    -
    50  AddressPool &addrPool = pUsb->GetAddressPool(); // Get memory address of USB device address pool
    -
    51 #ifdef EXTRADEBUG
    -
    52  Notify(PSTR("\r\nXBOXRECV Init"), 0x80);
    -
    53 #endif
    -
    54 
    -
    55  if(bAddress) { // Check if address has already been assigned to an instance
    -
    56 #ifdef DEBUG_USB_HOST
    -
    57  Notify(PSTR("\r\nAddress in use"), 0x80);
    -
    58 #endif
    - -
    60  }
    -
    61 
    -
    62  p = addrPool.GetUsbDevicePtr(0); // Get pointer to pseudo device with address 0 assigned
    -
    63 
    -
    64  if(!p) {
    -
    65 #ifdef DEBUG_USB_HOST
    -
    66  Notify(PSTR("\r\nAddress not found"), 0x80);
    -
    67 #endif
    - -
    69  }
    -
    70 
    -
    71  if(!p->epinfo) {
    -
    72 #ifdef DEBUG_USB_HOST
    -
    73  Notify(PSTR("\r\nepinfo is null"), 0x80);
    -
    74 #endif
    - -
    76  }
    -
    77 
    -
    78  oldep_ptr = p->epinfo; // Save old pointer to EP_RECORD of address 0
    -
    79  p->epinfo = epInfo; // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    80  p->lowspeed = lowspeed;
    -
    81 
    -
    82  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    -
    83 
    -
    84  p->epinfo = oldep_ptr; // Restore p->epinfo
    -
    85 
    -
    86  if(rcode)
    -
    87  goto FailGetDevDescr;
    -
    88 
    -
    89  VID = udd->idVendor;
    -
    90  PID = udd->idProduct;
    -
    91 
    -
    92  if((VID != XBOX_VID && VID != MADCATZ_VID && VID != JOYTECH_VID) || (PID != XBOX_WIRELESS_RECEIVER_PID && PID != XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID)) { // Check if it's a Xbox receiver using the Vendor ID and Product ID
    -
    93 #ifdef DEBUG_USB_HOST
    -
    94  Notify(PSTR("\r\nYou'll need a wireless receiver for this libary to work"), 0x80);
    -
    95 #endif
    -
    96  goto FailUnknownDevice;
    -
    97  }
    -
    98 
    -
    99  bAddress = addrPool.AllocAddress(parent, false, port); // Allocate new address according to device class
    -
    100 
    -
    101  if(!bAddress) {
    -
    102 #ifdef DEBUG_USB_HOST
    -
    103  Notify(PSTR("\r\nOut of address space"), 0x80);
    -
    104 #endif
    - -
    106  }
    -
    107 
    -
    108  epInfo[0].maxPktSize = udd->bMaxPacketSize0; // Extract Max Packet Size from device descriptor
    -
    109 
    -
    110  delay(20); // Wait a little before resetting device
    -
    111 
    - -
    113 
    -
    114  /* Diagnostic messages */
    -
    115 FailGetDevDescr:
    -
    116 #ifdef DEBUG_USB_HOST
    -
    117  NotifyFailGetDevDescr(rcode);
    -
    118 #endif
    -
    119  if(rcode != hrJERR)
    - -
    121  goto Fail;
    -
    122 
    -
    123 FailUnknownDevice:
    -
    124 #ifdef DEBUG_USB_HOST
    -
    125  NotifyFailUnknownDevice(VID, PID);
    -
    126 #endif
    - -
    128 
    -
    129 Fail:
    -
    130 #ifdef DEBUG_USB_HOST
    -
    131  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    -
    132  NotifyFail(rcode);
    -
    133 #endif
    -
    134  Release();
    -
    135  return rcode;
    -
    136 };
    -
    137 
    -
    138 uint8_t XBOXRECV::Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed) {
    -
    139  uint8_t rcode;
    -
    140 
    -
    141  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    142 #ifdef EXTRADEBUG
    -
    143  Notify(PSTR("\r\nBTD Init"), 0x80);
    -
    144 #endif
    -
    145  UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
    -
    146 
    -
    147  if(!p) {
    -
    148 #ifdef DEBUG_USB_HOST
    -
    149  Notify(PSTR("\r\nAddress not found"), 0x80);
    -
    150 #endif
    - -
    152  }
    -
    153 
    -
    154  delay(300); // Assign new address to the device
    -
    155 
    -
    156  rcode = pUsb->setAddr(0, 0, bAddress); // Assign new address to the device
    -
    157  if(rcode) {
    -
    158 #ifdef DEBUG_USB_HOST
    -
    159  Notify(PSTR("\r\nsetAddr: "), 0x80);
    -
    160  D_PrintHex<uint8_t > (rcode, 0x80);
    -
    161 #endif
    -
    162  p->lowspeed = false;
    -
    163  goto Fail;
    -
    164  }
    -
    165 #ifdef EXTRADEBUG
    -
    166  Notify(PSTR("\r\nAddr: "), 0x80);
    -
    167  D_PrintHex<uint8_t > (bAddress, 0x80);
    -
    168 #endif
    -
    169 
    -
    170  p->lowspeed = false;
    -
    171 
    -
    172  p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
    -
    173  if(!p) {
    -
    174 #ifdef DEBUG_USB_HOST
    -
    175  Notify(PSTR("\r\nAddress not found"), 0x80);
    -
    176 #endif
    - -
    178  }
    -
    179 
    -
    180  p->lowspeed = lowspeed;
    -
    181 
    -
    182  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo); // Assign epInfo to epinfo pointer - only EP0 is known
    -
    183  if(rcode)
    -
    184  goto FailSetDevTblEntry;
    -
    185 
    -
    186  /* The application will work in reduced host mode, so we can save program and data
    -
    187  memory space. After verifying the VID we will use known values for the
    -
    188  configuration values for device, interface, endpoints and HID for the XBOX360 Wireless receiver */
    -
    189 
    -
    190  /* Initialize data structures for endpoints of device */
    -
    191  epInfo[ XBOX_INPUT_PIPE_1 ].epAddr = 0x01; // XBOX 360 report endpoint - poll interval 1ms
    - -
    193  epInfo[ XBOX_INPUT_PIPE_1 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    197  epInfo[ XBOX_OUTPUT_PIPE_1 ].epAddr = 0x01; // XBOX 360 output endpoint - poll interval 8ms
    - -
    199  epInfo[ XBOX_OUTPUT_PIPE_1 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    203 
    -
    204  epInfo[ XBOX_INPUT_PIPE_2 ].epAddr = 0x03; // XBOX 360 report endpoint - poll interval 1ms
    - -
    206  epInfo[ XBOX_INPUT_PIPE_2 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    210  epInfo[ XBOX_OUTPUT_PIPE_2 ].epAddr = 0x03; // XBOX 360 output endpoint - poll interval 8ms
    - -
    212  epInfo[ XBOX_OUTPUT_PIPE_2 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    216 
    -
    217  epInfo[ XBOX_INPUT_PIPE_3 ].epAddr = 0x05; // XBOX 360 report endpoint - poll interval 1ms
    - -
    219  epInfo[ XBOX_INPUT_PIPE_3 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    223  epInfo[ XBOX_OUTPUT_PIPE_3 ].epAddr = 0x05; // XBOX 360 output endpoint - poll interval 8ms
    - -
    225  epInfo[ XBOX_OUTPUT_PIPE_3 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    229 
    -
    230  epInfo[ XBOX_INPUT_PIPE_4 ].epAddr = 0x07; // XBOX 360 report endpoint - poll interval 1ms
    - -
    232  epInfo[ XBOX_INPUT_PIPE_4 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    236  epInfo[ XBOX_OUTPUT_PIPE_4 ].epAddr = 0x07; // XBOX 360 output endpoint - poll interval 8ms
    - -
    238  epInfo[ XBOX_OUTPUT_PIPE_4 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    242 
    -
    243  rcode = pUsb->setEpInfoEntry(bAddress, 9, epInfo);
    -
    244  if(rcode)
    -
    245  goto FailSetDevTblEntry;
    -
    246 
    -
    247  delay(200); //Give time for address change
    -
    248 
    -
    249  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_CONTROL_PIPE ].epAddr, 1);
    -
    250  if(rcode)
    -
    251  goto FailSetConfDescr;
    -
    252 
    -
    253 #ifdef DEBUG_USB_HOST
    -
    254  Notify(PSTR("\r\nXbox Wireless Receiver Connected\r\n"), 0x80);
    -
    255 #endif
    -
    256  XboxReceiverConnected = true;
    -
    257  bPollEnable = true;
    -
    258  checkStatusTimer = 0; // Reset timer
    -
    259  return 0; // Successful configuration
    -
    260 
    -
    261  /* Diagnostic messages */
    -
    262 FailSetDevTblEntry:
    -
    263 #ifdef DEBUG_USB_HOST
    - -
    265  goto Fail;
    -
    266 #endif
    -
    267 
    -
    268 FailSetConfDescr:
    -
    269 #ifdef DEBUG_USB_HOST
    - -
    271 #endif
    -
    272 
    -
    273 Fail:
    -
    274 #ifdef DEBUG_USB_HOST
    -
    275  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    -
    276  NotifyFail(rcode);
    -
    277 #endif
    -
    278  Release();
    -
    279  return rcode;
    -
    280 }
    -
    281 
    -
    282 /* Performs a cleanup after failed Init() attempt */
    -
    283 uint8_t XBOXRECV::Release() {
    -
    284  XboxReceiverConnected = false;
    -
    285  for(uint8_t i = 0; i < 4; i++)
    -
    286  Xbox360Connected[i] = 0x00;
    - -
    288  bAddress = 0;
    -
    289  bPollEnable = false;
    -
    290  return 0;
    -
    291 }
    -
    292 
    -
    293 uint8_t XBOXRECV::Poll() {
    -
    294  if(!bPollEnable)
    -
    295  return 0;
    -
    296  if(!checkStatusTimer || ((int32_t)((uint32_t)millis() - checkStatusTimer) > 3000)) { // Run checkStatus every 3 seconds
    -
    297  checkStatusTimer = (uint32_t)millis();
    -
    298  checkStatus();
    -
    299  }
    -
    300 
    -
    301  uint8_t inputPipe;
    -
    302  uint16_t bufferSize;
    -
    303  for(uint8_t i = 0; i < 4; i++) {
    -
    304  if(i == 0)
    -
    305  inputPipe = XBOX_INPUT_PIPE_1;
    -
    306  else if(i == 1)
    -
    307  inputPipe = XBOX_INPUT_PIPE_2;
    -
    308  else if(i == 2)
    -
    309  inputPipe = XBOX_INPUT_PIPE_3;
    -
    310  else
    -
    311  inputPipe = XBOX_INPUT_PIPE_4;
    -
    312 
    -
    313  bufferSize = EP_MAXPKTSIZE; // This is the maximum number of bytes we want to receive
    -
    314  pUsb->inTransfer(bAddress, epInfo[ inputPipe ].epAddr, &bufferSize, readBuf);
    -
    315  if(bufferSize > 0) { // The number of received bytes
    -
    316 #ifdef EXTRADEBUG
    -
    317  Notify(PSTR("Bytes Received: "), 0x80);
    -
    318  D_PrintHex<uint16_t > (bufferSize, 0x80);
    -
    319  Notify(PSTR("\r\n"), 0x80);
    -
    320 #endif
    -
    321  readReport(i);
    -
    322 #ifdef PRINTREPORT
    -
    323  printReport(i, bufferSize); // Uncomment "#define PRINTREPORT" to print the report send by the Xbox 360 Controller
    -
    324 #endif
    -
    325  }
    -
    326  }
    -
    327  return 0;
    -
    328 }
    -
    329 
    -
    330 void XBOXRECV::readReport(uint8_t controller) {
    -
    331  if(readBuf == NULL)
    -
    332  return;
    -
    333  // This report is send when a controller is connected and disconnected
    -
    334  if(readBuf[0] == 0x08 && readBuf[1] != Xbox360Connected[controller]) {
    -
    335  Xbox360Connected[controller] = readBuf[1];
    -
    336 #ifdef DEBUG_USB_HOST
    -
    337  Notify(PSTR("Controller "), 0x80);
    -
    338  Notify(controller, 0x80);
    -
    339 #endif
    -
    340  if(Xbox360Connected[controller]) {
    -
    341 #ifdef DEBUG_USB_HOST
    -
    342  const char* str = 0;
    -
    343  switch(readBuf[1]) {
    -
    344  case 0x80: str = PSTR(" as controller\r\n");
    -
    345  break;
    -
    346  case 0x40: str = PSTR(" as headset\r\n");
    -
    347  break;
    -
    348  case 0xC0: str = PSTR(" as controller+headset\r\n");
    -
    349  break;
    -
    350  }
    -
    351  Notify(PSTR(": connected"), 0x80);
    -
    352  Notify(str, 0x80);
    -
    353 #endif
    -
    354  onInit(controller);
    -
    355  }
    -
    356 #ifdef DEBUG_USB_HOST
    -
    357  else
    -
    358  Notify(PSTR(": disconnected\r\n"), 0x80);
    -
    359 #endif
    -
    360  return;
    -
    361  }
    -
    362  // Controller status report
    -
    363  if(readBuf[1] == 0x00 && readBuf[3] & 0x13 && readBuf[4] >= 0x22) {
    -
    364  controllerStatus[controller] = ((uint16_t)readBuf[3] << 8) | readBuf[4];
    -
    365  return;
    -
    366  }
    -
    367  if(readBuf[1] != 0x01) // Check if it's the correct report - the receiver also sends different status reports
    -
    368  return;
    -
    369 
    -
    370  // A controller must be connected if it's sending data
    -
    371  if(!Xbox360Connected[controller])
    -
    372  Xbox360Connected[controller] |= 0x80;
    -
    373 
    -
    374  ButtonState[controller] = (uint32_t)(readBuf[9] | ((uint16_t)readBuf[8] << 8) | ((uint32_t)readBuf[7] << 16) | ((uint32_t)readBuf[6] << 24));
    -
    375 
    -
    376  hatValue[controller][LeftHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
    -
    377  hatValue[controller][LeftHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
    -
    378  hatValue[controller][RightHatX] = (int16_t)(((uint16_t)readBuf[15] << 8) | readBuf[14]);
    -
    379  hatValue[controller][RightHatY] = (int16_t)(((uint16_t)readBuf[17] << 8) | readBuf[16]);
    -
    380 
    -
    381  //Notify(PSTR("\r\nButtonState: "), 0x80);
    -
    382  //PrintHex<uint32_t>(ButtonState[controller], 0x80);
    -
    383 
    -
    384  if(ButtonState[controller] != OldButtonState[controller]) {
    -
    385  buttonStateChanged[controller] = true;
    -
    386  ButtonClickState[controller] = (ButtonState[controller] >> 16) & ((~OldButtonState[controller]) >> 16); // Update click state variable, but don't include the two trigger buttons L2 and R2
    -
    387  if(((uint8_t)OldButtonState[controller]) == 0 && ((uint8_t)ButtonState[controller]) != 0) // The L2 and R2 buttons are special as they are analog buttons
    -
    388  R2Clicked[controller] = true;
    -
    389  if((uint8_t)(OldButtonState[controller] >> 8) == 0 && (uint8_t)(ButtonState[controller] >> 8) != 0)
    -
    390  L2Clicked[controller] = true;
    -
    391  OldButtonState[controller] = ButtonState[controller];
    -
    392  }
    -
    393 }
    -
    394 
    -
    395 void XBOXRECV::printReport(uint8_t controller __attribute__((unused)), uint8_t nBytes __attribute__((unused))) { //Uncomment "#define PRINTREPORT" to print the report send by the Xbox 360 Controller
    -
    396 #ifdef PRINTREPORT
    -
    397  if(readBuf == NULL)
    -
    398  return;
    -
    399  Notify(PSTR("Controller "), 0x80);
    -
    400  Notify(controller, 0x80);
    -
    401  Notify(PSTR(": "), 0x80);
    -
    402  for(uint8_t i = 0; i < nBytes; i++) {
    -
    403  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    -
    404  Notify(PSTR(" "), 0x80);
    -
    405  }
    -
    406  Notify(PSTR("\r\n"), 0x80);
    -
    407 #endif
    -
    408 }
    -
    409 
    -
    410 uint8_t XBOXRECV::getButtonPress(ButtonEnum b, uint8_t controller) {
    -
    411  if(b == L2) // These are analog buttons
    -
    412  return (uint8_t)(ButtonState[controller] >> 8);
    -
    413  else if(b == R2)
    -
    414  return (uint8_t)ButtonState[controller];
    -
    415  return (bool)(ButtonState[controller] & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]) << 16));
    -
    416 }
    -
    417 
    -
    418 bool XBOXRECV::getButtonClick(ButtonEnum b, uint8_t controller) {
    -
    419  if(b == L2) {
    -
    420  if(L2Clicked[controller]) {
    -
    421  L2Clicked[controller] = false;
    -
    422  return true;
    -
    423  }
    -
    424  return false;
    -
    425  } else if(b == R2) {
    -
    426  if(R2Clicked[controller]) {
    -
    427  R2Clicked[controller] = false;
    -
    428  return true;
    -
    429  }
    -
    430  return false;
    -
    431  }
    -
    432  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    -
    433  bool click = (ButtonClickState[controller] & button);
    -
    434  ButtonClickState[controller] &= ~button; // clear "click" event
    -
    435  return click;
    -
    436 }
    -
    437 
    -
    438 int16_t XBOXRECV::getAnalogHat(AnalogHatEnum a, uint8_t controller) {
    -
    439  return hatValue[controller][a];
    -
    440 }
    -
    441 
    -
    442 bool XBOXRECV::buttonChanged(uint8_t controller) {
    -
    443  bool state = buttonStateChanged[controller];
    -
    444  buttonStateChanged[controller] = false;
    -
    445  return state;
    -
    446 }
    -
    447 
    -
    448 /*
    -
    449 ControllerStatus Breakdown
    -
    450 ControllerStatus[controller] & 0x0001 // 0
    -
    451 ControllerStatus[controller] & 0x0002 // normal batteries, no rechargeable battery pack
    -
    452 ControllerStatus[controller] & 0x0004 // controller starting up / settling
    -
    453 ControllerStatus[controller] & 0x0008 // headset adapter plugged in, but no headphones connected (mute?)
    -
    454 ControllerStatus[controller] & 0x0010 // 0
    -
    455 ControllerStatus[controller] & 0x0020 // 1
    -
    456 ControllerStatus[controller] & 0x0040 // battery level (high bit)
    -
    457 ControllerStatus[controller] & 0x0080 // battery level (low bit)
    -
    458 ControllerStatus[controller] & 0x0100 // 1
    -
    459 ControllerStatus[controller] & 0x0200 // 1
    -
    460 ControllerStatus[controller] & 0x0400 // headset adapter plugged in
    -
    461 ControllerStatus[controller] & 0x0800 // 0
    -
    462 ControllerStatus[controller] & 0x1000 // 1
    -
    463 ControllerStatus[controller] & 0x2000 // 0
    -
    464 ControllerStatus[controller] & 0x4000 // 0
    -
    465 ControllerStatus[controller] & 0x8000 // 0
    -
    466  */
    -
    467 uint8_t XBOXRECV::getBatteryLevel(uint8_t controller) {
    -
    468  return ((controllerStatus[controller] & 0x00C0) >> 6);
    -
    469 }
    -
    470 
    -
    471 void XBOXRECV::XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes) {
    -
    472 #ifdef EXTRADEBUG
    -
    473  uint8_t rcode;
    -
    474 #endif
    -
    475  uint8_t outputPipe;
    -
    476  switch(controller) {
    -
    477  case 0: outputPipe = XBOX_OUTPUT_PIPE_1;
    -
    478  break;
    -
    479  case 1: outputPipe = XBOX_OUTPUT_PIPE_2;
    -
    480  break;
    -
    481  case 2: outputPipe = XBOX_OUTPUT_PIPE_3;
    -
    482  break;
    -
    483  case 3: outputPipe = XBOX_OUTPUT_PIPE_4;
    -
    484  break;
    -
    485  default:
    -
    486  return;
    -
    487  }
    -
    488 #ifdef EXTRADEBUG
    -
    489  rcode =
    -
    490 #endif
    -
    491  pUsb->outTransfer(bAddress, epInfo[ outputPipe ].epAddr, nbytes, data);
    -
    492 #ifdef EXTRADEBUG
    -
    493  if(rcode)
    -
    494  Notify(PSTR("Error sending Xbox message\r\n"), 0x80);
    -
    495 #endif
    -
    496 }
    -
    497 
    -
    498 void XBOXRECV::disconnect(uint8_t controller) {
    -
    499  writeBuf[0] = 0x00;
    -
    500  writeBuf[1] = 0x00;
    -
    501  writeBuf[2] = 0x08;
    -
    502  writeBuf[3] = 0xC0;
    -
    503 
    -
    504  XboxCommand(controller, writeBuf, 4);
    -
    505 }
    -
    506 
    -
    507 void XBOXRECV::setLedRaw(uint8_t value, uint8_t controller) {
    -
    508  writeBuf[0] = 0x00;
    -
    509  writeBuf[1] = 0x00;
    -
    510  writeBuf[2] = 0x08;
    -
    511  writeBuf[3] = value | 0x40;
    -
    512 
    -
    513  XboxCommand(controller, writeBuf, 4);
    -
    514 }
    -
    515 
    -
    516 void XBOXRECV::setLedOn(LEDEnum led, uint8_t controller) {
    -
    517  if(led == OFF)
    -
    518  setLedRaw(0, controller);
    -
    519  else if(led != ALL) // All LEDs can't be on a the same time
    -
    520  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4, controller);
    -
    521 }
    -
    522 
    -
    523 void XBOXRECV::setLedBlink(LEDEnum led, uint8_t controller) {
    -
    524  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]), controller);
    -
    525 }
    -
    526 
    -
    527 void XBOXRECV::setLedMode(LEDModeEnum ledMode, uint8_t controller) { // This function is used to do some speciel LED stuff the controller supports
    -
    528  setLedRaw((uint8_t)ledMode, controller);
    -
    529 }
    -
    530 
    -
    531 /* PC runs this at interval of approx 2 seconds
    -
    532 Thanks to BusHound from Perisoft.net for the Windows USB Analysis output
    -
    533 Found by timstamp.co.uk
    -
    534  */
    -
    535 void XBOXRECV::checkStatus() {
    -
    536  if(!bPollEnable)
    -
    537  return;
    -
    538  // Get controller info
    -
    539  writeBuf[0] = 0x08;
    -
    540  writeBuf[1] = 0x00;
    -
    541  writeBuf[2] = 0x0f;
    -
    542  writeBuf[3] = 0xc0;
    -
    543  for(uint8_t i = 0; i < 4; i++) {
    -
    544  XboxCommand(i, writeBuf, 4);
    -
    545  }
    -
    546  // Get battery status
    -
    547  writeBuf[0] = 0x00;
    -
    548  writeBuf[1] = 0x00;
    -
    549  writeBuf[2] = 0x00;
    -
    550  writeBuf[3] = 0x40;
    -
    551  for(uint8_t i = 0; i < 4; i++) {
    -
    552  if(Xbox360Connected[i])
    -
    553  XboxCommand(i, writeBuf, 4);
    -
    554  }
    -
    555 }
    -
    556 
    -
    557 void XBOXRECV::setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller) {
    -
    558  writeBuf[0] = 0x00;
    -
    559  writeBuf[1] = 0x01;
    -
    560  writeBuf[2] = 0x0f;
    -
    561  writeBuf[3] = 0xc0;
    -
    562  writeBuf[4] = 0x00;
    -
    563  writeBuf[5] = lValue; // big weight
    -
    564  writeBuf[6] = rValue; // small weight
    -
    565 
    -
    566  XboxCommand(controller, writeBuf, 7);
    -
    567 }
    -
    568 
    -
    569 void XBOXRECV::onInit(uint8_t controller) {
    -
    570  if(pFuncOnInit)
    -
    571  pFuncOnInit(); // Call the user function
    -
    572  else {
    -
    573  LEDEnum led;
    -
    574  if(controller == 0)
    -
    575  led = static_cast<LEDEnum>(LED1);
    -
    576  else if(controller == 1)
    -
    577  led = static_cast<LEDEnum>(LED2);
    -
    578  else if(controller == 2)
    -
    579  led = static_cast<LEDEnum>(LED3);
    -
    580  else
    -
    581  led = static_cast<LEDEnum>(LED4);
    -
    582  setLedOn(led, controller);
    -
    583  }
    -
    584 }
    -
    uint8_t bmRcvToggle
    Definition: address.h:48
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16 
    17  getBatteryLevel and checkStatus functions made by timstamp.co.uk found using BusHound from Perisoft.net
    18  */
    19 
    20 #include "XBOXRECV.h"
    21 // To enable serial debugging see "settings.h"
    22 //#define EXTRADEBUG // Uncomment to get even more debugging data
    23 //#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
    24 
    26 pUsb(p), // pointer to USB class instance - mandatory
    27 bAddress(0), // device address - mandatory
    28 bPollEnable(false) { // don't start polling before dongle is connected
    29  for(uint8_t i = 0; i < XBOX_MAX_ENDPOINTS; i++) {
    30  epInfo[i].epAddr = 0;
    31  epInfo[i].maxPktSize = (i) ? 0 : 8;
    32  epInfo[i].bmSndToggle = 0;
    33  epInfo[i].bmRcvToggle = 0;
    35  }
    36 
    37  if(pUsb) // register in USB subsystem
    38  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    39 }
    40 
    41 uint8_t XBOXRECV::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
    42  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    43  uint8_t buf[constBufSize];
    44  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    45  uint8_t rcode;
    46  UsbDevice *p = NULL;
    47  EpInfo *oldep_ptr = NULL;
    48  uint16_t PID, VID;
    49 
    50  AddressPool &addrPool = pUsb->GetAddressPool(); // Get memory address of USB device address pool
    51 #ifdef EXTRADEBUG
    52  Notify(PSTR("\r\nXBOXRECV Init"), 0x80);
    53 #endif
    54 
    55  if(bAddress) { // Check if address has already been assigned to an instance
    56 #ifdef DEBUG_USB_HOST
    57  Notify(PSTR("\r\nAddress in use"), 0x80);
    58 #endif
    60  }
    61 
    62  p = addrPool.GetUsbDevicePtr(0); // Get pointer to pseudo device with address 0 assigned
    63 
    64  if(!p) {
    65 #ifdef DEBUG_USB_HOST
    66  Notify(PSTR("\r\nAddress not found"), 0x80);
    67 #endif
    69  }
    70 
    71  if(!p->epinfo) {
    72 #ifdef DEBUG_USB_HOST
    73  Notify(PSTR("\r\nepinfo is null"), 0x80);
    74 #endif
    76  }
    77 
    78  oldep_ptr = p->epinfo; // Save old pointer to EP_RECORD of address 0
    79  p->epinfo = epInfo; // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    80  p->lowspeed = lowspeed;
    81 
    82  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    83 
    84  p->epinfo = oldep_ptr; // Restore p->epinfo
    85 
    86  if(rcode)
    87  goto FailGetDevDescr;
    88 
    89  VID = udd->idVendor;
    90  PID = udd->idProduct;
    91 
    92  if((VID != XBOX_VID && VID != MADCATZ_VID && VID != JOYTECH_VID) || (PID != XBOX_WIRELESS_RECEIVER_PID && PID != XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID)) { // Check if it's a Xbox receiver using the Vendor ID and Product ID
    93 #ifdef DEBUG_USB_HOST
    94  Notify(PSTR("\r\nYou'll need a wireless receiver for this libary to work"), 0x80);
    95 #endif
    96  goto FailUnknownDevice;
    97  }
    98 
    99  bAddress = addrPool.AllocAddress(parent, false, port); // Allocate new address according to device class
    100 
    101  if(!bAddress) {
    102 #ifdef DEBUG_USB_HOST
    103  Notify(PSTR("\r\nOut of address space"), 0x80);
    104 #endif
    106  }
    107 
    108  epInfo[0].maxPktSize = udd->bMaxPacketSize0; // Extract Max Packet Size from device descriptor
    109 
    110  delay(20); // Wait a little before resetting device
    111 
    113 
    114  /* Diagnostic messages */
    115 FailGetDevDescr:
    116 #ifdef DEBUG_USB_HOST
    117  NotifyFailGetDevDescr(rcode);
    118 #endif
    119  if(rcode != hrJERR)
    121  goto Fail;
    122 
    123 FailUnknownDevice:
    124 #ifdef DEBUG_USB_HOST
    125  NotifyFailUnknownDevice(VID, PID);
    126 #endif
    128 
    129 Fail:
    130 #ifdef DEBUG_USB_HOST
    131  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    132  NotifyFail(rcode);
    133 #endif
    134  Release();
    135  return rcode;
    136 };
    137 
    138 uint8_t XBOXRECV::Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed) {
    139  uint8_t rcode;
    140 
    141  AddressPool &addrPool = pUsb->GetAddressPool();
    142 #ifdef EXTRADEBUG
    143  Notify(PSTR("\r\nBTD Init"), 0x80);
    144 #endif
    145  UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
    146 
    147  if(!p) {
    148 #ifdef DEBUG_USB_HOST
    149  Notify(PSTR("\r\nAddress not found"), 0x80);
    150 #endif
    152  }
    153 
    154  delay(300); // Assign new address to the device
    155 
    156  rcode = pUsb->setAddr(0, 0, bAddress); // Assign new address to the device
    157  if(rcode) {
    158 #ifdef DEBUG_USB_HOST
    159  Notify(PSTR("\r\nsetAddr: "), 0x80);
    160  D_PrintHex<uint8_t > (rcode, 0x80);
    161 #endif
    162  p->lowspeed = false;
    163  goto Fail;
    164  }
    165 #ifdef EXTRADEBUG
    166  Notify(PSTR("\r\nAddr: "), 0x80);
    167  D_PrintHex<uint8_t > (bAddress, 0x80);
    168 #endif
    169 
    170  p->lowspeed = false;
    171 
    172  p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
    173  if(!p) {
    174 #ifdef DEBUG_USB_HOST
    175  Notify(PSTR("\r\nAddress not found"), 0x80);
    176 #endif
    178  }
    179 
    180  p->lowspeed = lowspeed;
    181 
    182  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo); // Assign epInfo to epinfo pointer - only EP0 is known
    183  if(rcode)
    184  goto FailSetDevTblEntry;
    185 
    186  /* The application will work in reduced host mode, so we can save program and data
    187  memory space. After verifying the VID we will use known values for the
    188  configuration values for device, interface, endpoints and HID for the XBOX360 Wireless receiver */
    189 
    190  /* Initialize data structures for endpoints of device */
    191  epInfo[ XBOX_INPUT_PIPE_1 ].epAddr = 0x01; // XBOX 360 report endpoint - poll interval 1ms
    193  epInfo[ XBOX_INPUT_PIPE_1 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    197  epInfo[ XBOX_OUTPUT_PIPE_1 ].epAddr = 0x01; // XBOX 360 output endpoint - poll interval 8ms
    199  epInfo[ XBOX_OUTPUT_PIPE_1 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    203 
    204  epInfo[ XBOX_INPUT_PIPE_2 ].epAddr = 0x03; // XBOX 360 report endpoint - poll interval 1ms
    206  epInfo[ XBOX_INPUT_PIPE_2 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    210  epInfo[ XBOX_OUTPUT_PIPE_2 ].epAddr = 0x03; // XBOX 360 output endpoint - poll interval 8ms
    212  epInfo[ XBOX_OUTPUT_PIPE_2 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    216 
    217  epInfo[ XBOX_INPUT_PIPE_3 ].epAddr = 0x05; // XBOX 360 report endpoint - poll interval 1ms
    219  epInfo[ XBOX_INPUT_PIPE_3 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    223  epInfo[ XBOX_OUTPUT_PIPE_3 ].epAddr = 0x05; // XBOX 360 output endpoint - poll interval 8ms
    225  epInfo[ XBOX_OUTPUT_PIPE_3 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    229 
    230  epInfo[ XBOX_INPUT_PIPE_4 ].epAddr = 0x07; // XBOX 360 report endpoint - poll interval 1ms
    232  epInfo[ XBOX_INPUT_PIPE_4 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    236  epInfo[ XBOX_OUTPUT_PIPE_4 ].epAddr = 0x07; // XBOX 360 output endpoint - poll interval 8ms
    238  epInfo[ XBOX_OUTPUT_PIPE_4 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    242 
    243  rcode = pUsb->setEpInfoEntry(bAddress, 9, epInfo);
    244  if(rcode)
    245  goto FailSetDevTblEntry;
    246 
    247  delay(200); //Give time for address change
    248 
    249  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_CONTROL_PIPE ].epAddr, 1);
    250  if(rcode)
    251  goto FailSetConfDescr;
    252 
    253 #ifdef DEBUG_USB_HOST
    254  Notify(PSTR("\r\nXbox Wireless Receiver Connected\r\n"), 0x80);
    255 #endif
    256  XboxReceiverConnected = true;
    257  bPollEnable = true;
    258  checkStatusTimer = 0; // Reset timer
    259  return 0; // Successful configuration
    260 
    261  /* Diagnostic messages */
    262 FailSetDevTblEntry:
    263 #ifdef DEBUG_USB_HOST
    265  goto Fail;
    266 #endif
    267 
    268 FailSetConfDescr:
    269 #ifdef DEBUG_USB_HOST
    271 #endif
    272 
    273 Fail:
    274 #ifdef DEBUG_USB_HOST
    275  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    276  NotifyFail(rcode);
    277 #endif
    278  Release();
    279  return rcode;
    280 }
    281 
    282 /* Performs a cleanup after failed Init() attempt */
    283 uint8_t XBOXRECV::Release() {
    284  XboxReceiverConnected = false;
    285  for(uint8_t i = 0; i < 4; i++)
    286  Xbox360Connected[i] = 0x00;
    288  bAddress = 0;
    289  bPollEnable = false;
    290  return 0;
    291 }
    292 
    293 uint8_t XBOXRECV::Poll() {
    294  if(!bPollEnable)
    295  return 0;
    296  if(!checkStatusTimer || ((int32_t)((uint32_t)millis() - checkStatusTimer) > 3000)) { // Run checkStatus every 3 seconds
    297  checkStatusTimer = (uint32_t)millis();
    298  checkStatus();
    299  }
    300 
    301  uint8_t inputPipe;
    302  uint16_t bufferSize;
    303  for(uint8_t i = 0; i < 4; i++) {
    304  if(i == 0)
    305  inputPipe = XBOX_INPUT_PIPE_1;
    306  else if(i == 1)
    307  inputPipe = XBOX_INPUT_PIPE_2;
    308  else if(i == 2)
    309  inputPipe = XBOX_INPUT_PIPE_3;
    310  else
    311  inputPipe = XBOX_INPUT_PIPE_4;
    312 
    313  bufferSize = EP_MAXPKTSIZE; // This is the maximum number of bytes we want to receive
    314  pUsb->inTransfer(bAddress, epInfo[ inputPipe ].epAddr, &bufferSize, readBuf);
    315  if(bufferSize > 0) { // The number of received bytes
    316 #ifdef EXTRADEBUG
    317  Notify(PSTR("Bytes Received: "), 0x80);
    318  D_PrintHex<uint16_t > (bufferSize, 0x80);
    319  Notify(PSTR("\r\n"), 0x80);
    320 #endif
    321  readReport(i);
    322 #ifdef PRINTREPORT
    323  printReport(i, bufferSize); // Uncomment "#define PRINTREPORT" to print the report send by the Xbox 360 Controller
    324 #endif
    325  }
    326  }
    327  return 0;
    328 }
    329 
    330 void XBOXRECV::readReport(uint8_t controller) {
    331  if(readBuf == NULL)
    332  return;
    333  // This report is send when a controller is connected and disconnected
    334  if(readBuf[0] == 0x08 && readBuf[1] != Xbox360Connected[controller]) {
    335  Xbox360Connected[controller] = readBuf[1];
    336 #ifdef DEBUG_USB_HOST
    337  Notify(PSTR("Controller "), 0x80);
    338  Notify(controller, 0x80);
    339 #endif
    340  if(Xbox360Connected[controller]) {
    341 #ifdef DEBUG_USB_HOST
    342  const char* str = 0;
    343  switch(readBuf[1]) {
    344  case 0x80: str = PSTR(" as controller\r\n");
    345  break;
    346  case 0x40: str = PSTR(" as headset\r\n");
    347  break;
    348  case 0xC0: str = PSTR(" as controller+headset\r\n");
    349  break;
    350  }
    351  Notify(PSTR(": connected"), 0x80);
    352  Notify(str, 0x80);
    353 #endif
    354  onInit(controller);
    355  }
    356 #ifdef DEBUG_USB_HOST
    357  else
    358  Notify(PSTR(": disconnected\r\n"), 0x80);
    359 #endif
    360  return;
    361  }
    362  // Controller status report
    363  if(readBuf[1] == 0x00 && readBuf[3] & 0x13 && readBuf[4] >= 0x22) {
    364  controllerStatus[controller] = ((uint16_t)readBuf[3] << 8) | readBuf[4];
    365  return;
    366  }
    367  if(readBuf[1] != 0x01) // Check if it's the correct report - the receiver also sends different status reports
    368  return;
    369 
    370  // A controller must be connected if it's sending data
    371  if(!Xbox360Connected[controller])
    372  Xbox360Connected[controller] |= 0x80;
    373 
    374  ButtonState[controller] = (uint32_t)(readBuf[9] | ((uint16_t)readBuf[8] << 8) | ((uint32_t)readBuf[7] << 16) | ((uint32_t)readBuf[6] << 24));
    375 
    376  hatValue[controller][LeftHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
    377  hatValue[controller][LeftHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
    378  hatValue[controller][RightHatX] = (int16_t)(((uint16_t)readBuf[15] << 8) | readBuf[14]);
    379  hatValue[controller][RightHatY] = (int16_t)(((uint16_t)readBuf[17] << 8) | readBuf[16]);
    380 
    381  //Notify(PSTR("\r\nButtonState: "), 0x80);
    382  //PrintHex<uint32_t>(ButtonState[controller], 0x80);
    383 
    384  if(ButtonState[controller] != OldButtonState[controller]) {
    385  buttonStateChanged[controller] = true;
    386  ButtonClickState[controller] = (ButtonState[controller] >> 16) & ((~OldButtonState[controller]) >> 16); // Update click state variable, but don't include the two trigger buttons L2 and R2
    387  if(((uint8_t)OldButtonState[controller]) == 0 && ((uint8_t)ButtonState[controller]) != 0) // The L2 and R2 buttons are special as they are analog buttons
    388  R2Clicked[controller] = true;
    389  if((uint8_t)(OldButtonState[controller] >> 8) == 0 && (uint8_t)(ButtonState[controller] >> 8) != 0)
    390  L2Clicked[controller] = true;
    391  OldButtonState[controller] = ButtonState[controller];
    392  }
    393 }
    394 
    395 void XBOXRECV::printReport(uint8_t controller __attribute__((unused)), uint8_t nBytes __attribute__((unused))) { //Uncomment "#define PRINTREPORT" to print the report send by the Xbox 360 Controller
    396 #ifdef PRINTREPORT
    397  if(readBuf == NULL)
    398  return;
    399  Notify(PSTR("Controller "), 0x80);
    400  Notify(controller, 0x80);
    401  Notify(PSTR(": "), 0x80);
    402  for(uint8_t i = 0; i < nBytes; i++) {
    403  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    404  Notify(PSTR(" "), 0x80);
    405  }
    406  Notify(PSTR("\r\n"), 0x80);
    407 #endif
    408 }
    409 
    410 uint8_t XBOXRECV::getButtonPress(ButtonEnum b, uint8_t controller) {
    411  if(b == L2) // These are analog buttons
    412  return (uint8_t)(ButtonState[controller] >> 8);
    413  else if(b == R2)
    414  return (uint8_t)ButtonState[controller];
    415  return (bool)(ButtonState[controller] & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]) << 16));
    416 }
    417 
    418 bool XBOXRECV::getButtonClick(ButtonEnum b, uint8_t controller) {
    419  if(b == L2) {
    420  if(L2Clicked[controller]) {
    421  L2Clicked[controller] = false;
    422  return true;
    423  }
    424  return false;
    425  } else if(b == R2) {
    426  if(R2Clicked[controller]) {
    427  R2Clicked[controller] = false;
    428  return true;
    429  }
    430  return false;
    431  }
    432  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    433  bool click = (ButtonClickState[controller] & button);
    434  ButtonClickState[controller] &= ~button; // clear "click" event
    435  return click;
    436 }
    437 
    438 int16_t XBOXRECV::getAnalogHat(AnalogHatEnum a, uint8_t controller) {
    439  return hatValue[controller][a];
    440 }
    441 
    442 bool XBOXRECV::buttonChanged(uint8_t controller) {
    443  bool state = buttonStateChanged[controller];
    444  buttonStateChanged[controller] = false;
    445  return state;
    446 }
    447 
    448 /*
    449 ControllerStatus Breakdown
    450 ControllerStatus[controller] & 0x0001 // 0
    451 ControllerStatus[controller] & 0x0002 // normal batteries, no rechargeable battery pack
    452 ControllerStatus[controller] & 0x0004 // controller starting up / settling
    453 ControllerStatus[controller] & 0x0008 // headset adapter plugged in, but no headphones connected (mute?)
    454 ControllerStatus[controller] & 0x0010 // 0
    455 ControllerStatus[controller] & 0x0020 // 1
    456 ControllerStatus[controller] & 0x0040 // battery level (high bit)
    457 ControllerStatus[controller] & 0x0080 // battery level (low bit)
    458 ControllerStatus[controller] & 0x0100 // 1
    459 ControllerStatus[controller] & 0x0200 // 1
    460 ControllerStatus[controller] & 0x0400 // headset adapter plugged in
    461 ControllerStatus[controller] & 0x0800 // 0
    462 ControllerStatus[controller] & 0x1000 // 1
    463 ControllerStatus[controller] & 0x2000 // 0
    464 ControllerStatus[controller] & 0x4000 // 0
    465 ControllerStatus[controller] & 0x8000 // 0
    466  */
    467 uint8_t XBOXRECV::getBatteryLevel(uint8_t controller) {
    468  return ((controllerStatus[controller] & 0x00C0) >> 6);
    469 }
    470 
    471 void XBOXRECV::XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes) {
    472 #ifdef EXTRADEBUG
    473  uint8_t rcode;
    474 #endif
    475  uint8_t outputPipe;
    476  switch(controller) {
    477  case 0: outputPipe = XBOX_OUTPUT_PIPE_1;
    478  break;
    479  case 1: outputPipe = XBOX_OUTPUT_PIPE_2;
    480  break;
    481  case 2: outputPipe = XBOX_OUTPUT_PIPE_3;
    482  break;
    483  case 3: outputPipe = XBOX_OUTPUT_PIPE_4;
    484  break;
    485  default:
    486  return;
    487  }
    488 #ifdef EXTRADEBUG
    489  rcode =
    490 #endif
    491  pUsb->outTransfer(bAddress, epInfo[ outputPipe ].epAddr, nbytes, data);
    492 #ifdef EXTRADEBUG
    493  if(rcode)
    494  Notify(PSTR("Error sending Xbox message\r\n"), 0x80);
    495 #endif
    496 }
    497 
    498 void XBOXRECV::disconnect(uint8_t controller) {
    499  writeBuf[0] = 0x00;
    500  writeBuf[1] = 0x00;
    501  writeBuf[2] = 0x08;
    502  writeBuf[3] = 0xC0;
    503 
    504  XboxCommand(controller, writeBuf, 4);
    505 }
    506 
    507 void XBOXRECV::setLedRaw(uint8_t value, uint8_t controller) {
    508  writeBuf[0] = 0x00;
    509  writeBuf[1] = 0x00;
    510  writeBuf[2] = 0x08;
    511  writeBuf[3] = value | 0x40;
    512 
    513  XboxCommand(controller, writeBuf, 4);
    514 }
    515 
    516 void XBOXRECV::setLedOn(LEDEnum led, uint8_t controller) {
    517  if(led == OFF)
    518  setLedRaw(0, controller);
    519  else if(led != ALL) // All LEDs can't be on a the same time
    520  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4, controller);
    521 }
    522 
    523 void XBOXRECV::setLedBlink(LEDEnum led, uint8_t controller) {
    524  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]), controller);
    525 }
    526 
    527 void XBOXRECV::setLedMode(LEDModeEnum ledMode, uint8_t controller) { // This function is used to do some speciel LED stuff the controller supports
    528  setLedRaw((uint8_t)ledMode, controller);
    529 }
    530 
    531 /* PC runs this at interval of approx 2 seconds
    532 Thanks to BusHound from Perisoft.net for the Windows USB Analysis output
    533 Found by timstamp.co.uk
    534  */
    535 void XBOXRECV::checkStatus() {
    536  if(!bPollEnable)
    537  return;
    538  // Get controller info
    539  writeBuf[0] = 0x08;
    540  writeBuf[1] = 0x00;
    541  writeBuf[2] = 0x0f;
    542  writeBuf[3] = 0xc0;
    543  for(uint8_t i = 0; i < 4; i++) {
    544  XboxCommand(i, writeBuf, 4);
    545  }
    546  // Get battery status
    547  writeBuf[0] = 0x00;
    548  writeBuf[1] = 0x00;
    549  writeBuf[2] = 0x00;
    550  writeBuf[3] = 0x40;
    551  for(uint8_t i = 0; i < 4; i++) {
    552  if(Xbox360Connected[i])
    553  XboxCommand(i, writeBuf, 4);
    554  }
    555 }
    556 
    557 void XBOXRECV::setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller) {
    558  writeBuf[0] = 0x00;
    559  writeBuf[1] = 0x01;
    560  writeBuf[2] = 0x0f;
    561  writeBuf[3] = 0xc0;
    562  writeBuf[4] = 0x00;
    563  writeBuf[5] = lValue; // big weight
    564  writeBuf[6] = rValue; // small weight
    565 
    566  XboxCommand(controller, writeBuf, 7);
    567 }
    568 
    569 void XBOXRECV::onInit(uint8_t controller) {
    570  if(pFuncOnInit)
    571  pFuncOnInit(); // Call the user function
    572  else {
    573  LEDEnum led;
    574  if(controller == 0)
    575  led = static_cast<LEDEnum>(LED1);
    576  else if(controller == 1)
    577  led = static_cast<LEDEnum>(LED2);
    578  else if(controller == 2)
    579  led = static_cast<LEDEnum>(LED3);
    580  else
    581  led = static_cast<LEDEnum>(LED4);
    582  setLedOn(led, controller);
    583  }
    584 }
    uint8_t bmRcvToggle
    Definition: address.h:48
    #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
    Definition: XBOXRECV.h:46
    @@ -777,7 +194,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_x_b_o_x_r_e_c_v_8h.html b/_x_b_o_x_r_e_c_v_8h.html index 950ee9e0..dc1bcb21 100644 --- a/_x_b_o_x_r_e_c_v_8h.html +++ b/_x_b_o_x_r_e_c_v_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,21 +89,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXRECV.h File Reference
    -
    #include "Usb.h"
    -#include "xboxEnums.h"
    +
    #include "Usb.h"
    +#include "xboxEnums.h"
    Include dependency graph for XBOXRECV.h:
    - + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -377,7 +382,7 @@ Macros diff --git a/_x_b_o_x_r_e_c_v_8h__dep__incl.map b/_x_b_o_x_r_e_c_v_8h__dep__incl.map index a5db4122..d385722e 100644 --- a/_x_b_o_x_r_e_c_v_8h__dep__incl.map +++ b/_x_b_o_x_r_e_c_v_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/_x_b_o_x_r_e_c_v_8h__dep__incl.md5 b/_x_b_o_x_r_e_c_v_8h__dep__incl.md5 index 4ca65192..10cd6192 100644 --- a/_x_b_o_x_r_e_c_v_8h__dep__incl.md5 +++ b/_x_b_o_x_r_e_c_v_8h__dep__incl.md5 @@ -1 +1 @@ -74b9b88b9a5da90f0879a3aae3ebebb6 \ No newline at end of file +1b17ab2dd30a29c1f644e03c41d46777 \ No newline at end of file diff --git a/_x_b_o_x_r_e_c_v_8h__dep__incl.png b/_x_b_o_x_r_e_c_v_8h__dep__incl.png index d373695c04bc3cb9a0781f0019fd328f1724dd66..1c8a97f5099cad09052d208b85646edb0ea989ff 100644 GIT binary patch literal 3111 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 literal 3644 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 CIuAYo diff --git a/_x_b_o_x_r_e_c_v_8h__incl.map b/_x_b_o_x_r_e_c_v_8h__incl.map index 9a182676..17cebabe 100644 --- a/_x_b_o_x_r_e_c_v_8h__incl.map +++ b/_x_b_o_x_r_e_c_v_8h__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/_x_b_o_x_r_e_c_v_8h__incl.md5 b/_x_b_o_x_r_e_c_v_8h__incl.md5 index 59a0ccbc..e4e3f6bf 100644 --- a/_x_b_o_x_r_e_c_v_8h__incl.md5 +++ b/_x_b_o_x_r_e_c_v_8h__incl.md5 @@ -1 +1 @@ -ce5138122fc59e139125ea0dd172d247 \ No newline at end of file +b243ba8a771536bf11d1fde69b3f7cff \ No newline at end of file diff --git a/_x_b_o_x_r_e_c_v_8h__incl.png b/_x_b_o_x_r_e_c_v_8h__incl.png index 05d3b362eae432292a17a7cb954a83b7e338278a..2511b7aed7a7ff49b853877f24ff1905c9d8ec38 100644 GIT binary patch literal 6837 zcmd6MWmFqcxNT^QyA%yxq_`9-R;0L>;(-Fep+F(Hl;TAT1&TFLtT=(<5ZnrdVnKp? zi&I?RaMyZwz5DKc|KB8&IhnO)=A7^B^X>iZiPq6lCd8w~1A#znal9KZp~N?lnIba(&BX)Q_yfoL6773K7OvUcbF&Gcal*asu&7&OmF zjBrB34r1>c;4r=yjN$Sa;quI$H2IH<_3?`JxjbpS25c1!%*iOddHNJLK0e;4&N&@*0NY0878GDsA}>o&!JhG}OB)*zOG|HB4m$C-#)}ec&0fC5 ztgfzh`#bRz)ZYJz^>9=6js^n*gYsrofIpL63Scv8B?yjP)9vTx9(^#5tQ1)tP zVC|iR7F;IoAvTeH1iiQ$$Zj}G&de;!)<{>E^y9~mZcFVL*Q<_L^AB4FDFVG$84>uDCfDcpuUdv=4Vywp-Y0;mc|>FfQQ!*a&6rzvXv z>+c8{Wxz8tGyNkY%4TL@Jbe7+?d_Q5uE@NcoEQ6k(=~R)5k&NA7&U^~EKn^iEfp1& z_REuP_lqMNGh_e_u&HQhge4~@4wV$H!+WlvqZ<1p5FjVGM(bNJ&W%@Up!3_pd1{<0(&kN`cpM^po4K zC?O%?K6)S~7M2I_pv&UX(`Xp1Byo4KjWJg6yFORI&B+uFKK?lE;^o}taJJ+$!Ww&Q zeEd^V(u1Xi<@q=|v8C13Jds5p?xQt!+A)`wvANaNWKL5RJ=(H2k6c|{TVX%e0RU%; zxqfq9L}C@uh&WOxvXI`RRyR*+InxyxQd(MyGHt!W(g$EJ1FjGIK<`OemEO!Z!46JNdS+{#e*G;fFMd^I)fGYb zMbsrji~ek0HthK1!)_4YR%239ng1nEHbqQDE+T->iTtw-9wMPl@3pyyMQU&%fbr451? z@P2vbko22vnm03`FS7jVVw28iBOS_PEJW(=u3cYRo|FV9A^j9mR>rB3efd3w>q%Xh zylrkF`{P1Qe@3np+KY=rw|9AEFGcRyL=r*B7Vj`56=AgJh@Fk=Ml^F>Vc12!UjebkeeWh@=vPHlNWv6(Yt)QgDyx_Z;K>d88@0ehBZHY-< zsn=|-@l~Xu`M`RsY^N+ylP?=_Fy>OyJ0Y`XZTYU zge%Jl#ri%;pq}>j<=LK=&wgtZ(SGn;Lq}8`VOPm(NnMkYorBxx6PvjI%c5>}UEYJOfOG@b;6^Hy_4A)4=QyyXE-Q{jM?DdSL&b_0YqnCTK za?pVtEFTysZ0_ffIefDp9hj3?>;BJ{&^*8$|Er%P=f()5ogdcMlf4@fR3$v7vs3td zE3ZpFO@RRvUiP?`I+gc|fQ2;jY!OZvzZ%Ae3li{hX1YB}8!)P|B}U$)B0u#k==7Tm z^mEGVjv7O4heI<>y>kag$>=0WwWUQU1O?$ssB)9sL1xOF#G9$$TMt}S)e9r!wQ($i z%dH_jj3RzDF_k^kh)3RRPW1bvXOJyFClpjtx=l*{54SgtF6;|6x-}tS#WbeeF5 z$e`{>#td)QKo%)Hn)fz?G75o#CVmzIKz5LUDcfoJ%iKVRGXVX-vuF;>UX z5nJEg>IIxH!3LQ*y?b}7ejM{?ux~;Cv2o)kPnV2oH#>S9}x}y?6M6jkeQIlE{ z63PgVP2Bu^#m>RfqCYgw(=EPtp~f{z)&ohrI$W;!5Ten%!9bzQNX81wpP%)4%+A|@ zVV3+}H+l(ykQZvGhR4K^d+o)B=j9n~C8=;j9JNu?-#e4oOi3u#;tVaac|0Wy##{Zx z0**%?Tpx6altG%cx8AAHLAapY20QQdeCg8Db+h-{0^j6tECh;y)6;v-S7P*l9+rEi zC+^O8kV#1NC1!Ai!r{%o*AJ|EV@dj<+DtMs*i`%r6iwhG3&={=&L-UT%~(DRhd3DQ zgp%U-lxT5u*0;PoJ{ukT*1OR9PUT6weA>i1>{8nJRWjb_XeOXU;#0Vba3MtdSy|wF zbQc^^qRM7iJtZDNn4kf3258j9)mg9q{>wK&I@px+l9AFZPW-{mu65gw5><@1$}e@%w8`eAF!X2%XBD>F$nuI`K4;Ado-3OJ!6 zzZW~SBLm+pxDKfuZ-0)A0TLI0)AsT4f^my2f!P#^w5(Xp#8=I^HAwS>VG};jzT2-Zduo9zf zdGQWY3y%CIvX|+~_h$54oabU7!;DM+>8@mWQqns`C0iy5Us)5AiSH#%_>C>AuB9%- z=Kd~tN^yT9x3+#Y_}62^3PPb2mZ&n~gC44)gY~qca6ZI%H5#9hl$7Rts_kd4K`Aq3 z3<-FS*b0F&RcV-)vt-k;cj+`3bg|CIuBoP^q7v)|j=Z^2&ovN^>S58y5~s)%y@CH` z^HTHj#ceArBvp>jiZlt_C-30pbqu(>v58Uy8&qUzVF&{u!8|-1S<3c4&8@3b_2?^2 zr4;!XGm=|Tfji&qz3X8lGrhiSWw}g~oiHaRR-aQ`j9F^9-}y78`S;u$iw>+#J@=fl z)L>WM#f4R$Yxg8iuUOZ}#~|nDbFpTE87hmewp8*nm7lYQ4+Ui(Afb1K)Tl-G0a;WJgR z?bB8GofK~S!Jm4yg5D{MwA^CVN%wFVDR31aq)bBdSG zaPGlPrTz`MQBbwn8hV53Fv-~;EgvjTF{j92#jif|7s1AkC!#4Is#rJ_47xV?oMsUj z8cHqgua=l9N=MEi!{TY|RoQS3UOUou-!|aY=MwQd`5QkrRv&Brgn6STQ+lQ+MoiZ{ zh#n+h^HT*ZbNw81NG<5@%HO{>Dypx;9sG8&BG2{s2Ro`4kosRjLmzgvQoVNG7%k7_ z|95OQ^dw2nz(q_(2D!^s#bse((J__HM$AzZRHhBb9Ga0(IWP(H5f>M)QivonhSB|Q z?1dN`a$^k* z0@1f~-$iy-6J(V%G-5Xz5wMBrX`DtgB0#kJ`1>pHrR5zH&p!Q&=^YIu?#*Qo>-tzEY#;RHZr1CS5Xm|-2fiBhyUKnEQ!mhCPf_E|=+grky?t9@JT59KT79_M=TvyNQ!{cemW^M%N-pHJ-nO4C zdCddd7J>{&zuz^#2!xcIx6ba=Y4S!QPRd27bj-xSOic3Aut|dRjm)E)!ZL}{|>b_&h(g%9@)q7 z^YTv8x|X;ECZJa1%3VF=y-xnVF2B&Mb#V3{oig;VkG$HQhW3N$>5UZ>LWd84@}8Y6 z`q_wfmUxHl(3cLNnw!p%3pEM~x^)c)l_8PlPUg{yRt;|C!TKK4R{hl0&L@8-2|(&v zS}2FX>E}r*PuQn&5&sbb%U$|P*Dv?Os~fVZVWxZT$tme~{C)UYl?8FYg{xR+AF>u61NV|#nhYj19VA?V!lbX;5ZKgN{~Xjn(| z#5-y__D?ECE-vL8zQA?O3SMyJ?z$XWC_Ew2c)hc4tUw*%b7%#Y@*$a=oCI{SlDoSg zCBJzrl|_KAaJB|}SGuqrki7|BoH39e9v(KlTgR&~Yy5D2?lY7wtnAdn+qPs+SX*2B zMbewE&IKK@2@hrfi~<~>TnP+pwWYP*RsmcPK0YF~0y5wWm>-D)P}}->hTPm-6)i0# z7Z+YGE-n&!`uROkO&5Nz8tEUJ^PxKf6OJP226t9EX}@RNGc_Fd`+XbT;#-6A1nd;& z{zPUCmQPiHWn*Au^qmI#JsTUFptiO)s??C5lAJux1Lq_5`G|dN`R>5RugpGC=jj{~ z9yYdcUZbiPMn9@Oi$Eyi26Qy zcegh)fDeLhH{QH3H)jB>jizoV_T}YeQ2Vysrg*#puqF!m zt0{r^)Vy<;R97Cr@w2TP1GpDAc)YWAG&qJ8%xr`g@*fo&T@ z+V8miWP7T)J7yGsJYcX;i#k)g2I?CcqDRodJURL@kCc_Ml$GZzdu#0g%qZ&XQ_RiH zm7xkDfy<8&^fEGs{X?;x$A9v|_a3mg5n9EJT_=)+hO$th#w>Y~vzw$Gs6>y25bf+&s1yI$qCU0_0y+mE{9{8%E$h&cb#P@&%5gv>QuI zoofTEqkxVMDX9*m5VER^CTElbIN792pDQ9=SOK%7Uq+`tY6eW-^X0jS(RSitZe-TM zTC&2UvY)5A{ZTJ%hY6HC{l*G%BOptT&V$wo(pW$i*$s)MuC?wX!g|l(!cb9hH`r}u*s)zzs|=WI!=j4*Lge~f zk3rM{>ZHtP;gONs(kr`@!^K7O1-1~=y z!rIzov$C@Vy>^VUWCBfu_ijh(HuZ~(ix2+&3srd{RLZCTWP=62ZC(Ou0npywo>7Av zv!jz!+^Nk+gpFgXnaifbjlYr-)`JHRme$t7?hVcS{70FhE}csqp&~9{CB3zTNB(ba zM%%~r{&nKVqajX8N^(0tu%w`*T<=MXL z4}NN&7+wFg;*)*DO7qE#Mg7eGgIbGR0t0EB2F>(}KdTn#&7bnVEspU`OjLbBW?*6A zifXuL!cQvCMt;pK9mg4#P7=>)Z!czNXTv&K$f9FUZ5(f;wuI6p%@?c4Ikc*1glz?g ziHSw+e>0`R;dkvP>4Q4`_kaPO$jQ$?B{|&JhfT$2_FD>&OnqI%vd&)Uh>EpZ`rDkF zNWRZhFvNtYjou+2zZ2?cwYj-xhq=YNKu+VC`Gko{$ zKRMlgAA#W8fbQPj`?+lhyb@hmT@_h{3el{rtmNo( zXE`_B-Q8~vS9-+#PkAyjGIUH#KKA#k)NK2c{13EcBSbTtB>|KtwxHjQD&x8Q?WQf- zJ5~&9ZiwRI=+@iI?V+iuG(Z5v6y)dI_fAet)l5$tZLF{Nw6wGsIXjo3EVGeF6Jpc) zxAYz!9>TujHmb7a!LAMtmVf^I;o;R7F2p4wIy2BUY$L`JOhDG>j7rLANyY2uI(jhQ(Nk|L~EiEmbf^>-FNT;-QssB}mp-6h>!A`Q|hu@~QW zzI}e@?7#OlGrZR|vv}8fpSM_v3->z=*DsVwF zQNvwKTc;c zb9Fc(WLgVF-)q~cTU8b76wR`_ZV{8Jjgzd=>+Lz#!}3`2bc)Z^-W%CMTC-W?{rv+a zj&5(4;|K|989qG!eVN9y!PVO@tjcuE$P@3$jNAo9p_8_hY{H`Lm{zmGSP7Gq!jOAJ zE-6TOT(w;9zHheJ;F(uavR?S0EjBlong7jvk2_fd(Shrk-BObe1~zt3Obi}P1T!Tu zG4aa!K7%dz}*@ z)x{}fV_;#mk7g@Q4E``|@E{l&83~Jt2`wySlZ~M+=FbccMqTt+#qqvA>@KaW)Dkr^ zG>qDBzM~euyXL{f!dltgjU-@@rDb8kppV_GO|&#K3-rCYT8UQ`3#hNJ-#*M4l?{crFnpkZr%|_0P)ZCy?Xfk`Sa;!Kk*010XAY?(7?bz zd?+-mH=fy+-TY*8WV*rPWbV?==*xoBrX*aC;cz2Z3aW`Mj@n-e~*z6VrLUKj7Uv zlt1&e@2G^`mS?MMb!*-%ICFf@+7o?yW^#G7Cakg&y4Qsw$BwN7 z+fa^bW;C^^7p<5WHKY_V$3Hzi4eTb55K>fB)YaE-@9IKBLBnp@ovCm<-PWEs4i66p zChxd9-GO@?mPeKy%_k90rLqo&N7C9b{ z+um&Ol+jxpb#?WFlN0GoF&}(3+o@UwSlEAzF^Hi+EZ-1fdcEPj4| zgl@YusVp&hnQmlf1nKI<;i|lXLfheLcbUhbSy(5BpUHb^dfk^V^Sd-PH34y`>459=^Yal#8M^GUQzeE^8=Fo}T$GZzWmXS|ht<5VwsH#&;pSb-*O$j?tO*6( z+}zxH^QaH}ZKq1;1O=hKzP@0iUs@EG@#?{7kgN0kn3fia$B!S=K7RZF27{50Y3b;E zEhxZL%@pfwe0%=k!v}wGDijDS8yj7G?|8HTxwE@__d>mUrmd&8wl>R?C#}&`!d$-B z9`cXlUgz41@Rsz=%)I=112e4qY&n!sa0mic0+z@CTqSYC`276OLVHgvgT8^gPKiP5 z+1}jYR&FLe9UYQWZA0f)xSOoA(wILyBrp&eBUrL3s=f?Q{8|k$KR-_y8yhQB#fgtG ze)~>*=%~(RE3jC>5S&?3q4XRaI7UWBJv}}CH8nM}x%vD7 z0RdbB0^J8I?MM)iyqk-SZwvbvwj=+ys2vg&u=ndArx4qln5uq@~%-~W=Gn`_>m1TQYB4_T!$41Atqsg?EQ$&+Vx zcI<6!ZOdzG!N7w>`ZXn;3)sNxN@;=wGBPqOY-}iyND2X55TG`hED|?=G@YEd(eS9} zbJmoTxR5R{FVi^Rc<&U~e29zt0ynm?Vcp)|HnFiO@UojOH3jvoYilewHZ`^I>cr|{ zaJCOr*$Qe7a*xWu&=BtUOBx~}Apt2WD&mFdaI&$zQ(^*dDRp&%xcK;y3QN_AbKb11 zEEW!q&bDBz`&5~4_M;&qBTEu?huI+zhl_9b9rcVf4eQ-H$8uG*yV+*9ZA5sJ_-sjh zZ%%c*Z%(IvIIf}{9UUFC1-FBfFBA#ug zI7EhI1Mq=-&0L4QS-#!*TFp}$O?DCnR#r?JpA!PvXv%yc{0wowCL6H;2?!}EskEG2 z;W`iSZZ%@A)OHHi(b>5YBYx}O*eKc+O@-y>=O_P|Fipf$V`Gia!qO7m+1a^g%_#{O zgxcOf#~i2L3Y5(0Y6L~~n}zoleV?*G^bZaW>Q>nhhu~5bz?Y`W%wtnh3Qmh=K+#&+ z+Z(vVrnaWqzp*Cwqfo)tk(z>RtC~yKTLwWf|GV1%r?Y$+#&07C4#AK1xN|z*9Qo>< zDB*JOcfa}AFtBx*gEu-l8b4h6-WkS>BItBVO1tWs$1M`GBi})Uf;G>U5$C(bHH(sl zhEz~Xt9)yhJ+_J$~ttx*(sT#moo z!Pe~b49qS)+%`7b%R7Imf+XppDKDXf;dxS@q-ODaMtMOMLOWjHYi$W=JnUt*cb|4r zQtAkc!IOFOhG4Sj(mj+Tw2}r>ndi$_ysSL==wf{-S`znN8z;vyDVLMCVG)W_UP3m;S2SgD|7ZJ%gZJ+SJ->Bf*w%t=mgXmLBD=sHnPWyfLjsaQGfhZF?7bj zVuit^LYX&Z@%`m0o~9<8o<1&LzYOW?Fz**N7P#Ln_4Le3lQo3_;eGeYKMVD={BGof znRir6etysP`og7H5_+<^ zX?Gj5Rl-RkoI^O3C=!hn-+Q!Q(TxpYK6YsMbUl9+rpYBh8`w6*PIXOp^ zzUqwuY5c(3TjT;JSEyZ>(=s`Uyt49KjpbwUkc5yyE{-yy7#X-Ips3TF~-zml7 z&6_|D{hZaSQ*XOP?@#+q7($L#z*_>~hWIozm_$U2_6fsZbc|iwesvO+x$QX`G-nLC zKTS8v#a6zLTi`a}JqO3K)q2YGpy10E@W5b;ti=qG9ha;puo4Lm4?=IBMgmHa$bBal z*+x+uxm-+TAI|<)Nh$9Mh{k*yxlTL5K`Hph&(8pkvh_|Jvvw^Q_P)D8O%uNpHZ#wy zddsQgLnbl_T-Yaz9Y4%%A4lWV1 zFM4d4*W05kP47`H?TO{DF>dC|EsJ4c7i>#wmC51ZQ2lD9P^~KrIK2B3mOHlfDC=^& zu-$7XIG^+8>a^`>&98m3*fKWOF%|5TKx&R<(;80HOb0(CG&4Jy!qPO(QKmpMHnwNi zJ>cwlb)q-A}*vsk3$QoG=K zU%$tp!2V8}({yo#8`OM9aq&C;)%M=Zvq)}U9?L%+0!x%qh+@f8T_Yp-C-zH%d%tXs zgv$1~WUiXb!KE@V zb4ff)jm2?yni*{=Ux}u?{7>u9er8x?n*YIp<9*yqOFv%S8nZk&aA-;9QTI-?s*HTI zBjn0TK_82c8BAF7hPbWUk}m|?@f~m`vkLpSmg|^A9ea=-^}3B$(EBvMyHv%6_`{bc zizOeCd}>|1?W~iOG>&|8zS|LQ$C7YL6Yc7%Fh0)WuoC#Fq@=pEVyDa5HN;~0vlthg zV0C*!*rZ5|3qtz{(_y{e?~-FMj7;0=_mPc3V@j@LErvOEjlFnVo_e9So3-5S zbcs3u?@?3mrv+;CRxX}B&wus9L;Zb9iV!s`udgg|%J_IHhtceJEpCG>30S(Pn^X=Vhuad!1 zkGI0ByECc;kw z{m4rp`gU~dH3HxU|Hw$jB*77^mdyGx2yHBejei+a`tVkrY zG7Ru6_kmkxPO!Oj$JnIE!|Ln1DCp@#XXM$bei|O1;7Yo-rs`SJ{{t#xwcQ+MURqt< zve;;Pv0eC_i!Zy+A|o^+f(n=F3W`N~OAP8eCaRR)EJsrxH>@bU$>%Tk_&z#Wzlk|f z2Rp}-sbrRQeH9ro@x)1XO=?~q%i>fr?49&z#LP@^d5NL%Mk9$24igj8E^sNr%a8BY zaARYGfu0_@J%sGnKqi$swooSljh-_QXZc7=H!yt5APuk%m3lLU-?62Y4K^9 z<&FuD*QxDUnVCb!1g`3;|9)An^L3eUSjebuRU`ZPR&@#A%`6dS7#IrX!J!f_Q&WPd?1!V4xnOG9v+?_b#-QdIoJ#_GcvXg4B)uAx!vQ>3^By5SDt3B zO6$S`)r%J|F4j}+h3Zal-7gMI1%-sZR94=u`}X$sZZ0*8XNX)L3s|P;i(6P&B*D$m z0CrvZ{X3|qM;j3YSnJQhQna9zU=BWDLJ{9m6eq@q-(6=PEQr(EfDpv@t+9)V8J%WSRT^52QSXaR?djW6AP`!K!#%IK znPTOq0T_O1ZT&=(HKFLsm%t~FFefmFe*V-LNR5kYGcYhnF~TN~sHJ_Ga+hwzlqFvV69-2Wyh~SE zIm*UxhcLz1_fiJYl(Two**(eBGmrf_2Hw5$w_TO<8u@Tw>TlWED@SX64o*&>dVc*7 z8;g{6Fw}XzGo^Z36B>$+iIuvqzPY>%f!G{V2m=wIKSPv4;LUssVCH-oQ`Nq}p$~#3 zkpu(;CY=BL`SZi?u1N)M<2_p|8~q1@)<}gHphHa=q~rJ4?1re zPy_)vDTs5ibazW?Rt5#c84aSPt^F)t%M7H;hu&BBeCYc6nl`>y>sUTpV`8bsen}Qc z1u2F(beSYRM)$NhM>&=2&AcGHUZwo1Ct@d8=erRg2R(g#nxcuRsaSGya_O_vm1>Njl{h#Po#h$C{xIIUek(*P|C$nccu%wgT_L3ui4Pi(Q)zdp{m_UF8TgN zPzpLgoN6ig`1n4^KL&JIr>eqgg#P#M-^&}BeqG=b4ekPg5E2ps^tm|6jgz90-_f7U zLqJU({rmT;G%+7?xoArDRN1+!Soz054g)X*%VA@X>XoJCY9D8_w1Y#b3W9``bakaY zlw8V|onyz|GBqg)qt+lgib6naYUd52o@@HNsrauq;1TRhOd&W>F8}1@WVnuw&RHj^ zaVb!i@{|)n00F|E6dwNY_~5`K6qm{@@}^e2!F}Iovc}$c5|GkraPYI;86IuXsB?XN zimBi%sxhDkl?R}pm#3tVcR|g?Z%&9RYHBRGlZz%!8RC1V0nbm4io&`7j(~umsGy*r zlb>wtCMl=Zwb5x!;kC7OFW7V%$OkSN-?u!R=TN8ITsmF$5p~=u@Xx zp)dwfQ7Vw(`@eT`We zH8uPYY_icDe%=xc+HYk5))SDNq1;}Wqby}Zv4wK}DLDS~4F95_|EbUaSCjl-T=MO7 z1LgUKwtivDSniP4Dvn=bqPTWyi5#AD0WiLa#2`CfzZgoc(U()nA zHCUIuBTpU0#Cpav#+rp!TKW8sA(vMrdWYFwYKTTJm*)|!sE&m$_@({hlXsuhti;7% znbCIzJ^a31OWzJ$N8T0VN0yV5vLqYUNgqjb$K5}m?2-4=LCq>G1ZJpoFev<8l3smD zWPAH#5_h)qehShf^3llW@n~7qFMLRg^#wE|srPy{WkTLbN>!5c*+A;t1+=3gI_WPi z8_~k0JIu910>CeE^3oS`OGY}u-%3_&NBCF zQ~2zXD0X-2kRaDL=u(fr44{54OmmIP%!~o;?$8j8bAEx51%~$My|>+5b=1Do$zXp! z_OoZtxZu_f@VbgW3vvfW=$Y*xImWBeufB~0NM`wib^-#j+x?03 z5D0Fd7>!eZP1lkX{BObH-_f%5z{$x8z%bt1bp={{USTL}fP_B~LERAXgBfJu4GkjL z)FRLr8u9h2XvIWWYiDQh6#0d07MxHan-Fvt??fbFVc~|8QAO{>R<>Eu9f+%|>%FF% zmY!}3nmy=d9}^PtGl25c9!bVyVrz@V%*-q;EBmFcjvQ!R(i$3sBBG+E2t-s;5){%h zoF#=MQPs-7`#SxpGa8U-emJa1M(pwDR#%e%0d{kukkspJHyq%h@ySUWgfZ#B#F9%* z>DCVk+Lpm|;T6!`!Fh^|8p(m)9|C}f*U4r;wqjyIj;Pab3?S*6ync-as?qLZV|{0e zO1coLySqEkVON0YJhJ6l8J5dA6ZIY#@A&+D%Ja&;`Q}sO^-&)?8(YK;NNl^F4|MF@ z+#09e4h~!t!fxz+0|OQ>U%uQ;&@nOvVt*vO3sQQ%Q7=~MaMTn!JT=-aoT=h+&Q z7kf5Pzm0VFX`mLq1Q4ZSk3XZvTG)27$W${&$<%#+@n82joietJAmyB#6@z^GPg6%T z*s&K`8qe3f2M!M(KE#G#VPKdz)uwfJck@7YfqYw3ULKd6l2ZQThu{lc-5$5y>DCT2 zcwte|_>~dFq^YS%36@xaf{vRvJ3 zJDap>&Z=Gq0K_4``Ov%h`Y2-7Te&-1<4Jt)D<%5a(kk1j^3hR^94*$DGBT)|ERXb- zupmJFa|R}RbSfYQ5S7+W<-ouaFK^}BNhC~6%waH?nD_zaG)&4V4Af!;OaIs5mcU~mqKQl=P{vG*Zrc|}ER zdV195@y6HBpCJ-AvQRL(LB%3j2GQL!IM|hF>>CcCVESyyy>~B;tA#y}Ua`L{e*g+X z&(EK2K@W*aJ&)I4=W@beU0}4q7c!}??Cz?Rv2>0^s}dUd>V$s2H?~ zed?N;DB;q`&c|1&q)d+=e{N{FuAQAs9u#&@hfbNNY;W6;kdgILQc~*1P>W83I0UdT zf7>%zsSC_t2JP(Zl7JK&5f)|w<^_@PoU)+>E+c*Yz7RZ`L3Va_sCi2F1CFY>Q8*a; zSo+=lT}n3daarvGBPXXB9b%mLfkyE*q}DI z11xxzxVa#4bn~7RA_-w&U_c<-JsDTL3gqsboy9~{ieUL{{DWgn19XpqOJcq kP(+y?awiCa#^0d}@JPBXT%7TNK`7+8jEZ!Lq)Fg^0fGokO#lD@ diff --git a/_x_b_o_x_r_e_c_v_8h_source.html b/_x_b_o_x_r_e_c_v_8h_source.html index 555f416e..ebd7eb62 100644 --- a/_x_b_o_x_r_e_c_v_8h_source.html +++ b/_x_b_o_x_r_e_c_v_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,143 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXRECV.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16 
    -
    17  getBatteryLevel and checkStatus functions made by timstamp.co.uk found using BusHound from Perisoft.net
    -
    18  */
    -
    19 
    -
    20 #ifndef _xboxrecv_h_
    -
    21 #define _xboxrecv_h_
    -
    22 
    -
    23 #include "Usb.h"
    -
    24 #include "xboxEnums.h"
    -
    25 
    -
    26 /* Data Xbox 360 taken from descriptors */
    -
    27 #define EP_MAXPKTSIZE 32 // max size for data via USB
    -
    28 
    -
    29 /* Names we give to the 9 Xbox360 pipes */
    -
    30 #define XBOX_CONTROL_PIPE 0
    -
    31 #define XBOX_INPUT_PIPE_1 1
    -
    32 #define XBOX_OUTPUT_PIPE_1 2
    -
    33 #define XBOX_INPUT_PIPE_2 3
    -
    34 #define XBOX_OUTPUT_PIPE_2 4
    -
    35 #define XBOX_INPUT_PIPE_3 5
    -
    36 #define XBOX_OUTPUT_PIPE_3 6
    -
    37 #define XBOX_INPUT_PIPE_4 7
    -
    38 #define XBOX_OUTPUT_PIPE_4 8
    -
    39 
    -
    40 // PID and VID of the different devices
    -
    41 #define XBOX_VID 0x045E // Microsoft Corporation
    -
    42 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz receivers
    -
    43 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    -
    44 
    -
    45 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
    -
    46 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
    -
    47 
    -
    48 #define XBOX_MAX_ENDPOINTS 9
    -
    49 
    -
    55 class XBOXRECV : public USBDeviceConfig {
    -
    56 public:
    -
    61  XBOXRECV(USB *pUsb);
    -
    62 
    -
    71  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
    -
    79  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    84  uint8_t Release();
    -
    89  uint8_t Poll();
    -
    90 
    -
    95  virtual uint8_t GetAddress() {
    -
    96  return bAddress;
    -
    97  };
    -
    98 
    -
    103  virtual bool isReady() {
    -
    104  return bPollEnable;
    -
    105  };
    -
    106 
    -
    113  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    114  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID) && (pid == XBOX_WIRELESS_RECEIVER_PID || pid == XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID));
    -
    115  };
    -
    130  uint8_t getButtonPress(ButtonEnum b, uint8_t controller = 0);
    -
    131  bool getButtonClick(ButtonEnum b, uint8_t controller = 0);
    -
    141  int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller = 0);
    -
    142 
    -
    147  void disconnect(uint8_t controller = 0);
    -
    148 
    -
    153  void setAllOff(uint8_t controller = 0) {
    -
    154  setRumbleOn(0, 0, controller);
    -
    155  setLedOff(controller);
    -
    156  };
    -
    157 
    -
    162  void setRumbleOff(uint8_t controller = 0) {
    -
    163  setRumbleOn(0, 0, controller);
    -
    164  };
    -
    171  void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller = 0);
    -
    179  void setLedRaw(uint8_t value, uint8_t controller = 0);
    -
    180 
    -
    185  void setLedOff(uint8_t controller = 0) {
    -
    186  setLedRaw(0, controller);
    -
    187  };
    -
    193  void setLedOn(LEDEnum l, uint8_t controller = 0);
    -
    199  void setLedBlink(LEDEnum l, uint8_t controller = 0);
    -
    205  void setLedMode(LEDModeEnum lm, uint8_t controller = 0);
    -
    211  uint8_t getBatteryLevel(uint8_t controller = 0);
    -
    217  bool buttonChanged(uint8_t controller = 0);
    -
    218 
    -
    223  void attachOnInit(void (*funcOnInit)(void)) {
    -
    224  pFuncOnInit = funcOnInit;
    -
    225  };
    - -
    231  uint8_t Xbox360Connected[4];
    -
    232 
    -
    233 protected:
    - -
    237  uint8_t bAddress;
    - -
    240 
    -
    241 private:
    -
    248  void onInit(uint8_t controller);
    -
    249  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    250 
    -
    251  bool bPollEnable;
    -
    252 
    -
    253  /* Variables to store the buttons */
    -
    254  uint32_t ButtonState[4];
    -
    255  uint32_t OldButtonState[4];
    -
    256  uint16_t ButtonClickState[4];
    -
    257  int16_t hatValue[4][4];
    -
    258  uint16_t controllerStatus[4];
    -
    259  bool buttonStateChanged[4]; // True if a button has changed
    -
    260 
    -
    261  bool L2Clicked[4]; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    -
    262  bool R2Clicked[4];
    -
    263 
    -
    264  uint32_t checkStatusTimer; // Timing for checkStatus() signals
    -
    265 
    -
    266  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    -
    267  uint8_t writeBuf[7]; // General purpose buffer for output data
    -
    268 
    -
    269  void readReport(uint8_t controller); // read incoming data
    -
    270  void printReport(uint8_t controller, uint8_t nBytes); // print incoming date - Uncomment for debugging
    -
    271 
    -
    272  /* Private commands */
    -
    273  void XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes);
    -
    274  void checkStatus();
    -
    275 };
    -
    276 #endif
    -
    #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
    Definition: XBOXRECV.h:46
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16 
    17  getBatteryLevel and checkStatus functions made by timstamp.co.uk found using BusHound from Perisoft.net
    18  */
    19 
    20 #ifndef _xboxrecv_h_
    21 #define _xboxrecv_h_
    22 
    23 #include "Usb.h"
    24 #include "xboxEnums.h"
    25 
    26 /* Data Xbox 360 taken from descriptors */
    27 #define EP_MAXPKTSIZE 32 // max size for data via USB
    28 
    29 /* Names we give to the 9 Xbox360 pipes */
    30 #define XBOX_CONTROL_PIPE 0
    31 #define XBOX_INPUT_PIPE_1 1
    32 #define XBOX_OUTPUT_PIPE_1 2
    33 #define XBOX_INPUT_PIPE_2 3
    34 #define XBOX_OUTPUT_PIPE_2 4
    35 #define XBOX_INPUT_PIPE_3 5
    36 #define XBOX_OUTPUT_PIPE_3 6
    37 #define XBOX_INPUT_PIPE_4 7
    38 #define XBOX_OUTPUT_PIPE_4 8
    39 
    40 // PID and VID of the different devices
    41 #define XBOX_VID 0x045E // Microsoft Corporation
    42 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz receivers
    43 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    44 
    45 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
    46 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
    47 
    48 #define XBOX_MAX_ENDPOINTS 9
    49 
    55 class XBOXRECV : public USBDeviceConfig {
    56 public:
    61  XBOXRECV(USB *pUsb);
    62 
    71  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
    79  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    84  uint8_t Release();
    89  uint8_t Poll();
    90 
    95  virtual uint8_t GetAddress() {
    96  return bAddress;
    97  };
    98 
    103  virtual bool isReady() {
    104  return bPollEnable;
    105  };
    106 
    113  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    114  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID) && (pid == XBOX_WIRELESS_RECEIVER_PID || pid == XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID));
    115  };
    130  uint8_t getButtonPress(ButtonEnum b, uint8_t controller = 0);
    131  bool getButtonClick(ButtonEnum b, uint8_t controller = 0);
    141  int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller = 0);
    142 
    147  void disconnect(uint8_t controller = 0);
    148 
    153  void setAllOff(uint8_t controller = 0) {
    154  setRumbleOn(0, 0, controller);
    155  setLedOff(controller);
    156  };
    157 
    162  void setRumbleOff(uint8_t controller = 0) {
    163  setRumbleOn(0, 0, controller);
    164  };
    171  void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller = 0);
    179  void setLedRaw(uint8_t value, uint8_t controller = 0);
    180 
    185  void setLedOff(uint8_t controller = 0) {
    186  setLedRaw(0, controller);
    187  };
    193  void setLedOn(LEDEnum l, uint8_t controller = 0);
    199  void setLedBlink(LEDEnum l, uint8_t controller = 0);
    205  void setLedMode(LEDModeEnum lm, uint8_t controller = 0);
    211  uint8_t getBatteryLevel(uint8_t controller = 0);
    217  bool buttonChanged(uint8_t controller = 0);
    218 
    223  void attachOnInit(void (*funcOnInit)(void)) {
    224  pFuncOnInit = funcOnInit;
    225  };
    231  uint8_t Xbox360Connected[4];
    232 
    233 protected:
    237  uint8_t bAddress;
    240 
    241 private:
    248  void onInit(uint8_t controller);
    249  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    250 
    251  bool bPollEnable;
    252 
    253  /* Variables to store the buttons */
    254  uint32_t ButtonState[4];
    255  uint32_t OldButtonState[4];
    256  uint16_t ButtonClickState[4];
    257  int16_t hatValue[4][4];
    258  uint16_t controllerStatus[4];
    259  bool buttonStateChanged[4]; // True if a button has changed
    260 
    261  bool L2Clicked[4]; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    262  bool R2Clicked[4];
    263 
    264  uint32_t checkStatusTimer; // Timing for checkStatus() signals
    265 
    266  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    267  uint8_t writeBuf[7]; // General purpose buffer for output data
    268 
    269  void readReport(uint8_t controller); // read incoming data
    270  void printReport(uint8_t controller, uint8_t nBytes); // print incoming date - Uncomment for debugging
    271 
    272  /* Private commands */
    273  void XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes);
    274  void checkStatus();
    275 };
    276 #endif
    #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
    Definition: XBOXRECV.h:46
    LEDModeEnum
    Definition: xboxEnums.h:24
    uint8_t Poll()
    Definition: XBOXRECV.cpp:293
    void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller=0)
    Definition: XBOXRECV.cpp:557
    @@ -271,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_x_b_o_x_u_s_b_8cpp.html b/_x_b_o_x_u_s_b_8cpp.html index 45e13b6a..dd1cb8fd 100644 --- a/_x_b_o_x_u_s_b_8cpp.html +++ b/_x_b_o_x_u_s_b_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXUSB.cpp File Reference
    -
    #include "XBOXUSB.h"
    +
    #include "XBOXUSB.h"
    Include dependency graph for XBOXUSB.cpp:
    - + + + + + + +

    Go to the source code of this file.

    @@ -100,7 +107,7 @@ Include dependency graph for XBOXUSB.cpp:
    diff --git a/_x_b_o_x_u_s_b_8cpp__incl.map b/_x_b_o_x_u_s_b_8cpp__incl.map index 94b88c1b..ab21819a 100644 --- a/_x_b_o_x_u_s_b_8cpp__incl.map +++ b/_x_b_o_x_u_s_b_8cpp__incl.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/_x_b_o_x_u_s_b_8cpp__incl.md5 b/_x_b_o_x_u_s_b_8cpp__incl.md5 index 48fc7134..56fff921 100644 --- a/_x_b_o_x_u_s_b_8cpp__incl.md5 +++ b/_x_b_o_x_u_s_b_8cpp__incl.md5 @@ -1 +1 @@ -aeeebf19dc2418ea596d729160939475 \ No newline at end of file +c0796622753a276d2229e35ba1e7b14a \ No newline at end of file diff --git a/_x_b_o_x_u_s_b_8cpp__incl.png b/_x_b_o_x_u_s_b_8cpp__incl.png index 282d51563c0b56b30bb00b1abbf8128da299f6cb..2dc359a11471d717248db6d19f44b51218631a51 100644 GIT binary patch literal 15252 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 literal 17222 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 diff --git a/_x_b_o_x_u_s_b_8cpp_source.html b/_x_b_o_x_u_s_b_8cpp_source.html index 0a288587..e46c8e8b 100644 --- a/_x_b_o_x_u_s_b_8cpp_source.html +++ b/_x_b_o_x_u_s_b_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,369 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXUSB.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #include "XBOXUSB.h"
    -
    19 // To enable serial debugging see "settings.h"
    -
    20 //#define EXTRADEBUG // Uncomment to get even more debugging data
    -
    21 //#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
    -
    22 
    - -
    24 pUsb(p), // pointer to USB class instance - mandatory
    -
    25 bAddress(0), // device address - mandatory
    -
    26 bPollEnable(false) { // don't start polling before dongle is connected
    -
    27  for(uint8_t i = 0; i < XBOX_MAX_ENDPOINTS; i++) {
    -
    28  epInfo[i].epAddr = 0;
    -
    29  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    30  epInfo[i].bmSndToggle = 0;
    -
    31  epInfo[i].bmRcvToggle = 0;
    - -
    33  }
    -
    34 
    -
    35  if(pUsb) // register in USB subsystem
    -
    36  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    -
    37 }
    -
    38 
    -
    39 uint8_t XBOXUSB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    40  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    -
    41  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    42  uint8_t rcode;
    -
    43  UsbDevice *p = NULL;
    -
    44  EpInfo *oldep_ptr = NULL;
    -
    45  uint16_t PID;
    -
    46  uint16_t VID;
    -
    47 
    -
    48  // get memory address of USB device address pool
    -
    49  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    50 #ifdef EXTRADEBUG
    -
    51  Notify(PSTR("\r\nXBOXUSB Init"), 0x80);
    -
    52 #endif
    -
    53  // check if address has already been assigned to an instance
    -
    54  if(bAddress) {
    -
    55 #ifdef DEBUG_USB_HOST
    -
    56  Notify(PSTR("\r\nAddress in use"), 0x80);
    -
    57 #endif
    - -
    59  }
    -
    60 
    -
    61  // Get pointer to pseudo device with address 0 assigned
    -
    62  p = addrPool.GetUsbDevicePtr(0);
    -
    63 
    -
    64  if(!p) {
    -
    65 #ifdef DEBUG_USB_HOST
    -
    66  Notify(PSTR("\r\nAddress not found"), 0x80);
    -
    67 #endif
    - -
    69  }
    -
    70 
    -
    71  if(!p->epinfo) {
    -
    72 #ifdef DEBUG_USB_HOST
    -
    73  Notify(PSTR("\r\nepinfo is null"), 0x80);
    -
    74 #endif
    - -
    76  }
    -
    77 
    -
    78  // Save old pointer to EP_RECORD of address 0
    -
    79  oldep_ptr = p->epinfo;
    -
    80 
    -
    81  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    82  p->epinfo = epInfo;
    -
    83 
    -
    84  p->lowspeed = lowspeed;
    -
    85 
    -
    86  // Get device descriptor
    -
    87  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    -
    88  // Restore p->epinfo
    -
    89  p->epinfo = oldep_ptr;
    -
    90 
    -
    91  if(rcode)
    -
    92  goto FailGetDevDescr;
    -
    93 
    -
    94  VID = udd->idVendor;
    -
    95  PID = udd->idProduct;
    -
    96 
    -
    97  if(VID != XBOX_VID && VID != MADCATZ_VID && VID != JOYTECH_VID && VID != GAMESTOP_VID) // Check VID
    -
    98  goto FailUnknownDevice;
    -
    99  if(PID == XBOX_WIRELESS_PID) {
    -
    100 #ifdef DEBUG_USB_HOST
    -
    101  Notify(PSTR("\r\nYou have plugged in a wireless Xbox 360 controller - it doesn't support USB communication"), 0x80);
    -
    102 #endif
    -
    103  goto FailUnknownDevice;
    - -
    105 #ifdef DEBUG_USB_HOST
    -
    106  Notify(PSTR("\r\nThis library only supports Xbox 360 controllers via USB"), 0x80);
    -
    107 #endif
    -
    108  goto FailUnknownDevice;
    -
    109  } else if(PID != XBOX_WIRED_PID && PID != MADCATZ_WIRED_PID && PID != GAMESTOP_WIRED_PID && PID != AFTERGLOW_WIRED_PID && PID != JOYTECH_WIRED_PID) // Check PID
    -
    110  goto FailUnknownDevice;
    -
    111 
    -
    112  // Allocate new address according to device class
    -
    113  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    114 
    -
    115  if(!bAddress)
    - -
    117 
    -
    118  // Extract Max Packet Size from device descriptor
    -
    119  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    -
    120 
    -
    121  // Assign new address to the device
    -
    122  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    123  if(rcode) {
    -
    124  p->lowspeed = false;
    -
    125  addrPool.FreeAddress(bAddress);
    -
    126  bAddress = 0;
    -
    127 #ifdef DEBUG_USB_HOST
    -
    128  Notify(PSTR("\r\nsetAddr: "), 0x80);
    -
    129  D_PrintHex<uint8_t > (rcode, 0x80);
    -
    130 #endif
    -
    131  return rcode;
    -
    132  }
    -
    133 #ifdef EXTRADEBUG
    -
    134  Notify(PSTR("\r\nAddr: "), 0x80);
    -
    135  D_PrintHex<uint8_t > (bAddress, 0x80);
    -
    136 #endif
    -
    137  //delay(300); // Spec says you should wait at least 200ms
    -
    138 
    -
    139  p->lowspeed = false;
    -
    140 
    -
    141  //get pointer to assigned address record
    -
    142  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    143  if(!p)
    - -
    145 
    -
    146  p->lowspeed = lowspeed;
    -
    147 
    -
    148  // Assign epInfo to epinfo pointer - only EP0 is known
    -
    149  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    150  if(rcode)
    -
    151  goto FailSetDevTblEntry;
    -
    152 
    -
    153  /* The application will work in reduced host mode, so we can save program and data
    -
    154  memory space. After verifying the VID we will use known values for the
    -
    155  configuration values for device, interface, endpoints and HID for the XBOX360 Controllers */
    -
    156 
    -
    157  /* Initialize data structures for endpoints of device */
    -
    158  epInfo[ XBOX_INPUT_PIPE ].epAddr = 0x01; // XBOX 360 report endpoint
    - -
    160  epInfo[ XBOX_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    164  epInfo[ XBOX_OUTPUT_PIPE ].epAddr = 0x02; // XBOX 360 output endpoint
    - -
    166  epInfo[ XBOX_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    - - - -
    170 
    -
    171  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
    -
    172  if(rcode)
    -
    173  goto FailSetDevTblEntry;
    -
    174 
    -
    175  delay(200); // Give time for address change
    -
    176 
    -
    177  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_CONTROL_PIPE ].epAddr, 1);
    -
    178  if(rcode)
    -
    179  goto FailSetConfDescr;
    -
    180 
    -
    181 #ifdef DEBUG_USB_HOST
    -
    182  Notify(PSTR("\r\nXbox 360 Controller Connected\r\n"), 0x80);
    -
    183 #endif
    -
    184  onInit();
    -
    185  Xbox360Connected = true;
    -
    186  bPollEnable = true;
    -
    187  return 0; // Successful configuration
    -
    188 
    -
    189  /* Diagnostic messages */
    -
    190 FailGetDevDescr:
    -
    191 #ifdef DEBUG_USB_HOST
    - -
    193  goto Fail;
    -
    194 #endif
    -
    195 
    -
    196 FailSetDevTblEntry:
    -
    197 #ifdef DEBUG_USB_HOST
    - -
    199  goto Fail;
    -
    200 #endif
    -
    201 
    -
    202 FailSetConfDescr:
    -
    203 #ifdef DEBUG_USB_HOST
    - -
    205 #endif
    -
    206  goto Fail;
    -
    207 
    -
    208 FailUnknownDevice:
    -
    209 #ifdef DEBUG_USB_HOST
    -
    210  NotifyFailUnknownDevice(VID, PID);
    -
    211 #endif
    - -
    213 
    -
    214 Fail:
    -
    215 #ifdef DEBUG_USB_HOST
    -
    216  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    -
    217  NotifyFail(rcode);
    -
    218 #endif
    -
    219  Release();
    -
    220  return rcode;
    -
    221 }
    -
    222 
    -
    223 /* Performs a cleanup after failed Init() attempt */
    -
    224 uint8_t XBOXUSB::Release() {
    -
    225  Xbox360Connected = false;
    - -
    227  bAddress = 0;
    -
    228  bPollEnable = false;
    -
    229  return 0;
    -
    230 }
    -
    231 
    -
    232 uint8_t XBOXUSB::Poll() {
    -
    233  if(!bPollEnable)
    -
    234  return 0;
    -
    235  uint16_t BUFFER_SIZE = EP_MAXPKTSIZE;
    -
    236  pUsb->inTransfer(bAddress, epInfo[ XBOX_INPUT_PIPE ].epAddr, &BUFFER_SIZE, readBuf); // input on endpoint 1
    -
    237  readReport();
    -
    238 #ifdef PRINTREPORT
    -
    239  printReport(); // Uncomment "#define PRINTREPORT" to print the report send by the Xbox 360 Controller
    -
    240 #endif
    -
    241  return 0;
    -
    242 }
    -
    243 
    -
    244 void XBOXUSB::readReport() {
    -
    245  if(readBuf == NULL)
    -
    246  return;
    -
    247  if(readBuf[0] != 0x00 || readBuf[1] != 0x14) { // Check if it's the correct report - the controller also sends different status reports
    -
    248  return;
    -
    249  }
    -
    250 
    -
    251  ButtonState = (uint32_t)(readBuf[5] | ((uint16_t)readBuf[4] << 8) | ((uint32_t)readBuf[3] << 16) | ((uint32_t)readBuf[2] << 24));
    -
    252 
    -
    253  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[7] << 8) | readBuf[6]);
    -
    254  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[9] << 8) | readBuf[8]);
    -
    255  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
    -
    256  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
    -
    257 
    -
    258  //Notify(PSTR("\r\nButtonState"), 0x80);
    -
    259  //PrintHex<uint32_t>(ButtonState, 0x80);
    -
    260 
    -
    261  if(ButtonState != OldButtonState) {
    -
    262  ButtonClickState = (ButtonState >> 16) & ((~OldButtonState) >> 16); // Update click state variable, but don't include the two trigger buttons L2 and R2
    -
    263  if(((uint8_t)OldButtonState) == 0 && ((uint8_t)ButtonState) != 0) // The L2 and R2 buttons are special as they are analog buttons
    -
    264  R2Clicked = true;
    -
    265  if((uint8_t)(OldButtonState >> 8) == 0 && (uint8_t)(ButtonState >> 8) != 0)
    -
    266  L2Clicked = true;
    -
    267  OldButtonState = ButtonState;
    -
    268  }
    -
    269 }
    -
    270 
    -
    271 void XBOXUSB::printReport() { //Uncomment "#define PRINTREPORT" to print the report send by the Xbox 360 Controller
    -
    272 #ifdef PRINTREPORT
    -
    273  if(readBuf == NULL)
    -
    274  return;
    -
    275  for(uint8_t i = 0; i < XBOX_REPORT_BUFFER_SIZE; i++) {
    -
    276  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    -
    277  Notify(PSTR(" "), 0x80);
    -
    278  }
    -
    279  Notify(PSTR("\r\n"), 0x80);
    -
    280 #endif
    -
    281 }
    -
    282 
    - -
    284  if(b == L2) // These are analog buttons
    -
    285  return (uint8_t)(ButtonState >> 8);
    -
    286  else if(b == R2)
    -
    287  return (uint8_t)ButtonState;
    -
    288  return (bool)(ButtonState & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]) << 16));
    -
    289 }
    -
    290 
    - -
    292  if(b == L2) {
    -
    293  if(L2Clicked) {
    -
    294  L2Clicked = false;
    -
    295  return true;
    -
    296  }
    -
    297  return false;
    -
    298  } else if(b == R2) {
    -
    299  if(R2Clicked) {
    -
    300  R2Clicked = false;
    -
    301  return true;
    -
    302  }
    -
    303  return false;
    -
    304  }
    -
    305  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    -
    306  bool click = (ButtonClickState & button);
    -
    307  ButtonClickState &= ~button; // clear "click" event
    -
    308  return click;
    -
    309 }
    -
    310 
    - -
    312  return hatValue[a];
    -
    313 }
    -
    314 
    -
    315 /* Xbox Controller commands */
    -
    316 void XBOXUSB::XboxCommand(uint8_t* data, uint16_t nbytes) {
    -
    317  //bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x00), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
    -
    318  pUsb->ctrlReq(bAddress, epInfo[XBOX_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    -
    319 }
    -
    320 
    -
    321 void XBOXUSB::setLedRaw(uint8_t value) {
    -
    322  writeBuf[0] = 0x01;
    -
    323  writeBuf[1] = 0x03;
    -
    324  writeBuf[2] = value;
    -
    325 
    -
    326  XboxCommand(writeBuf, 3);
    -
    327 }
    -
    328 
    - -
    330  if(led == OFF)
    -
    331  setLedRaw(0);
    -
    332  else if(led != ALL) // All LEDs can't be on a the same time
    -
    333  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4);
    -
    334 }
    -
    335 
    - -
    337  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]));
    -
    338 }
    -
    339 
    -
    340 void XBOXUSB::setLedMode(LEDModeEnum ledMode) { // This function is used to do some special LED stuff the controller supports
    -
    341  setLedRaw((uint8_t)ledMode);
    -
    342 }
    -
    343 
    -
    344 void XBOXUSB::setRumbleOn(uint8_t lValue, uint8_t rValue) {
    -
    345  writeBuf[0] = 0x00;
    -
    346  writeBuf[1] = 0x08;
    -
    347  writeBuf[2] = 0x00;
    -
    348  writeBuf[3] = lValue; // big weight
    -
    349  writeBuf[4] = rValue; // small weight
    -
    350  writeBuf[5] = 0x00;
    -
    351  writeBuf[6] = 0x00;
    -
    352  writeBuf[7] = 0x00;
    -
    353 
    -
    354  XboxCommand(writeBuf, 8);
    -
    355 }
    -
    356 
    -
    357 void XBOXUSB::onInit() {
    -
    358  if(pFuncOnInit)
    -
    359  pFuncOnInit(); // Call the user function
    -
    360  else
    -
    361  setLedOn(static_cast<LEDEnum>(LED1));
    -
    362 }
    -
    #define XBOX_WIRED_PID
    Definition: XBOXUSB.h:39
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #include "XBOXUSB.h"
    19 // To enable serial debugging see "settings.h"
    20 //#define EXTRADEBUG // Uncomment to get even more debugging data
    21 //#define PRINTREPORT // Uncomment to print the report send by the Xbox 360 Controller
    22 
    24 pUsb(p), // pointer to USB class instance - mandatory
    25 bAddress(0), // device address - mandatory
    26 bPollEnable(false) { // don't start polling before dongle is connected
    27  for(uint8_t i = 0; i < XBOX_MAX_ENDPOINTS; i++) {
    28  epInfo[i].epAddr = 0;
    29  epInfo[i].maxPktSize = (i) ? 0 : 8;
    30  epInfo[i].bmSndToggle = 0;
    31  epInfo[i].bmRcvToggle = 0;
    33  }
    34 
    35  if(pUsb) // register in USB subsystem
    36  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    37 }
    38 
    39 uint8_t XBOXUSB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    40  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    41  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    42  uint8_t rcode;
    43  UsbDevice *p = NULL;
    44  EpInfo *oldep_ptr = NULL;
    45  uint16_t PID;
    46  uint16_t VID;
    47 
    48  // get memory address of USB device address pool
    49  AddressPool &addrPool = pUsb->GetAddressPool();
    50 #ifdef EXTRADEBUG
    51  Notify(PSTR("\r\nXBOXUSB Init"), 0x80);
    52 #endif
    53  // check if address has already been assigned to an instance
    54  if(bAddress) {
    55 #ifdef DEBUG_USB_HOST
    56  Notify(PSTR("\r\nAddress in use"), 0x80);
    57 #endif
    59  }
    60 
    61  // Get pointer to pseudo device with address 0 assigned
    62  p = addrPool.GetUsbDevicePtr(0);
    63 
    64  if(!p) {
    65 #ifdef DEBUG_USB_HOST
    66  Notify(PSTR("\r\nAddress not found"), 0x80);
    67 #endif
    69  }
    70 
    71  if(!p->epinfo) {
    72 #ifdef DEBUG_USB_HOST
    73  Notify(PSTR("\r\nepinfo is null"), 0x80);
    74 #endif
    76  }
    77 
    78  // Save old pointer to EP_RECORD of address 0
    79  oldep_ptr = p->epinfo;
    80 
    81  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    82  p->epinfo = epInfo;
    83 
    84  p->lowspeed = lowspeed;
    85 
    86  // Get device descriptor
    87  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    88  // Restore p->epinfo
    89  p->epinfo = oldep_ptr;
    90 
    91  if(rcode)
    92  goto FailGetDevDescr;
    93 
    94  VID = udd->idVendor;
    95  PID = udd->idProduct;
    96 
    97  if(VID != XBOX_VID && VID != MADCATZ_VID && VID != JOYTECH_VID && VID != GAMESTOP_VID) // Check VID
    98  goto FailUnknownDevice;
    99  if(PID == XBOX_WIRELESS_PID) {
    100 #ifdef DEBUG_USB_HOST
    101  Notify(PSTR("\r\nYou have plugged in a wireless Xbox 360 controller - it doesn't support USB communication"), 0x80);
    102 #endif
    103  goto FailUnknownDevice;
    105 #ifdef DEBUG_USB_HOST
    106  Notify(PSTR("\r\nThis library only supports Xbox 360 controllers via USB"), 0x80);
    107 #endif
    108  goto FailUnknownDevice;
    109  } else if(PID != XBOX_WIRED_PID && PID != MADCATZ_WIRED_PID && PID != GAMESTOP_WIRED_PID && PID != AFTERGLOW_WIRED_PID && PID != JOYTECH_WIRED_PID) // Check PID
    110  goto FailUnknownDevice;
    111 
    112  // Allocate new address according to device class
    113  bAddress = addrPool.AllocAddress(parent, false, port);
    114 
    115  if(!bAddress)
    117 
    118  // Extract Max Packet Size from device descriptor
    119  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    120 
    121  // Assign new address to the device
    122  rcode = pUsb->setAddr(0, 0, bAddress);
    123  if(rcode) {
    124  p->lowspeed = false;
    125  addrPool.FreeAddress(bAddress);
    126  bAddress = 0;
    127 #ifdef DEBUG_USB_HOST
    128  Notify(PSTR("\r\nsetAddr: "), 0x80);
    129  D_PrintHex<uint8_t > (rcode, 0x80);
    130 #endif
    131  return rcode;
    132  }
    133 #ifdef EXTRADEBUG
    134  Notify(PSTR("\r\nAddr: "), 0x80);
    135  D_PrintHex<uint8_t > (bAddress, 0x80);
    136 #endif
    137  //delay(300); // Spec says you should wait at least 200ms
    138 
    139  p->lowspeed = false;
    140 
    141  //get pointer to assigned address record
    142  p = addrPool.GetUsbDevicePtr(bAddress);
    143  if(!p)
    145 
    146  p->lowspeed = lowspeed;
    147 
    148  // Assign epInfo to epinfo pointer - only EP0 is known
    149  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    150  if(rcode)
    151  goto FailSetDevTblEntry;
    152 
    153  /* The application will work in reduced host mode, so we can save program and data
    154  memory space. After verifying the VID we will use known values for the
    155  configuration values for device, interface, endpoints and HID for the XBOX360 Controllers */
    156 
    157  /* Initialize data structures for endpoints of device */
    158  epInfo[ XBOX_INPUT_PIPE ].epAddr = 0x01; // XBOX 360 report endpoint
    160  epInfo[ XBOX_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    164  epInfo[ XBOX_OUTPUT_PIPE ].epAddr = 0x02; // XBOX 360 output endpoint
    166  epInfo[ XBOX_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    170 
    171  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
    172  if(rcode)
    173  goto FailSetDevTblEntry;
    174 
    175  delay(200); // Give time for address change
    176 
    177  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_CONTROL_PIPE ].epAddr, 1);
    178  if(rcode)
    179  goto FailSetConfDescr;
    180 
    181 #ifdef DEBUG_USB_HOST
    182  Notify(PSTR("\r\nXbox 360 Controller Connected\r\n"), 0x80);
    183 #endif
    184  onInit();
    185  Xbox360Connected = true;
    186  bPollEnable = true;
    187  return 0; // Successful configuration
    188 
    189  /* Diagnostic messages */
    190 FailGetDevDescr:
    191 #ifdef DEBUG_USB_HOST
    193  goto Fail;
    194 #endif
    195 
    196 FailSetDevTblEntry:
    197 #ifdef DEBUG_USB_HOST
    199  goto Fail;
    200 #endif
    201 
    202 FailSetConfDescr:
    203 #ifdef DEBUG_USB_HOST
    205 #endif
    206  goto Fail;
    207 
    208 FailUnknownDevice:
    209 #ifdef DEBUG_USB_HOST
    210  NotifyFailUnknownDevice(VID, PID);
    211 #endif
    213 
    214 Fail:
    215 #ifdef DEBUG_USB_HOST
    216  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    217  NotifyFail(rcode);
    218 #endif
    219  Release();
    220  return rcode;
    221 }
    222 
    223 /* Performs a cleanup after failed Init() attempt */
    224 uint8_t XBOXUSB::Release() {
    225  Xbox360Connected = false;
    227  bAddress = 0;
    228  bPollEnable = false;
    229  return 0;
    230 }
    231 
    232 uint8_t XBOXUSB::Poll() {
    233  if(!bPollEnable)
    234  return 0;
    235  uint16_t BUFFER_SIZE = EP_MAXPKTSIZE;
    236  pUsb->inTransfer(bAddress, epInfo[ XBOX_INPUT_PIPE ].epAddr, &BUFFER_SIZE, readBuf); // input on endpoint 1
    237  readReport();
    238 #ifdef PRINTREPORT
    239  printReport(); // Uncomment "#define PRINTREPORT" to print the report send by the Xbox 360 Controller
    240 #endif
    241  return 0;
    242 }
    243 
    244 void XBOXUSB::readReport() {
    245  if(readBuf == NULL)
    246  return;
    247  if(readBuf[0] != 0x00 || readBuf[1] != 0x14) { // Check if it's the correct report - the controller also sends different status reports
    248  return;
    249  }
    250 
    251  ButtonState = (uint32_t)(readBuf[5] | ((uint16_t)readBuf[4] << 8) | ((uint32_t)readBuf[3] << 16) | ((uint32_t)readBuf[2] << 24));
    252 
    253  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[7] << 8) | readBuf[6]);
    254  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[9] << 8) | readBuf[8]);
    255  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
    256  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
    257 
    258  //Notify(PSTR("\r\nButtonState"), 0x80);
    259  //PrintHex<uint32_t>(ButtonState, 0x80);
    260 
    261  if(ButtonState != OldButtonState) {
    262  ButtonClickState = (ButtonState >> 16) & ((~OldButtonState) >> 16); // Update click state variable, but don't include the two trigger buttons L2 and R2
    263  if(((uint8_t)OldButtonState) == 0 && ((uint8_t)ButtonState) != 0) // The L2 and R2 buttons are special as they are analog buttons
    264  R2Clicked = true;
    265  if((uint8_t)(OldButtonState >> 8) == 0 && (uint8_t)(ButtonState >> 8) != 0)
    266  L2Clicked = true;
    267  OldButtonState = ButtonState;
    268  }
    269 }
    270 
    271 void XBOXUSB::printReport() { //Uncomment "#define PRINTREPORT" to print the report send by the Xbox 360 Controller
    272 #ifdef PRINTREPORT
    273  if(readBuf == NULL)
    274  return;
    275  for(uint8_t i = 0; i < XBOX_REPORT_BUFFER_SIZE; i++) {
    276  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    277  Notify(PSTR(" "), 0x80);
    278  }
    279  Notify(PSTR("\r\n"), 0x80);
    280 #endif
    281 }
    282 
    284  if(b == L2) // These are analog buttons
    285  return (uint8_t)(ButtonState >> 8);
    286  else if(b == R2)
    287  return (uint8_t)ButtonState;
    288  return (bool)(ButtonState & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]) << 16));
    289 }
    290 
    292  if(b == L2) {
    293  if(L2Clicked) {
    294  L2Clicked = false;
    295  return true;
    296  }
    297  return false;
    298  } else if(b == R2) {
    299  if(R2Clicked) {
    300  R2Clicked = false;
    301  return true;
    302  }
    303  return false;
    304  }
    305  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    306  bool click = (ButtonClickState & button);
    307  ButtonClickState &= ~button; // clear "click" event
    308  return click;
    309 }
    310 
    312  return hatValue[a];
    313 }
    314 
    315 /* Xbox Controller commands */
    316 void XBOXUSB::XboxCommand(uint8_t* data, uint16_t nbytes) {
    317  //bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x00), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
    318  pUsb->ctrlReq(bAddress, epInfo[XBOX_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    319 }
    320 
    321 void XBOXUSB::setLedRaw(uint8_t value) {
    322  writeBuf[0] = 0x01;
    323  writeBuf[1] = 0x03;
    324  writeBuf[2] = value;
    325 
    326  XboxCommand(writeBuf, 3);
    327 }
    328 
    330  if(led == OFF)
    331  setLedRaw(0);
    332  else if(led != ALL) // All LEDs can't be on a the same time
    333  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4);
    334 }
    335 
    337  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]));
    338 }
    339 
    340 void XBOXUSB::setLedMode(LEDModeEnum ledMode) { // This function is used to do some special LED stuff the controller supports
    341  setLedRaw((uint8_t)ledMode);
    342 }
    343 
    344 void XBOXUSB::setRumbleOn(uint8_t lValue, uint8_t rValue) {
    345  writeBuf[0] = 0x00;
    346  writeBuf[1] = 0x08;
    347  writeBuf[2] = 0x00;
    348  writeBuf[3] = lValue; // big weight
    349  writeBuf[4] = rValue; // small weight
    350  writeBuf[5] = 0x00;
    351  writeBuf[6] = 0x00;
    352  writeBuf[7] = 0x00;
    353 
    354  XboxCommand(writeBuf, 8);
    355 }
    356 
    357 void XBOXUSB::onInit() {
    358  if(pFuncOnInit)
    359  pFuncOnInit(); // Call the user function
    360  else
    361  setLedOn(static_cast<LEDEnum>(LED1));
    362 }
    #define XBOX_WIRED_PID
    Definition: XBOXUSB.h:39
    uint8_t bmRcvToggle
    Definition: address.h:48
    #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
    Definition: XBOXRECV.h:46
    @@ -545,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_x_b_o_x_u_s_b_8h.html b/_x_b_o_x_u_s_b_8h.html index 4b4d2abc..faf62d10 100644 --- a/_x_b_o_x_u_s_b_8h.html +++ b/_x_b_o_x_u_s_b_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,22 +89,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXUSB.h File Reference
    -
    #include "Usb.h"
    -#include "usbhid.h"
    -#include "xboxEnums.h"
    +
    #include "Usb.h"
    +#include "usbhid.h"
    +#include "xboxEnums.h"
    Include dependency graph for XBOXUSB.h:
    - + + + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -410,7 +417,7 @@ Macros diff --git a/_x_b_o_x_u_s_b_8h__dep__incl.map b/_x_b_o_x_u_s_b_8h__dep__incl.map index 4c3784f0..97a167a3 100644 --- a/_x_b_o_x_u_s_b_8h__dep__incl.map +++ b/_x_b_o_x_u_s_b_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/_x_b_o_x_u_s_b_8h__dep__incl.md5 b/_x_b_o_x_u_s_b_8h__dep__incl.md5 index 03f735e5..ffb0405c 100644 --- a/_x_b_o_x_u_s_b_8h__dep__incl.md5 +++ b/_x_b_o_x_u_s_b_8h__dep__incl.md5 @@ -1 +1 @@ -aef1e874621fe82e06208994ca6c31c1 \ No newline at end of file +18da52fa9e2758f5b169a34307b52822 \ No newline at end of file diff --git a/_x_b_o_x_u_s_b_8h__dep__incl.png b/_x_b_o_x_u_s_b_8h__dep__incl.png index 28d08df6c4a4b196306dd70ed0c7286940d1c3e5..4852ab9f9247cff444d0b2b6d4e8c3866e1e2909 100644 GIT binary patch literal 2848 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 diff --git a/_x_b_o_x_u_s_b_8h__incl.map b/_x_b_o_x_u_s_b_8h__incl.map index 0cd83d7f..0c6a4e15 100644 --- a/_x_b_o_x_u_s_b_8h__incl.map +++ b/_x_b_o_x_u_s_b_8h__incl.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/_x_b_o_x_u_s_b_8h__incl.md5 b/_x_b_o_x_u_s_b_8h__incl.md5 index e6bc3b00..9ea5abe3 100644 --- a/_x_b_o_x_u_s_b_8h__incl.md5 +++ b/_x_b_o_x_u_s_b_8h__incl.md5 @@ -1 +1 @@ -5ffed0cacc144f91cce7ea1833931bf0 \ No newline at end of file +bffb200b269ce5778ffd1fb3cca482e2 \ No newline at end of file diff --git a/_x_b_o_x_u_s_b_8h__incl.png b/_x_b_o_x_u_s_b_8h__incl.png index 4f185bb1d49c91a37cde8f65b2462e1bd24f8e80..8ba28600e4770bc003eeb78659a19686ae02512a 100644 GIT binary patch literal 13466 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 Y%k7X78$2gyNQJzXRh21`GW`C(0Qwc6sQ>@~ diff --git a/_x_b_o_x_u_s_b_8h_source.html b/_x_b_o_x_u_s_b_8h_source.html index bc12bfd5..f697a2cc 100644 --- a/_x_b_o_x_u_s_b_8h_source.html +++ b/_x_b_o_x_u_s_b_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,135 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    XBOXUSB.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _xboxusb_h_
    -
    19 #define _xboxusb_h_
    -
    20 
    -
    21 #include "Usb.h"
    -
    22 #include "usbhid.h"
    -
    23 #include "xboxEnums.h"
    -
    24 
    -
    25 /* Data Xbox 360 taken from descriptors */
    -
    26 #define EP_MAXPKTSIZE 32 // max size for data via USB
    -
    27 
    -
    28 /* Names we give to the 3 Xbox360 pipes */
    -
    29 #define XBOX_CONTROL_PIPE 0
    -
    30 #define XBOX_INPUT_PIPE 1
    -
    31 #define XBOX_OUTPUT_PIPE 2
    -
    32 
    -
    33 // PID and VID of the different devices
    -
    34 #define XBOX_VID 0x045E // Microsoft Corporation
    -
    35 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz controllers
    -
    36 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    -
    37 #define GAMESTOP_VID 0x0E6F // Gamestop controller
    -
    38 
    -
    39 #define XBOX_WIRED_PID 0x028E // Microsoft 360 Wired controller
    -
    40 #define XBOX_WIRELESS_PID 0x028F // Wireless controller only support charging
    -
    41 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
    -
    42 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
    -
    43 #define MADCATZ_WIRED_PID 0xF016 // Mad Catz wired controller
    -
    44 #define JOYTECH_WIRED_PID 0xBEEF // For Joytech wired controller
    -
    45 #define GAMESTOP_WIRED_PID 0x0401 // Gamestop wired controller
    -
    46 #define AFTERGLOW_WIRED_PID 0x0213 // Afterglow wired controller - it uses the same VID as a Gamestop controller
    -
    47 
    -
    48 #define XBOX_REPORT_BUFFER_SIZE 14 // Size of the input report buffer
    -
    49 
    -
    50 #define XBOX_MAX_ENDPOINTS 3
    -
    51 
    -
    53 class XBOXUSB : public USBDeviceConfig {
    -
    54 public:
    -
    59  XBOXUSB(USB *pUsb);
    -
    60 
    -
    69  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    74  uint8_t Release();
    -
    79  uint8_t Poll();
    -
    80 
    -
    85  virtual uint8_t GetAddress() {
    -
    86  return bAddress;
    -
    87  };
    -
    88 
    -
    93  virtual bool isReady() {
    -
    94  return bPollEnable;
    -
    95  };
    -
    96 
    -
    103  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    104  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID || vid == GAMESTOP_VID) && (pid == XBOX_WIRED_PID || pid == MADCATZ_WIRED_PID || pid == GAMESTOP_WIRED_PID || pid == AFTERGLOW_WIRED_PID || pid == JOYTECH_WIRED_PID));
    -
    105  };
    -
    119  uint8_t getButtonPress(ButtonEnum b);
    -
    120  bool getButtonClick(ButtonEnum b);
    -
    129  int16_t getAnalogHat(AnalogHatEnum a);
    -
    130 
    -
    132  void setAllOff() {
    -
    133  setRumbleOn(0, 0);
    -
    134  setLedRaw(0);
    -
    135  };
    -
    136 
    -
    138  void setRumbleOff() {
    -
    139  setRumbleOn(0, 0);
    -
    140  };
    -
    146  void setRumbleOn(uint8_t lValue, uint8_t rValue);
    -
    153  void setLedRaw(uint8_t value);
    -
    154 
    -
    156  void setLedOff() {
    -
    157  setLedRaw(0);
    -
    158  };
    -
    163  void setLedOn(LEDEnum l);
    -
    168  void setLedBlink(LEDEnum l);
    -
    173  void setLedMode(LEDModeEnum lm);
    -
    174 
    -
    179  void attachOnInit(void (*funcOnInit)(void)) {
    -
    180  pFuncOnInit = funcOnInit;
    -
    181  };
    -
    185  bool Xbox360Connected;
    -
    186 
    -
    187 protected:
    - -
    191  uint8_t bAddress;
    - -
    194 
    -
    195 private:
    -
    201  void onInit();
    -
    202  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    203 
    -
    204  bool bPollEnable;
    -
    205 
    -
    206  /* Variables to store the buttons */
    -
    207  uint32_t ButtonState;
    -
    208  uint32_t OldButtonState;
    -
    209  uint16_t ButtonClickState;
    -
    210  int16_t hatValue[4];
    -
    211  uint16_t controllerStatus;
    -
    212 
    -
    213  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    -
    214  bool R2Clicked;
    -
    215 
    -
    216  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    -
    217  uint8_t writeBuf[8]; // General purpose buffer for output data
    -
    218 
    -
    219  void readReport(); // read incoming data
    -
    220  void printReport(); // print incoming date - Uncomment for debugging
    -
    221 
    -
    222  /* Private commands */
    -
    223  void XboxCommand(uint8_t* data, uint16_t nbytes);
    -
    224 };
    -
    225 #endif
    -
    #define XBOX_WIRED_PID
    Definition: XBOXUSB.h:39
    +Go to the documentation of this file.
    1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _xboxusb_h_
    19 #define _xboxusb_h_
    20 
    21 #include "Usb.h"
    22 #include "usbhid.h"
    23 #include "xboxEnums.h"
    24 
    25 /* Data Xbox 360 taken from descriptors */
    26 #define EP_MAXPKTSIZE 32 // max size for data via USB
    27 
    28 /* Names we give to the 3 Xbox360 pipes */
    29 #define XBOX_CONTROL_PIPE 0
    30 #define XBOX_INPUT_PIPE 1
    31 #define XBOX_OUTPUT_PIPE 2
    32 
    33 // PID and VID of the different devices
    34 #define XBOX_VID 0x045E // Microsoft Corporation
    35 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz controllers
    36 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    37 #define GAMESTOP_VID 0x0E6F // Gamestop controller
    38 
    39 #define XBOX_WIRED_PID 0x028E // Microsoft 360 Wired controller
    40 #define XBOX_WIRELESS_PID 0x028F // Wireless controller only support charging
    41 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
    42 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
    43 #define MADCATZ_WIRED_PID 0xF016 // Mad Catz wired controller
    44 #define JOYTECH_WIRED_PID 0xBEEF // For Joytech wired controller
    45 #define GAMESTOP_WIRED_PID 0x0401 // Gamestop wired controller
    46 #define AFTERGLOW_WIRED_PID 0x0213 // Afterglow wired controller - it uses the same VID as a Gamestop controller
    47 
    48 #define XBOX_REPORT_BUFFER_SIZE 14 // Size of the input report buffer
    49 
    50 #define XBOX_MAX_ENDPOINTS 3
    51 
    53 class XBOXUSB : public USBDeviceConfig {
    54 public:
    59  XBOXUSB(USB *pUsb);
    60 
    69  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    74  uint8_t Release();
    79  uint8_t Poll();
    80 
    85  virtual uint8_t GetAddress() {
    86  return bAddress;
    87  };
    88 
    93  virtual bool isReady() {
    94  return bPollEnable;
    95  };
    96 
    103  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    104  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID || vid == GAMESTOP_VID) && (pid == XBOX_WIRED_PID || pid == MADCATZ_WIRED_PID || pid == GAMESTOP_WIRED_PID || pid == AFTERGLOW_WIRED_PID || pid == JOYTECH_WIRED_PID));
    105  };
    119  uint8_t getButtonPress(ButtonEnum b);
    120  bool getButtonClick(ButtonEnum b);
    129  int16_t getAnalogHat(AnalogHatEnum a);
    130 
    132  void setAllOff() {
    133  setRumbleOn(0, 0);
    134  setLedRaw(0);
    135  };
    136 
    138  void setRumbleOff() {
    139  setRumbleOn(0, 0);
    140  };
    146  void setRumbleOn(uint8_t lValue, uint8_t rValue);
    153  void setLedRaw(uint8_t value);
    154 
    156  void setLedOff() {
    157  setLedRaw(0);
    158  };
    163  void setLedOn(LEDEnum l);
    168  void setLedBlink(LEDEnum l);
    173  void setLedMode(LEDModeEnum lm);
    174 
    179  void attachOnInit(void (*funcOnInit)(void)) {
    180  pFuncOnInit = funcOnInit;
    181  };
    185  bool Xbox360Connected;
    186 
    187 protected:
    191  uint8_t bAddress;
    194 
    195 private:
    201  void onInit();
    202  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    203 
    204  bool bPollEnable;
    205 
    206  /* Variables to store the buttons */
    207  uint32_t ButtonState;
    208  uint32_t OldButtonState;
    209  uint16_t ButtonClickState;
    210  int16_t hatValue[4];
    211  uint16_t controllerStatus;
    212 
    213  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    214  bool R2Clicked;
    215 
    216  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    217  uint8_t writeBuf[8]; // General purpose buffer for output data
    218 
    219  void readReport(); // read incoming data
    220  void printReport(); // print incoming date - Uncomment for debugging
    221 
    222  /* Private commands */
    223  void XboxCommand(uint8_t* data, uint16_t nbytes);
    224 };
    225 #endif
    #define XBOX_WIRED_PID
    Definition: XBOXUSB.h:39
    LEDModeEnum
    Definition: xboxEnums.h:24
    void setLedOn(LEDEnum l)
    Definition: XBOXUSB.cpp:329
    #define MADCATZ_VID
    Definition: XBOXUSB.h:35
    @@ -263,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/address_8h.html b/address_8h.html index f3ed321e..7a523b0a 100644 --- a/address_8h.html +++ b/address_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: address.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -128,8 +129,8 @@ Macros - - + +

    Typedefs

    typedef void(* UsbDeviceHandleFunc )(UsbDevice *pdev)
     
    typedef void(* UsbDeviceHandleFunc) (UsbDevice *pdev)
     

    Macro Definition Documentation

    @@ -259,12 +260,12 @@ Typedefs

    Typedef Documentation

    - +
    - +
    typedef void(* UsbDeviceHandleFunc)(UsbDevice *pdev)typedef void(* UsbDeviceHandleFunc) (UsbDevice *pdev)
    @@ -278,7 +279,7 @@ Typedefs diff --git a/address_8h_source.html b/address_8h_source.html index 38cf4bb7..eaf1c570 100644 --- a/address_8h_source.html +++ b/address_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: address.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,297 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    address.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This program is free software; you can redistribute it and/or modify
    -
    4 it under the terms of the GNU General Public License as published by
    -
    5 the Free Software Foundation; either version 2 of the License, or
    -
    6 (at your option) any later version.
    -
    7 
    -
    8 This program is distributed in the hope that it will be useful,
    -
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    -
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    -
    11 GNU General Public License for more details.
    -
    12 
    -
    13 You should have received a copy of the GNU General Public License
    -
    14 along with this program; if not, write to the Free Software
    -
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    16 
    -
    17 Contact information
    -
    18 -------------------
    -
    19 
    -
    20 Circuits At Home, LTD
    -
    21 Web : http://www.circuitsathome.com
    -
    22 e-mail : support@circuitsathome.com
    -
    23  */
    -
    24 
    -
    25 #if !defined(_usb_h_) || defined(__ADDRESS_H__)
    -
    26 #error "Never include address.h directly; include Usb.h instead"
    -
    27 #else
    -
    28 #define __ADDRESS_H__
    -
    29 
    -
    30 
    -
    31 
    -
    32 /* NAK powers. To save space in endpoint data structure, amount of retries before giving up and returning 0x4 is stored in */
    -
    33 /* bmNakPower as a power of 2. The actual nak_limit is then calculated as nak_limit = ( 2^bmNakPower - 1) */
    -
    34 #define USB_NAK_MAX_POWER 15 //NAK binary order maximum value
    -
    35 #define USB_NAK_DEFAULT 14 //default 32K-1 NAKs before giving up
    -
    36 #define USB_NAK_NOWAIT 1 //Single NAK stops transfer
    -
    37 #define USB_NAK_NONAK 0 //Do not count NAKs, stop retrying after USB Timeout
    -
    38 
    -
    39 struct EpInfo {
    -
    40  uint8_t epAddr; // Endpoint address
    -
    41  uint8_t maxPktSize; // Maximum packet size
    -
    42 
    -
    43  union {
    -
    44  uint8_t epAttribs;
    -
    45 
    -
    46  struct {
    -
    47  uint8_t bmSndToggle : 1; // Send toggle, when zero bmSNDTOG0, bmSNDTOG1 otherwise
    -
    48  uint8_t bmRcvToggle : 1; // Send toggle, when zero bmRCVTOG0, bmRCVTOG1 otherwise
    -
    49  uint8_t bmNakPower : 6; // Binary order for NAK_LIMIT value
    -
    50  } __attribute__((packed));
    -
    51  };
    -
    52 } __attribute__((packed));
    -
    53 
    -
    54 // 7 6 5 4 3 2 1 0
    -
    55 // ---------------------------------
    -
    56 // | | H | P | P | P | A | A | A |
    -
    57 // ---------------------------------
    -
    58 //
    -
    59 // H - if 1 the address is a hub address
    -
    60 // P - parent hub address
    -
    61 // A - device address / port number in case of hub
    -
    62 //
    -
    63 
    - -
    65 
    -
    66  union {
    -
    67 
    -
    68  struct {
    -
    69  uint8_t bmAddress : 3; // device address/port number
    -
    70  uint8_t bmParent : 3; // parent hub address
    -
    71  uint8_t bmHub : 1; // hub flag
    -
    72  uint8_t bmReserved : 1; // reserved, must be zero
    -
    73  } __attribute__((packed));
    -
    74  uint8_t devAddress;
    -
    75  };
    -
    76 } __attribute__((packed));
    -
    77 
    -
    78 #define bmUSB_DEV_ADDR_ADDRESS 0x07
    -
    79 #define bmUSB_DEV_ADDR_PARENT 0x38
    -
    80 #define bmUSB_DEV_ADDR_HUB 0x40
    -
    81 
    -
    82 struct UsbDevice {
    -
    83  EpInfo *epinfo; // endpoint info pointer
    - -
    85  uint8_t epcount; // number of endpoints
    -
    86  bool lowspeed; // indicates if a device is the low speed one
    -
    87  // uint8_t devclass; // device class
    -
    88 } __attribute__((packed));
    -
    89 
    -
    90 class AddressPool {
    -
    91 public:
    -
    92  virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) = 0;
    -
    93  virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) = 0;
    -
    94  virtual void FreeAddress(uint8_t addr) = 0;
    -
    95 };
    -
    96 
    -
    97 typedef void (*UsbDeviceHandleFunc)(UsbDevice *pdev);
    -
    98 
    -
    99 #define ADDR_ERROR_INVALID_INDEX 0xFF
    -
    100 #define ADDR_ERROR_INVALID_ADDRESS 0xFF
    -
    101 
    -
    102 template <const uint8_t MAX_DEVICES_ALLOWED>
    -
    103 class AddressPoolImpl : public AddressPool {
    -
    104  EpInfo dev0ep; //Endpoint data structure used during enumeration for uninitialized device
    -
    105 
    -
    106  uint8_t hubCounter; // hub counter is kept
    -
    107  // in order to avoid hub address duplication
    -
    108 
    -
    109  UsbDevice thePool[MAX_DEVICES_ALLOWED];
    -
    110 
    -
    111  // Initializes address pool entry
    -
    112 
    -
    113  void InitEntry(uint8_t index) {
    -
    114  thePool[index].address.devAddress = 0;
    -
    115  thePool[index].epcount = 1;
    -
    116  thePool[index].lowspeed = 0;
    -
    117  thePool[index].epinfo = &dev0ep;
    -
    118  };
    -
    119 
    -
    120  // Returns thePool index for a given address
    -
    121 
    -
    122  uint8_t FindAddressIndex(uint8_t address = 0) {
    -
    123  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) {
    -
    124  if(thePool[i].address.devAddress == address)
    -
    125  return i;
    -
    126  }
    -
    127  return 0;
    -
    128  };
    -
    129 
    -
    130  // Returns thePool child index for a given parent
    -
    131 
    -
    132  uint8_t FindChildIndex(UsbDeviceAddress addr, uint8_t start = 1) {
    -
    133  for(uint8_t i = (start < 1 || start >= MAX_DEVICES_ALLOWED) ? 1 : start; i < MAX_DEVICES_ALLOWED; i++) {
    -
    134  if(thePool[i].address.bmParent == addr.bmAddress)
    -
    135  return i;
    -
    136  }
    -
    137  return 0;
    -
    138  };
    -
    139 
    -
    140  // Frees address entry specified by index parameter
    -
    141 
    -
    142  void FreeAddressByIndex(uint8_t index) {
    -
    143  // Zero field is reserved and should not be affected
    -
    144  if(index == 0)
    -
    145  return;
    -
    146 
    -
    147  UsbDeviceAddress uda = thePool[index].address;
    -
    148  // If a hub was switched off all port addresses should be freed
    -
    149  if(uda.bmHub == 1) {
    -
    150  for(uint8_t i = 1; (i = FindChildIndex(uda, i));)
    -
    151  FreeAddressByIndex(i);
    -
    152 
    -
    153  // If the hub had the last allocated address, hubCounter should be decremented
    -
    154  if(hubCounter == uda.bmAddress)
    -
    155  hubCounter--;
    -
    156  }
    -
    157  InitEntry(index);
    -
    158  }
    -
    159 
    -
    160  // Initializes the whole address pool at once
    -
    161 
    -
    162  void InitAllAddresses() {
    -
    163  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++)
    -
    164  InitEntry(i);
    -
    165 
    -
    166  hubCounter = 0;
    -
    167  };
    -
    168 
    -
    169 public:
    -
    170 
    -
    171  AddressPoolImpl() : hubCounter(0) {
    -
    172  // Zero address is reserved
    -
    173  InitEntry(0);
    -
    174 
    -
    175  thePool[0].address.devAddress = 0;
    -
    176  thePool[0].epinfo = &dev0ep;
    -
    177  dev0ep.epAddr = 0;
    -
    178  dev0ep.maxPktSize = 8;
    -
    179  dev0ep.bmSndToggle = 0; // Set DATA0/1 toggles to 0
    -
    180  dev0ep.bmRcvToggle = 0;
    -
    181  dev0ep.bmNakPower = USB_NAK_MAX_POWER;
    -
    182 
    -
    183  InitAllAddresses();
    -
    184  };
    -
    185 
    -
    186  // Returns a pointer to a specified address entry
    -
    187 
    -
    188  virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) {
    -
    189  if(!addr)
    -
    190  return thePool;
    -
    191 
    -
    192  uint8_t index = FindAddressIndex(addr);
    -
    193 
    -
    194  return (!index) ? NULL : thePool + index;
    -
    195  };
    -
    196 
    -
    197  // Performs an operation specified by pfunc for each addressed device
    -
    198 
    - -
    200  if(!pfunc)
    -
    201  return;
    -
    202 
    -
    203  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++)
    -
    204  if(thePool[i].address.devAddress)
    -
    205  pfunc(thePool + i);
    -
    206  };
    -
    207 
    -
    208  // Allocates new address
    -
    209 
    -
    210  virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) {
    -
    211  /* if (parent != 0 && port == 0)
    -
    212  USB_HOST_SERIAL.println("PRT:0"); */
    -
    213  UsbDeviceAddress _parent;
    -
    214  _parent.devAddress = parent;
    -
    215  if(_parent.bmReserved || port > 7)
    -
    216  //if(parent > 127 || port > 7)
    -
    217  return 0;
    -
    218 
    -
    219  if(is_hub && hubCounter == 7)
    -
    220  return 0;
    -
    221 
    -
    222  // finds first empty address entry starting from one
    -
    223  uint8_t index = FindAddressIndex(0);
    -
    224 
    -
    225  if(!index) // if empty entry is not found
    -
    226  return 0;
    -
    227 
    -
    228  if(_parent.devAddress == 0) {
    -
    229  if(is_hub) {
    -
    230  thePool[index].address.devAddress = 0x41;
    -
    231  hubCounter++;
    -
    232  } else
    -
    233  thePool[index].address.devAddress = 1;
    -
    234 
    -
    235  return thePool[index].address.devAddress;
    -
    236  }
    -
    237 
    -
    238  UsbDeviceAddress addr;
    -
    239  addr.devAddress = 0; // Ensure all bits are zero
    -
    240  addr.bmParent = _parent.bmAddress;
    -
    241  if(is_hub) {
    -
    242  addr.bmHub = 1;
    -
    243  addr.bmAddress = ++hubCounter;
    -
    244  } else {
    -
    245  addr.bmHub = 0;
    -
    246  addr.bmAddress = port;
    -
    247  }
    -
    248  thePool[index].address = addr;
    -
    249  /*
    -
    250  USB_HOST_SERIAL.print("Addr:");
    -
    251  USB_HOST_SERIAL.print(addr.bmHub, HEX);
    -
    252  USB_HOST_SERIAL.print(".");
    -
    253  USB_HOST_SERIAL.print(addr.bmParent, HEX);
    -
    254  USB_HOST_SERIAL.print(".");
    -
    255  USB_HOST_SERIAL.println(addr.bmAddress, HEX);
    -
    256  */
    -
    257  return thePool[index].address.devAddress;
    -
    258  };
    -
    259 
    -
    260  // Empties pool entry
    -
    261 
    -
    262  virtual void FreeAddress(uint8_t addr) {
    -
    263  // if the root hub is disconnected all the addresses should be initialized
    -
    264  if(addr == 0x41) {
    -
    265  InitAllAddresses();
    -
    266  return;
    -
    267  }
    -
    268  uint8_t index = FindAddressIndex(addr);
    -
    269  FreeAddressByIndex(index);
    -
    270  };
    -
    271 
    -
    272  // Returns number of hubs attached
    -
    273  // It can be rather helpfull to find out if there are hubs attached than getting the exact number of hubs.
    -
    274  //uint8_t GetNumHubs()
    -
    275  //{
    -
    276  // return hubCounter;
    -
    277  //};
    -
    278  //uint8_t GetNumDevices()
    -
    279  //{
    -
    280  // uint8_t counter = 0;
    -
    281 
    -
    282  // for (uint8_t i=1; i<MAX_DEVICES_ALLOWED; i++)
    -
    283  // if (thePool[i].address != 0);
    -
    284  // counter ++;
    -
    285 
    -
    286  // return counter;
    -
    287  //};
    -
    288 };
    -
    289 
    -
    290 #endif // __ADDRESS_H__
    -
    uint8_t bmRcvToggle
    Definition: address.h:48
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This program is free software; you can redistribute it and/or modify
    4 it under the terms of the GNU General Public License as published by
    5 the Free Software Foundation; either version 2 of the License, or
    6 (at your option) any later version.
    7 
    8 This program is distributed in the hope that it will be useful,
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11 GNU General Public License for more details.
    12 
    13 You should have received a copy of the GNU General Public License
    14 along with this program; if not, write to the Free Software
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    16 
    17 Contact information
    18 -------------------
    19 
    20 Circuits At Home, LTD
    21 Web : http://www.circuitsathome.com
    22 e-mail : support@circuitsathome.com
    23  */
    24 
    25 #if !defined(_usb_h_) || defined(__ADDRESS_H__)
    26 #error "Never include address.h directly; include Usb.h instead"
    27 #else
    28 #define __ADDRESS_H__
    29 
    30 
    31 
    32 /* NAK powers. To save space in endpoint data structure, amount of retries before giving up and returning 0x4 is stored in */
    33 /* bmNakPower as a power of 2. The actual nak_limit is then calculated as nak_limit = ( 2^bmNakPower - 1) */
    34 #define USB_NAK_MAX_POWER 15 //NAK binary order maximum value
    35 #define USB_NAK_DEFAULT 14 //default 32K-1 NAKs before giving up
    36 #define USB_NAK_NOWAIT 1 //Single NAK stops transfer
    37 #define USB_NAK_NONAK 0 //Do not count NAKs, stop retrying after USB Timeout
    38 
    39 struct EpInfo {
    40  uint8_t epAddr; // Endpoint address
    41  uint8_t maxPktSize; // Maximum packet size
    42 
    43  union {
    44  uint8_t epAttribs;
    45 
    46  struct {
    47  uint8_t bmSndToggle : 1; // Send toggle, when zero bmSNDTOG0, bmSNDTOG1 otherwise
    48  uint8_t bmRcvToggle : 1; // Send toggle, when zero bmRCVTOG0, bmRCVTOG1 otherwise
    49  uint8_t bmNakPower : 6; // Binary order for NAK_LIMIT value
    50  } __attribute__((packed));
    51  };
    52 } __attribute__((packed));
    53 
    54 // 7 6 5 4 3 2 1 0
    55 // ---------------------------------
    56 // | | H | P | P | P | A | A | A |
    57 // ---------------------------------
    58 //
    59 // H - if 1 the address is a hub address
    60 // P - parent hub address
    61 // A - device address / port number in case of hub
    62 //
    63 
    65 
    66  union {
    67 
    68  struct {
    69  uint8_t bmAddress : 3; // device address/port number
    70  uint8_t bmParent : 3; // parent hub address
    71  uint8_t bmHub : 1; // hub flag
    72  uint8_t bmReserved : 1; // reserved, must be zero
    73  } __attribute__((packed));
    74  uint8_t devAddress;
    75  };
    76 } __attribute__((packed));
    77 
    78 #define bmUSB_DEV_ADDR_ADDRESS 0x07
    79 #define bmUSB_DEV_ADDR_PARENT 0x38
    80 #define bmUSB_DEV_ADDR_HUB 0x40
    81 
    82 struct UsbDevice {
    83  EpInfo *epinfo; // endpoint info pointer
    85  uint8_t epcount; // number of endpoints
    86  bool lowspeed; // indicates if a device is the low speed one
    87  // uint8_t devclass; // device class
    88 } __attribute__((packed));
    89 
    90 class AddressPool {
    91 public:
    92  virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) = 0;
    93  virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) = 0;
    94  virtual void FreeAddress(uint8_t addr) = 0;
    95 };
    96 
    97 typedef void (*UsbDeviceHandleFunc)(UsbDevice *pdev);
    98 
    99 #define ADDR_ERROR_INVALID_INDEX 0xFF
    100 #define ADDR_ERROR_INVALID_ADDRESS 0xFF
    101 
    102 template <const uint8_t MAX_DEVICES_ALLOWED>
    103 class AddressPoolImpl : public AddressPool {
    104  EpInfo dev0ep; //Endpoint data structure used during enumeration for uninitialized device
    105 
    106  uint8_t hubCounter; // hub counter is kept
    107  // in order to avoid hub address duplication
    108 
    109  UsbDevice thePool[MAX_DEVICES_ALLOWED];
    110 
    111  // Initializes address pool entry
    112 
    113  void InitEntry(uint8_t index) {
    114  thePool[index].address.devAddress = 0;
    115  thePool[index].epcount = 1;
    116  thePool[index].lowspeed = 0;
    117  thePool[index].epinfo = &dev0ep;
    118  };
    119 
    120  // Returns thePool index for a given address
    121 
    122  uint8_t FindAddressIndex(uint8_t address = 0) {
    123  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) {
    124  if(thePool[i].address.devAddress == address)
    125  return i;
    126  }
    127  return 0;
    128  };
    129 
    130  // Returns thePool child index for a given parent
    131 
    132  uint8_t FindChildIndex(UsbDeviceAddress addr, uint8_t start = 1) {
    133  for(uint8_t i = (start < 1 || start >= MAX_DEVICES_ALLOWED) ? 1 : start; i < MAX_DEVICES_ALLOWED; i++) {
    134  if(thePool[i].address.bmParent == addr.bmAddress)
    135  return i;
    136  }
    137  return 0;
    138  };
    139 
    140  // Frees address entry specified by index parameter
    141 
    142  void FreeAddressByIndex(uint8_t index) {
    143  // Zero field is reserved and should not be affected
    144  if(index == 0)
    145  return;
    146 
    147  UsbDeviceAddress uda = thePool[index].address;
    148  // If a hub was switched off all port addresses should be freed
    149  if(uda.bmHub == 1) {
    150  for(uint8_t i = 1; (i = FindChildIndex(uda, i));)
    151  FreeAddressByIndex(i);
    152 
    153  // If the hub had the last allocated address, hubCounter should be decremented
    154  if(hubCounter == uda.bmAddress)
    155  hubCounter--;
    156  }
    157  InitEntry(index);
    158  }
    159 
    160  // Initializes the whole address pool at once
    161 
    162  void InitAllAddresses() {
    163  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++)
    164  InitEntry(i);
    165 
    166  hubCounter = 0;
    167  };
    168 
    169 public:
    170 
    171  AddressPoolImpl() : hubCounter(0) {
    172  // Zero address is reserved
    173  InitEntry(0);
    174 
    175  thePool[0].address.devAddress = 0;
    176  thePool[0].epinfo = &dev0ep;
    177  dev0ep.epAddr = 0;
    178  dev0ep.maxPktSize = 8;
    179  dev0ep.bmSndToggle = 0; // Set DATA0/1 toggles to 0
    180  dev0ep.bmRcvToggle = 0;
    181  dev0ep.bmNakPower = USB_NAK_MAX_POWER;
    182 
    183  InitAllAddresses();
    184  };
    185 
    186  // Returns a pointer to a specified address entry
    187 
    188  virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) {
    189  if(!addr)
    190  return thePool;
    191 
    192  uint8_t index = FindAddressIndex(addr);
    193 
    194  return (!index) ? NULL : thePool + index;
    195  };
    196 
    197  // Performs an operation specified by pfunc for each addressed device
    198 
    200  if(!pfunc)
    201  return;
    202 
    203  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++)
    204  if(thePool[i].address.devAddress)
    205  pfunc(thePool + i);
    206  };
    207 
    208  // Allocates new address
    209 
    210  virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) {
    211  /* if (parent != 0 && port == 0)
    212  USB_HOST_SERIAL.println("PRT:0"); */
    213  UsbDeviceAddress _parent;
    214  _parent.devAddress = parent;
    215  if(_parent.bmReserved || port > 7)
    216  //if(parent > 127 || port > 7)
    217  return 0;
    218 
    219  if(is_hub && hubCounter == 7)
    220  return 0;
    221 
    222  // finds first empty address entry starting from one
    223  uint8_t index = FindAddressIndex(0);
    224 
    225  if(!index) // if empty entry is not found
    226  return 0;
    227 
    228  if(_parent.devAddress == 0) {
    229  if(is_hub) {
    230  thePool[index].address.devAddress = 0x41;
    231  hubCounter++;
    232  } else
    233  thePool[index].address.devAddress = 1;
    234 
    235  return thePool[index].address.devAddress;
    236  }
    237 
    238  UsbDeviceAddress addr;
    239  addr.devAddress = 0; // Ensure all bits are zero
    240  addr.bmParent = _parent.bmAddress;
    241  if(is_hub) {
    242  addr.bmHub = 1;
    243  addr.bmAddress = ++hubCounter;
    244  } else {
    245  addr.bmHub = 0;
    246  addr.bmAddress = port;
    247  }
    248  thePool[index].address = addr;
    249  /*
    250  USB_HOST_SERIAL.print("Addr:");
    251  USB_HOST_SERIAL.print(addr.bmHub, HEX);
    252  USB_HOST_SERIAL.print(".");
    253  USB_HOST_SERIAL.print(addr.bmParent, HEX);
    254  USB_HOST_SERIAL.print(".");
    255  USB_HOST_SERIAL.println(addr.bmAddress, HEX);
    256  */
    257  return thePool[index].address.devAddress;
    258  };
    259 
    260  // Empties pool entry
    261 
    262  virtual void FreeAddress(uint8_t addr) {
    263  // if the root hub is disconnected all the addresses should be initialized
    264  if(addr == 0x41) {
    265  InitAllAddresses();
    266  return;
    267  }
    268  uint8_t index = FindAddressIndex(addr);
    269  FreeAddressByIndex(index);
    270  };
    271 
    272  // Returns number of hubs attached
    273  // It can be rather helpfull to find out if there are hubs attached than getting the exact number of hubs.
    274  //uint8_t GetNumHubs()
    275  //{
    276  // return hubCounter;
    277  //};
    278  //uint8_t GetNumDevices()
    279  //{
    280  // uint8_t counter = 0;
    281 
    282  // for (uint8_t i=1; i<MAX_DEVICES_ALLOWED; i++)
    283  // if (thePool[i].address != 0);
    284  // counter ++;
    285 
    286  // return counter;
    287  //};
    288 };
    289 
    290 #endif // __ADDRESS_H__
    uint8_t bmRcvToggle
    Definition: address.h:48
    EpInfo * epinfo
    Definition: address.h:83
    bool lowspeed
    Definition: address.h:86
    @@ -383,15 +94,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t bmReserved
    Definition: address.h:72
    -
    virtual void FreeAddress(uint8_t addr)=0
    uint8_t epAttribs
    Definition: address.h:44
    -
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
    uint8_t epAddr
    Definition: address.h:40
    #define USB_NAK_MAX_POWER
    Definition: address.h:34
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)
    Definition: address.h:188
    -
    void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
    Definition: address.h:97
    Definition: address.h:39
    -
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    uint8_t bmSndToggle
    Definition: address.h:47
    uint8_t devAddress
    Definition: address.h:74
    uint8_t bmAddress
    Definition: address.h:69
    @@ -405,12 +112,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)
    Definition: address.h:210
    UsbDeviceAddress address
    Definition: address.h:84
    uint8_t bmHub
    Definition: address.h:71
    +
    void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
    Definition: address.h:97
    diff --git a/adk_8cpp.html b/adk_8cpp.html index 18a0ff61..c0a3d423 100644 --- a/adk_8cpp.html +++ b/adk_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: adk.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,13 +86,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    adk.cpp File Reference
    -
    #include "adk.h"
    +
    #include "adk.h"
    Include dependency graph for adk.cpp:
    - + + +

    Go to the source code of this file.

    @@ -100,7 +103,7 @@ Include dependency graph for adk.cpp:
    diff --git a/adk_8cpp__incl.map b/adk_8cpp__incl.map index bbf2b3d1..eb12d3fa 100644 --- a/adk_8cpp__incl.map +++ b/adk_8cpp__incl.map @@ -1,4 +1,4 @@ - - + + diff --git a/adk_8cpp__incl.md5 b/adk_8cpp__incl.md5 index a794ca89..aeb01f6d 100644 --- a/adk_8cpp__incl.md5 +++ b/adk_8cpp__incl.md5 @@ -1 +1 @@ -d6ef7cc264e9225e78397a4cf8f08152 \ No newline at end of file +44064901c7f950ea3e40c91d455ee2ad \ No newline at end of file diff --git a/adk_8cpp__incl.png b/adk_8cpp__incl.png index bfc0e0b8e7bc9ab2abea2712dbf2122aeaf405e9..b1518db0b0dd4321aa1808264c0e0aa043b4dcaa 100644 GIT binary patch literal 3136 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 Z3QxBU8B;ZR5x_42NaJr9v`X1J;y*VI<*fh! literal 3424 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 diff --git a/adk_8cpp_source.html b/adk_8cpp_source.html index db29b93d..5324ba5f 100644 --- a/adk_8cpp_source.html +++ b/adk_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: adk.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,379 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    adk.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 
    -
    18 /* Google ADK interface */
    -
    19 
    -
    20 #include "adk.h"
    -
    21 
    -
    22 const uint8_t ADK::epDataInIndex = 1;
    -
    23 const uint8_t ADK::epDataOutIndex = 2;
    -
    24 
    -
    25 ADK::ADK(USB *p, const char* manufacturer,
    -
    26  const char* model,
    -
    27  const char* description,
    -
    28  const char* version,
    -
    29  const char* uri,
    -
    30  const char* serial) :
    -
    31 
    -
    32 /* ADK ID Strings */
    -
    33 manufacturer(manufacturer),
    -
    34 model(model),
    -
    35 description(description),
    -
    36 version(version),
    -
    37 uri(uri),
    -
    38 serial(serial),
    -
    39 pUsb(p), //pointer to USB class instance - mandatory
    -
    40 bAddress(0), //device address - mandatory
    -
    41 bConfNum(0), //configuration number
    -
    42 bNumEP(1), //if config descriptor needs to be parsed
    -
    43 ready(false) {
    -
    44  // initialize endpoint data structures
    -
    45  for(uint8_t i = 0; i < ADK_MAX_ENDPOINTS; i++) {
    -
    46  epInfo[i].epAddr = 0;
    -
    47  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    48  epInfo[i].bmSndToggle = 0;
    -
    49  epInfo[i].bmRcvToggle = 0;
    - -
    51  }//for(uint8_t i=0; i<ADK_MAX_ENDPOINTS; i++...
    -
    52 
    -
    53  // register in USB subsystem
    -
    54  if(pUsb) {
    -
    55  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    -
    56  }
    -
    57 }
    -
    58 
    -
    59 uint8_t ADK::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    60  return Init(parent, port, lowspeed); // Just call Init. Yes, really!
    -
    61 }
    -
    62 
    -
    63 /* Connection initialization of an Android phone */
    -
    64 uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    65  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    -
    66  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    67  uint8_t rcode;
    -
    68  uint8_t num_of_conf; // number of configurations
    -
    69  UsbDevice *p = NULL;
    -
    70  EpInfo *oldep_ptr = NULL;
    -
    71 
    -
    72  // get memory address of USB device address pool
    -
    73  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    74 
    -
    75  USBTRACE("\r\nADK Init");
    -
    76 
    -
    77  // check if address has already been assigned to an instance
    -
    78  if(bAddress) {
    -
    79  USBTRACE("\r\nAddress in use");
    - -
    81  }
    -
    82 
    -
    83  // Get pointer to pseudo device with address 0 assigned
    -
    84  p = addrPool.GetUsbDevicePtr(0);
    -
    85 
    -
    86  if(!p) {
    -
    87  USBTRACE("\r\nAddress not found");
    - -
    89  }
    -
    90 
    -
    91  if(!p->epinfo) {
    -
    92  USBTRACE("epinfo is null\r\n");
    - -
    94  }
    -
    95 
    -
    96  // Save old pointer to EP_RECORD of address 0
    -
    97  oldep_ptr = p->epinfo;
    -
    98 
    -
    99  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    100  p->epinfo = epInfo;
    -
    101 
    -
    102  p->lowspeed = lowspeed;
    -
    103 
    -
    104  // Get device descriptor
    -
    105  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf);
    -
    106 
    -
    107  // Restore p->epinfo
    -
    108  p->epinfo = oldep_ptr;
    -
    109 
    -
    110  if(rcode) {
    -
    111  goto FailGetDevDescr;
    -
    112  }
    -
    113 
    -
    114  // Allocate new address according to device class
    -
    115  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    116 
    -
    117  // Extract Max Packet Size from device descriptor
    -
    118  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    -
    119 
    -
    120  // Assign new address to the device
    -
    121  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    122  if(rcode) {
    -
    123  p->lowspeed = false;
    -
    124  addrPool.FreeAddress(bAddress);
    -
    125  bAddress = 0;
    -
    126  //USBTRACE2("setAddr:",rcode);
    -
    127  return rcode;
    -
    128  }//if (rcode...
    -
    129 
    -
    130  //USBTRACE2("\r\nAddr:", bAddress);
    -
    131  // Spec says you should wait at least 200ms.
    -
    132  //delay(300);
    -
    133 
    -
    134  p->lowspeed = false;
    -
    135 
    -
    136  //get pointer to assigned address record
    -
    137  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    138  if(!p) {
    - -
    140  }
    -
    141 
    -
    142  p->lowspeed = lowspeed;
    -
    143 
    -
    144  // Assign epInfo to epinfo pointer - only EP0 is known
    -
    145  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    146  if(rcode) {
    -
    147  goto FailSetDevTblEntry;
    -
    148  }
    -
    149 
    -
    150  //check if ADK device is already in accessory mode; if yes, configure and exit
    -
    151  if(udd->idVendor == ADK_VID &&
    -
    152  (udd->idProduct == ADK_PID || udd->idProduct == ADB_PID)) {
    -
    153  USBTRACE("\r\nAcc.mode device detected");
    -
    154  /* go through configurations, find first bulk-IN, bulk-OUT EP, fill epInfo and quit */
    -
    155  num_of_conf = udd->bNumConfigurations;
    -
    156 
    -
    157  //USBTRACE2("\r\nNC:",num_of_conf);
    -
    158  for(uint8_t i = 0; i < num_of_conf; i++) {
    -
    159  ConfigDescParser < 0, 0, 0, 0 > confDescrParser(this);
    -
    160  delay(1);
    -
    161  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    162 #if defined(XOOM)
    -
    163  //added by Jaylen Scott Vanorden
    -
    164  if(rcode) {
    -
    165  USBTRACE2("\r\nGot 1st bad code for config: ", rcode);
    -
    166  // Try once more
    -
    167  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    168  }
    -
    169 #endif
    -
    170  if(rcode) {
    -
    171  goto FailGetConfDescr;
    -
    172  }
    -
    173  if(bNumEP > 2) {
    -
    174  break;
    -
    175  }
    -
    176  } // for (uint8_t i=0; i<num_of_conf; i++...
    -
    177 
    -
    178  if(bNumEP == 3) {
    -
    179  // Assign epInfo to epinfo pointer - this time all 3 endpoins
    -
    180  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
    -
    181  if(rcode) {
    -
    182  goto FailSetDevTblEntry;
    -
    183  }
    -
    184  }
    -
    185 
    -
    186  // Set Configuration Value
    -
    187  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    188  if(rcode) {
    -
    189  goto FailSetConfDescr;
    -
    190  }
    -
    191  /* print endpoint structure */
    -
    192  /*
    -
    193  USBTRACE("\r\nEndpoint Structure:");
    -
    194  USBTRACE("\r\nEP0:");
    -
    195  USBTRACE2("\r\nAddr: ", epInfo[0].epAddr);
    -
    196  USBTRACE2("\r\nMax.pkt.size: ", epInfo[0].maxPktSize);
    -
    197  USBTRACE2("\r\nAttr: ", epInfo[0].epAttribs);
    -
    198  USBTRACE("\r\nEpout:");
    -
    199  USBTRACE2("\r\nAddr: ", epInfo[epDataOutIndex].epAddr);
    -
    200  USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataOutIndex].maxPktSize);
    -
    201  USBTRACE2("\r\nAttr: ", epInfo[epDataOutIndex].epAttribs);
    -
    202  USBTRACE("\r\nEpin:");
    -
    203  USBTRACE2("\r\nAddr: ", epInfo[epDataInIndex].epAddr);
    -
    204  USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataInIndex].maxPktSize);
    -
    205  USBTRACE2("\r\nAttr: ", epInfo[epDataInIndex].epAttribs);
    -
    206  */
    -
    207 
    -
    208  USBTRACE("\r\nConfiguration successful");
    -
    209  ready = true;
    -
    210  return 0; //successful configuration
    -
    211  }//if( buf->idVendor == ADK_VID...
    -
    212 
    -
    213  //probe device - get accessory protocol revision
    -
    214  {
    -
    215  uint16_t adkproto = -1;
    -
    216  delay(1);
    -
    217  rcode = getProto((uint8_t*) & adkproto);
    -
    218 #if defined(XOOM)
    -
    219  //added by Jaylen Scott Vanorden
    -
    220  if(rcode) {
    -
    221  USBTRACE2("\r\nGot 1st bad code for proto: ", rcode);
    -
    222  // Try once more
    -
    223  rcode = getProto((uint8_t*) & adkproto);
    -
    224  }
    -
    225 #endif
    -
    226  if(rcode) {
    -
    227  goto FailGetProto; //init fails
    -
    228  }
    -
    229  USBTRACE2("\r\nADK protocol rev. ", adkproto);
    -
    230  }
    -
    231 
    -
    232  delay(100);
    -
    233 
    -
    234  //sending ID strings
    -
    235  sendStr(ACCESSORY_STRING_MANUFACTURER, manufacturer);
    -
    236  delay(10);
    -
    237  sendStr(ACCESSORY_STRING_MODEL, model);
    -
    238  delay(10);
    -
    239  sendStr(ACCESSORY_STRING_DESCRIPTION, description);
    -
    240  delay(10);
    -
    241  sendStr(ACCESSORY_STRING_VERSION, version);
    -
    242  delay(10);
    -
    243  sendStr(ACCESSORY_STRING_URI, uri);
    -
    244  delay(10);
    -
    245  sendStr(ACCESSORY_STRING_SERIAL, serial);
    -
    246 
    -
    247  delay(100);
    -
    248 
    -
    249  //switch to accessory mode
    -
    250  //the Android phone will reset
    -
    251  rcode = switchAcc();
    -
    252  if(rcode) {
    -
    253  goto FailSwAcc; //init fails
    -
    254  }
    - -
    256  delay(100); // Give Android a chance to do its reset. This is a guess, and possibly could be lower.
    -
    257  goto SwAttempt; //switch to accessory mode attempted
    -
    258 
    -
    259  /* diagnostic messages */
    -
    260 FailGetDevDescr:
    -
    261 #ifdef DEBUG_USB_HOST
    -
    262  NotifyFailGetDevDescr(rcode);
    -
    263  goto Fail;
    -
    264 #endif
    -
    265 
    -
    266 FailSetDevTblEntry:
    -
    267 #ifdef DEBUG_USB_HOST
    - -
    269  goto Fail;
    -
    270 #endif
    -
    271 
    -
    272 FailGetConfDescr:
    -
    273 #ifdef DEBUG_USB_HOST
    -
    274  NotifyFailGetConfDescr(rcode);
    -
    275  goto Fail;
    -
    276 #endif
    -
    277 
    -
    278 FailSetConfDescr:
    -
    279 #ifdef DEBUG_USB_HOST
    -
    280  NotifyFailSetConfDescr(rcode);
    -
    281  goto Fail;
    -
    282 #endif
    -
    283 
    -
    284 FailGetProto:
    -
    285 #ifdef DEBUG_USB_HOST
    -
    286  USBTRACE("\r\ngetProto:");
    -
    287  goto Fail;
    -
    288 #endif
    -
    289 
    -
    290 FailSwAcc:
    -
    291 #ifdef DEBUG_USB_HOST
    -
    292  USBTRACE("\r\nswAcc:");
    -
    293  goto Fail;
    -
    294 #endif
    -
    295 
    -
    296  //FailOnInit:
    -
    297  // USBTRACE("OnInit:");
    -
    298  // goto Fail;
    -
    299  //
    -
    300 SwAttempt:
    -
    301 #ifdef DEBUG_USB_HOST
    -
    302  USBTRACE("\r\nAccessory mode switch attempt");
    -
    303 Fail:
    -
    304 #endif
    -
    305  //USBTRACE2("\r\nADK Init Failed, error code: ", rcode);
    -
    306  //NotifyFail(rcode);
    -
    307  Release();
    -
    308  return rcode;
    -
    309 }
    -
    310 
    -
    311 /* Extracts bulk-IN and bulk-OUT endpoint information from config descriptor */
    -
    312 void ADK::EndpointXtract(uint8_t conf, uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    313  //ErrorMessage<uint8_t>(PSTR("Conf.Val"), conf);
    -
    314  //ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
    -
    315  //ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
    -
    316 
    -
    317  //added by Yuuichi Akagawa
    -
    318  if(bNumEP == 3) {
    -
    319  return;
    -
    320  }
    -
    321 
    -
    322  bConfNum = conf;
    -
    323 
    - -
    325  uint8_t index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    -
    326  // Fill in the endpoint info structure
    -
    327  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    328  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    329 
    -
    330  bNumEP++;
    -
    331 
    -
    332  //PrintEndpointDescriptor(pep);
    -
    333  }
    -
    334 }
    -
    335 
    -
    336 /* Performs a cleanup after failed Init() attempt */
    -
    337 uint8_t ADK::Release() {
    - -
    339 
    -
    340  bNumEP = 1; //must have to be reset to 1
    -
    341 
    -
    342  bAddress = 0;
    -
    343  ready = false;
    -
    344  return 0;
    -
    345 }
    -
    346 
    -
    347 uint8_t ADK::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    -
    348  //USBTRACE2("\r\nAddr: ", bAddress );
    -
    349  //USBTRACE2("\r\nEP: ",epInfo[epDataInIndex].epAddr);
    -
    350  return pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    -
    351 }
    -
    352 
    -
    353 uint8_t ADK::SndData(uint16_t nbytes, uint8_t *dataptr) {
    -
    354  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    -
    355 }
    -
    356 
    - -
    358  Notify(PSTR("Endpoint descriptor:"), 0x80);
    -
    359  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    -
    360  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    -
    361  Notify(PSTR("\r\nType:\t\t"), 0x80);
    -
    362  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    -
    363  Notify(PSTR("\r\nAddress:\t"), 0x80);
    -
    364  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    -
    365  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    -
    366  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    -
    367  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    -
    368  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    -
    369  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    -
    370  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    -
    371  Notify(PSTR("\r\n"), 0x80);
    -
    372 }
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 
    18 /* Google ADK interface */
    19 
    20 #include "adk.h"
    21 
    22 const uint8_t ADK::epDataInIndex = 1;
    23 const uint8_t ADK::epDataOutIndex = 2;
    24 
    25 ADK::ADK(USB *p, const char* manufacturer,
    26  const char* model,
    27  const char* description,
    28  const char* version,
    29  const char* uri,
    30  const char* serial) :
    31 
    32 /* ADK ID Strings */
    33 manufacturer(manufacturer),
    34 model(model),
    35 description(description),
    36 version(version),
    37 uri(uri),
    38 serial(serial),
    39 pUsb(p), //pointer to USB class instance - mandatory
    40 bAddress(0), //device address - mandatory
    41 bConfNum(0), //configuration number
    42 bNumEP(1), //if config descriptor needs to be parsed
    43 ready(false) {
    44  // initialize endpoint data structures
    45  for(uint8_t i = 0; i < ADK_MAX_ENDPOINTS; i++) {
    46  epInfo[i].epAddr = 0;
    47  epInfo[i].maxPktSize = (i) ? 0 : 8;
    48  epInfo[i].bmSndToggle = 0;
    49  epInfo[i].bmRcvToggle = 0;
    51  }//for(uint8_t i=0; i<ADK_MAX_ENDPOINTS; i++...
    52 
    53  // register in USB subsystem
    54  if(pUsb) {
    55  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    56  }
    57 }
    58 
    59 uint8_t ADK::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
    60  return Init(parent, port, lowspeed); // Just call Init. Yes, really!
    61 }
    62 
    63 /* Connection initialization of an Android phone */
    64 uint8_t ADK::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    65  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    66  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    67  uint8_t rcode;
    68  uint8_t num_of_conf; // number of configurations
    69  UsbDevice *p = NULL;
    70  EpInfo *oldep_ptr = NULL;
    71 
    72  // get memory address of USB device address pool
    73  AddressPool &addrPool = pUsb->GetAddressPool();
    74 
    75  USBTRACE("\r\nADK Init");
    76 
    77  // check if address has already been assigned to an instance
    78  if(bAddress) {
    79  USBTRACE("\r\nAddress in use");
    81  }
    82 
    83  // Get pointer to pseudo device with address 0 assigned
    84  p = addrPool.GetUsbDevicePtr(0);
    85 
    86  if(!p) {
    87  USBTRACE("\r\nAddress not found");
    89  }
    90 
    91  if(!p->epinfo) {
    92  USBTRACE("epinfo is null\r\n");
    94  }
    95 
    96  // Save old pointer to EP_RECORD of address 0
    97  oldep_ptr = p->epinfo;
    98 
    99  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    100  p->epinfo = epInfo;
    101 
    102  p->lowspeed = lowspeed;
    103 
    104  // Get device descriptor
    105  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf);
    106 
    107  // Restore p->epinfo
    108  p->epinfo = oldep_ptr;
    109 
    110  if(rcode) {
    111  goto FailGetDevDescr;
    112  }
    113 
    114  // Allocate new address according to device class
    115  bAddress = addrPool.AllocAddress(parent, false, port);
    116 
    117  // Extract Max Packet Size from device descriptor
    118  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    119 
    120  // Assign new address to the device
    121  rcode = pUsb->setAddr(0, 0, bAddress);
    122  if(rcode) {
    123  p->lowspeed = false;
    124  addrPool.FreeAddress(bAddress);
    125  bAddress = 0;
    126  //USBTRACE2("setAddr:",rcode);
    127  return rcode;
    128  }//if (rcode...
    129 
    130  //USBTRACE2("\r\nAddr:", bAddress);
    131  // Spec says you should wait at least 200ms.
    132  //delay(300);
    133 
    134  p->lowspeed = false;
    135 
    136  //get pointer to assigned address record
    137  p = addrPool.GetUsbDevicePtr(bAddress);
    138  if(!p) {
    140  }
    141 
    142  p->lowspeed = lowspeed;
    143 
    144  // Assign epInfo to epinfo pointer - only EP0 is known
    145  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    146  if(rcode) {
    147  goto FailSetDevTblEntry;
    148  }
    149 
    150  //check if ADK device is already in accessory mode; if yes, configure and exit
    151  if(udd->idVendor == ADK_VID &&
    152  (udd->idProduct == ADK_PID || udd->idProduct == ADB_PID)) {
    153  USBTRACE("\r\nAcc.mode device detected");
    154  /* go through configurations, find first bulk-IN, bulk-OUT EP, fill epInfo and quit */
    155  num_of_conf = udd->bNumConfigurations;
    156 
    157  //USBTRACE2("\r\nNC:",num_of_conf);
    158  for(uint8_t i = 0; i < num_of_conf; i++) {
    159  ConfigDescParser < 0, 0, 0, 0 > confDescrParser(this);
    160  delay(1);
    161  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    162 #if defined(XOOM)
    163  //added by Jaylen Scott Vanorden
    164  if(rcode) {
    165  USBTRACE2("\r\nGot 1st bad code for config: ", rcode);
    166  // Try once more
    167  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    168  }
    169 #endif
    170  if(rcode) {
    171  goto FailGetConfDescr;
    172  }
    173  if(bNumEP > 2) {
    174  break;
    175  }
    176  } // for (uint8_t i=0; i<num_of_conf; i++...
    177 
    178  if(bNumEP == 3) {
    179  // Assign epInfo to epinfo pointer - this time all 3 endpoins
    180  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
    181  if(rcode) {
    182  goto FailSetDevTblEntry;
    183  }
    184  }
    185 
    186  // Set Configuration Value
    187  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    188  if(rcode) {
    189  goto FailSetConfDescr;
    190  }
    191  /* print endpoint structure */
    192  /*
    193  USBTRACE("\r\nEndpoint Structure:");
    194  USBTRACE("\r\nEP0:");
    195  USBTRACE2("\r\nAddr: ", epInfo[0].epAddr);
    196  USBTRACE2("\r\nMax.pkt.size: ", epInfo[0].maxPktSize);
    197  USBTRACE2("\r\nAttr: ", epInfo[0].epAttribs);
    198  USBTRACE("\r\nEpout:");
    199  USBTRACE2("\r\nAddr: ", epInfo[epDataOutIndex].epAddr);
    200  USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataOutIndex].maxPktSize);
    201  USBTRACE2("\r\nAttr: ", epInfo[epDataOutIndex].epAttribs);
    202  USBTRACE("\r\nEpin:");
    203  USBTRACE2("\r\nAddr: ", epInfo[epDataInIndex].epAddr);
    204  USBTRACE2("\r\nMax.pkt.size: ", epInfo[epDataInIndex].maxPktSize);
    205  USBTRACE2("\r\nAttr: ", epInfo[epDataInIndex].epAttribs);
    206  */
    207 
    208  USBTRACE("\r\nConfiguration successful");
    209  ready = true;
    210  return 0; //successful configuration
    211  }//if( buf->idVendor == ADK_VID...
    212 
    213  //probe device - get accessory protocol revision
    214  {
    215  uint16_t adkproto = -1;
    216  delay(1);
    217  rcode = getProto((uint8_t*) & adkproto);
    218 #if defined(XOOM)
    219  //added by Jaylen Scott Vanorden
    220  if(rcode) {
    221  USBTRACE2("\r\nGot 1st bad code for proto: ", rcode);
    222  // Try once more
    223  rcode = getProto((uint8_t*) & adkproto);
    224  }
    225 #endif
    226  if(rcode) {
    227  goto FailGetProto; //init fails
    228  }
    229  USBTRACE2("\r\nADK protocol rev. ", adkproto);
    230  }
    231 
    232  delay(100);
    233 
    234  //sending ID strings
    235  sendStr(ACCESSORY_STRING_MANUFACTURER, manufacturer);
    236  delay(10);
    237  sendStr(ACCESSORY_STRING_MODEL, model);
    238  delay(10);
    239  sendStr(ACCESSORY_STRING_DESCRIPTION, description);
    240  delay(10);
    241  sendStr(ACCESSORY_STRING_VERSION, version);
    242  delay(10);
    243  sendStr(ACCESSORY_STRING_URI, uri);
    244  delay(10);
    245  sendStr(ACCESSORY_STRING_SERIAL, serial);
    246 
    247  delay(100);
    248 
    249  //switch to accessory mode
    250  //the Android phone will reset
    251  rcode = switchAcc();
    252  if(rcode) {
    253  goto FailSwAcc; //init fails
    254  }
    256  delay(100); // Give Android a chance to do its reset. This is a guess, and possibly could be lower.
    257  goto SwAttempt; //switch to accessory mode attempted
    258 
    259  /* diagnostic messages */
    260 FailGetDevDescr:
    261 #ifdef DEBUG_USB_HOST
    262  NotifyFailGetDevDescr(rcode);
    263  goto Fail;
    264 #endif
    265 
    266 FailSetDevTblEntry:
    267 #ifdef DEBUG_USB_HOST
    269  goto Fail;
    270 #endif
    271 
    272 FailGetConfDescr:
    273 #ifdef DEBUG_USB_HOST
    274  NotifyFailGetConfDescr(rcode);
    275  goto Fail;
    276 #endif
    277 
    278 FailSetConfDescr:
    279 #ifdef DEBUG_USB_HOST
    280  NotifyFailSetConfDescr(rcode);
    281  goto Fail;
    282 #endif
    283 
    284 FailGetProto:
    285 #ifdef DEBUG_USB_HOST
    286  USBTRACE("\r\ngetProto:");
    287  goto Fail;
    288 #endif
    289 
    290 FailSwAcc:
    291 #ifdef DEBUG_USB_HOST
    292  USBTRACE("\r\nswAcc:");
    293  goto Fail;
    294 #endif
    295 
    296  //FailOnInit:
    297  // USBTRACE("OnInit:");
    298  // goto Fail;
    299  //
    300 SwAttempt:
    301 #ifdef DEBUG_USB_HOST
    302  USBTRACE("\r\nAccessory mode switch attempt");
    303 Fail:
    304 #endif
    305  //USBTRACE2("\r\nADK Init Failed, error code: ", rcode);
    306  //NotifyFail(rcode);
    307  Release();
    308  return rcode;
    309 }
    310 
    311 /* Extracts bulk-IN and bulk-OUT endpoint information from config descriptor */
    312 void ADK::EndpointXtract(uint8_t conf, uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
    313  //ErrorMessage<uint8_t>(PSTR("Conf.Val"), conf);
    314  //ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
    315  //ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
    316 
    317  //added by Yuuichi Akagawa
    318  if(bNumEP == 3) {
    319  return;
    320  }
    321 
    322  bConfNum = conf;
    323 
    325  uint8_t index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    326  // Fill in the endpoint info structure
    327  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    328  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    329 
    330  bNumEP++;
    331 
    332  //PrintEndpointDescriptor(pep);
    333  }
    334 }
    335 
    336 /* Performs a cleanup after failed Init() attempt */
    337 uint8_t ADK::Release() {
    339 
    340  bNumEP = 1; //must have to be reset to 1
    341 
    342  bAddress = 0;
    343  ready = false;
    344  return 0;
    345 }
    346 
    347 uint8_t ADK::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    348  //USBTRACE2("\r\nAddr: ", bAddress );
    349  //USBTRACE2("\r\nEP: ",epInfo[epDataInIndex].epAddr);
    350  return pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    351 }
    352 
    353 uint8_t ADK::SndData(uint16_t nbytes, uint8_t *dataptr) {
    354  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    355 }
    356 
    358  Notify(PSTR("Endpoint descriptor:"), 0x80);
    359  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    360  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    361  Notify(PSTR("\r\nType:\t\t"), 0x80);
    362  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    363  Notify(PSTR("\r\nAddress:\t"), 0x80);
    364  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    365  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    366  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    367  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    368  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    369  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    370  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    371  Notify(PSTR("\r\n"), 0x80);
    372 }
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    uint8_t bmRcvToggle
    Definition: address.h:48
    #define ADB_PID
    Definition: adk.h:27
    @@ -537,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/adk_8h.html b/adk_8h.html index 6aff8e00..56609dfa 100644 --- a/adk_8h.html +++ b/adk_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: adk.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,20 +89,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    adk.h File Reference
    -
    #include "Usb.h"
    +
    #include "Usb.h"
    Include dependency graph for adk.h:
    - + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -376,7 +379,7 @@ Macros diff --git a/adk_8h__dep__incl.map b/adk_8h__dep__incl.map index 3983ea52..2c793cd8 100644 --- a/adk_8h__dep__incl.map +++ b/adk_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/adk_8h__dep__incl.md5 b/adk_8h__dep__incl.md5 index ddb1727d..721031bf 100644 --- a/adk_8h__dep__incl.md5 +++ b/adk_8h__dep__incl.md5 @@ -1 +1 @@ -c99e1b47b64e7d137c66cdf8662c2d34 \ No newline at end of file +e6d0d56c52d3fb6e81b76806cae456b2 \ No newline at end of file diff --git a/adk_8h__dep__incl.png b/adk_8h__dep__incl.png index 31a013a3568e6a09563d11e84610a061ecffd11b..b9ff26e3126a8ab5fa9a9de8e145ad385c2ded18 100644 GIT binary patch literal 2086 zcmbtWdpy(KA78nqjEO?V(+Eiqh9$RLhG;y6htkERF*J|cQ!}~L!dTj4<~mks2{Ci& zV&-nzFwb1lN-jm^H9hV`C7y4;U$0)j|9`LZIp_1oIp=de=kxiz-{)kU^l*`vQE82oW-6HvsG6%{vBRPLNZ4MblZvQjJ3_a*$%q?Q z8u^qWB}g;8Gfyaxs?G2VH8xLAD{aeJzL3RaehYe&1CCE}bu1GW$KL*IVnb({YQs_# zjY9)6WpUCIyHUDM1t^knp)zFoaMYKTu+z*JC*Q&JpNE?R!h*wET0g)jvXwqefI$*%8EwMX z3)d2QQYGwridn!Rf$)QH#w^PAG}9+1H@AerknkwmeMwZ^RcMM)+`Cr>^u_`l->iB0 z@@2)FT`xH})R2*Gx-G%c9Xp^%!B0c(8Q;nJ1Au zKGO=R)EjgwTt}!`M}YA!wzitV!NJw*V;o%IW54LHpCWSd^6s(OuP`?5?(P=Jo7Ru~ znEn({|KK2Dax%y|X+w1%0&92b6l67c$%P-Bm!E&Jk7k}uCOc!XhGb2fnf(GR!jUoX z-Es_DL;cpXO7g>p2FiQ(z>JI(iVzWUFK>I4IXXCO*HPN>Y4$Zy#Pav@*G*2@xHLXA zbYpPPb7gh)ZEwC2=vsO@Ys--{M&@#nqDP(;D-SyXhiz=2hkUAJN5(r+cb=bTFc>BX z1fpmK4_PudJ#u8PSS&6tFK=6(76!r#jgKA`lXyH{XGlH!fsC|t(~SPXgZ7DuHgglL zS~GuQocO_(8elG$YX_qQL`5lzs?RT{M~*eB0O7sDfdUfWJYETApCe~yD_P^0Bvn*Y zG;57h%p+Pq#R3r5p-6mzsx@OdB`FRG=p1+z;2X2`8Sm z&Ye8AWpUDf3s+z&ml+UDz7<{0oZZfIXWpVvAmvrqov}XGAyop5u+bQScuV`x;A)*X zl1iblt>oMHw)a$3VI7ev{Hgkk9ePP$nN}z@DVHqxv1HAz`PMCYa?#4VHEcUzM&8S( z9dchlqqSOlG=94|+*p<` z_L$(1sZ>b?ttWzLpCQL6xcdVzOG^_cyFWA{ac9x&kVc5Pjig?EU7d7e~CpSN(pz%4T+#X|IG=x9c*3E0Hs7+#>qJ%3_+x^G&YDo*ALHdG`eMBgL!5+6(Z zF9?680-{TW{iJ~Z&C&lcK})a-ZLF=Oq;~}oDkw{V$xhCj#N#@xDK-jg`EI34N5@A$ z(ykQsNt376#~VKqODZaMh*)1+bVlbv+gcR5*H6isNnTt14_g3^>R{nce`vcqU3aGc zt^Jbb`optw{y(#`UAJwn{zB~rsDpT(bEW-{r<}>DsVRO>4*{k79f#EynrEI?KY4;E z_cqAM$yv{g)gYe8|242X`#_dkslK7%pIt~8L{3hwCUgMCN5hM)@k)S!A+m6f0em>z zysoY;;IZH0+?bVqt{WPI;Y|8gpRkN*LYShdWh*;~m~=u%32tdQL(_ypSF_pJSMY2)9r}nF`7uW3ny-~o z26|*staw~EmxXtBmIgyDQ(9VVqcn(rX&vhjZ&)^5sPOIxs%>~M(S)D+-Nn&SBGdU| z+om!on@SxJiKdUtjgz~A7UO-KYu2%MVX#}AiyRscA-wzL$(N)jY8HW%J@_J^7Qu~Ai5CwP=C7l@jnzzzu+@B&FF zr&(F+A08ggUwYr`>g}z3rYX*Z9X*xi0tFLqphH5GD!kp4<)jYk>o0tvZQbk((LUr` zt;1%sZGps1y#uHdS?UP^7LiCK>kqv`p`KhS;drTM%p`ZmWR%4N=pFF>dDB#fnx-&A zU;bCrGi9LuTMiZK@NY#Cx-h-C1E!-tLBgG{7`OXP_ZtPjwb?vTkS|#MDALx}?z}ib zTg-j;4vigc7{H(wj=U&xsoD2&;K#!UU}{U|g-@(WUxeTHUjWF}$pcyK5J31B3Y6&r literal 1941 zcmV;G2Wt3C2PTZ@G{}Kx3}f1*+f$;dDatZvmo2+hZ+f2=)!q_ z+_(D(2_rAJz3ct_!7g9E_nhyCbMCktE|&!%1RH>)Z(RUIFrM^cqj+*+zx?9Gi(|)* zt*oq2Q_WXXUtfRl;K3LPYj|3%RlU^{Mr1J9R%d)aE{4sVWo<@2B%y`m^FZ%pklhM)9-rio9%axXvcHqDPnM@W6 zg$xFR#bSB)?pkd*#X%1VNIMlMw^~0C>IL+qZ8YJ$iJ{o;?77 z%*@QXy1Mh{&*S;s-Q9YEckc!OeE9I;b7^rwf+vT=al73e z9UUl&ibNtj_~y+Up-@QV9B zrKLqGm3DV`H#Ron!K|#TXV0DyIdgM!#CCgods9=>ojZ4?rlz7cNUk9c37#K6e#9`0 z!{G!1fvZ=q0swqI-~RpkySlpW-@m`GurNM8-rL(t-Da`k{FQSxoOj;hK7c=wzis@nyjp>y?gg66pHfla;a3>)zwv9U48xf^|NQsM(ib% z$p8R1ZrlI>baZqqEiJ9Tk{GaJulE@YhRVvy;o;$g7O_rRTU&WNp21*tTL=p2y>@kpyEhGBUzuvq`Or_5Jrha5!5?Z4;b2bt<;V z8lI#xI{K8)Z~XB`BgOqveSH4%%Ow7YVIeB}rPMPJz)Yqo0KohAzI*p(sqC6k&p-b7 z%jfe00NCs#lWCI5t||328YkK8Bme-0g@%TvQ8YkV*VK7>z5d^R`xC>0_*1_h`~COF zl=V)XXSgH)ASsDuG)_>~J9VB$<3#wv4~B(?hyU_;P-=Ro$a7)Ad+(kj82se31VZ@h zuhY~NK#`}}{AhI$Lip296ir=@smnJ8lheA;n z+}P}-!NDj)O*&L~4h}y2+@d0e1&u~3P8i7fy(~69Ux3g5?>Ca=Wq(S_cO1^YZ*c+^ z-=jhC_XY?dpWiqzFhy~v8)ZF#@uU}wC%s@i=>_9SFBngH!FbXO#*;FC7*Be^c+v~TlU^{MG$Z^+-<+Hr3VKXV-j=L%LWE>QQ!15e z=gyte)6;gly{M>2E|)_H@xAu#+vjjNtX8W~C~RqIi5gt)e_&oi7|C1+AmY0`< z!QkDycX1!FSlrjwN90_)c8%~vI+1c6EP37g~nM@{p`|;z)_%^=R^z<|y*X#8{ zp)hJNUeEZhzvXhd4u_+*wsv`Wxv;Ph54v0~i9|x=6ciK?+YcT*C@n2*Z*TAG>x*dW z`Sa(*O+xbX^YiobiI<4@jvYJPZg-5}mlNOdiK1vlMaAjUr)@S{XJ;oK%*n}l^yt59 zzh`DzAlG@r@V&0aOl{uZx@$qqyNYvci95op4yp7KjLa0`&w`|#xot@p;*;!Rp zg&+uqVJekMC={lpr4<(!TdmdzPZUMPVzE-G#Jg}hoe;v6l@+;ME)WPZGBT>FsumX) z3D2IMp6%PWZ{51}`0?W?ibf44+%utszdNymYZBqYoF{w>($mxH>+8QH7&kG-`hN{z z<}ICJJn2Q``E6TUn^vp+CZ!~lPduBNnp`f|w%U&;xd2P|-Wk00000NkvXXu0mjfeF)Rx diff --git a/adk_8h__incl.map b/adk_8h__incl.map index fcfea7b7..89c23cc9 100644 --- a/adk_8h__incl.map +++ b/adk_8h__incl.map @@ -1,3 +1,3 @@ - + diff --git a/adk_8h__incl.md5 b/adk_8h__incl.md5 index 12b6b5d1..78ab8688 100644 --- a/adk_8h__incl.md5 +++ b/adk_8h__incl.md5 @@ -1 +1 @@ -60a0d9759961c77b6c4712add13727e1 \ No newline at end of file +6316d3a392a1c1e1b044b310cd053323 \ No newline at end of file diff --git a/adk_8h__incl.png b/adk_8h__incl.png index 666a03c553d1c121a3d22cf2a0529b0481e9433d..436fec59ac6710077840041f4ea393651f96cc9f 100644 GIT binary patch literal 1683 zcmV;E25k9>P)iD_wsCK8OX3N7cM zWY4m!g3C^w)6DN__M4sgzW>f;XPcP{W@l$X8X^4C0q_jggEr}=N6fhPcsw4D=Z}QK zfr5g9_V#wVMZlQf>g(%Ck}NMTPiZEa0eRNNs+^3DAFKy$;Og15X%i!{=$*?1w-4H+n;w?;&r%45LfzfnBO@d6c)YT*^61f{3WWjy zFf%jba=CmypI9ueudiQN@a@~TEiEmLjg3~Tm66ro-+%k|?a!Y->-G9$$BwO9wTeSv z9NVY0wY9dk*5mQG-EO5)+1=fpwBNdQD-;S{yLPRstLxdbXN*$A!^0;|oNzjw3&j8c zoL#%~-`O9gcdgUcG8C7^G5ZW@hHWg9oY5y8 zy}iBX&!2B=Yum7418bcGL8#SgnM~Hu(D3fvJ8pq->~Eu^qg`EH@87@w^5qKvKq#Dh zF41UIqtPVOTCJ8|#O-!lESA-)SO2WeoSd9wLMoMh|Nfm@U>w`$^y$+Ui>0ThXK-+^ zzrR0`NF?n_r7{wUB-3MKWAq}Oot-2}-o1O5o5v->QBN!u%gD%($z-2CeL8pU9A)3K zWsA$@ibkW+Xw>C$(Tk{5s?N^NhYuh2^z=|hzFwmg9Q7POe*E&~%QZDMPN%b?qJpyT z-@iXUKi_V*I~)#^$;2p?o15Fw(c$%aZ{EDgJ>*})^8GV0G4Vh8USPzZZtqj92W_w( zw847NhGqRWK0Z#8WXdD?ZGyodi*p>f=2W_w(w847N2J1l^tOsqd9<;%F&<5*48>|OyupYF*de8>zK^v?GZLl7+ z!Fte!xqpW*1_t~O9=xJ1U%dFIq(qgSoteDUXcQ+;*23`1aX;Up1OnlKfmZfxu`iDlE)_=Mk=+-MfwSSxzVv)YU=kYyh?%r829!T2Je8vpaTF{HnmR zfxh0c+2(dFi$ubW8%veSEU50F>#3<(ClUz(0Ext`)ymwF%{$QbtXLu2y!kHxfJ7qP zwrwqJcd1xk@7Yrc0NA>9ZB~{Px-*@pJFqJ+R<}#zI){p^Sxvg%>Yg{P^)BBlpdlH_3D$5YXv# ztTjX;k!1So*ROK9e9=g3Hk-|6qg%MNk3=G2oJWquV$_l6-rioH&u1_gN=r*0J$gjl zQ&LirOz3pFa5&6bvsyj(J61+U#hvUhUCsR{XQ&UqUNje;kBS(%TbNBAu8w>`g zr>6n!oH_u2Ac$}{91e#Gg4nljA7$rxqNjJhC61p&B60otb(6`YP$(1%g~?>PapMM+ zd*{xbva&LnOlB|`d_EsFHqM+mlb4s5ot=I7@Znf2Mjtke1ncDz#}5}h=)li>fHGJQ z+F(6sgY}>d%kNdJ|7(OM!^6X7vzcz0*FIHMRgH~}sSRman9XL!uZ6JoQ~W8?ZTw(8 dXp?Sw{sj;e#c)RULzVyl002ovPDHLkV1gI(PJI9X literal 2022 zcmb_dcU03^7XDF9LW@C4D1ih_Ko~$Yv|*KA0!l9@U?^fhiUNW`1T%m$fHWBt3@Dv} z2nnHg7>ZOG2m&!Hpu*4wq(ne)C>wXzzxLlf@4S2OdGDR?ocrDTzME`+)lvi^0|5X) z#M;Wtk?T#lI}{|ywdTsBpQO5`NfPju()!cAQThlB0VRDAN#restLvD9(!n)iXnZ}=fPiRM7L@f8UJUeQzV)?> z&-U}3KWnTscRfaHLdF_82*xuSp^sJ##QOd?7gB>5p1Xiq%YnA;%>|LY$W@Pvc} zm2>AH$LUY2BbS7xzg;}4V8P#y^d^ci=jPJm;&{|Oo1u$~i{q;iAbws3J9uSdqkkYn zp~zmP(6zGnFL4uZoxJUJ_J!w{$%qsw&2;JI)i>o@GHF{;hU0+^6;)NKEVm@P5ora5 zf$fEXB1h^tlgZOT$jHu?OifGczSYzl*ihWqC@GmD;Ns$>Cl?hmsoTkxeT-@z_2rxgX4HFkdu9bX?X?cR3xlZm4vtTC9)3+x{reAZp-!+H8y zDZ|>yCkPP{k!R1I{e&xn&}HH9I7g~5n^0u`@X7o3dkGCetm2XqzTMs3x_+FE4IdCH zCzUa2nl$30t*@V)g|RcKoGNZ;~R7-8OC9+}spXEzrLsD44)Q+L-C) z5=BhID!@8nQgA0Hr+v<%kTMK>_~5d}wN`%bR!vnkHPh?Yl@NweK-0T4F5M*^9selp zv_+c|iRcIed0VtN_c2h|)+T$YKogzvlb?)P8D>zMRc@5REC#auc#`aX$Z0DF9R>&aMN29y#Gvp#j9Zja(mCX{k~OPe*Tzqa&In{5;OAQ zM2i`ytBCyQ;RC*yTX1hE@fQ+2aM!^0iU4ueg8Ia?3_t8-LGEc2E^|z8Z{Mltt?cuy zQKa!gSAuKrERR8xQ6t=6vcJnBZ$D>Vj32bGWFeuT%gJFg5d#Mc8B|`svyW3#Q_0@5 zt?P_wBrI$^U|J}1A|j@UcXOuYl1Z1bz3ZNxF^7l$i37e>r&L`sg>kPAa`Wa8?+xX` zRD}obN%6cAeeN>2&4@NwE>fm|k#JF)rf@T(8 z>-_B?^H)@Fx_l*I#1NuEiK4B8Lqi`!6omoQQ=)jwp>9tYjIe;X6r&g1ZvFOJ5Se^g z6k(WjB~NE`ltZdZXtF|QsRsWhs5mU$kS42ZQo?*qx*E@9v*BU-_b1H1*YMTz8=-Qi zaz-RRb12Q8^vzsL%=FQ*CL{Y>mAB9fOQU)29nn}nZTK08fV!m3;8!&_x}vVGlufpJ z9HDw(e?Mw6cD6NA2v-K9QmM$Sf>8>ERSG0c1*YA5eG!hzD`TI18|HE!HGHZz8KZZz6PxtMP7w8Vr@N5R2;(iv9)%mcq z`i6n0Iea0lj3Y}+OZhRja`N(NHu+(h#>B(KaH2jID?!?vGrxUXGh5Ruo#xS0TwZ<( z#Vq)^s=CGDaI_2!<*)<`i~a~s@&54-%k527RaFe9*)>)*GSliYg#re+dSj#rHS+hz z%-qu5+n7z6m~d>K-SCz#e*-_9VX+d|*Vik~F9+e;^hYYF)b8V>zdwfRZEei{IMW#` z+eX^7h>XORPOK(kX?pe3!PrS-cPk=NecUHYb| o&#~8|BcWcj^KU-?9bNNX$8x^f`qt7S+`$c4n_o4fn|R0n3;ETR+5i9m diff --git a/adk_8h_source.html b/adk_8h_source.html index dccbbf71..532a0c3a 100644 --- a/adk_8h_source.html +++ b/adk_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: adk.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,147 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    adk.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 
    -
    18 /* Google ADK interface support header */
    -
    19 
    -
    20 #if !defined(_ADK_H_)
    -
    21 #define _ADK_H_
    -
    22 
    -
    23 #include "Usb.h"
    -
    24 
    -
    25 #define ADK_VID 0x18D1
    -
    26 #define ADK_PID 0x2D00
    -
    27 #define ADB_PID 0x2D01
    -
    28 
    -
    29 #define XOOM //enables repeating getProto() and getConf() attempts
    -
    30 //necessary for slow devices such as Motorola XOOM
    -
    31 //defined by default, can be commented out to save memory
    -
    32 
    -
    33 /* requests */
    -
    34 
    -
    35 #define ADK_GETPROTO 51 //check USB accessory protocol version
    -
    36 #define ADK_SENDSTR 52 //send identifying string
    -
    37 #define ADK_ACCSTART 53 //start device in accessory mode
    -
    38 
    -
    39 #define bmREQ_ADK_GET USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_VENDOR|USB_SETUP_RECIPIENT_DEVICE
    -
    40 #define bmREQ_ADK_SEND USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_VENDOR|USB_SETUP_RECIPIENT_DEVICE
    -
    41 
    -
    42 #define ACCESSORY_STRING_MANUFACTURER 0
    -
    43 #define ACCESSORY_STRING_MODEL 1
    -
    44 #define ACCESSORY_STRING_DESCRIPTION 2
    -
    45 #define ACCESSORY_STRING_VERSION 3
    -
    46 #define ACCESSORY_STRING_URI 4
    -
    47 #define ACCESSORY_STRING_SERIAL 5
    -
    48 
    -
    49 #define ADK_MAX_ENDPOINTS 3 //endpoint 0, bulk_IN, bulk_OUT
    -
    50 
    -
    51 class ADK;
    -
    52 
    -
    53 class ADK : public USBDeviceConfig, public UsbConfigXtracter {
    -
    54 private:
    -
    55  /* ID strings */
    -
    56  const char* manufacturer;
    -
    57  const char* model;
    -
    58  const char* description;
    -
    59  const char* version;
    -
    60  const char* uri;
    -
    61  const char* serial;
    -
    62 
    -
    63  /* ADK proprietary requests */
    -
    64  uint8_t getProto(uint8_t* adkproto);
    -
    65  uint8_t sendStr(uint8_t index, const char* str);
    -
    66  uint8_t switchAcc(void);
    -
    67 
    -
    68 protected:
    -
    69  static const uint8_t epDataInIndex; // DataIn endpoint index
    -
    70  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    -
    71 
    -
    72  /* mandatory members */
    - -
    74  uint8_t bAddress;
    -
    75  uint8_t bConfNum; // configuration number
    -
    76 
    -
    77  uint8_t bNumEP; // total number of EP in the configuration
    -
    78  bool ready;
    -
    79 
    -
    80  /* Endpoint data structure */
    - -
    82 
    - -
    84 
    -
    85 public:
    -
    86  ADK(USB *pUsb, const char* manufacturer,
    -
    87  const char* model,
    -
    88  const char* description,
    -
    89  const char* version,
    -
    90  const char* uri,
    -
    91  const char* serial);
    -
    92 
    -
    93  // Methods for receiving and sending data
    -
    94  uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr);
    -
    95  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    -
    96 
    -
    97 
    -
    98  // USBDeviceConfig implementation
    -
    99  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
    -
    100  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    101  uint8_t Release();
    -
    102 
    -
    103  virtual uint8_t Poll() {
    -
    104  return 0;
    -
    105  };
    -
    106 
    -
    107  virtual uint8_t GetAddress() {
    -
    108  return bAddress;
    -
    109  };
    -
    110 
    -
    111  virtual bool isReady() {
    -
    112  return ready;
    -
    113  };
    -
    114 
    -
    115  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    116  return (vid == ADK_VID && (pid == ADK_PID || pid == ADB_PID));
    -
    117  };
    -
    118 
    -
    119  //UsbConfigXtracter implementation
    -
    120  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    121 }; //class ADK : public USBDeviceConfig ...
    -
    122 
    -
    123 /* get ADK protocol version */
    -
    124 
    -
    125 /* returns 2 bytes in *adkproto */
    -
    126 inline uint8_t ADK::getProto(uint8_t* adkproto) {
    -
    127  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_GET, ADK_GETPROTO, 0, 0, 0, 2, 2, adkproto, NULL));
    -
    128 }
    -
    129 
    -
    130 /* send ADK string */
    -
    131 inline uint8_t ADK::sendStr(uint8_t index, const char* str) {
    -
    132  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_SEND, ADK_SENDSTR, 0, 0, index, strlen(str) + 1, strlen(str) + 1, (uint8_t*)str, NULL));
    -
    133 }
    -
    134 
    -
    135 /* switch to accessory mode */
    -
    136 inline uint8_t ADK::switchAcc(void) {
    -
    137  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_SEND, ADK_ACCSTART, 0, 0, 0, 0, 0, NULL, NULL));
    -
    138 }
    -
    139 
    -
    140 #endif // _ADK_H_
    -
    #define ADB_PID
    Definition: adk.h:27
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 
    18 /* Google ADK interface support header */
    19 
    20 #if !defined(_ADK_H_)
    21 #define _ADK_H_
    22 
    23 #include "Usb.h"
    24 
    25 #define ADK_VID 0x18D1
    26 #define ADK_PID 0x2D00
    27 #define ADB_PID 0x2D01
    28 
    29 #define XOOM //enables repeating getProto() and getConf() attempts
    30 //necessary for slow devices such as Motorola XOOM
    31 //defined by default, can be commented out to save memory
    32 
    33 /* requests */
    34 
    35 #define ADK_GETPROTO 51 //check USB accessory protocol version
    36 #define ADK_SENDSTR 52 //send identifying string
    37 #define ADK_ACCSTART 53 //start device in accessory mode
    38 
    39 #define bmREQ_ADK_GET USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_VENDOR|USB_SETUP_RECIPIENT_DEVICE
    40 #define bmREQ_ADK_SEND USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_VENDOR|USB_SETUP_RECIPIENT_DEVICE
    41 
    42 #define ACCESSORY_STRING_MANUFACTURER 0
    43 #define ACCESSORY_STRING_MODEL 1
    44 #define ACCESSORY_STRING_DESCRIPTION 2
    45 #define ACCESSORY_STRING_VERSION 3
    46 #define ACCESSORY_STRING_URI 4
    47 #define ACCESSORY_STRING_SERIAL 5
    48 
    49 #define ADK_MAX_ENDPOINTS 3 //endpoint 0, bulk_IN, bulk_OUT
    50 
    51 class ADK;
    52 
    53 class ADK : public USBDeviceConfig, public UsbConfigXtracter {
    54 private:
    55  /* ID strings */
    56  const char* manufacturer;
    57  const char* model;
    58  const char* description;
    59  const char* version;
    60  const char* uri;
    61  const char* serial;
    62 
    63  /* ADK proprietary requests */
    64  uint8_t getProto(uint8_t* adkproto);
    65  uint8_t sendStr(uint8_t index, const char* str);
    66  uint8_t switchAcc(void);
    67 
    68 protected:
    69  static const uint8_t epDataInIndex; // DataIn endpoint index
    70  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    71 
    72  /* mandatory members */
    74  uint8_t bAddress;
    75  uint8_t bConfNum; // configuration number
    76 
    77  uint8_t bNumEP; // total number of EP in the configuration
    78  bool ready;
    79 
    80  /* Endpoint data structure */
    82 
    84 
    85 public:
    86  ADK(USB *pUsb, const char* manufacturer,
    87  const char* model,
    88  const char* description,
    89  const char* version,
    90  const char* uri,
    91  const char* serial);
    92 
    93  // Methods for receiving and sending data
    94  uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr);
    95  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    96 
    97 
    98  // USBDeviceConfig implementation
    99  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
    100  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    101  uint8_t Release();
    102 
    103  virtual uint8_t Poll() {
    104  return 0;
    105  };
    106 
    107  virtual uint8_t GetAddress() {
    108  return bAddress;
    109  };
    110 
    111  virtual bool isReady() {
    112  return ready;
    113  };
    114 
    115  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    116  return (vid == ADK_VID && (pid == ADK_PID || pid == ADB_PID));
    117  };
    118 
    119  //UsbConfigXtracter implementation
    120  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    121 }; //class ADK : public USBDeviceConfig ...
    122 
    123 /* get ADK protocol version */
    124 
    125 /* returns 2 bytes in *adkproto */
    126 inline uint8_t ADK::getProto(uint8_t* adkproto) {
    127  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_GET, ADK_GETPROTO, 0, 0, 0, 2, 2, adkproto, NULL));
    128 }
    129 
    130 /* send ADK string */
    131 inline uint8_t ADK::sendStr(uint8_t index, const char* str) {
    132  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_SEND, ADK_SENDSTR, 0, 0, index, strlen(str) + 1, strlen(str) + 1, (uint8_t*)str, NULL));
    133 }
    134 
    135 /* switch to accessory mode */
    136 inline uint8_t ADK::switchAcc(void) {
    137  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_ADK_SEND, ADK_ACCSTART, 0, 0, 0, 0, 0, NULL, NULL));
    138 }
    139 
    140 #endif // _ADK_H_
    #define ADB_PID
    Definition: adk.h:27
    static const uint8_t epDataInIndex
    Definition: adk.h:69
    uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
    Definition: adk.cpp:347
    uint8_t Release()
    Definition: adk.cpp:337
    @@ -267,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/annotated.html b/annotated.html index 775d37a1..f28ee937 100644 --- a/annotated.html +++ b/annotated.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -73,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -89,101 +90,101 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Here are the classes, structs, unions and interfaces with brief descriptions:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    oCACM
    oCACM_FUNC_DESCR
    oCAddressPool
    oCAddressPoolImpl
    oCADK
    oCBASICCDB
    oCBluetoothService
    oCBTD
    oCBTHID
    oCBulkOnly
    oCByteSkipper
    oCCALL_MGMNT_FUNC_DESCR
    oCCapacity
    oCCDB10
    oCCDB12
    oCCDB6
    oCCDB_LBA32_16
    oCCDB_LBA64_16
    oCCDCAsyncOper
    oCCLASS_NOTIFICATION
    oCCommandBlockWrapper
    oCCommandBlockWrapperBase
    oCCommandStatusWrapper
    oCConfigDescParser
    oCEpInfo
    oCFTDI
    oCFTDIAsyncOper
    oCHexDumper
    oCHID_CLASS_DESCRIPTOR_LEN_AND_TYPE
    oCHIDBoot
    oCHIDComposite
    oCHidItemPrefix
    oCHIDReportParser
    oCHIDUniversal
    oCHubDescriptor
    oCHubEvent
    oCInquiryResponse
    oCKBDINFO
    oCKBDLEDS
    oCKeyboardReportParser
    oCLINE_CODING
    oCMainItemIOFeature
    oCMAX3421e
    oCMax_LCD
    oCMODIFIERKEYS
    oCMOUSEINFO
    oCMouseReportParser
    oCMultiByteValueParser
    oCMultiValueBuffer
    oCPL2303
    oCPS3BT
    oCPS3USB
    oCPS4BT
    oCPS4Buttons
    oCPS4Data
    oCPS4Output
    oCPS4Parser
    oCPS4Status
    oCPS4USB
    oCPSBuzz
    oCPSBUZZButtons
    oCPTPListParser
    oCReportDescParser
    oCReportDescParser2
    oCReportDescParserBase
    oCRequestSenseResponce
    oCSETUP_PKT
    oCSinkParser
    oCSPi
    oCSPP
    oCTEL_RINGER_FUNC_DESCR
    oCtouchpadXY
    oCtty_features
    oCUHS2_GPIO
    oCUniversalReportParser
    oCUSB
    oCUSB_CONFIGURATION_DESCRIPTOR
    oCUSB_DEVICE_DESCRIPTOR
    oCUSB_ENDPOINT_DESCRIPTOR
    oCUSB_HID_DESCRIPTOR
    oCUSB_INTERFACE_DESCRIPTOR
    oCUsbConfigXtracter
    oCUsbDevice
    oCUsbDeviceAddress
    oCUSBDeviceConfig
    oCUSBH_MIDI
    oCUSBHID
    oCUSBHub
    oCUSBReadParser
    oCWII
    oCXBOXOLD
    oCXBOXONE
    oCXBOXRECV
    oCXBOXUSB
    \CXR21B1411
     CACM
     CACM_FUNC_DESCR
     CAddressPool
     CAddressPoolImpl
     CADK
     CBASICCDB
     CBluetoothService
     CBTD
     CBTHID
     CBulkOnly
     CByteSkipper
     CCALL_MGMNT_FUNC_DESCR
     CCapacity
     CCDB10
     CCDB12
     CCDB6
     CCDB_LBA32_16
     CCDB_LBA64_16
     CCDCAsyncOper
     CCLASS_NOTIFICATION
     CCommandBlockWrapper
     CCommandBlockWrapperBase
     CCommandStatusWrapper
     CConfigDescParser
     CEpInfo
     CFTDI
     CFTDIAsyncOper
     CHexDumper
     CHID_CLASS_DESCRIPTOR_LEN_AND_TYPE
     CHIDBoot
     CHIDComposite
     CHidItemPrefix
     CHIDReportParser
     CHIDUniversal
     CHubDescriptor
     CHubEvent
     CInquiryResponse
     CKBDINFO
     CKBDLEDS
     CKeyboardReportParser
     CLINE_CODING
     CMainItemIOFeature
     CMAX3421e
     CMax_LCD
     CMODIFIERKEYS
     CMOUSEINFO
     CMouseReportParser
     CMultiByteValueParser
     CMultiValueBuffer
     CPL2303
     CPS3BT
     CPS3USB
     CPS4BT
     CPS4Buttons
     CPS4Data
     CPS4Output
     CPS4Parser
     CPS4Status
     CPS4USB
     CPSBuzz
     CPSBUZZButtons
     CPTPListParser
     CReportDescParser
     CReportDescParser2
     CReportDescParserBase
     CRequestSenseResponce
     CSETUP_PKT
     CSinkParser
     CSPi
     CSPP
     CTEL_RINGER_FUNC_DESCR
     CtouchpadXY
     Ctty_features
     CUHS2_GPIO
     CUniversalReportParser
     CUSB
     CUSB_CONFIGURATION_DESCRIPTOR
     CUSB_DEVICE_DESCRIPTOR
     CUSB_ENDPOINT_DESCRIPTOR
     CUSB_HID_DESCRIPTOR
     CUSB_INTERFACE_DESCRIPTOR
     CUsbConfigXtracter
     CUsbDevice
     CUsbDeviceAddress
     CUSBDeviceConfig
     CUSBH_MIDI
     CUSBHID
     CUSBHub
     CUSBReadParser
     CWII
     CXBOXOLD
     CXBOXONE
     CXBOXRECV
     CXBOXUSB
     CXR21B1411
    @@ -191,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ftv2mlastnode.png b/arrowdown.png similarity index 100% rename from ftv2mlastnode.png rename to arrowdown.png diff --git a/ftv2plastnode.png b/arrowright.png similarity index 100% rename from ftv2plastnode.png rename to arrowright.png diff --git a/avrpins_8h.html b/avrpins_8h.html index 3cfec52d..692aaaaa 100644 --- a/avrpins_8h.html +++ b/avrpins_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: avrpins.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -92,7 +93,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/avrpins_8h_source.html b/avrpins_8h_source.html index b1d2dab8..90e3d349 100644 --- a/avrpins_8h_source.html +++ b/avrpins_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: avrpins.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,1507 +86,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    avrpins.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This program is free software; you can redistribute it and/or modify
    -
    4 it under the terms of the GNU General Public License as published by
    -
    5 the Free Software Foundation; either version 2 of the License, or
    -
    6 (at your option) any later version.
    -
    7 
    -
    8 This program is distributed in the hope that it will be useful,
    -
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    -
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    -
    11 GNU General Public License for more details.
    -
    12 
    -
    13 You should have received a copy of the GNU General Public License
    -
    14 along with this program; if not, write to the Free Software
    -
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    16 
    -
    17 Contact information
    -
    18 -------------------
    -
    19 
    -
    20 Circuits At Home, LTD
    -
    21 Web : http://www.circuitsathome.com
    -
    22 e-mail : support@circuitsathome.com
    -
    23  */
    -
    24 
    -
    25 /* derived from Konstantin Chizhov's AVR port templates */
    -
    26 
    -
    27 #if !defined(_usb_h_) || defined(_avrpins_h_)
    -
    28 #error "Never include avrpins.h directly; include Usb.h instead"
    -
    29 #else
    -
    30 #define _avrpins_h_
    -
    31 
    -
    32 #if defined(__AVR__)
    -
    33 
    -
    34 // pointers are 16 bits on AVR
    -
    35 #define pgm_read_pointer(p) pgm_read_word(p)
    -
    36 
    -
    37 // Support for these boards needs to be manually activated in settings.h or in a makefile
    -
    38 #if !defined(BOARD_MEGA_ADK) && defined(__AVR_ATmega2560__) && (USE_UHS_MEGA_ADK || defined(ARDUINO_AVR_ADK))
    -
    39 #define BOARD_MEGA_ADK
    -
    40 #elif !defined(BOARD_BLACK_WIDDOW) && USE_UHS_BLACK_WIDDOW
    -
    41 #define BOARD_BLACK_WIDDOW
    -
    42 #endif
    -
    43 
    -
    44 #ifdef PORTA
    -
    45 #define USE_PORTA
    -
    46 #endif
    -
    47 #ifdef PORTB
    -
    48 #define USE_PORTB
    -
    49 #endif
    -
    50 #ifdef PORTC
    -
    51 #define USE_PORTC
    -
    52 #endif
    -
    53 #ifdef PORTD
    -
    54 #define USE_PORTD
    -
    55 #endif
    -
    56 #ifdef PORTE
    -
    57 #define USE_PORTE
    -
    58 #endif
    -
    59 #ifdef PORTF
    -
    60 #define USE_PORTF
    -
    61 #endif
    -
    62 #ifdef PORTG
    -
    63 #define USE_PORTG
    -
    64 #endif
    -
    65 #ifdef PORTH
    -
    66 #define USE_PORTH
    -
    67 #endif
    -
    68 #ifdef PORTJ
    -
    69 #define USE_PORTJ
    -
    70 #endif
    -
    71 #ifdef PORTK
    -
    72 #define USE_PORTK
    -
    73 #endif
    -
    74 #ifdef PORTL
    -
    75 #define USE_PORTL
    -
    76 #endif
    -
    77 #ifdef PORTQ
    -
    78 #define USE_PORTQ
    -
    79 #endif
    -
    80 #ifdef PORTR
    -
    81 #define USE_PORTR
    -
    82 #endif
    -
    83 
    -
    84 #ifdef TCCR0A
    -
    85 #define USE_TCCR0A
    -
    86 #endif
    -
    87 #ifdef TCCR1A
    -
    88 #define USE_TCCR1A
    -
    89 #endif
    -
    90 #ifdef TCCR2A
    -
    91 #define USE_TCCR2A
    -
    92 #endif
    -
    93 
    -
    94 //Port definitions for AtTiny, AtMega families.
    -
    95 
    -
    96 #define MAKE_PORT(portName, ddrName, pinName, className, ID) \
    -
    97  class className{\
    -
    98  public:\
    -
    99  typedef uint8_t DataT;\
    -
    100  public:\
    -
    101  static void Write(DataT value){portName = value;}\
    -
    102  static void ClearAndSet(DataT clearMask, DataT value){portName = (portName & ~clearMask) | value;}\
    -
    103  static DataT Read(){return portName;}\
    -
    104  static void DirWrite(DataT value){ddrName = value;}\
    -
    105  static DataT DirRead(){return ddrName;}\
    -
    106  static void Set(DataT value){portName |= value;}\
    -
    107  static void Clear(DataT value){portName &= ~value;}\
    -
    108  static void Toggle(DataT value){portName ^= value;}\
    -
    109  static void DirSet(DataT value){ddrName |= value;}\
    -
    110  static void DirClear(DataT value){ddrName &= ~value;}\
    -
    111  static void DirToggle(DataT value){ddrName ^= value;}\
    -
    112  static DataT PinRead(){return pinName;}\
    -
    113  enum{Id = ID};\
    -
    114  enum{Width=sizeof(DataT)*8};\
    -
    115  };
    -
    116 
    -
    117 // TCCR registers to set/clear Arduino PWM
    -
    118 #define MAKE_TCCR(TccrName, className) \
    -
    119  class className{\
    -
    120  public:\
    -
    121  typedef uint8_t DataT;\
    -
    122  public:\
    -
    123  static void Write(DataT value){TccrName = value;}\
    -
    124  static void ClearAndSet(DataT clearMask, DataT value){TccrName = (TccrName & ~clearMask) | value;}\
    -
    125  static DataT Read(){return TccrName;}\
    -
    126  static void Set(DataT value){TccrName |= value;}\
    -
    127  static void Clear(DataT value){TccrName &= ~value;}\
    -
    128  static void Toggle(DataT value){TccrName ^= value;}\
    -
    129  enum{Width=sizeof(DataT)*8};\
    -
    130  };
    -
    131 
    -
    132 #ifdef USE_PORTA
    -
    133 
    -
    134 MAKE_PORT(PORTA, DDRA, PINA, Porta, 'A')
    -
    135 #endif
    -
    136 #ifdef USE_PORTB
    -
    137 MAKE_PORT(PORTB, DDRB, PINB, Portb, 'B')
    -
    138 #endif
    -
    139 #ifdef USE_PORTC
    -
    140 MAKE_PORT(PORTC, DDRC, PINC, Portc, 'C')
    -
    141 #endif
    -
    142 #ifdef USE_PORTD
    -
    143 MAKE_PORT(PORTD, DDRD, PIND, Portd, 'D')
    -
    144 #endif
    -
    145 #ifdef USE_PORTE
    -
    146 MAKE_PORT(PORTE, DDRE, PINE, Porte, 'E')
    -
    147 #endif
    -
    148 #ifdef USE_PORTF
    -
    149 MAKE_PORT(PORTF, DDRF, PINF, Portf, 'F')
    -
    150 #endif
    -
    151 #ifdef USE_PORTG
    -
    152 MAKE_PORT(PORTG, DDRG, PING, Portg, 'G')
    -
    153 #endif
    -
    154 #ifdef USE_PORTH
    -
    155 MAKE_PORT(PORTH, DDRH, PINH, Porth, 'H')
    -
    156 #endif
    -
    157 #ifdef USE_PORTJ
    -
    158 MAKE_PORT(PORTJ, DDRJ, PINJ, Portj, 'J')
    -
    159 #endif
    -
    160 #ifdef USE_PORTK
    -
    161 MAKE_PORT(PORTK, DDRK, PINK, Portk, 'K')
    -
    162 #endif
    -
    163 #ifdef USE_PORTL
    -
    164 MAKE_PORT(PORTL, DDRL, PINL, Portl, 'L')
    -
    165 #endif
    -
    166 #ifdef USE_PORTQ
    -
    167 MAKE_PORT(PORTQ, DDRQ, PINQ, Portq, 'Q')
    -
    168 #endif
    -
    169 #ifdef USE_PORTR
    -
    170 MAKE_PORT(PORTR, DDRR, PINR, Portr, 'R')
    -
    171 #endif
    -
    172 
    -
    173 #ifdef USE_TCCR0A
    -
    174 MAKE_TCCR(TCCR0A, Tccr0a)
    -
    175 #endif
    -
    176 #ifdef USE_TCCR1A
    -
    177 MAKE_TCCR(TCCR1A, Tccr1a)
    -
    178 #endif
    -
    179 #ifdef USE_TCCR2A
    -
    180 MAKE_TCCR(TCCR2A, Tccr2a)
    -
    181 #endif
    -
    182 
    -
    183 // this class represents one pin in a IO port.
    -
    184 // It is fully static.
    -
    185 template<typename PORT, uint8_t PIN>
    -
    186 class TPin {
    -
    187  // BOOST_STATIC_ASSERT(PIN < PORT::Width);
    -
    188 public:
    -
    189  typedef PORT Port;
    -
    190 
    -
    191  enum {
    -
    192  Number = PIN
    -
    193  };
    -
    194 
    -
    195  static void Set() {
    -
    196  PORT::Set(1 << PIN);
    -
    197  }
    -
    198 
    -
    199  static void Set(uint8_t val) {
    -
    200  if(val)
    -
    201  Set();
    -
    202  else Clear();
    -
    203  }
    -
    204 
    -
    205  static void SetDir(uint8_t val) {
    -
    206  if(val)
    -
    207  SetDirWrite();
    -
    208  else SetDirRead();
    -
    209  }
    -
    210 
    -
    211  static void Clear() {
    -
    212  PORT::Clear(1 << PIN);
    -
    213  }
    -
    214 
    -
    215  static void Toggle() {
    -
    216  PORT::Toggle(1 << PIN);
    -
    217  }
    -
    218 
    -
    219  static void SetDirRead() {
    -
    220  PORT::DirClear(1 << PIN);
    -
    221  }
    -
    222 
    -
    223  static void SetDirWrite() {
    -
    224  PORT::DirSet(1 << PIN);
    -
    225  }
    -
    226 
    -
    227  static uint8_t IsSet() {
    -
    228  return PORT::PinRead() & (uint8_t)(1 << PIN);
    -
    229  }
    -
    230 
    -
    231  static void WaiteForSet() {
    -
    232  while(IsSet() == 0) {
    -
    233  }
    -
    234  }
    -
    235 
    -
    236  static void WaiteForClear() {
    -
    237  while(IsSet()) {
    -
    238  }
    -
    239  }
    -
    240 }; //class TPin...
    -
    241 
    -
    242 // this class represents one bit in TCCR port.
    -
    243 // used to set/clear TCCRx bits
    -
    244 // It is fully static.
    -
    245 
    -
    246 template<typename TCCR, uint8_t COM>
    -
    247 class TCom {
    -
    248  // BOOST_STATIC_ASSERT(PIN < PORT::Width);
    -
    249 public:
    -
    250  typedef TCCR Tccr;
    -
    251 
    -
    252  enum {
    -
    253  Com = COM
    -
    254  };
    -
    255 
    -
    256  static void Set() {
    -
    257  TCCR::Set(1 << COM);
    -
    258  }
    -
    259 
    -
    260  static void Clear() {
    -
    261  TCCR::Clear(1 << COM);
    -
    262  }
    -
    263 
    -
    264  static void Toggle() {
    -
    265  TCCR::Toggle(1 << COM);
    -
    266  }
    -
    267 }; //class TCom...
    -
    268 
    -
    269 //Short pin definitions
    -
    270 #ifdef USE_PORTA
    -
    271 typedef TPin<Porta, 0 > Pa0;
    -
    272 typedef TPin<Porta, 1 > Pa1;
    -
    273 typedef TPin<Porta, 2 > Pa2;
    -
    274 typedef TPin<Porta, 3 > Pa3;
    -
    275 typedef TPin<Porta, 4 > Pa4;
    -
    276 typedef TPin<Porta, 5 > Pa5;
    -
    277 typedef TPin<Porta, 6 > Pa6;
    -
    278 typedef TPin<Porta, 7 > Pa7;
    -
    279 #endif
    -
    280 
    -
    281 #ifdef USE_PORTB
    -
    282 typedef TPin<Portb, 0 > Pb0;
    -
    283 typedef TPin<Portb, 1 > Pb1;
    -
    284 typedef TPin<Portb, 2 > Pb2;
    -
    285 typedef TPin<Portb, 3 > Pb3;
    -
    286 typedef TPin<Portb, 4 > Pb4;
    -
    287 typedef TPin<Portb, 5 > Pb5;
    -
    288 typedef TPin<Portb, 6 > Pb6;
    -
    289 typedef TPin<Portb, 7 > Pb7;
    -
    290 #endif
    -
    291 
    -
    292 #ifdef USE_PORTC
    -
    293 typedef TPin<Portc, 0 > Pc0;
    -
    294 typedef TPin<Portc, 1 > Pc1;
    -
    295 typedef TPin<Portc, 2 > Pc2;
    -
    296 typedef TPin<Portc, 3 > Pc3;
    -
    297 typedef TPin<Portc, 4 > Pc4;
    -
    298 typedef TPin<Portc, 5 > Pc5;
    -
    299 typedef TPin<Portc, 6 > Pc6;
    -
    300 typedef TPin<Portc, 7 > Pc7;
    -
    301 #endif
    -
    302 
    -
    303 #ifdef USE_PORTD
    -
    304 typedef TPin<Portd, 0 > Pd0;
    -
    305 typedef TPin<Portd, 1 > Pd1;
    -
    306 typedef TPin<Portd, 2 > Pd2;
    -
    307 typedef TPin<Portd, 3 > Pd3;
    -
    308 typedef TPin<Portd, 4 > Pd4;
    -
    309 typedef TPin<Portd, 5 > Pd5;
    -
    310 typedef TPin<Portd, 6 > Pd6;
    -
    311 typedef TPin<Portd, 7 > Pd7;
    -
    312 #endif
    -
    313 
    -
    314 #ifdef USE_PORTE
    -
    315 typedef TPin<Porte, 0 > Pe0;
    -
    316 typedef TPin<Porte, 1 > Pe1;
    -
    317 typedef TPin<Porte, 2 > Pe2;
    -
    318 typedef TPin<Porte, 3 > Pe3;
    -
    319 typedef TPin<Porte, 4 > Pe4;
    -
    320 typedef TPin<Porte, 5 > Pe5;
    -
    321 typedef TPin<Porte, 6 > Pe6;
    -
    322 typedef TPin<Porte, 7 > Pe7;
    -
    323 #endif
    -
    324 
    -
    325 #ifdef USE_PORTF
    -
    326 typedef TPin<Portf, 0 > Pf0;
    -
    327 typedef TPin<Portf, 1 > Pf1;
    -
    328 typedef TPin<Portf, 2 > Pf2;
    -
    329 typedef TPin<Portf, 3 > Pf3;
    -
    330 typedef TPin<Portf, 4 > Pf4;
    -
    331 typedef TPin<Portf, 5 > Pf5;
    -
    332 typedef TPin<Portf, 6 > Pf6;
    -
    333 typedef TPin<Portf, 7 > Pf7;
    -
    334 #endif
    -
    335 
    -
    336 #ifdef USE_PORTG
    -
    337 typedef TPin<Portg, 0 > Pg0;
    -
    338 typedef TPin<Portg, 1 > Pg1;
    -
    339 typedef TPin<Portg, 2 > Pg2;
    -
    340 typedef TPin<Portg, 3 > Pg3;
    -
    341 typedef TPin<Portg, 4 > Pg4;
    -
    342 typedef TPin<Portg, 5 > Pg5;
    -
    343 typedef TPin<Portg, 6 > Pg6;
    -
    344 typedef TPin<Portg, 7 > Pg7;
    -
    345 #endif
    -
    346 
    -
    347 #ifdef USE_PORTH
    -
    348 typedef TPin<Porth, 0 > Ph0;
    -
    349 typedef TPin<Porth, 1 > Ph1;
    -
    350 typedef TPin<Porth, 2 > Ph2;
    -
    351 typedef TPin<Porth, 3 > Ph3;
    -
    352 typedef TPin<Porth, 4 > Ph4;
    -
    353 typedef TPin<Porth, 5 > Ph5;
    -
    354 typedef TPin<Porth, 6 > Ph6;
    -
    355 typedef TPin<Porth, 7 > Ph7;
    -
    356 #endif
    -
    357 
    -
    358 #ifdef USE_PORTJ
    -
    359 typedef TPin<Portj, 0 > Pj0;
    -
    360 typedef TPin<Portj, 1 > Pj1;
    -
    361 typedef TPin<Portj, 2 > Pj2;
    -
    362 typedef TPin<Portj, 3 > Pj3;
    -
    363 typedef TPin<Portj, 4 > Pj4;
    -
    364 typedef TPin<Portj, 5 > Pj5;
    -
    365 typedef TPin<Portj, 6 > Pj6;
    -
    366 typedef TPin<Portj, 7 > Pj7;
    -
    367 #endif
    -
    368 
    -
    369 #ifdef USE_PORTK
    -
    370 typedef TPin<Portk, 0 > Pk0;
    -
    371 typedef TPin<Portk, 1 > Pk1;
    -
    372 typedef TPin<Portk, 2 > Pk2;
    -
    373 typedef TPin<Portk, 3 > Pk3;
    -
    374 typedef TPin<Portk, 4 > Pk4;
    -
    375 typedef TPin<Portk, 5 > Pk5;
    -
    376 typedef TPin<Portk, 6 > Pk6;
    -
    377 typedef TPin<Portk, 7 > Pk7;
    -
    378 #endif
    -
    379 
    -
    380 #ifdef USE_PORTL
    -
    381 typedef TPin<Portl, 0 > Pl0;
    -
    382 typedef TPin<Portl, 1 > Pl1;
    -
    383 typedef TPin<Portl, 2 > Pl2;
    -
    384 typedef TPin<Portl, 3 > Pl3;
    -
    385 typedef TPin<Portl, 4 > Pl4;
    -
    386 typedef TPin<Portl, 5 > Pl5;
    -
    387 typedef TPin<Portl, 6 > Pl6;
    -
    388 typedef TPin<Portl, 7 > Pl7;
    -
    389 #endif
    -
    390 
    -
    391 #ifdef USE_PORTQ
    -
    392 typedef TPin<Portq, 0 > Pq0;
    -
    393 typedef TPin<Portq, 1 > Pq1;
    -
    394 typedef TPin<Portq, 2 > Pq2;
    -
    395 typedef TPin<Portq, 3 > Pq3;
    -
    396 typedef TPin<Portq, 4 > Pq4;
    -
    397 typedef TPin<Portq, 5 > Pq5;
    -
    398 typedef TPin<Portq, 6 > Pq6;
    -
    399 typedef TPin<Portq, 7 > Pq7;
    -
    400 #endif
    -
    401 
    -
    402 #ifdef USE_PORTR
    -
    403 typedef TPin<Portr, 0 > Pr0;
    -
    404 typedef TPin<Portr, 1 > Pr1;
    -
    405 typedef TPin<Portr, 2 > Pr2;
    -
    406 typedef TPin<Portr, 3 > Pr3;
    -
    407 typedef TPin<Portr, 4 > Pr4;
    -
    408 typedef TPin<Portr, 5 > Pr5;
    -
    409 typedef TPin<Portr, 6 > Pr6;
    -
    410 typedef TPin<Portr, 7 > Pr7;
    -
    411 #endif
    -
    412 
    -
    413 #ifdef USE_TCCR0A
    -
    414 typedef TCom<Tccr0a, COM0A1> Tc0a; //P6
    -
    415 typedef TCom<Tccr0a, COM0B1> Tc0b; //P5
    -
    416 #endif
    -
    417 
    -
    418 #ifdef USE_TCCR1A
    -
    419 typedef TCom<Tccr1a, COM1A1> Tc1a; //P9
    -
    420 typedef TCom<Tccr1a, COM1B1> Tc1b; //P10
    -
    421 #endif
    -
    422 
    -
    423 #ifdef USE_TCCR2A
    -
    424 typedef TCom<Tccr2a, COM2A1> Tc2a; //P11
    -
    425 typedef TCom<Tccr2a, COM2B1> Tc2b; //P3
    -
    426 #endif
    -
    427 
    -
    428 template<typename Tp_pin, typename Tc_bit>
    -
    429 class Tp_Tc {
    -
    430 public:
    -
    431 
    -
    432  static void SetDir(uint8_t val) {
    -
    433  if(val)
    -
    434  SetDirWrite();
    -
    435  else SetDirRead();
    -
    436  }
    -
    437 
    -
    438  static void SetDirRead() {
    -
    439  Tp_pin::SetDirRead(); //set pin direction
    -
    440  Tc_bit::Clear(); //disconnect pin from PWM
    -
    441  }
    -
    442 
    -
    443  static void SetDirWrite() {
    -
    444  Tp_pin::SetDirWrite();
    -
    445  Tc_bit::Clear();
    -
    446  }
    -
    447 };
    -
    448 
    -
    449 /* pin definitions for cases where it's necessary to clear compare output mode bits */
    -
    450 
    -
    451 //typedef Tp_Tc<Pd3, Tc2b> P3; //Arduino pin 3
    -
    452 //typedef Tp_Tc<Pd5, Tc0b> P5; //Arduino pin 5
    -
    453 //typedef Tp_Tc<Pd6, Tc0a> P6; //Arduino pin 6
    -
    454 //typedef Tp_Tc<Pb1, Tc1a> P9; //Arduino pin 9
    -
    455 //typedef Tp_Tc<Pb2, Tc1b> P10; //Arduino pin 10
    -
    456 //typedef Tp_Tc<Pb3, Tc2a> P11; //Arduino pin 11
    -
    457 
    -
    458 /* Arduino pin definitions */
    -
    459 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    -
    460 // "Mega" Arduino pin numbers
    -
    461 
    -
    462 #define P0 Pe0
    -
    463 #define P1 Pe1
    -
    464 #define P2 Pe4
    -
    465 #define P3 Pe5
    -
    466 #define P4 Pg5
    -
    467 #define P5 Pe3
    -
    468 #define P6 Ph3
    -
    469 #define P7 Ph4
    -
    470 
    -
    471 #define P8 Ph5
    -
    472 #define P9 Ph6
    -
    473 #define P10 Pb4
    -
    474 #define P11 Pb5
    -
    475 #define P12 Pb6
    -
    476 #define P13 Pb7
    -
    477 
    -
    478 #define P14 Pj1
    -
    479 #define P15 Pj0
    -
    480 #define P16 Ph1
    -
    481 #define P17 Ph0
    -
    482 #define P18 Pd3
    -
    483 #define P19 Pd2
    -
    484 #define P20 Pd1
    -
    485 #define P21 Pd0
    -
    486 
    -
    487 #define P22 Pa0
    -
    488 #define P23 Pa1
    -
    489 #define P24 Pa2
    -
    490 #define P25 Pa3
    -
    491 #define P26 Pa4
    -
    492 #define P27 Pa5
    -
    493 #define P28 Pa6
    -
    494 #define P29 Pa7
    -
    495 #define P30 Pc7
    -
    496 #define P31 Pc6
    -
    497 #define P32 Pc5
    -
    498 #define P33 Pc4
    -
    499 #define P34 Pc3
    -
    500 #define P35 Pc2
    -
    501 #define P36 Pc1
    -
    502 #define P37 Pc0
    -
    503 
    -
    504 #define P38 Pd7
    -
    505 #define P39 Pg2
    -
    506 #define P40 Pg1
    -
    507 #define P41 Pg0
    -
    508 #define P42 Pl7
    -
    509 #define P43 Pl6
    -
    510 #define P44 Pl5
    -
    511 #define P45 Pl4
    -
    512 #define P46 Pl3
    -
    513 #define P47 Pl2
    -
    514 #define P48 Pl1
    -
    515 #define P49 Pl0
    -
    516 #define P50 Pb3
    -
    517 #define P51 Pb2
    -
    518 #define P52 Pb1
    -
    519 #define P53 Pb0
    -
    520 
    -
    521 #ifdef BOARD_MEGA_ADK // These pins are not broken out on the Arduino ADK
    -
    522 #define P54 Pe6 // INT on Arduino ADK
    -
    523 #define P55 Pj2 // MAX_RESET on Arduino ADK
    -
    524 #endif
    -
    525 
    -
    526 // "Mega" pin numbers
    -
    527 
    -
    528 #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
    -
    529 // "Classic" Arduino pin numbers
    -
    530 
    -
    531 #define P0 Pd0
    -
    532 #define P1 Pd1
    -
    533 #define P2 Pd2
    -
    534 #define P3 Pd3
    -
    535 #define P4 Pd4
    -
    536 #define P5 Pd5
    -
    537 #define P6 Pd6
    -
    538 #define P7 Pd7
    -
    539 
    -
    540 #define P8 Pb0
    -
    541 #define P9 Pb1
    -
    542 #define P10 Pb2
    -
    543 #define P11 Pb3
    -
    544 #define P12 Pb4
    -
    545 #define P13 Pb5
    -
    546 
    -
    547 #define P14 Pc0
    -
    548 #define P15 Pc1
    -
    549 #define P16 Pc2
    -
    550 #define P17 Pc3
    -
    551 #define P18 Pc4
    -
    552 #define P19 Pc5
    -
    553 
    -
    554 // "Classic" Arduino pin numbers
    -
    555 
    -
    556 #elif defined(CORE_TEENSY) && defined(__AVR_ATmega32U4__)
    -
    557 // Teensy 2.0 pin numbers
    -
    558 // http://www.pjrc.com/teensy/pinout.html
    -
    559 #define P0 Pb0
    -
    560 #define P1 Pb1
    -
    561 #define P2 Pb2
    -
    562 #define P3 Pb3
    -
    563 #define P4 Pb7
    -
    564 #define P5 Pd0
    -
    565 #define P6 Pd1
    -
    566 #define P7 Pd2
    -
    567 #define P8 Pd3
    -
    568 #define P9 Pc6
    -
    569 #define P10 Pc7
    -
    570 #define P11 Pd6
    -
    571 #define P12 Pd7
    -
    572 #define P13 Pb4
    -
    573 #define P14 Pb5
    -
    574 #define P15 Pb6
    -
    575 #define P16 Pf7
    -
    576 #define P17 Pf6
    -
    577 #define P18 Pf5
    -
    578 #define P19 Pf4
    -
    579 #define P20 Pf1
    -
    580 #define P21 Pf0
    -
    581 #define P22 Pd4
    -
    582 #define P23 Pd5
    -
    583 #define P24 Pe6
    -
    584 // Teensy 2.0
    -
    585 
    -
    586 #elif defined(__AVR_ATmega32U4__)
    -
    587 // Arduino Leonardo pin numbers
    -
    588 
    -
    589 #define P0 Pd2 // D0 - PD2
    -
    590 #define P1 Pd3 // D1 - PD3
    -
    591 #define P2 Pd1 // D2 - PD1
    -
    592 #define P3 Pd0 // D3 - PD0
    -
    593 #define P4 Pd4 // D4 - PD4
    -
    594 #define P5 Pc6 // D5 - PC6
    -
    595 #define P6 Pd7 // D6 - PD7
    -
    596 #define P7 Pe6 // D7 - PE6
    -
    597 
    -
    598 #define P8 Pb4 // D8 - PB4
    -
    599 #define P9 Pb5 // D9 - PB5
    -
    600 #define P10 Pb6 // D10 - PB6
    -
    601 #define P11 Pb7 // D11 - PB7
    -
    602 #define P12 Pd6 // D12 - PD6
    -
    603 #define P13 Pc7 // D13 - PC7
    -
    604 
    -
    605 #define P14 Pb3 // D14 - MISO - PB3
    -
    606 #define P15 Pb1 // D15 - SCK - PB1
    -
    607 #define P16 Pb2 // D16 - MOSI - PB2
    -
    608 #define P17 Pb0 // D17 - SS - PB0
    -
    609 
    -
    610 #define P18 Pf7 // D18 - A0 - PF7
    -
    611 #define P19 Pf6 // D19 - A1 - PF6
    -
    612 #define P20 Pf5 // D20 - A2 - PF5
    -
    613 #define P21 Pf4 // D21 - A3 - PF4
    -
    614 #define P22 Pf1 // D22 - A4 - PF1
    -
    615 #define P23 Pf0 // D23 - A5 - PF0
    -
    616 
    -
    617 #define P24 Pd4 // D24 / D4 - A6 - PD4
    -
    618 #define P25 Pd7 // D25 / D6 - A7 - PD7
    -
    619 #define P26 Pb4 // D26 / D8 - A8 - PB4
    -
    620 #define P27 Pb5 // D27 / D9 - A9 - PB5
    -
    621 #define P28 Pb6 // D28 / D10 - A10 - PB6
    -
    622 #define P29 Pd6 // D29 / D12 - A11 - PD6
    -
    623 
    -
    624 // Arduino Leonardo pin numbers
    -
    625 
    -
    626 #elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
    -
    627 // Teensy++ 1.0 and 2.0 pin numbers
    -
    628 // http://www.pjrc.com/teensy/pinout.html
    -
    629 #define P0 Pd0
    -
    630 #define P1 Pd1
    -
    631 #define P2 Pd2
    -
    632 #define P3 Pd3
    -
    633 #define P4 Pd4
    -
    634 #define P5 Pd5
    -
    635 #define P6 Pd6
    -
    636 #define P7 Pd7
    -
    637 #define P8 Pe0
    -
    638 #define P9 Pe1
    -
    639 #define P10 Pc0
    -
    640 #define P11 Pc1
    -
    641 #define P12 Pc2
    -
    642 #define P13 Pc3
    -
    643 #define P14 Pc4
    -
    644 #define P15 Pc5
    -
    645 #define P16 Pc6
    -
    646 #define P17 Pc7
    -
    647 #define P18 Pe6
    -
    648 #define P19 Pe7
    -
    649 #define P20 Pb0
    -
    650 #define P21 Pb1
    -
    651 #define P22 Pb2
    -
    652 #define P23 Pb3
    -
    653 #define P24 Pb4
    -
    654 #define P25 Pb5
    -
    655 #define P26 Pb6
    -
    656 #define P27 Pb7
    -
    657 #define P28 Pa0
    -
    658 #define P29 Pa1
    -
    659 #define P30 Pa2
    -
    660 #define P31 Pa3
    -
    661 #define P32 Pa4
    -
    662 #define P33 Pa5
    -
    663 #define P34 Pa6
    -
    664 #define P35 Pa7
    -
    665 #define P36 Pe4
    -
    666 #define P37 Pe5
    -
    667 #define P38 Pf0
    -
    668 #define P39 Pf1
    -
    669 #define P40 Pf2
    -
    670 #define P41 Pf3
    -
    671 #define P42 Pf4
    -
    672 #define P43 Pf5
    -
    673 #define P44 Pf6
    -
    674 #define P45 Pf7
    -
    675 // Teensy++ 1.0 and 2.0
    -
    676 
    -
    677 #elif defined(ARDUINO_AVR_BALANDUINO) && (defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284P__))
    -
    678 // Balanduino pin numbers
    -
    679 // http://balanduino.net/
    -
    680 #define P0 Pd0 /* 0 - PD0 */
    -
    681 #define P1 Pd1 /* 1 - PD1 */
    -
    682 
    -
    683 #if BALANDUINO_REVISION < 13
    -
    684  #define P2 Pb2 /* 2 - PB2 */
    -
    685  #define P3 Pd6 /* 3 - PD6 */
    -
    686  #define P4 Pd7 /* 4 - PD7 */
    -
    687  #define P5 Pb3 /* 5 - PB3 */
    -
    688 #else
    -
    689  #define P2 Pd2 /* 2 - PD2 */
    -
    690  #define P3 Pd3 /* 3 - PD3 */
    -
    691  #define P4 Pd6 /* 4 - PD6 */
    -
    692  #define P5 Pd7 /* 5 - PD7 */
    -
    693 #endif
    -
    694 
    -
    695 #define P6 Pb4 /* 6 - PB4 */
    -
    696 #define P7 Pa0 /* 7 - PA0 */
    -
    697 #define P8 Pa1 /* 8 - PA1 */
    -
    698 #define P9 Pa2 /* 9 - PA2 */
    -
    699 #define P10 Pa3 /* 10 - PA3 */
    -
    700 #define P11 Pa4 /* 11 - PA4 */
    -
    701 #define P12 Pa5 /* 12 - PA5 */
    -
    702 #define P13 Pc1 /* 13 - PC1 */
    -
    703 #define P14 Pc0 /* 14 - PC0 */
    -
    704 
    -
    705 #if BALANDUINO_REVISION < 13
    -
    706  #define P15 Pd2 /* 15 - PD2 */
    -
    707  #define P16 Pd3 /* 16 - PD3 */
    -
    708 #else
    -
    709  #define P15 Pb2 /* 15 - PB2 */
    -
    710  #define P16 Pb3 /* 16 - PB2 */
    -
    711 #endif
    -
    712 
    -
    713 #define P17 Pd4 /* 17 - PD4 */
    -
    714 #define P18 Pd5 /* 18 - PD5 */
    -
    715 #define P19 Pc2 /* 19 - PC2 */
    -
    716 #define P20 Pc3 /* 20 - PC3 */
    -
    717 #define P21 Pc4 /* 21 - PC4 */
    -
    718 #define P22 Pc5 /* 22 - PC5 */
    -
    719 #define P23 Pc6 /* 23 - PC6 */
    -
    720 #define P24 Pc7 /* 24 - PC7 */
    -
    721 #define P25 Pb0 /* 25 - PB0 */
    -
    722 #define P26 Pb1 /* 26 - PB1 */
    -
    723 #define P27 Pb5 /* 27 - PB5 */
    -
    724 #define P28 Pb6 /* 28 - PB6 */
    -
    725 #define P29 Pb7 /* 29 - PB7 */
    -
    726 #define P30 Pa6 /* 30 - PA6 */
    -
    727 #define P31 Pa7 /* 31 - PA7 */
    -
    728 // Balanduino
    -
    729 
    -
    730 #elif defined(ARDUINO_AVR_UNO_PRO) && defined(__AVR_ATmega1284P__)
    -
    731 // UNO*Pro pin numbers
    -
    732 // Homepage: http://www.hobbytronics.co.uk/arduino-uno-pro
    -
    733 // Pin Reference: http://www.hobbytronics.co.uk/download/uno_pro/pins_arduino.h
    -
    734 #define P0 Pd0
    -
    735 #define P1 Pd1
    -
    736 #define P2 Pb2
    -
    737 #define P3 Pb3
    -
    738 #define P4 Pb0
    -
    739 #define P5 Pb1
    -
    740 #define P6 Pd2
    -
    741 #define P7 Pd3
    -
    742 #define P8 Pd5
    -
    743 #define P9 Pd6
    -
    744 #define P10 Pb4
    -
    745 #define P11 Pb5
    -
    746 #define P12 Pb6
    -
    747 #define P13 Pb7
    -
    748 #define P14 Pa7
    -
    749 #define P15 Pa6
    -
    750 #define P16 Pa5
    -
    751 #define P17 Pa4
    -
    752 #define P18 Pa3
    -
    753 #define P19 Pa2
    -
    754 #define P20 Pa1
    -
    755 #define P21 Pa0
    -
    756 #define P22 Pc0
    -
    757 #define P23 Pc1
    -
    758 #define P24 Pc2
    -
    759 #define P25 Pc3
    -
    760 #define P26 Pc4
    -
    761 #define P27 Pc5
    -
    762 #define P28 Pc6
    -
    763 #define P29 Pc7
    -
    764 #define P30 Pd4
    -
    765 #define P31 Pd7
    -
    766 // UNO*Pro
    -
    767 
    -
    768 #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
    -
    769 // Sanguino pin numbers
    -
    770 // Homepage: http://sanguino.cc/hardware
    -
    771 // Hardware add-on: https://github.com/Lauszus/Sanguino
    -
    772 #define P0 Pb0
    -
    773 #define P1 Pb1
    -
    774 #define P2 Pb2
    -
    775 #define P3 Pb3
    -
    776 #define P4 Pb4
    -
    777 #define P5 Pb5
    -
    778 #define P6 Pb6
    -
    779 #define P7 Pb7
    -
    780 #define P8 Pd0
    -
    781 #define P9 Pd1
    -
    782 #define P10 Pd2
    -
    783 #define P11 Pd3
    -
    784 #define P12 Pd4
    -
    785 #define P13 Pd5
    -
    786 #define P14 Pd6
    -
    787 #define P15 Pd7
    -
    788 #define P16 Pc0
    -
    789 #define P17 Pc1
    -
    790 #define P18 Pc2
    -
    791 #define P19 Pc3
    -
    792 #define P20 Pc4
    -
    793 #define P21 Pc5
    -
    794 #define P22 Pc6
    -
    795 #define P23 Pc7
    -
    796 #define P24 Pa0
    -
    797 #define P25 Pa1
    -
    798 #define P26 Pa2
    -
    799 #define P27 Pa3
    -
    800 #define P28 Pa4
    -
    801 #define P29 Pa5
    -
    802 #define P30 Pa6
    -
    803 #define P31 Pa7
    -
    804 // Sanguino
    -
    805 
    -
    806 #else
    -
    807 #error "Please define board in avrpins.h"
    -
    808 
    -
    809 #endif // Arduino pin definitions
    -
    810 
    -
    811 #elif defined(__arm__)
    -
    812 
    -
    813 // pointers are 32 bits on ARM
    -
    814 #define pgm_read_pointer(p) pgm_read_dword(p)
    -
    815 
    -
    816 #if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__))
    -
    817 
    -
    818 #include "core_pins.h"
    -
    819 #include "avr_emulation.h"
    -
    820 
    -
    821 #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
    -
    822 #define GPIO_BITBAND_PTR(reg, bit) ((uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
    -
    823 
    -
    824 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
    -
    825 class className { \
    -
    826 public: \
    -
    827  static void Set() { \
    -
    828  *GPIO_BITBAND_PTR(baseReg, pinNum) = 1; \
    -
    829  } \
    -
    830  static void Clear() { \
    -
    831  *GPIO_BITBAND_PTR(baseReg, pinNum) = 0; \
    -
    832  } \
    -
    833  static void SetDirRead() { \
    -
    834  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    -
    835  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 0; \
    -
    836  } \
    -
    837  static void SetDirWrite() { \
    -
    838  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    -
    839  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 1; \
    -
    840  } \
    -
    841  static uint8_t IsSet() { \
    -
    842  return *(GPIO_BITBAND_PTR(baseReg, pinNum) + 512); \
    -
    843  } \
    -
    844 };
    -
    845 
    -
    846 MAKE_PIN(P0, CORE_PIN0_PORTREG, CORE_PIN0_BIT, CORE_PIN0_CONFIG);
    -
    847 MAKE_PIN(P1, CORE_PIN1_PORTREG, CORE_PIN1_BIT, CORE_PIN1_CONFIG);
    -
    848 MAKE_PIN(P2, CORE_PIN2_PORTREG, CORE_PIN2_BIT, CORE_PIN2_CONFIG);
    -
    849 MAKE_PIN(P3, CORE_PIN3_PORTREG, CORE_PIN3_BIT, CORE_PIN3_CONFIG);
    -
    850 MAKE_PIN(P4, CORE_PIN4_PORTREG, CORE_PIN4_BIT, CORE_PIN4_CONFIG);
    -
    851 MAKE_PIN(P5, CORE_PIN5_PORTREG, CORE_PIN5_BIT, CORE_PIN5_CONFIG);
    -
    852 MAKE_PIN(P6, CORE_PIN6_PORTREG, CORE_PIN6_BIT, CORE_PIN6_CONFIG);
    -
    853 MAKE_PIN(P7, CORE_PIN7_PORTREG, CORE_PIN7_BIT, CORE_PIN7_CONFIG);
    -
    854 MAKE_PIN(P8, CORE_PIN8_PORTREG, CORE_PIN8_BIT, CORE_PIN8_CONFIG);
    -
    855 MAKE_PIN(P9, CORE_PIN9_PORTREG, CORE_PIN9_BIT, CORE_PIN9_CONFIG);
    -
    856 MAKE_PIN(P10, CORE_PIN10_PORTREG, CORE_PIN10_BIT, CORE_PIN10_CONFIG);
    -
    857 MAKE_PIN(P11, CORE_PIN11_PORTREG, CORE_PIN11_BIT, CORE_PIN11_CONFIG);
    -
    858 MAKE_PIN(P12, CORE_PIN12_PORTREG, CORE_PIN12_BIT, CORE_PIN12_CONFIG);
    -
    859 MAKE_PIN(P13, CORE_PIN13_PORTREG, CORE_PIN13_BIT, CORE_PIN13_CONFIG);
    -
    860 MAKE_PIN(P14, CORE_PIN14_PORTREG, CORE_PIN14_BIT, CORE_PIN14_CONFIG);
    -
    861 MAKE_PIN(P15, CORE_PIN15_PORTREG, CORE_PIN15_BIT, CORE_PIN15_CONFIG);
    -
    862 MAKE_PIN(P16, CORE_PIN16_PORTREG, CORE_PIN16_BIT, CORE_PIN16_CONFIG);
    -
    863 MAKE_PIN(P17, CORE_PIN17_PORTREG, CORE_PIN17_BIT, CORE_PIN17_CONFIG);
    -
    864 MAKE_PIN(P18, CORE_PIN18_PORTREG, CORE_PIN18_BIT, CORE_PIN18_CONFIG);
    -
    865 MAKE_PIN(P19, CORE_PIN19_PORTREG, CORE_PIN19_BIT, CORE_PIN19_CONFIG);
    -
    866 MAKE_PIN(P20, CORE_PIN20_PORTREG, CORE_PIN20_BIT, CORE_PIN20_CONFIG);
    -
    867 MAKE_PIN(P21, CORE_PIN21_PORTREG, CORE_PIN21_BIT, CORE_PIN21_CONFIG);
    -
    868 MAKE_PIN(P22, CORE_PIN22_PORTREG, CORE_PIN22_BIT, CORE_PIN22_CONFIG);
    -
    869 MAKE_PIN(P23, CORE_PIN23_PORTREG, CORE_PIN23_BIT, CORE_PIN23_CONFIG);
    -
    870 MAKE_PIN(P24, CORE_PIN24_PORTREG, CORE_PIN24_BIT, CORE_PIN24_CONFIG);
    -
    871 MAKE_PIN(P25, CORE_PIN25_PORTREG, CORE_PIN25_BIT, CORE_PIN25_CONFIG);
    -
    872 MAKE_PIN(P26, CORE_PIN26_PORTREG, CORE_PIN26_BIT, CORE_PIN26_CONFIG);
    -
    873 MAKE_PIN(P27, CORE_PIN27_PORTREG, CORE_PIN27_BIT, CORE_PIN27_CONFIG);
    -
    874 MAKE_PIN(P28, CORE_PIN28_PORTREG, CORE_PIN28_BIT, CORE_PIN28_CONFIG);
    -
    875 MAKE_PIN(P29, CORE_PIN29_PORTREG, CORE_PIN29_BIT, CORE_PIN29_CONFIG);
    -
    876 MAKE_PIN(P30, CORE_PIN30_PORTREG, CORE_PIN30_BIT, CORE_PIN30_CONFIG);
    -
    877 MAKE_PIN(P31, CORE_PIN31_PORTREG, CORE_PIN31_BIT, CORE_PIN31_CONFIG);
    -
    878 MAKE_PIN(P32, CORE_PIN32_PORTREG, CORE_PIN32_BIT, CORE_PIN32_CONFIG);
    -
    879 MAKE_PIN(P33, CORE_PIN33_PORTREG, CORE_PIN33_BIT, CORE_PIN33_CONFIG);
    -
    880 #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
    -
    881 MAKE_PIN(P34, CORE_PIN34_PORTREG, CORE_PIN34_BIT, CORE_PIN34_CONFIG);
    -
    882 MAKE_PIN(P35, CORE_PIN35_PORTREG, CORE_PIN35_BIT, CORE_PIN35_CONFIG);
    -
    883 MAKE_PIN(P36, CORE_PIN36_PORTREG, CORE_PIN36_BIT, CORE_PIN36_CONFIG);
    -
    884 MAKE_PIN(P37, CORE_PIN37_PORTREG, CORE_PIN37_BIT, CORE_PIN37_CONFIG);
    -
    885 MAKE_PIN(P38, CORE_PIN38_PORTREG, CORE_PIN38_BIT, CORE_PIN38_CONFIG);
    -
    886 MAKE_PIN(P39, CORE_PIN39_PORTREG, CORE_PIN39_BIT, CORE_PIN39_CONFIG);
    -
    887 MAKE_PIN(P40, CORE_PIN40_PORTREG, CORE_PIN40_BIT, CORE_PIN40_CONFIG);
    -
    888 MAKE_PIN(P41, CORE_PIN41_PORTREG, CORE_PIN41_BIT, CORE_PIN41_CONFIG);
    -
    889 MAKE_PIN(P42, CORE_PIN42_PORTREG, CORE_PIN42_BIT, CORE_PIN42_CONFIG);
    -
    890 MAKE_PIN(P43, CORE_PIN43_PORTREG, CORE_PIN43_BIT, CORE_PIN43_CONFIG);
    -
    891 MAKE_PIN(P44, CORE_PIN44_PORTREG, CORE_PIN44_BIT, CORE_PIN44_CONFIG);
    -
    892 MAKE_PIN(P45, CORE_PIN45_PORTREG, CORE_PIN45_BIT, CORE_PIN45_CONFIG);
    -
    893 MAKE_PIN(P46, CORE_PIN46_PORTREG, CORE_PIN46_BIT, CORE_PIN46_CONFIG);
    -
    894 MAKE_PIN(P47, CORE_PIN47_PORTREG, CORE_PIN47_BIT, CORE_PIN47_CONFIG);
    -
    895 MAKE_PIN(P48, CORE_PIN48_PORTREG, CORE_PIN48_BIT, CORE_PIN48_CONFIG);
    -
    896 MAKE_PIN(P49, CORE_PIN49_PORTREG, CORE_PIN49_BIT, CORE_PIN49_CONFIG);
    -
    897 MAKE_PIN(P50, CORE_PIN50_PORTREG, CORE_PIN50_BIT, CORE_PIN50_CONFIG);
    -
    898 MAKE_PIN(P51, CORE_PIN51_PORTREG, CORE_PIN51_BIT, CORE_PIN51_CONFIG);
    -
    899 MAKE_PIN(P52, CORE_PIN52_PORTREG, CORE_PIN52_BIT, CORE_PIN52_CONFIG);
    -
    900 MAKE_PIN(P53, CORE_PIN53_PORTREG, CORE_PIN53_BIT, CORE_PIN53_CONFIG);
    -
    901 MAKE_PIN(P54, CORE_PIN54_PORTREG, CORE_PIN54_BIT, CORE_PIN54_CONFIG);
    -
    902 MAKE_PIN(P55, CORE_PIN55_PORTREG, CORE_PIN55_BIT, CORE_PIN55_CONFIG);
    -
    903 MAKE_PIN(P56, CORE_PIN56_PORTREG, CORE_PIN56_BIT, CORE_PIN56_CONFIG);
    -
    904 MAKE_PIN(P57, CORE_PIN57_PORTREG, CORE_PIN57_BIT, CORE_PIN57_CONFIG);
    -
    905 MAKE_PIN(P58, CORE_PIN58_PORTREG, CORE_PIN58_BIT, CORE_PIN58_CONFIG);
    -
    906 MAKE_PIN(P59, CORE_PIN59_PORTREG, CORE_PIN59_BIT, CORE_PIN59_CONFIG);
    -
    907 MAKE_PIN(P60, CORE_PIN60_PORTREG, CORE_PIN60_BIT, CORE_PIN60_CONFIG);
    -
    908 MAKE_PIN(P61, CORE_PIN61_PORTREG, CORE_PIN61_BIT, CORE_PIN61_CONFIG);
    -
    909 MAKE_PIN(P62, CORE_PIN62_PORTREG, CORE_PIN62_BIT, CORE_PIN62_CONFIG);
    -
    910 MAKE_PIN(P63, CORE_PIN63_PORTREG, CORE_PIN63_BIT, CORE_PIN63_CONFIG);
    -
    911 #endif
    -
    912 
    -
    913 #undef MAKE_PIN
    -
    914 
    -
    915 #elif defined(CORE_TEENSY) && (defined(__MKL26Z64__))
    -
    916 
    -
    917 // we could get lower level by making these macros work properly.
    -
    918 // for now just use the semi optimised version, it costs a lookup in the pin pgm table per op
    -
    919 // but for now it will do.
    -
    920 //#define GPIO_BITBAND_ADDR(reg, bit) (((volatile uint8_t *)&(reg) + ((bit) >> 3)))
    -
    921 //#define GPIO_BITBAND_MASK(reg, bit) (1<<((bit) & 7))
    -
    922 //#define GPIO_BITBAND_PTR(reg, bit) ((volatile uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
    -
    923 
    -
    924 #include "core_pins.h"
    -
    925 #include "avr_emulation.h"
    -
    926 
    -
    927 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
    -
    928 class className { \
    -
    929 public: \
    -
    930  static void Set() { \
    -
    931  *portSetRegister(pinNum) = digitalPinToBitMask(pinNum); \
    -
    932  } \
    -
    933  static void Clear() { \
    -
    934  *portClearRegister(pinNum) = digitalPinToBitMask(pinNum); \
    -
    935  } \
    -
    936  static void SetDirRead() { \
    -
    937  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    -
    938  *portModeRegister(pinNum) &= ~digitalPinToBitMask(pinNum); \
    -
    939  } \
    -
    940  static void SetDirWrite() { \
    -
    941  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    -
    942  *portModeRegister(pinNum) |= digitalPinToBitMask(pinNum); \
    -
    943  } \
    -
    944  static uint8_t IsSet() { \
    -
    945  return (*portInputRegister(pinNum) & digitalPinToBitMask(pinNum)) ? 1 : 0; \
    -
    946  } \
    -
    947 };
    -
    948 
    -
    949 MAKE_PIN(P0, CORE_PIN0_PORTREG, 0, CORE_PIN0_CONFIG);
    -
    950 MAKE_PIN(P1, CORE_PIN1_PORTREG, 1, CORE_PIN1_CONFIG);
    -
    951 MAKE_PIN(P2, CORE_PIN2_PORTREG, 2, CORE_PIN2_CONFIG);
    -
    952 MAKE_PIN(P3, CORE_PIN3_PORTREG, 3, CORE_PIN3_CONFIG);
    -
    953 MAKE_PIN(P4, CORE_PIN4_PORTREG, 4, CORE_PIN4_CONFIG);
    -
    954 MAKE_PIN(P5, CORE_PIN5_PORTREG, 5, CORE_PIN5_CONFIG);
    -
    955 MAKE_PIN(P6, CORE_PIN6_PORTREG, 6, CORE_PIN6_CONFIG);
    -
    956 MAKE_PIN(P7, CORE_PIN7_PORTREG, 7, CORE_PIN7_CONFIG);
    -
    957 MAKE_PIN(P8, CORE_PIN8_PORTREG, 8, CORE_PIN8_CONFIG);
    -
    958 MAKE_PIN(P9, CORE_PIN9_PORTREG, 9, CORE_PIN9_CONFIG);
    -
    959 MAKE_PIN(P10, CORE_PIN10_PORTREG, 10, CORE_PIN10_CONFIG);
    -
    960 MAKE_PIN(P11, CORE_PIN11_PORTREG, 11, CORE_PIN11_CONFIG);
    -
    961 MAKE_PIN(P12, CORE_PIN12_PORTREG, 12, CORE_PIN12_CONFIG);
    -
    962 MAKE_PIN(P13, CORE_PIN13_PORTREG, 13, CORE_PIN13_CONFIG);
    -
    963 MAKE_PIN(P14, CORE_PIN14_PORTREG, 14, CORE_PIN14_CONFIG);
    -
    964 MAKE_PIN(P15, CORE_PIN15_PORTREG, 15, CORE_PIN15_CONFIG);
    -
    965 MAKE_PIN(P16, CORE_PIN16_PORTREG, 16, CORE_PIN16_CONFIG);
    -
    966 MAKE_PIN(P17, CORE_PIN17_PORTREG, 17, CORE_PIN17_CONFIG);
    -
    967 MAKE_PIN(P18, CORE_PIN18_PORTREG, 18, CORE_PIN18_CONFIG);
    -
    968 MAKE_PIN(P19, CORE_PIN19_PORTREG, 19, CORE_PIN19_CONFIG);
    -
    969 MAKE_PIN(P20, CORE_PIN20_PORTREG, 20, CORE_PIN20_CONFIG);
    -
    970 MAKE_PIN(P21, CORE_PIN21_PORTREG, 21, CORE_PIN21_CONFIG);
    -
    971 MAKE_PIN(P22, CORE_PIN22_PORTREG, 22, CORE_PIN22_CONFIG);
    -
    972 MAKE_PIN(P23, CORE_PIN23_PORTREG, 23, CORE_PIN23_CONFIG);
    -
    973 MAKE_PIN(P24, CORE_PIN24_PORTREG, 24, CORE_PIN24_CONFIG);
    -
    974 MAKE_PIN(P25, CORE_PIN25_PORTREG, 25, CORE_PIN25_CONFIG);
    -
    975 MAKE_PIN(P26, CORE_PIN26_PORTREG, 26, CORE_PIN26_CONFIG);
    -
    976 
    -
    977 #undef MAKE_PIN
    -
    978 
    -
    979 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    -
    980 
    -
    981 // SetDirRead:
    -
    982 // Disable interrupts
    -
    983 // Disable the pull up resistor
    -
    984 // Set to INPUT
    -
    985 // Enable PIO
    -
    986 
    -
    987 // SetDirWrite:
    -
    988 // Disable interrupts
    -
    989 // Disable the pull up resistor
    -
    990 // Set to OUTPUT
    -
    991 // Enable PIO
    -
    992 
    -
    993 #define MAKE_PIN(className, pio, pinMask) \
    -
    994 class className { \
    -
    995 public: \
    -
    996  static void Set() { \
    -
    997  pio->PIO_SODR = pinMask; \
    -
    998  } \
    -
    999  static void Clear() { \
    -
    1000  pio->PIO_CODR = pinMask; \
    -
    1001  } \
    -
    1002  static void SetDirRead() { \
    -
    1003  pio->PIO_IDR = pinMask ; \
    -
    1004  pio->PIO_PUDR = pinMask; \
    -
    1005  pio->PIO_ODR = pinMask; \
    -
    1006  pio->PIO_PER = pinMask; \
    -
    1007  } \
    -
    1008  static void SetDirWrite() { \
    -
    1009  pio->PIO_IDR = pinMask ; \
    -
    1010  pio->PIO_PUDR = pinMask; \
    -
    1011  pio->PIO_OER = pinMask; \
    -
    1012  pio->PIO_PER = pinMask; \
    -
    1013  } \
    -
    1014  static uint8_t IsSet() { \
    -
    1015  return pio->PIO_PDSR & pinMask; \
    -
    1016  } \
    -
    1017 };
    -
    1018 
    -
    1019 // See: http://arduino.cc/en/Hacking/PinMappingSAM3X and variant.cpp
    -
    1020 
    -
    1021 MAKE_PIN(P0, PIOA, PIO_PA8);
    -
    1022 MAKE_PIN(P1, PIOA, PIO_PA9);
    -
    1023 MAKE_PIN(P2, PIOB, PIO_PB25);
    -
    1024 MAKE_PIN(P3, PIOC, PIO_PC28);
    -
    1025 MAKE_PIN(P4, PIOC, PIO_PC26);
    -
    1026 MAKE_PIN(P5, PIOC, PIO_PC25);
    -
    1027 MAKE_PIN(P6, PIOC, PIO_PC24);
    -
    1028 MAKE_PIN(P7, PIOC, PIO_PC23);
    -
    1029 MAKE_PIN(P8, PIOC, PIO_PC22);
    -
    1030 MAKE_PIN(P9, PIOC, PIO_PC21);
    -
    1031 MAKE_PIN(P10, PIOC, PIO_PC29);
    -
    1032 MAKE_PIN(P11, PIOD, PIO_PD7);
    -
    1033 MAKE_PIN(P12, PIOD, PIO_PD8);
    -
    1034 MAKE_PIN(P13, PIOB, PIO_PB27);
    -
    1035 MAKE_PIN(P14, PIOD, PIO_PD4);
    -
    1036 MAKE_PIN(P15, PIOD, PIO_PD5);
    -
    1037 MAKE_PIN(P16, PIOA, PIO_PA13);
    -
    1038 MAKE_PIN(P17, PIOA, PIO_PA12);
    -
    1039 MAKE_PIN(P18, PIOA, PIO_PA11);
    -
    1040 MAKE_PIN(P19, PIOA, PIO_PA10);
    -
    1041 MAKE_PIN(P20, PIOB, PIO_PB12);
    -
    1042 MAKE_PIN(P21, PIOB, PIO_PB13);
    -
    1043 MAKE_PIN(P22, PIOB, PIO_PB26);
    -
    1044 MAKE_PIN(P23, PIOA, PIO_PA14);
    -
    1045 MAKE_PIN(P24, PIOA, PIO_PA15);
    -
    1046 MAKE_PIN(P25, PIOD, PIO_PD0);
    -
    1047 MAKE_PIN(P26, PIOD, PIO_PD1);
    -
    1048 MAKE_PIN(P27, PIOD, PIO_PD2);
    -
    1049 MAKE_PIN(P28, PIOD, PIO_PD3);
    -
    1050 MAKE_PIN(P29, PIOD, PIO_PD6);
    -
    1051 MAKE_PIN(P30, PIOD, PIO_PD9);
    -
    1052 MAKE_PIN(P31, PIOA, PIO_PA7);
    -
    1053 MAKE_PIN(P32, PIOD, PIO_PD10);
    -
    1054 MAKE_PIN(P33, PIOC, PIO_PC1);
    -
    1055 MAKE_PIN(P34, PIOC, PIO_PC2);
    -
    1056 MAKE_PIN(P35, PIOC, PIO_PC3);
    -
    1057 MAKE_PIN(P36, PIOC, PIO_PC4);
    -
    1058 MAKE_PIN(P37, PIOC, PIO_PC5);
    -
    1059 MAKE_PIN(P38, PIOC, PIO_PC6);
    -
    1060 MAKE_PIN(P39, PIOC, PIO_PC7);
    -
    1061 MAKE_PIN(P40, PIOC, PIO_PC8);
    -
    1062 MAKE_PIN(P41, PIOC, PIO_PC9);
    -
    1063 MAKE_PIN(P42, PIOA, PIO_PA19);
    -
    1064 MAKE_PIN(P43, PIOA, PIO_PA20);
    -
    1065 MAKE_PIN(P44, PIOC, PIO_PC19);
    -
    1066 MAKE_PIN(P45, PIOC, PIO_PC18);
    -
    1067 MAKE_PIN(P46, PIOC, PIO_PC17);
    -
    1068 MAKE_PIN(P47, PIOC, PIO_PC16);
    -
    1069 MAKE_PIN(P48, PIOC, PIO_PC15);
    -
    1070 MAKE_PIN(P49, PIOC, PIO_PC14);
    -
    1071 MAKE_PIN(P50, PIOC, PIO_PC13);
    -
    1072 MAKE_PIN(P51, PIOC, PIO_PC12);
    -
    1073 MAKE_PIN(P52, PIOB, PIO_PB21);
    -
    1074 MAKE_PIN(P53, PIOB, PIO_PB14);
    -
    1075 MAKE_PIN(P54, PIOA, PIO_PA16);
    -
    1076 MAKE_PIN(P55, PIOA, PIO_PA24);
    -
    1077 MAKE_PIN(P56, PIOA, PIO_PA23);
    -
    1078 MAKE_PIN(P57, PIOA, PIO_PA22);
    -
    1079 MAKE_PIN(P58, PIOA, PIO_PA6);
    -
    1080 MAKE_PIN(P59, PIOA, PIO_PA4);
    -
    1081 MAKE_PIN(P60, PIOA, PIO_PA3);
    -
    1082 MAKE_PIN(P61, PIOA, PIO_PA2);
    -
    1083 MAKE_PIN(P62, PIOB, PIO_PB17);
    -
    1084 MAKE_PIN(P63, PIOB, PIO_PB18);
    -
    1085 MAKE_PIN(P64, PIOB, PIO_PB19);
    -
    1086 MAKE_PIN(P65, PIOB, PIO_PB20);
    -
    1087 MAKE_PIN(P66, PIOB, PIO_PB15);
    -
    1088 MAKE_PIN(P67, PIOB, PIO_PB16);
    -
    1089 MAKE_PIN(P68, PIOA, PIO_PA1);
    -
    1090 MAKE_PIN(P69, PIOA, PIO_PA0);
    -
    1091 MAKE_PIN(P70, PIOA, PIO_PA17);
    -
    1092 MAKE_PIN(P71, PIOA, PIO_PA18);
    -
    1093 MAKE_PIN(P72, PIOC, PIO_PC30);
    -
    1094 MAKE_PIN(P73, PIOA, PIO_PA21);
    -
    1095 MAKE_PIN(P74, PIOA, PIO_PA25); // MISO
    -
    1096 MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI
    -
    1097 MAKE_PIN(P76, PIOA, PIO_PA27); // CLK
    -
    1098 MAKE_PIN(P77, PIOA, PIO_PA28);
    -
    1099 MAKE_PIN(P78, PIOB, PIO_PB23); // Unconnected
    -
    1100 
    -
    1101 #undef MAKE_PIN
    -
    1102 
    -
    1103 #elif defined(RBL_NRF51822)
    -
    1104 
    -
    1105 #define MAKE_PIN(className, pin) \
    -
    1106 class className { \
    -
    1107 public: \
    -
    1108  static void Set() { \
    -
    1109  nrf_gpio_pin_set(pin); \
    -
    1110  } \
    -
    1111  static void Clear() { \
    -
    1112  nrf_gpio_pin_clear(pin); \
    -
    1113  } \
    -
    1114  static void SetDirRead() { \
    -
    1115  nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
    -
    1116  } \
    -
    1117  static void SetDirWrite() { \
    -
    1118  nrf_gpio_cfg_output(pin); \
    -
    1119  } \
    -
    1120  static uint8_t IsSet() { \
    -
    1121  return (uint8_t)nrf_gpio_pin_read(pin); \
    -
    1122  } \
    -
    1123 };
    -
    1124 
    -
    1125 // See: pin_transform.c in RBL nRF51822 SDK
    -
    1126 MAKE_PIN(P0, Pin_nRF51822_to_Arduino(D0));
    -
    1127 MAKE_PIN(P1, Pin_nRF51822_to_Arduino(D1));
    -
    1128 MAKE_PIN(P2, Pin_nRF51822_to_Arduino(D2));
    -
    1129 MAKE_PIN(P3, Pin_nRF51822_to_Arduino(D3));
    -
    1130 MAKE_PIN(P4, Pin_nRF51822_to_Arduino(D4));
    -
    1131 MAKE_PIN(P5, Pin_nRF51822_to_Arduino(D5));
    -
    1132 MAKE_PIN(P6, Pin_nRF51822_to_Arduino(D6));
    -
    1133 MAKE_PIN(P7, Pin_nRF51822_to_Arduino(D7));
    -
    1134 MAKE_PIN(P8, Pin_nRF51822_to_Arduino(D8));
    -
    1135 MAKE_PIN(P9, Pin_nRF51822_to_Arduino(D9)); // INT
    -
    1136 MAKE_PIN(P10, Pin_nRF51822_to_Arduino(D10)); // SS
    -
    1137 MAKE_PIN(P11, Pin_nRF51822_to_Arduino(D11));
    -
    1138 MAKE_PIN(P12, Pin_nRF51822_to_Arduino(D12));
    -
    1139 MAKE_PIN(P13, Pin_nRF51822_to_Arduino(D13));
    -
    1140 MAKE_PIN(P14, Pin_nRF51822_to_Arduino(D14));
    -
    1141 MAKE_PIN(P15, Pin_nRF51822_to_Arduino(D15));
    -
    1142 MAKE_PIN(P17, Pin_nRF51822_to_Arduino(D17)); // MISO
    -
    1143 MAKE_PIN(P18, Pin_nRF51822_to_Arduino(D18)); // MOSI
    -
    1144 MAKE_PIN(P16, Pin_nRF51822_to_Arduino(D16)); // CLK
    -
    1145 MAKE_PIN(P19, Pin_nRF51822_to_Arduino(D19));
    -
    1146 MAKE_PIN(P20, Pin_nRF51822_to_Arduino(D20));
    -
    1147 MAKE_PIN(P21, Pin_nRF51822_to_Arduino(D21));
    -
    1148 MAKE_PIN(P22, Pin_nRF51822_to_Arduino(D22));
    -
    1149 MAKE_PIN(P23, Pin_nRF51822_to_Arduino(D23));
    -
    1150 MAKE_PIN(P24, Pin_nRF51822_to_Arduino(D24));
    -
    1151 
    -
    1152 #undef MAKE_PIN
    -
    1153 
    -
    1154 #elif defined(STM32F446xx)
    -
    1155 // NUCLEO-F446RE
    -
    1156 
    -
    1157 #define MAKE_PIN(className, port, pin) \
    -
    1158 class className { \
    -
    1159 public: \
    -
    1160  static void Set() { \
    -
    1161  HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); \
    -
    1162  } \
    -
    1163  static void Clear() { \
    -
    1164  HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET); \
    -
    1165  } \
    -
    1166  static void SetDirRead() { \
    -
    1167  static GPIO_InitTypeDef GPIO_InitStruct; \
    -
    1168  GPIO_InitStruct.Pin = pin; \
    -
    1169  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \
    -
    1170  GPIO_InitStruct.Pull = GPIO_NOPULL; \
    -
    1171  HAL_GPIO_Init(port, &GPIO_InitStruct); \
    -
    1172  } \
    -
    1173  static void SetDirWrite() { \
    -
    1174  static GPIO_InitTypeDef GPIO_InitStruct; \
    -
    1175  GPIO_InitStruct.Pin = pin; \
    -
    1176  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \
    -
    1177  GPIO_InitStruct.Pull = GPIO_NOPULL; \
    -
    1178  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; \
    -
    1179  HAL_GPIO_Init(port, &GPIO_InitStruct); \
    -
    1180  } \
    -
    1181  static GPIO_PinState IsSet() { \
    -
    1182  return HAL_GPIO_ReadPin(port, pin); \
    -
    1183  } \
    -
    1184 };
    -
    1185 
    -
    1186 MAKE_PIN(P0, GPIOA, GPIO_PIN_3); // D0
    -
    1187 MAKE_PIN(P1, GPIOA, GPIO_PIN_2); // D1
    -
    1188 MAKE_PIN(P2, GPIOA, GPIO_PIN_10); // D2
    -
    1189 MAKE_PIN(P3, GPIOB, GPIO_PIN_3); // D3
    -
    1190 MAKE_PIN(P4, GPIOB, GPIO_PIN_5); // D4
    -
    1191 MAKE_PIN(P5, GPIOB, GPIO_PIN_4); // D5
    -
    1192 MAKE_PIN(P6, GPIOB, GPIO_PIN_10); // D6
    -
    1193 MAKE_PIN(P7, GPIOA, GPIO_PIN_8); // D7
    -
    1194 MAKE_PIN(P8, GPIOA, GPIO_PIN_9); // D8
    -
    1195 MAKE_PIN(P9, GPIOC, GPIO_PIN_7); // D9
    -
    1196 MAKE_PIN(P10, GPIOB, GPIO_PIN_6); // D10
    -
    1197 MAKE_PIN(P11, GPIOA, GPIO_PIN_7); // D11
    -
    1198 MAKE_PIN(P12, GPIOA, GPIO_PIN_6); // D12
    -
    1199 MAKE_PIN(P13, GPIOA, GPIO_PIN_5); // D13
    -
    1200 
    -
    1201 MAKE_PIN(P14, GPIOA, GPIO_PIN_0); // A0
    -
    1202 MAKE_PIN(P15, GPIOA, GPIO_PIN_1); // A1
    -
    1203 MAKE_PIN(P16, GPIOA, GPIO_PIN_4); // A2
    -
    1204 MAKE_PIN(P17, GPIOB, GPIO_PIN_0); // A3
    -
    1205 MAKE_PIN(P18, GPIOC, GPIO_PIN_1); // A4
    -
    1206 MAKE_PIN(P19, GPIOC, GPIO_PIN_0); // A5
    -
    1207 
    -
    1208 #undef MAKE_PIN
    -
    1209 
    -
    1210 #else
    -
    1211 #error "Please define board in avrpins.h"
    -
    1212 
    -
    1213 #endif
    -
    1214 
    -
    1215 #elif defined(__ARDUINO_ARC__)
    -
    1216 
    -
    1217 #include <avr/pgmspace.h>
    -
    1218 // Pointers are 32 bits on arc
    -
    1219 #define pgm_read_pointer(p) pgm_read_dword(p)
    -
    1220 
    -
    1221 #define MAKE_PIN(className, pin) \
    -
    1222 class className { \
    -
    1223 public: \
    -
    1224  static void Set() { \
    -
    1225  digitalWrite(pin, HIGH);\
    -
    1226  } \
    -
    1227  static void Clear() { \
    -
    1228  digitalWrite(pin, LOW); \
    -
    1229  } \
    -
    1230  static void SetDirRead() { \
    -
    1231  pinMode(pin, INPUT); \
    -
    1232  } \
    -
    1233  static void SetDirWrite() { \
    -
    1234  pinMode(pin, OUTPUT); \
    -
    1235  } \
    -
    1236  static uint8_t IsSet() { \
    -
    1237  return digitalRead(pin); \
    -
    1238  } \
    -
    1239 };
    -
    1240 
    -
    1241 MAKE_PIN(P0, 0);
    -
    1242 MAKE_PIN(P1, 1);
    -
    1243 MAKE_PIN(P2, 2);
    -
    1244 MAKE_PIN(P3, 3); //PWM
    -
    1245 MAKE_PIN(P4, 4);
    -
    1246 MAKE_PIN(P5, 5); //PWM
    -
    1247 MAKE_PIN(P6, 6); //PWM
    -
    1248 MAKE_PIN(P7, 7);
    -
    1249 MAKE_PIN(P8, 8);
    -
    1250 MAKE_PIN(P9, 9); //PWM
    -
    1251 
    -
    1252 MAKE_PIN(P10, 10); //SPI SS
    -
    1253 MAKE_PIN(P11, 11); //SPI MOSI
    -
    1254 MAKE_PIN(P12, 12); //SPI MISO
    -
    1255 MAKE_PIN(P13, 13); //SPI SCK / BUILTIN LED
    -
    1256 
    -
    1257 MAKE_PIN(P14, 14); // A0
    -
    1258 MAKE_PIN(P15, 15); // A1
    -
    1259 MAKE_PIN(P16, 16); // A2
    -
    1260 MAKE_PIN(P17, 17); // A3
    -
    1261 MAKE_PIN(P18, 18); // A4 SDA
    -
    1262 MAKE_PIN(P19, 19); // A5 SCL
    -
    1263 MAKE_PIN(P20, 20); // ATN
    -
    1264 
    -
    1265 #undef MAKE_PIN
    -
    1266 
    -
    1267 #elif defined(__ARDUINO_X86__) // Intel Galileo, Intel Galileo 2 and Intel Edison
    -
    1268 
    -
    1269 #include <avr/pgmspace.h>
    -
    1270 
    -
    1271 // Pointers are 32 bits on x86
    -
    1272 #define pgm_read_pointer(p) pgm_read_dword(p)
    -
    1273 
    -
    1274 #if PLATFORM_ID == 0xE1 // Edison platform id
    -
    1275 #define pinToFastPin(pin) 1 // As far as I can tell all pins can be used as fast pins
    -
    1276 #endif
    -
    1277 
    -
    1278 // Pin 2 and 3 on the Intel Galileo supports a higher rate,
    -
    1279 // so it is recommended to use one of these as the SS pin.
    -
    1280 
    -
    1281 #define MAKE_PIN(className, pin) \
    -
    1282 class className { \
    -
    1283 public: \
    -
    1284  static void Set() { \
    -
    1285  fastDigitalWrite(pin, HIGH); \
    -
    1286  } \
    -
    1287  static void Clear() { \
    -
    1288  fastDigitalWrite(pin, LOW); \
    -
    1289  } \
    -
    1290  static void SetDirRead() { \
    -
    1291  if (pinToFastPin(pin)) \
    -
    1292  pinMode(pin, INPUT_FAST); \
    -
    1293  else \
    -
    1294  pinMode(pin, INPUT); \
    -
    1295  } \
    -
    1296  static void SetDirWrite() { \
    -
    1297  if (pinToFastPin(pin)) \
    -
    1298  pinMode(pin, OUTPUT_FAST); \
    -
    1299  else \
    -
    1300  pinMode(pin, OUTPUT); \
    -
    1301  } \
    -
    1302  static uint8_t IsSet() { \
    -
    1303  return fastDigitalRead(pin); \
    -
    1304  } \
    -
    1305 };
    -
    1306 
    -
    1307 MAKE_PIN(P0, 0);
    -
    1308 MAKE_PIN(P1, 1);
    -
    1309 MAKE_PIN(P2, 2);
    -
    1310 MAKE_PIN(P3, 3);
    -
    1311 MAKE_PIN(P4, 4);
    -
    1312 MAKE_PIN(P5, 5);
    -
    1313 MAKE_PIN(P6, 6);
    -
    1314 MAKE_PIN(P7, 7);
    -
    1315 MAKE_PIN(P8, 8);
    -
    1316 MAKE_PIN(P9, 9);
    -
    1317 MAKE_PIN(P10, 10);
    -
    1318 MAKE_PIN(P11, 11);
    -
    1319 MAKE_PIN(P12, 12);
    -
    1320 MAKE_PIN(P13, 13);
    -
    1321 MAKE_PIN(P14, 14); // A0
    -
    1322 MAKE_PIN(P15, 15); // A1
    -
    1323 MAKE_PIN(P16, 16); // A2
    -
    1324 MAKE_PIN(P17, 17); // A3
    -
    1325 MAKE_PIN(P18, 18); // A4
    -
    1326 MAKE_PIN(P19, 19); // A5
    -
    1327 
    -
    1328 #undef MAKE_PIN
    -
    1329 
    -
    1330 #elif defined(__MIPSEL__)
    -
    1331 // MIPSEL (MIPS architecture using a little endian byte order)
    -
    1332 
    -
    1333 // MIPS size_t = 4
    -
    1334 #define pgm_read_pointer(p) pgm_read_dword(p)
    -
    1335 
    -
    1336 #define MAKE_PIN(className, pin) \
    -
    1337 class className { \
    -
    1338 public: \
    -
    1339  static void Set() { \
    -
    1340  digitalWrite(pin, HIGH);\
    -
    1341  } \
    -
    1342  static void Clear() { \
    -
    1343  digitalWrite(pin, LOW); \
    -
    1344  } \
    -
    1345  static void SetDirRead() { \
    -
    1346  pinMode(pin, INPUT); \
    -
    1347  } \
    -
    1348  static void SetDirWrite() { \
    -
    1349  pinMode(pin, OUTPUT); \
    -
    1350  } \
    -
    1351  static uint8_t IsSet() { \
    -
    1352  return digitalRead(pin); \
    -
    1353  } \
    -
    1354 };
    -
    1355 
    -
    1356 // 0 .. 13 - Digital pins
    -
    1357 MAKE_PIN(P0, 0); // RX
    -
    1358 MAKE_PIN(P1, 1); // TX
    -
    1359 MAKE_PIN(P2, 2); //
    -
    1360 MAKE_PIN(P3, 3); //
    -
    1361 MAKE_PIN(P4, 4); //
    -
    1362 MAKE_PIN(P5, 5); //
    -
    1363 MAKE_PIN(P6, 6); //
    -
    1364 MAKE_PIN(P7, 7); //
    -
    1365 MAKE_PIN(P8, 8); //
    -
    1366 MAKE_PIN(P9, 9); //
    -
    1367 MAKE_PIN(P10, 10); //
    -
    1368 MAKE_PIN(P11, 11); //
    -
    1369 MAKE_PIN(P12, 12); //
    -
    1370 MAKE_PIN(P13, 13); //
    -
    1371 
    -
    1372 #undef MAKE_PIN
    -
    1373 
    -
    1374 #elif defined(ESP8266) || defined(ESP32)
    -
    1375 
    -
    1376 #define MAKE_PIN(className, pin) \
    -
    1377 class className { \
    -
    1378 public: \
    -
    1379  static void Set() { \
    -
    1380  digitalWrite(pin, HIGH);\
    -
    1381  } \
    -
    1382  static void Clear() { \
    -
    1383  digitalWrite(pin, LOW); \
    -
    1384  } \
    -
    1385  static void SetDirRead() { \
    -
    1386  pinMode(pin, INPUT); \
    -
    1387  } \
    -
    1388  static void SetDirWrite() { \
    -
    1389  pinMode(pin, OUTPUT); \
    -
    1390  } \
    -
    1391  static uint8_t IsSet() { \
    -
    1392  return digitalRead(pin); \
    -
    1393  } \
    -
    1394 };
    -
    1395 
    -
    1396 #if defined(ESP8266)
    -
    1397 
    -
    1398 // Workaround the following issue: https://github.com/esp8266/Arduino/pull/5735
    -
    1399 #undef pgm_read_ptr_aligned
    -
    1400 #ifdef __cplusplus
    -
    1401 #define pgm_read_ptr_aligned(addr) (*reinterpret_cast<const void* const*>(addr))
    -
    1402 #else
    -
    1403 #define pgm_read_ptr_aligned(addr) (*(const void* const*)(addr))
    -
    1404 #endif
    -
    1405 
    -
    1406 #undef pgm_read_ptr
    -
    1407 #if PGM_READ_UNALIGNED
    -
    1408 #define pgm_read_ptr(p) pgm_read_ptr_unaligned(p)
    -
    1409 #else
    -
    1410 #define pgm_read_ptr(p) pgm_read_ptr_aligned(p)
    -
    1411 #endif
    -
    1412 
    -
    1413 #ifdef pgm_read_pointer
    -
    1414 #undef pgm_read_pointer
    -
    1415 #endif
    -
    1416 #define pgm_read_pointer(p) pgm_read_ptr(p)
    -
    1417 
    -
    1418 // Pinout for ESP-12 module
    -
    1419 // 0 .. 16 - Digital pins
    -
    1420 // GPIO 6 to 11 and 16 are not usable in this library.
    -
    1421 
    -
    1422 MAKE_PIN(P0, 0);
    -
    1423 MAKE_PIN(P1, 1); // TX0
    -
    1424 MAKE_PIN(P2, 2); // TX1
    -
    1425 MAKE_PIN(P3, 3); // RX0
    -
    1426 MAKE_PIN(P4, 4); // SDA
    -
    1427 MAKE_PIN(P5, 5); // SCL
    -
    1428 MAKE_PIN(P12, 12); // MISO
    -
    1429 MAKE_PIN(P13, 13); // MOSI
    -
    1430 MAKE_PIN(P14, 14); // SCK
    -
    1431 MAKE_PIN(P15, 15); // SS
    -
    1432 
    -
    1433 #elif defined(ESP32)
    -
    1434 
    -
    1435 // Workaround strict-aliasing warnings
    -
    1436 #ifdef pgm_read_word
    -
    1437 #undef pgm_read_word
    -
    1438 #endif
    -
    1439 #ifdef pgm_read_dword
    -
    1440 #undef pgm_read_dword
    -
    1441 #endif
    -
    1442 #ifdef pgm_read_float
    -
    1443 #undef pgm_read_float
    -
    1444 #endif
    -
    1445 #ifdef pgm_read_ptr
    -
    1446 #undef pgm_read_ptr
    -
    1447 #endif
    -
    1448 
    -
    1449 #define pgm_read_word(addr) ({ \
    -
    1450  typeof(addr) _addr = (addr); \
    -
    1451  *(const unsigned short *)(_addr); \
    -
    1452 })
    -
    1453 #define pgm_read_dword(addr) ({ \
    -
    1454  typeof(addr) _addr = (addr); \
    -
    1455  *(const unsigned long *)(_addr); \
    -
    1456 })
    -
    1457 #define pgm_read_float(addr) ({ \
    -
    1458  typeof(addr) _addr = (addr); \
    -
    1459  *(const float *)(_addr); \
    -
    1460 })
    -
    1461 #define pgm_read_ptr(addr) ({ \
    -
    1462  typeof(addr) _addr = (addr); \
    -
    1463  *(void * const *)(_addr); \
    -
    1464 })
    -
    1465 
    -
    1466 // Pinout for ESP32 dev module
    -
    1467 
    -
    1468 MAKE_PIN(P0, 0);
    -
    1469 MAKE_PIN(P1, 1); // TX0
    -
    1470 MAKE_PIN(P10, 10); // TX1
    -
    1471 MAKE_PIN(P3, 3); // RX0
    -
    1472 MAKE_PIN(P21, 21); // SDA
    -
    1473 MAKE_PIN(P22, 22); // SCL
    -
    1474 MAKE_PIN(P19, 19); // MISO
    -
    1475 MAKE_PIN(P23, 23); // MOSI
    -
    1476 MAKE_PIN(P18, 18); // SCK
    -
    1477 MAKE_PIN(P5, 5); // SS
    -
    1478 MAKE_PIN(P17, 17); // INT
    -
    1479 
    -
    1480 #endif
    -
    1481 
    -
    1482 #undef MAKE_PIN
    -
    1483 
    -
    1484 // pgm_read_ptr is not defined in the ESP32, so we have to undef the diffinition from version_helper.h
    -
    1485 #ifdef pgm_read_pointer
    -
    1486 #undef pgm_read_pointer
    -
    1487 #endif
    -
    1488 #define pgm_read_pointer(p) pgm_read_ptr(p)
    -
    1489 
    -
    1490 #else
    -
    1491 #error "Please define board in avrpins.h"
    -
    1492 
    -
    1493 #endif
    -
    1494 
    -
    1495 #endif //_avrpins_h_
    -
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This program is free software; you can redistribute it and/or modify
    4 it under the terms of the GNU General Public License as published by
    5 the Free Software Foundation; either version 2 of the License, or
    6 (at your option) any later version.
    7 
    8 This program is distributed in the hope that it will be useful,
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11 GNU General Public License for more details.
    12 
    13 You should have received a copy of the GNU General Public License
    14 along with this program; if not, write to the Free Software
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    16 
    17 Contact information
    18 -------------------
    19 
    20 Circuits At Home, LTD
    21 Web : http://www.circuitsathome.com
    22 e-mail : support@circuitsathome.com
    23  */
    24 
    25 /* derived from Konstantin Chizhov's AVR port templates */
    26 
    27 #if !defined(_usb_h_) || defined(_avrpins_h_)
    28 #error "Never include avrpins.h directly; include Usb.h instead"
    29 #else
    30 #define _avrpins_h_
    31 
    32 #if defined(__AVR__)
    33 
    34 // pointers are 16 bits on AVR
    35 #define pgm_read_pointer(p) pgm_read_word(p)
    36 
    37 // Support for these boards needs to be manually activated in settings.h or in a makefile
    38 #if !defined(BOARD_MEGA_ADK) && defined(__AVR_ATmega2560__) && (USE_UHS_MEGA_ADK || defined(ARDUINO_AVR_ADK))
    39 #define BOARD_MEGA_ADK
    40 #elif !defined(BOARD_BLACK_WIDDOW) && USE_UHS_BLACK_WIDDOW
    41 #define BOARD_BLACK_WIDDOW
    42 #endif
    43 
    44 #ifdef PORTA
    45 #define USE_PORTA
    46 #endif
    47 #ifdef PORTB
    48 #define USE_PORTB
    49 #endif
    50 #ifdef PORTC
    51 #define USE_PORTC
    52 #endif
    53 #ifdef PORTD
    54 #define USE_PORTD
    55 #endif
    56 #ifdef PORTE
    57 #define USE_PORTE
    58 #endif
    59 #ifdef PORTF
    60 #define USE_PORTF
    61 #endif
    62 #ifdef PORTG
    63 #define USE_PORTG
    64 #endif
    65 #ifdef PORTH
    66 #define USE_PORTH
    67 #endif
    68 #ifdef PORTJ
    69 #define USE_PORTJ
    70 #endif
    71 #ifdef PORTK
    72 #define USE_PORTK
    73 #endif
    74 #ifdef PORTL
    75 #define USE_PORTL
    76 #endif
    77 #ifdef PORTQ
    78 #define USE_PORTQ
    79 #endif
    80 #ifdef PORTR
    81 #define USE_PORTR
    82 #endif
    83 
    84 #ifdef TCCR0A
    85 #define USE_TCCR0A
    86 #endif
    87 #ifdef TCCR1A
    88 #define USE_TCCR1A
    89 #endif
    90 #ifdef TCCR2A
    91 #define USE_TCCR2A
    92 #endif
    93 
    94 //Port definitions for AtTiny, AtMega families.
    95 
    96 #define MAKE_PORT(portName, ddrName, pinName, className, ID) \
    97  class className{\
    98  public:\
    99  typedef uint8_t DataT;\
    100  public:\
    101  static void Write(DataT value){portName = value;}\
    102  static void ClearAndSet(DataT clearMask, DataT value){portName = (portName & ~clearMask) | value;}\
    103  static DataT Read(){return portName;}\
    104  static void DirWrite(DataT value){ddrName = value;}\
    105  static DataT DirRead(){return ddrName;}\
    106  static void Set(DataT value){portName |= value;}\
    107  static void Clear(DataT value){portName &= ~value;}\
    108  static void Toggle(DataT value){portName ^= value;}\
    109  static void DirSet(DataT value){ddrName |= value;}\
    110  static void DirClear(DataT value){ddrName &= ~value;}\
    111  static void DirToggle(DataT value){ddrName ^= value;}\
    112  static DataT PinRead(){return pinName;}\
    113  enum{Id = ID};\
    114  enum{Width=sizeof(DataT)*8};\
    115  };
    116 
    117 // TCCR registers to set/clear Arduino PWM
    118 #define MAKE_TCCR(TccrName, className) \
    119  class className{\
    120  public:\
    121  typedef uint8_t DataT;\
    122  public:\
    123  static void Write(DataT value){TccrName = value;}\
    124  static void ClearAndSet(DataT clearMask, DataT value){TccrName = (TccrName & ~clearMask) | value;}\
    125  static DataT Read(){return TccrName;}\
    126  static void Set(DataT value){TccrName |= value;}\
    127  static void Clear(DataT value){TccrName &= ~value;}\
    128  static void Toggle(DataT value){TccrName ^= value;}\
    129  enum{Width=sizeof(DataT)*8};\
    130  };
    131 
    132 #ifdef USE_PORTA
    133 
    134 MAKE_PORT(PORTA, DDRA, PINA, Porta, 'A')
    135 #endif
    136 #ifdef USE_PORTB
    137 MAKE_PORT(PORTB, DDRB, PINB, Portb, 'B')
    138 #endif
    139 #ifdef USE_PORTC
    140 MAKE_PORT(PORTC, DDRC, PINC, Portc, 'C')
    141 #endif
    142 #ifdef USE_PORTD
    143 MAKE_PORT(PORTD, DDRD, PIND, Portd, 'D')
    144 #endif
    145 #ifdef USE_PORTE
    146 MAKE_PORT(PORTE, DDRE, PINE, Porte, 'E')
    147 #endif
    148 #ifdef USE_PORTF
    149 MAKE_PORT(PORTF, DDRF, PINF, Portf, 'F')
    150 #endif
    151 #ifdef USE_PORTG
    152 MAKE_PORT(PORTG, DDRG, PING, Portg, 'G')
    153 #endif
    154 #ifdef USE_PORTH
    155 MAKE_PORT(PORTH, DDRH, PINH, Porth, 'H')
    156 #endif
    157 #ifdef USE_PORTJ
    158 MAKE_PORT(PORTJ, DDRJ, PINJ, Portj, 'J')
    159 #endif
    160 #ifdef USE_PORTK
    161 MAKE_PORT(PORTK, DDRK, PINK, Portk, 'K')
    162 #endif
    163 #ifdef USE_PORTL
    164 MAKE_PORT(PORTL, DDRL, PINL, Portl, 'L')
    165 #endif
    166 #ifdef USE_PORTQ
    167 MAKE_PORT(PORTQ, DDRQ, PINQ, Portq, 'Q')
    168 #endif
    169 #ifdef USE_PORTR
    170 MAKE_PORT(PORTR, DDRR, PINR, Portr, 'R')
    171 #endif
    172 
    173 #ifdef USE_TCCR0A
    174 MAKE_TCCR(TCCR0A, Tccr0a)
    175 #endif
    176 #ifdef USE_TCCR1A
    177 MAKE_TCCR(TCCR1A, Tccr1a)
    178 #endif
    179 #ifdef USE_TCCR2A
    180 MAKE_TCCR(TCCR2A, Tccr2a)
    181 #endif
    182 
    183 // this class represents one pin in a IO port.
    184 // It is fully static.
    185 template<typename PORT, uint8_t PIN>
    186 class TPin {
    187  // BOOST_STATIC_ASSERT(PIN < PORT::Width);
    188 public:
    189  typedef PORT Port;
    190 
    191  enum {
    192  Number = PIN
    193  };
    194 
    195  static void Set() {
    196  PORT::Set(1 << PIN);
    197  }
    198 
    199  static void Set(uint8_t val) {
    200  if(val)
    201  Set();
    202  else Clear();
    203  }
    204 
    205  static void SetDir(uint8_t val) {
    206  if(val)
    207  SetDirWrite();
    208  else SetDirRead();
    209  }
    210 
    211  static void Clear() {
    212  PORT::Clear(1 << PIN);
    213  }
    214 
    215  static void Toggle() {
    216  PORT::Toggle(1 << PIN);
    217  }
    218 
    219  static void SetDirRead() {
    220  PORT::DirClear(1 << PIN);
    221  }
    222 
    223  static void SetDirWrite() {
    224  PORT::DirSet(1 << PIN);
    225  }
    226 
    227  static uint8_t IsSet() {
    228  return PORT::PinRead() & (uint8_t)(1 << PIN);
    229  }
    230 
    231  static void WaiteForSet() {
    232  while(IsSet() == 0) {
    233  }
    234  }
    235 
    236  static void WaiteForClear() {
    237  while(IsSet()) {
    238  }
    239  }
    240 }; //class TPin...
    241 
    242 // this class represents one bit in TCCR port.
    243 // used to set/clear TCCRx bits
    244 // It is fully static.
    245 
    246 template<typename TCCR, uint8_t COM>
    247 class TCom {
    248  // BOOST_STATIC_ASSERT(PIN < PORT::Width);
    249 public:
    250  typedef TCCR Tccr;
    251 
    252  enum {
    253  Com = COM
    254  };
    255 
    256  static void Set() {
    257  TCCR::Set(1 << COM);
    258  }
    259 
    260  static void Clear() {
    261  TCCR::Clear(1 << COM);
    262  }
    263 
    264  static void Toggle() {
    265  TCCR::Toggle(1 << COM);
    266  }
    267 }; //class TCom...
    268 
    269 //Short pin definitions
    270 #ifdef USE_PORTA
    271 typedef TPin<Porta, 0 > Pa0;
    272 typedef TPin<Porta, 1 > Pa1;
    273 typedef TPin<Porta, 2 > Pa2;
    274 typedef TPin<Porta, 3 > Pa3;
    275 typedef TPin<Porta, 4 > Pa4;
    276 typedef TPin<Porta, 5 > Pa5;
    277 typedef TPin<Porta, 6 > Pa6;
    278 typedef TPin<Porta, 7 > Pa7;
    279 #endif
    280 
    281 #ifdef USE_PORTB
    282 typedef TPin<Portb, 0 > Pb0;
    283 typedef TPin<Portb, 1 > Pb1;
    284 typedef TPin<Portb, 2 > Pb2;
    285 typedef TPin<Portb, 3 > Pb3;
    286 typedef TPin<Portb, 4 > Pb4;
    287 typedef TPin<Portb, 5 > Pb5;
    288 typedef TPin<Portb, 6 > Pb6;
    289 typedef TPin<Portb, 7 > Pb7;
    290 #endif
    291 
    292 #ifdef USE_PORTC
    293 typedef TPin<Portc, 0 > Pc0;
    294 typedef TPin<Portc, 1 > Pc1;
    295 typedef TPin<Portc, 2 > Pc2;
    296 typedef TPin<Portc, 3 > Pc3;
    297 typedef TPin<Portc, 4 > Pc4;
    298 typedef TPin<Portc, 5 > Pc5;
    299 typedef TPin<Portc, 6 > Pc6;
    300 typedef TPin<Portc, 7 > Pc7;
    301 #endif
    302 
    303 #ifdef USE_PORTD
    304 typedef TPin<Portd, 0 > Pd0;
    305 typedef TPin<Portd, 1 > Pd1;
    306 typedef TPin<Portd, 2 > Pd2;
    307 typedef TPin<Portd, 3 > Pd3;
    308 typedef TPin<Portd, 4 > Pd4;
    309 typedef TPin<Portd, 5 > Pd5;
    310 typedef TPin<Portd, 6 > Pd6;
    311 typedef TPin<Portd, 7 > Pd7;
    312 #endif
    313 
    314 #ifdef USE_PORTE
    315 typedef TPin<Porte, 0 > Pe0;
    316 typedef TPin<Porte, 1 > Pe1;
    317 typedef TPin<Porte, 2 > Pe2;
    318 typedef TPin<Porte, 3 > Pe3;
    319 typedef TPin<Porte, 4 > Pe4;
    320 typedef TPin<Porte, 5 > Pe5;
    321 typedef TPin<Porte, 6 > Pe6;
    322 typedef TPin<Porte, 7 > Pe7;
    323 #endif
    324 
    325 #ifdef USE_PORTF
    326 typedef TPin<Portf, 0 > Pf0;
    327 typedef TPin<Portf, 1 > Pf1;
    328 typedef TPin<Portf, 2 > Pf2;
    329 typedef TPin<Portf, 3 > Pf3;
    330 typedef TPin<Portf, 4 > Pf4;
    331 typedef TPin<Portf, 5 > Pf5;
    332 typedef TPin<Portf, 6 > Pf6;
    333 typedef TPin<Portf, 7 > Pf7;
    334 #endif
    335 
    336 #ifdef USE_PORTG
    337 typedef TPin<Portg, 0 > Pg0;
    338 typedef TPin<Portg, 1 > Pg1;
    339 typedef TPin<Portg, 2 > Pg2;
    340 typedef TPin<Portg, 3 > Pg3;
    341 typedef TPin<Portg, 4 > Pg4;
    342 typedef TPin<Portg, 5 > Pg5;
    343 typedef TPin<Portg, 6 > Pg6;
    344 typedef TPin<Portg, 7 > Pg7;
    345 #endif
    346 
    347 #ifdef USE_PORTH
    348 typedef TPin<Porth, 0 > Ph0;
    349 typedef TPin<Porth, 1 > Ph1;
    350 typedef TPin<Porth, 2 > Ph2;
    351 typedef TPin<Porth, 3 > Ph3;
    352 typedef TPin<Porth, 4 > Ph4;
    353 typedef TPin<Porth, 5 > Ph5;
    354 typedef TPin<Porth, 6 > Ph6;
    355 typedef TPin<Porth, 7 > Ph7;
    356 #endif
    357 
    358 #ifdef USE_PORTJ
    359 typedef TPin<Portj, 0 > Pj0;
    360 typedef TPin<Portj, 1 > Pj1;
    361 typedef TPin<Portj, 2 > Pj2;
    362 typedef TPin<Portj, 3 > Pj3;
    363 typedef TPin<Portj, 4 > Pj4;
    364 typedef TPin<Portj, 5 > Pj5;
    365 typedef TPin<Portj, 6 > Pj6;
    366 typedef TPin<Portj, 7 > Pj7;
    367 #endif
    368 
    369 #ifdef USE_PORTK
    370 typedef TPin<Portk, 0 > Pk0;
    371 typedef TPin<Portk, 1 > Pk1;
    372 typedef TPin<Portk, 2 > Pk2;
    373 typedef TPin<Portk, 3 > Pk3;
    374 typedef TPin<Portk, 4 > Pk4;
    375 typedef TPin<Portk, 5 > Pk5;
    376 typedef TPin<Portk, 6 > Pk6;
    377 typedef TPin<Portk, 7 > Pk7;
    378 #endif
    379 
    380 #ifdef USE_PORTL
    381 typedef TPin<Portl, 0 > Pl0;
    382 typedef TPin<Portl, 1 > Pl1;
    383 typedef TPin<Portl, 2 > Pl2;
    384 typedef TPin<Portl, 3 > Pl3;
    385 typedef TPin<Portl, 4 > Pl4;
    386 typedef TPin<Portl, 5 > Pl5;
    387 typedef TPin<Portl, 6 > Pl6;
    388 typedef TPin<Portl, 7 > Pl7;
    389 #endif
    390 
    391 #ifdef USE_PORTQ
    392 typedef TPin<Portq, 0 > Pq0;
    393 typedef TPin<Portq, 1 > Pq1;
    394 typedef TPin<Portq, 2 > Pq2;
    395 typedef TPin<Portq, 3 > Pq3;
    396 typedef TPin<Portq, 4 > Pq4;
    397 typedef TPin<Portq, 5 > Pq5;
    398 typedef TPin<Portq, 6 > Pq6;
    399 typedef TPin<Portq, 7 > Pq7;
    400 #endif
    401 
    402 #ifdef USE_PORTR
    403 typedef TPin<Portr, 0 > Pr0;
    404 typedef TPin<Portr, 1 > Pr1;
    405 typedef TPin<Portr, 2 > Pr2;
    406 typedef TPin<Portr, 3 > Pr3;
    407 typedef TPin<Portr, 4 > Pr4;
    408 typedef TPin<Portr, 5 > Pr5;
    409 typedef TPin<Portr, 6 > Pr6;
    410 typedef TPin<Portr, 7 > Pr7;
    411 #endif
    412 
    413 #ifdef USE_TCCR0A
    414 typedef TCom<Tccr0a, COM0A1> Tc0a; //P6
    415 typedef TCom<Tccr0a, COM0B1> Tc0b; //P5
    416 #endif
    417 
    418 #ifdef USE_TCCR1A
    419 typedef TCom<Tccr1a, COM1A1> Tc1a; //P9
    420 typedef TCom<Tccr1a, COM1B1> Tc1b; //P10
    421 #endif
    422 
    423 #ifdef USE_TCCR2A
    424 typedef TCom<Tccr2a, COM2A1> Tc2a; //P11
    425 typedef TCom<Tccr2a, COM2B1> Tc2b; //P3
    426 #endif
    427 
    428 template<typename Tp_pin, typename Tc_bit>
    429 class Tp_Tc {
    430 public:
    431 
    432  static void SetDir(uint8_t val) {
    433  if(val)
    434  SetDirWrite();
    435  else SetDirRead();
    436  }
    437 
    438  static void SetDirRead() {
    439  Tp_pin::SetDirRead(); //set pin direction
    440  Tc_bit::Clear(); //disconnect pin from PWM
    441  }
    442 
    443  static void SetDirWrite() {
    444  Tp_pin::SetDirWrite();
    445  Tc_bit::Clear();
    446  }
    447 };
    448 
    449 /* pin definitions for cases where it's necessary to clear compare output mode bits */
    450 
    451 //typedef Tp_Tc<Pd3, Tc2b> P3; //Arduino pin 3
    452 //typedef Tp_Tc<Pd5, Tc0b> P5; //Arduino pin 5
    453 //typedef Tp_Tc<Pd6, Tc0a> P6; //Arduino pin 6
    454 //typedef Tp_Tc<Pb1, Tc1a> P9; //Arduino pin 9
    455 //typedef Tp_Tc<Pb2, Tc1b> P10; //Arduino pin 10
    456 //typedef Tp_Tc<Pb3, Tc2a> P11; //Arduino pin 11
    457 
    458 /* Arduino pin definitions */
    459 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    460 // "Mega" Arduino pin numbers
    461 
    462 #define P0 Pe0
    463 #define P1 Pe1
    464 #define P2 Pe4
    465 #define P3 Pe5
    466 #define P4 Pg5
    467 #define P5 Pe3
    468 #define P6 Ph3
    469 #define P7 Ph4
    470 
    471 #define P8 Ph5
    472 #define P9 Ph6
    473 #define P10 Pb4
    474 #define P11 Pb5
    475 #define P12 Pb6
    476 #define P13 Pb7
    477 
    478 #define P14 Pj1
    479 #define P15 Pj0
    480 #define P16 Ph1
    481 #define P17 Ph0
    482 #define P18 Pd3
    483 #define P19 Pd2
    484 #define P20 Pd1
    485 #define P21 Pd0
    486 
    487 #define P22 Pa0
    488 #define P23 Pa1
    489 #define P24 Pa2
    490 #define P25 Pa3
    491 #define P26 Pa4
    492 #define P27 Pa5
    493 #define P28 Pa6
    494 #define P29 Pa7
    495 #define P30 Pc7
    496 #define P31 Pc6
    497 #define P32 Pc5
    498 #define P33 Pc4
    499 #define P34 Pc3
    500 #define P35 Pc2
    501 #define P36 Pc1
    502 #define P37 Pc0
    503 
    504 #define P38 Pd7
    505 #define P39 Pg2
    506 #define P40 Pg1
    507 #define P41 Pg0
    508 #define P42 Pl7
    509 #define P43 Pl6
    510 #define P44 Pl5
    511 #define P45 Pl4
    512 #define P46 Pl3
    513 #define P47 Pl2
    514 #define P48 Pl1
    515 #define P49 Pl0
    516 #define P50 Pb3
    517 #define P51 Pb2
    518 #define P52 Pb1
    519 #define P53 Pb0
    520 
    521 #ifdef BOARD_MEGA_ADK // These pins are not broken out on the Arduino ADK
    522 #define P54 Pe6 // INT on Arduino ADK
    523 #define P55 Pj2 // MAX_RESET on Arduino ADK
    524 #endif
    525 
    526 // "Mega" pin numbers
    527 
    528 #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
    529 // "Classic" Arduino pin numbers
    530 
    531 #define P0 Pd0
    532 #define P1 Pd1
    533 #define P2 Pd2
    534 #define P3 Pd3
    535 #define P4 Pd4
    536 #define P5 Pd5
    537 #define P6 Pd6
    538 #define P7 Pd7
    539 
    540 #define P8 Pb0
    541 #define P9 Pb1
    542 #define P10 Pb2
    543 #define P11 Pb3
    544 #define P12 Pb4
    545 #define P13 Pb5
    546 
    547 #define P14 Pc0
    548 #define P15 Pc1
    549 #define P16 Pc2
    550 #define P17 Pc3
    551 #define P18 Pc4
    552 #define P19 Pc5
    553 
    554 // "Classic" Arduino pin numbers
    555 
    556 #elif defined(CORE_TEENSY) && defined(__AVR_ATmega32U4__)
    557 // Teensy 2.0 pin numbers
    558 // http://www.pjrc.com/teensy/pinout.html
    559 #define P0 Pb0
    560 #define P1 Pb1
    561 #define P2 Pb2
    562 #define P3 Pb3
    563 #define P4 Pb7
    564 #define P5 Pd0
    565 #define P6 Pd1
    566 #define P7 Pd2
    567 #define P8 Pd3
    568 #define P9 Pc6
    569 #define P10 Pc7
    570 #define P11 Pd6
    571 #define P12 Pd7
    572 #define P13 Pb4
    573 #define P14 Pb5
    574 #define P15 Pb6
    575 #define P16 Pf7
    576 #define P17 Pf6
    577 #define P18 Pf5
    578 #define P19 Pf4
    579 #define P20 Pf1
    580 #define P21 Pf0
    581 #define P22 Pd4
    582 #define P23 Pd5
    583 #define P24 Pe6
    584 // Teensy 2.0
    585 
    586 #elif defined(__AVR_ATmega32U4__)
    587 // Arduino Leonardo pin numbers
    588 
    589 #define P0 Pd2 // D0 - PD2
    590 #define P1 Pd3 // D1 - PD3
    591 #define P2 Pd1 // D2 - PD1
    592 #define P3 Pd0 // D3 - PD0
    593 #define P4 Pd4 // D4 - PD4
    594 #define P5 Pc6 // D5 - PC6
    595 #define P6 Pd7 // D6 - PD7
    596 #define P7 Pe6 // D7 - PE6
    597 
    598 #define P8 Pb4 // D8 - PB4
    599 #define P9 Pb5 // D9 - PB5
    600 #define P10 Pb6 // D10 - PB6
    601 #define P11 Pb7 // D11 - PB7
    602 #define P12 Pd6 // D12 - PD6
    603 #define P13 Pc7 // D13 - PC7
    604 
    605 #define P14 Pb3 // D14 - MISO - PB3
    606 #define P15 Pb1 // D15 - SCK - PB1
    607 #define P16 Pb2 // D16 - MOSI - PB2
    608 #define P17 Pb0 // D17 - SS - PB0
    609 
    610 #define P18 Pf7 // D18 - A0 - PF7
    611 #define P19 Pf6 // D19 - A1 - PF6
    612 #define P20 Pf5 // D20 - A2 - PF5
    613 #define P21 Pf4 // D21 - A3 - PF4
    614 #define P22 Pf1 // D22 - A4 - PF1
    615 #define P23 Pf0 // D23 - A5 - PF0
    616 
    617 #define P24 Pd4 // D24 / D4 - A6 - PD4
    618 #define P25 Pd7 // D25 / D6 - A7 - PD7
    619 #define P26 Pb4 // D26 / D8 - A8 - PB4
    620 #define P27 Pb5 // D27 / D9 - A9 - PB5
    621 #define P28 Pb6 // D28 / D10 - A10 - PB6
    622 #define P29 Pd6 // D29 / D12 - A11 - PD6
    623 
    624 // Arduino Leonardo pin numbers
    625 
    626 #elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
    627 // Teensy++ 1.0 and 2.0 pin numbers
    628 // http://www.pjrc.com/teensy/pinout.html
    629 #define P0 Pd0
    630 #define P1 Pd1
    631 #define P2 Pd2
    632 #define P3 Pd3
    633 #define P4 Pd4
    634 #define P5 Pd5
    635 #define P6 Pd6
    636 #define P7 Pd7
    637 #define P8 Pe0
    638 #define P9 Pe1
    639 #define P10 Pc0
    640 #define P11 Pc1
    641 #define P12 Pc2
    642 #define P13 Pc3
    643 #define P14 Pc4
    644 #define P15 Pc5
    645 #define P16 Pc6
    646 #define P17 Pc7
    647 #define P18 Pe6
    648 #define P19 Pe7
    649 #define P20 Pb0
    650 #define P21 Pb1
    651 #define P22 Pb2
    652 #define P23 Pb3
    653 #define P24 Pb4
    654 #define P25 Pb5
    655 #define P26 Pb6
    656 #define P27 Pb7
    657 #define P28 Pa0
    658 #define P29 Pa1
    659 #define P30 Pa2
    660 #define P31 Pa3
    661 #define P32 Pa4
    662 #define P33 Pa5
    663 #define P34 Pa6
    664 #define P35 Pa7
    665 #define P36 Pe4
    666 #define P37 Pe5
    667 #define P38 Pf0
    668 #define P39 Pf1
    669 #define P40 Pf2
    670 #define P41 Pf3
    671 #define P42 Pf4
    672 #define P43 Pf5
    673 #define P44 Pf6
    674 #define P45 Pf7
    675 // Teensy++ 1.0 and 2.0
    676 
    677 #elif defined(ARDUINO_AVR_BALANDUINO) && (defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284P__))
    678 // Balanduino pin numbers
    679 // http://balanduino.net/
    680 #define P0 Pd0 /* 0 - PD0 */
    681 #define P1 Pd1 /* 1 - PD1 */
    682 
    683 #if BALANDUINO_REVISION < 13
    684  #define P2 Pb2 /* 2 - PB2 */
    685  #define P3 Pd6 /* 3 - PD6 */
    686  #define P4 Pd7 /* 4 - PD7 */
    687  #define P5 Pb3 /* 5 - PB3 */
    688 #else
    689  #define P2 Pd2 /* 2 - PD2 */
    690  #define P3 Pd3 /* 3 - PD3 */
    691  #define P4 Pd6 /* 4 - PD6 */
    692  #define P5 Pd7 /* 5 - PD7 */
    693 #endif
    694 
    695 #define P6 Pb4 /* 6 - PB4 */
    696 #define P7 Pa0 /* 7 - PA0 */
    697 #define P8 Pa1 /* 8 - PA1 */
    698 #define P9 Pa2 /* 9 - PA2 */
    699 #define P10 Pa3 /* 10 - PA3 */
    700 #define P11 Pa4 /* 11 - PA4 */
    701 #define P12 Pa5 /* 12 - PA5 */
    702 #define P13 Pc1 /* 13 - PC1 */
    703 #define P14 Pc0 /* 14 - PC0 */
    704 
    705 #if BALANDUINO_REVISION < 13
    706  #define P15 Pd2 /* 15 - PD2 */
    707  #define P16 Pd3 /* 16 - PD3 */
    708 #else
    709  #define P15 Pb2 /* 15 - PB2 */
    710  #define P16 Pb3 /* 16 - PB2 */
    711 #endif
    712 
    713 #define P17 Pd4 /* 17 - PD4 */
    714 #define P18 Pd5 /* 18 - PD5 */
    715 #define P19 Pc2 /* 19 - PC2 */
    716 #define P20 Pc3 /* 20 - PC3 */
    717 #define P21 Pc4 /* 21 - PC4 */
    718 #define P22 Pc5 /* 22 - PC5 */
    719 #define P23 Pc6 /* 23 - PC6 */
    720 #define P24 Pc7 /* 24 - PC7 */
    721 #define P25 Pb0 /* 25 - PB0 */
    722 #define P26 Pb1 /* 26 - PB1 */
    723 #define P27 Pb5 /* 27 - PB5 */
    724 #define P28 Pb6 /* 28 - PB6 */
    725 #define P29 Pb7 /* 29 - PB7 */
    726 #define P30 Pa6 /* 30 - PA6 */
    727 #define P31 Pa7 /* 31 - PA7 */
    728 // Balanduino
    729 
    730 #elif defined(ARDUINO_AVR_UNO_PRO) && defined(__AVR_ATmega1284P__)
    731 // UNO*Pro pin numbers
    732 // Homepage: http://www.hobbytronics.co.uk/arduino-uno-pro
    733 // Pin Reference: http://www.hobbytronics.co.uk/download/uno_pro/pins_arduino.h
    734 #define P0 Pd0
    735 #define P1 Pd1
    736 #define P2 Pb2
    737 #define P3 Pb3
    738 #define P4 Pb0
    739 #define P5 Pb1
    740 #define P6 Pd2
    741 #define P7 Pd3
    742 #define P8 Pd5
    743 #define P9 Pd6
    744 #define P10 Pb4
    745 #define P11 Pb5
    746 #define P12 Pb6
    747 #define P13 Pb7
    748 #define P14 Pa7
    749 #define P15 Pa6
    750 #define P16 Pa5
    751 #define P17 Pa4
    752 #define P18 Pa3
    753 #define P19 Pa2
    754 #define P20 Pa1
    755 #define P21 Pa0
    756 #define P22 Pc0
    757 #define P23 Pc1
    758 #define P24 Pc2
    759 #define P25 Pc3
    760 #define P26 Pc4
    761 #define P27 Pc5
    762 #define P28 Pc6
    763 #define P29 Pc7
    764 #define P30 Pd4
    765 #define P31 Pd7
    766 // UNO*Pro
    767 
    768 #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
    769 // Sanguino pin numbers
    770 // Homepage: http://sanguino.cc/hardware
    771 // Hardware add-on: https://github.com/Lauszus/Sanguino
    772 #define P0 Pb0
    773 #define P1 Pb1
    774 #define P2 Pb2
    775 #define P3 Pb3
    776 #define P4 Pb4
    777 #define P5 Pb5
    778 #define P6 Pb6
    779 #define P7 Pb7
    780 #define P8 Pd0
    781 #define P9 Pd1
    782 #define P10 Pd2
    783 #define P11 Pd3
    784 #define P12 Pd4
    785 #define P13 Pd5
    786 #define P14 Pd6
    787 #define P15 Pd7
    788 #define P16 Pc0
    789 #define P17 Pc1
    790 #define P18 Pc2
    791 #define P19 Pc3
    792 #define P20 Pc4
    793 #define P21 Pc5
    794 #define P22 Pc6
    795 #define P23 Pc7
    796 #define P24 Pa0
    797 #define P25 Pa1
    798 #define P26 Pa2
    799 #define P27 Pa3
    800 #define P28 Pa4
    801 #define P29 Pa5
    802 #define P30 Pa6
    803 #define P31 Pa7
    804 // Sanguino
    805 
    806 #else
    807 #error "Please define board in avrpins.h"
    808 
    809 #endif // Arduino pin definitions
    810 
    811 #elif defined(__arm__)
    812 
    813 // pointers are 32 bits on ARM
    814 #define pgm_read_pointer(p) pgm_read_dword(p)
    815 
    816 #if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__))
    817 
    818 #include "core_pins.h"
    819 #include "avr_emulation.h"
    820 
    821 #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
    822 #define GPIO_BITBAND_PTR(reg, bit) ((uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
    823 
    824 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
    825 class className { \
    826 public: \
    827  static void Set() { \
    828  *GPIO_BITBAND_PTR(baseReg, pinNum) = 1; \
    829  } \
    830  static void Clear() { \
    831  *GPIO_BITBAND_PTR(baseReg, pinNum) = 0; \
    832  } \
    833  static void SetDirRead() { \
    834  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    835  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 0; \
    836  } \
    837  static void SetDirWrite() { \
    838  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    839  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 1; \
    840  } \
    841  static uint8_t IsSet() { \
    842  return *(GPIO_BITBAND_PTR(baseReg, pinNum) + 512); \
    843  } \
    844 };
    845 
    846 MAKE_PIN(P0, CORE_PIN0_PORTREG, CORE_PIN0_BIT, CORE_PIN0_CONFIG);
    847 MAKE_PIN(P1, CORE_PIN1_PORTREG, CORE_PIN1_BIT, CORE_PIN1_CONFIG);
    848 MAKE_PIN(P2, CORE_PIN2_PORTREG, CORE_PIN2_BIT, CORE_PIN2_CONFIG);
    849 MAKE_PIN(P3, CORE_PIN3_PORTREG, CORE_PIN3_BIT, CORE_PIN3_CONFIG);
    850 MAKE_PIN(P4, CORE_PIN4_PORTREG, CORE_PIN4_BIT, CORE_PIN4_CONFIG);
    851 MAKE_PIN(P5, CORE_PIN5_PORTREG, CORE_PIN5_BIT, CORE_PIN5_CONFIG);
    852 MAKE_PIN(P6, CORE_PIN6_PORTREG, CORE_PIN6_BIT, CORE_PIN6_CONFIG);
    853 MAKE_PIN(P7, CORE_PIN7_PORTREG, CORE_PIN7_BIT, CORE_PIN7_CONFIG);
    854 MAKE_PIN(P8, CORE_PIN8_PORTREG, CORE_PIN8_BIT, CORE_PIN8_CONFIG);
    855 MAKE_PIN(P9, CORE_PIN9_PORTREG, CORE_PIN9_BIT, CORE_PIN9_CONFIG);
    856 MAKE_PIN(P10, CORE_PIN10_PORTREG, CORE_PIN10_BIT, CORE_PIN10_CONFIG);
    857 MAKE_PIN(P11, CORE_PIN11_PORTREG, CORE_PIN11_BIT, CORE_PIN11_CONFIG);
    858 MAKE_PIN(P12, CORE_PIN12_PORTREG, CORE_PIN12_BIT, CORE_PIN12_CONFIG);
    859 MAKE_PIN(P13, CORE_PIN13_PORTREG, CORE_PIN13_BIT, CORE_PIN13_CONFIG);
    860 MAKE_PIN(P14, CORE_PIN14_PORTREG, CORE_PIN14_BIT, CORE_PIN14_CONFIG);
    861 MAKE_PIN(P15, CORE_PIN15_PORTREG, CORE_PIN15_BIT, CORE_PIN15_CONFIG);
    862 MAKE_PIN(P16, CORE_PIN16_PORTREG, CORE_PIN16_BIT, CORE_PIN16_CONFIG);
    863 MAKE_PIN(P17, CORE_PIN17_PORTREG, CORE_PIN17_BIT, CORE_PIN17_CONFIG);
    864 MAKE_PIN(P18, CORE_PIN18_PORTREG, CORE_PIN18_BIT, CORE_PIN18_CONFIG);
    865 MAKE_PIN(P19, CORE_PIN19_PORTREG, CORE_PIN19_BIT, CORE_PIN19_CONFIG);
    866 MAKE_PIN(P20, CORE_PIN20_PORTREG, CORE_PIN20_BIT, CORE_PIN20_CONFIG);
    867 MAKE_PIN(P21, CORE_PIN21_PORTREG, CORE_PIN21_BIT, CORE_PIN21_CONFIG);
    868 MAKE_PIN(P22, CORE_PIN22_PORTREG, CORE_PIN22_BIT, CORE_PIN22_CONFIG);
    869 MAKE_PIN(P23, CORE_PIN23_PORTREG, CORE_PIN23_BIT, CORE_PIN23_CONFIG);
    870 MAKE_PIN(P24, CORE_PIN24_PORTREG, CORE_PIN24_BIT, CORE_PIN24_CONFIG);
    871 MAKE_PIN(P25, CORE_PIN25_PORTREG, CORE_PIN25_BIT, CORE_PIN25_CONFIG);
    872 MAKE_PIN(P26, CORE_PIN26_PORTREG, CORE_PIN26_BIT, CORE_PIN26_CONFIG);
    873 MAKE_PIN(P27, CORE_PIN27_PORTREG, CORE_PIN27_BIT, CORE_PIN27_CONFIG);
    874 MAKE_PIN(P28, CORE_PIN28_PORTREG, CORE_PIN28_BIT, CORE_PIN28_CONFIG);
    875 MAKE_PIN(P29, CORE_PIN29_PORTREG, CORE_PIN29_BIT, CORE_PIN29_CONFIG);
    876 MAKE_PIN(P30, CORE_PIN30_PORTREG, CORE_PIN30_BIT, CORE_PIN30_CONFIG);
    877 MAKE_PIN(P31, CORE_PIN31_PORTREG, CORE_PIN31_BIT, CORE_PIN31_CONFIG);
    878 MAKE_PIN(P32, CORE_PIN32_PORTREG, CORE_PIN32_BIT, CORE_PIN32_CONFIG);
    879 MAKE_PIN(P33, CORE_PIN33_PORTREG, CORE_PIN33_BIT, CORE_PIN33_CONFIG);
    880 #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
    881 MAKE_PIN(P34, CORE_PIN34_PORTREG, CORE_PIN34_BIT, CORE_PIN34_CONFIG);
    882 MAKE_PIN(P35, CORE_PIN35_PORTREG, CORE_PIN35_BIT, CORE_PIN35_CONFIG);
    883 MAKE_PIN(P36, CORE_PIN36_PORTREG, CORE_PIN36_BIT, CORE_PIN36_CONFIG);
    884 MAKE_PIN(P37, CORE_PIN37_PORTREG, CORE_PIN37_BIT, CORE_PIN37_CONFIG);
    885 MAKE_PIN(P38, CORE_PIN38_PORTREG, CORE_PIN38_BIT, CORE_PIN38_CONFIG);
    886 MAKE_PIN(P39, CORE_PIN39_PORTREG, CORE_PIN39_BIT, CORE_PIN39_CONFIG);
    887 MAKE_PIN(P40, CORE_PIN40_PORTREG, CORE_PIN40_BIT, CORE_PIN40_CONFIG);
    888 MAKE_PIN(P41, CORE_PIN41_PORTREG, CORE_PIN41_BIT, CORE_PIN41_CONFIG);
    889 MAKE_PIN(P42, CORE_PIN42_PORTREG, CORE_PIN42_BIT, CORE_PIN42_CONFIG);
    890 MAKE_PIN(P43, CORE_PIN43_PORTREG, CORE_PIN43_BIT, CORE_PIN43_CONFIG);
    891 MAKE_PIN(P44, CORE_PIN44_PORTREG, CORE_PIN44_BIT, CORE_PIN44_CONFIG);
    892 MAKE_PIN(P45, CORE_PIN45_PORTREG, CORE_PIN45_BIT, CORE_PIN45_CONFIG);
    893 MAKE_PIN(P46, CORE_PIN46_PORTREG, CORE_PIN46_BIT, CORE_PIN46_CONFIG);
    894 MAKE_PIN(P47, CORE_PIN47_PORTREG, CORE_PIN47_BIT, CORE_PIN47_CONFIG);
    895 MAKE_PIN(P48, CORE_PIN48_PORTREG, CORE_PIN48_BIT, CORE_PIN48_CONFIG);
    896 MAKE_PIN(P49, CORE_PIN49_PORTREG, CORE_PIN49_BIT, CORE_PIN49_CONFIG);
    897 MAKE_PIN(P50, CORE_PIN50_PORTREG, CORE_PIN50_BIT, CORE_PIN50_CONFIG);
    898 MAKE_PIN(P51, CORE_PIN51_PORTREG, CORE_PIN51_BIT, CORE_PIN51_CONFIG);
    899 MAKE_PIN(P52, CORE_PIN52_PORTREG, CORE_PIN52_BIT, CORE_PIN52_CONFIG);
    900 MAKE_PIN(P53, CORE_PIN53_PORTREG, CORE_PIN53_BIT, CORE_PIN53_CONFIG);
    901 MAKE_PIN(P54, CORE_PIN54_PORTREG, CORE_PIN54_BIT, CORE_PIN54_CONFIG);
    902 MAKE_PIN(P55, CORE_PIN55_PORTREG, CORE_PIN55_BIT, CORE_PIN55_CONFIG);
    903 MAKE_PIN(P56, CORE_PIN56_PORTREG, CORE_PIN56_BIT, CORE_PIN56_CONFIG);
    904 MAKE_PIN(P57, CORE_PIN57_PORTREG, CORE_PIN57_BIT, CORE_PIN57_CONFIG);
    905 MAKE_PIN(P58, CORE_PIN58_PORTREG, CORE_PIN58_BIT, CORE_PIN58_CONFIG);
    906 MAKE_PIN(P59, CORE_PIN59_PORTREG, CORE_PIN59_BIT, CORE_PIN59_CONFIG);
    907 MAKE_PIN(P60, CORE_PIN60_PORTREG, CORE_PIN60_BIT, CORE_PIN60_CONFIG);
    908 MAKE_PIN(P61, CORE_PIN61_PORTREG, CORE_PIN61_BIT, CORE_PIN61_CONFIG);
    909 MAKE_PIN(P62, CORE_PIN62_PORTREG, CORE_PIN62_BIT, CORE_PIN62_CONFIG);
    910 MAKE_PIN(P63, CORE_PIN63_PORTREG, CORE_PIN63_BIT, CORE_PIN63_CONFIG);
    911 #endif
    912 
    913 #undef MAKE_PIN
    914 
    915 #elif defined(CORE_TEENSY) && (defined(__MKL26Z64__))
    916 
    917 // we could get lower level by making these macros work properly.
    918 // for now just use the semi optimised version, it costs a lookup in the pin pgm table per op
    919 // but for now it will do.
    920 //#define GPIO_BITBAND_ADDR(reg, bit) (((volatile uint8_t *)&(reg) + ((bit) >> 3)))
    921 //#define GPIO_BITBAND_MASK(reg, bit) (1<<((bit) & 7))
    922 //#define GPIO_BITBAND_PTR(reg, bit) ((volatile uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
    923 
    924 #include "core_pins.h"
    925 #include "avr_emulation.h"
    926 
    927 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
    928 class className { \
    929 public: \
    930  static void Set() { \
    931  *portSetRegister(pinNum) = digitalPinToBitMask(pinNum); \
    932  } \
    933  static void Clear() { \
    934  *portClearRegister(pinNum) = digitalPinToBitMask(pinNum); \
    935  } \
    936  static void SetDirRead() { \
    937  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    938  *portModeRegister(pinNum) &= ~digitalPinToBitMask(pinNum); \
    939  } \
    940  static void SetDirWrite() { \
    941  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    942  *portModeRegister(pinNum) |= digitalPinToBitMask(pinNum); \
    943  } \
    944  static uint8_t IsSet() { \
    945  return (*portInputRegister(pinNum) & digitalPinToBitMask(pinNum)) ? 1 : 0; \
    946  } \
    947 };
    948 
    949 MAKE_PIN(P0, CORE_PIN0_PORTREG, 0, CORE_PIN0_CONFIG);
    950 MAKE_PIN(P1, CORE_PIN1_PORTREG, 1, CORE_PIN1_CONFIG);
    951 MAKE_PIN(P2, CORE_PIN2_PORTREG, 2, CORE_PIN2_CONFIG);
    952 MAKE_PIN(P3, CORE_PIN3_PORTREG, 3, CORE_PIN3_CONFIG);
    953 MAKE_PIN(P4, CORE_PIN4_PORTREG, 4, CORE_PIN4_CONFIG);
    954 MAKE_PIN(P5, CORE_PIN5_PORTREG, 5, CORE_PIN5_CONFIG);
    955 MAKE_PIN(P6, CORE_PIN6_PORTREG, 6, CORE_PIN6_CONFIG);
    956 MAKE_PIN(P7, CORE_PIN7_PORTREG, 7, CORE_PIN7_CONFIG);
    957 MAKE_PIN(P8, CORE_PIN8_PORTREG, 8, CORE_PIN8_CONFIG);
    958 MAKE_PIN(P9, CORE_PIN9_PORTREG, 9, CORE_PIN9_CONFIG);
    959 MAKE_PIN(P10, CORE_PIN10_PORTREG, 10, CORE_PIN10_CONFIG);
    960 MAKE_PIN(P11, CORE_PIN11_PORTREG, 11, CORE_PIN11_CONFIG);
    961 MAKE_PIN(P12, CORE_PIN12_PORTREG, 12, CORE_PIN12_CONFIG);
    962 MAKE_PIN(P13, CORE_PIN13_PORTREG, 13, CORE_PIN13_CONFIG);
    963 MAKE_PIN(P14, CORE_PIN14_PORTREG, 14, CORE_PIN14_CONFIG);
    964 MAKE_PIN(P15, CORE_PIN15_PORTREG, 15, CORE_PIN15_CONFIG);
    965 MAKE_PIN(P16, CORE_PIN16_PORTREG, 16, CORE_PIN16_CONFIG);
    966 MAKE_PIN(P17, CORE_PIN17_PORTREG, 17, CORE_PIN17_CONFIG);
    967 MAKE_PIN(P18, CORE_PIN18_PORTREG, 18, CORE_PIN18_CONFIG);
    968 MAKE_PIN(P19, CORE_PIN19_PORTREG, 19, CORE_PIN19_CONFIG);
    969 MAKE_PIN(P20, CORE_PIN20_PORTREG, 20, CORE_PIN20_CONFIG);
    970 MAKE_PIN(P21, CORE_PIN21_PORTREG, 21, CORE_PIN21_CONFIG);
    971 MAKE_PIN(P22, CORE_PIN22_PORTREG, 22, CORE_PIN22_CONFIG);
    972 MAKE_PIN(P23, CORE_PIN23_PORTREG, 23, CORE_PIN23_CONFIG);
    973 MAKE_PIN(P24, CORE_PIN24_PORTREG, 24, CORE_PIN24_CONFIG);
    974 MAKE_PIN(P25, CORE_PIN25_PORTREG, 25, CORE_PIN25_CONFIG);
    975 MAKE_PIN(P26, CORE_PIN26_PORTREG, 26, CORE_PIN26_CONFIG);
    976 
    977 #undef MAKE_PIN
    978 
    979 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    980 
    981 // SetDirRead:
    982 // Disable interrupts
    983 // Disable the pull up resistor
    984 // Set to INPUT
    985 // Enable PIO
    986 
    987 // SetDirWrite:
    988 // Disable interrupts
    989 // Disable the pull up resistor
    990 // Set to OUTPUT
    991 // Enable PIO
    992 
    993 #define MAKE_PIN(className, pio, pinMask) \
    994 class className { \
    995 public: \
    996  static void Set() { \
    997  pio->PIO_SODR = pinMask; \
    998  } \
    999  static void Clear() { \
    1000  pio->PIO_CODR = pinMask; \
    1001  } \
    1002  static void SetDirRead() { \
    1003  pio->PIO_IDR = pinMask ; \
    1004  pio->PIO_PUDR = pinMask; \
    1005  pio->PIO_ODR = pinMask; \
    1006  pio->PIO_PER = pinMask; \
    1007  } \
    1008  static void SetDirWrite() { \
    1009  pio->PIO_IDR = pinMask ; \
    1010  pio->PIO_PUDR = pinMask; \
    1011  pio->PIO_OER = pinMask; \
    1012  pio->PIO_PER = pinMask; \
    1013  } \
    1014  static uint8_t IsSet() { \
    1015  return pio->PIO_PDSR & pinMask; \
    1016  } \
    1017 };
    1018 
    1019 // See: http://arduino.cc/en/Hacking/PinMappingSAM3X and variant.cpp
    1020 
    1021 MAKE_PIN(P0, PIOA, PIO_PA8);
    1022 MAKE_PIN(P1, PIOA, PIO_PA9);
    1023 MAKE_PIN(P2, PIOB, PIO_PB25);
    1024 MAKE_PIN(P3, PIOC, PIO_PC28);
    1025 MAKE_PIN(P4, PIOC, PIO_PC26);
    1026 MAKE_PIN(P5, PIOC, PIO_PC25);
    1027 MAKE_PIN(P6, PIOC, PIO_PC24);
    1028 MAKE_PIN(P7, PIOC, PIO_PC23);
    1029 MAKE_PIN(P8, PIOC, PIO_PC22);
    1030 MAKE_PIN(P9, PIOC, PIO_PC21);
    1031 MAKE_PIN(P10, PIOC, PIO_PC29);
    1032 MAKE_PIN(P11, PIOD, PIO_PD7);
    1033 MAKE_PIN(P12, PIOD, PIO_PD8);
    1034 MAKE_PIN(P13, PIOB, PIO_PB27);
    1035 MAKE_PIN(P14, PIOD, PIO_PD4);
    1036 MAKE_PIN(P15, PIOD, PIO_PD5);
    1037 MAKE_PIN(P16, PIOA, PIO_PA13);
    1038 MAKE_PIN(P17, PIOA, PIO_PA12);
    1039 MAKE_PIN(P18, PIOA, PIO_PA11);
    1040 MAKE_PIN(P19, PIOA, PIO_PA10);
    1041 MAKE_PIN(P20, PIOB, PIO_PB12);
    1042 MAKE_PIN(P21, PIOB, PIO_PB13);
    1043 MAKE_PIN(P22, PIOB, PIO_PB26);
    1044 MAKE_PIN(P23, PIOA, PIO_PA14);
    1045 MAKE_PIN(P24, PIOA, PIO_PA15);
    1046 MAKE_PIN(P25, PIOD, PIO_PD0);
    1047 MAKE_PIN(P26, PIOD, PIO_PD1);
    1048 MAKE_PIN(P27, PIOD, PIO_PD2);
    1049 MAKE_PIN(P28, PIOD, PIO_PD3);
    1050 MAKE_PIN(P29, PIOD, PIO_PD6);
    1051 MAKE_PIN(P30, PIOD, PIO_PD9);
    1052 MAKE_PIN(P31, PIOA, PIO_PA7);
    1053 MAKE_PIN(P32, PIOD, PIO_PD10);
    1054 MAKE_PIN(P33, PIOC, PIO_PC1);
    1055 MAKE_PIN(P34, PIOC, PIO_PC2);
    1056 MAKE_PIN(P35, PIOC, PIO_PC3);
    1057 MAKE_PIN(P36, PIOC, PIO_PC4);
    1058 MAKE_PIN(P37, PIOC, PIO_PC5);
    1059 MAKE_PIN(P38, PIOC, PIO_PC6);
    1060 MAKE_PIN(P39, PIOC, PIO_PC7);
    1061 MAKE_PIN(P40, PIOC, PIO_PC8);
    1062 MAKE_PIN(P41, PIOC, PIO_PC9);
    1063 MAKE_PIN(P42, PIOA, PIO_PA19);
    1064 MAKE_PIN(P43, PIOA, PIO_PA20);
    1065 MAKE_PIN(P44, PIOC, PIO_PC19);
    1066 MAKE_PIN(P45, PIOC, PIO_PC18);
    1067 MAKE_PIN(P46, PIOC, PIO_PC17);
    1068 MAKE_PIN(P47, PIOC, PIO_PC16);
    1069 MAKE_PIN(P48, PIOC, PIO_PC15);
    1070 MAKE_PIN(P49, PIOC, PIO_PC14);
    1071 MAKE_PIN(P50, PIOC, PIO_PC13);
    1072 MAKE_PIN(P51, PIOC, PIO_PC12);
    1073 MAKE_PIN(P52, PIOB, PIO_PB21);
    1074 MAKE_PIN(P53, PIOB, PIO_PB14);
    1075 MAKE_PIN(P54, PIOA, PIO_PA16);
    1076 MAKE_PIN(P55, PIOA, PIO_PA24);
    1077 MAKE_PIN(P56, PIOA, PIO_PA23);
    1078 MAKE_PIN(P57, PIOA, PIO_PA22);
    1079 MAKE_PIN(P58, PIOA, PIO_PA6);
    1080 MAKE_PIN(P59, PIOA, PIO_PA4);
    1081 MAKE_PIN(P60, PIOA, PIO_PA3);
    1082 MAKE_PIN(P61, PIOA, PIO_PA2);
    1083 MAKE_PIN(P62, PIOB, PIO_PB17);
    1084 MAKE_PIN(P63, PIOB, PIO_PB18);
    1085 MAKE_PIN(P64, PIOB, PIO_PB19);
    1086 MAKE_PIN(P65, PIOB, PIO_PB20);
    1087 MAKE_PIN(P66, PIOB, PIO_PB15);
    1088 MAKE_PIN(P67, PIOB, PIO_PB16);
    1089 MAKE_PIN(P68, PIOA, PIO_PA1);
    1090 MAKE_PIN(P69, PIOA, PIO_PA0);
    1091 MAKE_PIN(P70, PIOA, PIO_PA17);
    1092 MAKE_PIN(P71, PIOA, PIO_PA18);
    1093 MAKE_PIN(P72, PIOC, PIO_PC30);
    1094 MAKE_PIN(P73, PIOA, PIO_PA21);
    1095 MAKE_PIN(P74, PIOA, PIO_PA25); // MISO
    1096 MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI
    1097 MAKE_PIN(P76, PIOA, PIO_PA27); // CLK
    1098 MAKE_PIN(P77, PIOA, PIO_PA28);
    1099 MAKE_PIN(P78, PIOB, PIO_PB23); // Unconnected
    1100 
    1101 #undef MAKE_PIN
    1102 
    1103 #elif defined(RBL_NRF51822)
    1104 
    1105 #define MAKE_PIN(className, pin) \
    1106 class className { \
    1107 public: \
    1108  static void Set() { \
    1109  nrf_gpio_pin_set(pin); \
    1110  } \
    1111  static void Clear() { \
    1112  nrf_gpio_pin_clear(pin); \
    1113  } \
    1114  static void SetDirRead() { \
    1115  nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
    1116  } \
    1117  static void SetDirWrite() { \
    1118  nrf_gpio_cfg_output(pin); \
    1119  } \
    1120  static uint8_t IsSet() { \
    1121  return (uint8_t)nrf_gpio_pin_read(pin); \
    1122  } \
    1123 };
    1124 
    1125 // See: pin_transform.c in RBL nRF51822 SDK
    1126 MAKE_PIN(P0, Pin_nRF51822_to_Arduino(D0));
    1127 MAKE_PIN(P1, Pin_nRF51822_to_Arduino(D1));
    1128 MAKE_PIN(P2, Pin_nRF51822_to_Arduino(D2));
    1129 MAKE_PIN(P3, Pin_nRF51822_to_Arduino(D3));
    1130 MAKE_PIN(P4, Pin_nRF51822_to_Arduino(D4));
    1131 MAKE_PIN(P5, Pin_nRF51822_to_Arduino(D5));
    1132 MAKE_PIN(P6, Pin_nRF51822_to_Arduino(D6));
    1133 MAKE_PIN(P7, Pin_nRF51822_to_Arduino(D7));
    1134 MAKE_PIN(P8, Pin_nRF51822_to_Arduino(D8));
    1135 MAKE_PIN(P9, Pin_nRF51822_to_Arduino(D9)); // INT
    1136 MAKE_PIN(P10, Pin_nRF51822_to_Arduino(D10)); // SS
    1137 MAKE_PIN(P11, Pin_nRF51822_to_Arduino(D11));
    1138 MAKE_PIN(P12, Pin_nRF51822_to_Arduino(D12));
    1139 MAKE_PIN(P13, Pin_nRF51822_to_Arduino(D13));
    1140 MAKE_PIN(P14, Pin_nRF51822_to_Arduino(D14));
    1141 MAKE_PIN(P15, Pin_nRF51822_to_Arduino(D15));
    1142 MAKE_PIN(P17, Pin_nRF51822_to_Arduino(D17)); // MISO
    1143 MAKE_PIN(P18, Pin_nRF51822_to_Arduino(D18)); // MOSI
    1144 MAKE_PIN(P16, Pin_nRF51822_to_Arduino(D16)); // CLK
    1145 MAKE_PIN(P19, Pin_nRF51822_to_Arduino(D19));
    1146 MAKE_PIN(P20, Pin_nRF51822_to_Arduino(D20));
    1147 MAKE_PIN(P21, Pin_nRF51822_to_Arduino(D21));
    1148 MAKE_PIN(P22, Pin_nRF51822_to_Arduino(D22));
    1149 MAKE_PIN(P23, Pin_nRF51822_to_Arduino(D23));
    1150 MAKE_PIN(P24, Pin_nRF51822_to_Arduino(D24));
    1151 
    1152 #undef MAKE_PIN
    1153 
    1154 #elif defined(STM32F446xx)
    1155 // NUCLEO-F446RE
    1156 
    1157 #define MAKE_PIN(className, port, pin) \
    1158 class className { \
    1159 public: \
    1160  static void Set() { \
    1161  HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); \
    1162  } \
    1163  static void Clear() { \
    1164  HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET); \
    1165  } \
    1166  static void SetDirRead() { \
    1167  static GPIO_InitTypeDef GPIO_InitStruct; \
    1168  GPIO_InitStruct.Pin = pin; \
    1169  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \
    1170  GPIO_InitStruct.Pull = GPIO_NOPULL; \
    1171  HAL_GPIO_Init(port, &GPIO_InitStruct); \
    1172  } \
    1173  static void SetDirWrite() { \
    1174  static GPIO_InitTypeDef GPIO_InitStruct; \
    1175  GPIO_InitStruct.Pin = pin; \
    1176  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \
    1177  GPIO_InitStruct.Pull = GPIO_NOPULL; \
    1178  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; \
    1179  HAL_GPIO_Init(port, &GPIO_InitStruct); \
    1180  } \
    1181  static GPIO_PinState IsSet() { \
    1182  return HAL_GPIO_ReadPin(port, pin); \
    1183  } \
    1184 };
    1185 
    1186 MAKE_PIN(P0, GPIOA, GPIO_PIN_3); // D0
    1187 MAKE_PIN(P1, GPIOA, GPIO_PIN_2); // D1
    1188 MAKE_PIN(P2, GPIOA, GPIO_PIN_10); // D2
    1189 MAKE_PIN(P3, GPIOB, GPIO_PIN_3); // D3
    1190 MAKE_PIN(P4, GPIOB, GPIO_PIN_5); // D4
    1191 MAKE_PIN(P5, GPIOB, GPIO_PIN_4); // D5
    1192 MAKE_PIN(P6, GPIOB, GPIO_PIN_10); // D6
    1193 MAKE_PIN(P7, GPIOA, GPIO_PIN_8); // D7
    1194 MAKE_PIN(P8, GPIOA, GPIO_PIN_9); // D8
    1195 MAKE_PIN(P9, GPIOC, GPIO_PIN_7); // D9
    1196 MAKE_PIN(P10, GPIOB, GPIO_PIN_6); // D10
    1197 MAKE_PIN(P11, GPIOA, GPIO_PIN_7); // D11
    1198 MAKE_PIN(P12, GPIOA, GPIO_PIN_6); // D12
    1199 MAKE_PIN(P13, GPIOA, GPIO_PIN_5); // D13
    1200 
    1201 MAKE_PIN(P14, GPIOA, GPIO_PIN_0); // A0
    1202 MAKE_PIN(P15, GPIOA, GPIO_PIN_1); // A1
    1203 MAKE_PIN(P16, GPIOA, GPIO_PIN_4); // A2
    1204 MAKE_PIN(P17, GPIOB, GPIO_PIN_0); // A3
    1205 MAKE_PIN(P18, GPIOC, GPIO_PIN_1); // A4
    1206 MAKE_PIN(P19, GPIOC, GPIO_PIN_0); // A5
    1207 
    1208 #undef MAKE_PIN
    1209 
    1210 #else
    1211 #error "Please define board in avrpins.h"
    1212 
    1213 #endif
    1214 
    1215 #elif defined(__ARDUINO_ARC__)
    1216 
    1217 #include <avr/pgmspace.h>
    1218 // Pointers are 32 bits on arc
    1219 #define pgm_read_pointer(p) pgm_read_dword(p)
    1220 
    1221 #define MAKE_PIN(className, pin) \
    1222 class className { \
    1223 public: \
    1224  static void Set() { \
    1225  digitalWrite(pin, HIGH);\
    1226  } \
    1227  static void Clear() { \
    1228  digitalWrite(pin, LOW); \
    1229  } \
    1230  static void SetDirRead() { \
    1231  pinMode(pin, INPUT); \
    1232  } \
    1233  static void SetDirWrite() { \
    1234  pinMode(pin, OUTPUT); \
    1235  } \
    1236  static uint8_t IsSet() { \
    1237  return digitalRead(pin); \
    1238  } \
    1239 };
    1240 
    1241 MAKE_PIN(P0, 0);
    1242 MAKE_PIN(P1, 1);
    1243 MAKE_PIN(P2, 2);
    1244 MAKE_PIN(P3, 3); //PWM
    1245 MAKE_PIN(P4, 4);
    1246 MAKE_PIN(P5, 5); //PWM
    1247 MAKE_PIN(P6, 6); //PWM
    1248 MAKE_PIN(P7, 7);
    1249 MAKE_PIN(P8, 8);
    1250 MAKE_PIN(P9, 9); //PWM
    1251 
    1252 MAKE_PIN(P10, 10); //SPI SS
    1253 MAKE_PIN(P11, 11); //SPI MOSI
    1254 MAKE_PIN(P12, 12); //SPI MISO
    1255 MAKE_PIN(P13, 13); //SPI SCK / BUILTIN LED
    1256 
    1257 MAKE_PIN(P14, 14); // A0
    1258 MAKE_PIN(P15, 15); // A1
    1259 MAKE_PIN(P16, 16); // A2
    1260 MAKE_PIN(P17, 17); // A3
    1261 MAKE_PIN(P18, 18); // A4 SDA
    1262 MAKE_PIN(P19, 19); // A5 SCL
    1263 MAKE_PIN(P20, 20); // ATN
    1264 
    1265 #undef MAKE_PIN
    1266 
    1267 #elif defined(__ARDUINO_X86__) // Intel Galileo, Intel Galileo 2 and Intel Edison
    1268 
    1269 #include <avr/pgmspace.h>
    1270 
    1271 // Pointers are 32 bits on x86
    1272 #define pgm_read_pointer(p) pgm_read_dword(p)
    1273 
    1274 #if PLATFORM_ID == 0xE1 // Edison platform id
    1275 #define pinToFastPin(pin) 1 // As far as I can tell all pins can be used as fast pins
    1276 #endif
    1277 
    1278 // Pin 2 and 3 on the Intel Galileo supports a higher rate,
    1279 // so it is recommended to use one of these as the SS pin.
    1280 
    1281 #define MAKE_PIN(className, pin) \
    1282 class className { \
    1283 public: \
    1284  static void Set() { \
    1285  fastDigitalWrite(pin, HIGH); \
    1286  } \
    1287  static void Clear() { \
    1288  fastDigitalWrite(pin, LOW); \
    1289  } \
    1290  static void SetDirRead() { \
    1291  if (pinToFastPin(pin)) \
    1292  pinMode(pin, INPUT_FAST); \
    1293  else \
    1294  pinMode(pin, INPUT); \
    1295  } \
    1296  static void SetDirWrite() { \
    1297  if (pinToFastPin(pin)) \
    1298  pinMode(pin, OUTPUT_FAST); \
    1299  else \
    1300  pinMode(pin, OUTPUT); \
    1301  } \
    1302  static uint8_t IsSet() { \
    1303  return fastDigitalRead(pin); \
    1304  } \
    1305 };
    1306 
    1307 MAKE_PIN(P0, 0);
    1308 MAKE_PIN(P1, 1);
    1309 MAKE_PIN(P2, 2);
    1310 MAKE_PIN(P3, 3);
    1311 MAKE_PIN(P4, 4);
    1312 MAKE_PIN(P5, 5);
    1313 MAKE_PIN(P6, 6);
    1314 MAKE_PIN(P7, 7);
    1315 MAKE_PIN(P8, 8);
    1316 MAKE_PIN(P9, 9);
    1317 MAKE_PIN(P10, 10);
    1318 MAKE_PIN(P11, 11);
    1319 MAKE_PIN(P12, 12);
    1320 MAKE_PIN(P13, 13);
    1321 MAKE_PIN(P14, 14); // A0
    1322 MAKE_PIN(P15, 15); // A1
    1323 MAKE_PIN(P16, 16); // A2
    1324 MAKE_PIN(P17, 17); // A3
    1325 MAKE_PIN(P18, 18); // A4
    1326 MAKE_PIN(P19, 19); // A5
    1327 
    1328 #undef MAKE_PIN
    1329 
    1330 #elif defined(__MIPSEL__)
    1331 // MIPSEL (MIPS architecture using a little endian byte order)
    1332 
    1333 // MIPS size_t = 4
    1334 #define pgm_read_pointer(p) pgm_read_dword(p)
    1335 
    1336 #define MAKE_PIN(className, pin) \
    1337 class className { \
    1338 public: \
    1339  static void Set() { \
    1340  digitalWrite(pin, HIGH);\
    1341  } \
    1342  static void Clear() { \
    1343  digitalWrite(pin, LOW); \
    1344  } \
    1345  static void SetDirRead() { \
    1346  pinMode(pin, INPUT); \
    1347  } \
    1348  static void SetDirWrite() { \
    1349  pinMode(pin, OUTPUT); \
    1350  } \
    1351  static uint8_t IsSet() { \
    1352  return digitalRead(pin); \
    1353  } \
    1354 };
    1355 
    1356 // 0 .. 13 - Digital pins
    1357 MAKE_PIN(P0, 0); // RX
    1358 MAKE_PIN(P1, 1); // TX
    1359 MAKE_PIN(P2, 2); //
    1360 MAKE_PIN(P3, 3); //
    1361 MAKE_PIN(P4, 4); //
    1362 MAKE_PIN(P5, 5); //
    1363 MAKE_PIN(P6, 6); //
    1364 MAKE_PIN(P7, 7); //
    1365 MAKE_PIN(P8, 8); //
    1366 MAKE_PIN(P9, 9); //
    1367 MAKE_PIN(P10, 10); //
    1368 MAKE_PIN(P11, 11); //
    1369 MAKE_PIN(P12, 12); //
    1370 MAKE_PIN(P13, 13); //
    1371 
    1372 #undef MAKE_PIN
    1373 
    1374 #elif defined(ESP8266) || defined(ESP32)
    1375 
    1376 #define MAKE_PIN(className, pin) \
    1377 class className { \
    1378 public: \
    1379  static void Set() { \
    1380  digitalWrite(pin, HIGH);\
    1381  } \
    1382  static void Clear() { \
    1383  digitalWrite(pin, LOW); \
    1384  } \
    1385  static void SetDirRead() { \
    1386  pinMode(pin, INPUT); \
    1387  } \
    1388  static void SetDirWrite() { \
    1389  pinMode(pin, OUTPUT); \
    1390  } \
    1391  static uint8_t IsSet() { \
    1392  return digitalRead(pin); \
    1393  } \
    1394 };
    1395 
    1396 #if defined(ESP8266)
    1397 
    1398 // Workaround the following issue: https://github.com/esp8266/Arduino/pull/5735
    1399 #undef pgm_read_ptr_aligned
    1400 #ifdef __cplusplus
    1401 #define pgm_read_ptr_aligned(addr) (*reinterpret_cast<const void* const*>(addr))
    1402 #else
    1403 #define pgm_read_ptr_aligned(addr) (*(const void* const*)(addr))
    1404 #endif
    1405 
    1406 #undef pgm_read_ptr
    1407 #if PGM_READ_UNALIGNED
    1408 #define pgm_read_ptr(p) pgm_read_ptr_unaligned(p)
    1409 #else
    1410 #define pgm_read_ptr(p) pgm_read_ptr_aligned(p)
    1411 #endif
    1412 
    1413 #ifdef pgm_read_pointer
    1414 #undef pgm_read_pointer
    1415 #endif
    1416 #define pgm_read_pointer(p) pgm_read_ptr(p)
    1417 
    1418 // Pinout for ESP-12 module
    1419 // 0 .. 16 - Digital pins
    1420 // GPIO 6 to 11 and 16 are not usable in this library.
    1421 
    1422 MAKE_PIN(P0, 0);
    1423 MAKE_PIN(P1, 1); // TX0
    1424 MAKE_PIN(P2, 2); // TX1
    1425 MAKE_PIN(P3, 3); // RX0
    1426 MAKE_PIN(P4, 4); // SDA
    1427 MAKE_PIN(P5, 5); // SCL
    1428 MAKE_PIN(P12, 12); // MISO
    1429 MAKE_PIN(P13, 13); // MOSI
    1430 MAKE_PIN(P14, 14); // SCK
    1431 MAKE_PIN(P15, 15); // SS
    1432 
    1433 #elif defined(ESP32)
    1434 
    1435 // Workaround strict-aliasing warnings
    1436 #ifdef pgm_read_word
    1437 #undef pgm_read_word
    1438 #endif
    1439 #ifdef pgm_read_dword
    1440 #undef pgm_read_dword
    1441 #endif
    1442 #ifdef pgm_read_float
    1443 #undef pgm_read_float
    1444 #endif
    1445 #ifdef pgm_read_ptr
    1446 #undef pgm_read_ptr
    1447 #endif
    1448 
    1449 #define pgm_read_word(addr) ({ \
    1450  typeof(addr) _addr = (addr); \
    1451  *(const unsigned short *)(_addr); \
    1452 })
    1453 #define pgm_read_dword(addr) ({ \
    1454  typeof(addr) _addr = (addr); \
    1455  *(const unsigned long *)(_addr); \
    1456 })
    1457 #define pgm_read_float(addr) ({ \
    1458  typeof(addr) _addr = (addr); \
    1459  *(const float *)(_addr); \
    1460 })
    1461 #define pgm_read_ptr(addr) ({ \
    1462  typeof(addr) _addr = (addr); \
    1463  *(void * const *)(_addr); \
    1464 })
    1465 
    1466 // Pinout for ESP32 dev module
    1467 
    1468 MAKE_PIN(P0, 0);
    1469 MAKE_PIN(P1, 1); // TX0
    1470 MAKE_PIN(P10, 10); // TX1
    1471 MAKE_PIN(P3, 3); // RX0
    1472 MAKE_PIN(P21, 21); // SDA
    1473 MAKE_PIN(P22, 22); // SCL
    1474 MAKE_PIN(P19, 19); // MISO
    1475 MAKE_PIN(P23, 23); // MOSI
    1476 MAKE_PIN(P18, 18); // SCK
    1477 MAKE_PIN(P5, 5); // SS
    1478 MAKE_PIN(P17, 17); // INT
    1479 
    1480 #endif
    1481 
    1482 #undef MAKE_PIN
    1483 
    1484 // pgm_read_ptr is not defined in the ESP32, so we have to undef the diffinition from version_helper.h
    1485 #ifdef pgm_read_pointer
    1486 #undef pgm_read_pointer
    1487 #endif
    1488 #define pgm_read_pointer(p) pgm_read_ptr(p)
    1489 
    1490 #else
    1491 #error "Please define board in avrpins.h"
    1492 
    1493 #endif
    1494 
    1495 #endif //_avrpins_h_
    diff --git a/cdc___x_r21_b1411_8cpp.html b/cdc___x_r21_b1411_8cpp.html index 1a5a3bb0..6a714c66 100644 --- a/cdc___x_r21_b1411_8cpp.html +++ b/cdc___x_r21_b1411_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdc_XR21B1411.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,13 +86,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdc_XR21B1411.cpp File Reference
    -
    #include "cdc_XR21B1411.h"
    +
    #include "cdc_XR21B1411.h"
    Include dependency graph for cdc_XR21B1411.cpp:
    - + + + +

    Go to the source code of this file.

    @@ -100,7 +104,7 @@ Include dependency graph for cdc_XR21B1411.cpp:
    diff --git a/cdc___x_r21_b1411_8cpp__incl.map b/cdc___x_r21_b1411_8cpp__incl.map index 3a1c1637..b598ec85 100644 --- a/cdc___x_r21_b1411_8cpp__incl.map +++ b/cdc___x_r21_b1411_8cpp__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/cdc___x_r21_b1411_8cpp__incl.md5 b/cdc___x_r21_b1411_8cpp__incl.md5 index e50febbd..488365a4 100644 --- a/cdc___x_r21_b1411_8cpp__incl.md5 +++ b/cdc___x_r21_b1411_8cpp__incl.md5 @@ -1 +1 @@ -fec8759d6350e74a7f80e436ca9d2758 \ No newline at end of file +94c1f3e832d30d1e0699ba30de20f4fa \ No newline at end of file diff --git a/cdc___x_r21_b1411_8cpp__incl.png b/cdc___x_r21_b1411_8cpp__incl.png index 5e777a6eed5e9868b64f47410288170a269bae02..c73f1f3f7b3ee619da873ab8ea47995ea006b61b 100644 GIT binary patch literal 5247 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 RU`G*B|KpxY(VZu+{sq|1SttMi literal 6753 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 T8d$;qjG#x#no8x0maqQ@=BNUB diff --git a/cdc___x_r21_b1411_8cpp_source.html b/cdc___x_r21_b1411_8cpp_source.html index 70ffef18..58d197cc 100644 --- a/cdc___x_r21_b1411_8cpp_source.html +++ b/cdc___x_r21_b1411_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdc_XR21B1411.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,218 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdc_XR21B1411.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2015 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #include "cdc_XR21B1411.h"
    -
    18 
    - -
    20 ACM(p, pasync) {
    -
    21  // Is this needed??
    -
    22  _enhanced_status = enhanced_features(); // Set up features
    -
    23 }
    -
    24 
    -
    25 uint8_t XR21B1411::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    26  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    27 
    -
    28  uint8_t buf[constBufSize];
    -
    29  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    30 
    -
    31  uint8_t rcode;
    -
    32  UsbDevice *p = NULL;
    -
    33  EpInfo *oldep_ptr = NULL;
    -
    34  uint8_t num_of_conf; // number of configurations
    -
    35 
    -
    36  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    37 
    -
    38  USBTRACE("XR Init\r\n");
    -
    39 
    -
    40  if(bAddress)
    - -
    42 
    -
    43  // Get pointer to pseudo device with address 0 assigned
    -
    44  p = addrPool.GetUsbDevicePtr(0);
    -
    45 
    -
    46  if(!p)
    - -
    48 
    -
    49  if(!p->epinfo) {
    -
    50  USBTRACE("epinfo\r\n");
    - -
    52  }
    -
    53 
    -
    54  // Save old pointer to EP_RECORD of address 0
    -
    55  oldep_ptr = p->epinfo;
    -
    56 
    -
    57  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    58  p->epinfo = epInfo;
    -
    59 
    -
    60  p->lowspeed = lowspeed;
    -
    61 
    -
    62  // Get device descriptor
    -
    63  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf);
    -
    64 
    -
    65  // Restore p->epinfo
    -
    66  p->epinfo = oldep_ptr;
    -
    67 
    -
    68  if(rcode)
    -
    69  goto FailGetDevDescr;
    -
    70 
    -
    71  // Allocate new address according to device class
    -
    72  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    73 
    -
    74  if(!bAddress)
    - -
    76 
    -
    77  // Extract Max Packet Size from the device descriptor
    - -
    79 
    -
    80  // Assign new address to the device
    -
    81  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    82 
    -
    83  if(rcode) {
    -
    84  p->lowspeed = false;
    -
    85  addrPool.FreeAddress(bAddress);
    -
    86  bAddress = 0;
    -
    87  USBTRACE2("setAddr:", rcode);
    -
    88  return rcode;
    -
    89  }
    -
    90 
    -
    91  USBTRACE2("Addr:", bAddress);
    -
    92 
    -
    93  p->lowspeed = false;
    -
    94 
    -
    95  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    96 
    -
    97  if(!p)
    - -
    99 
    -
    100  p->lowspeed = lowspeed;
    -
    101 
    -
    102  num_of_conf = udd->bNumConfigurations;
    -
    103 
    -
    104  if((((udd->idVendor != 0x2890U) || (udd->idProduct != 0x0201U)) && ((udd->idVendor != 0x04e2U) || (udd->idProduct != 0x1411U))))
    - -
    106 
    -
    107  // Assign epInfo to epinfo pointer
    -
    108  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    109 
    -
    110  if(rcode)
    -
    111  goto FailSetDevTblEntry;
    -
    112 
    -
    113  USBTRACE2("NC:", num_of_conf);
    -
    114 
    -
    115  for(uint8_t i = 0; i < num_of_conf; i++) {
    - - - - - -
    121  CP_MASK_COMPARE_PROTOCOL > CdcControlParser(this);
    -
    122 
    - -
    124  CP_MASK_COMPARE_CLASS> CdcDataParser(this);
    -
    125 
    -
    126  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcControlParser);
    -
    127 
    -
    128  if(rcode)
    -
    129  goto FailGetConfDescr;
    -
    130 
    -
    131  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcDataParser);
    -
    132 
    -
    133  if(rcode)
    -
    134  goto FailGetConfDescr;
    -
    135 
    -
    136  if(bNumEP > 1)
    -
    137  break;
    -
    138  } // for
    -
    139 
    -
    140  if(bNumEP < 4)
    - -
    142 
    -
    143  // Assign epInfo to epinfo pointer
    - -
    145 
    -
    146  USBTRACE2("Conf:", bConfNum);
    -
    147 
    -
    148  // Set Configuration Value
    -
    149  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    150 
    -
    151  if(rcode)
    -
    152  goto FailSetConfDescr;
    -
    153 
    -
    154  // Set up features status
    - -
    156  half_duplex(false);
    -
    157  autoflowRTS(false);
    -
    158  autoflowDSR(false);
    -
    159  autoflowXON(false);
    -
    160  wide(false); // Always false, because this is only available in custom mode.
    -
    161 
    -
    162  rcode = pAsync->OnInit(this);
    -
    163 
    -
    164  if(rcode)
    -
    165  goto FailOnInit;
    -
    166 
    -
    167  USBTRACE("XR configured\r\n");
    -
    168 
    -
    169  ready = true;
    -
    170 
    -
    171  //bPollEnable = true;
    -
    172 
    -
    173  //USBTRACE("Poll enabled\r\n");
    -
    174  return 0;
    -
    175 
    -
    176 FailGetDevDescr:
    -
    177 #ifdef DEBUG_USB_HOST
    - -
    179  goto Fail;
    -
    180 #endif
    -
    181 
    -
    182 FailSetDevTblEntry:
    -
    183 #ifdef DEBUG_USB_HOST
    - -
    185  goto Fail;
    -
    186 #endif
    -
    187 
    -
    188 FailGetConfDescr:
    -
    189 #ifdef DEBUG_USB_HOST
    - -
    191  goto Fail;
    -
    192 #endif
    -
    193 
    -
    194 FailSetConfDescr:
    -
    195 #ifdef DEBUG_USB_HOST
    - -
    197  goto Fail;
    -
    198 #endif
    -
    199 
    -
    200 FailOnInit:
    -
    201 #ifdef DEBUG_USB_HOST
    -
    202  USBTRACE("OnInit:");
    -
    203 #endif
    -
    204 
    -
    205 #ifdef DEBUG_USB_HOST
    -
    206 Fail:
    -
    207  NotifyFail(rcode);
    -
    208 #endif
    -
    209  Release();
    -
    210  return rcode;
    -
    211 }
    -
    #define USB_CLASS_COM_AND_CDC_CTRL
    Definition: UsbCore.h:71
    +Go to the documentation of this file.
    1 /* Copyright (C) 2015 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #include "cdc_XR21B1411.h"
    18 
    20 ACM(p, pasync) {
    21  // Is this needed??
    22  _enhanced_status = enhanced_features(); // Set up features
    23 }
    24 
    25 uint8_t XR21B1411::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    26  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    27 
    28  uint8_t buf[constBufSize];
    29  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    30 
    31  uint8_t rcode;
    32  UsbDevice *p = NULL;
    33  EpInfo *oldep_ptr = NULL;
    34  uint8_t num_of_conf; // number of configurations
    35 
    36  AddressPool &addrPool = pUsb->GetAddressPool();
    37 
    38  USBTRACE("XR Init\r\n");
    39 
    40  if(bAddress)
    42 
    43  // Get pointer to pseudo device with address 0 assigned
    44  p = addrPool.GetUsbDevicePtr(0);
    45 
    46  if(!p)
    48 
    49  if(!p->epinfo) {
    50  USBTRACE("epinfo\r\n");
    52  }
    53 
    54  // Save old pointer to EP_RECORD of address 0
    55  oldep_ptr = p->epinfo;
    56 
    57  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    58  p->epinfo = epInfo;
    59 
    60  p->lowspeed = lowspeed;
    61 
    62  // Get device descriptor
    63  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf);
    64 
    65  // Restore p->epinfo
    66  p->epinfo = oldep_ptr;
    67 
    68  if(rcode)
    69  goto FailGetDevDescr;
    70 
    71  // Allocate new address according to device class
    72  bAddress = addrPool.AllocAddress(parent, false, port);
    73 
    74  if(!bAddress)
    76 
    77  // Extract Max Packet Size from the device descriptor
    79 
    80  // Assign new address to the device
    81  rcode = pUsb->setAddr(0, 0, bAddress);
    82 
    83  if(rcode) {
    84  p->lowspeed = false;
    85  addrPool.FreeAddress(bAddress);
    86  bAddress = 0;
    87  USBTRACE2("setAddr:", rcode);
    88  return rcode;
    89  }
    90 
    91  USBTRACE2("Addr:", bAddress);
    92 
    93  p->lowspeed = false;
    94 
    95  p = addrPool.GetUsbDevicePtr(bAddress);
    96 
    97  if(!p)
    99 
    100  p->lowspeed = lowspeed;
    101 
    102  num_of_conf = udd->bNumConfigurations;
    103 
    104  if((((udd->idVendor != 0x2890U) || (udd->idProduct != 0x0201U)) && ((udd->idVendor != 0x04e2U) || (udd->idProduct != 0x1411U))))
    106 
    107  // Assign epInfo to epinfo pointer
    108  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    109 
    110  if(rcode)
    111  goto FailSetDevTblEntry;
    112 
    113  USBTRACE2("NC:", num_of_conf);
    114 
    115  for(uint8_t i = 0; i < num_of_conf; i++) {
    121  CP_MASK_COMPARE_PROTOCOL > CdcControlParser(this);
    122 
    124  CP_MASK_COMPARE_CLASS> CdcDataParser(this);
    125 
    126  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcControlParser);
    127 
    128  if(rcode)
    129  goto FailGetConfDescr;
    130 
    131  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcDataParser);
    132 
    133  if(rcode)
    134  goto FailGetConfDescr;
    135 
    136  if(bNumEP > 1)
    137  break;
    138  } // for
    139 
    140  if(bNumEP < 4)
    142 
    143  // Assign epInfo to epinfo pointer
    145 
    146  USBTRACE2("Conf:", bConfNum);
    147 
    148  // Set Configuration Value
    149  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    150 
    151  if(rcode)
    152  goto FailSetConfDescr;
    153 
    154  // Set up features status
    156  half_duplex(false);
    157  autoflowRTS(false);
    158  autoflowDSR(false);
    159  autoflowXON(false);
    160  wide(false); // Always false, because this is only available in custom mode.
    161 
    162  rcode = pAsync->OnInit(this);
    163 
    164  if(rcode)
    165  goto FailOnInit;
    166 
    167  USBTRACE("XR configured\r\n");
    168 
    169  ready = true;
    170 
    171  //bPollEnable = true;
    172 
    173  //USBTRACE("Poll enabled\r\n");
    174  return 0;
    175 
    176 FailGetDevDescr:
    177 #ifdef DEBUG_USB_HOST
    179  goto Fail;
    180 #endif
    181 
    182 FailSetDevTblEntry:
    183 #ifdef DEBUG_USB_HOST
    185  goto Fail;
    186 #endif
    187 
    188 FailGetConfDescr:
    189 #ifdef DEBUG_USB_HOST
    191  goto Fail;
    192 #endif
    193 
    194 FailSetConfDescr:
    195 #ifdef DEBUG_USB_HOST
    197  goto Fail;
    198 #endif
    199 
    200 FailOnInit:
    201 #ifdef DEBUG_USB_HOST
    202  USBTRACE("OnInit:");
    203 #endif
    204 
    205 #ifdef DEBUG_USB_HOST
    206 Fail:
    207  NotifyFail(rcode);
    208 #endif
    209  Release();
    210  return rcode;
    211 }
    #define USB_CLASS_COM_AND_CDC_CTRL
    Definition: UsbCore.h:71
    #define USB_CLASS_CDC_DATA
    Definition: UsbCore.h:78
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    @@ -363,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/cdc___x_r21_b1411_8h.html b/cdc___x_r21_b1411_8h.html index 2a396f29..0011869d 100644 --- a/cdc___x_r21_b1411_8h.html +++ b/cdc___x_r21_b1411_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdc_XR21B1411.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,20 +89,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdc_XR21B1411.h File Reference
    -
    #include "cdcacm.h"
    +
    #include "cdcacm.h"
    Include dependency graph for cdc_XR21B1411.h:
    - + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -1016,7 +1020,7 @@ Macros diff --git a/cdc___x_r21_b1411_8h__dep__incl.map b/cdc___x_r21_b1411_8h__dep__incl.map index e6c04a61..392b1227 100644 --- a/cdc___x_r21_b1411_8h__dep__incl.map +++ b/cdc___x_r21_b1411_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/cdc___x_r21_b1411_8h__dep__incl.md5 b/cdc___x_r21_b1411_8h__dep__incl.md5 index 5ec00050..d1f48836 100644 --- a/cdc___x_r21_b1411_8h__dep__incl.md5 +++ b/cdc___x_r21_b1411_8h__dep__incl.md5 @@ -1 +1 @@ -7b6d944e95130fac53f28b98c412ca07 \ No newline at end of file +250b78e5b50dfc5c4569c99531678ec3 \ No newline at end of file diff --git a/cdc___x_r21_b1411_8h__dep__incl.png b/cdc___x_r21_b1411_8h__dep__incl.png index 12a1b7312ef01c8a5236dde822fc694f4cc1f4eb..9fed7616c5d65635b8e09ae99ad09902d6687cfd 100644 GIT binary patch literal 3046 zcmb_ei93{Q8-FQF8Yx>t6B4NzYbMcHGS(!@mSrprGGwx5i7d&MhGXBFCQBrH2w5g( zj2v5$WXLurWMqlP&i9_qxvuZ~1HSvc-uHR0>$#r$dG6=F@89nif8E4@mq(Nb007=A zhPr0pm}ie-QD;0yf7xmp;Iq z28x=k-K8y~_zT=asoXi8&>PcR+M7;Pqx^@|vxd47`T{~7nR3%cw~~2$dQ%oeIe4(| z^-H-e`Kme=OeQ;oK@XA#alRheynx_-{o==n1?^uhw z;p^+`?X3t*t}r^KrKNxT_@OSQASsDm8gB{JBrQud;gF)|CETfs#u7(m?cXAmlze7- zvLW`|oLpS%3nQyDy(j26t38Mh=3SatXGuxPC1OQUQ4H?$r%(R={xDVV2%HB}l%T)L ztR%<8#5~go$xwV{0nauLV9*HNnF<1S2VIcu6D-+BEk#8$#iTGE2t@tCRxL#yh?t(9 zo}0tbud__rSa{TlVs~{Vr5hNGY-*PZo^D}fr4Q}B?dRa&;P1aS)0=zM$S8}5UtzKO zdU~3JR;CkyU<-LSR}`uW!tFE6iGe5C%&E|>c)&v1Lo6ux7}jGDTaA@_OLdW(+M@JtzbZD^H)D7GfwBX=i_Q>aDWyX2e zF%8~rHp#@IYTI&6@OrFeIRPmd83Ee-yhkHO3<~82zL3Mi(P;Ll8jbw?d<(cxET!5u zG^G~|>fuB7QU?tU4XwS60*riMmf8i`q|WaCem9nvrzZ>s!!!kyQ{Fr3+S=xj$y&hW zGpY71_lM%a-Bw2Hz1;er;a$NLN+!nzUDGgPdh*rT5*Q65o~dikRBO@O_e!R028jWt7bhNh4%E@_r3);P7 zgXV?+%Pf{kwz0{R1tcLFJq4CT`ApBdcklN0_SF1l0KlQ;e#e6GRY%8(Z{QrJA%YQP zWMqWHz0{RFm4tTvnZ3UaHpq!#b5C!2&K*h&@8;&_?(Qy_8lx8}iu!tbLV|)&f_}kAL!ya05wDbO zoSmHwR<&fZp{#ImVc}Et-~pDhydcjDvvbuuRwWjCdU|SVYL0M4zzIB4Z7ott>e0wG z9k!jON}Y-kL0`IRMwd%LK>^nh81%%6(Q0R|TVt&cLbSED!Cb{slDk~4UAqS9d-K=K zjJ#uO=+G-mUB6%RL#EHvySlqkp&M1{voyj91^c&P2N!`Q%??a67+pFSy~fvm{o+V_ z$gg0CH$)|MrW(C4ND`CYrZcg8vBgdzosCtyyBpMafw}sQ5`7mJsoaUA;x#eu_H)MR zEyi@jprB)SD8g8Xko+{2E2ngd%N?R+_z#YZUbtys&{;SWnWgJ3T(!UJ^k>wegC`os zfWYD@SOey+y**K9)B1;>Hf4#-toOV@>)gL7KQX6qkG1NB<*yxd4EvxasPe+BE2MQmoKNPfs9|$pI+l%G@3Q zl$aRi8>lbeZjKZa+4P@H?DO0U6;a9V85(-_6aT>+X;nJIy zw555kwfio%-OO%OO;K^0mWGKjz^N-Ln%x}6tJuBNhjDq_%WX3Al@`nMv9v^#+rRi3 z_nm$kDX-vFYh6~qDl6PA9=_HZrZJb1hB>q&y1zN=WIni$tM^ocE!0muYtWQFet=9H zuDm!pnsPB$4sIEBXVB+>`M0o&F6YotwA6HJZ*sEf_&Das>}qVtmj4D~(uRy;1E|xr z`S}fVbNdabW5aCw7{cX$(E1PB@_!lOe-Z!!`TuQ-FJh~|j5$BwfO)?k_%NxT{YdQW zqU@PWuu@-@?O(4YlP5e?l+~?aO22NL737SH^vDyb>w9nz)!y;a0**NRR_r&ifag)R z5p{;nd^t45|3Ni|RFc0^Vc*0rAW)J464V(fDFCP?Pi%w zgm6OO()jM;SJZ2Tk!aCBkoSXwIXE~vXf!jj^M`;_ilPMmc&Y;u;TEI1h<$}Cvw(}M z2YLUXU&s#z8zGiY9G-5JeS5{V@Jb}dPN*?9zBWamJ zubmleeXzZ=yX)4Qb8m4>?fj8)WjP{|2zIF{3546V5<{u^`FTmE-WG(HcXMlt&N?Y7 zI=#ASrC+*^9fCojRlKg-EYzh-Xf#^iz`z~hT#13W7Rqr05-612S;4LCZ5bJvT;nsh zQ3sTMn??8V6UM^A!WQU^P6shId60;aUs_!J>`_M`5J0-e1{AqYwMWnPlVr?#dV4`S zsPhfl-`j2Un=Lde!B2q8q_1XF^-N%^o5OZ5ArJ_4^|8FwwkR%B;-zm42IYK%&Vo?k z+qZ8U8*NI50`A>&b#+y%4QI1xvq@xZuFlri)!B&XpwaZv(fDETCS72*Zk!o%cEZPw zY1dt^5sKICCu!Bs4~&h095FU9fOX|kVPrifkw_-R&WpaYeZ=Ku?}QF)NZjX%yp#3j zM*+Y_gJ^P`pTFJH?OgyYoIumm)C92)qCelG&-6?J`Mm14A#PUe5G4WCL_1mG76-D& z&@1L}r8y`yawaDyx7U|O^=pQ*LU%z@FEB^~%PgZY!2(`hSy`+>b#kd<1n{r}&#n49 zJ7Y)sBK(jJRZeWHs-M66{~drW7)=M($IGkIq4Ib_2be^Xd12wF;o;+gf=DD%7YWJ) zDs~0*i#u>0_hhuOR+;a?=yYf_t(GG%ahSylp!*otDNn)(Zm#Nhsfx+L2>^I~ABh8{ zl<%A)%gf8NfqEA=UJ8eY?}O5*#bH126tuGxFUr~xS%7e`g_o0dcXm=zQfM?<)(^-R zkDVkp-n8`eE|>H4pQp|UK?=g>qBKwk?CS4w0N1_Pv)~~Taa|PNK-P!F)x0j}pWab4 zLle7&A?mq0wBLolmF&N`m1pC3%(3d|#92OZO-!S&^w7^FADEa}D}GdExag7hc`)U* qZ*|5Q&q}^WK4<>c!2hn?)Y^YkpLUY7EFKi@z!g0c-3qkR!~XyU&gR1a literal 4015 zcmcInc{G&&zkjsJzC@M?BPshb#vWfyijl3cR@N-ZNFfYTA`~LVHnuU9#K@i{TWI)d zWE+e%L|L=b*zU(Y_ndov_y2q5%sl5jGv_^@^LoFwC)(8bDjTyPGXz0w2G@}0;ED%t z?~^CMC)4B+3b>qbLS02d2Zyhmy1YaP;<#gg{0AM7u{auJbi+-AaamrLndf)}?PBhQ zuoktnm(eLDgqDD4uTGuw9z3HXNd53T7d%Few+<_zpLa%;DIq9`;*HLN2O9Dp1s{BV z_|j@FoFK{x>oc=u*{ciX7Yv#xx4=SMJLj&e{ZenpOPW5v(865eb3S^5@eaz*V5K5xi=ukdRA+2LNM=3G9LeOa?&YA zNWEvasl=)y`jjN+sZ&!m#SD#Y3E~N_Ur%}p1hr=9gpSP$UUL24scN1^@Y__Zu#+}zx6XM5jWZ(g15AXpaIyKbLP-fKA6 z-?46ZtSu-gsPX0?j+2)+B9cSo1w8`{l$VCXd06=5S~@c|SH9~UKu~&mdVE$^TDe$vpO1ID^l-p;-h^5fSpMjaiUV<%3)b9&m5lCI*alDxOGvm-7e!&*{OQuSytJ%7}$uF0X1 zzA;ardQkdVsI>XAGWC!wiU5g3+Wz}1`@vk_#ors)m@}&EOiWC_sRev7`r;3Ld=gSp zBI$JOF-AuG<1-O+3y&`^Em@bjvQ17+bvJ~DW@rU+2W>7qt*u@DB!x4aSXyGgfB!zD zi$byN@2;5yZ;kr%!`(R{hxXSJ)+J8Ip&u(#*(4+ zn+`2eTvb6^MKmly!;OqKHGN`HVEGTR+hOc;pmnjs)60JH|Grhmo9DNH-ITa=oPLv+ zM=UMnW@HzFp!aC0pFe+!A`qu{w*Fi-GGbLyR$lB^ciLW_NY(V0<6%C2TGlq4a5>Tz zL+qXH8X1Y1nQ`qK7;ql14@p&WVaBfiW`N?aof~WjZJ<$KfBB-v%C7)H3f@0-&q+u) zg7YKDUHuJ~1y@{LB*3(HMrlqSd>w6(SA+S&?gX=w>zi}+Ohmu|J)QTn{rsR=!iG|6ftlgTdMfAtho z`}#x`6uQcVczD8dazr8B+qZ@F^z^<}-e*ZM%@psNB1 z09zr#;NyU}v^2~3;~m*Yi$gAzqqH)>WBi5@#|@S-E%Oc9P41;ahG41B30wPvbvk zX8OHGpR=7&xId=VHvJH;s(Lg4fdV?|EgUx6-P>c(_0|$@e_Lw?P|(7zx0M%K7F@4w z-rw7q8mkL(9ZpF}877tG)z_cZ^j|{Wx+V0bxw#}@#mRHH^13(Q#KgqY+1@FA{)u_B_J69AFiU}2zX{);lT^G z^6e2hF1Uw4ATZe3*+E%#G}C-^e8=>oqd-YEWz+B9UnsL#y)q57-1ElZovLnT(_6=z z#SRR<8p5v=6A8Vu3XgXKWNucnLJC2fp8TvQ4v)97vB8h<`TJje_)rO`mPG|K6Geg#H+8C`iiU7*9I)QySv{P6imJ1S43X9A|@%x z2yVnBFWXxwu2lJ|&M|KmWoneZbj~CWN5nSwg{*ibML%!;ifsO$pitX8LHO{2S<*Pe zyVZKIATA?5DG3SfQ#t(ob>@2Auz9bDWg_PJNpiPqei{Wo%&ZA(d{S|bLrin0K`mH~ zVe0GgVR;A4HglM=t!<22a1{v2?d1cFK=>#}B!!7jZsfWC+JdsH6xENPm6WNKyA;tp z6Mi|e=&}^<2vlyX-I?7m+Acn4r{>Ath7b8t}~)lo(>lJa|I*jj7u<~=CnJM)dL zY}6I?k}J;`mz!@e9!>o3-Z9M;(inM9UE5ohbw zJRfOc`=WMt8@k3KPQ${?|K_z3=d!?UAsxG8`Q>{l?e6Dzc+fdDHS@cgg+(u#T_X)Q zbb6~RHaQu{uhxqCvb?rbPdX)Dd%|!u_`=M&v!T6Bfd=5!rP0R4A zs%%pW+!*chtk?Dp5hE=j#CbvXGpE=hWB+44hdF+jxc{GDYbE=O3M<{YmN%|eA+2+c zTOcrib!q*9?*?FMDV2gD?dN#~2C82=*!3|=RcI=WR*duWA#2J`W z(b-c$SA?|!x@NHdw=d*AzfQ7jrmV7;7+;W)39qfKr84~PCSL6>b2CXwPCf#SjEsCc z3q%+d6{Txt){Tm7h;=ytDSyS+7d|&P2g-t##iw-I7f#LAMa3cJ7@#){xhb%O{eRTEHy18`}*J7 zWCb48RaaL}F3?2U*a*-94D&!zW2a(OFCY-fQBjkVlkVSA71!5iZ}cLd_l1Su3X9&o zdk&dizaD#cbbYq>F0c{bolT5+0TqrJf~PCHv2$^$AP_ykT<;!sDCbJ*0f^Lg&_T*& z&?d+?y|afCEki({&6gFVD!awa`UM*=p(viRva;6<44Qs4J?s8xuOnky-Ugp4udIa0 z%Ca>_a$Nm0R>#G~^%O*4t>5PQ0__xyMr-@`-!I9sHA*BK&uC-UISc2ziHz9I z1t$A(H&tzAepWSLR^~TuaGgH=+_Cw&n2HK-o^j?8sIR|2Hz%iYLI5d+)00cVCofVz z+SLgr-s{&S6)s7wgdxR=V7%F*ihH}Mi@r;i_&9nCsz~-MNAOCYHnb_ zgiB8Dsd_NwKK(Bai7XG)c3%?-US=?O zYi?WRO|a1Pyj3s{D%pltuU=gyT$Gp3Yi!i* zwZ6rLAPjsWRla%C(wCK(cv(zLEDY1>Z7>MRdVYC%pDR8kg^!n)H;p7MBXjN$7f_3I z{?h3^5iERdy}gNXLh4TaUVo2zdU)jWN?UequS}8XbP#;*KN_E|w@YT5VlX6&pdiPx zg;3DO;qG0cN`kRr8}}Rb5Q~E)&G7k3%4?0x&ZRYt9{qE>K6eW+US0^2w4B^|6BCmr zgj?0mR9R8c#)YtZW@cOn%+N82U+K=t7cVJ)stRf-nTwWtpj+V9K=l7J20a1xF!fTtK7jD6vNd7g6HwFo#%QfS7boWr(_vIej7UZ*&D`Alf|gc> zAqoY+N`k>)?z25_k;tTkgnu4ZX8>&Us8p)&>Q4h^cJ}iCJw4E+>$b*%;14E|9vF-S zEH}?2+dLpZjgqZ1z7SMAqGEwYb3#4ta3r#?t4miYE#~pwh7}0jWZG2VBE{3H=oVpa z&f`N-(YqHfm~BCkW)pi6mQ4)MIB`T?jKu%CyMQ@6gp9v-?MjNRQ<`+aq_O)*7aF@iEzIqK!*)z;qr zkFT#U*(kFRWmZ51{&}2Mb+gtKsG&3wkKft#sK=;LFz4(T#7iTp0ky4jkRX~k!j9rTEp+nh|Bc(kN*9s)~Z&vwl6>fDp>Qh z{G*@v`n9Qz&Bd{{L1{@PrJk893UNID&z?O diff --git a/cdc___x_r21_b1411_8h__incl.map b/cdc___x_r21_b1411_8h__incl.map index fdb92b45..d6f9b68d 100644 --- a/cdc___x_r21_b1411_8h__incl.map +++ b/cdc___x_r21_b1411_8h__incl.map @@ -1,4 +1,4 @@ - - + + diff --git a/cdc___x_r21_b1411_8h__incl.md5 b/cdc___x_r21_b1411_8h__incl.md5 index ecda9e28..8ab25f05 100644 --- a/cdc___x_r21_b1411_8h__incl.md5 +++ b/cdc___x_r21_b1411_8h__incl.md5 @@ -1 +1 @@ -4731940ab085839886908f5c8f5a124c \ No newline at end of file +ab5d3dff2680fe378e5afcfe3049b74b \ No newline at end of file diff --git a/cdc___x_r21_b1411_8h__incl.png b/cdc___x_r21_b1411_8h__incl.png index b350bf949af50ecd9269dae25784b7bbf4669365..a99ae5d381e976202bff7fb842d909f68d17cbbe 100644 GIT binary patch literal 3975 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 F{|82?gk1mt literal 4444 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 diff --git a/cdc___x_r21_b1411_8h_source.html b/cdc___x_r21_b1411_8h_source.html index 94becee6..e8acb852 100644 --- a/cdc___x_r21_b1411_8h_source.html +++ b/cdc___x_r21_b1411_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdc_XR21B1411.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,271 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdc_XR21B1411.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2015 Andrew J. Kroll
    -
    2  and
    -
    3  Circuits At Home, LTD. All rights reserved.
    -
    4 
    -
    5 This software may be distributed and modified under the terms of the GNU
    -
    6 General Public License version 2 (GPL2) as published by the Free Software
    -
    7 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    8 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    9 on this software must also be made publicly available under the terms of
    -
    10 the GPL2 ("Copyleft").
    -
    11 
    -
    12 Contact information
    -
    13 -------------------
    -
    14 
    -
    15 Circuits At Home, LTD
    -
    16 Web : http://www.circuitsathome.com
    -
    17 e-mail : support@circuitsathome.com
    -
    18  */
    -
    19 #if !defined(__CDC_XR21B1411_H__)
    -
    20 #define __CDC_XR21B1411_H__
    -
    21 
    -
    22 #include "cdcacm.h"
    -
    23 
    -
    24 #define XR_REG_CUSTOM_DRIVER (0x020DU) // DRIVER SELECT
    -
    25 #define XR_REG_CUSTOM_DRIVER_ACTIVE (0x0001U) // 0: CDC 1: CUSTOM
    -
    26 
    -
    27 #define XR_REG_ACM_FLOW_CTL (0x0216U) // FLOW CONTROL REGISTER CDCACM MODE
    -
    28 #define XR_REG_FLOW_CTL (0x0C06U) // FLOW CONTROL REGISTER CUSTOM MODE
    -
    29 #define XR_REG_FLOW_CTL_HALF_DPLX (0x0008U) // 0:FULL DUPLEX 1:HALF DUPLEX
    -
    30 #define XR_REG_FLOW_CTL_MODE_MASK (0x0007U) // MODE BITMASK
    -
    31 #define XR_REG_FLOW_CTL_NONE (0x0000U) // NO FLOW CONTROL
    -
    32 #define XR_REG_FLOW_CTL_HW (0x0001U) // HARDWARE FLOW CONTROL
    -
    33 #define XR_REG_FLOW_CTL_SW (0x0002U) // SOFTWARE FLOW CONTROL
    -
    34 #define XR_REG_FLOW_CTL_MMMRX (0x0003U) // MULTIDROP RX UPON ADDRESS MATCH
    -
    35 #define XR_REG_FLOW_CTL_MMMRXTX (0x0004U) // MULTIDROP RX/TX UPON ADDRESS MATCH
    -
    36 
    -
    37 #define XR_REG_ACM_GPIO_MODE (0x0217U) // GPIO MODE REGISTER IN CDCACM MODE
    -
    38 #define XR_REG_GPIO_MODE (0x0C0CU) // GPIO MODE REGISTER IN CUSTOM MODE
    -
    39 #define XR_REG_GPIO_MODE_GPIO (0x0000U) // ALL GPIO PINS ACM PROGRAMMABLE
    -
    40 #define XR_REG_GPIO_MODE_FC_RTSCTS (0x0001U) // AUTO RTSCTS HW FC (GPIO 4/5)
    -
    41 #define XR_REG_GPIO_MODE_FC_DTRDSR (0x0002U) // AUTO DTRDSR HW FC (GPIO 2/3)
    -
    42 #define XR_REG_GPIO_MODE_ATE (0x0003U) // AUTO TRANSCEIVER ENABLE DURING TX (GPIO 5)
    -
    43 #define XR_REG_GPIO_MODE_ATE_ADDRESS (0x0004U) // AUTO TRANSCEIVER ENABLE ON ADDRESS MATCH (GPIO 5)
    -
    44 
    -
    45 #define XR_REG_ACM_GPIO_DIR (0x0218U) // GPIO DIRECTION REGISTER CDCACM MODE, 0:IN 1:OUT
    -
    46 #define XR_REG_GPIO_DIR (0x0C0DU) // GPIO DIRECTION REGISTER CUSTOM MODE, 0:IN 1:OUT
    -
    47 
    -
    48 #define XR_REG_ACM_GPIO_INT (0x0219U) // GPIO PIN CHANGE INTERRUPT ENABLE CDCACM MODE, 0: ENABLED 1: DISABLED
    -
    49 #define XR_REG_GPIO_INT (0x0C11U) // GPIO PIN CHANGE INTERRUPT ENABLE CUSTOM MODE, 0: ENABLED 1: DISABLED
    -
    50 #define XR_REG_GPIO_MASK (0x001FU) // GPIO REGISTERS BITMASK
    -
    51 
    -
    52 #define XR_REG_UART_ENABLE (0x0C00U) // UART I/O ENABLE REGISTER
    -
    53 #define XR_REG_UART_ENABLE_RX (0x0002U) // 0:DISABLED 1:ENABLED
    -
    54 #define XR_REG_UART_ENABLE_TX (0x0001U) // 0:DISABLED 1:ENABLED
    -
    55 
    -
    56 #define XR_REG_ERROR_STATUS (0x0C09U) // ERROR STATUS REGISTER
    -
    57 #define XR_REG_ERROR_STATUS_MASK (0x00F8U) // ERROR STATUS BITMASK
    -
    58 #define XR_REG_ERROR_STATUS_ERROR (0x0070U) // ERROR STATUS ERROR BITMASK
    -
    59 #define XR_REG_ERROR_STATUS_BREAK (0x0008U) // BREAK HAS BEEN DETECTED
    -
    60 #define XR_REG_ERROR_STATUS_OVERRUN (0x0010U) // RX OVERRUN ERROR
    -
    61 #define XR_REG_ERROR_STATUS_PARITY (0x0020U) // PARITY ERROR
    -
    62 #define XR_REG_ERROR_STATUS_FRAME (0x0040U) // FRAMING ERROR
    -
    63 #define XR_REG_ERROR_STATUS_BREAKING (0x0080U) // BREAK IS BEING DETECTED
    -
    64 
    -
    65 #define XR_REG_TX_BREAK (0x0C0AU) // TRANSMIT BREAK. 0X0001-0XFFE TIME IN MS, 0X0000 STOP, 0X0FFF BREAK ON
    -
    66 
    -
    67 #define XR_REG_XCVR_EN_DELAY (0x0C0BU) // TURN-ARROUND DELAY IN BIT-TIMES 0X0000-0X000F
    -
    68 
    -
    69 #define XR_REG_GPIO_SET (0x0C0EU) // 1:SET GPIO PIN
    -
    70 
    -
    71 #define XR_REG_GPIO_CLR (0x0C0FU) // 1:CLEAR GPIO PIN
    -
    72 
    -
    73 #define XR_REG_GPIO_STATUS (0x0C10U) // READ GPIO PINS
    -
    74 
    -
    75 #define XR_REG_CUSTOMISED_INT (0x0C12U) // 0:STANDARD 1:CUSTOM SEE DATA SHEET
    -
    76 
    -
    77 #define XR_REG_PIN_PULLUP_ENABLE (0x0C14U) // 0:DISABLE 1:ENABLE, BITS 0-5:GPIO, 6:RX 7:TX
    -
    78 
    -
    79 #define XR_REG_PIN_PULLDOWN_ENABLE (0x0C15U) // 0:DISABLE 1:ENABLE, BITS 0-5:GPIO, 6:RX 7:TX
    -
    80 
    -
    81 #define XR_REG_LOOPBACK (0x0C16U) // 0:DISABLE 1:ENABLE, SEE DATA SHEET
    -
    82 
    -
    83 #define XR_REG_RX_FIFO_LATENCY (0x0CC2U) // FIFO LATENCY REGISTER
    -
    84 #define XR_REG_RX_FIFO_LATENCY_ENABLE (0x0001U) //
    -
    85 
    -
    86 #define XR_REG_WIDE_MODE (0x0D02U)
    -
    87 #define XR_REG_WIDE_MODE_ENABLE (0x0001U)
    -
    88 
    -
    89 #define XR_REG_XON_CHAR (0x0C07U)
    -
    90 #define XR_REG_XOFF_CHAR (0x0C08U)
    -
    91 
    -
    92 #define XR_REG_TX_FIFO_RESET (0x0C80U) // 1: RESET, SELF-CLEARING
    -
    93 #define XR_REG_TX_FIFO_COUNT (0x0C81U) // READ-ONLY
    -
    94 #define XR_REG_RX_FIFO_RESET (0x0CC0U) // 1: RESET, SELF-CLEARING
    -
    95 #define XR_REG_RX_FIFO_COUNT (0x0CC1U) // READ-ONLY
    -
    96 
    -
    97 #define XR_WRITE_REQUEST_TYPE (0x40U)
    -
    98 
    -
    99 #define XR_READ_REQUEST_TYPE (0xC0U)
    -
    100 
    -
    101 #define XR_MAX_ENDPOINTS 4
    -
    102 
    -
    103 class XR21B1411 : public ACM {
    -
    104 protected:
    -
    105 
    -
    106 public:
    -
    107  XR21B1411(USB *pusb, CDCAsyncOper *pasync);
    -
    108 
    -
    115  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    116  return (((vid == 0x2890U) && (pid == 0x0201U)) || ((vid == 0x04e2U) && (pid == 0x1411U)));
    -
    117  };
    -
    118 
    -
    119  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    120 
    - -
    122  tty_features rv;
    -
    123  rv.enhanced = true;
    -
    124  rv.autoflow_RTS = true;
    -
    125  rv.autoflow_DSR = true;
    -
    126  rv.autoflow_XON = true;
    -
    127  rv.half_duplex = true;
    -
    128  rv.wide = true;
    -
    129  return rv;
    -
    130  };
    -
    131 
    -
    132  uint8_t read_register(uint16_t reg, uint16_t *val) {
    -
    133  return (pUsb->ctrlReq(bAddress, 0, XR_READ_REQUEST_TYPE, 1, 0, 0, reg, 2, 2, (uint8_t *)val, NULL));
    -
    134  }
    -
    135 
    -
    136  uint8_t write_register(uint16_t reg, uint16_t val) {
    -
    137  return (pUsb->ctrlReq(bAddress, 0, XR_WRITE_REQUEST_TYPE, 0, BGRAB0(val), BGRAB1(val), reg, 0, 0, NULL, NULL));
    -
    138  }
    -
    139 
    -
    140 
    -
    142  // The following methods set the CDC-ACM defaults.
    -
    144 
    -
    145  virtual void autoflowRTS(bool s) {
    -
    146  uint16_t val;
    -
    147  uint8_t rval;
    -
    148  rval = read_register(XR_REG_ACM_FLOW_CTL, &val);
    -
    149  if(!rval) {
    -
    150  if(s) {
    - -
    152  val |= XR_REG_FLOW_CTL_HW;
    -
    153  } else {
    - -
    155  }
    -
    156  rval = write_register(XR_REG_ACM_FLOW_CTL, val);
    -
    157  if(!rval) {
    - -
    159  if(!rval) {
    -
    160  // ACM commands apply the new settings.
    -
    161  LINE_CODING LCT;
    -
    162  rval = GetLineCoding(&LCT);
    -
    163  if(!rval) {
    -
    164  rval = SetLineCoding(&LCT);
    -
    165  if(!rval) {
    - - - -
    169  }
    -
    170  }
    -
    171  }
    -
    172  }
    -
    173  }
    -
    174  };
    -
    175 
    -
    176  virtual void autoflowDSR(bool s) {
    -
    177  uint16_t val;
    -
    178  uint8_t rval;
    -
    179  rval = read_register(XR_REG_ACM_FLOW_CTL, &val);
    -
    180  if(!rval) {
    -
    181  if(s) {
    - -
    183  val |= XR_REG_FLOW_CTL_HW;
    -
    184  } else {
    - -
    186  }
    -
    187  rval = write_register(XR_REG_ACM_FLOW_CTL, val);
    -
    188  if(!rval) {
    -
    189  if(s) {
    - -
    191  } else {
    - -
    193  }
    -
    194  if(!rval) {
    -
    195  // ACM commands apply the new settings.
    -
    196  LINE_CODING LCT;
    -
    197  rval = GetLineCoding(&LCT);
    -
    198  if(!rval) {
    -
    199  rval = SetLineCoding(&LCT);
    -
    200  if(!rval) {
    - - - -
    204  }
    -
    205  }
    -
    206  }
    -
    207  }
    -
    208  }
    -
    209  };
    -
    210 
    -
    211  virtual void autoflowXON(bool s) {
    -
    212  // NOTE: hardware defaults to the normal XON/XOFF
    -
    213  uint16_t val;
    -
    214  uint8_t rval;
    -
    215  rval = read_register(XR_REG_ACM_FLOW_CTL, &val);
    -
    216  if(!rval) {
    -
    217  if(s) {
    - -
    219  val |= XR_REG_FLOW_CTL_SW;
    -
    220  } else {
    - -
    222  }
    -
    223  rval = write_register(XR_REG_ACM_FLOW_CTL, val);
    -
    224  if(!rval) {
    - -
    226  if(!rval) {
    -
    227  // ACM commands apply the new settings.
    -
    228  LINE_CODING LCT;
    -
    229  rval = GetLineCoding(&LCT);
    -
    230  if(!rval) {
    -
    231  rval = SetLineCoding(&LCT);
    -
    232  if(!rval) {
    - - - -
    236  }
    -
    237  }
    -
    238  }
    -
    239  }
    -
    240  }
    -
    241  };
    -
    242 
    -
    243  virtual void half_duplex(bool s) {
    -
    244  uint16_t val;
    -
    245  uint8_t rval;
    -
    246  rval = read_register(XR_REG_ACM_FLOW_CTL, &val);
    -
    247  if(!rval) {
    -
    248  if(s) {
    - -
    250  } else {
    - -
    252  }
    -
    253  rval = write_register(XR_REG_ACM_FLOW_CTL, val);
    -
    254  if(!rval) {
    -
    255  // ACM commands apply the new settings.
    -
    256  LINE_CODING LCT;
    -
    257  rval = GetLineCoding(&LCT);
    -
    258  if(!rval) {
    -
    259  rval = SetLineCoding(&LCT);
    -
    260  if(!rval) {
    - -
    262  }
    -
    263  }
    -
    264  }
    -
    265  }
    -
    266  };
    -
    267 
    -
    268 
    -
    269 
    -
    270 };
    -
    271 
    -
    272 #endif // __CDCPROLIFIC_H__
    -
    virtual void autoflowRTS(bool s)
    +Go to the documentation of this file.
    1 /* Copyright (C) 2015 Andrew J. Kroll
    2  and
    3  Circuits At Home, LTD. All rights reserved.
    4 
    5 This software may be distributed and modified under the terms of the GNU
    6 General Public License version 2 (GPL2) as published by the Free Software
    7 Foundation and appearing in the file GPL2.TXT included in the packaging of
    8 this file. Please note that GPL2 Section 2[b] requires that all works based
    9 on this software must also be made publicly available under the terms of
    10 the GPL2 ("Copyleft").
    11 
    12 Contact information
    13 -------------------
    14 
    15 Circuits At Home, LTD
    16 Web : http://www.circuitsathome.com
    17 e-mail : support@circuitsathome.com
    18  */
    19 #if !defined(__CDC_XR21B1411_H__)
    20 #define __CDC_XR21B1411_H__
    21 
    22 #include "cdcacm.h"
    23 
    24 #define XR_REG_CUSTOM_DRIVER (0x020DU) // DRIVER SELECT
    25 #define XR_REG_CUSTOM_DRIVER_ACTIVE (0x0001U) // 0: CDC 1: CUSTOM
    26 
    27 #define XR_REG_ACM_FLOW_CTL (0x0216U) // FLOW CONTROL REGISTER CDCACM MODE
    28 #define XR_REG_FLOW_CTL (0x0C06U) // FLOW CONTROL REGISTER CUSTOM MODE
    29 #define XR_REG_FLOW_CTL_HALF_DPLX (0x0008U) // 0:FULL DUPLEX 1:HALF DUPLEX
    30 #define XR_REG_FLOW_CTL_MODE_MASK (0x0007U) // MODE BITMASK
    31 #define XR_REG_FLOW_CTL_NONE (0x0000U) // NO FLOW CONTROL
    32 #define XR_REG_FLOW_CTL_HW (0x0001U) // HARDWARE FLOW CONTROL
    33 #define XR_REG_FLOW_CTL_SW (0x0002U) // SOFTWARE FLOW CONTROL
    34 #define XR_REG_FLOW_CTL_MMMRX (0x0003U) // MULTIDROP RX UPON ADDRESS MATCH
    35 #define XR_REG_FLOW_CTL_MMMRXTX (0x0004U) // MULTIDROP RX/TX UPON ADDRESS MATCH
    36 
    37 #define XR_REG_ACM_GPIO_MODE (0x0217U) // GPIO MODE REGISTER IN CDCACM MODE
    38 #define XR_REG_GPIO_MODE (0x0C0CU) // GPIO MODE REGISTER IN CUSTOM MODE
    39 #define XR_REG_GPIO_MODE_GPIO (0x0000U) // ALL GPIO PINS ACM PROGRAMMABLE
    40 #define XR_REG_GPIO_MODE_FC_RTSCTS (0x0001U) // AUTO RTSCTS HW FC (GPIO 4/5)
    41 #define XR_REG_GPIO_MODE_FC_DTRDSR (0x0002U) // AUTO DTRDSR HW FC (GPIO 2/3)
    42 #define XR_REG_GPIO_MODE_ATE (0x0003U) // AUTO TRANSCEIVER ENABLE DURING TX (GPIO 5)
    43 #define XR_REG_GPIO_MODE_ATE_ADDRESS (0x0004U) // AUTO TRANSCEIVER ENABLE ON ADDRESS MATCH (GPIO 5)
    44 
    45 #define XR_REG_ACM_GPIO_DIR (0x0218U) // GPIO DIRECTION REGISTER CDCACM MODE, 0:IN 1:OUT
    46 #define XR_REG_GPIO_DIR (0x0C0DU) // GPIO DIRECTION REGISTER CUSTOM MODE, 0:IN 1:OUT
    47 
    48 #define XR_REG_ACM_GPIO_INT (0x0219U) // GPIO PIN CHANGE INTERRUPT ENABLE CDCACM MODE, 0: ENABLED 1: DISABLED
    49 #define XR_REG_GPIO_INT (0x0C11U) // GPIO PIN CHANGE INTERRUPT ENABLE CUSTOM MODE, 0: ENABLED 1: DISABLED
    50 #define XR_REG_GPIO_MASK (0x001FU) // GPIO REGISTERS BITMASK
    51 
    52 #define XR_REG_UART_ENABLE (0x0C00U) // UART I/O ENABLE REGISTER
    53 #define XR_REG_UART_ENABLE_RX (0x0002U) // 0:DISABLED 1:ENABLED
    54 #define XR_REG_UART_ENABLE_TX (0x0001U) // 0:DISABLED 1:ENABLED
    55 
    56 #define XR_REG_ERROR_STATUS (0x0C09U) // ERROR STATUS REGISTER
    57 #define XR_REG_ERROR_STATUS_MASK (0x00F8U) // ERROR STATUS BITMASK
    58 #define XR_REG_ERROR_STATUS_ERROR (0x0070U) // ERROR STATUS ERROR BITMASK
    59 #define XR_REG_ERROR_STATUS_BREAK (0x0008U) // BREAK HAS BEEN DETECTED
    60 #define XR_REG_ERROR_STATUS_OVERRUN (0x0010U) // RX OVERRUN ERROR
    61 #define XR_REG_ERROR_STATUS_PARITY (0x0020U) // PARITY ERROR
    62 #define XR_REG_ERROR_STATUS_FRAME (0x0040U) // FRAMING ERROR
    63 #define XR_REG_ERROR_STATUS_BREAKING (0x0080U) // BREAK IS BEING DETECTED
    64 
    65 #define XR_REG_TX_BREAK (0x0C0AU) // TRANSMIT BREAK. 0X0001-0XFFE TIME IN MS, 0X0000 STOP, 0X0FFF BREAK ON
    66 
    67 #define XR_REG_XCVR_EN_DELAY (0x0C0BU) // TURN-ARROUND DELAY IN BIT-TIMES 0X0000-0X000F
    68 
    69 #define XR_REG_GPIO_SET (0x0C0EU) // 1:SET GPIO PIN
    70 
    71 #define XR_REG_GPIO_CLR (0x0C0FU) // 1:CLEAR GPIO PIN
    72 
    73 #define XR_REG_GPIO_STATUS (0x0C10U) // READ GPIO PINS
    74 
    75 #define XR_REG_CUSTOMISED_INT (0x0C12U) // 0:STANDARD 1:CUSTOM SEE DATA SHEET
    76 
    77 #define XR_REG_PIN_PULLUP_ENABLE (0x0C14U) // 0:DISABLE 1:ENABLE, BITS 0-5:GPIO, 6:RX 7:TX
    78 
    79 #define XR_REG_PIN_PULLDOWN_ENABLE (0x0C15U) // 0:DISABLE 1:ENABLE, BITS 0-5:GPIO, 6:RX 7:TX
    80 
    81 #define XR_REG_LOOPBACK (0x0C16U) // 0:DISABLE 1:ENABLE, SEE DATA SHEET
    82 
    83 #define XR_REG_RX_FIFO_LATENCY (0x0CC2U) // FIFO LATENCY REGISTER
    84 #define XR_REG_RX_FIFO_LATENCY_ENABLE (0x0001U) //
    85 
    86 #define XR_REG_WIDE_MODE (0x0D02U)
    87 #define XR_REG_WIDE_MODE_ENABLE (0x0001U)
    88 
    89 #define XR_REG_XON_CHAR (0x0C07U)
    90 #define XR_REG_XOFF_CHAR (0x0C08U)
    91 
    92 #define XR_REG_TX_FIFO_RESET (0x0C80U) // 1: RESET, SELF-CLEARING
    93 #define XR_REG_TX_FIFO_COUNT (0x0C81U) // READ-ONLY
    94 #define XR_REG_RX_FIFO_RESET (0x0CC0U) // 1: RESET, SELF-CLEARING
    95 #define XR_REG_RX_FIFO_COUNT (0x0CC1U) // READ-ONLY
    96 
    97 #define XR_WRITE_REQUEST_TYPE (0x40U)
    98 
    99 #define XR_READ_REQUEST_TYPE (0xC0U)
    100 
    101 #define XR_MAX_ENDPOINTS 4
    102 
    103 class XR21B1411 : public ACM {
    104 protected:
    105 
    106 public:
    107  XR21B1411(USB *pusb, CDCAsyncOper *pasync);
    108 
    115  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    116  return (((vid == 0x2890U) && (pid == 0x0201U)) || ((vid == 0x04e2U) && (pid == 0x1411U)));
    117  };
    118 
    119  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    120 
    122  tty_features rv;
    123  rv.enhanced = true;
    124  rv.autoflow_RTS = true;
    125  rv.autoflow_DSR = true;
    126  rv.autoflow_XON = true;
    127  rv.half_duplex = true;
    128  rv.wide = true;
    129  return rv;
    130  };
    131 
    132  uint8_t read_register(uint16_t reg, uint16_t *val) {
    133  return (pUsb->ctrlReq(bAddress, 0, XR_READ_REQUEST_TYPE, 1, 0, 0, reg, 2, 2, (uint8_t *)val, NULL));
    134  }
    135 
    136  uint8_t write_register(uint16_t reg, uint16_t val) {
    137  return (pUsb->ctrlReq(bAddress, 0, XR_WRITE_REQUEST_TYPE, 0, BGRAB0(val), BGRAB1(val), reg, 0, 0, NULL, NULL));
    138  }
    139 
    140 
    142  // The following methods set the CDC-ACM defaults.
    144 
    145  virtual void autoflowRTS(bool s) {
    146  uint16_t val;
    147  uint8_t rval;
    148  rval = read_register(XR_REG_ACM_FLOW_CTL, &val);
    149  if(!rval) {
    150  if(s) {
    152  val |= XR_REG_FLOW_CTL_HW;
    153  } else {
    155  }
    156  rval = write_register(XR_REG_ACM_FLOW_CTL, val);
    157  if(!rval) {
    159  if(!rval) {
    160  // ACM commands apply the new settings.
    161  LINE_CODING LCT;
    162  rval = GetLineCoding(&LCT);
    163  if(!rval) {
    164  rval = SetLineCoding(&LCT);
    165  if(!rval) {
    169  }
    170  }
    171  }
    172  }
    173  }
    174  };
    175 
    176  virtual void autoflowDSR(bool s) {
    177  uint16_t val;
    178  uint8_t rval;
    179  rval = read_register(XR_REG_ACM_FLOW_CTL, &val);
    180  if(!rval) {
    181  if(s) {
    183  val |= XR_REG_FLOW_CTL_HW;
    184  } else {
    186  }
    187  rval = write_register(XR_REG_ACM_FLOW_CTL, val);
    188  if(!rval) {
    189  if(s) {
    191  } else {
    193  }
    194  if(!rval) {
    195  // ACM commands apply the new settings.
    196  LINE_CODING LCT;
    197  rval = GetLineCoding(&LCT);
    198  if(!rval) {
    199  rval = SetLineCoding(&LCT);
    200  if(!rval) {
    204  }
    205  }
    206  }
    207  }
    208  }
    209  };
    210 
    211  virtual void autoflowXON(bool s) {
    212  // NOTE: hardware defaults to the normal XON/XOFF
    213  uint16_t val;
    214  uint8_t rval;
    215  rval = read_register(XR_REG_ACM_FLOW_CTL, &val);
    216  if(!rval) {
    217  if(s) {
    219  val |= XR_REG_FLOW_CTL_SW;
    220  } else {
    222  }
    223  rval = write_register(XR_REG_ACM_FLOW_CTL, val);
    224  if(!rval) {
    226  if(!rval) {
    227  // ACM commands apply the new settings.
    228  LINE_CODING LCT;
    229  rval = GetLineCoding(&LCT);
    230  if(!rval) {
    231  rval = SetLineCoding(&LCT);
    232  if(!rval) {
    236  }
    237  }
    238  }
    239  }
    240  }
    241  };
    242 
    243  virtual void half_duplex(bool s) {
    244  uint16_t val;
    245  uint8_t rval;
    246  rval = read_register(XR_REG_ACM_FLOW_CTL, &val);
    247  if(!rval) {
    248  if(s) {
    250  } else {
    252  }
    253  rval = write_register(XR_REG_ACM_FLOW_CTL, val);
    254  if(!rval) {
    255  // ACM commands apply the new settings.
    256  LINE_CODING LCT;
    257  rval = GetLineCoding(&LCT);
    258  if(!rval) {
    259  rval = SetLineCoding(&LCT);
    260  if(!rval) {
    262  }
    263  }
    264  }
    265  }
    266  };
    267 
    268 
    269 
    270 };
    271 
    272 #endif // __CDCPROLIFIC_H__
    virtual void autoflowRTS(bool s)
    #define XR_REG_ACM_FLOW_CTL
    Definition: cdc_XR21B1411.h:27
    uint8_t write_register(uint16_t reg, uint16_t val)
    USB * pUsb
    Definition: cdcacm.h:165
    @@ -395,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/cdcacm_8cpp.html b/cdcacm_8cpp.html index 59931cbf..19202142 100644 --- a/cdcacm_8cpp.html +++ b/cdcacm_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcacm.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcacm.cpp File Reference
    -
    #include "cdcacm.h"
    +
    #include "cdcacm.h"
    Include dependency graph for cdcacm.cpp:
    - + + +

    Go to the source code of this file.

    @@ -100,7 +103,7 @@ Include dependency graph for cdcacm.cpp:
    diff --git a/cdcacm_8cpp__incl.map b/cdcacm_8cpp__incl.map index 9c443aa3..fe3ebf6c 100644 --- a/cdcacm_8cpp__incl.map +++ b/cdcacm_8cpp__incl.map @@ -1,4 +1,4 @@ - - + + diff --git a/cdcacm_8cpp__incl.md5 b/cdcacm_8cpp__incl.md5 index 49395eca..9fd4609d 100644 --- a/cdcacm_8cpp__incl.md5 +++ b/cdcacm_8cpp__incl.md5 @@ -1 +1 @@ -b7b7a67edb342e99305bf84049fe6e3a \ No newline at end of file +8836c5951dac28c739547b666b24d9f8 \ No newline at end of file diff --git a/cdcacm_8cpp__incl.png b/cdcacm_8cpp__incl.png index 805f6b0774083f863e44c034d7fa6621124122e0..b16418d488a4acdbef8d75ea89b934b7de11d447 100644 GIT binary patch literal 3350 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 Na8t)byHe9G>_2&0NOb@J literal 3700 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 diff --git a/cdcacm_8cpp_source.html b/cdcacm_8cpp_source.html index 23772ec5..90689eb2 100644 --- a/cdcacm_8cpp_source.html +++ b/cdcacm_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcacm.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,374 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcacm.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #include "cdcacm.h"
    -
    18 
    -
    19 const uint8_t ACM::epDataInIndex = 1;
    -
    20 const uint8_t ACM::epDataOutIndex = 2;
    -
    21 const uint8_t ACM::epInterruptInIndex = 3;
    -
    22 
    -
    23 ACM::ACM(USB *p, CDCAsyncOper *pasync) :
    -
    24 pUsb(p),
    -
    25 pAsync(pasync),
    -
    26 bAddress(0),
    -
    27 bControlIface(0),
    -
    28 bDataIface(0),
    -
    29 bNumEP(1),
    -
    30 qNextPollTime(0),
    -
    31 bPollEnable(false),
    -
    32 ready(false) {
    -
    33  _enhanced_status = enhanced_features(); // Set up features
    -
    34  for(uint8_t i = 0; i < ACM_MAX_ENDPOINTS; i++) {
    -
    35  epInfo[i].epAddr = 0;
    -
    36  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    37  epInfo[i].bmSndToggle = 0;
    -
    38  epInfo[i].bmRcvToggle = 0;
    - -
    40 
    -
    41  }
    -
    42  if(pUsb)
    - -
    44 }
    -
    45 
    -
    46 uint8_t ACM::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    47 
    -
    48  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    49 
    -
    50  uint8_t buf[constBufSize];
    -
    51  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    52 
    -
    53  uint8_t rcode;
    -
    54  UsbDevice *p = NULL;
    -
    55  EpInfo *oldep_ptr = NULL;
    -
    56  uint8_t num_of_conf; // number of configurations
    -
    57 
    -
    58  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    59 
    -
    60  USBTRACE("ACM Init\r\n");
    -
    61 
    -
    62  if(bAddress)
    - -
    64 
    -
    65  // Get pointer to pseudo device with address 0 assigned
    -
    66  p = addrPool.GetUsbDevicePtr(0);
    -
    67 
    -
    68  if(!p)
    - -
    70 
    -
    71  if(!p->epinfo) {
    -
    72  USBTRACE("epinfo\r\n");
    - -
    74  }
    -
    75 
    -
    76  // Save old pointer to EP_RECORD of address 0
    -
    77  oldep_ptr = p->epinfo;
    -
    78 
    -
    79  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    80  p->epinfo = epInfo;
    -
    81 
    -
    82  p->lowspeed = lowspeed;
    -
    83 
    -
    84  // Get device descriptor
    -
    85  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf);
    -
    86 
    -
    87  // Restore p->epinfo
    -
    88  p->epinfo = oldep_ptr;
    -
    89 
    -
    90  if(rcode)
    -
    91  goto FailGetDevDescr;
    -
    92 
    -
    93  // Allocate new address according to device class
    -
    94  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    95 
    -
    96  if(!bAddress)
    - -
    98 
    -
    99  // Extract Max Packet Size from the device descriptor
    - -
    101 
    -
    102  // Assign new address to the device
    -
    103  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    104 
    -
    105  if(rcode) {
    -
    106  p->lowspeed = false;
    -
    107  addrPool.FreeAddress(bAddress);
    -
    108  bAddress = 0;
    -
    109  USBTRACE2("setAddr:", rcode);
    -
    110  return rcode;
    -
    111  }
    -
    112 
    -
    113  USBTRACE2("Addr:", bAddress);
    -
    114 
    -
    115  p->lowspeed = false;
    -
    116 
    -
    117  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    118 
    -
    119  if(!p)
    - -
    121 
    -
    122  p->lowspeed = lowspeed;
    -
    123 
    -
    124  num_of_conf = udd->bNumConfigurations;
    -
    125 
    -
    126  // Assign epInfo to epinfo pointer
    -
    127  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    128 
    -
    129  if(rcode)
    -
    130  goto FailSetDevTblEntry;
    -
    131 
    -
    132  USBTRACE2("NC:", num_of_conf);
    -
    133 
    -
    134  for(uint8_t i = 0; i < num_of_conf; i++) {
    - - - - - -
    140  CP_MASK_COMPARE_PROTOCOL > CdcControlParser(this);
    -
    141 
    - -
    143  CP_MASK_COMPARE_CLASS> CdcDataParser(this);
    -
    144 
    -
    145  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcControlParser);
    -
    146 
    -
    147  if(rcode)
    -
    148  goto FailGetConfDescr;
    -
    149 
    -
    150  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcDataParser);
    -
    151 
    -
    152  if(rcode)
    -
    153  goto FailGetConfDescr;
    -
    154 
    -
    155  if(bNumEP > 1)
    -
    156  break;
    -
    157  } // for
    -
    158 
    -
    159  if(bNumEP < 4)
    - -
    161 
    -
    162  // Assign epInfo to epinfo pointer
    - -
    164 
    -
    165  USBTRACE2("Conf:", bConfNum);
    -
    166 
    -
    167  // Set Configuration Value
    -
    168  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    169 
    -
    170  if(rcode)
    -
    171  goto FailSetConfDescr;
    -
    172 
    -
    173  // Set up features status
    - -
    175  half_duplex(false);
    -
    176  autoflowRTS(false);
    -
    177  autoflowDSR(false);
    -
    178  autoflowXON(false);
    -
    179  wide(false); // Always false, because this is only available in custom mode.
    -
    180  rcode = pAsync->OnInit(this);
    -
    181 
    -
    182  if(rcode)
    -
    183  goto FailOnInit;
    -
    184 
    -
    185  USBTRACE("ACM configured\r\n");
    -
    186 
    -
    187  ready = true;
    -
    188 
    -
    189  //bPollEnable = true;
    -
    190 
    -
    191  //USBTRACE("Poll enabled\r\n");
    -
    192  return 0;
    -
    193 
    -
    194 FailGetDevDescr:
    -
    195 #ifdef DEBUG_USB_HOST
    - -
    197  goto Fail;
    -
    198 #endif
    -
    199 
    -
    200 FailSetDevTblEntry:
    -
    201 #ifdef DEBUG_USB_HOST
    - -
    203  goto Fail;
    -
    204 #endif
    -
    205 
    -
    206 FailGetConfDescr:
    -
    207 #ifdef DEBUG_USB_HOST
    - -
    209  goto Fail;
    -
    210 #endif
    -
    211 
    -
    212 FailSetConfDescr:
    -
    213 #ifdef DEBUG_USB_HOST
    - -
    215  goto Fail;
    -
    216 #endif
    -
    217 
    -
    218 FailOnInit:
    -
    219 #ifdef DEBUG_USB_HOST
    -
    220  USBTRACE("OnInit:");
    -
    221 #endif
    -
    222 
    -
    223 #ifdef DEBUG_USB_HOST
    -
    224 Fail:
    -
    225  NotifyFail(rcode);
    -
    226 #endif
    -
    227  Release();
    -
    228  return rcode;
    -
    229 }
    -
    230 
    -
    231 void ACM::EndpointXtract(uint8_t conf, uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    232  //ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
    -
    233  //ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
    -
    234  //ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
    -
    235 
    -
    236  bConfNum = conf;
    -
    237 
    -
    238  uint8_t index;
    -
    239 
    -
    240  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80)
    -
    241  index = epInterruptInIndex;
    - -
    243  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    -
    244  else
    -
    245  return;
    -
    246 
    -
    247  // Fill in the endpoint info structure
    -
    248  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    249  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    250  epInfo[index].bmSndToggle = 0;
    -
    251  epInfo[index].bmRcvToggle = 0;
    -
    252 
    -
    253  bNumEP++;
    -
    254 
    - -
    256 }
    -
    257 
    -
    258 uint8_t ACM::Release() {
    -
    259  ready = false;
    - -
    261 
    -
    262  bControlIface = 0;
    -
    263  bDataIface = 0;
    -
    264  bNumEP = 1;
    -
    265 
    -
    266  bAddress = 0;
    -
    267  qNextPollTime = 0;
    -
    268  bPollEnable = false;
    -
    269  return 0;
    -
    270 }
    -
    271 
    -
    272 uint8_t ACM::Poll() {
    -
    273  //uint8_t rcode = 0;
    -
    274  //if(!bPollEnable)
    -
    275  // return 0;
    -
    276  //return rcode;
    -
    277  return 0;
    -
    278 }
    -
    279 
    -
    280 uint8_t ACM::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    -
    281  uint8_t rv = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    -
    282  if(rv && rv != hrNAK) {
    -
    283  Release();
    -
    284  }
    -
    285  return rv;
    -
    286 }
    -
    287 
    -
    288 uint8_t ACM::SndData(uint16_t nbytes, uint8_t *dataptr) {
    -
    289  uint8_t rv = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    -
    290  if(rv && rv != hrNAK) {
    -
    291  Release();
    -
    292  }
    -
    293  return rv;
    -
    294 }
    -
    295 
    -
    296 uint8_t ACM::SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
    -
    297  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
    -
    298  if(rv && rv != hrNAK) {
    -
    299  Release();
    -
    300  }
    -
    301  return rv;
    -
    302 }
    -
    303 
    -
    304 uint8_t ACM::GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
    -
    305  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
    -
    306  if(rv && rv != hrNAK) {
    -
    307  Release();
    -
    308  }
    -
    309  return rv;
    -
    310 }
    -
    311 
    -
    312 uint8_t ACM::ClearCommFeature(uint16_t fid) {
    -
    313  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_CLEAR_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, 0, 0, NULL, NULL));
    -
    314  if(rv && rv != hrNAK) {
    -
    315  Release();
    -
    316  }
    -
    317  return rv;
    -
    318 }
    -
    319 
    -
    320 uint8_t ACM::SetLineCoding(const LINE_CODING *dataptr) {
    -
    321  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
    -
    322  if(rv && rv != hrNAK) {
    -
    323  Release();
    -
    324  }
    -
    325  return rv;
    -
    326 }
    -
    327 
    -
    328 uint8_t ACM::GetLineCoding(LINE_CODING *dataptr) {
    -
    329  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
    -
    330  if(rv && rv != hrNAK) {
    -
    331  Release();
    -
    332  }
    -
    333  return rv;
    -
    334 }
    -
    335 
    -
    336 uint8_t ACM::SetControlLineState(uint8_t state) {
    -
    337  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_CONTROL_LINE_STATE, state, 0, bControlIface, 0, 0, NULL, NULL));
    -
    338  if(rv && rv != hrNAK) {
    -
    339  Release();
    -
    340  }
    -
    341  return rv;
    -
    342 }
    -
    343 
    -
    344 uint8_t ACM::SendBreak(uint16_t duration) {
    -
    345  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SEND_BREAK, (duration & 0xff), (duration >> 8), bControlIface, 0, 0, NULL, NULL));
    -
    346  if(rv && rv != hrNAK) {
    -
    347  Release();
    -
    348  }
    -
    349  return rv;
    -
    350 }
    -
    351 
    - -
    353  Notify(PSTR("Endpoint descriptor:"), 0x80);
    -
    354  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    -
    355  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    -
    356  Notify(PSTR("\r\nType:\t\t"), 0x80);
    -
    357  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    -
    358  Notify(PSTR("\r\nAddress:\t"), 0x80);
    -
    359  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    -
    360  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    -
    361  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    -
    362  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    -
    363  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    -
    364  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    -
    365  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    -
    366  Notify(PSTR("\r\n"), 0x80);
    -
    367 }
    -
    #define USB_CLASS_COM_AND_CDC_CTRL
    Definition: UsbCore.h:71
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #include "cdcacm.h"
    18 
    19 const uint8_t ACM::epDataInIndex = 1;
    20 const uint8_t ACM::epDataOutIndex = 2;
    21 const uint8_t ACM::epInterruptInIndex = 3;
    22 
    23 ACM::ACM(USB *p, CDCAsyncOper *pasync) :
    24 pUsb(p),
    25 pAsync(pasync),
    26 bAddress(0),
    27 bControlIface(0),
    28 bDataIface(0),
    29 bNumEP(1),
    30 qNextPollTime(0),
    31 bPollEnable(false),
    32 ready(false) {
    33  _enhanced_status = enhanced_features(); // Set up features
    34  for(uint8_t i = 0; i < ACM_MAX_ENDPOINTS; i++) {
    35  epInfo[i].epAddr = 0;
    36  epInfo[i].maxPktSize = (i) ? 0 : 8;
    37  epInfo[i].bmSndToggle = 0;
    38  epInfo[i].bmRcvToggle = 0;
    40 
    41  }
    42  if(pUsb)
    44 }
    45 
    46 uint8_t ACM::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    47 
    48  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    49 
    50  uint8_t buf[constBufSize];
    51  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    52 
    53  uint8_t rcode;
    54  UsbDevice *p = NULL;
    55  EpInfo *oldep_ptr = NULL;
    56  uint8_t num_of_conf; // number of configurations
    57 
    58  AddressPool &addrPool = pUsb->GetAddressPool();
    59 
    60  USBTRACE("ACM Init\r\n");
    61 
    62  if(bAddress)
    64 
    65  // Get pointer to pseudo device with address 0 assigned
    66  p = addrPool.GetUsbDevicePtr(0);
    67 
    68  if(!p)
    70 
    71  if(!p->epinfo) {
    72  USBTRACE("epinfo\r\n");
    74  }
    75 
    76  // Save old pointer to EP_RECORD of address 0
    77  oldep_ptr = p->epinfo;
    78 
    79  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    80  p->epinfo = epInfo;
    81 
    82  p->lowspeed = lowspeed;
    83 
    84  // Get device descriptor
    85  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf);
    86 
    87  // Restore p->epinfo
    88  p->epinfo = oldep_ptr;
    89 
    90  if(rcode)
    91  goto FailGetDevDescr;
    92 
    93  // Allocate new address according to device class
    94  bAddress = addrPool.AllocAddress(parent, false, port);
    95 
    96  if(!bAddress)
    98 
    99  // Extract Max Packet Size from the device descriptor
    101 
    102  // Assign new address to the device
    103  rcode = pUsb->setAddr(0, 0, bAddress);
    104 
    105  if(rcode) {
    106  p->lowspeed = false;
    107  addrPool.FreeAddress(bAddress);
    108  bAddress = 0;
    109  USBTRACE2("setAddr:", rcode);
    110  return rcode;
    111  }
    112 
    113  USBTRACE2("Addr:", bAddress);
    114 
    115  p->lowspeed = false;
    116 
    117  p = addrPool.GetUsbDevicePtr(bAddress);
    118 
    119  if(!p)
    121 
    122  p->lowspeed = lowspeed;
    123 
    124  num_of_conf = udd->bNumConfigurations;
    125 
    126  // Assign epInfo to epinfo pointer
    127  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    128 
    129  if(rcode)
    130  goto FailSetDevTblEntry;
    131 
    132  USBTRACE2("NC:", num_of_conf);
    133 
    134  for(uint8_t i = 0; i < num_of_conf; i++) {
    140  CP_MASK_COMPARE_PROTOCOL > CdcControlParser(this);
    141 
    143  CP_MASK_COMPARE_CLASS> CdcDataParser(this);
    144 
    145  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcControlParser);
    146 
    147  if(rcode)
    148  goto FailGetConfDescr;
    149 
    150  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcDataParser);
    151 
    152  if(rcode)
    153  goto FailGetConfDescr;
    154 
    155  if(bNumEP > 1)
    156  break;
    157  } // for
    158 
    159  if(bNumEP < 4)
    161 
    162  // Assign epInfo to epinfo pointer
    164 
    165  USBTRACE2("Conf:", bConfNum);
    166 
    167  // Set Configuration Value
    168  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    169 
    170  if(rcode)
    171  goto FailSetConfDescr;
    172 
    173  // Set up features status
    175  half_duplex(false);
    176  autoflowRTS(false);
    177  autoflowDSR(false);
    178  autoflowXON(false);
    179  wide(false); // Always false, because this is only available in custom mode.
    180  rcode = pAsync->OnInit(this);
    181 
    182  if(rcode)
    183  goto FailOnInit;
    184 
    185  USBTRACE("ACM configured\r\n");
    186 
    187  ready = true;
    188 
    189  //bPollEnable = true;
    190 
    191  //USBTRACE("Poll enabled\r\n");
    192  return 0;
    193 
    194 FailGetDevDescr:
    195 #ifdef DEBUG_USB_HOST
    197  goto Fail;
    198 #endif
    199 
    200 FailSetDevTblEntry:
    201 #ifdef DEBUG_USB_HOST
    203  goto Fail;
    204 #endif
    205 
    206 FailGetConfDescr:
    207 #ifdef DEBUG_USB_HOST
    209  goto Fail;
    210 #endif
    211 
    212 FailSetConfDescr:
    213 #ifdef DEBUG_USB_HOST
    215  goto Fail;
    216 #endif
    217 
    218 FailOnInit:
    219 #ifdef DEBUG_USB_HOST
    220  USBTRACE("OnInit:");
    221 #endif
    222 
    223 #ifdef DEBUG_USB_HOST
    224 Fail:
    225  NotifyFail(rcode);
    226 #endif
    227  Release();
    228  return rcode;
    229 }
    230 
    231 void ACM::EndpointXtract(uint8_t conf, uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
    232  //ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
    233  //ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
    234  //ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
    235 
    236  bConfNum = conf;
    237 
    238  uint8_t index;
    239 
    240  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80)
    241  index = epInterruptInIndex;
    243  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    244  else
    245  return;
    246 
    247  // Fill in the endpoint info structure
    248  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    249  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    250  epInfo[index].bmSndToggle = 0;
    251  epInfo[index].bmRcvToggle = 0;
    252 
    253  bNumEP++;
    254 
    256 }
    257 
    258 uint8_t ACM::Release() {
    259  ready = false;
    261 
    262  bControlIface = 0;
    263  bDataIface = 0;
    264  bNumEP = 1;
    265 
    266  bAddress = 0;
    267  qNextPollTime = 0;
    268  bPollEnable = false;
    269  return 0;
    270 }
    271 
    272 uint8_t ACM::Poll() {
    273  //uint8_t rcode = 0;
    274  //if(!bPollEnable)
    275  // return 0;
    276  //return rcode;
    277  return 0;
    278 }
    279 
    280 uint8_t ACM::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    281  uint8_t rv = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    282  if(rv && rv != hrNAK) {
    283  Release();
    284  }
    285  return rv;
    286 }
    287 
    288 uint8_t ACM::SndData(uint16_t nbytes, uint8_t *dataptr) {
    289  uint8_t rv = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    290  if(rv && rv != hrNAK) {
    291  Release();
    292  }
    293  return rv;
    294 }
    295 
    296 uint8_t ACM::SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
    297  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
    298  if(rv && rv != hrNAK) {
    299  Release();
    300  }
    301  return rv;
    302 }
    303 
    304 uint8_t ACM::GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
    305  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
    306  if(rv && rv != hrNAK) {
    307  Release();
    308  }
    309  return rv;
    310 }
    311 
    312 uint8_t ACM::ClearCommFeature(uint16_t fid) {
    313  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_CLEAR_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, 0, 0, NULL, NULL));
    314  if(rv && rv != hrNAK) {
    315  Release();
    316  }
    317  return rv;
    318 }
    319 
    320 uint8_t ACM::SetLineCoding(const LINE_CODING *dataptr) {
    321  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
    322  if(rv && rv != hrNAK) {
    323  Release();
    324  }
    325  return rv;
    326 }
    327 
    328 uint8_t ACM::GetLineCoding(LINE_CODING *dataptr) {
    329  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
    330  if(rv && rv != hrNAK) {
    331  Release();
    332  }
    333  return rv;
    334 }
    335 
    336 uint8_t ACM::SetControlLineState(uint8_t state) {
    337  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_CONTROL_LINE_STATE, state, 0, bControlIface, 0, 0, NULL, NULL));
    338  if(rv && rv != hrNAK) {
    339  Release();
    340  }
    341  return rv;
    342 }
    343 
    344 uint8_t ACM::SendBreak(uint16_t duration) {
    345  uint8_t rv = ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SEND_BREAK, (duration & 0xff), (duration >> 8), bControlIface, 0, 0, NULL, NULL));
    346  if(rv && rv != hrNAK) {
    347  Release();
    348  }
    349  return rv;
    350 }
    351 
    353  Notify(PSTR("Endpoint descriptor:"), 0x80);
    354  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    355  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    356  Notify(PSTR("\r\nType:\t\t"), 0x80);
    357  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    358  Notify(PSTR("\r\nAddress:\t"), 0x80);
    359  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    360  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    361  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    362  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    363  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    364  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    365  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    366  Notify(PSTR("\r\n"), 0x80);
    367 }
    #define USB_CLASS_COM_AND_CDC_CTRL
    Definition: UsbCore.h:71
    #define USB_CLASS_CDC_DATA
    Definition: UsbCore.h:78
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    uint8_t bmRcvToggle
    Definition: address.h:48
    @@ -569,7 +203,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/cdcacm_8h.html b/cdcacm_8h.html index 016e495a..049d0598 100644 --- a/cdcacm_8h.html +++ b/cdcacm_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcacm.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -89,20 +90,26 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcacm.h File Reference
    -
    #include "Usb.h"
    +
    #include "Usb.h"
    Include dependency graph for cdcacm.h:
    - + +
    This graph shows which files directly or indirectly include this file:
    - + + + + + +

    Go to the source code of this file.

    @@ -1014,7 +1021,7 @@ Typedefs diff --git a/cdcacm_8h__dep__incl.map b/cdcacm_8h__dep__incl.map index 3c20a863..c9aff920 100644 --- a/cdcacm_8h__dep__incl.map +++ b/cdcacm_8h__dep__incl.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/cdcacm_8h__dep__incl.md5 b/cdcacm_8h__dep__incl.md5 index e52e6481..9355f061 100644 --- a/cdcacm_8h__dep__incl.md5 +++ b/cdcacm_8h__dep__incl.md5 @@ -1 +1 @@ -ceccbf136b10ff86806ba6f6cb3bfe18 \ No newline at end of file +d9684fa8dbbab21f6c77cde6aba312ed \ No newline at end of file diff --git a/cdcacm_8h__dep__incl.png b/cdcacm_8h__dep__incl.png index 52ece943c80dae83384a77df64685865fd7c3ae3..68f7165a4de2941b0c2d652ac874f205c32dee96 100644 GIT binary patch literal 9677 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 literal 10409 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 diff --git a/cdcacm_8h__incl.map b/cdcacm_8h__incl.map index 4c3a4211..5f0a1aaf 100644 --- a/cdcacm_8h__incl.map +++ b/cdcacm_8h__incl.map @@ -1,3 +1,3 @@ - + diff --git a/cdcacm_8h__incl.md5 b/cdcacm_8h__incl.md5 index d35865e2..ac958164 100644 --- a/cdcacm_8h__incl.md5 +++ b/cdcacm_8h__incl.md5 @@ -1 +1 @@ -a06da110b6401ffa80ac6ba1c8b87e4c \ No newline at end of file +107fd47c127eab19013c78d1f9837064 \ No newline at end of file diff --git a/cdcacm_8h__incl.png b/cdcacm_8h__incl.png index e45ca43607d7af256b7c4d4fb44262e5e1483615..257282e1541176b24eb6ddc94a163a46be2ea4c1 100644 GIT binary patch literal 2097 zcmcJRdpOhkAHcswE~RLZ$h8h~Imju8Y{kqqM`)Q#Sy;^Im{RW4Cb=7ud&ea$w=TNO zeI;XazaMLrFj3oRa~;E3PtQ4j{Qmzv@7MeCe4gj?dETGf`}0Y1a@cm8oNnrM;B&O1#DMpMTfUAp72$p5H5b!@}Ojj~`>*JJ$al)RsxCsBn(vl)2A? z-Mh8oX+LP^#BBNG<>$XmJN)~=*jNIW8^WBKv8W#12|OYay$ufy(CLy57yDFKHE&|E zGRw=$;adVzKR-W0Ru*n($fX8J-l~2c5D;JzG9{X7eUyFE%*WT)*~MjN^=NWOhqaWn zv}LX9^wQVi#EguvsH?TLwP*~cjY^dm!JO>s>UtJ3ZLR)Na+nwVsX6Jv0~I&|QC?Xo zd9$h5AP|jy^ZB#d6C^pkvGEi*Rxr*Q=kczgu3RZ?Xi(71mb9+`3G?xy>@-Ip@0YmYk-VwHg56Cpi*s*$?l#DJ=Gk! zjM1(tl6lB@&fp{_C55USbbbo#XB{I5SRk84;h1BL-X?T-f*WokDHn%H8+D>*>7%(7#@8os3~NM>6a6a=Wik zdq2+4*4$4(GezRUAlJ3(3%i$=^y=!eHj4&_WO4*GdTGO=VMv0##(15^K`z%@zig+x zGc6;1OFS!kTe5Pbft6{mF@T9v>*@-FX{Z8qFG%`xtN#9`gCD&5tU`Hl8@=vza2*Rw zmEzUVw48g`xm(^0#e=+RGY>57-WAA?7i|`#r|(0bP!tsxx2$lP z{5D$cIFpl;Gycq5q^+&Z2@a3%|LaT?cp^s^QQ}f5qokBNG6G*(S<&}jSCI_oM?^%J z#BG63N3Q`X6x@?1`b6H!%1v<8iWCF_nOj)sq@>709xQxni4qoDtcen}rw8WkJ$dcX zf`Yn=3zNyjnwpxXBy*QWuXj&PP1P3^D9(Ru3e#t`gmZBd3mnc22m}H@`1{8VRy`BT z#NqMs#iT*>MR@9A2h^`|y#*)ra~lhbib5kTCs#O(IW`-1?V1tjz=4p}`Afw0LgTAb zqyr#OYopIa6zUhUG6;lAN|Hnxc+&_pMD^(0{Ja;oxv7Z}kOWV&#(R?feETP1{#AncPTuqVh9m0&`!C(Y{~Bznyd3WYkkx^@^`Z;V*^;tor@>vT4qMcmR8f27z zzsRZNXr}Gu6N>URXpTq_cc=Y-uj7A#=wTEja>+I^YU08jH6CJk<5WXK!}#l~g=({) n-oHu^YC-X5CI787)NR1nUVH6`C*MZ+2LSA>9AQtOmvR39-YO`- literal 1991 zcmb7Fc{rO{7k^7?Nlit^R#h}jX>4UwWORxWBC0_U8PwJ-wot8>R%55B?Q2c!#*Dp> z+NxE?QoEv&cA^wbQ_?Ugv5TE~JKxto=Fjim=iYOl^PK10d(Qox-=W##vEM%SouAK_TXI9*Y6?zRurT%F+QqJOYO~=M`GRPT|BpGCFp>T5udH8n}eMr#qfIoaFji0SmsY=iHo zVC`NoJwUruGy>@*BcUx4ZK?KZA-}%9eqzGAw6Hk4zrTNZnwfZuwooB<4(9Ca93LNV z3puY9#A&^^x#GLtm@Xp+jW4XPM^*lw^=Wr!O9P)LVH(pb0g;bxgTqJ=_$plaU?K*N z3$I&zXpK0S$en){br&L%WQG|$KFM9%I_23Ku_X*l>$Pxj^7r@0+8j?0DH!viG zpay$&`6-DG=;`UbVX+KQs2*MjFQn0?({mx78X?MZg-MGKEBLd zH;6*<$P)CWYq(Yp^KWX>`+ItNE?Xi-j#pi55`Jor9UL4qxHg!alCmlkibTEhGt6c9 zJs-RLgW!E_QB%_yV#&C`r*F)T+p# z=xvs*dKs%xZ@dVbwsNP1SYfCr<#2$2?6_KIXk>H%60@|l6e})Gba4@FOF3dBoE@#B zu#HvHunxbtR;D`lU9C&8y5#0|B(1kdW2vsL4!op3aJ*+CxR`(h%AGV1COW#fhy$u7 z5u~gXU5}<)flp%A5o@fl<*5reoMg*I;@2St%zte8o`(5dDcTHH@d(l9Qtc5M8p>cW zXx)?Oz(0f0%A1Zd;|>#xVSpJ7L%1djZ&YdLE_%GAUI-c&-1_5)f}Gsh$lafumX~+~ zB)Ur4^!g&#revuj{=k+{ki?qu{B%m|H(V9gx`YthZtvs-0j3A@xyu`Xy{Bh2i{Ic* zxpJk1O_}HOY0muR4HN3N^`qjEnUtFrBWF=hB`VrfLeNAgh>IuEH^Jt78;LDRUU1+9W>ORm#3U!bz|vs-|TDv-RAjq zu2m(`zm_CVR5y2V8R@5MIi7$og?H6n>fMc`bapb2+LeQ_1M&3@&ovU5&vAZa@+)45 z{-G23Kiw5-FWKuQzhT%Jd)K11^bm(W6@c?S7#>tic)d zkpWM(Ja5~sHBR+|h7j@C_RUS_e-wX~oIh#vpNG*RH6)0oWTx)L4ks1$YZ)OMMicpy zWd%e7#RQy8uF*(bf~0)X^YCS;Sf?HmZj|Zh=63GUlVqt3459Wi4i)RI*vfy@N8B&c z?xlA!UEkoIM0;C{6`FHz%?_1|kSMR%60gIVgkL{lva_=jfI7q57jk2dp4+6)V>}(5 z-QC^oV(QXVCW6t;9@X7GxNtH6Sg+6*AiiX>wckd5aikJ79zL43Z5LHwf2`(z9Q0V> z94wAaNsB}%H?eoi20FWfj-B|V@|B+W^4FKA7&$pPPo8K;n|b|^ZQfh$-Uye49)Lnm zE2WGJJl5OK+@8CSDQs?T25E!&NP7`iJ{o{8RspQA*dmqdjqcgm*=#nO%jH@XJw)I# z2Mmpkp}-MTfa2l9hn1COX_&-=M_u1fW$3u&;mh9n?T@0-Xc(U?#uOM!<=KvzRWXr$ znFDk>{ki{06`#+a4Y)aTPdNK?Ey>nl=&@rNnJY8Pc^SDl*}d{0ip63fnZlnjkj`Jv z#0O3DcxLG||bzI(T+mn%s%{;Ov!RTS|fsnnxO!Tc$FAr1<5t8c&jPst;8 z(2=at3kAo;xrk#ig(pi0{IxAp&m7r8Cr#u7o916PPK>p}78L*6n!rNd-siJFZy?Nb RHWBR10L~JRsWSJ9`5W|~zYG8X diff --git a/cdcacm_8h_source.html b/cdcacm_8h_source.html index 949cf850..8bfd2068 100644 --- a/cdcacm_8h_source.html +++ b/cdcacm_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcacm.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,256 +86,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcacm.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #if !defined(__CDCACM_H__)
    -
    18 #define __CDCACM_H__
    -
    19 
    -
    20 #include "Usb.h"
    -
    21 
    -
    22 #define bmREQ_CDCOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    -
    23 #define bmREQ_CDCIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    -
    24 
    -
    25 // CDC Subclass Constants
    -
    26 #define CDC_SUBCLASS_DLCM 0x01 // Direct Line Control Model
    -
    27 #define CDC_SUBCLASS_ACM 0x02 // Abstract Control Model
    -
    28 #define CDC_SUBCLASS_TCM 0x03 // Telephone Control Model
    -
    29 #define CDC_SUBCLASS_MCCM 0x04 // Multi Channel Control Model
    -
    30 #define CDC_SUBCLASS_CAPI 0x05 // CAPI Control Model
    -
    31 #define CDC_SUBCLASS_ETHERNET 0x06 // Ethernet Network Control Model
    -
    32 #define CDC_SUBCLASS_ATM 0x07 // ATM Network Control Model
    -
    33 #define CDC_SUBCLASS_WIRELESS_HANDSET 0x08 // Wireless Handset Control Model
    -
    34 #define CDC_SUBCLASS_DEVICE_MANAGEMENT 0x09 // Device Management
    -
    35 #define CDC_SUBCLASS_MOBILE_DIRECT_LINE 0x0A // Mobile Direct Line Model
    -
    36 #define CDC_SUBCLASS_OBEX 0x0B // OBEX
    -
    37 #define CDC_SUBCLASS_ETHERNET_EMU 0x0C // Ethernet Emulation Model
    -
    38 
    -
    39 // Communication Interface Class Control Protocol Codes
    -
    40 #define CDC_PROTOCOL_ITU_T_V_250 0x01 // AT Commands defined by ITU-T V.250
    -
    41 #define CDC_PROTOCOL_PCCA_101 0x02 // AT Commands defined by PCCA-101
    -
    42 #define CDC_PROTOCOL_PCCA_101_O 0x03 // AT Commands defined by PCCA-101 & Annex O
    -
    43 #define CDC_PROTOCOL_GSM_7_07 0x04 // AT Commands defined by GSM 7.07
    -
    44 #define CDC_PROTOCOL_3GPP_27_07 0x05 // AT Commands defined by 3GPP 27.007
    -
    45 #define CDC_PROTOCOL_C_S0017_0 0x06 // AT Commands defined by TIA for CDMA
    -
    46 #define CDC_PROTOCOL_USB_EEM 0x07 // Ethernet Emulation Model
    -
    47 
    -
    48 // CDC Commands defined by CDC 1.2
    -
    49 #define CDC_SEND_ENCAPSULATED_COMMAND 0x00
    -
    50 #define CDC_GET_ENCAPSULATED_RESPONSE 0x01
    -
    51 
    -
    52 // CDC Commands defined by PSTN 1.2
    -
    53 #define CDC_SET_COMM_FEATURE 0x02
    -
    54 #define CDC_GET_COMM_FEATURE 0x03
    -
    55 #define CDC_CLEAR_COMM_FEATURE 0x04
    -
    56 #define CDC_SET_AUX_LINE_STATE 0x10
    -
    57 #define CDC_SET_HOOK_STATE 0x11
    -
    58 #define CDC_PULSE_SETUP 0x12
    -
    59 #define CDC_SEND_PULSE 0x13
    -
    60 #define CDC_SET_PULSE_TIME 0x14
    -
    61 #define CDC_RING_AUX_JACK 0x15
    -
    62 #define CDC_SET_LINE_CODING 0x20
    -
    63 #define CDC_GET_LINE_CODING 0x21
    -
    64 #define CDC_SET_CONTROL_LINE_STATE 0x22
    -
    65 #define CDC_SEND_BREAK 0x23
    -
    66 #define CDC_SET_RINGER_PARMS 0x30
    -
    67 #define CDC_GET_RINGER_PARMS 0x31
    -
    68 #define CDC_SET_OPERATION_PARMS 0x32
    -
    69 #define CDC_GET_OPERATION_PARMS 0x33
    -
    70 #define CDC_SET_LINE_PARMS 0x34
    -
    71 #define CDC_GET_LINE_PARMS 0x35
    -
    72 #define CDC_DIAL_DIGITS 0x36
    -
    73 
    -
    74 //Class-Specific Notification Codes
    -
    75 #define NETWORK_CONNECTION 0x00
    -
    76 #define RESPONSE_AVAILABLE 0x01
    -
    77 #define AUX_JACK_HOOK_STATE 0x08
    -
    78 #define RING_DETECT 0x09
    -
    79 #define SERIAL_STATE 0x20
    -
    80 #define CALL_STATE_CHANGE 0x28
    -
    81 #define LINE_STATE_CHANGE 0x29
    -
    82 #define CONNECTION_SPEED_CHANGE 0x2a
    -
    83 
    -
    84 // CDC Functional Descriptor Structures
    -
    85 
    -
    86 typedef struct {
    -
    87  uint8_t bFunctionLength;
    -
    88  uint8_t bDescriptorType;
    - -
    90  uint8_t bmCapabilities;
    -
    91  uint8_t bDataInterface;
    - -
    93 
    -
    94 typedef struct {
    -
    95  uint8_t bFunctionLength;
    -
    96  uint8_t bDescriptorType;
    - -
    98  uint8_t bmCapabilities;
    - - -
    101 
    -
    102 typedef struct {
    - - - - - - -
    109 
    -
    110 typedef struct {
    -
    111  uint32_t dwDTERate; // Data Terminal Rate in bits per second
    -
    112  uint8_t bCharFormat; // 0 - 1 stop bit, 1 - 1.5 stop bits, 2 - 2 stop bits
    -
    113  uint8_t bParityType; // 0 - None, 1 - Odd, 2 - Even, 3 - Mark, 4 - Space
    -
    114  uint8_t bDataBits; // Data bits (5, 6, 7, 8 or 16)
    -
    115 } LINE_CODING;
    -
    116 
    -
    117 typedef struct {
    -
    118  uint8_t bmRequestType; // 0xa1 for class-specific notifications
    -
    119  uint8_t bNotification;
    -
    120  uint16_t wValue;
    -
    121  uint16_t wIndex;
    -
    122  uint16_t wLength;
    -
    123  uint16_t bmState; //UART state bitmap for SERIAL_STATE, other notifications variable length
    - -
    125 
    -
    126 class ACM;
    -
    127 
    - -
    129 public:
    -
    130 
    -
    131  virtual uint8_t OnInit(ACM *pacm __attribute__((unused))) {
    -
    132  return 0;
    -
    133  };
    -
    134  //virtual void OnDataRcvd(ACM *pacm, uint8_t nbytes, uint8_t *dataptr) = 0;
    -
    135  //virtual void OnDisconnected(ACM *pacm) = 0;
    -
    136 };
    -
    137 
    -
    143 typedef struct {
    -
    144 
    -
    145  union {
    -
    146  uint8_t tty;
    -
    147 
    -
    148  struct {
    -
    149  bool enhanced : 1; // Do we have the ability to set/clear any features?
    -
    150  // Status and 8th bit in data stream.
    -
    151  // Presence only indicates feature is available, but this isn't used for CDC-ACM.
    -
    152  bool wide : 1;
    -
    153  bool autoflow_RTS : 1; // Has autoflow on RTS/CTS
    -
    154  bool autoflow_DSR : 1; // Has autoflow on DTR/DSR
    -
    155  bool autoflow_XON : 1; // Has autoflow XON/XOFF
    -
    156  bool half_duplex : 1; // Has half-duplex capability.
    -
    157  } __attribute__((packed));
    -
    158  };
    -
    159 } tty_features;
    -
    160 
    -
    161 #define ACM_MAX_ENDPOINTS 4
    -
    162 
    -
    163 class ACM : public USBDeviceConfig, public UsbConfigXtracter {
    -
    164 protected:
    - - -
    167  uint8_t bAddress;
    -
    168  uint8_t bConfNum; // configuration number
    -
    169  uint8_t bControlIface; // Control interface value
    -
    170  uint8_t bDataIface; // Data interface value
    -
    171  uint8_t bNumEP; // total number of EP in the configuration
    -
    172  uint32_t qNextPollTime; // next poll time
    -
    173  volatile bool bPollEnable; // poll enable flag
    -
    174  volatile bool ready; //device ready indicator
    -
    175  tty_features _enhanced_status; // current status
    -
    176 
    - -
    178 
    -
    179 public:
    -
    180  static const uint8_t epDataInIndex; // DataIn endpoint index
    -
    181  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    -
    182  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
    - -
    184 
    -
    185  ACM(USB *pusb, CDCAsyncOper *pasync);
    -
    186 
    -
    187  uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr);
    -
    188  uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr);
    -
    189  uint8_t ClearCommFeature(uint16_t fid);
    -
    190  uint8_t SetLineCoding(const LINE_CODING *dataptr);
    -
    191  uint8_t GetLineCoding(LINE_CODING *dataptr);
    -
    192  uint8_t SetControlLineState(uint8_t state);
    -
    193  uint8_t SendBreak(uint16_t duration);
    -
    194  uint8_t GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr);
    -
    195 
    -
    196  // Methods for receiving and sending data
    -
    197  uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr);
    -
    198  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    -
    199 
    -
    200  // USBDeviceConfig implementation
    -
    201  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    202  uint8_t Release();
    -
    203  uint8_t Poll();
    -
    204 
    -
    205  bool available(void) {
    -
    206  return false;
    -
    207  };
    -
    208 
    -
    209  virtual uint8_t GetAddress() {
    -
    210  return bAddress;
    -
    211  };
    -
    212 
    -
    213  virtual bool isReady() {
    -
    214  return ready;
    -
    215  };
    -
    216 
    - -
    218  return _enhanced_status;
    -
    219  };
    -
    220 
    - -
    222  tty_features rv;
    -
    223  rv.enhanced = false;
    -
    224  rv.autoflow_RTS = false;
    -
    225  rv.autoflow_DSR = false;
    -
    226  rv.autoflow_XON = false;
    -
    227  rv.half_duplex = false;
    -
    228  rv.wide = false;
    -
    229  return rv;
    -
    230  };
    -
    231 
    -
    232  virtual void autoflowRTS(bool s __attribute__((unused))) {
    -
    233  };
    -
    234 
    -
    235  virtual void autoflowDSR(bool s __attribute__((unused))) {
    -
    236  };
    -
    237 
    -
    238  virtual void autoflowXON(bool s __attribute__((unused))) {
    -
    239  };
    -
    240 
    -
    241  virtual void half_duplex(bool s __attribute__((unused))) {
    -
    242  };
    -
    243 
    -
    244  virtual void wide(bool s __attribute__((unused))) {
    -
    245  };
    -
    246 
    -
    247  // UsbConfigXtracter implementation
    -
    248  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    249 };
    -
    250 
    -
    251 #endif // __CDCACM_H__
    -
    uint16_t wIndex
    Definition: cdcacm.h:121
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #if !defined(__CDCACM_H__)
    18 #define __CDCACM_H__
    19 
    20 #include "Usb.h"
    21 
    22 #define bmREQ_CDCOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    23 #define bmREQ_CDCIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    24 
    25 // CDC Subclass Constants
    26 #define CDC_SUBCLASS_DLCM 0x01 // Direct Line Control Model
    27 #define CDC_SUBCLASS_ACM 0x02 // Abstract Control Model
    28 #define CDC_SUBCLASS_TCM 0x03 // Telephone Control Model
    29 #define CDC_SUBCLASS_MCCM 0x04 // Multi Channel Control Model
    30 #define CDC_SUBCLASS_CAPI 0x05 // CAPI Control Model
    31 #define CDC_SUBCLASS_ETHERNET 0x06 // Ethernet Network Control Model
    32 #define CDC_SUBCLASS_ATM 0x07 // ATM Network Control Model
    33 #define CDC_SUBCLASS_WIRELESS_HANDSET 0x08 // Wireless Handset Control Model
    34 #define CDC_SUBCLASS_DEVICE_MANAGEMENT 0x09 // Device Management
    35 #define CDC_SUBCLASS_MOBILE_DIRECT_LINE 0x0A // Mobile Direct Line Model
    36 #define CDC_SUBCLASS_OBEX 0x0B // OBEX
    37 #define CDC_SUBCLASS_ETHERNET_EMU 0x0C // Ethernet Emulation Model
    38 
    39 // Communication Interface Class Control Protocol Codes
    40 #define CDC_PROTOCOL_ITU_T_V_250 0x01 // AT Commands defined by ITU-T V.250
    41 #define CDC_PROTOCOL_PCCA_101 0x02 // AT Commands defined by PCCA-101
    42 #define CDC_PROTOCOL_PCCA_101_O 0x03 // AT Commands defined by PCCA-101 & Annex O
    43 #define CDC_PROTOCOL_GSM_7_07 0x04 // AT Commands defined by GSM 7.07
    44 #define CDC_PROTOCOL_3GPP_27_07 0x05 // AT Commands defined by 3GPP 27.007
    45 #define CDC_PROTOCOL_C_S0017_0 0x06 // AT Commands defined by TIA for CDMA
    46 #define CDC_PROTOCOL_USB_EEM 0x07 // Ethernet Emulation Model
    47 
    48 // CDC Commands defined by CDC 1.2
    49 #define CDC_SEND_ENCAPSULATED_COMMAND 0x00
    50 #define CDC_GET_ENCAPSULATED_RESPONSE 0x01
    51 
    52 // CDC Commands defined by PSTN 1.2
    53 #define CDC_SET_COMM_FEATURE 0x02
    54 #define CDC_GET_COMM_FEATURE 0x03
    55 #define CDC_CLEAR_COMM_FEATURE 0x04
    56 #define CDC_SET_AUX_LINE_STATE 0x10
    57 #define CDC_SET_HOOK_STATE 0x11
    58 #define CDC_PULSE_SETUP 0x12
    59 #define CDC_SEND_PULSE 0x13
    60 #define CDC_SET_PULSE_TIME 0x14
    61 #define CDC_RING_AUX_JACK 0x15
    62 #define CDC_SET_LINE_CODING 0x20
    63 #define CDC_GET_LINE_CODING 0x21
    64 #define CDC_SET_CONTROL_LINE_STATE 0x22
    65 #define CDC_SEND_BREAK 0x23
    66 #define CDC_SET_RINGER_PARMS 0x30
    67 #define CDC_GET_RINGER_PARMS 0x31
    68 #define CDC_SET_OPERATION_PARMS 0x32
    69 #define CDC_GET_OPERATION_PARMS 0x33
    70 #define CDC_SET_LINE_PARMS 0x34
    71 #define CDC_GET_LINE_PARMS 0x35
    72 #define CDC_DIAL_DIGITS 0x36
    73 
    74 //Class-Specific Notification Codes
    75 #define NETWORK_CONNECTION 0x00
    76 #define RESPONSE_AVAILABLE 0x01
    77 #define AUX_JACK_HOOK_STATE 0x08
    78 #define RING_DETECT 0x09
    79 #define SERIAL_STATE 0x20
    80 #define CALL_STATE_CHANGE 0x28
    81 #define LINE_STATE_CHANGE 0x29
    82 #define CONNECTION_SPEED_CHANGE 0x2a
    83 
    84 // CDC Functional Descriptor Structures
    85 
    86 typedef struct {
    87  uint8_t bFunctionLength;
    88  uint8_t bDescriptorType;
    90  uint8_t bmCapabilities;
    91  uint8_t bDataInterface;
    93 
    94 typedef struct {
    95  uint8_t bFunctionLength;
    96  uint8_t bDescriptorType;
    98  uint8_t bmCapabilities;
    101 
    102 typedef struct {
    109 
    110 typedef struct {
    111  uint32_t dwDTERate; // Data Terminal Rate in bits per second
    112  uint8_t bCharFormat; // 0 - 1 stop bit, 1 - 1.5 stop bits, 2 - 2 stop bits
    113  uint8_t bParityType; // 0 - None, 1 - Odd, 2 - Even, 3 - Mark, 4 - Space
    114  uint8_t bDataBits; // Data bits (5, 6, 7, 8 or 16)
    115 } LINE_CODING;
    116 
    117 typedef struct {
    118  uint8_t bmRequestType; // 0xa1 for class-specific notifications
    119  uint8_t bNotification;
    120  uint16_t wValue;
    121  uint16_t wIndex;
    122  uint16_t wLength;
    123  uint16_t bmState; //UART state bitmap for SERIAL_STATE, other notifications variable length
    125 
    126 class ACM;
    127 
    129 public:
    130 
    131  virtual uint8_t OnInit(ACM *pacm __attribute__((unused))) {
    132  return 0;
    133  };
    134  //virtual void OnDataRcvd(ACM *pacm, uint8_t nbytes, uint8_t *dataptr) = 0;
    135  //virtual void OnDisconnected(ACM *pacm) = 0;
    136 };
    137 
    143 typedef struct {
    144 
    145  union {
    146  uint8_t tty;
    147 
    148  struct {
    149  bool enhanced : 1; // Do we have the ability to set/clear any features?
    150  // Status and 8th bit in data stream.
    151  // Presence only indicates feature is available, but this isn't used for CDC-ACM.
    152  bool wide : 1;
    153  bool autoflow_RTS : 1; // Has autoflow on RTS/CTS
    154  bool autoflow_DSR : 1; // Has autoflow on DTR/DSR
    155  bool autoflow_XON : 1; // Has autoflow XON/XOFF
    156  bool half_duplex : 1; // Has half-duplex capability.
    157  } __attribute__((packed));
    158  };
    159 } tty_features;
    160 
    161 #define ACM_MAX_ENDPOINTS 4
    162 
    163 class ACM : public USBDeviceConfig, public UsbConfigXtracter {
    164 protected:
    167  uint8_t bAddress;
    168  uint8_t bConfNum; // configuration number
    169  uint8_t bControlIface; // Control interface value
    170  uint8_t bDataIface; // Data interface value
    171  uint8_t bNumEP; // total number of EP in the configuration
    172  uint32_t qNextPollTime; // next poll time
    173  volatile bool bPollEnable; // poll enable flag
    174  volatile bool ready; //device ready indicator
    175  tty_features _enhanced_status; // current status
    176 
    177  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
    178 
    179 public:
    180  static const uint8_t epDataInIndex; // DataIn endpoint index
    181  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    182  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
    184 
    185  ACM(USB *pusb, CDCAsyncOper *pasync);
    186 
    187  uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr);
    188  uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr);
    189  uint8_t ClearCommFeature(uint16_t fid);
    190  uint8_t SetLineCoding(const LINE_CODING *dataptr);
    191  uint8_t GetLineCoding(LINE_CODING *dataptr);
    192  uint8_t SetControlLineState(uint8_t state);
    193  uint8_t SendBreak(uint16_t duration);
    194  uint8_t GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr);
    195 
    196  // Methods for receiving and sending data
    197  uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr);
    198  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    199 
    200  // USBDeviceConfig implementation
    201  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    202  uint8_t Release();
    203  uint8_t Poll();
    204 
    205  bool available(void) {
    206  return false;
    207  };
    208 
    209  virtual uint8_t GetAddress() {
    210  return bAddress;
    211  };
    212 
    213  virtual bool isReady() {
    214  return ready;
    215  };
    216 
    218  return _enhanced_status;
    219  };
    220 
    222  tty_features rv;
    223  rv.enhanced = false;
    224  rv.autoflow_RTS = false;
    225  rv.autoflow_DSR = false;
    226  rv.autoflow_XON = false;
    227  rv.half_duplex = false;
    228  rv.wide = false;
    229  return rv;
    230  };
    231 
    232  virtual void autoflowRTS(bool s __attribute__((unused))) {
    233  };
    234 
    235  virtual void autoflowDSR(bool s __attribute__((unused))) {
    236  };
    237 
    238  virtual void autoflowXON(bool s __attribute__((unused))) {
    239  };
    240 
    241  virtual void half_duplex(bool s __attribute__((unused))) {
    242  };
    243 
    244  virtual void wide(bool s __attribute__((unused))) {
    245  };
    246 
    247  // UsbConfigXtracter implementation
    248  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    249 };
    250 
    251 #endif // __CDCACM_H__
    uint16_t wIndex
    Definition: cdcacm.h:121
    virtual tty_features enhanced_features(void)
    Definition: cdcacm.h:221
    bool available(void)
    Definition: cdcacm.h:205
    -
    ACM(USB *pusb, CDCAsyncOper *pasync)
    Definition: cdcacm.cpp:23
    virtual uint8_t OnInit(ACM *pacm)
    Definition: cdcacm.h:131
    static const uint8_t epInterruptInIndex
    Definition: cdcacm.h:182
    virtual uint8_t GetAddress()
    Definition: cdcacm.h:209
    @@ -355,7 +109,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    virtual void autoflowRTS(bool s)
    Definition: cdcacm.h:232
    uint8_t bNumEP
    Definition: cdcacm.h:171
    -
    EpInfo epInfo[ACM_MAX_ENDPOINTS]
    Definition: cdcacm.h:183
    uint8_t tty
    Definition: cdcacm.h:146
    @@ -366,11 +119,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t bNumRingerPatterns
    Definition: cdcacm.h:107
    uint8_t bDescriptorSubtype
    Definition: cdcacm.h:97
    uint16_t bmState
    Definition: cdcacm.h:123
    -
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: cdcacm.cpp:352
    CDCAsyncOper * pAsync
    Definition: cdcacm.h:166
    #define ACM_MAX_ENDPOINTS
    Definition: cdcacm.h:161
    virtual void wide(bool s)
    Definition: cdcacm.h:244
    -
    uint8_t GetLineCoding(LINE_CODING *dataptr)
    Definition: cdcacm.cpp:328
    uint8_t bDescriptorType
    Definition: cdcacm.h:96
    bool enhanced
    Definition: cdcacm.h:149
    @@ -378,13 +129,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    virtual void autoflowXON(bool s)
    Definition: cdcacm.h:238
    uint8_t bRingerVolSteps
    Definition: cdcacm.h:106
    bool autoflow_XON
    Definition: cdcacm.h:155
    -
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:288
    bool autoflow_RTS
    Definition: cdcacm.h:153
    -
    uint8_t Poll()
    Definition: cdcacm.cpp:272
    Definition: address.h:39
    uint8_t bmCapabilities
    Definition: cdcacm.h:98
    uint8_t bDescriptorSubtype
    Definition: cdcacm.h:105
    -
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcacm.cpp:46
    uint8_t bmRequestType
    Definition: cdcacm.h:118
    bool autoflow_DSR
    Definition: cdcacm.h:154
    @@ -393,19 +141,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t bAddress
    Definition: cdcacm.h:167
    virtual bool isReady()
    Definition: cdcacm.h:213
    -
    uint8_t SetLineCoding(const LINE_CODING *dataptr)
    Definition: cdcacm.cpp:320
    uint8_t bFunctionLength
    Definition: cdcacm.h:103
    struct ACM_FUNC_DESCR TEL_CALL_STATE_REP_CPBL_FUNC_DESCR
    -
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcacm.cpp:231
    -
    uint8_t SendBreak(uint16_t duration)
    Definition: cdcacm.cpp:344
    uint16_t wLength
    Definition: cdcacm.h:122
    -
    uint8_t GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr)
    uint32_t dwDTERate
    Definition: cdcacm.h:111
    -
    uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:304
    bool half_duplex
    Definition: cdcacm.h:156
    -
    uint8_t Release()
    Definition: cdcacm.cpp:258
    uint8_t bConfNum
    Definition: cdcacm.h:168
    struct ACM_FUNC_DESCR TEL_OPER_MODES_FUNC_DESCR
    @@ -414,20 +156,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Definition: cdcacm.h:163
    uint8_t bDescriptorType
    Definition: cdcacm.h:104
    tty_features _enhanced_status
    Definition: cdcacm.h:175
    -
    uint8_t SetControlLineState(uint8_t state)
    Definition: cdcacm.cpp:336
    -
    uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:296
    -
    uint8_t ClearCommFeature(uint16_t fid)
    Definition: cdcacm.cpp:312
    struct ACM_FUNC_DESCR DLM_FUNC_DESCR
    virtual void half_duplex(bool s)
    Definition: cdcacm.h:241
    uint8_t bFunctionLength
    Definition: cdcacm.h:87
    uint8_t bmCapabilities
    Definition: cdcacm.h:90
    -
    uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
    Definition: cdcacm.cpp:280
    diff --git a/cdcftdi_8cpp.html b/cdcftdi_8cpp.html index 67133e0a..c35f07cf 100644 --- a/cdcftdi_8cpp.html +++ b/cdcftdi_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcftdi.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,13 +86,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcftdi.cpp File Reference
    -
    #include "cdcftdi.h"
    +
    #include "cdcftdi.h"
    Include dependency graph for cdcftdi.cpp:
    - + + +

    Go to the source code of this file.

    @@ -100,7 +103,7 @@ Include dependency graph for cdcftdi.cpp:
    diff --git a/cdcftdi_8cpp__incl.map b/cdcftdi_8cpp__incl.map index b83c2a5f..3ee0a9ea 100644 --- a/cdcftdi_8cpp__incl.map +++ b/cdcftdi_8cpp__incl.map @@ -1,4 +1,4 @@ - - + + diff --git a/cdcftdi_8cpp__incl.md5 b/cdcftdi_8cpp__incl.md5 index 958e3057..f6dd1fa8 100644 --- a/cdcftdi_8cpp__incl.md5 +++ b/cdcftdi_8cpp__incl.md5 @@ -1 +1 @@ -65fc37f20195417aa899b408712d428a \ No newline at end of file +e865f32d985af2b4d5e2da82e7c52bae \ No newline at end of file diff --git a/cdcftdi_8cpp__incl.png b/cdcftdi_8cpp__incl.png index 12496f72b29b02028835d98edf3dc940ad637fd5..fe259a2242a87dacd30968d3db67802441af0631 100644 GIT binary patch literal 3043 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 literal 3391 zcmcInc{r478-I}{SyPl<$~r_CvJOo{ma&hetO+revNe`w?1Zr;A(Z7v6sZ}?9-WLB z`<87EveVdizW1E-o%7H4_jkR&_kHf`ey;bv?)!P}=Xc*vya`g5m6?|r007oodT=vv zbOhg8CI;}E?Ud6G4h+r)x^Up+&*x=*NjdfoA z?Q}~08E-qv7A8BOA4bo^q3V@H`Cu@Xw<1LETzKE;1eV=9yk(iw{neW9b+muW%m9>^ zkL#n-dnM;G3pB*640fdu&(iYiNZu*RspdnMk8GatwbOHXA>^aZBi}AN*V)5!a5zWh zs~I*5QkTgQ@i)90DWB%@TCx<}RGhP@Gcz-kx78E81Vbn6`63gEl$@M|sHi9$gL2Q_ zQbl9;#01+x0$E-c04}gFK>$eMa+;dPDtqcUnS5=BAyUKq5jE zSi*av(eQist~^Odc#qj|9Tgy2)EebLX@K_jcK&C@`x(3uMa1i4tMfgDugl9@+cTus zwnu$h&`^WHJ=%&>q1z*FDi3Fv78e((`%4wmQ(qHycc+tSfX>cNcMp#*p97XEgMQgt zpis^`tK-Pg`h(S40Qc+}ckI2=#~Mii&%3lv_yYn0hTq?1#0#j!7;Eme7OVPD^4tpHh`t_@J#n5OBV`(5cWpSv_I(DSy zfoNJ3Tb3?)5Ajwpn#FIwY6O!G$2d- zevmJk9R>3)$%!tRo0<9kY(Jm5Sl3)8Dl99@hCSXZc{|qA;NXx>PGkCK$+9EEE98cx^z-hLT6p4#y70Vr>#AZD0Hmg-S~rA# z8VzWGF##N0T#cE`kIW zV6{PQkZ4$Vx*0F++vwH9Bm8K}oeQZnQd?5{tndLyEizp0wqq`%E^c*T9 zh;tqbIL8btNzi@#_#uUM?6xkgrch{?-|0T{|6I&n7jn(w(7Czq#)ZD&pm@b*1D2fW+0t zpbk^&e4*d-f;Bc9X6w(2*nSMG)WUh8H!G17gNM+&6F9AF}=lc zTgixqk3V#JJ$OERlV7(qH=icUUa7|8&hW^-eEG7eV#7T+W*SpM*GbM*v&$xhUG`?z zCXq;T7g$!IwW7m~*v3&Wmyol05==B5f8$gJ4v%M(;MZ6dqTzg1P(TYZpZCsE`NMZS-V=fTW~kTypZaY$Z?X&Lozu@;C1CiV9s6io2k& zP(En&4!>Gp$NgIH+yR3#n)r6JqtDk`!!|mVK`w!z(GZXaL+f<;DP*q?&5pv6&6M^1 zt*x!6nVGs;Cx;5TssT?ngEcIzthhLPz}O{4M8a)tZRdN74f=ol(2tLgKLx8A|KvC4 z?lQa$66DGdff10oO-$TBI4J$}DGTTxD6={uV&mctr5yJ+7y5g9ou#X*t4G^yY-~1r zbcK>^v0Zr@ppje!8ql>%6zU%>aJb8RYqZy$uUs^b!+7@(el?0JDDfYP^ghuEM@5JWic^)uu8!C%&q>xL0X`8vPD*Fs`ja{r56PPv>;{w;n+}ZikeS)nm z!Q(u*hMb%|6pHY`(2zL-!Eh6S=%r&hN8#9%&wJnopjH8v^PhT2-~2Iqv_a*1tkcn0V++8)yENkNNH|R0EjL za6^2{l5W#RtQ^4V>j$sSOau%W&FYmytSg%W6=tQX_FfT1;ZirkhyFG3{}9?d)>rwI z862VPKiXTc4z+2oz@a}+7mMHKLTQRj9U ze%b8ee)`l@C`lCd7FF=t9RY~03)-BH!w3i?|lnQgD@0Y4CD5u1U z{xxI6w7XbVk&>U!o`j&wMaI^L?BL%_R{IF`_VsZJ2_+}-DNp^L#5cX!nj+bCvEg%} zr-w(HVcINHV)|vbnTLfvdQMJGA47J$7gtw*19>RF-$UtQ65_U5UaVkn963+J0L=WS zsj1pm>!@F9MmNOFCwzsBjEuYqsh8%HapB=KEUc`}?ut5vJrt67KHR}U=u1nB*HYcu z?|f|?9Z~ibx?Wx~+1c5@uT*^g%-hq`1NMaUz~1caNLc*DV}nuUdhV`sJ!)0s1Lj^j=S&mh`q_y)Fce8M$`d{6`4h=5x+k??mq HjuHO>=6gvx diff --git a/cdcftdi_8cpp_source.html b/cdcftdi_8cpp_source.html index 8cc147ef..b5088307 100644 --- a/cdcftdi_8cpp_source.html +++ b/cdcftdi_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcftdi.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,415 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcftdi.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #include "cdcftdi.h"
    -
    18 
    -
    19 const uint8_t FTDI::epDataInIndex = 1;
    -
    20 const uint8_t FTDI::epDataOutIndex = 2;
    -
    21 const uint8_t FTDI::epInterruptInIndex = 3;
    -
    22 
    -
    23 FTDI::FTDI(USB *p, FTDIAsyncOper *pasync, uint16_t idProduct) :
    -
    24 pAsync(pasync),
    -
    25 pUsb(p),
    -
    26 bAddress(0),
    -
    27 bNumEP(1),
    -
    28 wFTDIType(0),
    -
    29 wIdProduct(idProduct) {
    -
    30  for(uint8_t i = 0; i < FTDI_MAX_ENDPOINTS; i++) {
    -
    31  epInfo[i].epAddr = 0;
    -
    32  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    33  epInfo[i].bmSndToggle = 0;
    -
    34  epInfo[i].bmRcvToggle = 0;
    -
    35  epInfo[i].bmNakPower = (i == epDataInIndex) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
    -
    36  }
    -
    37  if(pUsb)
    -
    38  pUsb->RegisterDeviceClass(this);
    -
    39 }
    -
    40 
    -
    41 uint8_t FTDI::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    42  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    43 
    -
    44  uint8_t buf[constBufSize];
    -
    45  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    46  uint8_t rcode;
    -
    47  UsbDevice *p = NULL;
    -
    48  EpInfo *oldep_ptr = NULL;
    -
    49 
    -
    50  uint8_t num_of_conf; // number of configurations
    -
    51 
    -
    52  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    53 
    -
    54  USBTRACE("FTDI Init\r\n");
    -
    55 
    -
    56  if(bAddress) {
    -
    57  USBTRACE("FTDI CLASS IN USE??\r\n");
    - -
    59  }
    -
    60  // Get pointer to pseudo device with address 0 assigned
    -
    61  p = addrPool.GetUsbDevicePtr(0);
    -
    62 
    -
    63  if(!p) {
    -
    64  USBTRACE("FTDI NO ADDRESS??\r\n");
    - -
    66  }
    -
    67  if(!p->epinfo) {
    -
    68  USBTRACE("epinfo\r\n");
    - -
    70  }
    -
    71 
    -
    72  // Save old pointer to EP_RECORD of address 0
    -
    73  oldep_ptr = p->epinfo;
    -
    74 
    -
    75  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    76  p->epinfo = epInfo;
    -
    77 
    -
    78  p->lowspeed = lowspeed;
    -
    79 
    -
    80  // Get device descriptor
    -
    81  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), buf);
    -
    82 
    -
    83  // Restore p->epinfo
    -
    84  p->epinfo = oldep_ptr;
    -
    85 
    -
    86  if(rcode) {
    -
    87  goto FailGetDevDescr;
    -
    88  }
    -
    89  if(udd->idVendor != FTDI_VID || udd->idProduct != wIdProduct) {
    -
    90  USBTRACE("FTDI Init: Product not supported\r\n");
    -
    91  USBTRACE2("Expected VID:", FTDI_VID);
    -
    92  USBTRACE2("Found VID:", udd->idVendor);
    -
    93 
    -
    94  USBTRACE2("Expected PID:", wIdProduct);
    -
    95  USBTRACE2("Found PID:", udd->idProduct);
    - -
    97  }
    -
    98 
    -
    99  // Save type of FTDI chip
    -
    100  wFTDIType = udd->bcdDevice;
    -
    101 
    -
    102  // Allocate new address according to device class
    -
    103  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    104 
    -
    105  if(!bAddress)
    - -
    107 
    -
    108  // Extract Max Packet Size from the device descriptor
    -
    109  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    -
    110  // Some devices set endpoint lengths to zero, which is incorrect.
    -
    111  // we should check them, and if zero, set them to 64.
    -
    112  if(epInfo[0].maxPktSize == 0) epInfo[0].maxPktSize = 64;
    -
    113 
    -
    114  // Assign new address to the device
    -
    115  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    116 
    -
    117  if(rcode) {
    -
    118  p->lowspeed = false;
    -
    119  addrPool.FreeAddress(bAddress);
    -
    120  bAddress = 0;
    -
    121  USBTRACE2("setAddr:", rcode);
    -
    122  return rcode;
    -
    123  }
    -
    124 
    -
    125  USBTRACE2("Addr:", bAddress);
    -
    126 
    -
    127  p->lowspeed = false;
    -
    128 
    -
    129  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    130 
    -
    131  if(!p)
    - -
    133 
    -
    134  p->lowspeed = lowspeed;
    -
    135 
    -
    136  num_of_conf = udd->bNumConfigurations;
    -
    137 
    -
    138  // Assign epInfo to epinfo pointer
    -
    139  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    140 
    -
    141  if(rcode)
    -
    142  goto FailSetDevTblEntry;
    -
    143 
    -
    144  USBTRACE2("NC:", num_of_conf);
    -
    145 
    -
    146  for(uint8_t i = 0; i < num_of_conf; i++) {
    - -
    148 
    -
    149  // This interferes with serial output, and should be opt-in for debugging.
    -
    150  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
    -
    151  //rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
    -
    152  //if(rcode)
    -
    153  // goto FailGetConfDescr;
    -
    154 
    -
    155  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    156 
    -
    157  if(rcode)
    -
    158  goto FailGetConfDescr;
    -
    159 
    -
    160  if(bNumEP > 1)
    -
    161  break;
    -
    162  } // for
    -
    163 
    -
    164  if(bNumEP < 2)
    - -
    166 
    -
    167  USBTRACE2("NumEP:", bNumEP);
    -
    168 
    -
    169  // Assign epInfo to epinfo pointer
    -
    170  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    -
    171 
    -
    172  USBTRACE2("Conf:", bConfNum);
    -
    173 
    -
    174  // Set Configuration Value
    -
    175  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    176 
    -
    177  if(rcode)
    -
    178  goto FailSetConfDescr;
    -
    179 
    -
    180  // default latency is 16ms on-chip, reduce it to 1
    -
    181  rcode = SetLatency(1);
    -
    182  if(rcode)
    -
    183  goto FailOnLatency;
    -
    184 
    -
    185 
    -
    186  rcode = pAsync->OnInit(this);
    -
    187 
    -
    188  if(rcode)
    -
    189  goto FailOnInit;
    -
    190 
    -
    191  USBTRACE("FTDI configured\r\n");
    -
    192 
    -
    193  ready = true;
    -
    194  return 0;
    -
    195 
    -
    196 FailOnLatency:
    -
    197 #ifdef DEBUG_USB_HOST
    -
    198  USBTRACE("SetLatency: ");
    -
    199  goto Fail;
    -
    200 #endif
    -
    201 
    -
    202 FailGetDevDescr:
    -
    203 #ifdef DEBUG_USB_HOST
    - -
    205  goto Fail;
    -
    206 #endif
    -
    207 
    -
    208 FailSetDevTblEntry:
    -
    209 #ifdef DEBUG_USB_HOST
    - -
    211  goto Fail;
    -
    212 #endif
    -
    213 
    -
    214 FailGetConfDescr:
    -
    215 #ifdef DEBUG_USB_HOST
    - -
    217  goto Fail;
    -
    218 #endif
    -
    219 
    -
    220 FailSetConfDescr:
    -
    221 #ifdef DEBUG_USB_HOST
    - -
    223  goto Fail;
    -
    224 #endif
    -
    225 
    -
    226 FailOnInit:
    -
    227 #ifdef DEBUG_USB_HOST
    -
    228  USBTRACE("OnInit:");
    -
    229 
    -
    230 Fail:
    -
    231  NotifyFail(rcode);
    -
    232 #endif
    -
    233  Release();
    -
    234  return rcode;
    -
    235 }
    -
    236 
    -
    237 void FTDI::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    238  ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
    -
    239  ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
    -
    240  ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
    -
    241 
    -
    242  bConfNum = conf;
    -
    243 
    -
    244  uint8_t index;
    -
    245 
    -
    246  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80)
    -
    247  index = epInterruptInIndex;
    - -
    249  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    -
    250  else
    -
    251  return;
    -
    252 
    -
    253  // Fill in the endpoint info structure
    -
    254  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    255  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    256  epInfo[index].bmSndToggle = 0;
    -
    257  epInfo[index].bmRcvToggle = 0;
    -
    258  // Some device vendors set endpoint lengths to zero, which is incorrect.
    -
    259  // Check, and if zero, set to 64.
    -
    260  if(epInfo[index].maxPktSize == 0) epInfo[index].maxPktSize = 64;
    -
    261 
    -
    262  bNumEP++;
    -
    263 
    -
    264  PrintEndpointDescriptor(pep);
    -
    265 }
    -
    266 
    -
    267 uint8_t FTDI::Release() {
    -
    268  pUsb->GetAddressPool().FreeAddress(bAddress);
    -
    269 
    -
    270  bAddress = 0;
    -
    271  bNumEP = 1;
    -
    272  qNextPollTime = 0;
    -
    273  bPollEnable = false;
    -
    274  ready = false;
    -
    275  return pAsync->OnRelease(this);
    -
    276 }
    -
    277 
    -
    278 uint8_t FTDI::Poll() {
    -
    279  uint8_t rcode = 0;
    -
    280 
    -
    281  //if (!bPollEnable)
    -
    282  // return 0;
    -
    283 
    -
    284  //if (qNextPollTime <= (uint32_t)millis())
    -
    285  //{
    -
    286  // USB_HOST_SERIAL.println(bAddress, HEX);
    -
    287 
    -
    288  // qNextPollTime = (uint32_t)millis() + 100;
    -
    289  //}
    -
    290  return rcode;
    -
    291 }
    -
    292 
    -
    293 uint8_t FTDI::SetBaudRate(uint32_t baud) {
    -
    294  uint16_t baud_value, baud_index = 0;
    -
    295  uint32_t divisor3;
    -
    296  divisor3 = 48000000 / 2 / baud; // divisor shifted 3 bits to the left
    -
    297 
    -
    298  if(wFTDIType == FT232AM) {
    -
    299  if((divisor3 & 0x7) == 7)
    -
    300  divisor3++; // round x.7/8 up to x+1
    -
    301 
    -
    302  baud_value = divisor3 >> 3;
    -
    303  divisor3 &= 0x7;
    -
    304 
    -
    305  if(divisor3 == 1) baud_value |= 0xc000;
    -
    306  else // 0.125
    -
    307  if(divisor3 >= 4) baud_value |= 0x4000;
    -
    308  else // 0.5
    -
    309  if(divisor3 != 0) baud_value |= 0x8000; // 0.25
    -
    310  if(baud_value == 1) baud_value = 0; /* special case for maximum baud rate */
    -
    311  } else {
    -
    312  static const uint8_t divfrac [8] = {0, 3, 2, 0, 1, 1, 2, 3};
    -
    313  static const uint8_t divindex[8] = {0, 0, 0, 1, 0, 1, 1, 1};
    -
    314 
    -
    315  baud_value = divisor3 >> 3;
    -
    316  baud_value |= divfrac [divisor3 & 0x7] << 14;
    -
    317  baud_index = divindex[divisor3 & 0x7];
    -
    318 
    -
    319  /* Deal with special cases for highest baud rates. */
    -
    320  if(baud_value == 1) baud_value = 0;
    -
    321  else // 1.0
    -
    322  if(baud_value == 0x4001) baud_value = 1; // 1.5
    -
    323  }
    -
    324  USBTRACE2("baud_value:", baud_value);
    -
    325  USBTRACE2("baud_index:", baud_index);
    -
    326  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_BAUD_RATE, baud_value & 0xff, baud_value >> 8, baud_index, 0, 0, NULL, NULL);
    -
    327  if(rv && rv != hrNAK) {
    -
    328  Release();
    -
    329  }
    -
    330  return rv;
    -
    331 }
    -
    332 
    -
    333 // No docs on if this is 8 or 16 bit, so play it safe, make maximum 255ms
    -
    334 
    -
    335 uint8_t FTDI::SetLatency(uint8_t l) {
    -
    336  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_LATENCY_TIMER, l, 0, 0, 0, 0, NULL, NULL);
    -
    337  if(rv && rv != hrNAK) {
    -
    338  Release();
    -
    339  }
    -
    340  return rv;
    -
    341 }
    -
    342 
    -
    343 // No docs on if this is 8 or 16 bit, so play it safe, make maximum 255ms
    -
    344 
    -
    345 uint8_t FTDI::GetLatency(uint8_t *l) {
    -
    346  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_GET_LATENCY_TIMER, 0, 0, 0, 0, 1, (uint8_t *)l, NULL);
    -
    347  if(rv && rv != hrNAK) {
    -
    348  Release();
    -
    349  }
    -
    350  return rv;
    -
    351 }
    -
    352 
    -
    353 uint8_t FTDI::SetModemControl(uint16_t signal) {
    -
    354  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_MODEM_CTRL, signal & 0xff, signal >> 8, 0, 0, 0, NULL, NULL);
    -
    355  if(rv && rv != hrNAK) {
    -
    356  Release();
    -
    357  }
    -
    358  return rv;
    -
    359 }
    -
    360 
    -
    361 uint8_t FTDI::SetFlowControl(uint8_t protocol, uint8_t xon, uint8_t xoff) {
    -
    362  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_FLOW_CTRL, xon, xoff, protocol << 8, 0, 0, NULL, NULL);
    -
    363  if(rv && rv != hrNAK) {
    -
    364  Release();
    -
    365  }
    -
    366  return rv;
    -
    367 }
    -
    368 
    -
    369 uint8_t FTDI::SetData(uint16_t databm) {
    -
    370  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_DATA, databm & 0xff, databm >> 8, 0, 0, 0, NULL, NULL);
    -
    371  if(rv && rv != hrNAK) {
    -
    372  Release();
    -
    373  }
    -
    374  return rv;
    -
    375 }
    -
    376 
    -
    377 uint8_t FTDI::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    -
    378  uint8_t rv = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    -
    379  if(rv && rv != hrNAK) {
    -
    380  Release();
    -
    381  }
    -
    382  return rv;
    -
    383 }
    -
    384 
    -
    385 uint8_t FTDI::SndData(uint16_t nbytes, uint8_t *dataptr) {
    -
    386  uint8_t rv = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    -
    387  if(rv && rv != hrNAK) {
    -
    388  Release();
    -
    389  }
    -
    390  return rv;
    -
    391 }
    -
    392 
    -
    393 void FTDI::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr) {
    -
    394  Notify(PSTR("Endpoint descriptor:"), 0x80);
    -
    395  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    -
    396  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    -
    397  Notify(PSTR("\r\nType:\t\t"), 0x80);
    -
    398  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    -
    399  Notify(PSTR("\r\nAddress:\t"), 0x80);
    -
    400  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    -
    401  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    -
    402  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    -
    403  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    -
    404  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    -
    405  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    -
    406  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    -
    407  Notify(PSTR("\r\n"), 0x80);
    -
    408 }
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #include "cdcftdi.h"
    18 
    19 const uint8_t FTDI::epDataInIndex = 1;
    20 const uint8_t FTDI::epDataOutIndex = 2;
    21 const uint8_t FTDI::epInterruptInIndex = 3;
    22 
    23 FTDI::FTDI(USB *p, FTDIAsyncOper *pasync, uint16_t idProduct) :
    24 pAsync(pasync),
    25 pUsb(p),
    26 bAddress(0),
    27 bNumEP(1),
    28 wFTDIType(0),
    29 wIdProduct(idProduct) {
    30  for(uint8_t i = 0; i < FTDI_MAX_ENDPOINTS; i++) {
    31  epInfo[i].epAddr = 0;
    32  epInfo[i].maxPktSize = (i) ? 0 : 8;
    33  epInfo[i].bmSndToggle = 0;
    34  epInfo[i].bmRcvToggle = 0;
    35  epInfo[i].bmNakPower = (i == epDataInIndex) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
    36  }
    37  if(pUsb)
    38  pUsb->RegisterDeviceClass(this);
    39 }
    40 
    41 uint8_t FTDI::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    42  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    43 
    44  uint8_t buf[constBufSize];
    45  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    46  uint8_t rcode;
    47  UsbDevice *p = NULL;
    48  EpInfo *oldep_ptr = NULL;
    49 
    50  uint8_t num_of_conf; // number of configurations
    51 
    52  AddressPool &addrPool = pUsb->GetAddressPool();
    53 
    54  USBTRACE("FTDI Init\r\n");
    55 
    56  if(bAddress) {
    57  USBTRACE("FTDI CLASS IN USE??\r\n");
    59  }
    60  // Get pointer to pseudo device with address 0 assigned
    61  p = addrPool.GetUsbDevicePtr(0);
    62 
    63  if(!p) {
    64  USBTRACE("FTDI NO ADDRESS??\r\n");
    66  }
    67  if(!p->epinfo) {
    68  USBTRACE("epinfo\r\n");
    70  }
    71 
    72  // Save old pointer to EP_RECORD of address 0
    73  oldep_ptr = p->epinfo;
    74 
    75  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    76  p->epinfo = epInfo;
    77 
    78  p->lowspeed = lowspeed;
    79 
    80  // Get device descriptor
    81  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), buf);
    82 
    83  // Restore p->epinfo
    84  p->epinfo = oldep_ptr;
    85 
    86  if(rcode) {
    87  goto FailGetDevDescr;
    88  }
    89  if(udd->idVendor != FTDI_VID || udd->idProduct != wIdProduct) {
    90  USBTRACE("FTDI Init: Product not supported\r\n");
    91  USBTRACE2("Expected VID:", FTDI_VID);
    92  USBTRACE2("Found VID:", udd->idVendor);
    93 
    94  USBTRACE2("Expected PID:", wIdProduct);
    95  USBTRACE2("Found PID:", udd->idProduct);
    97  }
    98 
    99  // Save type of FTDI chip
    100  wFTDIType = udd->bcdDevice;
    101 
    102  // Allocate new address according to device class
    103  bAddress = addrPool.AllocAddress(parent, false, port);
    104 
    105  if(!bAddress)
    107 
    108  // Extract Max Packet Size from the device descriptor
    109  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    110  // Some devices set endpoint lengths to zero, which is incorrect.
    111  // we should check them, and if zero, set them to 64.
    112  if(epInfo[0].maxPktSize == 0) epInfo[0].maxPktSize = 64;
    113 
    114  // Assign new address to the device
    115  rcode = pUsb->setAddr(0, 0, bAddress);
    116 
    117  if(rcode) {
    118  p->lowspeed = false;
    119  addrPool.FreeAddress(bAddress);
    120  bAddress = 0;
    121  USBTRACE2("setAddr:", rcode);
    122  return rcode;
    123  }
    124 
    125  USBTRACE2("Addr:", bAddress);
    126 
    127  p->lowspeed = false;
    128 
    129  p = addrPool.GetUsbDevicePtr(bAddress);
    130 
    131  if(!p)
    133 
    134  p->lowspeed = lowspeed;
    135 
    136  num_of_conf = udd->bNumConfigurations;
    137 
    138  // Assign epInfo to epinfo pointer
    139  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    140 
    141  if(rcode)
    142  goto FailSetDevTblEntry;
    143 
    144  USBTRACE2("NC:", num_of_conf);
    145 
    146  for(uint8_t i = 0; i < num_of_conf; i++) {
    148 
    149  // This interferes with serial output, and should be opt-in for debugging.
    150  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
    151  //rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
    152  //if(rcode)
    153  // goto FailGetConfDescr;
    154 
    155  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    156 
    157  if(rcode)
    158  goto FailGetConfDescr;
    159 
    160  if(bNumEP > 1)
    161  break;
    162  } // for
    163 
    164  if(bNumEP < 2)
    166 
    167  USBTRACE2("NumEP:", bNumEP);
    168 
    169  // Assign epInfo to epinfo pointer
    170  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    171 
    172  USBTRACE2("Conf:", bConfNum);
    173 
    174  // Set Configuration Value
    175  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    176 
    177  if(rcode)
    178  goto FailSetConfDescr;
    179 
    180  // default latency is 16ms on-chip, reduce it to 1
    181  rcode = SetLatency(1);
    182  if(rcode)
    183  goto FailOnLatency;
    184 
    185 
    186  rcode = pAsync->OnInit(this);
    187 
    188  if(rcode)
    189  goto FailOnInit;
    190 
    191  USBTRACE("FTDI configured\r\n");
    192 
    193  ready = true;
    194  return 0;
    195 
    196 FailOnLatency:
    197 #ifdef DEBUG_USB_HOST
    198  USBTRACE("SetLatency: ");
    199  goto Fail;
    200 #endif
    201 
    202 FailGetDevDescr:
    203 #ifdef DEBUG_USB_HOST
    205  goto Fail;
    206 #endif
    207 
    208 FailSetDevTblEntry:
    209 #ifdef DEBUG_USB_HOST
    211  goto Fail;
    212 #endif
    213 
    214 FailGetConfDescr:
    215 #ifdef DEBUG_USB_HOST
    217  goto Fail;
    218 #endif
    219 
    220 FailSetConfDescr:
    221 #ifdef DEBUG_USB_HOST
    223  goto Fail;
    224 #endif
    225 
    226 FailOnInit:
    227 #ifdef DEBUG_USB_HOST
    228  USBTRACE("OnInit:");
    229 
    230 Fail:
    231  NotifyFail(rcode);
    232 #endif
    233  Release();
    234  return rcode;
    235 }
    236 
    237 void FTDI::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
    238  ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
    239  ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
    240  ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
    241 
    242  bConfNum = conf;
    243 
    244  uint8_t index;
    245 
    246  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80)
    247  index = epInterruptInIndex;
    249  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    250  else
    251  return;
    252 
    253  // Fill in the endpoint info structure
    254  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    255  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    256  epInfo[index].bmSndToggle = 0;
    257  epInfo[index].bmRcvToggle = 0;
    258  // Some device vendors set endpoint lengths to zero, which is incorrect.
    259  // Check, and if zero, set to 64.
    260  if(epInfo[index].maxPktSize == 0) epInfo[index].maxPktSize = 64;
    261 
    262  bNumEP++;
    263 
    264  PrintEndpointDescriptor(pep);
    265 }
    266 
    267 uint8_t FTDI::Release() {
    268  pUsb->GetAddressPool().FreeAddress(bAddress);
    269 
    270  bAddress = 0;
    271  bNumEP = 1;
    272  qNextPollTime = 0;
    273  bPollEnable = false;
    274  ready = false;
    275  return pAsync->OnRelease(this);
    276 }
    277 
    278 uint8_t FTDI::Poll() {
    279  uint8_t rcode = 0;
    280 
    281  //if (!bPollEnable)
    282  // return 0;
    283 
    284  //if (qNextPollTime <= (uint32_t)millis())
    285  //{
    286  // USB_HOST_SERIAL.println(bAddress, HEX);
    287 
    288  // qNextPollTime = (uint32_t)millis() + 100;
    289  //}
    290  return rcode;
    291 }
    292 
    293 uint8_t FTDI::SetBaudRate(uint32_t baud) {
    294  uint16_t baud_value, baud_index = 0;
    295  uint32_t divisor3;
    296  divisor3 = 48000000 / 2 / baud; // divisor shifted 3 bits to the left
    297 
    298  if(wFTDIType == FT232AM) {
    299  if((divisor3 & 0x7) == 7)
    300  divisor3++; // round x.7/8 up to x+1
    301 
    302  baud_value = divisor3 >> 3;
    303  divisor3 &= 0x7;
    304 
    305  if(divisor3 == 1) baud_value |= 0xc000;
    306  else // 0.125
    307  if(divisor3 >= 4) baud_value |= 0x4000;
    308  else // 0.5
    309  if(divisor3 != 0) baud_value |= 0x8000; // 0.25
    310  if(baud_value == 1) baud_value = 0; /* special case for maximum baud rate */
    311  } else {
    312  static const uint8_t divfrac [8] = {0, 3, 2, 0, 1, 1, 2, 3};
    313  static const uint8_t divindex[8] = {0, 0, 0, 1, 0, 1, 1, 1};
    314 
    315  baud_value = divisor3 >> 3;
    316  baud_value |= divfrac [divisor3 & 0x7] << 14;
    317  baud_index = divindex[divisor3 & 0x7];
    318 
    319  /* Deal with special cases for highest baud rates. */
    320  if(baud_value == 1) baud_value = 0;
    321  else // 1.0
    322  if(baud_value == 0x4001) baud_value = 1; // 1.5
    323  }
    324  USBTRACE2("baud_value:", baud_value);
    325  USBTRACE2("baud_index:", baud_index);
    326  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_BAUD_RATE, baud_value & 0xff, baud_value >> 8, baud_index, 0, 0, NULL, NULL);
    327  if(rv && rv != hrNAK) {
    328  Release();
    329  }
    330  return rv;
    331 }
    332 
    333 // No docs on if this is 8 or 16 bit, so play it safe, make maximum 255ms
    334 
    335 uint8_t FTDI::SetLatency(uint8_t l) {
    336  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_LATENCY_TIMER, l, 0, 0, 0, 0, NULL, NULL);
    337  if(rv && rv != hrNAK) {
    338  Release();
    339  }
    340  return rv;
    341 }
    342 
    343 // No docs on if this is 8 or 16 bit, so play it safe, make maximum 255ms
    344 
    345 uint8_t FTDI::GetLatency(uint8_t *l) {
    346  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_GET_LATENCY_TIMER, 0, 0, 0, 0, 1, (uint8_t *)l, NULL);
    347  if(rv && rv != hrNAK) {
    348  Release();
    349  }
    350  return rv;
    351 }
    352 
    353 uint8_t FTDI::SetModemControl(uint16_t signal) {
    354  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_MODEM_CTRL, signal & 0xff, signal >> 8, 0, 0, 0, NULL, NULL);
    355  if(rv && rv != hrNAK) {
    356  Release();
    357  }
    358  return rv;
    359 }
    360 
    361 uint8_t FTDI::SetFlowControl(uint8_t protocol, uint8_t xon, uint8_t xoff) {
    362  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_FLOW_CTRL, xon, xoff, protocol << 8, 0, 0, NULL, NULL);
    363  if(rv && rv != hrNAK) {
    364  Release();
    365  }
    366  return rv;
    367 }
    368 
    369 uint8_t FTDI::SetData(uint16_t databm) {
    370  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_DATA, databm & 0xff, databm >> 8, 0, 0, 0, NULL, NULL);
    371  if(rv && rv != hrNAK) {
    372  Release();
    373  }
    374  return rv;
    375 }
    376 
    377 uint8_t FTDI::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    378  uint8_t rv = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    379  if(rv && rv != hrNAK) {
    380  Release();
    381  }
    382  return rv;
    383 }
    384 
    385 uint8_t FTDI::SndData(uint16_t nbytes, uint8_t *dataptr) {
    386  uint8_t rv = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    387  if(rv && rv != hrNAK) {
    388  Release();
    389  }
    390  return rv;
    391 }
    392 
    393 void FTDI::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr) {
    394  Notify(PSTR("Endpoint descriptor:"), 0x80);
    395  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    396  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    397  Notify(PSTR("\r\nType:\t\t"), 0x80);
    398  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    399  Notify(PSTR("\r\nAddress:\t"), 0x80);
    400  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    401  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    402  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    403  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    404  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    405  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    406  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    407  Notify(PSTR("\r\n"), 0x80);
    408 }
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    uint8_t bmRcvToggle
    Definition: address.h:48
    #define bmREQ_FTDI_OUT
    Definition: cdcftdi.h:22
    @@ -583,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/cdcftdi_8h.html b/cdcftdi_8h.html index c62730ff..1c375f13 100644 --- a/cdcftdi_8h.html +++ b/cdcftdi_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcftdi.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,20 +89,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcftdi.h File Reference
    -
    #include "Usb.h"
    +
    #include "Usb.h"
    Include dependency graph for cdcftdi.h:
    - + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -842,7 +845,7 @@ Macros diff --git a/cdcftdi_8h__dep__incl.map b/cdcftdi_8h__dep__incl.map index 14fc6b83..c9f26512 100644 --- a/cdcftdi_8h__dep__incl.map +++ b/cdcftdi_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/cdcftdi_8h__dep__incl.md5 b/cdcftdi_8h__dep__incl.md5 index 400265fa..d2a73e5f 100644 --- a/cdcftdi_8h__dep__incl.md5 +++ b/cdcftdi_8h__dep__incl.md5 @@ -1 +1 @@ -6df33ccb134496caa17a0ccfb805cc20 \ No newline at end of file +bb94e7e9d10e1bde33f1040736fc690f \ No newline at end of file diff --git a/cdcftdi_8h__dep__incl.png b/cdcftdi_8h__dep__incl.png index 7e9a9643369e6d191d49331fc8a8a3e602155879..412bb62299f08165d0368b85d0a4bc081ecfd4a9 100644 GIT binary patch literal 1846 zcmbtVc{JP09#=&PN?Y4QxR#5CR%$85Ra{$IRB4r5ODw%eHF?z1YRYR$TMwaPC)5_T z#~QKZK3kPouD!N;nkbQ4Qc^+a{oTIhy#L>sGxI(3Ip6QhoX>ndGYQU4cH$s;5Fa0( zILzMK1&DWn{#RjsV0+xIQNUx-vZZy z+L`C>+kn_)Ggh-K$!{h1nuXLaX|z3s_)l{2Yfe~O1Gp^8Q?jH;I-xhnAD@{n z=fEAC!CI4s^^4s6&sn5>y-6gH<(4{pvvWo&${vgzUU)~C=wUMZ3Cod0F?CvlfUV(= za3fOpKd1sflUVo2SF3^ zX}cUwL_`GG9OHh)af+uZ+>Ih{&6BqR^Q^L|RCB{%E?4m6A@=E$F0D%4ykX+@+WYtJ zuCDknT&@Wc!VtIGVI3bGYThUi6X0L}?XJg^JvOz@UcDi3R0&n>B4CfQw0L(%FUPYP znKA9fu-G`z*35ArHa1SMI2!l?B2fdi+z(Bnt$aB=lClxW!d}NyM1IV7Tgc9{42uZ4 zoX3!2ZEQT*T^rlo4ZnSRYPKV~NR4+JuJ+j@@#ANeB=P$q-q@ytwr@$nlvbeZA z$l$V((F4oE(baI1;a_(SI4puwc~}E~SOnvBa9c;m0s?BRh#MFf=4 zPgSoVIDzE_Xk4>MK-O3a=dg!}ue#eP~{8!M5PmhK1G2>sYw>(!o)k2f$dXliQO1~Jy9 zl$%$7tM%?YxK}t@KO2G^iB)Ox_B!(~jl7o?`z$K-_0Rh)`pWA)+}p}(PLV!Y#sB+b zx|Ky{=Co^iMfMHY&0A2pp$e;vI#qy`(!TL%cCj7HR^5Wlotn_^e&Xf+E@&}Pj)A$L z6A=A)>8!vd)59CF-{Ph>URsXa`2lKfWOPGPz$RmNSM1&*4#VQGv6--u|Q%7YU2Q{PajK zefaOX8Uc;7Mrc(Z>JV~#+{KyA;jlh$Z!c9(_Q?`(m}6euN3yyIgj!$@e%0>W2lYq^ zB(-k5b0Ll9@zg~{|B|>O5u=~uz~ZDk?a})w(T0#G#Sde!cRdozIJ1ppc$CTs$RYjO ziSKs#uM_`=Wxz%MCv44KrXZm9H|;TB#t>ZBa((2YprxdM;^$s^=yTr%6xnUK z$kxv8#oF81vyB5NvTT*|B>SORv9Ni}zqik%WvxArRuvKwYC$j6=9d6k9Q!qfa5a|N z*-41!X)9az2Gg~rKwy*bmkL!Fr4+Lw?ionul>U@?+zRv~%kio&Q@`=Gv z$$c&ojo#YY+B-ZN3rhDn_HK{7@8_o~1riq*@5Jo8sN~Eya--yU?iAdClQ4FBAETzG zR^+_a^FpHgP?OeoLU>6Lc)HF&j{RyXDiGieBDsmu9z1SI1l%U(m9n^vVZo9!9uEBLJIwc;H_ zMIGjAf3kv643B$Ls=B&5$+l#{_-ulfrsx@PHe>zGR@@K5R4W5{=?_WQFV+@dFksWj zA!fL3$rzIvoJ*u2e*XES<3zo?j!a^6OAAC(^itk1olfTwJ;5p+ew2?G!Caz(g2IEh zQ}~p+2dg7fQ&Ss@?K8+`)Lc`7s5ce!Xujn>02&$^o{~_y9`U0+95O+_=u%ko1xI&I1g^Ba-IiaPSzJsm1AW}X?XPx_yz6df~_mrLj# zKzlqal@Zy7RSb-=^r3;iTOSZ*YHLB}POKi!Tue-Ca(Wu1miTFAbFn=|@ruhrW-76z p#Vy=Wrh{=b+|{ou_a8meeWZ1Bq~tj3aNr~4gV{J)*IFU4e*oxes5Afo literal 2049 zcmbtVdoySS>w$_AuUjFHGjI+Uaf*uxT7=ZV;6||P60f0~g4uiH2&RNMhZzvkLOC!{*nAuapdn983s7Vx90d6(8y&ZP`yy(Y# z_4uWwrEz*>q^fk|+F<1Vg270o1n~ojSTihkb*fnifI^`{u)}lv2<7&ho0}f#sxWjM zW-kz+F9#$mODFUMll}euvndoz#j&n%c&a@jkhi-tJ3EU}bf=9uySO+Y4&qV;1O(3J zBV`gPmZeQi`qjM|8Ipirz+&>~$EyuaCz%5Sx+qjz=;jS?>9n*oIXSr+$K~!g2~kl| zvMc3;Qt!JjEg|dg$LnuSO-&VAFV1$w0w?tJ7D>(gx`)pM`>xIPO+3BrZ~C?=5DK)o zeX2m+6g;e|s>=QG!$4o(Rr43#38t(&=zCb(aG6!MWoc(;=c`wEu74lx+Q6$k!{(q* zZuQRIw6VpI4w*hM|L%h$MtNyzb`B0;pufNW?$?dZ$C)&~GDjCl+>urImj+oD)As zJ|zI_tSA)s1dXuSO|F`)ZZN>m&=3p;1HLou(Qn_nmDpadaU^%lyTH#*6LKI z=EWP=ue&E+DH{D~VPOF~a&~+ByFXimIde$Y=V4~%?TUi?t3sxVDVNqru>`8=TUcrj z*5=iJ5$6csd+dLBNgl##$%?^5MZHNHiV|Y6_0GrjAD9fW*$v-Ec7Mg=o$&Z9uiHVh zo#46o;viO0%DEIeZxsOOJR>Kk&dB9SDQ)LF&!3a0>AbBUTXZwCJGP^164LuZw}Z6} z3~u&kR5FrysZAOAy{2%qa(G*Ldb+(fjvHnNN_p5+6q%e*kcpfwD}iIy=KHr;>@=(< zSx`uAcuU|Qq-SR4aoy(Ql)D9v_obw>a3$v4s|eEv_nF-uF?9|@y(WX7eWR3l^%L^A zr2!)W+mSAeB>7BUpF^`&e9@W1PE73&U{l5Z;$nYgoVEcjRYop10TUC_u*s8eEhsDu zs{G-3*F;N4M=cPncX@Zmrj%9N}OY6QbGR z-WL92g4k<;G~RIg@^rdk5J{`8Z3}lnNv$bUk!cGa9<0eQ7{KN3CO0MLo6`mRWPc8t zPt5k8jQ`jC|DQ1AeG;P)&w?i|-#Slfz>dp6pwQEi)@9b}ukwv9+1Mz!hqJU%DE8FU z%Ya(0MGmQXXK|>QLr_s-M_iV8@{joZ(@OMbGPy&3)XC$3=_wSd!oI>%`}3T*gpHZC zo@~U%;t-Q50)%aUvnigPSeu)l42Uj>84qq%vFE839IVn8@)p!yQcBipFZIvNew@@_F znya(^t&!~NPg@@OMv+<)t zd8pMwljF3^l@n5|g}ZIPZ&g#NPyhmfl$J*9HU@--QjVrV*&gD2TW0m%ZqX@)v24hdusnn2{eOGELD$bSI`duXo4kMpI3Y0EtW)6A1 z_R^`Us`?U~Q|~_v?vr58=hRE|IitVPq{x@hgZz4 - + diff --git a/cdcftdi_8h__incl.md5 b/cdcftdi_8h__incl.md5 index a83f7eac..8f85634d 100644 --- a/cdcftdi_8h__incl.md5 +++ b/cdcftdi_8h__incl.md5 @@ -1 +1 @@ -7d34e76d8855698f6d76eca966d6ea18 \ No newline at end of file +5a325c73b89e2318a59e437a1ca1f735 \ No newline at end of file diff --git a/cdcftdi_8h__incl.png b/cdcftdi_8h__incl.png index 40982571f3d1b979522868c78521ca69d3cda748..6e886a960b6dbed72183810e6ba67b0926018c5e 100644 GIT binary patch literal 1927 zcmcJQc{J4R9>C`!Le?ZQ@e*F%7^9nv&@_zQJDJFyY*{C!vJ-9wSu)lcQMSR5E$cLv zQMORh#PAxzShACyEWN*b{dMpE_dK8H`+d%H&a<8KJ)bAe3}wK_bAbm00`VCcB5woP z3h3C=oIvz;TAl(Dr?ZIx67=ieEw6=~1_E(u86goCK`&Qc`5KyggFm#oqcG!2s&|VQ z?ov4x0@nO(tn$y>Ab2P>@KGf@6 zg-D;UIGH$Hb#HoWVIcFxi=JUhVF%4!(xS&1cJjDL3U_)Xb6$kwf-7=J#n%fpF@82V=l|<>=E-Ub% za2GxLrQM&~OR%s#Xh>+N+%7^HDjZKZSY%vIClYx*6$?Z+5^NOW37Q%jaf5>v)b`|0 z%}Zm}z_k!|b`p(^jZh5@?u1UZv>pynW=>8_JL~4HTLOb#^~q8dD`N_Lk`<2^s6yfu zzj}LnpOGlFwPz_l-`e)}U|S*DSy@?cycn;ex%c($XU1tyB#w@bJUl%S`udzqCKFe) zvlEb*m^k^pFMBdr^1O(Da}9u3Gng?Ec1mS2wq|1-}9+Rotr5KJE^} zdg_X@pT9qAZ+*J^<40X!ucV8b^6CD8fu!ncp^=f1?w%fmiwkMK!TH%x#MR{h%}0+P zS9{Q9GW*<`!}hNf@1#6S7^|*Uotc}9Ro*-}vaWWHPUf#XUs@qnur2kxyj+QOU0Ing z7al;Ac_Tpd_SI*g*+;I{rU@&$&=e3ySp|q zy~rrj8EJShI*El%?jEoJurMTr&u!srk(i_;e|N%A1T@Zmw@a^b1k=T=_kK9l!9B=e zAj%j#_qhZlkq!=$i%UyR^|okBOZmnJP%eIOWS<+aph!i8#*09>)#uK@E2@-PF(0@U zU0tY$Kh5Oyf79LE7NGuQO!=6`Y*{Ji-uNc6v58=hoiO9atIS@e%L7d=VR} z8a_36aIgk{%k5hn5~ilc-WXJYB5hwiWinfZ z!FMnUmXII*US_3ju`q4zgsiNu90np1@dP__mv_s{7(<$Ir_;B_3$wh-~}D*WJG^zs;zByCf=JM1yMBvIgKq!VHOtiDQRia z=Ex~@^H_QLy*Hi%7YYjxr50&VdNs!X5RNDEfB6i}-q1H27k4ePMBSx7O@35Yp9(p1vH9PyVJ(*0N zp8kNp9f8X<$^?oAPovS24{5X;BBG)^o>A{3fmb+VFlUsNl}oCs1WMpnuZmz>l6QZa zr9r9JviU5_&f%rtT^$`9^78VNkEo9Iwhy=F(fQ-YM+bnup=xT|YVY#qL;)W)JE#Bv zgT=)~w%&}oa+ANJf((+th>(!$fHHBz&J{MboMhCiwtU@KTu4*EN?VS0C{#-;F*Q}V zjzZzus`X#86g$Id`sbhd4Gp61pI;gc;syViDk=Rc)GlXWAu;r(anv--&(9CnEN#ZI zjCD57wAc9`WG9eX!5he4<{DWibu4!wIGV|{#f-g0-?r;KPMZ(_HR+OYJ#r_^z;%~! VbH8ceVu7C(WTb~eR_ZuD{Tp&9!<_&C literal 2132 zcmbuBc{tQtAHaWMj3H7Hjcpitm0}FnZZr&IdNqV=O~cqGJ9X`{j9Zp08B0U0&|+SWTk)U3`(;Q?}l|A2zV?ki1-7dbX~-J^c|E1Qq+9XD5BV0s9HEl z#9DXFNYrsnkE#mTvzm>V?fQeq+6W-zxzzjv$>%U?7h%jW6z!vCIZebgMNVt(5y z4MCOgK%P8umCDc0|7>`8sliML9T#V;6Ev&Z;YQ$Ck3$41{-%=2?d|OaPV1t&GqrZv zGxvi#Vt0@RhK8C32ExVo8>_2+bUOX}^Z=d8%1VBo51YI8qib9gtG2cl06-uRDKN0u zcF8}&-5sc|u70<=x>>lzdYW~?(Gh&3Kat5K=H})OIq(C*##>*wYaQ|XC@2&fvO0e9 zR@T=aJb(T?iZxtp2nN2}ZXbI6r-@PQw)pZ$Db~$R z?xscMe9xTJz5J=Mu|zq;@Uzvn9v_$kdLeIte04WrfaLFQ=Iwm~iA2H*2FqWr%+|pO zcQm%Axi=~*lrZMz9-QemAi=s61-ZDoLgo7Hed4$(D=T*l;&3?2bLaSg?)ZIqzqV-G zxV&?0tzoHH&KL4UbubVjyBu-TWT?~kIXkR7YU_zx`&7XC#IJYlnFHxkl-18%?#|6E z5TR@DtSeLC-a1uZUmpR@usM|nBxv~#!}Rr!1KFjeSx=r=V6a%Tx`{rYdkeg!C|36e z?wTXU!eX<14Tr^oTUuJg<>ZWK%(;wu@BG|ccP}r2wzf9uq&_kwqDo zZ$(r+knWous|#Y&%crdVE4})>Y?B#PDX-Bnyn@)etz{IyH~TeXV7R!==8p*EG}OG>yr_;^%*6?GLm6xg7uN z@BbOVM6lnN#<%zR#jU9u$`UjY@1(ItXl89t+vGw~eT!LLq zM8y7fE1%e4!9UW@*K9j%F^O`0{c+Xi?uc*lxv|MG18Vf{xtm#Ck!ycU2$Qr$$ho)n zQ}8t|4QKso|5~e5P(G5X8gl|>N(Gvtwl;)BiZ0a*vQ5#w!RX;8e{F>6TnW5^<_ju_=UCmU`k;UbGUFDr^ zGRb?1-EiAJ-?FdCCqpnS$|?o9nL+a2`*uYeiPX-vd`PntLVJ`)I)0!!bWE}y{2JzrmX5=9QJKGhv#tDGoK=LBfdYfU zK=)igDJi9@N*D?~#gPr>r>9-Y{f3f8pj@&S`P3;ay~zNbN3_~d*z|ADoC zgG&iY)eWAbw|Ec2D2y`OyQ8zSMk}A|92=ERoB)X&JNPm? zMlTO;D_2cbC>~!wairztExf#{x`tO?(#pq3WiMB32!ulv#$sE~?$^(79i3OZo7oEs z3ke$h;#CuOA}=PgoHNtY%^V%2qNAg;v$GR^TYFXB)g|NM5l^Fyk!I)Z?Cd=5&+vAF zLdgRv17LE(NZ?q7x!v_sBPGUU`%~sbqEf;}uwcl8i=@k!dq+pb!`Ek1ySt4Jii$q) ztaqsU8WS9>u@Qsd<931w0vCOvqV#L)>c-~gG7B^aOkU_z&zu=(51bJ{{9)Hi<7wzK z1|xBRnApGYcydy@ufPAWq$E3tR#PLWQzV)tZ`@aIcEje{o?zD{>8235y~pnN+l;J$8_mM5!Tkuj*%gwE2K#8 z;qMIRKyi4yitz7A@4fxV8(twN?{T$$t@` zBLeX}1h0nt%$%R3KvstOxVS)%sY}fN!fuV+T!bLCv_M%}p#AyS`G;}uHa4W7I<#j) tLwCl|sqcbn3;Ubku)-g2BabqR`*OEZwY diff --git a/cdcftdi_8h_source.html b/cdcftdi_8h_source.html index ab96f87d..d50be30e 100644 --- a/cdcftdi_8h_source.html +++ b/cdcftdi_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcftdi.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,195 +86,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcftdi.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #if !defined(__CDCFTDI_H__)
    -
    18 #define __CDCFTDI_H__
    -
    19 
    -
    20 #include "Usb.h"
    -
    21 
    -
    22 #define bmREQ_FTDI_OUT 0x40
    -
    23 #define bmREQ_FTDI_IN 0xc0
    -
    24 
    -
    25 //#define bmREQ_FTDI_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    -
    26 //#define bmREQ_FTDI_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    -
    27 
    -
    28 #define FTDI_VID 0x0403 // FTDI VID
    -
    29 #define FTDI_PID 0x6001 // FTDI PID
    -
    30 
    -
    31 #define FT232AM 0x0200
    -
    32 #define FT232BM 0x0400
    -
    33 #define FT2232 0x0500
    -
    34 #define FT232R 0x0600
    -
    35 
    -
    36 // Commands
    -
    37 #define FTDI_SIO_RESET 0 /* Reset the port */
    -
    38 #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
    -
    39 #define FTDI_SIO_SET_FLOW_CTRL 2 /* Set flow control register */
    -
    40 #define FTDI_SIO_SET_BAUD_RATE 3 /* Set baud rate */
    -
    41 #define FTDI_SIO_SET_DATA 4 /* Set the data characteristics of the port */
    -
    42 #define FTDI_SIO_GET_MODEM_STATUS 5 /* Retrieve current value of modem status register */
    -
    43 #define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */
    -
    44 #define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */
    -
    45 #define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */
    -
    46 #define FTDI_SIO_GET_LATENCY_TIMER 10 /* Get the latency timer */
    -
    47 
    -
    48 #define FTDI_SIO_RESET_SIO 0
    -
    49 #define FTDI_SIO_RESET_PURGE_RX 1
    -
    50 #define FTDI_SIO_RESET_PURGE_TX 2
    -
    51 
    -
    52 #define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8 )
    -
    53 #define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8 )
    -
    54 #define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8 )
    -
    55 #define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8 )
    -
    56 #define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8 )
    -
    57 #define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11)
    -
    58 #define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
    -
    59 #define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
    -
    60 #define FTDI_SIO_SET_BREAK (0x1 << 14)
    -
    61 
    -
    62 #define FTDI_SIO_SET_DTR_MASK 0x1
    -
    63 #define FTDI_SIO_SET_DTR_HIGH ( 1 | ( FTDI_SIO_SET_DTR_MASK << 8))
    -
    64 #define FTDI_SIO_SET_DTR_LOW ( 0 | ( FTDI_SIO_SET_DTR_MASK << 8))
    -
    65 #define FTDI_SIO_SET_RTS_MASK 0x2
    -
    66 #define FTDI_SIO_SET_RTS_HIGH ( 2 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
    -
    67 #define FTDI_SIO_SET_RTS_LOW ( 0 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
    -
    68 
    -
    69  #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
    -
    70 #define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
    -
    71 #define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
    -
    72 #define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
    -
    73 
    -
    74 #define FTDI_SIO_CTS_MASK 0x10
    -
    75 #define FTDI_SIO_DSR_MASK 0x20
    -
    76 #define FTDI_SIO_RI_MASK 0x40
    -
    77 #define FTDI_SIO_RLSD_MASK 0x80
    -
    78 
    -
    79 class FTDI;
    -
    80 
    - -
    82 public:
    -
    83 
    -
    84  virtual uint8_t OnInit(FTDI *pftdi __attribute__((unused))) {
    -
    85  return 0;
    -
    86  };
    -
    87 
    -
    88  virtual uint8_t OnRelease(FTDI *pftdi __attribute__((unused))) {
    -
    89  return 0;
    -
    90  };
    -
    91 };
    -
    92 
    -
    93 
    -
    94 // Only single port chips are currently supported by the library,
    -
    95 // so only three endpoints are allocated.
    -
    96 #define FTDI_MAX_ENDPOINTS 3
    -
    97 
    -
    98 class FTDI : public USBDeviceConfig, public UsbConfigXtracter {
    -
    99  static const uint8_t epDataInIndex; // DataIn endpoint index
    -
    100  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    -
    101  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
    -
    102 
    -
    103  FTDIAsyncOper *pAsync;
    -
    104  USB *pUsb;
    -
    105  uint8_t bAddress;
    -
    106  uint8_t bConfNum; // configuration number
    -
    107  uint8_t bNumIface; // number of interfaces in the configuration
    -
    108  uint8_t bNumEP; // total number of EP in the configuration
    -
    109  uint32_t qNextPollTime; // next poll time
    -
    110  volatile bool bPollEnable; // poll enable flag
    -
    111  volatile bool ready; //device ready indicator
    -
    112  uint16_t wFTDIType; // Type of FTDI chip
    -
    113  uint16_t wIdProduct; // expected PID
    -
    114 
    -
    115  EpInfo epInfo[FTDI_MAX_ENDPOINTS];
    -
    116 
    -
    117  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
    -
    118 
    -
    119 public:
    -
    120  FTDI(USB *pusb, FTDIAsyncOper *pasync, uint16_t idProduct = FTDI_PID);
    -
    121 
    -
    122  uint8_t SetBaudRate(uint32_t baud);
    -
    123  uint8_t SetModemControl(uint16_t control);
    -
    124  uint8_t SetFlowControl(uint8_t protocol, uint8_t xon = 0x11, uint8_t xoff = 0x13);
    -
    125  uint8_t SetData(uint16_t databm);
    -
    126  uint8_t SetLatency(uint8_t l);
    -
    127  uint8_t GetLatency(uint8_t *l);
    -
    128 
    -
    129  // Methods for receiving and sending data
    -
    130  uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr);
    -
    131  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    -
    132 
    -
    133  // USBDeviceConfig implementation
    -
    134  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    135  uint8_t Release();
    -
    136  uint8_t Poll();
    -
    137 
    -
    138  virtual uint8_t GetAddress() {
    -
    139  return bAddress;
    -
    140  };
    -
    141 
    -
    142  // UsbConfigXtracter implementation
    -
    143  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    144 
    -
    145  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    146  return (vid == FTDI_VID && pid == FTDI_PID);
    -
    147  }
    -
    148  virtual bool isReady() {
    -
    149  return ready;
    -
    150  };
    -
    151 
    -
    152 };
    -
    153 
    -
    154 #endif // __CDCFTDI_H__
    -
    virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: cdcftdi.h:145
    -
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcftdi.cpp:237
    -
    uint8_t SetBaudRate(uint32_t baud)
    Definition: cdcftdi.cpp:293
    -
    uint8_t SetModemControl(uint16_t control)
    Definition: cdcftdi.cpp:353
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #if !defined(__CDCFTDI_H__)
    18 #define __CDCFTDI_H__
    19 
    20 #include "Usb.h"
    21 
    22 #define bmREQ_FTDI_OUT 0x40
    23 #define bmREQ_FTDI_IN 0xc0
    24 
    25 //#define bmREQ_FTDI_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    26 //#define bmREQ_FTDI_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    27 
    28 #define FTDI_VID 0x0403 // FTDI VID
    29 #define FTDI_PID 0x6001 // FTDI PID
    30 
    31 #define FT232AM 0x0200
    32 #define FT232BM 0x0400
    33 #define FT2232 0x0500
    34 #define FT232R 0x0600
    35 
    36 // Commands
    37 #define FTDI_SIO_RESET 0 /* Reset the port */
    38 #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
    39 #define FTDI_SIO_SET_FLOW_CTRL 2 /* Set flow control register */
    40 #define FTDI_SIO_SET_BAUD_RATE 3 /* Set baud rate */
    41 #define FTDI_SIO_SET_DATA 4 /* Set the data characteristics of the port */
    42 #define FTDI_SIO_GET_MODEM_STATUS 5 /* Retrieve current value of modem status register */
    43 #define FTDI_SIO_SET_EVENT_CHAR 6 /* Set the event character */
    44 #define FTDI_SIO_SET_ERROR_CHAR 7 /* Set the error character */
    45 #define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */
    46 #define FTDI_SIO_GET_LATENCY_TIMER 10 /* Get the latency timer */
    47 
    48 #define FTDI_SIO_RESET_SIO 0
    49 #define FTDI_SIO_RESET_PURGE_RX 1
    50 #define FTDI_SIO_RESET_PURGE_TX 2
    51 
    52 #define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8 )
    53 #define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8 )
    54 #define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8 )
    55 #define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8 )
    56 #define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8 )
    57 #define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11)
    58 #define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
    59 #define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
    60 #define FTDI_SIO_SET_BREAK (0x1 << 14)
    61 
    62 #define FTDI_SIO_SET_DTR_MASK 0x1
    63 #define FTDI_SIO_SET_DTR_HIGH ( 1 | ( FTDI_SIO_SET_DTR_MASK << 8))
    64 #define FTDI_SIO_SET_DTR_LOW ( 0 | ( FTDI_SIO_SET_DTR_MASK << 8))
    65 #define FTDI_SIO_SET_RTS_MASK 0x2
    66 #define FTDI_SIO_SET_RTS_HIGH ( 2 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
    67 #define FTDI_SIO_SET_RTS_LOW ( 0 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
    68 
    69  #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
    70 #define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
    71 #define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
    72 #define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
    73 
    74 #define FTDI_SIO_CTS_MASK 0x10
    75 #define FTDI_SIO_DSR_MASK 0x20
    76 #define FTDI_SIO_RI_MASK 0x40
    77 #define FTDI_SIO_RLSD_MASK 0x80
    78 
    79 class FTDI;
    80 
    82 public:
    83 
    84  virtual uint8_t OnInit(FTDI *pftdi __attribute__((unused))) {
    85  return 0;
    86  };
    87 
    88  virtual uint8_t OnRelease(FTDI *pftdi __attribute__((unused))) {
    89  return 0;
    90  };
    91 };
    92 
    93 
    94 // Only single port chips are currently supported by the library,
    95 // so only three endpoints are allocated.
    96 #define FTDI_MAX_ENDPOINTS 3
    97 
    98 class FTDI : public USBDeviceConfig, public UsbConfigXtracter {
    99  static const uint8_t epDataInIndex; // DataIn endpoint index
    100  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    101  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
    102 
    103  FTDIAsyncOper *pAsync;
    104  USB *pUsb;
    105  uint8_t bAddress;
    106  uint8_t bConfNum; // configuration number
    107  uint8_t bNumIface; // number of interfaces in the configuration
    108  uint8_t bNumEP; // total number of EP in the configuration
    109  uint32_t qNextPollTime; // next poll time
    110  volatile bool bPollEnable; // poll enable flag
    111  volatile bool ready; //device ready indicator
    112  uint16_t wFTDIType; // Type of FTDI chip
    113  uint16_t wIdProduct; // expected PID
    114 
    115  EpInfo epInfo[FTDI_MAX_ENDPOINTS];
    116 
    117  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
    118 
    119 public:
    120  FTDI(USB *pusb, FTDIAsyncOper *pasync, uint16_t idProduct = FTDI_PID);
    121 
    122  uint8_t SetBaudRate(uint32_t baud);
    123  uint8_t SetModemControl(uint16_t control);
    124  uint8_t SetFlowControl(uint8_t protocol, uint8_t xon = 0x11, uint8_t xoff = 0x13);
    125  uint8_t SetData(uint16_t databm);
    126  uint8_t SetLatency(uint8_t l);
    127  uint8_t GetLatency(uint8_t *l);
    128 
    129  // Methods for receiving and sending data
    130  uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr);
    131  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    132 
    133  // USBDeviceConfig implementation
    134  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    135  uint8_t Release();
    136  uint8_t Poll();
    137 
    138  virtual uint8_t GetAddress() {
    139  return bAddress;
    140  };
    141 
    142  // UsbConfigXtracter implementation
    143  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    144 
    145  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    146  return (vid == FTDI_VID && pid == FTDI_PID);
    147  }
    148  virtual bool isReady() {
    149  return ready;
    150  };
    151 
    152 };
    153 
    154 #endif // __CDCFTDI_H__
    virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: cdcftdi.h:145
    -
    uint8_t SetLatency(uint8_t l)
    Definition: cdcftdi.cpp:335
    -
    uint8_t SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)
    Definition: cdcftdi.cpp:361
    -
    uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: cdcftdi.cpp:377
    -
    FTDI(USB *pusb, FTDIAsyncOper *pasync, uint16_t idProduct=FTDI_PID)
    Definition: cdcftdi.cpp:23
    -
    uint8_t Poll()
    Definition: cdcftdi.cpp:278
    Definition: address.h:39
    -
    uint8_t GetLatency(uint8_t *l)
    Definition: cdcftdi.cpp:345
    Definition: cdcftdi.h:98
    #define FTDI_PID
    Definition: cdcftdi.h:29
    -
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcftdi.cpp:41
    virtual bool isReady()
    Definition: cdcftdi.h:148
    virtual uint8_t OnInit(FTDI *pftdi)
    Definition: cdcftdi.h:84
    -
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcftdi.cpp:385
    virtual uint8_t GetAddress()
    Definition: cdcftdi.h:138
    virtual uint8_t OnRelease(FTDI *pftdi)
    Definition: cdcftdi.h:88
    #define FTDI_VID
    Definition: cdcftdi.h:28
    -
    uint8_t Release()
    Definition: cdcftdi.cpp:267
    Definition: UsbCore.h:210
    -
    uint8_t SetData(uint16_t databm)
    Definition: cdcftdi.cpp:369
    #define FTDI_MAX_ENDPOINTS
    Definition: cdcftdi.h:96
    diff --git a/cdcprolific_8cpp.html b/cdcprolific_8cpp.html index 0d7a56c5..9aeace68 100644 --- a/cdcprolific_8cpp.html +++ b/cdcprolific_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcprolific.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,13 +86,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcprolific.cpp File Reference
    -
    #include "cdcprolific.h"
    +
    #include "cdcprolific.h"
    Include dependency graph for cdcprolific.cpp:
    - + + + +

    Go to the source code of this file.

    @@ -100,7 +104,7 @@ Include dependency graph for cdcprolific.cpp:
    diff --git a/cdcprolific_8cpp__incl.map b/cdcprolific_8cpp__incl.map index 1dfd63f4..8db88071 100644 --- a/cdcprolific_8cpp__incl.map +++ b/cdcprolific_8cpp__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/cdcprolific_8cpp__incl.md5 b/cdcprolific_8cpp__incl.md5 index 44ce861d..1e1ab220 100644 --- a/cdcprolific_8cpp__incl.md5 +++ b/cdcprolific_8cpp__incl.md5 @@ -1 +1 @@ -1b82f3fbedb914a6f7a2686151967527 \ No newline at end of file +a91e5714ebd81502b745c96a64138390 \ No newline at end of file diff --git a/cdcprolific_8cpp__incl.png b/cdcprolific_8cpp__incl.png index b676ce1eace54adb3b5b2cd8e40bd638d71930eb..012df5afa914a7981ae8a512ea095b62774a411b 100644 GIT binary patch literal 4730 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 literal 4513 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 LhpLsSTEF}k$wT#E diff --git a/cdcprolific_8cpp_source.html b/cdcprolific_8cpp_source.html index 0486a902..3e3b65c5 100644 --- a/cdcprolific_8cpp_source.html +++ b/cdcprolific_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcprolific.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,254 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcprolific.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #include "cdcprolific.h"
    -
    18 
    - -
    20 ACM(p, pasync),
    -
    21 wPLType(0) {
    -
    22 }
    -
    23 
    -
    24 uint8_t PL2303::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    25  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    26 
    -
    27  uint8_t buf[constBufSize];
    -
    28  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    29  uint8_t rcode;
    -
    30  UsbDevice *p = NULL;
    -
    31  EpInfo *oldep_ptr = NULL;
    -
    32  uint8_t num_of_conf; // number of configurations
    -
    33 #ifdef PL2303_COMPAT
    -
    34  enum pl2303_type pltype = unknown;
    -
    35 #endif
    -
    36 
    -
    37  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    38 
    -
    39  USBTRACE("PL Init\r\n");
    -
    40 
    -
    41  if(bAddress)
    - -
    43 
    -
    44  // Get pointer to pseudo device with address 0 assigned
    -
    45  p = addrPool.GetUsbDevicePtr(0);
    -
    46 
    -
    47  if(!p)
    - -
    49 
    -
    50  if(!p->epinfo) {
    -
    51  USBTRACE("epinfo\r\n");
    - -
    53  }
    -
    54 
    -
    55  // Save old pointer to EP_RECORD of address 0
    -
    56  oldep_ptr = p->epinfo;
    -
    57 
    -
    58  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    59  p->epinfo = epInfo;
    -
    60 
    -
    61  p->lowspeed = lowspeed;
    -
    62 
    -
    63  // Get device descriptor
    -
    64  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf);
    -
    65 
    -
    66  // Restore p->epinfo
    -
    67  p->epinfo = oldep_ptr;
    -
    68 
    -
    69  if(rcode)
    -
    70  goto FailGetDevDescr;
    -
    71 
    -
    72  if(udd->idVendor != PL_VID && CHECK_PID(udd->idProduct))
    - -
    74 
    -
    75  /* determine chip variant */
    -
    76 #ifdef PL2303_COMPAT
    -
    77  if(udd->bDeviceClass == 0x02 )
    -
    78  pltype = type_0;
    -
    79  else if(udd->bMaxPacketSize0 == 0x40 )
    -
    80  pltype = rev_HX;
    -
    81  else if(udd->bDeviceClass == 0x00)
    -
    82  pltype = type_1;
    -
    83  else if(udd->bDeviceClass == 0xff)
    -
    84  pltype = type_1;
    -
    85 #endif
    -
    86 
    -
    87  // Save type of PL chip
    -
    88  wPLType = udd->bcdDevice;
    -
    89 
    -
    90  // Allocate new address according to device class
    -
    91  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    92 
    -
    93  if(!bAddress)
    - -
    95 
    -
    96  // Extract Max Packet Size from the device descriptor
    - -
    98 
    -
    99  // Assign new address to the device
    -
    100  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    101 
    -
    102  if(rcode) {
    -
    103  p->lowspeed = false;
    -
    104  addrPool.FreeAddress(bAddress);
    -
    105  bAddress = 0;
    -
    106  USBTRACE2("setAddr:", rcode);
    -
    107  return rcode;
    -
    108  }
    -
    109 
    -
    110  USBTRACE2("Addr:", bAddress);
    -
    111 
    -
    112  p->lowspeed = false;
    -
    113 
    -
    114  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    115 
    -
    116  if(!p)
    - -
    118 
    -
    119  p->lowspeed = lowspeed;
    -
    120 
    -
    121  num_of_conf = udd->bNumConfigurations;
    -
    122 
    -
    123  // Assign epInfo to epinfo pointer
    -
    124  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    125 
    -
    126  if(rcode)
    -
    127  goto FailSetDevTblEntry;
    -
    128 
    -
    129  USBTRACE2("NC:", num_of_conf);
    -
    130 
    -
    131  for(uint8_t i = 0; i < num_of_conf; i++) {
    - - -
    134 
    -
    135  rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
    -
    136 
    -
    137  if(rcode)
    -
    138  goto FailGetConfDescr;
    -
    139 
    -
    140  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    141 
    -
    142  if(rcode)
    -
    143  goto FailGetConfDescr;
    -
    144 
    -
    145  if(bNumEP > 1)
    -
    146  break;
    -
    147  } // for
    -
    148 
    -
    149  if(bNumEP < 2)
    - -
    151 
    -
    152  // Assign epInfo to epinfo pointer
    - -
    154 
    -
    155  USBTRACE2("Conf:", bConfNum);
    -
    156 
    -
    157  // Set Configuration Value
    -
    158  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    159 
    -
    160  if(rcode)
    -
    161  goto FailSetConfDescr;
    -
    162 
    -
    163 #ifdef PL2303_COMPAT
    -
    164  /* Shamanic dance - sending Prolific init data as-is */
    -
    165  vendorRead( 0x84, 0x84, 0, buf );
    -
    166  vendorWrite( 0x04, 0x04, 0 );
    -
    167  vendorRead( 0x84, 0x84, 0, buf );
    -
    168  vendorRead( 0x83, 0x83, 0, buf );
    -
    169  vendorRead( 0x84, 0x84, 0, buf );
    -
    170  vendorWrite( 0x04, 0x04, 1 );
    -
    171  vendorRead( 0x84, 0x84, 0, buf);
    -
    172  vendorRead( 0x83, 0x83, 0, buf);
    -
    173  vendorWrite( 0, 0, 1 );
    -
    174  vendorWrite( 1, 0, 0 );
    -
    175  if( pltype == rev_HX ) {
    -
    176  vendorWrite( 2, 0, 0x44 );
    -
    177  vendorWrite( 0x06, 0x06, 0 ); // From W7 init
    -
    178  }
    -
    179  else {
    -
    180  vendorWrite( 2, 0, 0x24 );
    -
    181  }
    -
    182  /* Shamanic dance end */
    -
    183 #endif
    -
    184  /* Calling post-init callback */
    -
    185  rcode = pAsync->OnInit(this);
    -
    186 
    -
    187  if(rcode)
    -
    188  goto FailOnInit;
    -
    189 
    -
    190  USBTRACE("PL configured\r\n");
    -
    191 
    -
    192  //bPollEnable = true;
    -
    193  ready = true;
    -
    194  return 0;
    -
    195 
    -
    196 FailGetDevDescr:
    -
    197 #ifdef DEBUG_USB_HOST
    - -
    199  goto Fail;
    -
    200 #endif
    -
    201 
    -
    202 FailSetDevTblEntry:
    -
    203 #ifdef DEBUG_USB_HOST
    - -
    205  goto Fail;
    -
    206 #endif
    -
    207 
    -
    208 FailGetConfDescr:
    -
    209 #ifdef DEBUG_USB_HOST
    - -
    211  goto Fail;
    -
    212 #endif
    -
    213 
    -
    214 FailSetConfDescr:
    -
    215 #ifdef DEBUG_USB_HOST
    - -
    217  goto Fail;
    -
    218 #endif
    -
    219 
    -
    220 FailOnInit:
    -
    221 #ifdef DEBUG_USB_HOST
    -
    222  USBTRACE("OnInit:");
    -
    223 #endif
    -
    224 
    -
    225 #ifdef DEBUG_USB_HOST
    -
    226 Fail:
    -
    227  NotifyFail(rcode);
    -
    228 #endif
    -
    229  Release();
    -
    230  return rcode;
    -
    231 }
    -
    232 
    -
    233 //uint8_t PL::Poll()
    -
    234 //{
    -
    235 // uint8_t rcode = 0;
    -
    236 //
    -
    237 // //if (!bPollEnable)
    -
    238 // // return 0;
    -
    239 //
    -
    240 // //if (qNextPollTime <= (uint32_t)millis())
    -
    241 // //{
    -
    242 // // USB_HOST_SERIAL.println(bAddress, HEX);
    -
    243 //
    -
    244 // // qNextPollTime = (uint32_t)millis() + 100;
    -
    245 // //}
    -
    246 // return rcode;
    -
    247 //}
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #include "cdcprolific.h"
    18 
    20 ACM(p, pasync),
    21 wPLType(0) {
    22 }
    23 
    24 uint8_t PL2303::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    25  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    26 
    27  uint8_t buf[constBufSize];
    28  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    29  uint8_t rcode;
    30  UsbDevice *p = NULL;
    31  EpInfo *oldep_ptr = NULL;
    32  uint8_t num_of_conf; // number of configurations
    33 #ifdef PL2303_COMPAT
    34  enum pl2303_type pltype = unknown;
    35 #endif
    36 
    37  AddressPool &addrPool = pUsb->GetAddressPool();
    38 
    39  USBTRACE("PL Init\r\n");
    40 
    41  if(bAddress)
    43 
    44  // Get pointer to pseudo device with address 0 assigned
    45  p = addrPool.GetUsbDevicePtr(0);
    46 
    47  if(!p)
    49 
    50  if(!p->epinfo) {
    51  USBTRACE("epinfo\r\n");
    53  }
    54 
    55  // Save old pointer to EP_RECORD of address 0
    56  oldep_ptr = p->epinfo;
    57 
    58  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    59  p->epinfo = epInfo;
    60 
    61  p->lowspeed = lowspeed;
    62 
    63  // Get device descriptor
    64  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf);
    65 
    66  // Restore p->epinfo
    67  p->epinfo = oldep_ptr;
    68 
    69  if(rcode)
    70  goto FailGetDevDescr;
    71 
    72  if(udd->idVendor != PL_VID && CHECK_PID(udd->idProduct))
    74 
    75  /* determine chip variant */
    76 #ifdef PL2303_COMPAT
    77  if(udd->bDeviceClass == 0x02 )
    78  pltype = type_0;
    79  else if(udd->bMaxPacketSize0 == 0x40 )
    80  pltype = rev_HX;
    81  else if(udd->bDeviceClass == 0x00)
    82  pltype = type_1;
    83  else if(udd->bDeviceClass == 0xff)
    84  pltype = type_1;
    85 #endif
    86 
    87  // Save type of PL chip
    88  wPLType = udd->bcdDevice;
    89 
    90  // Allocate new address according to device class
    91  bAddress = addrPool.AllocAddress(parent, false, port);
    92 
    93  if(!bAddress)
    95 
    96  // Extract Max Packet Size from the device descriptor
    98 
    99  // Assign new address to the device
    100  rcode = pUsb->setAddr(0, 0, bAddress);
    101 
    102  if(rcode) {
    103  p->lowspeed = false;
    104  addrPool.FreeAddress(bAddress);
    105  bAddress = 0;
    106  USBTRACE2("setAddr:", rcode);
    107  return rcode;
    108  }
    109 
    110  USBTRACE2("Addr:", bAddress);
    111 
    112  p->lowspeed = false;
    113 
    114  p = addrPool.GetUsbDevicePtr(bAddress);
    115 
    116  if(!p)
    118 
    119  p->lowspeed = lowspeed;
    120 
    121  num_of_conf = udd->bNumConfigurations;
    122 
    123  // Assign epInfo to epinfo pointer
    124  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    125 
    126  if(rcode)
    127  goto FailSetDevTblEntry;
    128 
    129  USBTRACE2("NC:", num_of_conf);
    130 
    131  for(uint8_t i = 0; i < num_of_conf; i++) {
    134 
    135  rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
    136 
    137  if(rcode)
    138  goto FailGetConfDescr;
    139 
    140  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    141 
    142  if(rcode)
    143  goto FailGetConfDescr;
    144 
    145  if(bNumEP > 1)
    146  break;
    147  } // for
    148 
    149  if(bNumEP < 2)
    151 
    152  // Assign epInfo to epinfo pointer
    154 
    155  USBTRACE2("Conf:", bConfNum);
    156 
    157  // Set Configuration Value
    158  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    159 
    160  if(rcode)
    161  goto FailSetConfDescr;
    162 
    163 #ifdef PL2303_COMPAT
    164  /* Shamanic dance - sending Prolific init data as-is */
    165  vendorRead( 0x84, 0x84, 0, buf );
    166  vendorWrite( 0x04, 0x04, 0 );
    167  vendorRead( 0x84, 0x84, 0, buf );
    168  vendorRead( 0x83, 0x83, 0, buf );
    169  vendorRead( 0x84, 0x84, 0, buf );
    170  vendorWrite( 0x04, 0x04, 1 );
    171  vendorRead( 0x84, 0x84, 0, buf);
    172  vendorRead( 0x83, 0x83, 0, buf);
    173  vendorWrite( 0, 0, 1 );
    174  vendorWrite( 1, 0, 0 );
    175  if( pltype == rev_HX ) {
    176  vendorWrite( 2, 0, 0x44 );
    177  vendorWrite( 0x06, 0x06, 0 ); // From W7 init
    178  }
    179  else {
    180  vendorWrite( 2, 0, 0x24 );
    181  }
    182  /* Shamanic dance end */
    183 #endif
    184  /* Calling post-init callback */
    185  rcode = pAsync->OnInit(this);
    186 
    187  if(rcode)
    188  goto FailOnInit;
    189 
    190  USBTRACE("PL configured\r\n");
    191 
    192  //bPollEnable = true;
    193  ready = true;
    194  return 0;
    195 
    196 FailGetDevDescr:
    197 #ifdef DEBUG_USB_HOST
    199  goto Fail;
    200 #endif
    201 
    202 FailSetDevTblEntry:
    203 #ifdef DEBUG_USB_HOST
    205  goto Fail;
    206 #endif
    207 
    208 FailGetConfDescr:
    209 #ifdef DEBUG_USB_HOST
    211  goto Fail;
    212 #endif
    213 
    214 FailSetConfDescr:
    215 #ifdef DEBUG_USB_HOST
    217  goto Fail;
    218 #endif
    219 
    220 FailOnInit:
    221 #ifdef DEBUG_USB_HOST
    222  USBTRACE("OnInit:");
    223 #endif
    224 
    225 #ifdef DEBUG_USB_HOST
    226 Fail:
    227  NotifyFail(rcode);
    228 #endif
    229  Release();
    230  return rcode;
    231 }
    232 
    233 //uint8_t PL::Poll()
    234 //{
    235 // uint8_t rcode = 0;
    236 //
    237 // //if (!bPollEnable)
    238 // // return 0;
    239 //
    240 // //if (qNextPollTime <= (uint32_t)millis())
    241 // //{
    242 // // USB_HOST_SERIAL.println(bAddress, HEX);
    243 //
    244 // // qNextPollTime = (uint32_t)millis() + 100;
    245 // //}
    246 // return rcode;
    247 //}
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    EpInfo * epinfo
    Definition: address.h:83
    bool lowspeed
    Definition: address.h:86
    @@ -395,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/cdcprolific_8h.html b/cdcprolific_8h.html index 024c9481..9dd5d9f2 100644 --- a/cdcprolific_8h.html +++ b/cdcprolific_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcprolific.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -89,20 +90,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcprolific.h File Reference
    -
    #include "cdcacm.h"
    +
    #include "cdcacm.h"
    Include dependency graph for cdcprolific.h:
    - + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -235,25 +239,25 @@ Macros - -

    Enumerations

    enum  tXO_State {
    +
    enum  tXO_State {
      kXOnSent = -2, kXOffSent = -1, kXO_Idle = 0, kXOffNeeded = 1, -
    +
      kXOnNeeded = 2 -
    +
    }
     
    enum  pl2303_type {
    +
    enum  pl2303_type {
      unknown, type_0, type_1, rev_X, -
    +
      rev_HX, rev_H -
    +
    }
     
    @@ -1099,15 +1103,15 @@ Enumerations
    - - - - -
    Enumerator
    kXOnSent  +
    Enumerator
    kXOnSent 
    kXOffSent  +
    kXOffSent 
    kXO_Idle  +
    kXO_Idle 
    kXOffNeeded  +
    kXOffNeeded 
    kXOnNeeded  +
    kXOnNeeded 
    @@ -1125,17 +1129,17 @@ Enumerations
    - - - - - -
    Enumerator
    unknown  +
    Enumerator
    unknown 
    type_0  +
    type_0 
    type_1  +
    type_1 
    rev_X  +
    rev_X 
    rev_HX  +
    rev_HX 
    rev_H  +
    rev_H 
    @@ -1148,7 +1152,7 @@ Enumerations diff --git a/cdcprolific_8h__dep__incl.map b/cdcprolific_8h__dep__incl.map index 28581b5d..83eaf52c 100644 --- a/cdcprolific_8h__dep__incl.map +++ b/cdcprolific_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/cdcprolific_8h__dep__incl.md5 b/cdcprolific_8h__dep__incl.md5 index 6e869c59..3f648651 100644 --- a/cdcprolific_8h__dep__incl.md5 +++ b/cdcprolific_8h__dep__incl.md5 @@ -1 +1 @@ -7e1c0310ccf8e65031fd95168f61528c \ No newline at end of file +5601c68c5c5e913b421194d3f765f64d \ No newline at end of file diff --git a/cdcprolific_8h__dep__incl.png b/cdcprolific_8h__dep__incl.png index ad8ebb48201c01fe9e818a880668d6521b6497e4..7680aa9debece169b12e373b3d906d89bfd14a24 100644 GIT binary patch literal 2401 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 literal 2527 zcmb`J`#)6M8^?EbLL!CZR?H+t;}Vjh+Ym7fT?}UkBb5d-%8X0GU^)Gphp7nXZR_s-KD``m; zNdN$(5!M#h!7&hQ_a%0MeFd!u4GvkY?Yuc+fqQzw3BB-m88Th59f{M7v(PH z>-iePWOq8lziDxUezU2B9(F}NyFT=uuRq)6l$pL`V<^3mDKjA$hn3Hg zp}-@lP+RfLNe?Erh15&l%zxbd`uM3++>wUhq5_V>>P&aT{fV79J*P*!I;OafD3p=! z)9jFQ*;&=yyGu$+Y;0}o{YHG=CiIH-0_w@wrJ>py=~FR9B_*DJMSsH3|8+av!FMc1 zndj|q6D!_fw%^&=*}%Y{k7BPSUxI?2^eXV!*l2m-Par%^N)nG0i9{Vqkc{+n6$M?k zD;n~OLXne`+u?!3NdbR;nnU$gXLeNB7d8;4pQ3dVa#qi2+US5dt2*81?oh zD|(mszGqgEbjs8%MqQl~EX{AUkuT)0PEJnV{?-M(vZ4nVp)#4bc%AvOg;* z_!z191o<4dwzn6H)V)!sq~Lw`RoCil&rw+f4u?Y^Vx3<-%j{SIQ$wTCYHDhFvd<3> z3$n26OGyK1zPQ_v#E0D~D5 z3Wd$h&H4HHeT7#phVm9amfc9b<=Xh*03a{f_I&V|0|tX}bq!nlaxDwVn`SH4V0RGt zWkp4trqKHO`XAMI*oKCNWHK2T7i|g<2!!v)(uwU`m*9J^4^T zU|{l=E>Jm$1JHDAa#K_Il`AsNi_6P11V&A#v2xAJqXtQ1U%p_okRN-uEjcG=YR@ipI5T*Q^o`U84;oCnw9s-foq=|8=|ttj6ot8sg$HfeRn){4$-4 zfiuJzq_y>vf`S5PDWykq{IRYsWWcPZBh1m5{utwa*v)SAV~mwm z2Zw{UErgRD*8~0iO~TeIsSeN;QYp*zx=5sJ&iZ~0)uVLwkI4; z-`6Vdi-F)&7Zr6mCtUtbH;BaD0?WO;IEDY;2PIbA&;9-V!nM9D>Grpu=0wa45BJmu zNIJYOEIbI?Tox$8(rgNPpQoic!(Nr8W@K2oA4@0C2z1qxzlgVG5kE7Ccg=TK{DbW6 z{mC-R%F1S%UYXRI`M~#En46PRQ{|q{bv>z#xEQokPft%-SsC~+GU9gq`d@>C-e|fx z4i`R7V3?Sg0Q#n;l3UEsU5<3~H%q_J2E4qyzVn43Bv&|9x3E|VAi&hk&#xR*9eMZO zRu*evVId(fC22bJ$1-0aSbfk4#!^*fP`y6YDR&_UT7Uk;0liv#HD+k4{LeD2-Tj01xO!CTYWUKwR9i}!!1wA_XK7}M3&1^%6Sy%+^! zu~{XbJnCBFx`MBl5N;O_XZi1SRg^e0C1m1eZk-aUCD z!Fm@=x^(GMJ%0F2-yCrAh`PG^vCqkU?d2=p#BuKbh@XFACB=zKvk3_TZ)^a<(%z!n H+=Ki#B>V&t diff --git a/cdcprolific_8h__incl.map b/cdcprolific_8h__incl.map index a91fdd98..3c82d573 100644 --- a/cdcprolific_8h__incl.map +++ b/cdcprolific_8h__incl.map @@ -1,4 +1,4 @@ - - + + diff --git a/cdcprolific_8h__incl.md5 b/cdcprolific_8h__incl.md5 index 4016e2b7..e7519a47 100644 --- a/cdcprolific_8h__incl.md5 +++ b/cdcprolific_8h__incl.md5 @@ -1 +1 @@ -e26e4be2e6b8e7c00195ad3f65bee601 \ No newline at end of file +9d9a09dd605ff7c3be8e192a907ecbfe \ No newline at end of file diff --git a/cdcprolific_8h__incl.png b/cdcprolific_8h__incl.png index 476e1615248033b4545e07e255d0a7c86c347a42..552068b9add9d1b9b23fc951faa2b445feeaaa31 100644 GIT binary patch literal 3355 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 xIia{3(PQ`Aa(3H&fhY~u{ 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 TxjMmLP(bJI1FbSm>yZBgffER0 diff --git a/cdcprolific_8h_source.html b/cdcprolific_8h_source.html index d8c041b0..6337d9db 100644 --- a/cdcprolific_8h_source.html +++ b/cdcprolific_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcprolific.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,165 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    cdcprolific.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #if !defined(__CDCPROLIFIC_H__)
    -
    18 #define __CDCPROLIFIC_H__
    -
    19 
    -
    20 #include "cdcacm.h"
    -
    21 
    -
    22 //#define PL2303_COMPAT // Uncomment it if you have compatibility problems
    -
    23 
    -
    24 #define PL_VID 0x067B
    -
    25 #define CHECK_PID(pid) ( pid != 0x2303 && pid != 0x0609 )
    -
    26 
    -
    27 //#define PL_PID 0x0609
    -
    28 
    -
    29 #define PROLIFIC_REV_H 0x0202
    -
    30 #define PROLIFIC_REV_X 0x0300
    -
    31 #define PROLIFIC_REV_HX_CHIP_D 0x0400
    -
    32 #define PROLIFIC_REV_1 0x0001
    -
    33 
    -
    34 #define kXOnChar '\x11'
    -
    35 #define kXOffChar '\x13'
    -
    36 
    -
    37 #define SPECIAL_SHIFT (5)
    -
    38 #define SPECIAL_MASK ((1<<SPECIAL_SHIFT) - 1)
    -
    39 #define STATE_ALL ( PD_RS232_S_MASK | PD_S_MASK )
    -
    40 #define FLOW_RX_AUTO ( PD_RS232_A_RFR | PD_RS232_A_DTR | PD_RS232_A_RXO )
    -
    41 #define FLOW_TX_AUTO ( PD_RS232_A_CTS | PD_RS232_A_DSR | PD_RS232_A_TXO | PD_RS232_A_DCD )
    -
    42 #define CAN_BE_AUTO ( FLOW_RX_AUTO | FLOW_TX_AUTO )
    -
    43 #define CAN_NOTIFY ( PD_RS232_N_MASK )
    -
    44 #define EXTERNAL_MASK ( PD_S_MASK | (PD_RS232_S_MASK & ~PD_RS232_S_LOOP) )
    -
    45 #define INTERNAL_DELAY ( PD_RS232_S_LOOP )
    -
    46 #define DEFAULT_AUTO ( PD_RS232_A_DTR | PD_RS232_A_RFR | PD_RS232_A_CTS | PD_RS232_A_DSR )
    -
    47 #define DEFAULT_NOTIFY 0x00
    -
    48 #define DEFAULT_STATE ( PD_S_TX_ENABLE | PD_S_RX_ENABLE | PD_RS232_A_TXO | PD_RS232_A_RXO )
    -
    49 
    -
    50 #define CONTINUE_SEND 1
    -
    51 #define PAUSE_SEND 2
    -
    52 
    -
    53 #define kRxAutoFlow ((UInt32)( PD_RS232_A_RFR | PD_RS232_A_DTR | PD_RS232_A_RXO ))
    -
    54 #define kTxAutoFlow ((UInt32)( PD_RS232_A_CTS | PD_RS232_A_DSR | PD_RS232_A_TXO | PD_RS232_A_DCD ))
    -
    55 #define kControl_StateMask ((UInt32)( PD_RS232_S_CTS | PD_RS232_S_DSR | PD_RS232_S_CAR | PD_RS232_S_RI ))
    -
    56 #define kRxQueueState ((UInt32)( PD_S_RXQ_EMPTY | PD_S_RXQ_LOW_WATER | PD_S_RXQ_HIGH_WATER | PD_S_RXQ_FULL ))
    -
    57 #define kTxQueueState ((UInt32)( PD_S_TXQ_EMPTY | PD_S_TXQ_LOW_WATER | PD_S_TXQ_HIGH_WATER | PD_S_TXQ_FULL ))
    -
    58 
    -
    59 #define kCONTROL_DTR 0x01
    -
    60 #define kCONTROL_RTS 0x02
    -
    61 
    -
    62 #define kStateTransientMask 0x74
    -
    63 #define kBreakError 0x04
    -
    64 #define kFrameError 0x10
    -
    65 #define kParityError 0x20
    -
    66 #define kOverrunError 0x40
    -
    67 
    -
    68 #define kCTS 0x80
    -
    69 #define kDSR 0x02
    -
    70 #define kRI 0x08
    -
    71 #define kDCD 0x01
    -
    72 #define kHandshakeInMask ((UInt32)( PD_RS232_S_CTS | PD_RS232_S_DSR | PD_RS232_S_CAR | PD_RS232_S_RI ))
    -
    73 
    -
    74 #define VENDOR_WRITE_REQUEST_TYPE 0x40
    -
    75 #define VENDOR_WRITE_REQUEST 0x01
    -
    76 
    -
    77 #define VENDOR_READ_REQUEST_TYPE 0xc0
    -
    78 #define VENDOR_READ_REQUEST 0x01
    -
    79 
    -
    80 // Device Configuration Registers (DCR0, DCR1, DCR2)
    -
    81 #define SET_DCR0 0x00
    -
    82 #define GET_DCR0 0x80
    -
    83 #define DCR0_INIT 0x01
    -
    84 #define DCR0_INIT_H 0x41
    -
    85 #define DCR0_INIT_X 0x61
    -
    86 
    -
    87 #define SET_DCR1 0x01
    -
    88 #define GET_DCR1 0x81
    -
    89 #define DCR1_INIT_H 0x80
    -
    90 #define DCR1_INIT_X 0x00
    -
    91 
    -
    92 #define SET_DCR2 0x02
    -
    93 #define GET_DCR2 0x82
    -
    94 #define DCR2_INIT_H 0x24
    -
    95 #define DCR2_INIT_X 0x44
    -
    96 
    -
    97 // On-chip Data Buffers:
    -
    98 #define RESET_DOWNSTREAM_DATA_PIPE 0x08
    -
    99 #define RESET_UPSTREAM_DATA_PIPE 0x09
    -
    100 
    -
    101 
    -
    102 #define PL_MAX_ENDPOINTS 4
    -
    103 
    -
    104 enum tXO_State {
    -
    105  kXOnSent = -2,
    -
    106  kXOffSent = -1,
    -
    107  kXO_Idle = 0,
    - - -
    110 };
    -
    111 
    - - -
    114  type_0, /* don't know the difference between type 0 and */
    -
    115  type_1, /* type 1, until someone from prolific tells us... */
    - -
    117  rev_HX, /* HX version of the pl2303 chip */
    - -
    119 };
    -
    120 
    -
    121 
    -
    122 class PL2303 : public ACM {
    -
    123  uint16_t wPLType; // Type of chip
    -
    124 
    -
    125 public:
    -
    126  PL2303(USB *pusb, CDCAsyncOper *pasync);
    -
    127 
    -
    128  // USBDeviceConfig implementation
    -
    129  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    130  //virtual uint8_t Release();
    -
    131  //virtual uint8_t Poll();
    -
    132  //virtual uint8_t GetAddress() { return bAddress; };
    -
    133 
    -
    135  //virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    136 
    -
    137 #ifdef PL2303_COMPAT
    -
    138 private:
    -
    139  /* Prolific proprietary requests */
    -
    140  uint8_t vendorRead( uint8_t val_lo, uint8_t val_hi, uint16_t index, uint8_t* buf );
    -
    141  uint8_t vendorWrite( uint8_t val_lo, uint8_t val_hi, uint8_t index );
    -
    142 #endif
    -
    143 };
    -
    144 
    -
    145 #ifdef PL2303_COMPAT
    -
    146 /* vendor read request */
    -
    147 inline uint8_t PL2303::vendorRead( uint8_t val_lo, uint8_t val_hi, uint16_t index, uint8_t* buf )
    -
    148 {
    -
    149  return( pUsb->ctrlReq(bAddress, 0, VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, val_lo, val_hi, index, 1, 1, buf, NULL ));
    -
    150 }
    -
    151 
    -
    152 /* vendor write request */
    -
    153 inline uint8_t PL2303::vendorWrite( uint8_t val_lo, uint8_t val_hi, uint8_t index )
    -
    154 {
    -
    155  return( pUsb->ctrlReq(bAddress, 0, VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, val_lo, val_hi, index, 0, 0, NULL, NULL ));
    -
    156 }
    -
    157 #endif
    -
    158 
    -
    159 #endif // __CDCPROLIFIC_H__
    -
    #define VENDOR_READ_REQUEST_TYPE
    Definition: cdcprolific.h:77
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #if !defined(__CDCPROLIFIC_H__)
    18 #define __CDCPROLIFIC_H__
    19 
    20 #include "cdcacm.h"
    21 
    22 //#define PL2303_COMPAT // Uncomment it if you have compatibility problems
    23 
    24 #define PL_VID 0x067B
    25 #define CHECK_PID(pid) ( pid != 0x2303 && pid != 0x0609 )
    26 
    27 //#define PL_PID 0x0609
    28 
    29 #define PROLIFIC_REV_H 0x0202
    30 #define PROLIFIC_REV_X 0x0300
    31 #define PROLIFIC_REV_HX_CHIP_D 0x0400
    32 #define PROLIFIC_REV_1 0x0001
    33 
    34 #define kXOnChar '\x11'
    35 #define kXOffChar '\x13'
    36 
    37 #define SPECIAL_SHIFT (5)
    38 #define SPECIAL_MASK ((1<<SPECIAL_SHIFT) - 1)
    39 #define STATE_ALL ( PD_RS232_S_MASK | PD_S_MASK )
    40 #define FLOW_RX_AUTO ( PD_RS232_A_RFR | PD_RS232_A_DTR | PD_RS232_A_RXO )
    41 #define FLOW_TX_AUTO ( PD_RS232_A_CTS | PD_RS232_A_DSR | PD_RS232_A_TXO | PD_RS232_A_DCD )
    42 #define CAN_BE_AUTO ( FLOW_RX_AUTO | FLOW_TX_AUTO )
    43 #define CAN_NOTIFY ( PD_RS232_N_MASK )
    44 #define EXTERNAL_MASK ( PD_S_MASK | (PD_RS232_S_MASK & ~PD_RS232_S_LOOP) )
    45 #define INTERNAL_DELAY ( PD_RS232_S_LOOP )
    46 #define DEFAULT_AUTO ( PD_RS232_A_DTR | PD_RS232_A_RFR | PD_RS232_A_CTS | PD_RS232_A_DSR )
    47 #define DEFAULT_NOTIFY 0x00
    48 #define DEFAULT_STATE ( PD_S_TX_ENABLE | PD_S_RX_ENABLE | PD_RS232_A_TXO | PD_RS232_A_RXO )
    49 
    50 #define CONTINUE_SEND 1
    51 #define PAUSE_SEND 2
    52 
    53 #define kRxAutoFlow ((UInt32)( PD_RS232_A_RFR | PD_RS232_A_DTR | PD_RS232_A_RXO ))
    54 #define kTxAutoFlow ((UInt32)( PD_RS232_A_CTS | PD_RS232_A_DSR | PD_RS232_A_TXO | PD_RS232_A_DCD ))
    55 #define kControl_StateMask ((UInt32)( PD_RS232_S_CTS | PD_RS232_S_DSR | PD_RS232_S_CAR | PD_RS232_S_RI ))
    56 #define kRxQueueState ((UInt32)( PD_S_RXQ_EMPTY | PD_S_RXQ_LOW_WATER | PD_S_RXQ_HIGH_WATER | PD_S_RXQ_FULL ))
    57 #define kTxQueueState ((UInt32)( PD_S_TXQ_EMPTY | PD_S_TXQ_LOW_WATER | PD_S_TXQ_HIGH_WATER | PD_S_TXQ_FULL ))
    58 
    59 #define kCONTROL_DTR 0x01
    60 #define kCONTROL_RTS 0x02
    61 
    62 #define kStateTransientMask 0x74
    63 #define kBreakError 0x04
    64 #define kFrameError 0x10
    65 #define kParityError 0x20
    66 #define kOverrunError 0x40
    67 
    68 #define kCTS 0x80
    69 #define kDSR 0x02
    70 #define kRI 0x08
    71 #define kDCD 0x01
    72 #define kHandshakeInMask ((UInt32)( PD_RS232_S_CTS | PD_RS232_S_DSR | PD_RS232_S_CAR | PD_RS232_S_RI ))
    73 
    74 #define VENDOR_WRITE_REQUEST_TYPE 0x40
    75 #define VENDOR_WRITE_REQUEST 0x01
    76 
    77 #define VENDOR_READ_REQUEST_TYPE 0xc0
    78 #define VENDOR_READ_REQUEST 0x01
    79 
    80 // Device Configuration Registers (DCR0, DCR1, DCR2)
    81 #define SET_DCR0 0x00
    82 #define GET_DCR0 0x80
    83 #define DCR0_INIT 0x01
    84 #define DCR0_INIT_H 0x41
    85 #define DCR0_INIT_X 0x61
    86 
    87 #define SET_DCR1 0x01
    88 #define GET_DCR1 0x81
    89 #define DCR1_INIT_H 0x80
    90 #define DCR1_INIT_X 0x00
    91 
    92 #define SET_DCR2 0x02
    93 #define GET_DCR2 0x82
    94 #define DCR2_INIT_H 0x24
    95 #define DCR2_INIT_X 0x44
    96 
    97 // On-chip Data Buffers:
    98 #define RESET_DOWNSTREAM_DATA_PIPE 0x08
    99 #define RESET_UPSTREAM_DATA_PIPE 0x09
    100 
    101 
    102 #define PL_MAX_ENDPOINTS 4
    103 
    104 enum tXO_State {
    105  kXOnSent = -2,
    106  kXOffSent = -1,
    107  kXO_Idle = 0,
    110 };
    111 
    114  type_0, /* don't know the difference between type 0 and */
    115  type_1, /* type 1, until someone from prolific tells us... */
    117  rev_HX, /* HX version of the pl2303 chip */
    119 };
    120 
    121 
    122 class PL2303 : public ACM {
    123  uint16_t wPLType; // Type of chip
    124 
    125 public:
    126  PL2303(USB *pusb, CDCAsyncOper *pasync);
    127 
    128  // USBDeviceConfig implementation
    129  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    130  //virtual uint8_t Release();
    131  //virtual uint8_t Poll();
    132  //virtual uint8_t GetAddress() { return bAddress; };
    133 
    135  //virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    136 
    137 #ifdef PL2303_COMPAT
    138 private:
    139  /* Prolific proprietary requests */
    140  uint8_t vendorRead( uint8_t val_lo, uint8_t val_hi, uint16_t index, uint8_t* buf );
    141  uint8_t vendorWrite( uint8_t val_lo, uint8_t val_hi, uint8_t index );
    142 #endif
    143 };
    144 
    145 #ifdef PL2303_COMPAT
    146 /* vendor read request */
    147 inline uint8_t PL2303::vendorRead( uint8_t val_lo, uint8_t val_hi, uint16_t index, uint8_t* buf )
    148 {
    149  return( pUsb->ctrlReq(bAddress, 0, VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, val_lo, val_hi, index, 1, 1, buf, NULL ));
    150 }
    151 
    152 /* vendor write request */
    153 inline uint8_t PL2303::vendorWrite( uint8_t val_lo, uint8_t val_hi, uint8_t index )
    154 {
    155  return( pUsb->ctrlReq(bAddress, 0, VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, val_lo, val_hi, index, 0, 0, NULL, NULL ));
    156 }
    157 #endif
    158 
    159 #endif // __CDCPROLIFIC_H__
    #define VENDOR_READ_REQUEST_TYPE
    Definition: cdcprolific.h:77
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcprolific.cpp:24
    @@ -275,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_a_c_m-members.html b/class_a_c_m-members.html index 8d6457f7..4eee237b 100644 --- a/class_a_c_m-members.html +++ b/class_a_c_m-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -141,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_a_c_m.html b/class_a_c_m.html index 7e2973c3..0241b805 100644 --- a/class_a_c_m.html +++ b/class_a_c_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ACM Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -101,14 +102,25 @@ Inheritance diagram for ACM:
    Inheritance graph
    - + + + + +
    [legend]
    Collaboration diagram for ACM:
    Collaboration graph
    - + + + + + + + +
    [legend]
    diff --git a/class_a_c_m__coll__graph.map b/class_a_c_m__coll__graph.map index 9d14eba9..6520e6af 100644 --- a/class_a_c_m__coll__graph.map +++ b/class_a_c_m__coll__graph.map @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + diff --git a/class_a_c_m__coll__graph.md5 b/class_a_c_m__coll__graph.md5 index 9ed1f38b..f43712cc 100644 --- a/class_a_c_m__coll__graph.md5 +++ b/class_a_c_m__coll__graph.md5 @@ -1 +1 @@ -089a4ea333d638a22683872df0d7f680 \ No newline at end of file +587ce662854a9a2b4677918117ea2d18 \ No newline at end of file diff --git a/class_a_c_m__coll__graph.png b/class_a_c_m__coll__graph.png index 9ae39b7d7cc37d680f1cbb527366ae7520966685..c81a95658f90c16a3ee7789342c13b1edeb51ed2 100644 GIT binary patch literal 19180 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 I>zopr03x<}HUIzs literal 18116 zcmdUXby!u~yDloy64G7L-3?OGAt~J;-Cas|iZn=fHwZ{KNOyO4*B$KNIp_8{_usqr z^SGC|m~)IVzkJ{KTfy?OV(;K^;2cl5)7{tckk)3~{m@Q-1xkIX(;yt&`+eX31e)iF%i%2729@ zCHlma%DugkhQ|DH-LiVoml}O|D?GP;bpN9l_H8S zpZKMjnUxh95`u>Bzh-J?_VjQ*;^gEMf(V&UfN+EgenSr{;4L)t{M;NhH}YE^$2}!| z{k4PHDs+4pc|MyZa4EO@i*dQtgb=-iOks#ZxI2xPtAG6Yf4ePY!&?Z53)}#`($doA zqbm3N!#XAe8Y(Ij>DdYc=m0(Us{<5i*NYvL@K4}wKXfG(6k-}1-2?^O{`ym!1+~CK zyx+ipfM7&MM@M&cb@lPq(9jqk8}lu=#P7_kuAQt%La1_z}%W8ANgCYz;y!oP+YL3hvW9uT^%obKRw)@Z;!

    6^|iI9%Q9~^ z4i0!RePd(xJtJmq42a(dcJL4oSV6tLy|EN>aP*-m{GM)8#cJ&=A3l8W3k;M?ZvAuuEhNL4(O0NW`r6ThglwuZhu+k&#hR&u_QWy>B<;mzI`%b|oYv zG-@qY&u?pLYEDm2_4M>MI)D85aoqZ>&4}wS#eAukdl&uEJROF4~>X7 zQ(+)hCO>PzzHd~ig$8l)dfo0dcqH-#6NxM)X}qp>g9%LW^jdJRuuM!$D8G~A;*_N)jQPa>&muk5` z-Z|3I(XEy_+1d)iFeMI_wLWnZ6R$2b*eeL(vlvU4QJqvnGiI;+2BwW5Z)mttpqK~a zgX}Ko*R!6Ol%$V^fsFhO`8~g*?OJE>#KZ(R8E`KOGO|l*c5?FE+FEvMYO^+us}2O6XiGzYiJPbK=?63Oqm9U+jzy4GqoC&U$%yDXh`b)01nH$L_r$LIM8y5k`oT ziRm=%91Rom+=Uk&KD4@;6(2t}AOLE0_vg=__g9DeH}iLw`&wFBws;gUYry6{efk8A zMDPJd|N3YV0|NtG+pvPr^8#2#WbZT=7nhrxn-X=+w5)qaz&l7mkLSm0;H=>1nHA`m znDEE*(e(>LDg&<|D*m-&WLGuAt`KxVLBXx9EuUTR3J(v5$DsZDI1em5G&I!S-X7NH zONG9FSs8;XQg6UJTv}S%sS*t_uc(o2>xKGg*}Ungsi&LuNbBFHP?0^T2W2QiU0q$v zp4VFL?)ULJUJai2PIPo7dET+_O%xRs9|r>L3LqdJ=^!9vn!TT&YRsqMdJ6@igc&vf3jxu;`EZ*uSrjRk zx_3TrEro^;5Ao*J%Yl4sNa2b1MV6GMH>}_ciFo_%`?r^f|3loIhKDQ%hPZQmHJ)Lc ziW?6C>h;Uo*-xN5# z`Nd?y=gdjcN93djmBe`=5U^gt|1Y%ns8#ivUS+|M-}?uWLqqn^-h=DC`R97tUS5te zGDS0W6BGH{Bip@P1Q1Yf{@Lp9P)st!w!Y1?ku*=r5nTwZ4=#w*Uqh__{NaTz{quXTx5xbndb9g2(j`D|9Qu9peV_taj=^V`TkzC6gv|MEe< z>;#4XktEv(j za+T|#la*+p2z_Nux=H+oHWyiho;~j1SS)aB9(x8-hJ6j^#;_MD08X zhWP%ObVXx^V~DVEe4l{l8=p7^J{D3^9q#1>w6CAOM@2OmNh`_!*am7FSKcKecw#9c z7$FRl@84tl=0splZy)}ZToGF+iS{=7V(qsEu|2pXn-=>D@ku6mKj~tDh)i>Mr;N6H z_+QpQ6UPg$JIb}MiD2bGwgky3A|gUvT^$5jP@$kMRQSR&F*7IexjQK;#_nh!A|euc z-DIqkw16_Hjj^~jT?l4!YHB!LV7aYLP*s(Kk?{niqDQ*#L_weq+1uMgBuBW7ZJ`#G zC`jUsUjf{y;zNFFA;#vF(Y##|k){tr9~-*Q=VX zsHiAwzDi0<)7I5pnbz^9D_RPI<3MYY&+!Q+_4J}@!e8a<5NEX5qgg-40O4z(uMb30 zX=UZf)sDc}m>7^f-ySbDIhTR`)Ye{sa)*tL4Sa6@Qbk5)D4J9(K{~g!^`&lWZJGP~ z*JeCd=J8!Zo9@l+t*N;=1v$B~k&CIwH8WCC`-@0vvL{-K$pH)E$f+}ccc9x8s9MMsf zo10tP`|+fGiQc~fQsl)lY!-IoPFGf1Lp+A2<9%yhz z1p511E;cH=ePFII9!dg-1S1z59GnO$lU6t?ditZ9574yCFE6_&|0wro)nRf^<&YR9 znOg>7#K85#!)A|LJ0BvIQcY}Rzcl_b&po&60U%clT|s4!rEcd zXFNypian4T^c;=9q`^Dbf9US8hcFIi!)P@n`7 zd4;teR;}G;|3ExL?6Y0N!pzJUczAew`*ZMyJ|3iyi_87#*ke0RJW|pu@F95F>~ojj zmh-isd`V19^t@RO^wBZS+$8b?3Hbcj`&r{=9y~p#n-je=N6`565PDmHENx%_a<_0= zN+;t%XE177T3UB^_p;YLoe(7_Cl)cQ*#zYW2mW-Tpf}KnVFY~YIy&BC*%F}GQ;0Js z%MQh4xVyUpSK;R3!WZz;WPAkI7#MZrSO0$#bJO z8u&?JK|wIx2B=Ix59EBb(BQE9{)e;wH`x$1Y7~ytc+H zjX-i#6fyw;zw4PH5)#s?B4*~{2X1b+-LagFCRz+B4UKzHR*5f2##a|~_w-mVHpWTj zz_o~qiBYh#v-9((X+DAC_vq*dluo0gqj-qW1#?L;LgY>In;%RUVPjiNKEA)A=ojWx zU!9I&hubA1f(@h_ZBCqd%sbiFPWGMACp$cc7UvxO=*w?ydpO4iiiCIX!l@K<4;Gv1 zGBbr-Y8Mt3A|epUV{b2Z$6-;)EtXrf6cWMH2nYz+*auEv40;Y_W#!x3+oz|eWDaZc zk)btCS!5B=c*Vt`#}A-?umWw*<=I*P$Or=^B^Hm9g|u{7ww=0$28s}N;*t{3h|Nt*IIMTS!^Fg# z2>h)eF{}aX6f7D%OAwv#`8^UoWmSBktu%`zm&qL8#m2@4^?ry}09e~6n8SqzMMlx; zsJdk@9xkqi(o$J1EziCfG7w`x=Kzz@-TkTJFkAJGVb0hu)TrXiSbRC}h{kU_QSsS+ z?OQdx9(;U!;Qy*VM70*PYnz**vY7L-R?97x`ugpgcCbD{k&)MDXCxfTqjB_3=uvH~ zY;2byt4E7Xpitg8^FANqcpDyN@!3~RQPOcqU$;qqcf)(hCrlCR^tzj@@yM@;!E@xJ z_)Izi|5gjupewutuK&e*7~6NreTE@NLmxcLRvgQQ1gpPP%vWCYOIoWk57WW;tem=l zUC!58UteA2DinZdhdf9wt)rt;&nMAG$IHtLjJ0=~!)gJG#TX%ZXlit{ufLxJMjx0c z2w&L5)ySYT1MV+1tn=jyr3;<9tdtbIP<~B~vW1Mhn;YnD)_WrRyul~-*VcqSCC9`F z4S)PZ@1*7C?hd~vi`+@*{g5HlASxvlnv^u>yzDtWHy5(*A|?i%K0;CSGd-Q*2186t zOq5O-uP09?`BRPpCcP$Qf?zc=vpQm+qLNale#MQ)69|EQ)@bvxZk98dmbueHQL*wbLlJBQ*9LN1BIv=7X*X>k3_bZs! zJ2hinrLQF#x=OAT}K2}4FcFxgFofkrc4a7x^uG~Je50?#C>dA z&jO}zAKeE_v@t27PBx1Q_bUD^3?F}ntFM%ebW&x-2W7#?LM381Y{^5i;^H4+!tr^o z1{higM@F6j>H!WHZ0PT|8H=l2nPhUABoXniL7)c#VPj)IBm_=MN~*Hz^aqt<|G)r9 zNZ=Hl?k-H(lRZz@y1GI!;k|1sE5{}$<2(*`cexC@5hOOTu(8#?e7V?Ti%m_%$HD>` zX!h^lKilVT_3G>EK^GWRR#IGyEVSY3A|WXy)!f|t_BjHCvi`vk5>sUyZ0wxuY(qoC znVA{T!RO`WDN-^dh3L-4lqh~4I05mjpr8OW?Rj$PvXYW9NGTpQe@Te2u&}%YBNG#79p&G?LHHpzq@&Nv0viEM zu?^_7K_mj6M*pS!qr7q1ixXhs;6&iCQFCzAsa7{MG;FA5#lJidrLQu?4F^K#Qmnfu zzk%tyMOT_cRSJBzQvh*F1h;mkIq^etQlPFqvODXK>Jh>OFYg)9R^51IWM-1!gd3Zi zOQ{$D48%v{6%&H{eo0;D5?5|XNwdXlB`|m3$D_`$J~x~3IxmPv^mB}WN-xyh++0$0 z^mpVWP$2G(=P_v312BQ;Yw-sfnj-L!&K#|*j!LzfvVWXE-Gkinc->Az1cL0qrkT09 z#+NSu8mO#fwsSKzEvTtsyKQ8EUtC&x>Wiglhu@1MjAo%Ksw^sk?>SY>ldY+)rqyb^ zXue(|^`0Z~>wUl^7RehwJUomh`Kf1VY3bl_vDEC|(cWGQa+`h^T-)WYb}ye2C}Kec zX<%SrZ)XQE9=R5>f>apPdE>uD3M8V@l_Vl2M>TO0x3n+)jPydCb^6M~6==@;2z_Ga zBmi>IV81P!#>?gP;DU>bE11}<(wMDW4#F#NE%;^hcH^qn+pT0!%f&pyaR{BsXA7B2 zA~wkzk^lGO_j*Ya|2lrk%2{6TCry`3@C-DHvpt_6E+y%7T#vqjY7E#lCWAID4Na5l zd2V|8atxUijm=y|R8&-3dkG*jpmdW$hMe^upPamWF+~fXSOHMoo?l+l zy?|tt04Y+dwMhJ7hl7hNBQ1?V`^5&J5x;-`2FU}C*kN~!?2HuPA(25rlmLpOq&xvZ znP)O9eq=?0oA7d6P5|6kv&pHXq2U(fYmh*(0wi>5{XEKo#ns{f)&V*O;2Tz;25>p~ zm78mh@I(}e zfR`vfW5!7c88Whm1^7&PIj7x5(28Ovjn-K1+|m+QDggn3*JeLDcdFObff@rtSyWWi z(UFzity~J{=f5z07;Fh_WZUK>|I}(v(;_0rf@Dui^&-=$UptV!7R~uW7XL{vJNIlT zt6EXICL~T-QA$25I->z}PS)fPS{wNkfk=c_*47jwZ?AH`NX%EFF&|mCZQ8XyUTHWx zJ6Ce-{-o2Gv8Y|qB8a@6RMoi!)sm?x7bmC1T(typx{Z)*TKMakH$vtP^pAFGvm-TmcikO&~08|bMDKb0z!`g8n*@q9DoSX^C$<{OF-#b>L zSO)B|3HaQUgoTA~*n5kMY2o|h@0P*P zLshG3F}q>94Y}b4{|~|yM|VOXA3F$Ff2Iu4?5Trz4N5+EO!~pTzTJa^!QS4RvjK*z z%uF==A0gk3@NP*5f(B>_bC zC#_l~h=HQeIr_TTg_(ncgV-#_0JAo0_k(3-(A3c(ock7n)3+~s@QK)zRaA)T_;Ht^ zmo5M<{L?&$c*ChY==ec!zTl<+MTeg6&}0S;1tL95`HQKp2@lkMf!5^x&_{GyDj_6J1tK7 zr_b8VOgA;b$e9WSAO{!L2swU*iXGb4DGgmm(G=}DGut31jTO49NwTP3*qSMRu5z=s zblzQg6D34`hgXiyi-+uT+xMB^SoS{CKt*tE)MgkY=B!GbDS{|GnLi-3ROqN{ZqB7yc`A| z9@migasCLVvyW+~(I~_wyRJCIjJX;+L3)mOZ-nW!wemXe#P-H6Dg9gGY@TPXp;Gsg zR|pVslAhbC&Y%>BRvRX|F5*n?FPq$${%S{4bMndYbq^zeDZjEWHo}{sm3N6c+vl|J;nJd_j#b8wWm#FtJsmlN0eWA) z=9>$(Q#ZV2*W`Q3I(@okL&IU;-}w5*{herFmS&^6OM#9G?}*`h$T4?(}Yi_q5^K&0aPX=TaPW`^X~327X5Vl(E8_ z^3Wxbp*Lr2M)>wilt?d2`D%#rvT%kTq~OAR>D^(pvu1SW znUnk86r47PEOL-g2VVO-bo^)whq}|W5A5h^W^2`_$N?yjBrcFbFeo$i2`&5z9y9eQ zit3*6eaFO%Z~=@yE2MtN-$`Hhptw@w3d88dwmRbc41Vi#j$tRSq|{_A!<(wj;Px5> zTN$m?xzSNeQ&X(>YwzE$aa*OZTM4Gs;FaJj}lyutM< zEn_H>HW!8z!bU^(Q03tuKR1}FO>gjF^xb= z#(^6R3G%S_t!oME;GtIRUxq_8^yEy67OwXLskBqeJ4lC};wtXK<2y z?oaKEA2=!GGIUWX+z13(iYsHH(`4o3@|GJE7v}oe*(UKhhRGQJGEw%9_Vj$JaXX=E z-7;1&+<2<2{4{#uBh>bEo_@<>(o!1rCm>NVTGY}=3x?QFF9~XbOG10Ek$H!qpb_h$ zR3o`RVZ+**?3fs*NMHQr7X0+&t*TgIIyN`pZEy>#s>pMS|{O= zK5T#9h#Q)6tN;%TwXny!nv|>n?cMQ4$Ne>cX!oLGvEpooGA!w|@M^jc2&RFx zTbu8*vW&wcIw8Jughz02a3;+8^(PRQyvlqy<&9k01k82wAI9vA3}gMw`_mrcP>kk` zva*~%FoEB*GF%siF=ui8LtKZL;FlQJWW!oN{_24ZPZZ!keyk!8#wgqU?LDJq8~sjY z?yBEJ0zu+fAwS{z_4%qNWZc>*VfeLoz97l$TmKNXw|laWedxGT9a4f;#HxIJzdi3u zA0N)?{22KOTiqO+%gRb-xNK7>>8*N)>A`X5<&4hH^9&7Lc1JkAEc~5gRUKii$=F6# zRh7wTrm&itk&hQ6D~{3W+TZR^Tbl!}P*8J(-gsxDV(T(8j_9~~A$xk~k^Y;oa&3$j z-LOcg*C_E7j&bXdd|QS^$Gj3zKVtW>mY}EP3KCaG$!u zw5p9e-4TwL&6=x!I_an>E==~Ly6=d>$Os(iv8!tgf9_L33iZ}It-7L?E#uZlqrFiy zKfc`xfs?MFR-8XRE;_PWwQYjExE93dKo-SM_8RP%alE0JjnbfmiXSjx{F3$QvIz+@ z(Ih)>ysEOFg+(fH&`L0kNzW%RJbYAMgh$hs^LKtesi~*{0lQ!Fhq#VKKjYdaOH0{KH(M9&+s|rO4Lzua z^>clB-Y^^wCG*Xoa!30*%zq$5(>EKtPC%ou9$PdyE~M zK@lv2eQze>U0h_UxUGFM#)=~dAEi7UdnW2C>_zeYy5)QOtxOgy4;~s?{9rk5!!$pY z(e(9-N9W;2Yd(2^%!27Lv!h|E!lBi=(X*zMoPL7qzMn-UlkM~;n9K5;;PG@2W*HIA zlg!zzIxo0=7W5O4hgm8s`#JH_nww!~VI3Y^RHdYPSw6JeX6ELK-j%f8-cH)unr;to zV&U$4+^phC#Rp*H6kZh^5XarFpHskwdsrQN!i&DM_Zo0%f1aiJKrKpabMc{q>AVNW z4|&*~38mw&A3h?zb7`6{>F};jb!ez z4ZW?MF>!pCw`WaU4>UQ}W;!an5r>AgB{kt@*?rlYQnWpBuIM)nU5p=6Obm^GUS9m} zWf2ly6cW-54|hbv|5aF6Y}nbA^LQ!- zb4*AqWzlho$~kq*VRYm8IZL1Cg|7}e7^_cm%W^Z|(%Y$;r`+y~B#S;a2k}Li&7t|p zUoKvmr~gFp(BJb;wG>uz{~Pftzj54ZwTRS-ws>uT&MD)r!!d!jf~XE_3+O`N;LIwk z21L)p{>pRQobo}?(H#gp4+e!wS)1v95_xG#-y<_tdIhzPCA!LK>p=DoSk-(D z$_q(8i{xgY+}QWY_|REyi8%-`oPwyO}xVM z6w|xzPa3PsYdO>E=_XEomi|X0r1%>cq~fZoBfik+Adso4Z35`Vga2qv9|dg#3ug}l zW6M|ec)_b@NuzEkl)(gUuTyucE`P zZsyjUENvYlvfIyLx+1;{`hEcGcD*V0IY^04*6?5Vi;rjH!usk`&l83>DF&*A21Pu~ zc&GJlRA}gNGASWUdc3@Xg4~^YG}^=GLKu-RH#-UUJ6{w3%Klbnyq%98<7ZLGt_>aZXV4U|0iGkCg!(U+pWkDU#`|pP}82EnOi%1`MAo^D$a!4wSh2OT#M!{Asrf1z+5xv zRd51aKh{K^a%N|g;Vf)L*MyI+mnFNPz?9GF;OKPyy0NL@xK)6h+btw?00y5&e8%^& zhD=p`OZ!5_fymC^J~%rvT~F!a3FSK4-uaJB*J0!W#IsWH4%mpvo`T67DzOh)ShRk*OejEDvg1TXp4wFifh8cx%4lYI!1 zxvK@R_!koPEc;K7@9h>&wOzYsDrEQeqD(HjH_ytn={RkOHb=9lb#&%)q=ZcdVSbH% z(l?Pyk;6;>L0H~D=1!l|^_dAW;>#tUn+oZXVD4+x>9`3)hk7{IW^{Cp*4F#Kh$wnlI{W*n?{Bv^k~!clEyJ@i+qXuLrltsN-S=>D z`)@Q~oE0d-b^;051&pLbr6i_P>`84etQ0Q!aw8IPQatuRxA*54E4vejCNU!%8RPpk z)e}12i^P<@p!lNVoKcf`*Qn46N=xSr@w)=WSsa||-riqq=H%~IOqmOdb{y=xBiTZ& z?#5Wf))H}*C)DRWJw2(0Npn4p4fkGgt^VPpGTnRAUQ^7ch7f5M7I=f#rWxtX%bx_pz(r*>81iEaib3tA;?Kz_>w8gAHQH?CfS=pJ+{uWn&|bmsga@?~5p928R93fsQ=6>%b}= z>hNV@`AOv_zUAlA+!I4Z`RbaH_UO^mpC5CkH3$#N4lULKtZHygN38I(h!h#>piHq_7p@qTJj@c+3cmT3WnrQDspwRSg1y{QDIo zxwAGc>O%TJe|y;d3euJD43LH5mhLy^T2d161M}U2<|PiapEN18HXM=lEs`bnNoEg`bjM5t*8bK zH^vDyWa00{rxRT|-=$5)w!hvDIl;Jw=gd&x%5Xls>%*yQQ!2HIiP|>hEVmx9C~+o? zSjB#RgZ1?nKQX2z3ixSMWiQTgZH0}bDh+xfN;K*K#^-*%H53xDNd_sa8AiS3c$$ZQ zzO&ATg3u8X8mgtKnJtZ?qM)$0w^z8)WWK9R1fxHiDY`w9Zc_2Z4pDkyGp>t!%gg{H zlG)*h8Z`XwBq539JR`7${AY!ZDDF}%Tqf7Eo#KQ%Qt(-)t5Zx49YpF|d&R`)ti zdiukx$TiSZVlp6xhao6kW=z4R-0fdo`vP_bV7Wk>k|*gr;>cc0m5vVCKcD;uEZ#MubJZ-vCSg8d8s*rv4UA{Yno<75nA=0j4) zt?irRqN88!ml5*0R-W%oUV^rj$j|BMH!|Mu@e%9!5cHn4_2cP@YHIE=V!;euP-FK* zh-$SGtZy1U-frjl`qTn2f3mh#Ry2^^X7V~A{^$5S4VV5h-HRfEmWrwm@L%9exVe)$ zT$xOSgoIpNZh%UIkCzva^=}CqTuw8~%F1$cb7N!2PuF`;gaFqn6;DsL3>ZSdDQvhR zB6P^6aIWs|np#*q08W_1&xLmhK>I)^0MIP{hm(%l+S(_T!0GTjtCDK0to^FLnXPOw zLe&b{s1&lCK%|+NSfXB2SY^L5^zBb@N`2#bXxh(3m&@9YO*=pb(9zO@4j8;?(6rK_ zCTpzr_4P#&%KFsIc{wvRb#>Z92#~b7nHhkJIygHc)pILMY$IOXg?_z^uAhr8)oDFi zThli*tOl68U4M>L{KLZofZYKcd3`V|EPLRti1z5jpWfi(Og4-=FFt6z~EE zB|19#F0PQedpH$yaZ$kDb`}jc`HT8o{!S3o>upr;hoY6I7PE?D3`|T?za@`z8Sd1y z=;+n8wKISwqdLO5oVx!NI%Mj!AH{ z6uDb8ONO^c=94XvXwb45)fbkui;;bIq|VJ(Bt zLmbP4DO^>Bh13E9%gf8&AU=2&{MZ>I7a*f_0wPQl6qKBt9B?y$-x|U)`=X-P%@5O2 zbMHKtpTfE`k_D@zBdhY*tu-CD3>Y$xq;UBnn^{>IGbe(50SPUj<$@z4#bDUj*+U-d zvvVo$4uJ#{5CH=2SAaV?+#HApwBHB(o*dQ>c2E_oup>lQH8c96t@w8EzvduayANjX z@$vL~c}dyXPdECC=jK#I#VFjRji)n&>)yO>sjPjv=s-f^bCECI3A#I6&6r!J*gEC( z7_IAlRQ2-WzqQua&kPNP7eoe(GAjY_RPptN@AM`9<79*xYTK*b7Dfthv>$GpDVg! z6%8F7r~>%Yz3;CqSGn$I&_r7ohlUOTx#V*afzLxuRTniD)r;L3aNQ5qRgt-j*zgvM z|HCFWCOxk{W2fO%VNqV7^J;rm-SU!&>22Tr@$+`OzZh>?!jJ}6MY7wPkDX*`2v>*5 zQEOwPHs00Q*%?3_0R_1cE9aJK^9YpOy{>?9XEC3m1p-@u&9^??g{IWIUGA}&Pl1mX z6cwqewsMO3AiG^1B(6Bx+ExGwcVZR-z66^P%;>H|n+0bCJYj+;4Ou}-%evF~v6rGF zJJ)J^5bP*r;Cb2b}#$MGUPKI#0(iCB(yS z=Q5Ck{U^Hsu7!%=`+rWVb6{VIk%@}R^x@{zpgT+r@H8hWo)#gQ%cVIvammRv3EzJ& zQBb)^ypv$`{pu292hW{K??UI4wg2``vX1xl%RM=!E*h{GI*t?P)qq&eF=5 z3adp}>tlxQ@c9PY^}bL{dku}*kO+rzpsYM@=GZE0<>&MEO3lasLZsHffTM^|sr|jZ z&kkS9axDvuS!ADQU4!vQ`}lB#f@JeF)YO2C4g@&Q`zyx>%g4J*AclezbZ~TB<@DN{ zC;(z*5ZGF-m)t>EgUJATyBB5vh^4@ufL6vQhU!QBm5Yjs3eXI0>;qMcR+CfT?@E1h zKjg})s+SRhK~O)6WQ_thLlKIho-D!x;xMnSlLI_ouV|FUE_(gCtVUUZ0B@ibK{rGI z;uPQ_;B!)CIdp^V?LLw@KjY$}pTRoRHISS%qiXw)F0|r|)3{ks#pIs4B~*k}#0y(y z<}Mo(i;9ZO0aXsjBp{2vzdpwFDvFf(d@+xYhX>3ClF;L9BRIP^hc#O@fFi7Co!Bo; zzM`uLqJVe^!m7{Iq_Yh~6rYQ;9$a zVu7;OhYp;ISJ$wCI7)eGR^~0KC%#4 z*#Az0lHV#O08M&wG9bh8xa>qus4mXR_SV+c0ErDqKu}tMm!F>>twyc%78|+-DUiun zErKr61F%k&m6bpkaCdu4r&j6r5Huqhy(yi@EGjGn|a{yRH6YE{O{ zN=h4>n?Pd$s;S;0Y3TxNQJ|z}7;>V(Zqz|a= zannu^fK~)11BgrN>gq-kn0y~dByhDDKwA^-KeUyd!#Ce>z6QL$XV}U&e8^2OZFGq~ zIW|9JY^L|&sEH;mEq#8zr&t41E^nHKo5XZ@kmmQLnp#=#h8NxcNaul5rBNw%0ZJf$ zlMdU3*;!YhU<4vVa&m4S9$*;mE-oL)$Y8hB8tig@{=|swLz6~X%mB1&PiN;BH8pH3 zEHDmHR-=4{@6b6FLieN3Y4}n4h{??;UTc{ zE(q)BbOq25!4g!ee;&m{VdAEyre#%93-CdnQkp5SEX*}1CFlJdKq_K6TbYxY38o@Y zeHqLcmGlRTo)mO*Z0J8b6~*NW+9tq|uF(k?$97d>Xu-Y0w^!k)}OhQZ^L zu<*E%TAUYX0sssG$n8}Moay=ErtS}7ioyf~y=v!|$||zf*q22NW`q(riaKOoUNm|q zF9TVoSO_YzvPLQ@u5R4TzkYq<9D#weQ;0*Ue~YA+GfG)y0$rlUVmd+j=7p^VNZ?bJ ziP_u_XQakH%aj8zQ@TUh`OkeWQ@gE$W7nkcaLSj2ABBI}!>2Rvq_Vf&r9~S%tzR;Q z?5Ua=0z~3liW9E1X|Pr^saE{iyKYzRMM@%yL92-E#3VF0R?tximyoD0gwtoPBbwBdUBGk_1WwA=Cp}Z7BJpUoBgm;Q=jbaua2CS zcGdiy^q}-~uB`FQ8+OfB&9G?<^fTOGlswCtH_E0$CfHNNX2QmuUFT=Kd|t`CDcwY% z0cZmeQe0fvg@c=l%51Yc*}sDr3}*<0gt%n8M}J30Qxg&{2N!4+LWAt zfVo{W2pxDKlw*ApqNQ=@=_z^nQ%8t}^*I4Dv9 zFe&*%#(GMImyKze2CqV1fz|g5MZHik^K;xogBL!&{{|Q=E{ai67iMP8k%}FqaL1LD zm0hj|TGMLb7=PtdO6A)pte~f3KwQ+{=3g`nY7z2xs5?LNGIz17l$igq)!IIGiH}Ow z+WKQUTwr7;U)sFr_u|rG_j!U9&RtGQX~8R_m$4Yhz>yv)Nt~*xfxdfnz{b(hUikW? z^nUI;JVduyu(UYf^m;e~FpVa?cQ?Xw91R6GSK_-aOrytZS4*d!Y6AjEFFbs++a6qk zuE}v$DlaK9*Fnadd@9jMyb6~^m)*&!{_5K8MEnPWg$1!5{=vUY?Z{BSar#~kxZw2m zCYEBPuk9n49PBrAf-ShYSZEupwwZwoM>vo7#6=tg{KW_e4q+j1?%Vh})XK9+ z-#sU85{aL02a3g09)hH9`7y8MF zG7zgbu=wdxwWXxwG=?k#9s|fkD{xTkz>caq4q~3~0RfHgE=lG30*li)ZFR)N42~8mK7ZB& zEiRbZTCj= z&|+*qUV~zYV|H>wdK;^x_3;B*HbE8(Ous&0a*U0d~$N~d__IokQImjS1dktV6ktETw6XJj+x9RrSs9*wo~rQIgDE6{BFZ4p$|~}|zZuER9GBrl z0`_;RWk{TE|KV{=yU&zXcm8)qnGtVwC_aKJh(nAd4o+9R9yfAnZQJYg^cWkuzx4F1 zDn0oVPlQ!G|9i0jH8Xqu$pX9S`~8vNG;y;5$-Q^Y1$|uai9Oa4tP8|nEgC&zq)Qhexz>ww8QJbLAs)u*&Jf9QOqT>N$TgacoWA)R(g!n z^fZuASo&?=3?}6(^+EB_5eO%28^GJ@D?+EBz1{wFArjfY>@@TL&ae3Tre0nc+7y=* z>f>?$xY|y~R-!h#I`}nNM4_&JbD>SLiqv$*(b4!lA4S61%UuL$9GB(+rbA?wRM2?Bzj zp3g3~L$%4t1Km&abI#Erjws6S8^re5-kGX=ce`U})Fj8U1FMGU)cs${lXPBE%3jky zNOYuxm3JUR$faKaZv_vd8b3~OR5DfjqWnf~gu|K1#o*bJZsd6L8hJ?cAb_`4IV!CH zdVw4c?PU=94-G3v)zLBoaSuKNW&Y^jU$-|ikZ-yC{TssZ_p?j+qj-f+qLk(22GD89 zrPGhfa?A$lF_m%BEA5Ec?1!3wWwz&5cwv)FCkYrwHl zv1dO!Bx>P>lwn@L59lCS#SK;=8i<&e>BpVG+}wz;Fa?l5xSO@5Km|9SG{^!1{e27} z3=M5DpA8Wi)ox=|Z6o-i0KJ#*1pso&t4vXA5mEowl~ZjoO5w zp^`Xf%(L{zy)@A=s%20NuE!P9pFCGy#Z%55y=Or~OvXKdx9=?i#mmz({PjYHq}bkH zRqgFzFpm)Ne80P$y(Sy^YH9TRbl(gl?zOdu&etYb0Z68QvYJS_sVvd=knS(3H5iRZ#*eU z1t0&NxA%QHV;!i(t*voGCPvYoZb(IdlNTFfmhz-TdErYCtF>WIM9U->^~ zZVR&=TjSM~#%XiL+T2;)J9Bbaa}@0m|F{lBfV>eIDNPYAPZKX!Lw;?ojH+tKh@5(w z?b*i5R9kj-HsuHPT?IwO=i}!m>!7Pdz$1JS;&7T`J|AVj9%Hhb@*^(!w&zo^_6kC{ zcWJ3}Y3TzqGcvJ~S|4CSV&#mNYxZM;gG*am`M8eiBO_%9k42O}FIxWI%1a%RY`gyilP>1;%p;nmdn3KyDOnvAmUT}ZFvO&N7T#W!pqB0 zcDK~L=6)@CbCbrqva7qfwUt(ia+c}-TYzlsrdQue-8xw6A)Uxxy86Va05fg%vnA7?d zggl0snUa_opU=v*?b9*m+yLx)SoZ#Az;LxK4+zO*G6D|B2JP{&C{KASNjC9f`CpB@} zKS6I_%!CXDGCC#2!pbTwCWa(MgE4V1KR=&i$;AN3&H=^`hR=AM4rXf1RdscVxP$?H z2&Mo4POKMqNc+1!56(honW6MiyZf=4pDKH5I z;Aa5xR#dp2-dvK3MS!uzuI}!b=ehZLplk*x0GwUuw{PD7aw%wK3%YA2gKnT?zS@-9 zEe^DPT%p}BgkW6wqgw$15%(h{@6hZ%XlIM1$=H^PR>vYm!ivXB>&x4(2@Ii zQ%EO7B_&bsm^lF$`Q*grwiDqG%s*~%8HFiALPCNp1imi8r=s=?tqK_50rKOMK`=}D zGKudEW=fhG8^Lf1ijW064+RCqhYunV6>k_HUcL)No=+~FACOE4@bJPg{{H>|u=x=m zPwLlOg)$bnnki2SE(`VvlL6qZ`E<8&lT($m8OAP!(wm4MfU5lFb-PQ3c2_YTDOZy|jn zBi5Fdsmw+pQ_JLXX`0|00TdK`kkuO$Cs=8KM#ciIW_n_wM@Y82m*;L$P4u - - - - + + + + diff --git a/class_a_c_m__inherit__graph.md5 b/class_a_c_m__inherit__graph.md5 index 22e96bd7..69d55cdc 100644 --- a/class_a_c_m__inherit__graph.md5 +++ b/class_a_c_m__inherit__graph.md5 @@ -1 +1 @@ -4f719ae038c56dadd97ac48e9a7acff9 \ No newline at end of file +1778af41b23c3b83c73bd88577cd17cc \ No newline at end of file diff --git a/class_a_c_m__inherit__graph.png b/class_a_c_m__inherit__graph.png index c8f5814427013ef99c5e4466785d4849357e2875..2e0b1c04a555fc9e2f4b50d287ee278fcde9c05d 100644 GIT binary patch literal 9117 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 Oguo;fpk?BQpZ^z_RfwMe diff --git a/class_a_d_k-members.html b/class_a_d_k-members.html index 007b8023..13ffc9ca 100644 --- a/class_a_d_k-members.html +++ b/class_a_d_k-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -1276,7 +1288,7 @@ Protected Attributes

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -118,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_a_d_k.html b/class_a_d_k.html index 04618d79..a58cdaa5 100644 --- a/class_a_d_k.html +++ b/class_a_d_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ADK Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,14 +101,21 @@ Inheritance diagram for ADK:
    Inheritance graph
    - + + +
    [legend]
    Collaboration diagram for ADK:
    Collaboration graph
    - + + + + + +
    [legend]
    diff --git a/class_a_d_k__coll__graph.map b/class_a_d_k__coll__graph.map index 7398a53c..72616cf5 100644 --- a/class_a_d_k__coll__graph.map +++ b/class_a_d_k__coll__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_a_d_k__coll__graph.md5 b/class_a_d_k__coll__graph.md5 index 2341756e..6e64816d 100644 --- a/class_a_d_k__coll__graph.md5 +++ b/class_a_d_k__coll__graph.md5 @@ -1 +1 @@ -37dc8161587ef9d91ca02f00e06d8d3e \ No newline at end of file +677a6776b852e96bee247fd946d74be2 \ No newline at end of file diff --git a/class_a_d_k__coll__graph.png b/class_a_d_k__coll__graph.png index 8da06f0b4717747eefe7756d5307fd0543ea98a4..4176edac5e4fc327c9ee25b6aa0f583de2656a87 100644 GIT binary patch literal 11849 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 literal 11759 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

    qw&q*Ty}xu%^!_AX+gMxE($Ref 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 diff --git a/class_a_d_k__inherit__graph.map b/class_a_d_k__inherit__graph.map index 07fe2620..a1e35774 100644 --- a/class_a_d_k__inherit__graph.map +++ b/class_a_d_k__inherit__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/class_a_d_k__inherit__graph.md5 b/class_a_d_k__inherit__graph.md5 index 007981fa..55e30802 100644 --- a/class_a_d_k__inherit__graph.md5 +++ b/class_a_d_k__inherit__graph.md5 @@ -1 +1 @@ -bf61a3a2026b57525489bd4fa1b38220 \ No newline at end of file +bca330dbfb30c1761bf024a703ee6a77 \ No newline at end of file diff --git a/class_a_d_k__inherit__graph.png b/class_a_d_k__inherit__graph.png index 821a8092c69825a081b276b9096a77a303f6607d..f9cb31fef864cffccfccb60d772f325eb14be4e6 100644 GIT binary patch literal 5307 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 YB@B*{PQq(|X(Y*m`v%YwO}o(l0vWPgMF0Q* literal 5876 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 diff --git a/class_address_pool-members.html b/class_address_pool-members.html index 80003e58..63250730 100644 --- a/class_address_pool-members.html +++ b/class_address_pool-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -788,7 +796,7 @@ Static Protected Attributes

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_address_pool.html b/class_address_pool.html index d8988b53..11090209 100644 --- a/class_address_pool.html +++ b/class_address_pool.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: AddressPool Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,9 @@ Inheritance diagram for AddressPool:
    Inheritance graph
    - + + +
    [legend]
    diff --git a/class_address_pool__inherit__graph.map b/class_address_pool__inherit__graph.map index 86eae39c..bb73e640 100644 --- a/class_address_pool__inherit__graph.map +++ b/class_address_pool__inherit__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/class_address_pool__inherit__graph.md5 b/class_address_pool__inherit__graph.md5 index 208556c0..67a01c56 100644 --- a/class_address_pool__inherit__graph.md5 +++ b/class_address_pool__inherit__graph.md5 @@ -1 +1 @@ -120a062cef01918a52a6cdb4ddb3eba1 \ No newline at end of file +1e8b44e83a78a2dc42bcafc432f2a436 \ No newline at end of file diff --git a/class_address_pool__inherit__graph.png b/class_address_pool__inherit__graph.png index d02e10b166ef25c9da1188fd3445b1f658b0ecfc..7d887516de3c5850f8895a563cd555f20709cd63 100644 GIT binary patch literal 8020 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 AT>t<8 diff --git a/class_address_pool_impl-members.html b/class_address_pool_impl-members.html index 69587925..367af086 100644 --- a/class_address_pool_impl-members.html +++ b/class_address_pool_impl-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -215,7 +218,7 @@ Public Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_address_pool_impl.html b/class_address_pool_impl.html index 456fe119..5448bcd2 100644 --- a/class_address_pool_impl.html +++ b/class_address_pool_impl.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: AddressPoolImpl< MAX_DEVICES_ALLOWED > Class Template Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,16 @@ Inheritance diagram for AddressPoolImpl< MAX_DEVICES_ALLOWED >:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for AddressPoolImpl< MAX_DEVICES_ALLOWED >:
    Collaboration graph
    - + +
    [legend]
    - + @@ -121,7 +124,7 @@ Public Member Functions

    @@ -113,7 +116,7 @@ Public Member Functions

     
    virtual UsbDeviceGetUsbDevicePtr (uint8_t addr)
     
    void ForEachUsbDevice (UsbDeviceHandleFunc pfunc)
    void ForEachUsbDevice (UsbDeviceHandleFunc pfunc)
     
    virtual uint8_t AllocAddress (uint8_t parent, bool is_hub=false, uint8_t port=0)
     
     

    Detailed Description

    -

    template<const uint8_t MAX_DEVICES_ALLOWED>
    +

    template<const uint8_t MAX_DEVICES_ALLOWED>
    class AddressPoolImpl< MAX_DEVICES_ALLOWED >

    @@ -197,7 +200,7 @@ template<const uint8_t MAX_DEVICES_ALLOWED>
    void AddressPoolImpl< MAX_DEVICES_ALLOWED >::ForEachUsbDevice ( - UsbDeviceHandleFunc  + UsbDeviceHandleFunc  pfunc) @@ -297,7 +300,7 @@ template<const uint8_t MAX_DEVICES_ALLOWED>

    diff --git a/class_address_pool_impl__coll__graph.map b/class_address_pool_impl__coll__graph.map index 5bddb0ec..528ab859 100644 --- a/class_address_pool_impl__coll__graph.map +++ b/class_address_pool_impl__coll__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_address_pool_impl__coll__graph.md5 b/class_address_pool_impl__coll__graph.md5 index 3317b219..77f1e07a 100644 --- a/class_address_pool_impl__coll__graph.md5 +++ b/class_address_pool_impl__coll__graph.md5 @@ -1 +1 @@ -4928b921ed421db937e32278788f372b \ No newline at end of file +77bc5e9fa2748d39429df403e8aba060 \ No newline at end of file diff --git a/class_address_pool_impl__coll__graph.png b/class_address_pool_impl__coll__graph.png index 6aca18c894165c2742f889f997ad4a2c9960af53..7f744d8b77bc60c33448e0c0fe52f1acab1ad704 100644 GIT binary patch literal 5355 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 literal 5570 zcmch5gqMP-Oty?W(JjqlE{xPO!@ zX`lCn#68}a6vjT!K4ri~JZ@bVQNDLC=#vc6cz~ix{olt4;yDr3ah-1? zioO41aL^4qE)c>fEiGM1KS-5B7SqoEuB_~AtNkVcKEA)dKZBT$xr@vDDW81xH)n0M zE(ns;E$+8l`0Uv;S*8?T>j#5Bi?g${Sgg2hADvtQFE_XA^1!VpPmVj| z*|<#Vc451#vOj*F|8609{rYuYULJ1>Co8K>TNE`NF&itZJZt=g#>MU=dU|>yBBIjL zQa(PuL3Whfjbs&8q+`(?@!4M=drm~#)6>Jr$tiKTK=w|%NR3YY)p*;?-wV@Wc}c1# zRp7ROKq5;g=4AfnpEOKGkIXG6a z*wbHWE)swK4TWVD6&2wUP^^zv6<1e#H$T0~&d$yhyZmQso|6JblC)S9Ns*1o+M%H# z=GgnIYip+`ClqMoFlobvz^_S3dNMLHIyyhU`0l`3W!Q6kX~BiQ2SHfGZ&D&Ftmz}&JEI~o)l)%@Budqi|mgdKk9Q1 zkBpp;G@SjMno_+ctFGSP*ofraKl7TBF*BQKX_=pGdBLK%e{jH;(vzA>qrG#uv*hID z#NN7Po#4i|Yh`WSx#$j�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 ZFN~HjA-(L2f4j7ZqMVv+nY4Mxe*wD3-BJJm diff --git a/class_address_pool_impl__inherit__graph.map b/class_address_pool_impl__inherit__graph.map index 5bddb0ec..528ab859 100644 --- a/class_address_pool_impl__inherit__graph.map +++ b/class_address_pool_impl__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_address_pool_impl__inherit__graph.md5 b/class_address_pool_impl__inherit__graph.md5 index 3317b219..77f1e07a 100644 --- a/class_address_pool_impl__inherit__graph.md5 +++ b/class_address_pool_impl__inherit__graph.md5 @@ -1 +1 @@ -4928b921ed421db937e32278788f372b \ No newline at end of file +77bc5e9fa2748d39429df403e8aba060 \ No newline at end of file diff --git a/class_address_pool_impl__inherit__graph.png b/class_address_pool_impl__inherit__graph.png index 6aca18c894165c2742f889f997ad4a2c9960af53..7f744d8b77bc60c33448e0c0fe52f1acab1ad704 100644 GIT binary patch literal 5355 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 literal 5570 zcmch5gqMP-Oty?W(JjqlE{xPO!@ zX`lCn#68}a6vjT!K4ri~JZ@bVQNDLC=#vc6cz~ix{olt4;yDr3ah-1? zioO41aL^4qE)c>fEiGM1KS-5B7SqoEuB_~AtNkVcKEA)dKZBT$xr@vDDW81xH)n0M zE(ns;E$+8l`0Uv;S*8?T>j#5Bi?g${Sgg2hADvtQFE_XA^1!VpPmVj| z*|<#Vc451#vOj*F|8609{rYuYULJ1>Co8K>TNE`NF&itZJZt=g#>MU=dU|>yBBIjL zQa(PuL3Whfjbs&8q+`(?@!4M=drm~#)6>Jr$tiKTK=w|%NR3YY)p*;?-wV@Wc}c1# zRp7ROKq5;g=4AfnpEOKGkIXG6a z*wbHWE)swK4TWVD6&2wUP^^zv6<1e#H$T0~&d$yhyZmQso|6JblC)S9Ns*1o+M%H# z=GgnIYip+`ClqMoFlobvz^_S3dNMLHIyyhU`0l`3W!Q6kX~BiQ2SHfGZ&D&Ftmz}&JEI~o)l)%@Budqi|mgdKk9Q1 zkBpp;G@SjMno_+ctFGSP*ofraKl7TBF*BQKX_=pGdBLK%e{jH;(vzA>qrG#uv*hID z#NN7Po#4i|Yh`WSx#$j�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 ZFN~HjA-(L2f4j7ZqMVv+nY4Mxe*wD3-BJJm diff --git a/class_b_t_d-members.html b/class_b_t_d-members.html index 4604ec7f..a3adfa40 100644 --- a/class_b_t_d-members.html +++ b/class_b_t_d-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -169,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_b_t_d.html b/class_b_t_d.html index bbac697d..5f619ea1 100644 --- a/class_b_t_d.html +++ b/class_b_t_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -101,14 +102,21 @@ Inheritance diagram for BTD:
    Inheritance graph
    - + + +
    [legend]
    Collaboration diagram for BTD:
    Collaboration graph
    - + + + + + +
    [legend]

    @@ -297,8 +305,7 @@ Static Protected Attributes

    -

    Constructor for the BTD class.

    -
    Parameters
    +

    Constructor for the BTD class.

    Parameters
    pPointer to USB class instance.
    @@ -347,8 +354,7 @@ Static Protected Attributes
    -

    Address assignment and basic initialization is done here.

    -
    Parameters
    +

    Address assignment and basic initialization is done here.

    Parameters
    @@ -401,8 +407,7 @@ Static Protected Attributes
    parentHub number.
    portPort number on the hub.
    -

    Initialize the Bluetooth dongle.

    -
    Parameters
    +

    Initialize the Bluetooth dongle.

    Parameters
    @@ -438,8 +443,7 @@ Static Protected Attributes
    parentHub number.
    portPort number on the hub.
    -

    Release the USB device.

    -
    Returns
    0 on success.
    +

    Release the USB device.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -467,8 +471,7 @@ Static Protected Attributes
    -

    Poll the USB Input endpoints and run the state machines.

    -
    Returns
    0 on success.
    +

    Poll the USB Input endpoints and run the state machines.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -496,8 +499,7 @@ Static Protected Attributes
    -

    Get the device address.

    -
    Returns
    The device address.
    +

    Get the device address.

    Returns
    The device address.

    Reimplemented from USBDeviceConfig.

    @@ -525,8 +527,7 @@ Static Protected Attributes
    -

    Used to check if the dongle has been initialized.

    -
    Returns
    True if it's ready.
    +

    Used to check if the dongle has been initialized.

    Returns
    True if it's ready.

    Definition at line 249 of file BTD.h.

    @@ -553,8 +554,7 @@ Static Protected Attributes
    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    klassThe device's USB class.
    @@ -599,8 +599,7 @@ Static Protected Attributes
    -

    Used by the USB core to check what this driver support. Used to set the Bluetooth address into the PS3 controllers.

    -
    Parameters
    +

    Used by the USB core to check what this driver support. Used to set the Bluetooth address into the PS3 controllers.

    Parameters
    @@ -664,8 +663,7 @@ Static Protected Attributes
    vidThe device's VID.
    pidThe device's PID.
    -

    UsbConfigXtracter implementation, used to extract endpoint information.

    -
    Parameters
    +

    UsbConfigXtracter implementation, used to extract endpoint information.

    Parameters
    @@ -721,8 +719,7 @@ Static Protected Attributes
    confConfiguration value.
    ifaceInterface number.
    -

    Register Bluetooth dongle members/services.

    -
    Parameters
    +

    Register Bluetooth dongle members/services.

    Parameters
    pServicePointer to BluetoothService class instance.
    @@ -757,8 +754,7 @@ Static Protected Attributes
    -

    Used to send a HCI Command.

    -
    Parameters
    +

    Used to send a HCI Command.

    Parameters
    @@ -837,8 +833,7 @@ Static Protected Attributes
    dataData to send.
    nbytesNumber of bytes to send.
    -

    Set the local name of the Bluetooth dongle.

    -
    Parameters
    +

    Set the local name of the Bluetooth dongle.

    Parameters
    nameDesired name.
    @@ -934,8 +929,7 @@ Static Protected Attributes
    -

    Disconnect the HCI connection.

    -
    Parameters
    +

    Disconnect the HCI connection.

    Parameters
    handleThe HCI Handle for the connection.
    @@ -1085,8 +1079,7 @@ Static Protected Attributes
    -

    Connect to device.

    -
    Parameters
    +

    Connect to device.

    Parameters
    bdaddrBluetooth address of the device.
    @@ -1156,8 +1149,7 @@ Static Protected Attributes
    -

    Used to send L2CAP Commands.

    -
    Parameters
    +

    Used to send L2CAP Commands.

    Parameters
    @@ -1206,8 +1198,7 @@ Static Protected Attributes
    handleHCI Handle.
    dataData to send.
    -

    L2CAP Connection Request.

    -
    Parameters
    +

    L2CAP Connection Request.

    Parameters
    @@ -1262,8 +1253,7 @@ Static Protected Attributes
    handleHCI handle.
    rxidIdentifier.
    -

    L2CAP Connection Response.

    -
    Parameters
    +

    L2CAP Connection Response.

    Parameters
    @@ -1307,8 +1297,7 @@ Static Protected Attributes
    handleHCI handle.
    rxidIdentifier.
    -

    L2CAP Config Request.

    -
    Parameters
    +

    L2CAP Config Request.

    Parameters
    @@ -1350,8 +1339,7 @@ Static Protected Attributes
    handleHCI Handle.
    rxidIdentifier.
    -

    L2CAP Config Response.

    -
    Parameters
    +

    L2CAP Config Response.

    Parameters
    @@ -1399,8 +1387,7 @@ Static Protected Attributes
    handleHCI Handle.
    rxidIdentifier.
    -

    L2CAP Disconnection Request.

    -
    Parameters
    +

    L2CAP Disconnection Request.

    Parameters
    @@ -1449,8 +1436,7 @@ Static Protected Attributes
    handleHCI Handle.
    rxidIdentifier.
    -

    L2CAP Disconnection Response.

    -
    Parameters
    +

    L2CAP Disconnection Response.

    Parameters
    @@ -1499,8 +1485,7 @@ Static Protected Attributes
    handleHCI Handle.
    rxidIdentifier.
    -

    L2CAP Information Response.

    -
    Parameters
    +

    L2CAP Information Response.

    Parameters
    @@ -1585,8 +1570,7 @@ Static Protected Attributes
    handleHCI Handle.
    rxidIdentifier.
    -

    Read the poll interval taken from the endpoint descriptors.

    -
    Returns
    The poll interval in ms.
    +

    Read the poll interval taken from the endpoint descriptors.

    Returns
    The poll interval in ms.

    Definition at line 499 of file BTD.h.

    @@ -1613,8 +1597,7 @@ Static Protected Attributes
    -

    Used to print the USB Endpoint Descriptor.

    -
    Parameters
    +

    Used to print the USB Endpoint Descriptor.

    Parameters
    ep_ptrPointer to USB Endpoint Descriptor.
    @@ -2150,7 +2133,7 @@ Static Protected Attributes diff --git a/class_b_t_d__coll__graph.map b/class_b_t_d__coll__graph.map index 60d2263a..faf78d2f 100644 --- a/class_b_t_d__coll__graph.map +++ b/class_b_t_d__coll__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_b_t_d__coll__graph.md5 b/class_b_t_d__coll__graph.md5 index 3b9a2e08..7288133e 100644 --- a/class_b_t_d__coll__graph.md5 +++ b/class_b_t_d__coll__graph.md5 @@ -1 +1 @@ -ca95807276f7b79a9da3fd2fb6368499 \ No newline at end of file +e72568841cb2f05e3bfabb29e1ce8457 \ No newline at end of file diff --git a/class_b_t_d__coll__graph.png b/class_b_t_d__coll__graph.png index 4069a2f658ef52bd3b9fbb53c1bdf489fb3c57b9..b553c6ff43b374f7628ef6a85528e3783c3bdbe3 100644 GIT binary patch literal 11611 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 literal 11649 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 a1HOE - - + + diff --git a/class_b_t_d__inherit__graph.md5 b/class_b_t_d__inherit__graph.md5 index 5d318cb2..95bb3a3b 100644 --- a/class_b_t_d__inherit__graph.md5 +++ b/class_b_t_d__inherit__graph.md5 @@ -1 +1 @@ -d46813718d41f5c0027726790fddd324 \ No newline at end of file +36ee382408a95d482da81524513435df \ No newline at end of file diff --git a/class_b_t_d__inherit__graph.png b/class_b_t_d__inherit__graph.png index 7fc39e5976d5df75c16f83c8bb00981c6bdc1932..0ac39bf349fc16356cdedf36873c5b564c08df61 100644 GIT binary patch literal 5101 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -108,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); pair(void)BTHIDinline ParseBTHIDData(uint8_t len, uint8_t *buf)BTHIDinlineprotectedvirtual pBtdBluetoothServiceprotected - pFuncOnInitBluetoothServiceprotected + pFuncOnInitBluetoothServiceprotected Reset()BTHIDprotectedvirtual ResetBTHID()BTHIDinlineprotectedvirtual Run()BTHIDprotectedvirtual @@ -121,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_b_t_h_i_d.html b/class_b_t_h_i_d.html index 03a706e3..df129a2a 100644 --- a/class_b_t_h_i_d.html +++ b/class_b_t_h_i_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTHID Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,14 +100,23 @@ Inheritance diagram for BTHID:
    Inheritance graph
    - + + +
    [legend]
    Collaboration diagram for BTHID:
    Collaboration graph
    - + + + + + + + +
    [legend]
    - - + + @@ -215,8 +225,7 @@ BluetoothService implementation

    @@ -157,8 +167,8 @@ Protected Attributes

    uint8_t interrupt_scid [2]
     
    - Protected Attributes inherited from BluetoothService
    void(* pFuncOnInit )(void)
     
    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
    -

    Constructor for the BTHID class.

    -
    Parameters
    +

    Constructor for the BTHID class.

    Parameters
    @@ -279,8 +288,7 @@ BluetoothService implementation
    pPointer to the BTD class instance.
    pairSet this to true in order to pair with the device. If the argument is omitted then it will not pair with it. One can use PAIR to set it to true.
    -

    Get HIDReportParser.

    -
    Parameters
    +

    Get HIDReportParser.

    Parameters
    idID of parser.
    @@ -323,8 +331,7 @@ BluetoothService implementation
    -

    Set HIDReportParser to be used.

    -
    Parameters
    +

    Set HIDReportParser to be used.

    Parameters
    @@ -358,8 +365,7 @@ BluetoothService implementation
    idId of parser.
    prsPointer to HIDReportParser.
    -

    Set HID protocol mode.

    -
    Parameters
    +

    Set HID protocol mode.

    Parameters
    modeHID protocol to use. Either USB_HID_BOOT_PROTOCOL or HID_RPT_PROTOCOL.
    @@ -391,8 +397,7 @@ BluetoothService implementation
    -

    Used to set the leds on a keyboard.

    -
    Parameters
    +

    Used to set the leds on a keyboard.

    Parameters
    dataSee KBDLEDS in hidboot.h
    @@ -416,8 +421,7 @@ BluetoothService implementation
    -

    Used to set the leds on a keyboard.

    -
    Parameters
    +

    Used to set the leds on a keyboard.

    Parameters
    dataSee KBDLEDS in hidboot.h
    @@ -476,8 +480,7 @@ BluetoothService implementation
    -

    Used to pass acldata to the services.

    -
    Parameters
    +

    Used to pass acldata to the services.

    Parameters
    ACLDataIncoming acldata.
    @@ -605,8 +608,7 @@ BluetoothService implementation
    -

    Used to parse Bluetooth HID data to any class that inherits this class.

    -
    Parameters
    +

    Used to parse Bluetooth HID data to any class that inherits this class.

    Parameters
    @@ -747,7 +749,7 @@ BluetoothService implementation diff --git a/class_b_t_h_i_d__coll__graph.map b/class_b_t_h_i_d__coll__graph.map index 0a45d54d..3de13548 100644 --- a/class_b_t_h_i_d__coll__graph.map +++ b/class_b_t_h_i_d__coll__graph.map @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + diff --git a/class_b_t_h_i_d__coll__graph.md5 b/class_b_t_h_i_d__coll__graph.md5 index 4dcb5f50..b8a6fc7c 100644 --- a/class_b_t_h_i_d__coll__graph.md5 +++ b/class_b_t_h_i_d__coll__graph.md5 @@ -1 +1 @@ -86d2046e0c112d0f6d219802a3ed4879 \ No newline at end of file +328440863f58d32544996d4a0a7788ae \ No newline at end of file diff --git a/class_b_t_h_i_d__coll__graph.png b/class_b_t_h_i_d__coll__graph.png index 7e44047ab7518e435fcdba729823a4954c3f2a5b..8cbed0cabd0d51c204caaf183a79cc529b0d51e2 100644 GIT binary patch literal 15553 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 literal 15645 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 byAT`5Cp1yE^T`GC&S-BX - - + + diff --git a/class_b_t_h_i_d__inherit__graph.md5 b/class_b_t_h_i_d__inherit__graph.md5 index a07e90bb..d99946b7 100644 --- a/class_b_t_h_i_d__inherit__graph.md5 +++ b/class_b_t_h_i_d__inherit__graph.md5 @@ -1 +1 @@ -84cb6c869d9ec98ca739f6ef702e34ea \ No newline at end of file +0461eab4196d51bce1337c7c83a0da9f \ No newline at end of file diff --git a/class_b_t_h_i_d__inherit__graph.png b/class_b_t_h_i_d__inherit__graph.png index c87c373543e83a724a51bc50a73921434fc0360e..d19b98d9644e047c31558d690b68a02e6b49614b 100644 GIT binary patch literal 3749 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 XRX^bFI>Q0XoggDUbJ$m%`_KOi+{#SU literal 4218 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@
    lenThe length of the incoming data.
    bufPointer to the data buffer.
    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); l2cap_event_flagBluetoothServiceprotected onInit()=0BluetoothServiceprotectedpure virtual pBtdBluetoothServiceprotected - pFuncOnInitBluetoothServiceprotected + pFuncOnInitBluetoothServiceprotected Reset()=0BluetoothServicepure virtual Run()=0BluetoothServicepure virtual
    @@ -108,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_bluetooth_service.html b/class_bluetooth_service.html index fa31e275..996a48df 100644 --- a/class_bluetooth_service.html +++ b/class_bluetooth_service.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BluetoothService Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,14 +100,25 @@ Inheritance diagram for BluetoothService:
    Inheritance graph
    - + + + + + +
    [legend]
    Collaboration diagram for BluetoothService:
    Collaboration graph
    - + + + + + + +
    [legend]

    @@ -133,8 +145,8 @@ Protected Member Functions

    - - + + @@ -197,8 +209,7 @@ Protected Attributes

    Protected Attributes

    void(* pFuncOnInit )(void)
     
    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
    -

    Used to pass acldata to the Bluetooth service.

    -
    Parameters
    +

    Used to pass acldata to the Bluetooth service.

    Parameters
    ACLDataPointer to the incoming acldata.
    @@ -308,8 +319,7 @@ Protected Attributes
    -

    Used to call your own function when the device is successfully initialized.

    -
    Parameters
    +

    Used to call your own function when the device is successfully initialized.

    Parameters
    funcOnInitFunction to call.
    @@ -384,7 +394,7 @@ Protected Attributes

    Member Data Documentation

    - +
    @@ -392,7 +402,7 @@ Protected Attributes @@ -507,7 +517,7 @@ Protected Attributes diff --git a/class_bluetooth_service__coll__graph.map b/class_bluetooth_service__coll__graph.map index 908c55cf..6e6676cd 100644 --- a/class_bluetooth_service__coll__graph.map +++ b/class_bluetooth_service__coll__graph.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/class_bluetooth_service__coll__graph.md5 b/class_bluetooth_service__coll__graph.md5 index 60af834e..c59d7e12 100644 --- a/class_bluetooth_service__coll__graph.md5 +++ b/class_bluetooth_service__coll__graph.md5 @@ -1 +1 @@ -db6062ca3a6fb9a2411ed35cc10cfe0c \ No newline at end of file +63004da77f15c2792f7eb5740b2b02f1 \ No newline at end of file diff --git a/class_bluetooth_service__coll__graph.png b/class_bluetooth_service__coll__graph.png index 03c7f0cee60f0bc322633d6f129bb16fc305332c..b1863f95e6fa58f831d4b3dad7ca1d1ee26a1b52 100644 GIT binary patch literal 14338 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 literal 14452 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 E0*po%djJ3c diff --git a/class_bluetooth_service__inherit__graph.map b/class_bluetooth_service__inherit__graph.map index 55cc353d..d4970890 100644 --- a/class_bluetooth_service__inherit__graph.map +++ b/class_bluetooth_service__inherit__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_bluetooth_service__inherit__graph.md5 b/class_bluetooth_service__inherit__graph.md5 index d459942e..89adea58 100644 --- a/class_bluetooth_service__inherit__graph.md5 +++ b/class_bluetooth_service__inherit__graph.md5 @@ -1 +1 @@ -649bd2daee1f85302b66a7c86467bc90 \ No newline at end of file +ed04eb4acfc3583220d1627fb69bac21 \ No newline at end of file diff --git a/class_bluetooth_service__inherit__graph.png b/class_bluetooth_service__inherit__graph.png index 573cd5a00ae281a98e7b44ce8be650acd1b57912..89143e5fcd06545185930028d2b4208967d22103 100644 GIT binary patch literal 9021 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 a^C|HbHdASDYXHx~K;&PlNSDKn{r>|1-cA_+ literal 9636 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@
    - +
    void(* BluetoothService::pFuncOnInit)(void)void(* BluetoothService::pFuncOnInit) (void)
    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -141,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_bulk_only.html b/class_bulk_only.html index 9df00ceb..099488fe 100644 --- a/class_bulk_only.html +++ b/class_bulk_only.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BulkOnly Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,14 +101,21 @@ Inheritance diagram for BulkOnly:
    Inheritance graph
    - + + +
    [legend]
    Collaboration diagram for BulkOnly:
    Collaboration graph
    - + + + + + +
    [legend]
    diff --git a/class_bulk_only__coll__graph.map b/class_bulk_only__coll__graph.map index 34e3e187..d56caf34 100644 --- a/class_bulk_only__coll__graph.map +++ b/class_bulk_only__coll__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_bulk_only__coll__graph.md5 b/class_bulk_only__coll__graph.md5 index e993d046..65616e8f 100644 --- a/class_bulk_only__coll__graph.md5 +++ b/class_bulk_only__coll__graph.md5 @@ -1 +1 @@ -3d45c6122208407db0c669272fecf2e2 \ No newline at end of file +f9839364bbfdcee0034202ae5496cf49 \ No newline at end of file diff --git a/class_bulk_only__coll__graph.png b/class_bulk_only__coll__graph.png index 8079286bc7ba98ce722f2da4818c9d5fad44f892..693683e3a037e46155e5b50db9ff021d32f577b2 100644 GIT binary patch literal 12058 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 - - + + diff --git a/class_bulk_only__inherit__graph.md5 b/class_bulk_only__inherit__graph.md5 index d585bee0..ab44521f 100644 --- a/class_bulk_only__inherit__graph.md5 +++ b/class_bulk_only__inherit__graph.md5 @@ -1 +1 @@ -56d5764d63044c2fb0319b525dd7bedc \ No newline at end of file +2b66e1860fb7442508174e207255d1ed \ No newline at end of file diff --git a/class_bulk_only__inherit__graph.png b/class_bulk_only__inherit__graph.png index 8ed08fbc353fcfb9a0016e5bfe45cb890fe7cbea..839beb4a64b93aee30a4753e4e8efe1ec7c1b31b 100644 GIT binary patch literal 5622 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 mi13n literal 6221 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 F{|jy_Gv)vQ diff --git a/class_byte_skipper-members.html b/class_byte_skipper-members.html index a971cceb..a53e8f7c 100644 --- a/class_byte_skipper-members.html +++ b/class_byte_skipper-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -1528,7 +1536,7 @@ Static Protected Attributes

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_byte_skipper.html b/class_byte_skipper.html index a032ffe9..e778dc67 100644 --- a/class_byte_skipper.html +++ b/class_byte_skipper.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ByteSkipper Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Public Member Functions

    Detailed Description

    -

    Definition at line 57 of file parsetools.h.

    +

    Definition at line 62 of file parsetools.h.

    Constructor & Destructor Documentation

    @@ -127,7 +128,7 @@ Public Member Functions
    -

    Definition at line 64 of file parsetools.h.

    +

    Definition at line 69 of file parsetools.h.

    @@ -154,7 +155,7 @@ Public Member Functions
    -

    Definition at line 67 of file parsetools.h.

    +

    Definition at line 72 of file parsetools.h.

    @@ -196,7 +197,7 @@ Public Member Functions
    -

    Definition at line 72 of file parsetools.h.

    +

    Definition at line 77 of file parsetools.h.

    @@ -208,7 +209,7 @@ Public Member Functions diff --git a/class_c_d_c_async_oper-members.html b/class_c_d_c_async_oper-members.html index fd1905ae..f1af7c38 100644 --- a/class_c_d_c_async_oper-members.html +++ b/class_c_d_c_async_oper-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_c_d_c_async_oper.html b/class_c_d_c_async_oper.html index a0c45238..5cc4b466 100644 --- a/class_c_d_c_async_oper.html +++ b/class_c_d_c_async_oper.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: CDCAsyncOper Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -136,7 +137,7 @@ Public Member Functions diff --git a/class_config_desc_parser-members.html b/class_config_desc_parser-members.html index 30ef3392..46d3e697 100644 --- a/class_config_desc_parser-members.html +++ b/class_config_desc_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_config_desc_parser.html b/class_config_desc_parser.html index 9bf1d660..936e7742 100644 --- a/class_config_desc_parser.html +++ b/class_config_desc_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK > Class Template Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,16 @@ Inheritance diagram for ConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID,
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for ConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK >:
    Collaboration graph
    - + +
    [legend]

    @@ -117,7 +120,7 @@ Public Member Functions

     

    Detailed Description

    -

    template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    +

    template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    class ConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK >

    @@ -226,7 +229,7 @@ template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PRO diff --git a/class_config_desc_parser__coll__graph.map b/class_config_desc_parser__coll__graph.map index beeb8bce..6c292de0 100644 --- a/class_config_desc_parser__coll__graph.map +++ b/class_config_desc_parser__coll__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_config_desc_parser__coll__graph.md5 b/class_config_desc_parser__coll__graph.md5 index d500e5a6..6d67d32a 100644 --- a/class_config_desc_parser__coll__graph.md5 +++ b/class_config_desc_parser__coll__graph.md5 @@ -1 +1 @@ -e7881467fbeaf56de26bf3e709c6ae68 \ No newline at end of file +43e2ececa16e23c2ef0bb98404d9dd99 \ No newline at end of file diff --git a/class_config_desc_parser__coll__graph.png b/class_config_desc_parser__coll__graph.png index 4d34118d1f2bfe13f55ea0e0a58d75a52aed2a09..b1e39aab2622029bcfa4dd0351a87eacb02b3a39 100644 GIT binary patch literal 5798 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 PLXe`YnoOCLdC-3W=}9c? literal 6427 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 - + diff --git a/class_config_desc_parser__inherit__graph.md5 b/class_config_desc_parser__inherit__graph.md5 index d500e5a6..6d67d32a 100644 --- a/class_config_desc_parser__inherit__graph.md5 +++ b/class_config_desc_parser__inherit__graph.md5 @@ -1 +1 @@ -e7881467fbeaf56de26bf3e709c6ae68 \ No newline at end of file +43e2ececa16e23c2ef0bb98404d9dd99 \ No newline at end of file diff --git a/class_config_desc_parser__inherit__graph.png b/class_config_desc_parser__inherit__graph.png index 4d34118d1f2bfe13f55ea0e0a58d75a52aed2a09..b1e39aab2622029bcfa4dd0351a87eacb02b3a39 100644 GIT binary patch literal 5798 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 PLXe`YnoOCLdC-3W=}9c? literal 6427 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages

    +
    @@ -115,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_f_t_d_i.html b/class_f_t_d_i.html index 6dc6163e..d2210531 100644 --- a/class_f_t_d_i.html +++ b/class_f_t_d_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: FTDI Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,18 @@ Inheritance diagram for FTDI:
    Inheritance graph
    - + + +
    [legend]
    Collaboration diagram for FTDI:
    Collaboration graph
    - + + +
    [legend]
    diff --git a/class_f_t_d_i__coll__graph.map b/class_f_t_d_i__coll__graph.map index acbebb33..4dc81904 100644 --- a/class_f_t_d_i__coll__graph.map +++ b/class_f_t_d_i__coll__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/class_f_t_d_i__coll__graph.md5 b/class_f_t_d_i__coll__graph.md5 index 76857971..8736ae0b 100644 --- a/class_f_t_d_i__coll__graph.md5 +++ b/class_f_t_d_i__coll__graph.md5 @@ -1 +1 @@ -e5e07d3721e783dff0d1e851b88878cf \ No newline at end of file +7639ae03a2a3c77cae9f7ef89dc8dcfd \ No newline at end of file diff --git a/class_f_t_d_i__coll__graph.png b/class_f_t_d_i__coll__graph.png index d0e6900fd4c8d95630820a5cf335858d941be804..68dacf2363f994619aee7c77f54550f252c21a46 100644 GIT binary patch literal 4985 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 - - + + diff --git a/class_f_t_d_i__inherit__graph.md5 b/class_f_t_d_i__inherit__graph.md5 index 76857971..8736ae0b 100644 --- a/class_f_t_d_i__inherit__graph.md5 +++ b/class_f_t_d_i__inherit__graph.md5 @@ -1 +1 @@ -e5e07d3721e783dff0d1e851b88878cf \ No newline at end of file +7639ae03a2a3c77cae9f7ef89dc8dcfd \ No newline at end of file diff --git a/class_f_t_d_i__inherit__graph.png b/class_f_t_d_i__inherit__graph.png index d0e6900fd4c8d95630820a5cf335858d941be804..68dacf2363f994619aee7c77f54550f252c21a46 100644 GIT binary patch literal 4985 zcmZ`-2T)UAvqu!EBE8p8r9(gvL<9mVVx&Y73?M~%FQJ11(h@+3fOH`g!B8Th2m%5E z0-;Io(o3XC@9+A5-+SLTZ|2RN$=x~kWY3=6-~M*biPnSOyGF%9MM6Sy?ZJJB0SU<^ zFd(~8Tm^nT=2Jw0*Hz1h_aGz}f1eNag=i8IMyUr7b(n9)`cwdn@t}%)%T=TA1@7%f zI{M2F+wRyWFzo)Y;jdylRnj_V;A&@=tI`2mEhxdC*frm0u<_%7t_grTh zxV5yjgrBQ1M&#y#oMswKH$OiWs1Uvv$0cigmv9^f0ih3Y{(BCDG=;8(GZ~`y!VmiJ z@bDGWwvm6E^e^jlNqRC>B41x7M|62h^5eock=3Rnv(`4R6xQJh2?KPkHfBkwpJR-ufCE}X$dK3lZN~K9G3PnT1CPM;PV?U&g>Hl?pb~4%+q6QOV zZbPw$)%k29=0zN4y3-YBi9}?InLnl4>DFZ)RsZnO(NU?A#ZOo)B%VjL)+y*W<-=(N zFu(0+XPKUtw=DBu$jE%Q`3?1GeSl9&tL>AIZ^FZ``~=rMa;|i3AT%|-784g&`C8i9 zspH}1W>?*~vSOE};!}#K#o-ceI*s1V%E}T%cZf$NTFK7Z(?mH>JhJ z1z1^G#iXT2Rxvp_uX8b&2Su>NiVCpvL{-Vuoit#RKigtCCr$~Km6c39JkZk8(uK7( zo!Qx0*z@O~cKp;XPCfr@ZSfVsbQndTd04E(x?E7%649*I>qf_-hljU!e#!G{gzw4C zJ@nhReX|Ft4rgr}o`sLIg1>-zrdkg$bTIF?* zhck#iHa&Jrg(UI7KL1#ze`Ce^qK0OkB*M!_wn&zh=xEQz}UT}rY6CZuGKNy z?0j~xOw_Fg;O$)J2%?(gEH;}nW)rTwbSP1=kp5*ksTc!+1c5BtMw-GrF3l%KX~#DXFKpYBVXsi^WIs^w=toaaTavhu z+hQlPwT+GC&QiCsb0Qj@kenO=Bp!&5?`}YhdShmCpDV`L!9DG>`@A+26BD1fI5j&v zyK>=f)r;w`eo-+o8ZTc8{Tvu@-=5RTT$~9$k(85@dz+g27m!Y4pS9`;KdYyU1&CuF@=^y-N&8+DrvEdahh^xKh;{QdO#WtSctj%se!_zPVi&xWcL z|Lro<+{>xGAF9R`&7VGbqSfEuFYmu=2ZT)Cck6}!#o2+kwqxJULm_m>%JCj?ec#C3 z{PF(&{`l%_OQfNT3xGd7{@v}{x1&}%%F+yq@**Oxg8csw=T}!Bkdcv<9Q$s3S;jXO zNLCJ!(^q2a*N{mP?VAhmCZ zh}=`j%*=E)6sQ0QoF~odZEQZxQP=9lIKyh5twOhiY4jLbr42_Hr9qd z0a_tJ$GiN}($dFE>8@VKPQ-xf2xp&P-!5^eAS7bBRg!7Bm95=OyO-_dIWqlbLM~K~ zPEOFe!UG#E2n6D)npHp$-bZ%@+4M~Kv5kN>>I0Hhx+*PXwwdhD?yl2LJu@@&V4aWa zI=-QSSJmHoSE0ghXUV=W@*1bM&&H(esE>z-+@m!4=%^@RXvTd2dj2O{fBwiFb`6^G z0=vTd?bw8MMWard_|-F`szMx(HIX(j-HsOmXzS)GtlQAwYi zoD@}4%XXQn)pBuhQC{COjsMBo`<7pG1&AW-=~Hco%CyeTPSo_p-d_K-?6&-gIU`!6 zVyez(;G;f9R8lgwxVZRZadC`+q2cP$a(3ZkwKLenMv{?P4nTool9Kty$NsfJCpRUH zKZgS$z&o4lpKZ-*#>B-HL^F!4IU5=pY683X%UpjAFrSO#ROj$i z!C(-85WQA^3Q^J04p&9T#N^&EEYQ=}rw2To(AcOJbT}J%wGo}XGp@{+o0}`j$M*`r z;Jt&5DU6YM(35{c?y~=T>|JK&BX4hSuRjY90Dc=-^&H3B!{Bh;*49>e=W%(HYL`sJ z7a`ZWv@{NmTONYkDhS<)^Ob&#yu+ZV|LLJDJv{*Uc$di<3%9dJOjKmR1eAlL;|;*; zp?=iG?EQeNmJnx8oh0mrL1G4p9Mg|t#c;ur8@B>ij7dAGaa;YdwOH1X!_E=6u zJD@x+{Qj-0>c7j!%gd{yt2-!VR0P9Ywo z<2y%?<=R}Fgk&mvU2ki9`#`xx%YCt=#Oi9r{JgxC-7zmkLt%73KzI{tgF^<@Q>RBe zH$b4=p<1I-_ycMd2|iG6@0}A=MrP*3@AxRu8#kgOfFuC;D-R}Szuc3ly?JqbY`6Ko ze8svA+YaYJFvgocs=Wr$By^v5K>tiW~^ zIIAfVEH}HgyBi)Ke|?Qe+-~D^eF0F?5^Xelbam#oQtH^Ntu43k$jEdRntdkU3HJEM zVD|s%;{KzdyXs0JC@hSyiEJ|B!Wz}qQ?RL)we&FXMZFq>Q$TeH9-a*H81V1 z!mJfLW549AEGR>C-V>oaji`W*#ioV1&rw|5?dWHd$Jbp-_Jk7di>j(lS+~C3*x0bS zKo$5#x6&@GC}qLnED3NPr+we>Er)YR{E}7$2*l~z=Ao$UwL&_Ky+xWpQC`6)AZjPU zB9(!XwR*Qi8|#hX4Uzc%`tq{dsqfXnHEp^}*}=-x02btY>@<>obYPJRHywTvPiATY zs()7xP^o+zie-~+zGh(|EuiGf#l>|bEv#(iKEcT z=UQD&2u!nA&LHT{PPkUch6HEy+{PVtRPq(!$(IOz^qXII?ujM^5$Jh{mihTl4*zsf zM^<{?ki1sQU1+Xo^aV<4cw?beC+%HDbG7^d4$n}R<}>9`t?McTo&;drv-``_)H z1a;Houk0*eke{C}v%auxZyX&Ck8<0Xd~`a`dl6|^D96u&?C}awB~Jml6d3yvy-H^ z_jg5b!k`2Sk;kQ>)r#g|1ssHj_I*@!HN)%I7zdU3{qN6e z+~jVno*+D}tB~l_Xf23t7|dbDp#cJFesxI>Yo^*wqmL`4qu&;Lr}JexT~XD4)M}`> z$R?^2;VuW36)7~MxSpN6LoJmMwH>KObJyAVvQ77~3eO$v&A)EA9r!FZ6?_r5w&wqJ ztNCtbe>LDrdinuAw5nAbh4Xch3YV?@i4e$4LmVA4Tkvy^CbN>i*DYuUMSEG}@Lc5x z;#W^5`4TOf9jNp)>gp=``rB;gA@!t`l$(|-dSrqODp8PE@N*gfoK71u&a{9+zNB#h zIS*xdj=MQ-8iA(g7 zj=}43ajNvZjaR5zEBHura|?*|_;0#MBB3@~TXVE(ok>GO_*;u+^`DFFd4CDBQ!**j z+E~>9mT$eTHL1DQ&bNFvgr|c8)U@MyqJmCXa(!Hjdj5ol$_Wa>+fFtwI)24ovXO(! zJKh*{xCUfaXvi6n3h|qw6~%7V&CTE_d}Ea(Sz0ap+qeGFh9GGAUKl}w;fOcw8AUV% z)q97!>D8s4XAP%xIyz$8(*fs8w8%@N)zaL&L0()I7HC{>5M6w&1d|Au8pII2HPU!a z35C{gZMV1U8yK{b$FtMZTUsX4Gww7-p=f{(@WOuM?K4iLRO1g?$n&W4v&{0qBYqfc zaLYcHU0!WHJ~p$f@a*ZUvQ*>p8EGYPoU8e>Pt-jG`81aw@UQRV>jPR2BT(MII7yPF zL<+Cu>9gEjC)#biy;72!do|?fAr}>O*H&*xLl~Jrk@9D#M_C%>cvF{PB2W)&1}hzvgSPgfD#X96~sU{>${3n|TF zal9-0telUwJ?`au6~Rv_@4T+haXM)2gZc0Tk-arjjaEKp`!h zFN=UL&CZPv*RTyE+~gS9q)N}YSzE?gpf;r6TPxu-j>sB$%@0mrYLbD;jKJiI$~hCM zh)U-Sg3~KWrV$TWiFsu(CunfavNyJLmt<{`vvSX5cWgC?as0xT>`lVjEq6vR{b#+f8oT6G+n&FczI+^p z2KohnTjtx1n#aDdhK3??YHFGnf>>CMUL5Z>HudYrphb+_0UJ27ZN@)V*!DKh%&JNY~+hSm66KqZGb{C^Gbt*@XPv|btOU!lm-R{GJb!o8QWVW;GmgqyuOf- zklv@E!xc=t@>c0xbn6a2sKmUH2N)KPdt-bVa6-?>$jBtWS0``^>E(GWK`w^!-uoWRY1jN`C`l8OoutEQk(NxW=(^EH~C zNEg&maCBRfvdG@d*;x`e1GudX-jFcCQ{ZqoJyE6t>i1(bfIpu<$T#ry^K0trqK=D; z`+M{U2?%s^voMl0*t8LZWn}1#%FGme*mU`Pt=p9I7WZ&H@cG29Mc>^OeOpaS8WIuk zu)3+=>xQpixq$A>wCaw{#GyPo^^t)A18@Yl-H>^Ick2hr`x9_7W@2Fh-MYnYZ*LzJ z8>`@RUzblQ73VU$yiA^O|4I?8xCD$uA_t1VR#>o7sw{@xvmRTojPEJUmeo8=W4F?! z14i4f0Gs=N#hM;M+jgUal}1wsLHp5rnM*(fwXLi$Uo=$7eecwZrWQoX5_B~`5i5Ll^sUiFR4_UHCF?K?Wy%}VgB>SEiLyWbt zWX;ZS-~YY$x%atu=6SyPo_W6Sec$st=lss^oVdHD`t&qBG!O`c-q1kD0sp;%`{T8&8r9&X>XhR)MtAL#KTn`Oa+)U@tl}Jh`>Jy6w<-KNd zT@Q9IN3qEP8;!d*nl|PsMr7z9D!67<#}gct?sc((Ph!1$tLX8fqWkvOjoEbzp$1~2 zH7}qr)Is~NK@>HV{Gmw7-;-NeOW}D(`G5P7zxydQ&Dk^rnY0R0Bq8MHLIngtrum4l ze>7fF9Mh9uX2@Ple*54L&PV&wyS$WIe8UJP=(EHL1T;!DX!mislA4;@ z_V)H@nVGGnWgP}%YGm{+_#N{_-{;S9pYDy~@k&oqqoZ}5odsK$#{zeknWF@Sr)eO= zGcy}RqWi;#Z7>-^z{0CK_o1X)ibzU=yX;xXSF+p9YyOEvvY9F z`xqG+Sy@}Jt*+|Xi*9!xonkyjOFw-00IbZ+%%`1U0zWkDK7r8sVR6cM@i~IGne^@va+&6{gX@YXNg1kLwRZrj*e>T>e$-a zA6;EtINZU`QlBu*kC~Y~6e@Ugrp3JP?J!eLJHE~xL1h#5)yHG8e$~^iHKzsV35<-*Dot7B6qT~v3d05$?fGBT$K}U ze4O7m)lTBU=f~zQE=BOG$jf44y;D;TNYjvz(^|JaJ+{TU_E?K7KDm#!RS$r-xc*rr z60!08cx$DULcjDwzWsxPsi`S_9i0ME9&YZHKY#j(fAx7_e`I3ZoV|PTh~K||M@B{h z+j#xjcXp6oUTcLedCJdw@px|3@4rXDaWOG5)YR1ACge6@U_eq{p2J}hhbt>CwzRj8 zcQ+Dbx*{Tyot3q+wpQiXl-WK<$9_TA+|_jf0B6WCu!Iy)4@)%hQOqeQ5CoCHk-*N$ ziJO{Act6n7Q&U$rIyN@lO zNLMV0Fqp5tIXkOS24X2cY-iDMcgV31tn&HuPaG~eF>!G_K-5s_^oW@6acgp8x@pBX z$kFkVypMCrCiZ-$zyA;L1m}(WPmxFqOG{aK`I$O*Mr9q9)Wise@kb@!dIz@}PS$}> zB{&jH%cPuIRV5`W8XNB+(W|STH{MK5PlukLk**qNhV0|rwL4B%%JO}EeXCbmf)Bvq zG2j&An;Xyl{2nwS-8vJwS-TMcT3=<-)?7PWUPV?mU9Wg=ch|WIYMNWd~XSi1n`K7iJk1PFFaLrsd?MC6t5!$ z#{odMElSPuO>G!DTxw7#-V7spDD7Z;`F6oKI6oefpHx=A5JAZ|bQX!qeoXVg9+KWU-=t28l${ zFfeo)@qNxUIP!KzrP7F_BGF3oXNEpLK0P-UKq=sP6+{0_&-~}m5aVX1F4N+)KY^Vl zn&O}Gj~`=WW9u;(Kj8NJ@kNh8=Ebv%SLYue9|s7}K2>CAXNN!lghfR~e~CjX|9KGO zCr?~le*F5CXku$?TUJ`y`?3zX)GLKOWyw$^{a##zQj$M^{v0H;SjObfpDzXwa5${S zZsJz7Ovp^B3Ciza!?8z)zUg9HcX{v3%!3-c`*wB{V`J<*JjWyY0uPBdA&~J|P=D#^ zM@vm8V2jl)Er3o%BqhB^igXPP4cBm0;h<0zFk4w!RZrimdt{=erDbhBR;V3Yt*eb@ zHKg{I4VV}a^tio6L#+S)T?f!QAdy>ga-rv>15imAE?#VVLrq16pO|=^nJF(XpZVrZ zQ$quMrkR^D>G^RT{!dr3KvzdcR#sM=j!=)Tx3{k+Xd9 z9rKLpr%$)%JM0$b{vLsowYIh%#@xTbNm|Q_Z=Vx{?resiqq-JAcvC^{T3gFK{%>m3 z`x$vXcFizSW2=MHX<~9xhKtVFxbKpRpL4DimsX*)k`jJo#N5PW;M+HswegBW^ox?7 z>umAG#lmNc8pu=tA{KiNID7l;^z?LFTicf}UjSh;GcyM~1D87@tXTIB))5>I5F!GU zxr&PQwY3C-Jso>lVTMu!e z)aA7*EC!V3@$sgogl1qhMB!OD^nN|Fz5XJ_K7S0u{>&TER+o3K`B2sJ@zeUrIjg1`+6%`3xyH@tFUg!rRerOq4uGl?y zM!ypeDg-qpB~U0WAxE`EMJ~j_+=mYz!V zAB96le7;>~dTDLNwyQDv^C!&1=G1&nmC4L7CtP9Y_qRLGrh3#K3h8JHHs=D zMo!i9l0h;vsZsKh4(Q%{y1L8`MA-bw=mzVxURl{HpGFd-pr&T?%9Um_j3~=pJ?z-e z&tY3_IMH|^s8*ri>gtEcNLnpzP99#bbV+X(Qa;6`fVE$1j6$wzNozE%BSH@E5T{^pVCX<7(V!ud|DG&Oa0Muv*Db%w8VdfG8Pgo$NmdhFxD*1`>j3?t^a z?+gs3`5`+SO`DVHMcz?Arl(Jm!|(U^ePn{_2#pA?$7^Zs|Jk;0+Bca;Ux)Ut)n8x? zbNaHIQ0OP18Sz1E{fwmM`z4J(PQNWzWkB5a%xC$vkVNK_z#~7mjoj?hA&r=C|mn z&67DTUJEOe$K(`*)7?>ah=D_r(K|)OYMW0_ujppX7yJy9l^feT@K05q7lPKhCv!IY z@XC#hRPyutlnf$;QUgx*86R@Kwg4+L@t!0tno(-P;faiV4abMuvxML%I%AvhfwZ&_ z(X`&>KhM!O#4=XrUC;qFl8xWk$lMN4si}S%Ur}OWw;+(Hi1jJk95r5V=dY*B#fXiW zP%X@tIDJpg6~cMgBixOHoE)evF6$N#6-1CF4)cT*0r#MZto?Uq);hYT{-eVMf6yqQ z(PMvi0zFq#72t-W<5Y z{X%VydtrE@r>(}-&BKH9DzP~Pze)6;==JQ|TVsrwq={-L(kj3eJsvWLul#Uowfi+X z%E_8OHN2&A?;9KaQs|ky1bL(=P$25(jlqXcXM;DDQY7`Ct*o)?=34JJVNIX>=dbo0|CgY^I%pBu@v8`ZKvy`L5$- zveYc{L|Evxuk(q<Oi>Fxp{?HhgXXz6k;zj7^q?a$)I#P(%8 zvb(INroD?;otZhgGMX9_lMU<3lGebsh?$#L-Vt%_N^*fjq&aNhobnHkE@7&ry9XIY z$8D}T4C;^{ds9+UNe=&n!Dm9^`_`vhrV_NwJ4X!9NeIik!z1{*GPg%DKv1Mfx<`?b zb@Q7}M3u3nAv-yTDj!y_0%YOmUl$i(dWot^h|S z`f=)ds<3A7-$7Hu9;ur*8$a4&Yy3AoL*Q3nI$uA%ig{=3o_G6F;K_dR@bKpGF(s_; za+GUVCF0lHOB@(cNpJdFQ{|Dw`VmWqsa2x?_sPj+kS8W4om;$j>?|ye8Tp&PxOT+? zOJQDF6B^i8aWOH3mKH`{ZjW4LbXYGNeeF^=kZY{0Lm>YRO!nw#>@_es7a4b_>^wXI zH`a4a%RVj=^?A5WK1kWoM9()gH2V-gw35b$rb8LIl0yEz!&5PG>;uK6OTX&e6*TL5E-fnr7FAYe=U%!U z-kOnYc07P$1kbr-qw*UY*Y%l7KJU7Ui)+^|-O(x_EG7bS>P{5|Njc#Zl_Kd*`4d;C zrn)t&j*=vU+40I;vTeCN>-udnZH z%K5g|z0Nacx(p+HJ>pfVNN9UZx@um1{lWcO_MZ9Uy$gkf_Yyd#_?17~c$_!Ja5*Ep zXel+*(x>U^ZmAz#N$y*xrFGE36ty)5)c7rQ!Wom5PWA)aBU2aXcc%_n*q7o34J>{r z-F9ktwqQ}aWRU*mfB-UZcsSb7@X40z0wshbzXAW%@VW;ECp`E**KAeJ*)A*7>$fh3 zZw;m5i@w7(jL>1?It03GVIkQku(|a$o0)FFO;tJcEj3c?YqsRs*=U&8zY`bew{};C zbi?GAii1o0;Uu(FoK#Fg$MRsVdu<&e^rRxcjJO8txobKba6{|5RQTs7(>HB#*mc6D zS?>Y#h1N6ppOqg!RudDS_q`bsdJvIDLDIXGkzo=UsZSh4_jlWYtYy0A8;;!?VoZ*0 zJrX(HQoN{vP1SI8MCB8hd3lRjuYJq9qkJE(6UZ@weXcYSKxp~@Cc z`AT6_HF&9z5C+$(_U!D{Bqz<3hmi{x4chzRz4$tmj!;c(SD5@shhoOg6e4$H_bVi9DLR(FNAKT%Bs#`fz%H;{|E#RJIb`L>yO7&X`<~FEqRNf03ncOgK2J)` z$E&MV+W}aJU}j5cbaV#-OOoGbxm-oAy7NlKEKe0EVIb41Fvt2x$&j~mBL^GP;t~?C zz2cbeX<(VZr(HGf&V*bRm~bNhKjSTp|D1W97_&v!6T*UL`$5+jc6LOhAPT4j-BMNM zJNJOWb|<~6yeFzP_4O|#XQrpOyVP_VO2T|Ku-BO`Fz~%qe*R&RkDmS&7{Eawr~#nI zJ4?wR_V)IN$1XJuK;$~1q8O2H}^#`Xmr-wJG1A3 zR@AeksVii - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -623,7 +628,7 @@ Public Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_f_t_d_i_async_oper.html b/class_f_t_d_i_async_oper.html index c617316b..7fa0042c 100644 --- a/class_f_t_d_i_async_oper.html +++ b/class_f_t_d_i_async_oper.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: FTDIAsyncOper Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -164,7 +165,7 @@ Public Member Functions diff --git a/class_h_i_d_boot-members.html b/class_h_i_d_boot-members.html index f6556db0..f1e06336 100644 --- a/class_h_i_d_boot-members.html +++ b/class_h_i_d_boot-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -127,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_h_i_d_boot.html b/class_h_i_d_boot.html index d8e0e469..f514e585 100644 --- a/class_h_i_d_boot.html +++ b/class_h_i_d_boot.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HIDBoot< BOOT_PROTOCOL > Class Template Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,22 @@ Inheritance diagram for HIDBoot< BOOT_PROTOCOL >:
    Inheritance graph
    - + + + +
    [legend]
    Collaboration diagram for HIDBoot< BOOT_PROTOCOL >:
    Collaboration graph
    - + + + + + +
    [legend]

    @@ -183,7 +192,7 @@ Additional Inherited Members

     

    Detailed Description

    -

    template<const uint8_t BOOT_PROTOCOL>
    +

    template<const uint8_t BOOT_PROTOCOL>
    class HIDBoot< BOOT_PROTOCOL >

    @@ -546,7 +555,7 @@ template<const uint8_t BOOT_PROTOCOL>
    diff --git a/class_h_i_d_boot__coll__graph.map b/class_h_i_d_boot__coll__graph.map index f0d9592b..ba4eca0e 100644 --- a/class_h_i_d_boot__coll__graph.map +++ b/class_h_i_d_boot__coll__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_h_i_d_boot__coll__graph.md5 b/class_h_i_d_boot__coll__graph.md5 index b556e0a1..de81f923 100644 --- a/class_h_i_d_boot__coll__graph.md5 +++ b/class_h_i_d_boot__coll__graph.md5 @@ -1 +1 @@ -868183779e235ca5660a15c86d65f98d \ No newline at end of file +a19c6c2c9e133ec0ee972f6c6da3910c \ No newline at end of file diff --git a/class_h_i_d_boot__coll__graph.png b/class_h_i_d_boot__coll__graph.png index 5f74dfaeea677f335111ce70c2c9bb4066f492b0..85d7fd8e6187a4b06db0b1c4c3ab188d309effa1 100644 GIT binary patch literal 11859 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 hn;|w - - - + + + diff --git a/class_h_i_d_boot__inherit__graph.md5 b/class_h_i_d_boot__inherit__graph.md5 index 956245e7..bb37f2b2 100644 --- a/class_h_i_d_boot__inherit__graph.md5 +++ b/class_h_i_d_boot__inherit__graph.md5 @@ -1 +1 @@ -9b8e08f2bc01815670cb73cf2c382113 \ No newline at end of file +0163fec2b92b9cadecd0eed3ad26c28f \ No newline at end of file diff --git a/class_h_i_d_boot__inherit__graph.png b/class_h_i_d_boot__inherit__graph.png index b698cfc210f5b7ca5d505bb9cf881704aea6cfbd..357fd5a2e7c48562aa0a3117830d3e6847b86529 100644 GIT binary patch literal 7894 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πN(P6K>^e6Vq56f`1sP_)d7!-?S_2> zq4Dg7>ds#0j)1Kp_E zr8Cu`J>nrbHyYac5h|=<-s@pS`+0Hx9O$(H_z4Dx%+T8#^ZJ~nom=8Hw!P2O77RKY>phDT;eJwlciP)(zC*g%n zp{YX=zx^)Cs1#$3pUHN$`O7&SS~2$b7f&0kS9hqB(1w zxgs}9Leh<0-;jEsQH#1h0~7QKfTxMmAkBipFNqsDF2EphW%*F9+ZKZj0_DHGLEiIK zG?xj}+bo^wU*;QRCKv?X1fDMDY--6iBDMhTMJwhs!^Z@DetRzlCZB`B2fxMzHtb&M zOrV75eD*V=e4CD*ShC#)6Ot<8T#tq(Xq#-hq?C-i*aGG4 z4gNP2{7+Q)|Jm|O65iJrpedcKvBamMqT-~*hP+T#et;&O{X$om2+AHI7x;jfRhl(X zPn0A#B0QXvHkh&fY>oQf{rd)@IKB5AE{?a8MO};Yx_Fbm!Hy9i1>8ZqIN5D*WQls9 zBP|`URs*#=P5T!#{!c5Cr9T`Mc6ye9MFN(B2dPGeJ{c3i9vzB?wg5R~IMW@6-Fd89l}E z4GB%udt$*)c^mUE z9+JHQ;B2zhvu4PRDISZPo7>}PTxTCu(E-b!7$0YR{P+RL2R%Rlw-FJ*!Jsvv9f5oI z?rqEl6_%8Abq3uh1oHvFJy(`{B0+M<=tSl7tnsv;-UY!|K}iV<=?cXKLPh5`Y7PdUfLB;BuyWa%6=7jzU0(fc(hEo%uh*fKg@wf%P-IYu zx)gSza(UK>+0@@`O;&MDgHA}@<_gztg6{fs1>Y7V-Zt+Oq$)(-C-gWzH8pZQ!+VIu zm(qM=I9s>gmXZV;Lm`?fgjURrL0Fg~A|gT%n`zLpWAft>Jt?B4D~;u-yW5 ztRMDl!T&~Ld1XalJr{7406?Rd`T0k)&YBV6jX_EQC>j@JP}@VVT2f~)b1^hBGT>Za zUJfiS=E$9a2fi%oF39xz0HzQ&Y7WgnhulgkD*V>qaGFL&xL~-Fc<3qxXlxX@vBw>r z*1fxb|NgD?I)ZIY*A1)QI(_GB8-8|J zSXjOq7@#<=^x_U4)UTlu($b;;DeCU+%>hZDLdc#b!}nM($e&_X8vz`t@!bmMEk;aw z#qmiW@ZoU{7Yh4!5= zmAq%_>Uh;PHJZA*;Q;|?QPe^^@6T%$e3GrRz>o)rT2OV@hmDObI4o=hxOR#)cx84j zu5s}Wx9t>UgR{YbJdKR7se5tJ;+;-36qf>i}P5r^vOM*Dd!G!3Eu4lu*p*Hl(k{?XqLJKC#g zZl(g|9|$NTs@^+I>y>_2ULQYy29q%w)I`OEXu~Md2NaPc`d&>{*I2~0JG zQ&RQ+4`kg;MKi-Z6?op~&gPE%s8=9Uz=X><% zp0@MDtba@nDP8FnWl#t}!}EtYIXP7w(kUHxXA>(bcye-c1;U8x>gs@(1!*rhuOVbW z^@o#E@q&F1_}4PPbF3marb-Aj$Ia14WnSz6I)ZV8;*(9vvGRAeuk6Hp4`S)1Vm^K( z0TpZV?P=M$xqAU}b^QBV`PZ*sS-{AW1?^I_)8UN1n_^cZ#_Jt-@7|5e$cPyp9(JSr z8B7wW4vpel(RJou=~4v+71lM36_rf)yFfi^^IKn(-aR%>D9k6hkAnE#?M4|;rTouj zNmI(>PxBAQwcI=3L~SBZ^=bsQ4;}^patti&J}xe95?%;jCm7f!^O^>Bx|?oFm#(j? zM)4uBuSJN>RVn@{gMC3GNx}={>!llxzd;X)cvkbKBL@o%s?n6?)#b{cy$SpejTd&E literal 9416 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 Jnbf<0{{cNxTYUfk diff --git a/class_h_i_d_composite-members.html b/class_h_i_d_composite-members.html index 9413af43..e1e1749d 100644 --- a/class_h_i_d_composite-members.html +++ b/class_h_i_d_composite-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0

    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -137,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_h_i_d_composite.html b/class_h_i_d_composite.html index 5c5020e7..3193ba15 100644 --- a/class_h_i_d_composite.html +++ b/class_h_i_d_composite.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HIDComposite Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,14 +101,23 @@ Inheritance diagram for HIDComposite:
    Inheritance graph
    - + + + +
    [legend]
    Collaboration diagram for HIDComposite:
    Collaboration graph
    - + + + + + + +
    [legend]
    diff --git a/class_h_i_d_composite__coll__graph.map b/class_h_i_d_composite__coll__graph.map index 4952d2a3..7bad2110 100644 --- a/class_h_i_d_composite__coll__graph.map +++ b/class_h_i_d_composite__coll__graph.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/class_h_i_d_composite__coll__graph.md5 b/class_h_i_d_composite__coll__graph.md5 index 406d78bf..cb51ec95 100644 --- a/class_h_i_d_composite__coll__graph.md5 +++ b/class_h_i_d_composite__coll__graph.md5 @@ -1 +1 @@ -f46fdbe0b11cb8a564678045e363d26e \ No newline at end of file +cb1afeb4ef0790903388054fd3bdbf40 \ No newline at end of file diff --git a/class_h_i_d_composite__coll__graph.png b/class_h_i_d_composite__coll__graph.png index 8518c712c7d01fadf67dab884e686d12b22d8565..f1ac41c279080edf80d08f35d407f7aa7e1b19b2 100644 GIT binary patch literal 15878 zcmdtJbzD|mv^Dx5h=9^1B?w3gNQZQYbP5Op3P^{N(umR}-7THcjRK-{qqKBMcYl-j zJ@=gNo_lWmeYd~g1~(6zwb!0&&N0UrD?nLM8WV#Q1A#zb$~=`+MIdg-A`nQlXgA=B zzGi?kd_gskla@qWUH?mK%!x!Gs1P!eV(RabHm01l@R!GL{fVa)MclkmRuXt)?TfX8 zO_*1eka+>M_nc~MALanY=#;t6uX)s%x?%H5?INmT2eTso+{zj%?N18NZxWyw;UkYN zof*2Q-nn1)QJ&*`v#ZM@E?&@iNr6LYx}*Cst&|E1jH3QcoFaS?y-=P;AiRA3_wze> zdIaL?XGh2LTH7pjrq=?vEOX1(#}9j=G}nGtmHdA#D=f`hP`%*nG`B_=5k2a@J#4Kl;g!uSs zN=qLJ2{o$aC`QsLb;Tb9_xO8+T_V@QscM9_JgM)(?JhMN4uBofT@M-b2EhsGHVrS1w{TwJl z7I3fZGYK||=oUQb$?0j+yPdf{kt

    Y95}diVFM5nzs&`zspVfyl>t{^Ntho6rK{v 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 literal 20213 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 Y&9MtdVskxu - - - + + + diff --git a/class_h_i_d_composite__inherit__graph.md5 b/class_h_i_d_composite__inherit__graph.md5 index 3688f3bf..9ac7faab 100644 --- a/class_h_i_d_composite__inherit__graph.md5 +++ b/class_h_i_d_composite__inherit__graph.md5 @@ -1 +1 @@ -39148cc7f4ccf37138052f091ef97263 \ No newline at end of file +7bba052169c3e9cd86fb29246bed4535 \ No newline at end of file diff --git a/class_h_i_d_composite__inherit__graph.png b/class_h_i_d_composite__inherit__graph.png index 7fbc18d190dfe69b90b9acf4b37c00829c14e1fd..dbd01da4f2a8b480b74b3853ce21111eff1ce0de 100644 GIT binary patch literal 7426 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%0AS)l!CoVM4_(8{L_S+uA;yoc3ct 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 l#sLX?(Tv=K=e70(lRQ3Dm+muJ4c - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -767,7 +777,7 @@ Additional Inherited Members

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_h_i_d_report_parser.html b/class_h_i_d_report_parser.html index 08bf2beb..dc10f396 100644 --- a/class_h_i_d_report_parser.html +++ b/class_h_i_d_report_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HIDReportParser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,10 @@ Inheritance diagram for HIDReportParser:
    Inheritance graph
    - + + + +
    [legend]
    diff --git a/class_h_i_d_report_parser__inherit__graph.map b/class_h_i_d_report_parser__inherit__graph.map index 55a28d8a..23a666ea 100644 --- a/class_h_i_d_report_parser__inherit__graph.map +++ b/class_h_i_d_report_parser__inherit__graph.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/class_h_i_d_report_parser__inherit__graph.md5 b/class_h_i_d_report_parser__inherit__graph.md5 index 44e50d86..25b71fe2 100644 --- a/class_h_i_d_report_parser__inherit__graph.md5 +++ b/class_h_i_d_report_parser__inherit__graph.md5 @@ -1 +1 @@ -c82eb64e4e9d8248b32e0db32cbfa973 \ No newline at end of file +8be112e5d3300b51cf0649c53a258712 \ No newline at end of file diff --git a/class_h_i_d_report_parser__inherit__graph.png b/class_h_i_d_report_parser__inherit__graph.png index e037995b16d8f8ff2df0aa52ee9ce703ea2bd150..a9296e700eee4e7a8c3cb795f55c5f3a9f58cee1 100644 GIT binary patch literal 7443 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 Fe*xIfC=mbv diff --git a/class_h_i_d_universal-members.html b/class_h_i_d_universal-members.html index 48c7e3a9..61c1b3c4 100644 --- a/class_h_i_d_universal-members.html +++ b/class_h_i_d_universal-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -165,7 +169,7 @@ Public Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -136,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_h_i_d_universal.html b/class_h_i_d_universal.html index 7067c7f3..def76353 100644 --- a/class_h_i_d_universal.html +++ b/class_h_i_d_universal.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HIDUniversal Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,14 +101,25 @@ Inheritance diagram for HIDUniversal:
    Inheritance graph
    - + + + + + +
    [legend]
    Collaboration diagram for HIDUniversal:
    Collaboration graph
    - + + + + + + +
    [legend]
    diff --git a/class_h_i_d_universal__coll__graph.map b/class_h_i_d_universal__coll__graph.map index 4588b823..659c6197 100644 --- a/class_h_i_d_universal__coll__graph.map +++ b/class_h_i_d_universal__coll__graph.map @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/class_h_i_d_universal__coll__graph.md5 b/class_h_i_d_universal__coll__graph.md5 index 370d1617..5c56aa71 100644 --- a/class_h_i_d_universal__coll__graph.md5 +++ b/class_h_i_d_universal__coll__graph.md5 @@ -1 +1 @@ -b5cef4f8f34c289be8a5e9593bd7b560 \ No newline at end of file +9798e993ef1d49a2c1f0b1530f49b8e4 \ No newline at end of file diff --git a/class_h_i_d_universal__coll__graph.png b/class_h_i_d_universal__coll__graph.png index 7b074476a29821ef26cdbdc7f1456e33732c66f0..90af5ab069f3c7f6524d0f4f0ffb4b5a5dfc7742 100644 GIT binary patch literal 15669 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 - - - - - + + + + + diff --git a/class_h_i_d_universal__inherit__graph.md5 b/class_h_i_d_universal__inherit__graph.md5 index 4f8c9fa1..2e820cab 100644 --- a/class_h_i_d_universal__inherit__graph.md5 +++ b/class_h_i_d_universal__inherit__graph.md5 @@ -1 +1 @@ -b9ffbf171d867d2aeb5470758673129e \ No newline at end of file +1ce1a5f9211e70eba63ba823d3663601 \ No newline at end of file diff --git a/class_h_i_d_universal__inherit__graph.png b/class_h_i_d_universal__inherit__graph.png index 5c4ffa994d0404e8aa83476e580ab929005877a6..c1f7f48e7d6b681d0594d9fbb1129c3e0bd6f915 100644 GIT binary patch literal 10413 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 I_3Fd_0=4~OuK)l5 literal 10751 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 Yf3_}0$|4u&=tNPFQI#&2eEs2n0UQXOVE_OC diff --git a/class_hex_dumper-members.html b/class_hex_dumper-members.html index 32e29571..8d952b32 100644 --- a/class_hex_dumper-members.html +++ b/class_hex_dumper-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -729,7 +741,7 @@ Additional Inherited Members

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_hex_dumper.html b/class_hex_dumper.html index bb050db2..b93b2e51 100644 --- a/class_hex_dumper.html +++ b/class_hex_dumper.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE > Class Template Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -117,7 +118,7 @@ Public Member Functions  

    Detailed Description

    -

    template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    +

    template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    class HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >

    @@ -222,7 +223,7 @@ template<class BASE_CLASS , class LEN_TYPE , class OFFSET_TYPE >
    diff --git a/class_hex_dumper__coll__graph.md5 b/class_hex_dumper__coll__graph.md5 index 8c6445be..c9f3f213 100644 --- a/class_hex_dumper__coll__graph.md5 +++ b/class_hex_dumper__coll__graph.md5 @@ -1 +1 @@ -6b19c97018ed43d19b0cb24ee29f2b87 \ No newline at end of file +5be5e99ec5970ed3fe98ca3cc812cd40 \ No newline at end of file diff --git a/class_hex_dumper__coll__graph.png b/class_hex_dumper__coll__graph.png index 4cca44df6be1986eff071f287cbf85b5e66e4744..f6ec58a4ef206f723e76e0987bd86c3c79c4f56e 100644 GIT binary patch literal 4817 zcmcgwhg(zMvW;{Rg&-a2f{IEL1nDL;L5dg4G3F zgwR0{5`##W`ZmA!zVF?8|A2e)B`3)~d!IS8X4b6P5qdi6=V>`;ArQ#Rc(i|)dV|cxq zC8c5RuREiW$U=;*k=cp>S@ZfZOgUtCkevb3~R zDDpbo5_z zv|H4al$5fQPR9&Ha80V5x5%YSmn>~;$m>mGZMtL6*32gF?A+~_IC;|lMc!{G+N{pK zEypwccW76a+RoPM!x}Hr{w0yEfC@ zM<5c7k;prJ{r$G)=H{}K5~I_N-o`DcBO@4$%x`N2`VfuywXxLavNl!!zIHH=-Z~kY zm!BV;l$gj?rQ@KSYu#WGJ~lR1Vp97w$nk@2wtZGsRIZfWnf_VUgo;K0$1Oy9J%FLjP#opFz5@rFLbdf zO3`Qi)5N5tTnvW$QJHC56LJ%8n&QAC+mM}^g?{*rGtOBUczKyf z>|2{{8Dz6@0W1IdHBl)$uHZ>vO6Xexhyu5#W@qyx^xF1gvB}`}P9|b= z>5<}HPp2C?4-XGhGc&m=YijJD*Js!{IMmh$Wc@GNzWHy(?2TuauZxOymzvbhkw~rt zeGSfZ%)XVQ#Ypam5=^ENCwk3GZ9kOF7AHBT=MN*imJb2{>GNo8Nbg8)Zr14Y@| z%+0WAs22gQe3*l>07|0-w z%*~RLd>Q0tTn{s};`IL?z1Bu1MDDkv-*dYDEIyLrv1HhUESA>4BYS#6&_?%8goqc{}I3HMS<>0s5!kB1Oby;pM6p0k< zx)#pXu|PHYIEY?xz01Vyth!s^;WL(*z>^a(uV1|1s_wr26=TK$ZCgO?4(gx3R7Z7k z?9JdG(4E%6G)yIXBoKUymYFZ(!M}3wzk#fl%m3fIL>ddTvf@k7ETH>zJYwvd+6xzY z*I80Zo!WH4mxjj~TjI#hSGXN`ES#iSH0IhV}D{_st-VLUMAPc6N4;M@)|5 zs+yad9&#{a1R|M?uHsC@?-9v&W3z}a)i(3&$4#s~_)EA6eX$oW$G zDlFT`a1#^Neg~QNMlcX_61|+9oR5!>xs9TTon%j*daBlSIt5EsJEkVo2=x$b_x6_t>!W@ zF`?tUO&1>@pDN|da)DdEDD49=v-+$Orl|(|Z2Yz{Rff zCFac>0|NtZGz-crD__^vO7Hxd5NHSpxWFY#5f~VF!>Akr)JOT}&tH1t1)!Xq*L^wV z_rDJvx%3w0%6k1`E3;^c?dVX+|L_4`YUoS`WoM57aG5swKwCe0cZ07gYHEb(E`e*XM9#b$R5XIOABMPg!N4hCcX;+-`!E9>I4 z_pIyqZJ({&yn_kG+L0FQK=V7ffPG0I62vT9ArR#!Pp-n?aNu1kG$Inz41Rg}OS@~+ z?IGt_-@JWGhDHQN?Ck6mm6l2sVLgf1HsF1TnA?o}B^h^!^LSYZNJo48e0vxr5xC^N z+bjn1GCZ87qoafO>eZreC@G5;v^Iq1+_~2Y2^VYJW@Cr))HxAKIn6D8+XO+G?T5li zdq=yo6|R%FA+1%8Bjs+hidT~~wKLyIyQ$gR3jy3-15cfT{_ulN=UYLo?|JHRhLdC+ znT%L0mUiFes(Apzq^@~gh~_Lcvv!t(Uuc0=3hlDAl2UT7ZK}8p)$s5z0|y6f+I_5j z<7qNwD+bUNSO2}}3Zxz+U0F)o`EM+C>oQp@$leFW#^}F|rKmG66A}{UekUd}{rLIQ zX0a>A-NWNGEVmV8o|Uun^(HOS1xn27)|jTPIUCgkEtE z0{PzT=S@LPEg&Pq7A-FCyG6s!&K@2W1^4%F8mOTgYV>vk%H!-#CLa((E=ovo0yQ%T zN?e7F`bQpNd7pI%5GCz3u9I&P6N9~HkkoEXe?n(mv+j6Mfh-z7bai!&+28loHp)^8 z94PQA(2r<)P3?R<{bH01zs8!w_4z@bn$>90gYfWh4JSJugdBN1eBF=AjjSn!N!$8JeclUDpnf3Yh__VaMNt%@4?q-c%&(I2BI4LQq zsH8;Y`E!Xv-E5I!3)hOzpMyX)FDx#`Cnr-$OG^Xw%7!p;b-gKZ>()GhKnpoFPA&El znt9_4IhAEcI5b^A7lB|BF>eZI6*X5bHH4!P3m-pWzJSo6b83<5OTO72aq-FnSRD^@B#fMm0i~p6t#@NN?tjGssF2MT7^LDKMdc!O2 z{zsrkOTJ-DMo&*aMC|D5`Z6>GH8wU5TFoRZi}G<5EZt1p$hC zF6z|^{6JNjqdIm^tmXap7!Gzw?J=Cv5Xjovno+eAbLa)G z;#!c3y3U(;IkF>9T~dEQHs|YJ-4i^Xui0;xCHlm7+O?K$9&jok`EwQ)7B5J6W~XWn zU_Y+G^CNa2M3~0Cdw2Eq89|s{Ztx1oQVfV(S$RT1MdkFAor#Ibl7z3;(9vO;+QN?O z{Bs|(SD>HLQM#iPKqG#M70?$5r^a#v{_-qGx zd3cO)B+^0x4t6@jcu?UVAANf6eDXaPe#+g;gW2?;F~Chup5nc}z1=B2>p!wa;`Fnv zVe6XtX=PB0|A$M+HCwNOd3p5P$G#>mq7_0W?fy zSYp)Xd9ZKV=ym>g^KKUQMF`Aly~xijT0z3(hRvFXuCA^NuKdiz#02m?Er=d5?=@49 z!PK>GvuovE+Nk|2%TJH$o-NMJ&%XjK9N*>3!6uU;A|mddo}IB=a$+txvAVjt71Off zVp`DhrHb9%vq}CWHw=L|IXO`*QojRnm{VA&<|cPjx8lV&;tF)-QyQ?~p`x!FvlQ>C;5yt-x=-HnA=z*3ZwRLkq&m(j{ z^(DBX?Qlo_8o*c0&Q6f(!lkRJ<^~1@QiNmAGPJBOg|8o*U-tOeST4|NfYW@|=g#>1 z`&X%9Hf=ZbA_S8(E1oT?0ewjc44_c3MsH83i}3B;ym#$Yz#bLko~n*Y J8O$>1e*hr6QI!Ay literal 5554 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 J8O$>1e*hr6QI!Ay literal 5554 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0

    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_keyboard_report_parser.html b/class_keyboard_report_parser.html index 5662f0d5..86420a84 100644 --- a/class_keyboard_report_parser.html +++ b/class_keyboard_report_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: KeyboardReportParser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,14 +100,18 @@ Inheritance diagram for KeyboardReportParser:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for KeyboardReportParser:
    Collaboration graph
    - + + + +
    [legend]
    diff --git a/class_keyboard_report_parser__coll__graph.map b/class_keyboard_report_parser__coll__graph.map index 69750bcd..27581ba7 100644 --- a/class_keyboard_report_parser__coll__graph.map +++ b/class_keyboard_report_parser__coll__graph.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/class_keyboard_report_parser__coll__graph.md5 b/class_keyboard_report_parser__coll__graph.md5 index dbd84d99..b3538af0 100644 --- a/class_keyboard_report_parser__coll__graph.md5 +++ b/class_keyboard_report_parser__coll__graph.md5 @@ -1 +1 @@ -de31ab1b6045c46c724624d2f45ecd22 \ No newline at end of file +bb7b1a74ec2625233c79c3d3448ef47a \ No newline at end of file diff --git a/class_keyboard_report_parser__coll__graph.png b/class_keyboard_report_parser__coll__graph.png index 87a9e3ee91529c228471ad7723b59446a124c15a..580a325ffb0a532dd987b15ac615f78b2acdc6b3 100644 GIT binary patch literal 8743 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 - + diff --git a/class_keyboard_report_parser__inherit__graph.md5 b/class_keyboard_report_parser__inherit__graph.md5 index 4f094571..5b9658e5 100644 --- a/class_keyboard_report_parser__inherit__graph.md5 +++ b/class_keyboard_report_parser__inherit__graph.md5 @@ -1 +1 @@ -ea9cb8a4a1aab693a56a91401236d24e \ No newline at end of file +c874e74f72d0db473ce869577e6f92d6 \ No newline at end of file diff --git a/class_keyboard_report_parser__inherit__graph.png b/class_keyboard_report_parser__inherit__graph.png index 969df5942eb82fdc3a6c3e35be36b3f7f400cda2..cdf473efa0c5a7c5127e316ef50c9c1f4d426969 100644 GIT binary patch literal 3437 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 diff --git a/class_m_a_x3421e-members.html b/class_m_a_x3421e-members.html index c4d5f703..001a8a17 100644 --- a/class_m_a_x3421e-members.html +++ b/class_m_a_x3421e-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -604,7 +609,7 @@ Protected Attributes

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_m_a_x3421e.html b/class_m_a_x3421e.html index eec06e85..2f6b8217 100644 --- a/class_m_a_x3421e.html +++ b/class_m_a_x3421e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: MAX3421e< SPI_SS, INTR > Class Template Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,8 @@ Inheritance diagram for MAX3421e< SPI_SS, INTR >:
    Inheritance graph
    - + +
    [legend]
    - + - + @@ -140,7 +142,7 @@ Public Member Functions

    @@ -115,10 +117,10 @@ Public Member Functions

    uint8_t * bytesRd (uint8_t reg, uint8_t nbytes, uint8_t *data_p)
     
    uint8_t gpioRd ()
     Reads the current GPI input values. More...
     Reads the current GPI input values. More...
     
    uint8_t gpioRdOutput ()
     Reads the current GPI output values. More...
     Reads the current GPI output values. More...
     
    uint16_t reset ()
     
     

    Detailed Description

    -

    template<typename SPI_SS, typename INTR>
    +

    template<typename SPI_SS, typename INTR>
    class MAX3421e< SPI_SS, INTR >

    @@ -248,7 +250,7 @@ template<typename SPI_SS , typename INTR >

    -

    Definition at line 275 of file usbhost.h.

    +

    Definition at line 269 of file usbhost.h.

    @@ -268,7 +270,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 284 of file usbhost.h.

    +

    Definition at line 278 of file usbhost.h.

    @@ -304,7 +306,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 323 of file usbhost.h.

    +

    Definition at line 317 of file usbhost.h.

    @@ -331,7 +333,7 @@ template<typename SPI_SS , typename INTR > -

    Definition at line 390 of file usbhost.h.

    +

    Definition at line 384 of file usbhost.h.

    @@ -358,7 +360,7 @@ template<typename SPI_SS , typename INTR > -

    Definition at line 403 of file usbhost.h.

    +

    Definition at line 397 of file usbhost.h.

    @@ -377,7 +379,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 414 of file usbhost.h.

    +

    Definition at line 408 of file usbhost.h.

    @@ -396,7 +398,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 428 of file usbhost.h.

    +

    Definition at line 422 of file usbhost.h.

    @@ -416,7 +418,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 465 of file usbhost.h.

    +

    Definition at line 459 of file usbhost.h.

    @@ -491,7 +493,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 509 of file usbhost.h.

    +

    Definition at line 503 of file usbhost.h.

    @@ -527,7 +529,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 563 of file usbhost.h.

    +

    Definition at line 557 of file usbhost.h.

    @@ -547,7 +549,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 544 of file usbhost.h.

    +

    Definition at line 538 of file usbhost.h.

    @@ -559,7 +561,7 @@ template<typename SPI_SS , typename INTR > diff --git a/class_m_a_x3421e__inherit__graph.map b/class_m_a_x3421e__inherit__graph.map index 39655a20..ef6587aa 100644 --- a/class_m_a_x3421e__inherit__graph.map +++ b/class_m_a_x3421e__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_m_a_x3421e__inherit__graph.md5 b/class_m_a_x3421e__inherit__graph.md5 index 9c6ebd2d..e9dc0389 100644 --- a/class_m_a_x3421e__inherit__graph.md5 +++ b/class_m_a_x3421e__inherit__graph.md5 @@ -1 +1 @@ -77bb5e0b002d7306a86fd50983493adb \ No newline at end of file +6b7dcdcf5b00fbf00c69a08de5fc301c \ No newline at end of file diff --git a/class_m_a_x3421e__inherit__graph.png b/class_m_a_x3421e__inherit__graph.png index f74258783786c7fac205bea7469b0bd78c5eac43..9d8cb8d8bb572b5be3e6c03820847da8683496c0 100644 GIT binary patch literal 4088 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 SuV^sJQ)%4OhE=LPe(^6w)h+M< literal 4677 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 diff --git a/class_max___l_c_d-members.html b/class_max___l_c_d-members.html index 8ff62221..c2da4d08 100644 --- a/class_max___l_c_d-members.html +++ b/class_max___l_c_d-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -116,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_max___l_c_d.html b/class_max___l_c_d.html index 5fca6a88..dbe9e03c 100644 --- a/class_max___l_c_d.html +++ b/class_max___l_c_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Max_LCD Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -587,7 +588,7 @@ Public Member Functions diff --git a/class_max___l_c_d__coll__graph.md5 b/class_max___l_c_d__coll__graph.md5 index 687ddba5..8d049f39 100644 --- a/class_max___l_c_d__coll__graph.md5 +++ b/class_max___l_c_d__coll__graph.md5 @@ -1 +1 @@ -25074a74d69adb1d486aa8133e08ae69 \ No newline at end of file +14cf14911886c71d7e91596c82a5010c \ No newline at end of file diff --git a/class_max___l_c_d__coll__graph.png b/class_max___l_c_d__coll__graph.png index 1ea31750984e61005c4e436039ca5c28c7785d69..400d52043a743927403b8a294a99de3f8545f83c 100644 GIT binary patch literal 1935 zcmbtVdsNcd7XD=xhT!9huQGLf0V-N**>cRxD9Q&SXbD=r%E-~Cag5Xq%~5%jS(=qG zWT`;v_)5`HBq|?pHB-cf%FNWP7<`P0lty-$xp%F5*Sdes-fKV3I%l1A);|0DHUo#n zK*1Zq002M_>__9ZF;00Li3+)9BiNZ|1>+9JzAmS@kc#wqE+FF}RCMEtku!t-UbH zLG&HbocGe=y$k7H-N~;fAn=G?tc@FZbc` z#d4*o?IXwT4mA-v15WX)STiZ2ED=qHhlh^{GaZ8uk6*m1Z|(+z!8Dk9KbIx8qe3$m zsCYM6US3v4tZv~?vrZrb0;+6{ka}pa&XrvMztSe`;!f+(=rOOgK#|xaVZ+t~SNf+7 zX!gDEP%A^5)%8G6&v?%f7$BMc5J|;u@Wg0*9>yZv=g$J^s~Qjkt+7T?b%7zdw~wdi zE>F*KxwkXL75Kr9QlLQ=DDS0<##ee-Lh(ad`b^|D#_C4@nh zZ>HDe5_MUbD;EsO?1w^18f@=hZEby+r@NsIbp^LD^b`7;hxfa)DzbwGBvo+U|NTUl zagi8)GTbhx={XguYqoPzZ~dObheb?NLz)CniYiBy8+}#DJi~G)j0t@sBQ{^YR0dfW zbvMIA+xiI>i6M{h)#2nY6BCof<_t1fqFg#T*1>OSX=!Y{+;0fL z_99FB3O9MrJ#WTTN*&;E%%QVaQG4&;d^0}ejn68T1O!ZK%Fnbi5V!yMjxzHsZad4y zHyuYLK9|Y5Y>ruQwZP`{BO2tNzpOHu%#ZWqm_uP#@#LGWk*=Eho_Hh*1uc3NyT!^c zE3)ojOh=kR#tQ{vJ<5`|Zz>ljHkSo+>CP$1$*xGGl~*sC^W1q^h3*A;urF9*L13JM~TUerak z0scJMX$nQHR_g#=Ti9&258JIG5Cj5gpC{^joW#$Jwe2%MR2i+n!8lKoSS*&73$&h3 zO8Hcq1BF6g7DT%>+`Wr%cLxF0;hD=Hrag~8xp?W42ZRt6wMpUAKedqjtTC>%j6fh% zuKMm%^^4Ym47|2)r<^$>%2?!fbogk7l=23pQYr53ef#z;kn{Nx0;sC0f|;9pZ`;Q9 zJLlu*=s3JlUKgcZmX@{GoSsstR4YqL`?_5Fm7sgUPA*7fd*;&bO$p+o9>h;~YHDhJ z0vWy%o^2Bd1VSM@`*dnn*2~1^h=>Sc-9etr@KOE7&w1)w!XG@%A_H>J#}HSr?beu@A09TMJL%beLdqXhaC UNZ)O(cESP&_F~cX0kOIN0z#RLaR2}S literal 2281 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 UNZ)O(cESP&_F~cX0kOIN0z#RLaR2}S literal 2281 zcmbW3c{JNy8pnV2T4LAM*4R_ywYK(sDWxSvsWdN2t+6#!T1Ba)p@P`Gtu3W$?WHilm_(yo6DLFlvphmSBGG%$eoPnZM@TbMHOpdG2%Xx!=!yo^#Wj94`yz0RU2JXKjgyCagU5vUj12;}SGR zC}NHB&$zA$^n5tw+`jA0DK^X_mul@alOSu&kp$JV($Pxg)`P=-*nGGkaLPHUHPNt0 zVOFG8sarW`QJMD#Obm8xRXO}bJjZX)v~bbM{lav_>+RL^ix&s!o`Ks-KB(8YX8mlG zo4DvH@?O@!^f9k$i9ABzvKEbnvV>AV$R$@g4mI5|1H2M4o<3JKKJrKO~T0*PcR zh0*e~@}WgdUEMi$(+PQHWysOd(GJ8Rd1oi`&4((ze{SSN=ft$5WwQfWu0&t1nb}#^ z(P3=K>{M4Qk8Jj3!z*Fo?PwqfjsDQx4eTErlp|Dqw2Q*$$R|tuY+xt-wdn+{kr2HH zad91v_ngO2-wnLjY<6SJb_kH@s(#7Nju(r?J{ww`W-?J)zmJYejK1XR$2f3Pt41nc(gH@83go_4E`h zEabF{1fZGRG#U*^?CG)eUGqCfu!^*{<}@`kV=$RqFA(VrhL35?7TNc6rj&t*ganRB zEx6HTuA_4rmJ3l)Q2~I=OBWT__GU!&-ZVF#E-x={&T@MlHkon2!NCClSDvUdbk8?n z(sd4Q6gnuDtwC>-^qM?4D=I3o9D6=Tsm0QY^-|N)9=fVWMyLiz-)vs!Y?p&VL$m_+ zHy2-(?X$u2q*48XQ!7O)86cJNCSEJl>12u$<_=E_UH?A;2i7=EykM)S;aM7=YO zd{Io(R6<;D1%TgvbC)5|*ccT$9K{pSsRbljeNE}_KQA;86yN^qGKHeQxoua0;Sdy* z`MW6tUBS|cKXT(r*^AMC)4_V?)Q(iaoT0xz{5{NBU-DD(__%?lq>^;u2s``?{c358 z_r86$&%5bSua(WUuAS~b`QK{2G&~wLO)XfIfJQqhyG!Q{S%ve`-?KMrXe&zjyl`fM zmbR}v;cG8wy>p-6zPjjq+2K}xy0<=m-y%v_D86^?eO=&NWPg)-sp)+O!@5U|t)?=w zgP+2}bZUaNi9x}OJ>7{T5s2j1x2I-?YOX?rgg!AyIO4q}Bwo_Rtu;hUKkP5585shO2M3rt0m4E; z&+F=_z9lzb;o!`%gZ_KQGS^&O6h!%QOG@x2QLEm4Su$iQm9#Ya!%CFux4ytdcF|{ zWh9fy7r+A7;;zw#rekYsl|df9{{Ebg9zALgXY@WV9?Z(hva0xc0ha5!ayKgKxLPkI z35zvcQKP1z&C9YwC)$dx*txiz?j?~lkZ*5vMyRZQ>%xN^{Fs!-^9HvxAFQlJd>>Y6 zX>Db&_cm>9Z42*xth&uud#@enZj#shVruxBZ(TBklVfXV2WDa-6&xH~TVLNgw#HyQ z+}(|ih>AL^py2a$FFGcscVa@y%*+gVU~FuhQ(BspmPU{L6$~pb`11_MfIs*SNI|+Y zv=W1$;9yI8`;3oAX=%J3oe{h|Ledv77_9+`gM>?@5;n$qka`*W2l&z z81k^H)FMGB#V5d1sublmJUm=jU_1xzdh7}3udJ>f&tS1;FV`Ye=jP_Ty}g0{{(ijfrZAyRBOQ+?feI3%)^66t$;!%tkh&kM z{W86}nspH; - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -105,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_mouse_report_parser.html b/class_mouse_report_parser.html index 3b8720ef..172cd8ef 100644 --- a/class_mouse_report_parser.html +++ b/class_mouse_report_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: MouseReportParser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,14 +99,17 @@ Inheritance diagram for MouseReportParser:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for MouseReportParser:
    Collaboration graph
    - + + +
    [legend]
    diff --git a/class_mouse_report_parser__coll__graph.map b/class_mouse_report_parser__coll__graph.map index 2d2572e1..fd308ae3 100644 --- a/class_mouse_report_parser__coll__graph.map +++ b/class_mouse_report_parser__coll__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/class_mouse_report_parser__coll__graph.md5 b/class_mouse_report_parser__coll__graph.md5 index f830f24d..0d410a43 100644 --- a/class_mouse_report_parser__coll__graph.md5 +++ b/class_mouse_report_parser__coll__graph.md5 @@ -1 +1 @@ -53fbe637398f71f4437285858e2dc022 \ No newline at end of file +405a7d8e938e10b74a7c678fcf2f2523 \ No newline at end of file diff --git a/class_mouse_report_parser__coll__graph.png b/class_mouse_report_parser__coll__graph.png index 0f34915de226de8f8267aeb98a1f540444607a6b..82ca8ea2cc5728ea1dd08cb5cfab45cf050613a8 100644 GIT binary patch literal 7185 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 literal 7225 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 D+4|yq diff --git a/class_mouse_report_parser__inherit__graph.map b/class_mouse_report_parser__inherit__graph.map index 2abdf8bc..10699d49 100644 --- a/class_mouse_report_parser__inherit__graph.map +++ b/class_mouse_report_parser__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_mouse_report_parser__inherit__graph.md5 b/class_mouse_report_parser__inherit__graph.md5 index 621cb958..6dbeddc2 100644 --- a/class_mouse_report_parser__inherit__graph.md5 +++ b/class_mouse_report_parser__inherit__graph.md5 @@ -1 +1 @@ -7e59901244ab319897b579870a1fbeaf \ No newline at end of file +06cbf9c7fbacf4aaec1bcdfdc9d69628 \ No newline at end of file diff --git a/class_mouse_report_parser__inherit__graph.png b/class_mouse_report_parser__inherit__graph.png index ea99e56c93d07a50a484d3067ecf1bdb2670121d..7881c6dfe0981015a7258549b993a6995cae44a4 100644 GIT binary patch literal 3166 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 literal 3570 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 Ph=Y&@X8NUiPLKW#cMcGG diff --git a/class_multi_byte_value_parser-members.html b/class_multi_byte_value_parser-members.html index 81c44c73..915006af 100644 --- a/class_multi_byte_value_parser-members.html +++ b/class_multi_byte_value_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -404,7 +408,7 @@ Protected Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_multi_byte_value_parser.html b/class_multi_byte_value_parser.html index a8845f3d..54c46c12 100644 --- a/class_multi_byte_value_parser.html +++ b/class_multi_byte_value_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: MultiByteValueParser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -106,7 +107,7 @@ Public Member Functions

    Detailed Description

    -

    Definition at line 35 of file parsetools.h.

    +

    Definition at line 40 of file parsetools.h.

    Constructor & Destructor Documentation

    @@ -129,7 +130,7 @@ Public Member Functions
    -

    Definition at line 42 of file parsetools.h.

    +

    Definition at line 47 of file parsetools.h.

    @@ -155,7 +156,7 @@ Public Member Functions
    -

    Definition at line 45 of file parsetools.h.

    +

    Definition at line 50 of file parsetools.h.

    @@ -181,7 +182,7 @@ Public Member Functions
    -

    Definition at line 49 of file parsetools.h.

    +

    Definition at line 54 of file parsetools.h.

    @@ -222,7 +223,7 @@ Public Member Functions diff --git a/class_p_l2303-members.html b/class_p_l2303-members.html index 5ff340c5..7086003f 100644 --- a/class_p_l2303-members.html +++ b/class_p_l2303-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -142,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_l2303.html b/class_p_l2303.html index 11fea741..4efafead 100644 --- a/class_p_l2303.html +++ b/class_p_l2303.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PL2303 Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,25 @@ Inheritance diagram for PL2303:
    Inheritance graph
    - + + + +
    [legend]
    Collaboration diagram for PL2303:
    Collaboration graph
    - + + + + + + + + +
    [legend]
    diff --git a/class_p_l2303__coll__graph.map b/class_p_l2303__coll__graph.map index 3043a7ed..37a260cf 100644 --- a/class_p_l2303__coll__graph.map +++ b/class_p_l2303__coll__graph.map @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/class_p_l2303__coll__graph.md5 b/class_p_l2303__coll__graph.md5 index 82068a93..3fccb2c3 100644 --- a/class_p_l2303__coll__graph.md5 +++ b/class_p_l2303__coll__graph.md5 @@ -1 +1 @@ -3158246e7ebbf9ad610bcf22883daab8 \ No newline at end of file +da3590f8b39ab5267484ef72f2899a2c \ No newline at end of file diff --git a/class_p_l2303__coll__graph.png b/class_p_l2303__coll__graph.png index 4c9fffe59c09b7f986d2ad0a67daddd717eccba3..07644dcb44ac676912dbe9bf2e3aece8007b521e 100644 GIT binary patch literal 20885 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%0A>QO3)92HWlMpKxacdgo(+5LW=}j_ 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ν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�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 Hx2V4Wl!^h6 diff --git a/class_p_l2303__inherit__graph.map b/class_p_l2303__inherit__graph.map index 3312ea75..82470977 100644 --- a/class_p_l2303__inherit__graph.map +++ b/class_p_l2303__inherit__graph.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/class_p_l2303__inherit__graph.md5 b/class_p_l2303__inherit__graph.md5 index fbefc7d1..8fff62d8 100644 --- a/class_p_l2303__inherit__graph.md5 +++ b/class_p_l2303__inherit__graph.md5 @@ -1 +1 @@ -24eddf3115f9a78b418b7d29835285a2 \ No newline at end of file +dd455d55317b48c08e2327d045dafb04 \ No newline at end of file diff --git a/class_p_l2303__inherit__graph.png b/class_p_l2303__inherit__graph.png index 2c50305699c34906ac85521bd67bf4ab6de7e3fb..455cd550d06bbf510dc35cf843aee5404b9289e0 100644 GIT binary patch literal 6847 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 literal 8255 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -299,7 +311,7 @@ Additional Inherited Members

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); moveSetRumble(uint8_t rumble)PS3BT onInit()PS3BTprotectedvirtual pBtdBluetoothServiceprotected - pFuncOnInitBluetoothServiceprotected + pFuncOnInitBluetoothServiceprotected printStatusString()PS3BT PS3BT(BTD *pBtd, uint8_t btadr5=0, uint8_t btadr4=0, uint8_t btadr3=0, uint8_t btadr2=0, uint8_t btadr1=0, uint8_t btadr0=0)PS3BT PS3ConnectedPS3BT @@ -135,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s3_b_t.html b/class_p_s3_b_t.html index d0d8b8ab..7910a7c9 100644 --- a/class_p_s3_b_t.html +++ b/class_p_s3_b_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3BT Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,14 +99,22 @@ Inheritance diagram for PS3BT:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for PS3BT:
    Collaboration graph
    - + + + + + + + +
    [legend]
    - - + + @@ -263,8 +272,7 @@ Additional Inherited Members

    @@ -193,8 +202,8 @@ Additional Inherited Members

    bool checkHciHandle (uint8_t *buf, uint16_t handle)
     
    - Protected Attributes inherited from BluetoothService
    void(* pFuncOnInit )(void)
     
    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
    -

    Constructor for the PS3BT class.

    -
    Parameters
    +

    Constructor for the PS3BT class.

    Parameters
    @@ -320,8 +328,7 @@ Additional Inherited Members

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    pBtdPointer to BTD class instance.
    btadr5,btadr4,btadr3,btadr2,btadr1,btadr0Pass your dongles Bluetooth address into the constructor, This will set BTD::my_bdaddr, so you don't have to plug in the dongle before pairing with your controller.
    bButtonEnum to read.
    @@ -348,8 +355,7 @@ Additional Inherited Members

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    bButtonEnum to read.
    @@ -374,8 +380,7 @@ Additional Inherited Members
    -

    Used to get the analog value from button presses.

    -
    Parameters
    +

    Used to get the analog value from button presses.

    Parameters
    aThe ButtonEnum to read. The supported buttons are: UP, RIGHT, DOWN, LEFT, L1, L2, R1, R2, TRIANGLE, CIRCLE, CROSS, SQUARE, and T.
    @@ -400,8 +405,7 @@ Additional Inherited Members
    -

    Used to read the analog joystick.

    -
    Parameters
    +

    Used to read the analog joystick.

    Parameters
    aLeftHatX, LeftHatY, RightHatX, and RightHatY.
    @@ -426,8 +430,7 @@ Additional Inherited Members
    -

    Used to read the sensors inside the Dualshock 3 and Move controller.

    -
    Parameters
    +

    Used to read the sensors inside the Dualshock 3 and Move controller.

    Parameters
    aThe Dualshock 3 has a 3-axis accelerometer and a 1-axis gyro inside. The Move controller has a 3-axis accelerometer, a 3-axis gyro, a 3-axis magnetometer and a temperature sensor inside.
    @@ -452,8 +455,7 @@ Additional Inherited Members
    -

    Use this to get Pitch and Roll calculated using the accelerometer.

    -
    Parameters
    +

    Use this to get Pitch and Roll calculated using the accelerometer.

    Parameters
    aEither Pitch or Roll.
    @@ -478,8 +480,7 @@ Additional Inherited Members
    -

    Read the sensors inside the Move controller.

    -
    Parameters
    +

    Read the sensors inside the Move controller.

    Parameters
    aaXmove, aYmove, aZmove, gXmove, gYmove, gZmove, mXmove, mYmove, and mXmove.
    @@ -504,8 +505,7 @@ Additional Inherited Members
    -

    Get the status from the controller.

    -
    Parameters
    +

    Get the status from the controller.

    Parameters
    cThe StatusEnum you want to read.
    @@ -547,8 +547,7 @@ Additional Inherited Members
    -

    Read the temperature from the Move controller.

    -
    Returns
    The temperature in degrees Celsius.
    +

    Read the temperature from the Move controller.

    Returns
    The temperature in degrees Celsius.

    Definition at line 141 of file PS3BT.cpp.

    @@ -603,8 +602,7 @@ Additional Inherited Members
    -

    Turn on rumble.

    -
    Parameters
    +

    Turn on rumble.

    Parameters
    modeEither RumbleHigh or RumbleLow.
    @@ -650,8 +648,7 @@ Additional Inherited Members
    -

    Turn on rumble using custom duration and power.

    -
    Parameters
    +

    Turn on rumble using custom duration and power.

    Parameters
    @@ -678,8 +675,7 @@ Additional Inherited Members
    rightDurationThe duration of the right/low rumble effect.
    rightPowerThe intensity of the right/low rumble effect.
    -

    Set LED value without using LEDEnum.

    -
    Parameters
    +

    Set LED value without using LEDEnum.

    Parameters
    valueSee: LEDEnum.
    @@ -729,8 +725,7 @@ Additional Inherited Members
    -

    Turn the specific LED off.

    -
    Parameters
    +

    Turn the specific LED off.

    Parameters
    aThe LEDEnum to turn off.
    @@ -754,8 +749,7 @@ Additional Inherited Members
    -

    Turn the specific LED on.

    -
    Parameters
    +

    Turn the specific LED on.

    Parameters
    aThe LEDEnum to turn on.
    @@ -779,8 +773,7 @@ Additional Inherited Members
    -

    Toggle the specific LED.

    -
    Parameters
    +

    Toggle the specific LED.

    Parameters
    aThe LEDEnum to toggle.
    @@ -820,8 +813,7 @@ Additional Inherited Members
    -

    Use this to set the Color using RGB values.

    -
    Parameters
    +

    Use this to set the Color using RGB values.

    Parameters
    r,g,bRGB value.
    @@ -845,8 +837,7 @@ Additional Inherited Members
    -

    Use this to set the color using the predefined colors in ColorsEnum.

    -
    Parameters
    +

    Use this to set the color using the predefined colors in ColorsEnum.

    Parameters
    colorThe desired color.
    @@ -870,8 +861,7 @@ Additional Inherited Members
    -

    Set the rumble value inside the Move controller.

    -
    Parameters
    +

    Set the rumble value inside the Move controller.

    Parameters
    rumbleThe desired value in the range from 64-255.
    @@ -929,8 +919,7 @@ Additional Inherited Members
    -

    Used to pass acldata to the services.

    -
    Parameters
    +

    Used to pass acldata to the services.

    Parameters
    ACLDataIncoming acldata.
    @@ -1082,7 +1071,7 @@ Additional Inherited Members diff --git a/class_p_s3_b_t__coll__graph.map b/class_p_s3_b_t__coll__graph.map index 63da0a89..25410a78 100644 --- a/class_p_s3_b_t__coll__graph.map +++ b/class_p_s3_b_t__coll__graph.map @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + diff --git a/class_p_s3_b_t__coll__graph.md5 b/class_p_s3_b_t__coll__graph.md5 index ed91eb65..9944a07a 100644 --- a/class_p_s3_b_t__coll__graph.md5 +++ b/class_p_s3_b_t__coll__graph.md5 @@ -1 +1 @@ -5301c89dcc5affb5b1bdbd34899da060 \ No newline at end of file +7cded78e6e9cacc4756734b2d8e3a17f \ No newline at end of file diff --git a/class_p_s3_b_t__coll__graph.png b/class_p_s3_b_t__coll__graph.png index 257b1f69a23f7dc93b95a546d3f03eebfe6c6700..22ebb4ffe219911d4dcf7c0ffb8801ee266bc35d 100644 GIT binary patch literal 15869 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 literal 15994 zcmd73by$_{x9^LE2nt9_3o0FoARSKWZltB9k)EVTN{C2_bW3-af^8Oc&bai`M7FF?P10J@}wU>o>P0FR5 zay&VuxwFmcYo>wwfgg$kO4W_mjwCe*6*m4bba-Yf)2ru3CR2R~E4X>n@Rnx*>*i6* zNf%3z0cqvqns}_s3e8P^_R5uIzahWfa&%4U5jVGUa}ZHoU7a~$Ls3ml z&97fVxl-gg3D>_X+1as;KPd>htZ#6@kGp>M|6F$$59K}4|GC)!hF{~mckfKBkI!<; zr)I4=iHL{-_;uV4@ckM`%PeA&dvZ0(k6qoRq=J%VH8o@N@+{TW)t4g1UemZmiU`JE z{~i|`8#`WZ#h@J^l-v=;!hj_xuVi45>gDxHNhv&e>4)cy;XEx8Y-~AgZ5cG=;reJs zf;%w|&TczHJ~rYpPFnyz!}|JqmE+cBGl`XfkrBN}XJ;qdvuE<&2gSxc=jZ3<78YHd zor|5(it6fF4~p{gy8HSRD!-Tw=i%4+w-F_oe9k~IH9kMyY0r+Pk&P$ib1vCMF)=YY z+M33~!jcsi7nhY)-M^X*WMO1vRLNBrMpLVGE)5RuYL8%8DTe{s&i?v{OCw`oU@$T= z;(ET*Vs}+lRYmmNNJ&YFmN=Tr*2vxcvMG=dCSO}!{j`lH0UJS2Pmf8?%W2Y=`sEAG zf&?QIlS_^N3^Gan?_gSnhdH>p)eGAwNJw}r#@H6FQ9XJj8bZ$Je(uDT#kc-L%{g@sX;5Ync3R=_wVQD4XUoPl(T&?$+F(Q zqza7{@Nn->m(I(}laY~$d0}ySaWs90Qdn4+!*b$nferdSd6YyPyX{)Lr-)Xs+gQ%~ z%kS2Pm;#d9J38*&ySGw`NRkti57%Vgnyfy$yf~u^P%pQPtFCtOB2dZKmPQ+`LE6qW zrzxz=wS?Tbaf3$sn~?kfOb#zEZ&r3Tez0VkLXsS9sMzvMxyAV5YIZ)o2qC&pdzc^^ zOmn8|eZ{?(xHG4;D5Z^aJLxiU#AIX}D=Wy;{gu#1qTga-7^b8pBw#2p-1hX8^Ill| zBSnTCaXgNwcOMAWOUe&ioE;%~r(oQ~w1fTq#V;u&NLU_QJTc$8@%@pG&h*!>4+4_EO^ifI zq!ADhkYcuUbOd52*R)aGzyEHfFU{NA8y38xq5`!G_0}zXJUm9t3hVAzF4%V3l{RU$ zwQkDF_>@A71jB=azrDz~Y*Ib0E}uMk0;iCI)A|jDeV9kX2z4v*U2jgcj zz4Q_48X7uvu9dK|vI+dkn^yYzdmH7`^kw-`EIOOBvs6(XbOFxi$Ay9qIj#So2+PA4 zOUufb>FAPTF18!7R>;usgrCsRIBreFwal@LdEqmt$l)DyaZJNdAJfoqTTIn&3UbBVNq*7%IYi>EmdZ-(7wOF|KY<2kE^rkM6;Bz@N zzc@XBoyPj~snfOq(}0?$=J~vE9GB_<*&*CKbEQ9HYqYp!dRnK_7|wl2NQg}XCNW!U zTN@o55_WcWetv#-_K1!J9E6>n-QPpwdc2*fm?0C#ZND{DdwF>YUx3BbZw}&e+I|y8 z;k?uxx4OEjR%}Ffl=^KtfZ~~+kQYDG-JApKD@7Fiq%B21omhgN+px+gPj4X6QGVQ= zr$a$`4kr(#6D-odylKrZ@Lqz9)B61e&TEIgMd>ohWk#@l_=UyAb30Cwk&L>9sC>2B z&CPQX67ET~bb*GPoSX&6D{;4nMX%XWQn=x{Z%)M3x-3aY_w{L|B)Sz`;U#8&&&iP% ztB^(Ga@RB~uNd{=y|ql=9b3s1)^>;T&YdG+s%PU1Zz<>L1Xb^oxOln8KNk)yHdY*E z7R8{Hy;kL&oZSBFmz48Gc(R!J`n@uSK18eHd*+$>HVsW?zs<;w1#$6F*?3<4^2Zxq zaA_Pp{rnDtD-Twzkd}{u)lGVQ>UWUni5Er1fr^TIbP{>XkHXsY_4A8ge^EiiUw>O4 zMx$tF=j3gT=SCYaQLFJeLb+2J}0}wY?X|jqnwS2NoVku3Cld)`$!&#btAXhoJvR8 zI0<>fXJhw{qOSMagwePV;Dz^3QiXCdWRG-o$nWI&`SI}>nmn4&K~KcsLb4jJ^d+F9 zI}~gAJ2V{f|94CFU#{c-U*7b}Kc}LkqPaw8Cbe0TxkWh-ZZN1MJwIQ-c2Nq9KW14xqKWyPTbOGPEY^fCwtSfz;oiU|KMbNmM_usbA$i0es z&7Uy+2BD26m#IXIkI(LQYFD=E1&2{Gtq=1BqFhiO4;TOC*|S{>9E1UDbbh`SoW7PA zJp#W*U4!fF?>+{9`V{|6U&JeZ#N)p>LMdIy_8Dv9SjDu7jI1nrTH5bmj!;oinVFg4 z@dIoha!TC1{&Rn&KQJ(mq<&#}nbT^Dw@D*6Dm3)xjP)2d0cC1p;v29&pFVvO5fORi zdzTBGpN2*vt?A}OCA>pM_v%3XlAgp&w@--+%WAT!X=zViPY=&+c6Qdz-oC%DZ|pQl zJ^i_RjHyq5c%+||E>cB%{%gbb=?eIaFJWQePQjy)kdu=W5)zV<<~SXVm74kZ_}sd6 zYiDQYd5skK%miUsa5Op`qIA*LDW# z+*2RMOpmM-b9?RS%^Vfm14;G6W#g&5g@lDmUDF>>3en=d7;YID_$zL9h7vq3SN{Cz zo%aW?@Z#AslU=4t&CQLCTHQw9sMwNbZ%}>apzYe-z%n<7P)w(bcq4SZxJE5O?ZJ!8 z{4qU!7W+ZTx$=vl34<(m@}a@Odk>zz*_my^6K2w?8tCZAhVSJD+tma`>CKOuyYa;B zjJvMT)UiENPnnc77xmrx<2Y&1bvHkOn1lpuct%M{xckb+#>MjQ6l%Zu9VZnP73sRB z8S6-9E$78fqSG`XsympNW$-F0LdV366nnf?do;DX(6QpUwz>-Y0VWWSW?kHp6 zOF*9N9~_+Ruk3ZO)YG1d3JGy?ajB`RyYIHq3=R%@2P3~{XS*D4&ro=rgC5HD!zAN& zJudk4NhT~9d_D|yCcplY+wGLC7RN$gzu02@MPH{)^2Bu$(`b`kb7S`#clGDXGvk+8 zo-i|a!xh`x=^s8!1Qqu4DHDrLYV@trF5+Lv+rzRwaXiMx#u*tI9J&qOpllZB=V`Gb zzkE?pQ&W?d-}&>?>zRJD`B+J2j#krkZmR>Cm6es5nVDXw_ta~hLDhhO z_R?g|prwZ!4h^YLh01y2!TCMKD?0^GumuU~(Si<{i4ztYy!B&DF( zT3?q^-|3N)9+J(@$^tELxG}E!`t<{H^6sTQcxPFhgu_zP+1Xi7FS)q*dG((4!Rny* z=dKtIhEq1nd59Y%#KdSB83zUjwF=(6gcApoDS-y=-_(Z7q@cUcDO%pLEGsK(fh$L4 zEo0-%qHZ5oxyD^$I5X&Uy8N#dZTgb=x)U#KdY4L+y*RO~)W~-)Jef9A>D$+@74QJp zZlG>E)%g3PHN9yM3J#8-DfQvCx3y(pWK6A|o15d~<7?7;S8h4^<;xe^zZP@x8@m~8 zn$Cyp?6pGumgN~xyBW)t6EbRQM3h30aoD-i4h{}@$+x=Wc=kK=TRw5|@bnLA*Eofe zzt5{_V}w)mUT=&p;B?F5D*Gi;T}355C8gMGm^oDJaa0Eb1A`$e5uXXHR)FlvWHpDz zo*Z+OY&5G+%Uo9+kLokQIgw>kI1roD^*YMRPr}+R&-Y|cabq-Ph|imeS)SiBLUat! z%Vs)UywExQNZ;L0J&Z=e5*^Sa#bu!Wdj6Y++_<`}OW9EbjZ~!uBY~)h2oA#c9!Z(| z#p%GnKq&-1nw1LAV1&Q)b|5rp4kj6%;Kf1rfr!A)QAXxdaPU1hMym$zJENnczP`SS z=~5qqgYg5KKysZfr-X#Jxa}{81_okGPQn&En)ax#bhvrlv$WLSi>&Xjwq-RCv$sEh z<7LPioqX5WcEF`E%PJ@2>?!fmpZFeN)DEq>O&^Lm(jwH8u6$ zU}}H)w`!i|j7Z{X+8mnV4M zXGdFmC$26oE(kPXc~I;sv1JW2)>BS%!PG2U>}+hBC2!@mwYBBt<>wsf0>-Kxw^GH! zmZKmJ2#BV|`G|vydxx^vs4E~im=C#|8Wk0#$KMB$rmc<5@@9B=IFm+MNpE-cR^1us zZdwn9`peU7A*yF=Y$au7i#twmn(eMSJEeGdc&aq+Gczp@W)DwRJ4P4}NQ%lA64bSS z`$k-;Nsf!FsG@SX(?S7iE?OJwiFfbS;2p}9m6clO11j^*MlkIVHeQTf9B`sL4)^Nv6sivn%P8CvYc`JAizI=F&Mr3MO@VQ1{0$V z6XSP_{)a0%Rfl!Dji@v<86d8~AY8zGZ`{VzEO_HNJBcN5UI2zBLpGtiv$MweV0C+@ z@#-MogN|4=c5NFBJ_H#fTnW4s)qR53Izu(N#a>!ZbPuC7HzMSXpJ6O)rGikPi|B=@^4vfYm+9pRCA9XB<_ z#oK%^2sO2|xJYF>_97KF4&5+0Oi&CTDv+wr_{8!W$>sp+zK%v0SDa>k z)uxk_k+HPllDG6U1(V=-vz*s0VMt3n8wNKuw zYo{h0C>xqs-aaklJWr!shLM0_DncR+%;x^~_S2_Nt?leIL2|&rliw|P z;DKfdDCP*CE-Eiicy8PcCk@|1MM=qZ|F`IM&mR*LuHeH1LNsce3PVFfXTQGJ+Z-4g z0uMPlHU;VgN=<%x^#?@nb~-)%Mpm2cwVH!&Tm+GcXxM~^%pN*czSy7 zmz1z#7_g3RPF6#vMoLO*%5|@+qJmRWvLkYdDQ%3`;v_pLAONn_H#i7374%%nC5H*z z7?c|b00xyD@SQ2QRTg-8!DYtBPeI}WpCU9o{MUkwzP|nwoVM@sDM3L&-$h&y^%sX4 z&!0bcaXEtpgmHGXw`a922vy$7$}|*-+baPz$E4^M|DsYv%!BSW7Ww*Mc9f4#69~F* z8lBgv@dVv$^=x zWyqQ#bM{ic7F?10%_uDq?7VlBcO zS?Ft4n=C;me>O8i`uk-gh5`+}so-wd2wGN~2(Kz1x}OK~O#Q!S$as%`*I(Mt|N3YU zEj2a&R3Y;`Otv|zqJX)zuZYL5F|>m&T8iK0@Di6Mva-5-4Krd4!JO1b74W4IW8nZ# z_`Zb1eME(;O#bimQ)=S#>PX4&6ZP?FEfI^_*$?q3cbE9^Z*1FfzR(t_6^SWO(c5El zs>?dFHi|4i?7R%1PeN@1nycGu;*0&yd5aqjB&*R-cQEewN$2RQ>n_Ftok=oagxs67sIoL2`Z z;`wvml+zF58V<#)eQ{@gs(79nZ@P~))haS<`PNYdT|Z#_Y*CY6bxP{14U)9y7GKcD zfs&>&1Es8nPvea1!QfdSL9hycnpex5vorTy@(JU$q35rB&BqGo%D;S}CkPy{yzZH_ zTd0_+q^+bhvv&3hiDVB{&V0QYVccRQ;N+|!MN4I67arcRR8eP~_o4ALuD!1|rbnfP zdU|%-KQwpq$1Of34SAA>vKoPnGv3}(ckad}`YS~Tq2G-?9#q}RNOdK8!1;`Nu_|h~ z`TcwU+gRwMOv((=(L~~DEb9%CVg@1P5#3)4RT(Xh3+ychyCg(2G>VbpZT@QpT~i|& zT%VqkmGq|XjD8Of3Q}MDF(^NM^`N!C><+r~+FlP$FG+l@bM(paK8?5CT6(#4(ow0| zTHTeqrHIJyig!HeQg?zw>d%Ur6Yq6)R>V9o}fkhf4fTr{;wybH=IkpzmDrVAB^x3?E1R0LaL8l!VmjS%hadBAF^^ zs!MC}c1!rKUvEy}Dc4)<)RnH|v3r}4;I8g;c^=??VXl(nPs+Z!=5?E8?!EGDm|FJH zgr23g1tlXR`Qb`dpZuPgm3IeH$3iAyBfXj}?%v$-hym)5F#3@0Djiiyw=321x~;F$ zBZGeVEeqCn{91O@&Gp~rZJJG2@MqaBEJToTZZCyC`sm6(JnZ{A*f;u&i@C;J-21@V7r5f%Y=j{w> zUOR1lx%op`S*vwA>jxIB&iX8qmOZNV7c|M~GtecAl|fN%FX6075w#|KNN4=B(TF!_io68(l1NV)@Qs248}I=}nnMHgSw zC@m%5RkB}QOMCaOyzXo>Bqv9YBH{AdwYl0F(otrKFefK-TDr`VQg*Exr_TAdc>Na3 zv-7==TC1}qLDTKbc|AzCT(9xlS01ES?-UGI8cneTy6WE4&%Z1^&J^OycQ)ml&jeRL z;Dd1lmv0Cr8GYrue|U66Bv4l$IjNB!CM5iXh=fEcc3EaxUU#k;*SI_N^5Tfl)jf*y z?)HA!ai@ZAeI`Nvt;{psXl4v#`?u88ob7D}HVH-voV%#11()#c`tmd8}heGEe9 zn6GSZdf04b)-y?vf(@g&F~Tf_PkyDSdmzC<*64fm6!pN9R~e(JDMH}Nm7VuIK!_@a z%XWk&A*i&J-4KMrc8`D>gw2yH{a3_n-wDS{1-qV6H)T%e>NY1QRlIt_EQofMCMRppoUSek-+qjU z*wL^;LfnvAQ)4t;7pSZ2!SANNvT12%F!0+?!t@>oM+`ity1K*BzEb~qS-G;X`(&XS zmXz~K47cfdd93}*Z~}QYqp*}SJ4u-oo+2}%oCH%G&GNC>KYy0%uevK-k|bLr+#+`vTy9ylmu^**9{f`^=z~!^?LMBeAgWeJZn|eHYK=NXD z98A&vg*6lw2Ay8{9gfytH8Q9Ufl#?RUF(14XL-69Go8S3_3_D|xcC7Xw`r2#%ZzXR~CwCn412eZmOuJ|l| z`7=pIp4*){kdNDE`sZ)`v7Fq8!)a9g`S9t}{uPeWm5i{y@fAo9KvoUnj%(Mh+1s;t zq^|vs={>T^PxlQ65HC|J;#weG5j)fu7#D#q&jWbFH(?<@%{{D)AWoC8ft289v-WS ziqK?QgufiE61l=}$f!$zn}EC@_DkK{p&cm7G|FNK)o-1d&W!Q4^^5ml?wN=-)rKKf2kDa5d zYfVOm@!zr8?92)WB(JWmtz5Pv)pc}w=5{tGkac<1>m$#qZk4@p(K%yxnp$lQ)hIbe zW)BTfhf&uO6CBcv`#kMwYVz5%wzci(>B*?3OWPxhsJ?amCsg5aadBM^*P#ru%%GZQ zT?x5mc=obt@}uZT3euIO8RN;NXDKpVs*|g_WGr{|o;b z6lNpZ3?N~)FA4cAY7IG}c@x!{O-n*z?xod1dt4gKk+O}>#Fvz7!xSE;`$XgR&#YGZ zo|%}OeEb+~PPmH`USrYNzh>zDd4J!ITaT2KG`xqQ%HxVZp{KmOoW>g_zI9>u>({T4 z-v|-7blRP7gP9B-Um484I0_zQpN-x(Z4@v1n~f@!2^9^Mw)ZQznvfO< zoRf7R2|hMjcXgR=A-$D8O1UNy^;C0E46}$u^aU2HY{bw z`?Ge@CCVD@cC$fbJSwz!)K8vNR#cde6nG|ozen-{vf@y6rDtGRgF!uj>hp(N7|Zge zrlycXfmj}5e=JhY#Qc06Ma5U;&vhGa3iCj5dgIqeS9w9fA0;OJFt3)=b$sR{Pdz-Y z7SjW3Dr%<_tAAehj}{xB9Uns}BrPqivbwte@0J_09~=}+D$}d#8p*?ySkW|nPq+hypfuck^+G`;3QByR#yZ}Ad14$ zIWr(2AcX%^>>>8om>3rAn%9g392{B}?fpeXtO5c8wzjq;BryOLz;68G+@B}IkgpNZ zHvdS}{i2!VM&0=?AH=%LCRxYp3cAydU7~rG8;yjltgM=vny*hXRrvGj%NX(>X4(uz zUpq~|J1zUZX=U~Cw~J!WPyOv{DoEZ-;E^8KXGx zxOzA*SJ7{hFg%v~%*2QPt`u8U2CR$H?S# zPsP?oLL~TAgLiNp4%UouiMjnY5Ca%bXk-<$3*>tk=jlpBwY5h*Z+MV%eQ8~? zb#wDOJqsx=d!bwXJzZG%NvRLm3iibJnZ>7)8Bp0 z=yi{XD3zCAy{s8LbzbRBiZSYOw}2pNB+thJ54pco9CI5TJgjrb^8b)9Ttl9JK2Wg*UHyxa} zF4nn?!X7o0guS`Idk`5Oj!*8sus*8f;!=DILpy=zh~2)Tf&S^Xn1qBSqCo;bcIBXF zv&AtbaC&MjM@7^{NUih(zyI%UA6_4s&@e?Da`z`xvs;^!2TNTfJ3B2?>FIHosbvJb zPIAk0#e1!xPo}2w;!a;WrUYC~MQ~V}ZSl{sZw0U}Kb)ttqbjYkv_IYFb9O%0aaWr_ zQtT}E81KAP)0VVAb)QJt<4?O)w?66#cN_+RCd*IM(LQ>xv*WnbgH>;5 z5)l|^Z(O2tTCh0K;MZ*x6Rh6YFfbTsc%&}@nUkOm`{|29+u@%{T&;?7_lNQ|(rDYq zUBP5mb@!C8)~SlV_Cfio_{C)F?ClmwG|Gz%HO#O2CU2TAG1u|{ zx5#Rqwa@m$)Ecch*$*Zmxp}>`j!v8*Vj^GW;=tsPV!=0(`-YKvWt~;tcyNn@ycY2; z-pJ2(`)qdh18r>`_tO}z}#yOmYwY5NZ55-SXudg@GusS>736s+(^K+_v*)y)xcC1^&+jCcB z3Njx!#Vk&I&wHzMNPIXqo-?$@TDH zyTfIg)k%|+`~}ve7VU$-gO=J+?jg~M-|wucq$!+i&*(@;vsz!AI*zj?=ft0GJl8dR zc@dtVd5`Iy~gwHFHa=XrCnx3uE{DkHT0)NF9{cMBU!8z z^V43Wo7y&-yt%oH$2Q&-!}ZFS6N}`+0wTO*Vjf0Hk(}t0S*6G^LO#8*x_zM{dJ8 zTl4%*z5Wicx9pfn@;8gSEB5T(kBatp{a!x3j~x zFdAIM-G5$al*-D=-q_CXn^Q(cM}vXa?ELx+>U@{G9V}|!$=R+A$tE$({-qc!TyCQH zHL6wFtpK3Fo%y);`fCB7JOm?wswtKeMx6qN7KNNz~d$-Cl7@P%MU=%1uW$N(#JEs@sQsRzp1GSfCdD^Fsa`$}vMh zRAFtPEgXRRi;Dv!fGz?LgBVPYR+InzN6VPZQ9N&cya%R{`RK{Gae(|fz#_G^P^U1_ z)9b5L{y_Z-ZoS>7mDb(eeb4u2u4hs%z-s@F_5GJ}#lNdz?8&|)0Sdy?lZQ{ydtmpY zXUW_FD7gcGiRL!m8@-JG&|F+zE@1sfuw|Tx-pN)wpXEdUR8FX}eN8FQ40bj5dl^YJ zZ(bMVseS$0sd)F`0Ml|ytw0Oo?c;TUTMxZItB3Bl<vK9AXC)?BgD8)^$F^I7?5Y!Bc#lyuq}YPvTDyQxcO&Woep zAl!X53?7S_X|2Zpi=rl(<(vRQOa|e%rFKi}&L+z(tubtm>apD=j^%7uO&#mn2IUna zT0T?<{Y>Uwv5I=UAGT^c$r#zigp;Jd94Her3u>|c-yz33_zAn=7gpWe$%0LD!hfb1 ze(^7aq~N%9INHq*u&BUGmGer7h@krQ?`!1<#=sPht^a3u>XG;VCYx&PG<)@6RDv-; z)cmKjIB$bAp(AITOw+xAeFeS6Ch>FW`9g_VylmKc=Rxs;J;a?s{Y65EEAc9szdZ9tHpTP_9NG0h69# zfZ!l4N+NAQGHXv1*#kSp9R*rE9E5_R;z|_Y0dQKBQucrc5B5PM={Y(7fl?nizw7JY z1F`}a-qY%;?>F4uN5Tzsw4gltPdK`Ql13}RNRY2yY6>CyKp>Bek}?OyaC{cP%f?6TKXCuJgdezG zo-6@nhW$|p9s#PE%#+0x6(g;!{@4nD7ZMYjT3K0{m;iYoj+U8~1%^Vs%FYBb8y`Qm z73el9C@8!zANjG!_C5>NQ=QegI~KU;z@}N?XmizyeK)!EexX%)bu3^$c>0i<+P7l? z;`&d-?Cs6X=|x4m#XbDl`T1Dr==6+?P_sS;@ckC&+ zrhD~ov~AC*6A@j4tEstpjX@g@!P>Q8uMIcoVE}RYKUtlB7Wz<;a$Na6D!3h9RYhv# zx$KjF`{%z9y#JB>gc9tZO33&{7Ytdxb}YlVCJo95+9k@4{+);VFYo_{YvKxz8x4uR zO$t#KnfE_G%M1A+^BcTIY%FP6_FIxy@r7yelPRlb5SkhR7Y1ehH`VA5U7@VSLr{)cBk4zO?PM3o`p5ynLPt`+(DEaS>=>%l;mNxonD?@aIOMtLf1v~<}7 zV6UXm+FD!xSaaqKgoTFwPBaF8CMPEco8sQxyAWX_5C~H!?qA$DmnQy>3VPCRW305H zp#i9o%(UOkM-n8A29?5^;^Jb#ha&)MOty@SIKdYJMh*@S-S?N}Z4G;c zwf{l$el|4do$M~`e}>Zjb3@j{GdD0?F&+M4z=?cXE zaqP+}D*TY$o2;^jC&(o-18W036aXj{)-y1(4M0@=0|5b=lXQFg=m-Rgtc1iVkorJ{ zm4gYPc6sq25PNsrsvfSv0Q3XQzMZeHkB=4%tGnA0<_Yp*3f?ARhP@Z{CyOx&?x!X# zpU7YV((;%19XDf>l4eM(YLXrtO6fF7V7K-m4oizcYwqM|3_Vk1B#Xmba# zLIUQW<_tO7)F>%oQ7=mlj`D^EL=_J||5Sg!;>qOcsWW+q<5D--=>kw~v2k%R>zTX+ zT0Lo!QM3VH+6=t0tDxT@RRQ$CEPx@y+($qbX*nu0GZQ3@^r3ld22f7zrLd!+Z$gMZqK|LE z<^-sWjrDbP=9Id+c=Eq+Fl6v@va(i(a!DqOW^v)Jfc+Bpgf&~#*{M8|9lTw3^pfep zzcZcRe`+XXhGXv@@8}CtU|?VfV+RURITvgF1Tdy$4l-=NSpYwQdwg3Ttq4M;c`lE~ z4#~oj61JvltC}5DEm;i1<>lpGvVS4JAnj$-0Z?l|%-7V^RNAs5jd(UW+g8OliU1ge z!Rg>deu;^xhIr{8p(fc>ot~cV{TTq>%H(7!Ha4Z-SJ2Ax8m^fl8Uk)*8VDN-_hZjZ zp#Ox?e*gX*4V*Q2LkEXLFza>4vw=V;vW+StbEv_p{$)*o^96g|*4|#_u%Rv|*PEkO ztj_#O7j_tMpN}6K0IG6t3a~6l#!bQ{fKZ;>+R7hcI_rD!GPkfu<*s^2$-67MsE&i} zZ80gSRPBk*=^A7)tVURvA~@t^V`1SYQ3|)m*l3+yU4$&!j0A!I7u;FC*52L@)&xGW zFgL$`+NPF zeA2Hb=oJGF9%Lz$4Ue`6u@QRuRz;v->7liR(i?ipUWxiiq9L~v|I9Sfu#k}_KKthb zArWfv$2JJGgdQH`F2VT1dl6{B_&hLB(-I^{T^gk@}ME8x@6x+G+r#NC`A-H zKy1n+{`V(&Kb!e;b8=3%>Yu;Pyv+t#v?{ibLJsS%i*}p&gL{_9d3;mOdtbom?E`ZA zA;B>FCQC%SYm&r|ICm$ln0su!Z6%tuKAc z9U*@ciEi=XEJ-jb^6OXV`Vn`Wt_Z~?I9$5CprD^R*e=)_?1)Y46Wsgb?$(=jk76@* zIh_^TX+6H`zEHay!kLnFFg?132ujKu&rrIb<|AG zkKf61l)JC=nI9x-qz{SC7 zaJaK!2OVcD_2*wU=o4}OuY~%S`5_ItZt)yeQMeqg4J@Ug;Cn!MDO1za7lGD68zp4P)07dNhziJuub-#4X3lR1I3<4_*LLFF7Y(%QU3Xql1j0jzS zlarIs3J9|h5kpT$cd}W%g?ROf14;lk^Q~a;a1iJi7#9~8E0zfV!op`RxcAl}#C=Qo z7hwfd*wz*bEQyJUAhA?bRdErQr)&Abfdo*M`1B_1qX6+hII=YY8$xu*&atOSDm`8hdM!`?PK>IhxRze!p@x;5;fED2n z-WE!3F#F5p&<_Akb$Juu*>Wi8c6CWV#FmQVR)z))%Yc@-J2$T@<70lieI@e}14?^C z0|Rn+%G%m>R@3}YQUFpC7xBT%s~rAmF;=3g<7U78=O-*~VOd$aD2OZ!N+IT`K%wO0 zV<%8qsL~OUk>tEi)&N|aOXGbPn5TQ21k`FDnJfSFn$!TJA@y>NLB#Tu6MrxqYd124UBVvHx454%zWz=VG(p5>bRdgVPsr~Q02Pk8>sW_ zE%jtfqu;%I4#Yt**zv;G>nkfnq@+?u@XFu;7XtDaM4W%H+gnUf@x)$rS1V8z9A!?8 zTRuCOAl1pY2Knfu!_uRyXxTKiV8uCZ~;+)mxeB1svBi2(R} p_&~;cEd>RVCl~)!gW)CCsM8PJ&lm^Q&`gdZE-WLIhj{bhe*ym^rR)Fz diff --git a/class_p_s3_b_t__inherit__graph.map b/class_p_s3_b_t__inherit__graph.map index 66a5329e..94a99870 100644 --- a/class_p_s3_b_t__inherit__graph.map +++ b/class_p_s3_b_t__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_p_s3_b_t__inherit__graph.md5 b/class_p_s3_b_t__inherit__graph.md5 index 12c7deaf..c4a47a9b 100644 --- a/class_p_s3_b_t__inherit__graph.md5 +++ b/class_p_s3_b_t__inherit__graph.md5 @@ -1 +1 @@ -06c1c66f64f4c39618a1d5ab9446b806 \ No newline at end of file +af123ea0ba1b2bc2c3a6775f7cb65fa0 \ No newline at end of file diff --git a/class_p_s3_b_t__inherit__graph.png b/class_p_s3_b_t__inherit__graph.png index a176f53e00c361eece0940c9a23b280d5354d89e..e425f8951b13dd451dbdf5fab668099bca365d03 100644 GIT binary patch literal 2547 zcmcImdpOkV7XF3FwMj^G&`|8rMJ`FXi%2e^iP>X@T&A{?T#8)EeIrQ|lUtg>))-@Q zXWW&j!C;adxvOC&xony-OqBC$Kj)l3&U5}f@ArJ)dcNs~eh%}!qjTWetZ=PGQY5CA~3)Xv({HR9wH-;Gdt_Tz5?pMwg%1v!=i+l=Hd2qRGsGc@&oVdE)L_rYNx4TOqBblE@05ue7JQa~GU+{*c-4w7v!J?u#9mn-;G1YbVK4hgA#?dx+?SuDxrkb+dwpI@fm45jVU z`LeJuNs>z#;Bi^XN=gChQ-Y+&_T-kYmWBv*^+ZKW-oM@K=p^aN;OHHdxTI$tYFAD5 z;*_Tpz1WhQVkw=Hl9GE;t<}}l9r|#oI$;^_DJ3QM)6yCOCqehhva-P|GaVcbhs<~Q zlze^E%ZMbApeFGu;AD7sc+iI`OAR@_{Ndvnd3n^KdALQ)^O1$=)<^=8cr4@G2Pgj! z*^^+vn63kL$D`V&7>pEpDk>RMkJge))i`)Cfx({Ra0dGN-cCKZT;0@URE<{o8(NBK zTn@*hYl$Wb1Wq>Zg~K1RBap~UOgVyWZf*{``j~bz7dHCX5h1;67X%Q4K+Zcly10cJ zPkvil&_p0gW6mQky1Toh(Xbq5`Sa(YlQq)aX?y4yzw|q!XknqDu1B&E8X8(P_HJ%& zSS;4Tf!PxNmm}h0WTeqX=tQAF8kl)Uc8HFS_WT=WW@b4$Ubpu&R6>EP{{H^guPdvn zI-ft^&thpNip0-!rOLBNX8KC$X?72uwY9a?))Lh2@%j9*G0c%mSZqF#*w0=q?an&- zE6F^1?A^O})6>rV5N*s4kpS|s7}L>L?A53{cc|y4=j>g5{X_=5Ug?vCNo=uqLDw1({CulU{yi#ox0=i zb@n^geJNP8K5k?*&*gHB^)QnqB_*@7mlM=7Gc%i8TCQE82aNh!ke=2riX?M2fjB2h z%k3phK!Db<_FLS6-d_8}4qaW{M>#pRuboMzky{%f>1S)JstQrG+M1f~2p5+}XN!yO zr&=GZMw=f0iGzx1RGyt*2qw%=LQI5=6n^X!C-j`q)eRObj!w3Ow>Uj`(;mH9LZQ%T zw2=x=CYN^&i{Ed8LZd%SPg@unxx2dZZH~q6#9s5#vw(<+sTc;&ER8qRg=b^Ro$T#j zg_xR}ww9D6-^XexHhIAJ?{AA*`;wcRo3dLqa}`YKttOAM+`+3_T3Q;c1u1Fi8~89N zyY9=&o(TWIK=aVgvUo;k$lalm^AHHcm^cvTD=?WAERCx`DO74t`}d@zB=BqAzIB1) zH3>Z)4T~b1tG|yfhm(q>Ml-J*rFKdEEKS26Mb@W{^#bXmH1(kMCD zqO-G8`BdN*wp(x}$ksNcp+WSPOMFPvwm<;AY?4k!y1LHtqkb1(Vd?}84F$nX1eMI3 zq0xaPJJTC6{sD`K?I(`#u$)%g$m4lhc=-2yfUbeTI)7d@fYPY}pQF~h@wf#%00;_l z!m%CbLq2l&ug{Qed;tdl`hH{LEd;Q1=>Wej7>RxD_U(_9f~bDZixRRhlE<>x9tgCT z`D8>QnO+ztnRvrWkYUxiyK5sJYG#$CbqcpVs}_U_tI ze`O7cmD$uM<&Se;pD{Iy;`jQr7ImC~M#DeNcO+`lvSNH*``7>Yw$L&-co>EBRdinA zf9(8|nUe_BiHnT%vDjM4-@NFn0zQ9VpB&IeKItD$PTp=jMZB^@Kw|@d_i^`j;hO>s zk?4tT8yjaXR5r|%xsg_s%$A~zfSK{2wDwJH?#p;Xy1b8^v*Gf0`O~BsATmL8RucM1 z)A0XyIk&N>F9!2#icR0cXo!du9`o9)^U@97t+n-68H#3*-_KPCt=6B<^ zq|lqHxcJjAQ6mmTZEeJ?n8B_8DwLz^r>-E8$ZiN6-*A1TA|XK}HZ~TB>+mk6(H1^` z-q=`Wm$}jCLDQt{Y&wns1y1|<`FVO0&laz)ujBD}7L%#28t7n<<0h5ABBL<|m38t2`coIk#+I@DDINe>_OB`xF!& zS$cU*PyB>Of?9HNGN`mVms$^H*;6s)<>j@twf5w%U*6MB1x^$u%qCo_{FUl@vuQ%0 z*7VhVkmSKyf+gEnTR$}pJEE^op!bZ7oC4+kZh-zS?VO`>si3;#I))14gJO)MzlCD4 zp|%0>CGajuEr-$Tt1o4c=Kj?qDg)qcZMQIp-}cp*|@qszEgYY$k8ZM zBMnVWN_F)G1Ob#d@tr#n2t;;vc4mGifuQ5jxboxsW?WocS65eNrd*k#fd!c2*IivM zZr(m~Q8#bDW%Gmr&6^r@?&q{?{;LqQcsqN_LjHerg7*^dqKyp%>#38}-foUszKZL( zXk}%ELS?@enY(olA`9%kf6 literal 3215 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 diff --git a/class_p_s3_u_s_b-members.html b/class_p_s3_u_s_b-members.html index 8fc48ff6..61040b73 100644 --- a/class_p_s3_u_s_b-members.html +++ b/class_p_s3_u_s_b-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -138,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s3_u_s_b.html b/class_p_s3_u_s_b.html index 1418b7b6..bc96d000 100644 --- a/class_p_s3_u_s_b.html +++ b/class_p_s3_u_s_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3USB Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,14 +100,19 @@ Inheritance diagram for PS3USB:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for PS3USB:
    Collaboration graph
    - + + + + +
    [legend]

    @@ -267,8 +273,7 @@ Protected Attributes

    -

    Constructor for the PS3USB class.

    -
    Parameters
    +

    Constructor for the PS3USB class.

    Parameters
    @@ -318,8 +323,7 @@ Protected Attributes
    pUsbPointer to USB class instance.
    btadr5,btadr4,btadr3,btadr2,btadr1,btadr0Pass your dongles Bluetooth address into the constructor, so you are able to pair the controller with a Bluetooth dongle.
    -

    Initialize the PS3 Controller.

    -
    Parameters
    +

    Initialize the PS3 Controller.

    Parameters
    @@ -355,8 +359,7 @@ Protected Attributes
    parentHub number.
    portPort number on the hub.
    -

    Release the USB device.

    -
    Returns
    0 on success.
    +

    Release the USB device.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -384,8 +387,7 @@ Protected Attributes
    -

    Poll the USB Input endpoins and run the state machines.

    -
    Returns
    0 on success.
    +

    Poll the USB Input endpoins and run the state machines.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -413,8 +415,7 @@ Protected Attributes
    -

    Get the device address.

    -
    Returns
    The device address.
    +

    Get the device address.

    Returns
    The device address.

    Reimplemented from USBDeviceConfig.

    @@ -442,8 +443,7 @@ Protected Attributes
    -

    Used to check if the controller has been initialized.

    -
    Returns
    True if it's ready.
    +

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.

    Definition at line 92 of file PS3USB.h.

    @@ -480,8 +480,7 @@ Protected Attributes
    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    @@ -509,8 +508,7 @@ Protected Attributes
    vidThe device's VID.
    pidThe device's PID.
    -

    Used to set the Bluetooth address inside the Dualshock 3 and Navigation controller. Set using LSB first.

    -
    Parameters
    +

    Used to set the Bluetooth address inside the Dualshock 3 and Navigation controller. Set using LSB first.

    Parameters
    bdaddrYour dongles Bluetooth address.
    @@ -534,8 +532,7 @@ Protected Attributes
    -

    Used to get the Bluetooth address inside the Dualshock 3 and Navigation controller. Will return LSB first.

    -
    Parameters
    +

    Used to get the Bluetooth address inside the Dualshock 3 and Navigation controller. Will return LSB first.

    Parameters
    bdaddrYour dongles Bluetooth address.
    @@ -559,8 +556,7 @@ Protected Attributes
    -

    Used to set the Bluetooth address inside the Move controller. Set using LSB first.

    -
    Parameters
    +

    Used to set the Bluetooth address inside the Move controller. Set using LSB first.

    Parameters
    bdaddrYour dongles Bluetooth address.
    @@ -584,8 +580,7 @@ Protected Attributes
    -

    Used to get the Bluetooth address inside the Move controller. Will return LSB first.

    -
    Parameters
    +

    Used to get the Bluetooth address inside the Move controller. Will return LSB first.

    Parameters
    bdaddrYour dongles Bluetooth address.
    @@ -609,8 +604,7 @@ Protected Attributes
    -

    Used to get the calibration data inside the Move controller.

    -
    Parameters
    +

    Used to get the calibration data inside the Move controller.

    Parameters
    dataBuffer to store data in. Must be at least 147 bytes
    @@ -636,8 +630,7 @@ Protected Attributes

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    bButtonEnum to read.
    @@ -664,8 +657,7 @@ Protected Attributes

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    bButtonEnum to read.
    @@ -690,8 +682,7 @@ Protected Attributes
    -

    Used to get the analog value from button presses.

    -
    Parameters
    +

    Used to get the analog value from button presses.

    Parameters
    aThe ButtonEnum to read. The supported buttons are: UP, RIGHT, DOWN, LEFT, L1, L2, R1, R2, TRIANGLE, CIRCLE, CROSS, SQUARE, and T.
    @@ -716,8 +707,7 @@ Protected Attributes
    -

    Used to read the analog joystick.

    -
    Parameters
    +

    Used to read the analog joystick.

    Parameters
    aLeftHatX, LeftHatY, RightHatX, and RightHatY.
    @@ -742,8 +732,7 @@ Protected Attributes
    -

    Used to read the sensors inside the Dualshock 3 controller.

    -
    Parameters
    +

    Used to read the sensors inside the Dualshock 3 controller.

    Parameters
    aThe Dualshock 3 has a 3-axis accelerometer and a 1-axis gyro inside.
    @@ -768,8 +757,7 @@ Protected Attributes
    -

    Use this to get Pitch and Roll calculated using the accelerometer.

    -
    Parameters
    +

    Use this to get Pitch and Roll calculated using the accelerometer.

    Parameters
    aEither Pitch or Roll.
    @@ -794,8 +782,7 @@ Protected Attributes
    -

    Get the StatusEnum from the controller.

    -
    Parameters
    +

    Get the StatusEnum from the controller.

    Parameters
    cThe StatusEnum you want to read.
    @@ -874,8 +861,7 @@ Protected Attributes
    -

    Turn on rumble.

    -
    Parameters
    +

    Turn on rumble.

    Parameters
    modeEither RumbleHigh or RumbleLow.
    @@ -921,8 +907,7 @@ Protected Attributes
    -

    Turn on rumble using custom duration and power.

    -
    Parameters
    +

    Turn on rumble using custom duration and power.

    Parameters
    @@ -949,8 +934,7 @@ Protected Attributes
    rightDurationThe duration of the right/low rumble effect.
    rightPowerThe intensity of the right/low rumble effect.
    -

    Set LED value without using the LEDEnum.

    -
    Parameters
    +

    Set LED value without using the LEDEnum.

    Parameters
    valueSee: LEDEnum.
    @@ -1000,8 +984,7 @@ Protected Attributes
    -

    Turn the specific LEDEnum off.

    -
    Parameters
    +

    Turn the specific LEDEnum off.

    Parameters
    aThe LEDEnum to turn off.
    @@ -1025,8 +1008,7 @@ Protected Attributes
    -

    Turn the specific LEDEnum on.

    -
    Parameters
    +

    Turn the specific LEDEnum on.

    Parameters
    aThe LEDEnum to turn on.
    @@ -1050,8 +1032,7 @@ Protected Attributes
    -

    Toggle the specific LEDEnum.

    -
    Parameters
    +

    Toggle the specific LEDEnum.

    Parameters
    aThe LEDEnum to toggle.
    @@ -1091,8 +1072,7 @@ Protected Attributes
    -

    Use this to set the Color using RGB values.

    -
    Parameters
    +

    Use this to set the Color using RGB values.

    Parameters
    r,g,bRGB value.
    @@ -1116,8 +1096,7 @@ Protected Attributes
    -

    Use this to set the color using the predefined colors in ColorsEnum.

    -
    Parameters
    +

    Use this to set the color using the predefined colors in ColorsEnum.

    Parameters
    colorThe desired color.
    @@ -1141,8 +1120,7 @@ Protected Attributes
    -

    Set the rumble value inside the Move controller.

    -
    Parameters
    +

    Set the rumble value inside the Move controller.

    Parameters
    rumbleThe desired value in the range from 64-255.
    @@ -1174,8 +1152,7 @@ Protected Attributes
    -

    Used to call your own function when the controller is successfully initialized.

    -
    Parameters
    +

    Used to call your own function when the controller is successfully initialized.

    Parameters
    funcOnInitFunction to call.
    @@ -1310,7 +1287,7 @@ Protected Attributes diff --git a/class_p_s3_u_s_b__coll__graph.map b/class_p_s3_u_s_b__coll__graph.map index 2ccd7cf3..3e75fdd3 100644 --- a/class_p_s3_u_s_b__coll__graph.map +++ b/class_p_s3_u_s_b__coll__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/class_p_s3_u_s_b__coll__graph.md5 b/class_p_s3_u_s_b__coll__graph.md5 index 4a94ee41..1aae81d3 100644 --- a/class_p_s3_u_s_b__coll__graph.md5 +++ b/class_p_s3_u_s_b__coll__graph.md5 @@ -1 +1 @@ -9e8c5435724f7c7e70dfbe754d4e9919 \ No newline at end of file +06f5f28fefcd0973f7f3cf5ab5f01033 \ No newline at end of file diff --git a/class_p_s3_u_s_b__coll__graph.png b/class_p_s3_u_s_b__coll__graph.png index ba028929f8abf1af7bba3b77c8d56b173938b456..3def64559bee092572a2fa11125e156ef14a2a23 100644 GIT binary patch literal 9233 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 literal 10325 zcmd6Nbx@Vj`{$)YQo2JxQaVMD6p@zh5RevWxO6uND4;X~%B8!dyW`Sb(n$9nzB|92 z-JRW;{c|rf@DBHV&wJuI&+~~BuA=k?81&F-GA&ac&HO<&59p6jQa%?(0=#JEJxN4(BrdSBqfqz zvM|;EgoHt!lOTPRk4Sz&np}`GinkV!eA$c4T0C8QCP! zIsbDRAOJ_eyAO+r>B^D{t;NZCr`HS>-W*72cOgxC%E*>o+0!GJo11GqU+btJI>xwA z>xdK|AD;+ImFSJA?5%ZN!y_Z>bs;qvo3C@K!^wJ|BlbU<{-53gF0(Ze{UJCwI3IV| z3Vd(omT2+Nc>}*&>gxWMU0RfVMfdOdu&Drxz zWdGMAdy?v*Ux-v2U@-REtE~*oxroR}$NkwV*&CiNJZfqj3JMBoX=&z00n-k2m{ALL zb8|B@3kw1y@$1*swOH}4uN-Q(I!x64Th&DEmZ}N?ucX zKTjcLY}SzSq_e)qIOD&6^m?*8RDf_|(+jN7r4^6egyo0aZ3|M95T; z9@>*9Pmqz3doE^Le8rX0M1tSvE75UqU=tG)UoHpYu9v{4rc4(bJ($_p-ZOjM-(L0f z_O?zIYQ@LJ`L(r4LQhBEK>W(fd4fVhOs`M>x}Wdqnt!$6xjEs)P zA3AOH5wYu(Bj>z{4XLXWhI)I)Cnq!edV~2U<+X^CtTQbmCE+yesJ5G1-rh!k`SPXh zTs8LAa0VKLkdScsV#(LxUvb1o^k>p<4-O6n78aTm4-x*Tsi|o%HG9t#>D7>$MI|LB za(R1upYP4^qWXnP(|3`Y@uWmyQwqgVi8zOGcTI<2Q%uLvNu{#8E!4YUL7re?*`7~7 z4G-Gb+$`59)GYfup3mDw`qE{G(8<-+LPJ9Xv-_(Yg95`-?lNt5-vc&gnfkJ z(y)~bY>4a4xt*q=;o?WD$aDRrZ*mOL#?P&v6Jm0Eo!d&w%9>stt%OBKcTzYsBAA(( z1>e~(Hio~6r8WUQg!t)HSkN&uqxbgql8QJNK*hUA50+YRvsA(o6B8|B8!U&ZFK=$z z|NMct9n4F(x(aB*wEZJVI3<;pOH`xI&(9${-=Pn;TjKcC)G-Oqm04Y4+Cy<2KEKSV zWo3mxl9G}Nii(n2wz_G2JC<7mkHIuE zFfbT*gyGAlWymogn!!dT)x#PZMA`)R?NB46>6zl?lEGRxxbBnhj^?2C4-Y$>)&~cp z-2Ch3BuZ5+)GDz6J6M4!fxC;ee{j%TR#ujsfguPi6p0bEbzpFCrowV~y&L*)cd?h`7g@%;CKqT;;?Kw2n235>K$rYI&NssWYo2K-$ zbU~DFoJKL+W?g><1{7A#jC`(8z~|`b$j{&3AF5OPiB6gx-+rkXyNmQIrxA{&rR7z= zm(3K+|1n6R&~@{-Kh?m-qUGl&ilq_nT5R&-_PKSJWB4NL_KH3p9gI!V%8Et6ZZ^nn zu3AD_8JC5H<(~|ha)wwZSQK&&X_tcGh>rsx?UeaG_`tNwvPW%JR#rYaI$9-m$i`4& zfJg^fhL(i|!_m=EPF_CXtLEK<4iy#E<5t|8E=zvpC15d}9*u;CW84`*1Rj*o(II0} z`VlrVGD2+jPDx2tLxYHzU3+AkKTq1p{`T@%(Ozq_Nm>|DRx5$|?-d~vpG=hJ$eA7f ztA!A}HrzxQI$h)I-Uz(5C;#V5KIX*Ax3aRRl9G~-8N9Ej$FHb}18(B1n+OXVgB2Bl zs0!Zb|K>y$q2_s!js;=nXliq0==(0@NDrrT*5wOGbAD@X&hLIU8I6aIET@DM?k&V>yT%520$nA|r)GLMrM<>X%vDMvJnY-1au-nubM zJ_Hi1NfNB)muGNwQ7_F_7wz0YW}WyKTYEDM5KgfQWxoo`2U~l$HiE|{2&mE^DSIWu z(I0q1wzrprqrwV6p&0uq>Zu;2S3}LJ;Mq+oWojxw{fc#!i)T#r@tM!pryS_P(S=ni z1;MCszmadx$nXw z7}TPfp+ZMQ;4S7I9rFP(F{Lwb7w4d`@VcL^VPUMQ;1NVKELBwuyvUz}2hWJ#;S(jj zR{pWV^7xKgr{`#~G~X)gjqL5Yza%*EgO~HCy7)U|cwdtmcSYf2t`+j|q$5IX?G!iW zDl3t>cy_XmFXg&NVNY`Vb(?Q}5g?&BO~Z~1(kLINP$bdC|MzPAzn0AZs?q;n{`aHc z{3lQ%a)17G#DDTvTHnBc+xQQpDybyg^J{$k69_s6hU%^(B_$=7)fhunQbtlzFi3{K zi*APsdat|5N2aDMARj$?zo9%K=7W*5{tWlbE3#{=tWxCrL}^!LSa@}^r6nVimR)$sGfqxi(7dd^KIP}npO@Fx#@EG!g@rE<8V*%7HACW` zy~zfcOp2SFoZJ-DV=7i82=5MbxkTlqF>@?sH3O zVq#M3c9<@2cEGBxGkke)B`lz?{tI-7Z3+S*#>XH1AmFgrC_8s|dpn)T@?J!} zT8_a~@pe|dZ($*=uA!muj5Mt&orR5_KKuQ>SZageZ=V*C9W&moIrkq)^`|?NPi`&_ z-GF42b4U$HGQ5l5~Z9^yJVIVGp0v@R{t z00?r}bV03IV#u*nQe909>XDGwIZQG^o<82V|0_pnS(*Q@Uo4MHcQBvIMgxhV5syh? z(-Meq0^bUKUJrvd<>n$UE-rF$b4#@N+%0cyJ$EPuRW~R&*kmMAVtYIv*Y#i?148=J zl^v4lu+$78{O%vcO)2V*7l?){TVmM61s1)dtE-uCuw!dNXSn{$))^BM6KYIM3>PnN zU`Yw5wT;d9d83(Y^h*7bmy%|^J4Y++wa_ab7!0<&vlC&^;L5M#&&tN8s;cV$@84%p z_ag{}fbAcEKXo~lT3ZnSD*bl`swgclFG0)0{mU0d%~5Px#l|O_gW9FW2#-U$_ND$4 z{DdU4q$JjAJdY)@#_iCMQrw5qayY&75i_QyMr3AYYW8!ou(X0Ax4gbS!7Ph}gfu-p z-2>MGFy+S&%K1hQf~}#ncF<0#SvStrZoX1lTQr4WsneDc%%Fi-Mn)zqHWm#c>hUjE z^$I{+31eegfQtg7qOcypcA;jG_1UZo<4&<9^xrKd#S6|^fNV|8%p5ld$bP(Z!NJ=`9dmQWN0idwal&KkF% zkfY@Nz1PJ73rtYUM^zOc=?@?adX4rjE-nhpgyrk&AFiqio-1*Ad3jxVfLCcWAD*1p zyU*RNUXNr+5fwi-i=ukz3LC8X3$;h($xHRjgAL7N+1i`zm3Ss3CNlUcOG^hy-q~Eb z+K0GwNv$Ah0FMkRk1H=z*&-8PWItH-g_(}TXbxvA(X!~_5yNJRy|e@puKh~=vNk{kfg z6Of1a5Z<7#$8G@1lgB}g=PR2{6sTghlx_ja z6`z#EXw>3;Q!U9``t#qC_l3dUVpD@^Cuop{mN+u2q~vkyqX$cV`0$~}NLg7q6d+uv z!Mj4cmh}6(n>7F|G3NjzU&`YVDI8K6uBVTeV|Wne=hsM&OU+jBR?jo6(F#pSs;LnK zKoO6EA`&1>{bndxdV2cNzkiZ7_6v}Si%EA64--JVKq6u1;ow?NCB{iG&MEF#m{e7scdim!sq_Va^QzB0a!Uqs;vr(!M6MipNPFZ zTLwnP*1W`-uU&%I!VTt^9~DU_0#xB9h_xb2ES#F}-Oxl4uAC zgED;Y$s&n4+Rk?2@rj8+!(umBt*x#9g7R~60zFPPTj6jL@G3bar7l1&LBNe3EOkE5 zfChj#({FUg2b{I`^9E+M{lYAx$aGzSCG=udxVg6R<3?YS+`D&Dl9GrZDsh#ShjFOh zQ=RD+|EjjvyM7AD@m!tLb0=r#4+{-$metkOw(TL6Y+5AHqcz(kF>Ou^mJ+p zP!{zXTsaDhi#3JLBO||lB?dH1^OCuKMGVZ#Kzn=O#?}@aWeE%x#bMZ(Oh!h=4QN%h z?F>(FG9cq!SXfxvGBUx?xyb#))Kv1#t*vel2Res~O*0@u2(Pnr*~Hn{A_r4=Lv?g@ z%hO+Zl>=f>3c`l1Lt9y*)b=vGYQ#aAZVfs>RpW!ql`4goJL9FE;!;dHsl5 z)4`uBSyv&Q_@OnhzxDu+#GK2{$(aFZXHH$oQb99K!%|VRXtcw<>3kLXgGjX{H&qtn0dr)OtPd%rMh1GxpB z6|a=1Rbtp!NRkMv$FsAuLq(f5`xVe z68_e$xZNf}HAl8}YD&{?qp%^Jn@ojR6b~ZBxx|h>F&)AsDA*0k`GlqqU?%sMYq*m{ zJ$|#|o;jPpxii~Gyv&(KdYi>&rSBrG0j}?smSHsB=%Z16z(vHvtfEcoGq$lobi3eo z-%2wnt?=@&$X)NtS?c@bV}8euZQpucO1%`h7A6w9LyzGzn;1O*kcfa)>cZc)&WZY& z>MKun!LWSi{KA{|Nf$0>=O75=mpUq>r^h{Hp<#G!P_X6C(TZNF)%e@_#+1>Yo60*1 z(q%FuPZ4z`5x|9h=s3%V2mOei6u0Bci_cuBTpWL{qZjo7`7z^$%@#8Y_~>UBSkq;qi~gZp{p= z5I$!KyT-;Yvw0z}k2X*A=9QTz0%|V4Cv&x`O2xZ)XZw;!9!bWQK@h|44W`>(*3+Ug zJZSqRq~ofj>!C5JHg>|tMgs=F-&!F8x;G&Ua9BU*mXuz@)jL?uv!Dtmap?IB7PjnE z)nuZ4oKp^^!a1Dgc>=d+yHlIM!AeBTWrBI5dXrhf&X|zPbEFM&!F+BlM%&weC)z9z;_< z)L7{Vxaqkng3a8kWj50cL$z@SQSu)9X50HkklR%Hfr&t^#$Ix7`q)8T3+{-g180cf z2!Mr)t92czL0R1e8zD(oraifXmaP6?A;izHX(u+|8R9M38$fqMI6p8L`8fAmqgcp& zghKq`N5HT5ZY%e9-IOxZF6x_+@eh_L$*^M^1=RJW;@9T>+9&>2BS9Q@-2d9I-*i~< zyR{diOgCB;jMl3Ae@Q}}o=ItiyI}@Na%}Hdo1Jd^YuAktt#!|>-Cpr?2?+d|b2w}* zGdtD~?Xw|s?8HMy8N}%#Mn~xhW1IS@kebIxXgnd#esthgk{Md}0$I^nf(v8Kz?bNC zue=%5JKuEq^?M*(Vu#{*^uJuZIp2?7>((;JX_miYZ$S+z`S zn*8l^ArdoaQKrN1K%<8g?6(GY&vT|6jt+}4Ghebr^9UYdQ&6l~7`eGnML2C~0-YdP zz)o-|{qB9>=<)Yj`4F*l&uz03w48?*uQ*&r$JMl&?N68BjFXDa)-H4|L~8moalt-o zUMm{7ywi%jZ9fX=wqFiF6c87El)p6Fk7G<9PCU>!k=+oA{PU-VeyEH{ z3iYOlyIC54rL)LPWd^HcZ^UzCM1-#|()@aQVgXzTWO?tpGF21`?hWfwDPK*28`X6F zeCJbI!P`ENV)TsflpIcnpN*dgbMKj+hM1W21D+XBq^I24{Txd}gKwvat`P3kwsV$V zbSUTU-=%Y`uRm`9)Azv2%X{T`St@Ag@ssnh1suMih{HT3s(@M{aS)YMhm92^`N~V1 zA`ICG!h(G&S}!(4u%fd+OrmJ(kgart6D12Cy4@shjp-(oXW_B30|M^u7U<7CuN@gIBmpjM_4$n@y2PSieAK- zz}mC67$grq*@9=**W=jRHyn>Ev*?F*umQut%F0UK!GW2Bqo^~V+$Bh1;1dfi63FsQ zXxQpj*=pyvq-IB_r$PSyn{RsFm+u7Z?GJw19C&DdxE*FYIzpFFQDKkvJVY$^PLHNn z<)3e^cDQX4$M(3r;gS>h3=8^FNyjN9KWyg90Fv%xZSJ{h$1rr;a$itQg!$6=nadGj9iHXV^ z==aW^cUh&S0UY}7aXNY>7B}Yxt0I)qwS;l4FHk-(+Y*FJV?mr;T+Dy{`o%6LmOe8# zR{ii##jMm~9`tZe!A?OWUJk*t58HJHDAnS3YBlu+h<^MaeLPy>{XXRyl3)ZMs= z-#e2qCR|`}<^OeT;?K+4OliIqk0dvz-95rzkL)0RpPPnk1li4@9F$$B1Yl zVd1jIM$s!zAk|QaLEXO(Q$QL#&sfc(%IfPyu6D5#Gz<)=9$Brhuuk)SM>xTMdXehS zi4RzlvY4ZUbVv8)-37ZsMl%{nwfdo*7(j@+8U_Zky_<+k$Utd75%w0|`$O3svX%Rp^u~_pwZlov&LL_8+ zdz-I8`9F-1Wp8h9eGUv!kG-aeS*Iyz(Y>8|Yq%sNUKO|T?wmR(^dWRNj!%iH(Mlk$*q^0`dpB^+ujd19oAeO* z4A>rCxU_MUKX(YAd>!2nXJIv)Lk%pPOiP=|-@i*S6Vg9>Ce_UG>J^oyrslqA;HGN1 z=UW|Z(p8WlfCGl1-6TSZfDm6$nDB|}YZpwv?kU*Ia&mHiKp?LC{fhy4jLX*C^KA)i~JzCMtHw9tS+55%$lexnMDXvr%e`H%~j z07qv9cq%f0Pk;IHWqETm#G&~rZ}P;R6Wl%UT@V*Ih&=-X(w{%`2-we~QaWG)Qow#WIX*U-oIJa8Gc8NrpRY?0 z77-~243$?;Pp{gf9aU3D=a-6-v^4S~NvW@|9{}n`XGaHfA`Lb55Gocaa6bm7Q~7PQ z?d*!wxV4BPUOEq%o15DnuXYaf^n{U7P*j-re=P%p(;TKyJk{Z^T2x2#0z!u#;FG)p z0v5nXw4MB|@t<&OwwHoH$jFqBS3;LodJ}k%(Kv%5`;CjGc1rWo?GwI!MMXmkmAz9* zleo`F5~`65vhvzD=9aH|Kj*x8qWRQ&A!MSWiobKFqHuZhoVBr05}%Op$*;tvVfflO zR8z)kQs^)NwXm#d#7!FRH66%0LXZ-!e{mo(-Q-2x6;stYTcs+eFwo|YbSUT>UOU>2!(vz6=74#gYQ7b+1Mn_j$`P^1xv|v`GOAI~r zLnj$;tMBl~I0;wM;*eykrVa{TSQcSe+%+kd3jdA0JrvQaX$#yrwEM@i z0F}V?Y}Ya}=tzG>!fi9fyf?jq^XioWs2m0~U^q9xaS1LtN0W`d~i zCH9TTs7p7VSd}-fa`@zp-`{O?Zo66gj;{M&7rE%%AMPQE1e|aJ<9Z%oTP%Ru+18sN zmdtI2{FU>;$adEG3pK)&pF&&Qskd0J%Y@%wW^kKSy~}vlP?}Sj+acm3fU0x4cqZPG zxLYcM^0o-e(TA+oWgSDF=C?`e(l;z%=RZ9-$Z@>CwI(FeFzrh;sCC^(fYUkt&QlMV z#(l4vtQ$&WT?QammSpE^^jd@9A4-Vx>p+={n|a_Ol!mmd@TY zg8tZbMU{1K^xv1(2)4s?Zt%!G6?3}br%=rW>?&^OEV4YB>=}Xyf7IZoRSELu(+xE~ z6E|Lm(H&rdvPzT(pN%mA)9mBWM*qd~8UZRO(UfA1q%kqxdcFj7XCIMYj#83*Ypr$e zrD^ioT}g90r)SzE24IOg>w^qm-`E&lcWlX@+pChboY;F@kmdMx(wKw45RD2M7}!DY zuM|Mo(*F=m33FSz!;GaSs=Dt|$}HB85Ng396m$0oF>@vcPN1d55M}tumR3%+CZb>s zr{kG5CY-LSfUf~HzfnykPQBNKnG=jP=smE;g`6xHnH1bn($neE&hd?B;PQ@RyeRdr zs<=;*38JX1#zYl!l#$-%AGhNQ0>|9(QFXkz@M@i?G&9Rp=g*kTcykheG-&n+yMqP= z@OH)?+;K+o{c}%_PANlqEj3q1b4+XNyu+7#hxb%GsM3bznM^J>PC{$zI7yy;J@3pN zMpMaN#WV02`z7>JZ*9I#gOslavBJXf2E7z)|8gJJ)}ZJ+ZtFUf%xlZoF9Mksw5k|J zMn>Qqg^~FNH!2}va!%<8a&`6J?Zu}36N$4D3Is^cl-+~-3%e=orxJDzOG}9ofv9vs zLfSvgn~}j9sA7W>+Zu@04rIQc8&i{iCADglewu&&m6-_v&?yJ4tJ)w@0FED5+`h0t z1;pTWktn5oAlbE9W_WkGkTyztYX;#NW`2-CUqJ!$_+OVh#?OBw^I3gqt8Z==`;nHm zvbzfob3B2(c5&g4p?(!%124`hC_vB4%LCr8e`qM0vx{Cvqr+J4+eal6@cYSCSM!*0 zE<>QeH=fVhXxDva#KOj&^QH>>2hz;Y-dqhX$lk_LS+%vKK>0?;#B6K!zJWl1_}4Q$ z+zn1#7+YIMgyPcB3ki_|L~?X?h60gecp4NGv|H} zJp|7D(HY$68F=Kopo8XqFr8wy1?@^yRu&xqen>!F%i6m2F8*+ld;OfJ8JR0?=7K%`!u1E5bfmYU;m9MKP)IC=&S z5_P7x3o=(yH}y}q$Q2SiW_35icGF2OM|O5bCUAb>?Mv$9G8bOK&=1dd|04Gcte z=~$tI5|>Yehvx?<3^j;nSs z4ZO4B_GJ`ciikol<94|&L#RK?tFMjbywMMRT`#m#@xLCp`|oD{t?zQ&hwjj@JsNOM P5b{<=NxE3lIN-klH(|k@ diff --git a/class_p_s3_u_s_b__inherit__graph.map b/class_p_s3_u_s_b__inherit__graph.map index 230069e3..33940989 100644 --- a/class_p_s3_u_s_b__inherit__graph.map +++ b/class_p_s3_u_s_b__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_p_s3_u_s_b__inherit__graph.md5 b/class_p_s3_u_s_b__inherit__graph.md5 index 44086750..b241da78 100644 --- a/class_p_s3_u_s_b__inherit__graph.md5 +++ b/class_p_s3_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -d6728a689bb029a7cd4f4e23b5bf2c3c \ No newline at end of file +77f7ca570be060c1a40a0845510a4a59 \ No newline at end of file diff --git a/class_p_s3_u_s_b__inherit__graph.png b/class_p_s3_u_s_b__inherit__graph.png index e7e61d27feaf5002fa3fcfccd830c8d0412362ff..b1442de3e78350ca6c7974ca3eff327bd1dab63a 100644 GIT binary patch literal 3019 zcmcImhdY~V8;?@^s8V|#RoYTjHNvSqtCXr4I|z+gyHN>h)M%|*HKIptszxZOQKPmL zHDas14-t}}zPIN(=llMG?|#Q~J@0kB?|VP@bN@!H@k8C;7*tm7>L4K>ceT(_n^v9@OpF%NPYI=|tvH%>az2(rSvxj(&wr?@ za#gy~IrDvDV!kCb+m3yAzVzL@@Y3h3Ol^xku(ABR%rZ&RJ!Cc> z5Svs+c2bhDr6pqc6K&5 zH-G$ibmYf6k+L)0pz0vwclngV+}PMbKD(8&DN#N~88uSvb(SeKxsPF^QD=?pUK)mD zVq;^YqM{DP(75B1y;c-uqZs_!)!BKb6{WhqG1%4C7G`=g^a$^Y#bS$#iiYx(vCE0? z&CBIPL_|JqoL!2DhE(R6u_uLvmh_dBTrVGM%0#(gAO(N^xf)k$eBCZ&N3Ld@h)B~f zw3Oter}6&0|Ml>&4)0;tjKFk3-%+v$S4pJc_%4koU+gSn6!eTjBoHy`4NtH|he z=HTF<8Vv;V`!?E$vc+nNG}`R?fJ<_4Xw_E74q6p7Iybj+Vk=f{E0)p3#6;u@qqfL! z)?HUlzuaCoIOeS#`zeQ5n*Jrhdy{y4>=MZ)^tsCX`g)0eA!0Slb#;@ln(bX*U!StF zxe0%zGdee?A}hNbh)onymAb-syfbZKZT)~)Rau$V>wFeq9&f;4hBN-ieO&yIhdKJg-;tM>H(G4;*zne^TfDDeP^gH4Lc{y_G^atA-rGM- ziHl<_7%rLE!a!~X=ty2{YR<2a&K@i>zFzNvZ(k#%rl!t6TN8kP8RUfsvmPED4RMUF z`0fYatI0`8@jc$Pt+}V9)C4R(LYQ)LGErr}7l>tu@WIYPt0&!LM>Lfw>jlf_2qh}b z%QTk-1z#@(w~@uf#rc?NYbqwT6g;Q2R_@8jXr#NsU>9~dO%)Xt8(Uk^l6=h3T{f;F z-x#gqqy-aoJ()zoul*WltY)99*n4|>KYBFWf4g;CHMP3B`rzO|;EzC(LNfQOuNe1< zloep#o1VZcW@ct66hwru%K52ZmVvy)6`-Ypq%E!|>&eQ>Uh!!;1cP4_$fse7k8e{m zE)mGzwXYuMg*gq1fZOH0=T4UrRY%;Bq(!=FOa709a5-Rzvw{(&?v!#|LAXtnI^%QL18T9AiOHw!P(b zi^)d6wULn#S>9KJuv)x_g4ay&W@)hsX@RUL{R$qBuYC)H!RjEDHd3hNWZe=8Yg^mg)YQ?5i8X(v5Cnpek+B49q(WZS6$*Wm znyQHwwE_ohzA?Qiz{^`>DH(G~C{Oh}PW3zoz_FQ`i%b?jOLwJp!vTTNTLcs_Cx<^3 zfMZtR_TqhuWD z+RvZwg{!r#5r8FGLLhMY?9#;>ks6C1Y_YU-bQ^~JENhD~LUT1P{n)*hlWrlD@ttNn zZ$m>veSLj^Eg+C7F8k-|a<-p*!uwb1>*`4MS2Own$_2+%-#Dh=q@qRM36|NRB@b}`h+-yZ>- zCAIVy78e%<1O)tb`6B{wG0&P?4*f5J@{4tOIKS2_qdf^!ApbxXgNIY%;ybyy)bEC_ zkvk*Y3f&+(A*%ha}NjgO9qI_JAzw^M%b(ELFSs zF8O&lTKn6Efmmu3xgwofekPj^WLbICsWq^5wgvK2QU-x_E%=BZmIb z-G4K+R7W+vq$mZ4t0kqSnL!{;@Ufeqwt)cyTU%RQ-EKg2fUZU$C;;%$NXipX8vxDC z%}sz*Eh-_`lJ(-^<9qj>&b5S|yy8yKKu+qOwG%FuFIojzT7+Cgg z`~}6rnzAzZmq)7%dMj$IkzLRyZf?dm)8ypj`oU|co<2668UzvEXk%x3IAI^Rxv}xY z%L}>wE(QeRj=o=LvPs~##r-@x+1lLXWJl$NUEyaDmy+5gPT1pcIMg>X4F~IlJOfMGK*rj;A|Qn1O)-hl`>XlW7tbfNZ9x9M)8`S!Cip02h*Yjg5hPK-yn| zW15 zDEGJ~6CgR!l#vk==8km%`Uq*>S41LFKHIR+WH@^}Fho;RGbrddMhHm{3SNxjYWYcV z2NWm3r_tti^Px#d$jK?y#-4eFxx1fV?H32jzihs{$%;SBahPuI>{>VXnlR%!tPnrsURGr28I4uSXfvc%r0el@#2L@vfDlt6;LV;PR`v~Y|xFn zR`SB&4i+JmieWcE6O{#VJw1AW+k!xN@$XGa6Lbo?mw5R2u)+IK9UWRLbVi1Sl~w8J z#&#ff)~nTT?V*dy3h*H=W<6IpT))!Xd#Wxr>xooK8m9e%iK(eSP}#Dwo5iC%TwDzS zTjK`@zBNy#>pjJd@=k$0iPBgcue9#(>+7M|Vgt2xbn;YDd8a&PCMF~0RV|bs@wcV8 zS-%CYW@cvA)yX18^&KweI{wwZ%tQMn{bl}(NcCSF_+PX7YcdeZ^1#sWRbry6gXAiZ z_}12z(^zxoRo&Opg!t;;9S7ga{Smb543i8*TCv2dyZ&o*f4zH7mA@RrurbXS3%GO8 NeeH)@A2b{y{sSbM;PL^@%q&)S;$eqktfYTK5Lh6xwGay!p43(+(w&es7^yU`b1^e98Rnfz*V=H>vhgE_ zcj=fsjq9iQ(9b(0-S2%~g&P=Ne-w`opifH5K&qx6de=u%izwliIKVL?+=)?S+Fs%SQm$A z2OAcLAn^o^g7&T1#(ea`@Gz999hJhT^I?9TtF^T?Ea!DkB^W0 z&EDyZgIT}xE2|jDUp?HKH5OvPClNsw78Yc*wB2zqzQrFu;)Km!E_TM#y}4S z9Gsj4%Cpb&wettWHYO`I)zt|`$Hq)dOdb=F((v%{5si$D)C6Qm+Q%A}Xj)h>`uh4B z+t|eWZ%q16zpSaDTL?YkT;JG`avSAmp^CLz{js_E%pgbZmk0?oJ~`>Q+!^oVW3h&reTh z?d|P3dr8G~`{dV#(kd%GeG~}f4VS3*5iWgL zhp8$D7S#|1S+>MFF;NBz91eGTbE=v}(N8E~`wKagspu~PEv{zRlknKb#*xLx$Fs=a zDx{h4&g?M~0&pn#E)5u1V!&%pERn1HPrt<}}l+y-GWF`P~^ zmq}=-%3MnzCNe6@?a$$s(bmrTMETdvO|kTcn^Wrh-v)}FKBW+mka($!5f~B757E#` z;<)1N?Jb?9k3^=Wq^NUoae@2^1W#_y)F=EsJuPc$%B(|+6B84sXcq;#hv4mupwic` zx67QEVKDV8SFZSdALP8~aCfEK%+s@?F2A6l0QY%ASXek7GWPQFD#%Q?W`T znRLvtQcfTLF)YFKUVQ2B;gY+jCr&+z#3U?C6$TTxZTd&`^uUZam9`~6pPLgAW;=5R zl2GIOaCc*UoeWz0bt0HF>)m#$tyi2Hc6RJqw*7l|1&rXX8)7I|NwEIZsV$$s545?g z=py}o3}4wu1*r&2naI)?m{#|?d-p}h6I#s3-L(4Y8W+mIprBqye};nU>XhY`m7cyn zR5tlL%<6D~rflGzbD5{B>u22-#9-)$jt;k#kBQ^M!)j3^)Tw(r3O@q^0&o-V&2u|~ zT@N2TDEji{i{b3o@88XC-{!d{CpU@@J|csz$;+e8B_$*Tl$4a*5Z-g|Cfq#p_!IDW z6-GwJo)a-Kv5-482PegywdE;gx~o0~%5 z9>0K59+kcQf}xa(va+$AokTh%B_)iTTaw{??%_fgvwaAG^qR3H7gkj0pPc6^JzQK{6HfQ?3<`K;7r4rpmX`KuJ#S5rtpArftt%F6;L%c(A|V+W zOmA=RkNzwf+55{#bZf}lin%{KZANcePefc?Tt+}YLh|w%FAa0`xI+(8Dt7uZBr%31 ze7S}?4|nE^lM!c`EiEmjcs$-Lr?*#6G5ky!e>5K~8}i#nnuW@=;?t)a6x7tkdwaej zA|iz^Uhtrs1H@sl`i6#7y<%Q_dwV@YLu|v^Z?VMq_=1QCXwtz{FC)QU$N1Bq!5`9!|TCPfZDV zxXQ8#%gJF02?;;V&*y1BV^PnM^GY@7fagqld3p-*@TeW8&bB0GWH4(Xk;74>w9cm! zpFfY0a)+piq(2>ZzgCH^*TaszvMB#FGLpi^#)f;BM6@tEs=<~RtE{a2si!BNNgU0u zL>q|y3xWb-bCs5smQDE)9DjDQ;kWly*Cxr|-@neeht9No;_LRdA@GCIM}JvuW@cyC z`Xt+MCPmsQ7!3VDo=T3iwDhO0u2r`uCLbSQVyd~MWn{{#s*Ei&uvl$+0sS8)90~TW z4ta>KuC5Eep`f4`9v_beyWDfShFH|H;*r2^^WUHJV~FXd`+V8i+3<(kw!qBVySqt2 zn!AB)E5(N)o%jokgPHinj!Ye2(A|L66(IuH2y$LNu%r0}y^+y=Fsnl%$dqDeoP+Z=xwux}q| z!J~4Tt>s&z4cgCt>)g-yC4eDkmiQ8Bw=mVsY9lB{8R69ZdTF=O>YadSc`0pewVmA~ zo3lR)=SvIc5*r8gi3lEET=A`~m5K@svmLg-UqdK;jy9?X*%YuP;inkp^eZOgs>&&1 zv_5^ChfrE3P&jA_5#`}T)YPn`>rylljm63-DAJ_WuWX3l`b)E&FxZ2Mv9A5LQ~K&; zbhONxJ;ds=Hpl;A80-I!H2>Ad=ZNs|y?J_0P6Mc7-N9)^jfgbprZVk*cLV{^kI`Zj zR@qiZ{3OR0_~eDFejCd7?vXtqo^9~zIQ?@Zo*mT{9x*&IQQvp7Ldv(nYxd3>!|&%Y zuqXeW{!@I z=HcZfBqE`@yuPydKI-SeL5L&%2IAYXqM{-%9DaG@^P4BNwfp&8q^RK?XMzZo;KTO0 zIZosyyj?OF4xg$jSMcE`0mRSG4?ZWI0-gvE!x(^Bbo3?VpaZg$loSXm8i@=2bGTHJ zAEseuMi2A{#>hwvHuI7)@+mZuGR8Uev$r#_dAd+7n8S-YHhZ$Xf%5G%NHu% z$oIF^936T8{{0Jo^z$~P=I19HusQX3c-Xk*aK?j-iVErD0|y3*W7*x^g}4@G4Bvd_ z6BHyRARtib)x>e{hj@5+REM93^*_H}n^81;bbzw4tgyav>gC}<86F-ER7mR;CFlkq z>b<#lG38coc$JjcfogPo8_0pt(eWnuZ%#?^3kY10_d?houjIYUTP04d?JKOhMI#5L zk{&PYdq*ck(-C*w+}^MDWxzN%o>e<_I|8n=u5l($#b8o0GpBU1#FR|8KR#ns@cl{# zbPR`amTs<13VbVg>et^`U(X2q7Qi7<632DInB&vOm6>gw*HJogWcTmi2Tp@oXP_W{ zsh`E0I|j9X&ks+UZS*FBfYjd^$d0iOKV@uRIV$g8s4FimjR0{hFZW13k#b#Ze+(?1 z=2dyQ1N`94&9&22=jz7B?h2dQDz90&udA!-C1V9R+$8|Q=_<1Z0`#rN-`Ihd6*e?5 zf${u2IwFPo^HkW$$;q31S1J4yIe~m%=H^beslBsQoME?af`D$rS&Xf$p1gafXl`Y- z@^h&J(Ddqt*kt?1ME2d&qXj-;Ve+G$g(rH&9{~1MdrnK28JL?hw4SVsdQMdlBqk^m?gLGBcQ5)E%cf($z9VzSg)M F`7cZcA*cWV diff --git a/class_p_s4_b_t-members.html b/class_p_s4_b_t-members.html index b7a8d0bd..d6fb78d6 100644 --- a/class_p_s4_b_t-members.html +++ b/class_p_s4_b_t-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -124,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Parse(uint8_t len, uint8_t *buf)PS4Parserprotected ParseBTHIDData(uint8_t len, uint8_t *buf)PS4BTinlineprotectedvirtual pBtdBluetoothServiceprotected - pFuncOnInitBluetoothServiceprotected + pFuncOnInitBluetoothServiceprotected PS4BT(BTD *p, bool pair=false, const char *pin="0000")PS4BTinline PS4Parser()PS4Parserinline BTHID::Reset()BTHIDprotectedvirtual @@ -149,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s4_b_t.html b/class_p_s4_b_t.html index d39fc3a4..acf0c132 100644 --- a/class_p_s4_b_t.html +++ b/class_p_s4_b_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4BT Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,26 @@ Inheritance diagram for PS4BT:
    Inheritance graph
    - + + + +
    [legend]
    Collaboration diagram for PS4BT:
    Collaboration graph
    - + + + + + + + + + +
    [legend]
    - - + + @@ -277,8 +290,7 @@ Additional Inherited Members

    @@ -224,8 +237,8 @@ Additional Inherited Members

    uint8_t interrupt_scid [2]
     
    - Protected Attributes inherited from BluetoothService
    void(* pFuncOnInit )(void)
     
    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
    -

    Constructor for the PS4BT class.

    -
    Parameters
    +

    Constructor for the PS4BT class.

    Parameters
    @@ -312,8 +324,7 @@ Additional Inherited Members
    pPointer to the BTD class instance.
    pairSet this to true in order to pair with the device. If the argument is omitted then it will not pair with it. One can use PAIR to set it to true.
    -

    Used to check if a PS4 controller is connected.

    -
    Returns
    Returns true if it is connected.
    +

    Used to check if a PS4 controller is connected.

    Returns
    Returns true if it is connected.

    Definition at line 45 of file PS4BT.h.

    @@ -350,8 +361,7 @@ Additional Inherited Members
    -

    Used to parse Bluetooth HID data.

    -
    Parameters
    +

    Used to parse Bluetooth HID data.

    Parameters
    @@ -442,8 +452,7 @@ Additional Inherited Members
    lenThe length of the incoming data.
    bufPointer to the data buffer.
    -

    Send the output to the PS4 controller. This is implemented in PS4BT.h and PS4USB.h.

    -
    Parameters
    +

    Send the output to the PS4 controller. This is implemented in PS4BT.h and PS4USB.h.

    Parameters
    outputPointer to PS4Output buffer;
    @@ -464,7 +473,7 @@ Additional Inherited Members diff --git a/class_p_s4_b_t__coll__graph.map b/class_p_s4_b_t__coll__graph.map index bfad127e..d2126a78 100644 --- a/class_p_s4_b_t__coll__graph.map +++ b/class_p_s4_b_t__coll__graph.map @@ -1,11 +1,11 @@ - - - - - - - - - + + + + + + + + + diff --git a/class_p_s4_b_t__coll__graph.md5 b/class_p_s4_b_t__coll__graph.md5 index a9ddb1a5..57a44763 100644 --- a/class_p_s4_b_t__coll__graph.md5 +++ b/class_p_s4_b_t__coll__graph.md5 @@ -1 +1 @@ -8ce481092eac2c035d9bd45d31696dc3 \ No newline at end of file +4bb85a2b4d5163f1d591f32b835727dc \ No newline at end of file diff --git a/class_p_s4_b_t__coll__graph.png b/class_p_s4_b_t__coll__graph.png index 70ca471787f14f110354a1d12db31c39f4d778d4..56e8eaf240482f6b6bc2473c21519fb686057068 100644 GIT binary patch literal 19041 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 z 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 - - - + + + diff --git a/class_p_s4_b_t__inherit__graph.md5 b/class_p_s4_b_t__inherit__graph.md5 index 732559f1..22e73541 100644 --- a/class_p_s4_b_t__inherit__graph.md5 +++ b/class_p_s4_b_t__inherit__graph.md5 @@ -1 +1 @@ -6968257051e0d345ab838bb416a09380 \ No newline at end of file +405752bfa16040ed3832aa96d3e4fa2f \ No newline at end of file diff --git a/class_p_s4_b_t__inherit__graph.png b/class_p_s4_b_t__inherit__graph.png index abfa7d3068217d509ae82fa9c68b14c13cf92e5b..cfb58080f18e4454ebc6bf95faa6ed48c1a9b270 100644 GIT binary patch literal 6434 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 diff --git a/class_p_s4_parser-members.html b/class_p_s4_parser-members.html index 27e63e48..baa936ec 100644 --- a/class_p_s4_parser-members.html +++ b/class_p_s4_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -121,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s4_parser.html b/class_p_s4_parser.html index e2ef0ee0..24e41110 100644 --- a/class_p_s4_parser.html +++ b/class_p_s4_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,7 +99,9 @@ Inheritance diagram for PS4Parser:
    Inheritance graph
    - + + +
    [legend]

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters

    @@ -207,8 +210,7 @@ Protected Member Functions

    bButtonEnum to read.
    @@ -235,8 +237,7 @@ Protected Member Functions

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    bButtonEnum to read.
    @@ -261,8 +262,7 @@ Protected Member Functions
    -

    Used to get the analog value from button presses.

    -
    Parameters
    +

    Used to get the analog value from button presses.

    Parameters
    bThe ButtonEnum to read. The supported buttons are: L2 and R2.
    @@ -287,8 +287,7 @@ Protected Member Functions
    -

    Used to read the analog joystick.

    -
    Parameters
    +

    Used to read the analog joystick.

    Parameters
    aLeftHatX, LeftHatY, RightHatX, and RightHatY.
    @@ -331,8 +330,7 @@ Protected Member Functions
    -

    Get the x-coordinate of the touchpad. Position 0 is in the top left.

    -
    Parameters
    +

    Get the x-coordinate of the touchpad. Position 0 is in the top left.

    Parameters
    @@ -376,8 +374,7 @@ Protected Member Functions
    finger0 = first finger, 1 = second finger. If omitted, then 0 will be used.
    xyIdThe controller sends out three packets with the same structure. The third one will contain the last measure, but if you read from the controller then there is only be data in the first one. For that reason it will be set to 0 if the argument is omitted.
    -

    Get the y-coordinate of the touchpad. Position 0 is in the top left.

    -
    Parameters
    +

    Get the y-coordinate of the touchpad. Position 0 is in the top left.

    Parameters
    @@ -421,8 +418,7 @@ Protected Member Functions
    finger0 = first finger, 1 = second finger. If omitted, then 0 will be used.
    xyIdThe controller sends out three packets with the same structure. The third one will contain the last measure, but if you read from the controller then there is only be data in the first one. For that reason it will be set to 0 if the argument is omitted.
    -

    Returns whenever the user is toucing the touchpad.

    -
    Parameters
    +

    Returns whenever the user is toucing the touchpad.

    Parameters
    @@ -466,8 +462,7 @@ Protected Member Functions
    finger0 = first finger, 1 = second finger. If omitted, then 0 will be used.
    xyIdThe controller sends out three packets with the same structure. The third one will contain the last measure, but if you read from the controller then there is only be data in the first one. For that reason it will be set to 0 if the argument is omitted.
    -

    This counter increments every time a finger touches the touchpad.

    -
    Parameters
    +

    This counter increments every time a finger touches the touchpad.

    Parameters
    @@ -501,8 +496,7 @@ Protected Member Functions
    finger0 = first finger, 1 = second finger. If omitted, then 0 will be used.
    xyIdThe controller sends out three packets with the same structure. The third one will contain the last measure, but if you read from the controller then there is only be data in the first one. For that reason it will be set to 0 if the argument is omitted.
    -

    Get the angle of the controller calculated using the accelerometer.

    -
    Parameters
    +

    Get the angle of the controller calculated using the accelerometer.

    Parameters
    aEither Pitch or Roll.
    @@ -535,8 +529,7 @@ Protected Member Functions
    -

    Used to get the raw values from the 3-axis gyroscope and 3-axis accelerometer inside the PS4 controller.

    -
    Parameters
    +

    Used to get the raw values from the 3-axis gyroscope and 3-axis accelerometer inside the PS4 controller.

    Parameters
    sThe sensor to read.
    @@ -568,8 +561,7 @@ Protected Member Functions
    -

    Return the battery level of the PS4 controller.

    -
    Returns
    The battery level in the range 0-15.
    +

    Return the battery level of the PS4 controller.

    Returns
    The battery level in the range 0-15.

    Definition at line 250 of file PS4Parser.h.

    @@ -595,8 +587,7 @@ Protected Member Functions
    -

    Use this to check if an USB cable is connected to the PS4 controller.

    -
    Returns
    Returns true if an USB cable is connected.
    +

    Use this to check if an USB cable is connected to the PS4 controller.

    Returns
    Returns true if an USB cable is connected.

    Definition at line 258 of file PS4Parser.h.

    @@ -622,8 +613,7 @@ Protected Member Functions
    -

    Use this to check if an audio jack cable is connected to the PS4 controller.

    -
    Returns
    Returns true if an audio jack cable is connected.
    +

    Use this to check if an audio jack cable is connected to the PS4 controller.

    Returns
    Returns true if an audio jack cable is connected.

    Definition at line 266 of file PS4Parser.h.

    @@ -649,8 +639,7 @@ Protected Member Functions
    -

    Use this to check if a microphone is connected to the PS4 controller.

    -
    Returns
    Returns true if a microphone is connected.
    +

    Use this to check if a microphone is connected to the PS4 controller.

    Returns
    Returns true if a microphone is connected.

    Definition at line 274 of file PS4Parser.h.

    @@ -729,8 +718,7 @@ Protected Member Functions
    -

    Turn on rumble.

    -
    Parameters
    +

    Turn on rumble.

    Parameters
    modeEither RumbleHigh or RumbleLow.
    @@ -772,8 +760,7 @@ Protected Member Functions
    -

    Turn on rumble.

    -
    Parameters
    +

    Turn on rumble.

    Parameters
    @@ -848,8 +835,7 @@ Protected Member Functions
    bigRumbleValue for big motor.
    smallRumbleValue for small motor.
    -

    Use this to set the color using RGB values.

    -
    Parameters
    +

    Use this to set the color using RGB values.

    Parameters
    r,g,bRGB value.
    @@ -881,8 +867,7 @@ Protected Member Functions
    -

    Use this to set the color using the predefined colors in ColorsEnum.

    -
    Parameters
    +

    Use this to set the color using the predefined colors in ColorsEnum.

    Parameters
    colorThe desired color.
    @@ -924,8 +909,7 @@ Protected Member Functions
    -

    Set the LEDs flash time.

    -
    Parameters
    +

    Set the LEDs flash time.

    Parameters
    @@ -968,8 +952,7 @@ Protected Member Functions
    flashOnTime to flash bright (255 = 2.5 seconds).
    flashOffTime to flash dark (255 = 2.5 seconds).
    -

    Used to parse data sent from the PS4 controller.

    -
    Parameters
    +

    Used to parse data sent from the PS4 controller.

    Parameters
    @@ -1028,8 +1011,7 @@ Protected Member Functions
    lenLength of the data.
    bufPointer to the data buffer.
    -

    Send the output to the PS4 controller. This is implemented in PS4BT.h and PS4USB.h.

    -
    Parameters
    +

    Send the output to the PS4 controller. This is implemented in PS4BT.h and PS4USB.h.

    Parameters
    outputPointer to PS4Output buffer;
    @@ -1049,7 +1031,7 @@ Protected Member Functions diff --git a/class_p_s4_parser__inherit__graph.map b/class_p_s4_parser__inherit__graph.map index 04e73c20..5b3ff389 100644 --- a/class_p_s4_parser__inherit__graph.map +++ b/class_p_s4_parser__inherit__graph.map @@ -1,4 +1,4 @@ - + diff --git a/class_p_s4_parser__inherit__graph.md5 b/class_p_s4_parser__inherit__graph.md5 index 3664c5e9..7d6cd78a 100644 --- a/class_p_s4_parser__inherit__graph.md5 +++ b/class_p_s4_parser__inherit__graph.md5 @@ -1 +1 @@ -3640c7e8714d328b9cdd367ff0a243af \ No newline at end of file +b842fe07d690c9e08045bf8e0d96d45b \ No newline at end of file diff --git a/class_p_s4_parser__inherit__graph.png b/class_p_s4_parser__inherit__graph.png index d77be10809b7336c69dcb9e1440fb0931910169f..76bde1ff3e785227a3118192b8844816bdc44f3d 100644 GIT binary patch literal 4443 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 NS`Qv;RH!`<`5%CKneG4p literal 4304 zcmZ8lbyyT%)E-hKc46sUKw?1}K_vwirAxYF2`NeGmIi5%l#&KTX$b{MrDbVY0RdS; zLOQ>Jubz^KUEcC{F_b@??iV{8?D>W*=c0#UJ=Qup}xDOFAQN09|3E`=a*&V!0I^AFKo7S}-|zn_*@lauy@uKPeE9B}THh92XP0XujM zOmnyH0RUgI#=_!a$Ma>G6eVOj&^?Yu%Xn{5Mfb2769Hi|4vvnzf`UHo?rbW+&-ARU zTln~wOF^NYn`3O&1msHI-eTjhYcgrsLY%^&M-d7ap@jd$L%tk-<#G4+&bX?ruEuU| z(lIbNy1GID`J(rQg@sK`$Fm>p%gV}JU0tuQuXA#8R9+UdeS!k4l9KZa3rs!lH%8yQ zdFaW-#>OTo$q0P-@WEHgJTS1mvhtaakB`1S&6`mu8CizdHWo`lOg!}M+sB56JSi$N zf1jh#llZ-R+jEWI78e&sNB7o;bA9ot6g@pWnp_v# zys_xKJSHkdYU4^yf~_!I8S+@9e36@%SHrt^f}*06BO@c9KLY?eJ9|!UZu9eH777Y& zUEQy%`zZA-EY`%>_;`0wGGD8tq@=#SUR+!}GBPsYWOsOUG-Q8;z`U!a#rNj=N?%{! z-QB&Qpa3){Dh+ij}ps zwVfRe6H{JV+Tl{b-k@=%v>-M0 zbVMBJ{Krq8WMyVDfXWyc>`*97AB+fpv_LxTxgtM8NcJ^3Gc&V~&q+@-^uCzb-;)y% zok7R5_FxzQT1G}je;I+$r1P|wATkkg9}H_iv;`&@oWjCbm5@lJi_6ZyK#U=uUA^IH z%lqJ~^UKRXmZX!-@sfdofr$wnu}&*71?i2Un1qDOm3YB}!$Z)6AmTyj`|K`MBAJ4M zt~vrvSfu@RpFHUw9UUDW<`)ss2{w~^`tR(QDxQAB2xr;qeW{=%S?a&t($>s88FKEd3g_xkGa5n;oVQbFeU%L zNdU|-0GMMQG(a5y2lyC-yNe4Wf2}M8dLuM^ z9u>9M>HpV|V@s==7qAq`UKRAGAh22u|M*cfuK2YCJ)?q+O_zxH($RYEo?6#b9CaNR zS1vdNi|5>$jIyGOD+VJ8`O6~APf`}MA0;iVSs>{{BA5IZYyX}Tb>(jYJn-4gEVrjg zI?-{#9qhe4lJovMYU--vS_%>ur;a7vYrbq z)!}0+T3D9VWF;@Ezz2j#^YSv)Wy8}ZMJlQA0IH0Hg!Y4zQB@^Gzv{a1;m|EX^Mu`* zl-#tZk!hTV*tGRd!?!t(NrJ}a5_@tHF=cP$cU)n!{q+i*~di@Rzl<^ z^Rl|SFS$9|-<6l2lF(Nv_`xxJ7OvWcE&T&ZS%atn3BpRM+<$5go+@&seX$l!NbnLg zCpGU}kQa+n?vvWb0k)SzB8Smu>$zHzlAi50LLw7p?WbhFiusKWqEb>IfDqlln`@N0 zKFyFF7W7KBj&P+G_HFvZlA4;{?v=^&a|mhASL?ybrx{EdGrNl$_LQE}b)MikIC4r* z-qr>oiP!8pD^uhQA0)Kuve05vPzWbugh@*+sj2@>p*}vAnMR`x-#-cww^C%UfBUw+ zhJ&wWvo8^ylXLa)wyMT@1oZm2SrEG=QB_qu<1%PBYecR8AJSUUX; zTvxZjtkpwO*!@$RIsiB~z0gTDaNpmlsycf?kvex3_UO;hl-RRhL$d2@m);{93`~JV zt!M6fdg-0lmuJUHJJ*=g{XHc6e!b27#&PMqBD=fwijSwCj<*{2aGw96H>Ke5;eOKnyllTT1Wr|Cs!WT|-t=U7h?JXU+GWNl(WzGq+bdrP1*wlIZX>*{Wt5^6?1XyzFId_d-gP{pg>=FPzIl^ zC0>W&1Ikk(@Y=7ZBcQ9S{35jUhc3>|$!isr5uyUyGbtz7ccZ+#-C|;cEv};CQLYQG9c^uO3|pcd z_=g@PUKf_GSximImV;U*@qxn1K^2vQs;cv|>UX=K40;46f?M;nzW!}k7*@Z|RIMR% z(9Oe`hOR|`YaLszNq}_97N+_m=e#}L)|N9qexu%yTp9ansivfag7HFZT;7g!HpuPD z-^s{GRVS5}Q{b49&ViddAS+YcqD$j#bUiS*5!=&KA|Rj)#%jPpsqDD1-RFKdEqdDL z$B%9MkKQq85i_MlIOaY}OwtL5@xb>79;my)jD*FJ-+_a347&Cft)Mvb!w*w4z8cNh z-&t&II!;e(BO?==U8Px#zj?9!ZV{4@I3AH4gg|KQM}v_KG@NIfC7vgHCs(I7rFFYb zaDEjQr8#)%TQfKd&B%VA!j#A5>G4l1EB|w{;z%_Tk#o#Qe%->tR@Y6?VRxi+aU){1 zJ90bX*8Poj{pAkTuum1quK(b}!t$)FY+E%eyfWYna;rzkVmYr|^KANEbV^_e@$d79 zH13ei-QdjB6?Jb)00?L0;aN(8Lv8I1V70cy1HU4UkHaXrdAqx%(pzG0Km6%N^D@#8 zWw+$~91czdmF!@etW;{!gc7Dpn3y2%KFO;j54<3ava+=;T75nz4^!g6F0`7|)=DcY zn;#B>h_PfH99#mgH%6x^YJW8*_ueuy)1;*Af|3PIFD>Oc@K^OOElF{#Ew1)=VYk?S zXn>=f9_O91^;VjFzWBn*J@lqA%Yli7QZ<9Jqga{luaP( z;&k7}Xt<)H0%WL~EJNSFJ0GVK$wm5USspkLGo-5)rpnOK(^C-P2g-DP{OGyd8C0!b zD@9+n1ps;t+o>$Y4-mx0ICcpGP!uyct8`nlQ55$GF_c z4jIhh8Busc!{voCwYRr739Z0aAyT;HuiGRfjBrOcH*$cGkPyYGdlUxq!?-QZf=It(GfwRH<$=0rg@eU z63z+|Z#4Sm2EUeDvtSd8#rr%nW2mp6nURrE$-}c7S$0ol&1z#LA1pYtv$G)(ND_;5 z9EdDZ(jOBOIZ_O-9ASv(aYn%qAyNhHdjbL@GW`hf}^X%twT zUD9$S97j z`&W(sAEpdO)qnN0=okN$zC^|i^Jo>!zU~=0{?@vcim{1Ft7%=}V92TEaE@4KXD2Kc z<*HXnYGY%Qad}u#5Y6+`qjhO%>43BJH2*Hy&#}Y*C;bwRZS3*W$32(_e^CI+iWt<8 diff --git a/class_p_s4_u_s_b-members.html b/class_p_s4_u_s_b-members.html index d3de14c0..8bea55cc 100644 --- a/class_p_s4_u_s_b-members.html +++ b/class_p_s4_u_s_b-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -165,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s4_u_s_b.html b/class_p_s4_u_s_b.html index 3ecc7762..91fed20d 100644 --- a/class_p_s4_u_s_b.html +++ b/class_p_s4_u_s_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4USB Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,27 @@ Inheritance diagram for PS4USB:
    Inheritance graph
    - + + + + + +
    [legend]
    Collaboration diagram for PS4USB:
    Collaboration graph
    - + + + + + + + + +
    [legend]

    @@ -295,8 +309,7 @@ Additional Inherited Members

    -

    Constructor for the PS4USB class.

    -
    Parameters
    +

    Constructor for the PS4USB class.

    Parameters
    pPointer to the USB class instance.
    @@ -328,8 +341,7 @@ Additional Inherited Members
    -

    Used to check if a PS4 controller is connected.

    -
    Returns
    Returns true if it is connected.
    +

    Used to check if a PS4 controller is connected.

    Returns
    Returns true if it is connected.

    Definition at line 47 of file PS4USB.h.

    @@ -356,8 +368,7 @@ Additional Inherited Members
    -

    Used to call your own function when the device is successfully initialized.

    -
    Parameters
    +

    Used to call your own function when the device is successfully initialized.

    Parameters
    funcOnInitFunction to call.
    @@ -411,8 +422,7 @@ Additional Inherited Members
    -

    Used to parse USB HID data.

    -
    Parameters
    +

    Used to parse USB HID data.

    Parameters
    @@ -477,8 +487,7 @@ Additional Inherited Members
    hidPointer to the HID class.
    is_rpt_idOnly used for Hubs.
    -

    Send the output to the PS4 controller. This is implemented in PS4BT.h and PS4USB.h.

    -
    Parameters
    +

    Send the output to the PS4 controller. This is implemented in PS4BT.h and PS4USB.h.

    Parameters
    outputPointer to PS4Output buffer;
    @@ -522,8 +531,7 @@ Additional Inherited Members
    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    @@ -546,7 +554,7 @@ Additional Inherited Members diff --git a/class_p_s4_u_s_b__coll__graph.map b/class_p_s4_u_s_b__coll__graph.map index 33493e46..e7c3c37e 100644 --- a/class_p_s4_u_s_b__coll__graph.map +++ b/class_p_s4_u_s_b__coll__graph.map @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/class_p_s4_u_s_b__coll__graph.md5 b/class_p_s4_u_s_b__coll__graph.md5 index 45eec9e0..31d2a590 100644 --- a/class_p_s4_u_s_b__coll__graph.md5 +++ b/class_p_s4_u_s_b__coll__graph.md5 @@ -1 +1 @@ -cba83f8ab42c9ce0150fe14cf09d4533 \ No newline at end of file +6510784396c1c05ff338806741b9ed6c \ No newline at end of file diff --git a/class_p_s4_u_s_b__coll__graph.png b/class_p_s4_u_s_b__coll__graph.png index ad50e007679de11691569447b3e832b6ea92e399..cfbf5f0e71e5edb26619545bcade2c528de51e54 100644 GIT binary patch literal 19326 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

    kTR|M@wu}+ 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 diff --git a/class_p_s4_u_s_b__inherit__graph.map b/class_p_s4_u_s_b__inherit__graph.map index 1a3c6473..fb842e03 100644 --- a/class_p_s4_u_s_b__inherit__graph.map +++ b/class_p_s4_u_s_b__inherit__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_p_s4_u_s_b__inherit__graph.md5 b/class_p_s4_u_s_b__inherit__graph.md5 index 15d56256..da6b8966 100644 --- a/class_p_s4_u_s_b__inherit__graph.md5 +++ b/class_p_s4_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -25315e0b7172add06990f260c65e7e95 \ No newline at end of file +cb813f5f3004b0786d96c27613056cb9 \ No newline at end of file diff --git a/class_p_s4_u_s_b__inherit__graph.png b/class_p_s4_u_s_b__inherit__graph.png index 7d7f2a06c8a4c321fa36b0e67172786101f7c5cc..5849575899b36493c71b9c88051f975319bda9ae 100644 GIT binary patch literal 10390 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 z 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 KsghSlf&UAqNNtAz literal 12830 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 L71=M+X2JgjxJf1? diff --git a/class_p_s_buzz-members.html b/class_p_s_buzz-members.html index 6b43add9..1c84c0fe 100644 --- a/class_p_s_buzz-members.html +++ b/class_p_s_buzz-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    vidThe device's VID.
    pidThe device's PID.
    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -148,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s_buzz.html b/class_p_s_buzz.html index adef170d..bf19d377 100644 --- a/class_p_s_buzz.html +++ b/class_p_s_buzz.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,14 +99,25 @@ Inheritance diagram for PSBuzz:
    Inheritance graph
    - + + + + +
    [legend]
    Collaboration diagram for PSBuzz:
    Collaboration graph
    - + + + + + + + +
    [legend]

    @@ -260,8 +272,7 @@ Additional Inherited Members

    -

    Constructor for the PSBuzz class.

    -
    Parameters
    +

    Constructor for the PSBuzz class.

    Parameters
    pPointer to the USB class instance.
    @@ -293,8 +304,7 @@ Additional Inherited Members
    -

    Used to check if a PS Buzz controller is connected.

    -
    Returns
    Returns true if it is connected.
    +

    Used to check if a PS Buzz controller is connected.

    Returns
    Returns true if it is connected.

    Definition at line 58 of file PSBuzz.h.

    @@ -321,8 +331,7 @@ Additional Inherited Members
    -

    Used to call your own function when the device is successfully initialized.

    -
    Parameters
    +

    Used to call your own function when the device is successfully initialized.

    Parameters
    funcOnInitFunction to call.
    @@ -358,8 +367,7 @@ Additional Inherited Members

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    @@ -397,8 +405,7 @@ Additional Inherited Members

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    bButtonEnum to read.
    controllerThe controller to read from. Default to 0.
    @@ -434,8 +441,7 @@ Additional Inherited Members
    bButtonEnum to read.
    controllerThe controller to read from. Default to 0.
    -

    Set LED value without using LEDEnum.

    -
    Parameters
    +

    Set LED value without using LEDEnum.

    Parameters
    @@ -495,8 +501,7 @@ Additional Inherited Members
    valueSee: LEDEnum. Set LED values directly.
    valueUsed to set whenever the LED should be on or off
    -

    Turn the LED off on a specific controller.

    -
    Parameters
    +

    Turn the LED off on a specific controller.

    Parameters
    controllerThe controller to turn off. Defaults to 0.
    @@ -554,8 +559,7 @@ Additional Inherited Members
    -

    Turn the LED on on a specific controller.

    -
    Parameters
    +

    Turn the LED on on a specific controller.

    Parameters
    controllerThe controller to turn off. Defaults to 0.
    @@ -587,8 +591,7 @@ Additional Inherited Members
    -

    Toggle the LED on a specific controller.

    -
    Parameters
    +

    Toggle the LED on a specific controller.

    Parameters
    controllerThe controller to turn off. Defaults to 0.
    @@ -642,8 +645,7 @@ Additional Inherited Members
    -

    Used to parse USB HID data.

    -
    Parameters
    +

    Used to parse USB HID data.

    Parameters
    @@ -744,8 +746,7 @@ Additional Inherited Members
    hidPointer to the HID class.
    is_rpt_idOnly used for Hubs.
    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    @@ -769,7 +770,7 @@ Additional Inherited Members diff --git a/class_p_s_buzz__coll__graph.map b/class_p_s_buzz__coll__graph.map index 6a4c2e11..f195bd2c 100644 --- a/class_p_s_buzz__coll__graph.map +++ b/class_p_s_buzz__coll__graph.map @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + diff --git a/class_p_s_buzz__coll__graph.md5 b/class_p_s_buzz__coll__graph.md5 index a8e7946f..babb5e21 100644 --- a/class_p_s_buzz__coll__graph.md5 +++ b/class_p_s_buzz__coll__graph.md5 @@ -1 +1 @@ -1990f23158dc6c12f0fde0f9bcb72213 \ No newline at end of file +fea9ba05db96f5aefabee7a11c9c9f52 \ No newline at end of file diff --git a/class_p_s_buzz__coll__graph.png b/class_p_s_buzz__coll__graph.png index 73ef750a71f9ea7e902e322e03fa7d85d1424cbb..788f51c9d1a9d9e04b13561b71734d5a4f858fca 100644 GIT binary patch literal 17131 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 z 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 B1^WO1 literal 21459 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 - - - - + + + + diff --git a/class_p_s_buzz__inherit__graph.md5 b/class_p_s_buzz__inherit__graph.md5 index 6907892a..f6913f03 100644 --- a/class_p_s_buzz__inherit__graph.md5 +++ b/class_p_s_buzz__inherit__graph.md5 @@ -1 +1 @@ -3bfe0bd89aeb71800737cc565a54b628 \ No newline at end of file +044341a0d1db5d69a79fcdf68e3f63aa \ No newline at end of file diff --git a/class_p_s_buzz__inherit__graph.png b/class_p_s_buzz__inherit__graph.png index 05db1e2f5a17d58d2fd7a83c1923b63c5f3330ba..35c3aa8d45dfff67c4dbde7c5a73b25d23ff103e 100644 GIT binary patch literal 8794 zcmc(FbzGEDx9%uXQlio+C;wdtTh=MlJe;eJwtA?rXSGzkH5>Y_eZ0E0C`To05f%B} z5PhR+4r*7G1!3scG!xGq9Ac_W(=cf1@;pBr-|g3OMvtGUl~IP<5)?lXMgW72RmmZd zT+A#2_+d2U9M{oNu)A+f734mADtLSk3cb^n#2u=dSD_$fj-aQfFZ0~cKmPky&-`3D z>5+`1V~PBbO6PBsmy?{LqDacr4Cc?cQ=`0rfkFCR`3*$_1Nw&Z!`G3;LFXq2n2wI} zk(1{%uCA_Sf#)X*%R-_8g^3?Onv{p+pT8>5q}-ZcOg3&?=!oZ@B10Mz5)!5eSSTU( zyu1JHjhgsaS>#PpIGU1;10$pZPAWS*xF3|ipQftH{L6=ZVXY=Hyt~*{?y;^t5ZL`g zYS3}3dIQ`3$aH7`FJGdxvhpt23%cno&g`E*#AIY-H*j%hXPQG5Htd*ek+f4&Qv@U= zLbRcpUJZqXT-UE(FLPg2zkBy?%KRb(g8h4by0_fJDk@5ym6f$JQqHOnLmy#?@=SF& z&r{28Tj@iP^lZ#dUE`iy-b^ZXL~U<7W79=SoA+znmftL4Qz2t))D9f} z*El&j`Rqsd%q=Z{%yQXIkv%>OZfbfWd9s2K_1V4O+1XjvQ(l}BTrRb zUH$i(M`A+4vpm(zv<;`$4-~s+dp&en>+a%u^}a|D{0I~Z^)5WTt2yK{t;af> zyu7?Z7ZoL?5}Z-$Ykoc^AD)&*t5^Q!{qf1khxGLHqSsX=qtdqT-@orj6S7P5?@mli zyiG&HVPs@9x48HqHa1pWPtRuG_wsD{vGR07Kx;?Gb4H&9axoBOQzJ8Y?Ru7oQ@op_6bf1jE8Nk&G-SEuQQ?-pH@2+ysC(~|v_ zK3Pdg$@?rUPrrTpM!e?`FrF#lrCL{Czj*d{&-LQWXLYn9&!F1*bDzg>F}t|9zVFc{ zH)o=foE(oqHFI-w^W5z0JrL-`h&${`GBR&XX*5n73#8Nh)C9FYLVRUmF@nKEo4VYN-t{S&3NZd=)i#H*RNk^e&;CX z7ZfyiCUVWr&c3zE4xmgIaT3-K+*|4@Of zg+|2+^({e*?ld7xXXnq={=C?vBujTCCo+&BVfpzF6A}_;wrA0zt_!ffvmWVFVjCM9 zQIEB|;2eUHcEhwwqbEQ1j*i+vz;E5Y9rE$xts>(_MjU)nd-q8X261-+ML6Soqf&gx zyLa!HSy-;u)YM>p{R)G_$&$EVTUtBWUWyDVx@|?Y+44nd-_QQnl&h@N)GpG!CmT*m z!OqTJvz+C(kf>wCFRm}k8dNYbIk|{Ug?1n67#ecN#KeRxUtC;V#SFc7cILl2UR4U4 zxF}p&U*{4M5@K;ZErn-iXPaAC2(8Rd`E3cE2^E(XNXy9y(nf1)YNni>!(bC`JyNcR zfAr9M{dsE2mlx;JMovaXS+hRiSG?jkkL>BI8#X7z(0dhDJ!6BhdfCze_l1SEzgJYy zIp`c61ukJ}5Yv8sqn?e&t-K4f;Y^PE2SUQ!P-sQRu%^B~XT9H%uq4>4QxSY=>JE27 zb3$$m7JJ(gyuL#C5E2xzT(P!DZIn@IGSuo9W`DKc;^#ZUu+@Xpi=B3+2b`QrZBaC4 z-&Kl>iXL61=By7WMA{o>lfG?mCSDg87Z#T9Zp*5KL_~I#WZ=l+B|O{$ynTE+a+H&4 z4TlC!xHvgmIywqEhF^Q>Yd8^rTM!N!uU>tI@!73Pd(E{F65hOdTTM-khR-DUY%lv# zaIK;MY-q%Dyviwg79HLNa=@ZJhJkHZ%PY;OR3y#w&j>#a)H13Xg`zt&#mC2wFDU02@F)!C`<-wgoACTuwrk0g#u zrzGW%A2@me+kuDVi~FSUh^b9>c{SVu-T{~ZG~(de@T}{ic6j)=$UAj7 zRv*=~df+>X@+$TA^P@Y^1F-;sL` zg%;6dj}w0WeA;J=RM*uVnLBSRzk2=CH51xk@%R1qn$>oy*xl zJYk*SmMl#iEKJ3 zSQ-h>qJ@QpXR4|(Q8ZA6Derlb_{R8?{xn}%IeGbxaqZ@8JCb? zZrx}%%yV^06SW@7a&om^TRdP#Y{SM~0fAEmFdJ`_qdI(O00xuh9PFV4aG>9IvgZxy?R?@=*<7lFm;up`hHJgMQ)ug9okoJ!5Ln$;nBJi?hEZs)i08<0{$GhDnd~ew$44 z*6+t*Q}|`&;%$rqC)NG;}i|65_<&iM2NrQJ|b`9Htk&R2m07#9{5Rq09Nj$gf@ACs3V_mzMc%A$Vb z-+RF31$;*xOXeC)r=s9Li<+o}c#2^aNeduda^vS`YNv9=t5n+CDgF znnic{q}hlOLzR#JR8*u$2Nd=RB2NyH%j=Tv0qT*@R2`Wg`-!FKCALfP4s6_fAX8wg<;BO^k`sUmyS+)Bwr zonD09uo5$i3SO$hd@$jiFagXM0U8?ukj6&PYobv78khE2*s#V}EPFP6l#m_UHEZ7& z88DN-yMzuJcfoc$hKKLW&cbC7HfJj@inUEQC;C!Ec*`7!5GYE<3+kor)12AR%o9Oc zAAY~`Vss&D4`6|jDD7Q5Oz0m9)t$@qKn&9z0R6A=Er1Gd%{ zN_NOEe&Xr;(ySxS#o24izV+q?8M=t1?s)Fb%1}41?ZE~!ooFu|%9Fb#FI!IMii+joL(10Hsxqq{mX`LO_NKQ}z1H*~M;RG2`Q4W0hj{uo`LJWb z@$sxlyg_)rQZpMHA2KDDn_F{O{R5$z*MiS!Y6cZ&m3I=JIvb zH-4*M)6V-V7WPw;I0(hl*9A(poyo=*!Boa)5ZUm<<{u8wzMRPTzO$mDr!DP4kvc|y znc|s_%jti&(Cj~BI;6&RQ@78X9PQqy^4 zP>s{tx+qy(9#WfkPA4MW(|_R^JdCv;>7mL9D0g`69ZK}eoCe8+p%-%{eEs9y9!~1v zTPDazt=sbMEy_b3Zy%4=7zVfA;`B(QvU=s*oNL|oPi=E6syU|1lxTdWKV}r@Iec$A zq*{&gQt&_XC#LyL*W8@G{dak}*f8#m|KCM2f}0;&gRe<_OsR%UqPzg=y5mz@Zon$s z@Xt1!Dz>puG@n_U_WcJrdZ@3SK&))>IgD9K{#`Kf-|sUB#QctNu~v{kHzSwO&1IcG z`Ru|)s}DDw`HBSiv19zCB@R-gVOl&fPz?yUrUBQ204{HWYg&9XCnJ70CocYQT3d73 z;ak&OW_pA1TlnZPvar;j&dwV>qSQkTeAv6NP&+Z|Ax0PLu&1MYGy0@qNHt<8Zbely zlAhRZn%dH{i4kwumG6;DMk>RrwHf`3Lh0-H-D6BSBqfU`x+lD(X-E+zT7$0UGEFKp zmXyQPnHwLi9zYD07|g=I`az*EQ_J?T`Kw1i&=3_w{~Ba6@Y~QY?~dsit3BWgy!0at z%W31s<~Prbot+7!-y{NGCz+(gzU3ypTEdni28zJ5xA@0%xtx0+3H=(odgmnlh)~M{ zmm&JAwcXjNEzRRfOWEV%jYHDYp`d^i9UaSCPqE$HZO|V3U{Fnmn}*otvVk{}-I_4o zhU4pIZBcKv3x!T=wKx^sHzn@^RS7X!os`F=N;dvfcP0TFND0`WjmG2P;P5`%Y42`u z{QgZYFsT}h@hO>dn&J;TDo@k2sFoVRCW5Qj)Iq&|t0lheDfFcuM! zs=@QY%Nozjl9Cbv0)i&c*}i(&8|ZYTlGMzHuvAGEzy)f0q{@j&NlD3h_9rfAnoSSZ z1{F5sZm?W0){d;K6g)mYW)>9OFFBd35;!z^)4B`P3ts#v zmFO8Ar2#v3_V92RtW{E0?yIm;1D#)?)_LklO-Uk`&Kyv!$L)_V`mlxeBfvwDWK+wU z__l~y+KF5mr~`d0kZt(J0S6R7@1!}D4zI^%XTyProckQk`2Cqmg=P0opx7UMceKr> zwj3y`t`;Sx6(j%+;P&?R6VS5ntQD4isjM8xH{3Yj29jg{&*&YXj@y7#rFGD_?9-R> zJCrjuoi(iIQKt+`WpHzMm($YH3S9-p!pp*-DWO`=jSpId+V`ZS7^)m6f3j!$gLA$v zc{Jgs&^2fTy+eL>JP+3`Gr4BuyZRvBVNF_}iS)R@HY+P8 zoGEa`+Sk`t9JFV2h6*|Arl2Q=MMUtA;z2+k95ZYj!~lE@%i@}$q2ky4o_};Bi_*u~ z8B<5g-xE>2Is7v!>b`Od*fTG+wZnia$7V^<5m7$kt0W>OmV5g2I_PF&fLmfvYlLHq!7;H>;_G6}B zzkYcyChBYhnFHKKV(MTW;{XcYy6uq9lORmxz!d^k6dCAbS4Jz?1JBou&49d9STFS3 z=t84$;8KUWp~7BY4r}#+Mby_A6eM{tpmAj>`R=c{46m~-nxu^KCn~)M8qfr2Q8rO=Z$2H;~QtrW!Qj89DX;wgiB8HzNvtU!L=N95%rySE%k%M6JgN z$KJiliJt=n8pVcTv3tvtE*EtuWEY=+$C_s3WD=|>QpDY%fm z+Yis@U+wF}SoPW(0;Xk3hh^oqOM^1Mdy1I@tTiV`c`~$bY-JXHO!59Xw)l|&Aj_y> zqfr<_kykbkbq;?P!&v|B?Ckdv)%{u`VyFO0%1`xa@x@=yC#0mD{wFrI6kIHRz;3Ki zej$mMsp{li(ocB%4qUICeKeusq zwmzOtqGw$$3GC;}1M@i!)h^qG>99r^<%iw}!=BzNQTD2V-~1_C;oo2wAs z(qh)T{+C2t;BgpDYHP%uR7?-=djtYU+`U)u#M#~biA=NFGv%&I&zi4K>TqwR%1<{; zmRa}dA`m5J?IjS1Ld+kllw9q?-YTam;Zk@4+^d^8GF9S87Sd#VDGpNTBg2d#6!whf zzm2U)3VAFG9~Sn1NP+(cw^f7+5bXO(l^CMJ$fS=Upem__?WqNz&|*W{J_gg2 z(VAbG60FS35ISM|rbylf81NPw1lWQYZVXI6%gf_yNu# zW|F4Q6!!?p&Sv`IIB9Erd44oKKWdfzJ}-|Qh;@FO-}ixsh!`w|kAdL;4K_`P2%nU` z8ewttpA5$KI-k9$B|mTP8St~MOWo_m63G1)Z2YyXhc4lVg zt5>i3OvHkMf`}O{ z?7RcF>W^5Yr0Qi*`}_NNpMR@IQt`HhkCjP+SnkbI zSL!o>KXY>p$bS;3Con@W9UKCZjlM|g>44<^mfLb(aKK{885wwriuh=^=(cMe9X8rU zus_$(QCOu?Dxe>)3kf}*&eAU&yvM&I>MmYS!Nr9cm>b`y@YLcf7w<~0bJ z^hi7HgV@Yj8@B&AOZ|`3@&AD#|0h~bgu#%J%zJv@%?VxI+=>nHATw)PRFGhJj|!KL z>+7wldU6H^hYbOYz-=1Kn+Wv+XFv=H;5-lUwB}y*%@_;@;^oz)z~M3k!^4lod;-ljutr+|50LZ&s(lYMJi=}H7X)&(HXdFYeS5BY!OZGv z1eKBZHQ;xLt%9QwzF}n6zs5K@XxkzAMV}aI`@75(UFJ9`eghxhtSR^!m>8SIZ^+*O z+&qG`qdGf3e?6f#={$z=;%&G%S*Pq~{U$vzCjfz5$GQ3}07%VHFt9jVRSWtF%yZ&? z?Gl5C<74lZmKJ7qc6=~`_MVGizv4}FA8qgUN&%o&FZT~VV7lYK+rbXhiOrxS3!v-} zOm{a4z``eTa_>yDDk`8q(P(l;MpAMaZEZ^6sh3%H(-s+`hI&gj`!t?EC-mH!iXIsm z(GDn=0JzJ~&#znM$dHkl`C1ZA09rTw!1L!h>diepWMFLF0wm*$A8u}LvewoQ*;LZZ zQ-*+>uBoL(qpA`4;X_msz|H0l6kOXU>!s+fuEN$mn5|0&jgZaGTnd=~0^MvHBZVHjJ3xw!*yQHW);c zG6n3DgQ){KEv>Ely~nJqIAD_Dy`1Sq+;0n~PES+Rj68yBPy@j;eZJ{chx<|rSp}Kf zEYXdS?7n~X`Gfzi&kePtc*x3%9(yoCf1#QHH_hdfmX^NiMLlVRJKEdZ#~ysd<;UJ- q6A>96dvHq+w>0&?Jnh{jS=*2Kn9ruK%E5<4AkXDhq1A`tz`H8HqXX?(PhcUS|8gJja=KFiq_()ag zlOwInmzjxA$Um&7@e6-^_ezlwrhyaT`TijIz@EQ6BVYQ_#|rXWZK*6Tx2ZYrgk?UG zg_36nS?1U$Ez!Bu*4C19^a~dIEb*bgq@e~p`a+Y^(q>tdVxC}NaNl>mhw+^r(+dlO zu7?WaOa_VZJ(T5!k)54gS{hNRjbVAbIqB%==xejm8Gi59ty?@iJbj$_N6GC|%&TRZ zq}cp6W6ZQsii&0!3_-h#ji+nUH;;LFOZg&xbar}qdp9&Tausooi0{<0s+xUr+nVz7 z^jt2veU(V6=SL?;a8Y_a6?6*6SjPIV6UgiKVuEDm=jT^SsjI8EwY7DGl1z_`d@C=< zCm~5RiDzA1-`D^hO-xKw(OKBoY;0|DQBC;D%gbZS9=UP`X<1t4fTzyMVM*-2UeAh( ziHY%^!&Ht5r{MYdrrwtWtF=_b@~sK?gCV!Gd3bBNe(~9vrvV}^j$BBnx~ZuteTZC| zg>DHG3#+oSl8lVZw8_&Mwb~mO7x(!ybatfCWAFL1XV0ELf6?e(l9|c)@S&EO78u;s z)z#cQD=<(FTv1jfMMaG^7=C|J$l5>9yTY3KKm6VWH%KQ8X83-UXz{uR$xBC3F|R{byI`WXmxG(TcuOUY zk)Hnh__$7srjyhD8p0o$rEr^o;O>+~S$*T*>$Loi6k;jOy8#)u<5u(KY}(AuZtDxb z`PJ2xQq0lmsfVkpJ-B1T-ab8jI+!A|m%2ZcCN3;2oL23%yYN_1 zQL(VGq=ZLQbf%}LXJq7|sAyeDiNjFpHOFo|CWp18QU z;rIAT%gXkOX=0ew)zo&8&0NxU0Ww<8pDVacPfzn1R9LK!Wc>N_hf3J~wWDKhq2$|> z?fj=%M@L8QJ9F|et0Nh5cVJyzUD*q`u_`&y(a~9oQBz}MZ`|EA)YW%}La0T(8a)qw z&Xk)^PELlB(4ogQrK4{Qsw%CA4Gjz^@83VWyd(&Q#pJr3Ew^D&gdZ<@EENzI?98%ZUiAt%@IgMKFuxrxj&ZGZr z8Jw~D`g&qw;w7I$b$k0_u)MmQEXo2bES&=bYRsg)!ei-@Z@0I%-?+FOqEM_FsrRX= z7YxLYkB=c44Gj%L6jR;Z-JP8|b#)vxUm%!?e5R!Z1@$0;VRx8x+2LT9ZfCIRLU{0%0&eQT`o^{%)36B2_*6J^H+?n+Su9k=WdF@vlJo<3kx$F z%1j!C9T!A1v_vg>J{K2r$1vaHHLmkIv^p2Ew6lA=(vD+$1x`*+!+fodo?a+4h6dwq zRdqFg(!i4cO`5mYN_+4fCIzj@7p;D24+09CI(#ibJSr^Nlu--yE}U_-4Gm(#Da{^x z$cqc_0$olhgqak-`Zb7uMLi*%RBEXkd%VipKvIW=z&##AW~vNdCf(|il9KcDbMPpn zA6B~}s3xez7c|LHQ+|l2`uHX~8pzwXZ(H!?Xct^bcOI?{hj+f3{aRvFo1Bu;&l=}o zlA%>+-c1bBB~4a?6k^p$6eXL3Job9~7QRqdUQl4u^O-?cvO=hH#mR#0K1$5KduHYg z94u6prKP3%mxr?KE-sI$iJ$F&?Ynxfu)|kgPL7Ft@)Y?+&ILKF%G_S1=+a?GbspHhYFD2~Uzf0wBt zo0y)qwz6Uj0@;?7l$7^H)B5`QYjblZ>H4H30~;HT$?NseEE;il*U_OwQ@?unl9cxD zJ~;3O(Ms7MQ1W6pem}WS*!;qC+^P9 z92^|I{rv#gvUrmi>jN=1ulx_&0`WqLsN8?|#f!j^*?D>Mb91EFqsI*_2eeE73?nr$ z8v{c|ZZ0b)=f{qfMM*# zOiZ+g1<1&t_o541TGHvm{LzO9SccQDt_Vm5$YaE(Wakt;kta#CCf{}2&$E@7=bGQv z0_+IwD6goPtFR<+i~h(+5nk&sZv}^!Wn`Gy*wovMv(DBB`Sef{hJYcqW3kR82 zc6MAs0z+<|n-d%$>(6emE5{fZ7!cwzF)+w7llq>_S{w5w+Iv`?U7s#(ZEYQTHZdti zf@xAxQo7Y4dTM3dtA>|{sMd4Ah66de_XR66^Cv2i-87w*f%)&#jc%e&>?_yc{|gHX z^5GPg*4C}Qm%<>`0^9`!M|LCo-9vPVT<4m4K!yE6-2uQLm$jjif&vh0!xo?O&B>w- zUX{)!|1BtL%2c2G`IEmF_F{1Uw^KMx`#JMJ3q(8=E{4=+5sdw(O)p~7(~;wNlFuTQ zm@O;u)}@nUVo15TxN;udy?Zw&&i$f828pdQ(KZ!#^U(33&p20LhNJC+?6OuFlWVL7 zyN#I;BC3ls{w*+*BsJE>{?S|SU)tEtQBs~ic)*+6NTEhv^XJB=6-8hEvMuB7>Bl>; z=g&g|0uaN9y&fx)AI*ops0+7W8{-}t=}jEaD#jthP_o7{L@RYi z($x4}f1(uZ8qrSqXlrke?w0n8i~!>^lPcp~-VK!9Uf8JdJYYMsqoT)!BSFm|?Lp_KgqEWoG2%5EYCaFagvaFFSU?eL@A@iLu^T z#WC%8mBZs}i^D$#5DtaNUW-pOc2af;l046dr~}2|9U&X%XKLDKQL4}%LurotLnYHw zrEWhW`3>xL`cBtksi=su19^E z(loN*-hiT&t&KA#<`5*9=f#WI_0rcby$*AGyVvy9Bj`D7c6y?n5T}i@NMrzg7`!#D zsALeIIFbxvczuPt5wWxL?76U~w}J}u*y^ebL3oC1V%7tC_+o`whZ=EcvxCta^@x}K z34H6kp?;m6lLYr@C#R-F{gF#OO5wY2ba7Wp8Zj}A>x_pIcs@WfWNGV{{QWm}d?&`n z_6L&U#l(_9e=78F$!`|Dd4`6m06kM>My?h;90|K#Hi>VT-f$XJte%}6(4|V$8|&yq zfIbOVORWD4d#t{hyuQ*Pz~+%gugfh;^LrY%q^|AV#1<7Tu5^Usou{Fju@HDi3JMD7 zzW7lMjhgOA9!iPf?dsfC#m=w>IcCvl&?%VML>LqVJk=lj%%P$cT2b$6)V`D#?-eSgAn=8((bZi*a z_}qam!#sEjiBMB)U~wfRqaIM%A;fD9P5mK@zuD=OW6aEYK_YP9*8lsw;L%a^aNpyf z@+EoJ*$rYT!>1y`eq}9f+T00_GtiXO)azeSNS8IS5tE@y3{);QpXtn#>}*Oz=cwfI*mrVb zqQU39cVPiFo~PHAWv7DerIXy%WkrX`zsF~5Zhoy8C7jimiYzL-$7@Lb?8S?FWR>3A zGiI)dhc5yM8db7NO4`=^g>2(CuFga0q_{!b7v9$wQRjyw&-4glVlWx(Rq(uYSk=|5 z1+AZ7pASzF+*3fdn1Hb*pBr9S4W$NR%Vy{JIyg8y@p!z)(327aFe#G8=;u#?jR*E}C`evjj zn$-ub*U;e9@9$5^eTp{gvJg1gJsug;zS%571i>^lhod%1^SMOeQby&B-hJfrOo|jF zbEc(jSkE2(86dCbYwANn47aAcZ)5Xt>4}Y+Jni;FKlT_*7Cij(czbaRUqs%h*AY-s^-vMFv>;yFIJcn16xi)Qgy}zo(h@F}Gw}!rFfqPDR#?Vv zlv+Xqn#=^?=~#(HyK5dQ^sg6Nm%_X7I&!q%Y)uhZ4=r3DDDL49u#P_nf z7zJ@LHb%Sde5u+Jh+SS!8Dc7!0MqQLZLXDnxi79ZG0|{IC=GGhShN1Cs_7tNckGxC9AyX zAo23Fx=k*FTz{&6Ha9Lf_Tvc~YnP^G*%BRLSrOUA8Ff)9#gDFw`I-Btr`s~t^zbSU zzOuukPt*cWuCKiOv9KI(1_6UKTWQal`1K6{#PQOn@8WIO*i|bBN3k)OETkJvUU)@? z4=!wYhY`~QX>YaEBjQu3A!b=Ls}UMqU31RPcB0fLsgLngRF~MBuh}#?*9OI3zsijL za{uLP$P!9Zx`%3zkg)EY^}R`jwL-l*n5mD5BSHu=J~&?;f}4Bb%`>*<+#+PK+DP`>ob67%Z-W0rFnb zA`A=GS3em}uP+xO%K7_B9;gl{JM*q(e@?Nl*0zeq#>SLmSxZb?(|2JP;h~}3fGBK~ z{*=7srGrTuwYIyf;c-_6=ld}!#(qH4t#>4=L>NBw|B%Kyg6P9CGc$)S9tjEI;Ng+b zNf`t6p{t8kLZT@rM_xGjQ+j%OXs9Bfr5j~vmRY%9i@j{qR@0*Aq0RaKCv$G#Q zeBgW0BO}@fZ`Vx7dN@@7y|L?<;$0RR+HU%Hf8twy zg2Fq1omyM3WoI*UaTNiLgA0x?Qw#dRc5v7MCGEu2lr~>lYHDAf7`l^$HP*&rVj6zJ z25Dbfx*5w+^|i-4B42fo5e2dtkPrb8Dk|DSHov{w&PskeB{>-zvkg$W8vEG_&x2RN zvI2{UtcVD8XXo-U3Jg~g@IfaxHy$poM!;WJdt)^bQXsGR0$pl$1l+L!mz`bI10hav z@%jFKRkP28G}VE$@0wQR`XoOxEb)-vHa9oF10!S8SZHvw1KQ{7*Xw}lTQZSTP-uHJ z-VSb8PZ9q6EnII8&AIFZw+)SqPTitqNMw-@%fEg5-0F@%AckL+drHv4!v0d@y{0A! zTc|8l&}sl0-nm0HIx%5fZTrm2%L~u|(~k_w0s;bWriu-GZLp6p7s@{Mf*@dFVfmk} z;E9Vj0%{3#M^jT%&^QR1*bl^>qUtWHB9@~|i{D3zx9BON4C+@V2 z5!EgDX!}4jNGC#xIRQ1GdlctS++mN?_|Q;17&|X-B-rHyvQQr>grVAq;y(I6cJqHxn*W1H1PnLEFaH@# z8PC(~78WmvYkR3wK1j@dXSJm4q5q+ULy3ZH0J57-k3Z>)qpp6P)5?zzWCsIV&3LDY z`SZTwDKnrZsPsS){cwS0lZt$1BCpDsd5JYRo)NC93mG?^g$-KuoiZrv>KD*#gMx7flMnB1D zO@2TC8WXIlkHZ5zV~J8Rx_C1 zEoJ3dpeLwDOrl8`evaiRy555{5Tui6-9n>>s;h6%Jdr3=17J~-66m*;C~L&*i0-|0 zeorZxPB5pQr5jgEmMhm3mG_6r|04(eZ&&SK)71Z;Ci|DUX?;CC?3|pLjko1nZ;)Zo zj~_o~Hhw0qYiKYuG#oSOe23c#pW_ft;h_lMD22rX!VGd%f^da~~2C zk_LjOM6|TD`+FN{%h&&Ib^PZBY&yo5h2BO`_MATbUkMcO;tebD9YAF7U}scyu2a`g z5|Mru@d47b5s+~HHB*i>=DNDMi8#zgrN}UdXo8=m7`Ar3gC|78S)FpQ2DI zYHHbzqz!L=f6UGO12`rW1{4o}^woJF9?97FxS)UlP<`?bPIu-#E{-;$nG}J?gNKbB zmym$I-t#wY@u}BhCx>7YP;i6X!p_aT0Q?egw0|#|VdlJRI-aa^{#CVlG;WNEi3uW> z$ZhZ*8Z$hD=Rsyx7Jx9K$#Ec#o^U?YPa0B~I~lKSZdBNnz-M*&za zpk4Brwlo2lYw|iwm-gpvoG5qQ0Fvu>AbhP2Bl7a{_zbIhrl<8xOq#_9fnzW=Jslbv z3O-~!3Kp5H@B2DuI?h2+AnS28H=Z-K71hl19WGgR``9;3*{~Rc6|npw2@2!F>184)A z3O;RbS4@{t6*xvKk={$hnND~{ysB==%wkzNt2W!8{Gjdna@eLA?+6nBPFUv{VBcX+ zZmuPu09NjRTMNxbGb1C6ONz`f%q)^|n)LV2=;4J7{09u-Id$dO?-Pt_Z@(_UI|7~J zR8@uXn)KZXze{4N#`>#0IJ7Db+Zzv+izy(0GBSL!a~a+_=8qPvt*>MeqEmqA-@s1vVZWbDz(MKzZQz{{w@Zl@ExDruWn0@_Qn_I!Uz(d4Y@=bI< zM|sa`sjA93I1sDn1f&P7Vd-K-A_Hy&?hXeWbNjj!waI5DZ%wA9vukEjNP*70Z|0AUIk5;faHF(YFIShU2{qV!P6`}gn3bG;A$37YIZ-HE;W z5w^U%+#N*+L}&^IS77%&D|!yx3t;|gcQ=cB>{cQArlzKbhxxd;!dqA{n(?|t#Q5(M z27P|QC=0Q%wPj^v1G+qb1*V|wot<+Zzfc|iBsEZx28{sj1WY;C>kGGFM?F0~TQy+d zMJqL|<39{+S^=)_*usKZj0Ipxqgjfe`Ues`6b2F|fDquEUha30u&I4{2=cVK`L7cl zpi8BTI==#FW-{;-)YA}#80K2|l15H#Wjcl+2+m*aTuh%kAuVkYRLup6fb1+Eo)4!> zHu~S7f!hn}Yfvzo7#ox4!v0Pi7Z0!1MF9XXa6mIMGWNFdzXdd{xC8qN@S@;!@D2r_ zUunPv1|}D%;hTXit&^ugBk8T1ATp~9JVtzcd;l_05fSll*_D<4)>J_bTPuwg$(Ty>C04jDD|11g5{c$(&<0Rd= SzJa%OFqGvro|M8~zW+BW2Q7*K diff --git a/class_p_t_p_list_parser-members.html b/class_p_t_p_list_parser-members.html index ff6d8c73..20cd64dd 100644 --- a/class_p_t_p_list_parser-members.html +++ b/class_p_t_p_list_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@
    vidThe device's VID.
    pidThe device's PID.
    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -101,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_t_p_list_parser.html b/class_p_t_p_list_parser.html index ee46d68d..28947f18 100644 --- a/class_p_t_p_list_parser.html +++ b/class_p_t_p_list_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PTPListParser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -107,12 +108,12 @@ Public Member Functions   void Initialize (const uint8_t len_size, const uint8_t val_size, MultiValueBuffer *const p, const uint8_t mode=modeArray)   -bool Parse (uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me=NULL) +bool Parse (uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me=NULL)  

    Detailed Description

    -

    Definition at line 90 of file parsetools.h.

    +

    Definition at line 95 of file parsetools.h.

    Member Enumeration Documentation

    @@ -124,13 +125,13 @@ Public Member Functions
    - -
    Enumerator
    modeArray  +
    Enumerator
    modeArray 
    modeRange  +
    modeRange 
    -

    Definition at line 93 of file parsetools.h.

    +

    Definition at line 98 of file parsetools.h.

    @@ -156,7 +157,7 @@ Public Member Functions
    -

    Definition at line 116 of file parsetools.h.

    +

    Definition at line 121 of file parsetools.h.

    @@ -205,7 +206,7 @@ Public Member Functions
    -

    Definition at line 127 of file parsetools.h.

    +

    Definition at line 132 of file parsetools.h.

    @@ -228,7 +229,7 @@ Public Member Functions - PTP_ARRAY_EL_FUNC  + PTP_ARRAY_EL_FUNC  pf, @@ -258,7 +259,7 @@ Public Member Functions diff --git a/class_report_desc_parser-members.html b/class_report_desc_parser-members.html index 7ea994e2..84967627 100644 --- a/class_report_desc_parser-members.html +++ b/class_report_desc_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -171,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); theBufferReportDescParserBaseprotected theSkipperReportDescParserBaseprotected totalSizeReportDescParserBaseprotected - UsagePageFunc typedefReportDescParserBase + UsagePageFunc typedefReportDescParserBase usagePageFunctionsReportDescParserBaseprotectedstatic usagePageTitles0ReportDescParserBasestatic usagePageTitles1ReportDescParserBasestatic @@ -184,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_report_desc_parser.html b/class_report_desc_parser.html index 5cf4d900..57f1aed5 100644 --- a/class_report_desc_parser.html +++ b/class_report_desc_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ReportDescParser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,14 +97,21 @@ Inheritance diagram for ReportDescParser:
    Inheritance graph
    - + + +
    [legend]
    Collaboration diagram for ReportDescParser:
    Collaboration graph
    - + + + + + +
    [legend]
    enErrorBufferTooSmall } - - + + @@ -288,10 +296,10 @@ Additional Inherited Members - + - +

    @@ -114,8 +122,8 @@ Additional Inherited Members

     
    typedef void(* UsagePageFunc )(uint16_t usage)
     
    typedef void(* UsagePageFunc) (uint16_t usage)
     
    - Public Member Functions inherited from ReportDescParserBase
     ReportDescParserBase ()
     
     
    uint16_t totalSize
     
    UsagePageFunc pfUsage
    UsagePageFunc pfUsage
     
    - Static Protected Attributes inherited from ReportDescParserBase
    static UsagePageFunc usagePageFunctions []
    static UsagePageFunc usagePageFunctions []
     

    Detailed Description

    @@ -305,7 +313,7 @@ Additional Inherited Members diff --git a/class_report_desc_parser2-members.html b/class_report_desc_parser2-members.html index 8a846094..2f4844f5 100644 --- a/class_report_desc_parser2-members.html +++ b/class_report_desc_parser2-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -172,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); theBufferReportDescParserBaseprotected theSkipperReportDescParserBaseprotected totalSizeReportDescParserBaseprotected - UsagePageFunc typedefReportDescParserBase + UsagePageFunc typedefReportDescParserBase usagePageFunctionsReportDescParserBaseprotectedstatic usagePageTitles0ReportDescParserBasestatic usagePageTitles1ReportDescParserBasestatic @@ -185,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_report_desc_parser2.html b/class_report_desc_parser2.html index 7d0cb156..b09d4fdf 100644 --- a/class_report_desc_parser2.html +++ b/class_report_desc_parser2.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ReportDescParser2 Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,14 +99,21 @@ Inheritance diagram for ReportDescParser2:
    Inheritance graph
    - + + +
    [legend]
    Collaboration diagram for ReportDescParser2:
    Collaboration graph
    - + + + + + +
    [legend]
    enErrorBufferTooSmall } - - + + @@ -298,10 +306,10 @@ Additional Inherited Members - + - +

    @@ -134,8 +142,8 @@ Additional Inherited Members

     
    typedef void(* UsagePageFunc )(uint16_t usage)
     
    typedef void(* UsagePageFunc) (uint16_t usage)
     
    - Static Public Member Functions inherited from ReportDescParserBase
    static void PrintGenericDesktopPageUsage (uint16_t usage)
     
     
    uint16_t totalSize
     
    UsagePageFunc pfUsage
    UsagePageFunc pfUsage
     
    - Static Protected Attributes inherited from ReportDescParserBase
    static UsagePageFunc usagePageFunctions []
    static UsagePageFunc usagePageFunctions []
     

    Detailed Description

    @@ -392,7 +400,7 @@ Additional Inherited Members diff --git a/class_report_desc_parser2__coll__graph.map b/class_report_desc_parser2__coll__graph.map index aa96289f..8f0cb1a5 100644 --- a/class_report_desc_parser2__coll__graph.map +++ b/class_report_desc_parser2__coll__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_report_desc_parser2__coll__graph.md5 b/class_report_desc_parser2__coll__graph.md5 index d407d228..af9db977 100644 --- a/class_report_desc_parser2__coll__graph.md5 +++ b/class_report_desc_parser2__coll__graph.md5 @@ -1 +1 @@ -e88568f5fec50e92ab94f403c7de23cd \ No newline at end of file +27a80771267ed2f61d1a7277c51beb79 \ No newline at end of file diff --git a/class_report_desc_parser2__coll__graph.png b/class_report_desc_parser2__coll__graph.png index 978d49c67593d03a656f97de269197e0228c5e07..9196dd1b5e248d2d44295cbec5cf48dde333d4e5 100644 GIT binary patch literal 14484 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%0Dk2_Gf;IE*Q>NdeH_N729_pDOCgL z6Rm255_o5{7D+GZOel%cuE(Qv9H0+D! zfcX6Br{UqorpTCHnz2Me1Z1!C{{#&GpM7ZK=m3F+w%y)b{nKTWPqZ=EnNs(eJsF3Gu+}zmft6N)7{JwaKtcC#l zAu*L7LdTob5A~^?1MP$l;F{5_8xK%j2&wI48fpHwDF0vM>)#ansZr2Xh#%TB&b!?| zf4*s0H{pVTfe4TTbu9mGa(9k#Z9S3Q1srT9V5Vx1hWOarj!mkp=IXWe>2nd=wm>ee z4|LK%^jC4!Y-xMGujc`tLCdV>cr6y1Nr5a8Fo!R- zU6vk#QVKyZFe>CoBY#Gk8fUlZOj|mU^Jz&5;x6ea>it+2ov@7!6G$siYO)&jy{N6L z`-$+ry;#S>#r;-P#CY_^t&f2#hCvdNHop0sh$v`e+) zRUE3mCZgPDv{*n0qo=(1b4&I+&+F#!s6 zwMbQh!miBM_a1T&fH;N{vIxxC8Hhtu=5nB4q|-tMfFyX%d^j&sLJsJ{10cm;KK#?K z3gpRkmSD_)Jfs5NmwQ~;Y1Z1HY)=(es@{QtUPm{%cL*?xy}Y7!b@|$oKe-q{9j?>r zjn+*kc+}GIK7auQZgvk@MPYzr#G;W+=>&o^0QOM8Fu)b0mR@EYtdwh;(=a065mhV*nund7!H z5>!8W^ynS%F*Z;$!BBQse~$3Y=T>k81blD2peL`_`4XD_Ot{c(0Jxq8&Jvi6=REy9 z5dQ_a{=Q2=K|!t;K#j?Dcyu%fAfBVGt+28(UWsX4$YtF=Vy<)dMtZXjG;1OW_0 zshK)0UJxH}E(2g@<%ZHj7zB{fq2PJrqwVJ;rKP2HgW$YJhQRCB@Qfyp7LJbyLjW^2<{Dr~PXSOcUdUSz`oJHPv>kL#<*rAc zkLr=kJ&cH3|AeSg6N6#0C=~iYUO_?b(5F)9c%AO z)f(r$`FMU;c95>X_{sM%4t4wtwMUTA9SXFD{ag8$yWatu z4hYyn`|o)0-|E$WedqzkhonFR=QnEN;6N||sjIJV*Jb7A#Qu&h&c;GMF9b9r=fIUvtBmbR%%g5F#Ne11)*4 H>-)a|hX$rQ literal 13989 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 nU@y-8Ikfekclp-8b8U9L diff --git a/class_report_desc_parser2__inherit__graph.map b/class_report_desc_parser2__inherit__graph.map index 1d00cb79..77e43e20 100644 --- a/class_report_desc_parser2__inherit__graph.map +++ b/class_report_desc_parser2__inherit__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/class_report_desc_parser2__inherit__graph.md5 b/class_report_desc_parser2__inherit__graph.md5 index 2edb6da6..5a0ef029 100644 --- a/class_report_desc_parser2__inherit__graph.md5 +++ b/class_report_desc_parser2__inherit__graph.md5 @@ -1 +1 @@ -a90860eeadb8724d3f4a2fd3d74642dc \ No newline at end of file +28f3942ed411cf191d1a779af42e8bd4 \ No newline at end of file diff --git a/class_report_desc_parser2__inherit__graph.png b/class_report_desc_parser2__inherit__graph.png index 7ad2e2682b0459bad2a80f3e382c18a957f46d0c..d7a61232ba74613586e460a0cd35054e073ecfb8 100644 GIT binary patch literal 5984 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 literal 6656 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

    2hXq$J{X#%H<4RWL4`pa~~2M@F#FZ zjKa3j={x4Mv|jC_c02R70+q_L;AiiLmY`yuzDE@ns%T(98?%EzFiRjUEo~u=7V$>} zHTXgV@^k6t+RF=R1I2n$tV{Xj2ctjncjY*&e~!UY>s2uX$}nSz68|n68{1w4^b%uv zd3lJhFsr_fh*tPcg4_v>QMt(*3@mI(gd->!%Brf*CO$o-k@kS)#PfUV-V`-0AiW5Z z7pJEqYimU>&xeD$q1XE)>KtUnv2u+$jxaF_U?9R^4 zjvRFO?Z`<%h9)K@g@9Jo_H<_k3cvvBgpGm z`Kr?A+o0tMi-=&CmuCWHU%}4KE+=6j5x58W_4QO58XD@ly5UA;Dh38gPhPp6O93zE ztu|L^LqkLLkfS)eloV~vi@|T@rZs4K228u!by?}Q<_7(lTLN?i zf%vvE0XyZZOW+~>K$Z+ObKn{4Z6}Ssoz(B&u&(ZIOvsDjY;?6apfKy3i>U_>9{jEq zhx85)_wZJ=gwTq-u=yHt_iU>D`Yxo}gm1b%2%29|u>Xxf(B^P`5cHtLJ)Z9Fb-t&DONE3PZa)`knSP77kowk&B?>tP@jMwW6Z~J))Dk?Ss0b<}@;o{?eTlqU? z|LSzf>sk%1qDxXT3Jd#cb6f0z+73tM)2N>*38Qsyg5c`58PLi<%*!* zLw*7x$(p2RV2A~_neHnQx;S-h?JfermSAAJF%VD-bb&_KMwIUL*`Dp{+L|qxrMjl3 zl8=wnj~_p_hqQpif`8lt3qlFH;SgX>0eSu$c;yTHHWq$9 z$utdZ?9q@-ou(cB(5~BNp&0?$kx$ds(Rpi78iqv5fUyK4HzN7Xb~1E}x2oeS2b{E^ z9Siqgb=+k0f`%0zMBlk#qf#c5X#}JoA-(76vuMC={+Ihb)AdgD!1!XXEv>BV21c4= z{i^`{5i(r}XsJ~IE`ZFt^(QGPIOfG2r-jBRCueJ0jVUQ9#REJIGr$5TB_+9nXxw%+ zzz^&Sxl6DII5)qjsJm!=xiiAm%m_5~YJ;XGG*dQLYuf}fSY`Nst zNbBwEQv~#!?Y)A>asU45IWL`4)6t)mg@uKOfOhO(z6^~Fd$|vK7Z7f;Ya5U`!2SB> z3C8iQpaoP700lIXt}MXO03{_18u;`nB>;!FX!|dINThO@VEZN6_iAU`nAEP~-&4(YWs$#cY9%!}PT>tT8rWpEpa9?9_aS`U|2vX+W zq)xgh9&^AEDI5-WJw`ok0TL|fdsO23XJ-LF3(ireZ9MHMz;kr(yj2AHgt5DT~ufY74uFzpiWMO5+@bU41!C=9C z_937kfo<_(;KQ4D?4C%W>+sSHB-~HYRP1+(_Dy<_nwWnkB?&61pbC>Rm%as=k8)0r`CG~wnUqQ)jpGY zM_T8_7CeaedfLls-(xsUoT_$)I1xw!Nbr<(5F^rSw;QxAtf~F`{npoH;JkQ*55)WD z8=Sr01qsiFGNmM6uY^@!1GXd&G~!8#jE(KO)uoI_HfnXCD*|dy(f6O`b46ck~= zx>U&1XW`<)1{NylSb=$e+wgyR-rp>%26`Zq&(H2I`t8bj`}#fu#qoo<6WyZ!;h<+# zvh=3{UiUer3ZsJ3(!L$3Vv#DFt&_X`|Nh>f_DM`ddAYKqBcJt(7jv34g6GHBm{Yvc z>9@5A?{0>sDohj_9cO)oGOiQ|l^PA8907{=GfraB6+t@?wNn=SC5QPxyo6g{q0af{ zz6MVUChW%ZZue~S)GHRVt&^anSXFl2Oi5M?{r(Sfz=I!_J7oZB-CP&Yfc5=@$liaN k612f>L3;dl3r9iq(}Kd$&Zo8DD;O?EnA( diff --git a/class_report_desc_parser__coll__graph.map b/class_report_desc_parser__coll__graph.map index e2c1f312..a53f7c5b 100644 --- a/class_report_desc_parser__coll__graph.map +++ b/class_report_desc_parser__coll__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_report_desc_parser__coll__graph.md5 b/class_report_desc_parser__coll__graph.md5 index 8bc859ff..60356562 100644 --- a/class_report_desc_parser__coll__graph.md5 +++ b/class_report_desc_parser__coll__graph.md5 @@ -1 +1 @@ -98068a7aa912a8da28e63e8afb9a1494 \ No newline at end of file +4eeff98c7d713241096fda58cb34b342 \ No newline at end of file diff --git a/class_report_desc_parser__coll__graph.png b/class_report_desc_parser__coll__graph.png index 5a35805a452353c6f14a936ec25df4a19a3cfc63..71e7d2d8d1b7db0a01ffdbb11063fcd3cba8800f 100644 GIT binary patch literal 14323 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 E1)I-NkpKVy literal 13821 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 - - + + diff --git a/class_report_desc_parser__inherit__graph.md5 b/class_report_desc_parser__inherit__graph.md5 index 643203cd..f89c23d6 100644 --- a/class_report_desc_parser__inherit__graph.md5 +++ b/class_report_desc_parser__inherit__graph.md5 @@ -1 +1 @@ -365ba2bc5b9634b96848151575c7bc86 \ No newline at end of file +d91197785a3b88c599def77d68a6ee2e \ No newline at end of file diff --git a/class_report_desc_parser__inherit__graph.png b/class_report_desc_parser__inherit__graph.png index 36469a0984c8fd1592dafd389ce14664918e3454..06451a5d62f7772ec703ec48379dca1a362f1b82 100644 GIT binary patch literal 5826 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

    @@ -171,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); theBufferReportDescParserBaseprotected theSkipperReportDescParserBaseprotected totalSizeReportDescParserBaseprotected - UsagePageFunc typedefReportDescParserBase + UsagePageFunc typedefReportDescParserBase usagePageFunctionsReportDescParserBaseprotectedstatic usagePageTitles0ReportDescParserBasestatic usagePageTitles1ReportDescParserBasestatic @@ -184,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_report_desc_parser_base.html b/class_report_desc_parser_base.html index 41758c09..38370a9a 100644 --- a/class_report_desc_parser_base.html +++ b/class_report_desc_parser_base.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ReportDescParserBase Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,14 +105,21 @@ Inheritance diagram for ReportDescParserBase:
    Inheritance graph
    - + + + +
    [legend]
    Collaboration diagram for ReportDescParserBase:
    Collaboration graph
    - + + + + +
    [legend]
    enErrorBufferTooSmall } - - + +

    @@ -121,8 +129,8 @@ Public Types

     
    typedef void(* UsagePageFunc )(uint16_t usage)
     
    typedef void(* UsagePageFunc) (uint16_t usage)
     
    @@ -307,24 +315,24 @@ Protected Attributes - +

    Public Member Functions

     
    uint16_t totalSize
     
    UsagePageFunc pfUsage
    UsagePageFunc pfUsage
     
    - +

    Static Protected Attributes

    static UsagePageFunc usagePageFunctions []
    static UsagePageFunc usagePageFunctions []
     

    Detailed Description

    Definition at line 22 of file hidescriptorparser.h.

    Member Typedef Documentation

    - +
    - +
    typedef void(* ReportDescParserBase::UsagePageFunc)(uint16_t usage)typedef void(* ReportDescParserBase::UsagePageFunc) (uint16_t usage)
    @@ -344,11 +352,11 @@ Static Protected Attributes
    - - -
    Enumerator
    enErrorSuccess  +
    Enumerator
    enErrorSuccess 
    enErrorIncomplete  +
    enErrorIncomplete 
    enErrorBufferTooSmall  +
    enErrorBufferTooSmall 
    @@ -987,24 +995,7 @@ Static Protected Attributes
    @@ -1026,15 +1017,7 @@ Static Protected Attributes
    @@ -1056,18 +1039,7 @@ Static Protected Attributes @@ -1089,34 +1061,7 @@ Static Protected Attributes @@ -1138,29 +1083,7 @@ Static Protected Attributes @@ -1182,18 +1105,7 @@ Static Protected Attributes @@ -1215,17 +1127,7 @@ Static Protected Attributes @@ -1247,21 +1149,7 @@ Static Protected Attributes @@ -1283,15 +1171,7 @@ Static Protected Attributes @@ -1335,19 +1215,7 @@ Static Protected Attributes @@ -1369,11 +1237,7 @@ Static Protected Attributes
    -Initial value: +Initial value:

    Definition at line 57 of file hidescriptorparser.h.

    @@ -1395,13 +1259,7 @@ Static Protected Attributes @@ -1423,19 +1281,7 @@ Static Protected Attributes @@ -1457,29 +1303,7 @@ Static Protected Attributes @@ -1501,12 +1325,7 @@ Static Protected Attributes @@ -1528,34 +1347,7 @@ Static Protected Attributes @@ -1577,16 +1369,7 @@ Static Protected Attributes @@ -1630,16 +1413,7 @@ Static Protected Attributes @@ -1661,27 +1435,7 @@ Static Protected Attributes @@ -1703,13 +1457,7 @@ Static Protected Attributes @@ -1731,14 +1479,7 @@ Static Protected Attributes @@ -1760,24 +1501,7 @@ Static Protected Attributes @@ -1799,25 +1523,7 @@ Static Protected Attributes @@ -1839,15 +1545,7 @@ Static Protected Attributes @@ -1869,12 +1567,7 @@ Static Protected Attributes
    -Initial value: +Initial value:

    Definition at line 72 of file hidescriptorparser.h.

    @@ -1896,17 +1589,7 @@ Static Protected Attributes @@ -1928,18 +1611,7 @@ Static Protected Attributes @@ -1961,16 +1633,7 @@ Static Protected Attributes @@ -2036,20 +1699,7 @@ Static Protected Attributes @@ -2071,15 +1721,7 @@ Static Protected Attributes @@ -2101,23 +1743,7 @@ Static Protected Attributes @@ -2139,15 +1765,7 @@ Static Protected Attributes @@ -2169,20 +1787,7 @@ Static Protected Attributes @@ -2204,14 +1809,7 @@ Static Protected Attributes @@ -2277,22 +1875,7 @@ Static Protected Attributes @@ -2314,13 +1897,7 @@ Static Protected Attributes
    -Initial value: +Initial value:

    Definition at line 87 of file hidescriptorparser.h.

    @@ -2342,32 +1919,7 @@ Static Protected Attributes @@ -2389,11 +1941,7 @@ Static Protected Attributes @@ -2437,30 +1985,7 @@ Static Protected Attributes @@ -2482,17 +2007,7 @@ Static Protected Attributes @@ -2514,14 +2029,7 @@ Static Protected Attributes @@ -2543,11 +2051,7 @@ Static Protected Attributes
    -Initial value: +Initial value:

    Definition at line 94 of file hidescriptorparser.h.

    @@ -2569,19 +2073,7 @@ Static Protected Attributes @@ -2603,11 +2095,7 @@ Static Protected Attributes
    -Initial value: +Initial value:

    Definition at line 96 of file hidescriptorparser.h.

    @@ -2620,7 +2108,7 @@ Static Protected Attributes - +
    ReportDescParserBase::UsagePageFunc ReportDescParserBase::usagePageFunctionsReportDescParserBase::UsagePageFunc ReportDescParserBase::usagePageFunctions
    @@ -2629,25 +2117,7 @@ Static Protected Attributes @@ -2880,7 +2350,7 @@ Static Protected Attributes - +
    UsagePageFunc ReportDescParserBase::pfUsageUsagePageFunc ReportDescParserBase::pfUsage
    @@ -2903,7 +2373,7 @@ Static Protected Attributes diff --git a/class_report_desc_parser_base__coll__graph.map b/class_report_desc_parser_base__coll__graph.map index 3da1e2fc..b2e067a7 100644 --- a/class_report_desc_parser_base__coll__graph.map +++ b/class_report_desc_parser_base__coll__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/class_report_desc_parser_base__coll__graph.md5 b/class_report_desc_parser_base__coll__graph.md5 index 4ccc7df1..668df278 100644 --- a/class_report_desc_parser_base__coll__graph.md5 +++ b/class_report_desc_parser_base__coll__graph.md5 @@ -1 +1 @@ -3aaf77127ccb15eb053d63ecd209b92d \ No newline at end of file +b9d3bd37562883d7bba8b8814d6dc468 \ No newline at end of file diff --git a/class_report_desc_parser_base__coll__graph.png b/class_report_desc_parser_base__coll__graph.png index b8eb41b140d7e48980f520e7ab1e10347696c7de..6eea22d6002f7def03b0c0b7e71c6af052065974 100644 GIT binary patch literal 12002 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 literal 11535 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 diff --git a/class_report_desc_parser_base__inherit__graph.map b/class_report_desc_parser_base__inherit__graph.map index 16c8c751..5372b1fb 100644 --- a/class_report_desc_parser_base__inherit__graph.map +++ b/class_report_desc_parser_base__inherit__graph.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/class_report_desc_parser_base__inherit__graph.md5 b/class_report_desc_parser_base__inherit__graph.md5 index f0e80d19..92049196 100644 --- a/class_report_desc_parser_base__inherit__graph.md5 +++ b/class_report_desc_parser_base__inherit__graph.md5 @@ -1 +1 @@ -0cd654ef024537560fb4e09bdd02d877 \ No newline at end of file +e17b83123517010d14d04955e7bfd25a \ No newline at end of file diff --git a/class_report_desc_parser_base__inherit__graph.png b/class_report_desc_parser_base__inherit__graph.png index 82a9268490bbde4561c27ff4f04ebf27d331623c..4ceac2e492b2dfff4d9e33b18653d63e2e9a48c0 100644 GIT binary patch literal 8448 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 literal 8893 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 DeakwY diff --git a/class_s_p_p-members.html b/class_s_p_p-members.html index 5e31fd60..e4f89282 100644 --- a/class_s_p_p-members.html +++ b/class_s_p_p-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> -
     All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -106,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); operator bool()SPPinline pBtdBluetoothServiceprotected peek(void)SPP - pFuncOnInitBluetoothServiceprotected + pFuncOnInitBluetoothServiceprotected read(void)SPP Reset()SPPprotectedvirtual Run()SPPprotectedvirtual @@ -119,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_s_p_p.html b/class_s_p_p.html index 52d2fce4..4c649780 100644 --- a/class_s_p_p.html +++ b/class_s_p_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPP Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,14 +99,22 @@ Inheritance diagram for SPP:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for SPP:
    Collaboration graph
    - + + + + + + + +
    [legend]
    - - + + @@ -206,8 +215,7 @@ Additional Inherited Members

    @@ -161,8 +170,8 @@ Additional Inherited Members

    bool checkHciHandle (uint8_t *buf, uint16_t handle)
     
    - Protected Attributes inherited from BluetoothService
    void(* pFuncOnInit )(void)
     
    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
    -

    Constructor for the SPP class.

    -
    Parameters
    +

    Constructor for the SPP class.

    Parameters
    @@ -269,8 +277,7 @@ Additional Inherited Members
    pPointer to BTD class instance.
    nameSet the name to BTD::btdName. If argument is omitted, then "Arduino" will be used.
    -

    Used to provide Boolean tests for the class.

    -
    Returns
    Return true if SPP communication is connected.
    +

    Used to provide Boolean tests for the class.

    Returns
    Return true if SPP communication is connected.

    Definition at line 80 of file SPP.h.

    @@ -289,8 +296,7 @@ Additional Inherited Members
    -

    Get number of bytes waiting to be read.

    -
    Returns
    Return the number of bytes ready to be read.
    +

    Get number of bytes waiting to be read.

    Returns
    Return the number of bytes ready to be read.

    Definition at line 797 of file SPP.cpp.

    @@ -336,8 +342,7 @@ Additional Inherited Members
    -

    Used to read the next value in the buffer without advancing to the next one.

    -
    Returns
    Return the byte. Will return -1 if no bytes are available.
    +

    Used to read the next value in the buffer without advancing to the next one.

    Returns
    Return the byte. Will return -1 if no bytes are available.

    Definition at line 805 of file SPP.cpp.

    @@ -356,8 +361,7 @@ Additional Inherited Members
    -

    Used to read the buffer.

    -
    Returns
    Return the byte. Will return -1 if no bytes are available.
    +

    Used to read the buffer.

    Returns
    Return the byte. Will return -1 if no bytes are available.

    Definition at line 811 of file SPP.cpp.

    @@ -376,8 +380,7 @@ Additional Inherited Members
    -

    Writes the byte to send to a buffer. The message is send when either send() or after Usb.Task() is called.

    -
    Parameters
    +

    Writes the byte to send to a buffer. The message is send when either send() or after Usb.Task() is called.

    Parameters
    dataThe byte to write.
    @@ -412,8 +415,7 @@ Additional Inherited Members
    -

    Writes the bytes to send to a buffer. The message is send when either send() or after Usb.Task() is called.

    -
    Parameters
    +

    Writes the bytes to send to a buffer. The message is send when either send() or after Usb.Task() is called.

    Parameters
    @@ -485,8 +487,7 @@ Additional Inherited Members
    dataThe data array to send.
    sizeSize of the data.
    -

    Used to pass acldata to the services.

    -
    Parameters
    +

    Used to pass acldata to the services.

    Parameters
    ACLDataIncoming acldata.
    @@ -608,7 +609,7 @@ Additional Inherited Members diff --git a/class_s_p_p__coll__graph.map b/class_s_p_p__coll__graph.map index b28515dd..1a07ec6a 100644 --- a/class_s_p_p__coll__graph.map +++ b/class_s_p_p__coll__graph.map @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + diff --git a/class_s_p_p__coll__graph.md5 b/class_s_p_p__coll__graph.md5 index e502c303..7a218c80 100644 --- a/class_s_p_p__coll__graph.md5 +++ b/class_s_p_p__coll__graph.md5 @@ -1 +1 @@ -a1450c75115ffac08811bb784fe195ac \ No newline at end of file +cad9aa3d2819cbf714312820a38ed5ae \ No newline at end of file diff --git a/class_s_p_p__coll__graph.png b/class_s_p_p__coll__graph.png index 8800b61aab386479150e2434239f463e2a44c763..3184888a199d3f556eaba98aacf3a546f62f06c6 100644 GIT binary patch literal 17830 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 literal 17661 zcmd74by$^a*Ds1qh@h0TSTsmC=u|o;-6^4ffOLZaq99$;C7see6{JDByQMoOc?Rz~ z-~M91XYYRx>sr@bYsNG0=Z-PPFUI^LFDH(RO@@tufq^S2@j?*;<5C0sYma#uo*_0h zNrQ*$FQvs_V4Pq4lUS1;ih*$tL-NHlWvAG+aYt=}gYz4kosU*2H7 zQIeZ->*!fCUPE2M}zz<{g3b#jzA^ zxs0LdyV#k~nIM8nPX4fhC|_J(ry?Z$ZBMkC(uKlHq-YAHKG@pY+TNb2#1AkwGI}8{ zZf>-#e@yr^Gk{v;k3ANJ;aUD$9nqqnTS^!h4)>6kFoxa>Uc=D8u}z5aj4zj96e@f1fjp1(b8LM(cN=q{`G06x&yni1dE>25BlZ2Ma z&5N3lW`^r2%elB5ogN>|BXMwW@^z}xcrVHJ($LV{x^*ilDQWw?PL+dBiJ8jNr%x3W zZqv-|tqdl(?+=fZm`^${QX)R9GwBu@eTj>U`|)Gz2DMvIbTosfftguWW@e^fjvmTm zZDYgA+ z8zbaVu(z|jMageB_4BC(Y`s~ z7J0DTFFo-=ovHTibluV3ijIy>Tx{$>zMkj$7#~7HPVP^ffMeF1ScD2E2HiCRH> z_}hnDvje$WlU0s^X-mn;_pe;JVv_xYk1s0CG)iV5Pp3-H1MQu*)Ss>9xZIa1g~O#tLBZD6);WLahaq!wMnBZsWl*NQX^xZb zYG>Q3*OiA<>+vl)g+?A|1)1@~JD@iN;jOz?1qZk+ZY2x3_mU zr_Su3+86hK6ci-VWw{=#d*L_eoJ~zlWvk`u*1GWt3JTu8pDb1M{{4Fm4UHm`j_sYD z7*5lkLgTj8wKZ=94bAuB;^M->kf_z6ABL0y4()AiRqn?QgLyhD8KJ{jD!*G-vl-{D z?p!IB*_)h1%E?7YJcQMQ*Eu*j-S(ElXWo*N$54A5KCAVtaoT!GLP8QHBi6g?N5Xpb z@~?Oy*VoY#<<==BCHA_yRK2TxnMzStFgazL8XL*T$#>8v45kG}Eq9{R$}C0~W@he? zlWWzKE*~HF?}S~$SiV&~DEriwN;Hrm=0 zvc0y8fA%&v^^evgnKWKnSk%0oMl5(MX4(xG8cRw_!p)1E9U8*6est%HASNbFOH0e7 z=lSW%VE$l^Mv=#fq{!#PG0yH7HjUu`+G~huTEflHU&r~hiZ zbbS0D!SaeTHpb6e|09C_^JHu%UZS$={_1q))qwFD*T|JS(Ky?1mDSbNL$@;+IA6{) zwX)nVEkV`Q^_f0xG#8eYsd8ur>w^@ zbNq@8C;m2JqG)pq{g(ha<5Hw)w3pB1bme_qFTrcCZ~uv{Xqr`MH;j@YCfM1XZyOwo z`0jjhZG_XIMdmIl)cMej;r>H3`FV(nYmJ%SLOI!MUK9t1aM-Rv7!NZ==GlN5@^cE(PezC%#d z)4P+Uhec1^R##Wh*7+E|;FEwogQ~cXUhmx_^v;Qwmy9vV_X-#f+4@{d)&1b&(jURW z)~!rpMbl@B7-W`x87vwaqV2PFbv?z!W9#FT^M*o#s}=Op1Q)L}H%D<;?<|}~hnK{y zAUFy35B|4o^lwwt|KFa}^hL7h)y9T|)Tz+_yesTho|0myq>2CK1*AP9A|fW0tNw$# z$WZ){_;`=$x@+96Gfc21P}e66<=m% z&ehb#Y@J=@utWzG3btv8|A{(7XD;L|WDkK>HJ}>WzR_<+tTr6+*E~#=am#VaM zcI(&b+lhC+Jmlo;8y$_wKKeO2s&zk@^T+M9Ytd=L8JJ{&;V_o_;Zil#)ld^m?4}Kg zDiAVqWCWP6!U=SDbIZE<``=avxPO#aso80?)|OKSwX0(Pd{F4un1ps#wI3^VhhU4%i(2FQBhnMa}JIoNUA)=Qzs`UkO|4|-u3$Qsqy!3 z8JO9@!Gja@4z3vtpOKgMuscQEpXGTjy)&u9+K7FBmI`F$cCu{t|@A|y1_ocyJU2{9!l zGxgqLf+s&OZ{J~^`CwjDbo2nP)ZG`8s`qtvsLH;M>q4Aec~yDLuoRTzdI`%qctXkx!Bl-D{NnRcnI&<{d{++ zGhQg$T1q&<%Gg+Cmd-bMp(Dm|e^p~46Dqb!yUdc3lJM~Uo>b|Ems_+6ZiSH6Ox{4% z^zwb7<&6^T7xxJ`>to-S(F_U7VbLLQnVFip7uxbVI^gr?f|3#3i-iZF%< z+uNSiAbdpFV$5+TcOzqNO({)IbQhH{vN>HpZ=UAH724@Bo=u_C<~!0At?@@GI_=RN zNjtk;IBo)t>+Op>A3uJa52a^kV^fIj=ilz@=wKEQh;eq?nrUFssSJyVAR{A#bKJ#w z5gfu9)q1ceud1mHhSDP0dqrG!CC4X<`q;|S4Xy}{P4~e`UG~u6C^TTaA|e5 zUD4-i&JXFb6W!5T{5q|GBAtfyx$*L!8)EqPtp%>}(Zzqz^j`Sa%y&9}C;54`^V{rm9IBmcW> z$xxcZ>3k{HUm8!BRr`mIJNrY}=J=fIUSedRqBh5Tc2qLIY6U+WG}E{75I5=KKLmaI zmXVrjY-NSSOfq$WWV79?O6Pkt^%2jkx_a>EPkl(bq;S7{eEm&5oHY<;14YihIhz?6 z(CB@>zy{sjUigsHU_>0R{@86y=+sh>!aXi6Ew#@=!oVfx?(6;o8vttWw8KmaKARUz z#N>DHs%vRMVP0I!Y2pN6H7<^FN1ckr{`F|-TD=b*5lNqxUb2zBTiE>kJbM%q6H`uN zqW(gAREn7Y%hKmqH0_@D2nj_+#nDm=ERwb-kZ11Q(_b0Ly>k7gdX>W(l%(@M*Ru6% z1>y4(6B7Vy{QdpMD{N^wvP$<}DEP13bRI=r%A=dE%4{VZlzGgbonaWBZ76E-jY0B! zAon1@_NcX`g`SFl`4JMz z%7i;1lA(_;qE%|@qlXXemixZ&&A+RzAW#^sT}FzW_CXAW{JuCpuLJS9zdt-VqcV~? zckJ|(U$}L9+XkXNtQ&w4s4f03Ermx$aumUKFMu5R?b}@#6=3TgDZNkZQE%p&gJDM+ zsZs??%uP@K8f*OGoHWD6mG-Ny4&j^ZaejKx)1zpT!omqYLFDV(34E-y-VpL>{nynz>yA61fT;v1Ol7RHsAfty?L%b9`Luk6k6%<^*U z?n$0*O=WShval+oL9Mbs_4UtTlXZ7n!{&#-?M9+=1t%w`=FSOu3fR0Gi;IBo8J%MQ z(86IQ!MwV#umDU(Flrn!`PZ*s=iD!Erz!z~a`*0Qb8~Yuv*nc)Mv-DQEdki55Zoa< zaB*|5_h%1AalD$d(vg>+0^Y>Z($dhd=ymsf6W!&gYk>0rM!{M@Zg?Q}6%JrQadD38 za8GMTZ>30USC>33EiEM_B~){e;EpCWaImnf?d$;fY8Dzv8XG_2_`x1I4ZFwA-abLl z`M#$gOfpp<2^AF!vET8*h83_+Y65qT>hVO1&H7s>COj7Z!~ud+RaNE6qxEI(;>zX7 zicN=dE+=Mtr?`_zM+k4=|H1_QdVw%$&k zo}Pv+;JlI@7L}frZ`~$uPsfK0N47X?k~?&g<%OF28WmF>L_pAz=%n=R#rEK&1dwi{biMg*Hj5Nx{t|VF=aAMh#Enxk;cF zw?dunk6NMTEAhEL8Ds7l7#o+k9$4mO-@AISas@*lAml#;+J8kSP2{J?Zo-pIP3cF0 zQe_fh73ix7C-x|L2IkO~R-;12s2oTfky6seh3wHL)32J$IU!3uF8#T*h6R)^R|F66>s%D81`$c~A*??7QYC|0#0$0b- zVt3?#i+V4>^xQ(yR_dX*ENi0mw?ZO?;yM*=IFGJ-Qlts*H8F3=1$=3FbbexnOXJmS zbk59ZVG*B{R2m!{k(mj{bE3e&LPln&LR<`L#?dmX$uMFD1_qDgHJ(i6Rw*Hdmy3UV zknz=2LY2AcuTm_Pe+6F*F9?{CD#wjldv?=2IrKGY$xl?%w|n2&N#zf#VF)LjcZ*ZQ z4(0k0=aTos?iw=owYGETi|CZ+nA0V9$U9x+tjhu|EG&fde_}MySk2MXg|z&gZ>tZW z^i%!Xy-erZ#fd&WXxOMV&o3U)Ok}O)B_nq5!7ntZKQ!$4mF0)BXza_L6jl93DE0RBFs>IGFJ5epfjf`2|@n)dfhwm9bLC0UeUa9Bd zT82q!P|iha z{^NmBQQirj9-Mrnr%oMhJv|cpdT+ZpWm(nV&doIV*jK-JASt>#u2&cs=>CmV2SI>9 z4SPRt``jjB8z5!qW2&X2qhx_l@I9xUqZ4K;>~?NKih6nwIcw^L(xMJ_I?vqB$Z74r zMU&-d?m-aBN?(jX@8F3zZGNb_%oXe1Kz>}nDQm>;()jgCBy08D;pKPfI6LKF=fLs7JNNkgnYymdQaY9E)XMvDL2-_Y zOi;zgjjyCP&W;$vLqoy>X9y%K!e$0fN>Yu(V#Ib|kd7|hnp}U8MOiv!s<0+_tyD|Vgs?j^+H1*kw9?;!iGhqvom)rn0>A{>gk_9zq4H=cKoYf<76#yem1!_>X=)t z{oB4K`uV*lb354{zl_*58N$)W8(;if|46Dxnds*UvHTuCqP#+d`otk;=kFZwv7MJL zoAmBCbF7gi6-i~PgzB>IxZ*_pINQa)F230F+)g-Qakh7KY)ryB%*V%FK4{XPJp0qF zwPNepVcnYA;nFqjXV2)>QqAsA1+ues=L>5ygsUijc6WDt^@@ZZ#W3H?)qV83%x_d( zdby)u+EgJgh1p4yq4L4lz0SNEVWD{}WQ+}ZD7NYNRRA4TzkR8HQi&9G$4~T$|L(47 zUP(#j`}cAd1apfx&k<)6WgD6X2E%{5buM52#3zvb_nDnNoBq$nu&^wVmr(3~R~%_+ zVdr%U`1sMqv7t{-QTePSKjC(C*Br_=rAE$<)Ar4Bs?=Dr@$MR>#(}5%JoiBIB)cmj zxM(NDmMX0E`|mEr(M3D)+5jo5%lDBnz-xc`Tz=4t^!%PW@8aU1UEWnBj@MD~RO9MI zxrPCE$7{Gs3UquZI?<``JX4G}7B(}DY3t!m#~L+wJs(b0Rz9Y8rs?6D4;1ct#wJ6W zX0gYQR17pU9-3Ty>f$nSb~+eH<EUXxS40*Q9MhHf8ARL4kD85kFV^H} zsV7bV>AL@h$9&*jpz!un9~Jkn6llX3?p%kB_&R$UjAkVw5HLzT&-W%h{L0F#xC|SQ zA!wzir@t3(RkvGcuR-qwYNKj9h*+Q$C=AqZfzqt zJ6iFFiBnefZSr3cc3i(_r{4ei{LGx3C%(r0nDJy#!5A-K{`b|If+b7ALvnGU_a^b^ z06`Ud75*GJVh$VY&GrgesnyzjDNRQewl`pt&sP!;bg@ULVdal7>-XI*3OrvOS&84V zn2a;a9Vn~HBi~jQdP1rC?3w3SO-#V8>}75Xe%IBZNj5gUrDe0`PsrW<_Q6gDk;CpU zD~RZ<-SEFHX9C3$|Gs9vD(xAkrG48aVgR#`m=qR$LkaBjrKZYZ*2<6 z*nhhptTSqp^f=95o5Ar@WELRX)iTiQjFcw~4+&8`z!#;br&snzF=oD8j>iF-78(D> z$Vhqgsx}Np=*pG2me9#62aEY%A31Qay;8(Zc}--x8vO9IrsA7mgjVBHU;I_t>0M z+)YLKnIC*a*(&#ruA)42qYlbtu&hApB%+`=`P=>AQMKB~dq}R|C`whmSmBzk_ICY| z;?vXPvhrKmweE3M_T~WB6JVrw2@?vJ%yxeT%3WVrb`+&xet?ItkwZV45XtyTEyv2r zO6$eTn=wXndoJ@r`8&-={i$@e?GK_^pL8ebuR7ovEsbMjP;6BF$ncHh)f5OCy}di- zEZ=|8Q7xTi$}&chc|7ntsY;-_eS3O&+059O2p?ZwLjyg){oug^kO+5ocSp*sJP$Vw z(3?|J`hX~;rP~0?73bt+u86hxwPx^1dY*447v=X);Re{t&=dPzNPJKOLU|1g?hkeC z1avYT1CV#)<268XXqCR9@dEwP2fwFsPvq1d=-b{j*`k7i*YKdPuMhuEu$Zy+x=XvF z;t`NDRaM6fuNLQ_6k>mn@@~a9I_|}N_l+8>!5qF8dm1KbIl0GPH>rgMVdePwM}~(l z_%Tr7FL+s^^f0{J*xr?ul~B?C`SZvB*6#LycmXC*o+!|G<>`z@NZE}(SH}@Cs&ZB` zL@5(HZqAB|P+qjnM+qdG4v;2QuoKk}Me zT;#|P;aOQ+TwGcL+Lw%)dJ>q|v}dmprd82bHC!p%)^hZ8ve;o+z}4kQjXc5z7w>ip~&0Bw|vs-hwg{@G={z->2% zKXiM;7?&uQB)HsbE`n&x-a+)rc`Un}lAY~-xT&X2QYQ?G=ED1!7%dZ% z$2;mS_7;vm57-ddPUq+Z{-09@5i)`EnOjyoMd$I|KwJ#l;}xV$uBXYzzY( zUB-mmXsLfSQCa*`^SOyz5piU1X}-Wpxn;v9dje!uDLM;rmXOE~xLY_O0ZMm4Sy|bV zqM~e1$yG#rDX)xAzdt#n&rR#e0-8d#{JrQwg9dF6m*qa4Je(|du)fZ4u0Qd3iFlXUqNB($doN`PjI)_BJ*>z-`#t z`hET!R7L>2_20j*;XE6)gaF!J`1Xs8h=c^jp>q%aTTD!66h}Is#!~csI4QZ?qH>i3P9_x+0O`>+UADuMljcp2-geP9rQJMj*+$}X27bDUCHl#J-uO39-5qh|Z_Oc?+9^Kp%$>o3If z`JCRGc+_sr29}vW^$Bm)^*CBxUip?tQgiuD|BQ!p<|0mgqlk+ed;Syus!;y^8=epz zvDB9#x-v_;`7>Q+t$ej#_QG33vAQi%Cl}pKoYt#aNCycx>uBl9O}f znWM!48}9fi@_*&t;6oX>Kfd$j`}glgz(aK?tJ_!LNwcy@O5bc-dD7!Hgtyi~u@^n7 z6DFe9fqi@|U-bL;>c<=TKHlTpT>S?J8v^D77)nZe$HND~4?K&@tV+xyrB04aml(H} zG6S!z?TVeu<+Q5(^=mWw;aWsZ(ZRNnIBDhm(U^Acc&y@spm*imLd402C(prJ6-&63 zyPHdA3{UePxu5n5xQU7=kLdI7Ckttd^`37PxAc&{u~Evq#mP->T4g_o!!*~U-d=ac zwra9dKizKYkByzV{a_-B$Eu*xPJMb1NuKniq^?U-tLby6J{ z8_u2aYs5^O6#T_0%aby;leOkC-0+cSq(SLj`jE;69JJ471H~;ZxqH(O4z`ywTTvg> zR39%7+nz#lBxdQ0)f2ha?uS^UR!wqXWN?aFGSii+Ag;4m8O3TrYp@j#YT+ROS6{$kg@;4`CGvm;5_P z^1a$amv8^Gxvh5E@RZB<-L-@wD)0H_yW3Umuh#%|r{~^D@Pqp0^6?y{>iRmj?c%MY zxlqfIk+B3f4&&B|Z5svkA-6}>gZ(8-0E~qe60JF692Mc8Kf7Lj{~qNz30OAzTi?m7M630Gt$~9bPjb@Budr^c|2dmFj~%H_ zzpnQ8iXSXZwQ^Ry6jo$HT0CoY^^xi1(_=XT=9mqgr(86!cHeGgk5}cxe)>wse!vnc#20!n^*Zl~)*SE9E~SY1ilem#^Q)lrpHbq0g$^6F zcWztft1#9>4W=aL6aHAoBibYNZ)bi&x8e+cV|7t}>W?^G@fo;lAp7SYf|zeSr`iy0q<-!HQ!E++}|eH#BkDx=3>Z}`>ov9ajv zdhEyq1jn=Z57@W;Qqz%5>m&B_TeGVsYXypD^Xak*+lcS9Q|9FQ50v|128mh(a`+vJ z1~9zp#Uuje}M809X` z8rzk%9F(3|NhR#I)yAs!;Qo4vr3JsSl%D5#Et7*f*VcBgFQR2B6WLB-FMgG;NF_wu z_{T%~!l|v6>f~2M+~Z#b<%3JW- zp1h*sZ8EYV*m~8~A#8?~e-bv9mPabTSa7dzD`|?czN=H(y?(mKdV33aU?O|r z?g^Y+T?r8X@@&$a^Ld<<2L|HF_5$u`){x9kP=WI>WbnPB_r_&P!`P_&sJ`PPV~qav zNvTnb9Pj$$G?M_{9m#qcxF>M4`BQaG% z%gcEi(!radlqO@Kds&`xn@}_2-`FR-g4hfjjX)fJ^=h)x-VZUZ+v%a;~VxA~Z^bKcxP zNHUfL&BHW0ZKVujR2A;QU3IK~_?7xYqp`q#O8r zxFS;q=^TAA6ZqVWsWzReL1Opu_TF-`8kP=4{RUkG+!Y|Mb8&H5OfWnXf?;2CUP)4f z!j_?T>QjWgC$Go4`LOM;ERl#PfO07f3`#8n^Aix(>1LrIHVV*JSmr ztf+~JxxobRxYY0`&&2kh4V3Wlg2OaAO>KT^s%uy5slR;r$(5(;Tbb1>lfq?d1}9sr zEWkf3Us&9resR4-qwJ7VkSt$k&z$H1wy$%#j@ziOM0XGbRFXn^&Gvl%JS$NpFR?|B zz+_Gh?Od?cxs^dZNB>hKq;sL|J131-*F&BkIdk5hSA3tsIlqJnCg7shlkYa$RvSzS z$W&drsp9+cBH&CzV8TUz_MUBgSIP{N3wRNasQ=gdA%Z=9tjg;c^jNf$0b8-PA{(<0 zZ=3MloDd6ROI8khP`Yet{Bu?jP7HYRdpzTusmdu!^KUyvW#M0YEb>-RA1u8ll@!*x z7uuW^$k0ZFlA=@bkW5U2h3~1Ure$KqALR8-7fp>9&nN67frC)F+a?NBK6m~RHFJs* z>l8jiAIUoFHD;aTX_M;_Birdnxy9jqPPWosgZSmBX@Sdo-pA6Hstv3T)H`L@M(_yU z>R@J2uWnqyDEL1a6IriqegbZ>*rvPJD)n?<^3nvD0KuF6-;8mIZ2!e)wH^soq&%U@ z0q4cG#qhU-lLkIUu>F9U6l}^Y+T}s`ArTQK1_rtkzav{GN0qH3BoV2oyy4I`3c4VF;P(>LPD8%!QrtnH!w+g1%bet zBrnlxr>Z&t*x~f_6pIGbcNP{Fu#G(Qx_a%JJE*XLyw`ivJ8N7IOgiH`S}5LccVQ&z zBg?8XNwDXTp`oEzG$8Y}_kvmp0jY9CV-##aVDs5tiuxj8_xJ7JE*fVg6masj*3r1& z4z*gGnW+;5pFvxDyAc(~C8=IJQ`4pG`8J=MqzF`05qJYYSPT{cTdch1ub)`3Z%5g* z;=F>se}AZ@HOgQJ#t9fn90-x2p((s$-Q8Pfr^nmrc+|pg*7@IS!BO3GNbo#EgNqj% z2S+VelMB2bCi<3^dBMTAXGkE07IGM@N96Lr8}}Bwe@^*t7z^0Cn}dflan{cB`PG`};%O zX#uMmIJ|%fad0U0@o56LTGWJRmvT8Z_D}Mx6Dn}y`TF_c)IOG{{wJ)!rmUV$iDSvt z-kn3r%E&DIiEA?uN)#(V;emnn|F&gee#kwJnfQ+Lf>s!wGDE_d*qqr2*}lv+sPaw| zO11yvh9Aqvo5E#1V=B_n%w*M!Xp#S&}I4605 z9~KJV3>Shm%tlA_V+q&W&RjQz$IJ_rL7z+^ersxK_Kre&=xA2_C zTf*zC_8P0FxA%B=sR*2Fc{tr}o~L_*pa^T2W+f-r{r(McIzD_LjP=2T6zIIjb`+0C zaKPseE;=o+JDS#Y(*Op8ZNU$hK}k;Tmd{4O?Eh-q_-{x4C!5s!r}sAZ_y2T&NcpeR z+aM_f^pnbUZ0|bo^?|E!X=SCVyd3;;rSx&l+8tzmLpt}!;3{K4AgMYyIKYu<@FM~L z4GD|(P`Lv{eeje-&#L@;8)Q!-kt8OVAGK=ToKy7ju+6mY`5$9)-oWh={Kqyp!4DJ( zAD_nAE|~DZ4ZtZ2$&knH^v!SSEL4`1&`oeh0)j{PikzSH{`!@aWYy<}c>a9&hy?^V zu9t%PINB^6$RZU$~Xy~Wrc-`6v^d|Ifv>@#H>1%eZW|>wwggke)*#u z(7#s@G$U{jfRzO7K^=8<$?yP{`}SL=d+$|rMKLShPJbvWDtdZvsNDJi2dsb*_y?fh zqP_RhmFt3FDlBFHb|0=g2fQNKcTmYm@P+sAV})E*g-PywF@hiiJtuH(prD~=V93gq zRgGlBft&ZmQL^S61A~2Il&`Pv@<>TGeChTevVLrFnl#7-*Pd;9ina3{U|p?((dZ;gOO>&6);YrP}H5_@=l z8n+Nh1xGSKzO4NH+y0I10SCuUbMOPNpx9Un;QML7oB^Z>m_ivmwu z(jE`N96e{`(PHL(0s;aP$Kzb*<%NZaxVR3%S~xDi*b+ARzPK-(zLC+OTWJY3QE zzJF&I;yS0SbgE)hR|Ntxkvr&DBJItCv)A*6eYB_3vN zmmej46C0eQfP}71W(~fqV!QfJxcmG2>`^(u*GWl*hz#`hD&2gkq@>h99~I*g23{c~ zFtmHSyJi&XLdejN5JGbTZ11K3%20`i?N6g*N=-V*fUK-+17COh)zHVXnx$`|QSh1#~GBPP-r#Rr6q7ZVvEeST+=g)s9QJyeMX~=}UZ|U1A$)!!Q znJDzsA$T=Wq#P#7r1KjaD3?7m zlTb5gDcKgzD=Tfutt7$BG&WF8$b|luV2ST3DN4G!wGL~V2nk8aFWV+5d~~iK?`nP( zqY#l!fWahw|!6%`t)^x}n=n?AU2K}rDEdPM~qj8$NqY7aXTO8(-L8bb3NQ#l3mi}gs&Ke~MJ_4PIAB*k+kzAMd8RI>kislB6B>b% zK-qxZ369p?y}gpc!sLEuPwIovPYW|^YqFRC|9A(zU)O>o`1tU!U|YxIa1)x4l+xv7 zt$Yc_1_J-@=@OEo2P;{0H*i6paLF6(i8_+M|1K}?dwP$qr$2YDl6V{ZX2e>qr$>9x zyEkkm%aBSyV9W1VYLfk{68h_+p$~7dChK`T!uDUyguLC?Y+L67h|0-~2#X`ys zSkOuq7Pab3CB>Zk`|IkLBk&C4w=|;>BlLi(F5JxQpm|xd(qZ+ z(1cUHyIXzf3b*9Lp5>I{Vy8P;7G_yxue)#9F5Fc1u%M8VZadwqr}nCodaV1^e-A2L zkW^dW?WAImb#`~p6m?$TL36nUKDBgHI?xztpRJWmR zNOE_#7=<>;$r-5tFkG#gdlQd3J|%rnvGmXDXx)N)yu!jMt(WE_x{5lXg_N^joZ9*3 z-Kk`-G~gwHhd;xrmK0)3oq>T=sl{kT(W?zc%P97nH|_W`#nCX^Oot0G*1kGbgrY!E z=@iZlfg;YEBNYYC7pqB+AB|@gFp@&=0Ksee@BRGt+M_niO}8*<2t`$M$w-Oz8u~I% z(`AOiD$AFbZSH`D6(t?v)#p$cltfdCyp%{o%uHtaIzt>2?04%49{k@r7jt!mY}$zP z6B9*GxjSBM6%|!nGz4?32p72&L8cCuZ?Q4KWAY0 zt*PmjmM%A261GB&!JD3vLPW^f(viCdWHcUC_2JP9l5-(eL>?VzDW^x#KMX3Jl^l^ zPWf0^{i~TVR4;Ll1a|*=T4&S8UXu_S%7CVYboU zTtVPa1x{G`^prjo(VpnyABWk-Q@825D{xC$qh$$cX$vy(Csgo_SkBl#Ngq5I|9In- zi|au&-_BG3Wh6|OWB`@F$AONkqoYmAWtKU-SNCaU!~*s=H5<4j&AciM~M+AjAA2`BJ? zjRvlH7Z9{^-PAA3bmR@V+VQl{Xm5{A1xvcYE$Uh>o4G3HMPbDfxYrD9N5`1vW>y*5 zJ#qgd)Zf3#d2N~bhlgK(|7H?FMYxV+Qb4Pqx4KqLEPu({si%Xm%svQbKW>YP&ohngsZ?FB{gY~k|Sfcto%m0_OaCMqZAC~TcQfm z5nn;R?k_ZMN)YKhN1exfFQjb|7i;|TA_R-T<*m+Vsh_ZCe7Cojh^U0Y&`rpiPYLq2 zcBE3#)YM;4U~XgHtYCTZ2$n%v4P=)44@5jqE8Y4s&Rw_X9u3Yb@6ENe2{^_l(@Ncf zRqvsoWQMntm63cU+nWUgLIukrZc~7$0Kew$$|9_K)@69tvWzTl0OhgW$srYo2?a2x z{Dbo+&mV?(d5=f&{@@Wc9nsMy$30cRFncQP2kUbc1hM>D{=Gx%eaA`Jsgr<%#XpZQ zy@?2D_ZLcUh64j7PhMn#TTsHKRsMvRqv-9ydgkNDE)>KB6cj>6pR2-Eq|p``MOWDI>vxR`vOZ!mRdq_Djh5YEXR=GW@12(H@sZ>Vb~3v{-N8|X7U1F zjJ}Zf@Bh5N!U58hcEMD0sl{R#x_(0~@8QBcmb-g5feH~UQXi46MwY+-aBKK9Jw2bu z8Lx&>6ttRNjlTF@07*49(#gND5ND?XL!)Jib*`BtZxSwNlz}`*!Na)-(X-jkHgV7I>blFp@exnNEnQ<$R2J@o z^I4Tc1f0Lop>F|HlyFg+hjZNeO2e-#bciHnBE37EN;OOX`y}^V{r#HIV)D$Nd zdnYzFNBxab=*3S4q{tI;dDbqjk1Kurcn;Qse0lX2)iyM`ZqgI^6sb%J3qkgJuGz7^ zev$T}Q2;4HSh&h>shIyaegv-9Ntu(unNN(Wv^RHMAA3m^cyu^RJv+-0Jp{Unc)$sl z!yC2m(|Mwc+}EYf&25s7WZm6-&0#s#344b#HB-Q`M+pe@)8j&w7%`Z!*X*F&Ub$g% zc(fk{;R6zr286vZrQc-0J81GDosHo0B4e#SFEgza|@Z&Bm)ksUjT}fhK;db7to9N$T z3#7Gpp|ZZd{_NQ^f2X7oh!U@F0do%B;ttR!UyAkOKDgu+9%x2Ll^nWBKG6LZ8oC1= zBE%saLz6eU=;HY8HLDz$2USiM0T1bUo^lPU&|$%*`k%kNfZ>oRf}Pkv&&n!d_qPiw zHK;&=suL0tIz2hDv$Mmbx#%-Mn&|6KO;6v($JaMBR63y3heNL!o0ymg&Fi^(s0nCr zL+>oYSRXxlbkUhO1Z>nWwEmmn8=CIj#j3%0hlz(NBj;e$sV5guM+Pl!K9{}jhaU;pjV?$XT6%Y{rIA8}|o z^jF$;5=4Af)~q*Hu>WfI19DK;3==SEa5-p4a5@-wblv^S_PXmHxF*m;0K1`GBRb8` z*VkcVVhxN#Z{C~?C_IG?#Vj94B?ROGbQIVC5(Ol@0q_X?5%KZy?L*Lw&xQwRj^BQ{ z7_vGVXXWm-tIpV6J<7_;@cR$updi3P!Qa{08MF?K)VP)jA_FP-KweOrHNSZCMXxql zblQcNAG&oG=tUKvS>(5Yyz0d?5<^4#biL07^#fGo@bECudSjrjyUh|tUxsAQ{0ABa zfD)(%x*nV|m{&gl`GExM#Y!^gB`C)lz%dL}Ijp$Zo`PDQcIKLj{nyLa{~LY#pCZhE zZ+7N|M)njVV`DHdS?e@-g7Q^okJSo4Wzj_e$iTqB0Qw?kD}#83Mn`RRK7_zeh1lv` k!Fc!h-~W)uIo_Xdx7AZ#Fnhx9nP5nY%Du=#=zsWs06Yee1^@s6 diff --git a/class_s_p_p__inherit__graph.map b/class_s_p_p__inherit__graph.map index cd7e2aa1..a070f5d4 100644 --- a/class_s_p_p__inherit__graph.map +++ b/class_s_p_p__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_s_p_p__inherit__graph.md5 b/class_s_p_p__inherit__graph.md5 index e973d10c..57b548e0 100644 --- a/class_s_p_p__inherit__graph.md5 +++ b/class_s_p_p__inherit__graph.md5 @@ -1 +1 @@ -ad43f67ad3955f71f35444c1f7c5f2b9 \ No newline at end of file +c60255fca3d4c819dfb05175121e3419 \ No newline at end of file diff --git a/class_s_p_p__inherit__graph.png b/class_s_p_p__inherit__graph.png index 7bf8e874225f840551b48217af655b4a8de52c4b..99ed458ce80edced3bf680abe0d8e39c7a51a495 100644 GIT binary patch literal 4392 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 X8Kb>KIpDyr50LsJ9p!RGYt;V$#yOMy literal 4632 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 H+t~jBNTKJm diff --git a/class_s_pi-members.html b/class_s_pi-members.html index f1abf91e..f5815981 100644 --- a/class_s_pi-members.html +++ b/class_s_pi-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_s_pi.html b/class_s_pi.html index d185c1ba..d51635b5 100644 --- a/class_s_pi.html +++ b/class_s_pi.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPi< SPI_CLK, SPI_MOSI, SPI_MISO, SPI_SS > Class Template Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,7 +100,7 @@ Static Public Member Functions  

    Detailed Description

    -

    template<typename SPI_CLK, typename SPI_MOSI, typename SPI_MISO, typename SPI_SS>
    +

    template<typename SPI_CLK, typename SPI_MOSI, typename SPI_MISO, typename SPI_SS>
    class SPi< SPI_CLK, SPI_MOSI, SPI_MISO, SPI_SS >

    @@ -140,7 +141,7 @@ template<typename SPI_CLK , typename SPI_MOSI , typename SPI_MISO , typename diff --git a/class_sink_parser-members.html b/class_sink_parser-members.html index b7373427..c7f21334 100644 --- a/class_sink_parser-members.html +++ b/class_sink_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages

    +
    @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_sink_parser.html b/class_sink_parser.html index 342b79eb..81c5c344 100644 --- a/class_sink_parser.html +++ b/class_sink_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE > Class Template Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -117,7 +118,7 @@ Public Member Functions  

    Detailed Description

    -

    template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    +

    template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    class SinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >

    @@ -230,7 +231,7 @@ template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    diff --git a/class_sink_parser__coll__graph.md5 b/class_sink_parser__coll__graph.md5 index 94441a8f..1a5a95f4 100644 --- a/class_sink_parser__coll__graph.md5 +++ b/class_sink_parser__coll__graph.md5 @@ -1 +1 @@ -3490c81dd23a588a195411cd35b073eb \ No newline at end of file +d02f7fd8d26a0375ade46df3226bf199 \ No newline at end of file diff --git a/class_sink_parser__coll__graph.png b/class_sink_parser__coll__graph.png index 9db25e6bbf5e0b5c672671398c6bec5b04678fe7..f51849aebcbc74a41828c97a7e9599f655071bed 100644 GIT binary patch literal 4688 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 D8m#wi literal 5536 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 diff --git a/class_sink_parser__inherit__graph.md5 b/class_sink_parser__inherit__graph.md5 index 94441a8f..1a5a95f4 100644 --- a/class_sink_parser__inherit__graph.md5 +++ b/class_sink_parser__inherit__graph.md5 @@ -1 +1 @@ -3490c81dd23a588a195411cd35b073eb \ No newline at end of file +d02f7fd8d26a0375ade46df3226bf199 \ No newline at end of file diff --git a/class_sink_parser__inherit__graph.png b/class_sink_parser__inherit__graph.png index 9db25e6bbf5e0b5c672671398c6bec5b04678fe7..f51849aebcbc74a41828c97a7e9599f655071bed 100644 GIT binary patch literal 4688 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 D8m#wi literal 5536 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 diff --git a/class_u_h_s2___g_p_i_o-members.html b/class_u_h_s2___g_p_i_o-members.html index 197e8e0b..cf87533a 100644 --- a/class_u_h_s2___g_p_i_o-members.html +++ b/class_u_h_s2___g_p_i_o-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0

    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -99,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_h_s2___g_p_i_o.html b/class_u_h_s2___g_p_i_o.html index e5dc6118..44d7cbe9 100644 --- a/class_u_h_s2___g_p_i_o.html +++ b/class_u_h_s2___g_p_i_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UHS2_GPIO Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,16 +97,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    Public Member Functions

     UHS2_GPIO (USB *pUsb) - Implement an instance of a UHS2_GPIO object. More...
    + Implement an instance of a UHS2_GPIO object. More...
      void digitalWrite (uint8_t pin, uint8_t val) - Set a GPIO output value. More...
    + Set a GPIO output value. More...
      int digitalRead (uint8_t pin) - Read the value from a GPIO input pin. More...
    + Read the value from a GPIO input pin. More...
      int digitalReadOutput (uint8_t pin) - Read the value from a GPIO output pin. More...
    + Read the value from a GPIO output pin. More...
     

    Detailed Description

    @@ -250,7 +251,7 @@ Public Member Functions diff --git a/class_u_s_b-members.html b/class_u_s_b-members.html index 65869663..252d8aa0 100644 --- a/class_u_s_b-members.html +++ b/class_u_s_b-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -137,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_s_b.html b/class_u_s_b.html index 689019ae..d9e7b69a 100644 --- a/class_u_s_b.html +++ b/class_u_s_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USB Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,16 @@ Inheritance diagram for USB:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for USB:
    Collaboration graph
    - + +
    [legend]
    - + @@ -130,7 +133,7 @@ Public Member Functions - + @@ -176,10 +179,10 @@ Public Member Functions - + - + @@ -334,7 +337,7 @@ Public Member Functions - + @@ -1087,7 +1090,7 @@ Public Member Functions diff --git a/class_u_s_b__coll__graph.map b/class_u_s_b__coll__graph.map index 4b63da77..e0772ba6 100644 --- a/class_u_s_b__coll__graph.map +++ b/class_u_s_b__coll__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_u_s_b__coll__graph.md5 b/class_u_s_b__coll__graph.md5 index 7e9ee7c6..2b3a8617 100644 --- a/class_u_s_b__coll__graph.md5 +++ b/class_u_s_b__coll__graph.md5 @@ -1 +1 @@ -958d3d033294f8997a9a06c6fc924cb4 \ No newline at end of file +48f1f6d22e8ca875c8c73c2869a63fbd \ No newline at end of file diff --git a/class_u_s_b__coll__graph.png b/class_u_s_b__coll__graph.png index f15242755e8d3821c23712236553ec85a1587964..b64f8fc090fdd60c4defdd1bed8e4efa5ed58cdd 100644 GIT binary patch literal 2154 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 - + diff --git a/class_u_s_b__inherit__graph.md5 b/class_u_s_b__inherit__graph.md5 index 7e9ee7c6..2b3a8617 100644 --- a/class_u_s_b__inherit__graph.md5 +++ b/class_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -958d3d033294f8997a9a06c6fc924cb4 \ No newline at end of file +48f1f6d22e8ca875c8c73c2869a63fbd \ No newline at end of file diff --git a/class_u_s_b__inherit__graph.png b/class_u_s_b__inherit__graph.png index f15242755e8d3821c23712236553ec85a1587964..b64f8fc090fdd60c4defdd1bed8e4efa5ed58cdd 100644 GIT binary patch literal 2154 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -119,7 +122,7 @@ Public Member Functions

     
    uint8_t RegisterDeviceClass (USBDeviceConfig *pdev)
     
    void ForEachUsbDevice (UsbDeviceHandleFunc pfunc)
    void ForEachUsbDevice (UsbDeviceHandleFunc pfunc)
     
    uint8_t getUsbTaskState (void)
     
    uint8_t setEpInfoEntry (uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
     
    uint8_t getDevDescr (uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
     defined(USB_METHODS_INLINE) More...
     defined(USB_METHODS_INLINE) More...
     
    uint8_t getConfDescr (uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
     
    uint8_t * bytesRd (uint8_t reg, uint8_t nbytes, uint8_t *data_p)
     
    uint8_t gpioRd ()
     Reads the current GPI input values. More...
     Reads the current GPI input values. More...
     
    uint8_t gpioRdOutput ()
     Reads the current GPI output values. More...
     Reads the current GPI output values. More...
     
    uint16_t reset ()
     
    void USB::ForEachUsbDevice (UsbDeviceHandleFunc UsbDeviceHandleFunc  pfunc)
    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_s_b_device_config.html b/class_u_s_b_device_config.html index 36f38d28..be5460ba 100644 --- a/class_u_s_b_device_config.html +++ b/class_u_s_b_device_config.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USBDeviceConfig Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,27 @@ Inheritance diagram for USBDeviceConfig:
    Inheritance graph
    - + + + + + + + + + + + + + + + + + + + + +
    [legend]
    diff --git a/class_u_s_b_device_config__inherit__graph.map b/class_u_s_b_device_config__inherit__graph.map index 998c1098..775c2aa6 100644 --- a/class_u_s_b_device_config__inherit__graph.map +++ b/class_u_s_b_device_config__inherit__graph.map @@ -1,22 +1,22 @@ - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/class_u_s_b_device_config__inherit__graph.md5 b/class_u_s_b_device_config__inherit__graph.md5 index 29a31cc3..336e2e81 100644 --- a/class_u_s_b_device_config__inherit__graph.md5 +++ b/class_u_s_b_device_config__inherit__graph.md5 @@ -1 +1 @@ -3280a2ebb71f0bd5bed8ce5a1b6dbb14 \ No newline at end of file +fd915a8e1b72b3dd4dec81d6c1c419c0 \ No newline at end of file diff --git a/class_u_s_b_device_config__inherit__graph.png b/class_u_s_b_device_config__inherit__graph.png index 62c29c2aa33a66f6edfeb44535f80f62280c2649..255f7b9e29be67ebdd27e4c05fb0d167144371ae 100644 GIT binary patch literal 38708 zcmb5VbyU^g+bv3$lz>RH1q7tKq(w@krAxZII|ZacO1eS1yF|KMy1TpKEd0IixZ~V& z-f_qE`v;)=`(f{Atu>$d%sE%Eth5*!3IPff6cn0-xQILy6g)N*6f`^%4EUR;l&wAR z1wr?dm5GV-|Aw}op{S-I%n2m*}BO+JJm>QEI2|MYCs+Vfr?ivece8{o3DzGn^UWSP;+y-45%w>NG5y zUjO?A;-}EDtk1uBGhk|J>f!Ec$$2g8L<>njR3T5=Vy*`5zkZP+l;Y6yTTB%5JWE>o zgesiw;Wy6#{d8G4gS}2vEoZgN{HV(PE1dCyS@2W1Ui#++i%a0UH|z< zv!dl@Gf9T`F?%tjcUGlMH?cBqn+ffR)U6(#fPHwJ} zqN4dyOLId5L2z^w9x5d#r_;^pMg;FEQlgZomw&qs3kwS#s_5s>gW<&QZSCxg%9>8h zlE^wbI;>i548_E{x3}{JA$41+ZXD)+nf%szHcmJCUBANU9 z`?ZU%d#z7*tuNt%MaYht&W5^4z4jd&r;F9E)<~bYFp=iHo*tfVr(11pZQB^bLqmCw z+hDC)A1>qQ)xD800)(HxKUwSMBN=|UT58qn4oAj_O-&7l^awnjL>$c3`prR*$Qk8XI@#} z2o4j!PVm{DAExbo0#6dLRIb+zJ{NTV=)aN=(3TD3KX2IJPhY-FE;hS0Ha2?jFI8K@ znhqVc+*#V#oK#!dbrU;j)LBDoSXx>hZg2mswOVRCY9T~LSaRJfPEJlnBjh0BbH!P2uU zI2WBiFvPc>4ZYuvn4O)~^1RuI;J-DV{PpGT^58?s_BvyU_u{Gc(`|ga&h_2W)8lmO z<0}u1|LmAejQr&19UEQ8doiI95D>uFdVdOPd)R!nIIZoqaNw9FP+a=_X9?76!D-3k ze0vmZ3hh0vo0}WyJZuew+U)TiZf!0HJhtoNdU|^2 zFT+U%9>JO>wCk*|uiqaB3M8+~BKdNqNMi-Ftw>5IbDd<7J_Jco#`La}K5UDnc|CI9 zW_6Reg^Fh7Xp3{kR|Ir8;hPme}v9+&l7sjvbc`^y{~AC}wwN}Enm zs3*g_O{>9!t!H$Yp10a|M4QJeT-;OVCRU>%fCXv%9t}lBp~4v=r0x1F%!vaD9n#L! za6(9MzMZ-m<2!50SRQ;ay=+N?+YzT{XYB!1RaFwE`^<=m$6Eh^(gAu|?hoKwid3dV zsYEFyd3j$g@|fOyMbm*nCOp*meh=`OoDS!?A0hSi^;h$D!m=du{*g8g`5X^SaKq7>!xH?GBw+r9PRygZ)g38>QHhIINe7+!*p!@0z3 zx8z|J)Y)omM){@V$T#V&^>sS+8oEs}fc$)X!~=GoXM>!hE<TMWo?h+c0?Pl`5KEk2F(UGKR+ls-0662Ntu*g z0hfwleS-FtvM6y1qHt&4M|@K3XIzWyM5M$D{^N%Bj299F$Av@>Vb#{URKG@6RtbARb!ixk&wH2sjlRF^)^ zeR*W%v6W)SMUOV6f&Tvq7ri^beVGl9$nh?}V}%(n8NqLSk(QO!RZT5znF<9_>MpXN8Ua5iXN>p&1s1EV z9c%C(R5IomQF2*oxbw97dVF|zZZ0Azl7Q#ht-}3dGpg&?4?=~L7S#=(b6cCVG++^F8%%uvWH2??PG|3G_`pfrjRpJ{!($Vep_#5tPX zQXuBN-oEFh>#3S)xOfNi)qomDLZThsZ>3iT3VYnnooc_|UKKBUKPY4I4{~Owq9|XxK zQaW#o1+Sh>jloYypUJjBkt`-rEN=@7X=i8W-OkRRJ;`}Nh<7Ouh3f=O$!OfRhqb6+OU{CtBf8}Tl70v5q)8&W&Kc9CcCKlkJ_(%=CqwdKa4Wf|e zh?RuIbk9$KO~=i>6SJfV!K_fzMDSB6sDe7+<29F~p-1q8{jyw8;LMXEo`Gr1ru+2` zG7c;^5mvl9c(Zd*fEE6&30&tEuXPZDc4fO&I(D3C9TsXv}eY+!()O4p*pggUWVt(L-! zw~i=Kx0AG_!OCksx<@R!HaQ(C{MC_1tbI_{%5k7DK=Lg(G^mD@zPMkel?vw!&;A~e zBn?_{Gzw<e?HgN0KAFt1lKJ^Me!I+S45YTB2Q#spsLUbiC~~_aJ6CsXyc{22+>wKW95yL6T;Jg9_*j{X%imB`R9{Ft1PfK`0lxKV zcS8^gIglJ4zOJfj?^CrbQainP#6i^|(w?=BM#PAW zHCCdc%DSUT^@D1uzL=XJ464~{H z)AVa}`qi;WRh76mAx*x~Z@j1RVkOh%gUuZuDZZ>WH5D~A(ZRiud880&t<0of zb#2aS)qZ`pDV%w~lFv%SrX%)rrWTI+@AP5*YXOlnP_v;vq90|JC=8*9^cx4FE z>WRJdgR;EB4#n7zY|r5Z&An&rQYm_%N6h>qGD?7N+OF0mmGssOCM)L^2b>TlMJPZA zA#Luc{C@AUxrGgTPag;pNrZsQDTS}B*WFyi?Oin ztWFvv=ShJ*fEIlo?qY=B;Na*h6!`o45=}^c&cl|-PWJWPPmHZ>TJ)AQ_)=(LdNFy_ z(V>(ziu~wpWSCnqb3>;@62g9&(%xfGeoBq=8%GQd9~C|LPr9NS0>U{~u&4817GCo( z5wdshxDd!|%OWXo$G?9!CPJ5>%atpD<9{*|{Ft?T@>iDH{q7*P^>)&bp;qU#F-H8H zbMg9qz4jk>$u0_=9M4J=S;zo$_G;&Ar;qP#Vey<#V zz_4(>-Dxaw6Z|1dts!?}1}DVxJ}vRKCr5|LeOj|rt0}+jndRX5wd1@R-QD{%Rr0Dt zt#i0fGNis)vw-)!*h+QdRGgY^1v<-Rd0eK~z~J-e0~tOCWBUnGO;utH+z>!m?`kbI zNjwZFu((~%Pb-H>CXI`tkXTj{+h(hUbH*}9|6;;{Ci)6DT7>MEpx{fCcfxPJP*Y$B zCr*2jWgg%8J(qkeqC~AwQArjy!tujE?1P&vsPW`3N0JyFE~hC{1WRBeJ+87njaDc( zkwtvZ@GwFOPCA+!e;mp)K3&5+QytaaYj>gM#ji|UBeu-fmP}k1u83-EU2EkO^5{(I zV>==&+<~Ix(Y@RN$=L{eMEayZr+j&Op@N{sCmPb5pAW^C)22kMDab%Kkala*FwXr; zHX&9rL?jc@RF#GuY?dfmc+>I(HANBFD|tncw6gc-n@LY2bA`>PRm;BZBWRpKo_BM_ z1_lEKMQ^Zzf5Z!zRBEzj5e9bHa%C%PKTzU^)F0G%#1NtI9`m_zJe=p%k|F6bajB^X z4kbq=^Umar&y=eGC=xP~T|228lkbWm7f75E&t^43a6E7&7K(hhBUNo}G2U%8W(%K~ zeu`M&|L!@Io4fk(h>05l7Le1DPPJ7_L%m-tZ6$s9Y6e^8-1GVk%gz={RL4zeX}9Da zdf--~QFznSqYE7_Yj6I+*_PL!;Z{T|KPD0}*T^j(4}SqO(Wb&=xxMp>fCMd(5)rWY zJ^b*2ZWhsv>_sIRhGWDlPoTt+H{=+e*?QqC!h5pvT*1&fPk{;#HH&^~G;`LpnP+xT*Cs;?g9!Z-nL(8J3|I(3X+HrR&}0*nKV+;A zJPyM@_Z?i4=ZU>%m5L}lK?<}Ru%uOL?<4;hi?gfA{?=vIw?zl9&)b6GWRI21mhUED z?_E#k-tiHstdR3!{}t1Y)}>yQ1>2B&k^hCJP|-9}63x#~w0@o<248Sp#gs-10y(?E z@$sg^lofnqv)k=;KI(){+JYpq^OOBIRa%qX&FSxg`^-@;+smT;!qRMQ&v#!6i}S|> z+gGfSusqkJ!en@DXd`hQ9EN*0x{w750KiJ39LjjPF2||&c|F}_4Gtc-Hp7N=0?Kw` zphAZmlak_ix;~5_I{%Jes_k&$h?K`3S}4+D?w7Xb&7#S}VS&QK)xuRgvVhTvvpEwU z=!+#P?H=nx+AmU$n(S8NTmR@VtptA`uKV$0veBt@ruqGCU!@TusoTCs@f647 z4d_~L;p3xyX=(MQrcTYwT&k;^64Xw%^Ph@q)gG_B1g=~kwqO1#BqSwog7o;Vbe`>CKRUr{Nx@0XJL7n&qB3-}8jR0PKT>C(-mLFka?1>TV)VES z6mXYU?Y*5WttnEc`gz}l8?v`oYS6|-A4?!FZyg&Opl^F=ly>oFg4>3RF8-72#iW(e zm#`h{i0)RS;k)i|hj7OH)e|n7*yEx1OR(eLoDT2LzyL{kBiNzC1oXS++uKzWKKV38 z6{XAU?zIn?6s)Y(jdwFUk4L;u_uZu}w>RrH8bAgZY`yLz-WHhL8Y1@Ge)H5L?yM2Q z@%%(ch%3B)~3VMzWk*(tmEt6UI?cJjg=XpsTrX>^#B)9 zO2}nPDFU55Gj6ctjC-G z3AVOXMJkE+jrp#Km9S4UReIqU8rm{B$l7Jb2;Q-33%nu1c4N3@Rk+-&VdV>tg1p?- zv(rcNF*-_oXh#h|oO@tkpMh0^a^%-gEM;%uqv^zC=>67?tv%ZJ-huw1a0}*?w?2a6 zS>+#%?BB)4t$d};XI!yX;YsN++^ST$QErGjQz>$%WVKRDT{&^0iBF=y;-gVSK(Oc6 z#uUP&iG?~x9-(>rHWai~Znr8VUq}#O_6L*FnTeVVOF5tVSdA#?>7x%V*%AESflWPe zY-;90$bo~6v}0Ruve2-U^*q!?iNn#e2X;i2w#Kn@))K#;+POmXYquT{dxaiYT(a48 zG36wlT^^V#uL^`wucpOie^OH}qDv})o36EpC7uN_*Zsd6M;=F{%aM4fo26b4mj|`V zQhP`%*4gDJG8Pu6$S;0#5ygp;C-Xn_4-7m}hlOw32ev*~=y`cjNb>42C1@~kE}zt) zB1pQp^lCc2vX~Lp(Q@dyx-hxgpIMsB5nV!Z=Dkcbs`1)W=k)gaDMe09+)-Top}6?8 zKmLoS7iM2Bsdqq+ z#V&8Im9N(O07_9ujP?K-wxe_+zZAv%9L6u|eZQ~3GxBEsJHmkcMraq;m{wnIJBme) zyg;cz^3Bf6W5TOfr15F*0fft*C#t4V1J^z2rb@b?zp!a2f;!W@?smb_Om(lgZCskHsl_1T zn|&G;BdJVOlaq72TIf`-HH_{>^7R*9X?=R=2hy-HH4XyS-q~;(HN8Qoz~gp)YvHGb zDUOL*o{1?A{aUw*iZRJg_|?_-tGccp9yXqyQ}(1g4$w#G+sYLhmT*?2WoxjzV}gn@ zg+5;2r3|uf{1=aY3uDD3#v`$7Z6gDSjdcEJ7zJbKuj|r| zKt|p2zYC3=9((F$5u`_!rlw|A%CZIi?+^3ms|#@l3C&DR=bG;xfVbAE%bd_NE@S0( z+}?14h#E*LRR#i;6aFY{-blUju;F)Eve_8ZTM%xQI31 z8WQNtcO^of{#&QJ)Z#{Y(^+0)1P2YhfKgj(G;X{s7A0$Zy;th?Gs&Pk0#Q^9e{#|Q z4Gk>K*1Z5ys4K|$#1?a4xTY=qE3 zY1*~6nn;GOSJmTYH z+02cU;bLs528WwaV?k;EwW`MSg@3oWS(PatDJ3zO?zUNrS0{r!2fS# zHEL%p$naY2K-Jr|$KOET-lFY-I4g3i<~)0H_AQnNPz+T{4Oqx~`1*#2u|iD9UcPci z4!{8@T5@R50eI-#+$#VbQ&SmsTL@W`r+|0nYUT6VWNr<6@z=Z9P2QZHu5~wBbM14s z$W4uuRkXBFZ0HJl!+JYUQjnBJ!?279F0i$qn<`Ggux$?pA@H03l(0|^_ z7r=3Oy#U;V{oi`nc`uQ|T_n=723pX>vNve>b?Wx$!{AY1FR1tEtjkk#zpy^sxI%32 zW$1wx&0!J80%AwG%1u587!9_pQBYn;u;w#JhmUfxFr^dXjrcJJiy%tN7bxn=y+l)- z^cVgP+Ac=ve&~rSY)Zb4tpZ@x94NOUc&9{E3&g!lk&Td z8rqerv|E@L&D0dTMoUjqrCz5udu$)nKAE|numbmpv-W9|Gcfp1XtSG>gF``@%jQ#? z7$I)R&1C7}{o~bMUL$YYP>R>%F0JZ0n+YART?bkwEMkj*UsgazRLc9O`B@soBP3LW z@riT4Pw_vzt~+d^f^JXyucTPU%|!Cvw;0Jx!eRtjHd;hC9&@Ku4D-hjakJR(;xN1o z@EZS|gND|0>q_Uj*##HTy|ln*xNB)aY|F(vGh+gp7U;?V)?#VvUnp2!xWWRi9qC3D zOR#P`4ivw0%k>QdpO@n>(5lqgK_ZGANmWcWraH;t;oT84uCNa{`H`Xy>`5u4r6u1D zehlLOcNU;v`3lj3!^z%@{U`N`b*O1INBrI{k(>QAgr^JD0myHExWLo`Tygb(YdYSx zaq2UXM$0pkJE}5iO2{Mkj+Pb;PQ;IhZn?sc9FTsQ$yD<=|C|)7r47<6LsnXHg4|opL?C!NH%Gm-b{)puGVAOm^6d zoUxD#5dNAt@OO#>jtH@%1DBVie=8!fVY=iMLm55HftldaCWMmd@Zo86VM5uydR)i4 zZ$nhkPMXUdz3L0&Uml}@Yb~>5sP4x0EW+Z^Ced@2{R$vo_rgER#riNM>~?r)qro;* z4B4$bKXsUjl+-tD$44T81ciZ?h=an)L!BVpyK>UQOOiND1)7XIe`3d*!LR;SsNgek z#UgH$q~qbOQbnDNpvnIU$6qaFu|P7`@1E9q(e;eAFWT# z8wGjj5ozB7I=-fPy3YAwlqAi3ZGBX$(d$mb3vC+D^9olo^J_mQv~p*TT|Kk6F=eZe z;osqQ9vPWQ{E!!7+1hM;W@u<}kW4hMW9=<$Z!y{i%pLmfzR zxFKIF&pwjd|G^r1;qdb;kY2+%dyrqAek7a+aNd(D(p|OYh&KS>zxj-s>>3 zKyyx)d}P9_Q4tO8dijiG5!?3Yl`j9pD29|FOO~+o8E7DdFDt-Oo1(l$bk7?N0`u?B zWDKBuAj5#g=!x#Kyn?zqJuZV!;SQDl0M8mI1fAGB@PUe^v)|O1iA&G}`PJDdtDYPh z1{+O;Sn6~zoeqPdQ69=SQcs>LEU+SN`kj^ z-LSgXE5qx;WE!VWiCV?(&u0SUoYi7>IJrA9-HMef|2_;&G*@ zRAJ;baFVY$HCdR}JherR;K%KB*n1O{l-l~QwCPvN?WwtxwWH!#At4-A3})sOxVS?r znj%RJ!zqM{g%-}dHC6WJ=~uJWzw4&4M)|lfx5H}W(oGg2En0NB$N@iYw$~DHV=y{C zeeN9J!5$cq9I&n^fD%>78k|&ScrTUvvU$-5o$}8=#m%@dcRUz0->M&eFHwi4@kb0Ayl3ioG?PXI_5$Q9qxF(;%}Iu zJ{{}x%iY`Cs^;d|7XD%>LsU3nFat$8Y03+WWqHJGpDPxC1cJCX{@ltj5Nu0T$>CfL zXIQ583oRTQx3)+7KYzBcu=s!~dRSvYd)VysDuVOuw-qW%z)haO!qQ?%Lc}j~Hcic4 zP)hoVUueG@#>cv7=D>t#<#jhyVNm4KaOFbJ4@iEZX;h>lSLI@NqUmIS zi!*TJk&$}{n*5=q0~e7H;ij3Xvo16HOCtPHuK-G`#PB2Se&e{GnFw_Y{5nrlJKk|M zNm2~OQ-*BeKqDz@{0Uzc-)?4Dg#o&b0&%=;J z46MC6cGmat9@xO8Q?a1wa`m`5wYLAE{1Lt}(-&T{FW+4fSGM|oBVImfFeNRmS{J_d z-(Z%CT^;%?0P=dcrq|a$T%VKx^HJUMot1f!YOOR|;CE^~)TcF4ZT_oyW|Gq7ocO~; zfk~b>AhjR^Cj>$}>MtB4UdXy5_}_bWf{iT}At`V}v3-GCqNzSR0%^FIn%H-7*{j!R z0dxeSgUU7rrux`ez1+iDHP6+iRxlC(9ucfxWS~aIoUa(C!xY-BH)9^HBJ~QTAf1gK zi{AMDuS24SoL{qdXI?(^^r;U9hB}Z5XSGw}z9H@`DYsyc+}k0Lb81P`g7D9^;0CG> z1@u~R|A!BhBdCtWZ*PD@|EQhlT3NS)~xWppE1X^nVgokxZ!7|XLDVNG;eMFXPvrT?yIkorBxu{?SfiH^KfoU6U;Wo!|-n+wBV)bv4~U;Uya}$u9Q`A#W}oOeV+6 z{d7@1Ft5k{VDd)RRjX`&4SFryYPUWMIbJhEEW!OF1OaxnoBHEN`wZ*-yQXh+1ED!Z z`TsIylrjA}*4r28|Fmxhp1{%V5z_s=>8Adiry+T1kk zx{~{E**sbhsOC9iMT%XI3)JJwc*;nf*}Y?K*|Fei~=RA z7Ji*69uZr?VFG8}n0nD2suK#XIX6^_sp`qZbxqi9u%n@j~v4ahPr zjmoQ6`y$&W$;^^DIn`elr#S3S_0yEh#3pS&qgmb94$XgO2(jw05#WJ z>+9-LLoqmX!XFvit1uYwxI26qoNwp(TH%dWAHHfEfVAlqJYE|Z)Bx$;0UYyL#VVIG zxfNUm*2*d?HV47feMZ7&-=Y|vVZ7&1pe-hcz0ReFprMaqE=8s^Ph>iD*l>Qc$ z7i!N$X%Qt%(Z%XVMacUv|Fo^f%D((oatYfeRg_Q|&UDS3~?GsfR zcQPa^wCi;YB7!}{gpU2y@CL5;;Zj|w+(%|SB4ttPz4z}YSrXq6wfuC|lxt_8$&8I< z#xBlh*Yy5tY!a2sGg+!M$HJ=MgWXsY*XmlWGxQ0>W3I+!8h<9uwcg81W~`epYE6)23R!XZPW_BXtWsT)IfR~buK5P5c82{@GFx@?E**Ohm6t}rn{DAgtxb5 ziJhy$+Gm2|R4qOnlzok*GB0vDBS=GHA#+(VtQmWR1M443$`2ZY_R2lIMhxxz6s2Xe zNJwfxO|wRWEd$7vQ{%P^)QHf7h2NB^xTvazSeHV>s1`i~*T7qn2ruIvHsI?Lu=H+F z*3VPNM+C1=DDukowAl=9MAvIzg~X=Gex)$1G}94ejKQbCYF0G;A$ft|hbU4k?jgsDBQI1h6UC#Tw6pinIo?;I-iZ{%8Y2}AVLdFrcvs49wlN=6G()nyA$ z77#!ZW%xwl%CrV1_$JS0=SiB!`v);p)NP>430$X7>JvbBvWovY5 z1w+y0{>=Hqk(HFcp}&aikarzUnp~Ug_M#u+f#ll+<1ZB+ZX^-4k!FI8Sit_umj6I; zN}78(gQ2L7H?sZRMz5TuZr+#TCql&P6`})=SXG=74ZUss%Za(Hr2MRp>`@8ZjU<&I zfQ0{?Mksl98K|h0_UzH0+bWL_K8aAIudlgmk>PWo1STf2TYr-ouO3y@lFW@35}ETH zA?`ti&NZ<1gc|b93>5G|P&=o4Bedz;WqnXtYtImmI<(lf3Rs#uyj18NK{B%#qPDVP z*;-3aeW$r&3LhL+xt27svU2SR)!W=wM`_AnMhF%Gqcw1oSrW@zwT-G9Uc$Y>WEt^M zSq_oZ+)fUfVfyMrK;PvXx`+2Mh0CsWGs2onmxa4p4cIUvrWQOY9Xfb1Q){a;%9is0fkcBDl0^QbQ6|-LU;E7;>{^el_YTO_$kDQW_?SzptPm^|6Gn|~Zs)S6tOyv(tG}|_7IQ2THf2PJ zFd3kG|22Vu{R^PAzpqPb0sN+HS}V2U!$(hI2E`e@LjZW^uuX_te855Q*(#Ly-pMk~^!H8)lP>feU%!J~7t&ui`b^NZ=$ z{6g%f6^!=@15E+-O9e3ijwM1@S(kTZw<8455&h;b_Bx#w-?bdn{3xnx{;DUnph71K zN%vMe|Mlhm_iqYgDw2qQKDf^jJ6?^DmXX$n3wS_^4N)i|$ z@RX8a-*pO+ehUA|EV^vl`{LLH2yU)`z0#TdUI|jOASPl1;grMyC^*&xhq_fjLike?ydd;TZy}6md zKGW7HuW#!`=Gu?Z-?px?d%%m zO#n(c9%@v#br`CtZva}xnIx9#Zrks1RV+PVDxphbBuEA@3MMP-)a$9Sw!mb2;vF5y zuxf2dRk@sVKYiT~=a#6juBiU_K%cC;Q-jzg(rkI;bjF5E-&l>@Lp)s`%Pyk`XnIYx zKJkVIHc4unsXb!JoR2vbnYL;<72cY#a6&!n$-jStvNF>TZr~m}!}o5Or15E431*d> zR67C~Q<}5qd0z+8J>K=GLXq?HQabmBEOsE)0=i{qpI+tJJDlHG?>0X`DiLXnda!iw zxpKB=lJeIG)+;C~nCb9`#$c zZ?6vS_JLlds;zzh`^Ee1^Lco!wh0OSjZg}C&>78YF+3k#fZBW7&p2*ti)&7O?to8x z;p9*tMBh+s(PMd~Z;%rk$KqY!Hc2B?F};x~K+N<03o~nZn;<{PRH*eyU7pBgWj(HZ z-8()`h(m~vm3%=hYowoTTW?IU_4l=3R3qG+A2E7_(w=N#F{F@AO$|h%)+Id&X|h$H zEynoHzQC6Tm_5$V8&1u;06F=CH||oqkRCM-h=52Lk|4FftO;Vx&u!Y?00UCzZ?s6} z(b2TuFJ~>SsaQ)+S^3CI|sLhO3K$WoKg|hObF9c5hATq=s zDYwqv4_cL|Uc*a;z$p)T`_u4eg>KuA>2)JKleTIDg@V<=Bruh0C1i|Dza3GN~3 zSD0g1!6bnlnYoATX8v?azuD0TynEj}m7vDwf)&O36UFvPm!%gp0|01wb~yE-f1F@8 zqv`P0nwP-d%V6S8(X#eCS(r%wB?Hm_{?&-9Rrm5PcuXq^_h5P39>C~WRv?{G?^rD%5> zuf<(8M>c^x3MnR0S+%$17fn%-KBIb<7+MWC#(zi`P5fJ@<{+z`iZ2|dB z<)UQ{jw$mwCF0UY_q_4D{mQ2+AnRGS)Sm~uCW!g1n1};Fs|V2i4><(atxtRW)@?jo z;yUI2we#{VdWbnqyo-Ac-`kf(^cs9<;n*F3mD<;@8q)F7FZZLC$?@o?956}wcYK}M z2gX~2iWL33uik%qL>`Nhai>#+!qBG>RwIY=DBM1Ka)erOAudd8vvTm`5O2l^#UTN` zA{t9a{6ja+N5Zk_9(y!v9x)*=7N+Tsui*q68J!`>T((OyVhLt)V6lwLj!(j~_ z93*Pdx$YLyIkBoMT9I^P6x_Y0Tu=l&rwNsh3tT%|chn!?_7I2kp7vmn-*(CqV& z)Y%8yKtN;KvkFCHB#x!S#MOqteH|@%(IzR9_0s2)DqZfYSEC=vBv;=DdC$U;P72=m zeb#_*`7D>_>%7giVF2M@edQdMpo_jCY1(&R(-XBq7QMr;isR;HzcnpF<;zY^26LKI z>sFqvRWtn$3UC~0=>=5s(5O)w-|5hMqobzE-TEzp(=+V+%H;-%cw5mDoV2S$J_bx# z5PUiMod3)i(9P!Nz>IY8v`ro{BUPMF-FSDHNw1FU3BU^4>uPrPo8Vk0P*EegaFvyk%obCnc$YAOX!(Nl}EB!4Qa-A>X%ia?brtU;f0_ zr8M-xFtaC`@L#LY$zaDsQY{Ad6u#ypCtk8?^(#e~Opnua9<(%`f4qTWB`COc_h>rf z16_>G@wb`%-JMZ;r^5DkLI16Cl_x043o|n0#>X-PNfG(|PrQ`E`B@(O72n@$CwbY+ zl9G7KMdg{k%{{*`W3W*I0RIMo31AJLZ6T&eGyaMLb5D0|atL}n&;LuY{p26L7L3g& z@Z_SvMdW!{-!*5cj(fBrm6WY8zzF{w95Sku_|#N`A)ycO`wzao;M;57!+k}3RB3SW z$RCxV7P3p87*{sS^3$3tQ}JhGBOp>gQ%OEM)lTVHLy&~CUiSClfh5V8JaDl!A?XyG zs&rUyW5N7=aDb9D7&i0;Az&k$WR(ThTMdD#FHZ)8Dq?3aJoPeH3o0} z)`Yj*}6~*=lr8g16LP7r+jLGniQ9NZHN#11X-73HQgSoInCR zJgN@xuga`GL-e7RE?#xp{_fP)3=xD-#3zkhZy#EQ0T*edjBZNBP30r}`}R2xa6uw+ z#{sOFSYV&74T$Rio&~VGhz?*k*k^Ie#wa;sV`F5{hUS4C3bK*ShGCdLV&mxb-uku= zSYCl^e9sJ_*dnOCXQ9TTv-zrI^`z%SYx+w#(a!bJ6MsqvMg^mR9zW8c1sBp9=EkLDf%%K#X5rn@D@8^xNmQpxx}XK;TV z;DsA170|w^W@j%u^RncN!+vbuMr%+&z7iF46YRESW3Kk_Ylp^a&8nQwtY&-8Un76w zCMK>p2J>>F_Jk>6PY{R_ou3=OLb0R985)p+ZoEQbAWs1?G;N&Stf&o_&gg3sw znx9qE(oEqJngDSYPp{+i9cU&E8a}=akO3qlG@B~Me%o^jMLFKX=rsdw{%Bq;)PhT% zi_tML^HYub%0uGvuhQiHH~$XC=PAtU2Rj?iqBSf+65N-@lUz$S_Oje>wK%7cwwhCs z43ZrU27Gp~8Z5XEsW83}r9$-#Cg8UrAb$Rr{_fkLl+B^S9CP7iNt3}vqK1JE7^VU` zriw;b*T!i9NZFYVoEFQgf+I*13;*K^B;bH*Q+ei-ziImd_}UtlLcVyVkPuW5z_deF z^M;?=1M)0Lhv9Q}a@Ogn9Ray)PC_v|kbJ1J5wlMF_Y6SrP}w3C*;U2J|2s@v_xZP!Ky z#D(=|GG$yn79oJ}A;WIle)ORBwZ-BN14jx zbP&_4bptXIENnvyzovGYG}&lGsPjuWVBiTkN~q#jX8R9qDZ~Zk;49|&EZs@^sBN9W zM?DeY*uI@ls!70F*n&$M1h+rnJtk;kf%Qd=V;I&21SCu_jgN6B!#rOXz_G4xyVh*e zS*N_7A)sgn(JB^NR0KpG>33Zz@W0|eeyplsF|<9nhb{>15(7B~I^2#GoFDP5KGF=d zdX%2y?8a?-`-;F6O?l6041BOgX4nD_z6*>w_ zHYsN%l0^01yI-$19;GT!59l%%m)jWV=~?LBKA|COF?x=k&lvGNZ$-}58G_QNQM;i` zxgl{|+%!2ltlqXLa*sfaxpiBzB+V*=PdDMjH^N_=rrFU1DFq@&jE4IL3}64OS5fa* zua&O49{WWllvCk5ML*KP&Sea2855K1OfpvqpgCAv!cdg2 z!?;0grju&^e^FT>&>>d;r^-6{x2_`7m-xuxvlIoEiKV62Zb1hKC^5FwnH|jPW3f&f zFuyYrj0SZYfQ4;F#JJ?(Y(zz1!f7bV@ab9k|NM??K2?u@lLy=BQ7*_;?&mAg5K-F)kgPuOcu^Kp4RRMG(4Pm z4>hnOi6fSitq5EkU;U#&FPKxo|9I^Kt`h)@ad+wQvILGTayYs(FFA?=FoP2G0DgDp z2}4-y;_tPVgA`P<(u))L_$Q9`sIUr7W`*-xFMwwZg0?_+`AGnJ-b!?I2ozg8q4^9f zE9?mqtM|hVQxwJg1FW!} zzGoR&27#nUp1<*XmoX8ymnUYZ1_*pW7I6pEwW`0T^~emhdA9)N$qz#f^hG9(-NQy@ zitBzBtl*}*!}`3m$DrN;x06l~F6dQ0PeKWi=Z1}LzD5o57w!O8$H(XC-h1*g@$}`F zJgaw$4eabxs_9@Hys$$V2&*gxmI*|No%Ap z2ZRz|tXfCY3N@hQ=1e(UNG-dQu&MTKNwF zm|XcE(#P$QXWyp@1!0>5ze%wq3NdibnOnjM$t#=)KKd|5?x$!Ju)PTFT$QJ$1Cfx*-pSuE769_>{KmGDquRYJppUtmHK_R#^b8N-B%X)EW-xU^e_i~Z_ zKEiNxGUMU-_MYb(qb5OI|K})i|IR-3mgGuzZqR%*wT2`!;gI6{rx*D_Hq-vGsVPhE z@7f8tl0vI&t5mcMlE(3jjQ&HkA)O8gSLP;XX?yw;0!Z&@}< zbKvBx^*Z?oBABzepAC??G+%F~rjc5tNX^DwyN*so};7rOuD4fbYF7Z%@TKFxjN^5GB zfg%&z8|ouS&Hf5QR3bi}wZC6ACnxmJl6i_USyYgyUVMKTC{V!!BnCf6KC69M@Oif| zV#WJgSv45aZ=H=&RunKGUsqt z{_5O#-cnlm&Fs(%LzvlU1*Lga1X?TYyy=J^R8N1yPZZ4haE4x{(f*l9HAd=>}<}#GsUv zPU%KcKm?_w8)@n8?r*mK&$;*9uhzqZ8)3iiyVshY-^^^`qi{Lne*7Hu>jR~yV{uiL zZcdrcv@(Ql81GBdc}uYqd(D32Fy8NzJ!IBy4m=Db^uL#yfD)8{^kHVe%m{EX{o__k zD{X(XOi?I3}Tc@~ntzkOUClE}B zPY@dN-kQ7e$I+eOri$Zr5&;|1^*Bj~QocJ!E7e%DEiUaw*B}V3!>}(!58glb5w)CL z%1galk2NB}1z&Sk+&W;h>7XdCa9>XJ%ca3 zF1bQH!7t?~aZ&#uBvkb`@f9LuZ+21szoCdDbqH_xH8{+*&Sz#;95|yzKB=4yZqxl{ z5m6jBJXJJSYU-_@e9$Xpd$Ju;7pAlMO|vBZ6IY3JQ1|_X*C@Yw)4o%BnQ7er@i;Hs zdTi(D%(cie7=^48vYQuy0Q3CP1pLXwW_oX!b@vRVD+LM;mZGDcU_#0N=mg|o6{_Wr z-L8;7z%-G^zO{6E>O}PbW6+DLhitSa3%t}`i}gp3GC$wl{R?FKHJ>?cAWMYdTB`?>Xj#DQ3`z) zjUFk(f<~Nggekz?!|D4IKz`@W zt0yYTb~-k%r614l{zBFT!Y1SY4ui1pe8L^nH`4&H(^A{mP>1>sTKPbV?(&i}CG3i4 z2_7u9(CTH!c(BT$1ZtqPwdYx*0rRU_D*45NzE{ZIA?Vz0K(Uf3ec96YU$`T= zN`41*BOLEL0z^&knhsVmRN>MSC3lc~=TVD@6#UHQrSN z4kmRw16n6;2$|4vwHiqVJZAfw!UOOz{!NJD9C?%gWH2a)`nEiCCd6X1GqS+`fyz5b zyq4LMI=Mp(mwmwcr%xNdy}0miC>>c}hiJ6uZ`x}XRTWXm1G@KUXeNV$4Yq!HUYw=$ zFL!n+fU;B3Zohi0_sdKR>s`IDupu6wVlo8;FfneH4Cmjz;xZ0`ExrG87bQkz^sl#{ z%+@*`3S}q|pMXH+ob~$9@)|f|2A3B@KgH9eA5WBIzGXfd&X!@!y5aJ4QU3H|?1%#YDcniy6{N++0zsT|_RdWhX%XQZEXzO3;zNlL57 z#^2p`WsZpTYc>vO8Zd5u#_nYmm@@nAwcCG}&QkRYo@lZ#Xs(dBI$T%ny3yF`{}od0 zXR6Vx44o!K)kQZNjY_=VH_4?#6DTpxd;4i*MNv>62)genixl2}MH%_{^YZYfTn+7& zqxotke?TYX=!|6p-IBU#H1;& zjq%}c8ZPb8M2{&!*~XjcXMdKBOLwD>=ubOV0qBZP?R?nnf8j-XCl0~@QdXy>o+dG> zGJ{7-uyxwDx)s;k>>(%ujf^hZ^%aVAna01l&;!bQlc0$bP%9}%<70W}%Zj$=)7TGK zPprj@8aP~M-p;k&J|@ynH!;4!Ypul%;0jr=rO(`|o)~|`D%B~KjL~sGAq01&AGF@z zSSbWNm2)7{4dvHS0G$df%r^>pta?Aa1@HP>sAI$pKq0QlPzI@V9rfWe=J%al=nt#& zKWHjHT-;^&6+?_mE;IHaC39(=i4!4 z(gQ?4YH4Zl+Kdz5x<+KTK1{#Rd-po-&36!-1arLhC|A^&jS?6Ux2M2Gw*0TveejInV_x$o;gNrpV zZ~f|)6$(S2I10*btH(-8I8Sd7qDnMk1)>?g_#j-7%@IW``yuciN8C;z9q*Gha&6|H zS8hH*XObpB`_#2jL%HB~Fk(eQSkbYuQ|IOJJMra$h@bgkS1bt!v%_vL56_628bfD{ zTW_kw?c29^&<$*DlcS^Qz4>o`&a-@k^H^6GrT_Jr-_c|aN!&Ny678=W4fAo)k-Fhr zhzwj&ULNdn3JCZL@9nuSt$rOIoX}C-3vN-74z+j~Re|gEI`xkXldr;r>Lw%RNFBqw zvU5F<_L7p~PoC&KX|r6B_*`C&dF@*D#J92iHFL#tetu0Q(T6$fZuuoL+E;V(*=W+J z=(G6XJ6EaLk<&OUD=#Z+1*NCa>dXt-^WZdfDNHA-b?NN`Yh!2U-u|p6#biQLV}i^q zqPfLrh!wqf(Ni$yU1CN=1igmxF>g5r5Z0I|Kd!J@Kc3)bW9x2jx7?m-l0&Cvq@_(y zNl7UwIY{%Ojs zg*yl9YuaB+SoIYcSiKY{roMT&rF;;M8Z2<$-rn||cx+-a9m$jv&6Y(+Tl2^6nT^f5 zX(#E@Y`$O92zPwohYOarI zJFl9=CtVa87skF#FVKF)Y3fV0w!Tg;7xTjrKebY)KT%L6in*%g#ckN*EV*q8?$)Nk z^4P<@Tx~S|JF`JV4wpxUrpkRxSbppC^Fpr<{=B~Wt?i|gQo_kVFs%%EA}^ChGg!`A zPoJ6?8bUTk3WEr1|G?R%xs+)jORtT~enyp?9O9ESCx@HAs~j9IPU{B>n)dbt3iT47 zn;jW7`s*=i1aIv*hG!+`Ru3w?e(~Z3{NciqHb*y3Dla&m>QHtTPbOP?z5hzJXdvJ_AW3n$aM{nkQ@b4+LF;Mh8FJ~(jB ztcBX^JdF%<^W)`ZG!hat9-eV5a;>E}hFT{}wT1j7*P17mmgkX7Ehi_=y|rHp?fD8e z#~E&3U*fkM64Re59NklpW*z3_*p_$}v)J=_Vk@Oca{IWvKg$K{2FVXcswYYs(W1sr zvdS$*`_(sn~9vt<&R5Lg@3cg;y7QXI#{RV%x<6{fd*wVf*qw~gq zE>%kUbrp^1%L$hat*UQDg$lrP4E;(zT7P!)#>bgMd9OkP)3Rr-yyWmNa*-Q#AxLF< zUg^A^XzisTM~FEXP+}ocR9h2J{{6vHSx<)>^n%l2b%F2H4P2a@%^%534Gem7)tIoc zLw^5$X2BQKv@%o>zvZwZ9e%cy7BX;fs2f0FR1D1nf;vs&V`3_+stTSJr>3VrcFq5@ z8$qvVWo->z77MHWjT=tbc;f-%E^OXMyJE1-EaTstn=g_+C`-Y>!0`I@YstS0UMMCB zDM@ErJRH5O&RO+wx2g9%Dkvy`)|;}jvN_Z9^Ycs^g=^zgrSPX!RmV%cX+?V9pL`VX zzNmrjh)GFF1qJJS%l$!tfv6HP%yqq2B8wFm6F4oT^fSxYm#}f_DY@;f(@C;FNJbS` z4fw_7`;ksZD2g1<1hKvK>xkpAZ2my<*zojDfE0IJpINX^->5o`Ixmm;4}*sH0YcT9 zMx_M&IC(cB%ac;LWo6qzVy>-OSzL*0zO5)$Qc^NnZmFTI&7>RzuPKDxYhE2Hgvrx9 zP^&07>YE>*;+2u@NI3SmfDV-|Yrl(ar$j`O*@%-86NT;m{O~$I5q96pPEDQ3O7;?P zUW<92|N8aMky2AMePmxhGqdczN@KbLUsUl>+Fy&iunsq;^mTP7@-&K|Bc*=_1tldE zz4Sm^Ru;{Y$4=tyA82L5X~{@QDMUPe7wUeKiJ-f2P5IP*y8Eq_nmRh}>Yx?$i+Tfr z;@#c$F65#BrVqXQ2)caY6BGzgy~EKe#=4$1qbMhrUs$O3ysW`6%$ zSb0iS*()Z?T!_Q`ZK&6qHZV*h72Md;vN=-fcfwe}lTO~79ywG)lOmaKWzpxeu(06! zE|BI@o&mF$IoDixx{s5K3z`;^Q&6z_i@%tamJ<_zR*gmab)pwXkJ1UD;pXn%9yb@4 ziUJK!1mjrLd&YyW=@l{T2K8@m;2Fj4tc{d@e|1PF)7Q{23ymL{xevjQn&X|v(NiLOLJneYVY2MJ{I&Qzz= z?qFrEu;DZafind&$QB{#J02NG)M5ury`2)IGO!$*_?D*?z;z#W!X_W zO~&r4*%UCE35WGDGBPfGwN!S$5*`x+dc%|=gq~PgTiepql>QkGrUW^Iw38NBlPn%d zwr^=%R181*wQCzwb;-29T3cIx{1E%O1)UN_JWo_-m{G;ITx+1S@I;k^AMLNz;Ubrn z0YHT0m@Y6E_|BBpc^vnRj%u;<0$yiwQiOv;=^#6%?Y^s!p1Al==+W!x>3L6qYMbeJ z^S_VhL+oxWmuY@}zCx0a45k&3v4TSI)(2pW`pebcG$~Q?yC)f>EueTDadNl&2JZM!m>{I3KF^;epy$`KuI&~f$d-MdJkmzx{TyXl8b$!j|)^rG?l zc4}jL7Q>fbYkBJOwuE?%ZwtmgayHz~=;n2tzENcf>Cq~xkJ zXBdA(uC=y7u27!2ee7<3mSRDEer{f#OgIRDijordgEbN!$X6;iG%0nSx3kruqN7L9 zlHlNMtrpdVm#kB%ddQ{bq#Ug|IXMXk2>2H3upSoGU05iq=62tI3-Tf(J>6eUY&Y`E zC2~GQN@>1lKsKu581}NHy!^ZOW$klLEI*nOP5}SgSLys@277a0v90aNw*DhwAt5YE z5xH<9b#-V%r)zAS!L0V&P9BFuVmA_Bd)+u7FsI{qe{~p-9-7$NQ}378)OhT#41$yy z=FH^VzQ>Z5MN38Vvv_lu)s+Sq9V&+UNn7|MC85K#==0Km_$)eGf_~NrYv{b`I z`b4yov@+Gz)sx>`6r%(;v0LRhjfo z+Gj37K|zZhu{4!vs*==d>XbVJOw`oWLPFyW4UgCx>+5G=AM5+)78fxz#z#lvPM$x1 z{!~|&Mfnf(Q5`DM@1ETrD%3rNPNpQp#N1UPZBnKBnOPO9KI|*}gwS324wfl2r5zA6 zG@OMC(cinLrlyt%Eql|`jdtdK)jKHpeFU|pg53wG7%3^KxnpV`9v&-R?WimB<3p-q zGUXAjsy3>-SU4+nyt!&Ld8Q6IYIwkrN|dni62VtiW`DfCN-HxoJPdW|&s;0ZhEhaR z1EPnPZa*blsVY$#NJn{K_1g}5dP7gwpj)=h?s-qzY=p(lJw!z5>03rdj)AdfWN+Kt zi9)#rMBhh?VwBBv{Zd07gHjQ$a{zo1h( z5PqV7)05_GRZT(V{G0U<` zW@gf!&i3|IuMP{hejgpVLdSAR3@b!5F@lT{$^9D{h_qJUoL#LkG+KS+M^V6&1d(jLo&)EcnwEm(h`< zWMF>sG*;Q>F)g?FF)*M?L=+tucr&iELMeA#ORdM9IzwsVf{Br_F`8N|!Y7p0ZDoLA z#b5zQwbpL>iYFSHs&}U*k2Q3qkZ*5G044Lr*Z1)?;PQkMHK<=}2i*f?3E8X6%mpx+ zW}82zWrkJk5Kndi;RrKrWApe-k(7S+fm}KG<3#4U}0varlA38@bd$}RUd$D zbg;7%&Wkeg?7sv~9`v0CaSo_-$|T`egm>;Rug~oOo$6LQ-d=NqO=M0~P=1j9t5u&sie_wSQIV~xsw&tIC;4|${|gHMHW@@>OgiIu zJdW%v2B2ePe_!9q%8K51cOK9NKRvqu-EHsW^xb||(ha$gatm6#vmS-L%lskvl_x+o z0ThDsj!{?N`ylU7Q)|`jNtu15IO|v$?4_vADLmS!dEoDlw=;Sdy;< zI|8ag(0&GWp9fUn;9z7mO<3lC?5T8`l-3_6`Bu3d34>oyT-HY=gax%`o@r)VS*ppe zhQ0X6?sazLd3q3lO_U-dCLKPvdkihcMeY8GbtefM+hP)!b}?FNH+NfTsV}T;YSkvuf$+>9NUpJ9?0dor;QzfkDRAo?4cOk^&E}KSw3&!j@gGfHN8HTTzTdu2m*yO&K48G$A!OD@W;US*asT1WYRB(bUcn1n4Pe-aM z34dJ3D|`^TD;NLVQteu15>BRZ<7yYd<@r^F7NoDE^-BM}bSzuBVF2MGu$@X2yJw5}5;BFi-_hO(H!2?aAWWYrLomR% zqVjEgTn8;GQ)Isne{|x7md-bjZML?y5|Pj*As9SViO5WzxMG*K4rXT7!tA0&HT5A} zR3#M^eeJQ((5FUbzq9n~NKk)Tm_5fs6%R*E?k*|L;bza)aQ#jDiyDa3Vxc#JR;@0N+Dy!`<-$E?v{O<@ zUS*+ND1_(A2StNuD~{w@iCryEj!gTu?ZaQ)F8D3^iId zFrPVa)I_`9-Typ30sq@nL>S-)U0!2V&ZmW6URxDtg@aInj9DqGdFrQ3;P-`a@xbp@^8R)q1LHfDcrqe6Sp^|g*_ zC(GfgQm4f(YhB&-gv7D?%m zJ)b{A)!ky(J#6AH$18)}_ujz(m=v7PpFPQB$-3ZmSa`j&!)S~OtU*bFxgw0h<}i5 zY4&H^^-?CD|4vkqt%j%Pgb6;M>zAOOWAwb*Bn{=AyWEabCB{kvhO!_gh!0QpzaJN8mnmwd?zlqQzIYuZICLm_}KYSt6g60&>bu``wC|KkUp%U~ukX~oKL zQQDTTnVGzfm4@x4duGY)h=ABwk zaTx>>O`#qV| z3iY9AeYkR~f@N~S`HI@IFPa}7uAcu~2R?6nWJ1kkeX7&$&CA_x@7jwKwx2mZcEzaT z5R5WA-kGkh*4i($LLi`lL`V7fm7af{6?)q1`X6UlN||MrcYnYRA*<8&`2HNrgx%>qoVB(^v~j= zPA@OtA^NJyvuQ10KXcb_x2W)sfIxyu7R4`pn_9P@U3sN!En@}1W^4mJ|q zFE8Ra3{O1v)%O1U6m6a2x&x;x7GK2Qo!~~r!lHlH#va{%ak3hw@4@jjX$PG3q=W=| z&QN!gUmr+B@-#vkc}!sgld7xV*Ijmf_$Xg#H(mVtwT<1Ev7_w`&r^ZkjuJ}^9SMof zwn!Rq#PV-ly=DcTE~fa|s$81qtDvJJTYTk<_UH_8al!Vs+#`<*wmLcNn=3My-Uso!;wM^soMsc!N^+^Nv z;=8HPoV14C!THCJ{N*85iJxFDIBsS54e{EbhKV6+BL=ncG4_m=X?grQv9q z7Zh1}>@5+5v<&x7cf@kJ9`A@9V;t_Cu|7Ct32LIgz7xcDZK5W&X}&};S?|7wKD6KR z5rWYeqL*`b1n|ALXYhoD6McL(@aSA`5%&ZvBsQ=3(Ebwftc^T4Fkxa!lM1O-TN(TE zcKdh^EASd_G zaqqmZ58LyEPa)v#YBnGg`TvwaJc%ZdBsazDoSgkUyjI^>j8 z2Rv64@~Rxry$@n-^VD6bL8iApiRW5;hY`})l+oP8Vm;jTf%N66^U(2b$OD@@S)s`* zkh(u!&a%|^w7JWnupWt>7gMIB|W1Z{ERCXGfgejG^R(VdE5cIWlKvmX%t>uj-;`3NiP0i``Yrzj6w8%w8C?5!2MTn&(iLi*c z?HH&IoY&O22)qAQjGYm7cie<2Aspn<)JSjf*Dr?2>iv4Kl{Pklr#!fn?PQQLB!SSR z3(~K^)lQClSqd!AXP-#vH65rQ9Inr|%f?jC zjb#MwS39Mt7k+@G+Qrc<>xV{A3M&EK^mw>QEzNWw+FNJ0&(FV6@@*}rh_mXjZd4dc zCX1|xP$s*qst;8=WnIG>$0Z$gS?-&*9%Z+~=0zZ~xvak}cr3{Exg$*TIlSktTgsr^g}_2$wnpXJI_3xN%n58b5|Qp^MhVF8?(*(99&#R0<3CJ7cIN4 z47BI*TJfo9oj^XsgOGWPi?h#A;6BJrBCSY%uy;stzF3d*9eyNh;ULFQ($plw`2xXV zT1E@rq_G=_o)?1y11(J%pl-cSot@)(CB?R81F%Vuy>J7lVA46jdlueMMY zy{v)=JbGusa$a8EJMuj+!g9*!9SVyUKa!sss;NP6H)wCqF$N3Jq%+&I@TQ5}Rycl#`MoM?97*BR}5)sI~6$;%j7NuP@r8 zhWeV{R@Sbq{0Ibh{DD!I<#3Xa2OrSwJ#xVc1A(Z^8HOChMgz%x? z`TCa3w%~zmI-O~X?@BD7m$OUe>+P>k<>|NQkeTH)ed6Uc(v=t;Lh&7$r&P=Hy>@G< z!|^c!@q?J4t+pi{T z+(5>L|K+A&BiN8TTnjBlby$!qqv|gPS^NT@AQFO|Aj2p2_O9e=I7>_GGcnb4N?&1V zO#oq#vpSU6*8YkN=ys%J`pD%fqU;XoWo0W&Kcc0t6L7H!8_fg*VQ*u?3rxy*-b4so zul2WtE!zQM9Ivd9UR(%r@$ydBziR=j%lFMI@F!|*_31Nbuc#5jNB{9!H!XF;cFJoT zD55_L`&p%3wm|Z0c(PQp1D-`emzQ)3-_pbaamVKZ zAPUS%Iy&lq|9+b$wHXzuw!b-Le&%|Zl9F_CQZ3h#fl{^*S1P8arfW1;K=i<~1%tEZ*F1;cTJP@AIRt2kWcp3{o!`pJRt$)m;cABAsV3bz@^SFcDyr z>3R0cOC92S(G3!& zRTS!4V^N&RJ^I!`Kp1s;Y`wp|T;sCIooNXCundksSK?Ys3_6?%9x8{U*;g>7dzrM0 zwG|8d?_5{e_aTs3Cwzz2&GV>tiXTria zXBN+ufhkDY;^WTzbYuoYKvh9uJ4XdOg#6njcr_HlYe+l>SLWBxcipct=moVUFo2($ zoqekPRWCbl76O$={feSP{rv_=k!vP``K|jnTK}TfooBtMZo%9U>6HHY$y#c1>~-#x zA0PiHOTju83muVymXn=b<+vbzx#nmOCzgIo>@75rVR^>Sow-p{l9*>f((0 z3=0#HVg>abp<6=0f<<+>#~!tH-iO<>6X@8^;&f?OShnIyzkIc20)OCQwdlbea+YXT za^9ClY?(Bm1nK%?I;v7r>8PH^Cnk;*8jX?Ma&uP>)?zbx%(=vI)<95*UUHPjG7$z5C~Gm9;Va(R!*k}@?;`4=+Sw? zqBXt?D}(KK=}b2MS;mlUU;SO|sa|l?Vr=N`awUkn+oV0(f&lhnw`+kRjj?92A z8OFgci-6XkBHy1%`86PK5|<0egQM-n2EWZ(*X>LP)72YzQ zEJi@A!*<-YB7N>09HHGsY!2QbQzU_fKAGTJ%+0NyZlLMt#56Qqv``VXz775&SXvZ> z3+2x1_mQm9!w%LF0Jo54_NjA4K!DfNr`=my7ZcT>gIJF!Aw2z*t>|RhZx<8u?7uD7 zxL!&eL`sIzVTapvJq^fzum{J=xeNse=LI}ZdLg0%9nWc~QUsCO!|Xk1Cv5US7_(#G zGxKU-F-aG2!5lvHAVTtw9}=cF zr>Mh!NdyJ!)x_WueI4jhX!oXrk0_<2jR4`Jr8Lz62+44W=cr^IXnz-oS$?LPo}0_cZs!-Kln0V= zHtq((#~&O?*=S{?*49^iz-~rxXWSChMXhIIOfUwiUx%hMKR-11*5iA{J2Ek`9d9e? z?&|m)DQBs!mv<&uT9WztIsvY(POgSGM0i?a!iw9bjW&fr+iW$sU}~p^Ki`_g4C2X>y3@BeC`3dOV}mi`u!j@kKf1dOg8lJC zR@7rBpxYPCOH$HZ4jm2AgPWtfaJFM?F7~6M*znY9lsjqp8L`U$FgpuxAXuaTif3i@ zP<7xt$e`0b`vmr%hU1kYfAu!n&cg-ftd*7O^HW=>?onfnhGcLGkBuJb(7=M zw$yCT%xeXM=vYR#Q8_%TO&srhsi-*E-VQ6pF;3uDRUc|;`d;gl*E68%GW}4)&~UwG zQ2*{aHX_CDvMnKmQd9(V{k1e0642CVP`dA0a~R0D1*vsXLFfF0ckF$fI)%_CPMd(O z%#BVV!F6v*DKia`0*S)@o*sY)QmL&DdGg~JmVJPZc*-~a2m?GFSpUz# z|4@D;Ud^Yk_}NWYYlz9J{QVD~YmY>Rgv=g*7BN>?=s01sw1mbxTYY`XKkc>yKv?k^ zwc-GxLtA?cyj3~&?c?1=_;G)44`64Im(o*JeT+#j^Agg)CNO$-VF8e1_(GqQNB34{ z|4+!*+owUAT3Xk@o;EdA!IQSUGp+d+1OJv$=?ILyhAb@1?Mq93x3kbmhK`PIo)I7? zr-J3<98o!naqXse3hyJx5J8%ffJyz+r%%@v6-yJ_C_~nE``(6yhvO0xn;9V&J~8nT zq_d{oGCms1^qC=Mq;3YBHY~72*HV*^kU(;?^vf5R7aZy5CuL=o&&-ly{7Up){vfKg zA*X^}Zc4zVpv1bf5wj+7(kUjQhqkk3K`tBsUI76CgM)(@gv=?ioYd4Wmisd9-Mc3v zBLfpZgoF}EYXJ@h(}YXDd|~I}>IX-dnfU`LXzDt>s+aTA4Sw+UXg2)|nEot!vOL%V z8Bu@$(YQ)1!W870*;yD5^2jqoiy5+6fbQ{?3?1V0U2ckgh-nLhQIEC^VAd&}eB8hi zAajt@SD~jKZcuo|bG#sGV?ml`C1B$r?qR!aDy7y50DH&)tu;Yt$P6CZgO|kFrebKM;3ZW3r&CWhr z&Ps-B(aB|5tH=m^B8V0>Hxf_t2gsi(~Y0|S|v znH&9NRh5)LdN7Ne0p#o2wQB>WwziwQi`^>8fX)C+mG{Xq872=S&RtAi!$wZ}UOM7r+YO;NDXg*ZOXh!)A;G zpV7&M+P^?#ww63dnUVygNj{{6+deViw%oMM0$&7!h!u%If-fRgoo6a4kGOP3gR3($ zAv;8O|9;5|EIL}#Kw-$CwuHnH=v(Xq_(;?YN+zJ{a*L)hIIEN;%^&LL_S4DA?E-?{u^3e0H&}#!R>!TjV+trmEmM(-`bjPz?G6A zljhR7!)e-c{YfW>Uag0@wKWT;x`&|dclYw-WPKZ(oeC0T1cI62k6NavHS)jA63YQ_#5WQ&SL8|5pMD6;9KDZ{+6hJ^BZ3n0(07KgscblYS z5^8&=XF~a52n0tVcaUPy z&@Os!TlPk{*6*Vc$fOmnUN zoy-GK(c}{yO-&h`$Kv9z|Kz0WGG8YR0M z=D`C(H2N9Z?cDAJf|9YYXC;5$lr_`KZ~{K_=g-fzwMh_7K5++_4~X*cK5dwa2Y}$~ zQPkU_)G+9CysImiPT@9Sy~V6~c128AWC(yN|ADkVDtLqD`Sa%wU>t+S!==KF0F46C zxg2`)+o-+OPOCdRFIOBiHDklVZlCY1Ec_4P6`xG_|Bk4tPfO0|5FCQ7U9XsQy)l-_kiI6oq+{0 z?v5A^KobM<+9tw83{JO;M>+OY>LIf1RCJiQ+n|BnoX7Nya%PogN zPM+@%>!XS{Ha8!v4tM|j`8vf~*y2iHhi0F@ z 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 literal 41334 zcmagFby$>b)IB9v=VvY{-p)K*%8KcrdCC1p)rP-zXLbt|Z28acoPP|y_e zEbq|sY=8)PzTNe1)zjLf8{&ji0b`ic*xO*5+GO1i<+IV3iXX@l;L2a;GN-=MT8T+X_>9`OQzmKPpa1jJ54bk}o{2Oz zHWr4@n7Wzyqn7V#H3r)Y`QOD$Ysp9bf35**{{Qu{Uj6@mh}N;k5BUP0UafR>B}#Dp zu^BF@ufvd~xMn@kX=nV+n>Q_WdKg`Q|NdY#=|{led!MavGxx{1 z%%u0nQGC zhIiKbOax`deeTy=xiy;mMOt+XTX}DBy1{jMxD*s92BeR@-3Z*Yy5h4g6Bo*72A_A1NA~Y z_3^f)Ly)CDJ@2Xt)XLUtHd0Sq`S7PPAdAhu2o@7X5nksD5BC>DoYny|q){7J8)-TX z?oLilXO&hn@V*d;Zr8UrkHI?ddAK36uGZ^}B!PTsx<4z1d`YsdeFphLBF08|cfC{m za0nGF(5$h)yFL?-B8_kw{jaEkg})w({R?b~UR#i2uI%T}pRFcK^fvla#4?%BmD2_$ zW@dKI+{et%njY>BcEHgI-Mm14!jpn-Juy1Ed3Ig3;C-_euOr~JJ^J`T`q(FS7n%eK zBj6$1J3BEkF$O71?Ck7F=)|u3H5=M)Yq%BacSoIMI;Mi8QJuzRAtD)*xw0}cffW{z zW{ctmV~(UMn}z#URL0SX2_JBBhYuJeJg4ItHglkaZJO>XXZC{fA!$DMZoA%%cjq%v z0@s_3H~TjOKKEtTbG23T?iL~kH2)AG_z27i(nXAxm4~?Z$nYZgCK?z(=v?zMnFVJ+eUx!5M`lVfeZFO}Pyf;gNCCFKZ zcqxW>1c>+j)y7&+JT~%^-FuKXeQEcnxyi}IAtJ|rUq^la{$0~lP`-A>w)#UFCl1Qq zT-}Aw{f1AqrnRhWKiR`&Cz;Rfi}`ZnzQpkGaHF0$I7rE{x1jUEyw^d)MO=KmBF*>G z(o(_uqo_7F*nbs3g^5!X1Trw#6>fXXcSa!X;BWM607eY7k6+it57)&Q0++fs=X*bz zJ6Z?synSS3`mWD*TtGtp+8;Az<0HkeCVC#E%IWIv?rv{?9IK*TK-*KD=QscetteG_6Fq3`1rVrj@MbmgtkMCX0*f;-sb{oHXKPy z9R4j32xf?IN(w+15sH>Z+^}}x*_ZzcM}+SS?LQz4MpdPcQ_gR1+}q!$!bBcSB8d=7 zb6bCzt?Pd;2Yti`JA&(^RyUoCgrNc zQ*-6hE}m$6nAmcZxA8~C?=sLUo1%?Hxv9+0-^svuDUdFo)u?U6#3gQ*_FugJD~mtK zZky>T6FLvwVT|4`s}dgMn6W}sVZ30wp21@$&u7&$l?XknjR08XdKO^RFys=A_8QD;Hmo^ zfYj$U>HwPS4jL`k2xBGJIwFXgZjYrP@7>&LI#;e1{V|jaREG|b;~BKBLCI@mE95Et zp3wF{+hHYh6m*$)Gchn&S?@~%U*NZ)WZstmF&3OAv>*_Q=xW2RZvfG?iYM}wem~qa zJ=C2~TR&hP8)RxdT|BD+6C+8uwmKX?ct;v$x% zh~_)`gZ%@q-C7@}3J~|8{zTT@o#!@<7kmc-c6*Zc5Z<ee?F?g6 z`TeCqS0c~KDS5hVfb>hEwZGMr2O6bFnb4wr78fUU!<^v z1-HAX(+pV>0F0!qbjBi~(|`zm%wt2v)I z{YO&7g4>rP?>Gn}5aIP8Ulz!C+{;%sht5sX3Jq9Tb%d5{synAb%_SIfWd z!p#2RzqT1KZDZ4HzSs3v!j7xnfBqHL7F|YS-~NC=%qNiJhsh2s3n%!vvkOl(f}R-JxFOlhfWyUzkDv+)Wj(M?(Nnx z^$TM35>><4ZF$LVKW2gRJkUF;Px>G8t6$1p$-dNPnyqKHrpo)yDO1^k=(?Yan9Ez! ztm=Y`Si5eHC@DEUH8uR%aY4c9Ng|(eTHD^~s-a`VfA~kXnH3B!OEEZ=v}tUcIf1oH~u~a3SJE3da%1)R&V!={l;DPcjCPc}cFz}mLdX_?-nI%U;ACW)gVJr;D5)*O^rK7^5o8Mt)~Y<>qGJIe5;a{P`(Q z;v|s&j+@m;>iy9i{rpXZ4lWlCAla=*VL4n4SBm3tU);|by)@gI| z22~y~bM9GNu6kz=IjOMyztPThb33-KH(Mtl`rfJMlgr!@ablU-ASEz54gWg=Vn2mG zKv*c44{wBx%Vta+)#*tyhm1Jt`i$d;HcM6c#4<-Lojbc1M@K0M-=(y7XAKSO`6jmf z%^G1{bIfq~fO-XL7;VqW3w-;y`NU9MiIeZWRQOr@yfM;Ica3;WAQ8apts zZ2y*z^ei(fk`^Zjm4t~jDog|d89F`1fo85;G%@}z&}1>T!C0nfRyye<_1J2|z?c~4 zaBsLzKS)cK{^OlFJQCx^M++5R0lPIX+glgqx;gayd^G) z2KTm!BNC)}EMqc}8!BuJ`wM&H$dSZSnkn=MIQrr5={f;QzrYV@dlA-dP~rX@F}Ho0 zIYE;urpMBmD1sq>%z%wYi-FA9goQh>or0Ah!IHymoc=|aD0nS4b)Ja0e*NgJ)6>z> zEMK`L`zs#aKC#T5S#B+rc-*+sy1GJG#ZGT8PDsGBo<)cCU^RLcsPK!BO-l~$H-V!z zP%EpPR{<`RSWh8~N7bpMWRQ=S1ax-d(1z@GNh<1?u8&IQD6xsj(a{0D9hpLGgic(y z$`-|a;}#X?>V*w>QpHodds}+WE@dhOu1_KFDPA1965qn1g^ILtd0rlP`}_q7y?}jL zTsPx>X`9rwI&8W-iOJH-8J!|yQr0!d31@|4Xx|-}3Qw1gacAGU6x_B{G3CB{PI@_} zf26zcTgf=TqSO4WdaiL&{8OG;2@wSys&!V|XX?p#^so&!_3JnFh5x#oCh0#o`QwWD zJjjU$>D0STft1P^VV(AZO7-{- ziF#q1rSpeEQS!xvUTM{8?OMmg_g|leCBVZ)boEkVGEjVR;(;odncHygoSnbg59(aW z95Vd?cM(FZ%&4h4IIQq8>PO12$>CBmPq((nxnE{wEh;F&g^X4W zMZMR>9QqL#Bvtcs@FrFs850=-t-IuB#Qw1xNjC2e&p`Mlp^u!UK=zU*n!u3BQ$V*u z%)|Z51ksth?+jYK_TtH%xl!B72R4+9PhZ;Lu(}vAPk;1T7IR`g*QOk+FZqfJk&vY_ zHW?`^+d?=1v9RL6IOlynVOLvQz>*-D33F?JbFEr6q^Pv@e`fz{0OW%;fgl1r90vP| z=mEC~{`FLudgjoYqkEyU9L?ztFY%0D|B}2aJxgrjbn)vHv7YxI_8$XY?fG?#7!cS$lItxr?1H%nw%aScb zQys0os%mWM(t9xJ@bY^WrMJR2rZ=J@hq_ z)!hX~|EZmRKMDWs*Be1L2 z5XO=q&Eg;3vZkFms*MQbFLoxE#VtJ+H*qu90-EOB~hGw_-V9!@+v zNAURXS=Fq9-K&aq=bO+lGE^v(2kr&(r7ahWL(VVQC$AwzTy&&3`nS`Sdy&1pI#Tlt z@duYjk!{eK^L?wWO(yZoPt|fE0Y?CSb91RNZW`dC_|LD9$cS&3!yXcNIZZC39y!r^ z(gF(fCY6&rK~NPd=H7k1`#3xE$~=5a$Sm5Q9hVlx`1kX zok0O7b>qscAtFj^y@rvXA86R@0d?grTEejeX*up4-K%Kiy*;YzVPfQfV3B%xiGd!2 zwT&_dhXgmb-FiM{#0*k%OV@0mON22T6{kKe1r(a;MPmffV(IiYH$!=$Fz4FmUTJ0Q-Kb{ z#KP$0XGe+kIp3;e4ix2wA)*;C8S=%ae)Q47krhKi*?mj$VodM22_u|cW@_sS?Q7sd z_x7#xl`Sv=DL@fXW`u}1=6zR`Z}!#q2o{^AD{{@r??I`0_QccJ`1ty)XQD94RA z^QyX$sLyJ4T$<*zTb*QNaS}g-$+YRy*JvK3+c({TSZH-y$zwkV?{v$R|--bAIJ9icrsqG0R4%Odjl(#d-Kx=yv2v+o70n` zHg+n!u-*+5BSXzr$?ji^0652WjJTE7Ck12j9&8%{SphXh^tV&jkcGg@4Jw~7vh|Xt zlH`%K(LJ7VaGod|A$t*M)$X0i|@$m_OQ zQL!3u?d2gn3#3plBpEMaHnU=>apXb5fxdj%#m!A$U>osvug8*Y%zO`|Zq4lAke=Ve z&u=ZXAZH6^HI-%2SsA1HbT#YK@Kz#u@9$0q`a~$;AcviT+D;F56KE-FV6?^{v*z`z z_8LfKC5`gYEo1im5+#=DbJa73!C(Hoqh`*ov&rWw+lWbrjU4k(gyJ43XT=4{Fc+Ji zlL4QR;S5wLTy!we={*DXf<#LoBevz`WziM=_1UXfXpuE89=kqEdnhO@Zjzr%`tkjAg4N_3i}#7a z??Rw`EwL6)2p$Gvhg?cfCMG5-Y4+y-`kVLbtCErglW>5#mB(HM8Iat#d=K+)t*z#y zsW40n1m(yv74qm&0+(*5BVdJnlQTpRNXeApX2=&*PH@UI#_qAs75QH?(V#10Kn#ZrlPmk-LAzHoSwMX9emPHwdUV{rLC6$wU&5adTm zSs!cp0{S!MbFKqH1Vh8TZ-TlE75?}4A3usvvBtEem#6~eB(|$}(LPVwm?~Z>@N-@d zA7btZYJN9BVAVe5d@J(`H02US1qq>75uibylwErMe*YdDx%Bduo*~{nf#MZ$O(6m(X+F1$1~W-w6#?YL%<$Y$N< zoZiHr+Ctkr&c+yj^rgPqJ_o1!TATwmWq4^tiNkZc99CL2505})y%O?=4bfmIN5)Mm z{@bumS;vy2dzyFc`G{N;5a%SqO{p;tG5BmrQc~@X4RfV)Moo7=e*816pyyUook5XX zAl<8Ln9MhI)yrDZ8AWHuMVyd4JY0J9P5U(j5WUvlT;-pd7d#=5gk%alR)ZUyEQS8& zfZG=@#8;s-e9DE`qQ&#^duJ!*{yUoy{QrH{=%$aHi(o_AuW{hX%c+m{wsM++ZvDW02}<`})y^WVvjy*&)icCHS5Kx(q8)bMFKPT5K$UlC$D6dN zF`605B=L9VjgbiOgO}BsTVNRL-Z?{*l)Ojx$qW{`4aH@xv}s!Tb`F7O5{ zXZb}$3`NkWoVA~^I=L3yJ{h>+JC&!zx{BB%hOWfNC-tX39Wvc_n!qj6ephpCE;L+> zc#tX1OX_*3SU8S1BlOV27$uQST)pRfLr7R_#F8zY^SfB(%JTz9lBPOs!LP5F$N@lm zfK9E+2{v4S1bd$>d*DW59Z+!;iLS^+?At@vWM#6b8-|`K%0&#OCiOzCT>rd#=Sk_J zv1u3zYeI7Cn!;1Rf*-QS^a5$!E1y>Sj`>ZEJuDM5wGYBcT+!Rz3J9Z8ocoOxUHNDw zEx_s`_~^-_7X4yEm7cU=K7E3hEm5a9N$&+wQq$AoR50}ca(0sUZ`x~9Q;R2L;&`HM z^Rr8V{^dXW#G zE7YxKnsg#Vtgu3uY_zRK1G6$HO!|qBnu`u_>9oyEHxVJ2$gZF+JBW6=yZ^8xl;*69 zXlZ4ROnHobzWV&xA?{t$c`vIIuM26E)mTvx!$RrWx_9xX{0c_ROHCV_k_GG~+v@P} z?+qTDhgWLx*BOoX*Qa2$@gmMH<-3TbwfFirzbSGuAJ5Zhac4BX4Xls=w-bAp{dyO9 z!OFavt1!WPSf}Zqa?ZExXN~K|#OM<>K27ySMSFDz8R_!peou!#=V#HWd;_BmgrEN& zU;FaB;R1d6s9K)pTU=a$JRhg287EF?GH-5dmy(RkHaPimbq{rQg^$n3c!qm=-Y9MV zx_jz-B7CNs$u+tPLZuoXB)T=ZuvE`CE=oNUaml2+U#q+`xI@B|BAf|pduU0NQ7w=r zWkmgL=S#kGs|leEi*>u|zk-qDgf{PT=8su%cq~=|okn#Q=rw)oAR`8^;C+K$@bLS$ zZ|`uMu-vea>oHMwn>`-%(9_3*WC%ZN~uBDbBaJyxs|_ zL-w*sZ*@paP0(vkVdsFH9HJ^2HP84|9yv@aej@e{g9NWPay;e zqQv%{BnSI56Mmngj$CJnY-YVzBFe-|@{vd{S5F4y?#68+r9Qseoho}JnC6r&enlKP z?QyUt;7CIlvHUSBV=TYeXODe%{OiDk)8S%GV&XZ!NATOXH9c{-O3IRP^exyS5fR%> zcYA{NHF`rCetOC!5n=#+{bCQxOxOWU;!V=lX2|>X_bp?*MD{LhFc}}k=5;hOA1UsA zkg$xl(jOuuBzF2y13HV1+-J9hhj<$uXRnZ-2r1_SBK)Jzn&7DkN8Lb=Q`DotGdn5H zfDX+Z8F?8lO~s0B+ytA#nG8bkr(`taL3kv^|DbjSPI`}&t$5OS$2V5`m)VlYPET?; zyL8FUmTJNr<3@qb3y)ny!WzxSN)BO*{Kkqg@_3@@>2N@=AYZ?W^!6D64xg>y>@C16 zn3j^%lc*Z?OLk+ju1b_jaeN{ljL9&4kMrH#B^Cdq#8I%U+gMxs7DLS|m%5v!Fk)Q~ zE2wpsHOnhm;0NQs+Ek2KChMEP(_)`FnB`QtuLo)%#Z2X%*VP)oKC^Hhn?aBRAF0bh zgA|9AI=i3BwykTf+=F<5Qpd^>AhMpfM{}*gEfIB!_%85ZGWx^oZP}+sJ3yhn?ZeT{l!|^ z38!H}4weQ&8S9U_o%KHrIh-n5V${$+Z;YdG9AGdzA@A(qR`TTR)^{8%=@UawPC*C_+0->IUqYk-8@bkymr=?v+uRlB8+CSS7WGB>O zte59^$T1zt*tolwXCr(QeF$PD@NnxRcAj~AI$}V?xxbAcDn`DTl$c7`f@1;sqF~mz zU;7S>{aA1!6zLg4$MYUO?&}HDasu4SYTPSV8~H(#Ry*-JsdE)OIT(U}u%Qa|4bC1j zoC|Cdqo#7ne^+gfRSIZ+6|Ba``}fc&LxrM2gY#;Tq*5dmEKR&RYkp(=$O9SpU0Mu)=ZCYAx3 z21qJU3_49kaX|qtV?XK)ei4~u;UxtwS^x1PU6L&ukqle^l=Mf+iNr%J zk$ZuHYF(Y4RhyXV)0KVTD;@mWiyUAc0zytAE{^RIV+R+jY4ohABglW%W~7aX9T?o# zNv`rE!NpH-wNvRVoy5C%VVywyNh*mg05V)}lOfYjt^q^XwdXFF=Ud(@0uB667W`vp zvitB;(DP>nRu~!*1pc&Zb#Ga?HrKznXrRdxBAM;Pw7m-?co&`J<7$YDe*2X9qW4b zs}eVD7zd6u?r9!H=3~DTCLf?}(SU()dnn&L+%ITNXe#oRrVu^vFD<1;N_}(Ws;Q=S zuA;-wwA^+-vmkJ{%Q}@KlYf6bp(C@>(BNCB;WJrjbu8X6^i|X!Q%24>1xl z-nb1_oF4vNsu9PZr9+`?v~~`3Xp(?diLP&Xh7gN~^Z6Q0b1LZrzE1LVMgIM2mn@hx za+1203lo`5B3F-->^ z<0bUvgl}YEfDW&T1Mnp{FR*h(CBIPKz{Tal%9M?RYX}M222(YR4n}0>_&zRg7NzSw z{Fgw@`bV$5g6Sg?oR>$OqWF_#Ir7%$YrZ1XyTjHJFDpC{mTW z`+E#J9oRdzPE*s$3W1O>mI=Y0DKj?G$$8(ZUhQ)W<0g)5#@i1>MHSoOxg31e-iF~b zKC-efwBBXP^b$v%en`_bi(MKiB z>n<8-IL+1~Vx*7J`{`i6QZ%!v>l2iW5nQ{k!66k&LCmcuMh#eu>NV^y!WTKgesDWa zy~OrgAhYLk*GFAf#Yyg3ZN)Q$gMe|cprG8_$==dqnEo^1xgu}?P4w-D53tazb&q4; zH={mLTVcYsFkRL$K!EtQlnCj4k*upxo0$I1nlSrM0c=4%Z547&=nr|=4(%DM^JyZk zT<74lcpbe7_TInz*86%$a8FvN%BE9zjhvh!#4^k3H5Ih9wAHu`aQGVl+sMmpyk3nl z*ctD;xmlp=JiX9s4=tR0k|$3Cvcn+d9Jm-BT9D!+=gQLfrfR(J&@+b~H;T~*5~RpnyzU#&qCJ+7>j;)>ooGcH8|ZF*0x#PRYP;k>M^9v9Z8Cg=Ce>f$26Gl z#E$Qom@*^H&?3H8E-l*vF!*T~o&a|-mtQG;(!|@uM5p8_0p?y%#Zwu{wU@{Nx_Ptu zb~}!dKZ<3;+9UeR{s|{{S+2btzvF-?H-rRYMge<<*v6BBK&PMfVBY=&0f+~fgCZ2Q z@)G_nb3(6VXtE+So)Wd~pwYw{XAh4K>2-V?u&gAt^?vo9LQj(N`EI_v1kpn%5M!+@ zSX*ydfmkz|6?8x;ZASYJw^`~inb??5rOd#t#`ET)N?)IsI8q`zITWP}Ojbi!GZ08j zSA#{oB4unx!B$kPx4yxI6Cej?svmgM^~-b?UFCEyVX~ zHQ&A`@=(d)N0wJ5B_@u_L+Nl3DPE+-wE6jW7gbZ({LypGlwcxIrtO2h?!!Srux#!S zOZ>o&?zAgHc0hjV+2UP>r6)rW`4I_1NsaBpdsV<#C`|r0(YEJq5^e#n0LJI6kzZkO z4yW`Ej9!`OKqC{;$BYn5=dRZwAxat=V_dZ?fXZUXa1jrg?n-9YWVV5L0)9gmOO?_O z2LVc>r+1u4>sJW^eP&i_=-X%}k&GkK2Y)>na3(r3S=Q%$%v4D5Z?QEuA1*iZ+MCMG z_H#ugYND~OI+%o^CrCfC!?ej%UQQRBm6V40WeAuOQNDJPgR zQ<3lR;H@tyxnKHN>)+l;1(E7HClEvwAZJ znd4SDGmDA$#ax0o*_FbDO6K6j`ulY{Mh&Usj{?ynHt19MMg+oeEq80tAn&PigWG#2Db52>Cv=%+r_9W3I6ri9(VMp6!U5Kc z$9jCM%FPY*cVlY?I?j0Zr5GDsW;FHAHG2f`9I2~eg;zK;fr0f;(8!K&gjo_;lr2#M z%SFRbbj7AsZ-29KTDa_f^*WKsY+0mdj4x1UcK|dkGk@CvHswz0Rh|P#z+A0c62}~q zuV79H?)=v{yg4w{m|CzF=`@`(`qa34W<_@D%8!n9?QEA*%Np8qUC}AyC@CNJ^mMBG z3jf;;V{IQ+a=a#u>gn5a$QnpVdX3ed*~05w%k_PEa9ZY36{erehZpRXlDu45IA&!j z8N@X03ZkZu?S8Jv{Xx1&!!nTXg$ffR5^%3DRsRejAMYmJkpW@=Fe$973#J8#>%qWo zb3Ay1odPpB0P+~aWZOC~+Sr=1k>RN;3lfcDmu78VT3qc4CV=4jb_1%YrRDJcDU$FPoze*)UR zT`H#l8$x^K`>z$Qc1x2XR*)}KyZ5_gjd<4SU!70-*7BA6K#Ch2X%c`Q21fn;RYS1% ztD;v|V#*nC`n3GP6#*iY{&&XaV5W5K<|S)@M%8>`60dnoGef9UrrE>&&3Yo?N&+iR zddXrCk>v0Et*fgQX9!hH9SlaqGfYG@=KDUlk19S6B^^DDosQS~;TMAMS4ksZ3SzOm zo;7zM4fj)5wIDxJ#U-mVD)>ZA90|A*z3LO9I6b!7pGN%b?9ULxbSvzlgBh@fmisE1 z(4Sk3vTbSbtde|ax${m5X&$UqyM{_T&idIxW;s2Fp6GIiGt zZ#T@fVSiRx@e&tB*rVF(HA0vl$fHpI%gf0aT&2r#o@6^~MMbIUtfug_P^(*RJni3+UNMo|aZ&_z}qQ zk1FP_UrGty{%i4RMa7Q>6RmR?nL{;pD@AEO0vGX3nhoA}!>&IzaHv~}DB_8L7(6nr zd?$?YuI^&~&C0Ai3e>mC^C(a&J3}fPKxw=*WX~Gvx#hqkk*-p-mwF8J`pj_jIj-0k(DJQ;jBVyc8~SDHkzHywuW3 zr_CfausujWhM6Hum#JWA^1CFf^fqXTw6SWr4k8qv_((g~6y9JN%c4uaFj!qJ5uun4 z$VxdwFm~xgJa=|Z1U4SX;_YRT>sI$Z5`BFedAV=&N_KYZu)+sTlEYv?Haa7n{u)Y7 z?oQ7TEgt<+(a~ZX*9TY`A%;O>4qD7Tl&s&q!55e|fB#06;@Ne)^q6y#I1G^>c=bv&%ShEzIwMmJ>G9+fB zsy{sC#@ohADvf+6C)dcm+D1(nktl7gNg>!RyEamEHK#L<)fb|3PQw@s$!f z6eXK$_Z>cR>9XD!mhXGr$2&xxcz)*F57pS8xA2icc6brKwGfoBLzR}Fmz6?o)r&N zg?WKR(F76Lu&HP#sC~=y1O3NHC?$;I$LdR++dS zQ)%EJDlRDaSz3D7K{T?7J@Um0<|>=E->N@+caIqs%WV*ZtlVnSkJH{ZykQ$Gl0g_z zSctZ5i+xJb!YbS3W_;vaTcf0VN0zFZ{x@J_3Jjn1Vu1{hUKg~1vYMKLx7u50H^PYi z*o_8rbK{fe_Ay;(3$|zP zVZ&~+wa+*v|95x(@AYt#6ehw5@8d3*Not-Ej77(7%>@YHb{^Y$SZR;_KSbo=B+WpM z?gR=9w zvROC8njVjvH;Gim!Wp|2Gm%)zMl_N5e?s?VX3xTG%c3hNo`omnHNkUiWLMwC3C!v0 z?aq!b?0WQ-NT~a=k`#D&_69^xS6Fq&EuA^p9EB4KF(CBf$5VUqq+^LxXJYp^c86RoLcceYLK)OIEMGNgtc$w7%U1 z&uzG1aJyVuGhmC^WeL$(LfhId1=7|dd%c(o+-=91rk~y?%$+J60^G}=?!69mk2RN$kc`1_l33y5r zXMsc_W&nIYTaI36t6g0p=_QPR(X5-dl8!37`91-89(akExE?KX2cy6sXSIMhE+?Cr z?NFmc8bymacds!DI4QM^u$iH(XiAN&^DwF(Sdw6W_z!1SntWwsS4&$KQf z*GqQ+`^%=BF_?o6(n ziyNOeEjt?R-Vx5sBImo=KJ8+kWQ}SAa68IDgNtoX+(EVG_IP1ce`*SUKN6GYvZky5 zNs(`E>a`?Imet&K9cbIwULws0&Q%9f2vFY`1x1JWcXYoBzSFDuQOn*=hk}DQ-3+oK zIXk0GWBhCQ=$Q3OS;EETKB|GR5$7c0Km&wcG|by+Lm#O0NwhbC6&GmxlztAv%SMh8 zn!s&!=8iH7kJM?H&GQwe0Sbsvm$YTA ztL0mwsLp4B<&$o|?PjQV9o+{~Mye{eHPjv7y}PdDKnQ=IIl}r+x=3ynlKlWjZ5>4h z(S^AZ64ims2FtXL4r_n|5Z$t_k({Gk8SL-h4|8Q!OiV_wVdIXUGKMx2SpCEHj_tcH zbh7m9gWCsn48yPkjYZTI21KhX8o3QT#M!M)KnT^ z5_bpk$mS4w;kYcti_lP4usHz~{r1Yu@j9SpO*}B~Z9B6*_S|9;Ca%9`ET?0kBd?hrvwrypp1d0^coBEy*5(TuFtO(P(dXqQXi0PPM?_%;~Q?^Uh`EewtTLZoHJ%k7u3zY{z#D3>- z4~=FS!&vh3={jn_dqKr^Dd&Geq|vE;+C%-iCB5CagL9n#?|2)Nr~Br1S51a;ctZl3vIK15 zRK9HN1j#6YaH(`__P~quC1M14$wrrK`8fpzqt`=qu<-j-2KtSgEfA$6I!)@v{{SaH zaCpW+p&=)e%D0mx?p$fa4Qat|A4^e0G!tfUrN@*rvv&>$VPW|O(8=~#@}CDNHl{6H zE+OKoNDmjDDDvrwkFJfgP?oa+bL(U+JnX6C1sc}5i-uqq2%4>kTbYhh$@#s zT?s;G3{vRXRv0Q`+k%fzPR{zD`#XDz7ft%2W=>95;Iy%4vL=S~+z(qwK%Sxz#Vt4t zd=sfTlq6q5VTXV6 zV%@I<1+2Q!bMl$36vAeCOxB8n`mh-f+2l=PAv1j3qny?XWMVZXonjv60^lu<>3SQ6 zhbvn!iP&Vdaq7|$2ncW1eq_FR?pFv;GR2_JLy&<66g&H>R=vQTTk2JBKQP;n! zs6YcZ0kH$0v=rl<`&z6UwilPbZgdZ>lhcO4!|c%1$9PFpTDq`_qU_LiY%fiJOcYTb z9%+DQ3DR!6s!%ZlYOJI7_S<9ok7jwg_qTikf)*K3c5J?%kH(cBv&>@F)+wnk2M6cW zi5nO1I7{I?i)@G8)J?OnQk0@emUqWQ86U+gruii^-sRn^hz>;YXkg$itdvX0AFF&% z{si1sazu>&G}JczD;3Up;Hn+hcdjNjA##RCxT{8p?1|KJnK0i20=}$Gf=s0_*f2T1NxQUx$d0AJY3kr8v90Fah4ii_4Y#73J42 zfevP2zFJYiPlXMZ7J0vE^NM6mU{u%D41eE?^CZax86AFHkvM>kY(+TbR+Vq+p0PL= zT`HAueLzfc9v?T}-9!6w(pGyN+j(+4d9=|Ta%MZUoaEw6Z)lvDu>Km(~`?3@;R=YTtd5tt)F=igL|k81~pi`#tkG{#`u@}xvI z5|SKSu2y}c{vSi}*Ba`y!43$wG{bXN{I>7y4u1+!DH28$eaBI7t9epsg^zzieVc1m zcIFAFFW_mqhO_oPvmsVX`{GOl-bd{R^FWQ+8hHvvT-w-<9$zi25W0V<7bTz`lbU)v zELHUw+0C{Z@*xQkm*oIp1OXb2$DXscn%V~=qooMWoS_w--QSN3y@Eig7+}K!W~K1( zRj|OLqoo964lpULSiSEseL>d_R_j0nGZix^>pJ{{CbtakC{a+%4PD$-A%z}bblcYv zUyIhI;IA70U`PE*E>8KVZgs?(vQ5ufSy+wrtRdEDF8uSoUEjTeK$2v935l?0l+5dQ zcw)NdCMSIm*>?wnoECwTNfw>%)%ZPvue`7@XHI#nq#_ND9utdkUw7)PVj}}^3I6lo z?5!H=i;BwL23sA@;90}NHQ5_!mfK#e^uFv{xIZ^jiC+t$9tU@#*8eGlqpAfN0~Rfv zr1{_uv>d0M^*bO3O1ti~4F2EZ>fVA6+3p^0Uz(2Q=h!AsHwCfVbx9%JVd_WW`uDyy z9r1av^)yE(Dvsc0k5K&mQ<90!WmEbcR(DcD*pd?0mSQ~qYog=z5vV!G&C8=lKr1H zRaTzAgF4iVo@DO|_^96!#TuB%w~4S-2StqeE`1Js{}orI+XQ*{JXJBb7R)XJPQQ0X z^JL?Dz?7(@(3-|9tg23%%q;vPsYg;Xn+=|g@CMvT*KOE+?fzLMo*f>$ z6-3s5fg}FQw58Q$Bc&b}A&gCYb3=OFU3&NXE)F*Ju<*{XFuZ+lHa5p%ohISJ zO8)!HZIF_0y2<`xN)s-jL2P*%1_U%NjylCv3KOqxPd=-uZ2>~u)_P!H@o?z>pVXQ) zIy!6AgF;L9Mk;PGP1z)~b8zwO zQBk-KEk3<)p{*zS&z#(#lUAl#1f6g8l|A!=X9&YRU}ipg&qW;aVzqLAzwu(+)bYbx z5vp8tr4@L%cdv?6UWCAdZV`<@*L?V#aHm4{<13jo28o|$ssu~6B6)1!;0Kb2*x1eb zQ^#ESyf?7|B#FGUhp<+7a3A#%V3}m&*GD{_Oehx>t$*vPFtkGgMXzWHFZb5xMfZ5I zcb+;|CpSLM0ZgJFGqa1e`Ro4qcx*GGENpM@2c;Oj9#a&w5Ra|wBZ39V%2GFnu~6J>(0JqD7thU~_i^^Ivrl7FE6{vTwkQV80ZYs64SJeHSP(4I(G?y< z5A>-O>Kwg-t*xWBrJwQ<0J9qA;UGYc2nbE3E(re(GQggqOYbJk!{fgNHB3xWY# zcZMhFSs12&E_1alq%KiPD)8BJkuyUnQ6qP7`ow3@o)-Az{$| zoTQ3IW{Rl)=Q*^i53#}=X$3}X;;7DIO|@F{vEKGD)Rn8@lSx?QzrFIl&%MJpoLXk8 zG=P59nhgVdil|Zx1N$z(As8o7D+u>kt;gvONGs79YF0#1_YGAqy5&7F=0Qw_n^x*ix z9KaXVzmLS$cA+>8voj6(Rqo$%xHY16DEgs^jpH+sGZxh>9pO6wcfwFa{28E2R7a>p zcYSAPr{3NsOpz@J^iWTRlDjteQm0-X3qEjH0`aIPPUDH+NA^JiX@w=Usj6b9wxAT> z_nTl@Uj!8S3=9)W)tTv4u!94VP-P@~>HDu$z!H{ZV=N=}1^xU(2+4w~PO&{#J(Cv# z&oJPeKsqGppx@!pz^F$Ei+zj5{8NUctN@^UUYyRC>PJ@LEvyoM2AbDY zSz?(VA|WeOxJ6747uOE3k!R(nq$r~58fP1GE87kmj@~}OA{00{wvtkTC8b)L zy;9Ym9U?lsPfdAoW|%nQq-9fhIsY%V-U6!1HF)^N1VlkeB}M608UzIClx~pj?lw?5 zq#NnnAl)G;Qqm35-Q9OM|L=bHyX)S)SZ8sT?7iRjdFPp#XXZCE$OS~;eEVOI{nPVq zp8YBg2AA2$|AVmFn*a->w@wufBL!!L4VI8}5GU)Ju#B%U>^A4+yM?_m+q{XvSKGY0 z;W7Jl?XIFFo&hGB6%xc-+|E`D`A!!`%SLb;PIMjS;&kb3t5ORJT#hY`l=1!#P(@&tLNBiY4ltax5B}c+~%2a0;PPSDkbyH9M1i=v`!=#W5r>6Rc zjkEhS&^hE639{}G$HN4l9KFjy4vmK2J(-k$SfWmJew_c9xoc}Y?0fk9hl!Cqz)e{! zmx04Hk(^H-0;CQ5XeXUKvN#~%)bH?=z)uj|vPKlu{7k8g%*beopY|0{1=J+u`-=p( z_Q=#!4yrX(hTHIOW9Pb&fFY1fA+IpBV9T3V$W79<&8yltc+AmXZ*#`PHG*M^+)i`r`pKucg&|s0Y7KhgWVlRPD8gqF=qrdFo?qKh>i$Y05-PVy6Ly#4{}NsINZv!^CdNu zD5Rfj{dR^ZdR}XR(a3lYuD#R6`8r?*!-;&LJ6>zm=U}leoGk1h&OjT8v z;I(he;}6Fi8@C&27Vbp9(T&@$vY9sf_LNuDS;n@@& zYH?D%Jr>muWUHY?3mqw4hDdVYnPb{r;=U2BShbZ9zCsFQDy*2rynwt+ zIJJ)Gbfy%$WN>J$_4B{~8~hgFO*X!|n9I$*SnLdcO%a0ejI-Y-vw|HUTS&u0>}pu4 zxynv$G&(*qQcI%?jVZL>N=HZq{K7E)*m4uK{+)! zCir7$SPPt-lIfTtjZ71_bi;>aL)Bk=_CD5!-aBky|C5HAOjO|AqGW#z!+T|#G0BD} zO#0_sA^8fl2R!HoI;3%%}>g@lm3(VqAUTTs7gmn=Y3=60CmO2;I*mo_%F+n z`vn;XPM)Gyuui1Dn8t1hd-lw-qA*!X zGou*LPG{P9sVLF2H){~He4(Rn#QfgcBjJm;Q**WBPQHiOA`O993i$@Ov3fUF# zh*8xFNa)?`KX}wVD7Q%F&U)m7rD*ynny^*M@!NAMN*z;E40x zlV9{feVD9F6^Ms#bw6#e7tL0m;VJ5u`&DIS&)nSZ+$5`n=nUKLk1Q`1&2uU_=6>>a zntOuc9T)Fl{i-G3#aUOZz-a#)kLu^LZz?W*h0_4Rg}Z>Z8nALud-sM| z`F$fbEmm&=bpj`|I*kFPrDsh0d~`%@mj{5LQLz5jWC9#k=juyk ze{ExQ=>Gw))rRrWyOiJc9`xXqc>c$xk?Ep2@ztMZ?iRH>VxgSiX=MX-9OlQHuxn`g z08Hu(iR)^{HniVSR-%}$J{(RUToNSdqZ%+P0f5!QPAUlEkk}8%m&eT{a&rZ*lk3id z&DLD6kvzkg^tVYR?mnY=5k;!hTDNBUeYR0{J%5Pnu{z$cqVf>By1G-qAKT9eH`)hV z^zURJ-xV}?pg%c7Qqj$*jY3LB%8r_R+{w2P9KM{Cz?}q5m^Q~FTZg;u*iI3zvaz)t zSnPcKIIN|G9(S%7cw$8$ov`^!SAszL|z5dHlsBxK}$IJ4OF|=f{7iatS8kEHdrlN;7H(2JOn7w{rc7zP=0rco-H*z1yr4E%A=)!vR%xdfN4L zN$ggQr6zSOd&*7y%7w45PnTyu-MM$X^=y2+8iRP_mA-FX1D|XKWl6fSl9I!6Pv_vE z(ZS_TE=@s7ie;8GVug6s)3e9bwNmzo&-+ffAMc@|arXM0t`z0$nx|MM;n%MQs;Xam zlkp4;a18aa^$l^C7HSvw?-8O;^z|k5G*6TkIog$2477>Y-G3`feNbo9Cp+0cpgr(~ zXUK!_?dG&jdS<9|-V26kuk$0c+5N7A(fOvC^tw8tH$0nz$JFS3BOZMXFaKJpWioHV zGhO2tjnB@K(ay@?X|Si}VLepk=g%o9z`evYfyE)>;`qmvnfcA>@~k8PZ$Mr?xv#ma zx@O}3-O{b;sX99&gMu_NO@px_ihMrT`KcVL_`<6)t|D`Q3i(LgV2mmp9+G5mn7S>ZM`d6 z1_sb>)*`Jm^xD!74OzPVw`2cfqOV#kLfA)%ncC({Tb2_E+DSBgv(2ZgtJl2Pp|PrO zF(Qq0Q)P~&uM4xda@BTW^#C~j^PB3&z(#55atO&X@O^f6ceJ&Q%81=Ge2KjiJkw8i z=WF-&OkLMkn5%*KSL5>%kR7}{uR1t=^BW}+V(G&H#wL}$lOEbrWznr-I(>V0y0S~mPK$)`{| znocFu`s^U>mELVUM&itRz9Z_pm{#NS?Jgxo+cGj@ca7uf+*zLp zf=S=kxY%Rg(9yskC_G%~{o_RQJdcL^MIqM6_gq%iOn>j2TwmB-$6H~Jnh(dZrrf!2 zd{W12@_ZLJHTmr7^4QMP6TxnQpRrq5nsWDZEdhHH1tlM+ZTem}0h-hC5h>}WfWSiw z^B8m~u|J)8Rx_TY<1eQg-&SaH*L*~ZhFt=e!qVF=lP;^KCe+Zl(U+zSV!`9GSDl)w zrXD}PI##U7&3)#;yg4zEw~A8vM_ElRGEy-nRu$yy=D*)%cjkm%MR#T)H`>{i*f>?} z?ijDm>cGAqN|>pmX$TAZlb@fOpWg&OM!hQ{?Pz&5Pj`1)bMx@PK+n|F z{YNUUrpe9~mQ!5Z-0`baEdzahoNhKRg29{gBNNhvZcOl)~#b+z#Dz@E#=@$_V#?b9a)B5tlBrwHY4g!~WabIIp+6nJqQ zahK;gXQDYbSKRT+EU7^;5e`n7=cQ|gHyv6v&l~3*8U}{L(W06{?amXF3bj(?J9kLX z+e`B|XoOhLe!n!w*n3|#PaKbcY6Dfx%dpkAS0p8e`56W}y8Y{y=i%<2ISH>=%Bn?d zp9u;HS&aWoK@?b0dU(iaP7y>#B1?#4V>>S_tc zD=PN)Y#(pl%fwwqBhN1Mu&ugCNT`5?C@Frx%#4=&rla>a6#eA)4KGzztKF3Kx{kX# zmmVCHI@lKfvmVWLG?bOnHB*27V{dPo&rK;NQZWJ~0>t5Dx1sqF7e|bX^JqVxi?eIF zyrL67?+W0Sp#QyVj_=GPXdExH4~BVQym?hLajO)#zJ1Ft=$ZX)o6x{24~qW z!;;!s!fGd{WY)aG2u5Mo!!<=IDJggNT1;Kb2x$3c2Yw$@C-Q^?z@J2;BZ)*9V-a|1uu)ed*t|(g!Np%lM8*-NX=m6e&Cyd*ojtE=ld)8EAjD`X(=xv%E_l<(wl`LAs(Xm{6x#ytIFE`hA)>Z`HM8Qkq%s=B-Yia2yF>yKkJb9wIlC{v^ zpLAor+&N!TP<(x?YcTY=wKynb=I;S%Ucs3fQGBRy5DJ|Qbn^n4Y|W?qMTgKYKpmRoO0Sbw6U@A@89>CX^-EjPdHALQwHEp zm$N;1u;&{{IEsj`F_$UL{l`W@My78Ndv@xfte{}1qcd9L1kLa^rb@DW%^G-#&>91p7D(N0y6Jl(W|5JvEDSZdVAzg;I_gx{JjA9YW z%)i^`>EYG_qO!7MK?Gy3UbU0(&{!?ukbC5n{AAh~8z?c7kvWs;!;8^uxH6w8M^jV7 z#dohaeqhcP;E4~dFuh2^z?zSZS;6{v!Qyts5@5H!^PurBEBjtn=EH=uynnAZxgmw5 z@b_=3$0)h+F6#)l%wg{q^{=uT1s{46u6W#Bp{JnS%l6U*>+GE!29NXd{au^>pD9Wz zbYZb3riMy8t$6&GXJsQN%TE_&H7{SYI^=v~{ivow*PkOlTkVkR>4kyx@rja>@R$1z zRJ3ljRx|3Eda}ynl0U6UTb&-%h;=f`UBo}P7$42_Ww8oRq@-}?V+PVpjG4OIB-M#pcPsd<{j!^{NVqh zLZ<|+-ClpTd{Y$PfjPUe@y2qpGBx!@UsY=SKJ?{PRa2X8@X~hSmk_b1g`M2g)U<-| z4GJ>wvs>;V>L4hPTbtl2dd(_h7$Iu&>HKg6_=i9R9 zN9$2l&$5@c=UwzzuuSf7q^(?=6;Xd%Tp+omjC zb|RJO3*vc<0jJP6cVlz&-skJ>Dlu7wJS7D5tu*>N64UiG$MjpFFBPi@ieEs0nf0qr zZ~qo(a#K=Ll8}(}ty)dj7L}J@%>^*R=N;|LHbZ+$XuU_w=c%Dm85K3WIZ^Sov%%wB zNn1PlaoG3oDcPg=*m!u9i|mRshL{2cT6J;B$;t8YP>?(}+w8;5!BOjWEX|=@$+TJeIB5l-v~iD-t|*;#BMMJ1)B<(n5Qc;w@-Ymzgb zAWSxm*EnPFa9+P&p&-4Gp@(Lju*f{F2PezPUP-(juF%rhadZ4|V=TOVUX0=W{r-yH z`(mogP1Ts>cFdu+PKG~uChI-i{{G;HzLu|e%$mGW>s$}3UG_n*%zj0~<8s_M8B*5n zD={@SUFu0RGcqzVHXd#8y6)4@(1NwZH2yZ5_2BMTbj55&^(q} z;P*h5%+~?v-YuIq_u}PC=;2FC=MJldhR1;2GXfK^hno1PM9@gAadXgaj+*=2`V45RsGfL|9H+QIxk#j7omb|B!q- zu!2jxdRu6S#%^seXK87vY2l~R9DVn$RJm*DH`DT7H3M91?8gER9z1C2!6D}iScP6O zU9rqxOQ8F!s5TCZXsjQ5iJ}zs++%wFsiR?y>bUl{wxgB4H0T@*qG(V57oCt}2Rio# zFgzn7s?%#npG{6lN!i`q9rS9LC8wbH=Iu>IY4~igBDUuEp=_>WYnx4cePmJFF{xA(x;+ zSUwDzntz(rg$O^@PYHfhj7whe;t=ubt8#=lRtq#_*VNQRn=;S+M5Nm1? z)(mF2e(XZBMMXtv!a*;*1E0PUi1}Xcb$xZXJ_1iD6^#HNpNo?d^?GBx%*@5*bgIS) z6?`#rd#9J=ZPO@+7MUuRmX^@ZxruLnex6b$$=t+bb$)(e;nSa#)YR14+S>g5jn#py z09<-}Zbx%HiR`jj8lfdb8Wl9jUISSH=e4M`G@Zb4s<6MkeYqo?^57a;NhgGb6+`pz zduX_|9_QEF8jny>Ic*nE690jgZ)t56VvWD6sVsm=tc@oT8UHEtCy%~?L3hln=HA}k z$;pJr#qdnwqemwuK#h1oNBLBvuP;S{>C{SndzYcpLu*UR-Fx>~PpC1)U;2;E$B^$2 z51D@GcaM5QiB@JDib++HWMZnO_a{Fa9tNoKH=LZO2de|LO8M`1qNqL>7Fy}+FEo8c zi>6bZTU;dPk}y{kwKK(1&t#z$e;28qD6U8W{m?*Bz^xx|jLEYPss&Zaa@W76Mu-b_ z(lIjjc6O@QI`783(zADPSnt6>l-@6i>E%7&08;@Sw@JOrNgoGzAg&zxi{_=%{*Zt(*uR8)Lm+}bet`GQcDS7A7WNe}B_IPZt;G=k@gU_07#UR##othw0Ch?+20Y z4|_ltX96~J-++MdNsck|@*SVvXUv8%adE*Ud`XXA#5p@{jw`CGpMz@i4)r)c3L@fG zx`)h5dOZ~R7bXY928-@`Z>GQlXl-phKiSPN>5q|nPify2TRp8ru=YtlnB1Kr&g&>vbGKtpNi;8AA@0&!BPhU!#mK$QWRI2in?%$2XN(GLm}pqQ=I?j*X7KaXk>VpDitA@$&NO^Hc?`g^G%bEtKQQXIB(Y ztt2e`4f?e2^q!oYfaeao#tPbnfCT+PQKo2GrUl^#1@^ZF+7USF=falA_=U)`(i`aS zcRkvuay>LXlaZH~S65f>BYkD!v^AMRaG$iLrw2~i72A)XIvyRJ*Lmk(JiC>2GB1x| z*VEIAJnBJLL8ITHq(PdR2CyTn3Cv7Qdy@HPGNlLvL}8$Uxj7waIyh}$V5^+Ar$Knl zF12uc(?(q9~zN#WX@5s zDE?-pf}0Rbz#gpC)zKk#u=p&5gm1XN-`3vV{3nZS@urRV4>@(pi4FmJ{B-f55}J{x zFLB6^?(&Bi3!#X~$XE^KMoOv=c!L82;|d^Za`xlLkCl}bxcLXkdDx11G-S!+WD#Tk zIE(mmC)X58UXPg{fm>RjQMCsR_*q(&*r~~tO%SgsC1ZAWX5X2FRfFn*Rf6;42Fyi( z@J}-IUVoX#|13gds4KY>oL+qVSKF`%gy0jAI$5MA zA|{6F@i%?#+0Yv_4GBSM5J2#UTz=WzPDhl}#FsPIg z5{DRBSXk)km6(k%n3PM?3$sQSUv`qjv!t729100F7?W{wa?;YS|B0mi^yyQHQE#S^ zkf7kf`p7mYaR{s6!)<@Ob%)Adt=c{(FV9R)t{?sgHsDl_JY^q|hJeYVEgM~Gm(tD5 z(dz2RnGY{bcJyVudZ;ZcSgXbl<<>0=-cB+T^!uv0kmvEq8 z`qS6?q9MdQE06MXa(0i7h*?b|n8MC-1)6fCY-1lKVVTtx_{jw+iHPmiWq&a6XB&ZT zQ9)a1n(V}p9*Hq~d8JAjeId92^9^6NfaA*dva*7IG%{KSPvLJv`Fm_Q39)%z zI3pt?!{7zb7BDO1J$CD&EzAvAo}KMW6+*+qi-t)AiqJh$UhRupf{M5_O1$nm8Kt)_ zt8;O7*+9q4bJqH#jKWtP5ed$;4XJC~{4H&55Jv@d+#AncSY2KH>vskxgV?(`+%mUg zOYq|QqLVT+GmFPIT3Q5iQ(nq=WU+M^h^rJ0Q}$C0!Ept9CIF70h>@S*RfYJHO+%>f z$~83X#)FP*Ti%C(6UlsD43mziH)oZU%gf^#?@(|AB($Lb&;rN2E>Qc4iRWDRa|2?E zrzr~xf*mYw>tyPc*0bPBXK1LL`mw)^vvV`XCa3i7#$8ht7niObif+>`qQdIId*E}F zBPlLX%c?bXlu3T%gpFjJl$)CiYwox;Nlo|;`eMRsA^r4A-mQ-ZP)NMByvzEJr9hwbhN4jW$lZJ2oFaeUFZ0_08&70rbRL(szdT?_Wbopo-wcvl^X6C4dspYC8Fp6T8*0=x$JeWC{#OY5$iM z-~b1^A3vT8MGlW{7v-274O748=l^tDqQ-eQ^#Pm1=cDJWt>wr=<_~kzYMaf;ZL%efnUV)t10{hLk&T3PpD;ks)Nhk4}lJmz@73d1~^)#$?f zLC?JwN$uq2)iK|c_yGTd;$lfn4e@*gZHBfPjBWvsG0OAw%zkUq1^&;SSNkdzo0f`- zijGc_REYJ+P2qO;G}k={naB@v(y_28kS?;^D@CTJ&gIG8u#pk^t<;N#N72@vHAHP{ z?a6zo?caKKTw&t>LR#9u(2(%-9Zu_ViJZK8bxlLr&+IUr!!^^M`F1w!))(H^9JlY> zDfo0tSv%S2L*vlMvZ;yRDUYVCTLBG8BDTPMp-KemGTPU7=L!@;Lu@y(Mb^C2TEefX z*_#uL1u8ZX?O0v$?AFt@xB3gu4_4Q;>V`1|?mya_{z(dX$rxfiz zZB#Pm{l2fSnNnseWd~_)e!#GIdIZ9aF)`G|k=7?Wh-b{Y-tmpIKdJpOQK$rbtEy76 zvMkzzgSWOIDt8mf?i(18RapVq*fU}9bJCiI+G|}1)AnU8&$lnTx^c7RdIOezbmrg} zg*)+E)T=Y<6@>KIq|)InQmNH(%Zp{{sj1U7-Gu1skTV`BV1y{Ql|Pbj(75ZY0GCg* z>&}O-etz}lUoVa(sv>E_*J@n*`et{WZ-4sunr+za!Wm}cguT>)kNawZ`y~&0W$ey} zC{NYKN*PT>MF~S*lcgL&Ra`LSX4m=i@iuK+;OTr`p)RC<;-9NPT#h0oFAoQIDGNbg zf2RsA^3R`@(IQT%2nRfzNX_~LX%rz8PS=Cru0_e@>Gc4{>XNZJ=CwHd`nPXQOp4qN z_XLMw>*T&`#@hb;x&Ql1uYh1)4f*Ez-IJRvch3)gB7Kf$;424rEU@=v8&Tj}HG z=g*UuE5;^aflY}8S%spXObfQHZ)Sea{;aJdl1Wb5p4FKUOioI0_u)O2!;XwmIhWlR zKHaL35eeK`v|g+GHfuc!&u#G(1#Y~xf1%~P#SfXst)R-4RigAAel+dML`CAm42RWz zVHp|q6UvZwMmjn))Ki1qxp%sZ5RODrXz7k0`~KaAmsbKt&?F!bVhHWzG4tVnzj%?+ z-3=_Kyt7(~Fhw?EUVfgR8~{!?e6ous0#AJgs`jNi$U*@gm~7jF6R zk^Y&neojI{hsxTmk_nY1`T73!ee~&R&EFANiRElrM!n^!4TWfTv4y_#UDx(!^;QE| zuZcALMB*=JeZFIm6eMt#6pHd$;F1FH2yfpmRNK$UjDeuGpk`bn;XoH2> z-_-22-fytjmsUY3z2P|D)?Zn<`p)MJ>|W5*S&?gBNX~E&4z~rpeEAZY^>F^LNbn?X z9e4LK8Ybq#nuRn9#C@kKtl}~psE5%j-+?x}FP2>`lVyIDK-naH%GKPLNwS zUWo!3Qe&?+p~GFBsHp4udb~EIv|&#y(>RZ+gb<&uVHa9zx&^xa0J2!w*(cJ8Q9{CP zv2knLGko;q2D^dJJk-ira2WK=Cv_W<7;yvs-iZkz%=vg+#zsX-8q|q{a-B}K))9V@ zpD(}}P*(Jc*ZRY^PoK~ehs;chAe14U5OaJyV>exoKzVTHIh!y zTVC|)YAOB~9WL~!>dHpA*9T%a59A|)AbD2krVLZPipKKmJti=S)?V7p!fh41T-V#4 z9|hb&w%i!8YDTCtLI}ZjdwLH_E@tX#YDW7SvLsjg3KBi!`psQ>{QBMY$oQB`LWz4d zMAhT%PIl-|(VQI1A%OXUln!Fv%kltf%v+E0@=E)lcTbkB2SBo^#!<7(RPnWzAWUKG z>hC&s&dO>?Vli=YbbJzWeBDr3qSDgceROepZ!ZESUv&f#$oS&sA-X|u%tpR_`*zkT z{~81^?LD@`sjaZ2CiX1u&Ckh=6kMuH1Tb4of0Rw*l6ZV}7xx?=h$X-q@kw8Hs6SG(a+6CWpG`FGg>kMqp46OImoSFq~#wsteE zt(xEqD>)v;TTV^Bcu{?@y*&iUiH^WjDzEEB7niwqCO%L1f>cjx4zDY*cs4e4bVCQD z$Owh2z0NU<2?h>sbq3Yfr7|Q2lgr33RxG2a;hdP$_I$Qk*>3r0WMBZ|OkjAbE~e{v z7U{|%y^V(UP5>po8-_!@6uBQ0PhdW3ts(E#08e!2*WzAy*p|1?HSW{O7i?^-94BcK z(e)W3Qu5vT@sDi*o;fSF6gp(fI^0;LW?QH5j)_@eRAX8A6Zv&|8hyUa0t4fEb62l6 z0PGO-WWd^nH27CEETf(cf@hpNU9s7Yn;R&kZEf^i4yNQr9dx*6{~FP~AHQqH1%O3uTF8FKH8 zv^2$Il4M2>d(nbue^&pxx-l8PATjAAP0j9gkjs2kH^|^c9Ib-)(`E8O*^VI^vMeE7 zTx!S|o`iP4nVs#-s=s!>WfQp$nYhlZb#zvjlbw=zYLbC@+0z3-Fci9jwGGzqXsga~smq<4d*EBN z62L3?JZHxvg%XhB2u?~0w&le}LSl(r$u?0_OMp-m)r-`C2f=X^ceraf)hmKY*aAqY%y6`Rd;t&b8}NAB^`iUNJ%~KAUiU>HvMI<@gR-MkA3s<{13f)kL85pujXdQ z)&5z{nsObk7qGOFG+ej==KlVF40|RC@Yf0#KwxwY3`$J~vTf$e4_9XS`R;3?`g+QjfO7W!Rn(tdojg106enEkAm%{r!c4UIP)8X0zKu%dw>zsPR$++~TvFLDhET6uSO=FPM>yA?wD^i>l(SxawkA>>JP zxfsZ0cU$5q2%Wkc-#S4eHBAJW4cd1gA;tMpkWG{D4nD*$?HC@`pQ+EuwKl!j@68Lq zBjK<&&MYis9w-8l6L;Rve8aHis-aJ zID`^XSZ;oP>^;d|y84549XU^*e;*(F88uj`Q7hG~vuS$cMbw+y)Cp2)w zr~8ca`M4jfY=U@5#S7<24@;q_*04qN;&mmHwA(*NLTU`$*kI37B0oQ8gaKF$D5MP+ zm^SOf#X5cXi1wDAd~EBHv^G9#+$H@Z3SSs%kqm6_Y}G zV>&OIa-iq}0}Ja?+tUvPbu2726c>N3*Pa9Zlq@om6&YhXT|~;xwm60*$IbeuRcBPD zWcxka-9ranS9>ME4i)plFo>#IE!27o>(?NbIE^O@Z}_j_<#J+NP$?Vq)56 zI})n5km5?_=JrNM*HKZ~0i&z1vH}w_qSNdi7<3pDEFqNRHYeqFT%bGO7VdVWVL3C+ z%jN3);Ro%&6L@yH@*_sIR+G;4HuHWkW>CSP#8SXF3imu(yG`E+521dH@t^#>fNxDt z=bmr3IzGI#?2IY_5RQb8_joYpHz1e4t67s`V}JSMBm+Ux*wOKV<0N`_zQV|;L5GV9 zPNXKLF6}j?rMX_$kHFl6^3vmq`Uacz#^zq0XE|(d_1M$F{TAXe`s?Y+p%YfhzJEWC zh*t+Gy}GR1sVt0OnTI{x8O_oqAT-~w7scUg}0+b{h7`0vBaFaiN<)NQN< zW<7<9hVyjmPo!8zhN8B|kXwH`@d+s?R8!f87H(c%i|N|YmX>D#l`#Ik9Am7rW zA}vq^utgGfZy~)E?Z&*ZoVV_H#=OojQW$)msb`Ylc5M3%{nBQvcsAKxC*7NdkquSy6;_^5FjP!pi)B-~pjCy&cC2Jwta0gs) zm^Y05q_1^i;`?ePi+3C4bSdx#hwIm3;?)C%+UFoGgJWZ1tG@6pI%^Tmg&MJ?PTOV7 zMoSZ8v9E~&=X)_8M~g{Jm!07yhT47Z?;2s^f=ixD1Ra_lL+;8*hSx0RrDcD zI$W`R#{Y#YUlr@mjTpT}AyrhI1Zf3@RG`tp#LkX_u}w%!{5LZQ$V!t;!$`nbfg%H- z4G>p)+Ptf^yy|QRu zgY=e_$9ZS1m#>hJ$2F_C*cEIJNV3O;4FS5yC9%Qn$X3IWZ|H~M_!IGLjc-jUGi~7` zz1>g0?^H|e@9%p8%K#^ku7QyeZ{l%K)^Du;Ev*hfdssus_S;B*H)`FKZNSKZ&H%py zyuRRPSWhwMV0vkjy+*fyUClgw?vEb}J|xm05p{YZ?HLk2_wIfGo&C{J@Db)V5jP;w zo-CX$jy~wQYTKqw^wzn7vsyCdH#F}H{-v{l$xJ>tM z&fQD{ee8UVSbM-%;i%1^!I7>=ir7*W0~3YbopkJAJ)ExCL$Kp=-b3v*Fy%jqqCHE6-hj_dwazs>;>yTb$Hv_ zT)|u(HW6*#hrE8h`PlcauFp2})ex;l!AQG>WPD#y^8aJX{=h-_^B1q2oLO>m4+NrH zhl>yiNs*F}b#rYd=F&{a6_FXz7RWE4CRtBC_~9lU8dx!Ungi2hb&va z;~;|GFJHV=>$u2Xq@oQJQT294w_cuG`TCwX11b04L#-y}>zS$8R+H=BOikVU-$$>E zyu4G7G?x3AR;zvU1s2opf7;rde|?tuhAxzG3n}~6ka(?xIL-Ni>h|)8>-w+_Y$S6r zF{ezKYdi3?`1y(d`*5}Y;lP~+S&)%SKx5rl6;^B8V=!n)VuJh%Hx>pB|B;`QUY)0A zvCT`Kt+;_=gXY}_a!5$58ESsV5!5x%Cfw!h;9}|2dwOH+9L6-+o*lT;(!RWrm=DB4 zveAr2WMt_?e4Y)}aqQL~e8A{x)>IdbInRVu3(V2S0|Xn*$Y*RU3|-|VS7W;Fh(#JqIec9}m@ zKa*hUZf{v;XNM`?Enq-;TXHEg=dtte7bMh~o(4rlQHLCBkqQOjvzo$i>%HhS5R>`c z1x68Z!r)iQ+S0ynO_HhN?;xY!MMh>Oy7%!ml?w^->NET^6BAX>lbxT{T+xql))F$T zAs?c_pnPR39E6WUKtSuo`6JXS-LD`=g)X?>vpqN0p0`0`_A4{GG9J>8Usuapw>%DW zzsXkc`>b2H+g|-^=**|8ERlVD5j1>-EKIRbNO-N`8CzZ13XKZZ?1E zNH+W!1G%A~z`%>kOXWf>dag=Y4?8_QJ=M8E zC--po;ZXO`2>SaS6OoXLc0Di#`FQv4otM}3J0EnheLq3@9vgqt-t?3>g<=59a3wCa zb_yDs1H5h5Ccu)-<4LcW?6x3VM5gl@J$igR~TUq@^XV zVOI=*I|3-tor&yLNp*E~-@o@kMh_;tqmT{_4Z%oyK+ha(ZPkFFOzthT5*zA+EE#-S zPaG?7<;UKkVPRpA)_l#yRSnm6aNAyUad~;B#;Lcvn;squM_bNlT#BNyvbw6OpJ(XL z9+^b0$oP0}JE%yka)_q%21q3~CT5Up+h0>|Ll7zSR$U&DM_bS=zO?ipErd4}13lGl zed0U8!NwRf#L314a?eu?3=H75OiWB*?du>e*4OT~I`QD}aDHwM@{J*^q1%m8a|u^**Aj zqKNDr9JGfNpy2S7AiXGWEsOupYVc~rsGh)^%QAh1P&$79etZ=hA1{Fde0L6a0Gsu{ zM#vBG0;9srY}fel7T^!qLg25CwYHM8vK~U3YrZ{XyDtq{NH$NoaBH+^9#XXOa&ka> z01cu&6BhRM+qeGY7kmPu8X5@;2Dy28b+xsblCe-817~`74-cRhyz>H-MEUt|k*5Fn z@$pLDygMQy0ytrWOfqlkj1a<>L95nSS6AR#dt(m>NJYidvorq!D#wm9rRWlAq`|K& zn^jxirR>E$uCu7bpFalRhhDQ<0cZmvRq zCh!v`vYpfU%m%qc|KNUEC}<*U<-?0JN#R_jl>dvJ85^xnq#5iSaBG#kTOYcs@zX)F)%Qcl}8pk zqe=KY6CT?FdE$pfd3Jt2F*@1>q6TFW-l6n2-Bd1*AtZ(N@L{08|9G{7nTJF!HW5)G z;3SZa-#_1Om;n$0682?fWvvW32m}JKV_1>3!dT#R3D_+~>#w_Jt@9Cx)$5Upi_iDa zZr{EwnB}V}7Z-8|Y3%TcHL6a*ZLLh@&6slBzeZ(v}4ZZ0PGD<-DU$GT=_wB?OJ zbNzv`Oj18jV@b)beyA?cZ`Qi0>r&9jV*9ExK#y8@RBZaO|DhEBEE`(lLh6bt|{ zF)?6lz|-Xdt5}$wo=#?EwT%mjJz(6m zFz_Kmw8V84@EE~F-2OcthigL#oObsyh$XcPv2k$vN+9Do_wV0x$Bz3i750d%#@T1w z-=U~h*%}~*R;y`fY2Dx*(b}G;aB>+aAsdlIX!{DSUw}d5ffIDSd({f^kQ#VU&C}D< z_L0M9!Yx-vliBBY`bSVdu7zjvz~pU~7gO}q{;6w^)AjraG0H)3(NaBAm<`ZQAN3zVAIJuU=>sQsqZ)W53dC}gD5OxHv6?CX{|87m zDk;>W0C3!JeZ@_>&>hcypgaa(@WH_WXfc=okXcWZQd_H`tn38RetLS!?YQx`zaMCD zymD_fDP55Im%@S0r+bUQ(D9zFq*>LU3fo>%T?bdBqBDkVC-``K10roXQEuTK3OZef zz7@_2nq09XcEh=p01~z#FyZz#x9}1CJY^m3TIb7U}%5Jn$uEfmM5mg0eE0 zGqBxotp#&vKkPJNAQ(F&#l!%ajCiAbl6Bx$;awu^fh;zr8(KRIh8vX>fGjKmqc6!+ zvxFibR*LrarC+`@|4n%(lfdz7d7qq4QjhF^J+mT2G(#xwzz`sXXI{d>_b(NvYn(!~ zXc-s^>WO9nKo}n%2NKX3kkq%&sc32E_fG)|1}qdF*ugazHy{XKR(VDwJJYW1yx`o0 zsv|HIG_dGW0+pVUW5Tk@Apre zTE|OG!sFv<9aD`vvSgAihjNDiVudn+%>Dcb1k^mA9Nn>>v03dW zXRDcBkKNeV0EO27<c!EqvF}`EQYd{RBLI>*>*_*tG$G)c zpgurarm%4O4G#}0scyqNQX3 zcD+%tRs!Px2XNa0w-L4t5Jdp>Wa3pqOt1#>cI1(d?a~$&7Xi^UyF5GO=jZS1>w`yw zLzE2AxV9Hm82|u`orK;xEcpc-7l4Wr!o%fNRHz(3K{-Tk9Bb$A-@f&kK#8lC8h@8m zzmH^_LbV2N5y2a0>nYV#?&6>zfFxaxHlFdol6Fo{Yi$VjVdm%O1H%j<^C8f4qMXGx zh_rU#Z=)Es8Mw3{^V|ymii}P;`foDx{qb{Z^@m|2_-y8*7DuAh^vY@gW^K(qn$ zgh@74NlDY;*N+8G+&vW(6yRdPKZfD~zN-^Gf#2z3;i+k9;Ki2|7kk3!G%z?L73pg~ zs7!(P2U~N4!jtMx*SY}MepvV7_vmP4etuy66HV>zK@pWAM&Kc99B-TskE-ew=UVU3 zz`#H#efeFJi1eJuRr$sag7*wma|tk_XvhpN4mW;-PJxmYFzYww8n9bjMy)qMuohvh z3asdf!a1QA02(-u!RD&2sga3eS%u5R6v%ZuP^q>z0jmNw?S@1K`e5a63X~86Y6c!* z-LEPs!Gq`2cJSEL%1m#*7aac^y9z`-q*|PyEO8(g23cOTs4a8!_2Qu11;M)5DCq@e zhT6Z{cJU90>(FJL66Sb`cU;6@R{}_uXdA&9H6w#wqmtb*51fY9(csSS(&!w(dUteFF z`L@-yHF0@!;GAaa-0+Bq=*OvLZ0r0kAAl8DuBJq^{V4C zjRBeq9KGxO^QSF@WE$U&3xxQ<2%0h_>SW{zWH~q`@XOJI?vzlcb?a7UKz7nFCZE2rc|RKC{)E^ z&;8bQHlg?bcRTQ6ZL{%xorgO~pr12O;rKf0MI2}I?x|3_dU@(RW;qlf;$>jT;E^zY@n zR)-;|!uGTVSU%8S2ryCT$)%+9AcjYDC!iGxS{n*avWAAvcAdDdVuBe%PYl}D)Ffb? z4&^xSr+gn70gJU`qTaKQaIgu1E{@=5K0AXpkw)9Prj^ruQ73kMetv#@e1D_{1THAb z%Rg)oH)|yOX>Cjd}^R z7Np^aZ4j=$41hZmAMjlEIg;ihfGNF{Kx%UwsPfOoG@e;M9#<47pG}zoZ#qqLwC(%8_kJdIg4b zCu{3A3XQJgD`*h?JpuAr(O&V4srL`d@m|H zNNXy~k9vCF28y1%%9?M(C~d{me-hFQ46m)t5|?@l>drqshS7J(goru^k#_IVk@k_1 z*8})$MZ^p>Zzr!K_l=sf;&%Wb^* zam8Lv6l%LZ_v`D=1^n>y@c{uwI-=*6_37@WM&S{0!JV#t0Zf&gmFN~XvT!r z=`v04o9HXN79J)(>@9?$(?^b|WkMF8KlJo2496})o)Y`9K($OWG&}oBZA5q*i0>xv zivU2c$H2>SBeJp-xh1oPiN(cu5HZE+Sxov3!JW%X2Cn%Fi(Lx~rnpG2t2el~0`STb zRW5q3%geLt_;#UGFKt)34;TVv$B-J|3u#1RAzmmGhPa&;rCxF?IM~OBJEjRVGZ1Es z=JE!KIt9{(u;O6YOqq+&QX3@b4i%ICo^1OI1O-}w3jTdhq=n+#FXr}_7bIg_g65}M zDc{XZe?U-X*!;kXnEE|PBSH)fOv-QE4VvGxg1A@50C-0c1Y+|+l?GNmeLAPQ5i?+I zlT#n=aMUl?(ZV(Lk=^1*AOLuYW@gmcL%_C6e`+LbSk1uZzf==M^<@wSz z*4;JcSwoNih3fgwKi_Ur>4JhOwDk!OwagY9K<)KI?w zp6*bk>aLb_{Hm^Y7~$MY4o0aR%u>dG94^gPxkAtV>noYO!<3}k*|o?1IhwX=5paSH z<-x+7_X<8Ou?3)|03NY1K$@-_a|0FC$^>U~Yd&P%6ck9VfVqOhVL(Zs&3IC9`$^ba zV&A`i4M`H%xW2h+;_0`!r%|Z*JIpRMP;v~>F^MDkQ_w}b`0g(GX+=heYi7YzWGb1hVgq%Y^W(FY~zo^NR1?i%Ps9?rPW!oYZ>G(SM z@H9!v@Y$IGGsZaY-|jy0%ET|=ni3v}&ma_@V!Z5vUj*%!0D~{nnDGK75$Y`#lw2X- zWI;W4|GvtQw@^R%JsKJ0=0*v|zCQ*0&9RePT~l2JAJyk&k$$n{VSa$CHgLYBTRX?8 zE+j2EnYF+Cean|G7b)$0j6$3>89*hWj?4n_Nc$b>7gV*r+TEsz7ady?%Fqn#1~E3H zwrFNc(ker#* zkupry?AZ(z~G>ZCSDfs z`Z9kRcv|O1%!?_geve`uAg8SlL;&eEWz&s~eSQ;b-htoXID8YF6%2+$_#YpL-UVm@ z-yoj%#nEurT@DrED-K0sIqWT4{TA9sg~4#T!e~wIxxW(=0fmLoEqBd_MF8sqpqUDE z%0?V)!eC_r7Vv#v;eLOAe+ZqrH}8bH7%Rl&Rpb+OzgvHTh_Rx#ePGNN4DC!epf5Cn zMb#6wZ4p3U|G!og)8LAtllWa+U5~lFe+V8@Ke4@|1BAd1uY602i>IfigupM@ptvat z{Q;Kh8wgevh=14Fsi>&LaqWNFyk79+_2 z_q$!mfv(X1D0&l6&;tW_-o6U=4$$vwoH&t!$BT-IAu*`yD-%-TKlti9Ewq2D1}zNb zMAFio;FfhwEViz)(ze|KKH$Lx*q?-E0HIOcCgOkI4pAk*Hq@UG=f*^nCisA9{@)?i z(I(1g%cP~HbvBderH{9Qjg~ogorv&l*b|TT;!{$TXK%!K%(3nH$>WB%(ihzGJIxrw zE_x>y(=0=Hde7Q(h39WCV%|Mb(Fbqy(FZ&%^QHW>nyJL|JGX#u+nSh##ietp# zu;AcVkQ(8EL&*SSs%~f)gIscN-Z(ip)K*s?iiXU-;MZy8SQPX=iA-6`m!SYb=ob+1 zad0qoSX5=4D5v0Qw^<0jlar%k2sWDsTB6>IgzMDtamToy!@EPOGf(*Zix=i-zC=>E zRt|4|VWGRP?-HzwprC=-01k{eH(Z0DD$G@W)--)%eVq`U*Zx!+&>$jiGj%c>$Ri0=z`v~b)M$}ee!}>FvyJ!+JRy3H`UeY+1d6^ z$>s|RGDaLRP3^=n;I1GJGm+FkG!zmMp#{Xii4z2Do*AFn^;@@|ee%NbT3A>(mBNjW zw)Xb4fG+3nFZ)vHmw~I9Sz7uTT3?z>B9RPFof`T4S%7Dy;V$Z7zZ>iT+HaTFif>FG z;Qxvfd9bNTFO~ue6-YiRl?rH$Y;xOT5NTp1AYbO|KLA4> zKYkpio5!O9ci^dIE;f120)+FM#xos8)-ROzad83k9MS@-33I)1I)u>&^z!i?fr++-{5lMnJ=q)Z^s7#W!B KztFvS=f409L3;N9 diff --git a/class_u_s_b_h___m_i_d_i-members.html b/class_u_s_b_h___m_i_d_i-members.html index 9973f63f..2d0ecd04 100644 --- a/class_u_s_b_h___m_i_d_i-members.html +++ b/class_u_s_b_h___m_i_d_i-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -424,7 +445,7 @@ Public Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -137,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_s_b_h___m_i_d_i.html b/class_u_s_b_h___m_i_d_i.html index aed255d8..a8c64f7b 100644 --- a/class_u_s_b_h___m_i_d_i.html +++ b/class_u_s_b_h___m_i_d_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USBH_MIDI Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,14 +101,19 @@ Inheritance diagram for USBH_MIDI:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for USBH_MIDI:
    Collaboration graph
    - + + + + +
    [legend]
    diff --git a/class_u_s_b_h___m_i_d_i__coll__graph.map b/class_u_s_b_h___m_i_d_i__coll__graph.map index 360aa69e..d89c496f 100644 --- a/class_u_s_b_h___m_i_d_i__coll__graph.map +++ b/class_u_s_b_h___m_i_d_i__coll__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/class_u_s_b_h___m_i_d_i__coll__graph.md5 b/class_u_s_b_h___m_i_d_i__coll__graph.md5 index 65b58e95..9672b222 100644 --- a/class_u_s_b_h___m_i_d_i__coll__graph.md5 +++ b/class_u_s_b_h___m_i_d_i__coll__graph.md5 @@ -1 +1 @@ -2b10003f5c57b927b786c124f8c44f19 \ No newline at end of file +25cb7fd7fbb45243f203aae31cb09034 \ No newline at end of file diff --git a/class_u_s_b_h___m_i_d_i__coll__graph.png b/class_u_s_b_h___m_i_d_i__coll__graph.png index 3ee2abede7efe00dbd6b403c89d12b3be2098dca..52eb917acb63430b0b065945a075e2777e709e0a 100644 GIT binary patch literal 9288 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 literal 10360 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 pj$cH3zSx5Q`uT6I9)6F{Tf8ZWTqfx*K`SBT - + diff --git a/class_u_s_b_h___m_i_d_i__inherit__graph.md5 b/class_u_s_b_h___m_i_d_i__inherit__graph.md5 index 05aed325..3e6af39f 100644 --- a/class_u_s_b_h___m_i_d_i__inherit__graph.md5 +++ b/class_u_s_b_h___m_i_d_i__inherit__graph.md5 @@ -1 +1 @@ -99e202ea033838e96ca94d5d12aaee82 \ No newline at end of file +040098623cab6b270fc5a8a159a31c5e \ No newline at end of file diff --git a/class_u_s_b_h___m_i_d_i__inherit__graph.png b/class_u_s_b_h___m_i_d_i__inherit__graph.png index 4c86103e9b810e8ae6696cbd1d23ef333604d21a..f27a71f3437d519444335647019e6177c58958ce 100644 GIT binary patch literal 3076 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 Xv$G5$D-;OGdO9OLQ{5_U=ZOCR<9YlG literal 3829 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 diff --git a/class_u_s_b_h_i_d-members.html b/class_u_s_b_h_i_d-members.html index 8869ec2a..cfecbb96 100644 --- a/class_u_s_b_h_i_d-members.html +++ b/class_u_s_b_h_i_d-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -1134,7 +1140,7 @@ Static Protected Attributes

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -126,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_s_b_h_i_d.html b/class_u_s_b_h_i_d.html index ac35a14f..c9c01f1f 100644 --- a/class_u_s_b_h_i_d.html +++ b/class_u_s_b_h_i_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USBHID Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,14 +101,25 @@ Inheritance diagram for USBHID:
    Inheritance graph
    - + + + + + + + +
    [legend]
    Collaboration diagram for USBHID:
    Collaboration graph
    - + + + + +
    [legend]
    diff --git a/class_u_s_b_h_i_d__coll__graph.map b/class_u_s_b_h_i_d__coll__graph.map index 4d1618b4..e856d868 100644 --- a/class_u_s_b_h_i_d__coll__graph.map +++ b/class_u_s_b_h_i_d__coll__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/class_u_s_b_h_i_d__coll__graph.md5 b/class_u_s_b_h_i_d__coll__graph.md5 index 285c8d6a..92be9460 100644 --- a/class_u_s_b_h_i_d__coll__graph.md5 +++ b/class_u_s_b_h_i_d__coll__graph.md5 @@ -1 +1 @@ -767fb560f11b07b654dc68978e6c2cf1 \ No newline at end of file +cf485acf15d75bd6f1697dfca03233cb \ No newline at end of file diff --git a/class_u_s_b_h_i_d__coll__graph.png b/class_u_s_b_h_i_d__coll__graph.png index adb4bbdc54f4da6121989b49639bdf24aef3fc53..a5eb0f3f3be79fbe00e94bd57bb1b476051a5eef 100644 GIT binary patch literal 9349 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 DiOu - - - - - - - + + + + + + + diff --git a/class_u_s_b_h_i_d__inherit__graph.md5 b/class_u_s_b_h_i_d__inherit__graph.md5 index dac1f34a..1094a598 100644 --- a/class_u_s_b_h_i_d__inherit__graph.md5 +++ b/class_u_s_b_h_i_d__inherit__graph.md5 @@ -1 +1 @@ -34ecb2ebf9e94987932320aed138a257 \ No newline at end of file +fd1ceed8df188748cafb6f9910104e67 \ No newline at end of file diff --git a/class_u_s_b_h_i_d__inherit__graph.png b/class_u_s_b_h_i_d__inherit__graph.png index 22ec8cfa5968bbddcb03f5c205683fcc1508ac19..7bbcf2d5a3fbd5880cd996c1619dd1788a44af6e 100644 GIT binary patch literal 14352 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πOZ>R4KPx($Vg`wtB***4=!IloX=)-o`d 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -812,7 +824,7 @@ Static Protected Attributes

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -114,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_s_b_hub.html b/class_u_s_b_hub.html index 02d38872..95d7890f 100644 --- a/class_u_s_b_hub.html +++ b/class_u_s_b_hub.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USBHub Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,16 @@ Inheritance diagram for USBHub:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for USBHub:
    Collaboration graph
    - + +
    [legend]
    diff --git a/class_u_s_b_hub__coll__graph.map b/class_u_s_b_hub__coll__graph.map index f805bc02..04f84c15 100644 --- a/class_u_s_b_hub__coll__graph.map +++ b/class_u_s_b_hub__coll__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_u_s_b_hub__coll__graph.md5 b/class_u_s_b_hub__coll__graph.md5 index b9529b44..5328fe8d 100644 --- a/class_u_s_b_hub__coll__graph.md5 +++ b/class_u_s_b_hub__coll__graph.md5 @@ -1 +1 @@ -829d383fdf38e9eac95bde2714eaf868 \ No newline at end of file +bf8ca3c3b9277566d37448eda78dfa47 \ No newline at end of file diff --git a/class_u_s_b_hub__coll__graph.png b/class_u_s_b_hub__coll__graph.png index 35e507e6c287d5e83c68ca512da105ec2c3c5a5c..921bd62a6f68b17127c5800335679d1aeef0b94a 100644 GIT binary patch literal 2947 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 AG5`Po literal 3670 zcmcIn_g7QP8Vz_w2ptg+E}|%e3rKH*^w2>_KqN?uROvm0c!MGcB2{=aL8XKikQ#v~ z(o1Ne2+}(kxt7tS7IV)Xa_9E+Sh}KbZtNHy$1~t&ZT5}P>JN;LoSJBN z`$LI@80&~vpMUNOcR40GlTY)Mk--<~G=nR@CmXk%{Orw;l@-7?W=xOsUu9?KadA6C zKB9orcP{j_=)Z7A-fFFqdM!QTMbE&{JpBp93}bYJdQN_1#$vI#3K?4?iN?au3kxAx z+1Z^nN*y6}LF-&I*k4{*cLEB+_SC7NT%fTAjN-}ZX=i~<2Ze_+ws(i|=GD~5B&Pqa zFZ&4LBy;uJ-4H1!jGo>lPVhyS{w#)ofPgw8QBY8j)}3HoV|-5P=%710J9G2&{8P%M zBlhZ8onM~F3L5=mj>bu5JbDkLVQb4zd*On#V+WI!we_R%DrY6k&yDCk4)*ZyaEHf_ z85{yVuEj{NBZ4<4BE!RJ^KrPGk`i!dJioTCE}fRPwvL~o&rF0NP77Gb-{0TN-2A!i zr(jjtf`S6N&IAEH3`T`Z(k}Mn$B*nIZeCt-4VZ&?kxL*sMMcNKT%C%Fil^{mC>E zY^y>^sqLrK(GRxx$tNzop{b-~$l{OrRyS{Nu8CAh`}inU0TyDGjYL#-_VjycnGB}M zTA$9Nz3-79XJ+goUc6|TnYk7m98Ay5tmES&Ia-Q%u8R3d@29G&T2Wcq3R?|3m{SBmLqkJ9+PUp1BLHfiId;Y~?0I>4jnzE9TyQTN41qvI zIKfD(RFadvfkE?BeSoxcH)mUWI}PZrswxeryx}J=Xh#YPRq|h=U+H@j^*ixt)U1xB z-6)pU)!sT3F-wUC8DAd5(VwAxQD;lhnW({U8LGp@<>-*xT-;-az?iw6SlCY`Mh>MF$ zNlw-dSn0hQY$|6)mT{?KV}C5i+uhTXN1?b`S2)m+mi-M44A^hyshGUIi%8Kc5%>9W zBwTDEid2I@qPQe%^s}?G<@^?)-DEOEFgIv@bWm~ji8geBe|u#`cXf5OWfzCTlb_QfxgnT79)k=61TcO@eT@w zn7);hK%AZInZn*!;;-<3jgMzh4qD>`QiS!Mo&F*X4#HCKjr2eYoP2yn{r&w~rc#OG zz_ffJqg47m7Z;b%1y$7p1}3KbiVCSU3g!LF%MkGX!R!t&WC4fE%muTi&d$ud^$!Tx zPbHDbg*c-$xT`DV{(}dXL2FxETy~NY62h{wvPhNf*~ao(AG+lBsi~}(m>B4~xVZSA z@(A50{R;~Vxv14A2V1u3nVDb#T@H4j(qVA8U|W}yOsP#h2XCB9(-apM7d;D$Zcvas zFE1}$>`lR2w{AJ?uZ?I;el0eKSz6Kw(z53e2v^W(H0UW%q4@;`3ji>!s+<^XY;E`b zm6ep<1Ncgp6c>kjdY0y&2w)FyU=QanCHC{z3wnEvONxr#8>LAAO!3NX zZ>2A{&Q$$0WhP{ixx2eNcX!vnyRT2k)YSBNw?|TE{R?{UHv-_r7Stc}+Q)17@~-jm zjN{{D>LYh|cgorbo;s)}kd&N!nLr>g)N5&Jb&<&lqGDpjMMcp7dfmSFXG5W1hljNl z6cm=$)(j!{ve;5r&+U2H*)_Mewt$V%5)u-k_N#20`TADmpD;5sJ9&5*t$!;ooSL!` z6&1||&`qm>Kp?c@o0>FscXo1OV!)z*{gney0^@_gfmO{LIj(mCDQtJ{+<^rLE6B^s z4+4Be>g$VhlF3+FG@#N(xj79>OG{2Rw(H8QS4G2|orR8$j*^}~ zzhIIn_i`q5{kAe{E32p@HI-|k0(oJ4Vq%E8I{f%xYr5qu{zo>f&< zx%cswFhCzn-Y9q#wTdi6l3I9JGcqzPtgJ-bjZ92%k&N6dVhPQ&u1LGP?d|RKV6c{^ zCJm8DOiW9QI{kIv*pqrY@AY|xqPp~AGEgFcK|#pAOnE@Z+DZ}C73e(|Kuo!tyfiTfsqGTcb+a!DegNy{sl8HBbp1!bAMiF+A)YPTe|= z4)t!z;%^^L?+@5<2gET9eX9I*a})G*h#E*$tv7jn#F&Z`K#|`@zFf60^h@|eG(+!~ zAQ@$3tWqJ=;Gmq16SUhqsxZ(*OiUGh?{{46*^SsWN*g#htduI>T-QE|WTb3v$T|FH zWT-~2q1>4IST4kOC-<4CjG7e}Xzindg zFK~w0rE8+Z@TOUOq3T8J% zi_kVz&0$@Ho&1lUmM2@jB8HvwC0LY5mv$>1P4>Vu-?D68w-3B7|F41hZIF-% z9#VyPtdkX&uFU^)Seg7QaCh*!oLmZsXGD(F7GVQ1mI~n~4&%$e7%F;CNiEGQI}XgI z;7d!}KBM<4f;X+TQ>7)MV`8+*o`n&6=hQXaTwM=(^-855<>uxx+0wqNmKyqJ_KWwp ze0;WD?XFNhqEM)tH*U}X&8psC2(VGUCx?D_w+?D#e0+Qcsm+%Ju8WEqQbB>m>wM9G z@P=S8tSH$yj_3Bw4I&GRi!gip1VH7C-zYHOzkfeEA)zx*FM*ANL$K}ia4{iW?Qi91 zdJ_{9C4feNX!dK@yqnhIlKs9_>o0f2@c~@^0*@CfEi0Sf+KNw1WLsKUiCF+%e>;h> ziHVlJKIVtD-a1(9muDpk-gedqKrepuNH)GdB?V;CG)+(Q8{+&2mH{2~^z?i|keJR{ zL1>c!{bA$biI(>mode38vbuV8R5|upnq}(1fEgzzXA_ysnv;`bCi<_U^73!5%<&_X ztu5UL54cP4ct0uyR%%tbkRg3qIKR7I-Y6&`!7}^z0YCQq6m>!!HYGQBy;#7hx*~{y zf29}-ZOt|&0DkMHiVEM$moE>0PWsF*F5YbO8n4o+$pVyw6C7D&qPT({s}F!=Wo1P? z0iuAfzUDVm>15NbrEJqerCyhpzXCYk=GEcCNWFuf3FvNz2TH_!5F3;R1h^i+ry5OJFCwRywE@EynpO&I zNn+1(MRoOsAK#i|0N&BjiDbK(Oseo4m!ar^LXMQR!HrOU) zX7bK&udTU{O-{0^H0E4IRh3#3z&krTzpcN8=oK&+%*MyZXm4--dAC~(1OlA=;qkGc zs3;f^UbAA0x`6L292^|b1~90GK*+)2F5bR<+s)0bso1>G!PWJWhldAA9-)R_8wY&b z;K)cMl^WQP9ue`!*U{01nFfqfC{@I=%vwIY!GWh^TB^oxQ8)d~o8Lg)-`}qw5F!&2 zSOKg;{g6oH;nDYZNhv820653S#+oK4`2Zg0Xy2TwH$QwRoQz!Q&4`YT{fY@aaj-%l z=J&|zo%5|xNm*I3{3^k7wX@jE?VkZRX(qyHh9CK{zaQDyc>Y6iriq7IiTclJ1PX;l zXwk&iVhGa>m-B4^glytMLI2iXa1>d(aPB4&na>Jggl% diff --git a/class_u_s_b_hub__inherit__graph.map b/class_u_s_b_hub__inherit__graph.map index f805bc02..04f84c15 100644 --- a/class_u_s_b_hub__inherit__graph.map +++ b/class_u_s_b_hub__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_u_s_b_hub__inherit__graph.md5 b/class_u_s_b_hub__inherit__graph.md5 index b9529b44..5328fe8d 100644 --- a/class_u_s_b_hub__inherit__graph.md5 +++ b/class_u_s_b_hub__inherit__graph.md5 @@ -1 +1 @@ -829d383fdf38e9eac95bde2714eaf868 \ No newline at end of file +bf8ca3c3b9277566d37448eda78dfa47 \ No newline at end of file diff --git a/class_u_s_b_hub__inherit__graph.png b/class_u_s_b_hub__inherit__graph.png index 35e507e6c287d5e83c68ca512da105ec2c3c5a5c..921bd62a6f68b17127c5800335679d1aeef0b94a 100644 GIT binary patch literal 2947 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 AG5`Po literal 3670 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 diff --git a/class_u_s_b_read_parser-members.html b/class_u_s_b_read_parser-members.html index a3799a11..5b07368b 100644 --- a/class_u_s_b_read_parser-members.html +++ b/class_u_s_b_read_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -668,7 +671,7 @@ Public Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_s_b_read_parser.html b/class_u_s_b_read_parser.html index 2447aa6e..0663dc83 100644 --- a/class_u_s_b_read_parser.html +++ b/class_u_s_b_read_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USBReadParser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,11 @@ Inheritance diagram for USBReadParser:
    Inheritance graph
    - + + + + +
    [legend]
    diff --git a/class_u_s_b_read_parser__inherit__graph.map b/class_u_s_b_read_parser__inherit__graph.map index ff980704..aa62913b 100644 --- a/class_u_s_b_read_parser__inherit__graph.map +++ b/class_u_s_b_read_parser__inherit__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/class_u_s_b_read_parser__inherit__graph.md5 b/class_u_s_b_read_parser__inherit__graph.md5 index 3e81e179..b9ca8675 100644 --- a/class_u_s_b_read_parser__inherit__graph.md5 +++ b/class_u_s_b_read_parser__inherit__graph.md5 @@ -1 +1 @@ -a4a6a1be4628303ad484eca83de7cecb \ No newline at end of file +ec3e429c5021a90ad76c1c993c8aa8bc \ No newline at end of file diff --git a/class_u_s_b_read_parser__inherit__graph.png b/class_u_s_b_read_parser__inherit__graph.png index df420af10483a1236cdcfd6254e847a88c303a7f..6aec8228740d5f2704ceed6a4040193cab0be8c1 100644 GIT binary patch literal 13142 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 l&!z&}RsZt;FBOn0xJLj literal 14311 zcmZ|01yq(%w=Mhvim0?8B`qaNN;e|isWbv2APv$XjkJJti*$FlfFL2#2+|caWmI1jaq$dk6#qLrPLi8G%4rg`daKkm2uQp%qd1 z2lb7Ngc#!b=1*E7VFTYAWSDqvFEPf%LPEmD#dY`YT{n(VT3cJ&C|bG62Iun6pOv#;!tZ?h_D!qm zJu55gnnKdj($dz}*75eNiIujv_}h)~(vKfMPEJl=|bU9cZf&p4ugx%J57rH7dD_POc_m+A~4ZFg~1nSJkn2uherH_t|`uh6*sdr2j z@=Ot<+NF7--V777v9XDajO+?0UyWGNNcldzx3y&(kPpsLHItK*b91}6 zINk5;?A(2+QKSuv4-5+8aoW+>)t!lFH__D6a@?FWHZx0zh$ylAQ#U?7es*@2uTe}( zM|XaDs#9ZaaQJTo7M67BadmOp9ZCK6?c2S*J#CWKF$F29)8#~~gTq5=DylEcdSTZB zC%awbyDo^N-4ZJplQ)eT9f8Htg>m-g*H@{Yo*vK3!?ALc0n6DY_kX{0t(q@Kzkf&7 ztNXC2Ihw%6#s(%R$leJ4nw6EAk?~5QysQk9T(BS`BO^V1ZhM=Ylyq}x37?$2I6a+` zfgv|N{Uf%Ssi~BL0u~xt9FHBXs3aJAV89ASPbSV*q+ecM=5yQ(|F)P7j}Hc1(VnrM@T33{j->rkM}-e4(nU3QPeJ z;rcsADN{UDv(e>nqTD1iGxK#&qQjmPm^X$|!`s{Y^XJbydK41`$%5`@UF4qpHuJZd zMrJ*)Ev&2t{=HOJ|00?W&PK{@?IoR67G|BFpFg1>W-ySREbr55V{ywwU*8M+b8M`T z+sO_L*q_A1{-y&>Lt`vgCEGSMz?~6+1`%YPou00wt6P+v9U%1V*)y7`o)a8Ke*@R! zEe;lzmIw4fVhQ}tw&LQbCe$z=JwC<5OX=uz-vrWYMka#lKJIZuW`4d5Z4?$6zoaU{sLZ?KK+<$g z>AB`h_e;_%PWg2D{JbJFtLyR6BMn#AyZ)>vQyv4)UYGgi6n*UWVWexN$jvvGQW#K> z_c)vHq(gs!W)Of?&&{VWXT|)S*swq8va@ppEz-!SBlangm6edenf(JcqPMp{u6lJ~ zpsMTW^p50vYB#4GUpVK+5eD@by&=p{?D!_j+GOje5gIAjJHV{daDo;UMCnV9$Clg= zAy!gOQf{BSl*E%skJtTIcvS>WL~rTM?moB3FGm-1?bYb0DzYJvbYIJKcJ^SAxf#C8 z;S_G%9*=ana>H~D$Hk2f!>s%CY2y?A1DF(-^PaWGpL9a6);mEYI}?dq_;>FrD64o{ zy-WMt^B6UA|4xV~&VBSGa@;pu)~wGtt6sl;IXY6w7T+fy+-<~)>SJp3b!(n&q`h5Q zSJ&)s8$#a;vWweWbJv}v-m;=EpMoOo9b(7@r+QrRpW9g=KpxF!Qdq`sLR2voGkmMxyC zf+K>i>Qv0kBWu(3f9f^p8G6v)KF-(hG&VIIG;QnXmb~1V<0Bc13R({d`E6(@usfW^iau36kP?v-63T&${8okD z$i}8D^yjL>`ttaANdJ$?A4YHP6Og&={ACu+Ku#0thUgXRLWqf|s3bOD*RGH4W0LDG zZ3~g4z8)P_|23-K;C^nb|F^-o_xl6BzmiV0o6@WRTU1Y*->#m_es}2!bW)+JG)thq<8d8{g-_WtxD?Z zbWBX&a&x<{sQe9fcbm5+qBtG5R>7utcz@qKqId*H{8gRZ%F;JEg07IE;Gox;c~2zl zxf_obdt5!Q%RhZ$%T{nrOfbVG#YFt^;jtWaB=k?_wi)YM=_@l{c<=zlmlb^Dn*vvp z1LG@Q-GA%FSSH5!|MfJr<)B1iA*qN+(CgQJk&#DRTf;$^+0BzvYg5&FQt}>k9+%Ub zQ_WlUM_dTx+qhh-!QtfQ4UGz8qnuseUE~vW)W_9GjglniA)IAJYko??ee zS71`9UnRTxqFp6kTxtS57O9q6@Nz zU)VevL}Wv<6A~0t*ipoAA6pJK>Up}8U|V~fSXb6?Ge3KVlSDR`UQ*K6wembFsI$}g zwI(q(Y%f~tBd*oapa+gRI))FQmPpF|;r?C5Df$k~s#WbB8uDDdfcs1I0SQdi3;U4` z3R%wYu)lv7Nw{>;{a~uA_RHWO3Q0BVTY>^?zf#6~kC7m=)tn#Xj!vE1tEm~jFIb6Y z@Ub5tMsmD#(Y3ZNgTT#INl8e!Cl-L>&je+yHowckhq<;FxVVe(N(%Gxr+R{v)P{Cy zYMIG@(uJ<*DS02U*h892o{O5?UrEgVW(n>~#rvq0&80$KU41Y|Y4YfZZhoE&Jb*Am zKkwFsf)>fM$B%iasmW<8o!eP9z^~4a{=BNSoevk{m68g2K#D`C30~+K9W&zW+NGh+ z`Mskcp7Uqis(P0%@c)M?l>Rn;9^rR#zzIq?Ld#9s?6y1{o z&pn$?LrJuzrq(`uxI-@BB4f|3j|O%cyxC6ejOCvs?wiE2X2)TrrQ&awznBh(z$VKl z)!aOnlT>E-kHaYdb!C zqWB)8w&rqu;TF}NLD5Xs4;wWJaVJ_%CuNo9g+Z7SMswA|P*g6K8gAXYr+o8zjK^D) zU(3pd#*R1Y9b=S~@=XTFr0lt=wtAwDk&spvm$KwjkH}a>gIBG+BtPbUP6smxPEL?Q zY1{i_^4@D#Y}r&xw{`W1jEsZ%P6>zu3f@N)$`m$OcVn5BCa1_#`6pNe+{@F`iHGLU z@h2yxb8{0PGFKfO3fxzj@e0?^6YD6Yt!zGhJ9KtvC-oS22nXZkN%V1FJhgn1wT5am zco4+_g-vi-ULLL9EW6dLdJ2E7OaG%dGRj}&Cgc|v{nGyJ^q#*naV*Kr zea2|cXk^hQm%@Jmc2`rY&64qyR~Vp!F{fe7Zyg=eF^u7m|KcK%q9(mXRa96x92WA_ zR8Wxn{rs{9-=SwvBe&iACM|{`nCrf#ymhpx*Z#Fizs`2)xTFM6M#d*Dj^p3IJ=jTK ztjCs-%4#EvD~?A4LX0r^>QW-eC}}c&e#YiwDe1%UHa5BoT_g~?*la9nRJaUVk+^=s=P?p#hDoyyT@M{F8wf+l4{1ec`%~prI_vBFg{~gD7jTce68_`wL?Zb z(jOJ2$VU4f&&|o#A|g^OOBgP1iGw z9=nzP&DB*37K%ZwH*b{l^1^=pY*xyBvAXp-JspDegnCG6=Vu~UYGb29b>+~)JU^ZM z^T)7NtMnTRKYDxlczL0w3;cw7fZZE`AbNYYx34IUhq%H2*+|qP(7IB7UpA1#I4Arq{Unn^C}Ci3ai;rhxPvIspHhtLQ&NL5v}!y$jW`5Hig%bj+t4QA+G0(^bZ$py7F zH79@ne$LO|08PZyORrbp+^73Z5Y=O!X@op4UcG?DDIU<+jQ#!{LN25$E>6qCa|%#E zzIvgpjZLll`G;cS)0-YSm_V=DBNQ8KFj-|mvVBM{-+3Q5 zC^|Vg6#HzwxcOBvBLl~VhIt?+?=eG0U$+A&H}a(W^s+)+DuZM zlOv2a^82?w;g`rr15;CmXU__=vMQ}+1=Vw|PX{~!jsTcJqhGh?`><)g{K9LPH<%z_ zWb28|4K#4HF+u1b`iRFC`uc(~40LpUe*Px6)3(~X;V+TR(P%BF{qBcjpnD7Ozab&c z5$i$@{Jq|xqoEOiomW`6X?7a`F%ptQ0J;e9@Ls)o1&y;lp+B~*wRKK@esE}L=P=bd z4%fQP`}YOl&4pUkdHMO!6wArV)=5vpD{uN~a_HG+XJ(qfC(_dN+kEfNy6wx^*_D6& zYGiM34>959#_uO;YH4}3mYv%7^XL70_wL=lpDmwEjElQBfK3sdnmP+O#`yRvRn-dH zr5{pJv<8HuK0Gzo-*W)LQj6AM$#8~I*C%iS#9~ZqY z7uV6b++P`JBsMAvO6)NLq=lcB7PY+ukgmAI#PWxKn%uQCG&H~>;Oat`2Pyy}C_KDd zK$%#>itf7i_1(sJvbuVt=cSs6{ZlWNM)_%g@X#nn=gjE9qDE||OTDot!@qy4K6vl| zy&YQ=cC1UIB?@z_!@|J8W_SLjx_K;<&OfPnG9Fu_mz_f7^BWuQWn_8*d9<_*T1Uuz}wSIYejYgCA5Grl<41)vh}u$u*=cpJR3v}E!VZ4FPpK3Tx>RWvZ5 zG-pVbANcw6Pq|6BpWp3x*|+2-WWl$F73HT1{oSv$tKSV#stjAi$DiK##87N5uAJP@ zq@+hj8UQx%n*RFw<;xd^R6$DLoi!ZvcCgsjuU}cv4O4BGB5Sg;vh*69TFp3xgqrD8 zXduCC^k^t4;k1`Xgp=`bb9evv0ie%5g#3xwM$m@mi^0wc6n}7TQ}(xgB^4D1dwXxN zNK!-RChv~{*7Bpje{^v0Rr%YW0HJ+1`oQzL$1tM)lXLHvXUQHdCtLN~Ea>Kzmh!T) zUx(LD%w%cdTuKHkv4P-j8D$EX&)h2e_HCNh=;MgaEOn{sFHAbn8nr@7EbpI_k(5ju zdIxCS{QSHTTWw8^69Bbn>0rL~fB)v!1A`nqQF}`a+I1UUI6iE=x>!r(vZ^WaHvnJ! zJ*MXwDx{{OQtx>!C|Inlr+0lk>#35fN*m>Ty0;V-7S_?xK_l}8a>d%}YIJlo#1Dn< z-u}MTbPd41m}ISrxvF$@+3*cKRZ(4?%46qWDG8{L-p6tRe0=;Hph;On1Io#Rg|6_f zP!ba}v%G?W=_!%rIzgXSNqKoe`_+izV&*GpCnqPsYXyfl|NY~&U6hoOk@3Y264NZv zZv{|oCvwAVNKp}dd!?T=BXczqhq~l+pCcn<>*`2rX1-HXEPy)gy@dq^21ZcW8$^l8 zE*Y7PhMF3{F?F@IaB{)vL`6k~Oc@;?AH)oqsj{?`fr*Lf>C@+2TwMc~!tW&lbJnT1 z0LorlTZ2eC2jm74I0rjBb>tNTe=jfTPOP5C>#FzhDJi<{?gCBD`ub@;J};!CdV&d< zzsV=p*(``ZiFrap)jZ%6ek{`euS ze!uzpijR!l-vIJF5$hYVw{Mr>OFLWJZ*qxM#=Q^SI3N-pHiy+{6l!vu%yM6Sju?!M z7^LC7*Sa)6|Lb}n2=Py5{yR&-*RLI|ts;Pk>*{*^h-QGr7rcbD0C=)Gq~X!gnK}o? z^@7hSk1bJsYygBbG&F>C2iRmq#dFxkjoINrfS)ZbEjNhrN=t`&du0Ii`wyy%l`0G7 z1^f(h8zE#2O-*8d1ArFc0O953{q*S*Y`;#jTHDrO`U^l7VH7%r6nh(+p~1n`Xz!ck zr=YPSI65*y%4^>}J|4HO;LVR3zmM{7d)vy~ytj!bs^>W;=M0?t{s#8E0#sCQfWm-t z!{6V3s>;Gp&Sdx1V>v6HMvmYKFf}} z4sGBo27e0q%F%)Xb!JgojADk|!MXwJ3Y!s!Smwk%bH=k0uTDG`y6_4Tg0y1M4( z5VBkS$$Vo)Ix_Z(C=k8qWt@n#m0OH@zJ7j{RaH!SO$~K*lil6jQ&Us3v#G0T2!wD6 zn)>`VMS8$v0b6Ar`UtS!-}x!kyRMCOP5Ao@O5eiD33WC8FfcOm@$i&7(#3Hcoe634 zeekBNy1z>gC-E!y-5z7V^*=eu`j z=1{I1wL(?~V&-TzDKQ~|RxaUSW1{@>{P-H!0>C+&op$G;{31gCUS{08QwYUJ2=<#~ z^LLh({f7CLUGc|Nq941Q_GD~qN)r-@O|q#}aLV(U8CLHfsmQu`@KVrq*tC(GD`5qn z?$WCSaQBZd4E<>jz}gL_V?`<|9lM?r)gj>6sK_ZR!=>!t{mAzCu@TgB1^G0P2rVr+ zpFa-?4K;3TbH1Y5E_4cK-?pfqyw8umx8~K*6{W`;>O3omFVL~j&MxfaCUqwaEftfS z&?F{8@~fAZ7YUc;j;@@D$Q*1M2gkK)aCKGH)yb|Qc^!3B4^%iO3*h>eGY#?XrjU@} zSl@mKTl)5A0*BR1LnO6C8M*y_V1!<4CK;9noe>)mWrv_+D;2mhC1pA=H9~TdlH--; z1Wkg_%ELtQn7@wT&uHzEtu!6dm+*$tg^J(Dz<^>1KyzS&08~B+6#=IOw(I%x=g251 z;3znv;F&2YDQ0G7E-o$*E)X;)2{*}zg@uKK<0YD@sZBF#*>JXZxr(o%xcK++QbXVp zLqbBBv}?SuGltjZ=H^gQQ6UMDk&)?;mXv!sfxGW|rc_i`?&gXfQ9wHGn7AJtZ-=z5sv#Fj}Jg!IYFLd^Sy0g3v9|aP^SzWOt-cLZZ#DFkiv*4u2xj;&aUHRU=i`IM zgHLTb>t#trS2w4s3u2&}(D(y|wV1g0zxDM6zvEj~-*tro^7H@JVoF+D?^Ku$zmkFP z%YZ(yz{SU})Ne%|Rq5xkyfL=P%+$S?^UJI$I`}?DYM2l$e$ml*Hxn?Xu9ur`)53|e zL!W5=n)F{&koSFXtltOQ&a^x>!V9E>pP%1}N`ow^`S;P57O%^YQlK9d>G6OX>i+-~ zr<=Pwu!e9Z`(0@nVi}(M%(fG|%3b5*;YBAUg`;Ot>GRlBfh3(!$hFRZPd{u^N& zrKqW`-JB>7xC{w{x(8x;YGPvdUBIz=LszYpz&+ajT~!qo@FS=?rl++p9Qf@heP^27 z^MO0d%?%>x@6a=1P6~<*UBp<(37p7PQ7`-fg&!PGaPa>g9i7K#-IasFfSQ`x`Pf^d z1N}doC!h1)p59X!G#KO=J2u1M_bD^UF$o%y2*)#*v1zIn;mH zWaH%Q@9w5&V!9geykhsbaI&(pIx2c?V(xx%!phD4N>7jcdRAKBeB;owMsXkv3Zr&U zT8sBALwQUH1VO}&7T|qHD#Tq}d_06Ku-EHg&D`8vU>4!11>Y->;|{NJzHt#}tKM1y zrx22`@p5V2P!o+#ij}_jeMrhsZ9`i$Z{lP9uz&Gs<@dUL)NKX7!T)y7u9V}p*h|I` z)F(FO)(`jB|Gj9>lqC%nKZn!^{Qiz!yyM1rt4Eah(H7KB-@{0IJ>I71kB+ZjTOab< zuoI%+zU_xaE?A-q-2x^iW>rZ^L}Vl@7uRgPBOGgtuJ^TjiS}kbb#d>{d^v8trO`pV zCBHDC#@by|Q)AHX4{NcQthjs40+TZ$Hz5w?H2jVZK!$oYzaYM-22NC0Y;^g}99_GD ztmkRdcqxL!@^W*by(1db6+=ZQphGIggv!qd$lk$O>cM9@nB5A%*+=-hVEW%j3`!LT z%SK+g(iO_Pc({E`Jzy7WvBnUA;#hG67d=Op&hq3=iH3fSKLrLx=<4b_;GHsLODw;F zDk4oQq6TMPB~q<_HuE8q_IU1FQ>*;W50h?i&_OCIc<>zw@#4W_OQth*`3FLc(T5e# zZUM`;!KmL@{IGYcdg`%gz<#umqm4Sbf7}g&~Su$8xC4_Ha1?j z6YFX%KxMW;d{B@LB@5KmZ}b2TzJY3XcXv-uPoZx#ZuGc3J9Ixkl8a*z(b4%cIeE4^ zlnGBK6AJ;b0d=nD`Ozi_8IHGqA|ZUq9&cG5G<4@>W*SOM-!rdT{1L+l_Ss-ONY{M2 zHC<~5MMXU*0iqdHxX%lViYzTGHaE|a5opYk(|_1GINYzV+^h4U_~GEE70jMjQR< z?MECh3*<0hNu?DPaH3R{l_{&K89#GBJ6Hp!-q_s45oOdUf`h{CbT129CeiNE(IcqK zp_n{R=5vHn=J+SqY?6>C%nyHd2P^`fs$KuV0?PjEI-wfp{bd2bQGVyDfXBe^&DPi~ zG&t{fbo^DYJqF?!`r>BnrrTH~FlaX2eQp>eB znUDE=c=97kbwy?M>Oa)A)%O!Mtmy>>y@?TsH?20Wxk_g6UMI5}iUW3%DG?6oJeFCn z-=)!Nt@vX z$&gv^3#BhM6$Z&SUaOhatBSQXQyM0w??!B_=vi3;shk#8@7_tPsXfp`Ms>Rtlo$+W zG;Dr76mft}F{&2;mhwVT5xWUeV3@?e4ilM+%gb!p__n$%GSO9N)(Z3TZ0+o#&Y3}L z0B*FjvI6HV5aQf?d|-^snwk@EXeb#@RGsL6r3Mhr=w(}*5!?23ZTXwddkuA-^78U; z-n_{^_d`+IJ3BOy=!#<0AY-OK@rA-69*q(=XmN!r@%PIhKQd*t7_B;cen0P7@6WCJ zEKyOOiM$R9Mn-Q{R7mu^@3mWxkH!zr6Ugm@*2IADF>L~+*GoU>H0L(Tx zM_nEQ_~;i903ho_0s>&Y-_?y&BMu#n(#i?M#bFwo z03pG*RF5Ch(r0o&HOC7u;O$LTvO8{Ses`Ff(JcAfvObnd6e92JB}PRlAh5LEq*dm$ zTjN1C>Eq!|y)}c=LY4pGnK>3nd+3;Tei*aFX@@%#p??bqz;8a=JF0ri#-sP01)Y(( zc>h?a+Dh*@mct8)qXNp471yJN+w^7k&`NDGL*odkqH5g?faSJZ31fS{I8{vC8>fAOk4_XJMrx9qyMC`J~x_{`YspZozw#^x7#o5@069oUn zHM={zXgctwr7L!zqpMoZVsf$$t(q~iyaOJW;`vNdp%Dw=y?cN%T=PA`M2l-b4tvgl zPw=!v|4@`Rcx{!QgR9!ne$d$p4fPIy%)T#N&i2#N#Dto8*493nnc3pv;`v4t6#OnT zMp0(@HEf4^^@83{^y(jDR7Hg_28J_THmoreWr%bYAGB_0AEDcru2{>cKJF_i@q;Ri z%kurmu!;y8Oj1e;quUfzI<(^A#AxZA!CkbEPfX3802&5TsoFYmE>7h;84`nb+Mi^T zc^%Al7N9Bn6dW8H;y<`;IFRE0s{W`i>YawHPWLirX0n-e4`QQzaUD7gglgwO9+#nc8z(UC@87>jPiCp# z={7#$VxQVtemFcNLdW|My}e|txc6sYRq^Ww64~s5VaBUxV=*9F{J6KKviU1ZA^<~0 zPWB-7%NGjXB+tb~yxQ7M&{|A1&ql7k@~4kmKou5NQ{&*_lgQ2ONfz2>%8SQhHKZ*03uPxEAnv2rYON{Owpa1)a zgd9YIXcf(7A1mb3Q&o*gsEZ88mqZnPHQx5`-?vbb2YC2dg@r!@F-_1ulG7n!Q^?X* zIqzo`6nHN#Iy|5w#wC?MCPaTL+;SR#bzNs`+#bj3A{M}|+7cdxK#NG`E6&Om3jef+ z{iz@nn<}a^jNB0vP7V&C3{1-o;W#Z45j9BIctY1n?pxED?EyN=16*{xUvwj)zb5fj z18_3*=Mrx^&DI(u8p0GET|(2%*UQJV#oD#DR70f)2@MUZqTb9tt@bt_@6X>s0jCU% zO}XOdzc?E$tkTs5i)4j^3r9tbxu5=8T(BelgogPXd=DEid@d)X+`&OVv94dt{{Chw z1Lw;tp7+qW2lTCL&x!sL+&r~5QI6HrWHNDI@@}Qg!ofh&Zmr|?PaxWZ!d^zVf}ydO z57!6s)n6(ko8dhu_rGl76#dyE>~LazNbXTXNh_Yf89GqCjKp1oxPy2T{bjVKHkp`5 znU8Zc>N1RzN`Ink*TJC>G+Qr~lqP%4X@}+lDQ@1ImX~KblJ^ejDMcr9N{V`_(Aegr zgU*W=bL+)jIHX}Yz}dFwo4mm{9qB~6-%`ygzB@l?YT9kH~a0I<#Vnv8s0}kNI@iCtuM0K z-QDD&^PmJm5Ljw3B;n-bJ0_+f8X68$(?m!bz^94@c4JK-&;)58OqDGu%lFs&-fE`& zT!|y9tUSNcf0~!~qev59M+bwTWB(>ip!W19=MoW}Dk+gYpu;TW!=k5`)M;4l(q{oU zKQVC%MuajDRiEYJ!tSWnjz=P_=AH%;gGVcKATuP?qp*Pc^XFI~kwsx*+L{CQ{&=fW zuk;P_P$@QQGsV^E{;!{j%&hS{!-53ejCh?tKBj^h!}yvx`njr)c_ptQD z?VlpU$$$6o@Y$@pBf!=DoyNfHqS4$86sS@B1J==e_Tyw#iHnsL7ruDNTpYi&bZB4@ zi;r*o@EI}i=WTajOs{Kc8S^jC_&DFkfl$mVI+`0Erb2J`_K7Oi8<3GjkK-K)1V$en zcI~79d;n5XS=nbmEAZx&A78?bxw{VtdR#DZI1H~2@d6+!3yHf$0Ry8DPIxP;Y`tc( zoNu(COz|!%3|-!Mq^7Bvm_n9QTr6tOEsE0r1j)-vQ;TojT!10AEd~4v%8b`1(Zh^=nQB1}}LNC#R08ik92E z0ymjMkTBu)*OQkrGOU!X#a|bLV+p1yn#bqB(0b(P~qp%-3r2w}RzZic6>ZqJuz zLDnK})$qWeowQTm=o407`Hr9Lq7Dt2v$5|xZpqT{J`@3UmzPISuWff~9Z5k%=*1PGPnnJ6qPC z8~N7FGcbSD*C4RlTk4X0{HxNOBqqifVneZI%?oj$`r<`?uuOCuApgcm_93zCDocRk1j-R`1s!^s5WP(W~`xjrZMQ4=;B zXHkQ6VGI2OllG45Ma{e3FET9k!8cZU22owdfpbq1$9%rS0AhA+ZGf7ZJt)l22~zbc zs;=HvH6e!p6CndOE?zfFINXDqt}x4fk7^q#LNdkTJ&o5FT2MyS+_rbMimQSb>iJLh9rA{ z6C^fS=dgaT1|ljWN!Pu_9_T+$_nv*QwS^W*MNv`lIuZGzvo_Ws@7BQ|fOsB}k^-F| zxv>2)wy8;QLlLQ?Hg>K67lF7@As``yyJ6c92uc+2b;M0zvUo|p2QhSEK>>DLP~?An2fQ?JXq~X>e>E0Fk&bdHZZwlOT@)jr-%p-Ei!CcBmzVazZzkyT0 zWnp7uUYfq!xDvakXGNQz5!Ql;ShZ2nvK%wbPUZ|f91z=)gXwbauaeapFq15v;pTiF$HelgFQr;Qc#LIC*P)P6(BFtIF|EH77#s{N6#bJY z^9rWVHQ&9m9d=2?^s85~ywj%{3pSsUne)ku9fdhSajr(xGn!B1KwCiin5^SW+ZPvFzdY z_I4nIfp`?)=da_f0Sx!#2U0io{ua>@^1pi(Zj<7fN=OYJD;8%t~WL`ypjQG4S*>< zO-)TjMHYiLU#q55RH6Q|%1Y>BEG#XHf`X(#bnR~dmVnL&-oi{zUs6&M7#P?xru|?1 z?hcRok^BT!8VkDX(MCMn&(KH)eFUhF#U&&_P0`WSr9vMKs8y=RS2l8222151)W@iufZ!r!%VnyQC;l_@Pnu*vS?0T-X{T|D5d*#ozRh+@S8BP zd>`4g3vLbwTD*Jbbi4(4RlDo;TmU)fqq|)Dc#hdXV<#aXJH4^ExTxFg@lz8hxb9D% z?p@e?_)rB3uB%ffdioYUSs--a@(3tqqI#J1nmY8rWjR<`4fLXpn@7f*n-`Ok0U3Z& zo1EJ^t*9uh$B2`IgOw1SoxL2uVz`*)y>Ac=MuDg!T=5Sy1Ri{UMCx$TanMElVaA?%%k(xdCTiM`{PPx-VRB**!RL zJN$=#G;8<>9D9`DTTu}c7Z-si>2);q{{d5_XrqFIgLetQ`HDe-Aav8*R_UR)!?lT~ ztF!eY-Yn%@S=xPoeE=d76cm*C@-(-w5UzB9RJ@g|XJ8;aBxLc={TOKnTibj82WF+> zhppQo^i65tXloVRoDvkUUsVJSLtI>3TRW+)&ZT-g7T`A)CpR$bA^}%OUhZ_+e)egeSRd9oh%*|aPD?!g67KRBIfQX3VNAfkc$4eIg z(E|6G2KWeG?c7{>baVudz_q0(F~nqKVc38dzR~+=&diT0@~TB}bMrrLP;0jW7ds%m zUSAaJhVqDlG-{Rc_xUgq5xT#(cN>V0cCtf5LxGw5@#6>B1tJ%25S-Y+C4_14AD}BZ zEhc@hxpcI&>Rk@a)YQ}f!UMgBa<1x;XO`*n8=Hgsze+A!U0<)Stu0M0_&&klZvfX| zUwIq;%mJsS;8*0o%zkNc!&k}J_SX&?`84jg1L5s}s#Hjy47)GA1d7E$vN0ibe+6WThAZ*wL;!DG0DX#MH9VWe`^((l zC`-vgOz|7;%IqkMcnQOn0xYv4qXL=$H`6;iq$|4q)c<)4Tq1${Z~u=g3#XnBl)r>q Uyby=`YY2qYOL?&(QGM_K1=WxB*Z=?k diff --git a/class_universal_report_parser-members.html b/class_universal_report_parser-members.html index b033beb5..f6dd7f79 100644 --- a/class_universal_report_parser-members.html +++ b/class_universal_report_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -159,7 +164,7 @@ Public Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_universal_report_parser.html b/class_universal_report_parser.html index 7965ef6f..e9d420e0 100644 --- a/class_universal_report_parser.html +++ b/class_universal_report_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UniversalReportParser Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,16 @@ Inheritance diagram for UniversalReportParser:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for UniversalReportParser:
    Collaboration graph
    - + +
    [legend]
    diff --git a/class_universal_report_parser__coll__graph.map b/class_universal_report_parser__coll__graph.map index 4ebb20b6..c873c83a 100644 --- a/class_universal_report_parser__coll__graph.map +++ b/class_universal_report_parser__coll__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_universal_report_parser__coll__graph.md5 b/class_universal_report_parser__coll__graph.md5 index 84a58c13..18ce6809 100644 --- a/class_universal_report_parser__coll__graph.md5 +++ b/class_universal_report_parser__coll__graph.md5 @@ -1 +1 @@ -53ad9438e520f79d9514bd51ffe26f67 \ No newline at end of file +6ae2ae36eea0ce9a020916893890ce48 \ No newline at end of file diff --git a/class_universal_report_parser__coll__graph.png b/class_universal_report_parser__coll__graph.png index 4f9827b6ad16c68908200c319d72d5a1ca699a46..85f3c95ad8ba80cc71eebce696b11ab506151bb8 100644 GIT binary patch literal 3332 zcmbVPXIK;4)*gyV31Hy_j#8q62Z4YJ3W8ryT4+H^K#&k3(nMMUfrKvTQA!ZxNB}7U zCvXrE=^!O4(j-7cLy-_sx=8OK$Q``*$Nj#a-#gFD-p}68tl4|7^}cIOoRuX~OysBt z003g9CWba(TMFI*Lj2%!%-3@QZ1%gFBMpJwz3XXHQ7QmH>P-!=ph;PC*%21D1IOBP zmzN6?t;wfp6U3e~Z0I@b3pX`0j5L0x7e~X~-wr~F$M5k)F&Nsg*KIOaz5!#&CX=5i z)%lhw+BeQPR1`OE#&k&A6{p=e;NyCSKcb$lmsDR;g-O7btZwmci1$YH1U7H14+r`! z_%^A==L6+oGCpvCtbAD>222awjYeDsfUHSuep#9SR8MwjQ{+4?xgCbsLu8WC9%GqT$4<>v#jb!Zi(JelH(3a4&fFKYNeUN!T zDEfTFYu9q=m^LwJ!o=w4ORo?4i;Ig_5nFBn0Zi@O*AoOSpF!sE@a^+&R+-@lJw-)# z5^1wj%r_#ZZ7VuoDfZ3cfJ>B}o!u?XO!uy|wY9b1{b@?iii$k9mM2c1K5Y**wnm4A zH5eCcO&2_TesT54{Y(u#-eRmGkuk}<@^L>ZI5^nG=Fv?5_QpcPt5-IXw1HVs5fLou z>%Oa3dpEvBMFj=@W%+ZtOPzcvhf1Xyp2*0`Qdo+Mi%U#|xa{FeVq#)koUji4@4ppb zFx+PgoKBS)ZFzmY@Ygy%7NW3Ntc>^{r%ri*d#aK&vKA8)`}*~(&jnp=?YfGJN8@KY zF3fj9>eDwns*uZ?JqJDxz9QZ>Fleb7)!XISqS2C2=zbtT>khF@JVl9?LtB zK$x!La=A%KNhR0H)>l`;t$z73xyRqnuQ}jr%p2TOxtd9f zckS)w3WsSn3H*1qyXhSN93@kdR=l-$=fa_e>uxinnyYv@UGJFCgGdHk-vV`aJN$*{Q-!_!fQh zTS8D{Wo2rTz-1Sg-15;|T+;$N-9;6e(E9C`4$|0|pP!$RCIW$|!r@I3+ckJZtj}08 zgE0`k2zf3la!((2P}={zG=xwe-ko{A{h@r3(t8$*H7GAGE*?~2TyWf%V%*|UY5Jtw z;|WCo$Pi{I=gqE=8sSbgyq%3Nl19}vHO9uqp`oFVP~aJPm{-@nqXg4gI+_~!0Z~0Ml+|X5%G9oQBhs;vO=~6 zLY)*ET3A@vmn*7y6crk(v(=cKlVe$S=wtlCP-Q!~V|3nG&z>w{F)?Cru(*hbG8~?L zdTV=uE+Ho7UO5CtGlfD?=zxW_#d^IB?>?aF-Sg#Ini)-4SU9juV<9gAc9 z{_8$*O}X+}+8?g`WO>hVH!_0f1WN6rzJF2#q<_!YTpQ5yg}0{-R!e|>VSP6RK=a!8 z{E>cwPn`4i)55}$&Q3lcNGHO1#E#;^4P-*S=V z22(;%Nu(!duIjPEuxk-QoA|wAsLsNp$UHWiJ33f?A@&CM9y<0-z)v2fAq44jqO)eO zKmz?NWqln{DfLNK*0H+!+H>{JNpLhtej$CPFy7KLx$}Cd%2Y9qGq0;>;8h)ZC)!~5 zA_6h-?c4bD<|urLzB@E_wtQoo0*p>k*VYD3pZIXjNwi#Xy-p2Q2p&GL%BTNdsty_?^Bg z(ezzFKtLy3O-pOQ{@cM>SZXIo4E#GrL)6^oYWqjAgAXPrCvP3Pq<0zk&q7swWX28b9XV29UvfHLCww!&)ivKlL0MTjGd=xj zSf^V>_Y6}*f@wy)0(7v$%^b6v{N@H9yRncv<0Tb!XkeJ9w`vZtdXQNn68KpW%| zpUE$wD7B!vY3t+8-8Jczow8szWq-xnMdBy;pA7fk5nOPqH3 zD2o_Spdk_xA$UAKFmU)4ake!<3ZmjJ6`^g{EtTDAvp|81`}b$+=yW~V+(M>gg)xalGBh+aQ8?`J<{{frRN|8lSw?9k0LvNChW6Ihh?Qum^$8b2Dphh}9H|eUa7yDHDi$jnY`T9zz+&@Fh+Ozr=78ZE?(qoltZS8wd2V)R} zX~d5ii#8w)4HGGpY;F8o7VEr%!d*cvKeht~^V~`)NM{6O)XK_A_c~lj$x2Dm%`q<| z%+>W<{Z!7)$|2>)&+6*Z$w6`trJ&IDm0mrKL*ws~I5fHk z9M}Pag3<3%<&~nJhwI1X;VN}+f4!3lf2bkI7`uYxNB*Pd}?%G=8JG>ei;pXOMV{=&e)E|FbL!-ktzupI6 zk|HyknjG>}c2!l?hY!|&+8T-OdouEG$4=K@vMJU)e*Dd!QsFuK<;Yij_>!sAsj;z> zkIiNtG+~hX=~sT$_O?)7J`Vc7MV)~`zVGU)Y!-i)8AK$awux^I5Tr4R);rg;^~rIn uxc(Q;=6)-Eqk+wb08o4XtDFa3@AB=poMv_KI85-j1~4_UG<>0ti}@GPPGltj literal 4116 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 diff --git a/class_universal_report_parser__inherit__graph.map b/class_universal_report_parser__inherit__graph.map index 4ebb20b6..c873c83a 100644 --- a/class_universal_report_parser__inherit__graph.map +++ b/class_universal_report_parser__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_universal_report_parser__inherit__graph.md5 b/class_universal_report_parser__inherit__graph.md5 index 84a58c13..18ce6809 100644 --- a/class_universal_report_parser__inherit__graph.md5 +++ b/class_universal_report_parser__inherit__graph.md5 @@ -1 +1 @@ -53ad9438e520f79d9514bd51ffe26f67 \ No newline at end of file +6ae2ae36eea0ce9a020916893890ce48 \ No newline at end of file diff --git a/class_universal_report_parser__inherit__graph.png b/class_universal_report_parser__inherit__graph.png index 4f9827b6ad16c68908200c319d72d5a1ca699a46..85f3c95ad8ba80cc71eebce696b11ab506151bb8 100644 GIT binary patch literal 3332 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 literal 4116 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 diff --git a/class_usb_config_xtracter-members.html b/class_usb_config_xtracter-members.html index 2000bf67..7d758e70 100644 --- a/class_usb_config_xtracter-members.html +++ b/class_usb_config_xtracter-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -175,7 +178,7 @@ Public Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_usb_config_xtracter.html b/class_usb_config_xtracter.html index 4fc3d701..e5b786a4 100644 --- a/class_usb_config_xtracter.html +++ b/class_usb_config_xtracter.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UsbConfigXtracter Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,21 @@ Inheritance diagram for UsbConfigXtracter:
    Inheritance graph
    - + + + + + + + + + + + + + + +
    [legend]
    diff --git a/class_usb_config_xtracter__inherit__graph.map b/class_usb_config_xtracter__inherit__graph.map index 57c0b04e..a95fdf96 100644 --- a/class_usb_config_xtracter__inherit__graph.map +++ b/class_usb_config_xtracter__inherit__graph.map @@ -1,16 +1,16 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/class_usb_config_xtracter__inherit__graph.md5 b/class_usb_config_xtracter__inherit__graph.md5 index 2b5f463a..1d61e3cd 100644 --- a/class_usb_config_xtracter__inherit__graph.md5 +++ b/class_usb_config_xtracter__inherit__graph.md5 @@ -1 +1 @@ -699e6fd4f8e537ad0e6ab8402783f3d7 \ No newline at end of file +8b41492a27286a05ac2d4683d2b4d6c6 \ No newline at end of file diff --git a/class_usb_config_xtracter__inherit__graph.png b/class_usb_config_xtracter__inherit__graph.png index 3b1bdad6094f0bca9d9a1bf657cfb933dfab1839..7cb16ff61a066487e01a572ebe4b9af47f9b4f4a 100644 GIT binary patch literal 23973 zcmZs@1yogC)c1Qp1O!A$u}E-X_uR z4o=BQonC`G9bfAC6QwP7%B@s42{B~?Bsf1Jf=$v6?dAo7$~|KK=C>HCc<`;87Y|UF zuy1}F<7iGJAvj;e#K&(>S4S&mhX~>P9BTH*Bx2WQ++su^nvvjx)KQUydm!fvhP$aB`S4IcB@NC+zVUqt_%_7OUK298cD8M~X` zR3E6?ki^zJcH4+9>x1g*>ZC&M2kAeBH&|~j?*#Mi-OHmX8_Fl|y+6`sA|t#TJ`kWG zx|(@>RvguKxBk?od7gFk^z{7s(B!kYt5AE6l=8>>}e`GEV4yqVcbijXs}%}jDs)L?DKYb~uVW1sfV z<0U3?o}O2i=f}mB$J?_UtgO>@F813MmcTvNNo8LU1s~-Me>1MH@L9 zFYuBm$jQm^@tFDT;73zh5rGc?KS<5ZF&-U7n&B(x@iR|oaZLJV3ElSUOZEbC} zLS2RQ7dR-V^C27+)_+`g=i3I-M8k=>49|}?p9W&Lu_qMi@;9;nb8vP}d*ZU!^a0KI zk<0H4sfQ0A-lKRD5g$KW>%2XhuhrMrhl?WMaduE_)bVd|Q4`Z(X6JRKwT`9bMn^cM zs)`CT3(G*N@cG`NoM4KGL9?Gt!|5{xg}dT7f+-ZZxRDVNzh-8(mX|v=@LFFJ1ZPA> zMmldzzqPQifA?;(>}|BKFY+?|+2sNfLI$rY_?GwM)59@64-XHUKQ)dQC%etf5=#fY zy}hNT1F523H^Zi^tUTUI#GzYNQ}d3E;nAa#y1FN{H%C@p9_yn=Q3C6y`^z0+|$7A?)q{i(u9v9WE*BJX$R$}PrV&Yibs>et5#`FMHX zu=rIQD=PM{4rLerGlDy_U+xbL4Xt-SEvcwDnkY3bHeuJPiAhRwJ6QQ0Lc}pTHfGPp z%+Ag(BqYSh$jHnb{46s?)GKwJ9)Y-p0hTL+j~8^XyU+o{zrMESdA?cMyGqJuJv@4I z%oG_sH8iB=Ev~NCl#>gw5RjFXy?OKZ%`s7BXY}sfBl}U9hQq@{LIQ%i`g*zN&ux8W z6%}F(j`smu) z+Ty8ap9>1uk$t@DMQrE9Bqb%^zpwi7V-3zruaM}cz{kn?Q8#Pi|=*De3YkI7%Z zekQjCJJx_Z+Y_RQKjz^nCfeKEOG!!LPcOOOToLQ%he9Cr_VMd??@E%ANDJ{C932x1 zLqbBHN=Q7HlhbdGkopY%)-8ekKXU-Th{ij5)u-or>8S0CW|RMz<4b!Esa0Q zOF#>7><0V0yu2hQBa4ZRotm74;8L_&Q&U4J;!Z5+z*tCFY=TWLm{nLf@PKyt84}_a z%Jg?+v69{-zU`gAEdl}poBtgX6BB{=C{wvjv3ZY|)4U44fB!PH+UeC;r;bmEawP{_~7@Kt~NlKB-_nz(p6*fd;P z?<)73UVhJu_we0va+vlkmQsBQ+{^F|jKyP;{JcEN>#NK9@7M^j_MflF5VRp+S#@<6 z;3O<8EVw9Kyu3%dySqC(KbHgr1-EAEYbz>7hld@;3UqqQ>E%BcnU63Frfkj6&#$kC zC_Lun#m2x8bl%dIlthVrPR?cM7ao3(w`X90gO=9#aBT$L*BzpF?VASz^!8GxafWm@^flxCRj@l{tlw2XWU!E+4L+~MRrmC;BnH3=?Pw9#0fOLlN zw*48(j1b$tjfUoRc8~*>#?SxRWf2vDphW^JKpdntG+ZU}Sk%@EYgBZ*2xyg$hbRTbXvmI?LaU7DnbkY9FXunp`BR}q3GWi#Thk3QaSb9>JfD?io!r;By^ydk z1tRt3hXSFaKP#zUzZRj5dM+(3E-j54dK5Hf*xk+h^%mKI5{Q>GbFu+!jb3gdGV zPC@0e=%$s7-y(x%3W9jg+s|608kieMtZ^AQtMj(KKOL@_5xospGgd%8Diw}4t&keYV=cW?32_;~Nq zk`qM1$1y`gUN4oEf6lImUdOO&;E>_WovasPo{Umc&!=rShPP#u6me>lw0icFky>qv zTZT9~4^>))G`yq3&t`m-AW4g7_W10(GHO@X?6<7C$(lnIBO@(mzFVej82)7rIrUWO z$WSXe@S%!j^d*`|rSH@gN>WjwAU`tcmcd)~I@YVHUDeSk+p-q4@O(;-KQbI+Jw4vq zYePahMME>BqmAwIo~*(4udJ%75X_6jc%v7^>;Z)f&c+z5&l1(u z3ZuV0D|)XH4a=A6&!2<7Bn~IX--1G`_zc(&1Y?wl?j!raUC0{$6V({>&j1^I^(yqv z9T(F95mu(0SIWwqT)$~?&{2>L_Kdj|6c*9$1>^Xc67TK(!)J)=?ujlQqo6Rdv<%4l zcHi0YcQr5M#m*j87~9Fo4>2+Sb~0}xI#I!ey=j@*3uK=&S2=TBFZN&{`-o+i&iX%$ z{P^aLYkIm*OTa1>dQ{T6XZt6r0;$L@NgbUL7IogoJmnp&#;t886%|f+LE1gEv~(Uq z<}paKJ9zl}w~+g3(4W&sFZDifp7#?IeRV-=@d!V^x{=(LRfm`+{qSgshitl**Hbnd&MApWLPy(;F1z!p)R8~qR)|S0)>dXHt`F&f2(AM|x+-=zrN)677qNK0glf>Fyrz^z?#{7t^s5V04XZEUb;( zCBT@NbmjB$E;^btkfO(r=Ww2>buOSvFVH3TJhrBY%VT6#+1tOz$h_D1cyL-i<;f`o zMcg~On@=I z9r=+Xdc|K`U(dpl`-JDv@%7~T#l>@EAN{v)|7}=`m;_g+{Ndb4#6gI?5rbR&%)?Wj z{jEXqIkSvBtC{r{C(p<``_hA*A_rSyae91Ql%O!r3XgM>4MWrfc@?!dA-m?WKC8zS zu1-g_+@=&W)zL;~-(d;iMPW@H9rWhSS#k0DW1d)C6sT#nvK7DXRE0nNHT?2ynewXs z6E4bIo9&Xa>5&Q9mKnStKh^9w7ne}{tP=IYH&)ZcU59y3sc~as2=MS5xp+nl620=$OiU3ttut*{!?^7#Co?qfkEGPP%uO%?+;SA;Q2QexFBFffPUsbKC z_bK5CopvpP6fHG27q&`vFxYe7a_e55}`uRwGEcIdN4yM@KB=wms#_2lHM{Sk@> z30IfL#aO7%>G3x=0|NsKjcdK2&=>G<{Z;FHH;>$qksvBIR@VK39;vY>p8c+@oLgUF zW`s;@U0vG9NGytGeO}(pAPTtt!@;IV-rnBsbd3G>?dYrA0C;Ei&?*VZ^NES`1a(b_ zHxRQTBUi&I<3A^wv+0;O8VA(}1U%wBUg#L5^!#YV`Rms&F>%AEI9VAP57{<(jtYy5 zb+p_fKD3~3ycwNqdVMj5hLFL6I(o&KoLmRK2kshvhDUk1ZKUpaKFzAC3Q#m%S^E(X zD2k2gHa#ej!fkqSc340oy;jQp?5oq%_{Lky4O{2RCvLpn6RLr$Be~|HjiqU#l@M?f z$hBo?B@E}CFfpHsQ@^#etSp)A8x;tUp`{S1>+CR%qN1Zhf44KYIh3vXSr#uya(Lub zaS`VeNArXq%*R3|DJf+<7R}p#dS>e;JUYTOlQHXDREfw_c8_PT9h{tCVYUTE7y7`6 zR{x3i@6}JfzW3g~E#!VQ^DR3bVrOEa`NSl4c`51A67Oq0y?hS;TL?)6lt*WB9v(d{ zfl`&$i%(o%%4h!W_{8PpOu4yb{npBAa44g@M>JI^{yt%BK^AT0`{K)B!v4AjLk?Z{ z#I$RJ>nj%xQ3^FCroz$u5MqHr{UQ3wpFj7<9SI&KR2jC#2)iwz6U$1riq<;m{FS$( zS0Hg(>~=-MOjm)T&oe*gts&fjV5sC z4-dcBWxvUVo|jS@8k4!|Bcr4A4Gq|s_vK%{_<~MM%<-5cvuNij1he7cF{QMI)va$y ziRJ=ANkT$NN-2VP*BE37G3^_#?hFpGh>FI62U=T;}vWq;y6ui4~**S z!c0wK?Nj;CQ6$txDVhqcz+_I&1Mz}TgoVqqvNjVFyUWWJSk(OLJ$3NOHkP-nnck07 zb@zEtk|eq=w983JRr_OFspltB=S|7)Xxv8(-W08VUrM9nz)3%A*e)wtJ33}YMz#~_ zeR}6ynJnl?yZnb*Twh0CLV}{N@Qs(QB@)5<;T zS?tdSL}#CPoQc~OrFq{(*_?cV z-yg3GTwG$4wObe?Ue=@NekYO&;C%*XpO381?k@oL=^>5TYrgdxMy`PvUNSXZgUjQRIF%lX=ek zF?^uEn>qW1jFVH#^dB~1;f|wXOmizMdnkKM2fhuiVo|2a=Bg`k^Ny~_`4sBDLPPP3 zl4->xQu~~=zOUz#w$KsX(n85STT$uU)f1gSB!zXCXMTb2*n(D-<2T)5@$u!o zJ!6i--CQ+=#Y4{c7e9?O5g&=+u5Eq(1V4Yy{Qm6VuKmhi@NNO2umeSPqR_D&4-byh zDH{&G`b4@sidz0Np*C?GKSk4vqp6g+xpNjZ`H5QRFdR1w?vb%d?S^DrimR+2YqRWK z+@`PXMc#2}-#8C70v1=-&09?1g{>XSb)Gtz1qJ^$KHU|zY_oV$qkD2v%tODVX=b*T ztz@MgxV;`SIk`m0(jOl)jEZ*7<<9uF3`q~XO?$HAQLn0@L5PC`wP|yU z`qBDbBKpX${OG>_mc7uio&<{Weu3Vv*Qa1t=tB;Ts;zx`pauaA^6zD(0PoFxNI<8U z_zN?OsHnR}Ow7xj6=klJ{-UzS@0=-x-H!OvpSZNr(`0T;SCB5ywZE-?wy^WZ^R4t#Qc z3w%Y45=vUsxcT`+t;&+heazHiCyU8U#2uC)tLg z(wH)K^77(zsWowpzq zUl!jX%TTi8l%OPyC|p_!>xoYb4EWaIHs)=TOT7}+OL*h&a}eSm<))|eKwb0hox$_& z+^{hAr9%B9i!{{qd$WPH`QIQpEiO`CpY_ak$vRw0eQu4Nr@G|jr4q@LduMEXmLgOQ ztCst$MLG@BT|dPnwU$xBO_03rsgO}wU|@*Q(%+}0Us_&LV`hBuO_6+cOJuUIuSC>Z zs(3B@@3}1jfjc@nKLdj__B}lTLqF?lEA&8ORWcND$f0NFfxLXG{vy0zsFK29-d6{Q z;^Mq&X@vw5f+{&U;qnm-GIrjqD_h@0JfWt%XMR*XU?Xuh~w0 z@&=m&vzC$E>^l}GB4oR}6IvD8C8eY!c=H_XZus*Gb`e*Uq&Rx&M4L197vPCyWn(nY zR$SetPEQr${IsNQjEfjfL||dF?YfsmD3KB|DtRPj@?sM(IwwV_ETnIGqa=^uKWLR}QsdQ}iI;dXU90cE*`@?0Hi3T{M7V z>1Ol=YZ?Q#TYgW-PE~BGxVs-Uc>d?8Pen~eibGi{xA&*E8qzK%(d2Cuev$`=>hb$CJ{=`L5umC>m^~(0 zXbagpIY|c3$;~AV{q(qK_IRstx!wi0X~%=Vq=Z>5kDt#hLPD~YIZ`KYUM@q0OtQ@A z76zU?SO_FU=nv>YVAEOqQox?^H`@&Z#`O^@ zSe!U4L1g4Fj*sh=3CKlf9F8{ZAjyYV&f%+3-^^2RhPe2#uP+`f7w@a&dxhUF`)gP`~E zO&<4Z+wJ%xV<61k%uKnRk@35Cf773aNM1{pQPJ{3F#h+qC4po`|@Q6*fXS=(_h0H(QBARXOrYe_JxG zXqz~#5rkc+Nd7+yl9H;0H6*BmdXM-G;@BiOC@p0@Ksa+}?jm5OmCn zidvzlT$0j;X!}!;h*IF4O7lJj1c|O#t-4PqN4vU zDK+I2MnMNN(7Y<4ODG3DG2e~_$4)#*1$-f>~i%f2xtU62s} z>W3LeM?^3Pq*#uBbO!ev8410*N{22Iv~`Y-@FpQOIDF;*=oboO4)p<)(_lBu%-w9- zX0_%c1Ua7WcfjT|pf9?DKbjU|7-md!C&f}jwizby5%+9?2JW}~d_0N<6=sTDgQyw; zw8%QJjUTxdL7{zB(4d3zI5RV$u<(QAW_>*Z0(K;r#{ug4fK<*8=3oz6Qe9dDn5f^s z2b?xOrU*J3Ln-X%%)Ue$%7pz4xdXMeL;njjN+29Ps-@-7wJgkGQqYO22165T1T#j* zSQjCqOtU|>wtf}M@5TNc2M@9>_J(YlYPQN~zWqe?zFgO~cCW0fDw(882kO7vyu7Qy zucpe%tDBoTkUe(~9c`U>iJV_FBf-U`gL&^H4O1~X z+JCry?RoJ1WXE9pHYRwAs<&jvj1RRvW~7Ze8}GAk?pp4+AbY0LBK zB6xQJEkr1JCi)1@Z~~)xvoLv(KtUAG#2~%5N7DFik-*-bE8K(10nV|)BV+f|OW)|A zt-};nJw08KDJgw_{;*{$QNj#RZ~b~7^%L@-v2jek_JeQP*-n3(F=%MIYMe(^A4SYl z4c?gR;UQZ*hpD9G#s1$G(>%Go-h@%(l7m-%9N-fN=vn-8UZQ?3`){0NW%C09N^*1k z!Jk7y{GmxvmDxh$1I|$Ues{G$#SRAcbbo;Ek*$_EuL{|xm!Ix_40n0REl~YJU43M1 zOoZyEteiyzcpK5p=%h8eeii^ zc^YZ=hBI^Dsuo<52Xb~1*Oa71Sy@N_Wc9jk(lW$DF0SjsMhX*?*rbG2$jQ*E(#7)> z`l<(c#G4Q-|+Lz|Jg@bLk6-jgToE2}xdLXUm)7kp(lz%ig@*>JI^ zp{2F#kI9ln7fukdaZ_PBI1M&j@-9u56G?}&$IS%((cr43Rb|W)ux~Ha;F4eMIQBVZl#j5y3c6wRkhzr%1<=gc6m$vJp`SS%B zM5w4C^70k=y5v`TCQ^DLBE`dsnl8wZo%S&mAe$b2eP);!@9X;@h<43$Mf=!3z4CL( z9zUKe) zU@be_6IteZh+lD8$3a`v=J%==v{8~!r_()?eoe;UvI?i%@2p$rYON*^7e_`$gmrpa zC5ND06FxwTA`b0@)F(``GAG%!wb2$VUAzV<_F2eT{PhMlHjTD_CG4bkDQ`rbhmZwD zM3#>>lM@pm3o6_T=R(7F9|_rNp{J+EdnHaF1zg4C@dYZ4a(PH-D507%-m5}SUyQ@{ znym8AwiXP^uc8^D%@j_SBWm`-(Q-q~lI~%uJuPJxf5}s2yW#0-23EGvB4sXCR;*TX zToA{ocq8UJv6&D1hO$MQPt_Q$sJ^ zTL>z-o4@XgVkr&$U@xgXvSzqv!rV+YEJ zpP8R6WO{=X6cmJXVa?xRZ5FAh!DH@%;mj>^cj)Vn zluJNU7TQBuI5MzvtURaO2V+P3Y42 zzS6|A%~vmsjf<OuSZftHAb77rWv(wW*(@0zTUuvl{s&1|GK^LGSpu%e|gITYwuQSlm-6?tado0Y# z9*_~3P=3rg_3G_i^jxxJ*WDku%OSnJ@-#G=Mjc`4j5Q9cgRr(ODmWQZ5-s)|%~nd| z<>7ht;zdzqr55nK1f#OdHyxn4pRW@aobED};uyLqDXRBvv%h(8o*Mdl3p0^0Eg ziZ5Tj{CB8{-au5W@Xx)8c5c@f!yR==?x&jT;aY4%gD3DZ%F2;GKH_$ET-;crZ5pIV z%U|YRlgxft0nHg8CilZNLVKj-xPNjQ%VaqSCdKeO@4W$iT8F7+3=Z)3hu0wjI!a30 zeMx+E&%X_=zIpQoPz7=21E7ZBwS%CJp(>fK;Dn=D`tfeQ!gcXUm)}i$DJ6Z=IBYlUu`7)OUjHoSe7E zTYtdFz?g`6Eys^GrxJ)9caEtG#xb@JcYT9t+QgL|n*HuX(<>Naeo&{Gqa;ZFx-0y# zh-em6@BS2_3Hm*AbFy2^Z9WbBm-BFAz@LCQqacebD;ERD0Dl>0Wn%-_hdJ31h?q1{ zFHZn!rl+S(dg6j;XJ&rp&}2hmfy-T*iin7Km8u%wj0hBWo2_Z4p+VMOnWKv8H>*m0TSt;4U{ORtK>+|H|k;h`0?ZXczd9~AFQDf zsw@Czz@rl6<~O90^|*aeXu7N%|2E$ykb<}aD!MF5r0~+qqPoG;sK|x?j zZ<1z0Mk)BI+HggfV@W6|u8uafmP7!of_m>Zb8Ilx$J|_&qp@2Y5W4}jc@0F>QeV>I zBHclt?e2Of)8og(eSM*)kYg7O3=DuLt9RM|_FZC280ZmlA*ZbD>|-;w3T8Q~3RfmZ z#m zcI324e%rTbo_*@Pm{r-B2FbGrHUZP z7_Cvq03oigucO_*UGH_B`uwYi+mYqf#c6Mpi&dn}OX>#ia6Rcav@oL_x^+O@l%}UY zF#}<^6u$ zR>#`9Bf7F>2pyB8ui#c7F9FchGSlAHrm3lEkP>Z6;xi`Rlv_qYF6ni3n%&qaI`&jn z?AF>dC~Sq>j}b}Gn*;`QoF34nq0!O%ZaNwo{5CUBzykmVgQ@~%_f1z_MJFFKZra)I z`bU!izz%+W5eMJB+^XFM=q(|nxIG~nbY-*7C%JpnGZe&$iHW+px|Wwn0*y1aKcqvXFLiXR3=E3FUpB0OXZ-Yl8=y5fAkU=2GNwkLBHvyy zJT#Ptn|pn0>wZ=uUg|u0)zm)qJV9WSzMsFpLNdQH%$I_K)qHEv-@ku*tASTd|CAezGNuafg@L1O|=V}KsAAcgv8jWiZb>AIs0+b zJ!;esTpni*6>-LGmGd{jCG9Uk11S6Uiph`&HzrDp#{lJ1FVtPsMqRWcjU98~YA&Sl z{F!H;pPxTrEg^^AVAWsYjpF%C`){kjn_lA4sk;_q1twblr;v3Ti;5zuv&zd4f#$qD zL1wCq?hB~m##CjveB3X4T*Z(>GpMJ8{lutH{yS__)`3TxpKo@Io3m=>jaSEWf z`pLUEAbQ=ZJE!h*Q$Honq2c<7$;ime@emb7{u;tSh%Ipue*$fFZ||Lrjg4IgGJsh( zU~%gQN$R@~9?|mh#+?$}Lm<#`Z?LUhZ;K6tx94rICpUHG|Amac`OtrC*PklBFbZK3 zBBBn*`ya$lE;Pk8tL4Of*x&mwJ{ME=liBdt?tuw7cGXb?pAWguhG*#GLEBO;r=;X; zYm1|%9Hm<5N!{XxJeWI4NHjJ)!UN3C)TAIT3aF1lLT?ii%DcPq>6LWDs8C2kZz?!y zEYzl-Ule3>v{nocoIF$i6bD6I8ATkO zF&GE^dxcZ&i-k*d)-f9dwH!SFDYu|#5 z_4V6U)(aV5q7w60b&Fgl2t83PwrPwBHh z^8o^ur0t(3LNm;CX9m{R>MznylK4u;3PSZg9~cCYgg%qT@sp$`A+^wWO_Gqbo|Lq% zsrld@WdTdsicj8$T>kpu;b98svw$R$oP2EjsJJ#Mj7mnG=&pE#=#|EB<_&vQQ*$3h zTrpKXm8->kLnHbMoftvoR#(4SpxxE1=`Bxx_dy0BVfkdMWT_}}m4^^GE{N*K)?4#! zNA)bNJr>g-`+yeRR6>S&%Y^f)zDgpSo0*vex{oo*+G3ep1O$w9bd9*^C_I2Qs_!qfyUp8yu9NkRDnb_-JeUyvb{KXi!^EEj6(?8*u(A zU>6LMJlHJ`yg)_ARv{DTB3`*Cs$E<*O-TG65Yi`tDNXucu-d(>_mvs5>fM%)GIjz2 z)KJ7%9NKH0(|mom?l2f4yyc%NKc-oL-pQkcUQc=k92{hyx$SKN!t&QrQt4^P-}9|J zkMce#NhSPWN>5TEH+0?oolqUD})Wl`Qp+!;nM=k@D57t{j}8 zV4^;fu|okADl|Xnll=IZP+Yi;D-&HK-zG_#L}#2DAQ>X<~~jhJDIFpYA{tMrKmHhecTcxg0U3=^%L4K{?Y~ zDj%-zob%c2ar^mk+C56e6)9zy?HC}}j<+m$dELhH&y${SVq+im^!@Q#`9;mbVuT_d z$7=WUNA;Tr_4BAGtc;^W_?V<4=94^18PCtL6q2GUj*520D>=**WQ zMnxu6@&2#Glx{rP{iFBWGwZz!0|}kRgFjxWI&B}VY0V)JIm+7F_(bs!$S*hcmwBb7 zOQA{Y3Pbra2H#nGV{c#d{d=+{K^CUBwO_wRzNk>q(BLucPiqNW2MRoNbJ7LaI6coG zuf43{i3#`ZnQGuIBqpdMxHu2e#2^$Q-x?Sh;nAxpdjpCBy02egp@Z}F!cca_9sB@R z4bEZ?f3LIQ_Co<#l28h~J=-Pu+#vkGqp$7=Z@-oRywH#Dqkzi+P01V4Ar-Q5X2Y4( zQ0sYl+h1b-qUDpsL!H_q2@R(HmEQr*+n$+utQ{@^WPH{Dte$~HaDF^{bF$n*`i;rO zoa}7+m`&saBz3zJx1&7Eksq9ZWEK?><}sw?)j0v`zm@rOooiUQhnnS=?ez3ZJzDU}^+?-+Un928M&EsZ(3f``N&8 zV|?DTM!U}S(EsEFR8|>UMWRk*je=gxDwD#sW|a>f8k~ z)6*TB{T_li=y^DTLPr-=`>^fRn+AaFKj^lqT)#Cm&^>+} zE08z_Z{ng9mtXQ_Kg7GkqOOSBL+oK?m15fe1RY!P_wdV^k~X8=dD(i>&Rd-Tt5w~g zH|vEQ|Nhm9db+RnCa7K3VCb$!pfumpYA zW)}9}SfSpHB68L)k=N7P{FN@H=Ow%uF1l5qiH}Q?c(xE;nn0BB(;Jy+cO2A(fz-?F z$jAV*JyO`#@TR=H@9S5`jM>KsF~-EC9EjNU^-4+!ds;7thXm{`uTD+XC7OBl^w2tO zB#m0p|3u(iC-Lz`%d}S8E9L2u&m2d_`waW!@?U?*SjkakLc2EuZTG8qy`@rY3g+iV z9f{w6FpGF<8@~C*5C_F)eT)8=gan&~`A5KHW(++5QH@<&19o8CrzQ=%SCqinbO6vU z&~?XK^;}ky+cPsxQ6G4_;GnqYVd5{)?Zl5b56|t=~D}!hQBFTLwz-m zjd37U1@V3Q*%3Ym14Ai|^w#fHtoN|XPZp>{20B8?XWv9UwKH;a=T`-+yP{<8-w&7% z!z`k~y8}~aZ%^uR&hJowe$+=9#f`+uM)k=3;*Rk`@$XPU5Ww1cal+ z2gB#%-2)Ug6q@tHW}x!nEf}GP0NrK0ROi#JPb4HfEUUZ7tggO_W7`6+C@Vt^5@P># zYi;d$t&9jsK0!W1}Fv zLFNGd8)isVMfWaA7N^_MxJeIL$0yu=4lY@toZ8@)wZrv97$~qMpa8E=7A#M4RobzB zUx3Qjh zLLkjr$uSYP6s@dO-QD}Y$|>p9|KQ~t(`%eD`AscUe8Gr>;{(B4x3PhXDMuf652$8e zEp1vIZ&q^uU5G=v#oiVaJ}^^r7*$^0HBpKb<&NgjiDPAC6xtDf)2A0RuBkB#ry%TT zGnoOAJd1XFk!K4cjx828&JDKnEfh#a{&%#0A*&-HDMAt7@*-5l3USyL84-DjQt7z< z)p?twKzjnT6hwpvh$wb;3GwX0R+g5|4v)2p^fR)THM(3-#G_;#^~ee)r)t5)6_aJY zz37DRLPOzinhRAi|DxSy5VmpLK^f92Qj+Ek>~Vo^pSjJpii+<(E8;SvxcCyp|D7F% z+qWqL?v35Wa@adcZ9OWr)BmEZ5~bBRgw%+L?C&zWJH-1#O1h8shi1hXVPlE& z<{lQh?Zy5;7G$aZWUdLw{{$W%5XMwlH`Bj0^N0Q+&G{V}B_*p9+duz1ni~I;B0dGV z9IdL};EA56CRgfu3f`Dsy@_aOLZ1fSXVcqq2SWEYrY|%MjyDpxT_0oVvymG=X^Vuf zMOogk1f?&iDia~L#>3}4U6()(p%zH?(+3=H}1m!)_y1Au1`Q##nwqi(LOANem_4G8KzdL52tOio0i8f9 zO@u88Fq$eOB(cPpxY0jVyVQb$3oU^I0Mwoz4uPs2pCW`vi8^v_;$0WD1yfkrrws>K;W!)u5fF&G0I zEzog$2z%&op!eLKt6rLsks2581)R)mNt?&6p__t&iCxESgb-Yi+i^p+htP7op0z^i z#X1mouoQ!CcCb)^k4%j!*;~p9C9!CRBy!=zldDUHRg#nk-VN&;S#99@bF1$QyF5Rw%4*#nOO zE%nB&KmJ>42>&GC2%NXH^zpwga9vGa5Zrs8JVT%&FO@Dr5yb!QpRUIE0-F{XO=MIz z!;jB2=j5UdFMoiMCs!W7g%TCEB?ZF<#53S~RAENiLI!3U^7$a{R@r7$9zzc{Iaz-f zfgqQ-c`kq^F+xJE3ICPv_nfyF7&S!XmzEF`tfs!TlrCmG^ia1merqh+Bp{gR@BcNO zk$Gw?_ow&Bh*YgJhbTMye$xl_=g;?GwGu{gSX@dqFSq`T zSy~%OEUS=xD!eboxFz0NCir^UM-cO$L&9p+5F*f2n6>#nj*b72tr7Y)?<*VQ+X}AT^RckAW}j zR3IH3)ZPB$W(2z}faC=U{mzHlBed0(ke2_cW;(|^J$?6&?|pqC16U6vVegrBU=`gp z2#Den{!bJx1putHw7O~mxgO2K&J`TkX0~6zmZ|};K+az-L-c%vgtzU`=v1@jn8Pf? z|Hs|`r<_>{y_cnIXQ!a8{YJjGR4HweUY>Xl_Paqpl&Zx@81a+n$g( zFg*G~=+aGKPxd{^{)u9vR-Gi}DQsQ(g)j);4RLwlg4 zOG%m5!1t~&vTKJZT$1#0r=miij-s{Lg?CI**zNJ$^E(OhTj$wBUbE=5QEOksoi1Ni z(Zcs)Zi&LC&S%ggj18C(K&Hk)*Z6uSbM*SzM|ctf?aaE?V-hxc`Zpi~8h%1TNPh1? z-Wa)rjhH<^rh9OpHQ>5RYix4xuZ;Zn@QVNc9^0E%E&}mIiFUuk|35f@DxG#eM0HQR z*1$D-9_K0z?!K|n>*>>5_JYgJckbLNC@27F40_@$&{t%42T3MJHJh1{5q89*qM*R; zAHyMKf^bCSqxg*YY3<3=NfLWua(! zt1lE4G{2^@r;d~v9vjnxXF`~m&|NWq20aR!;>l$ui$VKY*TO;V!M#1F!EMg?0LIx>LD69#DPd5Em7hjQW z1nuYL<%NZXDJ1d!Wqm+EQ08%d1dPMRhUKG#jqU4gs#)0QJ_8TD01?5?Znwyw1-5AW zDqOD@HbzB9!#zcU9`X6}`>kn#i$yx=|GSWX-=cVa-jI}(^bO69IoZ-)vR2c#A+s{r zgiZY50h?~!=WS+mUl0#WK^)W$nJ>R1p37$cg20567*^5XP1`Fg#C+D;E-nJ=+Pa$@ zkoX*>!zsx5tjQE3v|AY2*c|Qb?CkAXm~IX`XJ=(t{n{pwlDo9@1}?6D6;Aa0`SWoLG_*iKI`j+S=_m^;D<2!5 z%)S6o3Plqy&6{n1ZG;7MOPHUG4C-6AKEPnSA?`IvOiF^i`2u5$ll+#XCT<`lb!rlr zCj0yQgHi_fJooyx?jc@Q!{`5=vQqWpr~ml}suAhRcCQ(YU&z1vcl67_SpLl`}2JIDi^;sQ5xvDr6hXU`iatu zz3~3ed){LYyd6ci+njdQHA{@Ud~TstwFfj(&rZ@YFr1&B!e-3ARAC`@_JYz8;NT+|4pvrp*oVBhc+6iQxC74ZNBkig;s9v8B75DBpl2^^5-O9OoB&CJYB05#g&*x*$Bg`YX~w*(=bgRg;tJX=_^qP6dV&W{n%`f0+t@U@8)J7yh3%&O99I z_WR>gDM~3>Lx{@0X3JnGOL-K^zL)HbJv+sN2rUvqwuHtmF&HW#VI*M~TNoZ;Y+>xb zGxc1*>wA5#@8=KyjL&v|?sM*QpYuBJE>iD)g?(8{c!cX#fW*7@YCiXo`X3yeyRrMp zy>JSYs9}=#eES9}FT>FOe$bRY=_PZtZ)uB@PC9PAU7`^x|450SS+-4vo)H)gavd;ILQpaf!obTw#~RMdVT8cg~IL}TpN5T@M=x& zB5`kDDOl(t>yM;@9T2PC&CSh0E1C!0dzSQmzHiZm?Sik0lWh84@8XGjF`iD zq1X$?Okn1FLg?*{#F2mg1V2k@UpZ#@Nr)jfhY2(*WSmZ#v+Eo>bjW?Q0ZNQ66Inwy zxQsYBI5svmD44V7&kqg^NU1grspOTjH?*{9XFq}{NC#uj()674;1km z+EKxjukG!CD#aED?TgKU=Y`U2b1jLFPTKKn*6Y{j=X`B#b3xQ-cljw5q7sa~>*uGX zp;3NaOCQ?PpFMxhz@xGa&{a{Tzbu1shc2wEXwU$noX!Rnqp39a1g?vG@ye@zCwMQg z-6{S9m*6iE1{>eJaVC`ABFr-KYX(ym_k}5@{rdIGw9+0HI%osdP*=CH<^($sI|`Hg z-8BP4L#c_@Od@|h{*PZzcGm#&4lK{PXJ&5R)YN1NF*JZqP>=?DT66T(|G8xq-;<&c zRC@pZzO_qNuR?7An6D}Gxt9u2*iAs)Hn^Fg60Upo>M2xcJr=tG!@h*k)7O`B{w`== zy$(fN`Wv3zvs<+4*?Njdr0MjHLIc<>j1Jdx@Tfh8k7H_PcDu2Fg^f)ws>Iur*qCqZS!O=$T43-KzD?uy@?XBbs{r{NCa^`z#zBXi z_nNwCtxqAZHM>3^$*sP0SR-0mUPDj=+(}DI)If7g z|8nqU7SmXuH|(990_F#0=iDqT(vy-5gMyG>x~1t^MHRfKj((~0O!2sWjt3PwgbS+1 z;golUgB{djn^rX-q65zZDqyZuf`e`B?H;)3lwo?1=nCCl(%PN@y&Q#1*qL@d;nylE zF5c*i6pMp}9#*HUtSs;)aAalig1@z|_S?oP9E)T^;C-e-M;^|Pmo9IvxC^b`cdN#-X{rx4kh8BhU zT3hqs3YC>Bz(PWd>Y7)6S{n4TydfqM6`h-#>*(xU1pypz(tqbGSfH{%UI_R(i0lAY zgoDZ%b)-l|Gn^i;JzR1)Ixmj|qC|j#rQGzd;x>1(KrzBIf-}%B{0=Bx2e4u`c?#)l zM->EaTMB`q4v{+5fM(ta-e$)r7eDCcgO-{ml*xK42G<~x2V8VQW`w4-W z)}d50Kpp~}%aonMz*Inrc(pCMbzl_no#UFFe|4KE+7OPVT^Yhcxa!UFg^u>RQLY-|k?^hqyQtK4ou20w|a3ejk@VPTs-nO*`<>p}< zP6Wbdwk1AoV}n*@yX+Ek} z34R|*zuLG>0tD_tj^L4S3T5K>TIj&7rf@#KOEhXl7#9e-T1RjKO3C?Nda(V?@;Tqr z?>*%Tns?4x(UvD@!on?WBcAU*Rc>NQT`QB>j-V+tu z=HDl08 zvhtIs6`1nwaRvXLHs`9<8FjAcGndJn%9{>&ez~+^=PGx?;!=g(Io7{|!Y&wb!!$uW z%PX8|efw6P{>T?sxw=mKg=J?CkN204M`9V}gl5j58cU4h9_DyVejXU8tWHOTHFx?X z#Zo7b-A1ST$VK0uPlrc3EiHcqy4|=D7bMTEbA`R1bnkIQuXAbf&gkUiX z-_juvUpWsP`o}uJZe;Akfwj4f%Ca(>>L!(4%4JxDhH87y(1jae z%88K#f=8kdlJ~v!i~1yW!&MFh;!QUoZGGmgnZaHkKSnNv^Ey^>w8kjx#H2o!#Osg# z<1@&}A2m7IQCL(2(U`N7v=Ms(^|=*t1WU|~IhbY2vUo`iTZhgHw3e7wF8u86o9WpK z#@1BEFy;Cv77vSyn?FxUmhZP&+#=W24p~fe=Sm#okWqaz$r9e`u^%oJw!1PKwzqYF zC$#4F@?>|y6O6Gtm%?IaW!LqU^@aW)G3%o!Ao2${wrMLjHsemEv5NZts_K6^hC^5*ghaiy)z`F?l+_zsrMR@z<{#K>2TNCjX+} zNMYCI&@JNAH*d_6sxS(}>q!doH03XSx;t#R)(C4Ns= zA#tms(F#(}(9m9N%uL_`&PTO-yJ}&Srke{5K|epm(2rP@YITF`n<}HCB5)H6UuS*o z>_qB@mb#DzeI?_9;E!U<+=veFS)i-k)3n9^O#8_T^d@r@iRLp#$h+E--fg*go2rPpGn{gpn19nw5FFHHTS zylJbmC};O-^ho-7KR(OCEK3dQ;41B|Raa_G^ry+?sVu(d#d^M(=T0_@NYO$?!TALe>I6o6p$bfVL#a{CL)tZmb?GG^zzPnr-lZtap}v`Y-~b) z;vo|c|2^je8XVG6L_qCfMa2EuQ#}j&yN9@g36TKlf2`S((xeqhtq6Fa?y|M`21nCdUagd!vN+~lk!#I0U+J5J&?v{kzQJOMwXix-m{(?{wr%8H7bkS$*2Z~u9p zZJsr|4R4mt zs#RQ^M!EORoE>S3ijHPuV_QchwB3ZKSfc-A^>FuX1kQ!lx0m0tR&!6=^&IgkxTi)IH{+)XHbyj_54gI2m0!J4Y^D5^gTS;h=a+L!C z;>E!#DjjQ5@4tj8ZTMOL9VAt){C`A_ls5aSYB7MbbHJyclDe&~sTp1TL8JbDF1e{W@AZ3>XVDp>` zp!mZN4OF8TdRStCr3Uwqq(z1fHHL*jGYv4hSFU_ck+Svj_6EgQE{PDh1N5DRxYg9q z32yt~W3T7a)6)~-@j2b=&-B(SWv>&pJ^Y+Obvat)!$Rvu(1LFUevhx^po4$5Gph zpgGFN&wrX9vVIWF;oUvd*^zf$?d(XCZHY+hH<079_@bfe0DdY2vV+mbIH%Tpl-`sQ zznCT$o;nIbrG5AAA=FMl=NNLdk3fLl?vK!h2OGg!?m3a)z8E%EO^z~hGBPH`eXtXR zWE*Jbw*HmF^uehVq()*PSqk#d-)@(ih(3oo-~ioN&{og>HFdxh^6u^YkCeufOtqVE zh01FLTk~o(&T~Q&HthK-SmA3zx7$g{<7 zi7!~okj-lx!AOUg{@XnNS6F|Bdkn1l5p+NxdCuoCkVvGHnwY{usZ^blhYWbpJG2PB zmkYXTe literal 26370 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 z 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 Jka+U;KLAAC_s0ML diff --git a/class_w_i_i-members.html b/class_w_i_i-members.html index 72f37106..3bc3840c 100644 --- a/class_w_i_i-members.html +++ b/class_w_i_i-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@

    @@ -173,7 +188,7 @@ Public Member Functions

    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -148,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onInit()WIIprotectedvirtual pair(void)WIIinline pBtdBluetoothServiceprotected - pFuncOnInitBluetoothServiceprotected + pFuncOnInitBluetoothServiceprotected pitchGyroScaleWII pitchGyroSpeedWII Reset()WIIprotectedvirtual @@ -176,7 +177,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_w_i_i.html b/class_w_i_i.html index de0536f1..9de683d6 100644 --- a/class_w_i_i.html +++ b/class_w_i_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: WII Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,14 +99,22 @@ Inheritance diagram for WII:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for WII:
    Collaboration graph
    - + + + + + + + +
    [legend]
    - - + + @@ -327,8 +336,7 @@ Additional Inherited Members

    @@ -287,8 +296,8 @@ Additional Inherited Members

    bool checkHciHandle (uint8_t *buf, uint16_t handle)
     
    - Protected Attributes inherited from BluetoothService
    void(* pFuncOnInit )(void)
     
    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
    -

    Constructor for the WII class.

    -
    Parameters
    +

    Constructor for the WII class.

    Parameters
    @@ -384,8 +392,7 @@ Additional Inherited Members

    getButtonPress(Button b) will return true as long as the button is held down.

    While getButtonClick(Button b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(Button b), but if you need to drive a robot forward you would use getButtonPress(Button b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(Button b), but if you need to drive a robot forward you would use getButtonPress(Button b).

    Parameters
    pPointer to BTD class instance.
    pairSet this to true in order to pair with the Wiimote. If the argument is omitted then it won't pair with it. One can use PAIR to set it to true.
    bButtonEnum to read.
    @@ -412,8 +419,7 @@ Additional Inherited Members

    getButtonPress(Button b) will return true as long as the button is held down.

    While getButtonClick(Button b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(Button b), but if you need to drive a robot forward you would use getButtonPress(Button b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(Button b), but if you need to drive a robot forward you would use getButtonPress(Button b).

    Parameters
    bButtonEnum to read.
    @@ -465,8 +471,7 @@ Additional Inherited Members
    -

    Used to read the joystick of the Nunchuck.

    -
    Parameters
    +

    Used to read the joystick of the Nunchuck.

    Parameters
    aEither HatX or HatY.
    @@ -491,8 +496,7 @@ Additional Inherited Members
    -

    Used to read the joystick of the Wii U Pro Controller.

    -
    Parameters
    +

    Used to read the joystick of the Wii U Pro Controller.

    Parameters
    aEither LeftHatX, LeftHatY, RightHatX or RightHatY.
    @@ -524,8 +528,7 @@ Additional Inherited Members
    -

    Pitch calculated from the Wiimote. A complimentary filter is used if the Motion Plus is connected.

    -
    Returns
    Pitch in the range from 0-360.
    +

    Pitch calculated from the Wiimote. A complimentary filter is used if the Motion Plus is connected.

    Returns
    Pitch in the range from 0-360.

    Definition at line 110 of file Wii.h.

    @@ -551,8 +554,7 @@ Additional Inherited Members
    -

    Roll calculated from the Wiimote. A complimentary filter is used if the Motion Plus is connected.

    -
    Returns
    Roll in the range from 0-360.
    +

    Roll calculated from the Wiimote. A complimentary filter is used if the Motion Plus is connected.

    Returns
    Roll in the range from 0-360.

    Definition at line 120 of file Wii.h.

    @@ -579,8 +581,7 @@ Additional Inherited Members

    This is the yaw calculated by the gyro.

    -

    NOTE: This angle will drift a lot and is only available if the Motion Plus extension is connected.

    -
    Returns
    The angle calculated using the gyro.
    +

    NOTE: This angle will drift a lot and is only available if the Motion Plus extension is connected.

    Returns
    The angle calculated using the gyro.

    Definition at line 132 of file Wii.h.

    @@ -671,8 +672,7 @@ Additional Inherited Members
    -

    Set LED value without using the LEDEnum.

    -
    Parameters
    +

    Set LED value without using the LEDEnum.

    Parameters
    valueSee: LEDEnum.
    @@ -722,8 +722,7 @@ Additional Inherited Members
    -

    Turn the specific LEDEnum off.

    -
    Parameters
    +

    Turn the specific LEDEnum off.

    Parameters
    aThe LEDEnum to turn off.
    @@ -747,8 +746,7 @@ Additional Inherited Members
    -

    Turn the specific LEDEnum on.

    -
    Parameters
    +

    Turn the specific LEDEnum on.

    Parameters
    aThe LEDEnum to turn on.
    @@ -772,8 +770,7 @@ Additional Inherited Members
    -

    Toggle the specific LEDEnum.

    -
    Parameters
    +

    Toggle the specific LEDEnum.

    Parameters
    aThe LEDEnum to toggle.
    @@ -815,8 +812,7 @@ Additional Inherited Members
    -

    Return the battery level of the Wiimote.

    -
    Returns
    The battery level in the range 0-255.
    +

    Return the battery level of the Wiimote.

    Returns
    The battery level in the range 0-255.

    Definition at line 968 of file Wii.cpp.

    @@ -842,8 +838,7 @@ Additional Inherited Members
    -

    Return the Wiimote state.

    -
    Returns
    See: http://wiibrew.org/wiki/Wiimote#0x20:_Status.
    +

    Return the Wiimote state.

    Returns
    See: http://wiibrew.org/wiki/Wiimote#0x20:_Status.

    Definition at line 189 of file Wii.h.

    @@ -966,8 +961,7 @@ Additional Inherited Members
    -

    Used to get the weight at the specific position on the Wii Balance Board.

    -
    Parameters
    +

    Used to get the weight at the specific position on the Wii Balance Board.

    Parameters
    posBalanceBoardEnum to read from.
    @@ -991,8 +985,7 @@ Additional Inherited Members
    -

    Used to get total weight on the Wii Balance Board.

    -
    Returns
    Returns the weight in kg.
    +

    Used to get total weight on the Wii Balance Board.

    Returns
    Returns the weight in kg.

    Definition at line 1163 of file Wii.cpp.

    @@ -1019,8 +1012,7 @@ Additional Inherited Members
    -

    Used to get the raw reading at the specific position on the Wii Balance Board.

    -
    Parameters
    +

    Used to get the raw reading at the specific position on the Wii Balance Board.

    Parameters
    posBalanceBoardEnum to read from.
    @@ -1070,8 +1062,7 @@ Additional Inherited Members
    -

    IR object 1 x-position read from the Wii IR camera.

    -
    Returns
    The x-position of the object in the range 0-1023.
    +

    IR object 1 x-position read from the Wii IR camera.

    Returns
    The x-position of the object in the range 0-1023.

    Definition at line 311 of file Wii.h.

    @@ -1097,8 +1088,7 @@ Additional Inherited Members
    -

    IR object 1 y-position read from the Wii IR camera.

    -
    Returns
    The y-position of the object in the range 0-767.
    +

    IR object 1 y-position read from the Wii IR camera.

    Returns
    The y-position of the object in the range 0-767.

    Definition at line 319 of file Wii.h.

    @@ -1124,8 +1114,7 @@ Additional Inherited Members
    -

    IR object 1 size read from the Wii IR camera.

    -
    Returns
    The size of the object in the range 0-15.
    +

    IR object 1 size read from the Wii IR camera.

    Returns
    The size of the object in the range 0-15.

    Definition at line 327 of file Wii.h.

    @@ -1151,8 +1140,7 @@ Additional Inherited Members
    -

    IR object 2 x-position read from the Wii IR camera.

    -
    Returns
    The x-position of the object in the range 0-1023.
    +

    IR object 2 x-position read from the Wii IR camera.

    Returns
    The x-position of the object in the range 0-1023.

    Definition at line 335 of file Wii.h.

    @@ -1178,8 +1166,7 @@ Additional Inherited Members
    -

    IR object 2 y-position read from the Wii IR camera.

    -
    Returns
    The y-position of the object in the range 0-767.
    +

    IR object 2 y-position read from the Wii IR camera.

    Returns
    The y-position of the object in the range 0-767.

    Definition at line 343 of file Wii.h.

    @@ -1205,8 +1192,7 @@ Additional Inherited Members
    -

    IR object 2 size read from the Wii IR camera.

    -
    Returns
    The size of the object in the range 0-15.
    +

    IR object 2 size read from the Wii IR camera.

    Returns
    The size of the object in the range 0-15.

    Definition at line 351 of file Wii.h.

    @@ -1232,8 +1218,7 @@ Additional Inherited Members
    -

    IR object 3 x-position read from the Wii IR camera.

    -
    Returns
    The x-position of the object in the range 0-1023.
    +

    IR object 3 x-position read from the Wii IR camera.

    Returns
    The x-position of the object in the range 0-1023.

    Definition at line 359 of file Wii.h.

    @@ -1259,8 +1244,7 @@ Additional Inherited Members
    -

    IR object 3 y-position read from the Wii IR camera.

    -
    Returns
    The y-position of the object in the range 0-767.
    +

    IR object 3 y-position read from the Wii IR camera.

    Returns
    The y-position of the object in the range 0-767.

    Definition at line 367 of file Wii.h.

    @@ -1286,8 +1270,7 @@ Additional Inherited Members
    -

    IR object 3 size read from the Wii IR camera.

    -
    Returns
    The size of the object in the range 0-15.
    +

    IR object 3 size read from the Wii IR camera.

    Returns
    The size of the object in the range 0-15.

    Definition at line 375 of file Wii.h.

    @@ -1313,8 +1296,7 @@ Additional Inherited Members
    -

    IR object 4 x-position read from the Wii IR camera.

    -
    Returns
    The x-position of the object in the range 0-1023.
    +

    IR object 4 x-position read from the Wii IR camera.

    Returns
    The x-position of the object in the range 0-1023.

    Definition at line 383 of file Wii.h.

    @@ -1340,8 +1322,7 @@ Additional Inherited Members
    -

    IR object 4 y-position read from the Wii IR camera.

    -
    Returns
    The y-position of the object in the range 0-767.
    +

    IR object 4 y-position read from the Wii IR camera.

    Returns
    The y-position of the object in the range 0-767.

    Definition at line 391 of file Wii.h.

    @@ -1367,8 +1348,7 @@ Additional Inherited Members
    -

    IR object 4 size read from the Wii IR camera.

    -
    Returns
    The size of the object in the range 0-15.
    +

    IR object 4 size read from the Wii IR camera.

    Returns
    The size of the object in the range 0-15.

    Definition at line 399 of file Wii.h.

    @@ -1394,8 +1374,7 @@ Additional Inherited Members
    -

    Use this to check if the camera is enabled or not. If not call WII::IRinitialize to initialize the IR camera.

    -
    Returns
    True if it's enabled, false if not.
    +

    Use this to check if the camera is enabled or not. If not call WII::IRinitialize to initialize the IR camera.

    Returns
    True if it's enabled, false if not.

    Definition at line 408 of file Wii.h.

    @@ -1422,8 +1401,7 @@ Additional Inherited Members
    -

    Used to pass acldata to the services.

    -
    Parameters
    +

    Used to pass acldata to the services.

    Parameters
    ACLDataIncoming acldata.
    @@ -1920,7 +1898,7 @@ Additional Inherited Members diff --git a/class_w_i_i__coll__graph.map b/class_w_i_i__coll__graph.map index 3ea08067..d3abf026 100644 --- a/class_w_i_i__coll__graph.map +++ b/class_w_i_i__coll__graph.map @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + diff --git a/class_w_i_i__coll__graph.md5 b/class_w_i_i__coll__graph.md5 index ba3e4081..32ea2769 100644 --- a/class_w_i_i__coll__graph.md5 +++ b/class_w_i_i__coll__graph.md5 @@ -1 +1 @@ -1b7a2243a1298a76ff060f7fa6c3bddf \ No newline at end of file +e2fa40aab171687d763b41a969505c68 \ No newline at end of file diff --git a/class_w_i_i__coll__graph.png b/class_w_i_i__coll__graph.png index 49cffc9b1eb1c9c15f85795c6837022e18a8148f..6928eefcaebcc01fd451b2da8ce5dd1ecfee518e 100644 GIT binary patch literal 15516 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 iBUU*74WvDNfIBmwOmb*D76jXkAupwsrOG5C? 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 - + diff --git a/class_w_i_i__inherit__graph.md5 b/class_w_i_i__inherit__graph.md5 index 082665f3..6b41428e 100644 --- a/class_w_i_i__inherit__graph.md5 +++ b/class_w_i_i__inherit__graph.md5 @@ -1 +1 @@ -274c2668d752a02d95ef3bcfd0e20596 \ No newline at end of file +0f2ab569d0b7006cfff8d64fe9f9fda1 \ No newline at end of file diff --git a/class_w_i_i__inherit__graph.png b/class_w_i_i__inherit__graph.png index 5c0b4aa15453ebaac4a4b713139fc6b1dd3fa0a4..5f2cbe2dfb3892dcf6f7953811eb16ef0d69609c 100644 GIT binary patch literal 2228 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 diff --git a/class_x_b_o_x_o_l_d-members.html b/class_x_b_o_x_o_l_d-members.html index 749880b7..d04599e4 100644 --- a/class_x_b_o_x_o_l_d-members.html +++ b/class_x_b_o_x_o_l_d-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -116,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_x_b_o_x_o_l_d.html b/class_x_b_o_x_o_l_d.html index 47a0113d..92761fa1 100644 --- a/class_x_b_o_x_o_l_d.html +++ b/class_x_b_o_x_o_l_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXOLD Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,14 +100,19 @@ Inheritance diagram for XBOXOLD:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for XBOXOLD:
    Collaboration graph
    - + + + + +
    [legend]

    @@ -181,8 +187,7 @@ Protected Attributes

    -

    Constructor for the XBOXOLD class.

    -
    Parameters
    +

    Constructor for the XBOXOLD class.

    Parameters
    pUsbPointer to USB class instance.
    @@ -231,8 +236,7 @@ Protected Attributes
    -

    Initialize the Xbox Controller.

    -
    Parameters
    +

    Initialize the Xbox Controller.

    Parameters
    @@ -268,8 +272,7 @@ Protected Attributes
    parentHub number.
    portPort number on the hub.
    -

    Release the USB device.

    -
    Returns
    0 on success.
    +

    Release the USB device.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -297,8 +300,7 @@ Protected Attributes
    -

    Poll the USB Input endpoins and run the state machines.

    -
    Returns
    0 on success.
    +

    Poll the USB Input endpoins and run the state machines.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -326,8 +328,7 @@ Protected Attributes
    -

    Get the device address.

    -
    Returns
    The device address.
    +

    Get the device address.

    Returns
    The device address.

    Reimplemented from USBDeviceConfig.

    @@ -355,8 +356,7 @@ Protected Attributes
    -

    Used to check if the controller has been initialized.

    -
    Returns
    True if it's ready.
    +

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.

    Definition at line 86 of file XBOXOLD.h.

    @@ -393,8 +393,7 @@ Protected Attributes
    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    @@ -424,8 +423,7 @@ Protected Attributes

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    vidThe device's VID.
    pidThe device's PID.
    bButtonEnum to read.
    @@ -452,8 +450,7 @@ Protected Attributes

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    bButtonEnum to read.
    @@ -478,8 +475,7 @@ Protected Attributes
    -

    Return the analog value from the joysticks on the controller.

    -
    Parameters
    +

    Return the analog value from the joysticks on the controller.

    Parameters
    aEither LeftHatX, LeftHatY, RightHatX or RightHatY.
    @@ -540,8 +536,7 @@ Protected Attributes
    -

    Turn rumble on.

    -
    Parameters
    +

    Turn rumble on.

    Parameters
    @@ -574,8 +569,7 @@ Protected Attributes
    lValueLeft motor (big weight) inside the controller.
    rValueRight motor (small weight) inside the controller.
    -

    Used to call your own function when the controller is successfully initialized.

    -
    Parameters
    +

    Used to call your own function when the controller is successfully initialized.

    Parameters
    funcOnInitFunction to call.
    @@ -680,7 +674,7 @@ Protected Attributes diff --git a/class_x_b_o_x_o_l_d__coll__graph.map b/class_x_b_o_x_o_l_d__coll__graph.map index a3decc59..d42fe55d 100644 --- a/class_x_b_o_x_o_l_d__coll__graph.map +++ b/class_x_b_o_x_o_l_d__coll__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/class_x_b_o_x_o_l_d__coll__graph.md5 b/class_x_b_o_x_o_l_d__coll__graph.md5 index 080b0529..c02a188a 100644 --- a/class_x_b_o_x_o_l_d__coll__graph.md5 +++ b/class_x_b_o_x_o_l_d__coll__graph.md5 @@ -1 +1 @@ -c19d30d5e649c9f2f16f4d7e601bbf7f \ No newline at end of file +3285ca35607fc26fc3c6347499cd29e6 \ No newline at end of file diff --git a/class_x_b_o_x_o_l_d__coll__graph.png b/class_x_b_o_x_o_l_d__coll__graph.png index 52ef466f7b98b9ebc4906a9527bf193efa0bceb8..e1f1ed8bad5f6f4aedbca4d8e9db5e5611e7d2ed 100644 GIT binary patch literal 9243 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 literal 10354 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 UDsC|kng}7%;vdCI-s}1QH=^7p%m4rY diff --git a/class_x_b_o_x_o_l_d__inherit__graph.map b/class_x_b_o_x_o_l_d__inherit__graph.map index 0a6c6876..aadd3be4 100644 --- a/class_x_b_o_x_o_l_d__inherit__graph.map +++ b/class_x_b_o_x_o_l_d__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_x_b_o_x_o_l_d__inherit__graph.md5 b/class_x_b_o_x_o_l_d__inherit__graph.md5 index 037a1214..73dafbc3 100644 --- a/class_x_b_o_x_o_l_d__inherit__graph.md5 +++ b/class_x_b_o_x_o_l_d__inherit__graph.md5 @@ -1 +1 @@ -98da7f9bfeb2fdd99a2d7ac6d8b06832 \ No newline at end of file +1eeb2bcd708d5b17ef18f534c5633a29 \ No newline at end of file diff --git a/class_x_b_o_x_o_l_d__inherit__graph.png b/class_x_b_o_x_o_l_d__inherit__graph.png index c002baccb6a6a5d45019ffa7a0563bf37fb6db90..3a601a30a176a9fbef2d224c9f93e24af9bfdc2a 100644 GIT binary patch literal 3026 zcmcImi9b|r8&)L7){HeGB!-H~5)oQd)**YA88f7sY+15K_B~`v7{zDHGBgd1y;)>z zV+pUZWhZ10W%*9u`+I-yU+~>$dCob%bMA9L_jBLZb;X*%?{a~JK}<|cTza}XrofmC z93E`Pfpf5fn=3G|q7ClqFdhBb-ZmDeGBI&P>*?Gu_sdzyeQwA*f3^j8sW7tSC~Eu2ZF_;$WaRmkGP{#b92XfdoSa! z$)#hqzYiRJ5JIwqM5L#s32{bscf(U@TT8g+IGy~WB5Aa26iO({$jC@Gy`4g#^!1r; zNM?3yuT7Hsi;WAQzZg$&W6dGj3$uG@CnqUY)txTYiH7IDYpCd}0b2_R#(GB5W`2Ht z9v#26g<^mHd{!%l^GlRaKPM?^C~YS0uAF5E27{YC^`&0bP6Ug%YvgtVKYeG?HovLr zKEA&^tQ7wF6fdu%vT&>)a3v!01h_Kij=m+CA|)fU>DOSaeel&vt^p|pQBhS5yflI# z#8Ia{{V}y_YZrn|?3*M}jhaWjlJc3^si_5~r7-vDSY6Zm_hnD9O-)VN*w`E&ru)?Z zk$D=g-L-aebMyE2cXwBa%Wp#4$!8*P+8*CpfNcD@;M|dM$==@H?|09;Tbi1hV`F0l z1qIyEj&!W%@lc29)D2A5t%Rf`K|VfnOH0WRQD$1;nPMXGenD@Exm=;C zUME;7)I|Y$uG8g;fz+$nj!ZA&Xj)p@%1A9QbGPe2kXDF?M~@Y}eyrOWzy8d|hLNk` zyHN1@1MGL1&#j%FsqqRA3`AQfS*s{;lKjS)u!sq1e*X2ucau>Wq&iALowC zHl74ZCz&!cGxO>{Xn~IuY7iMPW^XJd&V671Tvu!EofclzAq=*1T(9zW;Dk`cXoT#Fr za%eWz80h;s?8HePv9B0{W!d(8UdVVAin*zzsYy#g!MJPyLtv;p8C)K39P#q13V~Q6 zkw_Dhw*UgE+Xn|9mV>;AcF5=31Me-$^8aU+6*dD5hW^F$j@hLl-2CRAoxJb*6xG7Q zf;BwUS~C=YkospU?#%~x5EKX4TxS+OXm6vgt_}dB@HW6J&snXUjEvSv4@E^qd1RB} zMRorTsZ?4T%?bOv&8>EoLAW3*8%v)*d(Cg{tXb*6_wA)2pd;7T)|QuDO3mYT3ZORj z_K6|-<&~Av+)4eAsQgF%{#WzpKtCKT6ePtg4r_k~v+iYX?d&KZ8q|_?jZqSQkH1Gg z7^!g$XhanBejOaFw5@e>)@#^j=Di8N`3|O`G2&J$$j=WnJN+U%-<7}^D!STwUm>;S zmZZaV)Qe-0$5{DTg%Dcax`lniIA#cRCiMdVrIC@5r1{piw$8RT!@4rI<0uqrsM7wN z2HHWwH{^ByVtZ$rIGZA@hk}k|T-N?tbMi*=_;^ZeEDhMl$H8?^*tH~}%Tu?{XLq6T z_XQQk^XoId@nT3WHKiAJ@)sK*;P>X_P3xI@(A?%!Vj^cTI^fk zRe6NDV%EimF7)M_t0h9FB&-(UnGY9ORSIrIY&r^VLs$3NT6nO_q9%gN-n{Wl3Cw|K z8W!c3iOI3aq6Fo){DTu43JQ`k&`?S5h|`?(O61w6#KS8jJNe~b+bJ@}*ggx39(GaG zM39%rjfQbK(kIWtkeaf02|Zxx^q>BXopYWj(?tb5lIM0r46I`CuL+zFv0);IwtsJ)#TjoT!A6?gC;D6z=y!T!_sQhC?eov)Sa5^q*i7&B z#)-GBPe1S$gaqB3N#30}24d!f{!42Ax0`U11}yc}D{pnt+q45-F|j1^n6bl{41$cb zG$iQ)hdLj~5hg^XQWqB&`DQ~d-zyu~y=4n+H(oIUo-7iH#I(w(X4V|?A0q!Z;PCD| zdCcR-DEu&iK+vH-%zHlPt-kdAd(2(3k`Sj@QY}EJ?d|P*oAcATJ3q!Wg7gXJ-Lm4F2Gs_{Gr@ho~@tj)KTT-3~BGNl6F<@&S)mb!AYd*Gm}S{?Kl)rJ0$M znwsvlNE`V~psA^qll-gc`hR-r@?1wFe-|b<;MH>?_a%oHF_Mznf?0p z!oq^CfdM(tZLE&qzv=907#tkz<3qr?1Wz#+S5pBn^6`eI`3k^Foj!W#FeU+7W}2M5a+#n_nJQJCGngp=v5o5HDT!@DGPU%niUI+hyZlk zw7<~-V5?v2nqLE;VhA>g&7DA2f7GwG9aGG5nQc!8K91$d>F(|>FE4-G7%92H=Zqf~ z78b@}FjLdhyb#DZAh3XJW_QgAI9FRUMn=rc%+@m>Ja~|)fXvV@yi?HoNLjzI57&HH zS6<#}bp^S8%u-EJ(Q|8|7f@BTvB~l!2RrQmD;?NX9PLgg&39$*j0diQHSfMWla-S* zTJ0D;!jh4aa?ipdJvsTsP6D7C<}FU22J{?1K*oPp*r+s|S=@9l` D+icw? literal 3805 zcmcha_cz<``^VFFTYEHW&$cmYD@yGZ)QqAnZEcEBdn;_ z>>3Rv_Ewbd?R!2yeBb}T_v9q6lbmzkxv%SbUeD`s#~A2qQd6)}Kp+rmt^068@Qed* zH!>3NDWV(B10E#SI+}3E`Nb=*sW=q^p-It#s~G#eTh9(OcsR=0)e@z)y~WM0jIxiu zQAG1gFwfCi(iZ7qX#Wo!e%q+SQ0H>Z)NKb@J=qSFSKO9A$B^+LR7}|`iQ*UC*d={M z3U2ezPS&zhc8jRn8!LPMdUR*_4nAwT=C z^0E~|C@~>Q7*%f@nay;IS*#!w%2}+3bWHq^pipp^}>drlqse_mOZDj3Ov9|y2-xqC{ z+--YXRFn(b*wn=F;K73oaXX5>zP`DQjf9L0W-o7Vt;s#JG;N-+u&}}L@p}#&OiWA> zuU~5s<%Jd(7n8beVF{NZ-rnA1x^%e5kmcv+8{DRcXh{Fg zADrsLTD6lrYw)2iDJl7g!Qk@MqTJ3-{o$ILIz+Rk0EYej{g0)kYWn&#NGGRCtM)!nb6YgOgMHI~mWx$w}Gw?83srmENm(XeZ>=hY!4cISOn`OH22>iS!hdlu&kd z)M9TsOinHkUb#vnCcS%yVv}}3A^TMglpup8M#aZWv=k5lK|wa`^zd*B1qB7S_s-7F zw~2{Ap_R>l51wKxD*P-t;x*Koo13d`x@hJbyHb2-gVNE$Pd^xOGBBu9GKsK1Si@q) zSuLyL1wunZ>6w|wTaK!KK1at~=Ua#qZB{liO0Df18)JI-@FA@;UwW^VlhespS@BG& zp`oD+d4F-|7cZb39Pt|)E<$Es=(D6<@%V<2b48GGk!N)`GKWWz zcdf0h=hoIxTB*D@g@km)J*gSFAcjUp+dl(0R|qWEuZOEe(KwDhefo5JDa*ADha*Wy zNQjP&9p*&aiL<1nrfyGr4z%|4Py`-sT!kDR9YG*D!N-n};r46Ln|JO&e-tCSI%2MG z@AQhoU@)6K8l%7at<2wrCMG5bb92hPyu5_XO~lE;dO=T*cD7V!XXjoQSBSyWr))D{ zyyKPzauE$a>#W!ou8`AYAz|T~)!g7?{-$jlo3WXhUQtnzqA+K#KFPA$jprJgwx^rl%~Ym6t9U0g7=E}JL8NkSlk zG!!3n2uOxX2W=7jN8RwlkOMbcO;c00evZ5rvgV1QJ;*tzz>S#E#}VKRlU4S#GBPrb z_F=8IGVTjkzGurlZg4>&{{u7MtVi6xPxfL0`+9O}%CRkieDd^!rm>`izr^@IDzk^- z3y2)~%$?m`?@4+_#^FZ)-H!zY;YcKs3^LQ;i#Q2zbmY%``xZI-dqC;DOhSq_rL(UO zrLC>a9mL4Ql=xN%rfBc(?k-R~T%O~B|wwii010585kHQ$6RNdsYyvm*S{nWZAlGC49JJCj(yVU(b#9Z0)#APkLHl`85}7w;#W|} z77!3v9xl?63_NgtQiFU`Xzu5CPcKU6w|8<)MN}si4DQV5~cPd)#ld)dk+fn!nsue^T{4-rzJc zk_1~@`+-65kwI{4b-n7HkJZ(h@=gUYMp`O_

    93{yHf zx^F{6$=Ir@m5rGOuRl9>J6l^fGIe*3}ik$jDgz@{dQi z|2KneK|w+O8#i99t*@_?6zAL$6&2Oi(MctYPfzO#KE`l6IXQs<3P33wyM9^OuB@!& zA07Fxp8-&^-Dt_P6pNDl|LUBt^>J@OIa`2ep+Jyl7`%iBcC-W{fN5wmo5 zpAjTA7Hhn`T&I*^%EBnrYf)H8pMNgOJ3{1q*60^BN0N9`i1HO4uTNO|sfs|Hhxos_ zdAG*lnTI&sgb|XNS#%lgB*{ux{EI@PX%y^jGb)52{qOkO&O@5S#aLK)0{U=n{%dyi zp1)g;4qF7hf@_B;p*MLJH5KgbGUN}ig~d#2B3v(-C0SJ;JYXQM{s|xLGDnY$oI7lm zQ;|TEa{8m*cb&=AX=uF4&VKD&h}0;>P7WJRA#U`6D_q+L`Dp z5J{rM5CM&{vx=}XWwtV5)L=%xhDQE>ef>S3ixAQG@{+vd$IS?Xd5Yh0=RA~$r}O2$ zOldwp3k-6`{RsGjs0S{lo2$qH0O5Ffqtg0!fA-P(=h?mC^q*(12Jv{GubL%yU^d|A zfYrExf5&m>zG+WS&)o0dQJ^>O_w4TO&Tnoe0=YrHhFzuP?p^)Vl8`OuOO*fGSXxRM z6BFZivi^B{(&^JpadEot?(XH46_!UKw<-g6S=T6vLi$@#s#vZ0{? zCMiizPEMX7?aB#=O;%R+8W&gM)|OlMk3OaIQ_t~B=Oz3@B2xwV+Ve)x%E~JAQ}ZzeBq=TJ3TXZ-q@+4T(;xHLwKGa;$zf z1|u@v;7gmGoec(GYil?uC>Jfn!PQmM(^F!4dYS~axwI4sJRtuplFg~^o~-P93}z#L zYV~rsy#31SXoH6jufkvjD$*Uq(NdmOfU^MK=wd}vyYq$|B1geVT3{p!RnNY7kps(% zPE6D^H|M+<=R|g;V0M5O0C3bFJz@kCxx#<<`86o0X<1pBfw{S&<>}6jhi;aX-p7`C z9IHr8O-;q;&mqeP$6qb&9Fa({;-6bE*!;>$45)rbXJ>wS`HMj*z@65!Ka_04V=AIZ4=S7b=(|5@Xfl7%xGP*C#tPY^@8>rHk;eO zc&}R8*o5=wpveyT=$!Hz1Jchv%`^ov@$m4BHwVcPS689*^pekQWLcRBGQFK~Ob?8W zBQ9iiFlI9yA0K}~)V@FcNdd!e?eAZOlv%WxPwDffTJ@yyN5{vH)=EfAYZ@BTC9unc zb#%Z-Mn_xw`)PuMgUP6x$v6i<<2d8ZQKc{H-hc0J|L3}Oah)spoaF)H zXye+t6B%P}JI|FK&#|$wv2}2O*Rcqw5AQt{o|CKl*XmPR$%g|u - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0

    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -122,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_x_b_o_x_o_n_e.html b/class_x_b_o_x_o_n_e.html index 39e29ae9..29d09fce 100644 --- a/class_x_b_o_x_o_n_e.html +++ b/class_x_b_o_x_o_n_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXONE Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,14 +101,21 @@ Inheritance diagram for XBOXONE:
    Inheritance graph
    - + + +
    [legend]
    Collaboration diagram for XBOXONE:
    Collaboration graph
    - + + + + + +
    [legend]

    @@ -198,8 +206,7 @@ Protected Attributes

    -

    Constructor for the XBOXONE class.

    -
    Parameters
    +

    Constructor for the XBOXONE class.

    Parameters
    pUsbPointer to USB class instance.
    @@ -248,8 +255,7 @@ Protected Attributes
    -

    Initialize the Xbox Controller.

    -
    Parameters
    +

    Initialize the Xbox Controller.

    Parameters
    @@ -285,8 +291,7 @@ Protected Attributes
    parentHub number.
    portPort number on the hub.
    -

    Release the USB device.

    -
    Returns
    0 on success.
    +

    Release the USB device.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -314,8 +319,7 @@ Protected Attributes
    -

    Poll the USB Input endpoins and run the state machines.

    -
    Returns
    0 on success.
    +

    Poll the USB Input endpoins and run the state machines.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -343,8 +347,7 @@ Protected Attributes
    -

    Get the device address.

    -
    Returns
    The device address.
    +

    Get the device address.

    Returns
    The device address.

    Reimplemented from USBDeviceConfig.

    @@ -372,8 +375,7 @@ Protected Attributes
    -

    Used to check if the controller has been initialized.

    -
    Returns
    True if it's ready.
    +

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.

    Definition at line 106 of file XBOXONE.h.

    @@ -399,8 +401,7 @@ Protected Attributes
    -

    Read the poll interval taken from the endpoint descriptors.

    -
    Returns
    The poll interval in ms.
    +

    Read the poll interval taken from the endpoint descriptors.

    Returns
    The poll interval in ms.

    Definition at line 114 of file XBOXONE.h.

    @@ -437,8 +438,7 @@ Protected Attributes
    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    @@ -468,8 +468,7 @@ Protected Attributes

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    vidThe device's VID.
    pidThe device's PID.
    bButtonEnum to read.
    @@ -496,8 +495,7 @@ Protected Attributes

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    bButtonEnum to read.
    @@ -522,8 +520,7 @@ Protected Attributes
    -

    Return the analog value from the joysticks on the controller.

    -
    Parameters
    +

    Return the analog value from the joysticks on the controller.

    Parameters
    aEither LeftHatX, LeftHatY, RightHatX or RightHatY.
    @@ -556,8 +553,7 @@ Protected Attributes
    -

    Used to call your own function when the controller is successfully initialized.

    -
    Parameters
    +

    Used to call your own function when the controller is successfully initialized.

    Parameters
    funcOnInitFunction to call.
    @@ -621,8 +617,7 @@ Protected Attributes
    -

    Used to turn on rumble continuously.

    -
    Parameters
    +

    Used to turn on rumble continuously.

    Parameters
    @@ -685,8 +680,7 @@ Protected Attributes
    leftTriggerLeft trigger force.
    rightTriggerRight trigger force.
    -

    UsbConfigXtracter implementation, used to extract endpoint information.

    -
    Parameters
    +

    UsbConfigXtracter implementation, used to extract endpoint information.

    Parameters
    @@ -724,8 +718,7 @@ Protected Attributes
    confConfiguration value.
    ifaceInterface number.
    -

    Used to print the USB Endpoint Descriptor.

    -
    Parameters
    +

    Used to print the USB Endpoint Descriptor.

    Parameters
    ep_ptrPointer to USB Endpoint Descriptor.
    @@ -899,7 +892,7 @@ Protected Attributes diff --git a/class_x_b_o_x_o_n_e__coll__graph.map b/class_x_b_o_x_o_n_e__coll__graph.map index 07c04fec..81ce6aa5 100644 --- a/class_x_b_o_x_o_n_e__coll__graph.map +++ b/class_x_b_o_x_o_n_e__coll__graph.map @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/class_x_b_o_x_o_n_e__coll__graph.md5 b/class_x_b_o_x_o_n_e__coll__graph.md5 index 4e46bb6d..d3362d25 100644 --- a/class_x_b_o_x_o_n_e__coll__graph.md5 +++ b/class_x_b_o_x_o_n_e__coll__graph.md5 @@ -1 +1 @@ -3ff30ab51b384a684db22c90c649e6d7 \ No newline at end of file +ab6103dfda6af6e334c7e58ac7721ece \ No newline at end of file diff --git a/class_x_b_o_x_o_n_e__coll__graph.png b/class_x_b_o_x_o_n_e__coll__graph.png index 3fb98f1325326b8054c31c3b409c6843846edb77..e7222c5b9b0ffaae0e353e65a624e21dadb0497b 100644 GIT binary patch literal 11985 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 DWtws! literal 12089 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 H5cIzQw@lq3 diff --git a/class_x_b_o_x_o_n_e__inherit__graph.map b/class_x_b_o_x_o_n_e__inherit__graph.map index 9a89ecb8..44cd7708 100644 --- a/class_x_b_o_x_o_n_e__inherit__graph.map +++ b/class_x_b_o_x_o_n_e__inherit__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/class_x_b_o_x_o_n_e__inherit__graph.md5 b/class_x_b_o_x_o_n_e__inherit__graph.md5 index 7731d309..5e155b32 100644 --- a/class_x_b_o_x_o_n_e__inherit__graph.md5 +++ b/class_x_b_o_x_o_n_e__inherit__graph.md5 @@ -1 +1 @@ -f97bd0ce30f14001d202618b7e6da6e4 \ No newline at end of file +d14ff9b240aab210984df810f6df378d \ No newline at end of file diff --git a/class_x_b_o_x_o_n_e__inherit__graph.png b/class_x_b_o_x_o_n_e__inherit__graph.png index 3f418d5ebe7662cf40237b4478a7dec67bea27cb..36068495032b92d4e137b2d588dffd12a65ef9a0 100644 GIT binary patch literal 5574 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 literal 6225 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -126,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_x_b_o_x_r_e_c_v.html b/class_x_b_o_x_r_e_c_v.html index de0b7c44..0e339a17 100644 --- a/class_x_b_o_x_r_e_c_v.html +++ b/class_x_b_o_x_r_e_c_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,14 +100,19 @@ Inheritance diagram for XBOXRECV:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for XBOXRECV:
    Collaboration graph
    - + + + + +
    [legend]

    @@ -202,8 +208,7 @@ Protected Attributes

    -

    Constructor for the XBOXRECV class.

    -
    Parameters
    +

    Constructor for the XBOXRECV class.

    Parameters
    pUsbPointer to USB class instance.
    @@ -252,8 +257,7 @@ Protected Attributes
    -

    Address assignment and basic initilization is done here.

    -
    Parameters
    +

    Address assignment and basic initilization is done here.

    Parameters
    @@ -306,8 +310,7 @@ Protected Attributes
    parentHub number.
    portPort number on the hub.
    -

    Initialize the Xbox wireless receiver.

    -
    Parameters
    +

    Initialize the Xbox wireless receiver.

    Parameters
    @@ -343,8 +346,7 @@ Protected Attributes
    parentHub number.
    portPort number on the hub.
    -

    Release the USB device.

    -
    Returns
    0 on success.
    +

    Release the USB device.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -372,8 +374,7 @@ Protected Attributes
    -

    Poll the USB Input endpoins and run the state machines.

    -
    Returns
    0 on success.
    +

    Poll the USB Input endpoins and run the state machines.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -401,8 +402,7 @@ Protected Attributes
    -

    Get the device address.

    -
    Returns
    The device address.
    +

    Get the device address.

    Returns
    The device address.

    Reimplemented from USBDeviceConfig.

    @@ -430,8 +430,7 @@ Protected Attributes
    -

    Used to check if the controller has been initialized.

    -
    Returns
    True if it's ready.
    +

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.

    Definition at line 103 of file XBOXRECV.h.

    @@ -468,8 +467,7 @@ Protected Attributes
    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    @@ -509,8 +507,7 @@ Protected Attributes

    getButtonPress(uint8_t controller, ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(uint8_t controller, ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(uint8_t controller, ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(uint8_t controller, ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(uint8_t controller, ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(uint8_t controller, ButtonEnum b).

    Parameters
    vidThe device's VID.
    pidThe device's PID.
    @@ -548,8 +545,7 @@ Protected Attributes

    getButtonPress(uint8_t controller, ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(uint8_t controller, ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(uint8_t controller, ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(uint8_t controller, ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(uint8_t controller, ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(uint8_t controller, ButtonEnum b).

    Parameters
    bButtonEnum to read.
    controllerThe controller to read from. Default to 0.
    @@ -585,8 +581,7 @@ Protected Attributes
    bButtonEnum to read.
    controllerThe controller to read from. Default to 0.
    -

    Return the analog value from the joysticks on the controller.

    -
    Parameters
    +

    Return the analog value from the joysticks on the controller.

    Parameters
    @@ -612,8 +607,7 @@ Protected Attributes
    aEither LeftHatX, LeftHatY, RightHatX or RightHatY.
    controllerThe controller to read from. Default to 0.
    -

    Used to disconnect any of the controllers.

    -
    Parameters
    +

    Used to disconnect any of the controllers.

    Parameters
    controllerThe controller to disconnect. Default to 0.
    @@ -645,8 +639,7 @@ Protected Attributes
    -

    Turn rumble off and all the LEDs on the specific controller.

    -
    Parameters
    +

    Turn rumble off and all the LEDs on the specific controller.

    Parameters
    controllerThe controller to write to. Default to 0.
    @@ -678,8 +671,7 @@ Protected Attributes
    -

    Turn rumble off the specific controller.

    -
    Parameters
    +

    Turn rumble off the specific controller.

    Parameters
    controllerThe controller to write to. Default to 0.
    @@ -719,8 +711,7 @@ Protected Attributes
    -

    Turn rumble on.

    -
    Parameters
    +

    Turn rumble on.

    Parameters
    @@ -756,8 +747,7 @@ Protected Attributes
    lValueLeft motor (big weight) inside the controller.
    rValueRight motor (small weight) inside the controller.
    -

    Set LED value. Without using the LEDEnum or LEDModeEnum.

    -
    Parameters
    +

    Set LED value. Without using the LEDEnum or LEDModeEnum.

    Parameters
    @@ -790,8 +780,7 @@ Protected Attributes
    valueSee: setLedOff(uint8_t controller), setLedOn(uint8_t controller, LED l), setLedBlink(uint8_t controller, LED l), and setLedMode(uint8_t controller, LEDMode lm).
    controllerThe controller to write to. Default to 0.
    -

    Turn all LEDs off the specific controller.

    -
    Parameters
    +

    Turn all LEDs off the specific controller.

    Parameters
    controllerThe controller to write to. Default to 0.
    @@ -825,8 +814,7 @@ Protected Attributes
    -

    Turn on a LED by using LEDEnum.

    -
    Parameters
    +

    Turn on a LED by using LEDEnum.

    Parameters
    @@ -861,8 +849,7 @@ Protected Attributes
    lOFF, LED1, LED2, LED3 and LED4 is supported by the Xbox controller.
    controllerThe controller to write to. Default to 0.
    -

    Turn on a LED by using LEDEnum.

    -
    Parameters
    +

    Turn on a LED by using LEDEnum.

    Parameters
    @@ -897,8 +884,7 @@ Protected Attributes
    lALL, LED1, LED2, LED3 and LED4 is supported by the Xbox controller.
    controllerThe controller to write to. Default to 0.
    -

    Used to set special LED modes supported by the Xbox controller.

    -
    Parameters
    +

    Used to set special LED modes supported by the Xbox controller.

    Parameters
    @@ -923,8 +909,7 @@ Protected Attributes
    lmSee LEDModeEnum.
    controllerThe controller to write to. Default to 0.
    -

    Used to get the battery level from the controller.

    -
    Parameters
    +

    Used to get the battery level from the controller.

    Parameters
    controllerThe controller to read from. Default to 0.
    @@ -949,8 +934,7 @@ Protected Attributes
    -

    Used to check if a button has changed.

    -
    Parameters
    +

    Used to check if a button has changed.

    Parameters
    controllerThe controller to read from. Default to 0.
    @@ -983,8 +967,7 @@ Protected Attributes
    -

    Used to call your own function when the controller is successfully initialized.

    -
    Parameters
    +

    Used to call your own function when the controller is successfully initialized.

    Parameters
    funcOnInitFunction to call.
    @@ -1104,7 +1087,7 @@ Protected Attributes diff --git a/class_x_b_o_x_r_e_c_v__coll__graph.map b/class_x_b_o_x_r_e_c_v__coll__graph.map index ada3f9e4..4f9b5ac7 100644 --- a/class_x_b_o_x_r_e_c_v__coll__graph.map +++ b/class_x_b_o_x_r_e_c_v__coll__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/class_x_b_o_x_r_e_c_v__coll__graph.md5 b/class_x_b_o_x_r_e_c_v__coll__graph.md5 index eca497ab..bb538112 100644 --- a/class_x_b_o_x_r_e_c_v__coll__graph.md5 +++ b/class_x_b_o_x_r_e_c_v__coll__graph.md5 @@ -1 +1 @@ -ed9aab39c26cf617dcffaf5cd6075f83 \ No newline at end of file +2d7f0ed5a487b4ea4ec343e72841b2c4 \ No newline at end of file diff --git a/class_x_b_o_x_r_e_c_v__coll__graph.png b/class_x_b_o_x_r_e_c_v__coll__graph.png index 49cb01d182af715c0ae06e82b32cf55d98b05963..dcada608331450928358d7655a85cf0a98afa3ff 100644 GIT binary patch literal 9593 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

    *>yos7;s@zkmQaz__7b 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 - + diff --git a/class_x_b_o_x_r_e_c_v__inherit__graph.md5 b/class_x_b_o_x_r_e_c_v__inherit__graph.md5 index 9c40d748..b6ad7df6 100644 --- a/class_x_b_o_x_r_e_c_v__inherit__graph.md5 +++ b/class_x_b_o_x_r_e_c_v__inherit__graph.md5 @@ -1 +1 @@ -65afe7bd4794abb7f38cbc4be13ce865 \ No newline at end of file +f7208ed6bda886c3efbb05f7e1cbd52d \ No newline at end of file diff --git a/class_x_b_o_x_r_e_c_v__inherit__graph.png b/class_x_b_o_x_r_e_c_v__inherit__graph.png index 0527009887016fd5037da5bcd17c99adcd35e8e1..71d28ecdf664dede18a252d084cbb7ed691f6377 100644 GIT binary patch literal 3338 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0

    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -122,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_x_b_o_x_u_s_b.html b/class_x_b_o_x_u_s_b.html index add28585..48a4ac5f 100644 --- a/class_x_b_o_x_u_s_b.html +++ b/class_x_b_o_x_u_s_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,14 +100,19 @@ Inheritance diagram for XBOXUSB:
    Inheritance graph
    - + +
    [legend]
    Collaboration diagram for XBOXUSB:
    Collaboration graph
    - + + + + +
    [legend]

    @@ -193,8 +199,7 @@ Protected Attributes

    -

    Constructor for the XBOXUSB class.

    -
    Parameters
    +

    Constructor for the XBOXUSB class.

    Parameters
    pUsbPointer to USB class instance.
    @@ -243,8 +248,7 @@ Protected Attributes
    -

    Initialize the Xbox Controller.

    -
    Parameters
    +

    Initialize the Xbox Controller.

    Parameters
    @@ -280,8 +284,7 @@ Protected Attributes
    parentHub number.
    portPort number on the hub.
    -

    Release the USB device.

    -
    Returns
    0 on success.
    +

    Release the USB device.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -309,8 +312,7 @@ Protected Attributes
    -

    Poll the USB Input endpoins and run the state machines.

    -
    Returns
    0 on success.
    +

    Poll the USB Input endpoins and run the state machines.

    Returns
    0 on success.

    Reimplemented from USBDeviceConfig.

    @@ -338,8 +340,7 @@ Protected Attributes
    -

    Get the device address.

    -
    Returns
    The device address.
    +

    Get the device address.

    Returns
    The device address.

    Reimplemented from USBDeviceConfig.

    @@ -367,8 +368,7 @@ Protected Attributes
    -

    Used to check if the controller has been initialized.

    -
    Returns
    True if it's ready.
    +

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.

    Definition at line 93 of file XBOXUSB.h.

    @@ -405,8 +405,7 @@ Protected Attributes
    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    @@ -436,8 +435,7 @@ Protected Attributes

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    vidThe device's VID.
    pidThe device's PID.
    bButtonEnum to read.
    @@ -464,8 +462,7 @@ Protected Attributes

    getButtonPress(ButtonEnum b) will return true as long as the button is held down.

    While getButtonClick(ButtonEnum b) will only return it once.

    -

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    -
    Parameters
    +

    So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b), but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).

    Parameters
    bButtonEnum to read.
    @@ -490,8 +487,7 @@ Protected Attributes
    -

    Return the analog value from the joysticks on the controller.

    -
    Parameters
    +

    Return the analog value from the joysticks on the controller.

    Parameters
    aEither LeftHatX, LeftHatY, RightHatX or RightHatY.
    @@ -578,8 +574,7 @@ Protected Attributes
    -

    Turn rumble on.

    -
    Parameters
    +

    Turn rumble on.

    Parameters
    @@ -604,8 +599,7 @@ Protected Attributes
    lValueLeft motor (big weight) inside the controller.
    rValueRight motor (small weight) inside the controller.
    -

    Set LED value. Without using the LEDEnum or LEDModeEnum.

    -
    Parameters
    +

    Set LED value. Without using the LEDEnum or LEDModeEnum.

    Parameters
    valueSee: setLedOff(), setLedOn(LEDEnum l), setLedBlink(LEDEnum l), and setLedMode(LEDModeEnum lm).
    @@ -655,8 +649,7 @@ Protected Attributes
    -

    Turn on a LED by using LEDEnum.

    -
    Parameters
    +

    Turn on a LED by using LEDEnum.

    Parameters
    lOFF, LED1, LED2, LED3 and LED4 is supported by the Xbox controller.
    @@ -680,8 +673,7 @@ Protected Attributes
    -

    Turn on a LED by using LEDEnum.

    -
    Parameters
    +

    Turn on a LED by using LEDEnum.

    Parameters
    lALL, LED1, LED2, LED3 and LED4 is supported by the Xbox controller.
    @@ -705,8 +697,7 @@ Protected Attributes
    -

    Used to set special LED modes supported by the Xbox controller.

    -
    Parameters
    +

    Used to set special LED modes supported by the Xbox controller.

    Parameters
    lmSee LEDModeEnum.
    @@ -738,8 +729,7 @@ Protected Attributes
    -

    Used to call your own function when the controller is successfully initialized.

    -
    Parameters
    +

    Used to call your own function when the controller is successfully initialized.

    Parameters
    funcOnInitFunction to call.
    @@ -844,7 +834,7 @@ Protected Attributes diff --git a/class_x_b_o_x_u_s_b__coll__graph.map b/class_x_b_o_x_u_s_b__coll__graph.map index ec5cb1c2..5ea7e477 100644 --- a/class_x_b_o_x_u_s_b__coll__graph.map +++ b/class_x_b_o_x_u_s_b__coll__graph.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/class_x_b_o_x_u_s_b__coll__graph.md5 b/class_x_b_o_x_u_s_b__coll__graph.md5 index bd1c0e53..d2631857 100644 --- a/class_x_b_o_x_u_s_b__coll__graph.md5 +++ b/class_x_b_o_x_u_s_b__coll__graph.md5 @@ -1 +1 @@ -dee322f84a53a66ca571152698f981be \ No newline at end of file +654de9f0f1b78cafbc20482878c5abaf \ No newline at end of file diff --git a/class_x_b_o_x_u_s_b__coll__graph.png b/class_x_b_o_x_u_s_b__coll__graph.png index 6c66272a20fb5953792f07a552e1a26dc89fb8c3..deacbb477d9af5dd6164ebe9a8e5c882fd3ec5f6 100644 GIT binary patch literal 9452 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 literal 10518 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 diff --git a/class_x_b_o_x_u_s_b__inherit__graph.map b/class_x_b_o_x_u_s_b__inherit__graph.map index e43218e9..f9dd3b82 100644 --- a/class_x_b_o_x_u_s_b__inherit__graph.map +++ b/class_x_b_o_x_u_s_b__inherit__graph.map @@ -1,3 +1,3 @@ - + diff --git a/class_x_b_o_x_u_s_b__inherit__graph.md5 b/class_x_b_o_x_u_s_b__inherit__graph.md5 index 7e11e2c0..816edbfb 100644 --- a/class_x_b_o_x_u_s_b__inherit__graph.md5 +++ b/class_x_b_o_x_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -0686bddb1558a264c6860f5ed66959a5 \ No newline at end of file +f856eb1a72c58d28a6481d6c3bc6012d \ No newline at end of file diff --git a/class_x_b_o_x_u_s_b__inherit__graph.png b/class_x_b_o_x_u_s_b__inherit__graph.png index 638e5a2f23cc112cd3276570c23d07ac3a1beb8f..8e473b7d411e99e912045e95013c885bbdca6430 100644 GIT binary patch literal 3166 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 literal 3977 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 - + USB Host Shield 2.0: Member List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -144,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_x_r21_b1411.html b/class_x_r21_b1411.html index b2c2ea42..a76544ca 100644 --- a/class_x_r21_b1411.html +++ b/class_x_r21_b1411.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XR21B1411 Class Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,14 +98,25 @@ Inheritance diagram for XR21B1411:
    Inheritance graph
    - + + + +
    [legend]
    Collaboration diagram for XR21B1411:
    Collaboration graph
    - + + + + + + + + +
    [legend]

    @@ -283,8 +295,7 @@ Additional Inherited Members

    -

    Used by the USB core to check what this driver support.

    -
    Parameters
    +

    Used by the USB core to check what this driver support.

    Parameters
    @@ -564,7 +575,7 @@ Additional Inherited Members diff --git a/class_x_r21_b1411__coll__graph.map b/class_x_r21_b1411__coll__graph.map index 37aa64f7..ef7794b0 100644 --- a/class_x_r21_b1411__coll__graph.map +++ b/class_x_r21_b1411__coll__graph.map @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/class_x_r21_b1411__coll__graph.md5 b/class_x_r21_b1411__coll__graph.md5 index 0d8faeb4..f6a09260 100644 --- a/class_x_r21_b1411__coll__graph.md5 +++ b/class_x_r21_b1411__coll__graph.md5 @@ -1 +1 @@ -72959291e5999b6654259d712972e335 \ No newline at end of file +2dbccd1b011c53b5f85709ffafe012c5 \ No newline at end of file diff --git a/class_x_r21_b1411__coll__graph.png b/class_x_r21_b1411__coll__graph.png index 13c0dfb6260684beae2c9b66aa2463ca6ed13b37..b0212e1af1c51e8c1b25ce01f9e7504ed01f36a2 100644 GIT binary patch literal 21055 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 literal 22352 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 p;l%&@>Y`ieAP - - - + + + diff --git a/class_x_r21_b1411__inherit__graph.md5 b/class_x_r21_b1411__inherit__graph.md5 index 0ace9433..b61794d2 100644 --- a/class_x_r21_b1411__inherit__graph.md5 +++ b/class_x_r21_b1411__inherit__graph.md5 @@ -1 +1 @@ -a1c5af5cd37a264683d377979a9eabed \ No newline at end of file +b90701a331346260b7eefd76bf910398 \ No newline at end of file diff --git a/class_x_r21_b1411__inherit__graph.png b/class_x_r21_b1411__inherit__graph.png index 276113904c1dacf7a62559e7f8c130928f11bc15..19b7e439086da7c4c7e74c5e7302f52997d0fbef 100644 GIT binary patch literal 6995 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 a#WquK8QqOtZ3MrPL1ZM~OBB4;@%k@(3dfZI literal 8528 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 diff --git a/classes.html b/classes.html index e1fd9f9d..3b0c3853 100644 --- a/classes.html +++ b/classes.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Index + @@ -22,7 +23,7 @@
    vidThe device's VID.
    pidThe device's PID.
    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -73,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -88,7 +89,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    A | B | C | E | F | H | I | K | L | M | P | R | S | T | U | W | X
    - +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/confdescparser_8h.html b/confdescparser_8h.html index 4e638b0c..0cad4899 100644 --- a/confdescparser_8h.html +++ b/confdescparser_8h.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: confdescparser.h File Reference + @@ -22,7 +23,7 @@
      A  
    CommandBlockWrapper   KBDLEDS   PS4USB   USB_ENDPOINT_DESCRIPTOR   
    CommandBlockWrapperBase   KeyboardReportParser   PSBuzz   USB_HID_DESCRIPTOR   
    - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -171,7 +172,7 @@ Macros diff --git a/confdescparser_8h_source.html b/confdescparser_8h_source.html index 1eff6c88..47afebdc 100644 --- a/confdescparser_8h_source.html +++ b/confdescparser_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: confdescparser.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,229 +86,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    confdescparser.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This program is free software; you can redistribute it and/or modify
    -
    4 it under the terms of the GNU General Public License as published by
    -
    5 the Free Software Foundation; either version 2 of the License, or
    -
    6 (at your option) any later version.
    -
    7 
    -
    8 This program is distributed in the hope that it will be useful,
    -
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    -
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    -
    11 GNU General Public License for more details.
    -
    12 
    -
    13 You should have received a copy of the GNU General Public License
    -
    14 along with this program; if not, write to the Free Software
    -
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    16 
    -
    17 Contact information
    -
    18 -------------------
    -
    19 
    -
    20 Circuits At Home, LTD
    -
    21 Web : http://www.circuitsathome.com
    -
    22 e-mail : support@circuitsathome.com
    -
    23  */
    -
    24 #if !defined(_usb_h_) || defined(__CONFDESCPARSER_H__)
    -
    25 #error "Never include confdescparser.h directly; include Usb.h instead"
    -
    26 #else
    -
    27 
    -
    28 #define __CONFDESCPARSER_H__
    -
    29 
    - -
    31 public:
    -
    32  //virtual void ConfigXtract(const USB_CONFIGURATION_DESCRIPTOR *conf) = 0;
    -
    33  //virtual void InterfaceXtract(uint8_t conf, const USB_INTERFACE_DESCRIPTOR *iface) = 0;
    -
    34 
    -
    35  virtual void EndpointXtract(uint8_t conf __attribute__((unused)), uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *ep __attribute__((unused))) {
    -
    36  };
    -
    37 };
    -
    38 
    -
    39 #define CP_MASK_COMPARE_CLASS 1
    -
    40 #define CP_MASK_COMPARE_SUBCLASS 2
    -
    41 #define CP_MASK_COMPARE_PROTOCOL 4
    -
    42 #define CP_MASK_COMPARE_ALL 7
    -
    43 
    -
    44 // Configuration Descriptor Parser Class Template
    -
    45 
    -
    46 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    - -
    48  UsbConfigXtracter *theXtractor;
    -
    49  MultiValueBuffer theBuffer;
    -
    50  MultiByteValueParser valParser;
    -
    51  ByteSkipper theSkipper;
    -
    52  uint8_t varBuffer[16 /*sizeof(USB_CONFIGURATION_DESCRIPTOR)*/];
    -
    53 
    -
    54  uint8_t stateParseDescr; // ParseDescriptor state
    -
    55 
    -
    56  uint8_t dscrLen; // Descriptor length
    -
    57  uint8_t dscrType; // Descriptor type
    -
    58 
    -
    59  bool isGoodInterface; // Apropriate interface flag
    -
    60  uint8_t confValue; // Configuration value
    -
    61  uint8_t protoValue; // Protocol value
    -
    62  uint8_t ifaceNumber; // Interface number
    -
    63  uint8_t ifaceAltSet; // Interface alternate settings
    -
    64 
    -
    65  bool UseOr;
    -
    66  bool ParseDescriptor(uint8_t **pp, uint16_t *pcntdn);
    -
    67  void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc);
    -
    68 
    -
    69 public:
    -
    70 
    -
    71  void SetOR(void) {
    -
    72  UseOr = true;
    -
    73  }
    - -
    75  void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset);
    -
    76 };
    -
    77 
    -
    78 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    - -
    80 theXtractor(xtractor),
    -
    81 stateParseDescr(0),
    -
    82 dscrLen(0),
    -
    83 dscrType(0),
    -
    84 UseOr(false) {
    -
    85  theBuffer.pValue = varBuffer;
    -
    86  valParser.Initialize(&theBuffer);
    -
    87  theSkipper.Initialize(&theBuffer);
    -
    88 };
    -
    89 
    -
    90 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    -
    91 void ConfigDescParser<CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK>::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset __attribute__((unused))) {
    -
    92  uint16_t cntdn = (uint16_t)len;
    -
    93  uint8_t *p = (uint8_t*)pbuf;
    -
    94 
    -
    95  while(cntdn)
    -
    96  if(!ParseDescriptor(&p, &cntdn))
    -
    97  return;
    -
    98 }
    -
    99 
    -
    100 /* Parser for the configuration descriptor. Takes values for class, subclass, protocol fields in interface descriptor and
    -
    101  compare masks for them. When the match is found, calls EndpointXtract passing buffer containing endpoint descriptor */
    -
    102 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    - -
    104  USB_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR*>(varBuffer);
    -
    105  USB_INTERFACE_DESCRIPTOR* uid = reinterpret_cast<USB_INTERFACE_DESCRIPTOR*>(varBuffer);
    -
    106  switch(stateParseDescr) {
    -
    107  case 0:
    -
    108  theBuffer.valueSize = 2;
    -
    109  valParser.Initialize(&theBuffer);
    -
    110  stateParseDescr = 1;
    -
    111  case 1:
    -
    112  if(!valParser.Parse(pp, pcntdn))
    -
    113  return false;
    -
    114  dscrLen = *((uint8_t*)theBuffer.pValue);
    -
    115  dscrType = *((uint8_t*)theBuffer.pValue + 1);
    -
    116  stateParseDescr = 2;
    -
    117  case 2:
    -
    118  // This is a sort of hack. Assuming that two bytes are all ready in the buffer
    -
    119  // the pointer is positioned two bytes ahead in order for the rest of descriptor
    -
    120  // to be read right after the size and the type fields.
    -
    121  // This should be used carefully. varBuffer should be used directly to handle data
    -
    122  // in the buffer.
    -
    123  theBuffer.pValue = varBuffer + 2;
    -
    124  stateParseDescr = 3;
    -
    125  case 3:
    -
    126  switch(dscrType) {
    - -
    128  isGoodInterface = false;
    -
    129  break;
    - - -
    132  case HID_DESCRIPTOR_HID:
    -
    133  break;
    -
    134  }
    -
    135  theBuffer.valueSize = dscrLen - 2;
    -
    136  valParser.Initialize(&theBuffer);
    -
    137  stateParseDescr = 4;
    -
    138  case 4:
    -
    139  switch(dscrType) {
    - -
    141  if(!valParser.Parse(pp, pcntdn))
    -
    142  return false;
    -
    143  confValue = ucd->bConfigurationValue;
    -
    144  break;
    - -
    146  if(!valParser.Parse(pp, pcntdn))
    -
    147  return false;
    -
    148  if((MASK & CP_MASK_COMPARE_CLASS) && uid->bInterfaceClass != CLASS_ID)
    -
    149  break;
    -
    150  if((MASK & CP_MASK_COMPARE_SUBCLASS) && uid->bInterfaceSubClass != SUBCLASS_ID)
    -
    151  break;
    -
    152  if(UseOr) {
    -
    153  if((!((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol)))
    -
    154  break;
    -
    155  } else {
    -
    156  if((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol != PROTOCOL_ID)
    -
    157  break;
    -
    158  }
    -
    159  isGoodInterface = true;
    -
    160  ifaceNumber = uid->bInterfaceNumber;
    -
    161  ifaceAltSet = uid->bAlternateSetting;
    -
    162  protoValue = uid->bInterfaceProtocol;
    -
    163  break;
    - -
    165  if(!valParser.Parse(pp, pcntdn))
    -
    166  return false;
    -
    167  if(isGoodInterface)
    -
    168  if(theXtractor)
    -
    169  theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_ENDPOINT_DESCRIPTOR*)varBuffer);
    -
    170  break;
    -
    171  //case HID_DESCRIPTOR_HID:
    -
    172  // if (!valParser.Parse(pp, pcntdn))
    -
    173  // return false;
    -
    174  // PrintHidDescriptor((const USB_HID_DESCRIPTOR*)varBuffer);
    -
    175  // break;
    -
    176  default:
    -
    177  if(!theSkipper.Skip(pp, pcntdn, dscrLen - 2))
    -
    178  return false;
    -
    179  }
    -
    180  theBuffer.pValue = varBuffer;
    -
    181  stateParseDescr = 0;
    -
    182  }
    -
    183  return true;
    -
    184 }
    -
    185 
    -
    186 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    - -
    188  Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80);
    -
    189  Notify(PSTR("bDescLength:\t\t"), 0x80);
    -
    190  PrintHex<uint8_t > (pDesc->bLength, 0x80);
    -
    191 
    -
    192  Notify(PSTR("\r\nbDescriptorType:\t"), 0x80);
    -
    193  PrintHex<uint8_t > (pDesc->bDescriptorType, 0x80);
    -
    194 
    -
    195  Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80);
    -
    196  PrintHex<uint16_t > (pDesc->bcdHID, 0x80);
    -
    197 
    -
    198  Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80);
    -
    199  PrintHex<uint8_t > (pDesc->bCountryCode, 0x80);
    -
    200 
    -
    201  Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80);
    -
    202  PrintHex<uint8_t > (pDesc->bNumDescriptors, 0x80);
    -
    203 
    -
    204  for(uint8_t i = 0; i < pDesc->bNumDescriptors; i++) {
    - -
    206 
    -
    207  Notify(PSTR("\r\nbDescrType:\t\t"), 0x80);
    -
    208  PrintHex<uint8_t > (pLT[i].bDescrType, 0x80);
    -
    209 
    -
    210  Notify(PSTR("\r\nwDescriptorLength:\t"), 0x80);
    -
    211  PrintHex<uint16_t > (pLT[i].wDescriptorLength, 0x80);
    -
    212  }
    -
    213  Notify(PSTR("\r\n"), 0x80);
    -
    214 }
    -
    215 
    -
    216 
    -
    217 #endif // __CONFDESCPARSER_H__
    -
    #define CP_MASK_COMPARE_PROTOCOL
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This program is free software; you can redistribute it and/or modify
    4 it under the terms of the GNU General Public License as published by
    5 the Free Software Foundation; either version 2 of the License, or
    6 (at your option) any later version.
    7 
    8 This program is distributed in the hope that it will be useful,
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11 GNU General Public License for more details.
    12 
    13 You should have received a copy of the GNU General Public License
    14 along with this program; if not, write to the Free Software
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    16 
    17 Contact information
    18 -------------------
    19 
    20 Circuits At Home, LTD
    21 Web : http://www.circuitsathome.com
    22 e-mail : support@circuitsathome.com
    23  */
    24 #if !defined(_usb_h_) || defined(__CONFDESCPARSER_H__)
    25 #error "Never include confdescparser.h directly; include Usb.h instead"
    26 #else
    27 
    28 #define __CONFDESCPARSER_H__
    29 
    31 public:
    32  //virtual void ConfigXtract(const USB_CONFIGURATION_DESCRIPTOR *conf) = 0;
    33  //virtual void InterfaceXtract(uint8_t conf, const USB_INTERFACE_DESCRIPTOR *iface) = 0;
    34 
    35  virtual void EndpointXtract(uint8_t conf __attribute__((unused)), uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *ep __attribute__((unused))) {
    36  };
    37 };
    38 
    39 #define CP_MASK_COMPARE_CLASS 1
    40 #define CP_MASK_COMPARE_SUBCLASS 2
    41 #define CP_MASK_COMPARE_PROTOCOL 4
    42 #define CP_MASK_COMPARE_ALL 7
    43 
    44 // Configuration Descriptor Parser Class Template
    45 
    46 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    48  UsbConfigXtracter *theXtractor;
    49  MultiValueBuffer theBuffer;
    50  MultiByteValueParser valParser;
    51  ByteSkipper theSkipper;
    52  uint8_t varBuffer[16 /*sizeof(USB_CONFIGURATION_DESCRIPTOR)*/];
    53 
    54  uint8_t stateParseDescr; // ParseDescriptor state
    55 
    56  uint8_t dscrLen; // Descriptor length
    57  uint8_t dscrType; // Descriptor type
    58 
    59  bool isGoodInterface; // Apropriate interface flag
    60  uint8_t confValue; // Configuration value
    61  uint8_t protoValue; // Protocol value
    62  uint8_t ifaceNumber; // Interface number
    63  uint8_t ifaceAltSet; // Interface alternate settings
    64 
    65  bool UseOr;
    66  bool ParseDescriptor(uint8_t **pp, uint16_t *pcntdn);
    67  void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc);
    68 
    69 public:
    70 
    71  void SetOR(void) {
    72  UseOr = true;
    73  }
    75  void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset);
    76 };
    77 
    78 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    80 theXtractor(xtractor),
    81 stateParseDescr(0),
    82 dscrLen(0),
    83 dscrType(0),
    84 UseOr(false) {
    85  theBuffer.pValue = varBuffer;
    86  valParser.Initialize(&theBuffer);
    87  theSkipper.Initialize(&theBuffer);
    88 };
    89 
    90 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    91 void ConfigDescParser<CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK>::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset __attribute__((unused))) {
    92  uint16_t cntdn = (uint16_t)len;
    93  uint8_t *p = (uint8_t*)pbuf;
    94 
    95  while(cntdn)
    96  if(!ParseDescriptor(&p, &cntdn))
    97  return;
    98 }
    99 
    100 /* Parser for the configuration descriptor. Takes values for class, subclass, protocol fields in interface descriptor and
    101  compare masks for them. When the match is found, calls EndpointXtract passing buffer containing endpoint descriptor */
    102 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    104  USB_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR*>(varBuffer);
    105  USB_INTERFACE_DESCRIPTOR* uid = reinterpret_cast<USB_INTERFACE_DESCRIPTOR*>(varBuffer);
    106  switch(stateParseDescr) {
    107  case 0:
    108  theBuffer.valueSize = 2;
    109  valParser.Initialize(&theBuffer);
    110  stateParseDescr = 1;
    111  case 1:
    112  if(!valParser.Parse(pp, pcntdn))
    113  return false;
    114  dscrLen = *((uint8_t*)theBuffer.pValue);
    115  dscrType = *((uint8_t*)theBuffer.pValue + 1);
    116  stateParseDescr = 2;
    117  case 2:
    118  // This is a sort of hack. Assuming that two bytes are all ready in the buffer
    119  // the pointer is positioned two bytes ahead in order for the rest of descriptor
    120  // to be read right after the size and the type fields.
    121  // This should be used carefully. varBuffer should be used directly to handle data
    122  // in the buffer.
    123  theBuffer.pValue = varBuffer + 2;
    124  stateParseDescr = 3;
    125  case 3:
    126  switch(dscrType) {
    128  isGoodInterface = false;
    129  break;
    132  case HID_DESCRIPTOR_HID:
    133  break;
    134  }
    135  theBuffer.valueSize = dscrLen - 2;
    136  valParser.Initialize(&theBuffer);
    137  stateParseDescr = 4;
    138  case 4:
    139  switch(dscrType) {
    141  if(!valParser.Parse(pp, pcntdn))
    142  return false;
    143  confValue = ucd->bConfigurationValue;
    144  break;
    146  if(!valParser.Parse(pp, pcntdn))
    147  return false;
    148  if((MASK & CP_MASK_COMPARE_CLASS) && uid->bInterfaceClass != CLASS_ID)
    149  break;
    150  if((MASK & CP_MASK_COMPARE_SUBCLASS) && uid->bInterfaceSubClass != SUBCLASS_ID)
    151  break;
    152  if(UseOr) {
    153  if((!((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol)))
    154  break;
    155  } else {
    156  if((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol != PROTOCOL_ID)
    157  break;
    158  }
    159  isGoodInterface = true;
    160  ifaceNumber = uid->bInterfaceNumber;
    161  ifaceAltSet = uid->bAlternateSetting;
    162  protoValue = uid->bInterfaceProtocol;
    163  break;
    165  if(!valParser.Parse(pp, pcntdn))
    166  return false;
    167  if(isGoodInterface)
    168  if(theXtractor)
    169  theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_ENDPOINT_DESCRIPTOR*)varBuffer);
    170  break;
    171  //case HID_DESCRIPTOR_HID:
    172  // if (!valParser.Parse(pp, pcntdn))
    173  // return false;
    174  // PrintHidDescriptor((const USB_HID_DESCRIPTOR*)varBuffer);
    175  // break;
    176  default:
    177  if(!theSkipper.Skip(pp, pcntdn, dscrLen - 2))
    178  return false;
    179  }
    180  theBuffer.pValue = varBuffer;
    181  stateParseDescr = 0;
    182  }
    183  return true;
    184 }
    185 
    186 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    188  Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80);
    189  Notify(PSTR("bDescLength:\t\t"), 0x80);
    190  PrintHex<uint8_t > (pDesc->bLength, 0x80);
    191 
    192  Notify(PSTR("\r\nbDescriptorType:\t"), 0x80);
    193  PrintHex<uint8_t > (pDesc->bDescriptorType, 0x80);
    194 
    195  Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80);
    196  PrintHex<uint16_t > (pDesc->bcdHID, 0x80);
    197 
    198  Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80);
    199  PrintHex<uint8_t > (pDesc->bCountryCode, 0x80);
    200 
    201  Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80);
    202  PrintHex<uint8_t > (pDesc->bNumDescriptors, 0x80);
    203 
    204  for(uint8_t i = 0; i < pDesc->bNumDescriptors; i++) {
    206 
    207  Notify(PSTR("\r\nbDescrType:\t\t"), 0x80);
    208  PrintHex<uint8_t > (pLT[i].bDescrType, 0x80);
    209 
    210  Notify(PSTR("\r\nwDescriptorLength:\t"), 0x80);
    211  PrintHex<uint16_t > (pLT[i].wDescriptorLength, 0x80);
    212  }
    213  Notify(PSTR("\r\n"), 0x80);
    214 }
    215 
    216 
    217 #endif // __CONFDESCPARSER_H__
    #define CP_MASK_COMPARE_PROTOCOL
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    - +
    #define USB_DESCRIPTOR_ENDPOINT
    Definition: usb_ch9.h:74
    uint8_t bLength
    Definition: usb_ch9.h:159
    @@ -322,21 +106,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:67
    +
    bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip)
    Definition: parsetools.h:77
    +
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:72
    uint8_t bCountryCode
    Definition: usb_ch9.h:162
    - +
    #define CP_MASK_COMPARE_SUBCLASS
    void SetOR(void)
    uint8_t bNumDescriptors
    Definition: usb_ch9.h:163
    +
    bool Parse(uint8_t **pp, uint16_t *pcntdn)
    Definition: parsetools.cpp:26
    uint8_t bDescriptorType
    Definition: usb_ch9.h:160
    #define PSTR(str)
    #define HID_DESCRIPTOR_HID
    Definition: usb_ch9.h:80
    +
    uint8_t valueSize
    Definition: parsetools.h:31
    ConfigDescParser(UsbConfigXtracter *xtractor)
    -
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:49
    +
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:54
    uint8_t bInterfaceSubClass
    Definition: usb_ch9.h:142
    uint16_t bcdHID
    Definition: usb_ch9.h:161
    @@ -348,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/controller_enums_8h.html b/controller_enums_8h.html index 59f0b70e..96eaff77 100644 --- a/controller_enums_8h.html +++ b/controller_enums_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: controllerEnums.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -92,110 +93,132 @@ This graph shows which files directly or indirectly include this file:
    - + + + + + + + + + + + + + + + + + + + + + + +

    Go to the source code of this file.

    - - -RightHatY = 3 } -

    This header file is used to store different enums for the controllers, This is necessary so all the different libraries can be used at once.Enum used to turn on the LEDs on the different controllers.

    Enumerations

    enum  LEDEnum {
    +
    enum  LEDEnum {
      OFF = 0, LED1 = 1, LED2 = 2, LED3 = 3, -
    +
      LED4 = 4, LED5 = 5, LED6 = 6, LED7 = 7, -
    +
      LED8 = 8, LED9 = 9, LED10 = 10, ALL = 5 -
    +
    }
     
    enum  ColorsEnum {
    +
    enum  ColorsEnum {
      Red = 0xFF0000, Green = 0xFF00, Blue = 0xFF, Yellow = 0xFFEB04, -
    +
      Lightblue = 0xFFFF, Purple = 0xFF00FF, Purble = 0xFF00FF, White = 0xFFFFFF, -
    +
      Off = 0x00 -
    +
    }
     
    enum  RumbleEnum { RumbleHigh = 0x10, RumbleLow = 0x20 }
     
    enum  ButtonEnum {
    +
    enum  ButtonEnum {
      UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3, -
    +
      PLUS = 5, TWO = 6, ONE = 7, MINUS = 8, -
    +
      HOME = 9, Z = 10, C = 11, B = 12, -
    +
      A = 13, L = 16, R = 17, ZL = 18, -
    +
      ZR = 19, SELECT = 4, START = 5, L3 = 6, -
    +
      R3 = 7, L2 = 8, R2 = 9, L1 = 10, -
    +
      R1 = 11, TRIANGLE = 12, CIRCLE = 13, CROSS = 14, -
    +
      SQUARE = 15, PS = 16, MOVE = 17, T = 18, -
    +
      SHARE = 4, OPTIONS = 5, TOUCHPAD = 17, BACK = 4, -
    +
      X = 14, Y = 15, XBOX = 16, SYNC = 17, -
    +
      BLACK = 8, WHITE = 9, RED = 0, YELLOW = 1, -
    +
      GREEN = 2, ORANGE = 3, BLUE = 4 -
    +
    }
     
    enum  AnalogHatEnum { LeftHatX = 0, @@ -204,27 +227,27 @@ Enumerations
     
    enum  SensorEnum {
    +
    enum  SensorEnum {
      aX = 50, aY = 52, aZ = 54, gZ = 56, -
    +
      gX, gY, aXmove = 28, aZmove = 30, -
    +
      aYmove = 32, gXmove = 40, gZmove = 42, gYmove = 44, -
    +
      tempMove = 46, mXmove = 47, mZmove = 49, mYmove = 50 -
    +
    }
     
    enum  AngleEnum { Pitch = 0x01, @@ -244,29 +267,29 @@ Enumerations
    - - - - - - - - - - - -
    Enumerator
    OFF  +
    Enumerator
    OFF 
    LED1  +
    LED1 
    LED2  +
    LED2 
    LED3  +
    LED3 
    LED4  +
    LED4 
    LED5  +
    LED5 
    LED6  +
    LED6 
    LED7  +
    LED7 
    LED8  +
    LED8 
    LED9  +
    LED9 
    LED10  +
    LED10 
    ALL  +
    ALL 

    Used to blink all LEDs on the Xbox controller

    @@ -286,30 +309,30 @@ Enumerations

    Used to set the colors of the Move and PS4 controller.

    - - - - - - - - -
    Enumerator
    Red  +
    Enumerator
    Red 

    r = 255, g = 0, b = 0

    Green  +
    Green 

    r = 0, g = 255, b = 0

    Blue  +
    Blue 

    r = 0, g = 0, b = 255

    Yellow  +
    Yellow 

    r = 255, g = 235, b = 4

    Lightblue  +
    Lightblue 

    r = 0, g = 255, b = 255

    Purple  +
    Purple 

    r = 255, g = 0, b = 255

    Purble  +
    Purble 
    White  +
    White 

    r = 255, g = 255, b = 255

    Off  +
    Off 

    r = 0, g = 0, b = 0

    @@ -328,9 +351,9 @@ Enumerations
    - -
    Enumerator
    RumbleHigh  +
    Enumerator
    RumbleHigh 
    RumbleLow  +
    RumbleLow 
    @@ -349,140 +372,140 @@ Enumerations

    This enum is used to read all the different buttons on the different controllers

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Enumerator
    UP  +
    Enumerator
    UP 

    These buttons are available on all the the controllers

    RIGHT  +
    RIGHT 

    These buttons are available on all the the controllers

    DOWN  +
    DOWN 

    These buttons are available on all the the controllers

    LEFT  +
    LEFT 

    These buttons are available on all the the controllers

    PLUS  +
    PLUS 

    Wii buttons

    TWO  +
    TWO 

    Wii buttons

    ONE  +
    ONE 

    Wii buttons

    MINUS  +
    MINUS 

    Wii buttons

    HOME  +
    HOME 

    Wii buttons

    Z  +

    Wii buttons

    C  +

    Wii buttons

    B  +

    Wii buttons

    A  +

    Wii buttons

    L  +

    These are only available on the Wii U Pro Controller

    R  +

    These are only available on the Wii U Pro Controller

    ZL  +
    ZL 

    These are only available on the Wii U Pro Controller

    ZR  +
    ZR 

    These are only available on the Wii U Pro Controller

    SELECT  +
    SELECT 

    PS3 controllers buttons

    START  +
    START 

    PS3 controllers buttons

    L3  +
    L3 

    PS3 controllers buttons

    R3  +
    R3 

    PS3 controllers buttons

    L2  +
    L2 

    PS3 controllers buttons

    R2  +
    R2 

    PS3 controllers buttons

    L1  +
    L1 

    PS3 controllers buttons

    R1  +
    R1 

    PS3 controllers buttons

    TRIANGLE  +
    TRIANGLE 

    PS3 controllers buttons

    CIRCLE  +
    CIRCLE 

    PS3 controllers buttons

    CROSS  +
    CROSS 

    PS3 controllers buttons

    SQUARE  +
    SQUARE 

    PS3 controllers buttons

    PS  +
    PS 

    PS3 controllers buttons

    MOVE  +
    MOVE 

    PS3 controllers buttons

    T  +

    PS3 controllers buttons

    SHARE  +
    SHARE 

    PS4 controllers buttons - SHARE and OPTIONS are present instead of SELECT and START

    OPTIONS  +
    OPTIONS 
    TOUCHPAD  +
    TOUCHPAD 
    BACK  +
    BACK 

    Xbox buttons

    X  +

    Xbox buttons

    Y  +

    Xbox buttons

    XBOX  +
    XBOX 

    Xbox buttons

    SYNC  +
    SYNC 

    Xbox buttons

    BLACK  +
    BLACK 

    Xbox buttons

    WHITE  +
    WHITE 

    Xbox buttons

    RED  +
    RED 

    PS Buzz controllers

    YELLOW  +
    YELLOW 
    GREEN  +
    GREEN 
    ORANGE  +
    ORANGE 
    BLUE  +
    BLUE 
    @@ -501,16 +524,16 @@ Enumerations

    Joysticks on the PS3 and Xbox controllers.

    - - - -
    Enumerator
    LeftHatX  +
    Enumerator
    LeftHatX 

    Left joystick x-axis

    LeftHatY  +
    LeftHatY 

    Left joystick y-axis

    RightHatX  +
    RightHatX 

    Right joystick x-axis

    RightHatY  +
    RightHatY 

    Right joystick y-axis

    @@ -530,48 +553,48 @@ Enumerations

    Sensors inside the Sixaxis Dualshock 3, Move controller and PS4 controller. Note: that the location is shifted 9 when it's connected via USB on the PS3 controller.

    - - - - - - - - - - - - - - - -
    Enumerator
    aX  +
    Enumerator
    aX 

    Accelerometer values

    aY  +
    aY 
    aZ  +
    aZ 
    gZ  +
    gZ 

    Gyro z-axis

    gX  +
    gX 
    gY  +
    gY 
    aXmove  +
    aXmove 

    Accelerometer x-axis

    aZmove  +
    aZmove 

    Accelerometer z-axis

    aYmove  +
    aYmove 

    Accelerometer y-axis

    gXmove  +
    gXmove 

    Gyro x-axis

    gZmove  +
    gZmove 

    Gyro z-axis

    gYmove  +
    gYmove 

    Gyro y-axis

    tempMove  +
    tempMove 

    Temperature sensor

    mXmove  +
    mXmove 

    Magnetometer x-axis

    mZmove  +
    mZmove 

    Magnetometer z-axis

    mYmove  +
    mYmove 

    Magnetometer y-axis

    @@ -591,9 +614,9 @@ Enumerations

    Used to get the angle calculated using the PS3 controller and PS4 controller.

    - -
    Enumerator
    Pitch  +
    Enumerator
    Pitch 
    Roll  +
    Roll 
    @@ -606,7 +629,7 @@ Enumerations diff --git a/controller_enums_8h__dep__incl.map b/controller_enums_8h__dep__incl.map index 7b221b52..2a9c267e 100644 --- a/controller_enums_8h__dep__incl.map +++ b/controller_enums_8h__dep__incl.map @@ -1,24 +1,24 @@ - - - - - - - - + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/controller_enums_8h__dep__incl.md5 b/controller_enums_8h__dep__incl.md5 index 6d1dc032..a454f8ea 100644 --- a/controller_enums_8h__dep__incl.md5 +++ b/controller_enums_8h__dep__incl.md5 @@ -1 +1 @@ -ce160d3aed3cc5b63b417a471188bc0b \ No newline at end of file +4fdabf04235560d8eaef94d5795a6445 \ No newline at end of file diff --git a/controller_enums_8h__dep__incl.png b/controller_enums_8h__dep__incl.png index ddacc2bb13d8fc4072c14b6aa1783716b9ce862f..3ef777012b7880373bd3a06e4861c0e9728eccfa 100644 GIT binary patch literal 33187 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 literal 36195 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 A#sB~S diff --git a/controller_enums_8h_source.html b/controller_enums_8h_source.html index ea960c39..6a60e3ef 100644 --- a/controller_enums_8h_source.html +++ b/controller_enums_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: controllerEnums.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0

    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,153 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    controllerEnums.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
    -
    2 
    -
    3  This software may be distributed and modified under the terms of the GNU
    -
    4  General Public License version 2 (GPL2) as published by the Free Software
    -
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7  on this software must also be made publicly available under the terms of
    -
    8  the GPL2 ("Copyleft").
    -
    9 
    -
    10  Contact information
    -
    11  -------------------
    -
    12 
    -
    13  Kristian Lauszus, TKJ Electronics
    -
    14  Web : http://www.tkjelectronics.com
    -
    15  e-mail : kristianl@tkjelectronics.com
    -
    16  */
    -
    17 
    -
    18 #ifndef _controllerenums_h
    -
    19 #define _controllerenums_h
    -
    20 
    -
    21 #if defined(ESP32)
    -
    22 #undef PS
    -
    23 #endif
    -
    24 
    -
    31 enum LEDEnum {
    -
    32  OFF = 0,
    -
    33 #ifndef RBL_NRF51822
    -
    34  LED1 = 1,
    -
    35  LED2 = 2,
    -
    36  LED3 = 3,
    -
    37  LED4 = 4,
    -
    38 #endif
    -
    39  LED5 = 5,
    -
    40  LED6 = 6,
    -
    41  LED7 = 7,
    -
    42  LED8 = 8,
    -
    43  LED9 = 9,
    -
    44  LED10 = 10,
    -
    46  ALL = 5,
    -
    47 };
    -
    48 
    -
    50 enum ColorsEnum {
    -
    52  Red = 0xFF0000,
    -
    54  Green = 0xFF00,
    -
    56  Blue = 0xFF,
    -
    57 
    -
    59  Yellow = 0xFFEB04,
    -
    61  Lightblue = 0xFFFF,
    -
    63  Purple = 0xFF00FF,
    -
    64  Purble = 0xFF00FF,
    -
    65 
    -
    67  White = 0xFFFFFF,
    -
    69  Off = 0x00,
    -
    70 };
    -
    71 
    -
    72 enum RumbleEnum {
    -
    73  RumbleHigh = 0x10,
    -
    74  RumbleLow = 0x20,
    -
    75 };
    -
    76 
    -
    78 enum ButtonEnum {
    -
    81  UP = 0,
    -
    82  RIGHT = 1,
    -
    83  DOWN = 2,
    -
    84  LEFT = 3,
    -
    89  PLUS = 5,
    -
    90  TWO = 6,
    -
    91  ONE = 7,
    -
    92  MINUS = 8,
    -
    93  HOME = 9,
    -
    94  Z = 10,
    -
    95  C = 11,
    -
    96  B = 12,
    -
    97  A = 13,
    -
    102  L = 16,
    -
    103  R = 17,
    -
    104  ZL = 18,
    -
    105  ZR = 19,
    -
    110  SELECT = 4,
    -
    111  START = 5,
    -
    112  L3 = 6,
    -
    113  R3 = 7,
    -
    114 
    -
    115  L2 = 8,
    -
    116  R2 = 9,
    -
    117  L1 = 10,
    -
    118  R1 = 11,
    -
    119  TRIANGLE = 12,
    -
    120  CIRCLE = 13,
    -
    121  CROSS = 14,
    -
    122  SQUARE = 15,
    -
    123 
    -
    124  PS = 16,
    -
    125 
    -
    126  MOVE = 17, // Covers 12 bits - we only need to read the top 8
    -
    127  T = 18, // Covers 12 bits - we only need to read the top 8
    -
    131  SHARE = 4,
    -
    132  OPTIONS = 5,
    -
    133  TOUCHPAD = 17,
    -
    138  BACK = 4,
    -
    139  X = 14,
    -
    140  Y = 15,
    -
    141  XBOX = 16,
    -
    142  SYNC = 17,
    -
    143  BLACK = 8, // Available on the original Xbox controller
    -
    144  WHITE = 9, // Available on the original Xbox controller
    -
    148  RED = 0,
    -
    149  YELLOW = 1,
    -
    150  GREEN = 2,
    -
    151  ORANGE = 3,
    -
    152  BLUE = 4,
    -
    154 };
    -
    155 
    - -
    159  LeftHatX = 0,
    -
    161  LeftHatY = 1,
    - - -
    166 };
    -
    167 
    - -
    174  aX = 50, aY = 52, aZ = 54,
    -
    176  gZ = 56,
    -
    177  gX, gY, // These are not available on the PS3 controller
    -
    178 
    -
    180  aXmove = 28,
    -
    182  aZmove = 30,
    -
    184  aYmove = 32,
    -
    185 
    -
    187  gXmove = 40,
    -
    189  gZmove = 42,
    -
    191  gYmove = 44,
    -
    192 
    -
    194  tempMove = 46,
    -
    195 
    -
    197  mXmove = 47,
    -
    199  mZmove = 49,
    -
    201  mYmove = 50,
    -
    202 };
    -
    203 
    -
    205 enum AngleEnum {
    -
    206  Pitch = 0x01,
    -
    207  Roll = 0x02,
    -
    208 };
    -
    209 
    -
    210 #endif
    - +Go to the documentation of this file.
    1 /* Copyright (C) 2013 Kristian Lauszus, TKJ Electronics. All rights reserved.
    2 
    3  This software may be distributed and modified under the terms of the GNU
    4  General Public License version 2 (GPL2) as published by the Free Software
    5  Foundation and appearing in the file GPL2.TXT included in the packaging of
    6  this file. Please note that GPL2 Section 2[b] requires that all works based
    7  on this software must also be made publicly available under the terms of
    8  the GPL2 ("Copyleft").
    9 
    10  Contact information
    11  -------------------
    12 
    13  Kristian Lauszus, TKJ Electronics
    14  Web : http://www.tkjelectronics.com
    15  e-mail : kristianl@tkjelectronics.com
    16  */
    17 
    18 #ifndef _controllerenums_h
    19 #define _controllerenums_h
    20 
    21 #if defined(ESP32)
    22 #undef PS
    23 #endif
    24 
    31 enum LEDEnum {
    32  OFF = 0,
    33 #ifndef RBL_NRF51822
    34  LED1 = 1,
    35  LED2 = 2,
    36  LED3 = 3,
    37  LED4 = 4,
    38 #endif
    39  LED5 = 5,
    40  LED6 = 6,
    41  LED7 = 7,
    42  LED8 = 8,
    43  LED9 = 9,
    44  LED10 = 10,
    46  ALL = 5,
    47 };
    48 
    50 enum ColorsEnum {
    52  Red = 0xFF0000,
    54  Green = 0xFF00,
    56  Blue = 0xFF,
    57 
    59  Yellow = 0xFFEB04,
    61  Lightblue = 0xFFFF,
    63  Purple = 0xFF00FF,
    64  Purble = 0xFF00FF,
    65 
    67  White = 0xFFFFFF,
    69  Off = 0x00,
    70 };
    71 
    72 enum RumbleEnum {
    73  RumbleHigh = 0x10,
    74  RumbleLow = 0x20,
    75 };
    76 
    78 enum ButtonEnum {
    81  UP = 0,
    82  RIGHT = 1,
    83  DOWN = 2,
    84  LEFT = 3,
    89  PLUS = 5,
    90  TWO = 6,
    91  ONE = 7,
    92  MINUS = 8,
    93  HOME = 9,
    94  Z = 10,
    95  C = 11,
    96  B = 12,
    97  A = 13,
    102  L = 16,
    103  R = 17,
    104  ZL = 18,
    105  ZR = 19,
    110  SELECT = 4,
    111  START = 5,
    112  L3 = 6,
    113  R3 = 7,
    114 
    115  L2 = 8,
    116  R2 = 9,
    117  L1 = 10,
    118  R1 = 11,
    119  TRIANGLE = 12,
    120  CIRCLE = 13,
    121  CROSS = 14,
    122  SQUARE = 15,
    123 
    124  PS = 16,
    125 
    126  MOVE = 17, // Covers 12 bits - we only need to read the top 8
    127  T = 18, // Covers 12 bits - we only need to read the top 8
    131  SHARE = 4,
    132  OPTIONS = 5,
    133  TOUCHPAD = 17,
    138  BACK = 4,
    139  X = 14,
    140  Y = 15,
    141  XBOX = 16,
    142  SYNC = 17,
    143  BLACK = 8, // Available on the original Xbox controller
    144  WHITE = 9, // Available on the original Xbox controller
    148  RED = 0,
    149  YELLOW = 1,
    150  GREEN = 2,
    151  ORANGE = 3,
    152  BLUE = 4,
    154 };
    155 
    159  LeftHatX = 0,
    161  LeftHatY = 1,
    166 };
    167 
    174  aX = 50, aY = 52, aZ = 54,
    176  gZ = 56,
    177  gX, gY, // These are not available on the PS3 controller
    178 
    180  aXmove = 28,
    182  aZmove = 30,
    184  aYmove = 32,
    185 
    187  gXmove = 40,
    189  gZmove = 42,
    191  gYmove = 44,
    192 
    194  tempMove = 46,
    195 
    197  mXmove = 47,
    199  mZmove = 49,
    201  mYmove = 50,
    202 };
    203 
    205 enum AngleEnum {
    206  Pitch = 0x01,
    207  Roll = 0x02,
    208 };
    209 
    210 #endif
    @@ -335,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ftv2doc.png b/doc.png similarity index 100% rename from ftv2doc.png rename to doc.png diff --git a/doxygen.css b/doxygen.css index f0f36f89..1425ec53 100644 --- a/doxygen.css +++ b/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.8.6 */ +/* The standard CSS for doxygen 1.8.11 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; @@ -206,6 +206,11 @@ div.line { transition-duration: 0.5s; } +div.line:after { + content:"\000A"; + white-space: pre; +} + div.line.glow { background-color: cyan; box-shadow: 0 0 10px cyan; @@ -227,7 +232,7 @@ span.lineno a:hover { background-color: #C8C8C8; } -div.ah { +div.ah, span.ah { background-color: black; font-weight: bold; color: #ffffff; @@ -242,7 +247,16 @@ div.ah { -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; } div.groupHeader { @@ -670,12 +684,12 @@ span.mlabel { /* @end */ -/* these are for tree view when not used as main index */ +/* these are for tree view inside a (index) page */ div.directory { margin: 10px 0px; - border-top: 1px solid #A8B8D9; - border-bottom: 1px solid #A8B8D9; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; width: 100%; } @@ -734,6 +748,80 @@ div.directory { color: #3D578C; } +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + div.dynheader { margin-top: 8px; -webkit-touch-callout: none; @@ -749,6 +837,10 @@ address { color: #2A3D61; } +table.doxtable caption { + caption-side: top; +} + table.doxtable { border-collapse:collapse; margin-top: 4px; @@ -914,6 +1006,18 @@ div.summary a white-space: nowrap; } +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + div.ingroups { font-size: 8pt; @@ -1025,6 +1129,11 @@ dl.section dd { border: 0px none; } +#projectalign +{ + vertical-align: middle; +} + #projectname { font: 300% Tahoma, Arial,sans-serif; @@ -1108,7 +1217,7 @@ div.toc { border-radius: 7px 7px 7px 7px; float: right; height: auto; - margin: 0 20px 10px 10px; + margin: 0 8px 10px 10px; width: 200px; } diff --git a/dynsections.js b/dynsections.js index 2f15470d..1e6bf07f 100644 --- a/dynsections.js +++ b/dynsections.js @@ -24,19 +24,20 @@ function updateStripes() $('table.directory tr'). removeClass('even').filter(':visible:even').addClass('even'); } + function toggleLevel(level) { - $('table.directory tr').each(function(){ + $('table.directory tr').each(function() { var l = this.id.split('_').length-1; var i = $('#img'+this.id.substring(3)); var a = $('#arr'+this.id.substring(3)); if (l - + USB Host Shield 2.0: File List + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,86 +88,86 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Here is a list of all files with brief descriptions:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    o*address.h
    o*adk.cpp
    o*adk.h
    o*avrpins.h
    o*BTD.cpp
    o*BTD.h
    o*BTHID.cpp
    o*BTHID.h
    o*cdc_XR21B1411.cpp
    o*cdc_XR21B1411.h
    o*cdcacm.cpp
    o*cdcacm.h
    o*cdcftdi.cpp
    o*cdcftdi.h
    o*cdcprolific.cpp
    o*cdcprolific.h
    o*confdescparser.h
    o*controllerEnums.h
    o*hexdump.h
    o*hidboot.cpp
    o*hidboot.h
    o*hidcomposite.cpp
    o*hidcomposite.h
    o*hidescriptorparser.cpp
    o*hidescriptorparser.h
    o*hiduniversal.cpp
    o*hiduniversal.h
    o*hidusagestr.h
    o*hidusagetitlearrays.cpp
    o*macros.h
    o*masstorage.cpp
    o*masstorage.h
    o*max3421e.h
    o*max_LCD.cpp
    o*max_LCD.h
    o*message.cpp
    o*message.h
    o*parsetools.cpp
    o*parsetools.h
    o*printhex.h
    o*PS3BT.cpp
    o*PS3BT.h
    o*PS3Enums.h
    o*PS3USB.cpp
    o*PS3USB.h
    o*PS4BT.h
    o*PS4Parser.cpp
    o*PS4Parser.h
    o*PS4USB.h
    o*PSBuzz.cpp
    o*PSBuzz.h
    o*settings.h
    o*sink_parser.h
    o*SPP.cpp
    o*SPP.h
    o*UHS2_gpio.cpp
    o*UHS2_gpio.h
    o*Usb.cpp
    o*Usb.h
    o*usb_ch9.h
    o*UsbCore.h
    o*usbh_midi.cpp
    o*usbh_midi.h
    o*usbhid.cpp
    o*usbhid.h
    o*usbhost.h
    o*usbhub.cpp
    o*usbhub.h
    o*version_helper.h
    o*Wii.cpp
    o*Wii.h
    o*xboxEnums.h
    o*XBOXOLD.cpp
    o*XBOXOLD.h
    o*XBOXONE.cpp
    o*XBOXONE.h
    o*XBOXRECV.cpp
    o*XBOXRECV.h
    o*XBOXUSB.cpp
    \*XBOXUSB.h
     address.h
     adk.cpp
     adk.h
     avrpins.h
     BTD.cpp
     BTD.h
     BTHID.cpp
     BTHID.h
     cdc_XR21B1411.cpp
     cdc_XR21B1411.h
     cdcacm.cpp
     cdcacm.h
     cdcftdi.cpp
     cdcftdi.h
     cdcprolific.cpp
     cdcprolific.h
     confdescparser.h
     controllerEnums.h
     hexdump.h
     hidboot.cpp
     hidboot.h
     hidcomposite.cpp
     hidcomposite.h
     hidescriptorparser.cpp
     hidescriptorparser.h
     hiduniversal.cpp
     hiduniversal.h
     hidusagestr.h
     hidusagetitlearrays.cpp
     macros.h
     masstorage.cpp
     masstorage.h
     max3421e.h
     max_LCD.cpp
     max_LCD.h
     message.cpp
     message.h
     parsetools.cpp
     parsetools.h
     printhex.h
     PS3BT.cpp
     PS3BT.h
     PS3Enums.h
     PS3USB.cpp
     PS3USB.h
     PS4BT.h
     PS4Parser.cpp
     PS4Parser.h
     PS4USB.h
     PSBuzz.cpp
     PSBuzz.h
     settings.h
     sink_parser.h
     SPP.cpp
     SPP.h
     UHS2_gpio.cpp
     UHS2_gpio.h
     Usb.cpp
     Usb.h
     usb_ch9.h
     UsbCore.h
     usbh_midi.cpp
     usbh_midi.h
     usbhid.cpp
     usbhid.h
     usbhost.h
     usbhub.cpp
     usbhub.h
     version_helper.h
     Wii.cpp
     Wii.h
     xboxEnums.h
     XBOXOLD.cpp
     XBOXOLD.h
     XBOXONE.cpp
     XBOXONE.h
     XBOXRECV.cpp
     XBOXRECV.h
     XBOXUSB.cpp
     XBOXUSB.h
    @@ -174,7 +175,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ftv2folderclosed.png b/folderclosed.png similarity index 100% rename from ftv2folderclosed.png rename to folderclosed.png diff --git a/ftv2folderopen.png b/folderopen.png similarity index 100% rename from ftv2folderopen.png rename to folderopen.png diff --git a/ftv2blank.png b/ftv2blank.png deleted file mode 100644 index 63c605bb4c3d941c921a4b6cfa74951e946bcb48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka diff --git a/ftv2cl.png b/ftv2cl.png deleted file mode 100644 index 132f6577bf7f085344904602815a260d29f55d9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 453 zcmV;$0XqJPP)VBF;ev;toEj8_OB0EQg5eYilIj#JZG_m^33l3^k4mtzx!TVD?g)Y$ zrvwRDSqT!wLIM$dWCIa$vtxE|mzbTzu-y&$FvF6WA2a{Wr1g}`WdPT-0JzEZ0IxAv z-Z+ejZc&H;I5-pb_SUB}04j0^V)3t{`z<7asDl2Tw3w3sP%)0^8$bhEg)IOTBcRXv zFfq~3&gvJ$F-U7mpBW8z1GY~HK&7h4^YI~Orv~wLnC0PP_dAkv;nzX{9Q|8Gv=2ca z@v)c9T;D#h`TZ2X&&$ff2wedmot995de~-s3I)yauahg;7qn*?1n?F$e+PwP37}~; z1NKUk7reVK^7A;$QRW7qAx40HHUZ<|k3U%nz(Ec`#i+q9K!dgcROAlCS?`L= v>#=f?wF5ZND!1uAfQsk;KN^4&*8~0npJiJ%2dj9(00000NkvXXu0mjfWVFf_ diff --git a/ftv2lastnode.png b/ftv2lastnode.png deleted file mode 100644 index 63c605bb4c3d941c921a4b6cfa74951e946bcb48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka diff --git a/ftv2link.png b/ftv2link.png deleted file mode 100644 index 17edabff95f7b8da13c9516a04efe05493c29501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t diff --git a/ftv2mnode.png b/ftv2mnode.png deleted file mode 100644 index 0b63f6d38c4b9ec907b820192ebe9724ed6eca22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 diff --git a/ftv2mo.png b/ftv2mo.png deleted file mode 100644 index 4bfb80f76e65815989a9350ad79d8ce45380e2b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403 zcmV;E0c`$>P)${!fXv7NWJ%@%u4(KapRY>T6_x;E zxE7kt!}Tiw8@d9Sd`rTGum>z#Q14vIm`wm1#-byD1muMi02@YNO5LRF0o!Y{`a!Ya z{^&p0Su|s705&2QxmqdexG+-zNKL3f@8gTQSJrKByfo+oNJ^-{|Mn||Q5SDwjQVsS zr1}7o5-QMs>gYIMD>GRw@$lT`z4r-_m{5U#cR{urD_)TOeY)(UD|qZ^&y`IVijqk~ xs(9-kWFr7E^!lgi8GsFK5kOY_{Xbgf0^etEU%fLevs?fG002ovPDHLkV1nB&vX1}& diff --git a/ftv2node.png b/ftv2node.png deleted file mode 100644 index 63c605bb4c3d941c921a4b6cfa74951e946bcb48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka diff --git a/ftv2ns.png b/ftv2ns.png deleted file mode 100644 index 72e3d71c2892d6f00e259facebc88b45f6db2e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmV-~0ek+5P)f+++#cT|!CkD&4pnIkeMEUEM*>`*9>+Juji$!h-mW%M^8s9957{3nvbrz^&=u<~TAUrFROkmt%^F~Ez+-c53Lv%iH3d38!Rv?K zrb&MYAhp;Gf<}wS;9ZZq2@;!uYG;=Z>~GKE^{HD4keu}lnyqhc>kWX^tQn|warJ~h zT+rtMkdz6aHoN%z(o|&wpu@@OpJnF_z{PA)6(FHw02iHslz^(N{4*+K9)QJHR87wT iTyp>aXaF{u2lxRou|^4tux6eB0000^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K diff --git a/ftv2vertline.png b/ftv2vertline.png deleted file mode 100644 index 63c605bb4c3d941c921a4b6cfa74951e946bcb48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka diff --git a/functions.html b/functions.html index 34f01eb9..50f9e151 100644 --- a/functions.html +++ b/functions.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -134,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_a.html b/functions_a.html index 1327361c..64860fc6 100644 --- a/functions_a.html +++ b/functions_a.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -283,7 +284,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_b.html b/functions_b.html index 87c484c2..8df6b68e 100644 --- a/functions_b.html +++ b/functions_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -588,7 +589,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_c.html b/functions_c.html index 2ce0526e..3a78c960 100644 --- a/functions_c.html +++ b/functions_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -287,7 +288,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_d.html b/functions_d.html index 5b888eef..0a2e7589 100644 --- a/functions_d.html +++ b/functions_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -237,7 +238,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_e.html b/functions_e.html index a8231723..64a4dd8c 100644 --- a/functions_e.html +++ b/functions_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -225,7 +226,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_enum.html b/functions_enum.html index d32f381a..1fe022a9 100644 --- a/functions_enum.html +++ b/functions_enum.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Enumerations + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -83,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -103,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_eval.html b/functions_eval.html index 3459fcd8..064524f4 100644 --- a/functions_eval.html +++ b/functions_eval.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Enumerator + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -83,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -115,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_f.html b/functions_f.html index 1c950e9c..26048460 100644 --- a/functions_f.html +++ b/functions_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -154,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func.html b/functions_func.html index d1ffc72b..27a2cbc6 100644 --- a/functions_func.html +++ b/functions_func.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -177,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_b.html b/functions_func_b.html index 3e0899cd..6168a012 100644 --- a/functions_func_b.html +++ b/functions_func_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -161,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_c.html b/functions_func_c.html index a9c5b758..0e95f032 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -194,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_d.html b/functions_func_d.html index 57eaf9c4..4596f009 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -169,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_e.html b/functions_func_e.html index 5bb37440..9ca6ab89 100644 --- a/functions_func_e.html +++ b/functions_func_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -150,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_f.html b/functions_func_f.html index 8ec58130..8d9b4b3a 100644 --- a/functions_func_f.html +++ b/functions_func_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -142,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_g.html b/functions_func_g.html index 386aed72..f5401132 100644 --- a/functions_func_g.html +++ b/functions_func_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -419,7 +420,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_h.html b/functions_func_h.html index 6badf818..797287f1 100644 --- a/functions_func_h.html +++ b/functions_func_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -204,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_i.html b/functions_func_i.html index 8c86102d..2646330d 100644 --- a/functions_func_i.html +++ b/functions_func_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -201,7 +202,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_k.html b/functions_func_k.html index 37bd8146..41c2ae86 100644 --- a/functions_func_k.html +++ b/functions_func_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -131,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_l.html b/functions_func_l.html index c7080b8e..f63b1242 100644 --- a/functions_func_l.html +++ b/functions_func_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -164,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_m.html b/functions_func_m.html index 1d3a12a0..73197d51 100644 --- a/functions_func_m.html +++ b/functions_func_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -142,13 +143,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • MultiByteValueParser() : MultiByteValueParser
  • +
  • MultiValueBuffer() +: MultiValueBuffer +
  • diff --git a/functions_func_n.html b/functions_func_n.html index e1f1cb41..66c14028 100644 --- a/functions_func_n.html +++ b/functions_func_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -140,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_o.html b/functions_func_o.html index 8e7f4d68..066f1613 100644 --- a/functions_func_o.html +++ b/functions_func_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -195,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_p.html b/functions_func_p.html index eb4b5b06..eeaa7a30 100644 --- a/functions_func_p.html +++ b/functions_func_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -285,7 +286,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_r.html b/functions_func_r.html index 17ca4793..ee48b9e7 100644 --- a/functions_func_r.html +++ b/functions_func_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -227,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_s.html b/functions_func_s.html index d731322b..4651c195 100644 --- a/functions_func_s.html +++ b/functions_func_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -354,7 +355,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_t.html b/functions_func_t.html index 8c42fc6c..426eec73 100644 --- a/functions_func_t.html +++ b/functions_func_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -132,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_u.html b/functions_func_u.html index 37a2b67e..dcfd4e94 100644 --- a/functions_func_u.html +++ b/functions_func_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_v.html b/functions_func_v.html index 3f9fad1e..b2f6f0ba 100644 --- a/functions_func_v.html +++ b/functions_func_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -145,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_w.html b/functions_func_w.html index d625e38b..bd112bdb 100644 --- a/functions_func_w.html +++ b/functions_func_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -133,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • write() : Max_LCD -, SPP +, SPP
  • write_register() : XR21B1411 @@ -147,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_x.html b/functions_func_x.html index 3e21e61e..56e144ba 100644 --- a/functions_func_x.html +++ b/functions_func_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_g.html b/functions_g.html index 8d35d6c8..d1583c93 100644 --- a/functions_g.html +++ b/functions_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -488,7 +489,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_h.html b/functions_h.html index cfcceb46..943b9baf 100644 --- a/functions_h.html +++ b/functions_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -225,7 +226,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_i.html b/functions_i.html index acabe3a6..14226382 100644 --- a/functions_i.html +++ b/functions_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -251,7 +252,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_k.html b/functions_k.html index 383dff4d..5d6317cb 100644 --- a/functions_k.html +++ b/functions_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -146,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_l.html b/functions_l.html index f9d6eb70..bdd0eb4b 100644 --- a/functions_l.html +++ b/functions_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -246,7 +247,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_m.html b/functions_m.html index 9faf7123..f95a07ab 100644 --- a/functions_m.html +++ b/functions_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -190,7 +191,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : MouseReportParser
  • moveSetBulb() -: PS3BT +: PS3BT , PS3USB
  • moveSetRumble() @@ -203,6 +204,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • MULTIP : InquiryResponse
  • +
  • MultiValueBuffer() +: MultiValueBuffer +
  • my_bdaddr : BTD
  • @@ -212,7 +216,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_n.html b/functions_n.html index 7700c3af..4ac2463d 100644 --- a/functions_n.html +++ b/functions_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -149,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_o.html b/functions_o.html index 16cfcaf8..230ad970 100644 --- a/functions_o.html +++ b/functions_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -215,7 +216,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_p.html b/functions_p.html index cf7bc334..cb6b1a8b 100644 --- a/functions_p.html +++ b/functions_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -188,7 +189,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : InquiryResponse
  • pFuncOnInit -: BluetoothService +: BluetoothService
  • pfUsage : ReportDescParserBase @@ -368,7 +369,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_q.html b/functions_q.html index 6624e6ed..4986d3d2 100644 --- a/functions_q.html +++ b/functions_q.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -137,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_r.html b/functions_r.html index eb4d6829..71b57598 100644 --- a/functions_r.html +++ b/functions_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -313,7 +314,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_s.html b/functions_s.html index 8ca381b3..769c161a 100644 --- a/functions_s.html +++ b/functions_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -407,7 +408,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_t.html b/functions_t.html index 147faa47..2341537c 100644 --- a/functions_t.html +++ b/functions_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -195,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_type.html b/functions_type.html index ca0cbf58..d8e38b4d 100644 --- a/functions_type.html +++ b/functions_type.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Typedefs + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -83,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -95,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); @@ -103,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_u.html b/functions_u.html index 03526181..e8853f83 100644 --- a/functions_u.html +++ b/functions_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -135,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : BASICCDB
  • UsagePageFunc -: ReportDescParserBase +: ReportDescParserBase
  • usagePageFunctions : ReportDescParserBase @@ -167,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_v.html b/functions_v.html index bb2549b6..390db6a2 100644 --- a/functions_v.html +++ b/functions_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -183,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars.html b/functions_vars.html index 8d1ae6af..f14710c9 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -134,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_a.html b/functions_vars_a.html index 369deaa0..d064ddf0 100644 --- a/functions_vars_a.html +++ b/functions_vars_a.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -234,7 +235,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_b.html b/functions_vars_b.html index add14dce..cc81830f 100644 --- a/functions_vars_b.html +++ b/functions_vars_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -555,7 +556,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_c.html b/functions_vars_c.html index 09e97f2c..a9604282 100644 --- a/functions_vars_c.html +++ b/functions_vars_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -223,7 +224,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_d.html b/functions_vars_d.html index 0712fb18..5097d1fb 100644 --- a/functions_vars_d.html +++ b/functions_vars_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -196,7 +197,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_e.html b/functions_vars_e.html index ba92b558..2498811f 100644 --- a/functions_vars_e.html +++ b/functions_vars_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -194,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_f.html b/functions_vars_f.html index c843318b..405759df 100644 --- a/functions_vars_f.html +++ b/functions_vars_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -140,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_g.html b/functions_vars_g.html index 8df03970..7bff218f 100644 --- a/functions_vars_g.html +++ b/functions_vars_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -197,7 +198,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_h.html b/functions_vars_h.html index 418c8895..b62ea80f 100644 --- a/functions_vars_h.html +++ b/functions_vars_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -151,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_i.html b/functions_vars_i.html index 803e8a7b..16f01c46 100644 --- a/functions_vars_i.html +++ b/functions_vars_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -182,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_k.html b/functions_vars_k.html index 944f5b20..e3dc6971 100644 --- a/functions_vars_k.html +++ b/functions_vars_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_l.html b/functions_vars_l.html index 59c66a0b..e8293802 100644 --- a/functions_vars_l.html +++ b/functions_vars_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -210,7 +211,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_m.html b/functions_vars_m.html index 9717195b..c03cf671 100644 --- a/functions_vars_m.html +++ b/functions_vars_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -186,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_n.html b/functions_vars_n.html index 97978991..148a7b8c 100644 --- a/functions_vars_n.html +++ b/functions_vars_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -137,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_o.html b/functions_vars_o.html index 9ec2f927..d0330d0c 100644 --- a/functions_vars_o.html +++ b/functions_vars_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -148,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_p.html b/functions_vars_p.html index 96f7fef4..3bb23e09 100644 --- a/functions_vars_p.html +++ b/functions_vars_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -141,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : InquiryResponse
  • pFuncOnInit -: BluetoothService +: BluetoothService
  • pfUsage : ReportDescParserBase @@ -208,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_q.html b/functions_vars_q.html index 7d50e057..266f3d63 100644 --- a/functions_vars_q.html +++ b/functions_vars_q.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -137,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_r.html b/functions_vars_r.html index 6c60cbef..dc4bc2e5 100644 --- a/functions_vars_r.html +++ b/functions_vars_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -214,7 +215,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_s.html b/functions_vars_s.html index d6fc2f4e..e1291860 100644 --- a/functions_vars_s.html +++ b/functions_vars_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -181,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_t.html b/functions_vars_t.html index 7ca309f9..8dad6e32 100644 --- a/functions_vars_t.html +++ b/functions_vars_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -191,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_u.html b/functions_vars_u.html index 043398df..52b34c5a 100644 --- a/functions_vars_u.html +++ b/functions_vars_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -149,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_v.html b/functions_vars_v.html index fec20b81..c905ddb4 100644 --- a/functions_vars_v.html +++ b/functions_vars_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -166,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_w.html b/functions_vars_w.html index 0a566003..af3ba86a 100644 --- a/functions_vars_w.html +++ b/functions_vars_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -189,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_x.html b/functions_vars_x.html index 6b6a4595..5d30e8e9 100644 --- a/functions_vars_x.html +++ b/functions_vars_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -150,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_y.html b/functions_vars_y.html index 3ea9dd62..d43cabfa 100644 --- a/functions_vars_y.html +++ b/functions_vars_y.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_w.html b/functions_w.html index ba0a2d3c..32e2da03 100644 --- a/functions_w.html +++ b/functions_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -173,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • write() : Max_LCD -, SPP +, SPP
  • write_register() : XR21B1411 @@ -206,7 +207,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_x.html b/functions_x.html index 2cf2824e..0892a591 100644 --- a/functions_x.html +++ b/functions_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -165,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_y.html b/functions_y.html index ca5661a6..1620b9cc 100644 --- a/functions_y.html +++ b/functions_y.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals.html b/globals.html index b72470ad..d5b5be40 100644 --- a/globals.html +++ b/globals.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_a.html b/globals_a.html index aa546c5b..6751d7d2 100644 --- a/globals_a.html +++ b/globals_a.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -218,7 +219,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_b.html b/globals_b.html index d0e77d15..74daae89 100644 --- a/globals_b.html +++ b/globals_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -734,7 +735,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_c.html b/globals_c.html index d3cb5349..fed02220 100644 --- a/globals_c.html +++ b/globals_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -323,7 +324,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_d.html b/globals_d.html index 297affe9..e80befea 100644 --- a/globals_d.html +++ b/globals_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -227,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs.html b/globals_defs.html index 3ffad5cc..c0031b25 100644 --- a/globals_defs.html +++ b/globals_defs.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -141,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_a.html b/globals_defs_a.html index b41b3de1..0d9811e3 100644 --- a/globals_defs_a.html +++ b/globals_defs_a.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -183,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_b.html b/globals_defs_b.html index ac331abc..7af7af52 100644 --- a/globals_defs_b.html +++ b/globals_defs_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -696,7 +697,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_c.html b/globals_defs_c.html index 8bae2701..5d9c451e 100644 --- a/globals_defs_c.html +++ b/globals_defs_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -291,7 +292,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_d.html b/globals_defs_d.html index 046ef4b0..cfcdf8dd 100644 --- a/globals_defs_d.html +++ b/globals_defs_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -180,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_e.html b/globals_defs_e.html index 3cde902e..afd88d89 100644 --- a/globals_defs_e.html +++ b/globals_defs_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -225,7 +226,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_f.html b/globals_defs_f.html index 5503b4c9..82893b0b 100644 --- a/globals_defs_f.html +++ b/globals_defs_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -273,7 +274,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_g.html b/globals_defs_g.html index 84e123b4..fef623d1 100644 --- a/globals_defs_g.html +++ b/globals_defs_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -156,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_h.html b/globals_defs_h.html index f0070b67..9ad60fae 100644 --- a/globals_defs_h.html +++ b/globals_defs_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -442,7 +443,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_i.html b/globals_defs_i.html index f5bb2edf..ceb3d51c 100644 --- a/globals_defs_i.html +++ b/globals_defs_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -141,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_j.html b/globals_defs_j.html index 0e2216cf..2ebc593b 100644 --- a/globals_defs_j.html +++ b/globals_defs_j.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -137,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_k.html b/globals_defs_k.html index 0788a45d..858f036b 100644 --- a/globals_defs_k.html +++ b/globals_defs_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -189,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_l.html b/globals_defs_l.html index c33fcaa0..a17ba478 100644 --- a/globals_defs_l.html +++ b/globals_defs_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -354,7 +355,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_m.html b/globals_defs_m.html index d8516b84..2d0417a9 100644 --- a/globals_defs_m.html +++ b/globals_defs_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -329,7 +330,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_n.html b/globals_defs_n.html index 34961e56..81f868d1 100644 --- a/globals_defs_n.html +++ b/globals_defs_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -162,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_o.html b/globals_defs_o.html index 55c8bd46..841b096b 100644 --- a/globals_defs_o.html +++ b/globals_defs_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -144,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_p.html b/globals_defs_p.html index 1dd12dee..be407f85 100644 --- a/globals_defs_p.html +++ b/globals_defs_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -253,7 +254,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_r.html b/globals_defs_r.html index 0f1b2fba..602b2524 100644 --- a/globals_defs_r.html +++ b/globals_defs_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -228,7 +229,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_s.html b/globals_defs_s.html index 030d2553..a280214a 100644 --- a/globals_defs_s.html +++ b/globals_defs_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -471,7 +472,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_t.html b/globals_defs_t.html index 0c53cc9e..dc5a04e1 100644 --- a/globals_defs_t.html +++ b/globals_defs_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -231,7 +232,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_u.html b/globals_defs_u.html index c31236ff..7d1329c5 100644 --- a/globals_defs_u.html +++ b/globals_defs_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -510,7 +511,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_v.html b/globals_defs_v.html index 094660ac..21c8341e 100644 --- a/globals_defs_v.html +++ b/globals_defs_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -156,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_w.html b/globals_defs_w.html index e29a3fef..c9eaf168 100644 --- a/globals_defs_w.html +++ b/globals_defs_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -162,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_x.html b/globals_defs_x.html index 15904b46..968b34df 100644 --- a/globals_defs_x.html +++ b/globals_defs_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -454,7 +455,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_e.html b/globals_e.html index 4c1ddbc9..70f423f4 100644 --- a/globals_e.html +++ b/globals_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -245,7 +246,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_enum.html b/globals_enum.html index 6f9c7d54..c0712ad2 100644 --- a/globals_enum.html +++ b/globals_enum.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -82,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -144,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_eval.html b/globals_eval.html index 07d5a77c..849bb8e8 100644 --- a/globals_eval.html +++ b/globals_eval.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -108,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -643,7 +644,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_f.html b/globals_f.html index 3ca59d38..0d898b8d 100644 --- a/globals_f.html +++ b/globals_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -281,7 +282,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_func.html b/globals_func.html index 53b2256d..1c2c4d9b 100644 --- a/globals_func.html +++ b/globals_func.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -82,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -138,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_g.html b/globals_g.html index 4b58f95f..da799219 100644 --- a/globals_g.html +++ b/globals_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -182,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_h.html b/globals_h.html index 9cde1802..c1f4ca31 100644 --- a/globals_h.html +++ b/globals_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -459,7 +460,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_i.html b/globals_i.html index b4761fdb..08e29c18 100644 --- a/globals_i.html +++ b/globals_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_j.html b/globals_j.html index 4f436c83..184df601 100644 --- a/globals_j.html +++ b/globals_j.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -139,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_k.html b/globals_k.html index f2b75a33..9084689a 100644 --- a/globals_k.html +++ b/globals_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -206,7 +207,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_l.html b/globals_l.html index be8e0ae2..ce6cc461 100644 --- a/globals_l.html +++ b/globals_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -419,7 +420,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_m.html b/globals_m.html index d81de219..ff17f52c 100644 --- a/globals_m.html +++ b/globals_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -370,7 +371,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_n.html b/globals_n.html index 144481b8..b5be5f00 100644 --- a/globals_n.html +++ b/globals_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -167,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_o.html b/globals_o.html index 6caf939a..5d58b012 100644 --- a/globals_o.html +++ b/globals_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -161,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_p.html b/globals_p.html index f699b068..97cd1ee2 100644 --- a/globals_p.html +++ b/globals_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -2873,7 +2874,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : hidusagestr.h
  • PTP_ARRAY_EL_FUNC -: parsetools.h +: parsetools.h
  • Purble : controllerEnums.h @@ -2887,7 +2888,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_r.html b/globals_r.html index 827cb6bb..9700cd0a 100644 --- a/globals_r.html +++ b/globals_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -284,7 +285,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_s.html b/globals_s.html index 5d8e2378..1c669884 100644 --- a/globals_s.html +++ b/globals_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -503,7 +504,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_t.html b/globals_t.html index e3fadeca..07692099 100644 --- a/globals_t.html +++ b/globals_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -269,7 +270,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_type.html b/globals_type.html index 01c72d03..abec4bc2 100644 --- a/globals_type.html +++ b/globals_type.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -82,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -115,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : UsbCore.h
  • PTP_ARRAY_EL_FUNC -: parsetools.h +: parsetools.h
  • TEL_CALL_STATE_REP_CPBL_FUNC_DESCR : cdcacm.h @@ -124,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : cdcacm.h
  • UsbDeviceHandleFunc -: address.h +: address.h
  • @@ -132,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_u.html b/globals_u.html index 92452b4b..d3b4b3e4 100644 --- a/globals_u.html +++ b/globals_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -495,7 +496,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , message.h
  • UsbDeviceHandleFunc -: address.h +: address.h
  • USBTRACE : macros.h @@ -530,7 +531,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_v.html b/globals_v.html index 30c1bce8..ea4c70f9 100644 --- a/globals_v.html +++ b/globals_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -167,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars.html b/globals_vars.html index eed35483..dee4ead6 100644 --- a/globals_vars.html +++ b/globals_vars.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -2702,7 +2703,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_r.html b/globals_vars_r.html index c195acee..dd11cf81 100644 --- a/globals_vars_r.html +++ b/globals_vars_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_u.html b/globals_vars_u.html index 0758b4d9..0e912ac4 100644 --- a/globals_vars_u.html +++ b/globals_vars_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -116,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_w.html b/globals_vars_w.html index 00619463..c9085b94 100644 --- a/globals_vars_w.html +++ b/globals_vars_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -119,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_x.html b/globals_vars_x.html index 04b32281..07ea6983 100644 --- a/globals_vars_x.html +++ b/globals_vars_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -119,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_w.html b/globals_w.html index 8651e719..20cef34d 100644 --- a/globals_w.html +++ b/globals_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -179,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_x.html b/globals_x.html index 1ba74d68..27195a03 100644 --- a/globals_x.html +++ b/globals_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -471,7 +472,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_y.html b/globals_y.html index e2d37cb0..aecdee83 100644 --- a/globals_y.html +++ b/globals_y.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -140,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_z.html b/globals_z.html index 4c242daa..ed5c1026 100644 --- a/globals_z.html +++ b/globals_z.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -140,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/graph_legend.html b/graph_legend.html index 21731ae5..75dbee35 100644 --- a/graph_legend.html +++ b/graph_legend.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Graph Legend + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -65,7 +66,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -80,42 +81,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This page explains how to interpret the graphs that are generated by doxygen.

    -

    Consider the following example:

    -
    /*! Invisible class because of truncation */
    -
    class Invisible { };
    -
    -
    /*! Truncated class, inheritance relation is hidden */
    -
    class Truncated : public Invisible { };
    -
    -
    /* Class not documented with doxygen comments */
    -
    class Undocumented { };
    -
    -
    /*! Class that is inherited using public inheritance */
    -
    class PublicBase : public Truncated { };
    -
    -
    /*! A template class */
    -
    template<class T> class Templ { };
    -
    -
    /*! Class that is inherited using protected inheritance */
    -
    class ProtectedBase { };
    -
    -
    /*! Class that is inherited using private inheritance */
    -
    class PrivateBase { };
    -
    -
    /*! Class that is used by the Inherited class */
    -
    class Used { };
    -
    -
    /*! Super class that inherits a number of other classes */
    -
    class Inherited : public PublicBase,
    -
    protected ProtectedBase,
    -
    private PrivateBase,
    -
    public Undocumented,
    -
    public Templ<int>
    -
    {
    -
    private:
    -
    Used *m_usedClass;
    -
    };
    -

    This will result in the following graph:

    +

    Consider the following example:

    1 /*! Invisible class because of truncation */
    2 class Invisible { };
    3 
    4 /*! Truncated class, inheritance relation is hidden */
    5 class Truncated : public Invisible { };
    6 
    7 /* Class not documented with doxygen comments */
    8 class Undocumented { };
    9 
    10 /*! Class that is inherited using public inheritance */
    11 class PublicBase : public Truncated { };
    12 
    13 /*! A template class */
    14 template<class T> class Templ { };
    15 
    16 /*! Class that is inherited using protected inheritance */
    17 class ProtectedBase { };
    18 
    19 /*! Class that is inherited using private inheritance */
    20 class PrivateBase { };
    21 
    22 /*! Class that is used by the Inherited class */
    23 class Used { };
    24 
    25 /*! Super class that inherits a number of other classes */
    26 class Inherited : public PublicBase,
    27  protected ProtectedBase,
    28  private PrivateBase,
    29  public Undocumented,
    30  public Templ<int>
    31 {
    32  private:
    33  Used *m_usedClass;
    34 };

    This will result in the following graph:

    @@ -126,7 +92,7 @@ A filled gray box represents the struct or class for which the graph is generate
  • A box with a black border denotes a documented struct or class.
  • -A box with a grey border denotes an undocumented struct or class.
  • +A box with a gray border denotes an undocumented struct or class.
  • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • @@ -148,7 +114,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem diff --git a/graph_legend.png b/graph_legend.png index 6c1d0c239cee3d6ab988e201fd3eac718f39467c..ab7a9c067f9b7025deeb24591b7aad5ae419e474 100644 GIT binary patch literal 17247 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 KD*5>B=l=mE-h(~> literal 19871 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%0DRbJG>wef$x?%BQUB@KF@zEw9bH{mrQnO* z(ho(jLEn@a8Ch8s)V1pC>uIB9ErGd!@Gm2m69X8pS6RxBaiXD64T7RXsceo)QtM)i09^I0b@g%eskZyk=>Kc_5gzXJH`?c#ihlML_kb zztV6$OB|jstETGdh<&TBr>6kJ%mWGRxHuy=rOna+vC?HXT!3je<`TIUD1@GhX^Q|J z07pG_H|}uCHGRTW(X!XWKy?&{j7*;{J}-~OwDi!uz$)drN7|c&AM{0M`>;i=@$yx? zh#VbNnQivs!zAMH2P~xGT#fD5_I8PC6FXTCvHknIn<@}_oLpSKm7DgA0${H`h2*+z zQ!zVj^Ob%uq9H~-qFP%~R@OfyB}L~%1yj=6b$j&XnIASbwwamP`1RHJ_&D>)Uv8;# z(p^qYt_;vI;Y6J91qB5hTwD^~-ooaCsiE1~)Tajvx@Q75Ha4k3ZdfFIcAcQ?f>nMn zmhY={1iUgQc_}QyxdKL_uzI0EDUIv&=m-KaGdGvWQqFYV94x#5%lbJz-C%9gdd^;@ zplY!~%|c*(eSHf=?zkzh^F8gi$*>&NdwfI-=+>swQTa>YG9x9re57K&q<;5T43P2q z3>%fDAM0GUb$O*NJo-^^t!-^^5Xxv-wNk)DOn9bGxG5@M2$wREJ3F5+mkW#N7yNK4 zvP!Z3!#b6;QT*es$W8!m;_&MAl90rIqraAx83rcU4wFSM{BrYqR&5OJ1feU zT$Q0-uZIPx^Ly~EzIgKFiP}R{R1`EUOul5m(ZNAnPVSTSHDFA&>Yd(}oTMZtn{50{ zk_9w8h%|tE!XY9G0TeQopdc|IY~K9R)zLu%S+xU-O~c1W_;5Yd!ts7j3t$TPe9O+X z&z~XG@HkZL?AU;)wLV1f(exOtwVA>~LPC<2lT&GSyExEy*&5F39-63GBG!qoX3P6u z2{vneEDGG@H*<C!P#PC4 z1a__N)Iu8uD;vI}?xb$IE>MiC8`e)$DPn3XNtSZ|il83~%R9V^3w=wctE=m>JBbNu zggTI$nul`6r565tS2Q=LUtL`V`yMIkbDd8vKBl>o`Vi5~Ykf0s8Dlol-;V|<^SZDD zsoV%;w~37_5S*eD6GH$iyu21A)?H;aX05+CUZ7h3ZicI~yPF!2d4R|xS5Z|h`gyW7 zLL=;b`52o*w6odkq6|c6P*=5qJgicH2TTiQ!&X*IFk&A9fa#txPG2v{bQ#U>8`;iN%K6}|e6 ztB}O?lIQh0ZjSi=jba+ij-5AtwgCy?F-UfRL0<*qz1*uDDrAL5h34Wue(VnzPgcVp zr1s5c@jGV?=gxGl{f$o&tU44@crk%}D(>SR;1ep76LZP9s11PX4k0`f?m^Cs5(!UCuaG4vYW zE8?c82XUu!<| z0%`R3>Z$}UFYj}=13hLowvtK_E0BC`LDq-yxlBwV*>(E2D9tn@5-S~vLx|CXVTl-&0u2W}@v)p0~?QG?hmns(B)5VgjMzMsPQ~S^IwGVGK_Q`4X#)Mw)V?GY6C2@SZ^#GDhg@(2iALs*k2kO&n!K}Q;W6W0b$0! zsHkLk1vUwV4#7uSYm-?r%Dv;e{qnR=+8jR%oC{wfaRsQb$>a%HD{9=`-KB6vnwQko z@qGI9GfO$-jS9773U4VTGK`lmReH^M`~p0$)3R_h z7dN+!PpM9YARwHY&S!0u8Ldlw%`sJ#jXvzXbB6fKA`+1xl$URx`3|;^mgUSu~4p`}p5DJPVcmQErY1NC%l=T9{i z6B8keX7K7_vv*zNTw6zn+ScdfRN&*219t6!sAq#Tu}?Fr#v$wLNT2&KlntH*t1$;F zm_rJxR$YT65VLm-C)wC2I%XTRNV53QL6VUZcu_zJvnGSwVpq}fER>Rc+M^3E8Sek+ z1<;*C>0vM(+vu~Ga{6k*g=wN|@iQfAZ!2jJC|PT2Kx0D6iv#R8g}G^|u2gm-Cp}8~%(BiiXliMMf)EY&D$xyWU3!P620CIfE&kxIH@)jvb0##lfx3l}Z{|7j+JJv4=hW7*s>{lNt8n9g-M}q3pr0#hj*MM^;emT&Z`r7PBU4;kglD(Z}SDQYz&2p zKPS5JqvdHv+8Pi5$9(Uh^8K?Ub3)-0^$>`Ss?F)v@K;otw{Z>O#E;6Q;HlfIDSTV~ zpx81SzfvTiUFi-t=Lq3MAlh43WY8v+xS%3MkCDg{lGQtGsYvTB;e zL_ML_2z@znod-kheFCV{YlHz}qOV`fm_EAx<=FZScY)Kv7g<=JkD3>+tyL>s zq$qtR8aI@*pyX;@jSe%m9{=MzIR5B6jkGvZ(dBBU8l&>(^vLF~GBkgRO2y~#q?P69 zj88U{!%6Gm`ub)HrDUIJE_V?&BSuClCaq#RJFj_e;)X)XwF236b4{*YGU!8!Jvcvy z;P?p>+6tx^{if$@dU{SOZSNQ`WmCgZ$@g*12t6dd_hlCnwbuK0LB}^DBX1Q*R^X?o z<}t)6kB_logd{D!`HN?zS1Iov?#Uc?HIP1qs-pp&Mq$DB{j~h$OUP)-3+`u zA>oIQHuWkh6~~KSUXFLyB8+kB_S|5-?3V7u5|eA1phYgfG!4_*`IZ93!6?Ggv@k-t zkfzH`1#j=J(1UAIQ^}&jZC+AB$k}I%hN)$UYF4j1TO7F|S#^!IJ=z@Zh4~yk-fPJHH8mKO;3+`>mw=j?w75j zZ=Z+D;c)XLu}0_z#Kp9xT?O-`_)sZ_lMCo{*$yE;wS>ky*7w&}E0gRkD0q4URc?nb zFRw}@6%=%;rPNsojE6G^Q}cHq1!`E_+-o{1xuIRupo%_Tdic>5YK{3vH78^yHgt`9 zHTqiSo|~=cB+S;x(!`%oqrQDp)j~-vqn)QnaQXHMvFT!w{5N2m=~V&OyLPoHQf4vq z)B0p%9e)k{uas0L4gVzp7x#&=g$0)3()Xi_i}o^O^0G2Zx>k+nhF3XP?kh!v4m5X2 zzdsdXhS4HDNv!39sy*up&*DBZZiPBnuhA-hW7E9ti{p_m^? z9G3gximz?)SGm_X8+t6g1vgYN9LOjg#@V1%nUEz9j}Kp5g}Yb@I_4M2*=?61--~$h z8oRJ{OceDcir&fm-b@&utttSzdq#U-=-et#_2nh>@}N-}@zGsqjqR_aK_ME@j0E|; zjt?lUIAuoWQMhtYE1065A7(_rAqb+9R@=!&F}K#gWn%PVh33e!)L~Qx4sgg}Jx^DRrlI_Q$d~GF?3h zuET7LiI(R$uP=v}S>)RDyLu~J=UKgI&bh##)Y*$klFV2bZ`u(&rqyz<)_hW5KSL$# zZ3Q$dz?q~5{z@65ett?YKR>&&;3l)Yo^T^heYK=2GM0DPTJKy7G(eCM_U8CV78fxO zHyi7j2LUg^?cs1-{V_-W4m*c4V%4l#Kwk0J3kL_%j{$3i;|Ww69 z8d+tNg`NmG5wx~~Qq(tDDZrk16CqMp7#h`6|0?D_IR)rit=W+BRQ zEUrWsr`#I<%b%UQwNDt#o>N4(_curBVl6s18o5tPu18=sQ_5Z2Z%a+Eb`O+h9b6?uU-j!*OzZg;&ud4h5le^NOG>moJe?j|M2$&`u^B@Nxe@$u9aiqTJ!TGM2`>u4^A2PhO2ZkN{$ro)tcM8r;#_KL4OzXaM# zw6yuPKOo5C%Kv=Ii+p&~jLo7-e)=M|=6pXa8;Z?BfA3pXXq)hCOW-Zq^7aBn4q( zZ~+Py`!P;;)FCv2gaMVzq%tNw9cnvw51I=TK>Jfj?IQ6ftFhp0TV3uf$uWUV(N`~= zEXnt75Q;cQ@LbEU}!+LI2_;fE7-G zZDmZAdw(y4q3ei?VavqI+7ZU?`$(pTm*2q%tJ4Grq>SV9IWHXixRCw1JkwLlgU}ba z_qQkHymrC?!^64`j^%B0_F_@TYd200)vk<#F>SpH^Q+Kj6OyUL6%BE5eGcn#TEs_bmT+X5Dr4-bQIXoOdmTgBe;#e*!<#)4e_=eHcKIh~11)QFbodx2}$Jq9rD z&@XbdxA#JV$cU}te_B3}{!vve-|ZqC5#e}D^W##Y6(yzi>cmgNa*Hi6khSoSO}NS{ z6!b;}L&FO}Xp*@r4Rv7Pe7oCH&}x62+3EJ$$E%aO<974~9hWgQkEACTU(wze6pJVL zIV4#AddyH%Y@A-~dbbwU0-EcPfN>q2oJffK6HYbos=Te$G)%pO*Hr!PRI91;*zJ?5*+-rtLDncAlqWjQl==Zi2MBzmr zH>t1#glbydV6dcVCt`JaC_xIS2`d^$hEq-#ueiJWm~DjX^+LC{@DP!gB&4K-?G_cF zp`nOAH}3;mS_q{h_ePd~m}pPfm0mZTc7XtWWWA*6;ed?Ee|*qb=XNi=h=C<-BP0Zd z#2XVszS2e5(%u=0P-fEQ4!eYg)(;AUM|-oba7jsz+_!TUf%dbxvORN~F+(Gvw6l5V-G`YXiU)j}-ZYt!Sm6MOt{}ORH=nFj@^nr3|KfUKUHPj+1 zd#q&Zo>3srlwkT$=lD79%ktThZ$K8O-y7@v;$jIGrNQ+)Pg>Vz=T-Uz~0`@me?sRU?J@@^(D-X zWTNu{en>?x%BzUxhU|NSxk)}pXMC7KY6^~$_6@Ydnm=w9gn2XzB}9bbb@$QwKoFKp z>0_K+g)3~B@%~H-Dl1z)QPt)mYHQ9@>LgmprVTBd0;%w*p z8hwEmZ>vGO+crT?%wv+2NU$z}(4IB0I}nfopP`@}eT<3{@;r5Tcg};2Nu}Cb_VCBI zSfCoo@9k~Sh=}ys+6aZI^5zSWP)zSkFbbQGX}eQp=skrhwKC7H>+bDRVomdlcDVTVj`r8q+qAWRbhxT zb$)84Q|NHnz>GHc5pu_P{9OOUX5Wh1=FkP9AZc1c>MaTkcemUVFYG}j>FB6fY7qB5 ztB@{ZI-Wyg)pHFG<~>3_f940vK*PNA?2FvT1Wn}28@B)uN2VI?ODakyWBFcZ%RtF5 zIhG|A$oZcJn;d9tS&e>#-}`d`O-mp&xIdNwlegl*%FGpcP#}Pk zNfHE9RyN)DLivfOM8#s2k(Vn^Ba+uKlammmBdpy{P8 z&s_Kgi)vQXw1eWgNUa?walgvwGX<(BSzhSb)LrVdgJ8g_Ux&#(#t0JS3Fvk`ahuX| zRJYb=L899V_Px_fnZW!?rQ)P=&eW_3}}S!?4j@r2aP}z{9?F>AV_#HGcom4+c5Dv(_`f+Er31^56ihpi~!`u z0_kzV?j+FVY?K0EecHBQiZrIGwp5|gFMRw5;ehpAZ&XUAURe9EPpI{gaUVg9j z7*no5#h8yB3VB!<8N0B>0*wzB!+L+Q*>QGc$)V$MyrT>L5Pk1+<;QjPv#;+(t=$4l zbb)nPZ)|K_-d!xgga=sbZx^BAZ!>j1uvILZvb9^RVzFj&?I7*M zX+LUF@;gr9+1fp)g%+*N-GR~xdvJn zt&g8(YNIBF1XZl10*AA<0@+)HrPBo2asd>RfKt~9xp7$@%s2nuyQMnYJ`uP(k|e^% z`+`O`$=&yw6Dd{ODxp3n7!9tOa9U$A8xVS2GSc8Isz9c8>n3DEHQREpkdq#uK zj%xd*bd3_79F1_-=AIqbkXZG})tql;W9cH%u(fe=)|EIvKO8GFF0umo3y<6v3ix9Q zXud02&c{f7F=+%%EZUzCOl^@s@Qxm=lz^xOmd{cicHHj`(9x86f4RoKGi(gEKj-#l zOBoR#++fjt4H#q|Y3dQ(NZhZB?V~{c>(?1JRW_HHf;X?Y7BC0ttlo6g zqW>S&_r}4u<8j5HHR1oVGa-cc-LyDpLvi`ti{p8;43{SC5d*sWQ2>Ryjsxj0*(CMj ziv0Ky9yB^+*DiX7fo4ASP;R;HXgvo|va;9{Dw#*IjylW)f|1|&7DTsV2ktB;%ETiV^@U_gt8GDu_j)J*4 z+}YMKYV+OufnvCr0em1;zMXKTj4UVsJR2qP~3G4Ha$O1$@$3)EpzNyb~r6-xSK*TALs$`MI z6BuBfso;cBT6#^FsPXK6s4%8$J)vi~bg6~Yav06~db>0vBm}CE`&iH{f@FsmuV<57 z<}`0)Yh@b2e%~8iUu^pm0Cg{tiWRnwk^{?w9!cBJ26l2=IGhxmzhi^LS-HFL`&dxG z2{=tk7k@2gt#}zQgq?l;8cx_VUJSTTyIK?&X3lE7WfUXAzy$ zcxj5%B*0>c-udLyc|%MKg@U(dL)KO(Z}#NmB<$2dc6Rpi)>epdM=%vNHN1)AOSIUS z7nc3E+bZjfd#dSA;UY9Su zP@u%Vfj*8Wkt-=YBm{_;d4(gaOiWovM-J45`3v*)&J3WxLs>})3kOF)P*6kL7ie*? z!$HC#B34u1_0=a&%u*(jxGhFOhgQ)<{7?#CRJzweJ+q^FxAD7ou;Uj%M+M%XR&DDF zn}4wZ^s-#3d)&;DvD+UmP0feF{6Fh_a7e0Ut#ZgWC`?{geM+k%*wvQcwUS%KexSX< z4H8AvJ<-y`vB(e9J0wG>cZ5|y-pbcE6m5&623wD-&9`FcWW&Nc`z{tcew+5_NV#c@ zj1*{9?;sMeqQIyLkZWDzIB6(1@+B~1wMl?u+}Z2 z({k^oUSgA{gkSxA$%k;XIQ`o*Mz+idDw00qEQF^+oVf);xhme~O~b}kiUv+xwtJ&N z?V6ny|Pj}&jh?&qUl%(%%RhCU+B*QTS^DK~kft*!kAc6tTiGdYq;(Bh~9-u3nNh6oD_ zGcq#Do*95+MT!}sX+S9|02(z&9jwgHp3#Gpv^!Y>`Zf5h7aDjliJyl6-z#M0qoWHl z@Hta=a&Vw@c6KJ_FoKW?owq>cGwkFW|E(&nY5%YMbff)N0llI!%;DH%b&1A$0i22p zEu5U_=^+~uJ4EH?HU)wXy-GbEaw#c{dyGzu3jyW0>DBc5)>L`MaF&(c&&6gGg9bcY zEb_pU?qiobIAYXB+*?hF@3=k@Bv3GutP@}Xva3z z0s=2X!WC|XJR)9dXi%l5%@sbGTImomvRjnf;viY~UiB!x^1)Qp+gF5Gl* zC)i1S*Rm47zG<3}L9yp`(Jl6HLIG;-{0+g>LQzbpPCUEJ>=pdCU@>Xn6lOVS;a5>Y zdpBFYbK0&GQ?c-QG{ppf-lC`dA5hPD%7GK}%cZdH?#~f0PVuPfqBEP2(0J7U)n}ru z3k10W9Gpv!KW5>#*Ea6W*8u!kN;#7%sT&4MvNah-{&x1LBaDxNPK8kcMJuc2sh)Sq z@}5oTE@S1)s<7m$&-CnPa4VnCvbI!YUcLzg$J1pKc_yPZhV;Y(|qq)JA;E0N%0WNv+gIQf}u-oKoSD&If$ThMs~}An2nm6 ze6AKsL;ITmkPT3`C9)3*h6f0to#I==JG2SR#*{cOzFAj=!RuUE`ZaCYJlqD2$Be;k@;@i6N%E<`K=AO z8@Kso`%r1hvf=WdgLo>QRZg_Aft8b2Cx=DxoNR00pqNkGe@9NPHA3koR-82%OOcos zyp%Lz2&I_rm=qDWC<~+wsAS2r-wzifhTjf6cHerOinOg+LW^VE|K)*_X&YxS^-8%k zIsV`9&Zz18EovZ0` zRnx)cT>t{|#@0J-9LOaQai{B!F(f4IvrJ`3ekPp=13DXBbu3pNC64Q3u^OBy`hxH| zkqs5F?c$t*V%La}ke->!+BbTvL5*Hspx|qpnj%|VOmkgj+DW;vH(A(ro%XX5OP%F6 z{;}l!^H16%+|YySQen`i7$V{Tu}4Ji7=7hNK`?f4*t|$Na$LCBc?c{3)fR$(FMI^mW>HwCi=UqJ9K;||$l;{sTm~uB1Tm9Yd z_LvY2ePDTYl)%^501!`4swU5X^!-k>_9={i1jafBRp#is39OA8?DPNSQRP@knR9**E_(1W5z$;^o{FQc!fYm`)RvX{v%iz z=I@1nqPk!;_Dc)B2P{Xixl{da%y`28-?`x9AA(Wf?pl~aJ$L( zdBD|zUtOOBi|0g|bI&u;iBL6sn;zCVwbR$nECmQ*6hLE^m9>CgyEnT!Gdz=J#`-DG zahSo$mDV@}t+P31p#GZzlK;}|Cj-%zU|F9@elSXlQby$7rF)ad_4DwbK@?#I3Bjti zJ1fd3G5w#3?}>nNpBYzu^h(gQ_zi5Cc~T{^r1a+RT9E1Lf>QX#MhfE)K^+%ZS}Ft& z-@vDB^6h_>GGhwoipqx~Y-7&EN@y978*guy1-<#DeebF%In_qvR@5>`u_hLp$re3i zggUaA@dJPEzLdo*niXhS64b2nQsM(g-okl^fWMbpB&6vFh7sbb_u2e^tC*6WW3yV# zApue7qkD9Yx661$At^O!wsKlTzUf?#On=;9k+ZkVf7|^|d+JcAC_rkx5kWmKm>N-q z{^&D7ukpeR;R{XzZchC0<77o(B|Cd7OV72?vgZ*d6yQLXR zx{<-5UpxXgGZrC2-bD6D$Q|wFR#5m7Ql+zl1y)34_IINzYAjHYC}>Exw>=aAqt@Q1 z*GVz-0VvEcHmxb(yoCsS#{~wMG3S1NACrWc+3HfC4QoXO+REO%MqC{h#X(jzZ`iA- zm?On4zDufGWYEK5G*~9!zI5oLm1Nx_^z5aF!1?_e1qUx*PbWArR3%gd)4U$;49BqY z3X3|jxVleaC;ZBDzp6bkF&%>yX&{#AH6@}z0KfVO4$c4wbKqMdB8eZ8_=`Bubq8(R z__CJ7U&$$u2xH1iKl>06_r6iK|A#ZOmrPW5=EYJEaG&ai?{bPFsf9Jcl0FsA_u0^O zl-n-!W$4*cn^2hHpfa$R5`iP6lptTXwbcUF1zT6w8G~d}eWJsk-mm=`D@$h-p>HQh zB+;s00$T4sT>hrWXl+hw?4CTX+9DG=>LD~V8XfsscDSHxvkRB}o_}I%OAQ;hVYc(x4yvl$4??K z7AVJ7HSB0~Ncn_W zv+DGzr?!*(^F<%UVuJ1vKu?#ZmeE8BpG-A`o@`INWHBIUXg_F z7iQ_Irl;3gZIqbCO_bQqYjt&Eg5ULqIbNP=g$z?!8sDwQhw_Bh?R`!7AHs3|pmQwp zazNPejPd*$F4C6)B+__$WmFSutSGE37%?AX2q z+`lY@dCv>&Q`OC!DmJ{&;&g2;j(-bI5SC+AUrnUl6dEGuHg0Tod`hL-{bmPw}_`#Rf{#aHsq z^1npWb@HxHUGpn>tVR#hiw5^|kyY$VKYlfsSA&O?Vze{+Ck)-)V7ngZRTdTw?jEgB zjE_3$+Bf0kCvh_f@>)lbi;Nb`Vv6xtR=QU9@AN+xb!pNVGALQEjJK&P-Cg?}>3tmZ zOij%)bfPdC2j|&TtZ=2$#Dr^pl(x$0@t<6qYUS_xhV9KRoHz%|`|H?Z}) zr71ZnEU2e#yle5iSg8H-`Ef~Sr)5`{;^)%C6UAWrrjh*8DBqHpdlei2Ol91=&5(!BZa}Nv>#()vXMW~0%h{oNa#G}#^ zg2sJfNDSH76^nVsxGfDAA*ftNI$_)|5>U|~AfR{u*PrJ(=XuV1&iTFPJm>pVMIIM#qD*@^xPb0b~Yg-Bm^JE{h=*bcQ_!ys}CA9slv6EuOsrPH*3{NA6&@CPP3Aqif|9olY+=FP{#=2M+0@KsZ$4 zXAQsiP(^8jN=56t^}eQ;pqD>qO4A!B#<mP$MD)KpKGx z9tg6WoHaK^} zkwj2sN|L}oUuL_c#vY}m)Ommk3aUKz1(PXd&IQa&PxEB5Uk6ihNQR3sN6$a|u>c3o z`~jfMZJRVCEo6uo8W?=cVzt}8TaX+de_JIC=K%Bu+ItY(1HMF(b<)wzEi|~%|C_F^ z-BhpjQyIpG-0L6_$id3W8zN+Gc;(5b7GFZq>78Q?grbNLn^9_eR2YQ~4 ztqTq=`*U?wdU1Eh+w-nKu*l9B7#N^ZsSRb&GaQbOR;zt>C$5ki1*nht5dj*H2h3|2 zh=vxJ4YB?0Ae=z=U|@E1;P(>~6B9R1=6nyTx{k)t2m#yYE-y3SUN?1gL;|}*#~9zn z)gxrVZo)8ZL`^~Y*l~KxX}8ods<-!-Si}jPqz$8tp4dCtZRW_Q_i(2!+3Y`7HbO>4 z|Fh_IyYMvhR*zCi8Xg|zi^Xf14p%BFDrT16Kt|rl&H9K;p-_NDxQVHqT7a#vcXl37 zryvXZ8oX-}ilz!9a0un6K`X#k7&Ir;Tq$Yr9AiL(q3o{*clT@?U#c$Rxen;cBYza| Kq4 - + USB Host Shield 2.0: hexdump.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -121,7 +122,7 @@ Variables diff --git a/hexdump_8h_source.html b/hexdump_8h_source.html index b275b7d8..13b381c5 100644 --- a/hexdump_8h_source.html +++ b/hexdump_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hexdump.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,76 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hexdump.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This program is free software; you can redistribute it and/or modify
    -
    4 it under the terms of the GNU General Public License as published by
    -
    5 the Free Software Foundation; either version 2 of the License, or
    -
    6 (at your option) any later version.
    -
    7 
    -
    8 This program is distributed in the hope that it will be useful,
    -
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    -
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    -
    11 GNU General Public License for more details.
    -
    12 
    -
    13 You should have received a copy of the GNU General Public License
    -
    14 along with this program; if not, write to the Free Software
    -
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    -
    16 
    -
    17 Contact information
    -
    18 -------------------
    -
    19 
    -
    20 Circuits At Home, LTD
    -
    21 Web : http://www.circuitsathome.com
    -
    22 e-mail : support@circuitsathome.com
    -
    23  */
    -
    24 
    -
    25 #if !defined(_usb_h_) || defined(__HEXDUMP_H__)
    -
    26 #error "Never include hexdump.h directly; include Usb.h instead"
    -
    27 #else
    -
    28 #define __HEXDUMP_H__
    -
    29 
    -
    30 extern int UsbDEBUGlvl;
    -
    31 
    -
    32 template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    -
    33 class HexDumper : public BASE_CLASS {
    -
    34  uint8_t byteCount;
    -
    35  OFFSET_TYPE byteTotal;
    -
    36 
    -
    37 public:
    -
    38 
    -
    39  HexDumper() : byteCount(0), byteTotal(0) {
    -
    40  };
    -
    41 
    -
    42  void Initialize() {
    -
    43  byteCount = 0;
    -
    44  byteTotal = 0;
    -
    45  };
    -
    46 
    -
    47  void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset);
    -
    48 };
    -
    49 
    -
    50 template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    -
    51 void HexDumper<BASE_CLASS, LEN_TYPE, OFFSET_TYPE>::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset __attribute__((unused))) {
    -
    52  if(UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug.
    -
    53  for(LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) {
    -
    54  if(!byteCount) {
    -
    55  PrintHex<OFFSET_TYPE > (byteTotal, 0x80);
    -
    56  E_Notify(PSTR(": "), 0x80);
    -
    57  }
    -
    58  PrintHex<uint8_t > (pbuf[j], 0x80);
    -
    59  E_Notify(PSTR(" "), 0x80);
    -
    60 
    -
    61  if(byteCount == 15) {
    -
    62  E_Notify(PSTR("\r\n"), 0x80);
    -
    63  byteCount = 0xFF;
    -
    64  }
    -
    65  }
    -
    66  }
    -
    67 }
    -
    68 
    -
    69 #endif // __HEXDUMP_H__
    - +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This program is free software; you can redistribute it and/or modify
    4 it under the terms of the GNU General Public License as published by
    5 the Free Software Foundation; either version 2 of the License, or
    6 (at your option) any later version.
    7 
    8 This program is distributed in the hope that it will be useful,
    9 but WITHOUT ANY WARRANTY; without even the implied warranty of
    10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11 GNU General Public License for more details.
    12 
    13 You should have received a copy of the GNU General Public License
    14 along with this program; if not, write to the Free Software
    15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    16 
    17 Contact information
    18 -------------------
    19 
    20 Circuits At Home, LTD
    21 Web : http://www.circuitsathome.com
    22 e-mail : support@circuitsathome.com
    23  */
    24 
    25 #if !defined(_usb_h_) || defined(__HEXDUMP_H__)
    26 #error "Never include hexdump.h directly; include Usb.h instead"
    27 #else
    28 #define __HEXDUMP_H__
    29 
    30 extern int UsbDEBUGlvl;
    31 
    32 template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    33 class HexDumper : public BASE_CLASS {
    34  uint8_t byteCount;
    35  OFFSET_TYPE byteTotal;
    36 
    37 public:
    38 
    39  HexDumper() : byteCount(0), byteTotal(0) {
    40  };
    41 
    42  void Initialize() {
    43  byteCount = 0;
    44  byteTotal = 0;
    45  };
    46 
    47  void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset);
    48 };
    49 
    50 template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    51 void HexDumper<BASE_CLASS, LEN_TYPE, OFFSET_TYPE>::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset __attribute__((unused))) {
    52  if(UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug.
    53  for(LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) {
    54  if(!byteCount) {
    55  PrintHex<OFFSET_TYPE > (byteTotal, 0x80);
    56  E_Notify(PSTR(": "), 0x80);
    57  }
    58  PrintHex<uint8_t > (pbuf[j], 0x80);
    59  E_Notify(PSTR(" "), 0x80);
    60 
    61  if(byteCount == 15) {
    62  E_Notify(PSTR("\r\n"), 0x80);
    63  byteCount = 0xFF;
    64  }
    65  }
    66  }
    67 }
    68 
    69 #endif // __HEXDUMP_H__
    int UsbDEBUGlvl
    Definition: message.cpp:29
    void Initialize()
    Definition: hexdump.h:42
    #define PSTR(str)
    @@ -166,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidboot_8cpp.html b/hidboot_8cpp.html index f70fea1c..21509952 100644 --- a/hidboot_8cpp.html +++ b/hidboot_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidboot.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidboot.cpp File Reference
    -
    #include "hidboot.h"
    +
    #include "hidboot.h"
    Include dependency graph for hidboot.cpp:
    - + + + + +

    Go to the source code of this file.

    @@ -100,7 +105,7 @@ Include dependency graph for hidboot.cpp:
    diff --git a/hidboot_8cpp__incl.map b/hidboot_8cpp__incl.map index adae936a..92e244b0 100644 --- a/hidboot_8cpp__incl.map +++ b/hidboot_8cpp__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/hidboot_8cpp__incl.md5 b/hidboot_8cpp__incl.md5 index 4ad8868c..8925fe78 100644 --- a/hidboot_8cpp__incl.md5 +++ b/hidboot_8cpp__incl.md5 @@ -1 +1 @@ -5d131e21992c85b9a719c57fd1d1fdd1 \ No newline at end of file +fd9ffd5fbb0339f5a30f2cdb6ce0f03f \ No newline at end of file diff --git a/hidboot_8cpp__incl.png b/hidboot_8cpp__incl.png index a61506b5921e6f88b774610bd5c5793186265251..1fb992f9d32137fccc6caa8b620f097fe509e256 100644 GIT binary patch literal 8390 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 literal 8914 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 diff --git a/hidboot_8cpp_source.html b/hidboot_8cpp_source.html index 7e281784..f253b4a7 100644 --- a/hidboot_8cpp_source.html +++ b/hidboot_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidboot.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,238 +86,27 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidboot.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #include "hidboot.h"
    -
    18 
    -
    19 void MouseReportParser::Parse(USBHID *hid __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len __attribute__((unused)), uint8_t *buf) {
    -
    20  MOUSEINFO *pmi = (MOUSEINFO*)buf;
    -
    21  // Future:
    -
    22  // bool event;
    -
    23 
    -
    24 #if 0
    -
    25  if (prevState.mouseInfo.bmLeftButton == 0 && pmi->bmLeftButton == 1)
    -
    26  OnLeftButtonDown(pmi);
    -
    27 
    -
    28  if (prevState.mouseInfo.bmLeftButton == 1 && pmi->bmLeftButton == 0)
    -
    29  OnLeftButtonUp(pmi);
    -
    30 
    -
    31  if (prevState.mouseInfo.bmRightButton == 0 && pmi->bmRightButton == 1)
    -
    32  OnRightButtonDown(pmi);
    -
    33 
    -
    34  if (prevState.mouseInfo.bmRightButton == 1 && pmi->bmRightButton == 0)
    -
    35  OnRightButtonUp(pmi);
    -
    36 
    -
    37  if (prevState.mouseInfo.bmMiddleButton == 0 && pmi->bmMiddleButton == 1)
    -
    38  OnMiddleButtonDown(pmi);
    -
    39 
    -
    40  if (prevState.mouseInfo.bmMiddleButton == 1 && pmi->bmMiddleButton == 0)
    -
    41  OnMiddleButtonUp(pmi);
    -
    42 
    -
    43  if (prevState.mouseInfo.dX != pmi->dX || prevState.mouseInfo.dY != pmi->dY)
    -
    44  OnMouseMove(pmi);
    -
    45 
    -
    46  if (len > sizeof (MOUSEINFO))
    -
    47  for (uint8_t i = 0; i<sizeof (MOUSEINFO); i++)
    -
    48  prevState.bInfo[i] = buf[i];
    -
    49 #else
    -
    50  //
    -
    51  // Optimization idea:
    -
    52  //
    -
    53  // 1: Don't pass the structure on every event. Buttons would not need it.
    -
    54  // 2: Only pass x/y values in the movement routine.
    -
    55  //
    -
    56  // These two changes (with the ones I have made) will save extra flash.
    -
    57  // The only "bad" thing is that it could break old code.
    -
    58  //
    -
    59  // Future thoughts:
    -
    60  //
    -
    61  // The extra space gained can be used for a generic mouse event that can be called
    -
    62  // when there are _ANY_ changes. This one you _MAY_ want to pass everything, however the
    -
    63  // sketch could already have noted these facts to support drag/drop scroll wheel stuff, etc.
    -
    64  //
    -
    65 
    -
    66  // Why do we need to pass the structure for buttons?
    -
    67  // The function call not enough of a hint for what is happening?
    -
    68  if(prevState.mouseInfo.bmLeftButton != pmi->bmLeftButton ) {
    -
    69  if(pmi->bmLeftButton) {
    -
    70  OnLeftButtonDown(pmi);
    -
    71  } else {
    -
    72  OnLeftButtonUp(pmi);
    -
    73  }
    -
    74  // Future:
    -
    75  // event = true;
    -
    76  }
    -
    77 
    -
    78  if(prevState.mouseInfo.bmRightButton != pmi->bmRightButton) {
    -
    79  if(pmi->bmRightButton) {
    -
    80  OnRightButtonDown(pmi);
    -
    81  } else {
    -
    82  OnRightButtonUp(pmi);
    -
    83  }
    -
    84  // Future:
    -
    85  // event = true;
    -
    86  }
    -
    87 
    -
    88  if(prevState.mouseInfo.bmMiddleButton != pmi->bmMiddleButton) {
    -
    89  if(pmi->bmMiddleButton) {
    -
    90  OnMiddleButtonDown(pmi);
    -
    91  } else {
    -
    92  OnMiddleButtonUp(pmi);
    -
    93  }
    -
    94  // Future:
    -
    95  // event = true;
    -
    96  }
    -
    97 
    -
    98  //
    -
    99  // Scroll wheel(s), are not part of the spec, but we could support it.
    -
    100  // Logitech wireless keyboard and mouse combo reports scroll wheel in byte 4
    -
    101  // We wouldn't even need to save this information.
    -
    102  //if(len > 3) {
    -
    103  //}
    -
    104  //
    -
    105 
    -
    106  // Mice only report motion when they actually move!
    -
    107  // Why not just pass the x/y values to simplify things??
    -
    108  if(pmi->dX || pmi->dY) {
    -
    109  OnMouseMove(pmi);
    -
    110  // Future:
    -
    111  // event = true;
    -
    112  }
    -
    113 
    -
    114  //
    -
    115  // Future:
    -
    116  // Provide a callback that operates on the gathered events from above.
    -
    117  //
    -
    118  // if(event) OnMouse();
    -
    119  //
    -
    120 
    -
    121  // Only the first byte matters (buttons). We do NOT need to save position info.
    -
    122  prevState.bInfo[0] = buf[0];
    -
    123 #endif
    -
    124 
    -
    125 };
    -
    126 
    -
    127 void KeyboardReportParser::Parse(USBHID *hid, bool is_rpt_id __attribute__((unused)), uint8_t len __attribute__((unused)), uint8_t *buf) {
    -
    128  // On error - return
    -
    129  if (buf[2] == 1)
    -
    130  return;
    -
    131 
    -
    132  //KBDINFO *pki = (KBDINFO*)buf;
    -
    133 
    -
    134  // provide event for changed control key state
    -
    135  if (prevState.bInfo[0x00] != buf[0x00]) {
    -
    136  OnControlKeysChanged(prevState.bInfo[0x00], buf[0x00]);
    -
    137  }
    -
    138 
    -
    139  for (uint8_t i = 2; i < 8; i++) {
    -
    140  bool down = false;
    -
    141  bool up = false;
    -
    142 
    -
    143  for (uint8_t j = 2; j < 8; j++) {
    -
    144  if (buf[i] == prevState.bInfo[j] && buf[i] != 1)
    -
    145  down = true;
    -
    146  if (buf[j] == prevState.bInfo[i] && prevState.bInfo[i] != 1)
    -
    147  up = true;
    -
    148  }
    -
    149  if (!down) {
    -
    150  HandleLockingKeys(hid, buf[i]);
    -
    151  OnKeyDown(*buf, buf[i]);
    -
    152  }
    -
    153  if (!up)
    -
    154  OnKeyUp(prevState.bInfo[0], prevState.bInfo[i]);
    -
    155  }
    -
    156  for (uint8_t i = 0; i < 8; i++)
    -
    157  prevState.bInfo[i] = buf[i];
    -
    158 };
    -
    159 
    -
    160 const uint8_t KeyboardReportParser::numKeys[10] PROGMEM = {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')'};
    -
    161 const uint8_t KeyboardReportParser::symKeysUp[12] PROGMEM = {'_', '+', '{', '}', '|', '~', ':', '"', '~', '<', '>', '?'};
    -
    162 const uint8_t KeyboardReportParser::symKeysLo[12] PROGMEM = {'-', '=', '[', ']', '\\', ' ', ';', '\'', '`', ',', '.', '/'};
    -
    163 const uint8_t KeyboardReportParser::padKeys[5] PROGMEM = {'/', '*', '-', '+', '\r'};
    -
    164 
    -
    165 uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key) {
    -
    166  uint8_t shift = (mod & 0x22);
    -
    167 
    -
    168  // [a-z]
    -
    169  if (VALUE_WITHIN(key, 0x04, 0x1d)) {
    -
    170  // Upper case letters
    -
    171  if ((kbdLockingKeys.kbdLeds.bmCapsLock == 0 && shift) ||
    -
    172  (kbdLockingKeys.kbdLeds.bmCapsLock == 1 && shift == 0))
    -
    173  return (key - 4 + 'A');
    -
    174 
    -
    175  // Lower case letters
    -
    176  else
    -
    177  return (key - 4 + 'a');
    -
    178  }// Numbers
    -
    179  else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
    -
    180  if (shift)
    -
    181  return ((uint8_t)pgm_read_byte(&getNumKeys()[key - 0x1e]));
    -
    182  else
    -
    183  return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');
    -
    184  }// Keypad Numbers
    -
    185  else if(VALUE_WITHIN(key, 0x59, 0x61)) {
    -
    186  if(kbdLockingKeys.kbdLeds.bmNumLock == 1)
    -
    187  return (key - 0x59 + '1');
    -
    188  } else if(VALUE_WITHIN(key, 0x2d, 0x38))
    -
    189  return ((shift) ? (uint8_t)pgm_read_byte(&getSymKeysUp()[key - 0x2d]) : (uint8_t)pgm_read_byte(&getSymKeysLo()[key - 0x2d]));
    -
    190  else if(VALUE_WITHIN(key, 0x54, 0x58))
    -
    191  return (uint8_t)pgm_read_byte(&getPadKeys()[key - 0x54]);
    -
    192  else {
    -
    193  switch(key) {
    -
    194  case UHS_HID_BOOT_KEY_SPACE: return (0x20);
    -
    195  case UHS_HID_BOOT_KEY_ENTER: return ('\r'); // Carriage return (0x0D)
    -
    196  case UHS_HID_BOOT_KEY_ZERO2: return ((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '0': 0);
    -
    197  case UHS_HID_BOOT_KEY_PERIOD: return ((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '.': 0);
    -
    198  }
    -
    199  }
    -
    200  return ( 0);
    -
    201 }
    - +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #include "hidboot.h"
    18 
    19 void MouseReportParser::Parse(USBHID *hid __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len __attribute__((unused)), uint8_t *buf) {
    20  MOUSEINFO *pmi = (MOUSEINFO*)buf;
    21  // Future:
    22  // bool event;
    23 
    24 #if 0
    25  if (prevState.mouseInfo.bmLeftButton == 0 && pmi->bmLeftButton == 1)
    26  OnLeftButtonDown(pmi);
    27 
    28  if (prevState.mouseInfo.bmLeftButton == 1 && pmi->bmLeftButton == 0)
    29  OnLeftButtonUp(pmi);
    30 
    31  if (prevState.mouseInfo.bmRightButton == 0 && pmi->bmRightButton == 1)
    32  OnRightButtonDown(pmi);
    33 
    34  if (prevState.mouseInfo.bmRightButton == 1 && pmi->bmRightButton == 0)
    35  OnRightButtonUp(pmi);
    36 
    37  if (prevState.mouseInfo.bmMiddleButton == 0 && pmi->bmMiddleButton == 1)
    38  OnMiddleButtonDown(pmi);
    39 
    40  if (prevState.mouseInfo.bmMiddleButton == 1 && pmi->bmMiddleButton == 0)
    41  OnMiddleButtonUp(pmi);
    42 
    43  if (prevState.mouseInfo.dX != pmi->dX || prevState.mouseInfo.dY != pmi->dY)
    44  OnMouseMove(pmi);
    45 
    46  if (len > sizeof (MOUSEINFO))
    47  for (uint8_t i = 0; i<sizeof (MOUSEINFO); i++)
    48  prevState.bInfo[i] = buf[i];
    49 #else
    50  //
    51  // Optimization idea:
    52  //
    53  // 1: Don't pass the structure on every event. Buttons would not need it.
    54  // 2: Only pass x/y values in the movement routine.
    55  //
    56  // These two changes (with the ones I have made) will save extra flash.
    57  // The only "bad" thing is that it could break old code.
    58  //
    59  // Future thoughts:
    60  //
    61  // The extra space gained can be used for a generic mouse event that can be called
    62  // when there are _ANY_ changes. This one you _MAY_ want to pass everything, however the
    63  // sketch could already have noted these facts to support drag/drop scroll wheel stuff, etc.
    64  //
    65 
    66  // Why do we need to pass the structure for buttons?
    67  // The function call not enough of a hint for what is happening?
    68  if(prevState.mouseInfo.bmLeftButton != pmi->bmLeftButton ) {
    69  if(pmi->bmLeftButton) {
    70  OnLeftButtonDown(pmi);
    71  } else {
    72  OnLeftButtonUp(pmi);
    73  }
    74  // Future:
    75  // event = true;
    76  }
    77 
    78  if(prevState.mouseInfo.bmRightButton != pmi->bmRightButton) {
    79  if(pmi->bmRightButton) {
    80  OnRightButtonDown(pmi);
    81  } else {
    82  OnRightButtonUp(pmi);
    83  }
    84  // Future:
    85  // event = true;
    86  }
    87 
    88  if(prevState.mouseInfo.bmMiddleButton != pmi->bmMiddleButton) {
    89  if(pmi->bmMiddleButton) {
    90  OnMiddleButtonDown(pmi);
    91  } else {
    92  OnMiddleButtonUp(pmi);
    93  }
    94  // Future:
    95  // event = true;
    96  }
    97 
    98  //
    99  // Scroll wheel(s), are not part of the spec, but we could support it.
    100  // Logitech wireless keyboard and mouse combo reports scroll wheel in byte 4
    101  // We wouldn't even need to save this information.
    102  //if(len > 3) {
    103  //}
    104  //
    105 
    106  // Mice only report motion when they actually move!
    107  // Why not just pass the x/y values to simplify things??
    108  if(pmi->dX || pmi->dY) {
    109  OnMouseMove(pmi);
    110  // Future:
    111  // event = true;
    112  }
    113 
    114  //
    115  // Future:
    116  // Provide a callback that operates on the gathered events from above.
    117  //
    118  // if(event) OnMouse();
    119  //
    120 
    121  // Only the first byte matters (buttons). We do NOT need to save position info.
    122  prevState.bInfo[0] = buf[0];
    123 #endif
    124 
    125 };
    126 
    127 void KeyboardReportParser::Parse(USBHID *hid, bool is_rpt_id __attribute__((unused)), uint8_t len __attribute__((unused)), uint8_t *buf) {
    128  // On error - return
    129  if (buf[2] == 1)
    130  return;
    131 
    132  //KBDINFO *pki = (KBDINFO*)buf;
    133 
    134  // provide event for changed control key state
    135  if (prevState.bInfo[0x00] != buf[0x00]) {
    136  OnControlKeysChanged(prevState.bInfo[0x00], buf[0x00]);
    137  }
    138 
    139  for (uint8_t i = 2; i < 8; i++) {
    140  bool down = false;
    141  bool up = false;
    142 
    143  for (uint8_t j = 2; j < 8; j++) {
    144  if (buf[i] == prevState.bInfo[j] && buf[i] != 1)
    145  down = true;
    146  if (buf[j] == prevState.bInfo[i] && prevState.bInfo[i] != 1)
    147  up = true;
    148  }
    149  if (!down) {
    150  HandleLockingKeys(hid, buf[i]);
    151  OnKeyDown(*buf, buf[i]);
    152  }
    153  if (!up)
    154  OnKeyUp(prevState.bInfo[0], prevState.bInfo[i]);
    155  }
    156  for (uint8_t i = 0; i < 8; i++)
    157  prevState.bInfo[i] = buf[i];
    158 };
    159 
    160 const uint8_t KeyboardReportParser::numKeys[10] PROGMEM = {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')'};
    161 const uint8_t KeyboardReportParser::symKeysUp[12] PROGMEM = {'_', '+', '{', '}', '|', '~', ':', '"', '~', '<', '>', '?'};
    162 const uint8_t KeyboardReportParser::symKeysLo[12] PROGMEM = {'-', '=', '[', ']', '\\', ' ', ';', '\'', '`', ',', '.', '/'};
    163 const uint8_t KeyboardReportParser::padKeys[5] PROGMEM = {'/', '*', '-', '+', '\r'};
    164 
    165 uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key) {
    166  uint8_t shift = (mod & 0x22);
    167 
    168  // [a-z]
    169  if (VALUE_WITHIN(key, 0x04, 0x1d)) {
    170  // Upper case letters
    171  if ((kbdLockingKeys.kbdLeds.bmCapsLock == 0 && shift) ||
    172  (kbdLockingKeys.kbdLeds.bmCapsLock == 1 && shift == 0))
    173  return (key - 4 + 'A');
    174 
    175  // Lower case letters
    176  else
    177  return (key - 4 + 'a');
    178  }// Numbers
    179  else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
    180  if (shift)
    181  return ((uint8_t)pgm_read_byte(&getNumKeys()[key - 0x1e]));
    182  else
    183  return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');
    184  }// Keypad Numbers
    185  else if(VALUE_WITHIN(key, 0x59, 0x61)) {
    186  if(kbdLockingKeys.kbdLeds.bmNumLock == 1)
    187  return (key - 0x59 + '1');
    188  } else if(VALUE_WITHIN(key, 0x2d, 0x38))
    189  return ((shift) ? (uint8_t)pgm_read_byte(&getSymKeysUp()[key - 0x2d]) : (uint8_t)pgm_read_byte(&getSymKeysLo()[key - 0x2d]));
    190  else if(VALUE_WITHIN(key, 0x54, 0x58))
    191  return (uint8_t)pgm_read_byte(&getPadKeys()[key - 0x54]);
    192  else {
    193  switch(key) {
    194  case UHS_HID_BOOT_KEY_SPACE: return (0x20);
    195  case UHS_HID_BOOT_KEY_ENTER: return ('\r'); // Carriage return (0x0D)
    196  case UHS_HID_BOOT_KEY_ZERO2: return ((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '0': 0);
    197  case UHS_HID_BOOT_KEY_PERIOD: return ((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '.': 0);
    198  }
    199  }
    200  return ( 0);
    201 }
    Definition: usbhid.h:143
    #define UHS_HID_BOOT_KEY_PERIOD
    Definition: hidboot.h:29
    uint8_t bmRightButton
    Definition: hidboot.h:43
    -
    virtual const uint8_t * getSymKeysLo()
    Definition: hidboot.h:191
    virtual void OnRightButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:75
    -
    virtual void OnKeyDown(uint8_t mod, uint8_t key)
    Definition: hidboot.h:177
    virtual void OnMiddleButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:78
    #define UHS_HID_BOOT_KEY_ZERO2
    Definition: hidboot.h:28
    #define pgm_read_byte(addr)
    #define UHS_HID_BOOT_KEY_ZERO
    Definition: hidboot.h:22
    -
    virtual void OnKeyUp(uint8_t mod, uint8_t key)
    Definition: hidboot.h:180
    -
    virtual const uint8_t * getSymKeysUp()
    Definition: hidboot.h:187
    uint8_t bmMiddleButton
    Definition: hidboot.h:44
    void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:127
    virtual void OnLeftButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:66
    #define UHS_HID_BOOT_KEY_SPACE
    Definition: hidboot.h:24
    -
    virtual uint8_t HandleLockingKeys(USBHID *hid, uint8_t key)
    Definition: hidboot.h:151
    virtual void OnMouseMove(MOUSEINFO *mi)
    Definition: hidboot.h:63
    virtual void OnRightButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:72
    #define VALUE_WITHIN(v, l, h)
    Definition: macros.h:35
    virtual void OnMiddleButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:81
    #define UHS_HID_BOOT_KEY_ENTER
    Definition: hidboot.h:23
    -
    union KeyboardReportParser::@17 prevState
    int8_t dX
    Definition: hidboot.h:47
    -
    virtual void OnControlKeysChanged(uint8_t before, uint8_t after)
    Definition: hidboot.h:174
    virtual void OnLeftButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:69
    -
    virtual const uint8_t * getNumKeys()
    Definition: hidboot.h:183
    -
    union KeyboardReportParser::@18 kbdLockingKeys
    -
    virtual const uint8_t * getPadKeys()
    Definition: hidboot.h:195
    int8_t dY
    Definition: hidboot.h:48
    void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:19
    uint8_t bmLeftButton
    Definition: hidboot.h:42
    @@ -326,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidboot_8h.html b/hidboot_8h.html index 988300c5..df7d7360 100644 --- a/hidboot_8h.html +++ b/hidboot_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidboot.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -88,20 +89,27 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidboot.h File Reference
    -
    #include "usbhid.h"
    +
    #include "usbhid.h"
    Include dependency graph for hidboot.h:
    - + + + +
    This graph shows which files directly or indirectly include this file:
    - + + + + +

    Go to the source code of this file.

    @@ -320,7 +328,7 @@ Macros diff --git a/hidboot_8h__dep__incl.map b/hidboot_8h__dep__incl.map index 72d411bb..d6eb5645 100644 --- a/hidboot_8h__dep__incl.map +++ b/hidboot_8h__dep__incl.map @@ -1,6 +1,6 @@ - - + + - + diff --git a/hidboot_8h__dep__incl.md5 b/hidboot_8h__dep__incl.md5 index fde1084f..4ec250d7 100644 --- a/hidboot_8h__dep__incl.md5 +++ b/hidboot_8h__dep__incl.md5 @@ -1 +1 @@ -6ab61eb2435ebc69d824293cce425db4 \ No newline at end of file +eb017a1dbabb14c916b6c609ad0b5f09 \ No newline at end of file diff --git a/hidboot_8h__dep__incl.png b/hidboot_8h__dep__incl.png index a9a7f5ff2d6b3a6b67b5a0ab7b80c28b40c2aa35..21776426b1c82264298f6c10e092450a4202a1d0 100644 GIT binary patch literal 7823 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 YuO$+ZcFe^OI?Pxqa81QB1&g5n0UpB+3;+NC literal 8673 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
  • Uo1rvY@d& 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 diff --git a/hidboot_8h__incl.map b/hidboot_8h__incl.map index 2faa7fb8..710046fa 100644 --- a/hidboot_8h__incl.map +++ b/hidboot_8h__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/hidboot_8h__incl.md5 b/hidboot_8h__incl.md5 index 482ec312..0cf8d499 100644 --- a/hidboot_8h__incl.md5 +++ b/hidboot_8h__incl.md5 @@ -1 +1 @@ -c217720e2e0320f12e9b0a4a9cbc5ef3 \ No newline at end of file +8dee61608a93687c155ca4b339d92198 \ No newline at end of file diff --git a/hidboot_8h__incl.png b/hidboot_8h__incl.png index a13c28f72385bf2e8b80de7190ab847728f49b64..62f0a421e4014f121f54a983f4de8048069f2c55 100644 GIT binary patch literal 7847 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 literal 6918 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 - + USB Host Shield 2.0: hidboot.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
  • - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,643 +86,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidboot.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #if !defined(__HIDBOOT_H__)
    -
    18 #define __HIDBOOT_H__
    -
    19 
    -
    20 #include "usbhid.h"
    -
    21 
    -
    22 #define UHS_HID_BOOT_KEY_ZERO 0x27
    -
    23 #define UHS_HID_BOOT_KEY_ENTER 0x28
    -
    24 #define UHS_HID_BOOT_KEY_SPACE 0x2c
    -
    25 #define UHS_HID_BOOT_KEY_CAPS_LOCK 0x39
    -
    26 #define UHS_HID_BOOT_KEY_SCROLL_LOCK 0x47
    -
    27 #define UHS_HID_BOOT_KEY_NUM_LOCK 0x53
    -
    28 #define UHS_HID_BOOT_KEY_ZERO2 0x62
    -
    29 #define UHS_HID_BOOT_KEY_PERIOD 0x63
    -
    30 
    -
    31 // Don't worry, GCC will optimize the result to a final value.
    -
    32 #define bitsEndpoints(p) ((((p) & USB_HID_PROTOCOL_KEYBOARD)? 2 : 0) | (((p) & USB_HID_PROTOCOL_MOUSE)? 1 : 0))
    -
    33 #define totalEndpoints(p) ((bitsEndpoints(p) == 3) ? 3 : 2)
    -
    34 #define epMUL(p) ((((p) & USB_HID_PROTOCOL_KEYBOARD)? 1 : 0) + (((p) & USB_HID_PROTOCOL_MOUSE)? 1 : 0))
    -
    35 
    -
    36 // Already defined in hid.h
    -
    37 // #define HID_MAX_HID_CLASS_DESCRIPTORS 5
    -
    38 
    -
    39 struct MOUSEINFO {
    -
    40 
    -
    41  struct {
    -
    42  uint8_t bmLeftButton : 1;
    -
    43  uint8_t bmRightButton : 1;
    -
    44  uint8_t bmMiddleButton : 1;
    -
    45  uint8_t bmDummy : 5;
    -
    46  };
    -
    47  int8_t dX;
    -
    48  int8_t dY;
    -
    49 };
    -
    50 
    - -
    52 
    -
    53  union {
    - -
    55  uint8_t bInfo[sizeof (MOUSEINFO)];
    -
    56  } prevState;
    -
    57 
    -
    58 public:
    -
    59  void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    -
    60 
    -
    61 protected:
    -
    62 
    -
    63  virtual void OnMouseMove(MOUSEINFO *mi __attribute__((unused))) {
    -
    64  };
    -
    65 
    -
    66  virtual void OnLeftButtonUp(MOUSEINFO *mi __attribute__((unused))) {
    -
    67  };
    -
    68 
    -
    69  virtual void OnLeftButtonDown(MOUSEINFO *mi __attribute__((unused))) {
    -
    70  };
    -
    71 
    -
    72  virtual void OnRightButtonUp(MOUSEINFO *mi __attribute__((unused))) {
    -
    73  };
    -
    74 
    -
    75  virtual void OnRightButtonDown(MOUSEINFO *mi __attribute__((unused))) {
    -
    76  };
    -
    77 
    -
    78  virtual void OnMiddleButtonUp(MOUSEINFO *mi __attribute__((unused))) {
    -
    79  };
    -
    80 
    -
    81  virtual void OnMiddleButtonDown(MOUSEINFO *mi __attribute__((unused))) {
    -
    82  };
    -
    83 };
    -
    84 
    -
    85 struct MODIFIERKEYS {
    -
    86  uint8_t bmLeftCtrl : 1;
    -
    87  uint8_t bmLeftShift : 1;
    -
    88  uint8_t bmLeftAlt : 1;
    -
    89  uint8_t bmLeftGUI : 1;
    -
    90  uint8_t bmRightCtrl : 1;
    -
    91  uint8_t bmRightShift : 1;
    -
    92  uint8_t bmRightAlt : 1;
    -
    93  uint8_t bmRightGUI : 1;
    -
    94 };
    -
    95 
    -
    96 struct KBDINFO {
    -
    97 
    -
    98  struct {
    -
    99  uint8_t bmLeftCtrl : 1;
    -
    100  uint8_t bmLeftShift : 1;
    -
    101  uint8_t bmLeftAlt : 1;
    -
    102  uint8_t bmLeftGUI : 1;
    -
    103  uint8_t bmRightCtrl : 1;
    -
    104  uint8_t bmRightShift : 1;
    -
    105  uint8_t bmRightAlt : 1;
    -
    106  uint8_t bmRightGUI : 1;
    -
    107  };
    -
    108  uint8_t bReserved;
    -
    109  uint8_t Keys[6];
    -
    110 };
    -
    111 
    -
    112 struct KBDLEDS {
    -
    113  uint8_t bmNumLock : 1;
    -
    114  uint8_t bmCapsLock : 1;
    -
    115  uint8_t bmScrollLock : 1;
    -
    116  uint8_t bmCompose : 1;
    -
    117  uint8_t bmKana : 1;
    -
    118  uint8_t bmReserved : 3;
    -
    119 };
    -
    120 
    - -
    122  static const uint8_t numKeys[10];
    -
    123  static const uint8_t symKeysUp[12];
    -
    124  static const uint8_t symKeysLo[12];
    -
    125  static const uint8_t padKeys[5];
    -
    126 
    -
    127 protected:
    -
    128 
    -
    129  union {
    - -
    131  uint8_t bInfo[sizeof (KBDINFO)];
    -
    132  } prevState;
    -
    133 
    -
    134  union {
    - -
    136  uint8_t bLeds;
    -
    137  } kbdLockingKeys;
    -
    138 
    -
    139  uint8_t OemToAscii(uint8_t mod, uint8_t key);
    -
    140 
    -
    141 public:
    -
    142 
    - -
    144  kbdLockingKeys.bLeds = 0;
    -
    145  };
    -
    146 
    -
    147  void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    -
    148 
    -
    149 protected:
    -
    150 
    -
    151  virtual uint8_t HandleLockingKeys(USBHID* hid, uint8_t key) {
    -
    152  uint8_t old_keys = kbdLockingKeys.bLeds;
    -
    153 
    -
    154  switch(key) {
    - -
    156  kbdLockingKeys.kbdLeds.bmNumLock = ~kbdLockingKeys.kbdLeds.bmNumLock;
    -
    157  break;
    - -
    159  kbdLockingKeys.kbdLeds.bmCapsLock = ~kbdLockingKeys.kbdLeds.bmCapsLock;
    -
    160  break;
    - -
    162  kbdLockingKeys.kbdLeds.bmScrollLock = ~kbdLockingKeys.kbdLeds.bmScrollLock;
    -
    163  break;
    -
    164  }
    -
    165 
    -
    166  if(old_keys != kbdLockingKeys.bLeds && hid) {
    -
    167  uint8_t lockLeds = kbdLockingKeys.bLeds;
    -
    168  return (hid->SetReport(0, 0/*hid->GetIface()*/, 2, 0, 1, &lockLeds));
    -
    169  }
    -
    170 
    -
    171  return 0;
    -
    172  };
    -
    173 
    -
    174  virtual void OnControlKeysChanged(uint8_t before __attribute__((unused)), uint8_t after __attribute__((unused))) {
    -
    175  };
    -
    176 
    -
    177  virtual void OnKeyDown(uint8_t mod __attribute__((unused)), uint8_t key __attribute__((unused))) {
    -
    178  };
    -
    179 
    -
    180  virtual void OnKeyUp(uint8_t mod __attribute__((unused)), uint8_t key __attribute__((unused))) {
    -
    181  };
    -
    182 
    -
    183  virtual const uint8_t *getNumKeys() {
    -
    184  return numKeys;
    -
    185  };
    -
    186 
    -
    187  virtual const uint8_t *getSymKeysUp() {
    -
    188  return symKeysUp;
    -
    189  };
    -
    190 
    -
    191  virtual const uint8_t *getSymKeysLo() {
    -
    192  return symKeysLo;
    -
    193  };
    -
    194 
    -
    195  virtual const uint8_t *getPadKeys() {
    -
    196  return padKeys;
    -
    197  };
    -
    198 };
    -
    199 
    -
    200 template <const uint8_t BOOT_PROTOCOL>
    -
    201 class HIDBoot : public USBHID //public USBDeviceConfig, public UsbConfigXtracter
    -
    202 {
    -
    203  EpInfo epInfo[totalEndpoints(BOOT_PROTOCOL)];
    -
    204  HIDReportParser *pRptParser[epMUL(BOOT_PROTOCOL)];
    -
    205 
    -
    206  uint8_t bConfNum; // configuration number
    -
    207  uint8_t bIfaceNum; // Interface Number
    -
    208  uint8_t bNumIface; // number of interfaces in the configuration
    -
    209  uint8_t bNumEP; // total number of EP in the configuration
    -
    210  uint32_t qNextPollTime; // next poll time
    -
    211  bool bPollEnable; // poll enable flag
    -
    212  uint8_t bInterval; // largest interval
    -
    213  bool bRptProtoEnable; // Report Protocol enable flag
    -
    214 
    -
    215  void Initialize();
    -
    216 
    -
    217  virtual HIDReportParser* GetReportParser(uint8_t id) {
    -
    218  return pRptParser[id];
    -
    219  };
    -
    220 
    -
    221 public:
    -
    222  HIDBoot(USB *p, bool bRptProtoEnable = false);
    -
    223 
    -
    224  virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {
    -
    225  pRptParser[id] = prs;
    -
    226  return true;
    -
    227  };
    -
    228 
    -
    229  // USBDeviceConfig implementation
    -
    230  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    231  uint8_t Release();
    -
    232  uint8_t Poll();
    -
    233 
    -
    234  virtual uint8_t GetAddress() {
    -
    235  return bAddress;
    -
    236  };
    -
    237 
    -
    238  virtual bool isReady() {
    -
    239  return bPollEnable;
    -
    240  };
    -
    241 
    -
    242  // UsbConfigXtracter implementation
    -
    243  // Method should be defined here if virtual.
    -
    244  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    245 
    -
    246  virtual bool DEVCLASSOK(uint8_t klass) {
    -
    247  return (klass == USB_CLASS_HID);
    -
    248  }
    -
    249 
    -
    250  virtual bool DEVSUBCLASSOK(uint8_t subklass) {
    -
    251  return (subklass == BOOT_PROTOCOL);
    -
    252  }
    -
    253 };
    -
    254 
    -
    255 template <const uint8_t BOOT_PROTOCOL>
    -
    256 HIDBoot<BOOT_PROTOCOL>::HIDBoot(USB *p, bool bRptProtoEnable/* = false*/) :
    -
    257 USBHID(p),
    -
    258 qNextPollTime(0),
    -
    259 bPollEnable(false),
    -
    260 bRptProtoEnable(bRptProtoEnable) {
    -
    261  Initialize();
    -
    262 
    -
    263  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    -
    264  pRptParser[i] = NULL;
    -
    265  }
    -
    266  if(pUsb)
    -
    267  pUsb->RegisterDeviceClass(this);
    -
    268 }
    -
    269 
    -
    270 template <const uint8_t BOOT_PROTOCOL>
    - -
    272  for(int i = 0; i < totalEndpoints(BOOT_PROTOCOL); i++) {
    -
    273  epInfo[i].epAddr = 0;
    -
    274  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    275  epInfo[i].bmSndToggle = 0;
    -
    276  epInfo[i].bmRcvToggle = 0;
    -
    277  epInfo[i].bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
    -
    278  }
    -
    279  bNumEP = 1;
    -
    280  bNumIface = 0;
    -
    281  bConfNum = 0;
    -
    282 }
    -
    283 
    -
    284 template <const uint8_t BOOT_PROTOCOL>
    -
    285 uint8_t HIDBoot<BOOT_PROTOCOL>::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    286  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    287 
    -
    288  uint8_t buf[constBufSize];
    -
    289  USB_DEVICE_DESCRIPTOR* device;
    -
    290  uint8_t rcode;
    -
    291  UsbDevice *p = NULL;
    -
    292  EpInfo *oldep_ptr = NULL;
    -
    293  uint8_t len = 0;
    -
    294  //uint16_t cd_len = 0;
    -
    295 
    -
    296  uint8_t num_of_conf; // number of configurations
    -
    297  //uint8_t num_of_intf; // number of interfaces
    -
    298 
    -
    299  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    300 
    -
    301  USBTRACE("BM Init\r\n");
    -
    302  //USBTRACE2("totalEndpoints:", (uint8_t) (totalEndpoints(BOOT_PROTOCOL)));
    -
    303  //USBTRACE2("epMUL:", epMUL(BOOT_PROTOCOL));
    -
    304 
    -
    305  if(bAddress)
    - -
    307 
    -
    308  bInterval = 0;
    -
    309  // Get pointer to pseudo device with address 0 assigned
    -
    310  p = addrPool.GetUsbDevicePtr(0);
    -
    311 
    -
    312  if(!p)
    - -
    314 
    -
    315  if(!p->epinfo) {
    -
    316  USBTRACE("epinfo\r\n");
    - -
    318  }
    -
    319 
    -
    320  // Save old pointer to EP_RECORD of address 0
    -
    321  oldep_ptr = p->epinfo;
    -
    322 
    -
    323  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    324  p->epinfo = epInfo;
    -
    325 
    -
    326  p->lowspeed = lowspeed;
    -
    327 
    -
    328  // Get device descriptor
    -
    329  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    -
    330 
    -
    331  if(!rcode)
    -
    332  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    -
    333 
    -
    334  device = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    335 
    -
    336  if(rcode) {
    -
    337  // Restore p->epinfo
    -
    338  p->epinfo = oldep_ptr;
    -
    339 
    -
    340  goto FailGetDevDescr;
    -
    341  }
    -
    342 
    -
    343  // Restore p->epinfo
    -
    344  p->epinfo = oldep_ptr;
    -
    345 
    -
    346  // Allocate new address according to device class
    -
    347  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    348 
    -
    349  if(!bAddress)
    - -
    351 
    -
    352  // Extract Max Packet Size from the device descriptor
    -
    353  epInfo[0].maxPktSize = (uint8_t)(device->bMaxPacketSize0);
    -
    354 
    -
    355  // Assign new address to the device
    -
    356  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    357 
    -
    358  if(rcode) {
    -
    359  p->lowspeed = false;
    -
    360  addrPool.FreeAddress(bAddress);
    -
    361  bAddress = 0;
    -
    362  USBTRACE2("setAddr:", rcode);
    -
    363  return rcode;
    -
    364  }
    -
    365  //delay(2); //per USB 2.0 sect.9.2.6.3
    -
    366 
    -
    367  USBTRACE2("Addr:", bAddress);
    -
    368 
    -
    369  p->lowspeed = false;
    -
    370 
    -
    371  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    372 
    -
    373  if(!p)
    - -
    375 
    -
    376  p->lowspeed = lowspeed;
    -
    377 
    -
    378  if(len)
    -
    379  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    -
    380 
    -
    381  if(rcode)
    -
    382  goto FailGetDevDescr;
    -
    383 
    -
    384  num_of_conf = device->bNumConfigurations;
    -
    385 
    -
    386  USBTRACE2("NC:", num_of_conf);
    -
    387 
    -
    388  // GCC will optimize unused stuff away.
    - -
    390  USBTRACE("HID_PROTOCOL_KEYBOARD AND MOUSE\r\n");
    - - - - -
    395  CP_MASK_COMPARE_ALL > confDescrParser(this);
    -
    396  confDescrParser.SetOR(); // Use the OR variant.
    -
    397  for(uint8_t i = 0; i < num_of_conf; i++) {
    -
    398  pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    399  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    -
    400  break;
    -
    401  }
    -
    402  } else {
    -
    403  // GCC will optimize unused stuff away.
    -
    404  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_KEYBOARD) {
    -
    405  USBTRACE("HID_PROTOCOL_KEYBOARD\r\n");
    -
    406  for(uint8_t i = 0; i < num_of_conf; i++) {
    - - - - -
    411  CP_MASK_COMPARE_ALL> confDescrParserA(this);
    -
    412 
    -
    413  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserA);
    -
    414  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    -
    415  break;
    -
    416  }
    -
    417  }
    -
    418 
    -
    419  // GCC will optimize unused stuff away.
    -
    420  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_MOUSE) {
    -
    421  USBTRACE("HID_PROTOCOL_MOUSE\r\n");
    -
    422  for(uint8_t i = 0; i < num_of_conf; i++) {
    - - - - -
    427  CP_MASK_COMPARE_ALL> confDescrParserB(this);
    -
    428 
    -
    429  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserB);
    -
    430  if(bNumEP == ((uint8_t)(totalEndpoints(BOOT_PROTOCOL))))
    -
    431  break;
    -
    432 
    -
    433  }
    -
    434  }
    -
    435  }
    -
    436  USBTRACE2("bNumEP:", bNumEP);
    -
    437 
    -
    438  if(bNumEP != (uint8_t)(totalEndpoints(BOOT_PROTOCOL))) {
    - -
    440  goto Fail;
    -
    441  }
    -
    442 
    -
    443  // Assign epInfo to epinfo pointer
    -
    444  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    -
    445  //USBTRACE2("setEpInfoEntry returned ", rcode);
    -
    446  USBTRACE2("Cnf:", bConfNum);
    -
    447 
    -
    448  delay(1000);
    -
    449 
    -
    450  // Set Configuration Value
    -
    451  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    452 
    -
    453  if(rcode)
    -
    454  goto FailSetConfDescr;
    -
    455 
    -
    456  delay(1000);
    -
    457 
    -
    458  USBTRACE2("bIfaceNum:", bIfaceNum);
    -
    459  USBTRACE2("bNumIface:", bNumIface);
    -
    460 
    -
    461  // Yes, mouse wants SetProtocol and SetIdle too!
    -
    462  for(uint8_t i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    -
    463  USBTRACE2("\r\nInterface:", i);
    -
    464  rcode = SetProtocol(i, bRptProtoEnable ? HID_RPT_PROTOCOL : USB_HID_BOOT_PROTOCOL);
    -
    465  if(rcode) goto FailSetProtocol;
    -
    466  USBTRACE2("PROTOCOL SET HID_BOOT rcode:", rcode);
    -
    467  rcode = SetIdle(i, 0, 0);
    -
    468  USBTRACE2("SET_IDLE rcode:", rcode);
    -
    469  // if(rcode) goto FailSetIdle; This can fail.
    -
    470  // Get the RPIPE and just throw it away.
    - -
    472  rcode = GetReportDescr(i, &sink);
    -
    473  USBTRACE2("RPIPE rcode:", rcode);
    -
    474  }
    -
    475 
    -
    476  // Get RPIPE and throw it away.
    -
    477 
    -
    478  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_KEYBOARD) {
    -
    479  // Wake keyboard interface by twinkling up to 5 LEDs that are in the spec.
    -
    480  // kana, compose, scroll, caps, num
    -
    481  rcode = 0x20; // Reuse rcode.
    -
    482  while(rcode) {
    -
    483  rcode >>= 1;
    -
    484  // Ignore any error returned, we don't care if LED is not supported
    -
    485  SetReport(0, 0, 2, 0, 1, &rcode); // Eventually becomes zero (All off)
    -
    486  delay(25);
    -
    487  }
    -
    488  }
    -
    489  USBTRACE("BM configured\r\n");
    -
    490 
    -
    491  bPollEnable = true;
    -
    492  return 0;
    -
    493 
    -
    494 FailGetDevDescr:
    -
    495 #ifdef DEBUG_USB_HOST
    - -
    497  goto Fail;
    -
    498 #endif
    -
    499 
    -
    500  //FailSetDevTblEntry:
    -
    501  //#ifdef DEBUG_USB_HOST
    -
    502  // NotifyFailSetDevTblEntry();
    -
    503  // goto Fail;
    -
    504  //#endif
    -
    505 
    -
    506  //FailGetConfDescr:
    -
    507  //#ifdef DEBUG_USB_HOST
    -
    508  // NotifyFailGetConfDescr();
    -
    509  // goto Fail;
    -
    510  //#endif
    -
    511 
    -
    512 FailSetConfDescr:
    -
    513 #ifdef DEBUG_USB_HOST
    - -
    515  goto Fail;
    -
    516 #endif
    -
    517 
    -
    518 FailSetProtocol:
    -
    519 #ifdef DEBUG_USB_HOST
    -
    520  USBTRACE("SetProto:");
    -
    521  goto Fail;
    -
    522 #endif
    -
    523 
    -
    524  //FailSetIdle:
    -
    525  //#ifdef DEBUG_USB_HOST
    -
    526  // USBTRACE("SetIdle:");
    -
    527  //#endif
    -
    528 
    -
    529 Fail:
    -
    530 #ifdef DEBUG_USB_HOST
    -
    531  NotifyFail(rcode);
    -
    532 #endif
    -
    533  Release();
    -
    534 
    -
    535  return rcode;
    -
    536 }
    -
    537 
    -
    538 template <const uint8_t BOOT_PROTOCOL>
    -
    539 void HIDBoot<BOOT_PROTOCOL>::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    540 
    -
    541  // If the first configuration satisfies, the others are not considered.
    -
    542  //if(bNumEP > 1 && conf != bConfNum)
    -
    543  if(bNumEP == totalEndpoints(BOOT_PROTOCOL))
    -
    544  return;
    -
    545 
    -
    546  bConfNum = conf;
    -
    547  bIfaceNum = iface;
    -
    548 
    -
    549  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80) {
    -
    550  if(pep->bInterval > bInterval) bInterval = pep->bInterval;
    -
    551 
    -
    552  // Fill in the endpoint info structure
    -
    553  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    554  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    555  epInfo[bNumEP].bmSndToggle = 0;
    -
    556  epInfo[bNumEP].bmRcvToggle = 0;
    -
    557  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    -
    558  bNumEP++;
    -
    559 
    -
    560  }
    -
    561 }
    -
    562 
    -
    563 template <const uint8_t BOOT_PROTOCOL>
    - -
    565  pUsb->GetAddressPool().FreeAddress(bAddress);
    -
    566 
    -
    567  bConfNum = 0;
    -
    568  bIfaceNum = 0;
    -
    569  bNumEP = 1;
    -
    570  bAddress = 0;
    -
    571  qNextPollTime = 0;
    -
    572  bPollEnable = false;
    -
    573 
    -
    574  return 0;
    -
    575 }
    -
    576 
    -
    577 template <const uint8_t BOOT_PROTOCOL>
    - -
    579  uint8_t rcode = 0;
    -
    580 
    -
    581  if(bPollEnable && ((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L)) {
    -
    582 
    -
    583  // To-do: optimize manually, using the for loop only if needed.
    -
    584  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    -
    585  const uint16_t const_buff_len = 16;
    -
    586  uint8_t buf[const_buff_len];
    -
    587 
    -
    588  USBTRACE3("(hidboot.h) i=", i, 0x81);
    -
    589  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].epAddr=", epInfo[epInterruptInIndex + i].epAddr, 0x81);
    -
    590  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].maxPktSize=", epInfo[epInterruptInIndex + i].maxPktSize, 0x81);
    -
    591  uint16_t read = (uint16_t)epInfo[epInterruptInIndex + i].maxPktSize;
    -
    592 
    -
    593  rcode = pUsb->inTransfer(bAddress, epInfo[epInterruptInIndex + i].epAddr, &read, buf);
    -
    594  // SOME buggy dongles report extra keys (like sleep) using a 2 byte packet on the wrong endpoint.
    -
    595  // Since keyboard and mice must report at least 3 bytes, we ignore the extra data.
    -
    596  if(!rcode && read > 2) {
    -
    597  if(pRptParser[i])
    -
    598  pRptParser[i]->Parse((USBHID*)this, 0, (uint8_t)read, buf);
    -
    599 #ifdef DEBUG_USB_HOST
    -
    600  // We really don't care about errors and anomalies unless we are debugging.
    -
    601  } else {
    -
    602  if(rcode != hrNAK) {
    -
    603  USBTRACE3("(hidboot.h) Poll:", rcode, 0x81);
    -
    604  }
    -
    605  if(!rcode && read) {
    -
    606  USBTRACE3("(hidboot.h) Strange read count: ", read, 0x80);
    -
    607  USBTRACE3("(hidboot.h) Interface:", i, 0x80);
    -
    608  }
    -
    609  }
    -
    610 
    -
    611  if(!rcode && read && (UsbDEBUGlvl > 0x7f)) {
    -
    612  for(uint8_t i = 0; i < read; i++) {
    -
    613  PrintHex<uint8_t > (buf[i], 0x80);
    -
    614  USBTRACE1(" ", 0x80);
    -
    615  }
    -
    616  if(read)
    -
    617  USBTRACE1("\r\n", 0x80);
    -
    618 #endif
    -
    619  }
    -
    620 
    -
    621  }
    -
    622  qNextPollTime = (uint32_t)millis() + bInterval;
    -
    623  }
    -
    624  return rcode;
    -
    625 }
    -
    626 
    -
    627 #endif // __HIDBOOTMOUSE_H__
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #if !defined(__HIDBOOT_H__)
    18 #define __HIDBOOT_H__
    19 
    20 #include "usbhid.h"
    21 
    22 #define UHS_HID_BOOT_KEY_ZERO 0x27
    23 #define UHS_HID_BOOT_KEY_ENTER 0x28
    24 #define UHS_HID_BOOT_KEY_SPACE 0x2c
    25 #define UHS_HID_BOOT_KEY_CAPS_LOCK 0x39
    26 #define UHS_HID_BOOT_KEY_SCROLL_LOCK 0x47
    27 #define UHS_HID_BOOT_KEY_NUM_LOCK 0x53
    28 #define UHS_HID_BOOT_KEY_ZERO2 0x62
    29 #define UHS_HID_BOOT_KEY_PERIOD 0x63
    30 
    31 // Don't worry, GCC will optimize the result to a final value.
    32 #define bitsEndpoints(p) ((((p) & USB_HID_PROTOCOL_KEYBOARD)? 2 : 0) | (((p) & USB_HID_PROTOCOL_MOUSE)? 1 : 0))
    33 #define totalEndpoints(p) ((bitsEndpoints(p) == 3) ? 3 : 2)
    34 #define epMUL(p) ((((p) & USB_HID_PROTOCOL_KEYBOARD)? 1 : 0) + (((p) & USB_HID_PROTOCOL_MOUSE)? 1 : 0))
    35 
    36 // Already defined in hid.h
    37 // #define HID_MAX_HID_CLASS_DESCRIPTORS 5
    38 
    39 struct MOUSEINFO {
    40 
    41  struct {
    42  uint8_t bmLeftButton : 1;
    43  uint8_t bmRightButton : 1;
    44  uint8_t bmMiddleButton : 1;
    45  uint8_t bmDummy : 5;
    46  };
    47  int8_t dX;
    48  int8_t dY;
    49 };
    50 
    52 
    53  union {
    55  uint8_t bInfo[sizeof (MOUSEINFO)];
    56  } prevState;
    57 
    58 public:
    59  void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    60 
    61 protected:
    62 
    63  virtual void OnMouseMove(MOUSEINFO *mi __attribute__((unused))) {
    64  };
    65 
    66  virtual void OnLeftButtonUp(MOUSEINFO *mi __attribute__((unused))) {
    67  };
    68 
    69  virtual void OnLeftButtonDown(MOUSEINFO *mi __attribute__((unused))) {
    70  };
    71 
    72  virtual void OnRightButtonUp(MOUSEINFO *mi __attribute__((unused))) {
    73  };
    74 
    75  virtual void OnRightButtonDown(MOUSEINFO *mi __attribute__((unused))) {
    76  };
    77 
    78  virtual void OnMiddleButtonUp(MOUSEINFO *mi __attribute__((unused))) {
    79  };
    80 
    81  virtual void OnMiddleButtonDown(MOUSEINFO *mi __attribute__((unused))) {
    82  };
    83 };
    84 
    85 struct MODIFIERKEYS {
    86  uint8_t bmLeftCtrl : 1;
    87  uint8_t bmLeftShift : 1;
    88  uint8_t bmLeftAlt : 1;
    89  uint8_t bmLeftGUI : 1;
    90  uint8_t bmRightCtrl : 1;
    91  uint8_t bmRightShift : 1;
    92  uint8_t bmRightAlt : 1;
    93  uint8_t bmRightGUI : 1;
    94 };
    95 
    96 struct KBDINFO {
    97 
    98  struct {
    99  uint8_t bmLeftCtrl : 1;
    100  uint8_t bmLeftShift : 1;
    101  uint8_t bmLeftAlt : 1;
    102  uint8_t bmLeftGUI : 1;
    103  uint8_t bmRightCtrl : 1;
    104  uint8_t bmRightShift : 1;
    105  uint8_t bmRightAlt : 1;
    106  uint8_t bmRightGUI : 1;
    107  };
    108  uint8_t bReserved;
    109  uint8_t Keys[6];
    110 };
    111 
    112 struct KBDLEDS {
    113  uint8_t bmNumLock : 1;
    114  uint8_t bmCapsLock : 1;
    115  uint8_t bmScrollLock : 1;
    116  uint8_t bmCompose : 1;
    117  uint8_t bmKana : 1;
    118  uint8_t bmReserved : 3;
    119 };
    120 
    122  static const uint8_t numKeys[10];
    123  static const uint8_t symKeysUp[12];
    124  static const uint8_t symKeysLo[12];
    125  static const uint8_t padKeys[5];
    126 
    127 protected:
    128 
    129  union {
    131  uint8_t bInfo[sizeof (KBDINFO)];
    132  } prevState;
    133 
    134  union {
    136  uint8_t bLeds;
    137  } kbdLockingKeys;
    138 
    139  uint8_t OemToAscii(uint8_t mod, uint8_t key);
    140 
    141 public:
    142 
    144  kbdLockingKeys.bLeds = 0;
    145  };
    146 
    147  void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    148 
    149 protected:
    150 
    151  virtual uint8_t HandleLockingKeys(USBHID* hid, uint8_t key) {
    152  uint8_t old_keys = kbdLockingKeys.bLeds;
    153 
    154  switch(key) {
    156  kbdLockingKeys.kbdLeds.bmNumLock = ~kbdLockingKeys.kbdLeds.bmNumLock;
    157  break;
    159  kbdLockingKeys.kbdLeds.bmCapsLock = ~kbdLockingKeys.kbdLeds.bmCapsLock;
    160  break;
    162  kbdLockingKeys.kbdLeds.bmScrollLock = ~kbdLockingKeys.kbdLeds.bmScrollLock;
    163  break;
    164  }
    165 
    166  if(old_keys != kbdLockingKeys.bLeds && hid) {
    167  uint8_t lockLeds = kbdLockingKeys.bLeds;
    168  return (hid->SetReport(0, 0/*hid->GetIface()*/, 2, 0, 1, &lockLeds));
    169  }
    170 
    171  return 0;
    172  };
    173 
    174  virtual void OnControlKeysChanged(uint8_t before __attribute__((unused)), uint8_t after __attribute__((unused))) {
    175  };
    176 
    177  virtual void OnKeyDown(uint8_t mod __attribute__((unused)), uint8_t key __attribute__((unused))) {
    178  };
    179 
    180  virtual void OnKeyUp(uint8_t mod __attribute__((unused)), uint8_t key __attribute__((unused))) {
    181  };
    182 
    183  virtual const uint8_t *getNumKeys() {
    184  return numKeys;
    185  };
    186 
    187  virtual const uint8_t *getSymKeysUp() {
    188  return symKeysUp;
    189  };
    190 
    191  virtual const uint8_t *getSymKeysLo() {
    192  return symKeysLo;
    193  };
    194 
    195  virtual const uint8_t *getPadKeys() {
    196  return padKeys;
    197  };
    198 };
    199 
    200 template <const uint8_t BOOT_PROTOCOL>
    201 class HIDBoot : public USBHID //public USBDeviceConfig, public UsbConfigXtracter
    202 {
    203  EpInfo epInfo[totalEndpoints(BOOT_PROTOCOL)];
    204  HIDReportParser *pRptParser[epMUL(BOOT_PROTOCOL)];
    205 
    206  uint8_t bConfNum; // configuration number
    207  uint8_t bIfaceNum; // Interface Number
    208  uint8_t bNumIface; // number of interfaces in the configuration
    209  uint8_t bNumEP; // total number of EP in the configuration
    210  uint32_t qNextPollTime; // next poll time
    211  bool bPollEnable; // poll enable flag
    212  uint8_t bInterval; // largest interval
    213  bool bRptProtoEnable; // Report Protocol enable flag
    214 
    215  void Initialize();
    216 
    217  virtual HIDReportParser* GetReportParser(uint8_t id) {
    218  return pRptParser[id];
    219  };
    220 
    221 public:
    222  HIDBoot(USB *p, bool bRptProtoEnable = false);
    223 
    224  virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {
    225  pRptParser[id] = prs;
    226  return true;
    227  };
    228 
    229  // USBDeviceConfig implementation
    230  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    231  uint8_t Release();
    232  uint8_t Poll();
    233 
    234  virtual uint8_t GetAddress() {
    235  return bAddress;
    236  };
    237 
    238  virtual bool isReady() {
    239  return bPollEnable;
    240  };
    241 
    242  // UsbConfigXtracter implementation
    243  // Method should be defined here if virtual.
    244  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    245 
    246  virtual bool DEVCLASSOK(uint8_t klass) {
    247  return (klass == USB_CLASS_HID);
    248  }
    249 
    250  virtual bool DEVSUBCLASSOK(uint8_t subklass) {
    251  return (subklass == BOOT_PROTOCOL);
    252  }
    253 };
    254 
    255 template <const uint8_t BOOT_PROTOCOL>
    256 HIDBoot<BOOT_PROTOCOL>::HIDBoot(USB *p, bool bRptProtoEnable/* = false*/) :
    257 USBHID(p),
    258 qNextPollTime(0),
    259 bPollEnable(false),
    260 bRptProtoEnable(bRptProtoEnable) {
    261  Initialize();
    262 
    263  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    264  pRptParser[i] = NULL;
    265  }
    266  if(pUsb)
    267  pUsb->RegisterDeviceClass(this);
    268 }
    269 
    270 template <const uint8_t BOOT_PROTOCOL>
    272  for(int i = 0; i < totalEndpoints(BOOT_PROTOCOL); i++) {
    273  epInfo[i].epAddr = 0;
    274  epInfo[i].maxPktSize = (i) ? 0 : 8;
    275  epInfo[i].bmSndToggle = 0;
    276  epInfo[i].bmRcvToggle = 0;
    277  epInfo[i].bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
    278  }
    279  bNumEP = 1;
    280  bNumIface = 0;
    281  bConfNum = 0;
    282 }
    283 
    284 template <const uint8_t BOOT_PROTOCOL>
    285 uint8_t HIDBoot<BOOT_PROTOCOL>::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    286  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    287 
    288  uint8_t buf[constBufSize];
    289  USB_DEVICE_DESCRIPTOR* device;
    290  uint8_t rcode;
    291  UsbDevice *p = NULL;
    292  EpInfo *oldep_ptr = NULL;
    293  uint8_t len = 0;
    294  //uint16_t cd_len = 0;
    295 
    296  uint8_t num_of_conf; // number of configurations
    297  //uint8_t num_of_intf; // number of interfaces
    298 
    299  AddressPool &addrPool = pUsb->GetAddressPool();
    300 
    301  USBTRACE("BM Init\r\n");
    302  //USBTRACE2("totalEndpoints:", (uint8_t) (totalEndpoints(BOOT_PROTOCOL)));
    303  //USBTRACE2("epMUL:", epMUL(BOOT_PROTOCOL));
    304 
    305  if(bAddress)
    307 
    308  bInterval = 0;
    309  // Get pointer to pseudo device with address 0 assigned
    310  p = addrPool.GetUsbDevicePtr(0);
    311 
    312  if(!p)
    314 
    315  if(!p->epinfo) {
    316  USBTRACE("epinfo\r\n");
    318  }
    319 
    320  // Save old pointer to EP_RECORD of address 0
    321  oldep_ptr = p->epinfo;
    322 
    323  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    324  p->epinfo = epInfo;
    325 
    326  p->lowspeed = lowspeed;
    327 
    328  // Get device descriptor
    329  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    330 
    331  if(!rcode)
    332  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    333 
    334  device = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    335 
    336  if(rcode) {
    337  // Restore p->epinfo
    338  p->epinfo = oldep_ptr;
    339 
    340  goto FailGetDevDescr;
    341  }
    342 
    343  // Restore p->epinfo
    344  p->epinfo = oldep_ptr;
    345 
    346  // Allocate new address according to device class
    347  bAddress = addrPool.AllocAddress(parent, false, port);
    348 
    349  if(!bAddress)
    351 
    352  // Extract Max Packet Size from the device descriptor
    353  epInfo[0].maxPktSize = (uint8_t)(device->bMaxPacketSize0);
    354 
    355  // Assign new address to the device
    356  rcode = pUsb->setAddr(0, 0, bAddress);
    357 
    358  if(rcode) {
    359  p->lowspeed = false;
    360  addrPool.FreeAddress(bAddress);
    361  bAddress = 0;
    362  USBTRACE2("setAddr:", rcode);
    363  return rcode;
    364  }
    365  //delay(2); //per USB 2.0 sect.9.2.6.3
    366 
    367  USBTRACE2("Addr:", bAddress);
    368 
    369  p->lowspeed = false;
    370 
    371  p = addrPool.GetUsbDevicePtr(bAddress);
    372 
    373  if(!p)
    375 
    376  p->lowspeed = lowspeed;
    377 
    378  if(len)
    379  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    380 
    381  if(rcode)
    382  goto FailGetDevDescr;
    383 
    384  num_of_conf = device->bNumConfigurations;
    385 
    386  USBTRACE2("NC:", num_of_conf);
    387 
    388  // GCC will optimize unused stuff away.
    390  USBTRACE("HID_PROTOCOL_KEYBOARD AND MOUSE\r\n");
    395  CP_MASK_COMPARE_ALL > confDescrParser(this);
    396  confDescrParser.SetOR(); // Use the OR variant.
    397  for(uint8_t i = 0; i < num_of_conf; i++) {
    398  pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    399  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    400  break;
    401  }
    402  } else {
    403  // GCC will optimize unused stuff away.
    404  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_KEYBOARD) {
    405  USBTRACE("HID_PROTOCOL_KEYBOARD\r\n");
    406  for(uint8_t i = 0; i < num_of_conf; i++) {
    411  CP_MASK_COMPARE_ALL> confDescrParserA(this);
    412 
    413  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserA);
    414  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    415  break;
    416  }
    417  }
    418 
    419  // GCC will optimize unused stuff away.
    420  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_MOUSE) {
    421  USBTRACE("HID_PROTOCOL_MOUSE\r\n");
    422  for(uint8_t i = 0; i < num_of_conf; i++) {
    427  CP_MASK_COMPARE_ALL> confDescrParserB(this);
    428 
    429  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserB);
    430  if(bNumEP == ((uint8_t)(totalEndpoints(BOOT_PROTOCOL))))
    431  break;
    432 
    433  }
    434  }
    435  }
    436  USBTRACE2("bNumEP:", bNumEP);
    437 
    438  if(bNumEP != (uint8_t)(totalEndpoints(BOOT_PROTOCOL))) {
    440  goto Fail;
    441  }
    442 
    443  // Assign epInfo to epinfo pointer
    444  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    445  //USBTRACE2("setEpInfoEntry returned ", rcode);
    446  USBTRACE2("Cnf:", bConfNum);
    447 
    448  delay(1000);
    449 
    450  // Set Configuration Value
    451  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    452 
    453  if(rcode)
    454  goto FailSetConfDescr;
    455 
    456  delay(1000);
    457 
    458  USBTRACE2("bIfaceNum:", bIfaceNum);
    459  USBTRACE2("bNumIface:", bNumIface);
    460 
    461  // Yes, mouse wants SetProtocol and SetIdle too!
    462  for(uint8_t i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    463  USBTRACE2("\r\nInterface:", i);
    464  rcode = SetProtocol(i, bRptProtoEnable ? HID_RPT_PROTOCOL : USB_HID_BOOT_PROTOCOL);
    465  if(rcode) goto FailSetProtocol;
    466  USBTRACE2("PROTOCOL SET HID_BOOT rcode:", rcode);
    467  rcode = SetIdle(i, 0, 0);
    468  USBTRACE2("SET_IDLE rcode:", rcode);
    469  // if(rcode) goto FailSetIdle; This can fail.
    470  // Get the RPIPE and just throw it away.
    472  rcode = GetReportDescr(i, &sink);
    473  USBTRACE2("RPIPE rcode:", rcode);
    474  }
    475 
    476  // Get RPIPE and throw it away.
    477 
    478  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_KEYBOARD) {
    479  // Wake keyboard interface by twinkling up to 5 LEDs that are in the spec.
    480  // kana, compose, scroll, caps, num
    481  rcode = 0x20; // Reuse rcode.
    482  while(rcode) {
    483  rcode >>= 1;
    484  // Ignore any error returned, we don't care if LED is not supported
    485  SetReport(0, 0, 2, 0, 1, &rcode); // Eventually becomes zero (All off)
    486  delay(25);
    487  }
    488  }
    489  USBTRACE("BM configured\r\n");
    490 
    491  bPollEnable = true;
    492  return 0;
    493 
    494 FailGetDevDescr:
    495 #ifdef DEBUG_USB_HOST
    497  goto Fail;
    498 #endif
    499 
    500  //FailSetDevTblEntry:
    501  //#ifdef DEBUG_USB_HOST
    502  // NotifyFailSetDevTblEntry();
    503  // goto Fail;
    504  //#endif
    505 
    506  //FailGetConfDescr:
    507  //#ifdef DEBUG_USB_HOST
    508  // NotifyFailGetConfDescr();
    509  // goto Fail;
    510  //#endif
    511 
    512 FailSetConfDescr:
    513 #ifdef DEBUG_USB_HOST
    515  goto Fail;
    516 #endif
    517 
    518 FailSetProtocol:
    519 #ifdef DEBUG_USB_HOST
    520  USBTRACE("SetProto:");
    521  goto Fail;
    522 #endif
    523 
    524  //FailSetIdle:
    525  //#ifdef DEBUG_USB_HOST
    526  // USBTRACE("SetIdle:");
    527  //#endif
    528 
    529 Fail:
    530 #ifdef DEBUG_USB_HOST
    531  NotifyFail(rcode);
    532 #endif
    533  Release();
    534 
    535  return rcode;
    536 }
    537 
    538 template <const uint8_t BOOT_PROTOCOL>
    539 void HIDBoot<BOOT_PROTOCOL>::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    540 
    541  // If the first configuration satisfies, the others are not considered.
    542  //if(bNumEP > 1 && conf != bConfNum)
    543  if(bNumEP == totalEndpoints(BOOT_PROTOCOL))
    544  return;
    545 
    546  bConfNum = conf;
    547  bIfaceNum = iface;
    548 
    549  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80) {
    550  if(pep->bInterval > bInterval) bInterval = pep->bInterval;
    551 
    552  // Fill in the endpoint info structure
    553  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    554  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    555  epInfo[bNumEP].bmSndToggle = 0;
    556  epInfo[bNumEP].bmRcvToggle = 0;
    557  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    558  bNumEP++;
    559 
    560  }
    561 }
    562 
    563 template <const uint8_t BOOT_PROTOCOL>
    566 
    567  bConfNum = 0;
    568  bIfaceNum = 0;
    569  bNumEP = 1;
    570  bAddress = 0;
    571  qNextPollTime = 0;
    572  bPollEnable = false;
    573 
    574  return 0;
    575 }
    576 
    577 template <const uint8_t BOOT_PROTOCOL>
    579  uint8_t rcode = 0;
    580 
    581  if(bPollEnable && ((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L)) {
    582 
    583  // To-do: optimize manually, using the for loop only if needed.
    584  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    585  const uint16_t const_buff_len = 16;
    586  uint8_t buf[const_buff_len];
    587 
    588  USBTRACE3("(hidboot.h) i=", i, 0x81);
    589  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].epAddr=", epInfo[epInterruptInIndex + i].epAddr, 0x81);
    590  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].maxPktSize=", epInfo[epInterruptInIndex + i].maxPktSize, 0x81);
    591  uint16_t read = (uint16_t)epInfo[epInterruptInIndex + i].maxPktSize;
    592 
    593  rcode = pUsb->inTransfer(bAddress, epInfo[epInterruptInIndex + i].epAddr, &read, buf);
    594  // SOME buggy dongles report extra keys (like sleep) using a 2 byte packet on the wrong endpoint.
    595  // Since keyboard and mice must report at least 3 bytes, we ignore the extra data.
    596  if(!rcode && read > 2) {
    597  if(pRptParser[i])
    598  pRptParser[i]->Parse((USBHID*)this, 0, (uint8_t)read, buf);
    599 #ifdef DEBUG_USB_HOST
    600  // We really don't care about errors and anomalies unless we are debugging.
    601  } else {
    602  if(rcode != hrNAK) {
    603  USBTRACE3("(hidboot.h) Poll:", rcode, 0x81);
    604  }
    605  if(!rcode && read) {
    606  USBTRACE3("(hidboot.h) Strange read count: ", read, 0x80);
    607  USBTRACE3("(hidboot.h) Interface:", i, 0x80);
    608  }
    609  }
    610 
    611  if(!rcode && read && (UsbDEBUGlvl > 0x7f)) {
    612  for(uint8_t i = 0; i < read; i++) {
    613  PrintHex<uint8_t > (buf[i], 0x80);
    614  USBTRACE1(" ", 0x80);
    615  }
    616  if(read)
    617  USBTRACE1("\r\n", 0x80);
    618 #endif
    619  }
    620 
    621  }
    622  qNextPollTime = (uint32_t)millis() + bInterval;
    623  }
    624  return rcode;
    625 }
    626 
    627 #endif // __HIDBOOTMOUSE_H__
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    +
    uint8_t bmRcvToggle
    Definition: address.h:48
    #define CP_MASK_COMPARE_ALL
    Definition: usbhid.h:143
    USB * pUsb
    Definition: usbhid.h:145
    -
    uint8_t bmLeftShift
    Definition: hidboot.h:87
    EpInfo * epinfo
    Definition: address.h:83
    -
    uint8_t bmKana
    Definition: hidboot.h:117
    #define HID_BOOT_INTF_SUBCLASS
    Definition: usbhid.h:89
    uint8_t bmRightButton
    Definition: hidboot.h:43
    bool lowspeed
    Definition: address.h:86
    @@ -729,127 +103,114 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    virtual const uint8_t * getSymKeysLo()
    Definition: hidboot.h:191
    virtual void OnRightButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:75
    virtual void OnKeyDown(uint8_t mod, uint8_t key)
    Definition: hidboot.h:177
    +
    uint8_t bmNakPower
    Definition: address.h:49
    +
    uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)
    Definition: usbhid.cpp:34
    uint8_t Poll()
    Definition: hidboot.h:578
    -
    uint8_t bmLeftCtrl
    Definition: hidboot.h:99
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:112
    -
    uint8_t bmRightShift
    Definition: hidboot.h:104
    #define NotifyFail(...)
    Definition: message.h:62
    virtual void OnMiddleButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:78
    MOUSEINFO mouseInfo
    Definition: hidboot.h:54
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:840
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: hidboot.h:539
    virtual bool DEVCLASSOK(uint8_t klass)
    Definition: hidboot.h:246
    #define USB_TRANSFER_TYPE_INTERRUPT
    Definition: usb_ch9.h:93
    -
    uint8_t bmCapsLock
    Definition: hidboot.h:114
    -
    uint8_t bmNumLock
    Definition: hidboot.h:113
    #define UHS_HID_BOOT_KEY_SCROLL_LOCK
    Definition: hidboot.h:26
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:57
    +
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: hidboot.h:285
    virtual bool SetReportParser(uint8_t id, HIDReportParser *prs)
    Definition: hidboot.h:224
    virtual void OnKeyUp(uint8_t mod, uint8_t key)
    Definition: hidboot.h:180
    int UsbDEBUGlvl
    Definition: message.cpp:29
    -
    uint8_t bmLeftGUI
    Definition: hidboot.h:102
    #define USB_CLASS_HID
    Definition: UsbCore.h:72
    virtual void FreeAddress(uint8_t addr)=0
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
    +
    uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)
    Definition: usbhid.cpp:62
    -
    uint8_t bmReserved
    Definition: hidboot.h:118
    virtual const uint8_t * getSymKeysUp()
    Definition: hidboot.h:187
    #define USBTRACE2(s, r)
    Definition: macros.h:84
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:831
    uint8_t bmMiddleButton
    Definition: hidboot.h:44
    -
    void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:127
    virtual void OnLeftButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:66
    +
    uint8_t epAddr
    Definition: address.h:40
    uint8_t bmDummy
    Definition: hidboot.h:45
    -
    uint8_t bmLeftAlt
    Definition: hidboot.h:88
    virtual uint8_t GetAddress()
    Definition: hidboot.h:234
    #define USB_NAK_MAX_POWER
    Definition: address.h:34
    HIDBoot(USB *p, bool bRptProtoEnable=false)
    Definition: hidboot.h:256
    -
    uint8_t bInfo[sizeof(KBDINFO)]
    Definition: hidboot.h:131
    -
    uint8_t bmRightCtrl
    Definition: hidboot.h:103
    virtual uint8_t HandleLockingKeys(USBHID *hid, uint8_t key)
    Definition: hidboot.h:151
    -
    uint8_t bInfo[sizeof(MOUSEINFO)]
    Definition: hidboot.h:55
    #define epMUL(p)
    Definition: hidboot.h:34
    Definition: address.h:39
    virtual void OnMouseMove(MOUSEINFO *mi)
    Definition: hidboot.h:63
    #define hrNAK
    Definition: max3421e.h:218
    virtual void OnRightButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:72
    -
    uint8_t bmLeftGUI
    Definition: hidboot.h:89
    uint8_t bAddress
    Definition: usbhid.h:146
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:153
    #define bmUSB_TRANSFER_TYPE
    Definition: usb_ch9.h:94
    virtual void OnMiddleButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:81
    -
    uint8_t bmRightCtrl
    Definition: hidboot.h:90
    +
    static const uint8_t epInterruptInIndex
    Definition: usbhid.h:149
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:151
    -
    uint8_t bmRightGUI
    Definition: hidboot.h:93
    #define UHS_HID_BOOT_KEY_NUM_LOCK
    Definition: hidboot.h:27
    -
    uint8_t bmScrollLock
    Definition: hidboot.h:115
    +
    uint8_t bmSndToggle
    Definition: address.h:47
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:98
    #define USB_HID_PROTOCOL_KEYBOARD
    Definition: usbhid.h:93
    #define totalEndpoints(p)
    Definition: hidboot.h:33
    -
    uint8_t bmLeftShift
    Definition: hidboot.h:100
    #define USBTRACE1(s, l)
    Definition: macros.h:83
    -
    uint8_t bmRightShift
    Definition: hidboot.h:91
    #define USB_NAK_NOWAIT
    Definition: address.h:36
    +
    uint8_t SetProtocol(uint8_t iface, uint8_t protocol)
    Definition: usbhid.cpp:66
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:95
    -
    union KeyboardReportParser::@17 prevState
    int8_t dX
    Definition: hidboot.h:47
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:90
    virtual void OnControlKeysChanged(uint8_t before, uint8_t after)
    Definition: hidboot.h:174
    static const uint8_t totalEndpoints
    Definition: usbhid.h:154
    uint8_t Release()
    Definition: hidboot.h:564
    -
    uint8_t bmRightGUI
    Definition: hidboot.h:106
    virtual void OnLeftButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:69
    +
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:209
    uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhid.cpp:50
    virtual const uint8_t * getNumKeys()
    Definition: hidboot.h:183
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:119
    -
    union KeyboardReportParser::@18 kbdLockingKeys
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:93
    -
    uint8_t bmLeftCtrl
    Definition: hidboot.h:86
    virtual bool isReady()
    Definition: hidboot.h:238
    #define USB_HID_BOOT_PROTOCOL
    Definition: usbhid.h:82
    virtual const uint8_t * getPadKeys()
    Definition: hidboot.h:195
    -
    uint8_t bmRightAlt
    Definition: hidboot.h:92
    +
    uint8_t maxPktSize
    Definition: address.h:41
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:226
    int8_t dY
    Definition: hidboot.h:48
    Definition: UsbCore.h:210
    -
    uint8_t bmRightAlt
    Definition: hidboot.h:105
    -
    void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:19
    virtual bool DEVSUBCLASSOK(uint8_t subklass)
    Definition: hidboot.h:250
    #define USB_HID_PROTOCOL_MOUSE
    Definition: usbhid.h:94
    -
    uint8_t Keys[6]
    Definition: hidboot.h:109
    #define USBTRACE3(s, r, l)
    Definition: macros.h:85
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:230
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:60
    -
    uint8_t bmCompose
    Definition: hidboot.h:116
    +
    virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
    uint8_t bmLeftButton
    Definition: hidboot.h:42
    -
    uint8_t bmLeftAlt
    Definition: hidboot.h:101
    uint8_t bReserved
    Definition: hidboot.h:108
    #define HID_RPT_PROTOCOL
    Definition: usbhid.h:83
    #define UHS_HID_BOOT_KEY_CAPS_LOCK
    Definition: hidboot.h:25
    #define USBTRACE(s)
    Definition: macros.h:82
    -
    uint8_t OemToAscii(uint8_t mod, uint8_t key)
    Definition: hidboot.cpp:165
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:796
    diff --git a/hidcomposite_8cpp.html b/hidcomposite_8cpp.html index a560b75f..8e5a65c5 100644 --- a/hidcomposite_8cpp.html +++ b/hidcomposite_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidcomposite.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,13 +86,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidcomposite.cpp File Reference
    -
    #include "hidcomposite.h"
    +
    #include "hidcomposite.h"
    Include dependency graph for hidcomposite.cpp:
    - + + + + +

    Go to the source code of this file.

    @@ -100,7 +105,7 @@ Include dependency graph for hidcomposite.cpp:
    diff --git a/hidcomposite_8cpp__incl.map b/hidcomposite_8cpp__incl.map index 8b5c4c50..393fd223 100644 --- a/hidcomposite_8cpp__incl.map +++ b/hidcomposite_8cpp__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/hidcomposite_8cpp__incl.md5 b/hidcomposite_8cpp__incl.md5 index abb71c09..26f07e87 100644 --- a/hidcomposite_8cpp__incl.md5 +++ b/hidcomposite_8cpp__incl.md5 @@ -1 +1 @@ -341241fdb5e0a04ee66c435fd0cc2341 \ No newline at end of file +5165af043119ae7e1520852120f4b3a4 \ No newline at end of file diff --git a/hidcomposite_8cpp__incl.png b/hidcomposite_8cpp__incl.png index 46e55ce80a739ac72f32a27c5d9740230c866e55..765a5ae12cdddce4da929269a7b0d8a006bbf483 100644 GIT binary patch literal 10276 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 literal 9897 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 diff --git a/hidcomposite_8cpp_source.html b/hidcomposite_8cpp_source.html index f433a8d1..f234883b 100644 --- a/hidcomposite_8cpp_source.html +++ b/hidcomposite_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidcomposite.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,422 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidcomposite.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 
    -
    18 #include "hidcomposite.h"
    -
    19 
    - -
    21 USBHID(p),
    -
    22 qNextPollTime(0),
    -
    23 pollInterval(0),
    -
    24 bPollEnable(false),
    -
    25 bHasReportId(false) {
    -
    26  Initialize();
    -
    27 
    -
    28  if(pUsb)
    - -
    30 }
    -
    31 
    -
    32 uint16_t HIDComposite::GetHidClassDescrLen(uint8_t type, uint8_t num) {
    -
    33  for(uint8_t i = 0, n = 0; i < HID_MAX_HID_CLASS_DESCRIPTORS; i++) {
    -
    34  if(descrInfo[i].bDescrType == type) {
    -
    35  if(n == num)
    -
    36  return descrInfo[i].wDescriptorLength;
    -
    37  n++;
    -
    38  }
    -
    39  }
    -
    40  return 0;
    -
    41 }
    -
    42 
    -
    43 void HIDComposite::Initialize() {
    -
    44  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    -
    45  rptParsers[i].rptId = 0;
    -
    46  rptParsers[i].rptParser = NULL;
    -
    47  }
    -
    48  for(uint8_t i = 0; i < HID_MAX_HID_CLASS_DESCRIPTORS; i++) {
    -
    49  descrInfo[i].bDescrType = 0;
    -
    50  descrInfo[i].wDescriptorLength = 0;
    -
    51  }
    -
    52  for(uint8_t i = 0; i < maxHidInterfaces; i++) {
    -
    53  hidInterfaces[i].bmInterface = 0;
    -
    54  hidInterfaces[i].bmProtocol = 0;
    -
    55 
    -
    56  for(uint8_t j = 0; j < maxEpPerInterface; j++)
    -
    57  hidInterfaces[i].epIndex[j] = 0;
    -
    58  }
    -
    59  for(uint8_t i = 0; i < totalEndpoints; i++) {
    -
    60  epInfo[i].epAddr = 0;
    -
    61  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    62  epInfo[i].bmSndToggle = 0;
    -
    63  epInfo[i].bmRcvToggle = 0;
    - -
    65  }
    -
    66  bNumEP = 1;
    -
    67  bNumIface = 0;
    -
    68  bConfNum = 0;
    -
    69  pollInterval = 0;
    -
    70 }
    -
    71 
    - -
    73  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    -
    74  if(rptParsers[i].rptId == 0 && rptParsers[i].rptParser == NULL) {
    -
    75  rptParsers[i].rptId = id;
    -
    76  rptParsers[i].rptParser = prs;
    -
    77  return true;
    -
    78  }
    -
    79  }
    -
    80  return false;
    -
    81 }
    -
    82 
    - -
    84  if(!bHasReportId)
    -
    85  return ((rptParsers[0].rptParser) ? rptParsers[0].rptParser : NULL);
    -
    86 
    -
    87  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    -
    88  if(rptParsers[i].rptId == id)
    -
    89  return rptParsers[i].rptParser;
    -
    90  }
    -
    91  return NULL;
    -
    92 }
    -
    93 
    -
    94 uint8_t HIDComposite::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    95  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    96 
    -
    97  uint8_t buf[constBufSize];
    -
    98  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    99  uint8_t rcode;
    -
    100  UsbDevice *p = NULL;
    -
    101  EpInfo *oldep_ptr = NULL;
    -
    102  uint8_t len = 0;
    -
    103 
    -
    104  uint8_t num_of_conf; // number of configurations
    -
    105  //uint8_t num_of_intf; // number of interfaces
    -
    106 
    -
    107  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    108 
    -
    109  USBTRACE("HU Init\r\n");
    -
    110 
    -
    111  if(bAddress)
    - -
    113 
    -
    114  // Get pointer to pseudo device with address 0 assigned
    -
    115  p = addrPool.GetUsbDevicePtr(0);
    -
    116 
    -
    117  if(!p)
    - -
    119 
    -
    120  if(!p->epinfo) {
    -
    121  USBTRACE("epinfo\r\n");
    - -
    123  }
    -
    124 
    -
    125  // Save old pointer to EP_RECORD of address 0
    -
    126  oldep_ptr = p->epinfo;
    -
    127 
    -
    128  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    129  p->epinfo = epInfo;
    -
    130 
    -
    131  p->lowspeed = lowspeed;
    -
    132 
    -
    133  // Get device descriptor
    -
    134  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    -
    135 
    -
    136  if(!rcode)
    -
    137  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    -
    138 
    -
    139  if(rcode) {
    -
    140  // Restore p->epinfo
    -
    141  p->epinfo = oldep_ptr;
    -
    142 
    -
    143  goto FailGetDevDescr;
    -
    144  }
    -
    145 
    -
    146  // Restore p->epinfo
    -
    147  p->epinfo = oldep_ptr;
    -
    148 
    -
    149  // Allocate new address according to device class
    -
    150  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    151 
    -
    152  if(!bAddress)
    - -
    154 
    -
    155  // Extract Max Packet Size from the device descriptor
    - -
    157 
    -
    158  // Assign new address to the device
    -
    159  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    160 
    -
    161  if(rcode) {
    -
    162  p->lowspeed = false;
    -
    163  addrPool.FreeAddress(bAddress);
    -
    164  bAddress = 0;
    -
    165  USBTRACE2("setAddr:", rcode);
    -
    166  return rcode;
    -
    167  }
    -
    168 
    -
    169  //delay(2); //per USB 2.0 sect.9.2.6.3
    -
    170 
    -
    171  USBTRACE2("Addr:", bAddress);
    -
    172 
    -
    173  p->lowspeed = false;
    -
    174 
    -
    175  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    176 
    -
    177  if(!p)
    - -
    179 
    -
    180  p->lowspeed = lowspeed;
    -
    181 
    -
    182  if(len)
    -
    183  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    -
    184 
    -
    185  if(rcode)
    -
    186  goto FailGetDevDescr;
    -
    187 
    -
    188  VID = udd->idVendor; // Can be used by classes that inherits this class to check the VID and PID of the connected device
    -
    189  PID = udd->idProduct;
    -
    190 
    -
    191  num_of_conf = udd->bNumConfigurations;
    -
    192 
    -
    193  // Assign epInfo to epinfo pointer
    -
    194  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    195 
    -
    196  if(rcode)
    -
    197  goto FailSetDevTblEntry;
    -
    198 
    -
    199  USBTRACE2("NC:", num_of_conf);
    -
    200 
    -
    201  for(uint8_t i = 0; i < num_of_conf; i++) {
    -
    202  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
    - -
    204  CP_MASK_COMPARE_CLASS> confDescrParser(this);
    -
    205 
    -
    206  //rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
    -
    207  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    208 
    -
    209  if(rcode)
    -
    210  goto FailGetConfDescr;
    -
    211 
    -
    212  if(bNumEP > 1)
    -
    213  break;
    -
    214  } // for
    -
    215 
    -
    216  if(bNumEP < 2)
    - -
    218 
    -
    219  // Assign epInfo to epinfo pointer
    -
    220  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    -
    221 
    -
    222  USBTRACE2("Cnf:", bConfNum);
    -
    223 
    -
    224  // Set Configuration Value
    -
    225  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    226 
    -
    227  if(rcode)
    -
    228  goto FailSetConfDescr;
    -
    229 
    -
    230  USBTRACE2("NumIface:", bNumIface);
    -
    231 
    -
    232  for(uint8_t i = 0; i < bNumIface; i++) {
    -
    233  if(hidInterfaces[i].epIndex[epInterruptInIndex] == 0)
    -
    234  continue;
    -
    235 
    -
    236  USBTRACE2("SetIdle:", hidInterfaces[i].bmInterface);
    -
    237 
    -
    238  rcode = SetIdle(hidInterfaces[i].bmInterface, 0, 0);
    -
    239 
    -
    240  if(rcode && rcode != hrSTALL)
    -
    241  goto FailSetIdle;
    -
    242  }
    -
    243 
    -
    244  USBTRACE("HU configured\r\n");
    -
    245 
    - -
    247 
    -
    248  bPollEnable = true;
    -
    249  return 0;
    -
    250 
    -
    251 FailGetDevDescr:
    -
    252 #ifdef DEBUG_USB_HOST
    - -
    254  goto Fail;
    -
    255 #endif
    -
    256 
    -
    257 FailSetDevTblEntry:
    -
    258 #ifdef DEBUG_USB_HOST
    - -
    260  goto Fail;
    -
    261 #endif
    -
    262 
    -
    263 FailGetConfDescr:
    -
    264 #ifdef DEBUG_USB_HOST
    - -
    266  goto Fail;
    -
    267 #endif
    -
    268 
    -
    269 FailSetConfDescr:
    -
    270 #ifdef DEBUG_USB_HOST
    - -
    272  goto Fail;
    -
    273 #endif
    -
    274 
    -
    275 
    -
    276 FailSetIdle:
    -
    277 #ifdef DEBUG_USB_HOST
    -
    278  USBTRACE("SetIdle:");
    -
    279 #endif
    -
    280 
    -
    281 #ifdef DEBUG_USB_HOST
    -
    282 Fail:
    -
    283  NotifyFail(rcode);
    -
    284 #endif
    -
    285  Release();
    -
    286  return rcode;
    -
    287 }
    -
    288 
    -
    289 HIDComposite::HIDInterface* HIDComposite::FindInterface(uint8_t iface, uint8_t alt, uint8_t proto) {
    -
    290  for(uint8_t i = 0; i < bNumIface && i < maxHidInterfaces; i++)
    -
    291  if(hidInterfaces[i].bmInterface == iface && hidInterfaces[i].bmAltSet == alt
    -
    292  && hidInterfaces[i].bmProtocol == proto)
    -
    293  return hidInterfaces + i;
    -
    294  return NULL;
    -
    295 }
    -
    296 
    -
    297 void HIDComposite::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    298  //ErrorMessage<uint8_t>(PSTR("\r\nConf.Val"), conf);
    -
    299  //ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
    -
    300  //ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
    -
    301 
    -
    302  bConfNum = conf;
    -
    303 
    -
    304  uint8_t index = 0;
    -
    305  HIDInterface *piface = FindInterface(iface, alt, proto);
    -
    306 
    -
    307  // Fill in interface structure in case of new interface
    -
    308  if(!piface) {
    -
    309  piface = hidInterfaces + bNumIface;
    -
    310  piface->bmInterface = iface;
    -
    311  piface->bmAltSet = alt;
    -
    312  piface->bmProtocol = proto;
    -
    313  bNumIface++;
    -
    314  }
    -
    315 
    - -
    317  index = (pep->bEndpointAddress & 0x80) == 0x80 ? epInterruptInIndex : epInterruptOutIndex;
    -
    318 
    -
    319  if(!SelectInterface(iface, proto))
    -
    320  index = 0;
    -
    321 
    -
    322  if(index) {
    -
    323  // Fill in the endpoint info structure
    -
    324  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    325  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    326  epInfo[bNumEP].bmSndToggle = 0;
    -
    327  epInfo[bNumEP].bmRcvToggle = 0;
    -
    328  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    -
    329 
    -
    330  // Fill in the endpoint index list
    -
    331  piface->epIndex[index] = bNumEP; //(pep->bEndpointAddress & 0x0F);
    -
    332 
    -
    333  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
    -
    334  pollInterval = pep->bInterval;
    -
    335 
    -
    336  bNumEP++;
    -
    337  }
    -
    338 }
    -
    339 
    - - -
    342 
    -
    343  bNumEP = 1;
    -
    344  bAddress = 0;
    -
    345  qNextPollTime = 0;
    -
    346  bPollEnable = false;
    -
    347  return 0;
    -
    348 }
    -
    349 
    -
    350 void HIDComposite::ZeroMemory(uint8_t len, uint8_t *buf) {
    -
    351  for(uint8_t i = 0; i < len; i++)
    -
    352  buf[i] = 0;
    -
    353 }
    -
    354 
    - -
    356  uint8_t rcode = 0;
    -
    357 
    -
    358  if(!bPollEnable)
    -
    359  return 0;
    -
    360 
    -
    361  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) {
    -
    362  qNextPollTime = (uint32_t)millis() + pollInterval;
    -
    363 
    -
    364  uint8_t buf[constBuffLen];
    -
    365 
    -
    366  for(uint8_t i = 0; i < bNumIface; i++) {
    -
    367  uint8_t index = hidInterfaces[i].epIndex[epInterruptInIndex];
    -
    368 
    -
    369  if (index == 0)
    -
    370  continue;
    -
    371 
    -
    372  uint16_t read = (uint16_t)epInfo[index].maxPktSize;
    -
    373 
    -
    374  ZeroMemory(constBuffLen, buf);
    -
    375 
    -
    376  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[index].epAddr, &read, buf);
    -
    377 
    -
    378  if(rcode) {
    -
    379  if(rcode != hrNAK)
    -
    380  USBTRACE3("(hidcomposite.h) Poll:", rcode, 0x81);
    -
    381  continue;
    -
    382  }
    -
    383 
    -
    384  if(read == 0)
    -
    385  continue;
    -
    386 
    -
    387  if(read > constBuffLen)
    -
    388  read = constBuffLen;
    -
    389 
    -
    390 #if 0
    -
    391  Notify(PSTR("\r\nBuf: "), 0x80);
    -
    392 
    -
    393  for(uint8_t i = 0; i < read; i++) {
    -
    394  D_PrintHex<uint8_t > (buf[i], 0x80);
    -
    395  Notify(PSTR(" "), 0x80);
    -
    396  }
    -
    397 
    -
    398  Notify(PSTR("\r\n"), 0x80);
    -
    399 #endif
    -
    400  ParseHIDData(this, epInfo[index].epAddr, bHasReportId, (uint8_t)read, buf);
    -
    401 
    -
    402  HIDReportParser *prs = GetReportParser(((bHasReportId) ? *buf : 0));
    -
    403 
    -
    404  if(prs)
    -
    405  prs->Parse(this, bHasReportId, (uint8_t)read, buf);
    -
    406  }
    -
    407 
    -
    408  }
    -
    409  return rcode;
    -
    410 }
    -
    411 
    -
    412 // Send a report to interrupt out endpoint. This is NOT SetReport() request!
    -
    413 uint8_t HIDComposite::SndRpt(uint16_t nbytes, uint8_t *dataptr) {
    -
    414  return pUsb->outTransfer(bAddress, epInfo[epInterruptOutIndex].epAddr, nbytes, dataptr);
    -
    415 }
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 
    18 #include "hidcomposite.h"
    19 
    21 USBHID(p),
    22 qNextPollTime(0),
    23 pollInterval(0),
    24 bPollEnable(false),
    25 bHasReportId(false) {
    26  Initialize();
    27 
    28  if(pUsb)
    30 }
    31 
    32 uint16_t HIDComposite::GetHidClassDescrLen(uint8_t type, uint8_t num) {
    33  for(uint8_t i = 0, n = 0; i < HID_MAX_HID_CLASS_DESCRIPTORS; i++) {
    34  if(descrInfo[i].bDescrType == type) {
    35  if(n == num)
    36  return descrInfo[i].wDescriptorLength;
    37  n++;
    38  }
    39  }
    40  return 0;
    41 }
    42 
    43 void HIDComposite::Initialize() {
    44  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    45  rptParsers[i].rptId = 0;
    46  rptParsers[i].rptParser = NULL;
    47  }
    48  for(uint8_t i = 0; i < HID_MAX_HID_CLASS_DESCRIPTORS; i++) {
    49  descrInfo[i].bDescrType = 0;
    50  descrInfo[i].wDescriptorLength = 0;
    51  }
    52  for(uint8_t i = 0; i < maxHidInterfaces; i++) {
    53  hidInterfaces[i].bmInterface = 0;
    54  hidInterfaces[i].bmProtocol = 0;
    55 
    56  for(uint8_t j = 0; j < maxEpPerInterface; j++)
    57  hidInterfaces[i].epIndex[j] = 0;
    58  }
    59  for(uint8_t i = 0; i < totalEndpoints; i++) {
    60  epInfo[i].epAddr = 0;
    61  epInfo[i].maxPktSize = (i) ? 0 : 8;
    62  epInfo[i].bmSndToggle = 0;
    63  epInfo[i].bmRcvToggle = 0;
    65  }
    66  bNumEP = 1;
    67  bNumIface = 0;
    68  bConfNum = 0;
    69  pollInterval = 0;
    70 }
    71 
    73  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    74  if(rptParsers[i].rptId == 0 && rptParsers[i].rptParser == NULL) {
    75  rptParsers[i].rptId = id;
    76  rptParsers[i].rptParser = prs;
    77  return true;
    78  }
    79  }
    80  return false;
    81 }
    82 
    84  if(!bHasReportId)
    85  return ((rptParsers[0].rptParser) ? rptParsers[0].rptParser : NULL);
    86 
    87  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    88  if(rptParsers[i].rptId == id)
    89  return rptParsers[i].rptParser;
    90  }
    91  return NULL;
    92 }
    93 
    94 uint8_t HIDComposite::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    95  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    96 
    97  uint8_t buf[constBufSize];
    98  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    99  uint8_t rcode;
    100  UsbDevice *p = NULL;
    101  EpInfo *oldep_ptr = NULL;
    102  uint8_t len = 0;
    103 
    104  uint8_t num_of_conf; // number of configurations
    105  //uint8_t num_of_intf; // number of interfaces
    106 
    107  AddressPool &addrPool = pUsb->GetAddressPool();
    108 
    109  USBTRACE("HU Init\r\n");
    110 
    111  if(bAddress)
    113 
    114  // Get pointer to pseudo device with address 0 assigned
    115  p = addrPool.GetUsbDevicePtr(0);
    116 
    117  if(!p)
    119 
    120  if(!p->epinfo) {
    121  USBTRACE("epinfo\r\n");
    123  }
    124 
    125  // Save old pointer to EP_RECORD of address 0
    126  oldep_ptr = p->epinfo;
    127 
    128  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    129  p->epinfo = epInfo;
    130 
    131  p->lowspeed = lowspeed;
    132 
    133  // Get device descriptor
    134  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    135 
    136  if(!rcode)
    137  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    138 
    139  if(rcode) {
    140  // Restore p->epinfo
    141  p->epinfo = oldep_ptr;
    142 
    143  goto FailGetDevDescr;
    144  }
    145 
    146  // Restore p->epinfo
    147  p->epinfo = oldep_ptr;
    148 
    149  // Allocate new address according to device class
    150  bAddress = addrPool.AllocAddress(parent, false, port);
    151 
    152  if(!bAddress)
    154 
    155  // Extract Max Packet Size from the device descriptor
    157 
    158  // Assign new address to the device
    159  rcode = pUsb->setAddr(0, 0, bAddress);
    160 
    161  if(rcode) {
    162  p->lowspeed = false;
    163  addrPool.FreeAddress(bAddress);
    164  bAddress = 0;
    165  USBTRACE2("setAddr:", rcode);
    166  return rcode;
    167  }
    168 
    169  //delay(2); //per USB 2.0 sect.9.2.6.3
    170 
    171  USBTRACE2("Addr:", bAddress);
    172 
    173  p->lowspeed = false;
    174 
    175  p = addrPool.GetUsbDevicePtr(bAddress);
    176 
    177  if(!p)
    179 
    180  p->lowspeed = lowspeed;
    181 
    182  if(len)
    183  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    184 
    185  if(rcode)
    186  goto FailGetDevDescr;
    187 
    188  VID = udd->idVendor; // Can be used by classes that inherits this class to check the VID and PID of the connected device
    189  PID = udd->idProduct;
    190 
    191  num_of_conf = udd->bNumConfigurations;
    192 
    193  // Assign epInfo to epinfo pointer
    194  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    195 
    196  if(rcode)
    197  goto FailSetDevTblEntry;
    198 
    199  USBTRACE2("NC:", num_of_conf);
    200 
    201  for(uint8_t i = 0; i < num_of_conf; i++) {
    202  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
    204  CP_MASK_COMPARE_CLASS> confDescrParser(this);
    205 
    206  //rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
    207  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    208 
    209  if(rcode)
    210  goto FailGetConfDescr;
    211 
    212  if(bNumEP > 1)
    213  break;
    214  } // for
    215 
    216  if(bNumEP < 2)
    218 
    219  // Assign epInfo to epinfo pointer
    220  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    221 
    222  USBTRACE2("Cnf:", bConfNum);
    223 
    224  // Set Configuration Value
    225  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    226 
    227  if(rcode)
    228  goto FailSetConfDescr;
    229 
    230  USBTRACE2("NumIface:", bNumIface);
    231 
    232  for(uint8_t i = 0; i < bNumIface; i++) {
    233  if(hidInterfaces[i].epIndex[epInterruptInIndex] == 0)
    234  continue;
    235 
    236  USBTRACE2("SetIdle:", hidInterfaces[i].bmInterface);
    237 
    238  rcode = SetIdle(hidInterfaces[i].bmInterface, 0, 0);
    239 
    240  if(rcode && rcode != hrSTALL)
    241  goto FailSetIdle;
    242  }
    243 
    244  USBTRACE("HU configured\r\n");
    245 
    247 
    248  bPollEnable = true;
    249  return 0;
    250 
    251 FailGetDevDescr:
    252 #ifdef DEBUG_USB_HOST
    254  goto Fail;
    255 #endif
    256 
    257 FailSetDevTblEntry:
    258 #ifdef DEBUG_USB_HOST
    260  goto Fail;
    261 #endif
    262 
    263 FailGetConfDescr:
    264 #ifdef DEBUG_USB_HOST
    266  goto Fail;
    267 #endif
    268 
    269 FailSetConfDescr:
    270 #ifdef DEBUG_USB_HOST
    272  goto Fail;
    273 #endif
    274 
    275 
    276 FailSetIdle:
    277 #ifdef DEBUG_USB_HOST
    278  USBTRACE("SetIdle:");
    279 #endif
    280 
    281 #ifdef DEBUG_USB_HOST
    282 Fail:
    283  NotifyFail(rcode);
    284 #endif
    285  Release();
    286  return rcode;
    287 }
    288 
    289 HIDComposite::HIDInterface* HIDComposite::FindInterface(uint8_t iface, uint8_t alt, uint8_t proto) {
    290  for(uint8_t i = 0; i < bNumIface && i < maxHidInterfaces; i++)
    291  if(hidInterfaces[i].bmInterface == iface && hidInterfaces[i].bmAltSet == alt
    292  && hidInterfaces[i].bmProtocol == proto)
    293  return hidInterfaces + i;
    294  return NULL;
    295 }
    296 
    297 void HIDComposite::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    298  //ErrorMessage<uint8_t>(PSTR("\r\nConf.Val"), conf);
    299  //ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
    300  //ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
    301 
    302  bConfNum = conf;
    303 
    304  uint8_t index = 0;
    305  HIDInterface *piface = FindInterface(iface, alt, proto);
    306 
    307  // Fill in interface structure in case of new interface
    308  if(!piface) {
    309  piface = hidInterfaces + bNumIface;
    310  piface->bmInterface = iface;
    311  piface->bmAltSet = alt;
    312  piface->bmProtocol = proto;
    313  bNumIface++;
    314  }
    315 
    317  index = (pep->bEndpointAddress & 0x80) == 0x80 ? epInterruptInIndex : epInterruptOutIndex;
    318 
    319  if(!SelectInterface(iface, proto))
    320  index = 0;
    321 
    322  if(index) {
    323  // Fill in the endpoint info structure
    324  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    325  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    326  epInfo[bNumEP].bmSndToggle = 0;
    327  epInfo[bNumEP].bmRcvToggle = 0;
    328  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    329 
    330  // Fill in the endpoint index list
    331  piface->epIndex[index] = bNumEP; //(pep->bEndpointAddress & 0x0F);
    332 
    333  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
    334  pollInterval = pep->bInterval;
    335 
    336  bNumEP++;
    337  }
    338 }
    339 
    342 
    343  bNumEP = 1;
    344  bAddress = 0;
    345  qNextPollTime = 0;
    346  bPollEnable = false;
    347  return 0;
    348 }
    349 
    350 void HIDComposite::ZeroMemory(uint8_t len, uint8_t *buf) {
    351  for(uint8_t i = 0; i < len; i++)
    352  buf[i] = 0;
    353 }
    354 
    356  uint8_t rcode = 0;
    357 
    358  if(!bPollEnable)
    359  return 0;
    360 
    361  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) {
    362  qNextPollTime = (uint32_t)millis() + pollInterval;
    363 
    364  uint8_t buf[constBuffLen];
    365 
    366  for(uint8_t i = 0; i < bNumIface; i++) {
    367  uint8_t index = hidInterfaces[i].epIndex[epInterruptInIndex];
    368 
    369  if (index == 0)
    370  continue;
    371 
    372  uint16_t read = (uint16_t)epInfo[index].maxPktSize;
    373 
    374  ZeroMemory(constBuffLen, buf);
    375 
    376  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[index].epAddr, &read, buf);
    377 
    378  if(rcode) {
    379  if(rcode != hrNAK)
    380  USBTRACE3("(hidcomposite.h) Poll:", rcode, 0x81);
    381  continue;
    382  }
    383 
    384  if(read == 0)
    385  continue;
    386 
    387  if(read > constBuffLen)
    388  read = constBuffLen;
    389 
    390 #if 0
    391  Notify(PSTR("\r\nBuf: "), 0x80);
    392 
    393  for(uint8_t i = 0; i < read; i++) {
    394  D_PrintHex<uint8_t > (buf[i], 0x80);
    395  Notify(PSTR(" "), 0x80);
    396  }
    397 
    398  Notify(PSTR("\r\n"), 0x80);
    399 #endif
    400  ParseHIDData(this, epInfo[index].epAddr, bHasReportId, (uint8_t)read, buf);
    401 
    402  HIDReportParser *prs = GetReportParser(((bHasReportId) ? *buf : 0));
    403 
    404  if(prs)
    405  prs->Parse(this, bHasReportId, (uint8_t)read, buf);
    406  }
    407 
    408  }
    409  return rcode;
    410 }
    411 
    412 // Send a report to interrupt out endpoint. This is NOT SetReport() request!
    413 uint8_t HIDComposite::SndRpt(uint16_t nbytes, uint8_t *dataptr) {
    414  return pUsb->outTransfer(bAddress, epInfo[epInterruptOutIndex].epAddr, nbytes, dataptr);
    415 }
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    uint8_t bmRcvToggle
    Definition: address.h:48
    Definition: usbhid.h:143
    @@ -595,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidcomposite_8h.html b/hidcomposite_8h.html index 460db7e4..6c3bb837 100644 --- a/hidcomposite_8h.html +++ b/hidcomposite_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidcomposite.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,20 +88,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidcomposite.h File Reference
    -
    #include "usbhid.h"
    +
    #include "usbhid.h"
    Include dependency graph for hidcomposite.h:
    - + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -115,7 +120,7 @@ Classes diff --git a/hidcomposite_8h__dep__incl.map b/hidcomposite_8h__dep__incl.map index 318d9d48..68b4ce9c 100644 --- a/hidcomposite_8h__dep__incl.map +++ b/hidcomposite_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/hidcomposite_8h__dep__incl.md5 b/hidcomposite_8h__dep__incl.md5 index 1c808cef..fa654d6e 100644 --- a/hidcomposite_8h__dep__incl.md5 +++ b/hidcomposite_8h__dep__incl.md5 @@ -1 +1 @@ -1cbc34f3a978d88778b887a180658967 \ No newline at end of file +e5cefe8e10450dabf59c09b38501c8d9 \ No newline at end of file diff --git a/hidcomposite_8h__dep__incl.png b/hidcomposite_8h__dep__incl.png index 8ac3084697e24f66061dd4d153f5ec04f82a133f..1450219885b4c088dedf9dedeb1485463815c4ea 100644 GIT binary patch literal 2862 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 KXi2@`oA@8oz<@0P literal 3213 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 diff --git a/hidcomposite_8h__incl.map b/hidcomposite_8h__incl.map index 096b857f..71782bd9 100644 --- a/hidcomposite_8h__incl.map +++ b/hidcomposite_8h__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/hidcomposite_8h__incl.md5 b/hidcomposite_8h__incl.md5 index cde410e3..a69ff5ec 100644 --- a/hidcomposite_8h__incl.md5 +++ b/hidcomposite_8h__incl.md5 @@ -1 +1 @@ -bef4c3d13e94ee692266da2ec008db60 \ No newline at end of file +dbac9dbca596a8ac61230cf0b5b0afd8 \ No newline at end of file diff --git a/hidcomposite_8h__incl.png b/hidcomposite_8h__incl.png index 5bc98627be42425b98c3576cd23baf7b3b74813e..fe23c57a7f5a3bfe63c2978a32b790e7fa878e56 100644 GIT binary patch literal 7737 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 d+;f9r&vW@ - + USB Host Shield 2.0: hidcomposite.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0

    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,115 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidcomposite.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 
    -
    18 #if !defined(__HIDCOMPOSITE_H__)
    -
    19 #define __HIDCOMPOSITE_H__
    -
    20 
    -
    21 #include "usbhid.h"
    -
    22 //#include "hidescriptorparser.h"
    -
    23 
    -
    24 class HIDComposite : public USBHID {
    -
    25 
    -
    26  struct ReportParser {
    -
    27  uint8_t rptId;
    -
    28  HIDReportParser *rptParser;
    -
    29  } rptParsers[MAX_REPORT_PARSERS];
    -
    30 
    -
    31  // HID class specific descriptor type and length info obtained from HID descriptor
    - -
    33 
    -
    34  // Returns HID class specific descriptor length by its type and order number
    -
    35  uint16_t GetHidClassDescrLen(uint8_t type, uint8_t num);
    -
    36 
    -
    37  struct HIDInterface {
    -
    38  struct {
    -
    39  uint8_t bmInterface : 3;
    -
    40  uint8_t bmAltSet : 3;
    -
    41  uint8_t bmProtocol : 2;
    -
    42  };
    -
    43  uint8_t epIndex[maxEpPerInterface];
    -
    44  };
    -
    45 
    -
    46  uint8_t bConfNum; // configuration number
    -
    47  uint8_t bNumIface; // number of interfaces in the configuration
    -
    48  uint8_t bNumEP; // total number of EP in the configuration
    -
    49  uint32_t qNextPollTime; // next poll time
    -
    50  uint8_t pollInterval;
    -
    51  bool bPollEnable; // poll enable flag
    -
    52 
    -
    53  static const uint16_t constBuffLen = 64; // event buffer length
    -
    54 
    -
    55  void Initialize();
    -
    56  HIDInterface* FindInterface(uint8_t iface, uint8_t alt, uint8_t proto);
    -
    57 
    -
    58  void ZeroMemory(uint8_t len, uint8_t *buf);
    -
    59 
    -
    60 protected:
    - - -
    63 
    - -
    65 
    -
    66  uint16_t PID, VID; // PID and VID of connected device
    -
    67 
    -
    68  // HID implementation
    -
    69  HIDReportParser* GetReportParser(uint8_t id);
    -
    70 
    -
    71  virtual uint8_t OnInitSuccessful() {
    -
    72  return 0;
    -
    73  };
    -
    74 
    -
    75  virtual void ParseHIDData(USBHID *hid __attribute__((unused)), uint8_t ep __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len __attribute__((unused)), uint8_t *buf __attribute__((unused))) {
    -
    76  return;
    -
    77  };
    -
    78 
    -
    79 public:
    -
    80  HIDComposite(USB *p);
    -
    81 
    -
    82  // HID implementation
    -
    83  bool SetReportParser(uint8_t id, HIDReportParser *prs);
    -
    84 
    -
    85  // USBDeviceConfig implementation
    -
    86  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    87  uint8_t Release();
    -
    88  uint8_t Poll();
    -
    89 
    -
    90  virtual uint8_t GetAddress() {
    -
    91  return bAddress;
    -
    92  };
    -
    93 
    -
    94  virtual bool isReady() {
    -
    95  return bPollEnable;
    -
    96  };
    -
    97 
    -
    98  // UsbConfigXtracter implementation
    -
    99  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    100 
    -
    101  // Send report - do not mix with SetReport()!
    -
    102  uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr);
    -
    103 
    -
    104  // Returns true if we should listen on an interface, false if not
    -
    105  virtual bool SelectInterface(uint8_t iface, uint8_t proto) = 0;
    -
    106 };
    -
    107 
    -
    108 #endif // __HIDCOMPOSITE_H__
    -
    Definition: usbhid.h:143
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 
    18 #if !defined(__HIDCOMPOSITE_H__)
    19 #define __HIDCOMPOSITE_H__
    20 
    21 #include "usbhid.h"
    22 //#include "hidescriptorparser.h"
    23 
    24 class HIDComposite : public USBHID {
    25 
    26  struct ReportParser {
    27  uint8_t rptId;
    28  HIDReportParser *rptParser;
    29  } rptParsers[MAX_REPORT_PARSERS];
    30 
    31  // HID class specific descriptor type and length info obtained from HID descriptor
    33 
    34  // Returns HID class specific descriptor length by its type and order number
    35  uint16_t GetHidClassDescrLen(uint8_t type, uint8_t num);
    36 
    37  struct HIDInterface {
    38  struct {
    39  uint8_t bmInterface : 3;
    40  uint8_t bmAltSet : 3;
    41  uint8_t bmProtocol : 2;
    42  };
    43  uint8_t epIndex[maxEpPerInterface];
    44  };
    45 
    46  uint8_t bConfNum; // configuration number
    47  uint8_t bNumIface; // number of interfaces in the configuration
    48  uint8_t bNumEP; // total number of EP in the configuration
    49  uint32_t qNextPollTime; // next poll time
    50  uint8_t pollInterval;
    51  bool bPollEnable; // poll enable flag
    52 
    53  static const uint16_t constBuffLen = 64; // event buffer length
    54 
    55  void Initialize();
    56  HIDInterface* FindInterface(uint8_t iface, uint8_t alt, uint8_t proto);
    57 
    58  void ZeroMemory(uint8_t len, uint8_t *buf);
    59 
    60 protected:
    63 
    65 
    66  uint16_t PID, VID; // PID and VID of connected device
    67 
    68  // HID implementation
    69  HIDReportParser* GetReportParser(uint8_t id);
    70 
    71  virtual uint8_t OnInitSuccessful() {
    72  return 0;
    73  };
    74 
    75  virtual void ParseHIDData(USBHID *hid __attribute__((unused)), uint8_t ep __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len __attribute__((unused)), uint8_t *buf __attribute__((unused))) {
    76  return;
    77  };
    78 
    79 public:
    80  HIDComposite(USB *p);
    81 
    82  // HID implementation
    83  bool SetReportParser(uint8_t id, HIDReportParser *prs);
    84 
    85  // USBDeviceConfig implementation
    86  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    87  uint8_t Release();
    88  uint8_t Poll();
    89 
    90  virtual uint8_t GetAddress() {
    91  return bAddress;
    92  };
    93 
    94  virtual bool isReady() {
    95  return bPollEnable;
    96  };
    97 
    98  // UsbConfigXtracter implementation
    99  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    100 
    101  // Send report - do not mix with SetReport()!
    102  uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr);
    103 
    104  // Returns true if we should listen on an interface, false if not
    105  virtual bool SelectInterface(uint8_t iface, uint8_t proto) = 0;
    106 };
    107 
    108 #endif // __HIDCOMPOSITE_H__
    Definition: usbhid.h:143
    #define HID_MAX_HID_CLASS_DESCRIPTORS
    Definition: usbhid.h:24
    #define MAX_REPORT_PARSERS
    Definition: usbhid.h:23
    @@ -230,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidescriptorparser_8cpp.html b/hidescriptorparser_8cpp.html index ae145d90..477d87d1 100644 --- a/hidescriptorparser_8cpp.html +++ b/hidescriptorparser_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidescriptorparser.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidescriptorparser.cpp File Reference
    -
    #include "hidescriptorparser.h"
    +
    Include dependency graph for hidescriptorparser.cpp:
    - + + + + +

    Go to the source code of this file.

    @@ -100,7 +105,7 @@ Include dependency graph for hidescriptorparser.cpp:
    diff --git a/hidescriptorparser_8cpp__incl.map b/hidescriptorparser_8cpp__incl.map index 3096ee75..2af760a8 100644 --- a/hidescriptorparser_8cpp__incl.map +++ b/hidescriptorparser_8cpp__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/hidescriptorparser_8cpp__incl.md5 b/hidescriptorparser_8cpp__incl.md5 index e85359ea..d9090345 100644 --- a/hidescriptorparser_8cpp__incl.md5 +++ b/hidescriptorparser_8cpp__incl.md5 @@ -1 +1 @@ -8db4f477c2427eb53875d040bd816992 \ No newline at end of file +ae4f9bfa13694d05aed5bfbb544f5ac5 \ No newline at end of file diff --git a/hidescriptorparser_8cpp__incl.png b/hidescriptorparser_8cpp__incl.png index 2792a4356f4538f568aa817692a860ed69fee7ec..852671a80ba28a1d1cbaf7c4939eac19ee9d7dcc 100644 GIT binary patch literal 9693 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 Zy`$q`HJpPdgL*B9vVyvNiR^3t{{g;j*H8ce literal 11423 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%0AiHa6jObK%@WYGzaO1<4q|5s|&{f0gOqRiI4g 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 diff --git a/hidescriptorparser_8cpp_source.html b/hidescriptorparser_8cpp_source.html index 2f057914..7f690c23 100644 --- a/hidescriptorparser_8cpp_source.html +++ b/hidescriptorparser_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidescriptorparser.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,1595 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidescriptorparser.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 
    -
    18 #include "hidescriptorparser.h"
    -
    19 
    -
    20 const char * const ReportDescParserBase::usagePageTitles0[] PROGMEM = {
    - - - - - - - - - - - - - - - -
    36 };
    -
    37 
    -
    38 const char * const ReportDescParserBase::usagePageTitles1[] PROGMEM = {
    - - - - - - -
    45 };
    -
    46 const char * const ReportDescParserBase::genDesktopTitles0[] PROGMEM = {
    - - - - - - - - -
    55 
    -
    56 };
    -
    57 const char * const ReportDescParserBase::genDesktopTitles1[] PROGMEM = {
    -
    58  pstrUsageX,
    -
    59  pstrUsageY,
    -
    60  pstrUsageZ,
    - - - - - - - - - - - - - - - - - - - - - - -
    83 };
    -
    84 const char * const ReportDescParserBase::genDesktopTitles2[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - -
    105 };
    -
    106 const char * const ReportDescParserBase::genDesktopTitles3[] PROGMEM = {
    - - - - - - - - - -
    116 };
    -
    117 const char * const ReportDescParserBase::genDesktopTitles4[] PROGMEM = {
    - - - - - - - - -
    126 };
    -
    127 const char * const ReportDescParserBase::simuTitles0[] PROGMEM = {
    - - - - - - - - - - - - -
    140 };
    -
    141 const char * const ReportDescParserBase::simuTitles1[] PROGMEM = {
    - - - - - - -
    148 };
    -
    149 const char * const ReportDescParserBase::simuTitles2[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    183 };
    -
    184 const char * const ReportDescParserBase::vrTitles0[] PROGMEM = {
    - - - - - - - - - - -
    195 };
    -
    196 const char * const ReportDescParserBase::vrTitles1[] PROGMEM = {
    - - -
    199 };
    -
    200 const char * const ReportDescParserBase::sportsCtrlTitles0[] PROGMEM = {
    - - - - -
    205 };
    -
    206 const char * const ReportDescParserBase::sportsCtrlTitles1[] PROGMEM = {
    -
    207  pstrUsageOar,
    - - - - - - - - - -
    217 };
    -
    218 const char * const ReportDescParserBase::sportsCtrlTitles2[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - -
    239 };
    -
    240 const char * const ReportDescParserBase::gameTitles0[] PROGMEM = {
    - - - -
    244 };
    -
    245 const char * const ReportDescParserBase::gameTitles1[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    271 };
    -
    272 const char * const ReportDescParserBase::genDevCtrlTitles[] PROGMEM = {
    - - - - - - - -
    280 };
    -
    281 const char * const ReportDescParserBase::ledTitles[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - -
    301  pstrUsageCAV,
    -
    302  pstrUsageCLV,
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    359 };
    -
    360 const char * const ReportDescParserBase::telTitles0 [] PROGMEM = {
    - - - - - - - -
    368 };
    -
    369 const char * const ReportDescParserBase::telTitles1 [] PROGMEM = {
    - - - - - - - - - - - - - - - - - - -
    388 };
    -
    389 const char * const ReportDescParserBase::telTitles2 [] PROGMEM = {
    - - - - -
    394 };
    -
    395 const char * const ReportDescParserBase::telTitles3 [] PROGMEM = {
    - - - - - -
    401 };
    -
    402 const char * const ReportDescParserBase::telTitles4 [] PROGMEM = {
    - - - - - - - - - - - - - - - -
    418 };
    -
    419 const char * const ReportDescParserBase::telTitles5 [] PROGMEM = {
    - - - - - - - - - - - - - - - - -
    436 };
    -
    437 const char * const ReportDescParserBase::consTitles0[] PROGMEM = {
    - - - - - - -
    444 };
    -
    445 const char * const ReportDescParserBase::consTitles1[] PROGMEM = {
    - - - -
    449 };
    -
    450 const char * const ReportDescParserBase::consTitles2[] PROGMEM = {
    - - - - - - - -
    458 
    -
    459 };
    -
    460 const char * const ReportDescParserBase::consTitles3[] PROGMEM = {
    - - - - - - - - - -
    470 };
    -
    471 const char * const ReportDescParserBase::consTitles4[] PROGMEM = {
    - - - - - - - -
    479 };
    -
    480 const char * const ReportDescParserBase::consTitles5[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    518 };
    -
    519 const char * const ReportDescParserBase::consTitles6[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    551 };
    -
    552 const char * const ReportDescParserBase::consTitles7[] PROGMEM = {
    - - - - - - - - -
    561  pstrUsageMPX,
    - - -
    564 };
    -
    565 const char * const ReportDescParserBase::consTitles8[] PROGMEM = {
    - - - - - - -
    572 };
    -
    573 const char * const ReportDescParserBase::consTitles9[] PROGMEM = {
    - - - - - - - - - - - - - - -
    588 };
    -
    589 const char * const ReportDescParserBase::consTitlesA[] PROGMEM = {
    - - - - - - -
    596 };
    -
    597 const char * const ReportDescParserBase::consTitlesB[] PROGMEM = {
    - - - - - - - - - - - -
    609 };
    -
    610 const char * const ReportDescParserBase::consTitlesC[] PROGMEM = {
    - - - - - -
    616 };
    -
    617 const char * const ReportDescParserBase::consTitlesD[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    690 };
    -
    691 const char * const ReportDescParserBase::consTitlesE[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    833 };
    -
    834 const char * const ReportDescParserBase::digitTitles0[] PROGMEM = {
    - -
    836  pstrUsagePen,
    - - - - - - - - - - - -
    848 };
    -
    849 const char * const ReportDescParserBase::digitTitles1[] PROGMEM = {
    - - - -
    853 
    -
    854 };
    -
    855 const char * const ReportDescParserBase::digitTitles2[] PROGMEM = {
    - - - - - -
    861  pstrUsageTap,
    - - - - - - - - - - - - - - - - - -
    879 };
    -
    880 const char * const ReportDescParserBase::aplphanumTitles0[] PROGMEM = {
    - - -
    883 };
    -
    884 const char * const ReportDescParserBase::aplphanumTitles1[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - -
    904  pstrUsageRow,
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    931 };
    -
    932 const char * const ReportDescParserBase::aplphanumTitles2[] PROGMEM = {
    - - - - - - - - - - - - - - - - - - - - - -
    954 };
    -
    955 const char * const ReportDescParserBase::medInstrTitles0[] PROGMEM = {
    - - - - - - - - -
    964 };
    -
    965 const char * const ReportDescParserBase::medInstrTitles1[] PROGMEM = {
    - - - - - -
    971 };
    -
    972 const char * const ReportDescParserBase::medInstrTitles2[] PROGMEM = {
    - - -
    975 };
    -
    976 const char * const ReportDescParserBase::medInstrTitles3[] PROGMEM = {
    - - - - - - - - - - -
    987 };
    -
    988 const char * const ReportDescParserBase::medInstrTitles4[] PROGMEM = {
    - - -
    991 };
    -
    992 
    -
    993 void ReportDescParserBase::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset __attribute__((unused))) {
    -
    994  uint16_t cntdn = (uint16_t)len;
    -
    995  uint8_t *p = (uint8_t*)pbuf;
    -
    996 
    -
    997 
    -
    998  totalSize = 0;
    -
    999 
    -
    1000  while(cntdn) {
    -
    1001  //USB_HOST_SERIAL.println("");
    -
    1002  //PrintHex<uint16_t>(offset + len - cntdn);
    -
    1003  //USB_HOST_SERIAL.print(":");
    -
    1004 
    -
    1005  ParseItem(&p, &cntdn);
    -
    1006 
    -
    1007  //if (ParseItem(&p, &cntdn))
    -
    1008  // return;
    -
    1009  }
    -
    1010  //USBTRACE2("Total:", totalSize);
    -
    1011 }
    -
    1012 
    -
    1013 void ReportDescParserBase::PrintValue(uint8_t *p, uint8_t len) {
    -
    1014  E_Notify(PSTR("("), 0x80);
    -
    1015  for(; len; p++, len--)
    -
    1016  PrintHex<uint8_t > (*p, 0x80);
    -
    1017  E_Notify(PSTR(")"), 0x80);
    -
    1018 }
    -
    1019 
    - -
    1021  E_Notify(PSTR("("), 0x80);
    -
    1022  PrintHex<uint8_t > (data, 0x80);
    -
    1023  E_Notify(PSTR(")"), 0x80);
    -
    1024 }
    -
    1025 
    - -
    1027  switch(prefix & (TYPE_MASK | TAG_MASK)) {
    -
    1028  case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
    -
    1029  E_Notify(PSTR("\r\nPush"), 0x80);
    -
    1030  break;
    -
    1031  case (TYPE_GLOBAL | TAG_GLOBAL_POP):
    -
    1032  E_Notify(PSTR("\r\nPop"), 0x80);
    -
    1033  break;
    - -
    1035  E_Notify(PSTR("\r\nUsage Page"), 0x80);
    -
    1036  break;
    - -
    1038  E_Notify(PSTR("\r\nLogical Min"), 0x80);
    -
    1039  break;
    - -
    1041  E_Notify(PSTR("\r\nLogical Max"), 0x80);
    -
    1042  break;
    - -
    1044  E_Notify(PSTR("\r\nPhysical Min"), 0x80);
    -
    1045  break;
    - -
    1047  E_Notify(PSTR("\r\nPhysical Max"), 0x80);
    -
    1048  break;
    - -
    1050  E_Notify(PSTR("\r\nUnit Exp"), 0x80);
    -
    1051  break;
    -
    1052  case (TYPE_GLOBAL | TAG_GLOBAL_UNIT):
    -
    1053  E_Notify(PSTR("\r\nUnit"), 0x80);
    -
    1054  break;
    - -
    1056  E_Notify(PSTR("\r\nReport Size"), 0x80);
    -
    1057  break;
    - -
    1059  E_Notify(PSTR("\r\nReport Count"), 0x80);
    -
    1060  break;
    - -
    1062  E_Notify(PSTR("\r\nReport Id"), 0x80);
    -
    1063  break;
    -
    1064  case (TYPE_LOCAL | TAG_LOCAL_USAGE):
    -
    1065  E_Notify(PSTR("\r\nUsage"), 0x80);
    -
    1066  break;
    -
    1067  case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
    -
    1068  E_Notify(PSTR("\r\nUsage Min"), 0x80);
    -
    1069  break;
    -
    1070  case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
    -
    1071  E_Notify(PSTR("\r\nUsage Max"), 0x80);
    -
    1072  break;
    -
    1073  case (TYPE_MAIN | TAG_MAIN_COLLECTION):
    -
    1074  E_Notify(PSTR("\r\nCollection"), 0x80);
    -
    1075  break;
    - -
    1077  E_Notify(PSTR("\r\nEnd Collection"), 0x80);
    -
    1078  break;
    -
    1079  case (TYPE_MAIN | TAG_MAIN_INPUT):
    -
    1080  E_Notify(PSTR("\r\nInput"), 0x80);
    -
    1081  break;
    -
    1082  case (TYPE_MAIN | TAG_MAIN_OUTPUT):
    -
    1083  E_Notify(PSTR("\r\nOutput"), 0x80);
    -
    1084  break;
    -
    1085  case (TYPE_MAIN | TAG_MAIN_FEATURE):
    -
    1086  E_Notify(PSTR("\r\nFeature"), 0x80);
    -
    1087  break;
    -
    1088  } // switch (**pp & (TYPE_MASK | TAG_MASK))
    -
    1089 }
    -
    1090 
    -
    1091 uint8_t ReportDescParserBase::ParseItem(uint8_t **pp, uint16_t *pcntdn) {
    -
    1092  //uint8_t ret = enErrorSuccess;
    -
    1093  //reinterpret_cast<>(varBuffer);
    -
    1094  switch(itemParseState) {
    -
    1095  case 0:
    -
    1096  if(**pp == HID_LONG_ITEM_PREFIX)
    -
    1097  USBTRACE("\r\nLONG\r\n");
    -
    1098  else {
    -
    1099  uint8_t size = ((**pp) & DATA_SIZE_MASK);
    -
    1100 
    -
    1101  itemPrefix = (**pp);
    -
    1102  itemSize = 1 + ((size == DATA_SIZE_4) ? 4 : size);
    -
    1103 
    - -
    1105  }
    -
    1106  (*pp)++;
    -
    1107  (*pcntdn)--;
    -
    1108  itemSize--;
    -
    1109  itemParseState = 1;
    -
    1110 
    -
    1111  if(!itemSize)
    -
    1112  break;
    -
    1113 
    -
    1114  if(!pcntdn)
    -
    1115  return enErrorIncomplete;
    -
    1116  case 1:
    -
    1117  //USBTRACE2("\r\niSz:",itemSize);
    -
    1118 
    - - -
    1121  itemParseState = 2;
    -
    1122  case 2:
    -
    1123  if(!valParser.Parse(pp, pcntdn))
    -
    1124  return enErrorIncomplete;
    -
    1125  itemParseState = 3;
    -
    1126  case 3:
    -
    1127  {
    -
    1128  uint8_t data = *((uint8_t*)varBuffer);
    -
    1129 
    -
    1130  switch(itemPrefix & (TYPE_MASK | TAG_MASK)) {
    -
    1131  case (TYPE_LOCAL | TAG_LOCAL_USAGE):
    -
    1132  if(pfUsage) {
    -
    1133  if(theBuffer.valueSize > 1) {
    -
    1134  uint16_t* ui16 = reinterpret_cast<uint16_t *>(varBuffer);
    -
    1135  pfUsage(*ui16);
    -
    1136  } else
    -
    1137  pfUsage(data);
    -
    1138  }
    -
    1139  break;
    - -
    1141  rptSize = data;
    -
    1142  PrintByteValue(data);
    -
    1143  break;
    - -
    1145  rptCount = data;
    -
    1146  PrintByteValue(data);
    -
    1147  break;
    - - - - - -
    1153  case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
    -
    1154  case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
    - -
    1156  case (TYPE_GLOBAL | TAG_GLOBAL_UNIT):
    - -
    1158  break;
    -
    1159  case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
    -
    1160  case (TYPE_GLOBAL | TAG_GLOBAL_POP):
    -
    1161  break;
    - -
    1163  SetUsagePage(data);
    -
    1164  PrintUsagePage(data);
    -
    1165  PrintByteValue(data);
    -
    1166  break;
    -
    1167  case (TYPE_MAIN | TAG_MAIN_COLLECTION):
    - -
    1169  switch(data) {
    -
    1170  case 0x00:
    -
    1171  E_Notify(PSTR(" Physical"), 0x80);
    -
    1172  break;
    -
    1173  case 0x01:
    -
    1174  E_Notify(PSTR(" Application"), 0x80);
    -
    1175  break;
    -
    1176  case 0x02:
    -
    1177  E_Notify(PSTR(" Logical"), 0x80);
    -
    1178  break;
    -
    1179  case 0x03:
    -
    1180  E_Notify(PSTR(" Report"), 0x80);
    -
    1181  break;
    -
    1182  case 0x04:
    -
    1183  E_Notify(PSTR(" Named Array"), 0x80);
    -
    1184  break;
    -
    1185  case 0x05:
    -
    1186  E_Notify(PSTR(" Usage Switch"), 0x80);
    -
    1187  break;
    -
    1188  case 0x06:
    -
    1189  E_Notify(PSTR(" Usage Modifier"), 0x80);
    -
    1190  break;
    -
    1191  default:
    -
    1192  E_Notify(PSTR(" Vendor Defined("), 0x80);
    -
    1193  PrintHex<uint8_t > (data, 0x80);
    -
    1194  E_Notify(PSTR(")"), 0x80);
    -
    1195  }
    -
    1196  break;
    -
    1197  case (TYPE_MAIN | TAG_MAIN_INPUT):
    -
    1198  case (TYPE_MAIN | TAG_MAIN_OUTPUT):
    -
    1199  case (TYPE_MAIN | TAG_MAIN_FEATURE):
    -
    1200  totalSize += (uint16_t)rptSize * (uint16_t)rptCount;
    -
    1201  rptSize = 0;
    -
    1202  rptCount = 0;
    -
    1203  E_Notify(PSTR("("), 0x80);
    -
    1204  PrintBin<uint8_t > (data, 0x80);
    -
    1205  E_Notify(PSTR(")"), 0x80);
    -
    1206  break;
    -
    1207  } // switch (**pp & (TYPE_MASK | TAG_MASK))
    -
    1208  }
    -
    1209  } // switch (itemParseState)
    -
    1210  itemParseState = 0;
    -
    1211  return enErrorSuccess;
    -
    1212 }
    -
    1213 
    - - - - - - - -
    1221  NULL, // Keyboard/Keypad
    - - - - - - -
    1228  NULL, // Reserved
    -
    1229  NULL, // PID
    -
    1230  NULL // Unicode
    -
    1231 };
    -
    1232 
    - -
    1234  pfUsage = NULL;
    -
    1235 
    -
    1236  if(VALUE_BETWEEN(page, 0x00, 0x11)) {
    -
    1237  pfUsage = (usagePageFunctions[page - 1]);
    -
    1238 
    -
    1239  } else {
    -
    1240  switch(page) {
    -
    1241  case 0x14:
    - -
    1243  break;
    -
    1244  case 0x40:
    - -
    1246  break;
    -
    1247  }
    -
    1248  }
    -
    1249 }
    -
    1250 
    - -
    1252  const char * const * w;
    -
    1253  E_Notify(pstrSpace, 0x80);
    -
    1254 
    -
    1255  output_if_between(page, 0x00, 0x11, w, E_Notify, usagePageTitles0, 0x80)
    -
    1256  else output_if_between(page, 0x8b, 0x92, w, E_Notify, usagePageTitles1, 0x80)
    -
    1257  else if(VALUE_BETWEEN(page, 0x7f, 0x84))
    - -
    1259  else if(VALUE_BETWEEN(page, 0x83, 0x8c))
    - -
    1261  else if(page > 0xfeff /* && page <= 0xffff */)
    - -
    1263  else
    -
    1264  switch(page) {
    -
    1265  case 0x14:
    - -
    1267  break;
    -
    1268  case 0x40:
    - -
    1270  break;
    -
    1271  default:
    - -
    1273  }
    -
    1274 }
    -
    1275 
    - -
    1277  E_Notify(pstrSpace, 0x80);
    -
    1278  E_Notify(PSTR("Btn"), 0x80);
    -
    1279  PrintHex<uint16_t > (usage, 0x80);
    -
    1280  E_Notify(PSTR("\r\n"), 0x80);
    -
    1281  //USB_HOST_SERIAL.print(usage, HEX);
    -
    1282 }
    -
    1283 
    - -
    1285  E_Notify(pstrSpace, 0x80);
    -
    1286  E_Notify(PSTR("Inst"), 0x80);
    -
    1287  // Sorry, HEX for now...
    -
    1288  PrintHex<uint16_t > (usage, 0x80);
    -
    1289  E_Notify(PSTR("\r\n"), 0x80);
    -
    1290  //USB_HOST_SERIAL.print(usage, DEC);
    -
    1291 }
    -
    1292 
    - -
    1294  const char * const * w;
    -
    1295  E_Notify(pstrSpace, 0x80);
    -
    1296 
    -
    1297  output_if_between(usage, 0x00, 0x0a, w, E_Notify, genDesktopTitles0, 0x80)
    -
    1298  else output_if_between(usage, 0x2f, 0x49, w, E_Notify, genDesktopTitles1, 0x80)
    -
    1299  else output_if_between(usage, 0x7f, 0x94, w, E_Notify, genDesktopTitles2, 0x80)
    -
    1300  else output_if_between(usage, 0x9f, 0xa9, w, E_Notify, genDesktopTitles3, 0x80)
    -
    1301  else output_if_between(usage, 0xaf, 0xb8, w, E_Notify, genDesktopTitles4, 0x80)
    -
    1302  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1303 }
    -
    1304 
    - -
    1306  const char * const * w;
    -
    1307  E_Notify(pstrSpace, 0x80);
    -
    1308 
    -
    1309  output_if_between(usage, 0x00, 0x0d, w, E_Notify, simuTitles0, 0x80)
    -
    1310  else output_if_between(usage, 0x1f, 0x26, w, E_Notify, simuTitles1, 0x80)
    -
    1311  else output_if_between(usage, 0xaf, 0xd1, w, E_Notify, simuTitles2, 0x80)
    -
    1312  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1313 }
    -
    1314 
    - -
    1316  const char * const * w;
    -
    1317  E_Notify(pstrSpace, 0x80);
    -
    1318 
    -
    1319  output_if_between(usage, 0x00, 0x0b, w, E_Notify, vrTitles0, 0x80)
    -
    1320  else output_if_between(usage, 0x1f, 0x22, w, E_Notify, vrTitles1, 0x80)
    -
    1321  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1322 }
    -
    1323 
    - -
    1325  const char * const * w;
    -
    1326  E_Notify(pstrSpace, 0x80);
    -
    1327 
    -
    1328  output_if_between(usage, 0x00, 0x05, w, E_Notify, sportsCtrlTitles0, 0x80)
    -
    1329  else output_if_between(usage, 0x2f, 0x3a, w, E_Notify, sportsCtrlTitles1, 0x80)
    -
    1330  else output_if_between(usage, 0x4f, 0x64, w, E_Notify, sportsCtrlTitles2, 0x80)
    -
    1331  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1332 }
    -
    1333 
    - -
    1335  const char * const * w;
    -
    1336  E_Notify(pstrSpace, 0x80);
    -
    1337 
    -
    1338  output_if_between(usage, 0x00, 0x04, w, E_Notify, gameTitles0, 0x80)
    -
    1339  else output_if_between(usage, 0x1f, 0x3a, w, E_Notify, gameTitles1, 0x80)
    -
    1340  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1341 }
    -
    1342 
    - -
    1344  const char * const * w;
    -
    1345  E_Notify(pstrSpace, 0x80);
    -
    1346 
    -
    1347  output_if_between(usage, 0x1f, 0x27, w, E_Notify, genDevCtrlTitles, 0x80)
    -
    1348  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1349 }
    -
    1350 
    - -
    1352  const char * const * w;
    -
    1353  E_Notify(pstrSpace, 0x80);
    -
    1354 
    -
    1355  output_if_between(usage, 0x00, 0x4e, w, E_Notify, ledTitles, 0x80)
    -
    1356  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1357 }
    -
    1358 
    - -
    1360  const char * const * w;
    -
    1361  E_Notify(pstrSpace, 0x80);
    -
    1362 
    -
    1363  output_if_between(usage, 0x00, 0x08, w, E_Notify, telTitles0, 0x80)
    -
    1364  else output_if_between(usage, 0x1f, 0x32, w, E_Notify, telTitles1, 0x80)
    -
    1365  else output_if_between(usage, 0x4f, 0x54, w, E_Notify, telTitles2, 0x80)
    -
    1366  else output_if_between(usage, 0x6f, 0x75, w, E_Notify, telTitles3, 0x80)
    -
    1367  else output_if_between(usage, 0x8f, 0x9f, w, E_Notify, telTitles4, 0x80)
    -
    1368  else output_if_between(usage, 0xaf, 0xc0, w, E_Notify, telTitles5, 0x80)
    -
    1369  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1370 }
    -
    1371 
    - -
    1373  const char * const * w;
    -
    1374  E_Notify(pstrSpace, 0x80);
    -
    1375 
    -
    1376  output_if_between(usage, 0x00, 0x07, w, E_Notify, consTitles0, 0x80)
    -
    1377  else output_if_between(usage, 0x1f, 0x23, w, E_Notify, consTitles1, 0x80)
    -
    1378  else output_if_between(usage, 0x2f, 0x37, w, E_Notify, consTitles2, 0x80)
    -
    1379  else output_if_between(usage, 0x3f, 0x49, w, E_Notify, consTitles3, 0x80)
    -
    1380  else output_if_between(usage, 0x5f, 0x67, w, E_Notify, consTitles4, 0x80)
    -
    1381  else output_if_between(usage, 0x7f, 0xa5, w, E_Notify, consTitles5, 0x80)
    -
    1382  else output_if_between(usage, 0xaf, 0xcf, w, E_Notify, consTitles6, 0x80)
    -
    1383  else output_if_between(usage, 0xdf, 0xeb, w, E_Notify, consTitles7, 0x80)
    -
    1384  else output_if_between(usage, 0xef, 0xf6, w, E_Notify, consTitles8, 0x80)
    -
    1385  else output_if_between(usage, 0xff, 0x10e, w, E_Notify, consTitles9, 0x80)
    -
    1386  else output_if_between(usage, 0x14f, 0x156, w, E_Notify, consTitlesA, 0x80)
    -
    1387  else output_if_between(usage, 0x15f, 0x16b, w, E_Notify, consTitlesB, 0x80)
    -
    1388  else output_if_between(usage, 0x16f, 0x175, w, E_Notify, consTitlesC, 0x80)
    -
    1389  else output_if_between(usage, 0x17f, 0x1c8, w, E_Notify, consTitlesD, 0x80)
    -
    1390  else output_if_between(usage, 0x1ff, 0x29d, w, E_Notify, consTitlesE, 0x80)
    -
    1391  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1392 }
    -
    1393 
    - -
    1395  const char * const * w;
    -
    1396  E_Notify(pstrSpace, 0x80);
    -
    1397 
    -
    1398  output_if_between(usage, 0x00, 0x0e, w, E_Notify, digitTitles0, 0x80)
    -
    1399  else output_if_between(usage, 0x1f, 0x23, w, E_Notify, digitTitles1, 0x80)
    -
    1400  else output_if_between(usage, 0x2f, 0x47, w, E_Notify, digitTitles2, 0x80)
    -
    1401  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1402 }
    -
    1403 
    - -
    1405  const char * const * w;
    -
    1406  E_Notify(pstrSpace, 0x80);
    -
    1407 
    -
    1408  output_if_between(usage, 0x00, 0x03, w, E_Notify, aplphanumTitles0, 0x80)
    -
    1409  else output_if_between(usage, 0x1f, 0x4e, w, E_Notify, aplphanumTitles1, 0x80)
    -
    1410  else output_if_between(usage, 0x7f, 0x96, w, E_Notify, digitTitles2, 0x80)
    -
    1411  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1412 }
    -
    1413 
    - -
    1415  const char * const * w;
    -
    1416  E_Notify(pstrSpace, 0x80);
    -
    1417 
    -
    1418  if(usage == 1) E_Notify(pstrUsageMedicalUltrasound, 0x80);
    -
    1419  else if(usage == 0x70)
    - -
    1421  else output_if_between(usage, 0x1f, 0x28, w, E_Notify, medInstrTitles0, 0x80)
    -
    1422  else output_if_between(usage, 0x3f, 0x45, w, E_Notify, medInstrTitles1, 0x80)
    -
    1423  else output_if_between(usage, 0x5f, 0x62, w, E_Notify, medInstrTitles2, 0x80)
    -
    1424  else output_if_between(usage, 0x7f, 0x8a, w, E_Notify, medInstrTitles3, 0x80)
    -
    1425  else output_if_between(usage, 0x9f, 0xa2, w, E_Notify, medInstrTitles4, 0x80)
    -
    1426  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1427 }
    -
    1428 
    -
    1429 uint8_t ReportDescParser2::ParseItem(uint8_t **pp, uint16_t *pcntdn) {
    -
    1430  //uint8_t ret = enErrorSuccess;
    -
    1431 
    -
    1432  switch(itemParseState) {
    -
    1433  case 0:
    -
    1434  if(**pp == HID_LONG_ITEM_PREFIX)
    -
    1435  USBTRACE("\r\nLONG\r\n");
    -
    1436  else {
    -
    1437  uint8_t size = ((**pp) & DATA_SIZE_MASK);
    -
    1438  itemPrefix = (**pp);
    -
    1439  itemSize = 1 + ((size == DATA_SIZE_4) ? 4 : size);
    -
    1440  }
    -
    1441  (*pp)++;
    -
    1442  (*pcntdn)--;
    -
    1443  itemSize--;
    -
    1444  itemParseState = 1;
    -
    1445 
    -
    1446  if(!itemSize)
    -
    1447  break;
    -
    1448 
    -
    1449  if(!pcntdn)
    -
    1450  return enErrorIncomplete;
    -
    1451  case 1:
    - - -
    1454  itemParseState = 2;
    -
    1455  case 2:
    -
    1456  if(!valParser.Parse(pp, pcntdn))
    -
    1457  return enErrorIncomplete;
    -
    1458  itemParseState = 3;
    -
    1459  case 3:
    -
    1460  {
    -
    1461  uint8_t data = *((uint8_t*)varBuffer);
    -
    1462 
    -
    1463  switch(itemPrefix & (TYPE_MASK | TAG_MASK)) {
    -
    1464  case (TYPE_LOCAL | TAG_LOCAL_USAGE):
    -
    1465  if(pfUsage) {
    -
    1466  if(theBuffer.valueSize > 1) {
    -
    1467  uint16_t* ui16 = reinterpret_cast<uint16_t *>(varBuffer);
    -
    1468  pfUsage(*ui16);
    -
    1469  } else
    -
    1470  pfUsage(data);
    -
    1471  }
    -
    1472  break;
    - -
    1474  rptSize = data;
    -
    1475  break;
    - -
    1477  rptCount = data;
    -
    1478  break;
    - -
    1480  rptId = data;
    -
    1481  break;
    -
    1482  case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
    -
    1483  useMin = data;
    -
    1484  break;
    -
    1485  case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
    -
    1486  useMax = data;
    -
    1487  break;
    - -
    1489  SetUsagePage(data);
    -
    1490  break;
    -
    1491  case (TYPE_MAIN | TAG_MAIN_OUTPUT):
    -
    1492  case (TYPE_MAIN | TAG_MAIN_FEATURE):
    -
    1493  rptSize = 0;
    -
    1494  rptCount = 0;
    -
    1495  useMin = 0;
    -
    1496  useMax = 0;
    -
    1497  break;
    -
    1498  case (TYPE_MAIN | TAG_MAIN_INPUT):
    -
    1499  OnInputItem(data);
    -
    1500 
    -
    1501  totalSize += (uint16_t)rptSize * (uint16_t)rptCount;
    -
    1502 
    -
    1503  rptSize = 0;
    -
    1504  rptCount = 0;
    -
    1505  useMin = 0;
    -
    1506  useMax = 0;
    -
    1507  break;
    -
    1508  } // switch (**pp & (TYPE_MASK | TAG_MASK))
    -
    1509  }
    -
    1510  } // switch (itemParseState)
    -
    1511  itemParseState = 0;
    -
    1512  return enErrorSuccess;
    -
    1513 }
    -
    1514 
    -
    1515 void ReportDescParser2::OnInputItem(uint8_t itm) {
    -
    1516  uint8_t byte_offset = (totalSize >> 3); // calculate offset to the next unhandled byte i = (int)(totalCount / 8);
    -
    1517  uint32_t tmp = (byte_offset << 3);
    -
    1518  uint8_t bit_offset = totalSize - tmp; // number of bits in the current byte already handled
    -
    1519  uint8_t *p = pBuf + byte_offset; // current byte pointer
    -
    1520 
    -
    1521  if(bit_offset)
    -
    1522  *p >>= bit_offset;
    -
    1523 
    -
    1524  uint8_t usage = useMin;
    -
    1525 
    -
    1526  bool print_usemin_usemax = ((useMin < useMax) && ((itm & 3) == 2) && pfUsage) ? true : false;
    -
    1527 
    -
    1528  uint8_t bits_of_byte = 8;
    -
    1529 
    -
    1530  // for each field in field array defined by rptCount
    -
    1531  for(uint8_t field = 0; field < rptCount; field++, usage++) {
    -
    1532 
    -
    1533  union {
    -
    1534  uint8_t bResult[4];
    -
    1535  uint16_t wResult[2];
    -
    1536  uint32_t dwResult;
    -
    1537  } result;
    -
    1538 
    -
    1539  result.dwResult = 0;
    -
    1540  uint8_t mask = 0;
    -
    1541 
    -
    1542  if(print_usemin_usemax)
    -
    1543  pfUsage(usage);
    -
    1544 
    -
    1545  // bits_left - number of bits in the field(array of fields, depending on Report Count) left to process
    -
    1546  // bits_of_byte - number of bits in current byte left to process
    -
    1547  // bits_to_copy - number of bits to copy to result buffer
    -
    1548 
    -
    1549  // for each bit in a field
    -
    1550  for(uint8_t bits_left = rptSize, bits_to_copy = 0; bits_left;
    -
    1551  bits_left -= bits_to_copy) {
    -
    1552  bits_to_copy = (bits_left > bits_of_byte) ? bits_of_byte : bits_left;
    -
    1553 
    -
    1554  result.dwResult <<= bits_to_copy; // Result buffer is shifted by the number of bits to be copied into it
    -
    1555 
    -
    1556  uint8_t val = *p;
    -
    1557 
    -
    1558  val >>= (8 - bits_of_byte); // Shift by the number of bits already processed
    -
    1559 
    -
    1560  mask = 0;
    -
    1561 
    -
    1562  for(uint8_t j = bits_to_copy; j; j--) {
    -
    1563  mask <<= 1;
    -
    1564  mask |= 1;
    -
    1565  }
    -
    1566 
    -
    1567  result.bResult[0] = (result.bResult[0] | (val & mask));
    -
    1568 
    -
    1569  bits_of_byte -= bits_to_copy;
    -
    1570 
    -
    1571  if(bits_of_byte < 1) {
    -
    1572  bits_of_byte = 8;
    -
    1573  p++;
    -
    1574  }
    -
    1575  }
    -
    1576  PrintByteValue(result.dwResult);
    -
    1577  }
    -
    1578  E_Notify(PSTR("\r\n"), 0x80);
    -
    1579 }
    -
    1580 
    -
    1581 void UniversalReportParser::Parse(USBHID *hid, bool is_rpt_id __attribute__((unused)), uint8_t len, uint8_t *buf) {
    -
    1582  ReportDescParser2 prs(len, buf);
    -
    1583 
    -
    1584  uint8_t ret = hid->GetReportDescr(0, &prs);
    -
    1585 
    -
    1586  if(ret)
    -
    1587  ErrorMessage<uint8_t > (PSTR("GetReportDescr-2"), ret);
    -
    1588 }
    -
    const char pstrUsageYTilt[]
    Definition: hidusagestr.h:814
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 
    18 #include "hidescriptorparser.h"
    19 
    20 const char * const ReportDescParserBase::usagePageTitles0[] PROGMEM = {
    36 };
    37 
    38 const char * const ReportDescParserBase::usagePageTitles1[] PROGMEM = {
    45 };
    46 const char * const ReportDescParserBase::genDesktopTitles0[] PROGMEM = {
    55 
    56 };
    57 const char * const ReportDescParserBase::genDesktopTitles1[] PROGMEM = {
    58  pstrUsageX,
    59  pstrUsageY,
    60  pstrUsageZ,
    83 };
    84 const char * const ReportDescParserBase::genDesktopTitles2[] PROGMEM = {
    105 };
    106 const char * const ReportDescParserBase::genDesktopTitles3[] PROGMEM = {
    116 };
    117 const char * const ReportDescParserBase::genDesktopTitles4[] PROGMEM = {
    126 };
    127 const char * const ReportDescParserBase::simuTitles0[] PROGMEM = {
    140 };
    141 const char * const ReportDescParserBase::simuTitles1[] PROGMEM = {
    148 };
    149 const char * const ReportDescParserBase::simuTitles2[] PROGMEM = {
    183 };
    184 const char * const ReportDescParserBase::vrTitles0[] PROGMEM = {
    195 };
    196 const char * const ReportDescParserBase::vrTitles1[] PROGMEM = {
    199 };
    200 const char * const ReportDescParserBase::sportsCtrlTitles0[] PROGMEM = {
    205 };
    206 const char * const ReportDescParserBase::sportsCtrlTitles1[] PROGMEM = {
    207  pstrUsageOar,
    217 };
    218 const char * const ReportDescParserBase::sportsCtrlTitles2[] PROGMEM = {
    239 };
    240 const char * const ReportDescParserBase::gameTitles0[] PROGMEM = {
    244 };
    245 const char * const ReportDescParserBase::gameTitles1[] PROGMEM = {
    271 };
    272 const char * const ReportDescParserBase::genDevCtrlTitles[] PROGMEM = {
    280 };
    281 const char * const ReportDescParserBase::ledTitles[] PROGMEM = {
    301  pstrUsageCAV,
    302  pstrUsageCLV,
    359 };
    360 const char * const ReportDescParserBase::telTitles0 [] PROGMEM = {
    368 };
    369 const char * const ReportDescParserBase::telTitles1 [] PROGMEM = {
    388 };
    389 const char * const ReportDescParserBase::telTitles2 [] PROGMEM = {
    394 };
    395 const char * const ReportDescParserBase::telTitles3 [] PROGMEM = {
    401 };
    402 const char * const ReportDescParserBase::telTitles4 [] PROGMEM = {
    418 };
    419 const char * const ReportDescParserBase::telTitles5 [] PROGMEM = {
    436 };
    437 const char * const ReportDescParserBase::consTitles0[] PROGMEM = {
    444 };
    445 const char * const ReportDescParserBase::consTitles1[] PROGMEM = {
    449 };
    450 const char * const ReportDescParserBase::consTitles2[] PROGMEM = {
    458 
    459 };
    460 const char * const ReportDescParserBase::consTitles3[] PROGMEM = {
    470 };
    471 const char * const ReportDescParserBase::consTitles4[] PROGMEM = {
    479 };
    480 const char * const ReportDescParserBase::consTitles5[] PROGMEM = {
    518 };
    519 const char * const ReportDescParserBase::consTitles6[] PROGMEM = {
    551 };
    552 const char * const ReportDescParserBase::consTitles7[] PROGMEM = {
    561  pstrUsageMPX,
    564 };
    565 const char * const ReportDescParserBase::consTitles8[] PROGMEM = {
    572 };
    573 const char * const ReportDescParserBase::consTitles9[] PROGMEM = {
    588 };
    589 const char * const ReportDescParserBase::consTitlesA[] PROGMEM = {
    596 };
    597 const char * const ReportDescParserBase::consTitlesB[] PROGMEM = {
    609 };
    610 const char * const ReportDescParserBase::consTitlesC[] PROGMEM = {
    616 };
    617 const char * const ReportDescParserBase::consTitlesD[] PROGMEM = {
    690 };
    691 const char * const ReportDescParserBase::consTitlesE[] PROGMEM = {
    833 };
    834 const char * const ReportDescParserBase::digitTitles0[] PROGMEM = {
    836  pstrUsagePen,
    848 };
    849 const char * const ReportDescParserBase::digitTitles1[] PROGMEM = {
    853 
    854 };
    855 const char * const ReportDescParserBase::digitTitles2[] PROGMEM = {
    861  pstrUsageTap,
    879 };
    880 const char * const ReportDescParserBase::aplphanumTitles0[] PROGMEM = {
    883 };
    884 const char * const ReportDescParserBase::aplphanumTitles1[] PROGMEM = {
    904  pstrUsageRow,
    931 };
    932 const char * const ReportDescParserBase::aplphanumTitles2[] PROGMEM = {
    954 };
    955 const char * const ReportDescParserBase::medInstrTitles0[] PROGMEM = {
    964 };
    965 const char * const ReportDescParserBase::medInstrTitles1[] PROGMEM = {
    971 };
    972 const char * const ReportDescParserBase::medInstrTitles2[] PROGMEM = {
    975 };
    976 const char * const ReportDescParserBase::medInstrTitles3[] PROGMEM = {
    987 };
    988 const char * const ReportDescParserBase::medInstrTitles4[] PROGMEM = {
    991 };
    992 
    993 void ReportDescParserBase::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset __attribute__((unused))) {
    994  uint16_t cntdn = (uint16_t)len;
    995  uint8_t *p = (uint8_t*)pbuf;
    996 
    997 
    998  totalSize = 0;
    999 
    1000  while(cntdn) {
    1001  //USB_HOST_SERIAL.println("");
    1002  //PrintHex<uint16_t>(offset + len - cntdn);
    1003  //USB_HOST_SERIAL.print(":");
    1004 
    1005  ParseItem(&p, &cntdn);
    1006 
    1007  //if (ParseItem(&p, &cntdn))
    1008  // return;
    1009  }
    1010  //USBTRACE2("Total:", totalSize);
    1011 }
    1012 
    1013 void ReportDescParserBase::PrintValue(uint8_t *p, uint8_t len) {
    1014  E_Notify(PSTR("("), 0x80);
    1015  for(; len; p++, len--)
    1016  PrintHex<uint8_t > (*p, 0x80);
    1017  E_Notify(PSTR(")"), 0x80);
    1018 }
    1019 
    1021  E_Notify(PSTR("("), 0x80);
    1022  PrintHex<uint8_t > (data, 0x80);
    1023  E_Notify(PSTR(")"), 0x80);
    1024 }
    1025 
    1027  switch(prefix & (TYPE_MASK | TAG_MASK)) {
    1028  case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
    1029  E_Notify(PSTR("\r\nPush"), 0x80);
    1030  break;
    1031  case (TYPE_GLOBAL | TAG_GLOBAL_POP):
    1032  E_Notify(PSTR("\r\nPop"), 0x80);
    1033  break;
    1035  E_Notify(PSTR("\r\nUsage Page"), 0x80);
    1036  break;
    1038  E_Notify(PSTR("\r\nLogical Min"), 0x80);
    1039  break;
    1041  E_Notify(PSTR("\r\nLogical Max"), 0x80);
    1042  break;
    1044  E_Notify(PSTR("\r\nPhysical Min"), 0x80);
    1045  break;
    1047  E_Notify(PSTR("\r\nPhysical Max"), 0x80);
    1048  break;
    1050  E_Notify(PSTR("\r\nUnit Exp"), 0x80);
    1051  break;
    1052  case (TYPE_GLOBAL | TAG_GLOBAL_UNIT):
    1053  E_Notify(PSTR("\r\nUnit"), 0x80);
    1054  break;
    1056  E_Notify(PSTR("\r\nReport Size"), 0x80);
    1057  break;
    1059  E_Notify(PSTR("\r\nReport Count"), 0x80);
    1060  break;
    1062  E_Notify(PSTR("\r\nReport Id"), 0x80);
    1063  break;
    1064  case (TYPE_LOCAL | TAG_LOCAL_USAGE):
    1065  E_Notify(PSTR("\r\nUsage"), 0x80);
    1066  break;
    1067  case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
    1068  E_Notify(PSTR("\r\nUsage Min"), 0x80);
    1069  break;
    1070  case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
    1071  E_Notify(PSTR("\r\nUsage Max"), 0x80);
    1072  break;
    1073  case (TYPE_MAIN | TAG_MAIN_COLLECTION):
    1074  E_Notify(PSTR("\r\nCollection"), 0x80);
    1075  break;
    1077  E_Notify(PSTR("\r\nEnd Collection"), 0x80);
    1078  break;
    1079  case (TYPE_MAIN | TAG_MAIN_INPUT):
    1080  E_Notify(PSTR("\r\nInput"), 0x80);
    1081  break;
    1082  case (TYPE_MAIN | TAG_MAIN_OUTPUT):
    1083  E_Notify(PSTR("\r\nOutput"), 0x80);
    1084  break;
    1085  case (TYPE_MAIN | TAG_MAIN_FEATURE):
    1086  E_Notify(PSTR("\r\nFeature"), 0x80);
    1087  break;
    1088  } // switch (**pp & (TYPE_MASK | TAG_MASK))
    1089 }
    1090 
    1091 uint8_t ReportDescParserBase::ParseItem(uint8_t **pp, uint16_t *pcntdn) {
    1092  //uint8_t ret = enErrorSuccess;
    1093  //reinterpret_cast<>(varBuffer);
    1094  switch(itemParseState) {
    1095  case 0:
    1096  if(**pp == HID_LONG_ITEM_PREFIX)
    1097  USBTRACE("\r\nLONG\r\n");
    1098  else {
    1099  uint8_t size = ((**pp) & DATA_SIZE_MASK);
    1100 
    1101  itemPrefix = (**pp);
    1102  itemSize = 1 + ((size == DATA_SIZE_4) ? 4 : size);
    1103 
    1105  }
    1106  (*pp)++;
    1107  (*pcntdn)--;
    1108  itemSize--;
    1109  itemParseState = 1;
    1110 
    1111  if(!itemSize)
    1112  break;
    1113 
    1114  if(!pcntdn)
    1115  return enErrorIncomplete;
    1116  case 1:
    1117  //USBTRACE2("\r\niSz:",itemSize);
    1118 
    1121  itemParseState = 2;
    1122  case 2:
    1123  if(!valParser.Parse(pp, pcntdn))
    1124  return enErrorIncomplete;
    1125  itemParseState = 3;
    1126  case 3:
    1127  {
    1128  uint8_t data = *((uint8_t*)varBuffer);
    1129 
    1130  switch(itemPrefix & (TYPE_MASK | TAG_MASK)) {
    1131  case (TYPE_LOCAL | TAG_LOCAL_USAGE):
    1132  if(pfUsage) {
    1133  if(theBuffer.valueSize > 1) {
    1134  uint16_t* ui16 = reinterpret_cast<uint16_t *>(varBuffer);
    1135  pfUsage(*ui16);
    1136  } else
    1137  pfUsage(data);
    1138  }
    1139  break;
    1141  rptSize = data;
    1142  PrintByteValue(data);
    1143  break;
    1145  rptCount = data;
    1146  PrintByteValue(data);
    1147  break;
    1153  case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
    1154  case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
    1156  case (TYPE_GLOBAL | TAG_GLOBAL_UNIT):
    1158  break;
    1159  case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):
    1160  case (TYPE_GLOBAL | TAG_GLOBAL_POP):
    1161  break;
    1163  SetUsagePage(data);
    1164  PrintUsagePage(data);
    1165  PrintByteValue(data);
    1166  break;
    1167  case (TYPE_MAIN | TAG_MAIN_COLLECTION):
    1169  switch(data) {
    1170  case 0x00:
    1171  E_Notify(PSTR(" Physical"), 0x80);
    1172  break;
    1173  case 0x01:
    1174  E_Notify(PSTR(" Application"), 0x80);
    1175  break;
    1176  case 0x02:
    1177  E_Notify(PSTR(" Logical"), 0x80);
    1178  break;
    1179  case 0x03:
    1180  E_Notify(PSTR(" Report"), 0x80);
    1181  break;
    1182  case 0x04:
    1183  E_Notify(PSTR(" Named Array"), 0x80);
    1184  break;
    1185  case 0x05:
    1186  E_Notify(PSTR(" Usage Switch"), 0x80);
    1187  break;
    1188  case 0x06:
    1189  E_Notify(PSTR(" Usage Modifier"), 0x80);
    1190  break;
    1191  default:
    1192  E_Notify(PSTR(" Vendor Defined("), 0x80);
    1193  PrintHex<uint8_t > (data, 0x80);
    1194  E_Notify(PSTR(")"), 0x80);
    1195  }
    1196  break;
    1197  case (TYPE_MAIN | TAG_MAIN_INPUT):
    1198  case (TYPE_MAIN | TAG_MAIN_OUTPUT):
    1199  case (TYPE_MAIN | TAG_MAIN_FEATURE):
    1200  totalSize += (uint16_t)rptSize * (uint16_t)rptCount;
    1201  rptSize = 0;
    1202  rptCount = 0;
    1203  E_Notify(PSTR("("), 0x80);
    1204  PrintBin<uint8_t > (data, 0x80);
    1205  E_Notify(PSTR(")"), 0x80);
    1206  break;
    1207  } // switch (**pp & (TYPE_MASK | TAG_MASK))
    1208  }
    1209  } // switch (itemParseState)
    1210  itemParseState = 0;
    1211  return enErrorSuccess;
    1212 }
    1213 
    1221  NULL, // Keyboard/Keypad
    1228  NULL, // Reserved
    1229  NULL, // PID
    1230  NULL // Unicode
    1231 };
    1232 
    1234  pfUsage = NULL;
    1235 
    1236  if(VALUE_BETWEEN(page, 0x00, 0x11)) {
    1237  pfUsage = (usagePageFunctions[page - 1]);
    1238 
    1239  } else {
    1240  switch(page) {
    1241  case 0x14:
    1243  break;
    1244  case 0x40:
    1246  break;
    1247  }
    1248  }
    1249 }
    1250 
    1252  const char * const * w;
    1253  E_Notify(pstrSpace, 0x80);
    1254 
    1255  output_if_between(page, 0x00, 0x11, w, E_Notify, usagePageTitles0, 0x80)
    1256  else output_if_between(page, 0x8b, 0x92, w, E_Notify, usagePageTitles1, 0x80)
    1257  else if(VALUE_BETWEEN(page, 0x7f, 0x84))
    1259  else if(VALUE_BETWEEN(page, 0x83, 0x8c))
    1261  else if(page > 0xfeff /* && page <= 0xffff */)
    1263  else
    1264  switch(page) {
    1265  case 0x14:
    1267  break;
    1268  case 0x40:
    1270  break;
    1271  default:
    1273  }
    1274 }
    1275 
    1277  E_Notify(pstrSpace, 0x80);
    1278  E_Notify(PSTR("Btn"), 0x80);
    1279  PrintHex<uint16_t > (usage, 0x80);
    1280  E_Notify(PSTR("\r\n"), 0x80);
    1281  //USB_HOST_SERIAL.print(usage, HEX);
    1282 }
    1283 
    1285  E_Notify(pstrSpace, 0x80);
    1286  E_Notify(PSTR("Inst"), 0x80);
    1287  // Sorry, HEX for now...
    1288  PrintHex<uint16_t > (usage, 0x80);
    1289  E_Notify(PSTR("\r\n"), 0x80);
    1290  //USB_HOST_SERIAL.print(usage, DEC);
    1291 }
    1292 
    1294  const char * const * w;
    1295  E_Notify(pstrSpace, 0x80);
    1296 
    1297  output_if_between(usage, 0x00, 0x0a, w, E_Notify, genDesktopTitles0, 0x80)
    1298  else output_if_between(usage, 0x2f, 0x49, w, E_Notify, genDesktopTitles1, 0x80)
    1299  else output_if_between(usage, 0x7f, 0x94, w, E_Notify, genDesktopTitles2, 0x80)
    1300  else output_if_between(usage, 0x9f, 0xa9, w, E_Notify, genDesktopTitles3, 0x80)
    1301  else output_if_between(usage, 0xaf, 0xb8, w, E_Notify, genDesktopTitles4, 0x80)
    1302  else E_Notify(pstrUsagePageUndefined, 0x80);
    1303 }
    1304 
    1306  const char * const * w;
    1307  E_Notify(pstrSpace, 0x80);
    1308 
    1309  output_if_between(usage, 0x00, 0x0d, w, E_Notify, simuTitles0, 0x80)
    1310  else output_if_between(usage, 0x1f, 0x26, w, E_Notify, simuTitles1, 0x80)
    1311  else output_if_between(usage, 0xaf, 0xd1, w, E_Notify, simuTitles2, 0x80)
    1312  else E_Notify(pstrUsagePageUndefined, 0x80);
    1313 }
    1314 
    1316  const char * const * w;
    1317  E_Notify(pstrSpace, 0x80);
    1318 
    1319  output_if_between(usage, 0x00, 0x0b, w, E_Notify, vrTitles0, 0x80)
    1320  else output_if_between(usage, 0x1f, 0x22, w, E_Notify, vrTitles1, 0x80)
    1321  else E_Notify(pstrUsagePageUndefined, 0x80);
    1322 }
    1323 
    1325  const char * const * w;
    1326  E_Notify(pstrSpace, 0x80);
    1327 
    1328  output_if_between(usage, 0x00, 0x05, w, E_Notify, sportsCtrlTitles0, 0x80)
    1329  else output_if_between(usage, 0x2f, 0x3a, w, E_Notify, sportsCtrlTitles1, 0x80)
    1330  else output_if_between(usage, 0x4f, 0x64, w, E_Notify, sportsCtrlTitles2, 0x80)
    1331  else E_Notify(pstrUsagePageUndefined, 0x80);
    1332 }
    1333 
    1335  const char * const * w;
    1336  E_Notify(pstrSpace, 0x80);
    1337 
    1338  output_if_between(usage, 0x00, 0x04, w, E_Notify, gameTitles0, 0x80)
    1339  else output_if_between(usage, 0x1f, 0x3a, w, E_Notify, gameTitles1, 0x80)
    1340  else E_Notify(pstrUsagePageUndefined, 0x80);
    1341 }
    1342 
    1344  const char * const * w;
    1345  E_Notify(pstrSpace, 0x80);
    1346 
    1347  output_if_between(usage, 0x1f, 0x27, w, E_Notify, genDevCtrlTitles, 0x80)
    1348  else E_Notify(pstrUsagePageUndefined, 0x80);
    1349 }
    1350 
    1352  const char * const * w;
    1353  E_Notify(pstrSpace, 0x80);
    1354 
    1355  output_if_between(usage, 0x00, 0x4e, w, E_Notify, ledTitles, 0x80)
    1356  else E_Notify(pstrUsagePageUndefined, 0x80);
    1357 }
    1358 
    1360  const char * const * w;
    1361  E_Notify(pstrSpace, 0x80);
    1362 
    1363  output_if_between(usage, 0x00, 0x08, w, E_Notify, telTitles0, 0x80)
    1364  else output_if_between(usage, 0x1f, 0x32, w, E_Notify, telTitles1, 0x80)
    1365  else output_if_between(usage, 0x4f, 0x54, w, E_Notify, telTitles2, 0x80)
    1366  else output_if_between(usage, 0x6f, 0x75, w, E_Notify, telTitles3, 0x80)
    1367  else output_if_between(usage, 0x8f, 0x9f, w, E_Notify, telTitles4, 0x80)
    1368  else output_if_between(usage, 0xaf, 0xc0, w, E_Notify, telTitles5, 0x80)
    1369  else E_Notify(pstrUsagePageUndefined, 0x80);
    1370 }
    1371 
    1373  const char * const * w;
    1374  E_Notify(pstrSpace, 0x80);
    1375 
    1376  output_if_between(usage, 0x00, 0x07, w, E_Notify, consTitles0, 0x80)
    1377  else output_if_between(usage, 0x1f, 0x23, w, E_Notify, consTitles1, 0x80)
    1378  else output_if_between(usage, 0x2f, 0x37, w, E_Notify, consTitles2, 0x80)
    1379  else output_if_between(usage, 0x3f, 0x49, w, E_Notify, consTitles3, 0x80)
    1380  else output_if_between(usage, 0x5f, 0x67, w, E_Notify, consTitles4, 0x80)
    1381  else output_if_between(usage, 0x7f, 0xa5, w, E_Notify, consTitles5, 0x80)
    1382  else output_if_between(usage, 0xaf, 0xcf, w, E_Notify, consTitles6, 0x80)
    1383  else output_if_between(usage, 0xdf, 0xeb, w, E_Notify, consTitles7, 0x80)
    1384  else output_if_between(usage, 0xef, 0xf6, w, E_Notify, consTitles8, 0x80)
    1385  else output_if_between(usage, 0xff, 0x10e, w, E_Notify, consTitles9, 0x80)
    1386  else output_if_between(usage, 0x14f, 0x156, w, E_Notify, consTitlesA, 0x80)
    1387  else output_if_between(usage, 0x15f, 0x16b, w, E_Notify, consTitlesB, 0x80)
    1388  else output_if_between(usage, 0x16f, 0x175, w, E_Notify, consTitlesC, 0x80)
    1389  else output_if_between(usage, 0x17f, 0x1c8, w, E_Notify, consTitlesD, 0x80)
    1390  else output_if_between(usage, 0x1ff, 0x29d, w, E_Notify, consTitlesE, 0x80)
    1391  else E_Notify(pstrUsagePageUndefined, 0x80);
    1392 }
    1393 
    1395  const char * const * w;
    1396  E_Notify(pstrSpace, 0x80);
    1397 
    1398  output_if_between(usage, 0x00, 0x0e, w, E_Notify, digitTitles0, 0x80)
    1399  else output_if_between(usage, 0x1f, 0x23, w, E_Notify, digitTitles1, 0x80)
    1400  else output_if_between(usage, 0x2f, 0x47, w, E_Notify, digitTitles2, 0x80)
    1401  else E_Notify(pstrUsagePageUndefined, 0x80);
    1402 }
    1403 
    1405  const char * const * w;
    1406  E_Notify(pstrSpace, 0x80);
    1407 
    1408  output_if_between(usage, 0x00, 0x03, w, E_Notify, aplphanumTitles0, 0x80)
    1409  else output_if_between(usage, 0x1f, 0x4e, w, E_Notify, aplphanumTitles1, 0x80)
    1410  else output_if_between(usage, 0x7f, 0x96, w, E_Notify, digitTitles2, 0x80)
    1411  else E_Notify(pstrUsagePageUndefined, 0x80);
    1412 }
    1413 
    1415  const char * const * w;
    1416  E_Notify(pstrSpace, 0x80);
    1417 
    1418  if(usage == 1) E_Notify(pstrUsageMedicalUltrasound, 0x80);
    1419  else if(usage == 0x70)
    1421  else output_if_between(usage, 0x1f, 0x28, w, E_Notify, medInstrTitles0, 0x80)
    1422  else output_if_between(usage, 0x3f, 0x45, w, E_Notify, medInstrTitles1, 0x80)
    1423  else output_if_between(usage, 0x5f, 0x62, w, E_Notify, medInstrTitles2, 0x80)
    1424  else output_if_between(usage, 0x7f, 0x8a, w, E_Notify, medInstrTitles3, 0x80)
    1425  else output_if_between(usage, 0x9f, 0xa2, w, E_Notify, medInstrTitles4, 0x80)
    1426  else E_Notify(pstrUsagePageUndefined, 0x80);
    1427 }
    1428 
    1429 uint8_t ReportDescParser2::ParseItem(uint8_t **pp, uint16_t *pcntdn) {
    1430  //uint8_t ret = enErrorSuccess;
    1431 
    1432  switch(itemParseState) {
    1433  case 0:
    1434  if(**pp == HID_LONG_ITEM_PREFIX)
    1435  USBTRACE("\r\nLONG\r\n");
    1436  else {
    1437  uint8_t size = ((**pp) & DATA_SIZE_MASK);
    1438  itemPrefix = (**pp);
    1439  itemSize = 1 + ((size == DATA_SIZE_4) ? 4 : size);
    1440  }
    1441  (*pp)++;
    1442  (*pcntdn)--;
    1443  itemSize--;
    1444  itemParseState = 1;
    1445 
    1446  if(!itemSize)
    1447  break;
    1448 
    1449  if(!pcntdn)
    1450  return enErrorIncomplete;
    1451  case 1:
    1454  itemParseState = 2;
    1455  case 2:
    1456  if(!valParser.Parse(pp, pcntdn))
    1457  return enErrorIncomplete;
    1458  itemParseState = 3;
    1459  case 3:
    1460  {
    1461  uint8_t data = *((uint8_t*)varBuffer);
    1462 
    1463  switch(itemPrefix & (TYPE_MASK | TAG_MASK)) {
    1464  case (TYPE_LOCAL | TAG_LOCAL_USAGE):
    1465  if(pfUsage) {
    1466  if(theBuffer.valueSize > 1) {
    1467  uint16_t* ui16 = reinterpret_cast<uint16_t *>(varBuffer);
    1468  pfUsage(*ui16);
    1469  } else
    1470  pfUsage(data);
    1471  }
    1472  break;
    1474  rptSize = data;
    1475  break;
    1477  rptCount = data;
    1478  break;
    1480  rptId = data;
    1481  break;
    1482  case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
    1483  useMin = data;
    1484  break;
    1485  case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
    1486  useMax = data;
    1487  break;
    1489  SetUsagePage(data);
    1490  break;
    1491  case (TYPE_MAIN | TAG_MAIN_OUTPUT):
    1492  case (TYPE_MAIN | TAG_MAIN_FEATURE):
    1493  rptSize = 0;
    1494  rptCount = 0;
    1495  useMin = 0;
    1496  useMax = 0;
    1497  break;
    1498  case (TYPE_MAIN | TAG_MAIN_INPUT):
    1499  OnInputItem(data);
    1500 
    1501  totalSize += (uint16_t)rptSize * (uint16_t)rptCount;
    1502 
    1503  rptSize = 0;
    1504  rptCount = 0;
    1505  useMin = 0;
    1506  useMax = 0;
    1507  break;
    1508  } // switch (**pp & (TYPE_MASK | TAG_MASK))
    1509  }
    1510  } // switch (itemParseState)
    1511  itemParseState = 0;
    1512  return enErrorSuccess;
    1513 }
    1514 
    1515 void ReportDescParser2::OnInputItem(uint8_t itm) {
    1516  uint8_t byte_offset = (totalSize >> 3); // calculate offset to the next unhandled byte i = (int)(totalCount / 8);
    1517  uint32_t tmp = (byte_offset << 3);
    1518  uint8_t bit_offset = totalSize - tmp; // number of bits in the current byte already handled
    1519  uint8_t *p = pBuf + byte_offset; // current byte pointer
    1520 
    1521  if(bit_offset)
    1522  *p >>= bit_offset;
    1523 
    1524  uint8_t usage = useMin;
    1525 
    1526  bool print_usemin_usemax = ((useMin < useMax) && ((itm & 3) == 2) && pfUsage) ? true : false;
    1527 
    1528  uint8_t bits_of_byte = 8;
    1529 
    1530  // for each field in field array defined by rptCount
    1531  for(uint8_t field = 0; field < rptCount; field++, usage++) {
    1532 
    1533  union {
    1534  uint8_t bResult[4];
    1535  uint16_t wResult[2];
    1536  uint32_t dwResult;
    1537  } result;
    1538 
    1539  result.dwResult = 0;
    1540  uint8_t mask = 0;
    1541 
    1542  if(print_usemin_usemax)
    1543  pfUsage(usage);
    1544 
    1545  // bits_left - number of bits in the field(array of fields, depending on Report Count) left to process
    1546  // bits_of_byte - number of bits in current byte left to process
    1547  // bits_to_copy - number of bits to copy to result buffer
    1548 
    1549  // for each bit in a field
    1550  for(uint8_t bits_left = rptSize, bits_to_copy = 0; bits_left;
    1551  bits_left -= bits_to_copy) {
    1552  bits_to_copy = (bits_left > bits_of_byte) ? bits_of_byte : bits_left;
    1553 
    1554  result.dwResult <<= bits_to_copy; // Result buffer is shifted by the number of bits to be copied into it
    1555 
    1556  uint8_t val = *p;
    1557 
    1558  val >>= (8 - bits_of_byte); // Shift by the number of bits already processed
    1559 
    1560  mask = 0;
    1561 
    1562  for(uint8_t j = bits_to_copy; j; j--) {
    1563  mask <<= 1;
    1564  mask |= 1;
    1565  }
    1566 
    1567  result.bResult[0] = (result.bResult[0] | (val & mask));
    1568 
    1569  bits_of_byte -= bits_to_copy;
    1570 
    1571  if(bits_of_byte < 1) {
    1572  bits_of_byte = 8;
    1573  p++;
    1574  }
    1575  }
    1576  PrintByteValue(result.dwResult);
    1577  }
    1578  E_Notify(PSTR("\r\n"), 0x80);
    1579 }
    1580 
    1581 void UniversalReportParser::Parse(USBHID *hid, bool is_rpt_id __attribute__((unused)), uint8_t len, uint8_t *buf) {
    1582  ReportDescParser2 prs(len, buf);
    1583 
    1584  uint8_t ret = hid->GetReportDescr(0, &prs);
    1585 
    1586  if(ret)
    1587  ErrorMessage<uint8_t > (PSTR("GetReportDescr-2"), ret);
    1588 }
    const char pstrUsageYTilt[]
    Definition: hidusagestr.h:814
    const char pstrUsageRewind[]
    Definition: hidusagestr.h:323
    static const char *const medInstrTitles0[]
    static const char *const usagePageTitles0[]
    @@ -1690,7 +103,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageSystemColdRestart[]
    Definition: hidusagestr.h:105
    const char pstrUsageSecurityCodeCharEntered[]
    Definition: hidusagestr.h:267
    Definition: usbhid.h:143
    -
    void(* UsagePageFunc)(uint16_t usage)
    const char pstrUsageRearBrake[]
    Definition: hidusagestr.h:180
    const char pstrUsageACSort[]
    Definition: hidusagestr.h:747
    const char pstrUsageSelectedIndicator[]
    Definition: hidusagestr.h:329
    @@ -1974,6 +386,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static void PrintItemTitle(uint8_t prefix)
    const char pstrUsageACDistributeVerticaly[]
    Definition: hidusagestr.h:781
    const char pstrUsageVolumeDecrement[]
    Definition: hidusagestr.h:527
    +
    void(* UsagePageFunc)(uint16_t usage)
    const char pstrUsageTabletPick[]
    Definition: hidusagestr.h:822
    @@ -2429,7 +842,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageCharacterSpacingHorizontal[]
    Definition: hidusagestr.h:858
    static const char *const ledTitles[]
    const char pstrUsageChannelDecrement[]
    Definition: hidusagestr.h:479
    -
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:49
    +
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:54
    const char pstrUsageStickFaceAngle[]
    Definition: hidusagestr.h:205
    const char pstrUsageBarrelPressure[]
    Definition: hidusagestr.h:801
    const char pstrUsageACReply[]
    Definition: hidusagestr.h:762
    @@ -2661,7 +1074,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidescriptorparser_8h.html b/hidescriptorparser_8h.html index 5f11a2bc..83773e59 100644 --- a/hidescriptorparser_8h.html +++ b/hidescriptorparser_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidescriptorparser.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,20 +88,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidescriptorparser.h File Reference
    -
    #include "usbhid.h"
    +
    #include "usbhid.h"
    Include dependency graph for hidescriptorparser.h:
    - + + + +
    This graph shows which files directly or indirectly include this file:
    - + +

    Go to the source code of this file.

    @@ -121,7 +126,7 @@ Classes diff --git a/hidescriptorparser_8h__dep__incl.map b/hidescriptorparser_8h__dep__incl.map index d00ba5c1..5e966f16 100644 --- a/hidescriptorparser_8h__dep__incl.map +++ b/hidescriptorparser_8h__dep__incl.map @@ -1,3 +1,3 @@ - + diff --git a/hidescriptorparser_8h__dep__incl.md5 b/hidescriptorparser_8h__dep__incl.md5 index 991feb0f..e086c781 100644 --- a/hidescriptorparser_8h__dep__incl.md5 +++ b/hidescriptorparser_8h__dep__incl.md5 @@ -1 +1 @@ -6d9c0da3c50e6ec2d2e9f7e12ac51f93 \ No newline at end of file +f9ba94ed99ad5905f056e92fce988411 \ No newline at end of file diff --git a/hidescriptorparser_8h__dep__incl.png b/hidescriptorparser_8h__dep__incl.png index cc56844dbbef4d7cd0241128e04583228c4e2363..475e2acef8b8f57c047271518ba86b60fe29f319 100644 GIT binary patch literal 3537 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 literal 3612 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 diff --git a/hidescriptorparser_8h__incl.map b/hidescriptorparser_8h__incl.map index 4c7957ae..7559fe1b 100644 --- a/hidescriptorparser_8h__incl.map +++ b/hidescriptorparser_8h__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/hidescriptorparser_8h__incl.md5 b/hidescriptorparser_8h__incl.md5 index 02cbee93..bfc34772 100644 --- a/hidescriptorparser_8h__incl.md5 +++ b/hidescriptorparser_8h__incl.md5 @@ -1 +1 @@ -2382220084014d620cb10cb5c8677e7e \ No newline at end of file +fe5843698cf13b222c52c15fd3ff6cda \ No newline at end of file diff --git a/hidescriptorparser_8h__incl.png b/hidescriptorparser_8h__incl.png index b54bb55337113372d7d65c71b6468fe65adf6855..8836b9d12137a613aaabfa5ba6120ed59043d86b 100644 GIT binary patch literal 7951 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 - + USB Host Shield 2.0: hidescriptorparser.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,191 +86,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidescriptorparser.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #if !defined(__HIDDESCRIPTORPARSER_H__)
    -
    18 #define __HIDDESCRIPTORPARSER_H__
    -
    19 
    -
    20 #include "usbhid.h"
    -
    21 
    - -
    23 public:
    -
    24  typedef void (*UsagePageFunc)(uint16_t usage);
    -
    25 
    -
    26  static void PrintGenericDesktopPageUsage(uint16_t usage);
    -
    27  static void PrintSimulationControlsPageUsage(uint16_t usage);
    -
    28  static void PrintVRControlsPageUsage(uint16_t usage);
    -
    29  static void PrintSportsControlsPageUsage(uint16_t usage);
    -
    30  static void PrintGameControlsPageUsage(uint16_t usage);
    -
    31  static void PrintGenericDeviceControlsPageUsage(uint16_t usage);
    -
    32  static void PrintLEDPageUsage(uint16_t usage);
    -
    33  static void PrintButtonPageUsage(uint16_t usage);
    -
    34  static void PrintOrdinalPageUsage(uint16_t usage);
    -
    35  static void PrintTelephonyPageUsage(uint16_t usage);
    -
    36  static void PrintConsumerPageUsage(uint16_t usage);
    -
    37  static void PrintDigitizerPageUsage(uint16_t usage);
    -
    38  static void PrintAlphanumDisplayPageUsage(uint16_t usage);
    -
    39  static void PrintMedicalInstrumentPageUsage(uint16_t usage);
    -
    40 
    -
    41  static void PrintValue(uint8_t *p, uint8_t len);
    -
    42  static void PrintByteValue(uint8_t data);
    -
    43 
    -
    44  static void PrintItemTitle(uint8_t prefix);
    -
    45 
    -
    46  static const char * const usagePageTitles0[];
    -
    47  static const char * const usagePageTitles1[];
    -
    48  static const char * const genDesktopTitles0[];
    -
    49  static const char * const genDesktopTitles1[];
    -
    50  static const char * const genDesktopTitles2[];
    -
    51  static const char * const genDesktopTitles3[];
    -
    52  static const char * const genDesktopTitles4[];
    -
    53  static const char * const simuTitles0[];
    -
    54  static const char * const simuTitles1[];
    -
    55  static const char * const simuTitles2[];
    -
    56  static const char * const vrTitles0[];
    -
    57  static const char * const vrTitles1[];
    -
    58  static const char * const sportsCtrlTitles0[];
    -
    59  static const char * const sportsCtrlTitles1[];
    -
    60  static const char * const sportsCtrlTitles2[];
    -
    61  static const char * const gameTitles0[];
    -
    62  static const char * const gameTitles1[];
    -
    63  static const char * const genDevCtrlTitles[];
    -
    64  static const char * const ledTitles[];
    -
    65  static const char * const telTitles0[];
    -
    66  static const char * const telTitles1[];
    -
    67  static const char * const telTitles2[];
    -
    68  static const char * const telTitles3[];
    -
    69  static const char * const telTitles4[];
    -
    70  static const char * const telTitles5[];
    -
    71  static const char * const consTitles0[];
    -
    72  static const char * const consTitles1[];
    -
    73  static const char * const consTitles2[];
    -
    74  static const char * const consTitles3[];
    -
    75  static const char * const consTitles4[];
    -
    76  static const char * const consTitles5[];
    -
    77  static const char * const consTitles6[];
    -
    78  static const char * const consTitles7[];
    -
    79  static const char * const consTitles8[];
    -
    80  static const char * const consTitles9[];
    -
    81  static const char * const consTitlesA[];
    -
    82  static const char * const consTitlesB[];
    -
    83  static const char * const consTitlesC[];
    -
    84  static const char * const consTitlesD[];
    -
    85  static const char * const consTitlesE[];
    -
    86  static const char * const digitTitles0[];
    -
    87  static const char * const digitTitles1[];
    -
    88  static const char * const digitTitles2[];
    -
    89  static const char * const aplphanumTitles0[];
    -
    90  static const char * const aplphanumTitles1[];
    -
    91  static const char * const aplphanumTitles2[];
    -
    92  static const char * const medInstrTitles0[];
    -
    93  static const char * const medInstrTitles1[];
    -
    94  static const char * const medInstrTitles2[];
    -
    95  static const char * const medInstrTitles3[];
    -
    96  static const char * const medInstrTitles4[];
    -
    97 
    -
    98 protected:
    - -
    100 
    - - - - -
    105 
    -
    106  uint8_t itemParseState; // Item parser state variable
    -
    107  uint8_t itemSize; // Item size
    -
    108  uint8_t itemPrefix; // Item prefix (first byte)
    -
    109  uint8_t rptSize; // Report Size
    -
    110  uint8_t rptCount; // Report Count
    -
    111 
    -
    112  uint16_t totalSize; // Report size in bits
    -
    113 
    -
    114  // Method should be defined here if virtual.
    -
    115  virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn);
    -
    116 
    - -
    118 
    -
    119  static void PrintUsagePage(uint16_t page);
    -
    120  void SetUsagePage(uint16_t page);
    -
    121 
    -
    122 public:
    -
    123 
    - -
    125  itemParseState(0),
    -
    126  itemSize(0),
    -
    127  itemPrefix(0),
    -
    128  rptSize(0),
    -
    129  rptCount(0),
    -
    130  pfUsage(NULL) {
    - - - -
    134  };
    -
    135 
    -
    136  void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset);
    -
    137 
    -
    138  enum {
    - -
    140  , enErrorIncomplete // value or record is partialy read in buffer
    - -
    142  };
    -
    143 };
    -
    144 
    - -
    146 };
    -
    147 
    - -
    149  uint8_t rptId; // Report ID
    -
    150  uint8_t useMin; // Usage Minimum
    -
    151  uint8_t useMax; // Usage Maximum
    -
    152  uint8_t fieldCount; // Number of field being currently processed
    -
    153 
    -
    154  void OnInputItem(uint8_t itm); // Method which is called every time Input item is found
    -
    155 
    -
    156  uint8_t *pBuf; // Report buffer pointer
    -
    157  uint8_t bLen; // Report length
    -
    158 
    -
    159 protected:
    -
    160  // Method should be defined here if virtual.
    -
    161  virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn);
    -
    162 
    -
    163 public:
    -
    164 
    -
    165  ReportDescParser2(uint16_t len, uint8_t *pbuf) :
    -
    166  ReportDescParserBase(), rptId(0), useMin(0), useMax(0), fieldCount(0), pBuf(pbuf), bLen(len) {
    -
    167  };
    -
    168 };
    -
    169 
    - -
    171 public:
    -
    172  // Method should be defined here if virtual.
    -
    173  virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    -
    174 };
    -
    175 
    -
    176 #endif // __HIDDESCRIPTORPARSER_H__
    -
    static const char *const medInstrTitles0[]
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #if !defined(__HIDDESCRIPTORPARSER_H__)
    18 #define __HIDDESCRIPTORPARSER_H__
    19 
    20 #include "usbhid.h"
    21 
    23 public:
    24  typedef void (*UsagePageFunc)(uint16_t usage);
    25 
    26  static void PrintGenericDesktopPageUsage(uint16_t usage);
    27  static void PrintSimulationControlsPageUsage(uint16_t usage);
    28  static void PrintVRControlsPageUsage(uint16_t usage);
    29  static void PrintSportsControlsPageUsage(uint16_t usage);
    30  static void PrintGameControlsPageUsage(uint16_t usage);
    31  static void PrintGenericDeviceControlsPageUsage(uint16_t usage);
    32  static void PrintLEDPageUsage(uint16_t usage);
    33  static void PrintButtonPageUsage(uint16_t usage);
    34  static void PrintOrdinalPageUsage(uint16_t usage);
    35  static void PrintTelephonyPageUsage(uint16_t usage);
    36  static void PrintConsumerPageUsage(uint16_t usage);
    37  static void PrintDigitizerPageUsage(uint16_t usage);
    38  static void PrintAlphanumDisplayPageUsage(uint16_t usage);
    39  static void PrintMedicalInstrumentPageUsage(uint16_t usage);
    40 
    41  static void PrintValue(uint8_t *p, uint8_t len);
    42  static void PrintByteValue(uint8_t data);
    43 
    44  static void PrintItemTitle(uint8_t prefix);
    45 
    46  static const char * const usagePageTitles0[];
    47  static const char * const usagePageTitles1[];
    48  static const char * const genDesktopTitles0[];
    49  static const char * const genDesktopTitles1[];
    50  static const char * const genDesktopTitles2[];
    51  static const char * const genDesktopTitles3[];
    52  static const char * const genDesktopTitles4[];
    53  static const char * const simuTitles0[];
    54  static const char * const simuTitles1[];
    55  static const char * const simuTitles2[];
    56  static const char * const vrTitles0[];
    57  static const char * const vrTitles1[];
    58  static const char * const sportsCtrlTitles0[];
    59  static const char * const sportsCtrlTitles1[];
    60  static const char * const sportsCtrlTitles2[];
    61  static const char * const gameTitles0[];
    62  static const char * const gameTitles1[];
    63  static const char * const genDevCtrlTitles[];
    64  static const char * const ledTitles[];
    65  static const char * const telTitles0[];
    66  static const char * const telTitles1[];
    67  static const char * const telTitles2[];
    68  static const char * const telTitles3[];
    69  static const char * const telTitles4[];
    70  static const char * const telTitles5[];
    71  static const char * const consTitles0[];
    72  static const char * const consTitles1[];
    73  static const char * const consTitles2[];
    74  static const char * const consTitles3[];
    75  static const char * const consTitles4[];
    76  static const char * const consTitles5[];
    77  static const char * const consTitles6[];
    78  static const char * const consTitles7[];
    79  static const char * const consTitles8[];
    80  static const char * const consTitles9[];
    81  static const char * const consTitlesA[];
    82  static const char * const consTitlesB[];
    83  static const char * const consTitlesC[];
    84  static const char * const consTitlesD[];
    85  static const char * const consTitlesE[];
    86  static const char * const digitTitles0[];
    87  static const char * const digitTitles1[];
    88  static const char * const digitTitles2[];
    89  static const char * const aplphanumTitles0[];
    90  static const char * const aplphanumTitles1[];
    91  static const char * const aplphanumTitles2[];
    92  static const char * const medInstrTitles0[];
    93  static const char * const medInstrTitles1[];
    94  static const char * const medInstrTitles2[];
    95  static const char * const medInstrTitles3[];
    96  static const char * const medInstrTitles4[];
    97 
    98 protected:
    100 
    105 
    106  uint8_t itemParseState; // Item parser state variable
    107  uint8_t itemSize; // Item size
    108  uint8_t itemPrefix; // Item prefix (first byte)
    109  uint8_t rptSize; // Report Size
    110  uint8_t rptCount; // Report Count
    111 
    112  uint16_t totalSize; // Report size in bits
    113 
    114  // Method should be defined here if virtual.
    115  virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn);
    116 
    118 
    119  static void PrintUsagePage(uint16_t page);
    120  void SetUsagePage(uint16_t page);
    121 
    122 public:
    123 
    125  itemParseState(0),
    126  itemSize(0),
    127  itemPrefix(0),
    128  rptSize(0),
    129  rptCount(0),
    130  pfUsage(NULL) {
    131  theBuffer.pValue = varBuffer;
    132  valParser.Initialize(&theBuffer);
    133  theSkipper.Initialize(&theBuffer);
    134  };
    135 
    136  void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset);
    137 
    138  enum {
    140  , enErrorIncomplete // value or record is partialy read in buffer
    142  };
    143 };
    144 
    146 };
    147 
    149  uint8_t rptId; // Report ID
    150  uint8_t useMin; // Usage Minimum
    151  uint8_t useMax; // Usage Maximum
    152  uint8_t fieldCount; // Number of field being currently processed
    153 
    154  void OnInputItem(uint8_t itm); // Method which is called every time Input item is found
    155 
    156  uint8_t *pBuf; // Report buffer pointer
    157  uint8_t bLen; // Report length
    158 
    159 protected:
    160  // Method should be defined here if virtual.
    161  virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn);
    162 
    163 public:
    164 
    165  ReportDescParser2(uint16_t len, uint8_t *pbuf) :
    166  ReportDescParserBase(), rptId(0), useMin(0), useMax(0), fieldCount(0), pBuf(pbuf), bLen(len) {
    167  };
    168 };
    169 
    171 public:
    172  // Method should be defined here if virtual.
    173  virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    174 };
    175 
    176 #endif // __HIDDESCRIPTORPARSER_H__
    static const char *const medInstrTitles0[]
    static const char *const usagePageTitles0[]
    static const char *const telTitles1[]
    Definition: usbhid.h:143
    -
    void(* UsagePageFunc)(uint16_t usage)
    static const char *const consTitles1[]
    static const char *const consTitles5[]
    static const char *const consTitlesD[]
    -
    virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    static void PrintValue(uint8_t *p, uint8_t len)
    static const char *const genDesktopTitles1[]
    @@ -280,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const genDesktopTitles0[]
    static const char *const genDevCtrlTitles[]
    - +
    static void PrintTelephonyPageUsage(uint16_t usage)
    static void PrintByteValue(uint8_t data)
    static void PrintMedicalInstrumentPageUsage(uint16_t usage)
    @@ -291,6 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static void PrintButtonPageUsage(uint16_t usage)
    static void PrintConsumerPageUsage(uint16_t usage)
    static void PrintItemTitle(uint8_t prefix)
    +
    void(* UsagePageFunc)(uint16_t usage)
    static const char *const medInstrTitles1[]
    @@ -315,9 +139,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static void PrintGenericDeviceControlsPageUsage(uint16_t usage)
    static void PrintSportsControlsPageUsage(uint16_t usage)
    static const char *const consTitlesB[]
    -
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:67
    +
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:72
    static void PrintVRControlsPageUsage(uint16_t usage)
    - +
    static const char *const medInstrTitles4[]
    ReportDescParser2(uint16_t len, uint8_t *pbuf)
    static const char *const telTitles3[]
    @@ -346,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const vrTitles1[]
    static const char *const ledTitles[]
    -
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:49
    +
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:54
    static const char *const gameTitles0[]
    void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
    static const char *const consTitlesA[]
    @@ -354,7 +178,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const consTitlesE[]
    static const char *const digitTitles0[]
    -
    virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn)
    static const char *const simuTitles0[]
    static const char *const simuTitles2[]
    static const char *const sportsCtrlTitles1[]
    @@ -373,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hiduniversal_8cpp.html b/hiduniversal_8cpp.html index c432ef31..5e4751e0 100644 --- a/hiduniversal_8cpp.html +++ b/hiduniversal_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hiduniversal.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,13 +86,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hiduniversal.cpp File Reference
    -
    #include "hiduniversal.h"
    +
    #include "hiduniversal.h"
    Include dependency graph for hiduniversal.cpp:
    - + + + + +

    Go to the source code of this file.

    @@ -100,7 +105,7 @@ Include dependency graph for hiduniversal.cpp:
    diff --git a/hiduniversal_8cpp__incl.map b/hiduniversal_8cpp__incl.map index 82a77cd7..1478dbe7 100644 --- a/hiduniversal_8cpp__incl.map +++ b/hiduniversal_8cpp__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/hiduniversal_8cpp__incl.md5 b/hiduniversal_8cpp__incl.md5 index 8e45e3e1..c3ad3b07 100644 --- a/hiduniversal_8cpp__incl.md5 +++ b/hiduniversal_8cpp__incl.md5 @@ -1 +1 @@ -5e19e49afecd77985a9ff2fa2deea298 \ No newline at end of file +1e66e5231753075199ca54c70eb24f20 \ No newline at end of file diff --git a/hiduniversal_8cpp__incl.png b/hiduniversal_8cpp__incl.png index aa7fcfc5af6a145b58ff0837c88bad98b7b0e571..0cdf0ede9f635a3787713f8cc587c71d63301ec6 100644 GIT binary patch literal 9343 zcmc(FbyQVf+wB1M>~msSU#BLcYpt~nhW9}5L$?Wv;+*1wwwN5oKUXC*ZS!v6qI^3Qc`gge4HRm zQ{GVi=k&A;a;6J%{%@YKNqzo)FkW!vEJN7IEt@m)nh|v?6oZL9hW7bG0vyL8R{l;p zgdf8_r)IH+T9S9ZDCYT%L6^71MMdS8F2`yHV+IDwF}UIiXjqyP;ph+&;ChCNiX|Xu|g!_LVY_#@!pik zBO2KoR*e87pBs2cbrQkG&G(Fl^F( z^=f~mJB*2mDF~lNMMZ@;tQ(y0y>GtJZ9mn%rMI^i1+p_&Yri{NO-4o*5)zV-kRb2( z_dYK#4eK1}I5>WEb*-)S#(n5=y}iB|9UcAn@gt4Tb!BriRX-;bD)jznZF8)Ef`TG0 zE-q+*MSub3hg{Xs)_#^e(AL%_7e#$~#V0I$1@4CT`Sa(zyf-IfujF)=wQfV z86JhK6=Zs^IMzda!^6W13k&Z*X8ygoX**x{oRbrOZtd@he0;K_Jmh6LIja}P8|LQb zdNno@T&-7o!dhBdwzjqg1`APQw+II#pWBO#*1Mbi$1EyfCc?tQcjiLDkU~Ow^OaL? zPb++IlV3Tk=_54J7#J8Bv&+gBz&-5GMMg$~PH8O_75mjREx-k>ty7bdHrCf&j(`2I z9LrBmPDX*u&d%OmPPM-2W+lWpFVx6s;Zivo`yhDQd28EIXKEP zGN?h%khX7chX^a4(b6tm?YEvC9W^*_s>5J}v6klM#3Uqdjg1doFIse!GDP0*FE(=} zmu6+rK7G13nx_cy74`U2s#iNWHl_ilg_ZzBGR|m2axz)wP;GVfZc@~)iK1c{n2YEO zG&!bLT4GK^&y(LHVDO;j$VI)mz{A5UDk_r9{*srsKAbHTswLp`OUX~%;o``QIE?rG zktw6oL^1sE@bL8X^i5@5e!lrohNxrhLZh3#mzSuccRS%j>;NGlAtmN-Wn~;MUKs8L zP8Ygf9Ib;Vz`?;`U|;~2BClrF{)?xEO^6;(|D0GuV-R>CNN^uK$QiNl^YiQO?w0p< zc6Rpk^mKImnw@Rz;BWxKEgO-Jf`Sr+M->_t*6DbCbMu6-Z!le0Pgi%^##LMU(>(6o zQBv#9bY)Ii*^lqvnVFd}dgmKlwx^7Inmx|!7#MOuFt)6Q*WSm$+1cA$Yb(5?a-DCo zWZ4k}h>-jKsQgk`IYVM{9A-PZasX-K`CD)efmsU4Qni4=gq2Iuz$23Is}p=946}_ zg-#xUJ%q>LdjdVbY4-4#>~K z9;{8!JsR4HD3$8sHI^Eova0cVpWBxyq&n-;&Dq-}3VekTG$I@v=S7bpKiQm73y^ry zaBy7?BZK2D{IMavzP`y^$x6)kO0*hRsUGOi9f}6GurH%`9_hwzDnmyE zB2hylu2_nU2?HYx0%>TNMPPEFX=-XlL_{Fu=r9B9)HPTMsiQVFH;V#&c~SxDvM@3d zIKA=x%z}lFkN-5OWK{J#YF9i&LMkvKdgR_e>GGw<@~&`qA4e2}qZE_cHTLHtLy65G zrQ=%+G>LU6tJi?inuI`+p9wlvC>LD7`&uBV)3{PQBO_ydef@7{JNxrTR#ujrfJ)U@B2>>WE{4+5wgD&u3+(65)|?y@v@1o!_##O# za63CYIk}+PS~qEF=~nx*-8n5d9ImUY3xmZcCkv)vM}&u?qN29k{Ly3In6q!iy?_5X z508lBnmjlW&oI!k|*oYiWNlM%4#dx4D=XXB~JUgQd|2)?3dcwio!ziQ8P0$ zZSPjn%U}5F%Yb>5m6gfR$0#vB4w0tBD`;skWR4RQ6cj}qK%UIZ&RUt6e6WRUX$4hx zn16fx_%Q`JImT>y5~q=_j!tic!@&Ut3okFc-K5+*zQ}(*O54BJ)YZ+6VRLWKP6kFQ z@^fxZn2AY-IWAqy=LI7pTCZuPwwFwSdeO8d7*a`DUETE5)YSAe;%KdRs=`Q)Yk$7} zo5QlCl$4aI9(e>ae{6dv1!bYX(jW5*-!z>Vp158@EHwFsygZqAL|?yt6%iFR<4O(+ zLINm`QIeBGf@DS4DHZ)P59D-WVq)!&3JMBnga1^l|GFG~Nmh#y0UaHk2zAuZ z#_`2i7DF2KrgP-y6@Njd70W3f2@9Ps05&5K)9})4R(geA<=#YhN#x>I$$5I5d($pkQWQdV} z^!RalT3S_gb$WU_$k^+XfQr1AlaphP+uYhpiHrMSYS`%dV`LI!i|U`lE(Y5#wK>%T-AqzTCtxK?PW zm6ul(y}j3a3TQ$~MvLVyB|Tm_8AJJbHf_CB$g^N1m$midQyD35`BMMn=GjghBP1XQ?U>Jr6eF+Fwn{!}2Eh zgSy|a>+%r&d*|?Ee(T*W4#vHOhZrAf-gM(I$NAaAOh2ALA&~3qc^Uc>O1ei1H`hxu z#*6@lkADe<(^P!O#l`vLv?25lX#aLD&dj9vAYt;%;`Vm$##>dKP+BT7rJ^ELp7CJ_ zqqnym0x79U=uXpxRajEe=(G_T3iY8#Rx*E`g$^k!s@Krd%dK&J`y-`$*GX^cE0LN1$!$Fvke zCiM{lh(UhT7Q5dlDW2!^6XXQ<88Rt^v^B*f6=6nVE6hUj(en>-=E(_U5Ycy0o+u zAa`UWp1u8kaB#49H4tAF#l^*dh=P^R&Fz#Wi&-IktTqBydYaU~?ij>A$qCtENd2Lr zq-0}Z@%zkHMg~3hDJN%bZ7uQ$Ft2|w^~UNO*ulrn#unE&bq~&kg}uk1Lu*kH4Kh$% z-0IfW*3#1O+1>QuAfCeX+}!bnC;QKi4pfETzkfTso%u)!W)30w(s(RK#Ut`iy5&LJ)q6O^GL$hy0yt?>#XxGTU%! zFC?V}Q*`4ZJccMeLlOKEhh`qKXXi(E{IuiMXbLQ0XhSAW8WGVYHP zkiMtO!>+a05_2CXeza2b`XXIe>p5vvvqwcS5A>_lOQP5~`^Gx$SDEF%$BDeWe)-*- zA0O|SpT~sahL1y%-+uK}Y8#s}Yiyw@hMGD&T&S^z|#V8G1fhv_io4l%j`6cZp_%t6)p( zjcs`<1&ff74C828LcA<~GOP|!X|de#L{_#Tr!?qg9;FcB`T4uK-Z=h*N1x2a$%$rX z4R3F+7|fclx)&GOp;ngq`oC6@uj19SF~HHM22g7L$a>RW9y2&8S$)sQ$eXzu9-@U* zCMr|)b|g|pQPHwiebd=WQqn<9ZK2+&HUZ93L>GjOPgAql`m^-pG_^n_z0Ui_e|kDI zCDn+v)|^WckEq=6W^7*H=Z}qW-c*xWzvF`kA8hA%){JXM#PNu@xb`m2>(q<-GN}vl zWbTk+b%KKUqhtHfW=BT}R3a!_DvhWWMf(j4`r%0xKJMxD{@v|cIV2kquLQPyR!0Jx zk4l=r;t$(3lGGqZW^-V9oM+xCXc;{23POWkpJ?6sv zNPqRYP}a8ws6q(T~Hm=+0~VVaQrW~zflefbazK6tsH)z zoF`r>j!x2Iiu1cTrkeQ46Cf$*K$}%la|2cx+-Dmhp-*JD==po4H{l(qZ2U=g`iIWmzUN?F>ZM$X7bw`9@getTbRtSBMSV0!s@-X#Wh# z2iY9z7nCsF+4y+p2gqmR7!vTFA6{7%Lyqq%+xf$vXfS&p^>*Cd{0zUmEI60_jDb}w zX}H+={+RN&^L6LyVWO@MneEI`=96e!+w@GI3|)QwAZz_T%sZ1CzBiRTVy*6rBA8A0 zP#_Qvj>~K*iCTNH7DS~yb6j37;Xr!h9g^mlQ(txYNU|=g7#$%iWyW+jQ9_N6zy8XI zf^2V(Z+r5_3>n$KF}O}blpVGBYhAR1ADSoCWtg3nWqyrFSBM)p#6y#TCd|yHw0JM* zsjG9wp{z-(8U4&Q{+1D3C~0iGyEEfj{Ha#}mHLIv&C-XD28~a{x?{abXn1#)J?V?V z`WE)6;aF6IK*Sx7cDuvy6O;H`y)6Ay3Vv-^k6RaF@oN?qS=w7~r*R{x_r<}_SP2#K zxUgjgnV4hbkLK*jdCUA9nmf{ktCg5dzT>d{9jZn| zvI0ae6)6f{)v6yyY)WW1A*}57CZA}qFShj1CHQxA=<0t~NB^ji-IONgbt&DHgSe-t z*jb{LQ#U_Dh>h-hhhtt{Wr2>K!tKbIh^=0yxahDd;dScRylNy2Ol41M$ZG!#NG*nv^&UN=9~OoE-Lum6IF93VI9 zzBq>IrE~wz4#$4;hOhpgX!%@nCvJajC`|K+vWx z_-RiOQHxl>a}|RlBkim@e7vfQG?MYDNizhU^1dAKELP%BkVn+`+}*ZtTG47&sA^3a zzkMrYS_wS8@3Pkg3{fM1sGnko;ItE(&N13(@< zdTG(qgShhJ21h`oEi5!sM&4ia3s=L+Ma{gUguFK6?P|=Th57@}w)Re0>Er;c{% z@E?mP@1u5~ux{ppy*g55<<~nXC+&w&iu?HwT z2Rl0+wMek-#JI=apLThaKf4{yDPkUmzP ze{e4>9~auUC{ut9vxsf7l&q zVfVk)ES;sWaO2h4KEq~cD0b;17M21`d}`Xw$w^HLic|@xk8o^5gHZRGv%}(xK(s9) zkjEV}b!xtd@7rwti_c|#?AbWp-5D;hV^$`2kH|bZIY~>S1coGFW2Gcdpitc^3oz)1 z0g}(3J+rX1lsHOFO|`WhQJB+agZN%vy0fsbzR+f#OJTUxeWVIp*%0S%?c zC<^+K8aGugnk}!8rCmXL#t=QlM!TWK_`{S79Tg>3_O{AvJLZ3DUZ(%5dAqUk$Jqpg zgn+4mN9fer2kb*y51zFQyumqSw0JXWglwGr_?aRnBjZQp>fwdwi%c3KqJZ_r#zrI( z`2fuy2x?pkzSkG+?d`xIr;ovc_~Oo^q58G7w3L_Id3oJjo^D?e10xj>c+kMc_alD0 zc~WX>@4MR@5EDS9XJutcK>43PuLtW-{E+RgAph@>Z0AN%Q6r)1k63fG2(SY{>;wh| z0+0LMyLZ~&IyykrW5)GXRaOeR?vN(>{13YKO#rxKptz%8EpLaYF+TXMDKf@(bxDIs z1>p>6DtH_cP%-DM@B}#@DV}WJZLEmp9_$lr!SpgOAZ3x%ztd{ z?iy5E!EJ2V7ngCsq8*-k>*8t^iJc1Kwdp3 z;{AJUCb_28&BYb_^fVcPN|7+#@7f~T*;Ph?xVT8~lLCqrMRRxB z&nfmv;GM`~B`fZmqBe61Zc-lqOopyEmd?(7;bc3*!)}L>GRXwnXc7e)Gd4L}R+1$L zKllalsjE!i`lv*onkS%Fx}!td;-5TbgPtSgp40O3?%uzDcX@rh9>?<7?7o$mgaDDg z{xlO4E^r!YieP_c-ac`4&8OgFZxbe7ml7aae2;9XJ~h*$c$mbc@ba>`u5RyOnRcc0 zS+O)$K}R^54K%@VpPKF|{b^qH>AK&&sTUWf%i&~O2(5-ox-{&|OC>$MvDil)MF-s^ zBmmJ7O=bwp&(Pr02dM4c-6w~($TUe|tq@*u~KtAygEl-xo z)!~!;*=wF1W0mT=wSlq>C&p?IKQ6u{k7z&~!cGf^$4^9_K6N_&#WYqBcREw6 zCTT$gf%GQ|l8{UlEh}7=>5VZfJ)5qwtSqLWXP4G8zV(y?)G>mh_=YMbMfX$E*}-r& zEpA3K7o)V6gq)l;5J+0(@rC6fVCA~*w;UZJ_kX0Al{9Du@m{(hi{G35J53w0@upZe&!uvT`}Ad!o~~F@*l)33`PguDwoc?Y_~Pm8a!Gb4Apu>>Dg3L za@7+KOowV}iXELB_6sS%+X_GXnVH@2r5Ak!&dOnXy&N=`^pxoIPiPEf zj64n`YoxGKJ-e<>g*_1z?W3s$V{dNGS|0?gOixerMSZFwa4#hwNva2$qN++VTa_`P z@3KWDSTY+6ty7yoNUW9I;}@Jh=7rBw#EmZE;5DO7-b{0n`ns7eNBdNc^!lu=*GrfFVgR5SobXX~AX{qrl z3gOH7#L!S>Z!aw-sPGAa0Xjrny30T6Maq=Ddom0P_biRhy!+JtyR`rYO?a7ifKVLD zz?~XnxSaL1^8MXPOW?Zy$JWj}Cfy)1ecz00c&6z01ERb0)pxCK6VFL`h!wYi>v|x> zfN>w7A|&CZpewuccN}Y>8!@(@tmiMuLZo$7Rp-v8Fw<3B9G(pg-cq^`lQlEiw^P4&bG7KlJ)Xp z<~mbtHzK&Wm0paHaC~QHD276f zpk8&nH4r8Bhnww$b1Z$U~B17{;uV~M>h{_1z!RK2+$V?Cnu9iZA!e2@gfavZ+-nVKyfQ84?!{A z-DBM-@x_0uHCgF)eISfh|DUbMb-Pr+p;A-lMn;x*cc~se%r1}a^^G-p2Hs!s9UmX3 z>&J=h{ZEe* zCT$^hm+?-a`0!&i>6`z&TJwJtj$aH(AP@*px8SW6<^ol~h+k}9Chg`j&%=t$s`R%FBm zXi!aFOG`p`e|~aW3KJlR3VJ2^Ld`Q{C(}!eK=ZbJ@%L}Kd(lCGGSIRzQ2~p}bHay_ z8iWNo8uKMuv9((jpMo^iXS#l=Z+nkE(rs=eGkGb-@UBRSv?eG=28Hm^Lp%(8Bxz;D>Sh@4;jR_a926sKh4Km zM~@y^g^JrnM@Qq53;bSRw>mGOKH0KC59*F4?)>S5O^Noi!Ffg2+1c6C^UKfDkJi4p zSXe%LEocAk!PHSt*kM1QCMTdA{kzHb7d$;WDlIKlRV*$oJvutt`m4I|IBVVU_MT~F zBwG+J+?12E8U>5UsE`aF$8~9Hbkw;k^3fDSxMc8KzT2C##m6jqFfuaV%VX;t_f1vC zq*t$AMLlNCVmIwB%=V9TO)JiZji=mPU$f{p9v>hmhyLPz&cN{MW|p<>`f&eerwmV; z91$5=|Ju<#$hkpCM8tnEgWqMfKO#0ZrEjH&v8$`=Xmy~;Wo__eYm(;46C`A0(aZJx zj1005A&dT3I|+&+7?_xtI5;;Oh1uRS^r7Mh%dw(^>AbA8w6r`t8npPu;+H3rhL2ed zge(U$kkN2^%sx91pjDFMbc>Nae)Nc3*qe)yk&&AE1wCQO=-BA!`-B9|GOag%8^8*)0Ynq>QxXr&4+S=N(vQ~&FHd9kmTUc0tL5Vqn&4hD4p_7)0{%(AX<}xEWFz0+(Q%I_wXCenyf2wwP%xH^-?=jk z2i&3VSL=OZ&d;hABJ_jqsb#^uSDbS%ZoQBo2TaR~|aX*qfMc$5$Mi*s|n zi>-cOV=us3&(Fwy!wH$Hr0!tN0Zt(HE(00$Z+OK!cX{_5zmL z?>&C}n3tD#e4(bMX0G0G5!mlN=t;Z`6<+fUDhUom6)%%0Ywqe=qsKDT*Eiejb=2Up z2E&$e{d3jS*VoI@HF+MGD01uQ>hf}NMU(O4LrVJk18YZ*nRP;ZPmVWKf1iQAsOwfA z*>7}>+sJ9$wiEF*(*8Fmns3FNmb+sp{m<_~Miv&RP!Cv^^>sd<)3W53@)>-}wD?cy z=mt~SC6f5ezbEEP$MW#-i1?nfF*0t>HMne+is2Cw6MF$Ca(e2XCMT6Yk}CI6jxM2Z zg^NU7$XDSGjn06oap*B6|xVt*4OHds23{pIb|Ubbj}gQaD? z-<3ORaEB2aI3nZ(1g3U&*CW!D7gtx(FJF=ic`DUTEVTFt3kd;>0Iq0idYYJ+czSx8 z-+J^z(sRv{Lpkua`9?QjUbnZmSdUpG2m47P1g8AFC5~+lEZGKl%0LYI@dhOEt?@!TfE)-33!#8(tgXKV-^D_thvS|E(-9YW$b!4-LsY$$W9Sjj4@yjYE%$?gf`!4gsi ze_g$0Q`4*}eFgb~z=!_oJvq9*C7688o<>orlgmWax9vr+et&$stqmM0( z9z+xGsxhKKP^Xg>y;t5YvYr4BFYnEfm(XFfp02!K@HdICzrFPRZQ= zx??($mu$8ZLhKCPYO>wr@R?Ix$BNQpgq&_CB_H{=9U)$)hxY z6dym&yShg5iE;HbIQ9?(A~7*Bzw5dZZa4ukF+)OcoH~dRWaQ*nSXi7K9CP#YG11W= zKqzJjMI^?hrSbb;dlC>3=<3dj1W1sihlzUcp}tm7*yVhH-3bMPD25sOwWfv(Y6niV zq@*P7(ekffd}M>u)t1@9KFLW*=9ZRdkdhx(XXPaawAA@P)Xv(P-}{&z%4ulOKCxF( zd7q!3uTmUh%qJ{7KRBpBm(ao1Y&%&#JUskNF)J}CNj{a$82H2<#<4=hHs1?pQ&XCR z-ssraii!$R_ib2=6hVZfcy3&W5tDA+_QqIYp+Y7SBouI~Cmg-N`)R1^}!jdOA zmlFZP-dkg>TqP<@^``!T0cLh~<)owYgXI>%!J(mWV=cxco5Zn&1qT}&Zx9_}VQWL# zZPsISW{)UhH4P18nbuZUy*)jtO2N1~*qHFp*Ih4xXVTTt0U<$GHyw;ah8EyA5H50+ z^jf^t^YcXhjNvUeLO@WH2Cc}(Gc0muM(06nTetO>rY2jnK*InS8bi3kq%Un0Kf}r#PFyOVLi__E7*49=O z6cj?t&<-Ot4GmNj6fbXY02gpQ$M%B;f9-Bi!V?lyt*whUO})GtY_wTYkRjj;4X}#V z^c##if;d576%AMz8yg!RfAp%Rs!Ew$mzkN_SA_DFwEt6+Dy?EQ5Fs${2fcguZfVKr ztr!(iRA*-=4Gm3HRMZ1X5uqjdPAu;``*NLHMh*@RVd0kCTxvlNl2qKC?f%xA1 z3Q?k;YYS*geu;vLT31tJ2g3REXY-P8AaXj))NC9qBh1asU%Yq`j!Uj$h!T|3-rf#u zDp!drM;4RX1q zlT~?^l)dR{a9X;4{P;0DOUgfJ1cOIJ7*}cOvG58DlNZ$@gp-0RO}a2SIXUBHKFB`A z41Jx#VqQHB;L3B2GAl>NNv)^+{AqnF958H(*p#d+IBj=V7dSoqe0*dgzMdUHC}g80MPq@;~RhVmZWP3{~edP?7Y-p=q4to`3G2#@5_eG&_uF^R)%(+UgARPFDm zA>`NSGZ|%BfS)BeNs#2}bZ?L>J(Ud!se8n#BGleY5(^y`tRXXnX8CuB$a20gEVLEK z6!2?os$xg(ietmQB~#24nCahU&F4rn8O*?-?+*6cUrSXeL`91&95JZ+A8EK z@s;l!#HdtG%OJgS2pZn_5f_I+GQb&u`ejaVVL|Wta{?$(?jt%b-J0YM2s9s67%2S# zOJK80EvV;xyyH{}hwll#Dj5Cn;REn(^F*_cLdCHmC-;v}97o1^-@bjTprC+SB*VIX zTI<;JItV8?w2P2&{41LqvsR^8z2Nt_^>aQcgHX)nHU9#hknnJt*-%xdX^MnntbgK4 zN6j)g&klq^$W#pk%1NGaBSkw-Y1)IxMqH_i?cI8?o)Q|c6Mdn{FtF8 zLs`NO00OSACOlJQ0kD$?HD(+G?$D$LDAg5HbxDbAl5{N-enhIA1%P{gem7O72rI6? zWN5`(GX>mi%*~%>4|%+KGyUZa&1eUQ%c@+i(mU7E7S985bp<^=vhYrRpVRGX%c0Mo zKLh&I*gfWUvVaT-F1Sdia66E+-u!oNSFDx!`E%7rBF?{MU}5*5zui2{>!F#tdQu4) zU?ktZNvi83Vk!3~s=7B@(4svM^!14S?3OG$9zjvj?4h;U+1abhOCmzTqA-=F#>OXD zLKGFPtrXf)xWnb0p8(Mk7P@VmUEkeZux}Cmq#&a-EAs*EOL;l&1wBzzlB~InO^Fy4 z@Q~=ZxJ2mpdo+94F`=TeGBS3P`=94_M4v)||2Sc<`e|>S%($GT)Gm{I5TKRRgqUZ0 zi?Ougc!V%mYH~6iA!dOJL#6^RJNt`Poq7j-H@B04bY5P^g=Vwf_X}8twKnQzW@g^r z-VzcL?(U~`_Oo%v0IyF>X!zOVcaQ888>XMa!hWWv{^4{h&cL^;UnC?XH0ZGecPt%v zZftDqXMb`7u{R-sAiPt%-XT-+$qR+O5-Gyw1&Y3vLt&rOFJHc-0_No7b9CXmZyA+S zB|Ev2)$Zd{w!B94FJD(U%b|?sW$Y#^i#hWaJC65P-ZIXAC>j3+=DG^C{v}(0)N+C< zfrk@TOT31CFK1aH6>!MR$n&vzGD2nkpGvJa_`vURq92C4h zGvn~eR?KteTiu#e6m_E7>j+*8!@#~;>VD(x-TS+@Ttnld->P2Yu|98ou5Mihw-|Vm z5+3?>urKAg#Sle>yai*@XCDtwV`FovZhJqpFs%Kbe1ccFkWqK^F50eZS7+xzek`5+ zytfAZkE?{?DKtv>P&TXAp0Gii#VDYLA5}0AUFKV?jLm__2xjIT6qF>LtRnSFEjr!0 z`;>wjN(Kgnh3)%DxMYT3l%xt(7Xt$H0yME7WUsHRkUdJuQ^U8>lMU#2yL@~+dwXjt zCwD2FKym+tpnJ$di*8EdkDD=kM|3TZxtW=cHO+wiw{@DjB+(??b{Edssj1Pc7V!?q zoe#Aeea(jZk=(G&V19%e2b)ar zJkNa_-S6oFwsLCWBDD<3~bGpNoTE1$oA>Np|xFj}D1 zdF6ql<6~3_){0$q976tpR!PbgQyeCN^URWJgsm=Dk*jYbY?ZO_QbKLG}vH>tzKEMI4bar-kosL2CE zMCpD${KU1k;DzV;w^s@8M3wHlz;$&69Tv+^4%kBgX)rMn@9W#TJrixcS0aJc&)@nc zA2sY}Z-PFK>U@!Mr^v-O4+LBe=>cI!#`4x=sh5zheOCDJqpgV+M+XN&f&}AA5*+MR zvZIR!bn+bQrIXPy#3Lir3=F&#hR;@iA5S?m;lKLcx7FN?eM7i@yx}MhHn}gEOB|Q5 zBY9c3o}za}mX(#zAoq)@w3YoQD(atq{Vbi}opRPwJ9hfrLrn&6_*n`FUchDX-9pQB zZ7ovgWVvSL%G7>Lm4NNU`Rr_U+wEmDV?kx5^X)Z_Vs>55qxTB!ai$G=+B!N{r?WJ} zn1Kp~yK}_uKgG2j9K1~P_Y)NHJ3C|bnl#jvoG3rVxds_HY-2}Xoo#iQY@8ny@uNbX zJ}!ld0k&7CE<;%@k^*g3TZF&SUKwk0Le zd4&1&{gagEQIQlmu+gQCxaHB&nK#Q}s>SPEl=AZS>AZ#J=1D5_aZ+b)@&i$IbqX#n zG-^nsLNJ?H$3_3c`ZoR?m0G>>3<0;vt|)UTu>9mBXohq|+= z$hezTeW9!bhx6|^Lx1hPWzI+`ANwKn`#WxKo;w&Fk;~t|OYznlTS?!8APbBBZ{OY} zJ-?wsSBY5)rz-jatB~h#C*#ez8qy*MzRtX_Um~1nWJB$DVE2jnV>&Xd(9DyQPYw=R zZ=&(=IjH%)Y8x6JCcH|JT{&;r{u%;+hZHP~-ML%?(bsozxI#}cLoH4z)By0$Hbu6teJ(1S6L2G0NK&Sw9U9v8qgeG1qro@h&^9ysJ)A4S zPo`jI_CbzrtF9lc;XNn}hxB8KFe~fO$VgRXW#w7SCa+bi7x_V5D zB{D?&?AckGB@nvBbJ>`gaiD#m9G8?ZnvwpG)ZRv$7N0$>|NQ(MXyZT=9SeS^{;fJy^yRRV_ zKuX`P>o2bbaP;PIrSD065g4mWip}=(WAc=w@tGNa4b`z9K0M6ih7HarVaC5hW7XBw zOK#RzSCdmyi@tkZpC4qAVcka($OJQ6NKPgyPyy`jqY^zW{;QWSLuF`H=m|9|3|>x< z^E%7{%|PA!_IOND2IF6#?-fu6PWJcL{|q4|DapE8xn(b;{0j5Ng?m)~Q|UBG9CD)g z$Xxlqi2TCx+HU#9A=3GfN7U!(?dxk_k!(jGmTzt8Dk+KODgkL2kXt3CxWYn96O$+J zkANJy+ydMAQ6Env*Dk`cRuqLw{O{hc52bZ&@M9-Ye|geszfpI2!hdCPQ4dayQwGm-O`X93LNtg@u7VvY)NH2Wc@8K}+8v2*h)p z?rv{n6wre}eg@=FLd0{`7z@TWfYyK?AqglN47*CJ87R4s7*LD;;iD@#jGU?D()%ZZN+oHWNp5tbBNAYBs@CT3-cnDyYn!a~J= zjuyP0wyUeHJpn0^nc3MUW>va`maE++kXfmm85dI|9d*;b@(XQUe#|;!XD|AkX`9B? zo{TgVBGhxAefTbDTc;9?-9V6nWA-ddzZBg zjlQx+nI9fL^&;EClGAema7o|>>m342Wk9U{ZHW-ZnPEJ;4V~fIueKyLzwY0Rq zcy~J)r(7&ipwnI{UTi1*Jkb9|flBxT%JR#17>LtT4U?*xhKBj>?y^E5#jIn$oUPdX zeHykhIeGnH6KrHu0(kthOz^@MKB@S`#B^W(6V|peX~DRAK@qkrzl{rLbR@7HHdz5S z(=;q#)jr%^AE~oKaEP(}1SA}sD-#!vQT-+swzQg}B4R5v4kxxZ<){G$?z!ZlboCCx z0)ChEo#Btu)7VGg=1WGu_)wv#S<}HPz4GWtS-(Bug);4B(4%D3RaLq*e04@T4FAOq zr(^}5$4jnXuLhZzN$ZV}cg;?Bf^aucKR$H@{@mkcKH? zK(zO~vM&T=BSd!m&6_qE+Ryg07P%@-1|7+!ii(8*WrcoKK%Vs3Td2;Lu5efoN{Ac7 zGVVM07D1CFJJrtlvXiaZ%jK_d#5)wMW^C<>j`rkbYKeXTZ*i^atAS4=|xz+Aj?)t%5xrd;%;=5xXa&E#X=1d8U-v%D`xB98=aSBE!Na=9^f3FBu+& zc^zXAkt?SCqDy&x;Vazg#^-gU0Ez=}|I`BT2?+SDEA<83M4@*IT>@lpZ`UssTQ|PA zae25Bd9?Q0eLMAa^q;xBL_mQai*C&H!+qu{l27gq`>H!SC`3f=6N4ec+=T3BrhLw_ zguU{v3QcjzzZ0NKI({uk#*7xo;)(!H=zY5Gg2%+|{=V_p?M+JS`IC2@?34DrTB!MO zYc4Q7)@RZPc)i^#7dLW}hwLxwyG+QU1yG^;sPL5|%5|sKY`}|xg1*l;b@~KQlO440 zPAFu8{A=6}((lf~rMIQ^g|JiuBuajVIgJ7Y54+!A&8x=-_$L2Sh|t z1_py^X$2-#T-+xX$|Dj5_#c&WLa|zEwdWDfk~`V&PG>Iw*?It-?=~6!c3w#_MBU=I zVFJtvJi=SAM^9+jcDwX7l*24bkt7DmmY40UH(_;cC{$kl>&DnJ5wo}DuHH~ch%E^8 z51mt`v%x-R3M$5u^|pB)z||PTb0${{Cso*>rHM}ny!+JEt+&SnqEA=CqWXp_E8Di7 zn)C-ZoSsir1-Yz6KE)@-?j%{>cxXREsG@hBDwY4F&$%J5TGjo|UqWfPzM!DCF&1_N zzCzP*fI=igxaZ*@uj53Inez!DENpMlF_r(Q30NI1zL(;2eEfd?x*D#F#XAjlSdD|U zrnL*K&n(g*J6(l75i`{J?)LR$`8=g>1|O0OP!m~LGJ??_<9MDld2E?+yqt6;i4iYQ zIo-y1fDRLUx4w@?M2-vv1uf__xsx1zPrX%9In*>Q3sNZ5(SqGw9~J7{o;<;axnV=^ zqBCw6e1u}cw9{?N0mZU5%O5LtaOh;wkMzB=&l6tD!3M$)+^xs5Hk{ivbLO9zC?uuu!&P8>D%Jnjw?l5*>xfGzB-v=59a_3M zL);u?->Nab%vCy_rdVv%f1N8PM>jAtv%Qu*d3hDfE*GbTiUwXs$~%}UG_9U)P3y2w zrp)-We&O>_uePYe+`hK*usi!+3@;V zkVIxo-*<=!fc&lLFA2~9ul7g&blYRt1WCHH>9^xP7>?*LXSuv*ptJ^!7yh4;Tg9@X zewSP+edHWwJ)7gDf&z_R?3VuzD(5z8h9ObHfiBqj_3K2L_R;!CJ}75#26>B}or(pa z1CYuxv$V9durO$J-2m~@W73V)pjk^r#d&+G>W^B-YkI(Ke2Gd4FHk8~DJG1N1TY>X z8tkpD*?D-RS}%8-_Vo1iTbi5Qx2NJWGUnXoLG=qr>4k@cKo9_F*d)9>?a8Jm<&r1n zJn5O)K&3p|+1c^)^TWc#q)*h0|3{~6wM}z(cZVSLTV6bD`v#CvyS&SYjKm~~SzTI! zAiSt9*#Zu3Zgna=NlD53XlPjXD-6!n)lY0>BffwC4&b3H^C=D`6~wmU+57(K-Q{E( z2PdbkjSa{Qf}HtrY``@r2tk6V&@lm*di|OJGgPHGQK2wBwb|R*8YJGw$H##xyRz^fFnY2fm+03|e_D29UDhS2$-8B~#g5{2>l-rin4mXr>o zeb46OV^>&MJPjWM1Ndh|=g%_TdW9$P?QGakQAvsT#HMw_vp6C@qx1-EY}Y#&6!-pp z-d-fCqO9z9@V(fTir5%ogX6T`LH|X21pAK=Gj*&0W8d^f5+b-2Y!Xb%$oDqcv8nw!jGL#-LX(6(q~Wje`CUAi6Ez diff --git a/hiduniversal_8cpp_source.html b/hiduniversal_8cpp_source.html index d9a98c2d..1702fb76 100644 --- a/hiduniversal_8cpp_source.html +++ b/hiduniversal_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hiduniversal.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,432 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hiduniversal.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 
    -
    18 #include "hiduniversal.h"
    -
    19 
    - -
    21 USBHID(p),
    -
    22 qNextPollTime(0),
    -
    23 pollInterval(0),
    -
    24 bPollEnable(false),
    -
    25 bHasReportId(false) {
    -
    26  Initialize();
    -
    27 
    -
    28  if(pUsb)
    - -
    30 }
    -
    31 
    -
    32 uint16_t HIDUniversal::GetHidClassDescrLen(uint8_t type, uint8_t num) {
    -
    33  for(uint8_t i = 0, n = 0; i < HID_MAX_HID_CLASS_DESCRIPTORS; i++) {
    -
    34  if(descrInfo[i].bDescrType == type) {
    -
    35  if(n == num)
    -
    36  return descrInfo[i].wDescriptorLength;
    -
    37  n++;
    -
    38  }
    -
    39  }
    -
    40  return 0;
    -
    41 }
    -
    42 
    -
    43 void HIDUniversal::Initialize() {
    -
    44  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    -
    45  rptParsers[i].rptId = 0;
    -
    46  rptParsers[i].rptParser = NULL;
    -
    47  }
    -
    48  for(uint8_t i = 0; i < HID_MAX_HID_CLASS_DESCRIPTORS; i++) {
    -
    49  descrInfo[i].bDescrType = 0;
    -
    50  descrInfo[i].wDescriptorLength = 0;
    -
    51  }
    -
    52  for(uint8_t i = 0; i < maxHidInterfaces; i++) {
    -
    53  hidInterfaces[i].bmInterface = 0;
    -
    54  hidInterfaces[i].bmProtocol = 0;
    -
    55 
    -
    56  for(uint8_t j = 0; j < maxEpPerInterface; j++)
    -
    57  hidInterfaces[i].epIndex[j] = 0;
    -
    58  }
    -
    59  for(uint8_t i = 0; i < totalEndpoints; i++) {
    -
    60  epInfo[i].epAddr = 0;
    -
    61  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    62  epInfo[i].bmSndToggle = 0;
    -
    63  epInfo[i].bmRcvToggle = 0;
    - -
    65  }
    -
    66  bNumEP = 1;
    -
    67  bNumIface = 0;
    -
    68  bConfNum = 0;
    -
    69  pollInterval = 0;
    -
    70 
    -
    71  ZeroMemory(constBuffLen, prevBuf);
    -
    72 }
    -
    73 
    - -
    75  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    -
    76  if(rptParsers[i].rptId == 0 && rptParsers[i].rptParser == NULL) {
    -
    77  rptParsers[i].rptId = id;
    -
    78  rptParsers[i].rptParser = prs;
    -
    79  return true;
    -
    80  }
    -
    81  }
    -
    82  return false;
    -
    83 }
    -
    84 
    - -
    86  if(!bHasReportId)
    -
    87  return ((rptParsers[0].rptParser) ? rptParsers[0].rptParser : NULL);
    -
    88 
    -
    89  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    -
    90  if(rptParsers[i].rptId == id)
    -
    91  return rptParsers[i].rptParser;
    -
    92  }
    -
    93  return NULL;
    -
    94 }
    -
    95 
    -
    96 uint8_t HIDUniversal::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    97  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    98 
    -
    99  uint8_t buf[constBufSize];
    -
    100  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    -
    101  uint8_t rcode;
    -
    102  UsbDevice *p = NULL;
    -
    103  EpInfo *oldep_ptr = NULL;
    -
    104  uint8_t len = 0;
    -
    105 
    -
    106  uint8_t num_of_conf; // number of configurations
    -
    107  //uint8_t num_of_intf; // number of interfaces
    -
    108 
    -
    109  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    110 
    -
    111  USBTRACE("HU Init\r\n");
    -
    112 
    -
    113  if(bAddress)
    - -
    115 
    -
    116  // Get pointer to pseudo device with address 0 assigned
    -
    117  p = addrPool.GetUsbDevicePtr(0);
    -
    118 
    -
    119  if(!p)
    - -
    121 
    -
    122  if(!p->epinfo) {
    -
    123  USBTRACE("epinfo\r\n");
    - -
    125  }
    -
    126 
    -
    127  // Save old pointer to EP_RECORD of address 0
    -
    128  oldep_ptr = p->epinfo;
    -
    129 
    -
    130  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    131  p->epinfo = epInfo;
    -
    132 
    -
    133  p->lowspeed = lowspeed;
    -
    134 
    -
    135  // Get device descriptor
    -
    136  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    -
    137 
    -
    138  if(!rcode)
    -
    139  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    -
    140 
    -
    141  if(rcode) {
    -
    142  // Restore p->epinfo
    -
    143  p->epinfo = oldep_ptr;
    -
    144 
    -
    145  goto FailGetDevDescr;
    -
    146  }
    -
    147 
    -
    148  // Restore p->epinfo
    -
    149  p->epinfo = oldep_ptr;
    -
    150 
    -
    151  // Allocate new address according to device class
    -
    152  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    153 
    -
    154  if(!bAddress)
    - -
    156 
    -
    157  // Extract Max Packet Size from the device descriptor
    - -
    159 
    -
    160  // Assign new address to the device
    -
    161  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    162 
    -
    163  if(rcode) {
    -
    164  p->lowspeed = false;
    -
    165  addrPool.FreeAddress(bAddress);
    -
    166  bAddress = 0;
    -
    167  USBTRACE2("setAddr:", rcode);
    -
    168  return rcode;
    -
    169  }
    -
    170 
    -
    171  //delay(2); //per USB 2.0 sect.9.2.6.3
    -
    172 
    -
    173  USBTRACE2("Addr:", bAddress);
    -
    174 
    -
    175  p->lowspeed = false;
    -
    176 
    -
    177  p = addrPool.GetUsbDevicePtr(bAddress);
    -
    178 
    -
    179  if(!p)
    - -
    181 
    -
    182  p->lowspeed = lowspeed;
    -
    183 
    -
    184  if(len)
    -
    185  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    -
    186 
    -
    187  if(rcode)
    -
    188  goto FailGetDevDescr;
    -
    189 
    -
    190  VID = udd->idVendor; // Can be used by classes that inherits this class to check the VID and PID of the connected device
    -
    191  PID = udd->idProduct;
    -
    192 
    -
    193  num_of_conf = udd->bNumConfigurations;
    -
    194 
    -
    195  // Assign epInfo to epinfo pointer
    -
    196  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    -
    197 
    -
    198  if(rcode)
    -
    199  goto FailSetDevTblEntry;
    -
    200 
    -
    201  USBTRACE2("NC:", num_of_conf);
    -
    202 
    -
    203  for(uint8_t i = 0; i < num_of_conf; i++) {
    -
    204  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
    - -
    206  CP_MASK_COMPARE_CLASS> confDescrParser(this);
    -
    207 
    -
    208  //rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
    -
    209  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    210 
    -
    211  if(rcode)
    -
    212  goto FailGetConfDescr;
    -
    213 
    -
    214  if(bNumEP > 1)
    -
    215  break;
    -
    216  } // for
    -
    217 
    -
    218  if(bNumEP < 2)
    - -
    220 
    -
    221  // Assign epInfo to epinfo pointer
    -
    222  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    -
    223 
    -
    224  USBTRACE2("Cnf:", bConfNum);
    -
    225 
    -
    226  // Set Configuration Value
    -
    227  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    228 
    -
    229  if(rcode)
    -
    230  goto FailSetConfDescr;
    -
    231 
    -
    232  for(uint8_t i = 0; i < bNumIface; i++) {
    -
    233  if(hidInterfaces[i].epIndex[epInterruptInIndex] == 0)
    -
    234  continue;
    -
    235 
    -
    236  rcode = SetIdle(hidInterfaces[i].bmInterface, 0, 0);
    -
    237 
    -
    238  if(rcode && rcode != hrSTALL)
    -
    239  goto FailSetIdle;
    -
    240  }
    -
    241 
    -
    242  USBTRACE("HU configured\r\n");
    -
    243 
    - -
    245 
    -
    246  bPollEnable = true;
    -
    247  return 0;
    -
    248 
    -
    249 FailGetDevDescr:
    -
    250 #ifdef DEBUG_USB_HOST
    - -
    252  goto Fail;
    -
    253 #endif
    -
    254 
    -
    255 FailSetDevTblEntry:
    -
    256 #ifdef DEBUG_USB_HOST
    - -
    258  goto Fail;
    -
    259 #endif
    -
    260 
    -
    261 FailGetConfDescr:
    -
    262 #ifdef DEBUG_USB_HOST
    - -
    264  goto Fail;
    -
    265 #endif
    -
    266 
    -
    267 FailSetConfDescr:
    -
    268 #ifdef DEBUG_USB_HOST
    - -
    270  goto Fail;
    -
    271 #endif
    -
    272 
    -
    273 
    -
    274 FailSetIdle:
    -
    275 #ifdef DEBUG_USB_HOST
    -
    276  USBTRACE("SetIdle:");
    -
    277 #endif
    -
    278 
    -
    279 #ifdef DEBUG_USB_HOST
    -
    280 Fail:
    -
    281  NotifyFail(rcode);
    -
    282 #endif
    -
    283  Release();
    -
    284  return rcode;
    -
    285 }
    -
    286 
    -
    287 HIDUniversal::HIDInterface* HIDUniversal::FindInterface(uint8_t iface, uint8_t alt, uint8_t proto) {
    -
    288  for(uint8_t i = 0; i < bNumIface && i < maxHidInterfaces; i++)
    -
    289  if(hidInterfaces[i].bmInterface == iface && hidInterfaces[i].bmAltSet == alt
    -
    290  && hidInterfaces[i].bmProtocol == proto)
    -
    291  return hidInterfaces + i;
    -
    292  return NULL;
    -
    293 }
    -
    294 
    -
    295 void HIDUniversal::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    296  // If the first configuration satisfies, the others are not concidered.
    -
    297  if(bNumEP > 1 && conf != bConfNum)
    -
    298  return;
    -
    299 
    -
    300  //ErrorMessage<uint8_t>(PSTR("\r\nConf.Val"), conf);
    -
    301  //ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
    -
    302  //ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
    -
    303 
    -
    304  bConfNum = conf;
    -
    305 
    -
    306  uint8_t index = 0;
    -
    307  HIDInterface *piface = FindInterface(iface, alt, proto);
    -
    308 
    -
    309  // Fill in interface structure in case of new interface
    -
    310  if(!piface) {
    -
    311  piface = hidInterfaces + bNumIface;
    -
    312  piface->bmInterface = iface;
    -
    313  piface->bmAltSet = alt;
    -
    314  piface->bmProtocol = proto;
    -
    315  bNumIface++;
    -
    316  }
    -
    317 
    - -
    319  index = (pep->bEndpointAddress & 0x80) == 0x80 ? epInterruptInIndex : epInterruptOutIndex;
    -
    320 
    -
    321  if(index) {
    -
    322  // Fill in the endpoint info structure
    -
    323  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    324  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    325  epInfo[bNumEP].bmSndToggle = 0;
    -
    326  epInfo[bNumEP].bmRcvToggle = 0;
    -
    327  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    -
    328 
    -
    329  // Fill in the endpoint index list
    -
    330  piface->epIndex[index] = bNumEP; //(pep->bEndpointAddress & 0x0F);
    -
    331 
    -
    332  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
    -
    333  pollInterval = pep->bInterval;
    -
    334 
    -
    335  bNumEP++;
    -
    336  }
    -
    337  //PrintEndpointDescriptor(pep);
    -
    338 }
    -
    339 
    - - -
    342 
    -
    343  bNumEP = 1;
    -
    344  bAddress = 0;
    -
    345  qNextPollTime = 0;
    -
    346  bPollEnable = false;
    -
    347  return 0;
    -
    348 }
    -
    349 
    -
    350 bool HIDUniversal::BuffersIdentical(uint8_t len, uint8_t *buf1, uint8_t *buf2) {
    -
    351  for(uint8_t i = 0; i < len; i++)
    -
    352  if(buf1[i] != buf2[i])
    -
    353  return false;
    -
    354  return true;
    -
    355 }
    -
    356 
    -
    357 void HIDUniversal::ZeroMemory(uint8_t len, uint8_t *buf) {
    -
    358  for(uint8_t i = 0; i < len; i++)
    -
    359  buf[i] = 0;
    -
    360 }
    -
    361 
    -
    362 void HIDUniversal::SaveBuffer(uint8_t len, uint8_t *src, uint8_t *dest) {
    -
    363  for(uint8_t i = 0; i < len; i++)
    -
    364  dest[i] = src[i];
    -
    365 }
    -
    366 
    - -
    368  uint8_t rcode = 0;
    -
    369 
    -
    370  if(!bPollEnable)
    -
    371  return 0;
    -
    372 
    -
    373  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) {
    -
    374  qNextPollTime = (uint32_t)millis() + pollInterval;
    -
    375 
    -
    376  uint8_t buf[constBuffLen];
    -
    377 
    -
    378  for(uint8_t i = 0; i < bNumIface; i++) {
    -
    379  uint8_t index = hidInterfaces[i].epIndex[epInterruptInIndex];
    -
    380  uint16_t read = (uint16_t)epInfo[index].maxPktSize;
    -
    381 
    -
    382  ZeroMemory(constBuffLen, buf);
    -
    383 
    -
    384  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[index].epAddr, &read, buf);
    -
    385 
    -
    386  if(rcode) {
    -
    387  if(rcode != hrNAK)
    -
    388  USBTRACE3("(hiduniversal.h) Poll:", rcode, 0x81);
    -
    389  return rcode;
    -
    390  }
    -
    391 
    -
    392  if(read > constBuffLen)
    -
    393  read = constBuffLen;
    -
    394 
    -
    395  bool identical = BuffersIdentical(read, buf, prevBuf);
    -
    396 
    -
    397  SaveBuffer(read, buf, prevBuf);
    -
    398 
    -
    399  if(identical)
    -
    400  return 0;
    -
    401 #if 0
    -
    402  Notify(PSTR("\r\nBuf: "), 0x80);
    -
    403 
    -
    404  for(uint8_t i = 0; i < read; i++) {
    -
    405  D_PrintHex<uint8_t > (buf[i], 0x80);
    -
    406  Notify(PSTR(" "), 0x80);
    -
    407  }
    -
    408 
    -
    409  Notify(PSTR("\r\n"), 0x80);
    -
    410 #endif
    -
    411  ParseHIDData(this, bHasReportId, (uint8_t)read, buf);
    -
    412 
    -
    413  HIDReportParser *prs = GetReportParser(((bHasReportId) ? *buf : 0));
    -
    414 
    -
    415  if(prs)
    -
    416  prs->Parse(this, bHasReportId, (uint8_t)read, buf);
    -
    417  }
    -
    418  }
    -
    419  return rcode;
    -
    420 }
    -
    421 
    -
    422 // Send a report to interrupt out endpoint. This is NOT SetReport() request!
    -
    423 uint8_t HIDUniversal::SndRpt(uint16_t nbytes, uint8_t *dataptr) {
    -
    424  return pUsb->outTransfer(bAddress, epInfo[epInterruptOutIndex].epAddr, nbytes, dataptr);
    -
    425 }
    -
    uint16_t PID
    Definition: hiduniversal.h:69
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 
    18 #include "hiduniversal.h"
    19 
    21 USBHID(p),
    22 qNextPollTime(0),
    23 pollInterval(0),
    24 bPollEnable(false),
    25 bHasReportId(false) {
    26  Initialize();
    27 
    28  if(pUsb)
    30 }
    31 
    32 uint16_t HIDUniversal::GetHidClassDescrLen(uint8_t type, uint8_t num) {
    33  for(uint8_t i = 0, n = 0; i < HID_MAX_HID_CLASS_DESCRIPTORS; i++) {
    34  if(descrInfo[i].bDescrType == type) {
    35  if(n == num)
    36  return descrInfo[i].wDescriptorLength;
    37  n++;
    38  }
    39  }
    40  return 0;
    41 }
    42 
    43 void HIDUniversal::Initialize() {
    44  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    45  rptParsers[i].rptId = 0;
    46  rptParsers[i].rptParser = NULL;
    47  }
    48  for(uint8_t i = 0; i < HID_MAX_HID_CLASS_DESCRIPTORS; i++) {
    49  descrInfo[i].bDescrType = 0;
    50  descrInfo[i].wDescriptorLength = 0;
    51  }
    52  for(uint8_t i = 0; i < maxHidInterfaces; i++) {
    53  hidInterfaces[i].bmInterface = 0;
    54  hidInterfaces[i].bmProtocol = 0;
    55 
    56  for(uint8_t j = 0; j < maxEpPerInterface; j++)
    57  hidInterfaces[i].epIndex[j] = 0;
    58  }
    59  for(uint8_t i = 0; i < totalEndpoints; i++) {
    60  epInfo[i].epAddr = 0;
    61  epInfo[i].maxPktSize = (i) ? 0 : 8;
    62  epInfo[i].bmSndToggle = 0;
    63  epInfo[i].bmRcvToggle = 0;
    65  }
    66  bNumEP = 1;
    67  bNumIface = 0;
    68  bConfNum = 0;
    69  pollInterval = 0;
    70 
    71  ZeroMemory(constBuffLen, prevBuf);
    72 }
    73 
    75  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    76  if(rptParsers[i].rptId == 0 && rptParsers[i].rptParser == NULL) {
    77  rptParsers[i].rptId = id;
    78  rptParsers[i].rptParser = prs;
    79  return true;
    80  }
    81  }
    82  return false;
    83 }
    84 
    86  if(!bHasReportId)
    87  return ((rptParsers[0].rptParser) ? rptParsers[0].rptParser : NULL);
    88 
    89  for(uint8_t i = 0; i < MAX_REPORT_PARSERS; i++) {
    90  if(rptParsers[i].rptId == id)
    91  return rptParsers[i].rptParser;
    92  }
    93  return NULL;
    94 }
    95 
    96 uint8_t HIDUniversal::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    97  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    98 
    99  uint8_t buf[constBufSize];
    100  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    101  uint8_t rcode;
    102  UsbDevice *p = NULL;
    103  EpInfo *oldep_ptr = NULL;
    104  uint8_t len = 0;
    105 
    106  uint8_t num_of_conf; // number of configurations
    107  //uint8_t num_of_intf; // number of interfaces
    108 
    109  AddressPool &addrPool = pUsb->GetAddressPool();
    110 
    111  USBTRACE("HU Init\r\n");
    112 
    113  if(bAddress)
    115 
    116  // Get pointer to pseudo device with address 0 assigned
    117  p = addrPool.GetUsbDevicePtr(0);
    118 
    119  if(!p)
    121 
    122  if(!p->epinfo) {
    123  USBTRACE("epinfo\r\n");
    125  }
    126 
    127  // Save old pointer to EP_RECORD of address 0
    128  oldep_ptr = p->epinfo;
    129 
    130  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    131  p->epinfo = epInfo;
    132 
    133  p->lowspeed = lowspeed;
    134 
    135  // Get device descriptor
    136  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    137 
    138  if(!rcode)
    139  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    140 
    141  if(rcode) {
    142  // Restore p->epinfo
    143  p->epinfo = oldep_ptr;
    144 
    145  goto FailGetDevDescr;
    146  }
    147 
    148  // Restore p->epinfo
    149  p->epinfo = oldep_ptr;
    150 
    151  // Allocate new address according to device class
    152  bAddress = addrPool.AllocAddress(parent, false, port);
    153 
    154  if(!bAddress)
    156 
    157  // Extract Max Packet Size from the device descriptor
    159 
    160  // Assign new address to the device
    161  rcode = pUsb->setAddr(0, 0, bAddress);
    162 
    163  if(rcode) {
    164  p->lowspeed = false;
    165  addrPool.FreeAddress(bAddress);
    166  bAddress = 0;
    167  USBTRACE2("setAddr:", rcode);
    168  return rcode;
    169  }
    170 
    171  //delay(2); //per USB 2.0 sect.9.2.6.3
    172 
    173  USBTRACE2("Addr:", bAddress);
    174 
    175  p->lowspeed = false;
    176 
    177  p = addrPool.GetUsbDevicePtr(bAddress);
    178 
    179  if(!p)
    181 
    182  p->lowspeed = lowspeed;
    183 
    184  if(len)
    185  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    186 
    187  if(rcode)
    188  goto FailGetDevDescr;
    189 
    190  VID = udd->idVendor; // Can be used by classes that inherits this class to check the VID and PID of the connected device
    191  PID = udd->idProduct;
    192 
    193  num_of_conf = udd->bNumConfigurations;
    194 
    195  // Assign epInfo to epinfo pointer
    196  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    197 
    198  if(rcode)
    199  goto FailSetDevTblEntry;
    200 
    201  USBTRACE2("NC:", num_of_conf);
    202 
    203  for(uint8_t i = 0; i < num_of_conf; i++) {
    204  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
    206  CP_MASK_COMPARE_CLASS> confDescrParser(this);
    207 
    208  //rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
    209  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    210 
    211  if(rcode)
    212  goto FailGetConfDescr;
    213 
    214  if(bNumEP > 1)
    215  break;
    216  } // for
    217 
    218  if(bNumEP < 2)
    220 
    221  // Assign epInfo to epinfo pointer
    222  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    223 
    224  USBTRACE2("Cnf:", bConfNum);
    225 
    226  // Set Configuration Value
    227  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    228 
    229  if(rcode)
    230  goto FailSetConfDescr;
    231 
    232  for(uint8_t i = 0; i < bNumIface; i++) {
    233  if(hidInterfaces[i].epIndex[epInterruptInIndex] == 0)
    234  continue;
    235 
    236  rcode = SetIdle(hidInterfaces[i].bmInterface, 0, 0);
    237 
    238  if(rcode && rcode != hrSTALL)
    239  goto FailSetIdle;
    240  }
    241 
    242  USBTRACE("HU configured\r\n");
    243 
    245 
    246  bPollEnable = true;
    247  return 0;
    248 
    249 FailGetDevDescr:
    250 #ifdef DEBUG_USB_HOST
    252  goto Fail;
    253 #endif
    254 
    255 FailSetDevTblEntry:
    256 #ifdef DEBUG_USB_HOST
    258  goto Fail;
    259 #endif
    260 
    261 FailGetConfDescr:
    262 #ifdef DEBUG_USB_HOST
    264  goto Fail;
    265 #endif
    266 
    267 FailSetConfDescr:
    268 #ifdef DEBUG_USB_HOST
    270  goto Fail;
    271 #endif
    272 
    273 
    274 FailSetIdle:
    275 #ifdef DEBUG_USB_HOST
    276  USBTRACE("SetIdle:");
    277 #endif
    278 
    279 #ifdef DEBUG_USB_HOST
    280 Fail:
    281  NotifyFail(rcode);
    282 #endif
    283  Release();
    284  return rcode;
    285 }
    286 
    287 HIDUniversal::HIDInterface* HIDUniversal::FindInterface(uint8_t iface, uint8_t alt, uint8_t proto) {
    288  for(uint8_t i = 0; i < bNumIface && i < maxHidInterfaces; i++)
    289  if(hidInterfaces[i].bmInterface == iface && hidInterfaces[i].bmAltSet == alt
    290  && hidInterfaces[i].bmProtocol == proto)
    291  return hidInterfaces + i;
    292  return NULL;
    293 }
    294 
    295 void HIDUniversal::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    296  // If the first configuration satisfies, the others are not concidered.
    297  if(bNumEP > 1 && conf != bConfNum)
    298  return;
    299 
    300  //ErrorMessage<uint8_t>(PSTR("\r\nConf.Val"), conf);
    301  //ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
    302  //ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
    303 
    304  bConfNum = conf;
    305 
    306  uint8_t index = 0;
    307  HIDInterface *piface = FindInterface(iface, alt, proto);
    308 
    309  // Fill in interface structure in case of new interface
    310  if(!piface) {
    311  piface = hidInterfaces + bNumIface;
    312  piface->bmInterface = iface;
    313  piface->bmAltSet = alt;
    314  piface->bmProtocol = proto;
    315  bNumIface++;
    316  }
    317 
    319  index = (pep->bEndpointAddress & 0x80) == 0x80 ? epInterruptInIndex : epInterruptOutIndex;
    320 
    321  if(index) {
    322  // Fill in the endpoint info structure
    323  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    324  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    325  epInfo[bNumEP].bmSndToggle = 0;
    326  epInfo[bNumEP].bmRcvToggle = 0;
    327  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    328 
    329  // Fill in the endpoint index list
    330  piface->epIndex[index] = bNumEP; //(pep->bEndpointAddress & 0x0F);
    331 
    332  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
    333  pollInterval = pep->bInterval;
    334 
    335  bNumEP++;
    336  }
    337  //PrintEndpointDescriptor(pep);
    338 }
    339 
    342 
    343  bNumEP = 1;
    344  bAddress = 0;
    345  qNextPollTime = 0;
    346  bPollEnable = false;
    347  return 0;
    348 }
    349 
    350 bool HIDUniversal::BuffersIdentical(uint8_t len, uint8_t *buf1, uint8_t *buf2) {
    351  for(uint8_t i = 0; i < len; i++)
    352  if(buf1[i] != buf2[i])
    353  return false;
    354  return true;
    355 }
    356 
    357 void HIDUniversal::ZeroMemory(uint8_t len, uint8_t *buf) {
    358  for(uint8_t i = 0; i < len; i++)
    359  buf[i] = 0;
    360 }
    361 
    362 void HIDUniversal::SaveBuffer(uint8_t len, uint8_t *src, uint8_t *dest) {
    363  for(uint8_t i = 0; i < len; i++)
    364  dest[i] = src[i];
    365 }
    366 
    368  uint8_t rcode = 0;
    369 
    370  if(!bPollEnable)
    371  return 0;
    372 
    373  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) {
    374  qNextPollTime = (uint32_t)millis() + pollInterval;
    375 
    376  uint8_t buf[constBuffLen];
    377 
    378  for(uint8_t i = 0; i < bNumIface; i++) {
    379  uint8_t index = hidInterfaces[i].epIndex[epInterruptInIndex];
    380  uint16_t read = (uint16_t)epInfo[index].maxPktSize;
    381 
    382  ZeroMemory(constBuffLen, buf);
    383 
    384  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[index].epAddr, &read, buf);
    385 
    386  if(rcode) {
    387  if(rcode != hrNAK)
    388  USBTRACE3("(hiduniversal.h) Poll:", rcode, 0x81);
    389  return rcode;
    390  }
    391 
    392  if(read > constBuffLen)
    393  read = constBuffLen;
    394 
    395  bool identical = BuffersIdentical(read, buf, prevBuf);
    396 
    397  SaveBuffer(read, buf, prevBuf);
    398 
    399  if(identical)
    400  return 0;
    401 #if 0
    402  Notify(PSTR("\r\nBuf: "), 0x80);
    403 
    404  for(uint8_t i = 0; i < read; i++) {
    405  D_PrintHex<uint8_t > (buf[i], 0x80);
    406  Notify(PSTR(" "), 0x80);
    407  }
    408 
    409  Notify(PSTR("\r\n"), 0x80);
    410 #endif
    411  ParseHIDData(this, bHasReportId, (uint8_t)read, buf);
    412 
    413  HIDReportParser *prs = GetReportParser(((bHasReportId) ? *buf : 0));
    414 
    415  if(prs)
    416  prs->Parse(this, bHasReportId, (uint8_t)read, buf);
    417  }
    418  }
    419  return rcode;
    420 }
    421 
    422 // Send a report to interrupt out endpoint. This is NOT SetReport() request!
    423 uint8_t HIDUniversal::SndRpt(uint16_t nbytes, uint8_t *dataptr) {
    424  return pUsb->outTransfer(bAddress, epInfo[epInterruptOutIndex].epAddr, nbytes, dataptr);
    425 }
    uint16_t PID
    Definition: hiduniversal.h:69
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:801
    uint8_t bmRcvToggle
    Definition: address.h:48
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    @@ -604,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hiduniversal_8h.html b/hiduniversal_8h.html index 2f9e384f..56ec4ff1 100644 --- a/hiduniversal_8h.html +++ b/hiduniversal_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hiduniversal.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,20 +88,27 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hiduniversal.h File Reference
    -
    #include "usbhid.h"
    +
    #include "usbhid.h"
    Include dependency graph for hiduniversal.h:
    - + + + +
    This graph shows which files directly or indirectly include this file:
    - + + + + +

    Go to the source code of this file.

    @@ -115,7 +123,7 @@ Classes diff --git a/hiduniversal_8h__dep__incl.map b/hiduniversal_8h__dep__incl.map index 7eddfb93..cc31424c 100644 --- a/hiduniversal_8h__dep__incl.map +++ b/hiduniversal_8h__dep__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/hiduniversal_8h__dep__incl.md5 b/hiduniversal_8h__dep__incl.md5 index 436cf0d0..8b07bcbb 100644 --- a/hiduniversal_8h__dep__incl.md5 +++ b/hiduniversal_8h__dep__incl.md5 @@ -1 +1 @@ -a86212bae843e45e600441e77f5c34e5 \ No newline at end of file +6079ba5023de3a9bc19938f024e95433 \ No newline at end of file diff --git a/hiduniversal_8h__dep__incl.png b/hiduniversal_8h__dep__incl.png index cd29ea34a8c6aa8bfe4c59b8779e7c7b4b3460ad..00e1012adb7505049be5e8e9cd09e334f7b3a5fa 100644 GIT binary patch literal 8980 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 literal 8979 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 i8&5ThEIXdR!DQ{@j=(<0Jp - - - + + + diff --git a/hiduniversal_8h__incl.md5 b/hiduniversal_8h__incl.md5 index 6ace9d0f..649b21d3 100644 --- a/hiduniversal_8h__incl.md5 +++ b/hiduniversal_8h__incl.md5 @@ -1 +1 @@ -fb3e74c833bbe1057e984a28f1832b9d \ No newline at end of file +f268788864ba2a6e059e34b990a9ae71 \ No newline at end of file diff --git a/hiduniversal_8h__incl.png b/hiduniversal_8h__incl.png index f62a9d4fdc7c2002a63638880ee8d00a0f96cf67..0fb7eb207773e2428ab4e6588ce1f16a4ed18454 100644 GIT binary patch literal 8357 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 BvmF2c diff --git a/hiduniversal_8h_source.html b/hiduniversal_8h_source.html index 4c07d6ec..7372d04e 100644 --- a/hiduniversal_8h_source.html +++ b/hiduniversal_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hiduniversal.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,115 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hiduniversal.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 
    -
    18 #if !defined(__HIDUNIVERSAL_H__)
    -
    19 #define __HIDUNIVERSAL_H__
    -
    20 
    -
    21 #include "usbhid.h"
    -
    22 //#include "hidescriptorparser.h"
    -
    23 
    -
    24 class HIDUniversal : public USBHID {
    -
    25 
    -
    26  struct ReportParser {
    -
    27  uint8_t rptId;
    -
    28  HIDReportParser *rptParser;
    -
    29  } rptParsers[MAX_REPORT_PARSERS];
    -
    30 
    -
    31  // HID class specific descriptor type and length info obtained from HID descriptor
    - -
    33 
    -
    34  // Returns HID class specific descriptor length by its type and order number
    -
    35  uint16_t GetHidClassDescrLen(uint8_t type, uint8_t num);
    -
    36 
    -
    37  struct HIDInterface {
    -
    38  struct {
    -
    39  uint8_t bmInterface : 3;
    -
    40  uint8_t bmAltSet : 3;
    -
    41  uint8_t bmProtocol : 2;
    -
    42  };
    -
    43  uint8_t epIndex[maxEpPerInterface];
    -
    44  };
    -
    45 
    -
    46  uint8_t bConfNum; // configuration number
    -
    47  uint8_t bNumIface; // number of interfaces in the configuration
    -
    48  uint8_t bNumEP; // total number of EP in the configuration
    -
    49  uint32_t qNextPollTime; // next poll time
    -
    50  uint8_t pollInterval;
    -
    51  bool bPollEnable; // poll enable flag
    -
    52 
    -
    53  static const uint16_t constBuffLen = 64; // event buffer length
    -
    54  uint8_t prevBuf[constBuffLen]; // previous event buffer
    -
    55 
    -
    56  void Initialize();
    -
    57  HIDInterface* FindInterface(uint8_t iface, uint8_t alt, uint8_t proto);
    -
    58 
    -
    59  void ZeroMemory(uint8_t len, uint8_t *buf);
    -
    60  bool BuffersIdentical(uint8_t len, uint8_t *buf1, uint8_t *buf2);
    -
    61  void SaveBuffer(uint8_t len, uint8_t *src, uint8_t *dest);
    -
    62 
    -
    63 protected:
    - - -
    66 
    - -
    68 
    -
    69  uint16_t PID, VID; // PID and VID of connected device
    -
    70 
    -
    71  // HID implementation
    -
    72  HIDReportParser* GetReportParser(uint8_t id);
    -
    73 
    -
    74  virtual uint8_t OnInitSuccessful() {
    -
    75  return 0;
    -
    76  };
    -
    77 
    -
    78  virtual void ParseHIDData(USBHID *hid __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len __attribute__((unused)), uint8_t *buf __attribute__((unused))) {
    -
    79  return;
    -
    80  };
    -
    81 
    -
    82 public:
    -
    83  HIDUniversal(USB *p);
    -
    84 
    -
    85  // HID implementation
    -
    86  bool SetReportParser(uint8_t id, HIDReportParser *prs);
    -
    87 
    -
    88  // USBDeviceConfig implementation
    -
    89  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    90  uint8_t Release();
    -
    91  uint8_t Poll();
    -
    92 
    -
    93  virtual uint8_t GetAddress() {
    -
    94  return bAddress;
    -
    95  };
    -
    96 
    -
    97  virtual bool isReady() {
    -
    98  return bPollEnable;
    -
    99  };
    -
    100 
    -
    101  // UsbConfigXtracter implementation
    -
    102  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    103 
    -
    104  // Send report - do not mix with SetReport()!
    -
    105  uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr);
    -
    106 };
    -
    107 
    -
    108 #endif // __HIDUNIVERSAL_H__
    -
    uint16_t PID
    Definition: hiduniversal.h:69
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 
    18 #if !defined(__HIDUNIVERSAL_H__)
    19 #define __HIDUNIVERSAL_H__
    20 
    21 #include "usbhid.h"
    22 //#include "hidescriptorparser.h"
    23 
    24 class HIDUniversal : public USBHID {
    25 
    26  struct ReportParser {
    27  uint8_t rptId;
    28  HIDReportParser *rptParser;
    29  } rptParsers[MAX_REPORT_PARSERS];
    30 
    31  // HID class specific descriptor type and length info obtained from HID descriptor
    33 
    34  // Returns HID class specific descriptor length by its type and order number
    35  uint16_t GetHidClassDescrLen(uint8_t type, uint8_t num);
    36 
    37  struct HIDInterface {
    38  struct {
    39  uint8_t bmInterface : 3;
    40  uint8_t bmAltSet : 3;
    41  uint8_t bmProtocol : 2;
    42  };
    43  uint8_t epIndex[maxEpPerInterface + 1]; // We need to make room for the control endpoint as well
    44  };
    45 
    46  uint8_t bConfNum; // configuration number
    47  uint8_t bNumIface; // number of interfaces in the configuration
    48  uint8_t bNumEP; // total number of EP in the configuration
    49  uint32_t qNextPollTime; // next poll time
    50  uint8_t pollInterval;
    51  bool bPollEnable; // poll enable flag
    52 
    53  static const uint16_t constBuffLen = 64; // event buffer length
    54  uint8_t prevBuf[constBuffLen]; // previous event buffer
    55 
    56  void Initialize();
    57  HIDInterface* FindInterface(uint8_t iface, uint8_t alt, uint8_t proto);
    58 
    59  void ZeroMemory(uint8_t len, uint8_t *buf);
    60  bool BuffersIdentical(uint8_t len, uint8_t *buf1, uint8_t *buf2);
    61  void SaveBuffer(uint8_t len, uint8_t *src, uint8_t *dest);
    62 
    63 protected:
    66 
    68 
    69  uint16_t PID, VID; // PID and VID of connected device
    70 
    71  // HID implementation
    72  HIDReportParser* GetReportParser(uint8_t id);
    73 
    74  virtual uint8_t OnInitSuccessful() {
    75  return 0;
    76  };
    77 
    78  virtual void ParseHIDData(USBHID *hid __attribute__((unused)), bool is_rpt_id __attribute__((unused)), uint8_t len __attribute__((unused)), uint8_t *buf __attribute__((unused))) {
    79  return;
    80  };
    81 
    82 public:
    83  HIDUniversal(USB *p);
    84 
    85  // HID implementation
    86  bool SetReportParser(uint8_t id, HIDReportParser *prs);
    87 
    88  // USBDeviceConfig implementation
    89  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    90  uint8_t Release();
    91  uint8_t Poll();
    92 
    93  virtual uint8_t GetAddress() {
    94  return bAddress;
    95  };
    96 
    97  virtual bool isReady() {
    98  return bPollEnable;
    99  };
    100 
    101  // UsbConfigXtracter implementation
    102  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    103 
    104  // Send report - do not mix with SetReport()!
    105  uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr);
    106 };
    107 
    108 #endif // __HIDUNIVERSAL_H__
    uint16_t PID
    Definition: hiduniversal.h:69
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    bool bHasReportId
    Definition: hiduniversal.h:67
    Definition: usbhid.h:143
    @@ -229,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidusagestr_8h.html b/hidusagestr_8h.html index 7118f969..ed33ba30 100644 --- a/hidusagestr_8h.html +++ b/hidusagestr_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidusagestr.h File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,20 +88,52 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidusagestr.h File Reference
    -
    #include "Usb.h"
    +
    #include "Usb.h"
    Include dependency graph for hidusagestr.h:
    - + +
    This graph shows which files directly or indirectly include this file:
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Go to the source code of this file.

    @@ -13858,7 +13891,7 @@ Variables diff --git a/hidusagestr_8h__dep__incl.map b/hidusagestr_8h__dep__incl.map index c9590f4e..85f03829 100644 --- a/hidusagestr_8h__dep__incl.map +++ b/hidusagestr_8h__dep__incl.map @@ -1,33 +1,33 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/hidusagestr_8h__dep__incl.md5 b/hidusagestr_8h__dep__incl.md5 index 0eb2ff23..62d46b1e 100644 --- a/hidusagestr_8h__dep__incl.md5 +++ b/hidusagestr_8h__dep__incl.md5 @@ -1 +1 @@ -d260f18106a148a4ad3a8a96cfefe555 \ No newline at end of file +44208c2c5892f1cc422f061692d78636 \ No newline at end of file diff --git a/hidusagestr_8h__dep__incl.png b/hidusagestr_8h__dep__incl.png index fc4297190a683682e7097cb82c174a2e6b369703..9d83c9d028923d60d82dcc90d6aa02efcbed6226 100644 GIT binary patch literal 52063 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 dZwT*~$9h5Pr#6Zf=&L9w&xBtH)Ybq1 literal 54612 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

    vjRLW{)UEPJ?;5$M>jUfI? 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 diff --git a/hidusagestr_8h__incl.map b/hidusagestr_8h__incl.map index 6fae6dd8..95ce7f8f 100644 --- a/hidusagestr_8h__incl.map +++ b/hidusagestr_8h__incl.map @@ -1,3 +1,3 @@ - + diff --git a/hidusagestr_8h__incl.md5 b/hidusagestr_8h__incl.md5 index 98b0c93e..bc04b8cf 100644 --- a/hidusagestr_8h__incl.md5 +++ b/hidusagestr_8h__incl.md5 @@ -1 +1 @@ -5c963a7b7fd1884b649a89fdccf4c385 \ No newline at end of file +794eccf037bd4feb00fd840fe0fc37b3 \ No newline at end of file diff --git a/hidusagestr_8h__incl.png b/hidusagestr_8h__incl.png index 5d04bb69b4a3f36c5e9d74a58b6ca2d0a0710c02..d4a993ef91b3f76b530afc35f044370e2a287d5f 100644 GIT binary patch literal 2543 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 literal 2519 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 - + USB Host Shield 2.0: hidusagestr.h Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,984 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidusagestr.h
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #if !defined( __HIDUSAGESTR_H__)
    -
    18 #define __HIDUSAGESTR_H__
    -
    19 
    -
    20 #include "Usb.h"
    -
    21 
    -
    22 const char pstrSpace [] PROGMEM = " ";
    -
    23 const char pstrCRLF [] PROGMEM = "\r\n";
    -
    24 const char pstrSingleTab [] PROGMEM = "\t";
    -
    25 const char pstrDoubleTab [] PROGMEM = "\t\t";
    -
    26 const char pstrTripleTab [] PROGMEM = "\t\t\t";
    -
    27 
    -
    28 // Usage Page String Titles
    -
    29 const char pstrUsagePageUndefined [] PROGMEM = "Undef";
    -
    30 const char pstrUsagePageGenericDesktopControls [] PROGMEM = "Gen Desktop Ctrls";
    -
    31 const char pstrUsagePageSimulationControls [] PROGMEM = "Simu Ctrls";
    -
    32 const char pstrUsagePageVRControls [] PROGMEM = "VR Ctrls";
    -
    33 const char pstrUsagePageSportControls [] PROGMEM = "Sport Ctrls";
    -
    34 const char pstrUsagePageGameControls [] PROGMEM = "Game Ctrls";
    -
    35 const char pstrUsagePageGenericDeviceControls [] PROGMEM = "Gen Dev Ctrls";
    -
    36 const char pstrUsagePageKeyboardKeypad [] PROGMEM = "Kbrd/Keypad";
    -
    37 const char pstrUsagePageLEDs [] PROGMEM = "LEDs";
    -
    38 const char pstrUsagePageButton [] PROGMEM = "Button";
    -
    39 const char pstrUsagePageOrdinal [] PROGMEM = "Ordinal";
    -
    40 const char pstrUsagePageTelephone [] PROGMEM = "Tel";
    -
    41 const char pstrUsagePageConsumer [] PROGMEM = "Consumer";
    -
    42 const char pstrUsagePageDigitizer [] PROGMEM = "Digitizer";
    -
    43 const char pstrUsagePagePID [] PROGMEM = "PID";
    -
    44 const char pstrUsagePageUnicode [] PROGMEM = "Unicode";
    -
    45 const char pstrUsagePageAlphaNumericDisplay [] PROGMEM = "Alpha Num Disp";
    -
    46 const char pstrUsagePageMedicalInstruments [] PROGMEM = "Medical Instr";
    -
    47 const char pstrUsagePageMonitor [] PROGMEM = "Monitor";
    -
    48 const char pstrUsagePagePower [] PROGMEM = "Power";
    -
    49 const char pstrUsagePageBarCodeScanner [] PROGMEM = "Bar Code Scan";
    -
    50 const char pstrUsagePageScale [] PROGMEM = "Scale";
    -
    51 const char pstrUsagePageMSRDevices [] PROGMEM = "Magn Stripe Read Dev";
    -
    52 const char pstrUsagePagePointOfSale [] PROGMEM = "POS";
    -
    53 const char pstrUsagePageCameraControl [] PROGMEM = "Cam Ctrl";
    -
    54 const char pstrUsagePageArcade [] PROGMEM = "Arcade";
    -
    55 const char pstrUsagePageReserved [] PROGMEM = "Reserved";
    -
    56 const char pstrUsagePageVendorDefined [] PROGMEM = "Vendor Def";
    -
    57 
    -
    58 // Generic Desktop Controls Page
    -
    59 const char pstrUsagePointer [] PROGMEM = "Pointer";
    -
    60 const char pstrUsageMouse [] PROGMEM = "Mouse";
    -
    61 const char pstrUsageJoystick [] PROGMEM = "Joystick";
    -
    62 const char pstrUsageGamePad [] PROGMEM = "Game Pad";
    -
    63 const char pstrUsageKeyboard [] PROGMEM = "Kbrd";
    -
    64 const char pstrUsageKeypad [] PROGMEM = "Keypad";
    -
    65 const char pstrUsageMultiAxisController [] PROGMEM = "Multi-axis Ctrl";
    -
    66 const char pstrUsageTabletPCSystemControls [] PROGMEM = "Tablet PC Sys Ctrls";
    -
    67 const char pstrUsageX [] PROGMEM = "X";
    -
    68 const char pstrUsageY [] PROGMEM = "Y";
    -
    69 const char pstrUsageZ [] PROGMEM = "Z";
    -
    70 const char pstrUsageRx [] PROGMEM = "Rx";
    -
    71 const char pstrUsageRy [] PROGMEM = "Ry";
    -
    72 const char pstrUsageRz [] PROGMEM = "Rz";
    -
    73 const char pstrUsageSlider [] PROGMEM = "Slider";
    -
    74 const char pstrUsageDial [] PROGMEM = "Dial";
    -
    75 const char pstrUsageWheel [] PROGMEM = "Wheel";
    -
    76 const char pstrUsageHatSwitch [] PROGMEM = "Hat Switch";
    -
    77 const char pstrUsageCountedBuffer [] PROGMEM = "Counted Buf";
    -
    78 const char pstrUsageByteCount [] PROGMEM = "Byte Count";
    -
    79 const char pstrUsageMotionWakeup [] PROGMEM = "Motion Wakeup";
    -
    80 const char pstrUsageStart [] PROGMEM = "Start";
    -
    81 const char pstrUsageSelect [] PROGMEM = "Sel";
    -
    82 const char pstrUsageVx [] PROGMEM = "Vx";
    -
    83 const char pstrUsageVy [] PROGMEM = "Vy";
    -
    84 const char pstrUsageVz [] PROGMEM = "Vz";
    -
    85 const char pstrUsageVbrx [] PROGMEM = "Vbrx";
    -
    86 const char pstrUsageVbry [] PROGMEM = "Vbry";
    -
    87 const char pstrUsageVbrz [] PROGMEM = "Vbrz";
    -
    88 const char pstrUsageVno [] PROGMEM = "Vno";
    -
    89 const char pstrUsageFeatureNotification [] PROGMEM = "Feature Notif";
    -
    90 const char pstrUsageResolutionMultiplier [] PROGMEM = "Res Mult";
    -
    91 const char pstrUsageSystemControl [] PROGMEM = "Sys Ctrl";
    -
    92 const char pstrUsageSystemPowerDown [] PROGMEM = "Sys Pwr Down";
    -
    93 const char pstrUsageSystemSleep [] PROGMEM = "Sys Sleep";
    -
    94 const char pstrUsageSystemWakeup [] PROGMEM = "Sys Wakeup";
    -
    95 const char pstrUsageSystemContextMenu [] PROGMEM = "Sys Context Menu";
    -
    96 const char pstrUsageSystemMainMenu [] PROGMEM = "Sys Main Menu";
    -
    97 const char pstrUsageSystemAppMenu [] PROGMEM = "Sys App Menu";
    -
    98 const char pstrUsageSystemMenuHelp [] PROGMEM = "Sys Menu Help";
    -
    99 const char pstrUsageSystemMenuExit [] PROGMEM = "Sys Menu Exit";
    -
    100 const char pstrUsageSystemMenuSelect [] PROGMEM = "Sys Menu Select";
    -
    101 const char pstrUsageSystemMenuRight [] PROGMEM = "Sys Menu Right";
    -
    102 const char pstrUsageSystemMenuLeft [] PROGMEM = "Sys Menu Left";
    -
    103 const char pstrUsageSystemMenuUp [] PROGMEM = "Sys Menu Up";
    -
    104 const char pstrUsageSystemMenuDown [] PROGMEM = "Sys Menu Down";
    -
    105 const char pstrUsageSystemColdRestart [] PROGMEM = "Sys Cold Restart";
    -
    106 const char pstrUsageSystemWarmRestart [] PROGMEM = "Sys Warm Restart";
    -
    107 const char pstrUsageDPadUp [] PROGMEM = "D-pad Up";
    -
    108 const char pstrUsageDPadDown [] PROGMEM = "D-pad Down";
    -
    109 const char pstrUsageDPadRight [] PROGMEM = "D-pad Right";
    -
    110 const char pstrUsageDPadLeft [] PROGMEM = "D-pad Left";
    -
    111 const char pstrUsageSystemDock [] PROGMEM = "Sys Dock";
    -
    112 const char pstrUsageSystemUndock [] PROGMEM = "Sys Undock";
    -
    113 const char pstrUsageSystemSetup [] PROGMEM = "Sys Setup";
    -
    114 const char pstrUsageSystemBreak [] PROGMEM = "Sys Break";
    -
    115 const char pstrUsageSystemDebuggerBreak [] PROGMEM = "Sys Dbg Brk";
    -
    116 const char pstrUsageApplicationBreak [] PROGMEM = "App Break";
    -
    117 const char pstrUsageApplicationDebuggerBreak [] PROGMEM = "App Dbg Brk";
    -
    118 const char pstrUsageSystemSpeakerMute [] PROGMEM = "Sys Spk Mute";
    -
    119 const char pstrUsageSystemHibernate [] PROGMEM = "Sys Hiber";
    -
    120 const char pstrUsageSystemDisplayInvert [] PROGMEM = "Sys Disp Inv";
    -
    121 const char pstrUsageSystemDisplayInternal [] PROGMEM = "Sys Disp Int";
    -
    122 const char pstrUsageSystemDisplayExternal [] PROGMEM = "Sys Disp Ext";
    -
    123 const char pstrUsageSystemDisplayBoth [] PROGMEM = "Sys Disp Both";
    -
    124 const char pstrUsageSystemDisplayDual [] PROGMEM = "Sys Disp Dual";
    -
    125 const char pstrUsageSystemDisplayToggleIntExt [] PROGMEM = "Sys Disp Tgl Int/Ext";
    -
    126 const char pstrUsageSystemDisplaySwapPriSec [] PROGMEM = "Sys Disp Swap Pri/Sec";
    -
    127 const char pstrUsageSystemDisplayLCDAutoscale [] PROGMEM = "Sys Disp LCD Autoscale";
    -
    128 
    -
    129 // Simulation Controls Page
    -
    130 const char pstrUsageFlightSimulationDevice [] PROGMEM = "Flight Simu Dev";
    -
    131 const char pstrUsageAutomobileSimulationDevice [] PROGMEM = "Auto Simu Dev";
    -
    132 const char pstrUsageTankSimulationDevice [] PROGMEM = "Tank Simu Dev";
    -
    133 const char pstrUsageSpaceshipSimulationDevice [] PROGMEM = "Space Simu Dev";
    -
    134 const char pstrUsageSubmarineSimulationDevice [] PROGMEM = "Subm Simu Dev";
    -
    135 const char pstrUsageSailingSimulationDevice [] PROGMEM = "Sail Simu Dev";
    -
    136 const char pstrUsageMotocicleSimulationDevice [] PROGMEM = "Moto Simu Dev";
    -
    137 const char pstrUsageSportsSimulationDevice [] PROGMEM = "Sport Simu Dev";
    -
    138 const char pstrUsageAirplaneSimulationDevice [] PROGMEM = "Airp Simu Dev";
    -
    139 const char pstrUsageHelicopterSimulationDevice [] PROGMEM = "Heli Simu Dev";
    -
    140 const char pstrUsageMagicCarpetSimulationDevice [] PROGMEM = "Magic Carpet Simu Dev";
    -
    141 const char pstrUsageBicycleSimulationDevice [] PROGMEM = "Bike Simu Dev";
    -
    142 const char pstrUsageFlightControlStick [] PROGMEM = "Flight Ctrl Stick";
    -
    143 const char pstrUsageFlightStick [] PROGMEM = "Flight Stick";
    -
    144 const char pstrUsageCyclicControl [] PROGMEM = "Cyclic Ctrl";
    -
    145 const char pstrUsageCyclicTrim [] PROGMEM = "Cyclic Trim";
    -
    146 const char pstrUsageFlightYoke [] PROGMEM = "Flight Yoke";
    -
    147 const char pstrUsageTrackControl [] PROGMEM = "Track Ctrl";
    -
    148 const char pstrUsageAileron [] PROGMEM = "Aileron";
    -
    149 const char pstrUsageAileronTrim [] PROGMEM = "Aileron Trim";
    -
    150 const char pstrUsageAntiTorqueControl [] PROGMEM = "Anti-Torque Ctrl";
    -
    151 const char pstrUsageAutopilotEnable [] PROGMEM = "Autopilot Enable";
    -
    152 const char pstrUsageChaffRelease [] PROGMEM = "Chaff Release";
    -
    153 const char pstrUsageCollectiveControl [] PROGMEM = "Collective Ctrl";
    -
    154 const char pstrUsageDiveBrake [] PROGMEM = "Dive Brake";
    -
    155 const char pstrUsageElectronicCountermeasures [] PROGMEM = "El Countermeasures";
    -
    156 const char pstrUsageElevator [] PROGMEM = "Elevator";
    -
    157 const char pstrUsageElevatorTrim [] PROGMEM = "Elevator Trim";
    -
    158 const char pstrUsageRudder [] PROGMEM = "Rudder";
    -
    159 const char pstrUsageThrottle [] PROGMEM = "Throttle";
    -
    160 const char pstrUsageFlightCommunications [] PROGMEM = "Flight Comm";
    -
    161 const char pstrUsageFlareRelease [] PROGMEM = "Flare Release";
    -
    162 const char pstrUsageLandingGear [] PROGMEM = "Landing Gear";
    -
    163 const char pstrUsageToeBrake [] PROGMEM = "Toe Brake";
    -
    164 const char pstrUsageTrigger [] PROGMEM = "Trigger";
    -
    165 const char pstrUsageWeaponsArm [] PROGMEM = "Weapons Arm";
    -
    166 const char pstrUsageWeaponsSelect [] PROGMEM = "Weapons Sel";
    -
    167 const char pstrUsageWingFlaps [] PROGMEM = "Wing Flaps";
    -
    168 const char pstrUsageAccelerator [] PROGMEM = "Accel";
    -
    169 const char pstrUsageBrake [] PROGMEM = "Brake";
    -
    170 const char pstrUsageClutch [] PROGMEM = "Clutch";
    -
    171 const char pstrUsageShifter [] PROGMEM = "Shifter";
    -
    172 const char pstrUsageSteering [] PROGMEM = "Steering";
    -
    173 const char pstrUsageTurretDirection [] PROGMEM = "Turret Dir";
    -
    174 const char pstrUsageBarrelElevation [] PROGMEM = "Barrel Ele";
    -
    175 const char pstrUsageDivePlane [] PROGMEM = "Dive Plane";
    -
    176 const char pstrUsageBallast [] PROGMEM = "Ballast";
    -
    177 const char pstrUsageBicycleCrank [] PROGMEM = "Bicycle Crank";
    -
    178 const char pstrUsageHandleBars [] PROGMEM = "Handle Bars";
    -
    179 const char pstrUsageFrontBrake [] PROGMEM = "Front Brake";
    -
    180 const char pstrUsageRearBrake [] PROGMEM = "Rear Brake";
    -
    181 
    -
    182 // VR Controls Page
    -
    183 const char pstrUsageBelt [] PROGMEM = "Belt";
    -
    184 const char pstrUsageBodySuit [] PROGMEM = "Body Suit";
    -
    185 const char pstrUsageFlexor [] PROGMEM = "Flexor";
    -
    186 const char pstrUsageGlove [] PROGMEM = "Glove";
    -
    187 const char pstrUsageHeadTracker [] PROGMEM = "Head Track";
    -
    188 const char pstrUsageHeadMountedDisplay [] PROGMEM = "Head Disp";
    -
    189 const char pstrUsageHandTracker [] PROGMEM = "Hand Track";
    -
    190 const char pstrUsageOculometer [] PROGMEM = "Oculometer";
    -
    191 const char pstrUsageVest [] PROGMEM = "Vest";
    -
    192 const char pstrUsageAnimatronicDevice [] PROGMEM = "Animat Dev";
    -
    193 const char pstrUsageStereoEnable [] PROGMEM = "Stereo Enbl";
    -
    194 const char pstrUsageDisplayEnable [] PROGMEM = "Display Enbl";
    -
    195 
    -
    196 // Sport Controls Page
    -
    197 const char pstrUsageBaseballBat [] PROGMEM = "Baseball Bat";
    -
    198 const char pstrUsageGolfClub [] PROGMEM = "Golf Club";
    -
    199 const char pstrUsageRowingMachine [] PROGMEM = "Rowing Mach";
    -
    200 const char pstrUsageTreadmill [] PROGMEM = "Treadmill";
    -
    201 const char pstrUsageOar [] PROGMEM = "Oar";
    -
    202 const char pstrUsageSlope [] PROGMEM = "Slope";
    -
    203 const char pstrUsageRate [] PROGMEM = "Rate";
    -
    204 const char pstrUsageStickSpeed [] PROGMEM = "Stick Speed";
    -
    205 const char pstrUsageStickFaceAngle [] PROGMEM = "Stick Face Ang";
    -
    206 const char pstrUsageStickHeelToe [] PROGMEM = "Stick Heel/Toe";
    -
    207 const char pstrUsageStickFollowThough [] PROGMEM = "Stick Flw Thru";
    -
    208 const char pstrUsageStickTempo [] PROGMEM = "Stick Tempo";
    -
    209 const char pstrUsageStickType [] PROGMEM = "Stick Type";
    -
    210 const char pstrUsageStickHeight [] PROGMEM = "Stick Hght";
    -
    211 const char pstrUsagePutter [] PROGMEM = "Putter";
    -
    212 const char pstrUsage1Iron [] PROGMEM = "1 Iron";
    -
    213 const char pstrUsage2Iron [] PROGMEM = "2 Iron";
    -
    214 const char pstrUsage3Iron [] PROGMEM = "3 Iron";
    -
    215 const char pstrUsage4Iron [] PROGMEM = "4 Iron";
    -
    216 const char pstrUsage5Iron [] PROGMEM = "5 Iron";
    -
    217 const char pstrUsage6Iron [] PROGMEM = "6 Iron";
    -
    218 const char pstrUsage7Iron [] PROGMEM = "7 Iron";
    -
    219 const char pstrUsage8Iron [] PROGMEM = "8 Iron";
    -
    220 const char pstrUsage9Iron [] PROGMEM = "9 Iron";
    -
    221 const char pstrUsage10Iron [] PROGMEM = "10 Iron";
    -
    222 const char pstrUsage11Iron [] PROGMEM = "11 Iron";
    -
    223 const char pstrUsageSandWedge [] PROGMEM = "Sand Wedge";
    -
    224 const char pstrUsageLoftWedge [] PROGMEM = "Loft Wedge";
    -
    225 const char pstrUsagePowerWedge [] PROGMEM = "Pwr Wedge";
    -
    226 const char pstrUsage1Wood [] PROGMEM = "1 Wood";
    -
    227 const char pstrUsage3Wood [] PROGMEM = "3 Wood";
    -
    228 const char pstrUsage5Wood [] PROGMEM = "5 Wood";
    -
    229 const char pstrUsage7Wood [] PROGMEM = "7 Wood";
    -
    230 const char pstrUsage9Wood [] PROGMEM = "9 Wood";
    -
    231 
    -
    232 // Game Controls Page
    -
    233 const char pstrUsage3DGameController [] PROGMEM = "3D Game Ctrl";
    -
    234 const char pstrUsagePinballDevice [] PROGMEM = "Pinball Dev";
    -
    235 const char pstrUsageGunDevice [] PROGMEM = "Gun Dev";
    -
    236 const char pstrUsagePointOfView [] PROGMEM = "POV";
    -
    237 const char pstrUsageTurnRightLeft [] PROGMEM = "Turn Right Left";
    -
    238 const char pstrUsagePitchForwardBackward [] PROGMEM = "Pitch Fwd/Back";
    -
    239 const char pstrUsageRollRightLeft [] PROGMEM = "Roll Right/Left";
    -
    240 const char pstrUsageMoveRightLeft [] PROGMEM = "Move Right/Left";
    -
    241 const char pstrUsageMoveForwardBackward [] PROGMEM = "Move Fwd/Back";
    -
    242 const char pstrUsageMoveUpDown [] PROGMEM = "Move Up/Down";
    -
    243 const char pstrUsageLeanRightLeft [] PROGMEM = "Lean Right/Left";
    -
    244 const char pstrUsageLeanForwardBackward [] PROGMEM = "Lean Fwd/Back";
    -
    245 const char pstrUsageHeightOfPOV [] PROGMEM = "Height of POV";
    -
    246 const char pstrUsageFlipper [] PROGMEM = "Flipper";
    -
    247 const char pstrUsageSecondaryFlipper [] PROGMEM = "Second Flipper";
    -
    248 const char pstrUsageBump [] PROGMEM = "Bump";
    -
    249 const char pstrUsageNewGame [] PROGMEM = "New Game";
    -
    250 const char pstrUsageShootBall [] PROGMEM = "Shoot Ball";
    -
    251 const char pstrUsagePlayer [] PROGMEM = "Player";
    -
    252 const char pstrUsageGunBolt [] PROGMEM = "Gun Bolt";
    -
    253 const char pstrUsageGunClip [] PROGMEM = "Gun Clip";
    -
    254 const char pstrUsageGunSelector [] PROGMEM = "Gun Sel";
    -
    255 const char pstrUsageGunSingleShot [] PROGMEM = "Gun Sngl Shot";
    -
    256 const char pstrUsageGunBurst [] PROGMEM = "Gun Burst";
    -
    257 const char pstrUsageGunAutomatic [] PROGMEM = "Gun Auto";
    -
    258 const char pstrUsageGunSafety [] PROGMEM = "Gun Safety";
    -
    259 const char pstrUsageGamepadFireJump [] PROGMEM = "Gamepad Fire/Jump";
    -
    260 const char pstrUsageGamepadTrigger [] PROGMEM = "Gamepad Trig";
    -
    261 
    -
    262 // Generic Device Controls Page
    -
    263 const char pstrUsageBatteryStrength [] PROGMEM = "Bat Strength";
    -
    264 const char pstrUsageWirelessChannel [] PROGMEM = "Wireless Ch";
    -
    265 const char pstrUsageWirelessID [] PROGMEM = "Wireless ID";
    -
    266 const char pstrUsageDiscoverWirelessControl [] PROGMEM = "Discover Wireless Ctrl";
    -
    267 const char pstrUsageSecurityCodeCharEntered [] PROGMEM = "Sec Code Char Entrd";
    -
    268 const char pstrUsageSecurityCodeCharErased [] PROGMEM = "Sec Code Char Erased";
    -
    269 const char pstrUsageSecurityCodeCleared [] PROGMEM = "Sec Code Cleared";
    -
    270 
    -
    271 // LED Page
    -
    272 const char pstrUsageNumLock [] PROGMEM = "Num Lock";
    -
    273 const char pstrUsageCapsLock [] PROGMEM = "Caps Lock";
    -
    274 const char pstrUsageScrollLock [] PROGMEM = "Scroll Lock";
    -
    275 const char pstrUsageCompose [] PROGMEM = "Compose";
    -
    276 const char pstrUsageKana [] PROGMEM = "Kana";
    -
    277 const char pstrUsagePower [] PROGMEM = "Pwr";
    -
    278 const char pstrUsageShift [] PROGMEM = "Shift";
    -
    279 const char pstrUsageDoNotDisturb [] PROGMEM = "DND";
    -
    280 const char pstrUsageMute [] PROGMEM = "Mute";
    -
    281 const char pstrUsageToneEnable [] PROGMEM = "Tone Enbl";
    -
    282 const char pstrUsageHighCutFilter [] PROGMEM = "High Cut Fltr";
    -
    283 const char pstrUsageLowCutFilter [] PROGMEM = "Low Cut Fltr";
    -
    284 const char pstrUsageEqualizerEnable [] PROGMEM = "Eq Enbl";
    -
    285 const char pstrUsageSoundFieldOn [] PROGMEM = "Sound Field On";
    -
    286 const char pstrUsageSurroundOn [] PROGMEM = "Surround On";
    -
    287 const char pstrUsageRepeat [] PROGMEM = "Repeat";
    -
    288 const char pstrUsageStereo [] PROGMEM = "Stereo";
    -
    289 const char pstrUsageSamplingRateDetect [] PROGMEM = "Smpl Rate Detect";
    -
    290 const char pstrUsageSpinning [] PROGMEM = "Spinning";
    -
    291 const char pstrUsageCAV [] PROGMEM = "CAV";
    -
    292 const char pstrUsageCLV [] PROGMEM = "CLV";
    -
    293 const char pstrUsageRecordingFormatDetect [] PROGMEM = "Rec Format Detect";
    -
    294 const char pstrUsageOffHook [] PROGMEM = "Off Hook";
    -
    295 const char pstrUsageRing [] PROGMEM = "Ring";
    -
    296 const char pstrUsageMessageWaiting [] PROGMEM = "Msg Wait";
    -
    297 const char pstrUsageDataMode [] PROGMEM = "Data Mode";
    -
    298 const char pstrUsageBatteryOperation [] PROGMEM = "Bat Op";
    -
    299 const char pstrUsageBatteryOK [] PROGMEM = "Bat OK";
    -
    300 const char pstrUsageBatteryLow [] PROGMEM = "Bat Low";
    -
    301 const char pstrUsageSpeaker [] PROGMEM = "Speaker";
    -
    302 const char pstrUsageHeadSet [] PROGMEM = "Head Set";
    -
    303 const char pstrUsageHold [] PROGMEM = "Hold";
    -
    304 const char pstrUsageMicrophone [] PROGMEM = "Mic";
    -
    305 const char pstrUsageCoverage [] PROGMEM = "Coverage";
    -
    306 const char pstrUsageNightMode [] PROGMEM = "Night Mode";
    -
    307 const char pstrUsageSendCalls [] PROGMEM = "Send Calls";
    -
    308 const char pstrUsageCallPickup [] PROGMEM = "Call Pickup";
    -
    309 const char pstrUsageConference [] PROGMEM = "Conf";
    -
    310 const char pstrUsageStandBy [] PROGMEM = "Stand-by";
    -
    311 const char pstrUsageCameraOn [] PROGMEM = "Cam On";
    -
    312 const char pstrUsageCameraOff [] PROGMEM = "Cam Off";
    -
    313 const char pstrUsageOnLine [] PROGMEM = "On-Line";
    -
    314 const char pstrUsageOffLine [] PROGMEM = "Off-Line";
    -
    315 const char pstrUsageBusy [] PROGMEM = "Busy";
    -
    316 const char pstrUsageReady [] PROGMEM = "Ready";
    -
    317 const char pstrUsagePaperOut [] PROGMEM = "Paper Out";
    -
    318 const char pstrUsagePaperJam [] PROGMEM = "Paper Jam";
    -
    319 const char pstrUsageRemote [] PROGMEM = "Remote";
    -
    320 const char pstrUsageForward [] PROGMEM = "Fwd";
    -
    321 const char pstrUsageReverse [] PROGMEM = "Rev";
    -
    322 const char pstrUsageStop [] PROGMEM = "Stop";
    -
    323 const char pstrUsageRewind [] PROGMEM = "Rewind";
    -
    324 const char pstrUsageFastForward [] PROGMEM = "Fast Fwd";
    -
    325 const char pstrUsagePlay [] PROGMEM = "Play";
    -
    326 const char pstrUsagePause [] PROGMEM = "Pause";
    -
    327 const char pstrUsageRecord [] PROGMEM = "Rec";
    -
    328 const char pstrUsageError [] PROGMEM = "Error";
    -
    329 const char pstrUsageSelectedIndicator [] PROGMEM = "Usage Sel Ind";
    -
    330 const char pstrUsageInUseIndicator [] PROGMEM = "Usage In Use Ind";
    -
    331 const char pstrUsageMultiModeIndicator [] PROGMEM = "Usage Multi Mode Ind";
    -
    332 const char pstrUsageIndicatorOn [] PROGMEM = "Ind On";
    -
    333 const char pstrUsageIndicatorFlash [] PROGMEM = "Ind Flash";
    -
    334 const char pstrUsageIndicatorSlowBlink [] PROGMEM = "Ind Slow Blk";
    -
    335 const char pstrUsageIndicatorFastBlink [] PROGMEM = "Ind Fast Blk";
    -
    336 const char pstrUsageIndicatorOff [] PROGMEM = "Ind Off";
    -
    337 const char pstrUsageFlashOnTime [] PROGMEM = "Flash On Time";
    -
    338 const char pstrUsageSlowBlinkOnTime [] PROGMEM = "Slow Blk On Time";
    -
    339 const char pstrUsageSlowBlinkOffTime [] PROGMEM = "Slow Blk Off Time";
    -
    340 const char pstrUsageFastBlinkOnTime [] PROGMEM = "Fast Blk On Time";
    -
    341 const char pstrUsageFastBlinkOffTime [] PROGMEM = "Fast Blk Off Time";
    -
    342 const char pstrUsageIndicatorColor [] PROGMEM = "Usage Ind Color";
    -
    343 const char pstrUsageIndicatorRed [] PROGMEM = "Ind Red";
    -
    344 const char pstrUsageIndicatorGreen [] PROGMEM = "Ind Green";
    -
    345 const char pstrUsageIndicatorAmber [] PROGMEM = "Ind Amber";
    -
    346 const char pstrUsageGenericIndicator [] PROGMEM = "Gen Ind";
    -
    347 const char pstrUsageSystemSuspend [] PROGMEM = "Sys Suspend";
    -
    348 const char pstrUsageExternalPowerConnected [] PROGMEM = "Ext Pwr Conn";
    -
    349 
    -
    350 // Telephony Usage Page
    -
    351 const char pstrUsagePhone [] PROGMEM = "Phone";
    -
    352 const char pstrUsageAnsweringMachine [] PROGMEM = "Answ Mach";
    -
    353 const char pstrUsageMessageControls [] PROGMEM = "Msg Ctrls";
    -
    354 const char pstrUsageHandset [] PROGMEM = "Handset";
    -
    355 const char pstrUsageHeadset [] PROGMEM = "Headset";
    -
    356 const char pstrUsageTelephonyKeyPad [] PROGMEM = "Tel Key Pad";
    -
    357 const char pstrUsageProgrammableButton [] PROGMEM = "Prog Button";
    -
    358 const char pstrUsageHookSwitch [] PROGMEM = "Hook Sw";
    -
    359 const char pstrUsageFlash [] PROGMEM = "Flash";
    -
    360 const char pstrUsageFeature [] PROGMEM = "Feature";
    -
    361 //const char pstrUsageHold [] PROGMEM = "Hold";
    -
    362 const char pstrUsageRedial [] PROGMEM = "Redial";
    -
    363 const char pstrUsageTransfer [] PROGMEM = "Transfer";
    -
    364 const char pstrUsageDrop [] PROGMEM = "Drop";
    -
    365 const char pstrUsagePark [] PROGMEM = "Park";
    -
    366 const char pstrUsageForwardCalls [] PROGMEM = "Fwd Calls";
    -
    367 const char pstrUsageAlternateFunction [] PROGMEM = "Alt Func";
    -
    368 const char pstrUsageLine [] PROGMEM = "Line";
    -
    369 const char pstrUsageSpeakerPhone [] PROGMEM = "Spk Phone";
    -
    370 //const char pstrUsageConference [] PROGMEM = "Conference";
    -
    371 const char pstrUsageRingEnable [] PROGMEM = "Ring Enbl";
    -
    372 const char pstrUsageRingSelect [] PROGMEM = "Ring Sel";
    -
    373 const char pstrUsagePhoneMute [] PROGMEM = "Phone Mute";
    -
    374 const char pstrUsageCallerID [] PROGMEM = "Caller ID";
    -
    375 const char pstrUsageSend [] PROGMEM = "Send";
    -
    376 const char pstrUsageSpeedDial [] PROGMEM = "Speed Dial";
    -
    377 const char pstrUsageStoreNumber [] PROGMEM = "Store Num";
    -
    378 const char pstrUsageRecallNumber [] PROGMEM = "Recall Num";
    -
    379 const char pstrUsagePhoneDirectory [] PROGMEM = "Phone Dir";
    -
    380 const char pstrUsageVoiceMail [] PROGMEM = "Voice Mail";
    -
    381 const char pstrUsageScreenCalls [] PROGMEM = "Screen Calls";
    -
    382 //const char pstrUsageDoNotDisturb [] PROGMEM = "Do Not Disturb";
    -
    383 const char pstrUsageMessage [] PROGMEM = "Msg";
    -
    384 const char pstrUsageAnswerOnOff [] PROGMEM = "Answer On/Off";
    -
    385 const char pstrUsageInsideDialTone [] PROGMEM = "Inside Dial Tone";
    -
    386 const char pstrUsageOutsideDialTone [] PROGMEM = "Outside Dial Tone";
    -
    387 const char pstrUsageInsideRingTone [] PROGMEM = "Inside Ring Tone";
    -
    388 const char pstrUsageOutsideRingTone [] PROGMEM = "Outside Ring Tone";
    -
    389 const char pstrUsagePriorityRingTone [] PROGMEM = "Prior Ring Tone";
    -
    390 const char pstrUsageInsideRingback [] PROGMEM = "Inside Ringback";
    -
    391 const char pstrUsagePriorityRingback [] PROGMEM = "Priority Ringback";
    -
    392 const char pstrUsageLineBusyTone [] PROGMEM = "Ln Busy Tone";
    -
    393 const char pstrUsageReorderTone [] PROGMEM = "Reorder Tone";
    -
    394 const char pstrUsageCallWaitingTone [] PROGMEM = "Call Wait Tone";
    -
    395 const char pstrUsageConfirmationTone1 [] PROGMEM = "Cnfrm Tone1";
    -
    396 const char pstrUsageConfirmationTone2 [] PROGMEM = "Cnfrm Tone2";
    -
    397 const char pstrUsageTonesOff [] PROGMEM = "Tones Off";
    -
    398 const char pstrUsageOutsideRingback [] PROGMEM = "Outside Ringback";
    -
    399 const char pstrUsageRinger [] PROGMEM = "Ringer";
    -
    400 const char pstrUsagePhoneKey0 [] PROGMEM = "0";
    -
    401 const char pstrUsagePhoneKey1 [] PROGMEM = "1";
    -
    402 const char pstrUsagePhoneKey2 [] PROGMEM = "2";
    -
    403 const char pstrUsagePhoneKey3 [] PROGMEM = "3";
    -
    404 const char pstrUsagePhoneKey4 [] PROGMEM = "4";
    -
    405 const char pstrUsagePhoneKey5 [] PROGMEM = "5";
    -
    406 const char pstrUsagePhoneKey6 [] PROGMEM = "6";
    -
    407 const char pstrUsagePhoneKey7 [] PROGMEM = "7";
    -
    408 const char pstrUsagePhoneKey8 [] PROGMEM = "8";
    -
    409 const char pstrUsagePhoneKey9 [] PROGMEM = "9";
    -
    410 const char pstrUsagePhoneKeyStar [] PROGMEM = "*";
    -
    411 const char pstrUsagePhoneKeyPound [] PROGMEM = "#";
    -
    412 const char pstrUsagePhoneKeyA [] PROGMEM = "A";
    -
    413 const char pstrUsagePhoneKeyB [] PROGMEM = "B";
    -
    414 const char pstrUsagePhoneKeyC [] PROGMEM = "C";
    -
    415 const char pstrUsagePhoneKeyD [] PROGMEM = "D";
    -
    416 
    -
    417 // Consumer Usage Page
    -
    418 const char pstrUsageConsumerControl [] PROGMEM = "Consumer Ctrl";
    -
    419 const char pstrUsageNumericKeyPad [] PROGMEM = "Num Key Pad";
    -
    420 //const char pstrUsageProgrammableButton [] PROGMEM = "Prog Btn";
    -
    421 //const char pstrUsageMicrophone [] PROGMEM = "Mic";
    -
    422 const char pstrUsageHeadphone [] PROGMEM = "Headphone";
    -
    423 const char pstrUsageGraphicEqualizer [] PROGMEM = "Graph Eq";
    -
    424 const char pstrUsagePlus10 [] PROGMEM = "+10";
    -
    425 const char pstrUsagePlus100 [] PROGMEM = "+100";
    -
    426 const char pstrUsageAMPM [] PROGMEM = "AM/PM";
    -
    427 //const char pstrUsagePower [] PROGMEM = "Pwr";
    -
    428 const char pstrUsageReset [] PROGMEM = "Reset";
    -
    429 const char pstrUsageSleep [] PROGMEM = "Sleep";
    -
    430 const char pstrUsageSleepAfter [] PROGMEM = "Sleep After";
    -
    431 const char pstrUsageSleepMode [] PROGMEM = "Sleep Mode";
    -
    432 const char pstrUsageIllumination [] PROGMEM = "Illumin";
    -
    433 const char pstrUsageFunctionButtons [] PROGMEM = "Func Btns";
    -
    434 const char pstrUsageMenu [] PROGMEM = "Menu";
    -
    435 const char pstrUsageMenuPick [] PROGMEM = "Menu Pick";
    -
    436 const char pstrUsageMenuUp [] PROGMEM = "Menu Up";
    -
    437 const char pstrUsageMenuDown [] PROGMEM = "Menu Down";
    -
    438 const char pstrUsageMenuLeft [] PROGMEM = "Menu Left";
    -
    439 const char pstrUsageMenuRight [] PROGMEM = "Menu Right";
    -
    440 const char pstrUsageMenuEscape [] PROGMEM = "Menu Esc";
    -
    441 const char pstrUsageMenuValueIncrease [] PROGMEM = "Menu Val Inc";
    -
    442 const char pstrUsageMenuValueDecrease [] PROGMEM = "Menu Val Dec";
    -
    443 const char pstrUsageDataOnScreen [] PROGMEM = "Data On Scr";
    -
    444 const char pstrUsageClosedCaption [] PROGMEM = "Closed Cptn";
    -
    445 const char pstrUsageClosedCaptionSelect [] PROGMEM = "Closed Cptn Sel";
    -
    446 const char pstrUsageVCRTV [] PROGMEM = "VCR/TV";
    -
    447 const char pstrUsageBroadcastMode [] PROGMEM = "Brdcast Mode";
    -
    448 const char pstrUsageSnapshot [] PROGMEM = "Snapshot";
    -
    449 const char pstrUsageStill [] PROGMEM = "Still";
    -
    450 const char pstrUsageSelection [] PROGMEM = "Sel";
    -
    451 const char pstrUsageAssignSelection [] PROGMEM = "Assign Sel";
    -
    452 const char pstrUsageModeStep [] PROGMEM = "Mode Step";
    -
    453 const char pstrUsageRecallLast [] PROGMEM = "Recall Last";
    -
    454 const char pstrUsageEnterChannel [] PROGMEM = "Entr Channel";
    -
    455 const char pstrUsageOrderMovie [] PROGMEM = "Ord Movie";
    -
    456 const char pstrUsageChannel [] PROGMEM = "Channel";
    -
    457 const char pstrUsageMediaSelection [] PROGMEM = "Med Sel";
    -
    458 const char pstrUsageMediaSelectComputer [] PROGMEM = "Med Sel Comp";
    -
    459 const char pstrUsageMediaSelectTV [] PROGMEM = "Med Sel TV";
    -
    460 const char pstrUsageMediaSelectWWW [] PROGMEM = "Med Sel WWW";
    -
    461 const char pstrUsageMediaSelectDVD [] PROGMEM = "Med Sel DVD";
    -
    462 const char pstrUsageMediaSelectTelephone [] PROGMEM = "Med Sel Tel";
    -
    463 const char pstrUsageMediaSelectProgramGuide [] PROGMEM = "Med Sel PG";
    -
    464 const char pstrUsageMediaSelectVideoPhone [] PROGMEM = "Med Sel Vid";
    -
    465 const char pstrUsageMediaSelectGames [] PROGMEM = "Med Sel Games";
    -
    466 const char pstrUsageMediaSelectMessages [] PROGMEM = "Med Sel Msg";
    -
    467 const char pstrUsageMediaSelectCD [] PROGMEM = "Med Sel CD";
    -
    468 const char pstrUsageMediaSelectVCR [] PROGMEM = "Med Sel VCR";
    -
    469 const char pstrUsageMediaSelectTuner [] PROGMEM = "Med Sel Tuner";
    -
    470 const char pstrUsageQuit [] PROGMEM = "Quit";
    -
    471 const char pstrUsageHelp [] PROGMEM = "Help";
    -
    472 const char pstrUsageMediaSelectTape [] PROGMEM = "Med Sel Tape";
    -
    473 const char pstrUsageMediaSelectCable [] PROGMEM = "Med Sel Cbl";
    -
    474 const char pstrUsageMediaSelectSatellite [] PROGMEM = "Med Sel Sat";
    -
    475 const char pstrUsageMediaSelectSecurity [] PROGMEM = "Med Sel Secur";
    -
    476 const char pstrUsageMediaSelectHome [] PROGMEM = "Med Sel Home";
    -
    477 const char pstrUsageMediaSelectCall [] PROGMEM = "Med Sel Call";
    -
    478 const char pstrUsageChannelIncrement [] PROGMEM = "Ch Inc";
    -
    479 const char pstrUsageChannelDecrement [] PROGMEM = "Ch Dec";
    -
    480 const char pstrUsageMediaSelectSAP [] PROGMEM = "Med Sel SAP";
    -
    481 const char pstrUsageVCRPlus [] PROGMEM = "VCR+";
    -
    482 const char pstrUsageOnce [] PROGMEM = "Once";
    -
    483 const char pstrUsageDaily [] PROGMEM = "Daily";
    -
    484 const char pstrUsageWeekly [] PROGMEM = "Weekly";
    -
    485 const char pstrUsageMonthly [] PROGMEM = "Monthly";
    -
    486 //const char pstrUsagePlay [] PROGMEM = "Play";
    -
    487 //const char pstrUsagePause [] PROGMEM = "Pause";
    -
    488 //const char pstrUsageRecord [] PROGMEM = "Rec";
    -
    489 //const char pstrUsageFastForward [] PROGMEM = "FF";
    -
    490 //const char pstrUsageRewind [] PROGMEM = "Rewind";
    -
    491 const char pstrUsageScanNextTrack [] PROGMEM = "Next Track";
    -
    492 const char pstrUsageScanPreviousTrack [] PROGMEM = "Prev Track";
    -
    493 //const char pstrUsageStop [] PROGMEM = "Stop";
    -
    494 const char pstrUsageEject [] PROGMEM = "Eject";
    -
    495 const char pstrUsageRandomPlay [] PROGMEM = "Random";
    -
    496 const char pstrUsageSelectDisk [] PROGMEM = "Sel Disk";
    -
    497 const char pstrUsageEnterDisk [] PROGMEM = "Ent Disk";
    -
    498 //const char pstrUsageRepeat [] PROGMEM = "Repeat";
    -
    499 const char pstrUsageTracking [] PROGMEM = "Tracking";
    -
    500 const char pstrUsageTrackNormal [] PROGMEM = "Trk Norm";
    -
    501 const char pstrUsageSlowTracking [] PROGMEM = "Slow Trk";
    -
    502 const char pstrUsageFrameForward [] PROGMEM = "Frm Fwd";
    -
    503 const char pstrUsageFrameBackwards [] PROGMEM = "Frm Back";
    -
    504 const char pstrUsageMark [] PROGMEM = "Mark";
    -
    505 const char pstrUsageClearMark [] PROGMEM = "Clr Mark";
    -
    506 const char pstrUsageRepeatFromMark [] PROGMEM = "Rpt Mark";
    -
    507 const char pstrUsageReturnToMark [] PROGMEM = "Ret to Mark";
    -
    508 const char pstrUsageSearchMarkForward [] PROGMEM = "Search Mark Fwd";
    -
    509 const char pstrUsageSearchMarkBackwards [] PROGMEM = "Search Mark Back";
    -
    510 const char pstrUsageCounterReset [] PROGMEM = "Counter Reset";
    -
    511 const char pstrUsageShowCounter [] PROGMEM = "Show Counter";
    -
    512 const char pstrUsageTrackingIncrement [] PROGMEM = "Track Inc";
    -
    513 const char pstrUsageTrackingDecrement [] PROGMEM = "Track Dec";
    -
    514 const char pstrUsageStopEject [] PROGMEM = "Stop/Eject";
    -
    515 const char pstrUsagePlayPause [] PROGMEM = "Play/Pause";
    -
    516 const char pstrUsagePlaySkip [] PROGMEM = "Play/Skip";
    -
    517 const char pstrUsageVolume [] PROGMEM = "Vol";
    -
    518 const char pstrUsageBalance [] PROGMEM = "Balance";
    -
    519 //const char pstrUsageMute [] PROGMEM = "Mute";
    -
    520 const char pstrUsageBass [] PROGMEM = "Bass";
    -
    521 const char pstrUsageTreble [] PROGMEM = "Treble";
    -
    522 const char pstrUsageBassBoost [] PROGMEM = "Bass Boost";
    -
    523 const char pstrUsageSurroundMode [] PROGMEM = "Surround";
    -
    524 const char pstrUsageLoudness [] PROGMEM = "Loud";
    -
    525 const char pstrUsageMPX [] PROGMEM = "MPX";
    -
    526 const char pstrUsageVolumeIncrement [] PROGMEM = "Vol Inc";
    -
    527 const char pstrUsageVolumeDecrement [] PROGMEM = "Vol Dec";
    -
    528 const char pstrUsageSpeedSelect [] PROGMEM = "Speed";
    -
    529 const char pstrUsagePlaybackSpeed [] PROGMEM = "Play Speed";
    -
    530 const char pstrUsageStandardPlay [] PROGMEM = "Std Play";
    -
    531 const char pstrUsageLongPlay [] PROGMEM = "Long Play";
    -
    532 const char pstrUsageExtendedPlay [] PROGMEM = "Ext Play";
    -
    533 const char pstrUsageSlow [] PROGMEM = "Slow";
    -
    534 const char pstrUsageFanEnable [] PROGMEM = "Fan Enbl";
    -
    535 const char pstrUsageFanSpeed [] PROGMEM = "Fan Speed";
    -
    536 const char pstrUsageLightEnable [] PROGMEM = "Light Enbl";
    -
    537 const char pstrUsageLightIlluminationLevel [] PROGMEM = "Light Illum Lev";
    -
    538 const char pstrUsageClimateControlEnable [] PROGMEM = "Climate Enbl";
    -
    539 const char pstrUsageRoomTemperature [] PROGMEM = "Room Temp";
    -
    540 const char pstrUsageSecurityEnable [] PROGMEM = "Secur Enbl";
    -
    541 const char pstrUsageFireAlarm [] PROGMEM = "Fire Alm";
    -
    542 const char pstrUsagePoliceAlarm [] PROGMEM = "Police Alm";
    -
    543 const char pstrUsageProximity [] PROGMEM = "Prox";
    -
    544 const char pstrUsageMotion [] PROGMEM = "Motion";
    -
    545 const char pstrUsageDuresAlarm [] PROGMEM = "Dures Alm";
    -
    546 const char pstrUsageHoldupAlarm [] PROGMEM = "Holdup Alm";
    -
    547 const char pstrUsageMedicalAlarm [] PROGMEM = "Med Alm";
    -
    548 const char pstrUsageBalanceRight [] PROGMEM = "Balance Right";
    -
    549 const char pstrUsageBalanceLeft [] PROGMEM = "Balance Left";
    -
    550 const char pstrUsageBassIncrement [] PROGMEM = "Bass Inc";
    -
    551 const char pstrUsageBassDecrement [] PROGMEM = "Bass Dec";
    -
    552 const char pstrUsageTrebleIncrement [] PROGMEM = "Treble Inc";
    -
    553 const char pstrUsageTrebleDecrement [] PROGMEM = "Treble Dec";
    -
    554 const char pstrUsageSpeakerSystem [] PROGMEM = "Spk Sys";
    -
    555 const char pstrUsageChannelLeft [] PROGMEM = "Ch Left";
    -
    556 const char pstrUsageChannelRight [] PROGMEM = "Ch Right";
    -
    557 const char pstrUsageChannelCenter [] PROGMEM = "Ch Center";
    -
    558 const char pstrUsageChannelFront [] PROGMEM = "Ch Front";
    -
    559 const char pstrUsageChannelCenterFront [] PROGMEM = "Ch Cntr Front";
    -
    560 const char pstrUsageChannelSide [] PROGMEM = "Ch Side";
    -
    561 const char pstrUsageChannelSurround [] PROGMEM = "Ch Surround";
    -
    562 const char pstrUsageChannelLowFreqEnhancement [] PROGMEM = "Ch Low Freq Enh";
    -
    563 const char pstrUsageChannelTop [] PROGMEM = "Ch Top";
    -
    564 const char pstrUsageChannelUnknown [] PROGMEM = "Ch Unk";
    -
    565 const char pstrUsageSubChannel [] PROGMEM = "Sub-ch";
    -
    566 const char pstrUsageSubChannelIncrement [] PROGMEM = "Sub-ch Inc";
    -
    567 const char pstrUsageSubChannelDecrement [] PROGMEM = "Sub-ch Dec";
    -
    568 const char pstrUsageAlternateAudioIncrement [] PROGMEM = "Alt Aud Inc";
    -
    569 const char pstrUsageAlternateAudioDecrement [] PROGMEM = "Alt Aud Dec";
    -
    570 const char pstrUsageApplicationLaunchButtons [] PROGMEM = "App Launch Btns";
    -
    571 const char pstrUsageALLaunchButtonConfigTool [] PROGMEM = "AL Launch Conf Tl";
    -
    572 const char pstrUsageALProgrammableButton [] PROGMEM = "AL Pgm Btn";
    -
    573 const char pstrUsageALConsumerControlConfig [] PROGMEM = "AL Cons Ctrl Cfg";
    -
    574 const char pstrUsageALWordProcessor [] PROGMEM = "AL Word Proc";
    -
    575 const char pstrUsageALTextEditor [] PROGMEM = "AL Txt Edtr";
    -
    576 const char pstrUsageALSpreadsheet [] PROGMEM = "AL Sprdsheet";
    -
    577 const char pstrUsageALGraphicsEditor [] PROGMEM = "AL Graph Edtr";
    -
    578 const char pstrUsageALPresentationApp [] PROGMEM = "AL Present App";
    -
    579 const char pstrUsageALDatabaseApp [] PROGMEM = "AL DB App";
    -
    580 const char pstrUsageALEmailReader [] PROGMEM = "AL E-mail Rdr";
    -
    581 const char pstrUsageALNewsreader [] PROGMEM = "AL Newsrdr";
    -
    582 const char pstrUsageALVoicemail [] PROGMEM = "AL Voicemail";
    -
    583 const char pstrUsageALContactsAddressBook [] PROGMEM = "AL Addr Book";
    -
    584 const char pstrUsageALCalendarSchedule [] PROGMEM = "AL Clndr/Schdlr";
    -
    585 const char pstrUsageALTaskProjectManager [] PROGMEM = "AL Task/Prj Mgr";
    -
    586 const char pstrUsageALLogJournalTimecard [] PROGMEM = "AL Log/Jrnl/Tmcrd";
    -
    587 const char pstrUsageALCheckbookFinance [] PROGMEM = "AL Chckbook/Fin";
    -
    588 const char pstrUsageALCalculator [] PROGMEM = "AL Calc";
    -
    589 const char pstrUsageALAVCapturePlayback [] PROGMEM = "AL A/V Capt/Play";
    -
    590 const char pstrUsageALLocalMachineBrowser [] PROGMEM = "AL Loc Mach Brow";
    -
    591 const char pstrUsageALLANWANBrow [] PROGMEM = "AL LAN/WAN Brow";
    -
    592 const char pstrUsageALInternetBrowser [] PROGMEM = "AL I-net Brow";
    -
    593 const char pstrUsageALRemoteNetISPConnect [] PROGMEM = "AL Rem Net Con";
    -
    594 const char pstrUsageALNetworkConference [] PROGMEM = "AL Net Conf";
    -
    595 const char pstrUsageALNetworkChat [] PROGMEM = "AL Net Chat";
    -
    596 const char pstrUsageALTelephonyDialer [] PROGMEM = "AL Tel/Dial";
    -
    597 const char pstrUsageALLogon [] PROGMEM = "AL Logon";
    -
    598 const char pstrUsageALLogoff [] PROGMEM = "AL Logoff";
    -
    599 const char pstrUsageALLogonLogoff [] PROGMEM = "AL Logon/Logoff";
    -
    600 const char pstrUsageALTermLockScrSav [] PROGMEM = "AL Term Lock/Scr Sav";
    -
    601 const char pstrUsageALControlPannel [] PROGMEM = "AL Ctrl Pan";
    -
    602 const char pstrUsageALCommandLineProcessorRun [] PROGMEM = "AL Cmd/Run";
    -
    603 const char pstrUsageALProcessTaskManager [] PROGMEM = "AL Task Mgr";
    -
    604 const char pstrUsageALSelectTaskApplication [] PROGMEM = "AL Sel App";
    -
    605 const char pstrUsageALNextTaskApplication [] PROGMEM = "AL Next App";
    -
    606 const char pstrUsageALPreviousTaskApplication [] PROGMEM = "AL Prev App";
    -
    607 const char pstrUsageALPreemptiveHaltTaskApp [] PROGMEM = "AL Prmpt Halt App";
    -
    608 const char pstrUsageALIntegratedHelpCenter [] PROGMEM = "AL Hlp Cntr";
    -
    609 const char pstrUsageALDocuments [] PROGMEM = "AL Docs";
    -
    610 const char pstrUsageALThesaurus [] PROGMEM = "AL Thsrs";
    -
    611 const char pstrUsageALDictionary [] PROGMEM = "AL Dict";
    -
    612 const char pstrUsageALDesktop [] PROGMEM = "AL Desktop";
    -
    613 const char pstrUsageALSpellCheck [] PROGMEM = "AL Spell Chk";
    -
    614 const char pstrUsageALGrammarCheck [] PROGMEM = "AL Gram Chk";
    -
    615 const char pstrUsageALWirelessStatus [] PROGMEM = "AL Wireless Sts";
    -
    616 const char pstrUsageALKeyboardLayout [] PROGMEM = "AL Kbd Layout";
    -
    617 const char pstrUsageALVirusProtection [] PROGMEM = "AL Vir Protect";
    -
    618 const char pstrUsageALEncryption [] PROGMEM = "AL Encrypt";
    -
    619 const char pstrUsageALScreenSaver [] PROGMEM = "AL Scr Sav";
    -
    620 const char pstrUsageALAlarms [] PROGMEM = "AL Alarms";
    -
    621 const char pstrUsageALClock [] PROGMEM = "AL Clock";
    -
    622 const char pstrUsageALFileBrowser [] PROGMEM = "AL File Brow";
    -
    623 const char pstrUsageALPowerStatus [] PROGMEM = "AL Pwr Sts";
    -
    624 const char pstrUsageALImageBrowser [] PROGMEM = "AL Img Brow";
    -
    625 const char pstrUsageALAudioBrowser [] PROGMEM = "AL Aud Brow";
    -
    626 const char pstrUsageALMovieBrowser [] PROGMEM = "AL Mov Brow";
    -
    627 const char pstrUsageALDigitalRightsManager [] PROGMEM = "AL Dig Rights Mgr";
    -
    628 const char pstrUsageALDigitalWallet [] PROGMEM = "AL Dig Wallet";
    -
    629 const char pstrUsageALInstantMessaging [] PROGMEM = "AL Inst Msg";
    -
    630 const char pstrUsageALOEMFeaturesBrowser [] PROGMEM = "AL OEM Tips Brow";
    -
    631 const char pstrUsageALOEMHelp [] PROGMEM = "AL OEM Hlp";
    -
    632 const char pstrUsageALOnlineCommunity [] PROGMEM = "AL Online Com";
    -
    633 const char pstrUsageALEntertainmentContentBrow [] PROGMEM = "AL Ent Cont Brow";
    -
    634 const char pstrUsageALOnlineShoppingBrowser [] PROGMEM = "AL Online Shop Brow";
    -
    635 const char pstrUsageALSmartCardInfoHelp [] PROGMEM = "AL SmartCard Inf";
    -
    636 const char pstrUsageALMarketMonitorFinBrowser [] PROGMEM = "AL Market Brow";
    -
    637 const char pstrUsageALCustomCorpNewsBrowser [] PROGMEM = "AL Cust Corp News Brow";
    -
    638 const char pstrUsageALOnlineActivityBrowser [] PROGMEM = "AL Online Act Brow";
    -
    639 const char pstrUsageALResearchSearchBrowser [] PROGMEM = "AL Search Brow";
    -
    640 const char pstrUsageALAudioPlayer [] PROGMEM = "AL Aud Player";
    -
    641 const char pstrUsageGenericGUIAppControls [] PROGMEM = "Gen GUI App Ctrl";
    -
    642 const char pstrUsageACNew [] PROGMEM = "AC New";
    -
    643 const char pstrUsageACOpen [] PROGMEM = "AC Open";
    -
    644 const char pstrUsageACClose [] PROGMEM = "AC Close";
    -
    645 const char pstrUsageACExit [] PROGMEM = "AC Exit";
    -
    646 const char pstrUsageACMaximize [] PROGMEM = "AC Max";
    -
    647 const char pstrUsageACMinimize [] PROGMEM = "AC Min";
    -
    648 const char pstrUsageACSave [] PROGMEM = "AC Save";
    -
    649 const char pstrUsageACPrint [] PROGMEM = "AC Print";
    -
    650 const char pstrUsageACProperties [] PROGMEM = "AC Prop";
    -
    651 const char pstrUsageACUndo [] PROGMEM = "AC Undo";
    -
    652 const char pstrUsageACCopy [] PROGMEM = "AC Copy";
    -
    653 const char pstrUsageACCut [] PROGMEM = "AC Cut";
    -
    654 const char pstrUsageACPaste [] PROGMEM = "AC Paste";
    -
    655 const char pstrUsageACSelectAll [] PROGMEM = "AC Sel All";
    -
    656 const char pstrUsageACFind [] PROGMEM = "AC Find";
    -
    657 const char pstrUsageACFindAndReplace [] PROGMEM = "AC Find/Replace";
    -
    658 const char pstrUsageACSearch [] PROGMEM = "AC Search";
    -
    659 const char pstrUsageACGoto [] PROGMEM = "AC Goto";
    -
    660 const char pstrUsageACHome [] PROGMEM = "AC Home";
    -
    661 const char pstrUsageACBack [] PROGMEM = "AC Back";
    -
    662 const char pstrUsageACForward [] PROGMEM = "AC Fwd";
    -
    663 const char pstrUsageACStop [] PROGMEM = "AC Stop";
    -
    664 const char pstrUsageACRefresh [] PROGMEM = "AC Refresh";
    -
    665 const char pstrUsageACPreviousLink [] PROGMEM = "AC Prev Link";
    -
    666 const char pstrUsageACNextLink [] PROGMEM = "AC Next Link";
    -
    667 const char pstrUsageACBookmarks [] PROGMEM = "AC Bkmarks";
    -
    668 const char pstrUsageACHistory [] PROGMEM = "AC Hist";
    -
    669 const char pstrUsageACSubscriptions [] PROGMEM = "AC Subscr";
    -
    670 const char pstrUsageACZoomIn [] PROGMEM = "AC Zoom In";
    -
    671 const char pstrUsageACZoomOut [] PROGMEM = "AC Zoom Out";
    -
    672 const char pstrUsageACZoom [] PROGMEM = "AC Zoom";
    -
    673 const char pstrUsageACFullScreenView [] PROGMEM = "AC Full Scr";
    -
    674 const char pstrUsageACNormalView [] PROGMEM = "AC Norm View";
    -
    675 const char pstrUsageACViewToggle [] PROGMEM = "AC View Tgl";
    -
    676 const char pstrUsageACScrollUp [] PROGMEM = "AC Scroll Up";
    -
    677 const char pstrUsageACScrollDown [] PROGMEM = "AC Scroll Down";
    -
    678 const char pstrUsageACScroll [] PROGMEM = "AC Scroll";
    -
    679 const char pstrUsageACPanLeft [] PROGMEM = "AC Pan Left";
    -
    680 const char pstrUsageACPanRight [] PROGMEM = "AC Pan Right";
    -
    681 const char pstrUsageACPan [] PROGMEM = "AC Pan";
    -
    682 const char pstrUsageACNewWindow [] PROGMEM = "AC New Wnd";
    -
    683 const char pstrUsageACTileHoriz [] PROGMEM = "AC Tile Horiz";
    -
    684 const char pstrUsageACTileVert [] PROGMEM = "AC Tile Vert";
    -
    685 const char pstrUsageACFormat [] PROGMEM = "AC Frmt";
    -
    686 const char pstrUsageACEdit [] PROGMEM = "AC Edit";
    -
    687 const char pstrUsageACBold [] PROGMEM = "AC Bold";
    -
    688 const char pstrUsageACItalics [] PROGMEM = "AC Ital";
    -
    689 const char pstrUsageACUnderline [] PROGMEM = "AC Under";
    -
    690 const char pstrUsageACStrikethrough [] PROGMEM = "AC Strike";
    -
    691 const char pstrUsageACSubscript [] PROGMEM = "AC Sub";
    -
    692 const char pstrUsageACSuperscript [] PROGMEM = "AC Super";
    -
    693 const char pstrUsageACAllCaps [] PROGMEM = "AC All Caps";
    -
    694 const char pstrUsageACRotate [] PROGMEM = "AC Rotate";
    -
    695 const char pstrUsageACResize [] PROGMEM = "AC Resize";
    -
    696 const char pstrUsageACFlipHorizontal [] PROGMEM = "AC Flp H";
    -
    697 const char pstrUsageACFlipVertical [] PROGMEM = "AC Flp V";
    -
    698 const char pstrUsageACMirrorHorizontal [] PROGMEM = "AC Mir H";
    -
    699 const char pstrUsageACMirrorVertical [] PROGMEM = "AC Mir V";
    -
    700 const char pstrUsageACFontSelect [] PROGMEM = "AC Fnt Sel";
    -
    701 const char pstrUsageACFontColor [] PROGMEM = "AC Fnt Clr";
    -
    702 const char pstrUsageACFontSize [] PROGMEM = "AC Fnt Size";
    -
    703 const char pstrUsageACJustifyLeft [] PROGMEM = "AC Just Left";
    -
    704 const char pstrUsageACJustifyCenterH [] PROGMEM = "AC Just Cent H";
    -
    705 const char pstrUsageACJustifyRight [] PROGMEM = "AC Just Right";
    -
    706 const char pstrUsageACJustifyBlockH [] PROGMEM = "AC Just Block H";
    -
    707 const char pstrUsageACJustifyTop [] PROGMEM = "AC Just Top";
    -
    708 const char pstrUsageACJustifyCenterV [] PROGMEM = "AC Just Cent V";
    -
    709 const char pstrUsageACJustifyBottom [] PROGMEM = "AC Just Bot";
    -
    710 const char pstrUsageACJustifyBlockV [] PROGMEM = "AC Just Block V";
    -
    711 const char pstrUsageACIndentDecrease [] PROGMEM = "AC Indent Dec";
    -
    712 const char pstrUsageACIndentIncrease [] PROGMEM = "AC Indent Inc";
    -
    713 const char pstrUsageACNumberedList [] PROGMEM = "AC Num List";
    -
    714 const char pstrUsageACRestartNumbering [] PROGMEM = "AC Res Num";
    -
    715 const char pstrUsageACBulletedList [] PROGMEM = "AC Blt List";
    -
    716 const char pstrUsageACPromote [] PROGMEM = "AC Promote";
    -
    717 const char pstrUsageACDemote [] PROGMEM = "AC Demote";
    -
    718 const char pstrUsageACYes [] PROGMEM = "AC Yes";
    -
    719 const char pstrUsageACNo [] PROGMEM = "AC No";
    -
    720 const char pstrUsageACCancel [] PROGMEM = "AC Cancel";
    -
    721 const char pstrUsageACCatalog [] PROGMEM = "AC Ctlg";
    -
    722 const char pstrUsageACBuyChkout [] PROGMEM = "AC Buy";
    -
    723 const char pstrUsageACAddToCart [] PROGMEM = "AC Add2Cart";
    -
    724 const char pstrUsageACExpand [] PROGMEM = "AC Xpnd";
    -
    725 const char pstrUsageACExpandAll [] PROGMEM = "AC Xpand All";
    -
    726 const char pstrUsageACCollapse [] PROGMEM = "AC Collapse";
    -
    727 const char pstrUsageACCollapseAll [] PROGMEM = "AC Collapse All";
    -
    728 const char pstrUsageACPrintPreview [] PROGMEM = "AC Prn Prevw";
    -
    729 const char pstrUsageACPasteSpecial [] PROGMEM = "AC Paste Spec";
    -
    730 const char pstrUsageACInsertMode [] PROGMEM = "AC Ins Mode";
    -
    731 const char pstrUsageACDelete [] PROGMEM = "AC Del";
    -
    732 const char pstrUsageACLock [] PROGMEM = "AC Lock";
    -
    733 const char pstrUsageACUnlock [] PROGMEM = "AC Unlock";
    -
    734 const char pstrUsageACProtect [] PROGMEM = "AC Prot";
    -
    735 const char pstrUsageACUnprotect [] PROGMEM = "AC Unprot";
    -
    736 const char pstrUsageACAttachComment [] PROGMEM = "AC Attach Cmnt";
    -
    737 const char pstrUsageACDeleteComment [] PROGMEM = "AC Del Cmnt";
    -
    738 const char pstrUsageACViewComment [] PROGMEM = "AC View Cmnt";
    -
    739 const char pstrUsageACSelectWord [] PROGMEM = "AC Sel Word";
    -
    740 const char pstrUsageACSelectSentence [] PROGMEM = "AC Sel Sntc";
    -
    741 const char pstrUsageACSelectParagraph [] PROGMEM = "AC Sel Para";
    -
    742 const char pstrUsageACSelectColumn [] PROGMEM = "AC Sel Col";
    -
    743 const char pstrUsageACSelectRow [] PROGMEM = "AC Sel Row";
    -
    744 const char pstrUsageACSelectTable [] PROGMEM = "AC Sel Tbl";
    -
    745 const char pstrUsageACSelectObject [] PROGMEM = "AC Sel Obj";
    -
    746 const char pstrUsageACRedoRepeat [] PROGMEM = "AC Redo";
    -
    747 const char pstrUsageACSort [] PROGMEM = "AC Sort";
    -
    748 const char pstrUsageACSortAscending [] PROGMEM = "AC Sort Asc";
    -
    749 const char pstrUsageACSortDescending [] PROGMEM = "AC Sort Desc";
    -
    750 const char pstrUsageACFilter [] PROGMEM = "AC Filt";
    -
    751 const char pstrUsageACSetClock [] PROGMEM = "AC Set Clk";
    -
    752 const char pstrUsageACViewClock [] PROGMEM = "AC View Clk";
    -
    753 const char pstrUsageACSelectTimeZone [] PROGMEM = "AC Sel Time Z";
    -
    754 const char pstrUsageACEditTimeZone [] PROGMEM = "AC Edt Time Z";
    -
    755 const char pstrUsageACSetAlarm [] PROGMEM = "AC Set Alm";
    -
    756 const char pstrUsageACClearAlarm [] PROGMEM = "AC Clr Alm";
    -
    757 const char pstrUsageACSnoozeAlarm [] PROGMEM = "AC Snz Alm";
    -
    758 const char pstrUsageACResetAlarm [] PROGMEM = "AC Rst Alm";
    -
    759 const char pstrUsageACSyncronize [] PROGMEM = "AC Sync";
    -
    760 const char pstrUsageACSendReceive [] PROGMEM = "AC Snd/Rcv";
    -
    761 const char pstrUsageACSendTo [] PROGMEM = "AC Snd To";
    -
    762 const char pstrUsageACReply [] PROGMEM = "AC Reply";
    -
    763 const char pstrUsageACReplyAll [] PROGMEM = "AC Reply All";
    -
    764 const char pstrUsageACForwardMessage [] PROGMEM = "AC Fwd Msg";
    -
    765 const char pstrUsageACSend [] PROGMEM = "AC Snd";
    -
    766 const char pstrUsageACAttachFile [] PROGMEM = "AC Att File";
    -
    767 const char pstrUsageACUpload [] PROGMEM = "AC Upld";
    -
    768 const char pstrUsageACDownload [] PROGMEM = "AC Dnld";
    -
    769 const char pstrUsageACSetBorders [] PROGMEM = "AC Set Brd";
    -
    770 const char pstrUsageACInsertRow [] PROGMEM = "AC Ins Row";
    -
    771 const char pstrUsageACInsertColumn [] PROGMEM = "AC Ins Col";
    -
    772 const char pstrUsageACInsertFile [] PROGMEM = "AC Ins File";
    -
    773 const char pstrUsageACInsertPicture [] PROGMEM = "AC Ins Pic";
    -
    774 const char pstrUsageACInsertObject [] PROGMEM = "AC Ins Obj";
    -
    775 const char pstrUsageACInsertSymbol [] PROGMEM = "AC Ins Sym";
    -
    776 const char pstrUsageACSaveAndClose [] PROGMEM = "AC Sav&Cls";
    -
    777 const char pstrUsageACRename [] PROGMEM = "AC Rename";
    -
    778 const char pstrUsageACMerge [] PROGMEM = "AC Merge";
    -
    779 const char pstrUsageACSplit [] PROGMEM = "AC Split";
    -
    780 const char pstrUsageACDistributeHorizontaly [] PROGMEM = "AC Dist Hor";
    -
    781 const char pstrUsageACDistributeVerticaly [] PROGMEM = "AC Dist Ver";
    -
    782 
    -
    783 // Digitaizers
    -
    784 const char pstrUsageDigitizer [] PROGMEM = "Digitizer";
    -
    785 const char pstrUsagePen [] PROGMEM = "Pen";
    -
    786 const char pstrUsageLightPen [] PROGMEM = "Light Pen";
    -
    787 const char pstrUsageTouchScreen [] PROGMEM = "Touch Scr";
    -
    788 const char pstrUsageTouchPad [] PROGMEM = "Touch Pad";
    -
    789 const char pstrUsageWhiteBoard [] PROGMEM = "White Brd";
    -
    790 const char pstrUsageCoordinateMeasuringMachine [] PROGMEM = "Coord Meas Mach";
    -
    791 const char pstrUsage3DDigitizer [] PROGMEM = "3D Dgtz";
    -
    792 const char pstrUsageStereoPlotter [] PROGMEM = "Stereo Plot";
    -
    793 const char pstrUsageArticulatedArm [] PROGMEM = "Art Arm";
    -
    794 const char pstrUsageArmature [] PROGMEM = "Armature";
    -
    795 const char pstrUsageMultiplePointDigitizer [] PROGMEM = "Multi Point Dgtz";
    -
    796 const char pstrUsageFreeSpaceWand [] PROGMEM = "Free Space Wand";
    -
    797 const char pstrUsageStylus [] PROGMEM = "Stylus";
    -
    798 const char pstrUsagePuck [] PROGMEM = "Puck";
    -
    799 const char pstrUsageFinger [] PROGMEM = "Finger";
    -
    800 const char pstrUsageTipPressure [] PROGMEM = "Tip Press";
    -
    801 const char pstrUsageBarrelPressure [] PROGMEM = "Brl Press";
    -
    802 const char pstrUsageInRange [] PROGMEM = "In Range";
    -
    803 const char pstrUsageTouch [] PROGMEM = "Touch";
    -
    804 const char pstrUsageUntouch [] PROGMEM = "Untouch";
    -
    805 const char pstrUsageTap [] PROGMEM = "Tap";
    -
    806 const char pstrUsageQuality [] PROGMEM = "Qlty";
    -
    807 const char pstrUsageDataValid [] PROGMEM = "Data Valid";
    -
    808 const char pstrUsageTransducerIndex [] PROGMEM = "Transducer Ind";
    -
    809 const char pstrUsageTabletFunctionKeys [] PROGMEM = "Tabl Func Keys";
    -
    810 const char pstrUsageProgramChangeKeys [] PROGMEM = "Pgm Chng Keys";
    -
    811 //const char pstrUsageBatteryStrength [] PROGMEM = "Bat Strength";
    -
    812 const char pstrUsageInvert [] PROGMEM = "Invert";
    -
    813 const char pstrUsageXTilt [] PROGMEM = "X Tilt";
    -
    814 const char pstrUsageYTilt [] PROGMEM = "Y Tilt";
    -
    815 const char pstrUsageAzimuth [] PROGMEM = "Azimuth";
    -
    816 const char pstrUsageAltitude [] PROGMEM = "Altitude";
    -
    817 const char pstrUsageTwist [] PROGMEM = "Twist";
    -
    818 const char pstrUsageTipSwitch [] PROGMEM = "Tip Sw";
    -
    819 const char pstrUsageSecondaryTipSwitch [] PROGMEM = "Scnd Tip Sw";
    -
    820 const char pstrUsageBarrelSwitch [] PROGMEM = "Brl Sw";
    -
    821 const char pstrUsageEraser [] PROGMEM = "Eraser";
    -
    822 const char pstrUsageTabletPick [] PROGMEM = "Tbl Pick";
    -
    823 
    -
    824 // Alphanumeric Display Page
    -
    825 const char pstrUsageAlphanumericDisplay [] PROGMEM = "Alphanum Disp";
    -
    826 const char pstrUsageBitmappedDisplay [] PROGMEM = "Bmp Disp";
    -
    827 const char pstrUsageDisplayAttributesReport [] PROGMEM = "Disp Attr Rpt";
    -
    828 const char pstrUsageASCIICharacterSet [] PROGMEM = "ASCII chset";
    -
    829 const char pstrUsageDataReadBack [] PROGMEM = "Data Rd Back";
    -
    830 const char pstrUsageFontReadBack [] PROGMEM = "Fnt Rd Back";
    -
    831 const char pstrUsageDisplayControlReport [] PROGMEM = "Disp Ctrl Rpt";
    -
    832 const char pstrUsageClearDisplay [] PROGMEM = "Clr Disp";
    -
    833 //const char pstrUsageDisplayEnable [] PROGMEM = "Disp Enbl";
    -
    834 const char pstrUsageScreenSaverDelay [] PROGMEM = "Scr Sav Delay";
    -
    835 const char pstrUsageScreenSaverEnable [] PROGMEM = "Scr Sav Enbl";
    -
    836 const char pstrUsageVerticalScroll [] PROGMEM = "V Scroll";
    -
    837 const char pstrUsageHorizontalScroll [] PROGMEM = "H Scroll";
    -
    838 const char pstrUsageCharacterReport [] PROGMEM = "Char Rpt";
    -
    839 const char pstrUsageDisplayData [] PROGMEM = "Disp Data";
    -
    840 const char pstrUsageDisplayStatus [] PROGMEM = "Disp Stat";
    -
    841 const char pstrUsageStatusNotReady [] PROGMEM = "Stat !Ready";
    -
    842 const char pstrUsageStatusReady [] PROGMEM = "Stat Ready";
    -
    843 const char pstrUsageErrorNotALoadableCharacter [] PROGMEM = "Err Not Ld Char";
    -
    844 const char pstrUsageErrorFotDataCanNotBeRead [] PROGMEM = "Fnt Data Rd Err";
    -
    845 const char pstrUsageCursorPositionReport [] PROGMEM = "Cur Pos Rpt";
    -
    846 const char pstrUsageRow [] PROGMEM = "Row";
    -
    847 const char pstrUsageColumn [] PROGMEM = "Col";
    -
    848 const char pstrUsageRows [] PROGMEM = "Rows";
    -
    849 const char pstrUsageColumns [] PROGMEM = "Cols";
    -
    850 const char pstrUsageCursorPixelPosition [] PROGMEM = "Cur Pix Pos";
    -
    851 const char pstrUsageCursorMode [] PROGMEM = "Cur Mode";
    -
    852 const char pstrUsageCursorEnable [] PROGMEM = "Cur Enbl";
    -
    853 const char pstrUsageCursorBlink [] PROGMEM = "Cur Blnk";
    -
    854 const char pstrUsageFontReport [] PROGMEM = "Fnt Rpt";
    -
    855 const char pstrUsageFontData [] PROGMEM = "Fnt Data";
    -
    856 const char pstrUsageCharacterWidth [] PROGMEM = "Char Wdth";
    -
    857 const char pstrUsageCharacterHeight [] PROGMEM = "Char Hght";
    -
    858 const char pstrUsageCharacterSpacingHorizontal [] PROGMEM = "Char Space H";
    -
    859 const char pstrUsageCharacterSpacingVertical [] PROGMEM = "Char Space V";
    -
    860 const char pstrUsageUnicodeCharset [] PROGMEM = "Unicode Char";
    -
    861 const char pstrUsageFont7Segment [] PROGMEM = "Fnt 7-seg";
    -
    862 const char pstrUsage7SegmentDirectMap [] PROGMEM = "7-seg map";
    -
    863 const char pstrUsageFont14Segment [] PROGMEM = "Fnt 14-seg";
    -
    864 const char pstrUsage14SegmentDirectMap [] PROGMEM = "14-seg map";
    -
    865 const char pstrUsageDisplayBrightness [] PROGMEM = "Disp Bright";
    -
    866 const char pstrUsageDisplayContrast [] PROGMEM = "Disp Cntrst";
    -
    867 const char pstrUsageCharacterAttribute [] PROGMEM = "Char Attr";
    -
    868 const char pstrUsageAttributeReadback [] PROGMEM = "Attr Readbk";
    -
    869 const char pstrUsageAttributeData [] PROGMEM = "Attr Data";
    -
    870 const char pstrUsageCharAttributeEnhance [] PROGMEM = "Char Attr Enh";
    -
    871 const char pstrUsageCharAttributeUnderline [] PROGMEM = "Char Attr Undl";
    -
    872 const char pstrUsageCharAttributeBlink [] PROGMEM = "Char Attr Blnk";
    -
    873 const char pstrUsageBitmapSizeX [] PROGMEM = "Bmp Size X";
    -
    874 const char pstrUsageBitmapSizeY [] PROGMEM = "Bmp Size Y";
    -
    875 const char pstrUsageBitDepthFormat [] PROGMEM = "Bit Dpth Fmt";
    -
    876 const char pstrUsageDisplayOrientation [] PROGMEM = "Disp Ornt";
    -
    877 const char pstrUsagePaletteReport [] PROGMEM = "Pal Rpt";
    -
    878 const char pstrUsagePaletteDataSize [] PROGMEM = "Pal Data Size";
    -
    879 const char pstrUsagePaletteDataOffset [] PROGMEM = "Pal Data Off";
    -
    880 const char pstrUsagePaletteData [] PROGMEM = "Pal Data";
    -
    881 const char pstrUsageBlitReport [] PROGMEM = "Blit Rpt";
    -
    882 const char pstrUsageBlitRectangleX1 [] PROGMEM = "Blit Rect X1";
    -
    883 const char pstrUsageBlitRectangleY1 [] PROGMEM = "Blit Rect Y1";
    -
    884 const char pstrUsageBlitRectangleX2 [] PROGMEM = "Blit Rect X2";
    -
    885 const char pstrUsageBlitRectangleY2 [] PROGMEM = "Blit Rect Y2";
    -
    886 const char pstrUsageBlitData [] PROGMEM = "Blit Data";
    -
    887 const char pstrUsageSoftButton [] PROGMEM = "Soft Btn";
    -
    888 const char pstrUsageSoftButtonID [] PROGMEM = "Soft Btn ID";
    -
    889 const char pstrUsageSoftButtonSide [] PROGMEM = "Soft Btn Side";
    -
    890 const char pstrUsageSoftButtonOffset1 [] PROGMEM = "Soft Btn Off1";
    -
    891 const char pstrUsageSoftButtonOffset2 [] PROGMEM = "Soft Btn Off2";
    -
    892 const char pstrUsageSoftButtonReport [] PROGMEM = "Soft Btn Rpt";
    -
    893 
    -
    894 // Medical Instrument Page
    -
    895 const char pstrUsageMedicalUltrasound [] PROGMEM = "Med Ultrasnd";
    -
    896 const char pstrUsageVCRAcquisition [] PROGMEM = "VCR/Acq";
    -
    897 const char pstrUsageFreezeThaw [] PROGMEM = "Freeze";
    -
    898 const char pstrUsageClipStore [] PROGMEM = "Clip Store";
    -
    899 const char pstrUsageUpdate [] PROGMEM = "Update";
    -
    900 const char pstrUsageNext [] PROGMEM = "Next";
    -
    901 const char pstrUsageSave [] PROGMEM = "Save";
    -
    902 const char pstrUsagePrint [] PROGMEM = "Print";
    -
    903 const char pstrUsageMicrophoneEnable [] PROGMEM = "Mic Enbl";
    -
    904 const char pstrUsageCine [] PROGMEM = "Cine";
    -
    905 const char pstrUsageTransmitPower [] PROGMEM = "Trans Pwr";
    -
    906 //const char pstrUsageVolume [] PROGMEM = "Vol";
    -
    907 const char pstrUsageFocus [] PROGMEM = "Focus";
    -
    908 const char pstrUsageDepth [] PROGMEM = "Depth";
    -
    909 const char pstrUsageSoftStepPrimary [] PROGMEM = "Soft Stp-Pri";
    -
    910 const char pstrUsageSoftStepSecondary [] PROGMEM = "Soft Stp-Sec";
    -
    911 const char pstrUsageDepthGainCompensation [] PROGMEM = "Dpth Gain Comp";
    -
    912 const char pstrUsageZoomSelect [] PROGMEM = "Zoom Sel";
    -
    913 const char pstrUsageZoomAdjust [] PROGMEM = "Zoom Adj";
    -
    914 const char pstrUsageSpectralDopplerModeSelect [] PROGMEM = "Spec Dop Mode Sel";
    -
    915 const char pstrUsageSpectralDopplerModeAdjust [] PROGMEM = "Spec Dop Mode Adj";
    -
    916 const char pstrUsageColorDopplerModeSelect [] PROGMEM = "Color Dop Mode Sel";
    -
    917 const char pstrUsageColorDopplerModeAdjust [] PROGMEM = "Color Dop Mode Adj";
    -
    918 const char pstrUsageMotionModeSelect [] PROGMEM = "Motion Mode Sel";
    -
    919 const char pstrUsageMotionModeAdjust [] PROGMEM = "Motion Mode Adj";
    -
    920 const char pstrUsage2DModeSelect [] PROGMEM = "2D Mode Sel";
    -
    921 const char pstrUsage2DModeAdjust [] PROGMEM = "2D Mode Adj";
    -
    922 const char pstrUsageSoftControlSelect [] PROGMEM = "Soft Ctrl Sel";
    -
    923 const char pstrUsageSoftControlAdjust [] PROGMEM = "Soft Ctrl Adj";
    -
    924 
    -
    925 //extern const char *usagePageTitles0[15];
    -
    926 //const char *usagePageTitles1[];
    -
    927 //const char *genDesktopTitles0[];
    -
    928 //const char *genDesktopTitles1[];
    -
    929 //const char *genDesktopTitles2[];
    -
    930 //const char *genDesktopTitles3[];
    -
    931 //const char *genDesktopTitles4[];
    -
    932 //const char *simuTitles0[];
    -
    933 //const char *simuTitles1[];
    -
    934 //const char *simuTitles2[];
    -
    935 //const char *vrTitles0[];
    -
    936 //const char *vrTitles1[];
    -
    937 //const char *sportsCtrlTitles0[];
    -
    938 //const char *sportsCtrlTitles1[];
    -
    939 //const char *sportsCtrlTitles2[];
    -
    940 //const char *gameTitles0[];
    -
    941 //const char *gameTitles1[];
    -
    942 //const char *genDevCtrlTitles[];
    -
    943 //const char *ledTitles[];
    -
    944 //const char *telTitles0[];
    -
    945 //const char *telTitles1[];
    -
    946 //const char *telTitles2[];
    -
    947 //const char *telTitles3[];
    -
    948 //const char *telTitles4[];
    -
    949 //const char *telTitles5[];
    -
    950 //const char *consTitles0[];
    -
    951 //const char *consTitles1[];
    -
    952 //const char *consTitles2[];
    -
    953 //const char *consTitles3[];
    -
    954 //const char *consTitles4[];
    -
    955 //const char *consTitles5[];
    -
    956 //const char *consTitles6[];
    -
    957 //const char *consTitles7[];
    -
    958 //const char *consTitles8[];
    -
    959 //const char *consTitles9[];
    -
    960 //const char *consTitlesA[];
    -
    961 //const char *consTitlesB[];
    -
    962 //const char *consTitlesC[];
    -
    963 //const char *consTitlesD[];
    -
    964 //const char *consTitlesE[];
    -
    965 //const char *digitTitles0[];
    -
    966 //const char *digitTitles1[];
    -
    967 //const char *digitTitles2[];
    -
    968 //const char *aplphanumTitles0[];
    -
    969 //const char *aplphanumTitles1[];
    -
    970 //const char *aplphanumTitles2[];
    -
    971 //const char *medInstrTitles0[];
    -
    972 //const char *medInstrTitles1[];
    -
    973 //const char *medInstrTitles2[];
    -
    974 //const char *medInstrTitles3[];
    -
    975 //const char *medInstrTitles4[];
    -
    976 
    -
    977 #endif //__HIDUSAGESTR_H__
    -
    const char pstrUsageYTilt[]
    Definition: hidusagestr.h:814
    +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #if !defined( __HIDUSAGESTR_H__)
    18 #define __HIDUSAGESTR_H__
    19 
    20 #include "Usb.h"
    21 
    22 const char pstrSpace [] PROGMEM = " ";
    23 const char pstrCRLF [] PROGMEM = "\r\n";
    24 const char pstrSingleTab [] PROGMEM = "\t";
    25 const char pstrDoubleTab [] PROGMEM = "\t\t";
    26 const char pstrTripleTab [] PROGMEM = "\t\t\t";
    27 
    28 // Usage Page String Titles
    29 const char pstrUsagePageUndefined [] PROGMEM = "Undef";
    30 const char pstrUsagePageGenericDesktopControls [] PROGMEM = "Gen Desktop Ctrls";
    31 const char pstrUsagePageSimulationControls [] PROGMEM = "Simu Ctrls";
    32 const char pstrUsagePageVRControls [] PROGMEM = "VR Ctrls";
    33 const char pstrUsagePageSportControls [] PROGMEM = "Sport Ctrls";
    34 const char pstrUsagePageGameControls [] PROGMEM = "Game Ctrls";
    35 const char pstrUsagePageGenericDeviceControls [] PROGMEM = "Gen Dev Ctrls";
    36 const char pstrUsagePageKeyboardKeypad [] PROGMEM = "Kbrd/Keypad";
    37 const char pstrUsagePageLEDs [] PROGMEM = "LEDs";
    38 const char pstrUsagePageButton [] PROGMEM = "Button";
    39 const char pstrUsagePageOrdinal [] PROGMEM = "Ordinal";
    40 const char pstrUsagePageTelephone [] PROGMEM = "Tel";
    41 const char pstrUsagePageConsumer [] PROGMEM = "Consumer";
    42 const char pstrUsagePageDigitizer [] PROGMEM = "Digitizer";
    43 const char pstrUsagePagePID [] PROGMEM = "PID";
    44 const char pstrUsagePageUnicode [] PROGMEM = "Unicode";
    45 const char pstrUsagePageAlphaNumericDisplay [] PROGMEM = "Alpha Num Disp";
    46 const char pstrUsagePageMedicalInstruments [] PROGMEM = "Medical Instr";
    47 const char pstrUsagePageMonitor [] PROGMEM = "Monitor";
    48 const char pstrUsagePagePower [] PROGMEM = "Power";
    49 const char pstrUsagePageBarCodeScanner [] PROGMEM = "Bar Code Scan";
    50 const char pstrUsagePageScale [] PROGMEM = "Scale";
    51 const char pstrUsagePageMSRDevices [] PROGMEM = "Magn Stripe Read Dev";
    52 const char pstrUsagePagePointOfSale [] PROGMEM = "POS";
    53 const char pstrUsagePageCameraControl [] PROGMEM = "Cam Ctrl";
    54 const char pstrUsagePageArcade [] PROGMEM = "Arcade";
    55 const char pstrUsagePageReserved [] PROGMEM = "Reserved";
    56 const char pstrUsagePageVendorDefined [] PROGMEM = "Vendor Def";
    57 
    58 // Generic Desktop Controls Page
    59 const char pstrUsagePointer [] PROGMEM = "Pointer";
    60 const char pstrUsageMouse [] PROGMEM = "Mouse";
    61 const char pstrUsageJoystick [] PROGMEM = "Joystick";
    62 const char pstrUsageGamePad [] PROGMEM = "Game Pad";
    63 const char pstrUsageKeyboard [] PROGMEM = "Kbrd";
    64 const char pstrUsageKeypad [] PROGMEM = "Keypad";
    65 const char pstrUsageMultiAxisController [] PROGMEM = "Multi-axis Ctrl";
    66 const char pstrUsageTabletPCSystemControls [] PROGMEM = "Tablet PC Sys Ctrls";
    67 const char pstrUsageX [] PROGMEM = "X";
    68 const char pstrUsageY [] PROGMEM = "Y";
    69 const char pstrUsageZ [] PROGMEM = "Z";
    70 const char pstrUsageRx [] PROGMEM = "Rx";
    71 const char pstrUsageRy [] PROGMEM = "Ry";
    72 const char pstrUsageRz [] PROGMEM = "Rz";
    73 const char pstrUsageSlider [] PROGMEM = "Slider";
    74 const char pstrUsageDial [] PROGMEM = "Dial";
    75 const char pstrUsageWheel [] PROGMEM = "Wheel";
    76 const char pstrUsageHatSwitch [] PROGMEM = "Hat Switch";
    77 const char pstrUsageCountedBuffer [] PROGMEM = "Counted Buf";
    78 const char pstrUsageByteCount [] PROGMEM = "Byte Count";
    79 const char pstrUsageMotionWakeup [] PROGMEM = "Motion Wakeup";
    80 const char pstrUsageStart [] PROGMEM = "Start";
    81 const char pstrUsageSelect [] PROGMEM = "Sel";
    82 const char pstrUsageVx [] PROGMEM = "Vx";
    83 const char pstrUsageVy [] PROGMEM = "Vy";
    84 const char pstrUsageVz [] PROGMEM = "Vz";
    85 const char pstrUsageVbrx [] PROGMEM = "Vbrx";
    86 const char pstrUsageVbry [] PROGMEM = "Vbry";
    87 const char pstrUsageVbrz [] PROGMEM = "Vbrz";
    88 const char pstrUsageVno [] PROGMEM = "Vno";
    89 const char pstrUsageFeatureNotification [] PROGMEM = "Feature Notif";
    90 const char pstrUsageResolutionMultiplier [] PROGMEM = "Res Mult";
    91 const char pstrUsageSystemControl [] PROGMEM = "Sys Ctrl";
    92 const char pstrUsageSystemPowerDown [] PROGMEM = "Sys Pwr Down";
    93 const char pstrUsageSystemSleep [] PROGMEM = "Sys Sleep";
    94 const char pstrUsageSystemWakeup [] PROGMEM = "Sys Wakeup";
    95 const char pstrUsageSystemContextMenu [] PROGMEM = "Sys Context Menu";
    96 const char pstrUsageSystemMainMenu [] PROGMEM = "Sys Main Menu";
    97 const char pstrUsageSystemAppMenu [] PROGMEM = "Sys App Menu";
    98 const char pstrUsageSystemMenuHelp [] PROGMEM = "Sys Menu Help";
    99 const char pstrUsageSystemMenuExit [] PROGMEM = "Sys Menu Exit";
    100 const char pstrUsageSystemMenuSelect [] PROGMEM = "Sys Menu Select";
    101 const char pstrUsageSystemMenuRight [] PROGMEM = "Sys Menu Right";
    102 const char pstrUsageSystemMenuLeft [] PROGMEM = "Sys Menu Left";
    103 const char pstrUsageSystemMenuUp [] PROGMEM = "Sys Menu Up";
    104 const char pstrUsageSystemMenuDown [] PROGMEM = "Sys Menu Down";
    105 const char pstrUsageSystemColdRestart [] PROGMEM = "Sys Cold Restart";
    106 const char pstrUsageSystemWarmRestart [] PROGMEM = "Sys Warm Restart";
    107 const char pstrUsageDPadUp [] PROGMEM = "D-pad Up";
    108 const char pstrUsageDPadDown [] PROGMEM = "D-pad Down";
    109 const char pstrUsageDPadRight [] PROGMEM = "D-pad Right";
    110 const char pstrUsageDPadLeft [] PROGMEM = "D-pad Left";
    111 const char pstrUsageSystemDock [] PROGMEM = "Sys Dock";
    112 const char pstrUsageSystemUndock [] PROGMEM = "Sys Undock";
    113 const char pstrUsageSystemSetup [] PROGMEM = "Sys Setup";
    114 const char pstrUsageSystemBreak [] PROGMEM = "Sys Break";
    115 const char pstrUsageSystemDebuggerBreak [] PROGMEM = "Sys Dbg Brk";
    116 const char pstrUsageApplicationBreak [] PROGMEM = "App Break";
    117 const char pstrUsageApplicationDebuggerBreak [] PROGMEM = "App Dbg Brk";
    118 const char pstrUsageSystemSpeakerMute [] PROGMEM = "Sys Spk Mute";
    119 const char pstrUsageSystemHibernate [] PROGMEM = "Sys Hiber";
    120 const char pstrUsageSystemDisplayInvert [] PROGMEM = "Sys Disp Inv";
    121 const char pstrUsageSystemDisplayInternal [] PROGMEM = "Sys Disp Int";
    122 const char pstrUsageSystemDisplayExternal [] PROGMEM = "Sys Disp Ext";
    123 const char pstrUsageSystemDisplayBoth [] PROGMEM = "Sys Disp Both";
    124 const char pstrUsageSystemDisplayDual [] PROGMEM = "Sys Disp Dual";
    125 const char pstrUsageSystemDisplayToggleIntExt [] PROGMEM = "Sys Disp Tgl Int/Ext";
    126 const char pstrUsageSystemDisplaySwapPriSec [] PROGMEM = "Sys Disp Swap Pri/Sec";
    127 const char pstrUsageSystemDisplayLCDAutoscale [] PROGMEM = "Sys Disp LCD Autoscale";
    128 
    129 // Simulation Controls Page
    130 const char pstrUsageFlightSimulationDevice [] PROGMEM = "Flight Simu Dev";
    131 const char pstrUsageAutomobileSimulationDevice [] PROGMEM = "Auto Simu Dev";
    132 const char pstrUsageTankSimulationDevice [] PROGMEM = "Tank Simu Dev";
    133 const char pstrUsageSpaceshipSimulationDevice [] PROGMEM = "Space Simu Dev";
    134 const char pstrUsageSubmarineSimulationDevice [] PROGMEM = "Subm Simu Dev";
    135 const char pstrUsageSailingSimulationDevice [] PROGMEM = "Sail Simu Dev";
    136 const char pstrUsageMotocicleSimulationDevice [] PROGMEM = "Moto Simu Dev";
    137 const char pstrUsageSportsSimulationDevice [] PROGMEM = "Sport Simu Dev";
    138 const char pstrUsageAirplaneSimulationDevice [] PROGMEM = "Airp Simu Dev";
    139 const char pstrUsageHelicopterSimulationDevice [] PROGMEM = "Heli Simu Dev";
    140 const char pstrUsageMagicCarpetSimulationDevice [] PROGMEM = "Magic Carpet Simu Dev";
    141 const char pstrUsageBicycleSimulationDevice [] PROGMEM = "Bike Simu Dev";
    142 const char pstrUsageFlightControlStick [] PROGMEM = "Flight Ctrl Stick";
    143 const char pstrUsageFlightStick [] PROGMEM = "Flight Stick";
    144 const char pstrUsageCyclicControl [] PROGMEM = "Cyclic Ctrl";
    145 const char pstrUsageCyclicTrim [] PROGMEM = "Cyclic Trim";
    146 const char pstrUsageFlightYoke [] PROGMEM = "Flight Yoke";
    147 const char pstrUsageTrackControl [] PROGMEM = "Track Ctrl";
    148 const char pstrUsageAileron [] PROGMEM = "Aileron";
    149 const char pstrUsageAileronTrim [] PROGMEM = "Aileron Trim";
    150 const char pstrUsageAntiTorqueControl [] PROGMEM = "Anti-Torque Ctrl";
    151 const char pstrUsageAutopilotEnable [] PROGMEM = "Autopilot Enable";
    152 const char pstrUsageChaffRelease [] PROGMEM = "Chaff Release";
    153 const char pstrUsageCollectiveControl [] PROGMEM = "Collective Ctrl";
    154 const char pstrUsageDiveBrake [] PROGMEM = "Dive Brake";
    155 const char pstrUsageElectronicCountermeasures [] PROGMEM = "El Countermeasures";
    156 const char pstrUsageElevator [] PROGMEM = "Elevator";
    157 const char pstrUsageElevatorTrim [] PROGMEM = "Elevator Trim";
    158 const char pstrUsageRudder [] PROGMEM = "Rudder";
    159 const char pstrUsageThrottle [] PROGMEM = "Throttle";
    160 const char pstrUsageFlightCommunications [] PROGMEM = "Flight Comm";
    161 const char pstrUsageFlareRelease [] PROGMEM = "Flare Release";
    162 const char pstrUsageLandingGear [] PROGMEM = "Landing Gear";
    163 const char pstrUsageToeBrake [] PROGMEM = "Toe Brake";
    164 const char pstrUsageTrigger [] PROGMEM = "Trigger";
    165 const char pstrUsageWeaponsArm [] PROGMEM = "Weapons Arm";
    166 const char pstrUsageWeaponsSelect [] PROGMEM = "Weapons Sel";
    167 const char pstrUsageWingFlaps [] PROGMEM = "Wing Flaps";
    168 const char pstrUsageAccelerator [] PROGMEM = "Accel";
    169 const char pstrUsageBrake [] PROGMEM = "Brake";
    170 const char pstrUsageClutch [] PROGMEM = "Clutch";
    171 const char pstrUsageShifter [] PROGMEM = "Shifter";
    172 const char pstrUsageSteering [] PROGMEM = "Steering";
    173 const char pstrUsageTurretDirection [] PROGMEM = "Turret Dir";
    174 const char pstrUsageBarrelElevation [] PROGMEM = "Barrel Ele";
    175 const char pstrUsageDivePlane [] PROGMEM = "Dive Plane";
    176 const char pstrUsageBallast [] PROGMEM = "Ballast";
    177 const char pstrUsageBicycleCrank [] PROGMEM = "Bicycle Crank";
    178 const char pstrUsageHandleBars [] PROGMEM = "Handle Bars";
    179 const char pstrUsageFrontBrake [] PROGMEM = "Front Brake";
    180 const char pstrUsageRearBrake [] PROGMEM = "Rear Brake";
    181 
    182 // VR Controls Page
    183 const char pstrUsageBelt [] PROGMEM = "Belt";
    184 const char pstrUsageBodySuit [] PROGMEM = "Body Suit";
    185 const char pstrUsageFlexor [] PROGMEM = "Flexor";
    186 const char pstrUsageGlove [] PROGMEM = "Glove";
    187 const char pstrUsageHeadTracker [] PROGMEM = "Head Track";
    188 const char pstrUsageHeadMountedDisplay [] PROGMEM = "Head Disp";
    189 const char pstrUsageHandTracker [] PROGMEM = "Hand Track";
    190 const char pstrUsageOculometer [] PROGMEM = "Oculometer";
    191 const char pstrUsageVest [] PROGMEM = "Vest";
    192 const char pstrUsageAnimatronicDevice [] PROGMEM = "Animat Dev";
    193 const char pstrUsageStereoEnable [] PROGMEM = "Stereo Enbl";
    194 const char pstrUsageDisplayEnable [] PROGMEM = "Display Enbl";
    195 
    196 // Sport Controls Page
    197 const char pstrUsageBaseballBat [] PROGMEM = "Baseball Bat";
    198 const char pstrUsageGolfClub [] PROGMEM = "Golf Club";
    199 const char pstrUsageRowingMachine [] PROGMEM = "Rowing Mach";
    200 const char pstrUsageTreadmill [] PROGMEM = "Treadmill";
    201 const char pstrUsageOar [] PROGMEM = "Oar";
    202 const char pstrUsageSlope [] PROGMEM = "Slope";
    203 const char pstrUsageRate [] PROGMEM = "Rate";
    204 const char pstrUsageStickSpeed [] PROGMEM = "Stick Speed";
    205 const char pstrUsageStickFaceAngle [] PROGMEM = "Stick Face Ang";
    206 const char pstrUsageStickHeelToe [] PROGMEM = "Stick Heel/Toe";
    207 const char pstrUsageStickFollowThough [] PROGMEM = "Stick Flw Thru";
    208 const char pstrUsageStickTempo [] PROGMEM = "Stick Tempo";
    209 const char pstrUsageStickType [] PROGMEM = "Stick Type";
    210 const char pstrUsageStickHeight [] PROGMEM = "Stick Hght";
    211 const char pstrUsagePutter [] PROGMEM = "Putter";
    212 const char pstrUsage1Iron [] PROGMEM = "1 Iron";
    213 const char pstrUsage2Iron [] PROGMEM = "2 Iron";
    214 const char pstrUsage3Iron [] PROGMEM = "3 Iron";
    215 const char pstrUsage4Iron [] PROGMEM = "4 Iron";
    216 const char pstrUsage5Iron [] PROGMEM = "5 Iron";
    217 const char pstrUsage6Iron [] PROGMEM = "6 Iron";
    218 const char pstrUsage7Iron [] PROGMEM = "7 Iron";
    219 const char pstrUsage8Iron [] PROGMEM = "8 Iron";
    220 const char pstrUsage9Iron [] PROGMEM = "9 Iron";
    221 const char pstrUsage10Iron [] PROGMEM = "10 Iron";
    222 const char pstrUsage11Iron [] PROGMEM = "11 Iron";
    223 const char pstrUsageSandWedge [] PROGMEM = "Sand Wedge";
    224 const char pstrUsageLoftWedge [] PROGMEM = "Loft Wedge";
    225 const char pstrUsagePowerWedge [] PROGMEM = "Pwr Wedge";
    226 const char pstrUsage1Wood [] PROGMEM = "1 Wood";
    227 const char pstrUsage3Wood [] PROGMEM = "3 Wood";
    228 const char pstrUsage5Wood [] PROGMEM = "5 Wood";
    229 const char pstrUsage7Wood [] PROGMEM = "7 Wood";
    230 const char pstrUsage9Wood [] PROGMEM = "9 Wood";
    231 
    232 // Game Controls Page
    233 const char pstrUsage3DGameController [] PROGMEM = "3D Game Ctrl";
    234 const char pstrUsagePinballDevice [] PROGMEM = "Pinball Dev";
    235 const char pstrUsageGunDevice [] PROGMEM = "Gun Dev";
    236 const char pstrUsagePointOfView [] PROGMEM = "POV";
    237 const char pstrUsageTurnRightLeft [] PROGMEM = "Turn Right Left";
    238 const char pstrUsagePitchForwardBackward [] PROGMEM = "Pitch Fwd/Back";
    239 const char pstrUsageRollRightLeft [] PROGMEM = "Roll Right/Left";
    240 const char pstrUsageMoveRightLeft [] PROGMEM = "Move Right/Left";
    241 const char pstrUsageMoveForwardBackward [] PROGMEM = "Move Fwd/Back";
    242 const char pstrUsageMoveUpDown [] PROGMEM = "Move Up/Down";
    243 const char pstrUsageLeanRightLeft [] PROGMEM = "Lean Right/Left";
    244 const char pstrUsageLeanForwardBackward [] PROGMEM = "Lean Fwd/Back";
    245 const char pstrUsageHeightOfPOV [] PROGMEM = "Height of POV";
    246 const char pstrUsageFlipper [] PROGMEM = "Flipper";
    247 const char pstrUsageSecondaryFlipper [] PROGMEM = "Second Flipper";
    248 const char pstrUsageBump [] PROGMEM = "Bump";
    249 const char pstrUsageNewGame [] PROGMEM = "New Game";
    250 const char pstrUsageShootBall [] PROGMEM = "Shoot Ball";
    251 const char pstrUsagePlayer [] PROGMEM = "Player";
    252 const char pstrUsageGunBolt [] PROGMEM = "Gun Bolt";
    253 const char pstrUsageGunClip [] PROGMEM = "Gun Clip";
    254 const char pstrUsageGunSelector [] PROGMEM = "Gun Sel";
    255 const char pstrUsageGunSingleShot [] PROGMEM = "Gun Sngl Shot";
    256 const char pstrUsageGunBurst [] PROGMEM = "Gun Burst";
    257 const char pstrUsageGunAutomatic [] PROGMEM = "Gun Auto";
    258 const char pstrUsageGunSafety [] PROGMEM = "Gun Safety";
    259 const char pstrUsageGamepadFireJump [] PROGMEM = "Gamepad Fire/Jump";
    260 const char pstrUsageGamepadTrigger [] PROGMEM = "Gamepad Trig";
    261 
    262 // Generic Device Controls Page
    263 const char pstrUsageBatteryStrength [] PROGMEM = "Bat Strength";
    264 const char pstrUsageWirelessChannel [] PROGMEM = "Wireless Ch";
    265 const char pstrUsageWirelessID [] PROGMEM = "Wireless ID";
    266 const char pstrUsageDiscoverWirelessControl [] PROGMEM = "Discover Wireless Ctrl";
    267 const char pstrUsageSecurityCodeCharEntered [] PROGMEM = "Sec Code Char Entrd";
    268 const char pstrUsageSecurityCodeCharErased [] PROGMEM = "Sec Code Char Erased";
    269 const char pstrUsageSecurityCodeCleared [] PROGMEM = "Sec Code Cleared";
    270 
    271 // LED Page
    272 const char pstrUsageNumLock [] PROGMEM = "Num Lock";
    273 const char pstrUsageCapsLock [] PROGMEM = "Caps Lock";
    274 const char pstrUsageScrollLock [] PROGMEM = "Scroll Lock";
    275 const char pstrUsageCompose [] PROGMEM = "Compose";
    276 const char pstrUsageKana [] PROGMEM = "Kana";
    277 const char pstrUsagePower [] PROGMEM = "Pwr";
    278 const char pstrUsageShift [] PROGMEM = "Shift";
    279 const char pstrUsageDoNotDisturb [] PROGMEM = "DND";
    280 const char pstrUsageMute [] PROGMEM = "Mute";
    281 const char pstrUsageToneEnable [] PROGMEM = "Tone Enbl";
    282 const char pstrUsageHighCutFilter [] PROGMEM = "High Cut Fltr";
    283 const char pstrUsageLowCutFilter [] PROGMEM = "Low Cut Fltr";
    284 const char pstrUsageEqualizerEnable [] PROGMEM = "Eq Enbl";
    285 const char pstrUsageSoundFieldOn [] PROGMEM = "Sound Field On";
    286 const char pstrUsageSurroundOn [] PROGMEM = "Surround On";
    287 const char pstrUsageRepeat [] PROGMEM = "Repeat";
    288 const char pstrUsageStereo [] PROGMEM = "Stereo";
    289 const char pstrUsageSamplingRateDetect [] PROGMEM = "Smpl Rate Detect";
    290 const char pstrUsageSpinning [] PROGMEM = "Spinning";
    291 const char pstrUsageCAV [] PROGMEM = "CAV";
    292 const char pstrUsageCLV [] PROGMEM = "CLV";
    293 const char pstrUsageRecordingFormatDetect [] PROGMEM = "Rec Format Detect";
    294 const char pstrUsageOffHook [] PROGMEM = "Off Hook";
    295 const char pstrUsageRing [] PROGMEM = "Ring";
    296 const char pstrUsageMessageWaiting [] PROGMEM = "Msg Wait";
    297 const char pstrUsageDataMode [] PROGMEM = "Data Mode";
    298 const char pstrUsageBatteryOperation [] PROGMEM = "Bat Op";
    299 const char pstrUsageBatteryOK [] PROGMEM = "Bat OK";
    300 const char pstrUsageBatteryLow [] PROGMEM = "Bat Low";
    301 const char pstrUsageSpeaker [] PROGMEM = "Speaker";
    302 const char pstrUsageHeadSet [] PROGMEM = "Head Set";
    303 const char pstrUsageHold [] PROGMEM = "Hold";
    304 const char pstrUsageMicrophone [] PROGMEM = "Mic";
    305 const char pstrUsageCoverage [] PROGMEM = "Coverage";
    306 const char pstrUsageNightMode [] PROGMEM = "Night Mode";
    307 const char pstrUsageSendCalls [] PROGMEM = "Send Calls";
    308 const char pstrUsageCallPickup [] PROGMEM = "Call Pickup";
    309 const char pstrUsageConference [] PROGMEM = "Conf";
    310 const char pstrUsageStandBy [] PROGMEM = "Stand-by";
    311 const char pstrUsageCameraOn [] PROGMEM = "Cam On";
    312 const char pstrUsageCameraOff [] PROGMEM = "Cam Off";
    313 const char pstrUsageOnLine [] PROGMEM = "On-Line";
    314 const char pstrUsageOffLine [] PROGMEM = "Off-Line";
    315 const char pstrUsageBusy [] PROGMEM = "Busy";
    316 const char pstrUsageReady [] PROGMEM = "Ready";
    317 const char pstrUsagePaperOut [] PROGMEM = "Paper Out";
    318 const char pstrUsagePaperJam [] PROGMEM = "Paper Jam";
    319 const char pstrUsageRemote [] PROGMEM = "Remote";
    320 const char pstrUsageForward [] PROGMEM = "Fwd";
    321 const char pstrUsageReverse [] PROGMEM = "Rev";
    322 const char pstrUsageStop [] PROGMEM = "Stop";
    323 const char pstrUsageRewind [] PROGMEM = "Rewind";
    324 const char pstrUsageFastForward [] PROGMEM = "Fast Fwd";
    325 const char pstrUsagePlay [] PROGMEM = "Play";
    326 const char pstrUsagePause [] PROGMEM = "Pause";
    327 const char pstrUsageRecord [] PROGMEM = "Rec";
    328 const char pstrUsageError [] PROGMEM = "Error";
    329 const char pstrUsageSelectedIndicator [] PROGMEM = "Usage Sel Ind";
    330 const char pstrUsageInUseIndicator [] PROGMEM = "Usage In Use Ind";
    331 const char pstrUsageMultiModeIndicator [] PROGMEM = "Usage Multi Mode Ind";
    332 const char pstrUsageIndicatorOn [] PROGMEM = "Ind On";
    333 const char pstrUsageIndicatorFlash [] PROGMEM = "Ind Flash";
    334 const char pstrUsageIndicatorSlowBlink [] PROGMEM = "Ind Slow Blk";
    335 const char pstrUsageIndicatorFastBlink [] PROGMEM = "Ind Fast Blk";
    336 const char pstrUsageIndicatorOff [] PROGMEM = "Ind Off";
    337 const char pstrUsageFlashOnTime [] PROGMEM = "Flash On Time";
    338 const char pstrUsageSlowBlinkOnTime [] PROGMEM = "Slow Blk On Time";
    339 const char pstrUsageSlowBlinkOffTime [] PROGMEM = "Slow Blk Off Time";
    340 const char pstrUsageFastBlinkOnTime [] PROGMEM = "Fast Blk On Time";
    341 const char pstrUsageFastBlinkOffTime [] PROGMEM = "Fast Blk Off Time";
    342 const char pstrUsageIndicatorColor [] PROGMEM = "Usage Ind Color";
    343 const char pstrUsageIndicatorRed [] PROGMEM = "Ind Red";
    344 const char pstrUsageIndicatorGreen [] PROGMEM = "Ind Green";
    345 const char pstrUsageIndicatorAmber [] PROGMEM = "Ind Amber";
    346 const char pstrUsageGenericIndicator [] PROGMEM = "Gen Ind";
    347 const char pstrUsageSystemSuspend [] PROGMEM = "Sys Suspend";
    348 const char pstrUsageExternalPowerConnected [] PROGMEM = "Ext Pwr Conn";
    349 
    350 // Telephony Usage Page
    351 const char pstrUsagePhone [] PROGMEM = "Phone";
    352 const char pstrUsageAnsweringMachine [] PROGMEM = "Answ Mach";
    353 const char pstrUsageMessageControls [] PROGMEM = "Msg Ctrls";
    354 const char pstrUsageHandset [] PROGMEM = "Handset";
    355 const char pstrUsageHeadset [] PROGMEM = "Headset";
    356 const char pstrUsageTelephonyKeyPad [] PROGMEM = "Tel Key Pad";
    357 const char pstrUsageProgrammableButton [] PROGMEM = "Prog Button";
    358 const char pstrUsageHookSwitch [] PROGMEM = "Hook Sw";
    359 const char pstrUsageFlash [] PROGMEM = "Flash";
    360 const char pstrUsageFeature [] PROGMEM = "Feature";
    361 //const char pstrUsageHold [] PROGMEM = "Hold";
    362 const char pstrUsageRedial [] PROGMEM = "Redial";
    363 const char pstrUsageTransfer [] PROGMEM = "Transfer";
    364 const char pstrUsageDrop [] PROGMEM = "Drop";
    365 const char pstrUsagePark [] PROGMEM = "Park";
    366 const char pstrUsageForwardCalls [] PROGMEM = "Fwd Calls";
    367 const char pstrUsageAlternateFunction [] PROGMEM = "Alt Func";
    368 const char pstrUsageLine [] PROGMEM = "Line";
    369 const char pstrUsageSpeakerPhone [] PROGMEM = "Spk Phone";
    370 //const char pstrUsageConference [] PROGMEM = "Conference";
    371 const char pstrUsageRingEnable [] PROGMEM = "Ring Enbl";
    372 const char pstrUsageRingSelect [] PROGMEM = "Ring Sel";
    373 const char pstrUsagePhoneMute [] PROGMEM = "Phone Mute";
    374 const char pstrUsageCallerID [] PROGMEM = "Caller ID";
    375 const char pstrUsageSend [] PROGMEM = "Send";
    376 const char pstrUsageSpeedDial [] PROGMEM = "Speed Dial";
    377 const char pstrUsageStoreNumber [] PROGMEM = "Store Num";
    378 const char pstrUsageRecallNumber [] PROGMEM = "Recall Num";
    379 const char pstrUsagePhoneDirectory [] PROGMEM = "Phone Dir";
    380 const char pstrUsageVoiceMail [] PROGMEM = "Voice Mail";
    381 const char pstrUsageScreenCalls [] PROGMEM = "Screen Calls";
    382 //const char pstrUsageDoNotDisturb [] PROGMEM = "Do Not Disturb";
    383 const char pstrUsageMessage [] PROGMEM = "Msg";
    384 const char pstrUsageAnswerOnOff [] PROGMEM = "Answer On/Off";
    385 const char pstrUsageInsideDialTone [] PROGMEM = "Inside Dial Tone";
    386 const char pstrUsageOutsideDialTone [] PROGMEM = "Outside Dial Tone";
    387 const char pstrUsageInsideRingTone [] PROGMEM = "Inside Ring Tone";
    388 const char pstrUsageOutsideRingTone [] PROGMEM = "Outside Ring Tone";
    389 const char pstrUsagePriorityRingTone [] PROGMEM = "Prior Ring Tone";
    390 const char pstrUsageInsideRingback [] PROGMEM = "Inside Ringback";
    391 const char pstrUsagePriorityRingback [] PROGMEM = "Priority Ringback";
    392 const char pstrUsageLineBusyTone [] PROGMEM = "Ln Busy Tone";
    393 const char pstrUsageReorderTone [] PROGMEM = "Reorder Tone";
    394 const char pstrUsageCallWaitingTone [] PROGMEM = "Call Wait Tone";
    395 const char pstrUsageConfirmationTone1 [] PROGMEM = "Cnfrm Tone1";
    396 const char pstrUsageConfirmationTone2 [] PROGMEM = "Cnfrm Tone2";
    397 const char pstrUsageTonesOff [] PROGMEM = "Tones Off";
    398 const char pstrUsageOutsideRingback [] PROGMEM = "Outside Ringback";
    399 const char pstrUsageRinger [] PROGMEM = "Ringer";
    400 const char pstrUsagePhoneKey0 [] PROGMEM = "0";
    401 const char pstrUsagePhoneKey1 [] PROGMEM = "1";
    402 const char pstrUsagePhoneKey2 [] PROGMEM = "2";
    403 const char pstrUsagePhoneKey3 [] PROGMEM = "3";
    404 const char pstrUsagePhoneKey4 [] PROGMEM = "4";
    405 const char pstrUsagePhoneKey5 [] PROGMEM = "5";
    406 const char pstrUsagePhoneKey6 [] PROGMEM = "6";
    407 const char pstrUsagePhoneKey7 [] PROGMEM = "7";
    408 const char pstrUsagePhoneKey8 [] PROGMEM = "8";
    409 const char pstrUsagePhoneKey9 [] PROGMEM = "9";
    410 const char pstrUsagePhoneKeyStar [] PROGMEM = "*";
    411 const char pstrUsagePhoneKeyPound [] PROGMEM = "#";
    412 const char pstrUsagePhoneKeyA [] PROGMEM = "A";
    413 const char pstrUsagePhoneKeyB [] PROGMEM = "B";
    414 const char pstrUsagePhoneKeyC [] PROGMEM = "C";
    415 const char pstrUsagePhoneKeyD [] PROGMEM = "D";
    416 
    417 // Consumer Usage Page
    418 const char pstrUsageConsumerControl [] PROGMEM = "Consumer Ctrl";
    419 const char pstrUsageNumericKeyPad [] PROGMEM = "Num Key Pad";
    420 //const char pstrUsageProgrammableButton [] PROGMEM = "Prog Btn";
    421 //const char pstrUsageMicrophone [] PROGMEM = "Mic";
    422 const char pstrUsageHeadphone [] PROGMEM = "Headphone";
    423 const char pstrUsageGraphicEqualizer [] PROGMEM = "Graph Eq";
    424 const char pstrUsagePlus10 [] PROGMEM = "+10";
    425 const char pstrUsagePlus100 [] PROGMEM = "+100";
    426 const char pstrUsageAMPM [] PROGMEM = "AM/PM";
    427 //const char pstrUsagePower [] PROGMEM = "Pwr";
    428 const char pstrUsageReset [] PROGMEM = "Reset";
    429 const char pstrUsageSleep [] PROGMEM = "Sleep";
    430 const char pstrUsageSleepAfter [] PROGMEM = "Sleep After";
    431 const char pstrUsageSleepMode [] PROGMEM = "Sleep Mode";
    432 const char pstrUsageIllumination [] PROGMEM = "Illumin";
    433 const char pstrUsageFunctionButtons [] PROGMEM = "Func Btns";
    434 const char pstrUsageMenu [] PROGMEM = "Menu";
    435 const char pstrUsageMenuPick [] PROGMEM = "Menu Pick";
    436 const char pstrUsageMenuUp [] PROGMEM = "Menu Up";
    437 const char pstrUsageMenuDown [] PROGMEM = "Menu Down";
    438 const char pstrUsageMenuLeft [] PROGMEM = "Menu Left";
    439 const char pstrUsageMenuRight [] PROGMEM = "Menu Right";
    440 const char pstrUsageMenuEscape [] PROGMEM = "Menu Esc";
    441 const char pstrUsageMenuValueIncrease [] PROGMEM = "Menu Val Inc";
    442 const char pstrUsageMenuValueDecrease [] PROGMEM = "Menu Val Dec";
    443 const char pstrUsageDataOnScreen [] PROGMEM = "Data On Scr";
    444 const char pstrUsageClosedCaption [] PROGMEM = "Closed Cptn";
    445 const char pstrUsageClosedCaptionSelect [] PROGMEM = "Closed Cptn Sel";
    446 const char pstrUsageVCRTV [] PROGMEM = "VCR/TV";
    447 const char pstrUsageBroadcastMode [] PROGMEM = "Brdcast Mode";
    448 const char pstrUsageSnapshot [] PROGMEM = "Snapshot";
    449 const char pstrUsageStill [] PROGMEM = "Still";
    450 const char pstrUsageSelection [] PROGMEM = "Sel";
    451 const char pstrUsageAssignSelection [] PROGMEM = "Assign Sel";
    452 const char pstrUsageModeStep [] PROGMEM = "Mode Step";
    453 const char pstrUsageRecallLast [] PROGMEM = "Recall Last";
    454 const char pstrUsageEnterChannel [] PROGMEM = "Entr Channel";
    455 const char pstrUsageOrderMovie [] PROGMEM = "Ord Movie";
    456 const char pstrUsageChannel [] PROGMEM = "Channel";
    457 const char pstrUsageMediaSelection [] PROGMEM = "Med Sel";
    458 const char pstrUsageMediaSelectComputer [] PROGMEM = "Med Sel Comp";
    459 const char pstrUsageMediaSelectTV [] PROGMEM = "Med Sel TV";
    460 const char pstrUsageMediaSelectWWW [] PROGMEM = "Med Sel WWW";
    461 const char pstrUsageMediaSelectDVD [] PROGMEM = "Med Sel DVD";
    462 const char pstrUsageMediaSelectTelephone [] PROGMEM = "Med Sel Tel";
    463 const char pstrUsageMediaSelectProgramGuide [] PROGMEM = "Med Sel PG";
    464 const char pstrUsageMediaSelectVideoPhone [] PROGMEM = "Med Sel Vid";
    465 const char pstrUsageMediaSelectGames [] PROGMEM = "Med Sel Games";
    466 const char pstrUsageMediaSelectMessages [] PROGMEM = "Med Sel Msg";
    467 const char pstrUsageMediaSelectCD [] PROGMEM = "Med Sel CD";
    468 const char pstrUsageMediaSelectVCR [] PROGMEM = "Med Sel VCR";
    469 const char pstrUsageMediaSelectTuner [] PROGMEM = "Med Sel Tuner";
    470 const char pstrUsageQuit [] PROGMEM = "Quit";
    471 const char pstrUsageHelp [] PROGMEM = "Help";
    472 const char pstrUsageMediaSelectTape [] PROGMEM = "Med Sel Tape";
    473 const char pstrUsageMediaSelectCable [] PROGMEM = "Med Sel Cbl";
    474 const char pstrUsageMediaSelectSatellite [] PROGMEM = "Med Sel Sat";
    475 const char pstrUsageMediaSelectSecurity [] PROGMEM = "Med Sel Secur";
    476 const char pstrUsageMediaSelectHome [] PROGMEM = "Med Sel Home";
    477 const char pstrUsageMediaSelectCall [] PROGMEM = "Med Sel Call";
    478 const char pstrUsageChannelIncrement [] PROGMEM = "Ch Inc";
    479 const char pstrUsageChannelDecrement [] PROGMEM = "Ch Dec";
    480 const char pstrUsageMediaSelectSAP [] PROGMEM = "Med Sel SAP";
    481 const char pstrUsageVCRPlus [] PROGMEM = "VCR+";
    482 const char pstrUsageOnce [] PROGMEM = "Once";
    483 const char pstrUsageDaily [] PROGMEM = "Daily";
    484 const char pstrUsageWeekly [] PROGMEM = "Weekly";
    485 const char pstrUsageMonthly [] PROGMEM = "Monthly";
    486 //const char pstrUsagePlay [] PROGMEM = "Play";
    487 //const char pstrUsagePause [] PROGMEM = "Pause";
    488 //const char pstrUsageRecord [] PROGMEM = "Rec";
    489 //const char pstrUsageFastForward [] PROGMEM = "FF";
    490 //const char pstrUsageRewind [] PROGMEM = "Rewind";
    491 const char pstrUsageScanNextTrack [] PROGMEM = "Next Track";
    492 const char pstrUsageScanPreviousTrack [] PROGMEM = "Prev Track";
    493 //const char pstrUsageStop [] PROGMEM = "Stop";
    494 const char pstrUsageEject [] PROGMEM = "Eject";
    495 const char pstrUsageRandomPlay [] PROGMEM = "Random";
    496 const char pstrUsageSelectDisk [] PROGMEM = "Sel Disk";
    497 const char pstrUsageEnterDisk [] PROGMEM = "Ent Disk";
    498 //const char pstrUsageRepeat [] PROGMEM = "Repeat";
    499 const char pstrUsageTracking [] PROGMEM = "Tracking";
    500 const char pstrUsageTrackNormal [] PROGMEM = "Trk Norm";
    501 const char pstrUsageSlowTracking [] PROGMEM = "Slow Trk";
    502 const char pstrUsageFrameForward [] PROGMEM = "Frm Fwd";
    503 const char pstrUsageFrameBackwards [] PROGMEM = "Frm Back";
    504 const char pstrUsageMark [] PROGMEM = "Mark";
    505 const char pstrUsageClearMark [] PROGMEM = "Clr Mark";
    506 const char pstrUsageRepeatFromMark [] PROGMEM = "Rpt Mark";
    507 const char pstrUsageReturnToMark [] PROGMEM = "Ret to Mark";
    508 const char pstrUsageSearchMarkForward [] PROGMEM = "Search Mark Fwd";
    509 const char pstrUsageSearchMarkBackwards [] PROGMEM = "Search Mark Back";
    510 const char pstrUsageCounterReset [] PROGMEM = "Counter Reset";
    511 const char pstrUsageShowCounter [] PROGMEM = "Show Counter";
    512 const char pstrUsageTrackingIncrement [] PROGMEM = "Track Inc";
    513 const char pstrUsageTrackingDecrement [] PROGMEM = "Track Dec";
    514 const char pstrUsageStopEject [] PROGMEM = "Stop/Eject";
    515 const char pstrUsagePlayPause [] PROGMEM = "Play/Pause";
    516 const char pstrUsagePlaySkip [] PROGMEM = "Play/Skip";
    517 const char pstrUsageVolume [] PROGMEM = "Vol";
    518 const char pstrUsageBalance [] PROGMEM = "Balance";
    519 //const char pstrUsageMute [] PROGMEM = "Mute";
    520 const char pstrUsageBass [] PROGMEM = "Bass";
    521 const char pstrUsageTreble [] PROGMEM = "Treble";
    522 const char pstrUsageBassBoost [] PROGMEM = "Bass Boost";
    523 const char pstrUsageSurroundMode [] PROGMEM = "Surround";
    524 const char pstrUsageLoudness [] PROGMEM = "Loud";
    525 const char pstrUsageMPX [] PROGMEM = "MPX";
    526 const char pstrUsageVolumeIncrement [] PROGMEM = "Vol Inc";
    527 const char pstrUsageVolumeDecrement [] PROGMEM = "Vol Dec";
    528 const char pstrUsageSpeedSelect [] PROGMEM = "Speed";
    529 const char pstrUsagePlaybackSpeed [] PROGMEM = "Play Speed";
    530 const char pstrUsageStandardPlay [] PROGMEM = "Std Play";
    531 const char pstrUsageLongPlay [] PROGMEM = "Long Play";
    532 const char pstrUsageExtendedPlay [] PROGMEM = "Ext Play";
    533 const char pstrUsageSlow [] PROGMEM = "Slow";
    534 const char pstrUsageFanEnable [] PROGMEM = "Fan Enbl";
    535 const char pstrUsageFanSpeed [] PROGMEM = "Fan Speed";
    536 const char pstrUsageLightEnable [] PROGMEM = "Light Enbl";
    537 const char pstrUsageLightIlluminationLevel [] PROGMEM = "Light Illum Lev";
    538 const char pstrUsageClimateControlEnable [] PROGMEM = "Climate Enbl";
    539 const char pstrUsageRoomTemperature [] PROGMEM = "Room Temp";
    540 const char pstrUsageSecurityEnable [] PROGMEM = "Secur Enbl";
    541 const char pstrUsageFireAlarm [] PROGMEM = "Fire Alm";
    542 const char pstrUsagePoliceAlarm [] PROGMEM = "Police Alm";
    543 const char pstrUsageProximity [] PROGMEM = "Prox";
    544 const char pstrUsageMotion [] PROGMEM = "Motion";
    545 const char pstrUsageDuresAlarm [] PROGMEM = "Dures Alm";
    546 const char pstrUsageHoldupAlarm [] PROGMEM = "Holdup Alm";
    547 const char pstrUsageMedicalAlarm [] PROGMEM = "Med Alm";
    548 const char pstrUsageBalanceRight [] PROGMEM = "Balance Right";
    549 const char pstrUsageBalanceLeft [] PROGMEM = "Balance Left";
    550 const char pstrUsageBassIncrement [] PROGMEM = "Bass Inc";
    551 const char pstrUsageBassDecrement [] PROGMEM = "Bass Dec";
    552 const char pstrUsageTrebleIncrement [] PROGMEM = "Treble Inc";
    553 const char pstrUsageTrebleDecrement [] PROGMEM = "Treble Dec";
    554 const char pstrUsageSpeakerSystem [] PROGMEM = "Spk Sys";
    555 const char pstrUsageChannelLeft [] PROGMEM = "Ch Left";
    556 const char pstrUsageChannelRight [] PROGMEM = "Ch Right";
    557 const char pstrUsageChannelCenter [] PROGMEM = "Ch Center";
    558 const char pstrUsageChannelFront [] PROGMEM = "Ch Front";
    559 const char pstrUsageChannelCenterFront [] PROGMEM = "Ch Cntr Front";
    560 const char pstrUsageChannelSide [] PROGMEM = "Ch Side";
    561 const char pstrUsageChannelSurround [] PROGMEM = "Ch Surround";
    562 const char pstrUsageChannelLowFreqEnhancement [] PROGMEM = "Ch Low Freq Enh";
    563 const char pstrUsageChannelTop [] PROGMEM = "Ch Top";
    564 const char pstrUsageChannelUnknown [] PROGMEM = "Ch Unk";
    565 const char pstrUsageSubChannel [] PROGMEM = "Sub-ch";
    566 const char pstrUsageSubChannelIncrement [] PROGMEM = "Sub-ch Inc";
    567 const char pstrUsageSubChannelDecrement [] PROGMEM = "Sub-ch Dec";
    568 const char pstrUsageAlternateAudioIncrement [] PROGMEM = "Alt Aud Inc";
    569 const char pstrUsageAlternateAudioDecrement [] PROGMEM = "Alt Aud Dec";
    570 const char pstrUsageApplicationLaunchButtons [] PROGMEM = "App Launch Btns";
    571 const char pstrUsageALLaunchButtonConfigTool [] PROGMEM = "AL Launch Conf Tl";
    572 const char pstrUsageALProgrammableButton [] PROGMEM = "AL Pgm Btn";
    573 const char pstrUsageALConsumerControlConfig [] PROGMEM = "AL Cons Ctrl Cfg";
    574 const char pstrUsageALWordProcessor [] PROGMEM = "AL Word Proc";
    575 const char pstrUsageALTextEditor [] PROGMEM = "AL Txt Edtr";
    576 const char pstrUsageALSpreadsheet [] PROGMEM = "AL Sprdsheet";
    577 const char pstrUsageALGraphicsEditor [] PROGMEM = "AL Graph Edtr";
    578 const char pstrUsageALPresentationApp [] PROGMEM = "AL Present App";
    579 const char pstrUsageALDatabaseApp [] PROGMEM = "AL DB App";
    580 const char pstrUsageALEmailReader [] PROGMEM = "AL E-mail Rdr";
    581 const char pstrUsageALNewsreader [] PROGMEM = "AL Newsrdr";
    582 const char pstrUsageALVoicemail [] PROGMEM = "AL Voicemail";
    583 const char pstrUsageALContactsAddressBook [] PROGMEM = "AL Addr Book";
    584 const char pstrUsageALCalendarSchedule [] PROGMEM = "AL Clndr/Schdlr";
    585 const char pstrUsageALTaskProjectManager [] PROGMEM = "AL Task/Prj Mgr";
    586 const char pstrUsageALLogJournalTimecard [] PROGMEM = "AL Log/Jrnl/Tmcrd";
    587 const char pstrUsageALCheckbookFinance [] PROGMEM = "AL Chckbook/Fin";
    588 const char pstrUsageALCalculator [] PROGMEM = "AL Calc";
    589 const char pstrUsageALAVCapturePlayback [] PROGMEM = "AL A/V Capt/Play";
    590 const char pstrUsageALLocalMachineBrowser [] PROGMEM = "AL Loc Mach Brow";
    591 const char pstrUsageALLANWANBrow [] PROGMEM = "AL LAN/WAN Brow";
    592 const char pstrUsageALInternetBrowser [] PROGMEM = "AL I-net Brow";
    593 const char pstrUsageALRemoteNetISPConnect [] PROGMEM = "AL Rem Net Con";
    594 const char pstrUsageALNetworkConference [] PROGMEM = "AL Net Conf";
    595 const char pstrUsageALNetworkChat [] PROGMEM = "AL Net Chat";
    596 const char pstrUsageALTelephonyDialer [] PROGMEM = "AL Tel/Dial";
    597 const char pstrUsageALLogon [] PROGMEM = "AL Logon";
    598 const char pstrUsageALLogoff [] PROGMEM = "AL Logoff";
    599 const char pstrUsageALLogonLogoff [] PROGMEM = "AL Logon/Logoff";
    600 const char pstrUsageALTermLockScrSav [] PROGMEM = "AL Term Lock/Scr Sav";
    601 const char pstrUsageALControlPannel [] PROGMEM = "AL Ctrl Pan";
    602 const char pstrUsageALCommandLineProcessorRun [] PROGMEM = "AL Cmd/Run";
    603 const char pstrUsageALProcessTaskManager [] PROGMEM = "AL Task Mgr";
    604 const char pstrUsageALSelectTaskApplication [] PROGMEM = "AL Sel App";
    605 const char pstrUsageALNextTaskApplication [] PROGMEM = "AL Next App";
    606 const char pstrUsageALPreviousTaskApplication [] PROGMEM = "AL Prev App";
    607 const char pstrUsageALPreemptiveHaltTaskApp [] PROGMEM = "AL Prmpt Halt App";
    608 const char pstrUsageALIntegratedHelpCenter [] PROGMEM = "AL Hlp Cntr";
    609 const char pstrUsageALDocuments [] PROGMEM = "AL Docs";
    610 const char pstrUsageALThesaurus [] PROGMEM = "AL Thsrs";
    611 const char pstrUsageALDictionary [] PROGMEM = "AL Dict";
    612 const char pstrUsageALDesktop [] PROGMEM = "AL Desktop";
    613 const char pstrUsageALSpellCheck [] PROGMEM = "AL Spell Chk";
    614 const char pstrUsageALGrammarCheck [] PROGMEM = "AL Gram Chk";
    615 const char pstrUsageALWirelessStatus [] PROGMEM = "AL Wireless Sts";
    616 const char pstrUsageALKeyboardLayout [] PROGMEM = "AL Kbd Layout";
    617 const char pstrUsageALVirusProtection [] PROGMEM = "AL Vir Protect";
    618 const char pstrUsageALEncryption [] PROGMEM = "AL Encrypt";
    619 const char pstrUsageALScreenSaver [] PROGMEM = "AL Scr Sav";
    620 const char pstrUsageALAlarms [] PROGMEM = "AL Alarms";
    621 const char pstrUsageALClock [] PROGMEM = "AL Clock";
    622 const char pstrUsageALFileBrowser [] PROGMEM = "AL File Brow";
    623 const char pstrUsageALPowerStatus [] PROGMEM = "AL Pwr Sts";
    624 const char pstrUsageALImageBrowser [] PROGMEM = "AL Img Brow";
    625 const char pstrUsageALAudioBrowser [] PROGMEM = "AL Aud Brow";
    626 const char pstrUsageALMovieBrowser [] PROGMEM = "AL Mov Brow";
    627 const char pstrUsageALDigitalRightsManager [] PROGMEM = "AL Dig Rights Mgr";
    628 const char pstrUsageALDigitalWallet [] PROGMEM = "AL Dig Wallet";
    629 const char pstrUsageALInstantMessaging [] PROGMEM = "AL Inst Msg";
    630 const char pstrUsageALOEMFeaturesBrowser [] PROGMEM = "AL OEM Tips Brow";
    631 const char pstrUsageALOEMHelp [] PROGMEM = "AL OEM Hlp";
    632 const char pstrUsageALOnlineCommunity [] PROGMEM = "AL Online Com";
    633 const char pstrUsageALEntertainmentContentBrow [] PROGMEM = "AL Ent Cont Brow";
    634 const char pstrUsageALOnlineShoppingBrowser [] PROGMEM = "AL Online Shop Brow";
    635 const char pstrUsageALSmartCardInfoHelp [] PROGMEM = "AL SmartCard Inf";
    636 const char pstrUsageALMarketMonitorFinBrowser [] PROGMEM = "AL Market Brow";
    637 const char pstrUsageALCustomCorpNewsBrowser [] PROGMEM = "AL Cust Corp News Brow";
    638 const char pstrUsageALOnlineActivityBrowser [] PROGMEM = "AL Online Act Brow";
    639 const char pstrUsageALResearchSearchBrowser [] PROGMEM = "AL Search Brow";
    640 const char pstrUsageALAudioPlayer [] PROGMEM = "AL Aud Player";
    641 const char pstrUsageGenericGUIAppControls [] PROGMEM = "Gen GUI App Ctrl";
    642 const char pstrUsageACNew [] PROGMEM = "AC New";
    643 const char pstrUsageACOpen [] PROGMEM = "AC Open";
    644 const char pstrUsageACClose [] PROGMEM = "AC Close";
    645 const char pstrUsageACExit [] PROGMEM = "AC Exit";
    646 const char pstrUsageACMaximize [] PROGMEM = "AC Max";
    647 const char pstrUsageACMinimize [] PROGMEM = "AC Min";
    648 const char pstrUsageACSave [] PROGMEM = "AC Save";
    649 const char pstrUsageACPrint [] PROGMEM = "AC Print";
    650 const char pstrUsageACProperties [] PROGMEM = "AC Prop";
    651 const char pstrUsageACUndo [] PROGMEM = "AC Undo";
    652 const char pstrUsageACCopy [] PROGMEM = "AC Copy";
    653 const char pstrUsageACCut [] PROGMEM = "AC Cut";
    654 const char pstrUsageACPaste [] PROGMEM = "AC Paste";
    655 const char pstrUsageACSelectAll [] PROGMEM = "AC Sel All";
    656 const char pstrUsageACFind [] PROGMEM = "AC Find";
    657 const char pstrUsageACFindAndReplace [] PROGMEM = "AC Find/Replace";
    658 const char pstrUsageACSearch [] PROGMEM = "AC Search";
    659 const char pstrUsageACGoto [] PROGMEM = "AC Goto";
    660 const char pstrUsageACHome [] PROGMEM = "AC Home";
    661 const char pstrUsageACBack [] PROGMEM = "AC Back";
    662 const char pstrUsageACForward [] PROGMEM = "AC Fwd";
    663 const char pstrUsageACStop [] PROGMEM = "AC Stop";
    664 const char pstrUsageACRefresh [] PROGMEM = "AC Refresh";
    665 const char pstrUsageACPreviousLink [] PROGMEM = "AC Prev Link";
    666 const char pstrUsageACNextLink [] PROGMEM = "AC Next Link";
    667 const char pstrUsageACBookmarks [] PROGMEM = "AC Bkmarks";
    668 const char pstrUsageACHistory [] PROGMEM = "AC Hist";
    669 const char pstrUsageACSubscriptions [] PROGMEM = "AC Subscr";
    670 const char pstrUsageACZoomIn [] PROGMEM = "AC Zoom In";
    671 const char pstrUsageACZoomOut [] PROGMEM = "AC Zoom Out";
    672 const char pstrUsageACZoom [] PROGMEM = "AC Zoom";
    673 const char pstrUsageACFullScreenView [] PROGMEM = "AC Full Scr";
    674 const char pstrUsageACNormalView [] PROGMEM = "AC Norm View";
    675 const char pstrUsageACViewToggle [] PROGMEM = "AC View Tgl";
    676 const char pstrUsageACScrollUp [] PROGMEM = "AC Scroll Up";
    677 const char pstrUsageACScrollDown [] PROGMEM = "AC Scroll Down";
    678 const char pstrUsageACScroll [] PROGMEM = "AC Scroll";
    679 const char pstrUsageACPanLeft [] PROGMEM = "AC Pan Left";
    680 const char pstrUsageACPanRight [] PROGMEM = "AC Pan Right";
    681 const char pstrUsageACPan [] PROGMEM = "AC Pan";
    682 const char pstrUsageACNewWindow [] PROGMEM = "AC New Wnd";
    683 const char pstrUsageACTileHoriz [] PROGMEM = "AC Tile Horiz";
    684 const char pstrUsageACTileVert [] PROGMEM = "AC Tile Vert";
    685 const char pstrUsageACFormat [] PROGMEM = "AC Frmt";
    686 const char pstrUsageACEdit [] PROGMEM = "AC Edit";
    687 const char pstrUsageACBold [] PROGMEM = "AC Bold";
    688 const char pstrUsageACItalics [] PROGMEM = "AC Ital";
    689 const char pstrUsageACUnderline [] PROGMEM = "AC Under";
    690 const char pstrUsageACStrikethrough [] PROGMEM = "AC Strike";
    691 const char pstrUsageACSubscript [] PROGMEM = "AC Sub";
    692 const char pstrUsageACSuperscript [] PROGMEM = "AC Super";
    693 const char pstrUsageACAllCaps [] PROGMEM = "AC All Caps";
    694 const char pstrUsageACRotate [] PROGMEM = "AC Rotate";
    695 const char pstrUsageACResize [] PROGMEM = "AC Resize";
    696 const char pstrUsageACFlipHorizontal [] PROGMEM = "AC Flp H";
    697 const char pstrUsageACFlipVertical [] PROGMEM = "AC Flp V";
    698 const char pstrUsageACMirrorHorizontal [] PROGMEM = "AC Mir H";
    699 const char pstrUsageACMirrorVertical [] PROGMEM = "AC Mir V";
    700 const char pstrUsageACFontSelect [] PROGMEM = "AC Fnt Sel";
    701 const char pstrUsageACFontColor [] PROGMEM = "AC Fnt Clr";
    702 const char pstrUsageACFontSize [] PROGMEM = "AC Fnt Size";
    703 const char pstrUsageACJustifyLeft [] PROGMEM = "AC Just Left";
    704 const char pstrUsageACJustifyCenterH [] PROGMEM = "AC Just Cent H";
    705 const char pstrUsageACJustifyRight [] PROGMEM = "AC Just Right";
    706 const char pstrUsageACJustifyBlockH [] PROGMEM = "AC Just Block H";
    707 const char pstrUsageACJustifyTop [] PROGMEM = "AC Just Top";
    708 const char pstrUsageACJustifyCenterV [] PROGMEM = "AC Just Cent V";
    709 const char pstrUsageACJustifyBottom [] PROGMEM = "AC Just Bot";
    710 const char pstrUsageACJustifyBlockV [] PROGMEM = "AC Just Block V";
    711 const char pstrUsageACIndentDecrease [] PROGMEM = "AC Indent Dec";
    712 const char pstrUsageACIndentIncrease [] PROGMEM = "AC Indent Inc";
    713 const char pstrUsageACNumberedList [] PROGMEM = "AC Num List";
    714 const char pstrUsageACRestartNumbering [] PROGMEM = "AC Res Num";
    715 const char pstrUsageACBulletedList [] PROGMEM = "AC Blt List";
    716 const char pstrUsageACPromote [] PROGMEM = "AC Promote";
    717 const char pstrUsageACDemote [] PROGMEM = "AC Demote";
    718 const char pstrUsageACYes [] PROGMEM = "AC Yes";
    719 const char pstrUsageACNo [] PROGMEM = "AC No";
    720 const char pstrUsageACCancel [] PROGMEM = "AC Cancel";
    721 const char pstrUsageACCatalog [] PROGMEM = "AC Ctlg";
    722 const char pstrUsageACBuyChkout [] PROGMEM = "AC Buy";
    723 const char pstrUsageACAddToCart [] PROGMEM = "AC Add2Cart";
    724 const char pstrUsageACExpand [] PROGMEM = "AC Xpnd";
    725 const char pstrUsageACExpandAll [] PROGMEM = "AC Xpand All";
    726 const char pstrUsageACCollapse [] PROGMEM = "AC Collapse";
    727 const char pstrUsageACCollapseAll [] PROGMEM = "AC Collapse All";
    728 const char pstrUsageACPrintPreview [] PROGMEM = "AC Prn Prevw";
    729 const char pstrUsageACPasteSpecial [] PROGMEM = "AC Paste Spec";
    730 const char pstrUsageACInsertMode [] PROGMEM = "AC Ins Mode";
    731 const char pstrUsageACDelete [] PROGMEM = "AC Del";
    732 const char pstrUsageACLock [] PROGMEM = "AC Lock";
    733 const char pstrUsageACUnlock [] PROGMEM = "AC Unlock";
    734 const char pstrUsageACProtect [] PROGMEM = "AC Prot";
    735 const char pstrUsageACUnprotect [] PROGMEM = "AC Unprot";
    736 const char pstrUsageACAttachComment [] PROGMEM = "AC Attach Cmnt";
    737 const char pstrUsageACDeleteComment [] PROGMEM = "AC Del Cmnt";
    738 const char pstrUsageACViewComment [] PROGMEM = "AC View Cmnt";
    739 const char pstrUsageACSelectWord [] PROGMEM = "AC Sel Word";
    740 const char pstrUsageACSelectSentence [] PROGMEM = "AC Sel Sntc";
    741 const char pstrUsageACSelectParagraph [] PROGMEM = "AC Sel Para";
    742 const char pstrUsageACSelectColumn [] PROGMEM = "AC Sel Col";
    743 const char pstrUsageACSelectRow [] PROGMEM = "AC Sel Row";
    744 const char pstrUsageACSelectTable [] PROGMEM = "AC Sel Tbl";
    745 const char pstrUsageACSelectObject [] PROGMEM = "AC Sel Obj";
    746 const char pstrUsageACRedoRepeat [] PROGMEM = "AC Redo";
    747 const char pstrUsageACSort [] PROGMEM = "AC Sort";
    748 const char pstrUsageACSortAscending [] PROGMEM = "AC Sort Asc";
    749 const char pstrUsageACSortDescending [] PROGMEM = "AC Sort Desc";
    750 const char pstrUsageACFilter [] PROGMEM = "AC Filt";
    751 const char pstrUsageACSetClock [] PROGMEM = "AC Set Clk";
    752 const char pstrUsageACViewClock [] PROGMEM = "AC View Clk";
    753 const char pstrUsageACSelectTimeZone [] PROGMEM = "AC Sel Time Z";
    754 const char pstrUsageACEditTimeZone [] PROGMEM = "AC Edt Time Z";
    755 const char pstrUsageACSetAlarm [] PROGMEM = "AC Set Alm";
    756 const char pstrUsageACClearAlarm [] PROGMEM = "AC Clr Alm";
    757 const char pstrUsageACSnoozeAlarm [] PROGMEM = "AC Snz Alm";
    758 const char pstrUsageACResetAlarm [] PROGMEM = "AC Rst Alm";
    759 const char pstrUsageACSyncronize [] PROGMEM = "AC Sync";
    760 const char pstrUsageACSendReceive [] PROGMEM = "AC Snd/Rcv";
    761 const char pstrUsageACSendTo [] PROGMEM = "AC Snd To";
    762 const char pstrUsageACReply [] PROGMEM = "AC Reply";
    763 const char pstrUsageACReplyAll [] PROGMEM = "AC Reply All";
    764 const char pstrUsageACForwardMessage [] PROGMEM = "AC Fwd Msg";
    765 const char pstrUsageACSend [] PROGMEM = "AC Snd";
    766 const char pstrUsageACAttachFile [] PROGMEM = "AC Att File";
    767 const char pstrUsageACUpload [] PROGMEM = "AC Upld";
    768 const char pstrUsageACDownload [] PROGMEM = "AC Dnld";
    769 const char pstrUsageACSetBorders [] PROGMEM = "AC Set Brd";
    770 const char pstrUsageACInsertRow [] PROGMEM = "AC Ins Row";
    771 const char pstrUsageACInsertColumn [] PROGMEM = "AC Ins Col";
    772 const char pstrUsageACInsertFile [] PROGMEM = "AC Ins File";
    773 const char pstrUsageACInsertPicture [] PROGMEM = "AC Ins Pic";
    774 const char pstrUsageACInsertObject [] PROGMEM = "AC Ins Obj";
    775 const char pstrUsageACInsertSymbol [] PROGMEM = "AC Ins Sym";
    776 const char pstrUsageACSaveAndClose [] PROGMEM = "AC Sav&Cls";
    777 const char pstrUsageACRename [] PROGMEM = "AC Rename";
    778 const char pstrUsageACMerge [] PROGMEM = "AC Merge";
    779 const char pstrUsageACSplit [] PROGMEM = "AC Split";
    780 const char pstrUsageACDistributeHorizontaly [] PROGMEM = "AC Dist Hor";
    781 const char pstrUsageACDistributeVerticaly [] PROGMEM = "AC Dist Ver";
    782 
    783 // Digitaizers
    784 const char pstrUsageDigitizer [] PROGMEM = "Digitizer";
    785 const char pstrUsagePen [] PROGMEM = "Pen";
    786 const char pstrUsageLightPen [] PROGMEM = "Light Pen";
    787 const char pstrUsageTouchScreen [] PROGMEM = "Touch Scr";
    788 const char pstrUsageTouchPad [] PROGMEM = "Touch Pad";
    789 const char pstrUsageWhiteBoard [] PROGMEM = "White Brd";
    790 const char pstrUsageCoordinateMeasuringMachine [] PROGMEM = "Coord Meas Mach";
    791 const char pstrUsage3DDigitizer [] PROGMEM = "3D Dgtz";
    792 const char pstrUsageStereoPlotter [] PROGMEM = "Stereo Plot";
    793 const char pstrUsageArticulatedArm [] PROGMEM = "Art Arm";
    794 const char pstrUsageArmature [] PROGMEM = "Armature";
    795 const char pstrUsageMultiplePointDigitizer [] PROGMEM = "Multi Point Dgtz";
    796 const char pstrUsageFreeSpaceWand [] PROGMEM = "Free Space Wand";
    797 const char pstrUsageStylus [] PROGMEM = "Stylus";
    798 const char pstrUsagePuck [] PROGMEM = "Puck";
    799 const char pstrUsageFinger [] PROGMEM = "Finger";
    800 const char pstrUsageTipPressure [] PROGMEM = "Tip Press";
    801 const char pstrUsageBarrelPressure [] PROGMEM = "Brl Press";
    802 const char pstrUsageInRange [] PROGMEM = "In Range";
    803 const char pstrUsageTouch [] PROGMEM = "Touch";
    804 const char pstrUsageUntouch [] PROGMEM = "Untouch";
    805 const char pstrUsageTap [] PROGMEM = "Tap";
    806 const char pstrUsageQuality [] PROGMEM = "Qlty";
    807 const char pstrUsageDataValid [] PROGMEM = "Data Valid";
    808 const char pstrUsageTransducerIndex [] PROGMEM = "Transducer Ind";
    809 const char pstrUsageTabletFunctionKeys [] PROGMEM = "Tabl Func Keys";
    810 const char pstrUsageProgramChangeKeys [] PROGMEM = "Pgm Chng Keys";
    811 //const char pstrUsageBatteryStrength [] PROGMEM = "Bat Strength";
    812 const char pstrUsageInvert [] PROGMEM = "Invert";
    813 const char pstrUsageXTilt [] PROGMEM = "X Tilt";
    814 const char pstrUsageYTilt [] PROGMEM = "Y Tilt";
    815 const char pstrUsageAzimuth [] PROGMEM = "Azimuth";
    816 const char pstrUsageAltitude [] PROGMEM = "Altitude";
    817 const char pstrUsageTwist [] PROGMEM = "Twist";
    818 const char pstrUsageTipSwitch [] PROGMEM = "Tip Sw";
    819 const char pstrUsageSecondaryTipSwitch [] PROGMEM = "Scnd Tip Sw";
    820 const char pstrUsageBarrelSwitch [] PROGMEM = "Brl Sw";
    821 const char pstrUsageEraser [] PROGMEM = "Eraser";
    822 const char pstrUsageTabletPick [] PROGMEM = "Tbl Pick";
    823 
    824 // Alphanumeric Display Page
    825 const char pstrUsageAlphanumericDisplay [] PROGMEM = "Alphanum Disp";
    826 const char pstrUsageBitmappedDisplay [] PROGMEM = "Bmp Disp";
    827 const char pstrUsageDisplayAttributesReport [] PROGMEM = "Disp Attr Rpt";
    828 const char pstrUsageASCIICharacterSet [] PROGMEM = "ASCII chset";
    829 const char pstrUsageDataReadBack [] PROGMEM = "Data Rd Back";
    830 const char pstrUsageFontReadBack [] PROGMEM = "Fnt Rd Back";
    831 const char pstrUsageDisplayControlReport [] PROGMEM = "Disp Ctrl Rpt";
    832 const char pstrUsageClearDisplay [] PROGMEM = "Clr Disp";
    833 //const char pstrUsageDisplayEnable [] PROGMEM = "Disp Enbl";
    834 const char pstrUsageScreenSaverDelay [] PROGMEM = "Scr Sav Delay";
    835 const char pstrUsageScreenSaverEnable [] PROGMEM = "Scr Sav Enbl";
    836 const char pstrUsageVerticalScroll [] PROGMEM = "V Scroll";
    837 const char pstrUsageHorizontalScroll [] PROGMEM = "H Scroll";
    838 const char pstrUsageCharacterReport [] PROGMEM = "Char Rpt";
    839 const char pstrUsageDisplayData [] PROGMEM = "Disp Data";
    840 const char pstrUsageDisplayStatus [] PROGMEM = "Disp Stat";
    841 const char pstrUsageStatusNotReady [] PROGMEM = "Stat !Ready";
    842 const char pstrUsageStatusReady [] PROGMEM = "Stat Ready";
    843 const char pstrUsageErrorNotALoadableCharacter [] PROGMEM = "Err Not Ld Char";
    844 const char pstrUsageErrorFotDataCanNotBeRead [] PROGMEM = "Fnt Data Rd Err";
    845 const char pstrUsageCursorPositionReport [] PROGMEM = "Cur Pos Rpt";
    846 const char pstrUsageRow [] PROGMEM = "Row";
    847 const char pstrUsageColumn [] PROGMEM = "Col";
    848 const char pstrUsageRows [] PROGMEM = "Rows";
    849 const char pstrUsageColumns [] PROGMEM = "Cols";
    850 const char pstrUsageCursorPixelPosition [] PROGMEM = "Cur Pix Pos";
    851 const char pstrUsageCursorMode [] PROGMEM = "Cur Mode";
    852 const char pstrUsageCursorEnable [] PROGMEM = "Cur Enbl";
    853 const char pstrUsageCursorBlink [] PROGMEM = "Cur Blnk";
    854 const char pstrUsageFontReport [] PROGMEM = "Fnt Rpt";
    855 const char pstrUsageFontData [] PROGMEM = "Fnt Data";
    856 const char pstrUsageCharacterWidth [] PROGMEM = "Char Wdth";
    857 const char pstrUsageCharacterHeight [] PROGMEM = "Char Hght";
    858 const char pstrUsageCharacterSpacingHorizontal [] PROGMEM = "Char Space H";
    859 const char pstrUsageCharacterSpacingVertical [] PROGMEM = "Char Space V";
    860 const char pstrUsageUnicodeCharset [] PROGMEM = "Unicode Char";
    861 const char pstrUsageFont7Segment [] PROGMEM = "Fnt 7-seg";
    862 const char pstrUsage7SegmentDirectMap [] PROGMEM = "7-seg map";
    863 const char pstrUsageFont14Segment [] PROGMEM = "Fnt 14-seg";
    864 const char pstrUsage14SegmentDirectMap [] PROGMEM = "14-seg map";
    865 const char pstrUsageDisplayBrightness [] PROGMEM = "Disp Bright";
    866 const char pstrUsageDisplayContrast [] PROGMEM = "Disp Cntrst";
    867 const char pstrUsageCharacterAttribute [] PROGMEM = "Char Attr";
    868 const char pstrUsageAttributeReadback [] PROGMEM = "Attr Readbk";
    869 const char pstrUsageAttributeData [] PROGMEM = "Attr Data";
    870 const char pstrUsageCharAttributeEnhance [] PROGMEM = "Char Attr Enh";
    871 const char pstrUsageCharAttributeUnderline [] PROGMEM = "Char Attr Undl";
    872 const char pstrUsageCharAttributeBlink [] PROGMEM = "Char Attr Blnk";
    873 const char pstrUsageBitmapSizeX [] PROGMEM = "Bmp Size X";
    874 const char pstrUsageBitmapSizeY [] PROGMEM = "Bmp Size Y";
    875 const char pstrUsageBitDepthFormat [] PROGMEM = "Bit Dpth Fmt";
    876 const char pstrUsageDisplayOrientation [] PROGMEM = "Disp Ornt";
    877 const char pstrUsagePaletteReport [] PROGMEM = "Pal Rpt";
    878 const char pstrUsagePaletteDataSize [] PROGMEM = "Pal Data Size";
    879 const char pstrUsagePaletteDataOffset [] PROGMEM = "Pal Data Off";
    880 const char pstrUsagePaletteData [] PROGMEM = "Pal Data";
    881 const char pstrUsageBlitReport [] PROGMEM = "Blit Rpt";
    882 const char pstrUsageBlitRectangleX1 [] PROGMEM = "Blit Rect X1";
    883 const char pstrUsageBlitRectangleY1 [] PROGMEM = "Blit Rect Y1";
    884 const char pstrUsageBlitRectangleX2 [] PROGMEM = "Blit Rect X2";
    885 const char pstrUsageBlitRectangleY2 [] PROGMEM = "Blit Rect Y2";
    886 const char pstrUsageBlitData [] PROGMEM = "Blit Data";
    887 const char pstrUsageSoftButton [] PROGMEM = "Soft Btn";
    888 const char pstrUsageSoftButtonID [] PROGMEM = "Soft Btn ID";
    889 const char pstrUsageSoftButtonSide [] PROGMEM = "Soft Btn Side";
    890 const char pstrUsageSoftButtonOffset1 [] PROGMEM = "Soft Btn Off1";
    891 const char pstrUsageSoftButtonOffset2 [] PROGMEM = "Soft Btn Off2";
    892 const char pstrUsageSoftButtonReport [] PROGMEM = "Soft Btn Rpt";
    893 
    894 // Medical Instrument Page
    895 const char pstrUsageMedicalUltrasound [] PROGMEM = "Med Ultrasnd";
    896 const char pstrUsageVCRAcquisition [] PROGMEM = "VCR/Acq";
    897 const char pstrUsageFreezeThaw [] PROGMEM = "Freeze";
    898 const char pstrUsageClipStore [] PROGMEM = "Clip Store";
    899 const char pstrUsageUpdate [] PROGMEM = "Update";
    900 const char pstrUsageNext [] PROGMEM = "Next";
    901 const char pstrUsageSave [] PROGMEM = "Save";
    902 const char pstrUsagePrint [] PROGMEM = "Print";
    903 const char pstrUsageMicrophoneEnable [] PROGMEM = "Mic Enbl";
    904 const char pstrUsageCine [] PROGMEM = "Cine";
    905 const char pstrUsageTransmitPower [] PROGMEM = "Trans Pwr";
    906 //const char pstrUsageVolume [] PROGMEM = "Vol";
    907 const char pstrUsageFocus [] PROGMEM = "Focus";
    908 const char pstrUsageDepth [] PROGMEM = "Depth";
    909 const char pstrUsageSoftStepPrimary [] PROGMEM = "Soft Stp-Pri";
    910 const char pstrUsageSoftStepSecondary [] PROGMEM = "Soft Stp-Sec";
    911 const char pstrUsageDepthGainCompensation [] PROGMEM = "Dpth Gain Comp";
    912 const char pstrUsageZoomSelect [] PROGMEM = "Zoom Sel";
    913 const char pstrUsageZoomAdjust [] PROGMEM = "Zoom Adj";
    914 const char pstrUsageSpectralDopplerModeSelect [] PROGMEM = "Spec Dop Mode Sel";
    915 const char pstrUsageSpectralDopplerModeAdjust [] PROGMEM = "Spec Dop Mode Adj";
    916 const char pstrUsageColorDopplerModeSelect [] PROGMEM = "Color Dop Mode Sel";
    917 const char pstrUsageColorDopplerModeAdjust [] PROGMEM = "Color Dop Mode Adj";
    918 const char pstrUsageMotionModeSelect [] PROGMEM = "Motion Mode Sel";
    919 const char pstrUsageMotionModeAdjust [] PROGMEM = "Motion Mode Adj";
    920 const char pstrUsage2DModeSelect [] PROGMEM = "2D Mode Sel";
    921 const char pstrUsage2DModeAdjust [] PROGMEM = "2D Mode Adj";
    922 const char pstrUsageSoftControlSelect [] PROGMEM = "Soft Ctrl Sel";
    923 const char pstrUsageSoftControlAdjust [] PROGMEM = "Soft Ctrl Adj";
    924 
    925 //extern const char *usagePageTitles0[15];
    926 //const char *usagePageTitles1[];
    927 //const char *genDesktopTitles0[];
    928 //const char *genDesktopTitles1[];
    929 //const char *genDesktopTitles2[];
    930 //const char *genDesktopTitles3[];
    931 //const char *genDesktopTitles4[];
    932 //const char *simuTitles0[];
    933 //const char *simuTitles1[];
    934 //const char *simuTitles2[];
    935 //const char *vrTitles0[];
    936 //const char *vrTitles1[];
    937 //const char *sportsCtrlTitles0[];
    938 //const char *sportsCtrlTitles1[];
    939 //const char *sportsCtrlTitles2[];
    940 //const char *gameTitles0[];
    941 //const char *gameTitles1[];
    942 //const char *genDevCtrlTitles[];
    943 //const char *ledTitles[];
    944 //const char *telTitles0[];
    945 //const char *telTitles1[];
    946 //const char *telTitles2[];
    947 //const char *telTitles3[];
    948 //const char *telTitles4[];
    949 //const char *telTitles5[];
    950 //const char *consTitles0[];
    951 //const char *consTitles1[];
    952 //const char *consTitles2[];
    953 //const char *consTitles3[];
    954 //const char *consTitles4[];
    955 //const char *consTitles5[];
    956 //const char *consTitles6[];
    957 //const char *consTitles7[];
    958 //const char *consTitles8[];
    959 //const char *consTitles9[];
    960 //const char *consTitlesA[];
    961 //const char *consTitlesB[];
    962 //const char *consTitlesC[];
    963 //const char *consTitlesD[];
    964 //const char *consTitlesE[];
    965 //const char *digitTitles0[];
    966 //const char *digitTitles1[];
    967 //const char *digitTitles2[];
    968 //const char *aplphanumTitles0[];
    969 //const char *aplphanumTitles1[];
    970 //const char *aplphanumTitles2[];
    971 //const char *medInstrTitles0[];
    972 //const char *medInstrTitles1[];
    973 //const char *medInstrTitles2[];
    974 //const char *medInstrTitles3[];
    975 //const char *medInstrTitles4[];
    976 
    977 #endif //__HIDUSAGESTR_H__
    const char pstrUsageYTilt[]
    Definition: hidusagestr.h:814
    const char pstrUsageRewind[]
    Definition: hidusagestr.h:323
    const char pstrUsageACDistributeHorizontaly[]
    Definition: hidusagestr.h:780
    const char pstrUsageALNetworkConference[]
    Definition: hidusagestr.h:594
    @@ -1927,7 +951,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidusagetitlearrays_8cpp.html b/hidusagetitlearrays_8cpp.html index 061f38e2..3a614b11 100644 --- a/hidusagetitlearrays_8cpp.html +++ b/hidusagetitlearrays_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidusagetitlearrays.cpp File Reference + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -87,13 +88,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidusagetitlearrays.cpp File Reference
    -
    #include "hidusagestr.h"
    +
    #include "hidusagestr.h"
    Include dependency graph for hidusagetitlearrays.cpp:
    - + + +

    Go to the source code of this file.

    @@ -123,7 +126,7 @@ Macros diff --git a/hidusagetitlearrays_8cpp__incl.map b/hidusagetitlearrays_8cpp__incl.map index 33965387..b1cb20e7 100644 --- a/hidusagetitlearrays_8cpp__incl.map +++ b/hidusagetitlearrays_8cpp__incl.map @@ -1,4 +1,4 @@ - - + + diff --git a/hidusagetitlearrays_8cpp__incl.md5 b/hidusagetitlearrays_8cpp__incl.md5 index 94a0dbe2..4e28641f 100644 --- a/hidusagetitlearrays_8cpp__incl.md5 +++ b/hidusagetitlearrays_8cpp__incl.md5 @@ -1 +1 @@ -f05b4297843c24e9f050bb654365b3db \ No newline at end of file +24f4b9fff6ebcb53f983ea5749309c1d \ No newline at end of file diff --git a/hidusagetitlearrays_8cpp__incl.png b/hidusagetitlearrays_8cpp__incl.png index d6e47a72a75b862d9590a64ad6e0b61a344f6405..0fd8000a70ca0b32729b5bc21bbf600a510eb1a9 100644 GIT binary patch literal 4771 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 BVSWGr diff --git a/hidusagetitlearrays_8cpp_source.html b/hidusagetitlearrays_8cpp_source.html index ca1731c8..350f8b8c 100644 --- a/hidusagetitlearrays_8cpp_source.html +++ b/hidusagetitlearrays_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidusagetitlearrays.cpp Source File + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -85,1061 +86,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    hidusagetitlearrays.cpp
    -Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    -
    2 
    -
    3 This software may be distributed and modified under the terms of the GNU
    -
    4 General Public License version 2 (GPL2) as published by the Free Software
    -
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    -
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    -
    7 on this software must also be made publicly available under the terms of
    -
    8 the GPL2 ("Copyleft").
    -
    9 
    -
    10 Contact information
    -
    11 -------------------
    -
    12 
    -
    13 Circuits At Home, LTD
    -
    14 Web : http://www.circuitsathome.com
    -
    15 e-mail : support@circuitsathome.com
    -
    16  */
    -
    17 #if !defined(__HIDUSAGETITLEARRAYS_H__)
    -
    18 #define __HIDUSAGETITLEARRAYS_H__
    -
    19 
    -
    20 #include "hidusagestr.h"
    -
    21 
    -
    22 // This is here why?
    -
    23 
    -
    24 //const char *usagePageTitles0[] PROGMEM =
    -
    25 //{
    -
    26 // pstrUsagePageGenericDesktopControls ,
    -
    27 // pstrUsagePageSimulationControls ,
    -
    28 // pstrUsagePageVRControls ,
    -
    29 // pstrUsagePageSportControls ,
    -
    30 // pstrUsagePageGameControls ,
    -
    31 // pstrUsagePageGenericDeviceControls ,
    -
    32 // pstrUsagePageKeyboardKeypad ,
    -
    33 // pstrUsagePageLEDs ,
    -
    34 // pstrUsagePageButton ,
    -
    35 // pstrUsagePageOrdinal ,
    -
    36 // pstrUsagePageTelephone ,
    -
    37 // pstrUsagePageConsumer ,
    -
    38 // pstrUsagePageDigitizer ,
    -
    39 // pstrUsagePagePID ,
    -
    40 // pstrUsagePageUnicode
    -
    41 //};
    -
    42 //
    -
    43 //const char *usagePageTitles1[] PROGMEM =
    -
    44 //{
    -
    45 // pstrUsagePageBarCodeScanner ,
    -
    46 // pstrUsagePageScale ,
    -
    47 // pstrUsagePageMSRDevices ,
    -
    48 // pstrUsagePagePointOfSale ,
    -
    49 // pstrUsagePageCameraControl ,
    -
    50 // pstrUsagePageArcade
    -
    51 //};
    -
    52 //const char *genDesktopTitles0[] PROGMEM =
    -
    53 //{
    -
    54 // pstrUsagePointer ,
    -
    55 // pstrUsageMouse ,
    -
    56 // pstrUsageJoystick ,
    -
    57 // pstrUsageGamePad ,
    -
    58 // pstrUsageKeyboard ,
    -
    59 // pstrUsageKeypad ,
    -
    60 // pstrUsageMultiAxisController ,
    -
    61 // pstrUsageTabletPCSystemControls
    -
    62 //
    -
    63 //};
    -
    64 //const char *genDesktopTitles1[] PROGMEM =
    -
    65 //{
    -
    66 // pstrUsageX ,
    -
    67 // pstrUsageY ,
    -
    68 // pstrUsageZ ,
    -
    69 // pstrUsageRx ,
    -
    70 // pstrUsageRy ,
    -
    71 // pstrUsageRz ,
    -
    72 // pstrUsageSlider ,
    -
    73 // pstrUsageDial ,
    -
    74 // pstrUsageWheel ,
    -
    75 // pstrUsageHatSwitch ,
    -
    76 // pstrUsageCountedBuffer ,
    -
    77 // pstrUsageByteCount ,
    -
    78 // pstrUsageMotionWakeup ,
    -
    79 // pstrUsageStart ,
    -
    80 // pstrUsageSelect ,
    -
    81 // pstrUsagePageReserved ,
    -
    82 // pstrUsageVx ,
    -
    83 // pstrUsageVy ,
    -
    84 // pstrUsageVz ,
    -
    85 // pstrUsageVbrx ,
    -
    86 // pstrUsageVbry ,
    -
    87 // pstrUsageVbrz ,
    -
    88 // pstrUsageVno ,
    -
    89 // pstrUsageFeatureNotification ,
    -
    90 // pstrUsageResolutionMultiplier
    -
    91 //};
    -
    92 //const char *genDesktopTitles2[] PROGMEM =
    -
    93 //{
    -
    94 // pstrUsageSystemControl ,
    -
    95 // pstrUsageSystemPowerDown ,
    -
    96 // pstrUsageSystemSleep ,
    -
    97 // pstrUsageSystemWakeup ,
    -
    98 // pstrUsageSystemContextMenu ,
    -
    99 // pstrUsageSystemMainMenu ,
    -
    100 // pstrUsageSystemAppMenu ,
    -
    101 // pstrUsageSystemMenuHelp ,
    -
    102 // pstrUsageSystemMenuExit ,
    -
    103 // pstrUsageSystemMenuSelect ,
    -
    104 // pstrUsageSystemMenuRight ,
    -
    105 // pstrUsageSystemMenuLeft ,
    -
    106 // pstrUsageSystemMenuUp ,
    -
    107 // pstrUsageSystemMenuDown ,
    -
    108 // pstrUsageSystemColdRestart ,
    -
    109 // pstrUsageSystemWarmRestart ,
    -
    110 // pstrUsageDPadUp ,
    -
    111 // pstrUsageDPadDown ,
    -
    112 // pstrUsageDPadRight ,
    -
    113 // pstrUsageDPadLeft
    -
    114 //};
    -
    115 //const char *genDesktopTitles3[] PROGMEM =
    -
    116 //{
    -
    117 // pstrUsageSystemDock ,
    -
    118 // pstrUsageSystemUndock ,
    -
    119 // pstrUsageSystemSetup ,
    -
    120 // pstrUsageSystemBreak ,
    -
    121 // pstrUsageSystemDebuggerBreak ,
    -
    122 // pstrUsageApplicationBreak ,
    -
    123 // pstrUsageApplicationDebuggerBreak,
    -
    124 // pstrUsageSystemSpeakerMute ,
    -
    125 // pstrUsageSystemHibernate
    -
    126 //};
    -
    127 //const char *genDesktopTitles4[] PROGMEM =
    -
    128 //{
    -
    129 // pstrUsageSystemDisplayInvert ,
    -
    130 // pstrUsageSystemDisplayInternal ,
    -
    131 // pstrUsageSystemDisplayExternal ,
    -
    132 // pstrUsageSystemDisplayBoth ,
    -
    133 // pstrUsageSystemDisplayDual ,
    -
    134 // pstrUsageSystemDisplayToggleIntExt ,
    -
    135 // pstrUsageSystemDisplaySwapPriSec ,
    -
    136 // pstrUsageSystemDisplayLCDAutoscale
    -
    137 //};
    -
    138 //const char *simuTitles0[] PROGMEM =
    -
    139 //{
    -
    140 // pstrUsageFlightSimulationDevice ,
    -
    141 // pstrUsageAutomobileSimulationDevice ,
    -
    142 // pstrUsageTankSimulationDevice ,
    -
    143 // pstrUsageSpaceshipSimulationDevice ,
    -
    144 // pstrUsageSubmarineSimulationDevice ,
    -
    145 // pstrUsageSailingSimulationDevice ,
    -
    146 // pstrUsageMotocicleSimulationDevice ,
    -
    147 // pstrUsageSportsSimulationDevice ,
    -
    148 // pstrUsageAirplaneSimulationDevice ,
    -
    149 // pstrUsageHelicopterSimulationDevice ,
    -
    150 // pstrUsageMagicCarpetSimulationDevice,
    -
    151 // pstrUsageBicycleSimulationDevice
    -
    152 //};
    -
    153 //const char *simuTitles1[] PROGMEM =
    -
    154 //{
    -
    155 // pstrUsageFlightControlStick ,
    -
    156 // pstrUsageFlightStick ,
    -
    157 // pstrUsageCyclicControl ,
    -
    158 // pstrUsageCyclicTrim ,
    -
    159 // pstrUsageFlightYoke ,
    -
    160 // pstrUsageTrackControl
    -
    161 //};
    -
    162 //const char *simuTitles2[] PROGMEM =
    -
    163 //{
    -
    164 // pstrUsageAileron ,
    -
    165 // pstrUsageAileronTrim ,
    -
    166 // pstrUsageAntiTorqueControl ,
    -
    167 // pstrUsageAutopilotEnable ,
    -
    168 // pstrUsageChaffRelease ,
    -
    169 // pstrUsageCollectiveControl ,
    -
    170 // pstrUsageDiveBrake ,
    -
    171 // pstrUsageElectronicCountermeasures ,
    -
    172 // pstrUsageElevator ,
    -
    173 // pstrUsageElevatorTrim ,
    -
    174 // pstrUsageRudder ,
    -
    175 // pstrUsageThrottle ,
    -
    176 // pstrUsageFlightCommunications ,
    -
    177 // pstrUsageFlareRelease ,
    -
    178 // pstrUsageLandingGear ,
    -
    179 // pstrUsageToeBrake ,
    -
    180 // pstrUsageTrigger ,
    -
    181 // pstrUsageWeaponsArm ,
    -
    182 // pstrUsageWeaponsSelect ,
    -
    183 // pstrUsageWingFlaps ,
    -
    184 // pstrUsageAccelerator ,
    -
    185 // pstrUsageBrake ,
    -
    186 // pstrUsageClutch ,
    -
    187 // pstrUsageShifter ,
    -
    188 // pstrUsageSteering ,
    -
    189 // pstrUsageTurretDirection ,
    -
    190 // pstrUsageBarrelElevation ,
    -
    191 // pstrUsageDivePlane ,
    -
    192 // pstrUsageBallast ,
    -
    193 // pstrUsageBicycleCrank ,
    -
    194 // pstrUsageHandleBars ,
    -
    195 // pstrUsageFrontBrake ,
    -
    196 // pstrUsageRearBrake
    -
    197 //};
    -
    198 //const char *vrTitles0[] PROGMEM =
    -
    199 //{
    -
    200 // pstrUsageBelt ,
    -
    201 // pstrUsageBodySuit ,
    -
    202 // pstrUsageFlexor ,
    -
    203 // pstrUsageGlove ,
    -
    204 // pstrUsageHeadTracker ,
    -
    205 // pstrUsageHeadMountedDisplay ,
    -
    206 // pstrUsageHandTracker ,
    -
    207 // pstrUsageOculometer ,
    -
    208 // pstrUsageVest ,
    -
    209 // pstrUsageAnimatronicDevice
    -
    210 //};
    -
    211 //const char *vrTitles1[] PROGMEM =
    -
    212 //{
    -
    213 // pstrUsageStereoEnable ,
    -
    214 // pstrUsageDisplayEnable
    -
    215 //};
    -
    216 //const char *sportsCtrlTitles0[] PROGMEM =
    -
    217 //{
    -
    218 // pstrUsageBaseballBat ,
    -
    219 // pstrUsageGolfClub ,
    -
    220 // pstrUsageRowingMachine ,
    -
    221 // pstrUsageTreadmill
    -
    222 //};
    -
    223 //const char *sportsCtrlTitles1[] PROGMEM =
    -
    224 //{
    -
    225 // pstrUsageOar ,
    -
    226 // pstrUsageSlope ,
    -
    227 // pstrUsageRate ,
    -
    228 // pstrUsageStickSpeed ,
    -
    229 // pstrUsageStickFaceAngle ,
    -
    230 // pstrUsageStickHeelToe ,
    -
    231 // pstrUsageStickFollowThough ,
    -
    232 // pstrUsageStickTempo ,
    -
    233 // pstrUsageStickType ,
    -
    234 // pstrUsageStickHeight
    -
    235 //};
    -
    236 //const char *sportsCtrlTitles2[] PROGMEM =
    -
    237 //{
    -
    238 // pstrUsagePutter ,
    -
    239 // pstrUsage1Iron ,
    -
    240 // pstrUsage2Iron ,
    -
    241 // pstrUsage3Iron ,
    -
    242 // pstrUsage4Iron ,
    -
    243 // pstrUsage5Iron ,
    -
    244 // pstrUsage6Iron ,
    -
    245 // pstrUsage7Iron ,
    -
    246 // pstrUsage8Iron ,
    -
    247 // pstrUsage9Iron ,
    -
    248 // pstrUsage10Iron ,
    -
    249 // pstrUsage11Iron ,
    -
    250 // pstrUsageSandWedge ,
    -
    251 // pstrUsageLoftWedge ,
    -
    252 // pstrUsagePowerWedge ,
    -
    253 // pstrUsage1Wood ,
    -
    254 // pstrUsage3Wood ,
    -
    255 // pstrUsage5Wood ,
    -
    256 // pstrUsage7Wood ,
    -
    257 // pstrUsage9Wood
    -
    258 //};
    -
    259 //const char *gameTitles0[] PROGMEM =
    -
    260 //{
    -
    261 // pstrUsage3DGameController ,
    -
    262 // pstrUsagePinballDevice ,
    -
    263 // pstrUsageGunDevice
    -
    264 //};
    -
    265 //const char *gameTitles1[] PROGMEM =
    -
    266 //{
    -
    267 // pstrUsagePointOfView ,
    -
    268 // pstrUsageTurnRightLeft ,
    -
    269 // pstrUsagePitchForwardBackward ,
    -
    270 // pstrUsageRollRightLeft ,
    -
    271 // pstrUsageMoveRightLeft ,
    -
    272 // pstrUsageMoveForwardBackward ,
    -
    273 // pstrUsageMoveUpDown ,
    -
    274 // pstrUsageLeanRightLeft ,
    -
    275 // pstrUsageLeanForwardBackward ,
    -
    276 // pstrUsageHeightOfPOV ,
    -
    277 // pstrUsageFlipper ,
    -
    278 // pstrUsageSecondaryFlipper ,
    -
    279 // pstrUsageBump ,
    -
    280 // pstrUsageNewGame ,
    -
    281 // pstrUsageShootBall ,
    -
    282 // pstrUsagePlayer ,
    -
    283 // pstrUsageGunBolt ,
    -
    284 // pstrUsageGunClip ,
    -
    285 // pstrUsageGunSelector ,
    -
    286 // pstrUsageGunSingleShot ,
    -
    287 // pstrUsageGunBurst ,
    -
    288 // pstrUsageGunAutomatic ,
    -
    289 // pstrUsageGunSafety ,
    -
    290 // pstrUsageGamepadFireJump ,
    -
    291 // pstrUsageGamepadTrigger
    -
    292 //};
    -
    293 //const char *genDevCtrlTitles[] PROGMEM =
    -
    294 //{
    -
    295 // pstrUsageBatteryStrength,
    -
    296 // pstrUsageWirelessChannel,
    -
    297 // pstrUsageWirelessID,
    -
    298 // pstrUsageDiscoverWirelessControl,
    -
    299 // pstrUsageSecurityCodeCharEntered,
    -
    300 // pstrUsageSecurityCodeCharErased,
    -
    301 // pstrUsageSecurityCodeCleared
    -
    302 //};
    -
    303 //const char *ledTitles[] PROGMEM =
    -
    304 //{
    -
    305 // pstrUsageNumLock ,
    -
    306 // pstrUsageCapsLock ,
    -
    307 // pstrUsageScrollLock ,
    -
    308 // pstrUsageCompose ,
    -
    309 // pstrUsageKana ,
    -
    310 // pstrUsagePower ,
    -
    311 // pstrUsageShift ,
    -
    312 // pstrUsageDoNotDisturb ,
    -
    313 // pstrUsageMute ,
    -
    314 // pstrUsageToneEnable ,
    -
    315 // pstrUsageHighCutFilter ,
    -
    316 // pstrUsageLowCutFilter ,
    -
    317 // pstrUsageEqualizerEnable ,
    -
    318 // pstrUsageSoundFieldOn ,
    -
    319 // pstrUsageSurroundOn ,
    -
    320 // pstrUsageRepeat ,
    -
    321 // pstrUsageStereo ,
    -
    322 // pstrUsageSamplingRateDetect ,
    -
    323 // pstrUsageSpinning ,
    -
    324 // pstrUsageCAV ,
    -
    325 // pstrUsageCLV ,
    -
    326 // pstrUsageRecordingFormatDetect ,
    -
    327 // pstrUsageOffHook ,
    -
    328 // pstrUsageRing ,
    -
    329 // pstrUsageMessageWaiting ,
    -
    330 // pstrUsageDataMode ,
    -
    331 // pstrUsageBatteryOperation ,
    -
    332 // pstrUsageBatteryOK ,
    -
    333 // pstrUsageBatteryLow ,
    -
    334 // pstrUsageSpeaker ,
    -
    335 // pstrUsageHeadSet ,
    -
    336 // pstrUsageHold ,
    -
    337 // pstrUsageMicrophone ,
    -
    338 // pstrUsageCoverage ,
    -
    339 // pstrUsageNightMode ,
    -
    340 // pstrUsageSendCalls ,
    -
    341 // pstrUsageCallPickup ,
    -
    342 // pstrUsageConference ,
    -
    343 // pstrUsageStandBy ,
    -
    344 // pstrUsageCameraOn ,
    -
    345 // pstrUsageCameraOff ,
    -
    346 // pstrUsageOnLine ,
    -
    347 // pstrUsageOffLine ,
    -
    348 // pstrUsageBusy ,
    -
    349 // pstrUsageReady ,
    -
    350 // pstrUsagePaperOut ,
    -
    351 // pstrUsagePaperJam ,
    -
    352 // pstrUsageRemote ,
    -
    353 // pstrUsageForward ,
    -
    354 // pstrUsageReverse ,
    -
    355 // pstrUsageStop ,
    -
    356 // pstrUsageRewind ,
    -
    357 // pstrUsageFastForward ,
    -
    358 // pstrUsagePlay ,
    -
    359 // pstrUsagePause ,
    -
    360 // pstrUsageRecord ,
    -
    361 // pstrUsageError ,
    -
    362 // pstrUsageSelectedIndicator ,
    -
    363 // pstrUsageInUseIndicator ,
    -
    364 // pstrUsageMultiModeIndicator ,
    -
    365 // pstrUsageIndicatorOn ,
    -
    366 // pstrUsageIndicatorFlash ,
    -
    367 // pstrUsageIndicatorSlowBlink ,
    -
    368 // pstrUsageIndicatorFastBlink ,
    -
    369 // pstrUsageIndicatorOff ,
    -
    370 // pstrUsageFlashOnTime ,
    -
    371 // pstrUsageSlowBlinkOnTime ,
    -
    372 // pstrUsageSlowBlinkOffTime ,
    -
    373 // pstrUsageFastBlinkOnTime ,
    -
    374 // pstrUsageFastBlinkOffTime ,
    -
    375 // pstrUsageIndicatorColor ,
    -
    376 // pstrUsageIndicatorRed ,
    -
    377 // pstrUsageIndicatorGreen ,
    -
    378 // pstrUsageIndicatorAmber ,
    -
    379 // pstrUsageGenericIndicator ,
    -
    380 // pstrUsageSystemSuspend ,
    -
    381 // pstrUsageExternalPowerConnected
    -
    382 //};
    -
    383 //const char *telTitles0 [] PROGMEM =
    -
    384 //{
    -
    385 // pstrUsagePhone ,
    -
    386 // pstrUsageAnsweringMachine ,
    -
    387 // pstrUsageMessageControls ,
    -
    388 // pstrUsageHandset ,
    -
    389 // pstrUsageHeadset ,
    -
    390 // pstrUsageTelephonyKeyPad ,
    -
    391 // pstrUsageProgrammableButton
    -
    392 //};
    -
    393 //const char *telTitles1 [] PROGMEM =
    -
    394 //{
    -
    395 // pstrUsageHookSwitch ,
    -
    396 // pstrUsageFlash ,
    -
    397 // pstrUsageFeature ,
    -
    398 // pstrUsageHold ,
    -
    399 // pstrUsageRedial ,
    -
    400 // pstrUsageTransfer ,
    -
    401 // pstrUsageDrop ,
    -
    402 // pstrUsagePark ,
    -
    403 // pstrUsageForwardCalls ,
    -
    404 // pstrUsageAlternateFunction ,
    -
    405 // pstrUsageLine ,
    -
    406 // pstrUsageSpeakerPhone ,
    -
    407 // pstrUsageConference ,
    -
    408 // pstrUsageRingEnable ,
    -
    409 // pstrUsageRingSelect ,
    -
    410 // pstrUsagePhoneMute ,
    -
    411 // pstrUsageCallerID ,
    -
    412 // pstrUsageSend
    -
    413 //};
    -
    414 //const char *telTitles2 [] PROGMEM =
    -
    415 //{
    -
    416 // pstrUsageSpeedDial ,
    -
    417 // pstrUsageStoreNumber ,
    -
    418 // pstrUsageRecallNumber ,
    -
    419 // pstrUsagePhoneDirectory
    -
    420 //};
    -
    421 //const char *telTitles3 [] PROGMEM =
    -
    422 //{
    -
    423 // pstrUsageVoiceMail ,
    -
    424 // pstrUsageScreenCalls ,
    -
    425 // pstrUsageDoNotDisturb ,
    -
    426 // pstrUsageMessage ,
    -
    427 // pstrUsageAnswerOnOff
    -
    428 //};
    -
    429 //const char *telTitles4 [] PROGMEM =
    -
    430 //{
    -
    431 // pstrUsageInsideDialTone ,
    -
    432 // pstrUsageOutsideDialTone ,
    -
    433 // pstrUsageInsideRingTone ,
    -
    434 // pstrUsageOutsideRingTone ,
    -
    435 // pstrUsagePriorityRingTone ,
    -
    436 // pstrUsageInsideRingback ,
    -
    437 // pstrUsagePriorityRingback ,
    -
    438 // pstrUsageLineBusyTone ,
    -
    439 // pstrUsageReorderTone ,
    -
    440 // pstrUsageCallWaitingTone ,
    -
    441 // pstrUsageConfirmationTone1 ,
    -
    442 // pstrUsageConfirmationTone2 ,
    -
    443 // pstrUsageTonesOff ,
    -
    444 // pstrUsageOutsideRingback ,
    -
    445 // pstrUsageRinger
    -
    446 //};
    -
    447 //const char *telTitles5 [] PROGMEM =
    -
    448 //{
    -
    449 // pstrUsagePhoneKey0 ,
    -
    450 // pstrUsagePhoneKey1 ,
    -
    451 // pstrUsagePhoneKey2 ,
    -
    452 // pstrUsagePhoneKey3 ,
    -
    453 // pstrUsagePhoneKey4 ,
    -
    454 // pstrUsagePhoneKey5 ,
    -
    455 // pstrUsagePhoneKey6 ,
    -
    456 // pstrUsagePhoneKey7 ,
    -
    457 // pstrUsagePhoneKey8 ,
    -
    458 // pstrUsagePhoneKey9 ,
    -
    459 // pstrUsagePhoneKeyStar ,
    -
    460 // pstrUsagePhoneKeyPound ,
    -
    461 // pstrUsagePhoneKeyA ,
    -
    462 // pstrUsagePhoneKeyB ,
    -
    463 // pstrUsagePhoneKeyC ,
    -
    464 // pstrUsagePhoneKeyD
    -
    465 //};
    -
    466 //const char *consTitles0[] PROGMEM =
    -
    467 //{
    -
    468 // pstrUsageConsumerControl,
    -
    469 // pstrUsageNumericKeyPad,
    -
    470 // pstrUsageProgrammableButton,
    -
    471 // pstrUsageMicrophone,
    -
    472 // pstrUsageHeadphone,
    -
    473 // pstrUsageGraphicEqualizer
    -
    474 //};
    -
    475 //const char *consTitles1[] PROGMEM =
    -
    476 //{
    -
    477 // pstrUsagePlus10 ,
    -
    478 // pstrUsagePlus100,
    -
    479 // pstrUsageAMPM
    -
    480 //};
    -
    481 //const char *consTitles2[] PROGMEM =
    -
    482 //{
    -
    483 // pstrUsagePower ,
    -
    484 // pstrUsageReset ,
    -
    485 // pstrUsageSleep ,
    -
    486 // pstrUsageSleepAfter ,
    -
    487 // pstrUsageSleepMode ,
    -
    488 // pstrUsageIllumination ,
    -
    489 // pstrUsageFunctionButtons
    -
    490 //
    -
    491 //};
    -
    492 //const char *consTitles3[] PROGMEM =
    -
    493 //{
    -
    494 // pstrUsageMenu ,
    -
    495 // pstrUsageMenuPick ,
    -
    496 // pstrUsageMenuUp ,
    -
    497 // pstrUsageMenuDown ,
    -
    498 // pstrUsageMenuLeft ,
    -
    499 // pstrUsageMenuRight ,
    -
    500 // pstrUsageMenuEscape ,
    -
    501 // pstrUsageMenuValueIncrease,
    -
    502 // pstrUsageMenuValueDecrease
    -
    503 //};
    -
    504 //const char *consTitles4[] PROGMEM =
    -
    505 //{
    -
    506 // pstrUsageDataOnScreen ,
    -
    507 // pstrUsageClosedCaption ,
    -
    508 // pstrUsageClosedCaptionSelect,
    -
    509 // pstrUsageVCRTV ,
    -
    510 // pstrUsageBroadcastMode ,
    -
    511 // pstrUsageSnapshot ,
    -
    512 // pstrUsageStill
    -
    513 //};
    -
    514 //const char *consTitles5[] PROGMEM =
    -
    515 //{
    -
    516 // pstrUsageSelection ,
    -
    517 // pstrUsageAssignSelection ,
    -
    518 // pstrUsageModeStep ,
    -
    519 // pstrUsageRecallLast ,
    -
    520 // pstrUsageEnterChannel ,
    -
    521 // pstrUsageOrderMovie ,
    -
    522 // pstrUsageChannel ,
    -
    523 // pstrUsageMediaSelection ,
    -
    524 // pstrUsageMediaSelectComputer ,
    -
    525 // pstrUsageMediaSelectTV ,
    -
    526 // pstrUsageMediaSelectWWW ,
    -
    527 // pstrUsageMediaSelectDVD ,
    -
    528 // pstrUsageMediaSelectTelephone ,
    -
    529 // pstrUsageMediaSelectProgramGuide ,
    -
    530 // pstrUsageMediaSelectVideoPhone ,
    -
    531 // pstrUsageMediaSelectGames ,
    -
    532 // pstrUsageMediaSelectMessages ,
    -
    533 // pstrUsageMediaSelectCD ,
    -
    534 // pstrUsageMediaSelectVCR ,
    -
    535 // pstrUsageMediaSelectTuner ,
    -
    536 // pstrUsageQuit ,
    -
    537 // pstrUsageHelp ,
    -
    538 // pstrUsageMediaSelectTape ,
    -
    539 // pstrUsageMediaSelectCable ,
    -
    540 // pstrUsageMediaSelectSatellite ,
    -
    541 // pstrUsageMediaSelectSecurity ,
    -
    542 // pstrUsageMediaSelectHome ,
    -
    543 // pstrUsageMediaSelectCall ,
    -
    544 // pstrUsageChannelIncrement ,
    -
    545 // pstrUsageChannelDecrement ,
    -
    546 // pstrUsageMediaSelectSAP ,
    -
    547 // pstrUsagePageReserved ,
    -
    548 // pstrUsageVCRPlus ,
    -
    549 // pstrUsageOnce ,
    -
    550 // pstrUsageDaily ,
    -
    551 // pstrUsageWeekly ,
    -
    552 // pstrUsageMonthly
    -
    553 //};
    -
    554 //const char *consTitles6[] PROGMEM =
    -
    555 //{
    -
    556 // pstrUsagePlay ,
    -
    557 // pstrUsagePause ,
    -
    558 // pstrUsageRecord ,
    -
    559 // pstrUsageFastForward ,
    -
    560 // pstrUsageRewind ,
    -
    561 // pstrUsageScanNextTrack ,
    -
    562 // pstrUsageScanPreviousTrack ,
    -
    563 // pstrUsageStop ,
    -
    564 // pstrUsageEject ,
    -
    565 // pstrUsageRandomPlay ,
    -
    566 // pstrUsageSelectDisk ,
    -
    567 // pstrUsageEnterDisk ,
    -
    568 // pstrUsageRepeat ,
    -
    569 // pstrUsageTracking ,
    -
    570 // pstrUsageTrackNormal ,
    -
    571 // pstrUsageSlowTracking ,
    -
    572 // pstrUsageFrameForward ,
    -
    573 // pstrUsageFrameBackwards ,
    -
    574 // pstrUsageMark ,
    -
    575 // pstrUsageClearMark ,
    -
    576 // pstrUsageRepeatFromMark ,
    -
    577 // pstrUsageReturnToMark ,
    -
    578 // pstrUsageSearchMarkForward ,
    -
    579 // pstrUsageSearchMarkBackwards ,
    -
    580 // pstrUsageCounterReset ,
    -
    581 // pstrUsageShowCounter ,
    -
    582 // pstrUsageTrackingIncrement ,
    -
    583 // pstrUsageTrackingDecrement ,
    -
    584 // pstrUsageStopEject ,
    -
    585 // pstrUsagePlayPause ,
    -
    586 // pstrUsagePlaySkip
    -
    587 //};
    -
    588 //const char *consTitles7[] PROGMEM =
    -
    589 //{
    -
    590 // pstrUsageVolume ,
    -
    591 // pstrUsageBalance ,
    -
    592 // pstrUsageMute ,
    -
    593 // pstrUsageBass ,
    -
    594 // pstrUsageTreble ,
    -
    595 // pstrUsageBassBoost ,
    -
    596 // pstrUsageSurroundMode ,
    -
    597 // pstrUsageLoudness ,
    -
    598 // pstrUsageMPX ,
    -
    599 // pstrUsageVolumeIncrement ,
    -
    600 // pstrUsageVolumeDecrement
    -
    601 //};
    -
    602 //const char *consTitles8[] PROGMEM =
    -
    603 //{
    -
    604 // pstrUsageSpeedSelect ,
    -
    605 // pstrUsagePlaybackSpeed ,
    -
    606 // pstrUsageStandardPlay ,
    -
    607 // pstrUsageLongPlay ,
    -
    608 // pstrUsageExtendedPlay ,
    -
    609 // pstrUsageSlow
    -
    610 //};
    -
    611 //const char *consTitles9[] PROGMEM =
    -
    612 //{
    -
    613 // pstrUsageFanEnable ,
    -
    614 // pstrUsageFanSpeed ,
    -
    615 // pstrUsageLightEnable ,
    -
    616 // pstrUsageLightIlluminationLevel ,
    -
    617 // pstrUsageClimateControlEnable ,
    -
    618 // pstrUsageRoomTemperature ,
    -
    619 // pstrUsageSecurityEnable ,
    -
    620 // pstrUsageFireAlarm ,
    -
    621 // pstrUsagePoliceAlarm ,
    -
    622 // pstrUsageProximity ,
    -
    623 // pstrUsageMotion ,
    -
    624 // pstrUsageDuresAlarm ,
    -
    625 // pstrUsageHoldupAlarm ,
    -
    626 // pstrUsageMedicalAlarm
    -
    627 //};
    -
    628 //const char *consTitlesA[] PROGMEM =
    -
    629 //{
    -
    630 // pstrUsageBalanceRight ,
    -
    631 // pstrUsageBalanceLeft ,
    -
    632 // pstrUsageBassIncrement ,
    -
    633 // pstrUsageBassDecrement ,
    -
    634 // pstrUsageTrebleIncrement ,
    -
    635 // pstrUsageTrebleDecrement
    -
    636 //};
    -
    637 //const char *consTitlesB[] PROGMEM =
    -
    638 //{
    -
    639 // pstrUsageSpeakerSystem ,
    -
    640 // pstrUsageChannelLeft ,
    -
    641 // pstrUsageChannelRight ,
    -
    642 // pstrUsageChannelCenter ,
    -
    643 // pstrUsageChannelFront ,
    -
    644 // pstrUsageChannelCenterFront ,
    -
    645 // pstrUsageChannelSide ,
    -
    646 // pstrUsageChannelSurround ,
    -
    647 // pstrUsageChannelLowFreqEnhancement ,
    -
    648 // pstrUsageChannelTop ,
    -
    649 // pstrUsageChannelUnknown
    -
    650 //};
    -
    651 //const char *consTitlesC[] PROGMEM =
    -
    652 //{
    -
    653 // pstrUsageSubChannel ,
    -
    654 // pstrUsageSubChannelIncrement ,
    -
    655 // pstrUsageSubChannelDecrement ,
    -
    656 // pstrUsageAlternateAudioIncrement ,
    -
    657 // pstrUsageAlternateAudioDecrement
    -
    658 //};
    -
    659 //const char *consTitlesD[] PROGMEM =
    -
    660 //{
    -
    661 // pstrUsageApplicationLaunchButtons ,
    -
    662 // pstrUsageALLaunchButtonConfigTool ,
    -
    663 // pstrUsageALProgrammableButton ,
    -
    664 // pstrUsageALConsumerControlConfig ,
    -
    665 // pstrUsageALWordProcessor ,
    -
    666 // pstrUsageALTextEditor ,
    -
    667 // pstrUsageALSpreadsheet ,
    -
    668 // pstrUsageALGraphicsEditor ,
    -
    669 // pstrUsageALPresentationApp ,
    -
    670 // pstrUsageALDatabaseApp ,
    -
    671 // pstrUsageALEmailReader ,
    -
    672 // pstrUsageALNewsreader ,
    -
    673 // pstrUsageALVoicemail ,
    -
    674 // pstrUsageALContactsAddressBook ,
    -
    675 // pstrUsageALCalendarSchedule ,
    -
    676 // pstrUsageALTaskProjectManager ,
    -
    677 // pstrUsageALLogJournalTimecard ,
    -
    678 // pstrUsageALCheckbookFinance ,
    -
    679 // pstrUsageALCalculator ,
    -
    680 // pstrUsageALAVCapturePlayback ,
    -
    681 // pstrUsageALLocalMachineBrowser ,
    -
    682 // pstrUsageALLANWANBrow ,
    -
    683 // pstrUsageALInternetBrowser ,
    -
    684 // pstrUsageALRemoteNetISPConnect ,
    -
    685 // pstrUsageALNetworkConference ,
    -
    686 // pstrUsageALNetworkChat ,
    -
    687 // pstrUsageALTelephonyDialer ,
    -
    688 // pstrUsageALLogon ,
    -
    689 // pstrUsageALLogoff ,
    -
    690 // pstrUsageALLogonLogoff ,
    -
    691 // pstrUsageALTermLockScrSav ,
    -
    692 // pstrUsageALControlPannel ,
    -
    693 // pstrUsageALCommandLineProcessorRun ,
    -
    694 // pstrUsageALProcessTaskManager ,
    -
    695 // pstrUsageALSelectTaskApplication ,
    -
    696 // pstrUsageALNextTaskApplication ,
    -
    697 // pstrUsageALPreviousTaskApplication ,
    -
    698 // pstrUsageALPreemptiveHaltTaskApp ,
    -
    699 // pstrUsageALIntegratedHelpCenter ,
    -
    700 // pstrUsageALDocuments ,
    -
    701 // pstrUsageALThesaurus ,
    -
    702 // pstrUsageALDictionary ,
    -
    703 // pstrUsageALDesktop ,
    -
    704 // pstrUsageALSpellCheck ,
    -
    705 // pstrUsageALGrammarCheck ,
    -
    706 // pstrUsageALWirelessStatus ,
    -
    707 // pstrUsageALKeyboardLayout ,
    -
    708 // pstrUsageALVirusProtection ,
    -
    709 // pstrUsageALEncryption ,
    -
    710 // pstrUsageALScreenSaver ,
    -
    711 // pstrUsageALAlarms ,
    -
    712 // pstrUsageALClock ,
    -
    713 // pstrUsageALFileBrowser ,
    -
    714 // pstrUsageALPowerStatus ,
    -
    715 // pstrUsageALImageBrowser ,
    -
    716 // pstrUsageALAudioBrowser ,
    -
    717 // pstrUsageALMovieBrowser ,
    -
    718 // pstrUsageALDigitalRightsManager ,
    -
    719 // pstrUsageALDigitalWallet ,
    -
    720 // pstrUsagePageReserved ,
    -
    721 // pstrUsageALInstantMessaging ,
    -
    722 // pstrUsageALOEMFeaturesBrowser ,
    -
    723 // pstrUsageALOEMHelp ,
    -
    724 // pstrUsageALOnlineCommunity ,
    -
    725 // pstrUsageALEntertainmentContentBrow ,
    -
    726 // pstrUsageALOnlineShoppingBrowser ,
    -
    727 // pstrUsageALSmartCardInfoHelp ,
    -
    728 // pstrUsageALMarketMonitorFinBrowser ,
    -
    729 // pstrUsageALCustomCorpNewsBrowser ,
    -
    730 // pstrUsageALOnlineActivityBrowser ,
    -
    731 // pstrUsageALResearchSearchBrowser ,
    -
    732 // pstrUsageALAudioPlayer
    -
    733 //};
    -
    734 //const char *consTitlesE[] PROGMEM =
    -
    735 //{
    -
    736 // pstrUsageGenericGUIAppControls ,
    -
    737 // pstrUsageACNew ,
    -
    738 // pstrUsageACOpen ,
    -
    739 // pstrUsageACClose ,
    -
    740 // pstrUsageACExit ,
    -
    741 // pstrUsageACMaximize ,
    -
    742 // pstrUsageACMinimize ,
    -
    743 // pstrUsageACSave ,
    -
    744 // pstrUsageACPrint ,
    -
    745 // pstrUsageACProperties ,
    -
    746 // pstrUsageACUndo ,
    -
    747 // pstrUsageACCopy ,
    -
    748 // pstrUsageACCut ,
    -
    749 // pstrUsageACPaste ,
    -
    750 // pstrUsageACSelectAll ,
    -
    751 // pstrUsageACFind ,
    -
    752 // pstrUsageACFindAndReplace ,
    -
    753 // pstrUsageACSearch ,
    -
    754 // pstrUsageACGoto ,
    -
    755 // pstrUsageACHome ,
    -
    756 // pstrUsageACBack ,
    -
    757 // pstrUsageACForward ,
    -
    758 // pstrUsageACStop ,
    -
    759 // pstrUsageACRefresh ,
    -
    760 // pstrUsageACPreviousLink ,
    -
    761 // pstrUsageACNextLink ,
    -
    762 // pstrUsageACBookmarks ,
    -
    763 // pstrUsageACHistory ,
    -
    764 // pstrUsageACSubscriptions ,
    -
    765 // pstrUsageACZoomIn ,
    -
    766 // pstrUsageACZoomOut ,
    -
    767 // pstrUsageACZoom ,
    -
    768 // pstrUsageACFullScreenView ,
    -
    769 // pstrUsageACNormalView ,
    -
    770 // pstrUsageACViewToggle ,
    -
    771 // pstrUsageACScrollUp ,
    -
    772 // pstrUsageACScrollDown ,
    -
    773 // pstrUsageACScroll ,
    -
    774 // pstrUsageACPanLeft ,
    -
    775 // pstrUsageACPanRight ,
    -
    776 // pstrUsageACPan ,
    -
    777 // pstrUsageACNewWindow ,
    -
    778 // pstrUsageACTileHoriz ,
    -
    779 // pstrUsageACTileVert ,
    -
    780 // pstrUsageACFormat ,
    -
    781 // pstrUsageACEdit ,
    -
    782 // pstrUsageACBold ,
    -
    783 // pstrUsageACItalics ,
    -
    784 // pstrUsageACUnderline ,
    -
    785 // pstrUsageACStrikethrough ,
    -
    786 // pstrUsageACSubscript ,
    -
    787 // pstrUsageACSuperscript ,
    -
    788 // pstrUsageACAllCaps ,
    -
    789 // pstrUsageACRotate ,
    -
    790 // pstrUsageACResize ,
    -
    791 // pstrUsageACFlipHorizontal ,
    -
    792 // pstrUsageACFlipVertical ,
    -
    793 // pstrUsageACMirrorHorizontal ,
    -
    794 // pstrUsageACMirrorVertical ,
    -
    795 // pstrUsageACFontSelect ,
    -
    796 // pstrUsageACFontColor ,
    -
    797 // pstrUsageACFontSize ,
    -
    798 // pstrUsageACJustifyLeft ,
    -
    799 // pstrUsageACJustifyCenterH ,
    -
    800 // pstrUsageACJustifyRight ,
    -
    801 // pstrUsageACJustifyBlockH ,
    -
    802 // pstrUsageACJustifyTop ,
    -
    803 // pstrUsageACJustifyCenterV ,
    -
    804 // pstrUsageACJustifyBottom ,
    -
    805 // pstrUsageACJustifyBlockV ,
    -
    806 // pstrUsageACIndentDecrease ,
    -
    807 // pstrUsageACIndentIncrease ,
    -
    808 // pstrUsageACNumberedList ,
    -
    809 // pstrUsageACRestartNumbering ,
    -
    810 // pstrUsageACBulletedList ,
    -
    811 // pstrUsageACPromote ,
    -
    812 // pstrUsageACDemote ,
    -
    813 // pstrUsageACYes ,
    -
    814 // pstrUsageACNo ,
    -
    815 // pstrUsageACCancel ,
    -
    816 // pstrUsageACCatalog ,
    -
    817 // pstrUsageACBuyChkout ,
    -
    818 // pstrUsageACAddToCart ,
    -
    819 // pstrUsageACExpand ,
    -
    820 // pstrUsageACExpandAll ,
    -
    821 // pstrUsageACCollapse ,
    -
    822 // pstrUsageACCollapseAll ,
    -
    823 // pstrUsageACPrintPreview ,
    -
    824 // pstrUsageACPasteSpecial ,
    -
    825 // pstrUsageACInsertMode ,
    -
    826 // pstrUsageACDelete ,
    -
    827 // pstrUsageACLock ,
    -
    828 // pstrUsageACUnlock ,
    -
    829 // pstrUsageACProtect ,
    -
    830 // pstrUsageACUnprotect ,
    -
    831 // pstrUsageACAttachComment ,
    -
    832 // pstrUsageACDeleteComment ,
    -
    833 // pstrUsageACViewComment ,
    -
    834 // pstrUsageACSelectWord ,
    -
    835 // pstrUsageACSelectSentence ,
    -
    836 // pstrUsageACSelectParagraph ,
    -
    837 // pstrUsageACSelectColumn ,
    -
    838 // pstrUsageACSelectRow ,
    -
    839 // pstrUsageACSelectTable ,
    -
    840 // pstrUsageACSelectObject ,
    -
    841 // pstrUsageACRedoRepeat ,
    -
    842 // pstrUsageACSort ,
    -
    843 // pstrUsageACSortAscending ,
    -
    844 // pstrUsageACSortDescending ,
    -
    845 // pstrUsageACFilter ,
    -
    846 // pstrUsageACSetClock ,
    -
    847 // pstrUsageACViewClock ,
    -
    848 // pstrUsageACSelectTimeZone ,
    -
    849 // pstrUsageACEditTimeZone ,
    -
    850 // pstrUsageACSetAlarm ,
    -
    851 // pstrUsageACClearAlarm ,
    -
    852 // pstrUsageACSnoozeAlarm ,
    -
    853 // pstrUsageACResetAlarm ,
    -
    854 // pstrUsageACSyncronize ,
    -
    855 // pstrUsageACSendReceive ,
    -
    856 // pstrUsageACSendTo ,
    -
    857 // pstrUsageACReply ,
    -
    858 // pstrUsageACReplyAll ,
    -
    859 // pstrUsageACForwardMessage ,
    -
    860 // pstrUsageACSend ,
    -
    861 // pstrUsageACAttachFile ,
    -
    862 // pstrUsageACUpload ,
    -
    863 // pstrUsageACDownload ,
    -
    864 // pstrUsageACSetBorders ,
    -
    865 // pstrUsageACInsertRow ,
    -
    866 // pstrUsageACInsertColumn ,
    -
    867 // pstrUsageACInsertFile ,
    -
    868 // pstrUsageACInsertPicture ,
    -
    869 // pstrUsageACInsertObject ,
    -
    870 // pstrUsageACInsertSymbol ,
    -
    871 // pstrUsageACSaveAndClose ,
    -
    872 // pstrUsageACRename ,
    -
    873 // pstrUsageACMerge ,
    -
    874 // pstrUsageACSplit ,
    -
    875 // pstrUsageACDistributeHorizontaly ,
    -
    876 // pstrUsageACDistributeVerticaly
    -
    877 //};
    -
    878 //const char *digitTitles0[] PROGMEM =
    -
    879 //{
    -
    880 // pstrUsageDigitizer ,
    -
    881 // pstrUsagePen ,
    -
    882 // pstrUsageLightPen ,
    -
    883 // pstrUsageTouchScreen ,
    -
    884 // pstrUsageTouchPad ,
    -
    885 // pstrUsageWhiteBoard ,
    -
    886 // pstrUsageCoordinateMeasuringMachine ,
    -
    887 // pstrUsage3DDigitizer ,
    -
    888 // pstrUsageStereoPlotter ,
    -
    889 // pstrUsageArticulatedArm ,
    -
    890 // pstrUsageArmature ,
    -
    891 // pstrUsageMultiplePointDigitizer ,
    -
    892 // pstrUsageFreeSpaceWand
    -
    893 //};
    -
    894 //const char *digitTitles1[] PROGMEM =
    -
    895 //{
    -
    896 // pstrUsageStylus ,
    -
    897 // pstrUsagePuck ,
    -
    898 // pstrUsageFinger
    -
    899 //
    -
    900 //};
    -
    901 //const char *digitTitles2[] PROGMEM =
    -
    902 //{
    -
    903 // pstrUsageTipPressure ,
    -
    904 // pstrUsageBarrelPressure ,
    -
    905 // pstrUsageInRange ,
    -
    906 // pstrUsageTouch ,
    -
    907 // pstrUsageUntouch ,
    -
    908 // pstrUsageTap ,
    -
    909 // pstrUsageQuality ,
    -
    910 // pstrUsageDataValid ,
    -
    911 // pstrUsageTransducerIndex ,
    -
    912 // pstrUsageTabletFunctionKeys ,
    -
    913 // pstrUsageProgramChangeKeys ,
    -
    914 // pstrUsageBatteryStrength ,
    -
    915 // pstrUsageInvert ,
    -
    916 // pstrUsageXTilt ,
    -
    917 // pstrUsageYTilt ,
    -
    918 // pstrUsageAzimuth ,
    -
    919 // pstrUsageAltitude ,
    -
    920 // pstrUsageTwist ,
    -
    921 // pstrUsageTipSwitch ,
    -
    922 // pstrUsageSecondaryTipSwitch ,
    -
    923 // pstrUsageBarrelSwitch ,
    -
    924 // pstrUsageEraser ,
    -
    925 // pstrUsageTabletPick
    -
    926 //};
    -
    927 //const char *aplphanumTitles0[] PROGMEM =
    -
    928 //{
    -
    929 // pstrUsageAlphanumericDisplay,
    -
    930 // pstrUsageBitmappedDisplay
    -
    931 //};
    -
    932 //const char *aplphanumTitles1[] PROGMEM =
    -
    933 //{
    -
    934 // pstrUsageDisplayAttributesReport ,
    -
    935 // pstrUsageASCIICharacterSet ,
    -
    936 // pstrUsageDataReadBack ,
    -
    937 // pstrUsageFontReadBack ,
    -
    938 // pstrUsageDisplayControlReport ,
    -
    939 // pstrUsageClearDisplay ,
    -
    940 // pstrUsageDisplayEnable ,
    -
    941 // pstrUsageScreenSaverDelay ,
    -
    942 // pstrUsageScreenSaverEnable ,
    -
    943 // pstrUsageVerticalScroll ,
    -
    944 // pstrUsageHorizontalScroll ,
    -
    945 // pstrUsageCharacterReport ,
    -
    946 // pstrUsageDisplayData ,
    -
    947 // pstrUsageDisplayStatus ,
    -
    948 // pstrUsageStatusNotReady ,
    -
    949 // pstrUsageStatusReady ,
    -
    950 // pstrUsageErrorNotALoadableCharacter ,
    -
    951 // pstrUsageErrorFotDataCanNotBeRead ,
    -
    952 // pstrUsageCursorPositionReport ,
    -
    953 // pstrUsageRow ,
    -
    954 // pstrUsageColumn ,
    -
    955 // pstrUsageRows ,
    -
    956 // pstrUsageColumns ,
    -
    957 // pstrUsageCursorPixelPosition ,
    -
    958 // pstrUsageCursorMode ,
    -
    959 // pstrUsageCursorEnable ,
    -
    960 // pstrUsageCursorBlink ,
    -
    961 // pstrUsageFontReport ,
    -
    962 // pstrUsageFontData ,
    -
    963 // pstrUsageCharacterWidth ,
    -
    964 // pstrUsageCharacterHeight ,
    -
    965 // pstrUsageCharacterSpacingHorizontal ,
    -
    966 // pstrUsageCharacterSpacingVertical ,
    -
    967 // pstrUsageUnicodeCharset ,
    -
    968 // pstrUsageFont7Segment ,
    -
    969 // pstrUsage7SegmentDirectMap ,
    -
    970 // pstrUsageFont14Segment ,
    -
    971 // pstrUsage14SegmentDirectMap ,
    -
    972 // pstrUsageDisplayBrightness ,
    -
    973 // pstrUsageDisplayContrast ,
    -
    974 // pstrUsageCharacterAttribute ,
    -
    975 // pstrUsageAttributeReadback ,
    -
    976 // pstrUsageAttributeData ,
    -
    977 // pstrUsageCharAttributeEnhance ,
    -
    978 // pstrUsageCharAttributeUnderline ,
    -
    979 // pstrUsageCharAttributeBlink
    -
    980 //};
    -
    981 //const char *aplphanumTitles2[] PROGMEM =
    -
    982 //{
    -
    983 // pstrUsageBitmapSizeX ,
    -
    984 // pstrUsageBitmapSizeY ,
    -
    985 // pstrUsagePageReserved ,
    -
    986 // pstrUsageBitDepthFormat ,
    -
    987 // pstrUsageDisplayOrientation ,
    -
    988 // pstrUsagePaletteReport ,
    -
    989 // pstrUsagePaletteDataSize ,
    -
    990 // pstrUsagePaletteDataOffset ,
    -
    991 // pstrUsagePaletteData ,
    -
    992 // pstrUsageBlitReport ,
    -
    993 // pstrUsageBlitRectangleX1 ,
    -
    994 // pstrUsageBlitRectangleY1 ,
    -
    995 // pstrUsageBlitRectangleX2 ,
    -
    996 // pstrUsageBlitRectangleY2 ,
    -
    997 // pstrUsageBlitData ,
    -
    998 // pstrUsageSoftButton ,
    -
    999 // pstrUsageSoftButtonID ,
    -
    1000 // pstrUsageSoftButtonSide ,
    -
    1001 // pstrUsageSoftButtonOffset1 ,
    -
    1002 // pstrUsageSoftButtonOffset2 ,
    -
    1003 // pstrUsageSoftButtonReport
    -
    1004 //};
    -
    1005 //const char *medInstrTitles0[] PROGMEM =
    -
    1006 //{
    -
    1007 // pstrUsageVCRAcquisition ,
    -
    1008 // pstrUsageFreezeThaw ,
    -
    1009 // pstrUsageClipStore ,
    -
    1010 // pstrUsageUpdate ,
    -
    1011 // pstrUsageNext ,
    -
    1012 // pstrUsageSave ,
    -
    1013 // pstrUsagePrint ,
    -
    1014 // pstrUsageMicrophoneEnable
    -
    1015 //};
    -
    1016 //const char *medInstrTitles1[] PROGMEM =
    -
    1017 //{
    -
    1018 // pstrUsageCine ,
    -
    1019 // pstrUsageTransmitPower ,
    -
    1020 // pstrUsageVolume ,
    -
    1021 // pstrUsageFocus ,
    -
    1022 // pstrUsageDepth
    -
    1023 //};
    -
    1024 //const char *medInstrTitles2[] PROGMEM =
    -
    1025 //{
    -
    1026 // pstrUsageSoftStepPrimary ,
    -
    1027 // pstrUsageSoftStepSecondary
    -
    1028 //};
    -
    1029 //const char *medInstrTitles3[] PROGMEM =
    -
    1030 //{
    -
    1031 // pstrUsageZoomSelect ,
    -
    1032 // pstrUsageZoomAdjust ,
    -
    1033 // pstrUsageSpectralDopplerModeSelect ,
    -
    1034 // pstrUsageSpectralDopplerModeAdjust ,
    -
    1035 // pstrUsageColorDopplerModeSelect ,
    -
    1036 // pstrUsageColorDopplerModeAdjust ,
    -
    1037 // pstrUsageMotionModeSelect ,
    -
    1038 // pstrUsageMotionModeAdjust ,
    -
    1039 // pstrUsage2DModeSelect ,
    -
    1040 // pstrUsage2DModeAdjust
    -
    1041 //};
    -
    1042 //const char *medInstrTitles4[] PROGMEM =
    -
    1043 //{
    -
    1044 // pstrUsageSoftControlSelect ,
    -
    1045 // pstrUsageSoftControlAdjust
    -
    1046 //};
    -
    1047 
    -
    1048 #endif // __HIDUSAGETITLEARRAYS_H__
    - +Go to the documentation of this file.
    1 /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
    2 
    3 This software may be distributed and modified under the terms of the GNU
    4 General Public License version 2 (GPL2) as published by the Free Software
    5 Foundation and appearing in the file GPL2.TXT included in the packaging of
    6 this file. Please note that GPL2 Section 2[b] requires that all works based
    7 on this software must also be made publicly available under the terms of
    8 the GPL2 ("Copyleft").
    9 
    10 Contact information
    11 -------------------
    12 
    13 Circuits At Home, LTD
    14 Web : http://www.circuitsathome.com
    15 e-mail : support@circuitsathome.com
    16  */
    17 #if !defined(__HIDUSAGETITLEARRAYS_H__)
    18 #define __HIDUSAGETITLEARRAYS_H__
    19 
    20 #include "hidusagestr.h"
    21 
    22 // This is here why?
    23 
    24 //const char *usagePageTitles0[] PROGMEM =
    25 //{
    26 // pstrUsagePageGenericDesktopControls ,
    27 // pstrUsagePageSimulationControls ,
    28 // pstrUsagePageVRControls ,
    29 // pstrUsagePageSportControls ,
    30 // pstrUsagePageGameControls ,
    31 // pstrUsagePageGenericDeviceControls ,
    32 // pstrUsagePageKeyboardKeypad ,
    33 // pstrUsagePageLEDs ,
    34 // pstrUsagePageButton ,
    35 // pstrUsagePageOrdinal ,
    36 // pstrUsagePageTelephone ,
    37 // pstrUsagePageConsumer ,
    38 // pstrUsagePageDigitizer ,
    39 // pstrUsagePagePID ,
    40 // pstrUsagePageUnicode
    41 //};
    42 //
    43 //const char *usagePageTitles1[] PROGMEM =
    44 //{
    45 // pstrUsagePageBarCodeScanner ,
    46 // pstrUsagePageScale ,
    47 // pstrUsagePageMSRDevices ,
    48 // pstrUsagePagePointOfSale ,
    49 // pstrUsagePageCameraControl ,
    50 // pstrUsagePageArcade
    51 //};
    52 //const char *genDesktopTitles0[] PROGMEM =
    53 //{
    54 // pstrUsagePointer ,
    55 // pstrUsageMouse ,
    56 // pstrUsageJoystick ,
    57 // pstrUsageGamePad ,
    58 // pstrUsageKeyboard ,
    59 // pstrUsageKeypad ,
    60 // pstrUsageMultiAxisController ,
    61 // pstrUsageTabletPCSystemControls
    62 //
    63 //};
    64 //const char *genDesktopTitles1[] PROGMEM =
    65 //{
    66 // pstrUsageX ,
    67 // pstrUsageY ,
    68 // pstrUsageZ ,
    69 // pstrUsageRx ,
    70 // pstrUsageRy ,
    71 // pstrUsageRz ,
    72 // pstrUsageSlider ,
    73 // pstrUsageDial ,
    74 // pstrUsageWheel ,
    75 // pstrUsageHatSwitch ,
    76 // pstrUsageCountedBuffer ,
    77 // pstrUsageByteCount ,
    78 // pstrUsageMotionWakeup ,
    79 // pstrUsageStart ,
    80 // pstrUsageSelect ,
    81 // pstrUsagePageReserved ,
    82 // pstrUsageVx ,
    83 // pstrUsageVy ,
    84 // pstrUsageVz ,
    85 // pstrUsageVbrx ,
    86 // pstrUsageVbry ,
    87 // pstrUsageVbrz ,
    88 // pstrUsageVno ,
    89 // pstrUsageFeatureNotification ,
    90 // pstrUsageResolutionMultiplier
    91 //};
    92 //const char *genDesktopTitles2[] PROGMEM =
    93 //{
    94 // pstrUsageSystemControl ,
    95 // pstrUsageSystemPowerDown ,
    96 // pstrUsageSystemSleep ,
    97 // pstrUsageSystemWakeup ,
    98 // pstrUsageSystemContextMenu ,
    99 // pstrUsageSystemMainMenu ,
    100 // pstrUsageSystemAppMenu ,
    101 // pstrUsageSystemMenuHelp ,
    102 // pstrUsageSystemMenuExit ,
    103 // pstrUsageSystemMenuSelect ,
    104 // pstrUsageSystemMenuRight ,
    105 // pstrUsageSystemMenuLeft ,
    106 // pstrUsageSystemMenuUp ,
    107 // pstrUsageSystemMenuDown ,
    108 // pstrUsageSystemColdRestart ,
    109 // pstrUsageSystemWarmRestart ,
    110 // pstrUsageDPadUp ,
    111 // pstrUsageDPadDown ,
    112 // pstrUsageDPadRight ,
    113 // pstrUsageDPadLeft
    114 //};
    115 //const char *genDesktopTitles3[] PROGMEM =
    116 //{
    117 // pstrUsageSystemDock ,
    118 // pstrUsageSystemUndock ,
    119 // pstrUsageSystemSetup ,
    120 // pstrUsageSystemBreak ,
    121 // pstrUsageSystemDebuggerBreak ,
    122 // pstrUsageApplicationBreak ,
    123 // pstrUsageApplicationDebuggerBreak,
    124 // pstrUsageSystemSpeakerMute ,
    125 // pstrUsageSystemHibernate
    126 //};
    127 //const char *genDesktopTitles4[] PROGMEM =
    128 //{
    129 // pstrUsageSystemDisplayInvert ,
    130 // pstrUsageSystemDisplayInternal ,
    131 // pstrUsageSystemDisplayExternal ,
    132 // pstrUsageSystemDisplayBoth ,
    133 // pstrUsageSystemDisplayDual ,
    134 // pstrUsageSystemDisplayToggleIntExt ,
    135 // pstrUsageSystemDisplaySwapPriSec ,
    136 // pstrUsageSystemDisplayLCDAutoscale
    137 //};
    138 //const char *simuTitles0[] PROGMEM =
    139 //{
    140 // pstrUsageFlightSimulationDevice ,
    141 // pstrUsageAutomobileSimulationDevice ,
    142 // pstrUsageTankSimulationDevice ,
    143 // pstrUsageSpaceshipSimulationDevice ,
    144 // pstrUsageSubmarineSimulationDevice ,
    145 // pstrUsageSailingSimulationDevice ,
    146 // pstrUsageMotocicleSimulationDevice ,
    147 // pstrUsageSportsSimulationDevice ,
    148 // pstrUsageAirplaneSimulationDevice ,
    149 // pstrUsageHelicopterSimulationDevice ,
    150 // pstrUsageMagicCarpetSimulationDevice,
    151 // pstrUsageBicycleSimulationDevice
    152 //};
    153 //const char *simuTitles1[] PROGMEM =
    154 //{
    155 // pstrUsageFlightControlStick ,
    156 // pstrUsageFlightStick ,
    157 // pstrUsageCyclicControl ,
    158 // pstrUsageCyclicTrim ,
    159 // pstrUsageFlightYoke ,
    160 // pstrUsageTrackControl
    161 //};
    162 //const char *simuTitles2[] PROGMEM =
    163 //{
    164 // pstrUsageAileron ,
    165 // pstrUsageAileronTrim ,
    166 // pstrUsageAntiTorqueControl ,
    167 // pstrUsageAutopilotEnable ,
    168 // pstrUsageChaffRelease ,
    169 // pstrUsageCollectiveControl ,
    170 // pstrUsageDiveBrake ,
    171 // pstrUsageElectronicCountermeasures ,
    172 // pstrUsageElevator ,
    173 // pstrUsageElevatorTrim ,
    174 // pstrUsageRudder ,
    175 // pstrUsageThrottle ,
    176 // pstrUsageFlightCommunications ,
    177 // pstrUsageFlareRelease ,
    178 // pstrUsageLandingGear ,
    179 // pstrUsageToeBrake ,
    180 // pstrUsageTrigger ,
    181 // pstrUsageWeaponsArm ,
    182 // pstrUsageWeaponsSelect ,
    183 // pstrUsageWingFlaps ,
    184 // pstrUsageAccelerator ,
    185 // pstrUsageBrake ,
    186 // pstrUsageClutch ,
    187 // pstrUsageShifter ,
    188 // pstrUsageSteering ,
    189 // pstrUsageTurretDirection ,
    190 // pstrUsageBarrelElevation ,
    191 // pstrUsageDivePlane ,
    192 // pstrUsageBallast ,
    193 // pstrUsageBicycleCrank ,
    194 // pstrUsageHandleBars ,
    195 // pstrUsageFrontBrake ,
    196 // pstrUsageRearBrake
    197 //};
    198 //const char *vrTitles0[] PROGMEM =
    199 //{
    200 // pstrUsageBelt ,
    201 // pstrUsageBodySuit ,
    202 // pstrUsageFlexor ,
    203 // pstrUsageGlove ,
    204 // pstrUsageHeadTracker ,
    205 // pstrUsageHeadMountedDisplay ,
    206 // pstrUsageHandTracker ,
    207 // pstrUsageOculometer ,
    208 // pstrUsageVest ,
    209 // pstrUsageAnimatronicDevice
    210 //};
    211 //const char *vrTitles1[] PROGMEM =
    212 //{
    213 // pstrUsageStereoEnable ,
    214 // pstrUsageDisplayEnable
    215 //};
    216 //const char *sportsCtrlTitles0[] PROGMEM =
    217 //{
    218 // pstrUsageBaseballBat ,
    219 // pstrUsageGolfClub ,
    220 // pstrUsageRowingMachine ,
    221 // pstrUsageTreadmill
    222 //};
    223 //const char *sportsCtrlTitles1[] PROGMEM =
    224 //{
    225 // pstrUsageOar ,
    226 // pstrUsageSlope ,
    227 // pstrUsageRate ,
    228 // pstrUsageStickSpeed ,
    229 // pstrUsageStickFaceAngle ,
    230 // pstrUsageStickHeelToe ,
    231 // pstrUsageStickFollowThough ,
    232 // pstrUsageStickTempo ,
    233 // pstrUsageStickType ,
    234 // pstrUsageStickHeight
    235 //};
    236 //const char *sportsCtrlTitles2[] PROGMEM =
    237 //{
    238 // pstrUsagePutter ,
    239 // pstrUsage1Iron ,
    240 // pstrUsage2Iron ,
    241 // pstrUsage3Iron ,
    242 // pstrUsage4Iron ,
    243 // pstrUsage5Iron ,
    244 // pstrUsage6Iron ,
    245 // pstrUsage7Iron ,
    246 // pstrUsage8Iron ,
    247 // pstrUsage9Iron ,
    248 // pstrUsage10Iron ,
    249 // pstrUsage11Iron ,
    250 // pstrUsageSandWedge ,
    251 // pstrUsageLoftWedge ,
    252 // pstrUsagePowerWedge ,
    253 // pstrUsage1Wood ,
    254 // pstrUsage3Wood ,
    255 // pstrUsage5Wood ,
    256 // pstrUsage7Wood ,
    257 // pstrUsage9Wood
    258 //};
    259 //const char *gameTitles0[] PROGMEM =
    260 //{
    261 // pstrUsage3DGameController ,
    262 // pstrUsagePinballDevice ,
    263 // pstrUsageGunDevice
    264 //};
    265 //const char *gameTitles1[] PROGMEM =
    266 //{
    267 // pstrUsagePointOfView ,
    268 // pstrUsageTurnRightLeft ,
    269 // pstrUsagePitchForwardBackward ,
    270 // pstrUsageRollRightLeft ,
    271 // pstrUsageMoveRightLeft ,
    272 // pstrUsageMoveForwardBackward ,
    273 // pstrUsageMoveUpDown ,
    274 // pstrUsageLeanRightLeft ,
    275 // pstrUsageLeanForwardBackward ,
    276 // pstrUsageHeightOfPOV ,
    277 // pstrUsageFlipper ,
    278 // pstrUsageSecondaryFlipper ,
    279 // pstrUsageBump ,
    280 // pstrUsageNewGame ,
    281 // pstrUsageShootBall ,
    282 // pstrUsagePlayer ,
    283 // pstrUsageGunBolt ,
    284 // pstrUsageGunClip ,
    285 // pstrUsageGunSelector ,
    286 // pstrUsageGunSingleShot ,
    287 // pstrUsageGunBurst ,
    288 // pstrUsageGunAutomatic ,
    289 // pstrUsageGunSafety ,
    290 // pstrUsageGamepadFireJump ,
    291 // pstrUsageGamepadTrigger
    292 //};
    293 //const char *genDevCtrlTitles[] PROGMEM =
    294 //{
    295 // pstrUsageBatteryStrength,
    296 // pstrUsageWirelessChannel,
    297 // pstrUsageWirelessID,
    298 // pstrUsageDiscoverWirelessControl,
    299 // pstrUsageSecurityCodeCharEntered,
    300 // pstrUsageSecurityCodeCharErased,
    301 // pstrUsageSecurityCodeCleared
    302 //};
    303 //const char *ledTitles[] PROGMEM =
    304 //{
    305 // pstrUsageNumLock ,
    306 // pstrUsageCapsLock ,
    307 // pstrUsageScrollLock ,
    308 // pstrUsageCompose ,
    309 // pstrUsageKana ,
    310 // pstrUsagePower ,
    311 // pstrUsageShift ,
    312 // pstrUsageDoNotDisturb ,
    313 // pstrUsageMute ,
    314 // pstrUsageToneEnable ,
    315 // pstrUsageHighCutFilter ,
    316 // pstrUsageLowCutFilter ,
    317 // pstrUsageEqualizerEnable ,
    318 // pstrUsageSoundFieldOn ,
    319 // pstrUsageSurroundOn ,
    320 // pstrUsageRepeat ,
    321 // pstrUsageStereo ,
    322 // pstrUsageSamplingRateDetect ,
    323 // pstrUsageSpinning ,
    324 // pstrUsageCAV ,
    325 // pstrUsageCLV ,
    326 // pstrUsageRecordingFormatDetect ,
    327 // pstrUsageOffHook ,
    328 // pstrUsageRing ,
    329 // pstrUsageMessageWaiting ,
    330 // pstrUsageDataMode ,
    331 // pstrUsageBatteryOperation ,
    332 // pstrUsageBatteryOK ,
    333 // pstrUsageBatteryLow ,
    334 // pstrUsageSpeaker ,
    335 // pstrUsageHeadSet ,
    336 // pstrUsageHold ,
    337 // pstrUsageMicrophone ,
    338 // pstrUsageCoverage ,
    339 // pstrUsageNightMode ,
    340 // pstrUsageSendCalls ,
    341 // pstrUsageCallPickup ,
    342 // pstrUsageConference ,
    343 // pstrUsageStandBy ,
    344 // pstrUsageCameraOn ,
    345 // pstrUsageCameraOff ,
    346 // pstrUsageOnLine ,
    347 // pstrUsageOffLine ,
    348 // pstrUsageBusy ,
    349 // pstrUsageReady ,
    350 // pstrUsagePaperOut ,
    351 // pstrUsagePaperJam ,
    352 // pstrUsageRemote ,
    353 // pstrUsageForward ,
    354 // pstrUsageReverse ,
    355 // pstrUsageStop ,
    356 // pstrUsageRewind ,
    357 // pstrUsageFastForward ,
    358 // pstrUsagePlay ,
    359 // pstrUsagePause ,
    360 // pstrUsageRecord ,
    361 // pstrUsageError ,
    362 // pstrUsageSelectedIndicator ,
    363 // pstrUsageInUseIndicator ,
    364 // pstrUsageMultiModeIndicator ,
    365 // pstrUsageIndicatorOn ,
    366 // pstrUsageIndicatorFlash ,
    367 // pstrUsageIndicatorSlowBlink ,
    368 // pstrUsageIndicatorFastBlink ,
    369 // pstrUsageIndicatorOff ,
    370 // pstrUsageFlashOnTime ,
    371 // pstrUsageSlowBlinkOnTime ,
    372 // pstrUsageSlowBlinkOffTime ,
    373 // pstrUsageFastBlinkOnTime ,
    374 // pstrUsageFastBlinkOffTime ,
    375 // pstrUsageIndicatorColor ,
    376 // pstrUsageIndicatorRed ,
    377 // pstrUsageIndicatorGreen ,
    378 // pstrUsageIndicatorAmber ,
    379 // pstrUsageGenericIndicator ,
    380 // pstrUsageSystemSuspend ,
    381 // pstrUsageExternalPowerConnected
    382 //};
    383 //const char *telTitles0 [] PROGMEM =
    384 //{
    385 // pstrUsagePhone ,
    386 // pstrUsageAnsweringMachine ,
    387 // pstrUsageMessageControls ,
    388 // pstrUsageHandset ,
    389 // pstrUsageHeadset ,
    390 // pstrUsageTelephonyKeyPad ,
    391 // pstrUsageProgrammableButton
    392 //};
    393 //const char *telTitles1 [] PROGMEM =
    394 //{
    395 // pstrUsageHookSwitch ,
    396 // pstrUsageFlash ,
    397 // pstrUsageFeature ,
    398 // pstrUsageHold ,
    399 // pstrUsageRedial ,
    400 // pstrUsageTransfer ,
    401 // pstrUsageDrop ,
    402 // pstrUsagePark ,
    403 // pstrUsageForwardCalls ,
    404 // pstrUsageAlternateFunction ,
    405 // pstrUsageLine ,
    406 // pstrUsageSpeakerPhone ,
    407 // pstrUsageConference ,
    408 // pstrUsageRingEnable ,
    409 // pstrUsageRingSelect ,
    410 // pstrUsagePhoneMute ,
    411 // pstrUsageCallerID ,
    412 // pstrUsageSend
    413 //};
    414 //const char *telTitles2 [] PROGMEM =
    415 //{
    416 // pstrUsageSpeedDial ,
    417 // pstrUsageStoreNumber ,
    418 // pstrUsageRecallNumber ,
    419 // pstrUsagePhoneDirectory
    420 //};
    421 //const char *telTitles3 [] PROGMEM =
    422 //{
    423 // pstrUsageVoiceMail ,
    424 // pstrUsageScreenCalls ,
    425 // pstrUsageDoNotDisturb ,
    426 // pstrUsageMessage ,
    427 // pstrUsageAnswerOnOff
    428 //};
    429 //const char *telTitles4 [] PROGMEM =
    430 //{
    431 // pstrUsageInsideDialTone ,
    432 // pstrUsageOutsideDialTone ,
    433 // pstrUsageInsideRingTone ,
    434 // pstrUsageOutsideRingTone ,
    435 // pstrUsagePriorityRingTone ,
    436 // pstrUsageInsideRingback ,
    437 // pstrUsagePriorityRingback ,
    438 // pstrUsageLineBusyTone ,
    439 // pstrUsageReorderTone ,
    440 // pstrUsageCallWaitingTone ,
    441 // pstrUsageConfirmationTone1 ,
    442 // pstrUsageConfirmationTone2 ,
    443 // pstrUsageTonesOff ,
    444 // pstrUsageOutsideRingback ,
    445 // pstrUsageRinger
    446 //};
    447 //const char *telTitles5 [] PROGMEM =
    448 //{
    449 // pstrUsagePhoneKey0 ,
    450 // pstrUsagePhoneKey1 ,
    451 // pstrUsagePhoneKey2 ,
    452 // pstrUsagePhoneKey3 ,
    453 // pstrUsagePhoneKey4 ,
    454 // pstrUsagePhoneKey5 ,
    455 // pstrUsagePhoneKey6 ,
    456 // pstrUsagePhoneKey7 ,
    457 // pstrUsagePhoneKey8 ,
    458 // pstrUsagePhoneKey9 ,
    459 // pstrUsagePhoneKeyStar ,
    460 // pstrUsagePhoneKeyPound ,
    461 // pstrUsagePhoneKeyA ,
    462 // pstrUsagePhoneKeyB ,
    463 // pstrUsagePhoneKeyC ,
    464 // pstrUsagePhoneKeyD
    465 //};
    466 //const char *consTitles0[] PROGMEM =
    467 //{
    468 // pstrUsageConsumerControl,
    469 // pstrUsageNumericKeyPad,
    470 // pstrUsageProgrammableButton,
    471 // pstrUsageMicrophone,
    472 // pstrUsageHeadphone,
    473 // pstrUsageGraphicEqualizer
    474 //};
    475 //const char *consTitles1[] PROGMEM =
    476 //{
    477 // pstrUsagePlus10 ,
    478 // pstrUsagePlus100,
    479 // pstrUsageAMPM
    480 //};
    481 //const char *consTitles2[] PROGMEM =
    482 //{
    483 // pstrUsagePower ,
    484 // pstrUsageReset ,
    485 // pstrUsageSleep ,
    486 // pstrUsageSleepAfter ,
    487 // pstrUsageSleepMode ,
    488 // pstrUsageIllumination ,
    489 // pstrUsageFunctionButtons
    490 //
    491 //};
    492 //const char *consTitles3[] PROGMEM =
    493 //{
    494 // pstrUsageMenu ,
    495 // pstrUsageMenuPick ,
    496 // pstrUsageMenuUp ,
    497 // pstrUsageMenuDown ,
    498 // pstrUsageMenuLeft ,
    499 // pstrUsageMenuRight ,
    500 // pstrUsageMenuEscape ,
    501 // pstrUsageMenuValueIncrease,
    502 // pstrUsageMenuValueDecrease
    503 //};
    504 //const char *consTitles4[] PROGMEM =
    505 //{
    506 // pstrUsageDataOnScreen ,
    507 // pstrUsageClosedCaption ,
    508 // pstrUsageClosedCaptionSelect,
    509 // pstrUsageVCRTV ,
    510 // pstrUsageBroadcastMode ,
    511 // pstrUsageSnapshot ,
    512 // pstrUsageStill
    513 //};
    514 //const char *consTitles5[] PROGMEM =
    515 //{
    516 // pstrUsageSelection ,
    517 // pstrUsageAssignSelection ,
    518 // pstrUsageModeStep ,
    519 // pstrUsageRecallLast ,
    520 // pstrUsageEnterChannel ,
    521 // pstrUsageOrderMovie ,
    522 // pstrUsageChannel ,
    523 // pstrUsageMediaSelection ,
    524 // pstrUsageMediaSelectComputer ,
    525 // pstrUsageMediaSelectTV ,
    526 // pstrUsageMediaSelectWWW ,
    527 // pstrUsageMediaSelectDVD ,
    528 // pstrUsageMediaSelectTelephone ,
    529 // pstrUsageMediaSelectProgramGuide ,
    530 // pstrUsageMediaSelectVideoPhone ,
    531 // pstrUsageMediaSelectGames ,
    532 // pstrUsageMediaSelectMessages ,
    533 // pstrUsageMediaSelectCD ,
    534 // pstrUsageMediaSelectVCR ,
    535 // pstrUsageMediaSelectTuner ,
    536 // pstrUsageQuit ,
    537 // pstrUsageHelp ,
    538 // pstrUsageMediaSelectTape ,
    539 // pstrUsageMediaSelectCable ,
    540 // pstrUsageMediaSelectSatellite ,
    541 // pstrUsageMediaSelectSecurity ,
    542 // pstrUsageMediaSelectHome ,
    543 // pstrUsageMediaSelectCall ,
    544 // pstrUsageChannelIncrement ,
    545 // pstrUsageChannelDecrement ,
    546 // pstrUsageMediaSelectSAP ,
    547 // pstrUsagePageReserved ,
    548 // pstrUsageVCRPlus ,
    549 // pstrUsageOnce ,
    550 // pstrUsageDaily ,
    551 // pstrUsageWeekly ,
    552 // pstrUsageMonthly
    553 //};
    554 //const char *consTitles6[] PROGMEM =
    555 //{
    556 // pstrUsagePlay ,
    557 // pstrUsagePause ,
    558 // pstrUsageRecord ,
    559 // pstrUsageFastForward ,
    560 // pstrUsageRewind ,
    561 // pstrUsageScanNextTrack ,
    562 // pstrUsageScanPreviousTrack ,
    563 // pstrUsageStop ,
    564 // pstrUsageEject ,
    565 // pstrUsageRandomPlay ,
    566 // pstrUsageSelectDisk ,
    567 // pstrUsageEnterDisk ,
    568 // pstrUsageRepeat ,
    569 // pstrUsageTracking ,
    570 // pstrUsageTrackNormal ,
    571 // pstrUsageSlowTracking ,
    572 // pstrUsageFrameForward ,
    573 // pstrUsageFrameBackwards ,
    574 // pstrUsageMark ,
    575 // pstrUsageClearMark ,
    576 // pstrUsageRepeatFromMark ,
    577 // pstrUsageReturnToMark ,
    578 // pstrUsageSearchMarkForward ,
    579 // pstrUsageSearchMarkBackwards ,
    580 // pstrUsageCounterReset ,
    581 // pstrUsageShowCounter ,
    582 // pstrUsageTrackingIncrement ,
    583 // pstrUsageTrackingDecrement ,
    584 // pstrUsageStopEject ,
    585 // pstrUsagePlayPause ,
    586 // pstrUsagePlaySkip
    587 //};
    588 //const char *consTitles7[] PROGMEM =
    589 //{
    590 // pstrUsageVolume ,
    591 // pstrUsageBalance ,
    592 // pstrUsageMute ,
    593 // pstrUsageBass ,
    594 // pstrUsageTreble ,
    595 // pstrUsageBassBoost ,
    596 // pstrUsageSurroundMode ,
    597 // pstrUsageLoudness ,
    598 // pstrUsageMPX ,
    599 // pstrUsageVolumeIncrement ,
    600 // pstrUsageVolumeDecrement
    601 //};
    602 //const char *consTitles8[] PROGMEM =
    603 //{
    604 // pstrUsageSpeedSelect ,
    605 // pstrUsagePlaybackSpeed ,
    606 // pstrUsageStandardPlay ,
    607 // pstrUsageLongPlay ,
    608 // pstrUsageExtendedPlay ,
    609 // pstrUsageSlow
    610 //};
    611 //const char *consTitles9[] PROGMEM =
    612 //{
    613 // pstrUsageFanEnable ,
    614 // pstrUsageFanSpeed ,
    615 // pstrUsageLightEnable ,
    616 // pstrUsageLightIlluminationLevel ,
    617 // pstrUsageClimateControlEnable ,
    618 // pstrUsageRoomTemperature ,
    619 // pstrUsageSecurityEnable ,
    620 // pstrUsageFireAlarm ,
    621 // pstrUsagePoliceAlarm ,
    622 // pstrUsageProximity ,
    623 // pstrUsageMotion ,
    624 // pstrUsageDuresAlarm ,
    625 // pstrUsageHoldupAlarm ,
    626 // pstrUsageMedicalAlarm
    627 //};
    628 //const char *consTitlesA[] PROGMEM =
    629 //{
    630 // pstrUsageBalanceRight ,
    631 // pstrUsageBalanceLeft ,
    632 // pstrUsageBassIncrement ,
    633 // pstrUsageBassDecrement ,
    634 // pstrUsageTrebleIncrement ,
    635 // pstrUsageTrebleDecrement
    636 //};
    637 //const char *consTitlesB[] PROGMEM =
    638 //{
    639 // pstrUsageSpeakerSystem ,
    640 // pstrUsageChannelLeft ,
    641 // pstrUsageChannelRight ,
    642 // pstrUsageChannelCenter ,
    643 // pstrUsageChannelFront ,
    644 // pstrUsageChannelCenterFront ,
    645 // pstrUsageChannelSide ,
    646 // pstrUsageChannelSurround ,
    647 // pstrUsageChannelLowFreqEnhancement ,
    648 // pstrUsageChannelTop ,
    649 // pstrUsageChannelUnknown
    650 //};
    651 //const char *consTitlesC[] PROGMEM =
    652 //{
    653 // pstrUsageSubChannel ,
    654 // pstrUsageSubChannelIncrement ,
    655 // pstrUsageSubChannelDecrement ,
    656 // pstrUsageAlternateAudioIncrement ,
    657 // pstrUsageAlternateAudioDecrement
    658 //};
    659 //const char *consTitlesD[] PROGMEM =
    660 //{
    661 // pstrUsageApplicationLaunchButtons ,
    662 // pstrUsageALLaunchButtonConfigTool ,
    663 // pstrUsageALProgrammableButton ,
    664 // pstrUsageALConsumerControlConfig ,
    665 // pstrUsageALWordProcessor ,
    666 // pstrUsageALTextEditor ,
    667 // pstrUsageALSpreadsheet ,
    668 // pstrUsageALGraphicsEditor ,
    669 // pstrUsageALPresentationApp ,
    670 // pstrUsageALDatabaseApp ,
    671 // pstrUsageALEmailReader ,
    672 // pstrUsageALNewsreader ,
    673 // pstrUsageALVoicemail ,
    674 // pstrUsageALContactsAddressBook ,
    675 // pstrUsageALCalendarSchedule ,
    676 // pstrUsageALTaskProjectManager ,
    677 // pstrUsageALLogJournalTimecard ,
    678 // pstrUsageALCheckbookFinance ,
    679 // pstrUsageALCalculator ,
    680 // pstrUsageALAVCapturePlayback ,
    681 // pstrUsageALLocalMachineBrowser ,
    682 // pstrUsageALLANWANBrow ,
    683 // pstrUsageALInternetBrowser ,
    684 // pstrUsageALRemoteNetISPConnect ,
    685 // pstrUsageALNetworkConference ,
    686 // pstrUsageALNetworkChat ,
    687 // pstrUsageALTelephonyDialer ,
    688 // pstrUsageALLogon ,
    689 // pstrUsageALLogoff ,
    690 // pstrUsageALLogonLogoff ,
    691 // pstrUsageALTermLockScrSav ,
    692 // pstrUsageALControlPannel ,
    693 // pstrUsageALCommandLineProcessorRun ,
    694 // pstrUsageALProcessTaskManager ,
    695 // pstrUsageALSelectTaskApplication ,
    696 // pstrUsageALNextTaskApplication ,
    697 // pstrUsageALPreviousTaskApplication ,
    698 // pstrUsageALPreemptiveHaltTaskApp ,
    699 // pstrUsageALIntegratedHelpCenter ,
    700 // pstrUsageALDocuments ,
    701 // pstrUsageALThesaurus ,
    702 // pstrUsageALDictionary ,
    703 // pstrUsageALDesktop ,
    704 // pstrUsageALSpellCheck ,
    705 // pstrUsageALGrammarCheck ,
    706 // pstrUsageALWirelessStatus ,
    707 // pstrUsageALKeyboardLayout ,
    708 // pstrUsageALVirusProtection ,
    709 // pstrUsageALEncryption ,
    710 // pstrUsageALScreenSaver ,
    711 // pstrUsageALAlarms ,
    712 // pstrUsageALClock ,
    713 // pstrUsageALFileBrowser ,
    714 // pstrUsageALPowerStatus ,
    715 // pstrUsageALImageBrowser ,
    716 // pstrUsageALAudioBrowser ,
    717 // pstrUsageALMovieBrowser ,
    718 // pstrUsageALDigitalRightsManager ,
    719 // pstrUsageALDigitalWallet ,
    720 // pstrUsagePageReserved ,
    721 // pstrUsageALInstantMessaging ,
    722 // pstrUsageALOEMFeaturesBrowser ,
    723 // pstrUsageALOEMHelp ,
    724 // pstrUsageALOnlineCommunity ,
    725 // pstrUsageALEntertainmentContentBrow ,
    726 // pstrUsageALOnlineShoppingBrowser ,
    727 // pstrUsageALSmartCardInfoHelp ,
    728 // pstrUsageALMarketMonitorFinBrowser ,
    729 // pstrUsageALCustomCorpNewsBrowser ,
    730 // pstrUsageALOnlineActivityBrowser ,
    731 // pstrUsageALResearchSearchBrowser ,
    732 // pstrUsageALAudioPlayer
    733 //};
    734 //const char *consTitlesE[] PROGMEM =
    735 //{
    736 // pstrUsageGenericGUIAppControls ,
    737 // pstrUsageACNew ,
    738 // pstrUsageACOpen ,
    739 // pstrUsageACClose ,
    740 // pstrUsageACExit ,
    741 // pstrUsageACMaximize ,
    742 // pstrUsageACMinimize ,
    743 // pstrUsageACSave ,
    744 // pstrUsageACPrint ,
    745 // pstrUsageACProperties ,
    746 // pstrUsageACUndo ,
    747 // pstrUsageACCopy ,
    748 // pstrUsageACCut ,
    749 // pstrUsageACPaste ,
    750 // pstrUsageACSelectAll ,
    751 // pstrUsageACFind ,
    752 // pstrUsageACFindAndReplace ,
    753 // pstrUsageACSearch ,
    754 // pstrUsageACGoto ,
    755 // pstrUsageACHome ,
    756 // pstrUsageACBack ,
    757 // pstrUsageACForward ,
    758 // pstrUsageACStop ,
    759 // pstrUsageACRefresh ,
    760 // pstrUsageACPreviousLink ,
    761 // pstrUsageACNextLink ,
    762 // pstrUsageACBookmarks ,
    763 // pstrUsageACHistory ,
    764 // pstrUsageACSubscriptions ,
    765 // pstrUsageACZoomIn ,
    766 // pstrUsageACZoomOut ,
    767 // pstrUsageACZoom ,
    768 // pstrUsageACFullScreenView ,
    769 // pstrUsageACNormalView ,
    770 // pstrUsageACViewToggle ,
    771 // pstrUsageACScrollUp ,
    772 // pstrUsageACScrollDown ,
    773 // pstrUsageACScroll ,
    774 // pstrUsageACPanLeft ,
    775 // pstrUsageACPanRight ,
    776 // pstrUsageACPan ,
    777 // pstrUsageACNewWindow ,
    778 // pstrUsageACTileHoriz ,
    779 // pstrUsageACTileVert ,
    780 // pstrUsageACFormat ,
    781 // pstrUsageACEdit ,
    782 // pstrUsageACBold ,
    783 // pstrUsageACItalics ,
    784 // pstrUsageACUnderline ,
    785 // pstrUsageACStrikethrough ,
    786 // pstrUsageACSubscript ,
    787 // pstrUsageACSuperscript ,
    788 // pstrUsageACAllCaps ,
    789 // pstrUsageACRotate ,
    790 // pstrUsageACResize ,
    791 // pstrUsageACFlipHorizontal ,
    792 // pstrUsageACFlipVertical ,
    793 // pstrUsageACMirrorHorizontal ,
    794 // pstrUsageACMirrorVertical ,
    795 // pstrUsageACFontSelect ,
    796 // pstrUsageACFontColor ,
    797 // pstrUsageACFontSize ,
    798 // pstrUsageACJustifyLeft ,
    799 // pstrUsageACJustifyCenterH ,
    800 // pstrUsageACJustifyRight ,
    801 // pstrUsageACJustifyBlockH ,
    802 // pstrUsageACJustifyTop ,
    803 // pstrUsageACJustifyCenterV ,
    804 // pstrUsageACJustifyBottom ,
    805 // pstrUsageACJustifyBlockV ,
    806 // pstrUsageACIndentDecrease ,
    807 // pstrUsageACIndentIncrease ,
    808 // pstrUsageACNumberedList ,
    809 // pstrUsageACRestartNumbering ,
    810 // pstrUsageACBulletedList ,
    811 // pstrUsageACPromote ,
    812 // pstrUsageACDemote ,
    813 // pstrUsageACYes ,
    814 // pstrUsageACNo ,
    815 // pstrUsageACCancel ,
    816 // pstrUsageACCatalog ,
    817 // pstrUsageACBuyChkout ,
    818 // pstrUsageACAddToCart ,
    819 // pstrUsageACExpand ,
    820 // pstrUsageACExpandAll ,
    821 // pstrUsageACCollapse ,
    822 // pstrUsageACCollapseAll ,
    823 // pstrUsageACPrintPreview ,
    824 // pstrUsageACPasteSpecial ,
    825 // pstrUsageACInsertMode ,
    826 // pstrUsageACDelete ,
    827 // pstrUsageACLock ,
    828 // pstrUsageACUnlock ,
    829 // pstrUsageACProtect ,
    830 // pstrUsageACUnprotect ,
    831 // pstrUsageACAttachComment ,
    832 // pstrUsageACDeleteComment ,
    833 // pstrUsageACViewComment ,
    834 // pstrUsageACSelectWord ,
    835 // pstrUsageACSelectSentence ,
    836 // pstrUsageACSelectParagraph ,
    837 // pstrUsageACSelectColumn ,
    838 // pstrUsageACSelectRow ,
    839 // pstrUsageACSelectTable ,
    840 // pstrUsageACSelectObject ,
    841 // pstrUsageACRedoRepeat ,
    842 // pstrUsageACSort ,
    843 // pstrUsageACSortAscending ,
    844 // pstrUsageACSortDescending ,
    845 // pstrUsageACFilter ,
    846 // pstrUsageACSetClock ,
    847 // pstrUsageACViewClock ,
    848 // pstrUsageACSelectTimeZone ,
    849 // pstrUsageACEditTimeZone ,
    850 // pstrUsageACSetAlarm ,
    851 // pstrUsageACClearAlarm ,
    852 // pstrUsageACSnoozeAlarm ,
    853 // pstrUsageACResetAlarm ,
    854 // pstrUsageACSyncronize ,
    855 // pstrUsageACSendReceive ,
    856 // pstrUsageACSendTo ,
    857 // pstrUsageACReply ,
    858 // pstrUsageACReplyAll ,
    859 // pstrUsageACForwardMessage ,
    860 // pstrUsageACSend ,
    861 // pstrUsageACAttachFile ,
    862 // pstrUsageACUpload ,
    863 // pstrUsageACDownload ,
    864 // pstrUsageACSetBorders ,
    865 // pstrUsageACInsertRow ,
    866 // pstrUsageACInsertColumn ,
    867 // pstrUsageACInsertFile ,
    868 // pstrUsageACInsertPicture ,
    869 // pstrUsageACInsertObject ,
    870 // pstrUsageACInsertSymbol ,
    871 // pstrUsageACSaveAndClose ,
    872 // pstrUsageACRename ,
    873 // pstrUsageACMerge ,
    874 // pstrUsageACSplit ,
    875 // pstrUsageACDistributeHorizontaly ,
    876 // pstrUsageACDistributeVerticaly
    877 //};
    878 //const char *digitTitles0[] PROGMEM =
    879 //{
    880 // pstrUsageDigitizer ,
    881 // pstrUsagePen ,
    882 // pstrUsageLightPen ,
    883 // pstrUsageTouchScreen ,
    884 // pstrUsageTouchPad ,
    885 // pstrUsageWhiteBoard ,
    886 // pstrUsageCoordinateMeasuringMachine ,
    887 // pstrUsage3DDigitizer ,
    888 // pstrUsageStereoPlotter ,
    889 // pstrUsageArticulatedArm ,
    890 // pstrUsageArmature ,
    891 // pstrUsageMultiplePointDigitizer ,
    892 // pstrUsageFreeSpaceWand
    893 //};
    894 //const char *digitTitles1[] PROGMEM =
    895 //{
    896 // pstrUsageStylus ,
    897 // pstrUsagePuck ,
    898 // pstrUsageFinger
    899 //
    900 //};
    901 //const char *digitTitles2[] PROGMEM =
    902 //{
    903 // pstrUsageTipPressure ,
    904 // pstrUsageBarrelPressure ,
    905 // pstrUsageInRange ,
    906 // pstrUsageTouch ,
    907 // pstrUsageUntouch ,
    908 // pstrUsageTap ,
    909 // pstrUsageQuality ,
    910 // pstrUsageDataValid ,
    911 // pstrUsageTransducerIndex ,
    912 // pstrUsageTabletFunctionKeys ,
    913 // pstrUsageProgramChangeKeys ,
    914 // pstrUsageBatteryStrength ,
    915 // pstrUsageInvert ,
    916 // pstrUsageXTilt ,
    917 // pstrUsageYTilt ,
    918 // pstrUsageAzimuth ,
    919 // pstrUsageAltitude ,
    920 // pstrUsageTwist ,
    921 // pstrUsageTipSwitch ,
    922 // pstrUsageSecondaryTipSwitch ,
    923 // pstrUsageBarrelSwitch ,
    924 // pstrUsageEraser ,
    925 // pstrUsageTabletPick
    926 //};
    927 //const char *aplphanumTitles0[] PROGMEM =
    928 //{
    929 // pstrUsageAlphanumericDisplay,
    930 // pstrUsageBitmappedDisplay
    931 //};
    932 //const char *aplphanumTitles1[] PROGMEM =
    933 //{
    934 // pstrUsageDisplayAttributesReport ,
    935 // pstrUsageASCIICharacterSet ,
    936 // pstrUsageDataReadBack ,
    937 // pstrUsageFontReadBack ,
    938 // pstrUsageDisplayControlReport ,
    939 // pstrUsageClearDisplay ,
    940 // pstrUsageDisplayEnable ,
    941 // pstrUsageScreenSaverDelay ,
    942 // pstrUsageScreenSaverEnable ,
    943 // pstrUsageVerticalScroll ,
    944 // pstrUsageHorizontalScroll ,
    945 // pstrUsageCharacterReport ,
    946 // pstrUsageDisplayData ,
    947 // pstrUsageDisplayStatus ,
    948 // pstrUsageStatusNotReady ,
    949 // pstrUsageStatusReady ,
    950 // pstrUsageErrorNotALoadableCharacter ,
    951 // pstrUsageErrorFotDataCanNotBeRead ,
    952 // pstrUsageCursorPositionReport ,
    953 // pstrUsageRow ,
    954 // pstrUsageColumn ,
    955 // pstrUsageRows ,
    956 // pstrUsageColumns ,
    957 // pstrUsageCursorPixelPosition ,
    958 // pstrUsageCursorMode ,
    959 // pstrUsageCursorEnable ,
    960 // pstrUsageCursorBlink ,
    961 // pstrUsageFontReport ,
    962 // pstrUsageFontData ,
    963 // pstrUsageCharacterWidth ,
    964 // pstrUsageCharacterHeight ,
    965 // pstrUsageCharacterSpacingHorizontal ,
    966 // pstrUsageCharacterSpacingVertical ,
    967 // pstrUsageUnicodeCharset ,
    968 // pstrUsageFont7Segment ,
    969 // pstrUsage7SegmentDirectMap ,
    970 // pstrUsageFont14Segment ,
    971 // pstrUsage14SegmentDirectMap ,
    972 // pstrUsageDisplayBrightness ,
    973 // pstrUsageDisplayContrast ,
    974 // pstrUsageCharacterAttribute ,
    975 // pstrUsageAttributeReadback ,
    976 // pstrUsageAttributeData ,
    977 // pstrUsageCharAttributeEnhance ,
    978 // pstrUsageCharAttributeUnderline ,
    979 // pstrUsageCharAttributeBlink
    980 //};
    981 //const char *aplphanumTitles2[] PROGMEM =
    982 //{
    983 // pstrUsageBitmapSizeX ,
    984 // pstrUsageBitmapSizeY ,
    985 // pstrUsagePageReserved ,
    986 // pstrUsageBitDepthFormat ,
    987 // pstrUsageDisplayOrientation ,
    988 // pstrUsagePaletteReport ,
    989 // pstrUsagePaletteDataSize ,
    990 // pstrUsagePaletteDataOffset ,
    991 // pstrUsagePaletteData ,
    992 // pstrUsageBlitReport ,
    993 // pstrUsageBlitRectangleX1 ,
    994 // pstrUsageBlitRectangleY1 ,
    995 // pstrUsageBlitRectangleX2 ,
    996 // pstrUsageBlitRectangleY2 ,
    997 // pstrUsageBlitData ,
    998 // pstrUsageSoftButton ,
    999 // pstrUsageSoftButtonID ,
    1000 // pstrUsageSoftButtonSide ,
    1001 // pstrUsageSoftButtonOffset1 ,
    1002 // pstrUsageSoftButtonOffset2 ,
    1003 // pstrUsageSoftButtonReport
    1004 //};
    1005 //const char *medInstrTitles0[] PROGMEM =
    1006 //{
    1007 // pstrUsageVCRAcquisition ,
    1008 // pstrUsageFreezeThaw ,
    1009 // pstrUsageClipStore ,
    1010 // pstrUsageUpdate ,
    1011 // pstrUsageNext ,
    1012 // pstrUsageSave ,
    1013 // pstrUsagePrint ,
    1014 // pstrUsageMicrophoneEnable
    1015 //};
    1016 //const char *medInstrTitles1[] PROGMEM =
    1017 //{
    1018 // pstrUsageCine ,
    1019 // pstrUsageTransmitPower ,
    1020 // pstrUsageVolume ,
    1021 // pstrUsageFocus ,
    1022 // pstrUsageDepth
    1023 //};
    1024 //const char *medInstrTitles2[] PROGMEM =
    1025 //{
    1026 // pstrUsageSoftStepPrimary ,
    1027 // pstrUsageSoftStepSecondary
    1028 //};
    1029 //const char *medInstrTitles3[] PROGMEM =
    1030 //{
    1031 // pstrUsageZoomSelect ,
    1032 // pstrUsageZoomAdjust ,
    1033 // pstrUsageSpectralDopplerModeSelect ,
    1034 // pstrUsageSpectralDopplerModeAdjust ,
    1035 // pstrUsageColorDopplerModeSelect ,
    1036 // pstrUsageColorDopplerModeAdjust ,
    1037 // pstrUsageMotionModeSelect ,
    1038 // pstrUsageMotionModeAdjust ,
    1039 // pstrUsage2DModeSelect ,
    1040 // pstrUsage2DModeAdjust
    1041 //};
    1042 //const char *medInstrTitles4[] PROGMEM =
    1043 //{
    1044 // pstrUsageSoftControlSelect ,
    1045 // pstrUsageSoftControlAdjust
    1046 //};
    1047 
    1048 #endif // __HIDUSAGETITLEARRAYS_H__
    diff --git a/hierarchy.html b/hierarchy.html index 201dad93..646d4f6a 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Hierarchy + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -73,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -91,115 +92,115 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    Go to the graphical class hierarchy

    This inheritance list is sorted roughly, but not completely, alphabetically:
    [detail level 1234]
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    oCACM_FUNC_DESCR
    oCAddressPool
    |oCAddressPoolImpl< MAX_DEVICES_ALLOWED >
    |\CAddressPoolImpl< USB_NUMDEVICES >
    oCBASE_CLASS
    |oCHexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >
    |\CSinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >
    oCBASICCDB
    oCBluetoothService
    |oCBTHID
    |oCPS3BT
    |oCSPP
    |\CWII
    oCByteSkipper
    oCCALL_MGMNT_FUNC_DESCR
    oCCapacity
    oCCDB10
    oCCDB12
    oCCDB6
    oCCDB_LBA32_16
    oCCDB_LBA64_16
    oCCDCAsyncOper
    oCCLASS_NOTIFICATION
    oCCommandBlockWrapperBase
    |\CCommandBlockWrapper
    oCCommandStatusWrapper
    oCEpInfo
    oCFTDIAsyncOper
    oCHID_CLASS_DESCRIPTOR_LEN_AND_TYPE
    oCHidItemPrefix
    oCHIDReportParser
    |oCKeyboardReportParser
    |oCMouseReportParser
    |\CUniversalReportParser
    oCHubDescriptor
    oCHubEvent
    oCInquiryResponse
    oCKBDINFO
    oCKBDLEDS
    oCLINE_CODING
    oCMainItemIOFeature
    oCMAX3421e< SPI_SS, INTR >
    |\CUSB
    oCMODIFIERKEYS
    oCMOUSEINFO
    oCMultiByteValueParser
    oCMultiValueBuffer
    oCPrint
    |\CMax_LCD
    oCPS4Buttons
    oCPS4Data
    oCPS4Output
    oCPS4Parser
    |oCPS4BT
    |\CPS4USB
    oCPS4Status
    oCPSBUZZButtons
    oCPTPListParser
    oCRequestSenseResponce
    oCSETUP_PKT
    oCSPi< SPI_CLK, SPI_MOSI, SPI_MISO, SPI_SS >
    oCStream
    |\CSPP
    oCTEL_RINGER_FUNC_DESCR
    oCtouchpadXY
    oCtty_features
    oCUHS2_GPIO
    oCUSB_CONFIGURATION_DESCRIPTOR
    oCUSB_DEVICE_DESCRIPTOR
    oCUSB_ENDPOINT_DESCRIPTOR
    oCUSB_HID_DESCRIPTOR
    oCUSB_INTERFACE_DESCRIPTOR
    oCUsbConfigXtracter
    |oCACM
    |oCADK
    |oCBTD
    |oCBulkOnly
    |oCFTDI
    |oCUSBHID
    |\CXBOXONE
    oCUsbDevice
    oCUsbDeviceAddress
    oCUSBDeviceConfig
    |oCACM
    |oCADK
    |oCBTD
    |oCBulkOnly
    |oCFTDI
    |oCPS3USB
    |oCUSBH_MIDI
    |oCUSBHID
    |oCUSBHub
    |oCXBOXOLD
    |oCXBOXONE
    |oCXBOXRECV
    |\CXBOXUSB
    \CUSBReadParser
     oCConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK >
     \CReportDescParserBase
     CACM_FUNC_DESCR
     CAddressPool
     CAddressPoolImpl< MAX_DEVICES_ALLOWED >
     CAddressPoolImpl< USB_NUMDEVICES >
     CBASE_CLASS
     CHexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >
     CSinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >
     CBASICCDB
     CBluetoothService
     CBTHID
     CPS3BT
     CSPP
     CWII
     CByteSkipper
     CCALL_MGMNT_FUNC_DESCR
     CCapacity
     CCDB10
     CCDB12
     CCDB6
     CCDB_LBA32_16
     CCDB_LBA64_16
     CCDCAsyncOper
     CCLASS_NOTIFICATION
     CCommandBlockWrapperBase
     CCommandBlockWrapper
     CCommandStatusWrapper
     CEpInfo
     CFTDIAsyncOper
     CHID_CLASS_DESCRIPTOR_LEN_AND_TYPE
     CHidItemPrefix
     CHIDReportParser
     CKeyboardReportParser
     CMouseReportParser
     CUniversalReportParser
     CHubDescriptor
     CHubEvent
     CInquiryResponse
     CKBDINFO
     CKBDLEDS
     CLINE_CODING
     CMainItemIOFeature
     CMAX3421e< SPI_SS, INTR >
     CUSB
     CMODIFIERKEYS
     CMOUSEINFO
     CMultiByteValueParser
     CMultiValueBuffer
     CPrint
     CMax_LCD
     CPS4Buttons
     CPS4Data
     CPS4Output
     CPS4Parser
     CPS4BT
     CPS4USB
     CPS4Status
     CPSBUZZButtons
     CPTPListParser
     CRequestSenseResponce
     CSETUP_PKT
     CSPi< SPI_CLK, SPI_MOSI, SPI_MISO, SPI_SS >
     CStream
     CSPP
     CTEL_RINGER_FUNC_DESCR
     CtouchpadXY
     Ctty_features
     CUHS2_GPIO
     CUSB_CONFIGURATION_DESCRIPTOR
     CUSB_DEVICE_DESCRIPTOR
     CUSB_ENDPOINT_DESCRIPTOR
     CUSB_HID_DESCRIPTOR
     CUSB_INTERFACE_DESCRIPTOR
     CUsbConfigXtracter
     CACM
     CADK
     CBTD
     CBulkOnly
     CFTDI
     CUSBHID
     CXBOXONE
     CUsbDevice
     CUsbDeviceAddress
     CUSBDeviceConfig
     CACM
     CADK
     CBTD
     CBulkOnly
     CFTDI
     CPS3USB
     CUSBH_MIDI
     CUSBHID
     CUSBHub
     CXBOXOLD
     CXBOXONE
     CXBOXRECV
     CXBOXUSB
     CUSBReadParser
     CConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK >
     CReportDescParserBase
    @@ -207,7 +208,7 @@ This inheritance list is sorted roughly, but not completely, alphabetically: diff --git a/index.html b/index.html index 140bcbbd..052dac6d 100644 --- a/index.html +++ b/index.html @@ -3,15 +3,16 @@ - -USB Host Shield 2.0: Main Page + +USB Host Shield 2.0: USB Host Library Rev.2.0 + @@ -22,7 +23,7 @@ - @@ -31,7 +32,7 @@
    +
    USB Host Shield 2.0
    - + @@ -65,7 +66,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -76,12 +77,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    -
    USB Host Shield 2.0 Documentation
    +
    USB Host Library Rev.2.0
    -

    The code is released under the GNU General Public License.

    -
    -

    ![Build Status](https://travis-ci.org/felis/USB_Host_Shield_2.0.svg?branch=master)

    +

    The code is released under the GNU General Public License.


    +

    Summary

    This is Revision 2.0 of MAX3421E-based USB Host Shield Library for AVR's.

    Project main web site is: http://www.circuitsathome.com.

    @@ -175,8 +175,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    Documentation for the library can be found at the following link: https://felis.github.io/USB_Host_Shield_2.0/.

    Enable debugging

    By default serial debugging is disabled. To turn it on simply change ENABLE_UHS_DEBUGGING to 1 in settings.h like so:

    -

    ```C++ #define ENABLE_UHS_DEBUGGING 1 ```

    -

    Boards

    +
    1 {C++}
    2 #define ENABLE_UHS_DEBUGGING 1

    Boards

    Currently the following boards are supported by the library:

    - + @@ -73,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -92,227 +93,323 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    - + +
    - + + + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + + +
    - + +
    - + +
    - + +
    - + + +
    - + +
    - + +
    - + + + + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + +
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    - + + + + + +
    @@ -320,7 +417,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/jquery.js b/jquery.js index 6aa2e4c2..d52a1c77 100644 --- a/jquery.js +++ b/jquery.js @@ -1,4 +1,4 @@ -/*! +/* * jQuery JavaScript Library v1.7.1 * http://jquery.com/ * @@ -13,27 +13,56 @@ * * Date: Mon Nov 21 21:11:03 2011 -0500 */ -(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
    a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
    ";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
    t
    ";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
    ";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType; -if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); -/*! +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
    a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
    ";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
    t
    ";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
    ";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/* * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ -(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1 -},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

    ";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
    ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},ac=a(av); -ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
    ","
    "]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length; -if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
    ").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b -})}})(window); -/*! +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

    ";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
    ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/
    ",""],legend:[1,"
    ","
    "],thead:[1,"
    ","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
    ","
    "]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
    ").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/* + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/* + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/* + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
    ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
    ');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/* + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('