From 9b340497826e54dc8d484f07af1818f028eba3d7 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 13 Oct 2018 15:47:19 +0200 Subject: [PATCH] Updated the documentation --- _b_t_d_8cpp.html | 52 +- _b_t_d_8cpp__incl.md5 | 2 +- _b_t_d_8cpp__incl.png | Bin 14281 -> 13934 bytes _b_t_d_8cpp_source.html | 413 +- _b_t_d_8h.html | 798 ++- _b_t_d_8h__dep__incl.map | 8 +- _b_t_d_8h__dep__incl.md5 | 2 +- _b_t_d_8h__dep__incl.png | Bin 18632 -> 18674 bytes _b_t_d_8h__incl.md5 | 2 +- _b_t_d_8h__incl.png | Bin 12208 -> 11826 bytes _b_t_d_8h_source.html | 236 +- _b_t_h_i_d_8cpp.html | 52 +- _b_t_h_i_d_8cpp__incl.md5 | 2 +- _b_t_h_i_d_8cpp__incl.png | Bin 19315 -> 19135 bytes _b_t_h_i_d_8cpp_source.html | 160 +- _b_t_h_i_d_8h.html | 70 +- _b_t_h_i_d_8h__dep__incl.md5 | 2 +- _b_t_h_i_d_8h__dep__incl.png | Bin 5686 -> 5579 bytes _b_t_h_i_d_8h__incl.md5 | 2 +- _b_t_h_i_d_8h__incl.png | Bin 17083 -> 16920 bytes _b_t_h_i_d_8h_source.html | 64 +- _p_s3_b_t_8cpp.html | 58 +- _p_s3_b_t_8cpp__incl.map | 6 +- _p_s3_b_t_8cpp__incl.md5 | 2 +- _p_s3_b_t_8cpp__incl.png | Bin 22550 -> 22019 bytes _p_s3_b_t_8cpp_source.html | 220 +- _p_s3_b_t_8h.html | 62 +- _p_s3_b_t_8h__dep__incl.md5 | 2 +- _p_s3_b_t_8h__dep__incl.png | Bin 3525 -> 3474 bytes _p_s3_b_t_8h__incl.map | 4 +- _p_s3_b_t_8h__incl.md5 | 2 +- _p_s3_b_t_8h__incl.png | Bin 19920 -> 19479 bytes _p_s3_b_t_8h_source.html | 74 +- _p_s3_enums_8h.html | 156 +- _p_s3_enums_8h__dep__incl.map | 2 +- _p_s3_enums_8h__dep__incl.md5 | 2 +- _p_s3_enums_8h__dep__incl.png | Bin 10795 -> 10839 bytes _p_s3_enums_8h__incl.md5 | 2 +- _p_s3_enums_8h__incl.png | Bin 4359 -> 4363 bytes _p_s3_enums_8h_source.html | 52 +- _p_s3_u_s_b_8cpp.html | 58 +- _p_s3_u_s_b_8cpp__incl.map | 6 +- _p_s3_u_s_b_8cpp__incl.md5 | 2 +- _p_s3_u_s_b_8cpp__incl.png | Bin 21158 -> 19810 bytes _p_s3_u_s_b_8cpp_source.html | 166 +- _p_s3_u_s_b_8h.html | 110 +- _p_s3_u_s_b_8h__dep__incl.md5 | 2 +- _p_s3_u_s_b_8h__dep__incl.png | Bin 3821 -> 3796 bytes _p_s3_u_s_b_8h__incl.map | 4 +- _p_s3_u_s_b_8h__incl.md5 | 2 +- _p_s3_u_s_b_8h__incl.png | Bin 18252 -> 16947 bytes _p_s3_u_s_b_8h_source.html | 72 +- _p_s4_b_t_8h.html | 52 +- _p_s4_b_t_8h__incl.md5 | 2 +- _p_s4_b_t_8h__incl.png | Bin 30445 -> 30089 bytes _p_s4_b_t_8h_source.html | 66 +- _p_s4_parser_8cpp.html | 85 +- _p_s4_parser_8cpp__incl.md5 | 2 +- _p_s4_parser_8cpp__incl.png | Bin 9559 -> 9305 bytes _p_s4_parser_8cpp_source.html | 77 +- _p_s4_parser_8h.html | 66 +- _p_s4_parser_8h__dep__incl.md5 | 2 +- _p_s4_parser_8h__dep__incl.png | Bin 9114 -> 9094 bytes _p_s4_parser_8h__incl.md5 | 2 +- _p_s4_parser_8h__incl.png | Bin 6743 -> 6449 bytes _p_s4_parser_8h_source.html | 156 +- _p_s4_u_s_b_8h.html | 88 +- _p_s4_u_s_b_8h__incl.map | 6 +- _p_s4_u_s_b_8h__incl.md5 | 2 +- _p_s4_u_s_b_8h__incl.png | Bin 21607 -> 21639 bytes _p_s4_u_s_b_8h_source.html | 79 +- _p_s_buzz_8cpp.html | 52 +- _p_s_buzz_8cpp__incl.md5 | 2 +- _p_s_buzz_8cpp__incl.png | Bin 18591 -> 18408 bytes _p_s_buzz_8cpp_source.html | 63 +- _p_s_buzz_8h.html | 64 +- _p_s_buzz_8h__dep__incl.md5 | 2 +- _p_s_buzz_8h__dep__incl.png | Bin 3569 -> 3598 bytes _p_s_buzz_8h__incl.md5 | 2 +- _p_s_buzz_8h__incl.png | Bin 15844 -> 15688 bytes _p_s_buzz_8h_source.html | 63 +- _r_e_a_d_m_e_8md.html | 52 +- _r_e_a_d_m_e_8md_source.html | 54 +- _s_p_p_8cpp.html | 58 +- _s_p_p_8cpp__incl.md5 | 2 +- _s_p_p_8cpp__incl.png | Bin 16057 -> 15728 bytes _s_p_p_8cpp_source.html | 158 +- _s_p_p_8h.html | 142 +- _s_p_p_8h__dep__incl.md5 | 2 +- _s_p_p_8h__dep__incl.png | Bin 2717 -> 2706 bytes _s_p_p_8h__incl.md5 | 2 +- _s_p_p_8h__incl.png | Bin 14034 -> 13649 bytes _s_p_p_8h_source.html | 58 +- _usb_8cpp.html | 52 +- _usb_8cpp__incl.md5 | 2 +- _usb_8cpp__incl.png | Bin 2820 -> 2820 bytes _usb_8cpp_source.html | 320 +- _usb_8h.html | 54 +- _usb_8h__dep__incl.map | 2 +- _usb_8h__dep__incl.md5 | 2 +- _usb_8h__dep__incl.png | Bin 162614 -> 165149 bytes _usb_8h_source.html | 54 +- _usb_core_8h.html | 410 +- _usb_core_8h_source.html | 166 +- _wii_8cpp.html | 70 +- _wii_8cpp__incl.md5 | 2 +- _wii_8cpp__incl.png | Bin 19018 -> 17953 bytes _wii_8cpp_source.html | 230 +- _wii_8h.html | 118 +- _wii_8h__dep__incl.md5 | 2 +- _wii_8h__dep__incl.png | Bin 2498 -> 2493 bytes _wii_8h__incl.md5 | 2 +- _wii_8h__incl.png | Bin 16926 -> 15895 bytes _wii_8h_source.html | 100 +- _wii_camera_readme_8md.html | 52 +- _wii_camera_readme_8md_source.html | 52 +- _x_b_o_x_o_l_d_8cpp.html | 58 +- _x_b_o_x_o_l_d_8cpp__incl.md5 | 2 +- _x_b_o_x_o_l_d_8cpp__incl.png | Bin 19080 -> 18728 bytes _x_b_o_x_o_l_d_8cpp_source.html | 156 +- _x_b_o_x_o_l_d_8h.html | 128 +- _x_b_o_x_o_l_d_8h__dep__incl.md5 | 2 +- _x_b_o_x_o_l_d_8h__dep__incl.png | Bin 4198 -> 4188 bytes _x_b_o_x_o_l_d_8h__incl.map | 4 +- _x_b_o_x_o_l_d_8h__incl.md5 | 2 +- _x_b_o_x_o_l_d_8h__incl.png | Bin 16150 -> 15868 bytes _x_b_o_x_o_l_d_8h_source.html | 62 +- _x_b_o_x_o_n_e_8cpp.html | 52 +- _x_b_o_x_o_n_e_8cpp__incl.md5 | 2 +- _x_b_o_x_o_n_e_8cpp__incl.png | Bin 11989 -> 11982 bytes _x_b_o_x_o_n_e_8cpp_source.html | 196 +- _x_b_o_x_o_n_e_8h.html | 418 +- _x_b_o_x_o_n_e_8h__dep__incl.md5 | 2 +- _x_b_o_x_o_n_e_8h__dep__incl.png | Bin 4333 -> 4255 bytes _x_b_o_x_o_n_e_8h__incl.md5 | 2 +- _x_b_o_x_o_n_e_8h__incl.png | Bin 9070 -> 9107 bytes _x_b_o_x_o_n_e_8h_source.html | 128 +- _x_b_o_x_r_e_c_v_8cpp.html | 52 +- _x_b_o_x_r_e_c_v_8cpp__incl.md5 | 2 +- _x_b_o_x_r_e_c_v_8cpp__incl.png | Bin 12175 -> 12163 bytes _x_b_o_x_r_e_c_v_8cpp_source.html | 170 +- _x_b_o_x_r_e_c_v_8h.html | 148 +- _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 4625 -> 4611 bytes _x_b_o_x_r_e_c_v_8h__incl.md5 | 2 +- _x_b_o_x_r_e_c_v_8h__incl.png | Bin 9240 -> 9230 bytes _x_b_o_x_r_e_c_v_8h_source.html | 64 +- _x_b_o_x_u_s_b_8cpp.html | 58 +- _x_b_o_x_u_s_b_8cpp__incl.map | 6 +- _x_b_o_x_u_s_b_8cpp__incl.md5 | 2 +- _x_b_o_x_u_s_b_8cpp__incl.png | Bin 21783 -> 21115 bytes _x_b_o_x_u_s_b_8cpp_source.html | 156 +- _x_b_o_x_u_s_b_8h.html | 164 +- _x_b_o_x_u_s_b_8h__dep__incl.md5 | 2 +- _x_b_o_x_u_s_b_8h__dep__incl.png | Bin 4370 -> 4297 bytes _x_b_o_x_u_s_b_8h__incl.map | 4 +- _x_b_o_x_u_s_b_8h__incl.md5 | 2 +- _x_b_o_x_u_s_b_8h__incl.png | Bin 18508 -> 17782 bytes _x_b_o_x_u_s_b_8h_source.html | 64 +- address_8h.html | 112 +- address_8h_source.html | 109 +- adk_8cpp.html | 52 +- adk_8cpp__incl.md5 | 2 +- adk_8cpp__incl.png | Bin 3926 -> 4008 bytes adk_8cpp_source.html | 140 +- adk_8h.html | 148 +- adk_8h__dep__incl.md5 | 2 +- adk_8h__dep__incl.png | Bin 2718 -> 2767 bytes adk_8h__incl.md5 | 2 +- adk_8h__incl.png | Bin 2310 -> 2350 bytes adk_8h_source.html | 66 +- annotated.html | 54 +- avrpins_8h.html | 52 +- avrpins_8h_source.html | 54 +- cdc___x_r21_b1411_8cpp.html | 52 +- cdc___x_r21_b1411_8cpp__incl.md5 | 2 +- cdc___x_r21_b1411_8cpp__incl.png | Bin 8564 -> 8512 bytes cdc___x_r21_b1411_8cpp_source.html | 144 +- cdc___x_r21_b1411_8h.html | 410 +- cdc___x_r21_b1411_8h__dep__incl.md5 | 2 +- cdc___x_r21_b1411_8h__dep__incl.png | Bin 4928 -> 4947 bytes cdc___x_r21_b1411_8h__incl.md5 | 2 +- cdc___x_r21_b1411_8h__incl.png | Bin 5528 -> 5590 bytes cdc___x_r21_b1411_8h_source.html | 72 +- cdcacm_8cpp.html | 52 +- cdcacm_8cpp__incl.md5 | 2 +- cdcacm_8cpp__incl.png | Bin 4578 -> 4588 bytes cdcacm_8cpp_source.html | 228 +- cdcacm_8h.html | 376 +- cdcacm_8h__dep__incl.md5 | 2 +- cdcacm_8h__dep__incl.png | Bin 13622 -> 13488 bytes cdcacm_8h__incl.md5 | 2 +- cdcacm_8h__incl.png | Bin 2628 -> 2682 bytes cdcacm_8h_source.html | 129 +- cdcftdi_8cpp.html | 52 +- cdcftdi_8cpp__incl.md5 | 2 +- cdcftdi_8cpp__incl.png | Bin 4547 -> 4477 bytes cdcftdi_8cpp_source.html | 177 +- cdcftdi_8h.html | 310 +- cdcftdi_8h__dep__incl.md5 | 2 +- cdcftdi_8h__dep__incl.png | Bin 3116 -> 3034 bytes cdcftdi_8h__incl.md5 | 2 +- cdcftdi_8h__incl.png | Bin 2606 -> 2619 bytes cdcftdi_8h_source.html | 78 +- cdcprolific_8cpp.html | 52 +- cdcprolific_8cpp__incl.md5 | 2 +- cdcprolific_8cpp__incl.png | Bin 7056 -> 7137 bytes cdcprolific_8cpp_source.html | 138 +- cdcprolific_8h.html | 455 +- cdcprolific_8h__dep__incl.md5 | 2 +- cdcprolific_8h__dep__incl.png | Bin 3923 -> 3950 bytes cdcprolific_8h__incl.md5 | 2 +- cdcprolific_8h__incl.png | Bin 4491 -> 4525 bytes cdcprolific_8h_source.html | 62 +- class_a_c_m-members.html | 62 +- class_a_c_m.html | 442 +- class_a_c_m__coll__graph.md5 | 2 +- class_a_c_m__coll__graph.png | Bin 24008 -> 23727 bytes class_a_c_m__inherit__graph.md5 | 2 +- class_a_c_m__inherit__graph.png | Bin 12723 -> 12659 bytes class_a_d_k-members.html | 54 +- class_a_d_k.html | 176 +- class_a_d_k__coll__graph.md5 | 2 +- class_a_d_k__coll__graph.png | Bin 15992 -> 16673 bytes class_a_d_k__inherit__graph.md5 | 2 +- class_a_d_k__inherit__graph.png | Bin 7692 -> 7649 bytes class_address_pool-members.html | 54 +- class_address_pool.html | 68 +- class_address_pool__inherit__graph.md5 | 2 +- class_address_pool__inherit__graph.png | Bin 12002 -> 11612 bytes class_address_pool_impl-members.html | 54 +- class_address_pool_impl.html | 86 +- class_address_pool_impl__coll__graph.md5 | 2 +- class_address_pool_impl__coll__graph.png | Bin 6947 -> 6940 bytes class_address_pool_impl__inherit__graph.md5 | 2 +- class_address_pool_impl__inherit__graph.png | Bin 6947 -> 6940 bytes class_b_t_d-members.html | 56 +- class_b_t_d.html | 500 +- class_b_t_d__coll__graph.md5 | 2 +- class_b_t_d__coll__graph.png | Bin 15877 -> 16519 bytes class_b_t_d__inherit__graph.md5 | 2 +- class_b_t_d__inherit__graph.png | Bin 7556 -> 7476 bytes class_b_t_h_i_d-members.html | 54 +- class_b_t_h_i_d.html | 164 +- class_b_t_h_i_d__coll__graph.md5 | 2 +- class_b_t_h_i_d__coll__graph.png | Bin 22478 -> 23312 bytes class_b_t_h_i_d__inherit__graph.md5 | 2 +- class_b_t_h_i_d__inherit__graph.png | Bin 5442 -> 5419 bytes class_bluetooth_service-members.html | 54 +- class_bluetooth_service.html | 124 +- class_bluetooth_service__coll__graph.md5 | 2 +- class_bluetooth_service__coll__graph.png | Bin 20220 -> 20915 bytes class_bluetooth_service__inherit__graph.md5 | 2 +- class_bluetooth_service__inherit__graph.png | Bin 11579 -> 11017 bytes class_bulk_only-members.html | 54 +- class_bulk_only.html | 314 +- class_bulk_only__coll__graph.md5 | 2 +- class_bulk_only__coll__graph.png | Bin 16386 -> 17001 bytes class_bulk_only__inherit__graph.md5 | 2 +- class_bulk_only__inherit__graph.png | Bin 8093 -> 8038 bytes class_byte_skipper-members.html | 54 +- class_byte_skipper.html | 74 +- class_c_d_c_async_oper-members.html | 54 +- class_c_d_c_async_oper.html | 62 +- class_config_desc_parser-members.html | 54 +- class_config_desc_parser.html | 74 +- class_config_desc_parser__coll__graph.md5 | 2 +- class_config_desc_parser__coll__graph.png | Bin 9067 -> 9055 bytes class_config_desc_parser__inherit__graph.md5 | 2 +- class_config_desc_parser__inherit__graph.png | Bin 9067 -> 9055 bytes class_f_t_d_i-members.html | 75 +- class_f_t_d_i.html | 163 +- class_f_t_d_i__coll__graph.md5 | 2 +- class_f_t_d_i__coll__graph.png | Bin 7485 -> 7420 bytes class_f_t_d_i__inherit__graph.md5 | 2 +- class_f_t_d_i__inherit__graph.png | Bin 7485 -> 7420 bytes class_f_t_d_i_async_oper-members.html | 54 +- class_f_t_d_i_async_oper.html | 68 +- class_h_i_d_boot-members.html | 54 +- class_h_i_d_boot.html | 116 +- class_h_i_d_boot__coll__graph.md5 | 2 +- class_h_i_d_boot__coll__graph.png | Bin 17747 -> 16958 bytes class_h_i_d_boot__inherit__graph.md5 | 2 +- class_h_i_d_boot__inherit__graph.png | Bin 11778 -> 11723 bytes class_h_i_d_composite-members.html | 54 +- class_h_i_d_composite.html | 162 +- class_h_i_d_composite__coll__graph.md5 | 2 +- class_h_i_d_composite__coll__graph.png | Bin 25592 -> 24833 bytes class_h_i_d_composite__inherit__graph.md5 | 2 +- class_h_i_d_composite__inherit__graph.png | Bin 10788 -> 10692 bytes class_h_i_d_report_parser-members.html | 54 +- class_h_i_d_report_parser.html | 60 +- class_h_i_d_report_parser__inherit__graph.md5 | 2 +- class_h_i_d_report_parser__inherit__graph.png | Bin 11981 -> 11648 bytes class_h_i_d_universal-members.html | 54 +- class_h_i_d_universal.html | 158 +- class_h_i_d_universal__coll__graph.md5 | 2 +- class_h_i_d_universal__coll__graph.png | Bin 25059 -> 24219 bytes class_h_i_d_universal__inherit__graph.md5 | 2 +- class_h_i_d_universal__inherit__graph.png | Bin 15320 -> 15275 bytes class_hex_dumper-members.html | 54 +- class_hex_dumper.html | 78 +- class_hex_dumper__coll__graph.md5 | 2 +- class_hex_dumper__coll__graph.png | Bin 7008 -> 7020 bytes class_hex_dumper__inherit__graph.md5 | 2 +- class_hex_dumper__inherit__graph.png | Bin 7008 -> 7020 bytes class_keyboard_report_parser-members.html | 54 +- class_keyboard_report_parser.html | 154 +- class_keyboard_report_parser__coll__graph.md5 | 2 +- class_keyboard_report_parser__coll__graph.png | Bin 11864 -> 12026 bytes ...keyboard_report_parser__inherit__graph.md5 | 2 +- ...keyboard_report_parser__inherit__graph.png | Bin 5232 -> 5212 bytes class_m_a_x3421e-members.html | 54 +- class_m_a_x3421e.html | 150 +- class_m_a_x3421e__inherit__graph.md5 | 2 +- class_m_a_x3421e__inherit__graph.png | Bin 5717 -> 5690 bytes class_max___l_c_d-members.html | 54 +- class_max___l_c_d.html | 186 +- class_max___l_c_d__coll__graph.md5 | 2 +- class_max___l_c_d__coll__graph.png | Bin 2613 -> 2565 bytes class_max___l_c_d__inherit__graph.md5 | 2 +- class_max___l_c_d__inherit__graph.png | Bin 2613 -> 2565 bytes class_mouse_report_parser-members.html | 54 +- class_mouse_report_parser.html | 116 +- class_mouse_report_parser__coll__graph.md5 | 2 +- class_mouse_report_parser__coll__graph.png | Bin 9458 -> 9593 bytes class_mouse_report_parser__inherit__graph.md5 | 2 +- class_mouse_report_parser__inherit__graph.png | Bin 4918 -> 4874 bytes class_multi_byte_value_parser-members.html | 54 +- class_multi_byte_value_parser.html | 80 +- class_p_l2303-members.html | 62 +- class_p_l2303.html | 89 +- class_p_l2303__coll__graph.map | 2 +- class_p_l2303__coll__graph.md5 | 2 +- class_p_l2303__coll__graph.png | Bin 26973 -> 26989 bytes class_p_l2303__inherit__graph.md5 | 2 +- class_p_l2303__inherit__graph.png | Bin 10151 -> 10093 bytes class_p_s3_b_t-members.html | 54 +- class_p_s3_b_t.html | 248 +- class_p_s3_b_t__coll__graph.md5 | 2 +- class_p_s3_b_t__coll__graph.png | Bin 22820 -> 23649 bytes class_p_s3_b_t__inherit__graph.md5 | 2 +- class_p_s3_b_t__inherit__graph.png | Bin 3995 -> 4037 bytes class_p_s3_u_s_b-members.html | 54 +- class_p_s3_u_s_b.html | 290 +- class_p_s3_u_s_b__coll__graph.md5 | 2 +- class_p_s3_u_s_b__coll__graph.png | Bin 12053 -> 12589 bytes class_p_s3_u_s_b__inherit__graph.md5 | 2 +- class_p_s3_u_s_b__inherit__graph.png | Bin 4425 -> 4395 bytes class_p_s4_b_t-members.html | 54 +- class_p_s4_b_t.html | 92 +- class_p_s4_b_t__coll__graph.md5 | 2 +- class_p_s4_b_t__coll__graph.png | Bin 27019 -> 28207 bytes class_p_s4_b_t__inherit__graph.md5 | 2 +- class_p_s4_b_t__inherit__graph.png | Bin 8704 -> 8673 bytes class_p_s4_parser-members.html | 54 +- class_p_s4_parser.html | 212 +- class_p_s4_parser__inherit__graph.md5 | 2 +- class_p_s4_parser__inherit__graph.png | Bin 5717 -> 5296 bytes class_p_s4_u_s_b-members.html | 54 +- class_p_s4_u_s_b.html | 98 +- class_p_s4_u_s_b__coll__graph.md5 | 2 +- class_p_s4_u_s_b__coll__graph.png | Bin 30083 -> 29130 bytes class_p_s4_u_s_b__inherit__graph.md5 | 2 +- class_p_s4_u_s_b__inherit__graph.png | Bin 15696 -> 14793 bytes class_p_s_buzz-members.html | 54 +- class_p_s_buzz.html | 146 +- class_p_s_buzz__coll__graph.md5 | 2 +- class_p_s_buzz__coll__graph.png | Bin 27825 -> 26841 bytes class_p_s_buzz__inherit__graph.md5 | 2 +- class_p_s_buzz__inherit__graph.png | Bin 12920 -> 12839 bytes class_p_t_p_list_parser-members.html | 54 +- class_p_t_p_list_parser.html | 86 +- class_report_desc_parser-members.html | 54 +- class_report_desc_parser.html | 56 +- class_report_desc_parser2-members.html | 54 +- class_report_desc_parser2.html | 68 +- class_report_desc_parser2__coll__graph.md5 | 2 +- class_report_desc_parser2__coll__graph.png | Bin 21449 -> 21179 bytes class_report_desc_parser2__inherit__graph.md5 | 2 +- class_report_desc_parser2__inherit__graph.png | Bin 8430 -> 8455 bytes class_report_desc_parser__coll__graph.md5 | 2 +- class_report_desc_parser__coll__graph.png | Bin 21308 -> 21053 bytes class_report_desc_parser__inherit__graph.md5 | 2 +- class_report_desc_parser__inherit__graph.png | Bin 8483 -> 8527 bytes class_report_desc_parser_base-members.html | 54 +- class_report_desc_parser_base.html | 587 +- ...s_report_desc_parser_base__coll__graph.md5 | 2 +- ...s_report_desc_parser_base__coll__graph.png | Bin 17617 -> 17177 bytes ...eport_desc_parser_base__inherit__graph.md5 | 2 +- ...eport_desc_parser_base__inherit__graph.png | Bin 11522 -> 11362 bytes class_s_p_p-members.html | 54 +- class_s_p_p.html | 152 +- class_s_p_p__coll__graph.md5 | 2 +- class_s_p_p__coll__graph.png | Bin 24243 -> 24804 bytes class_s_p_p__inherit__graph.md5 | 2 +- class_s_p_p__inherit__graph.png | Bin 6292 -> 5498 bytes class_s_pi-members.html | 54 +- class_s_pi.html | 62 +- class_sink_parser-members.html | 54 +- class_sink_parser.html | 78 +- class_sink_parser__coll__graph.md5 | 2 +- class_sink_parser__coll__graph.png | Bin 7170 -> 7184 bytes class_sink_parser__inherit__graph.md5 | 2 +- class_sink_parser__inherit__graph.png | Bin 7170 -> 7184 bytes class_u_s_b-members.html | 54 +- class_u_s_b.html | 208 +- class_u_s_b__coll__graph.md5 | 2 +- class_u_s_b__coll__graph.png | Bin 3088 -> 3017 bytes class_u_s_b__inherit__graph.md5 | 2 +- class_u_s_b__inherit__graph.png | Bin 3088 -> 3017 bytes class_u_s_b_device_config-members.html | 54 +- class_u_s_b_device_config.html | 120 +- class_u_s_b_device_config__inherit__graph.md5 | 2 +- class_u_s_b_device_config__inherit__graph.png | Bin 56125 -> 56319 bytes class_u_s_b_h___m_i_d_i-members.html | 101 +- class_u_s_b_h___m_i_d_i.html | 598 +- 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 12112 -> 12645 bytes 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 4483 -> 4448 bytes class_u_s_b_h_i_d-members.html | 54 +- class_u_s_b_h_i_d.html | 180 +- class_u_s_b_h_i_d__coll__graph.md5 | 2 +- class_u_s_b_h_i_d__coll__graph.png | Bin 13722 -> 12994 bytes class_u_s_b_h_i_d__inherit__graph.md5 | 2 +- class_u_s_b_h_i_d__inherit__graph.png | Bin 23380 -> 23302 bytes class_u_s_b_hub-members.html | 54 +- class_u_s_b_hub.html | 150 +- class_u_s_b_hub__coll__graph.md5 | 2 +- class_u_s_b_hub__coll__graph.png | Bin 4345 -> 4319 bytes class_u_s_b_hub__inherit__graph.md5 | 2 +- class_u_s_b_hub__inherit__graph.png | Bin 4345 -> 4319 bytes class_u_s_b_read_parser-members.html | 54 +- class_u_s_b_read_parser.html | 60 +- class_u_s_b_read_parser__inherit__graph.md5 | 2 +- class_u_s_b_read_parser__inherit__graph.png | Bin 19907 -> 20718 bytes class_universal_report_parser-members.html | 54 +- class_universal_report_parser.html | 62 +- ...s_universal_report_parser__coll__graph.md5 | 2 +- ...s_universal_report_parser__coll__graph.png | Bin 5174 -> 5200 bytes ...niversal_report_parser__inherit__graph.md5 | 2 +- ...niversal_report_parser__inherit__graph.png | Bin 5174 -> 5200 bytes class_usb_config_xtracter-members.html | 54 +- class_usb_config_xtracter.html | 65 +- class_usb_config_xtracter__inherit__graph.map | 1 + class_usb_config_xtracter__inherit__graph.md5 | 2 +- class_usb_config_xtracter__inherit__graph.png | Bin 34135 -> 36095 bytes class_w_i_i-members.html | 54 +- class_w_i_i.html | 494 +- class_w_i_i__coll__graph.md5 | 2 +- class_w_i_i__coll__graph.png | Bin 22282 -> 23107 bytes class_w_i_i__inherit__graph.md5 | 2 +- class_w_i_i__inherit__graph.png | Bin 3461 -> 3498 bytes class_x_b_o_x_o_l_d-members.html | 54 +- class_x_b_o_x_o_l_d.html | 158 +- class_x_b_o_x_o_l_d__coll__graph.md5 | 2 +- class_x_b_o_x_o_l_d__coll__graph.png | Bin 12179 -> 12733 bytes class_x_b_o_x_o_l_d__inherit__graph.md5 | 2 +- class_x_b_o_x_o_l_d__inherit__graph.png | Bin 4540 -> 4516 bytes class_x_b_o_x_o_n_e-members.html | 78 +- class_x_b_o_x_o_n_e.html | 457 +- class_x_b_o_x_o_n_e__coll__graph.map | 7 +- class_x_b_o_x_o_n_e__coll__graph.md5 | 2 +- class_x_b_o_x_o_n_e__coll__graph.png | Bin 12240 -> 17205 bytes class_x_b_o_x_o_n_e__inherit__graph.map | 1 + class_x_b_o_x_o_n_e__inherit__graph.md5 | 2 +- class_x_b_o_x_o_n_e__inherit__graph.png | Bin 4595 -> 8236 bytes class_x_b_o_x_r_e_c_v-members.html | 54 +- class_x_b_o_x_r_e_c_v.html | 224 +- 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 12495 -> 13031 bytes 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 4828 -> 4815 bytes class_x_b_o_x_u_s_b-members.html | 54 +- class_x_b_o_x_u_s_b.html | 194 +- class_x_b_o_x_u_s_b__coll__graph.md5 | 2 +- class_x_b_o_x_u_s_b__coll__graph.png | Bin 12280 -> 12826 bytes class_x_b_o_x_u_s_b__inherit__graph.md5 | 2 +- class_x_b_o_x_u_s_b__inherit__graph.png | Bin 4628 -> 4602 bytes class_x_r21_b1411-members.html | 62 +- class_x_r21_b1411.html | 137 +- class_x_r21_b1411__coll__graph.map | 2 +- class_x_r21_b1411__coll__graph.md5 | 2 +- class_x_r21_b1411__coll__graph.png | Bin 27070 -> 27115 bytes class_x_r21_b1411__inherit__graph.md5 | 2 +- class_x_r21_b1411__inherit__graph.png | Bin 10243 -> 10173 bytes classes.html | 139 +- confdescparser_8h.html | 76 +- confdescparser_8h_source.html | 137 +- controller_enums_8h.html | 374 +- controller_enums_8h__dep__incl.map | 4 +- controller_enums_8h__dep__incl.png | Bin 54541 -> 54964 bytes controller_enums_8h_source.html | 250 +- dir_69161428018e52ad84691a5947f27cc9.html | 52 +- dir_ee762931928e29ae94e054d18c99dc9e.html | 52 +- doxygen.css | 139 +- dynsections.js | 33 +- files.html | 52 +- functions.html | 95 +- functions_a.html | 95 +- functions_b.html | 100 +- functions_c.html | 97 +- functions_d.html | 95 +- functions_e.html | 101 +- functions_enum.html | 64 +- functions_eval.html | 64 +- functions_f.html | 95 +- functions_func.html | 92 +- functions_func_b.html | 92 +- functions_func_c.html | 94 +- functions_func_d.html | 92 +- functions_func_e.html | 96 +- functions_func_f.html | 92 +- functions_func_g.html | 92 +- functions_func_h.html | 92 +- functions_func_i.html | 99 +- functions_func_k.html | 92 +- functions_func_l.html | 95 +- functions_func_m.html | 92 +- functions_func_n.html | 92 +- functions_func_o.html | 93 +- functions_func_p.html | 95 +- functions_func_r.html | 98 +- functions_func_s.html | 106 +- functions_func_t.html | 92 +- functions_func_u.html | 92 +- functions_func_v.html | 92 +- functions_func_w.html | 94 +- functions_func_x.html | 92 +- functions_g.html | 95 +- functions_h.html | 95 +- functions_i.html | 98 +- functions_k.html | 95 +- functions_l.html | 98 +- functions_m.html | 95 +- functions_n.html | 95 +- functions_o.html | 96 +- functions_p.html | 98 +- functions_q.html | 96 +- functions_r.html | 99 +- functions_s.html | 109 +- functions_t.html | 95 +- functions_type.html | 64 +- functions_u.html | 95 +- functions_v.html | 95 +- functions_vars.html | 95 +- functions_vars_a.html | 95 +- functions_vars_b.html | 100 +- functions_vars_c.html | 95 +- functions_vars_d.html | 95 +- functions_vars_e.html | 97 +- functions_vars_f.html | 95 +- functions_vars_g.html | 95 +- functions_vars_h.html | 95 +- functions_vars_i.html | 95 +- functions_vars_k.html | 95 +- functions_vars_l.html | 95 +- functions_vars_m.html | 95 +- functions_vars_n.html | 95 +- functions_vars_o.html | 95 +- functions_vars_p.html | 95 +- functions_vars_q.html | 96 +- functions_vars_r.html | 95 +- functions_vars_s.html | 95 +- functions_vars_t.html | 95 +- functions_vars_u.html | 95 +- functions_vars_v.html | 95 +- functions_vars_w.html | 99 +- functions_vars_x.html | 95 +- functions_vars_y.html | 95 +- functions_w.html | 101 +- functions_x.html | 95 +- functions_y.html | 95 +- globals.html | 95 +- globals_a.html | 95 +- globals_b.html | 107 +- globals_c.html | 97 +- globals_d.html | 95 +- globals_defs.html | 93 +- globals_defs_a.html | 93 +- globals_defs_b.html | 99 +- globals_defs_c.html | 95 +- globals_defs_d.html | 93 +- globals_defs_e.html | 98 +- globals_defs_f.html | 93 +- globals_defs_g.html | 93 +- globals_defs_h.html | 93 +- globals_defs_i.html | 93 +- globals_defs_j.html | 93 +- globals_defs_k.html | 93 +- globals_defs_l.html | 93 +- globals_defs_m.html | 99 +- globals_defs_n.html | 93 +- globals_defs_o.html | 93 +- globals_defs_p.html | 100 +- globals_defs_r.html | 93 +- globals_defs_s.html | 95 +- globals_defs_t.html | 93 +- globals_defs_u.html | 96 +- globals_defs_v.html | 93 +- globals_defs_w.html | 93 +- globals_defs_x.html | 181 +- globals_e.html | 96 +- globals_enum.html | 63 +- globals_eval.html | 139 +- globals_f.html | 95 +- globals_func.html | 63 +- globals_g.html | 95 +- globals_h.html | 95 +- globals_i.html | 95 +- globals_j.html | 95 +- globals_k.html | 95 +- globals_l.html | 95 +- globals_m.html | 101 +- globals_n.html | 95 +- globals_o.html | 95 +- globals_p.html | 98 +- globals_r.html | 95 +- globals_s.html | 97 +- globals_t.html | 95 +- globals_type.html | 63 +- globals_u.html | 104 +- globals_v.html | 95 +- globals_vars.html | 74 +- globals_vars_r.html | 74 +- globals_vars_u.html | 74 +- globals_vars_w.html | 74 +- globals_vars_x.html | 74 +- globals_w.html | 95 +- globals_x.html | 185 +- globals_y.html | 101 +- globals_z.html | 95 +- graph_legend.html | 54 +- graph_legend.png | Bin 26211 -> 25694 bytes hexdump_8h.html | 58 +- hexdump_8h_source.html | 66 +- hidboot_8cpp.html | 52 +- hidboot_8cpp__incl.md5 | 2 +- hidboot_8cpp__incl.png | Bin 12269 -> 11683 bytes hidboot_8cpp_source.html | 68 +- hidboot_8h.html | 118 +- hidboot_8h__dep__incl.md5 | 2 +- hidboot_8h__dep__incl.png | Bin 10953 -> 10698 bytes hidboot_8h__incl.md5 | 2 +- hidboot_8h__incl.png | Bin 9725 -> 9144 bytes hidboot_8h_source.html | 179 +- hidcomposite_8cpp.html | 52 +- hidcomposite_8cpp__incl.md5 | 2 +- hidcomposite_8cpp__incl.png | Bin 12993 -> 12470 bytes hidcomposite_8cpp_source.html | 170 +- hidcomposite_8h.html | 52 +- hidcomposite_8h__dep__incl.md5 | 2 +- hidcomposite_8h__dep__incl.png | Bin 4508 -> 4512 bytes hidcomposite_8h__incl.md5 | 2 +- hidcomposite_8h__incl.png | Bin 10367 -> 9721 bytes hidcomposite_8h_source.html | 68 +- hidescriptorparser_8cpp.html | 52 +- hidescriptorparser_8cpp__incl.md5 | 2 +- hidescriptorparser_8cpp__incl.png | Bin 13707 -> 13054 bytes hidescriptorparser_8cpp_source.html | 70 +- hidescriptorparser_8h.html | 52 +- hidescriptorparser_8h__dep__incl.md5 | 2 +- hidescriptorparser_8h__dep__incl.png | Bin 5098 -> 5060 bytes hidescriptorparser_8h__incl.md5 | 2 +- hidescriptorparser_8h__incl.png | Bin 10637 -> 10037 bytes hidescriptorparser_8h_source.html | 72 +- hiduniversal_8cpp.html | 52 +- hiduniversal_8cpp__incl.md5 | 2 +- hiduniversal_8cpp__incl.png | Bin 12775 -> 12328 bytes hiduniversal_8cpp_source.html | 172 +- hiduniversal_8h.html | 52 +- hiduniversal_8h__dep__incl.md5 | 2 +- hiduniversal_8h__dep__incl.png | Bin 12245 -> 11879 bytes hiduniversal_8h__incl.md5 | 2 +- hiduniversal_8h__incl.png | Bin 10161 -> 9695 bytes hiduniversal_8h_source.html | 68 +- hidusagestr_8h.html | 5226 +++++++++++------ hidusagestr_8h__dep__incl.map | 20 +- hidusagestr_8h__dep__incl.md5 | 2 +- hidusagestr_8h__dep__incl.png | Bin 80318 -> 80536 bytes hidusagestr_8h__incl.md5 | 2 +- hidusagestr_8h__incl.png | Bin 3222 -> 3243 bytes hidusagestr_8h_source.html | 52 +- hidusagetitlearrays_8cpp.html | 58 +- hidusagetitlearrays_8cpp__incl.md5 | 2 +- hidusagetitlearrays_8cpp__incl.png | Bin 6822 -> 6866 bytes hidusagetitlearrays_8cpp_source.html | 52 +- hierarchy.html | 105 +- index.html | 83 +- inherit_graph_0.md5 | 2 +- inherit_graph_0.png | Bin 2355 -> 2369 bytes inherit_graph_1.md5 | 2 +- inherit_graph_1.png | Bin 11684 -> 11647 bytes inherit_graph_10.md5 | 2 +- inherit_graph_10.png | Bin 2091 -> 2098 bytes inherit_graph_11.md5 | 2 +- inherit_graph_11.png | Bin 2174 -> 2171 bytes inherit_graph_12.md5 | 2 +- inherit_graph_12.png | Bin 2614 -> 2629 bytes inherit_graph_13.md5 | 2 +- inherit_graph_13.png | Bin 5524 -> 5523 bytes inherit_graph_14.md5 | 2 +- inherit_graph_14.png | Bin 2781 -> 2791 bytes inherit_graph_15.md5 | 2 +- inherit_graph_15.png | Bin 1038 -> 1049 bytes inherit_graph_16.md5 | 2 +- inherit_graph_16.png | Bin 2073 -> 2084 bytes inherit_graph_17.md5 | 2 +- inherit_graph_17.png | Bin 12482 -> 12453 bytes inherit_graph_18.md5 | 2 +- inherit_graph_18.png | Bin 3670 -> 3671 bytes inherit_graph_19.md5 | 2 +- inherit_graph_19.png | Bin 1668 -> 1677 bytes inherit_graph_2.md5 | 2 +- inherit_graph_2.png | Bin 1721 -> 1727 bytes inherit_graph_20.md5 | 2 +- inherit_graph_20.png | Bin 11575 -> 11664 bytes inherit_graph_21.md5 | 2 +- inherit_graph_21.png | Bin 1970 -> 1987 bytes inherit_graph_22.md5 | 2 +- inherit_graph_22.png | Bin 1354 -> 1363 bytes inherit_graph_23.md5 | 2 +- inherit_graph_23.png | Bin 2143 -> 2149 bytes inherit_graph_24.md5 | 2 +- inherit_graph_24.png | Bin 1471 -> 1481 bytes inherit_graph_25.md5 | 2 +- inherit_graph_25.png | Bin 1373 -> 1384 bytes inherit_graph_26.md5 | 2 +- inherit_graph_26.png | Bin 1913 -> 1914 bytes inherit_graph_27.md5 | 2 +- inherit_graph_27.png | Bin 2236 -> 2233 bytes inherit_graph_28.md5 | 2 +- inherit_graph_28.png | Bin 3951 -> 3975 bytes inherit_graph_29.md5 | 2 +- inherit_graph_29.png | Bin 2306 -> 2312 bytes inherit_graph_3.md5 | 2 +- inherit_graph_3.png | Bin 1854 -> 1865 bytes inherit_graph_30.md5 | 2 +- inherit_graph_30.png | Bin 2069 -> 2074 bytes inherit_graph_31.md5 | 2 +- inherit_graph_31.png | Bin 1920 -> 1917 bytes inherit_graph_32.md5 | 2 +- inherit_graph_32.png | Bin 2311 -> 2317 bytes inherit_graph_33.md5 | 2 +- inherit_graph_33.png | Bin 1908 -> 1914 bytes inherit_graph_34.md5 | 2 +- inherit_graph_34.png | Bin 1721 -> 1729 bytes inherit_graph_35.md5 | 2 +- inherit_graph_35.png | Bin 1411 -> 1430 bytes inherit_graph_36.md5 | 2 +- inherit_graph_36.png | Bin 1710 -> 1717 bytes inherit_graph_37.md5 | 2 +- inherit_graph_37.png | Bin 1654 -> 1658 bytes inherit_graph_38.md5 | 2 +- inherit_graph_38.png | Bin 2197 -> 2208 bytes inherit_graph_39.md5 | 2 +- inherit_graph_39.png | Bin 1729 -> 1742 bytes inherit_graph_4.md5 | 2 +- inherit_graph_4.png | Bin 3258 -> 3265 bytes inherit_graph_40.md5 | 2 +- inherit_graph_40.png | Bin 2826 -> 2834 bytes inherit_graph_41.md5 | 2 +- inherit_graph_41.png | Bin 1534 -> 1538 bytes inherit_graph_42.md5 | 2 +- inherit_graph_42.png | Bin 3855 -> 3857 bytes inherit_graph_43.md5 | 2 +- inherit_graph_43.png | Bin 2870 -> 2883 bytes inherit_graph_44.md5 | 2 +- inherit_graph_44.png | Bin 1839 -> 1845 bytes inherit_graph_45.md5 | 2 +- inherit_graph_45.png | Bin 1703 -> 1697 bytes inherit_graph_46.md5 | 2 +- inherit_graph_46.png | Bin 3861 -> 3856 bytes inherit_graph_47.md5 | 2 +- inherit_graph_47.png | Bin 2828 -> 2830 bytes inherit_graph_48.md5 | 2 +- inherit_graph_48.png | Bin 3133 -> 3124 bytes inherit_graph_49.md5 | 2 +- inherit_graph_49.png | Bin 2644 -> 2649 bytes inherit_graph_5.md5 | 2 +- inherit_graph_5.png | Bin 1513 -> 1509 bytes inherit_graph_50.md5 | 2 +- inherit_graph_50.png | Bin 3090 -> 3107 bytes inherit_graph_51.md5 | 2 +- inherit_graph_51.png | Bin 1739 -> 1739 bytes inherit_graph_52.md5 | 2 +- inherit_graph_52.png | Bin 2455 -> 2461 bytes inherit_graph_53.map | 48 +- inherit_graph_53.md5 | 2 +- inherit_graph_53.png | Bin 112625 -> 113327 bytes inherit_graph_54.md5 | 2 +- inherit_graph_54.png | Bin 19421 -> 19524 bytes inherit_graph_6.md5 | 2 +- inherit_graph_6.png | Bin 1280 -> 1269 bytes inherit_graph_7.md5 | 2 +- inherit_graph_7.png | Bin 1264 -> 1262 bytes inherit_graph_8.md5 | 2 +- inherit_graph_8.png | Bin 1176 -> 1189 bytes inherit_graph_9.md5 | 2 +- inherit_graph_9.png | Bin 2092 -> 2104 bytes inherits.html | 102 +- jquery.js | 51 +- macros_8h.html | 220 +- macros_8h__dep__incl.png | Bin 3171 -> 3073 bytes macros_8h_source.html | 54 +- masstorage_8cpp.html | 52 +- masstorage_8cpp__incl.md5 | 2 +- masstorage_8cpp__incl.png | Bin 6173 -> 6201 bytes masstorage_8cpp_source.html | 402 +- masstorage_8h.html | 826 ++- masstorage_8h__dep__incl.md5 | 2 +- masstorage_8h__dep__incl.png | Bin 4657 -> 4627 bytes masstorage_8h__incl.md5 | 2 +- masstorage_8h__incl.png | Bin 3380 -> 3403 bytes masstorage_8h_source.html | 399 +- max3421e_8h.html | 952 +-- max3421e_8h_source.html | 54 +- max___l_c_d_8cpp.html | 110 +- max___l_c_d_8cpp__incl.md5 | 2 +- max___l_c_d_8cpp__incl.png | Bin 10100 -> 10077 bytes max___l_c_d_8cpp_source.html | 58 +- max___l_c_d_8h.html | 220 +- max___l_c_d_8h__dep__incl.md5 | 2 +- max___l_c_d_8h__dep__incl.png | Bin 3784 -> 3741 bytes max___l_c_d_8h__incl.md5 | 2 +- max___l_c_d_8h__incl.png | Bin 5130 -> 5105 bytes max___l_c_d_8h_source.html | 54 +- ...__host__shield_2_0__wii_camera_readme.html | 89 + menu.js | 50 + menudata.js | 196 + message_8cpp.html | 88 +- message_8cpp__incl.md5 | 2 +- message_8cpp__incl.png | Bin 3462 -> 3452 bytes message_8cpp_source.html | 80 +- message_8h.html | 166 +- message_8h_source.html | 78 +- pages.html | 48 +- parsetools_8cpp.html | 52 +- parsetools_8cpp__incl.md5 | 2 +- parsetools_8cpp__incl.png | Bin 3537 -> 3531 bytes parsetools_8cpp_source.html | 65 +- parsetools_8h.html | 58 +- parsetools_8h_source.html | 88 +- printhex_8h.html | 94 +- printhex_8h_source.html | 70 +- search/all_0.html | 6 +- search/all_1.html | 6 +- search/all_10.html | 6 +- search/all_10.js | 7 +- search/all_11.html | 6 +- search/all_11.js | 2 +- search/all_12.html | 6 +- search/all_12.js | 13 +- search/all_13.html | 6 +- search/all_13.js | 12 +- search/all_14.html | 6 +- search/all_15.html | 6 +- search/all_15.js | 3 +- search/all_16.html | 6 +- search/all_16.js | 2 +- search/all_17.html | 6 +- search/all_17.js | 6 +- search/all_18.html | 6 +- search/all_18.js | 38 +- search/all_19.html | 6 +- search/all_19.js | 2 +- search/all_1a.html | 6 +- search/all_2.html | 6 +- search/all_2.js | 7 +- search/all_3.html | 6 +- search/all_3.js | 4 +- search/all_4.html | 6 +- search/all_5.html | 6 +- search/all_5.js | 9 +- search/all_6.html | 6 +- search/all_7.html | 6 +- search/all_8.html | 6 +- search/all_9.html | 6 +- search/all_9.js | 6 +- search/all_a.html | 6 +- search/all_b.html | 6 +- search/all_c.html | 6 +- search/all_c.js | 1 + search/all_d.html | 6 +- search/all_d.js | 2 + search/all_e.html | 6 +- search/all_f.html | 6 +- search/all_f.js | 2 +- search/classes_0.html | 6 +- search/classes_1.html | 6 +- search/classes_10.html | 6 +- search/classes_2.html | 6 +- search/classes_3.html | 6 +- search/classes_4.html | 6 +- search/classes_5.html | 6 +- search/classes_6.html | 6 +- search/classes_7.html | 6 +- search/classes_8.html | 6 +- search/classes_9.html | 6 +- search/classes_a.html | 6 +- search/classes_b.html | 6 +- search/classes_c.html | 6 +- search/classes_d.html | 6 +- search/classes_e.html | 6 +- search/classes_f.html | 6 +- search/defines_0.html | 6 +- search/defines_1.html | 6 +- search/defines_10.html | 6 +- search/defines_10.js | 1 + search/defines_11.html | 6 +- search/defines_12.html | 6 +- search/defines_12.js | 2 +- search/defines_13.html | 6 +- search/defines_14.html | 6 +- search/defines_14.js | 1 + search/defines_15.html | 6 +- search/defines_16.html | 6 +- search/defines_17.html | 6 +- search/defines_17.js | 38 +- search/defines_2.html | 6 +- search/defines_2.js | 2 + search/defines_3.html | 6 +- search/defines_3.js | 2 +- search/defines_4.html | 6 +- search/defines_5.html | 6 +- search/defines_5.js | 2 +- search/defines_6.html | 6 +- search/defines_7.html | 6 +- search/defines_8.html | 6 +- search/defines_9.html | 6 +- search/defines_a.html | 6 +- search/defines_b.html | 6 +- search/defines_c.html | 6 +- search/defines_d.html | 6 +- search/defines_d.js | 2 + search/defines_e.html | 6 +- search/defines_f.html | 6 +- search/enums_0.html | 6 +- search/enums_1.html | 6 +- search/enums_2.html | 6 +- search/enums_3.html | 6 +- search/enums_4.html | 6 +- search/enums_5.html | 6 +- search/enums_6.html | 6 +- search/enums_7.html | 6 +- search/enums_8.html | 6 +- search/enums_9.html | 6 +- search/enums_a.html | 6 +- search/enumvalues_0.html | 6 +- search/enumvalues_1.html | 6 +- search/enumvalues_10.html | 6 +- search/enumvalues_11.html | 6 +- search/enumvalues_12.html | 6 +- search/enumvalues_13.html | 6 +- search/enumvalues_14.html | 6 +- search/enumvalues_15.html | 6 +- search/enumvalues_15.js | 2 +- search/enumvalues_16.html | 6 +- search/enumvalues_2.html | 6 +- search/enumvalues_3.html | 6 +- search/enumvalues_4.html | 6 +- search/enumvalues_5.html | 6 +- search/enumvalues_6.html | 6 +- search/enumvalues_7.html | 6 +- search/enumvalues_8.html | 6 +- search/enumvalues_9.html | 6 +- search/enumvalues_a.html | 6 +- search/enumvalues_b.html | 6 +- search/enumvalues_c.html | 6 +- search/enumvalues_d.html | 6 +- search/enumvalues_e.html | 6 +- search/enumvalues_f.html | 6 +- search/files_0.html | 6 +- search/files_1.html | 6 +- search/files_2.html | 6 +- search/files_3.html | 6 +- search/files_4.html | 6 +- search/files_5.html | 6 +- search/files_6.html | 6 +- search/files_7.html | 6 +- search/files_8.html | 6 +- search/files_9.html | 6 +- search/files_a.html | 6 +- search/files_b.html | 6 +- search/functions_0.html | 6 +- search/functions_1.html | 6 +- search/functions_10.html | 6 +- search/functions_10.js | 10 +- search/functions_11.html | 6 +- search/functions_12.html | 6 +- search/functions_13.html | 6 +- search/functions_14.html | 6 +- search/functions_14.js | 2 +- search/functions_15.html | 6 +- search/functions_2.html | 6 +- search/functions_2.js | 2 +- search/functions_3.html | 6 +- search/functions_4.html | 6 +- search/functions_4.js | 5 +- search/functions_5.html | 6 +- search/functions_6.html | 6 +- search/functions_7.html | 6 +- search/functions_8.html | 6 +- search/functions_8.js | 4 +- search/functions_9.html | 6 +- search/functions_a.html | 6 +- search/functions_a.js | 1 + search/functions_b.html | 6 +- search/functions_c.html | 6 +- search/functions_d.html | 6 +- search/functions_d.js | 2 +- search/functions_e.html | 6 +- search/functions_e.js | 4 +- search/functions_f.html | 6 +- search/functions_f.js | 9 +- search/pages_0.html | 6 +- search/pages_1.html | 6 +- search/pages_1.js | 2 +- search/search.css | 12 +- search/search.js | 25 +- search/typedefs_0.html | 6 +- search/typedefs_1.html | 6 +- search/typedefs_2.html | 6 +- search/typedefs_3.html | 6 +- search/typedefs_4.html | 6 +- search/typedefs_5.html | 6 +- search/typedefs_6.html | 6 +- search/variables_0.html | 6 +- search/variables_1.html | 6 +- search/variables_10.html | 6 +- search/variables_10.js | 2 +- search/variables_11.html | 6 +- search/variables_11.js | 4 +- search/variables_12.html | 6 +- search/variables_13.html | 6 +- search/variables_14.html | 6 +- search/variables_15.html | 6 +- search/variables_15.js | 2 +- search/variables_16.html | 6 +- search/variables_16.js | 2 +- search/variables_17.html | 6 +- search/variables_18.html | 6 +- search/variables_2.html | 6 +- search/variables_2.js | 5 +- search/variables_3.html | 6 +- search/variables_4.html | 6 +- search/variables_5.html | 6 +- search/variables_5.js | 2 +- search/variables_6.html | 6 +- search/variables_7.html | 6 +- search/variables_8.html | 6 +- search/variables_9.html | 6 +- search/variables_a.html | 6 +- search/variables_b.html | 6 +- search/variables_c.html | 6 +- search/variables_d.html | 6 +- search/variables_e.html | 6 +- search/variables_f.html | 6 +- search/variables_f.js | 2 +- settings_8h.html | 160 +- settings_8h__incl.md5 | 2 +- settings_8h__incl.png | Bin 11572 -> 11318 bytes settings_8h_source.html | 54 +- sink__parser_8h.html | 58 +- sink__parser_8h_source.html | 62 +- ...t_a_c_m___f_u_n_c___d_e_s_c_r-members.html | 54 +- struct_a_c_m___f_u_n_c___d_e_s_c_r.html | 80 +- struct_b_a_s_i_c_c_d_b-members.html | 54 +- struct_b_a_s_i_c_c_d_b.html | 80 +- ...g_m_n_t___f_u_n_c___d_e_s_c_r-members.html | 54 +- ...l_l___m_g_m_n_t___f_u_n_c___d_e_s_c_r.html | 86 +- struct_c_d_b10-members.html | 54 +- struct_c_d_b10.html | 134 +- struct_c_d_b12-members.html | 54 +- struct_c_d_b12.html | 116 +- struct_c_d_b6-members.html | 54 +- struct_c_d_b6.html | 110 +- struct_c_d_b___l_b_a32__16-members.html | 54 +- struct_c_d_b___l_b_a32__16.html | 158 +- struct_c_d_b___l_b_a64__16-members.html | 54 +- struct_c_d_b___l_b_a64__16.html | 152 +- ...s_s___n_o_t_i_f_i_c_a_t_i_o_n-members.html | 54 +- ...t_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n.html | 92 +- struct_capacity-members.html | 54 +- struct_capacity.html | 62 +- struct_command_block_wrapper-members.html | 54 +- struct_command_block_wrapper.html | 118 +- struct_command_block_wrapper__coll__graph.md5 | 2 +- struct_command_block_wrapper__coll__graph.png | Bin 6739 -> 6780 bytes ..._command_block_wrapper__inherit__graph.md5 | 2 +- ..._command_block_wrapper__inherit__graph.png | Bin 6739 -> 6780 bytes ...ct_command_block_wrapper_base-members.html | 54 +- struct_command_block_wrapper_base.html | 92 +- ...and_block_wrapper_base__inherit__graph.md5 | 2 +- ...and_block_wrapper_base__inherit__graph.png | Bin 6696 -> 6684 bytes struct_command_status_wrapper-members.html | 54 +- struct_command_status_wrapper.html | 80 +- struct_ep_info-members.html | 54 +- struct_ep_info.html | 96 +- ...o_r___l_e_n___a_n_d___t_y_p_e-members.html | 54 +- ...r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e.html | 68 +- struct_hid_item_prefix-members.html | 54 +- struct_hid_item_prefix.html | 74 +- struct_hub_descriptor-members.html | 54 +- struct_hub_descriptor.html | 126 +- struct_hub_event-members.html | 54 +- struct_hub_event.html | 84 +- struct_inquiry_response-members.html | 54 +- struct_inquiry_response.html | 272 +- struct_k_b_d_i_n_f_o-members.html | 54 +- struct_k_b_d_i_n_f_o.html | 120 +- struct_k_b_d_l_e_d_s-members.html | 54 +- struct_k_b_d_l_e_d_s.html | 92 +- struct_l_i_n_e___c_o_d_i_n_g-members.html | 54 +- struct_l_i_n_e___c_o_d_i_n_g.html | 80 +- struct_m_o_d_i_f_i_e_r_k_e_y_s-members.html | 54 +- struct_m_o_d_i_f_i_e_r_k_e_y_s.html | 104 +- struct_m_o_u_s_e_i_n_f_o-members.html | 54 +- struct_m_o_u_s_e_i_n_f_o.html | 96 +- struct_main_item_i_o_feature-members.html | 54 +- struct_main_item_i_o_feature.html | 104 +- struct_multi_value_buffer-members.html | 54 +- struct_multi_value_buffer.html | 68 +- struct_p_s4_data-members.html | 54 +- struct_p_s4_data.html | 140 +- struct_p_s4_data__coll__graph.png | Bin 10084 -> 10290 bytes struct_p_s4_output-members.html | 54 +- struct_p_s4_output.html | 104 +- struct_p_s4_status-members.html | 54 +- struct_p_s4_status.html | 86 +- struct_request_sense_responce-members.html | 54 +- struct_request_sense_responce.html | 140 +- struct_s_e_t_u_p___p_k_t-members.html | 54 +- struct_s_e_t_u_p___p_k_t.html | 124 +- ...n_g_e_r___f_u_n_c___d_e_s_c_r-members.html | 54 +- ...l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r.html | 86 +- ...t_i_o_n___d_e_s_c_r_i_p_t_o_r-members.html | 54 +- ...g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r.html | 104 +- ...v_i_c_e___d_e_s_c_r_i_p_t_o_r-members.html | 54 +- ...b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html | 140 +- ...o_i_n_t___d_e_s_c_r_i_p_t_o_r-members.html | 54 +- ...e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r.html | 92 +- ...__h_i_d___d_e_s_c_r_i_p_t_o_r-members.html | 54 +- ...t_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html | 98 +- ...f_a_c_e___d_e_s_c_r_i_p_t_o_r-members.html | 54 +- ...n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r.html | 110 +- struct_usb_device-members.html | 54 +- struct_usb_device.html | 80 +- struct_usb_device__coll__graph.png | Bin 8549 -> 8545 bytes struct_usb_device_address-members.html | 54 +- struct_usb_device_address.html | 90 +- structtouchpad_x_y-members.html | 54 +- structtouchpad_x_y.html | 90 +- structtty__features-members.html | 54 +- structtty__features.html | 102 +- tabs.css | 61 +- union_p_s4_buttons-members.html | 54 +- union_p_s4_buttons.html | 162 +- union_p_s_b_u_z_z_buttons-members.html | 54 +- union_p_s_b_u_z_z_buttons.html | 96 +- usb__ch9_8h.html | 340 +- usb__ch9_8h_source.html | 156 +- usbh__midi_8cpp.html | 52 +- usbh__midi_8cpp__incl.md5 | 2 +- usbh__midi_8cpp__incl.png | Bin 5264 -> 5279 bytes usbh__midi_8cpp_source.html | 192 +- usbh__midi_8h.html | 94 +- usbh__midi_8h__dep__incl.md5 | 2 +- usbh__midi_8h__dep__incl.png | Bin 3798 -> 3725 bytes usbh__midi_8h__incl.md5 | 2 +- usbh__midi_8h__incl.png | Bin 2905 -> 2953 bytes usbh__midi_8h_source.html | 120 +- usbhid_8cpp.html | 52 +- usbhid_8cpp__incl.md5 | 2 +- usbhid_8cpp__incl.png | Bin 9932 -> 9436 bytes usbhid_8cpp_source.html | 92 +- usbhid_8h.html | 482 +- usbhid_8h__dep__incl.map | 16 +- usbhid_8h__dep__incl.md5 | 2 +- usbhid_8h__dep__incl.png | Bin 71198 -> 71707 bytes usbhid_8h__incl.md5 | 2 +- usbhid_8h__incl.png | Bin 7801 -> 7330 bytes usbhid_8h_source.html | 91 +- usbhost_8h.html | 64 +- usbhost_8h_source.html | 168 +- usbhub_8cpp.html | 58 +- usbhub_8cpp__incl.md5 | 2 +- usbhub_8cpp__incl.png | Bin 4450 -> 4430 bytes usbhub_8cpp_source.html | 136 +- usbhub_8h.html | 524 +- usbhub_8h__dep__incl.md5 | 2 +- usbhub_8h__dep__incl.png | Bin 3302 -> 3269 bytes usbhub_8h__incl.md5 | 2 +- usbhub_8h__incl.png | Bin 2556 -> 2662 bytes usbhub_8h_source.html | 76 +- version__helper_8h.html | 354 +- version__helper_8h__dep__incl.md5 | 2 +- version__helper_8h__dep__incl.png | Bin 3860 -> 3894 bytes version__helper_8h__incl.md5 | 2 +- version__helper_8h__incl.png | Bin 6395 -> 6391 bytes version__helper_8h_source.html | 54 +- xbox_enums_8h.html | 84 +- xbox_enums_8h__dep__incl.map | 2 +- xbox_enums_8h__dep__incl.md5 | 2 +- xbox_enums_8h__dep__incl.png | Bin 16125 -> 14756 bytes xbox_enums_8h__incl.md5 | 2 +- xbox_enums_8h__incl.png | Bin 4351 -> 4372 bytes xbox_enums_8h_source.html | 52 +- 1209 files changed, 27866 insertions(+), 33941 deletions(-) create mode 100644 md___users_lauszus__github__u_s_b__host__shield_2_0__wii_camera_readme.html create mode 100644 menu.js create mode 100644 menudata.js diff --git a/_b_t_d_8cpp.html b/_b_t_d_8cpp.html index a24b5dcf..56d722da 100644 --- a/_b_t_d_8cpp.html +++ b/_b_t_d_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: BTD.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
diff --git a/_b_t_d_8cpp__incl.md5 b/_b_t_d_8cpp__incl.md5 index a355a3b6..34060dfc 100644 --- a/_b_t_d_8cpp__incl.md5 +++ b/_b_t_d_8cpp__incl.md5 @@ -1 +1 @@ -958bad8ed4b3f7ba0b3843a14e09d10f \ No newline at end of file +7f7897af29f53461811904a15cf045bb \ No newline at end of file diff --git a/_b_t_d_8cpp__incl.png b/_b_t_d_8cpp__incl.png index 1f71fe541211e1fedfac05b2814fae7913a6df83..ef48eb7804e00d8f90627a41a4a5ef963bc2f6da 100644 GIT binary patch literal 13934 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 ouT23C{~QJ-`(fa`3dI} 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 diff --git a/_b_t_d_8cpp_source.html b/_b_t_d_8cpp_source.html index 7ff3bc1b..a55c604d 100644 --- a/_b_t_d_8cpp_source.html +++ b/_b_t_d_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: BTD.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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, uint8_t port, 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) {
230  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
231  } else {
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  watingForConnection = 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, uint8_t alt, uint8_t proto, 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 & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80) { // Interrupt In endpoint found
339  index = BTD_EVENT_PIPE;
341  } else {
342  if((pep->bmAttributes & 0x02) == 2) // Bulk endpoint found
343  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? BTD_DATAIN_PIPE : BTD_DATAOUT_PIPE;
344  else
345  return;
346  }
347 
348  // Fill the rest of endpoint data structure
349  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
350  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
351 #ifdef EXTRADEBUG
353 #endif
354  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
355  pollInterval = pep->bInterval;
356  bNumEP++;
357 }
358 
360 #ifdef EXTRADEBUG
361  Notify(PSTR("\r\nEndpoint descriptor:"), 0x80);
362  Notify(PSTR("\r\nLength:\t\t"), 0x80);
363  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
364  Notify(PSTR("\r\nType:\t\t"), 0x80);
365  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
366  Notify(PSTR("\r\nAddress:\t"), 0x80);
367  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
368  Notify(PSTR("\r\nAttributes:\t"), 0x80);
369  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
370  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
371  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
372  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
373  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
374 #endif
375 }
376 
377 /* Performs a cleanup after failed Init() attempt */
378 uint8_t BTD::Release() {
379  Initialize(); // Set all variables, endpoint structs etc. to default values
381  return 0;
382 }
383 
384 uint8_t BTD::Poll() {
385  if(!bPollEnable)
386  return 0;
387  if((long)(millis() - qNextPollTime) >= 0L) { // Don't poll if shorter than polling interval
388  qNextPollTime = millis() + pollInterval; // Set new poll time
389  HCI_event_task(); // Poll the HCI event pipe
390  HCI_task(); // HCI state machine
391  ACL_event_task(); // Poll the ACL input pipe too
392  }
393  return 0;
394 }
395 
397  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
398  if(btService[i])
399  btService[i]->disconnect();
400 };
401 
402 void BTD::HCI_event_task() {
403  uint16_t length = BULK_MAXPKTSIZE; // Request more than 16 bytes anyway, the inTransfer routine will take care of this
404  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_EVENT_PIPE ].epAddr, &length, hcibuf, pollInterval); // Input on endpoint 1
405 
406  if(!rcode || rcode == hrNAK) { // Check for errors
407  switch(hcibuf[0]) { // Switch on event type
408  case EV_COMMAND_COMPLETE:
409  if(!hcibuf[5]) { // Check if command succeeded
410  hci_set_flag(HCI_FLAG_CMD_COMPLETE); // Set command complete flag
411  if((hcibuf[3] == 0x01) && (hcibuf[4] == 0x10)) { // Parameters from read local version information
412  hci_version = hcibuf[6]; // Used to check if it supports 2.0+EDR - see http://www.bluetooth.org/Technical/AssignedNumbers/hci.htm
414  } else if((hcibuf[3] == 0x09) && (hcibuf[4] == 0x10)) { // Parameters from read local bluetooth address
415  for(uint8_t i = 0; i < 6; i++)
416  my_bdaddr[i] = hcibuf[6 + i];
418  }
419  }
420  break;
421 
422  case EV_COMMAND_STATUS:
423  if(hcibuf[2]) { // Show status on serial if not OK
424 #ifdef DEBUG_USB_HOST
425  Notify(PSTR("\r\nHCI Command Failed: "), 0x80);
426  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
427 #endif
428  }
429  break;
430 
431  case EV_INQUIRY_COMPLETE:
432  if(inquiry_counter >= 5 && (pairWithWii || pairWithHIDDevice)) {
433  inquiry_counter = 0;
434 #ifdef DEBUG_USB_HOST
435  if(pairWithWii)
436  Notify(PSTR("\r\nCouldn't find Wiimote"), 0x80);
437  else
438  Notify(PSTR("\r\nCouldn't find HID device"), 0x80);
439 #endif
440  connectToWii = false;
441  pairWithWii = false;
442  connectToHIDDevice = false;
443  pairWithHIDDevice = false;
444  hci_state = HCI_SCANNING_STATE;
445  }
446  inquiry_counter++;
447  break;
448 
449  case EV_INQUIRY_RESULT:
450  if(hcibuf[2]) { // Check that there is more than zero responses
451 #ifdef EXTRADEBUG
452  Notify(PSTR("\r\nNumber of responses: "), 0x80);
453  Notify(hcibuf[2], 0x80);
454 #endif
455  for(uint8_t i = 0; i < hcibuf[2]; i++) {
456  uint8_t offset = 8 * hcibuf[2] + 3 * i;
457 
458  for(uint8_t j = 0; j < 3; j++)
459  classOfDevice[j] = hcibuf[j + 4 + offset];
460 
461 #ifdef EXTRADEBUG
462  Notify(PSTR("\r\nClass of device: "), 0x80);
463  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
464  Notify(PSTR(" "), 0x80);
465  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
466  Notify(PSTR(" "), 0x80);
467  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
468 #endif
469 
470  if(pairWithWii && classOfDevice[2] == 0x00 && (classOfDevice[1] & 0x05) && (classOfDevice[0] & 0x0C)) { // See http://wiibrew.org/wiki/Wiimote#SDP_information
471  checkRemoteName = true; // Check remote name to distinguish between the different controllers
472 
473  for(uint8_t j = 0; j < 6; j++)
474  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
475 
477  break;
478  } 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
479 #ifdef DEBUG_USB_HOST
480  if(classOfDevice[0] & 0x80)
481  Notify(PSTR("\r\nMouse found"), 0x80);
482  if(classOfDevice[0] & 0x40)
483  Notify(PSTR("\r\nKeyboard found"), 0x80);
484  if(classOfDevice[0] & 0x08)
485  Notify(PSTR("\r\nGamepad found"), 0x80);
486 #endif
487 
488  for(uint8_t j = 0; j < 6; j++)
489  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
490 
492  break;
493  }
494  }
495  }
496  break;
497 
498  case EV_CONNECT_COMPLETE:
500  if(!hcibuf[2]) { // Check if connected OK
501 #ifdef EXTRADEBUG
502  Notify(PSTR("\r\nConnection established"), 0x80);
503 #endif
504  hci_handle = hcibuf[3] | ((hcibuf[4] & 0x0F) << 8); // Store the handle for the ACL connection
505  hci_set_flag(HCI_FLAG_CONNECT_COMPLETE); // Set connection complete flag
506  } else {
507  hci_state = HCI_CHECK_DEVICE_SERVICE;
508 #ifdef DEBUG_USB_HOST
509  Notify(PSTR("\r\nConnection Failed: "), 0x80);
510  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
511 #endif
512  }
513  break;
514 
516  if(!hcibuf[2]) { // Check if disconnected OK
517  hci_set_flag(HCI_FLAG_DISCONNECT_COMPLETE); // Set disconnect command complete flag
518  hci_clear_flag(HCI_FLAG_CONNECT_COMPLETE); // Clear connection complete flag
519  }
520  break;
521 
523  if(!hcibuf[2]) { // Check if reading is OK
524  for(uint8_t i = 0; i < min(sizeof (remote_name), sizeof (hcibuf) - 9); i++) {
525  remote_name[i] = hcibuf[9 + i];
526  if(remote_name[i] == '\0') // End of string
527  break;
528  }
529  // TODO: Altid sæt '\0' i remote name!
531  }
532  break;
533 
534  case EV_INCOMING_CONNECT:
535  for(uint8_t i = 0; i < 6; i++)
536  disc_bdaddr[i] = hcibuf[i + 2];
537 
538  for(uint8_t i = 0; i < 3; i++)
539  classOfDevice[i] = hcibuf[i + 8];
540 
541  if((classOfDevice[1] & 0x05) && (classOfDevice[0] & 0xC8)) { // Check if it is a mouse, keyboard or a gamepad
542 #ifdef DEBUG_USB_HOST
543  if(classOfDevice[0] & 0x80)
544  Notify(PSTR("\r\nMouse is connecting"), 0x80);
545  if(classOfDevice[0] & 0x40)
546  Notify(PSTR("\r\nKeyboard is connecting"), 0x80);
547  if(classOfDevice[0] & 0x08)
548  Notify(PSTR("\r\nGamepad is connecting"), 0x80);
549 #endif
550  incomingHIDDevice = true;
551  }
552 
553 #ifdef EXTRADEBUG
554  Notify(PSTR("\r\nClass of device: "), 0x80);
555  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
556  Notify(PSTR(" "), 0x80);
557  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
558  Notify(PSTR(" "), 0x80);
559  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
560 #endif
562  break;
563 
564  case EV_PIN_CODE_REQUEST:
565  if(pairWithWii) {
566 #ifdef DEBUG_USB_HOST
567  Notify(PSTR("\r\nPairing with Wiimote"), 0x80);
568 #endif
570  } else if(btdPin != NULL) {
571 #ifdef DEBUG_USB_HOST
572  Notify(PSTR("\r\nBluetooth pin is set too: "), 0x80);
573  NotifyStr(btdPin, 0x80);
574 #endif
576  } else {
577 #ifdef DEBUG_USB_HOST
578  Notify(PSTR("\r\nNo pin was set"), 0x80);
579 #endif
581  }
582  break;
583 
584  case EV_LINK_KEY_REQUEST:
585 #ifdef DEBUG_USB_HOST
586  Notify(PSTR("\r\nReceived Key Request"), 0x80);
587 #endif
589  break;
590 
592  if(!hcibuf[2]) { // Check if pairing was successful
593  if(pairWithWii && !connectToWii) {
594 #ifdef DEBUG_USB_HOST
595  Notify(PSTR("\r\nPairing successful with Wiimote"), 0x80);
596 #endif
597  connectToWii = true; // Used to indicate to the Wii service, that it should connect to this device
598  } else if(pairWithHIDDevice && !connectToHIDDevice) {
599 #ifdef DEBUG_USB_HOST
600  Notify(PSTR("\r\nPairing successful with HID device"), 0x80);
601 #endif
602  connectToHIDDevice = true; // Used to indicate to the BTHID service, that it should connect to this device
603  }
604  } else {
605 #ifdef DEBUG_USB_HOST
606  Notify(PSTR("\r\nPairing Failed: "), 0x80);
607  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
608 #endif
610  hci_state = HCI_DISCONNECT_STATE;
611  }
612  break;
613  /* We will just ignore the following events */
614  case EV_NUM_COMPLETE_PKT:
615  case EV_ROLE_CHANGED:
617  case EV_LOOPBACK_COMMAND:
620  case EV_MAX_SLOTS_CHANGE:
625  break;
626 #ifdef EXTRADEBUG
627  default:
628  if(hcibuf[0] != 0x00) {
629  Notify(PSTR("\r\nUnmanaged HCI Event: "), 0x80);
630  D_PrintHex<uint8_t > (hcibuf[0], 0x80);
631  }
632  break;
633 #endif
634  } // Switch
635  }
636 #ifdef EXTRADEBUG
637  else {
638  Notify(PSTR("\r\nHCI event error: "), 0x80);
639  D_PrintHex<uint8_t > (rcode, 0x80);
640  }
641 #endif
642 }
643 
644 /* Poll Bluetooth and print result */
645 void BTD::HCI_task() {
646  switch(hci_state) {
647  case HCI_INIT_STATE:
648  hci_counter++;
649  if(hci_counter > hci_num_reset_loops) { // wait until we have looped x times to clear any old events
650  hci_reset();
651  hci_state = HCI_RESET_STATE;
652  hci_counter = 0;
653  }
654  break;
655 
656  case HCI_RESET_STATE:
657  hci_counter++;
659  hci_counter = 0;
660 #ifdef DEBUG_USB_HOST
661  Notify(PSTR("\r\nHCI Reset complete"), 0x80);
662 #endif
663  hci_state = HCI_CLASS_STATE;
665  } else if(hci_counter > hci_num_reset_loops) {
666  hci_num_reset_loops *= 10;
667  if(hci_num_reset_loops > 2000)
668  hci_num_reset_loops = 2000;
669 #ifdef DEBUG_USB_HOST
670  Notify(PSTR("\r\nNo response to HCI Reset"), 0x80);
671 #endif
672  hci_state = HCI_INIT_STATE;
673  hci_counter = 0;
674  }
675  break;
676 
677  case HCI_CLASS_STATE:
679 #ifdef DEBUG_USB_HOST
680  Notify(PSTR("\r\nWrite class of device"), 0x80);
681 #endif
682  hci_state = HCI_BDADDR_STATE;
683  hci_read_bdaddr();
684  }
685  break;
686 
687  case HCI_BDADDR_STATE:
689 #ifdef DEBUG_USB_HOST
690  Notify(PSTR("\r\nLocal Bluetooth Address: "), 0x80);
691  for(int8_t i = 5; i > 0; i--) {
692  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
693  Notify(PSTR(":"), 0x80);
694  }
695  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
696 #endif
698  hci_state = HCI_LOCAL_VERSION_STATE;
699  }
700  break;
701 
702  case HCI_LOCAL_VERSION_STATE: // The local version is used by the PS3BT class
704  if(btdName != NULL) {
706  hci_state = HCI_SET_NAME_STATE;
707  } else
708  hci_state = HCI_CHECK_DEVICE_SERVICE;
709  }
710  break;
711 
712  case HCI_SET_NAME_STATE:
714 #ifdef DEBUG_USB_HOST
715  Notify(PSTR("\r\nThe name is set to: "), 0x80);
716  NotifyStr(btdName, 0x80);
717 #endif
718  hci_state = HCI_CHECK_DEVICE_SERVICE;
719  }
720  break;
721 
723  if(pairWithHIDDevice || pairWithWii) { // Check if it should try to connect to a Wiimote
724 #ifdef DEBUG_USB_HOST
725  if(pairWithWii)
726  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);
727  else
728  Notify(PSTR("\r\nPlease enable discovery of your device"), 0x80);
729 #endif
730  hci_inquiry();
731  hci_state = HCI_INQUIRY_STATE;
732  } else
733  hci_state = HCI_SCANNING_STATE; // Don't try to connect to a Wiimote
734  break;
735 
736  case HCI_INQUIRY_STATE:
738  hci_inquiry_cancel(); // Stop inquiry
739 #ifdef DEBUG_USB_HOST
740  if(pairWithWii)
741  Notify(PSTR("\r\nWiimote found"), 0x80);
742  else
743  Notify(PSTR("\r\nHID device found"), 0x80);
744 
745  Notify(PSTR("\r\nNow just create the instance like so:"), 0x80);
746  if(pairWithWii)
747  Notify(PSTR("\r\nWII Wii(&Btd);"), 0x80);
748  else
749  Notify(PSTR("\r\nBTHID bthid(&Btd);"), 0x80);
750 
751  Notify(PSTR("\r\nAnd then press any button on the "), 0x80);
752  if(pairWithWii)
753  Notify(PSTR("Wiimote"), 0x80);
754  else
755  Notify(PSTR("device"), 0x80);
756 #endif
757  if(checkRemoteName) {
758  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
759  hci_state = HCI_REMOTE_NAME_STATE;
760  } else
761  hci_state = HCI_CONNECT_DEVICE_STATE;
762  }
763  break;
764 
767 #ifdef DEBUG_USB_HOST
768  if(pairWithWii)
769  Notify(PSTR("\r\nConnecting to Wiimote"), 0x80);
770  else
771  Notify(PSTR("\r\nConnecting to HID device"), 0x80);
772 #endif
773  checkRemoteName = false;
774  hci_connect();
775  hci_state = HCI_CONNECTED_DEVICE_STATE;
776  }
777  break;
778 
782 #ifdef DEBUG_USB_HOST
783  if(pairWithWii)
784  Notify(PSTR("\r\nConnected to Wiimote"), 0x80);
785  else
786  Notify(PSTR("\r\nConnected to HID device"), 0x80);
787 #endif
788  hci_authentication_request(); // This will start the pairing with the Wiimote
789  hci_state = HCI_SCANNING_STATE;
790  } else {
791 #ifdef DEBUG_USB_HOST
792  Notify(PSTR("\r\nTrying to connect one more time..."), 0x80);
793 #endif
794  hci_connect(); // Try to connect one more time
795  }
796  }
797  break;
798 
799  case HCI_SCANNING_STATE:
801 #ifdef DEBUG_USB_HOST
802  Notify(PSTR("\r\nWait For Incoming Connection Request"), 0x80);
803 #endif
805  watingForConnection = true;
806  hci_state = HCI_CONNECT_IN_STATE;
807  }
808  break;
809 
812  watingForConnection = false;
813 #ifdef DEBUG_USB_HOST
814  Notify(PSTR("\r\nIncoming Connection Request"), 0x80);
815 #endif
816  hci_remote_name();
817  hci_state = HCI_REMOTE_NAME_STATE;
819  hci_state = HCI_DISCONNECT_STATE;
820  break;
821 
824 #ifdef DEBUG_USB_HOST
825  Notify(PSTR("\r\nRemote Name: "), 0x80);
826  for(uint8_t i = 0; i < strlen(remote_name); i++)
827  Notifyc(remote_name[i], 0x80);
828 #endif
829  if(strncmp((const char*)remote_name, "Nintendo", 8) == 0) {
830  incomingWii = true;
831  motionPlusInside = false;
832  wiiUProController = false;
833  pairWiiUsingSync = false;
834 #ifdef DEBUG_USB_HOST
835  Notify(PSTR("\r\nWiimote is connecting"), 0x80);
836 #endif
837  if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-TR", 22) == 0) {
838 #ifdef DEBUG_USB_HOST
839  Notify(PSTR(" with Motion Plus Inside"), 0x80);
840 #endif
841  motionPlusInside = true;
842  } else if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-UC", 22) == 0) {
843 #ifdef DEBUG_USB_HOST
844  Notify(PSTR(" - Wii U Pro Controller"), 0x80);
845 #endif
846  wiiUProController = motionPlusInside = pairWiiUsingSync = true;
847  } else if(strncmp((const char*)remote_name, "Nintendo RVL-WBC-01", 19) == 0) {
848 #ifdef DEBUG_USB_HOST
849  Notify(PSTR(" - Wii Balance Board"), 0x80);
850 #endif
851  pairWiiUsingSync = true;
852  }
853  }
854  if(classOfDevice[2] == 0 && classOfDevice[1] == 0x25 && classOfDevice[0] == 0x08 && strncmp((const char*)remote_name, "Wireless Controller", 19) == 0) {
855 #ifdef DEBUG_USB_HOST
856  Notify(PSTR("\r\nPS4 controller is connecting"), 0x80);
857 #endif
858  incomingPS4 = true;
859  }
860  if(pairWithWii && checkRemoteName)
861  hci_state = HCI_CONNECT_DEVICE_STATE;
862  else {
864  hci_state = HCI_CONNECTED_STATE;
865  }
866  }
867  break;
868 
869  case HCI_CONNECTED_STATE:
871 #ifdef DEBUG_USB_HOST
872  Notify(PSTR("\r\nConnected to Device: "), 0x80);
873  for(int8_t i = 5; i > 0; i--) {
874  D_PrintHex<uint8_t > (disc_bdaddr[i], 0x80);
875  Notify(PSTR(":"), 0x80);
876  }
877  D_PrintHex<uint8_t > (disc_bdaddr[0], 0x80);
878 #endif
879  if(incomingPS4)
880  connectToHIDDevice = true; // We should always connect to the PS4 controller
881 
882  // Clear these flags for a new connection
883  l2capConnectionClaimed = false;
884  sdpConnectionClaimed = false;
885  rfcommConnectionClaimed = false;
886 
887  hci_event_flag = 0;
888  hci_state = HCI_DONE_STATE;
889  }
890  break;
891 
892  case HCI_DONE_STATE:
893  hci_counter++;
894  if(hci_counter > 1000) { // Wait until we have looped 1000 times to make sure that the L2CAP connection has been started
895  hci_counter = 0;
896  hci_state = HCI_SCANNING_STATE;
897  }
898  break;
899 
902 #ifdef DEBUG_USB_HOST
903  Notify(PSTR("\r\nHCI Disconnected from Device"), 0x80);
904 #endif
905  hci_event_flag = 0; // Clear all flags
906 
907  // Reset all buffers
908  memset(hcibuf, 0, BULK_MAXPKTSIZE);
909  memset(l2capinbuf, 0, BULK_MAXPKTSIZE);
910 
912  connectToHIDDevice = incomingHIDDevice = pairWithHIDDevice = checkRemoteName = false;
913  incomingPS4 = false;
914 
915  hci_state = HCI_SCANNING_STATE;
916  }
917  break;
918  default:
919  break;
920  }
921 }
922 
923 void BTD::ACL_event_task() {
924  uint16_t length = BULK_MAXPKTSIZE;
925  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_DATAIN_PIPE ].epAddr, &length, l2capinbuf, pollInterval); // Input on endpoint 2
926 
927  if(!rcode) { // Check for errors
928  if(length > 0) { // Check if any data was read
929  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
930  if(btService[i])
931  btService[i]->ACLData(l2capinbuf);
932  }
933  }
934  }
935 #ifdef EXTRADEBUG
936  else if(rcode != hrNAK) {
937  Notify(PSTR("\r\nACL data in error: "), 0x80);
938  D_PrintHex<uint8_t > (rcode, 0x80);
939  }
940 #endif
941  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
942  if(btService[i])
943  btService[i]->Run();
944 }
945 
946 /************************************************************/
947 /* HCI Commands */
948 
949 /************************************************************/
950 void BTD::HCI_Command(uint8_t* data, uint16_t nbytes) {
952  pUsb->ctrlReq(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bmREQ_HCI_OUT, 0x00, 0x00, 0x00, 0x00, nbytes, nbytes, data, NULL);
953 }
954 
956  hci_event_flag = 0; // Clear all the flags
957  hcibuf[0] = 0x03; // HCI OCF = 3
958  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
959  hcibuf[2] = 0x00;
960 
961  HCI_Command(hcibuf, 3);
962 }
963 
966  hcibuf[0] = 0x1A; // HCI OCF = 1A
967  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
968  hcibuf[2] = 0x01; // parameter length = 1
969  if(btdName != NULL)
970  hcibuf[3] = 0x03; // Inquiry Scan enabled. Page Scan enabled.
971  else
972  hcibuf[3] = 0x02; // Inquiry Scan disabled. Page Scan enabled.
973 
974  HCI_Command(hcibuf, 4);
975 }
976 
978  hcibuf[0] = 0x1A; // HCI OCF = 1A
979  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
980  hcibuf[2] = 0x01; // parameter length = 1
981  hcibuf[3] = 0x00; // Inquiry Scan disabled. Page Scan disabled.
982 
983  HCI_Command(hcibuf, 4);
984 }
985 
988  hcibuf[0] = 0x09; // HCI OCF = 9
989  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
990  hcibuf[2] = 0x00;
991 
992  HCI_Command(hcibuf, 3);
993 }
994 
997  hcibuf[0] = 0x01; // HCI OCF = 1
998  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
999  hcibuf[2] = 0x00;
1000 
1001  HCI_Command(hcibuf, 3);
1002 }
1003 
1006  hcibuf[0] = 0x09; // HCI OCF = 9
1007  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1008  hcibuf[2] = 0x07; // parameter length 7
1009  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1010  hcibuf[4] = disc_bdaddr[1];
1011  hcibuf[5] = disc_bdaddr[2];
1012  hcibuf[6] = disc_bdaddr[3];
1013  hcibuf[7] = disc_bdaddr[4];
1014  hcibuf[8] = disc_bdaddr[5];
1015  hcibuf[9] = 0x00; // Switch role to master
1016 
1017  HCI_Command(hcibuf, 10);
1018 }
1019 
1022  hcibuf[0] = 0x19; // HCI OCF = 19
1023  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1024  hcibuf[2] = 0x0A; // parameter length = 10
1025  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1026  hcibuf[4] = disc_bdaddr[1];
1027  hcibuf[5] = disc_bdaddr[2];
1028  hcibuf[6] = disc_bdaddr[3];
1029  hcibuf[7] = disc_bdaddr[4];
1030  hcibuf[8] = disc_bdaddr[5];
1031  hcibuf[9] = 0x01; // Page Scan Repetition Mode
1032  hcibuf[10] = 0x00; // Reserved
1033  hcibuf[11] = 0x00; // Clock offset - low byte
1034  hcibuf[12] = 0x00; // Clock offset - high byte
1035 
1036  HCI_Command(hcibuf, 13);
1037 }
1038 
1039 void BTD::hci_set_local_name(const char* name) {
1040  hcibuf[0] = 0x13; // HCI OCF = 13
1041  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
1042  hcibuf[2] = strlen(name) + 1; // parameter length = the length of the string + end byte
1043  uint8_t i;
1044  for(i = 0; i < strlen(name); i++)
1045  hcibuf[i + 3] = name[i];
1046  hcibuf[i + 3] = 0x00; // End of string
1047 
1048  HCI_Command(hcibuf, 4 + strlen(name));
1049 }
1050 
1053  hcibuf[0] = 0x01;
1054  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1055  hcibuf[2] = 0x05; // Parameter Total Length = 5
1056  hcibuf[3] = 0x33; // LAP: Genera/Unlimited Inquiry Access Code (GIAC = 0x9E8B33) - see https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
1057  hcibuf[4] = 0x8B;
1058  hcibuf[5] = 0x9E;
1059  hcibuf[6] = 0x30; // Inquiry time = 61.44 sec (maximum)
1060  hcibuf[7] = 0x0A; // 10 number of responses
1061 
1062  HCI_Command(hcibuf, 8);
1063 }
1064 
1066  hcibuf[0] = 0x02;
1067  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1068  hcibuf[2] = 0x00; // Parameter Total Length = 0
1069 
1070  HCI_Command(hcibuf, 3);
1071 }
1072 
1074  hci_connect(disc_bdaddr); // Use last discovered device
1075 }
1076 
1077 void BTD::hci_connect(uint8_t *bdaddr) {
1079  hcibuf[0] = 0x05;
1080  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1081  hcibuf[2] = 0x0D; // parameter Total Length = 13
1082  hcibuf[3] = bdaddr[0]; // 6 octet bdaddr (LSB)
1083  hcibuf[4] = bdaddr[1];
1084  hcibuf[5] = bdaddr[2];
1085  hcibuf[6] = bdaddr[3];
1086  hcibuf[7] = bdaddr[4];
1087  hcibuf[8] = bdaddr[5];
1088  hcibuf[9] = 0x18; // DM1 or DH1 may be used
1089  hcibuf[10] = 0xCC; // DM3, DH3, DM5, DH5 may be used
1090  hcibuf[11] = 0x01; // Page repetition mode R1
1091  hcibuf[12] = 0x00; // Reserved
1092  hcibuf[13] = 0x00; // Clock offset
1093  hcibuf[14] = 0x00; // Invalid clock offset
1094  hcibuf[15] = 0x00; // Do not allow role switch
1095 
1096  HCI_Command(hcibuf, 16);
1097 }
1098 
1100  hcibuf[0] = 0x0D; // HCI OCF = 0D
1101  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1102  hcibuf[2] = 0x17; // parameter length 23
1103  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1104  hcibuf[4] = disc_bdaddr[1];
1105  hcibuf[5] = disc_bdaddr[2];
1106  hcibuf[6] = disc_bdaddr[3];
1107  hcibuf[7] = disc_bdaddr[4];
1108  hcibuf[8] = disc_bdaddr[5];
1109  if(pairWithWii) {
1110  hcibuf[9] = 6; // Pin length is the length of the Bluetooth address
1111  if(pairWiiUsingSync) {
1112 #ifdef DEBUG_USB_HOST
1113  Notify(PSTR("\r\nPairing with Wii controller via SYNC"), 0x80);
1114 #endif
1115  for(uint8_t i = 0; i < 6; i++)
1116  hcibuf[10 + i] = my_bdaddr[i]; // The pin is the Bluetooth dongles Bluetooth address backwards
1117  } else {
1118  for(uint8_t i = 0; i < 6; i++)
1119  hcibuf[10 + i] = disc_bdaddr[i]; // The pin is the Wiimote's Bluetooth address backwards
1120  }
1121  for(uint8_t i = 16; i < 26; i++)
1122  hcibuf[i] = 0x00; // The rest should be 0
1123  } else {
1124  hcibuf[9] = strlen(btdPin); // Length of pin
1125  uint8_t i;
1126  for(i = 0; i < strlen(btdPin); i++) // The maximum size of the pin is 16
1127  hcibuf[i + 10] = btdPin[i];
1128  for(; i < 16; i++)
1129  hcibuf[i + 10] = 0x00; // The rest should be 0
1130  }
1131 
1132  HCI_Command(hcibuf, 26);
1133 }
1134 
1136  hcibuf[0] = 0x0E; // HCI OCF = 0E
1137  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1138  hcibuf[2] = 0x06; // parameter length 6
1139  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1140  hcibuf[4] = disc_bdaddr[1];
1141  hcibuf[5] = disc_bdaddr[2];
1142  hcibuf[6] = disc_bdaddr[3];
1143  hcibuf[7] = disc_bdaddr[4];
1144  hcibuf[8] = disc_bdaddr[5];
1145 
1146  HCI_Command(hcibuf, 9);
1147 }
1148 
1150  hcibuf[0] = 0x0C; // HCI OCF = 0C
1151  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1152  hcibuf[2] = 0x06; // parameter length 6
1153  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
1154  hcibuf[4] = disc_bdaddr[1];
1155  hcibuf[5] = disc_bdaddr[2];
1156  hcibuf[6] = disc_bdaddr[3];
1157  hcibuf[7] = disc_bdaddr[4];
1158  hcibuf[8] = disc_bdaddr[5];
1159 
1160  HCI_Command(hcibuf, 9);
1161 }
1162 
1164  hcibuf[0] = 0x11; // HCI OCF = 11
1165  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1166  hcibuf[2] = 0x02; // parameter length = 2
1167  hcibuf[3] = (uint8_t)(hci_handle & 0xFF); //connection handle - low byte
1168  hcibuf[4] = (uint8_t)((hci_handle >> 8) & 0x0F); //connection handle - high byte
1169 
1170  HCI_Command(hcibuf, 5);
1171 }
1172 
1173 void BTD::hci_disconnect(uint16_t handle) { // This is called by the different services
1175  hcibuf[0] = 0x06; // HCI OCF = 6
1176  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
1177  hcibuf[2] = 0x03; // parameter length = 3
1178  hcibuf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte
1179  hcibuf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte
1180  hcibuf[5] = 0x13; // reason
1181 
1182  HCI_Command(hcibuf, 6);
1183 }
1184 
1185 void BTD::hci_write_class_of_device() { // See http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
1186  hcibuf[0] = 0x24; // HCI OCF = 24
1187  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
1188  hcibuf[2] = 0x03; // parameter length = 3
1189  hcibuf[3] = 0x04; // Robot
1190  hcibuf[4] = 0x08; // Toy
1191  hcibuf[5] = 0x00;
1192 
1193  HCI_Command(hcibuf, 6);
1194 }
1195 /*******************************************************************
1196  * *
1197  * HCI ACL Data Packet *
1198  * *
1199  * buf[0] buf[1] buf[2] buf[3]
1200  * 0 4 8 11 12 16 24 31 MSB
1201  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1202  * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet
1203  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1204  *
1205  * buf[4] buf[5] buf[6] buf[7]
1206  * 0 8 16 31 MSB
1207  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1208  * | Length | Channel ID | Basic L2CAP header
1209  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1210  *
1211  * buf[8] buf[9] buf[10] buf[11]
1212  * 0 8 16 31 MSB
1213  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
1214  * | Code | Identifier | Length | Control frame (C-frame)
1215  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format)
1216  */
1217 /************************************************************/
1218 /* L2CAP Commands */
1219 
1220 /************************************************************/
1221 void BTD::L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow, uint8_t channelHigh) {
1222  uint8_t buf[8 + nbytes];
1223  buf[0] = (uint8_t)(handle & 0xff); // HCI handle with PB,BC flag
1224  buf[1] = (uint8_t)(((handle >> 8) & 0x0f) | 0x20);
1225  buf[2] = (uint8_t)((4 + nbytes) & 0xff); // HCI ACL total data length
1226  buf[3] = (uint8_t)((4 + nbytes) >> 8);
1227  buf[4] = (uint8_t)(nbytes & 0xff); // L2CAP header: Length
1228  buf[5] = (uint8_t)(nbytes >> 8);
1229  buf[6] = channelLow;
1230  buf[7] = channelHigh;
1231 
1232  for(uint16_t i = 0; i < nbytes; i++) // L2CAP C-frame
1233  buf[8 + i] = data[i];
1234 
1235  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ BTD_DATAOUT_PIPE ].epAddr, (8 + nbytes), buf);
1236  if(rcode) {
1237  delay(100); // This small delay prevents it from overflowing if it fails
1238 #ifdef DEBUG_USB_HOST
1239  Notify(PSTR("\r\nError sending L2CAP message: 0x"), 0x80);
1240  D_PrintHex<uint8_t > (rcode, 0x80);
1241  Notify(PSTR(" - Channel ID: "), 0x80);
1242  D_PrintHex<uint8_t > (channelHigh, 0x80);
1243  Notify(PSTR(" "), 0x80);
1244  D_PrintHex<uint8_t > (channelLow, 0x80);
1245 #endif
1246  }
1247 }
1248 
1249 void BTD::l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm) {
1250  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_REQUEST; // Code
1251  l2capoutbuf[1] = rxid; // Identifier
1252  l2capoutbuf[2] = 0x04; // Length
1253  l2capoutbuf[3] = 0x00;
1254  l2capoutbuf[4] = (uint8_t)(psm & 0xff); // PSM
1255  l2capoutbuf[5] = (uint8_t)(psm >> 8);
1256  l2capoutbuf[6] = scid[0]; // Source CID
1257  l2capoutbuf[7] = scid[1];
1258 
1259  L2CAP_Command(handle, l2capoutbuf, 8);
1260 }
1261 
1262 void BTD::l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result) {
1263  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code
1264  l2capoutbuf[1] = rxid; // Identifier
1265  l2capoutbuf[2] = 0x08; // Length
1266  l2capoutbuf[3] = 0x00;
1267  l2capoutbuf[4] = dcid[0]; // Destination CID
1268  l2capoutbuf[5] = dcid[1];
1269  l2capoutbuf[6] = scid[0]; // Source CID
1270  l2capoutbuf[7] = scid[1];
1271  l2capoutbuf[8] = result; // Result: Pending or Success
1272  l2capoutbuf[9] = 0x00;
1273  l2capoutbuf[10] = 0x00; // No further information
1274  l2capoutbuf[11] = 0x00;
1275 
1276  L2CAP_Command(handle, l2capoutbuf, 12);
1277 }
1278 
1279 void BTD::l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid) {
1280  l2capoutbuf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code
1281  l2capoutbuf[1] = rxid; // Identifier
1282  l2capoutbuf[2] = 0x08; // Length
1283  l2capoutbuf[3] = 0x00;
1284  l2capoutbuf[4] = dcid[0]; // Destination CID
1285  l2capoutbuf[5] = dcid[1];
1286  l2capoutbuf[6] = 0x00; // Flags
1287  l2capoutbuf[7] = 0x00;
1288  l2capoutbuf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) - Hint
1289  l2capoutbuf[9] = 0x02; // Config Opt: length
1290  l2capoutbuf[10] = 0xFF; // MTU
1291  l2capoutbuf[11] = 0xFF;
1292 
1293  L2CAP_Command(handle, l2capoutbuf, 12);
1294 }
1295 
1296 void BTD::l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid) {
1297  l2capoutbuf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code
1298  l2capoutbuf[1] = rxid; // Identifier
1299  l2capoutbuf[2] = 0x0A; // Length
1300  l2capoutbuf[3] = 0x00;
1301  l2capoutbuf[4] = scid[0]; // Source CID
1302  l2capoutbuf[5] = scid[1];
1303  l2capoutbuf[6] = 0x00; // Flag
1304  l2capoutbuf[7] = 0x00;
1305  l2capoutbuf[8] = 0x00; // Result
1306  l2capoutbuf[9] = 0x00;
1307  l2capoutbuf[10] = 0x01; // Config
1308  l2capoutbuf[11] = 0x02;
1309  l2capoutbuf[12] = 0xA0;
1310  l2capoutbuf[13] = 0x02;
1311 
1312  L2CAP_Command(handle, l2capoutbuf, 14);
1313 }
1314 
1315 void BTD::l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
1316  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code
1317  l2capoutbuf[1] = rxid; // Identifier
1318  l2capoutbuf[2] = 0x04; // Length
1319  l2capoutbuf[3] = 0x00;
1320  l2capoutbuf[4] = dcid[0];
1321  l2capoutbuf[5] = dcid[1];
1322  l2capoutbuf[6] = scid[0];
1323  l2capoutbuf[7] = scid[1];
1324 
1325  L2CAP_Command(handle, l2capoutbuf, 8);
1326 }
1327 
1328 void BTD::l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
1329  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code
1330  l2capoutbuf[1] = rxid; // Identifier
1331  l2capoutbuf[2] = 0x04; // Length
1332  l2capoutbuf[3] = 0x00;
1333  l2capoutbuf[4] = dcid[0];
1334  l2capoutbuf[5] = dcid[1];
1335  l2capoutbuf[6] = scid[0];
1336  l2capoutbuf[7] = scid[1];
1337 
1338  L2CAP_Command(handle, l2capoutbuf, 8);
1339 }
1340 
1341 void BTD::l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh) {
1342  l2capoutbuf[0] = L2CAP_CMD_INFORMATION_RESPONSE; // Code
1343  l2capoutbuf[1] = rxid; // Identifier
1344  l2capoutbuf[2] = 0x08; // Length
1345  l2capoutbuf[3] = 0x00;
1346  l2capoutbuf[4] = infoTypeLow;
1347  l2capoutbuf[5] = infoTypeHigh;
1348  l2capoutbuf[6] = 0x00; // Result = success
1349  l2capoutbuf[7] = 0x00; // Result = success
1350  l2capoutbuf[8] = 0x00;
1351  l2capoutbuf[9] = 0x00;
1352  l2capoutbuf[10] = 0x00;
1353  l2capoutbuf[11] = 0x00;
1354 
1355  L2CAP_Command(handle, l2capoutbuf, 12);
1356 }
1357 
1358 /* PS3 Commands - only set Bluetooth address is implemented in this library */
1359 void BTD::setBdaddr(uint8_t* bdaddr) {
1360  /* Set the internal Bluetooth address */
1361  uint8_t buf[8];
1362  buf[0] = 0x01;
1363  buf[1] = 0x00;
1364 
1365  for(uint8_t i = 0; i < 6; i++)
1366  buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
1367 
1368  // 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
1369  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
1370 }
1371 
1372 void BTD::setMoveBdaddr(uint8_t* bdaddr) {
1373  /* Set the internal Bluetooth address */
1374  uint8_t buf[11];
1375  buf[0] = 0x05;
1376  buf[7] = 0x10;
1377  buf[8] = 0x01;
1378  buf[9] = 0x02;
1379  buf[10] = 0x12;
1380 
1381  for(uint8_t i = 0; i < 6; i++)
1382  buf[i + 1] = bdaddr[i];
1383 
1384  // 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
1385  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
1386 }
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:521
-
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:771
-
uint8_t bmRcvToggle
Definition: address.h:41
-
bool incomingWii
Definition: BTD.h:471
- -
void hci_connect()
Definition: BTD.cpp:1073
-
uint8_t bNumEP
Definition: BTD.h:510
-
EpInfo * epinfo
Definition: address.h:76
-
const char * btdName
Definition: BTD.h:444
-
void hci_reset()
Definition: BTD.cpp:955
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1262
-
#define HCI_SCANNING_STATE
Definition: BTD.h:52
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
-
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1249
-
#define EV_COMMAND_STATUS
Definition: BTD.h:96
-
#define EV_REMOTE_NAME_COMPLETE
Definition: BTD.h:83
-
uint8_t bmNakPower
Definition: address.h:42
-
bool sdpConnectionClaimed
Definition: BTD.h:439
-
#define bmREQ_HCI_OUT
Definition: BTD.h:37
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1315
- -
bool rfcommConnectionClaimed
Definition: BTD.h:441
-
uint8_t hci_version
Definition: BTD.h:461
- -
#define EV_INQUIRY_COMPLETE
Definition: BTD.h:77
-
void hci_inquiry()
Definition: BTD.cpp:1051
-
static const uint8_t BTD_EVENT_PIPE
Definition: BTD.h:517
+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
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:784
+
uint8_t bmRcvToggle
Definition: address.h:48
+
bool incomingWii
Definition: BTD.h:474
+ +
void hci_connect()
Definition: BTD.cpp:1071
+
uint8_t bNumEP
Definition: BTD.h:514
+
EpInfo * epinfo
Definition: address.h:83
+
const char * btdName
Definition: BTD.h:447
+
void hci_reset()
Definition: BTD.cpp:953
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1260
+
#define HCI_SCANNING_STATE
Definition: BTD.h:55
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
+
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1247
+
#define EV_COMMAND_STATUS
Definition: BTD.h:99
+
#define EV_REMOTE_NAME_COMPLETE
Definition: BTD.h:86
+
uint8_t bmNakPower
Definition: address.h:49
+
bool sdpConnectionClaimed
Definition: BTD.h:442
+
#define bmREQ_HCI_OUT
Definition: BTD.h:40
+
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1313
+ +
bool rfcommConnectionClaimed
Definition: BTD.h:444
+
uint8_t hci_version
Definition: BTD.h:464
+
bool waitingForConnection
Definition: BTD.h:438
+ +
#define EV_INQUIRY_COMPLETE
Definition: BTD.h:80
+
void hci_inquiry()
Definition: BTD.cpp:1049
+
static const uint8_t BTD_EVENT_PIPE
Definition: BTD.h:521
#define PS3MOVE_PID
Definition: BTD.h:28
- - -
bool pairWithWii
Definition: BTD.h:473
- -
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:105
-
void hci_write_scan_disable()
Definition: BTD.cpp:977
-
#define NotifyFail(...)
Definition: message.h:55
-
#define HCI_SET_NAME_STATE
Definition: BTD.h:45
+ + +
bool pairWithWii
Definition: BTD.h:476
+
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:112
+
void hci_write_scan_disable()
Definition: BTD.cpp:975
+
#define NotifyFail(...)
Definition: message.h:62
+
#define BELKIN_F8T065BF_PID
Definition: BTD.h:34
+
#define HCI_SET_NAME_STATE
Definition: BTD.h:48
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: BTD.cpp:327
-
#define EV_LINK_KEY_REQUEST
Definition: BTD.h:89
-
#define HCI_DONE_STATE
Definition: BTD.h:57
-
#define BTD_NUM_SERVICES
Definition: BTD.h:188
-
#define EV_DATA_BUFFER_OVERFLOW
Definition: BTD.h:91
-
#define HCI_DISCONNECT_STATE
Definition: BTD.h:58
-
#define HCI_FLAG_CONNECT_COMPLETE
Definition: BTD.h:62
-
#define EV_PIN_CODE_REQUEST
Definition: BTD.h:88
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
-
const char * btdPin
Definition: BTD.h:446
-
bool motionPlusInside
Definition: BTD.h:475
-
#define EV_AUTHENTICATION_COMPLETE
Definition: BTD.h:82
-
void hci_remote_name()
Definition: BTD.cpp:1020
-
#define HCI_FLAG_CONNECT_EVENT
Definition: BTD.h:69
+
#define EV_LINK_KEY_REQUEST
Definition: BTD.h:92
+
#define HCI_DONE_STATE
Definition: BTD.h:60
+
#define BTD_NUM_SERVICES
Definition: BTD.h:191
+
#define EV_DATA_BUFFER_OVERFLOW
Definition: BTD.h:94
+
#define HCI_DISCONNECT_STATE
Definition: BTD.h:61
+
#define HCI_FLAG_CONNECT_COMPLETE
Definition: BTD.h:65
+
#define EV_PIN_CODE_REQUEST
Definition: BTD.h:91
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
+
const char * btdPin
Definition: BTD.h:449
+
bool motionPlusInside
Definition: BTD.h:478
+
#define EV_AUTHENTICATION_COMPLETE
Definition: BTD.h:85
+
void hci_remote_name()
Definition: BTD.cpp:1018
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:93
+
#define HCI_FLAG_CONNECT_EVENT
Definition: BTD.h:72
#define bmREQ_HID_OUT
Definition: usbhid.h:63
-
#define HCI_FLAG_DISCONNECT_COMPLETE
Definition: BTD.h:63
-
#define HCI_REMOTE_NAME_STATE
Definition: BTD.h:54
-
#define USB_ERROR_FailGetDevDescr
Definition: UsbCore.h:89
-
#define HCI_FLAG_CMD_COMPLETE
Definition: BTD.h:61
+
#define HCI_FLAG_DISCONNECT_COMPLETE
Definition: BTD.h:66
+
#define BELKIN_F8T065BF_VID
Definition: BTD.h:33
+
#define HCI_REMOTE_NAME_STATE
Definition: BTD.h:57
+
#define USB_ERROR_FailGetDevDescr
Definition: UsbCore.h:100
+
#define HCI_FLAG_CMD_COMPLETE
Definition: BTD.h:64
#define PS3_VID
Definition: BTD.h:25
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
BTD(USB *p)
Definition: BTD.cpp:27
-
char remote_name[30]
Definition: BTD.h:455
-
#define hrJERR
Definition: max3421e.h:220
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
+
char remote_name[30]
Definition: BTD.h:458
+
#define hrJERR
Definition: max3421e.h:227
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
virtual void Reset()=0
-
#define EV_MAX_SLOTS_CHANGE
Definition: BTD.h:92
-
static const uint8_t BTD_DATAIN_PIPE
Definition: BTD.h:519
-
void hci_set_local_name(const char *name)
Definition: BTD.cpp:1039
-
#define EV_QOS_SETUP_COMPLETE
Definition: BTD.h:94
-
void hci_write_scan_enable()
Definition: BTD.cpp:964
-
uint8_t Release()
Definition: BTD.cpp:378
+
#define EV_MAX_SLOTS_CHANGE
Definition: BTD.h:95
+
static const uint8_t BTD_DATAIN_PIPE
Definition: BTD.h:523
+
void hci_set_local_name(const char *name)
Definition: BTD.cpp:1037
+
#define EV_QOS_SETUP_COMPLETE
Definition: BTD.h:97
+
void hci_write_scan_enable()
Definition: BTD.cpp:962
+
uint8_t Release()
Definition: BTD.cpp:376
virtual void FreeAddress(uint8_t addr)=0
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1328
-
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
+
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1326
+
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:133
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
bool watingForConnection
Definition: BTD.h:435
-
#define HCI_BDADDR_STATE
Definition: BTD.h:43
-
#define HCI_CONNECT_DEVICE_STATE
Definition: BTD.h:49
-
#define Notify(...)
Definition: message.h:44
-
bool connectToHIDDevice
Definition: BTD.h:483
- - -
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
uint8_t bAddress
Definition: BTD.h:503
-
#define NotifyFailGetConfDescr(...)
Definition: message.h:52
-
uint8_t epAddr
Definition: address.h:33
-
bool incomingHIDDevice
Definition: BTD.h:487
-
#define NotifyFailUnknownDevice(...)
Definition: message.h:54
-
bool pairWithHIDDevice
Definition: BTD.h:489
-
uint32_t qNextPollTime
Definition: BTD.h:512
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
-
#define EV_CONNECT_COMPLETE
Definition: BTD.h:79
-
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: BTD.cpp:359
-
#define EV_DISCONNECT_COMPLETE
Definition: BTD.h:81
-
#define HCI_FLAG_READ_BDADDR
Definition: BTD.h:66
-
#define IOGEAR_GBU521_PID
Definition: BTD.h:31
-
bool connectToWii
Definition: BTD.h:467
+
#define HCI_BDADDR_STATE
Definition: BTD.h:46
+
#define HCI_CONNECT_DEVICE_STATE
Definition: BTD.h:52
+
#define Notify(...)
Definition: message.h:51
+
bool connectToHIDDevice
Definition: BTD.h:487
+ + +
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
uint8_t bAddress
Definition: BTD.h:507
+
#define NotifyFailGetConfDescr(...)
Definition: message.h:59
+
uint8_t epAddr
Definition: address.h:40
+
bool incomingHIDDevice
Definition: BTD.h:491
+
#define NotifyFailUnknownDevice(...)
Definition: message.h:61
+
bool pairWithHIDDevice
Definition: BTD.h:493
+
uint32_t qNextPollTime
Definition: BTD.h:516
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
+
#define EV_CONNECT_COMPLETE
Definition: BTD.h:82
+
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: BTD.cpp:357
+
#define EV_DISCONNECT_COMPLETE
Definition: BTD.h:84
+
#define HCI_FLAG_READ_BDADDR
Definition: BTD.h:69
+
#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
-
#define HCI_LOCAL_VERSION_STATE
Definition: BTD.h:44
+
#define HCI_LOCAL_VERSION_STATE
Definition: BTD.h:47
virtual void disconnect()=0
-
bool wiiUProController
Definition: BTD.h:477
-
uint16_t hci_handle
Definition: BTD.h:451
+
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
-
#define Notifyc(...)
Definition: message.h:46
-
Definition: address.h:32
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1173
-
#define HCI_RESET_STATE
Definition: BTD.h:41
-
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:293
-
#define hrNAK
Definition: max3421e.h:211
-
void hci_read_bdaddr()
Definition: BTD.cpp:986
-
void hci_inquiry_cancel()
Definition: BTD.cpp:1065
-
#define L2CAP_CMD_INFORMATION_RESPONSE
Definition: BTD.h:171
-
uint16_t wMaxPacketSize
Definition: usb_ch9.h:146
+
#define Notifyc(...)
Definition: message.h:53
+
Definition: address.h:39
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1171
+
#define HCI_RESET_STATE
Definition: BTD.h:44
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
+
#define hrNAK
Definition: max3421e.h:218
+
void hci_read_bdaddr()
Definition: BTD.cpp:984
+
void hci_inquiry_cancel()
Definition: BTD.cpp:1063
+
#define L2CAP_CMD_INFORMATION_RESPONSE
Definition: BTD.h:174
+
uint16_t wMaxPacketSize
Definition: usb_ch9.h:153
+
#define bmUSB_TRANSFER_TYPE
Definition: usb_ch9.h:94
virtual void Run()=0
-
uint8_t my_bdaddr[6]
Definition: BTD.h:449
-
#define EV_INCOMING_CONNECT
Definition: BTD.h:80
-
#define HCI_CONNECT_IN_STATE
Definition: BTD.h:53
- -
#define HCI_INQUIRY_STATE
Definition: BTD.h:48
+
uint8_t my_bdaddr[6]
Definition: BTD.h:452
+
#define EV_INCOMING_CONNECT
Definition: BTD.h:83
+
#define HCI_CONNECT_IN_STATE
Definition: BTD.h:56
+ +
#define HCI_INQUIRY_STATE
Definition: BTD.h:51
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bEndpointAddress
Definition: usb_ch9.h:144
-
#define HCI_CONNECTED_STATE
Definition: BTD.h:55
-
#define EV_INQUIRY_RESULT
Definition: BTD.h:78
-
uint8_t bmSndToggle
Definition: address.h:40
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:166
-
#define PSTR(str)
-
uint8_t Poll()
Definition: BTD.cpp:384
-
uint8_t bDeviceClass
Definition: usb_ch9.h:102
-
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:168
-
static const uint8_t BTD_CONTROL_PIPE
Definition: BTD.h:515
- -
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
-
void disconnect()
Definition: BTD.cpp:396
-
#define HCI_FLAG_READ_VERSION
Definition: BTD.h:67
-
uint8_t disc_bdaddr[6]
Definition: BTD.h:453
-
bool l2capConnectionClaimed
Definition: BTD.h:437
-
#define USB_NAK_NOWAIT
Definition: address.h:29
-
#define HCI_FLAG_INCOMING_REQUEST
Definition: BTD.h:65
-
#define EV_NUM_COMPLETE_PKT
Definition: BTD.h:87
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
-
EpInfo epInfo[BTD_MAX_ENDPOINTS]
Definition: BTD.h:505
-
#define IOGEAR_GBU521_VID
Definition: BTD.h:30
+
uint8_t bEndpointAddress
Definition: usb_ch9.h:151
+
#define HCI_CONNECTED_STATE
Definition: BTD.h:58
+
#define EV_INQUIRY_RESULT
Definition: BTD.h:81
+
uint8_t bmSndToggle
Definition: address.h:47
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:169
+
#define PSTR(str)
+
uint8_t Poll()
Definition: BTD.cpp:382
+
uint8_t bDeviceClass
Definition: usb_ch9.h:109
+
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:171
+
static const uint8_t BTD_CONTROL_PIPE
Definition: BTD.h:519
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:37
+
void disconnect()
Definition: BTD.cpp:394
+
#define HCI_FLAG_READ_VERSION
Definition: BTD.h:70
+
uint8_t disc_bdaddr[6]
Definition: BTD.h:456
+
bool l2capConnectionClaimed
Definition: BTD.h:440
+
#define USB_NAK_NOWAIT
Definition: address.h:36
+
#define HCI_FLAG_INCOMING_REQUEST
Definition: BTD.h:68
+
#define EV_NUM_COMPLETE_PKT
Definition: BTD.h:90
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
+
EpInfo epInfo[BTD_MAX_ENDPOINTS]
Definition: BTD.h:509
+
#define IOGEAR_GBU521_VID
Definition: BTD.h:31
#define PS3_PID
Definition: BTD.h:26
-
#define BTD_MAX_ENDPOINTS
Definition: BTD.h:187
+
#define BTD_MAX_ENDPOINTS
Definition: BTD.h:190
#define PS3NAVIGATION_PID
Definition: BTD.h:27
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
-
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:169
-
#define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE
Definition: BTD.h:93
-
#define EV_COMMAND_COMPLETE
Definition: BTD.h:95
-
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1341
-
uint16_t idProduct
Definition: usb_ch9.h:107
-
#define L2CAP_CMD_CONNECTION_RESPONSE
Definition: BTD.h:165
-
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:167
-
#define hci_set_flag(flag)
Definition: BTD.h:73
-
void hci_write_class_of_device()
Definition: BTD.cpp:1185
-
#define HCI_CONNECTED_DEVICE_STATE
Definition: BTD.h:50
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
-
#define HCI_INIT_STATE
Definition: BTD.h:40
-
void hci_pin_code_negative_request_reply()
Definition: BTD.cpp:1135
-
#define EV_CHANGE_CONNECTION_LINK
Definition: BTD.h:85
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
+
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:172
+
#define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE
Definition: BTD.h:96
+
#define EV_COMMAND_COMPLETE
Definition: BTD.h:98
+
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1339
+
uint16_t idProduct
Definition: usb_ch9.h:114
+
#define L2CAP_CMD_CONNECTION_RESPONSE
Definition: BTD.h:168
+
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:170
+
#define hci_set_flag(flag)
Definition: BTD.h:76
+
void hci_write_class_of_device()
Definition: BTD.cpp:1183
+
#define HCI_CONNECTED_DEVICE_STATE
Definition: BTD.h:53
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
#define HCI_INIT_STATE
Definition: BTD.h:43
+
void hci_pin_code_negative_request_reply()
Definition: BTD.cpp:1133
+
#define EV_CHANGE_CONNECTION_LINK
Definition: BTD.h:88
virtual void ACLData(uint8_t *ACLData)=0
-
uint8_t bNumConfigurations
Definition: usb_ch9.h:112
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
-
#define hci_check_flag(flag)
Definition: BTD.h:72
-
#define EV_ROLE_CHANGED
Definition: BTD.h:86
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
#define HCI_CHECK_DEVICE_SERVICE
Definition: BTD.h:46
-
Definition: UsbCore.h:197
-
uint8_t bConfNum
Definition: BTD.h:508
-
void hci_link_key_request_negative_reply()
Definition: BTD.cpp:1149
-
#define EV_LOOPBACK_COMMAND
Definition: BTD.h:97
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1221
-
#define EV_LINK_KEY_NOTIFICATION
Definition: BTD.h:90
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1296
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1279
-
void hci_pin_code_request_reply()
Definition: BTD.cpp:1099
+
uint8_t bNumConfigurations
Definition: usb_ch9.h:119
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
+
#define hci_check_flag(flag)
Definition: BTD.h:75
+
#define EV_ROLE_CHANGED
Definition: BTD.h:89
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
#define HCI_CHECK_DEVICE_SERVICE
Definition: BTD.h:49
+
Definition: UsbCore.h:208
+
#define USB_TRANSFER_TYPE_BULK
Definition: usb_ch9.h:92
+
uint8_t bConfNum
Definition: BTD.h:512
+
void hci_link_key_request_negative_reply()
Definition: BTD.cpp:1147
+
#define EV_LOOPBACK_COMMAND
Definition: BTD.h:100
+
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1219
+
#define EV_LINK_KEY_NOTIFICATION
Definition: BTD.h:93
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1294
+
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1277
+
void hci_pin_code_request_reply()
Definition: BTD.cpp:1097
#define HID_REQUEST_SET_REPORT
Definition: usbhid.h:72
-
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:164
+
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:167
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define EV_ENCRYPTION_CHANGE
Definition: BTD.h:84
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
-
#define hci_clear_flag(flag)
Definition: BTD.h:74
-
USB * pUsb
Definition: BTD.h:497
-
#define NotifyStr(...)
Definition: message.h:45
-
void hci_authentication_request()
Definition: BTD.cpp:1163
-
void hci_read_local_version_information()
Definition: BTD.cpp:995
-
#define HCI_FLAG_REMOTE_NAME_COMPLETE
Definition: BTD.h:64
-
void hci_accept_connection()
Definition: BTD.cpp:1004
-
#define EV_PAGE_SCAN_REP_MODE
Definition: BTD.h:98
-
#define HCI_FLAG_DEVICE_FOUND
Definition: BTD.h:68
-
#define HCI_CLASS_STATE
Definition: BTD.h:42
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
-
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:88
-
void HCI_Command(uint8_t *data, uint16_t nbytes)
Definition: BTD.cpp:950
- +
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define EV_ENCRYPTION_CHANGE
Definition: BTD.h:87
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
+
#define hci_clear_flag(flag)
Definition: BTD.h:77
+
USB * pUsb
Definition: BTD.h:501
+
#define NotifyStr(...)
Definition: message.h:52
+
void hci_authentication_request()
Definition: BTD.cpp:1161
+
void hci_read_local_version_information()
Definition: BTD.cpp:993
+
#define HCI_FLAG_REMOTE_NAME_COMPLETE
Definition: BTD.h:67
+
void hci_accept_connection()
Definition: BTD.cpp:1002
+
#define EV_PAGE_SCAN_REP_MODE
Definition: BTD.h:101
+
#define HCI_FLAG_DEVICE_FOUND
Definition: BTD.h:71
+
#define HCI_CLASS_STATE
Definition: BTD.h:45
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
+
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:99
+
void HCI_Command(uint8_t *data, uint16_t nbytes)
Definition: BTD.cpp:948
+
diff --git a/_b_t_d_8h.html b/_b_t_d_8h.html index aadd76d3..eec30e65 100644 --- a/_b_t_d_8h.html +++ b/_b_t_d_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: BTD.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- - + + - - + + @@ -146,6 +126,10 @@ Macros   #define IOGEAR_GBU521_PID   0x21E8   +#define BELKIN_F8T065BF_VID   0x050D +  +#define BELKIN_F8T065BF_PID   0x065A +  #define BULK_MAXPKTSIZE   64   #define bmREQ_HCI_OUT   USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE @@ -370,7 +354,9 @@ Macros  

Macro Definition Documentation

- + +

◆ PS3_VID

+
@@ -380,11 +366,13 @@ Macros
-

Definition at line 25 of file BTD.h.

+

Definition at line 25 of file BTD.h.

- + +

◆ PS3_PID

+
@@ -394,11 +382,13 @@ Macros
-

Definition at line 26 of file BTD.h.

+

Definition at line 26 of file BTD.h.

- + +

◆ PS3NAVIGATION_PID

+
@@ -408,11 +398,13 @@ Macros
-

Definition at line 27 of file BTD.h.

+

Definition at line 27 of file BTD.h.

- + +

◆ PS3MOVE_PID

+
@@ -422,11 +414,13 @@ Macros
-

Definition at line 28 of file BTD.h.

+

Definition at line 28 of file BTD.h.

- + +

◆ IOGEAR_GBU521_VID

+
@@ -436,11 +430,13 @@ Macros
-

Definition at line 30 of file BTD.h.

+

Definition at line 31 of file BTD.h.

- + +

◆ IOGEAR_GBU521_PID

+
@@ -450,11 +446,45 @@ Macros
-

Definition at line 31 of file BTD.h.

+

Definition at line 32 of file BTD.h.

- + +

◆ BELKIN_F8T065BF_VID

+ +
+
+ + + + +
#define BELKIN_F8T065BF_VID   0x050D
+
+ +

Definition at line 33 of file BTD.h.

+ +
+
+ +

◆ BELKIN_F8T065BF_PID

+ +
+
+ + + + +
#define BELKIN_F8T065BF_PID   0x065A
+
+ +

Definition at line 34 of file BTD.h.

+ +
+
+ +

◆ BULK_MAXPKTSIZE

+
@@ -464,11 +494,13 @@ Macros
-

Definition at line 34 of file BTD.h.

+

Definition at line 37 of file BTD.h.

- + +

◆ bmREQ_HCI_OUT

+
@@ -478,11 +510,13 @@ Macros
-

Definition at line 37 of file BTD.h.

+

Definition at line 40 of file BTD.h.

- + +

◆ HCI_INIT_STATE

+
@@ -492,11 +526,13 @@ Macros
-

Definition at line 40 of file BTD.h.

+

Definition at line 43 of file BTD.h.

- + +

◆ HCI_RESET_STATE

+
@@ -506,11 +542,13 @@ Macros
-

Definition at line 41 of file BTD.h.

+

Definition at line 44 of file BTD.h.

- + +

◆ HCI_CLASS_STATE

+
@@ -520,11 +558,13 @@ Macros
-

Definition at line 42 of file BTD.h.

+

Definition at line 45 of file BTD.h.

- + +

◆ HCI_BDADDR_STATE

+
@@ -534,11 +574,13 @@ Macros
-

Definition at line 43 of file BTD.h.

+

Definition at line 46 of file BTD.h.

- + +

◆ HCI_LOCAL_VERSION_STATE

+
@@ -548,11 +590,13 @@ Macros
-

Definition at line 44 of file BTD.h.

+

Definition at line 47 of file BTD.h.

- + +

◆ HCI_SET_NAME_STATE

+
@@ -562,11 +606,13 @@ Macros
-

Definition at line 45 of file BTD.h.

+

Definition at line 48 of file BTD.h.

- + +

◆ HCI_CHECK_DEVICE_SERVICE

+
@@ -576,11 +622,13 @@ Macros
-

Definition at line 46 of file BTD.h.

+

Definition at line 49 of file BTD.h.

- + +

◆ HCI_INQUIRY_STATE

+
@@ -590,11 +638,13 @@ Macros
-

Definition at line 48 of file BTD.h.

+

Definition at line 51 of file BTD.h.

- + +

◆ HCI_CONNECT_DEVICE_STATE

+
@@ -604,11 +654,13 @@ Macros
-

Definition at line 49 of file BTD.h.

+

Definition at line 52 of file BTD.h.

- + +

◆ HCI_CONNECTED_DEVICE_STATE

+
@@ -618,11 +670,13 @@ Macros
-

Definition at line 50 of file BTD.h.

+

Definition at line 53 of file BTD.h.

- + +

◆ HCI_SCANNING_STATE

+
@@ -632,11 +686,13 @@ Macros
-

Definition at line 52 of file BTD.h.

+

Definition at line 55 of file BTD.h.

- + +

◆ HCI_CONNECT_IN_STATE

+
@@ -646,11 +702,13 @@ Macros
-

Definition at line 53 of file BTD.h.

+

Definition at line 56 of file BTD.h.

- + +

◆ HCI_REMOTE_NAME_STATE

+
@@ -660,11 +718,13 @@ Macros
-

Definition at line 54 of file BTD.h.

+

Definition at line 57 of file BTD.h.

- + +

◆ HCI_CONNECTED_STATE

+
@@ -674,11 +734,13 @@ Macros
-

Definition at line 55 of file BTD.h.

+

Definition at line 58 of file BTD.h.

- + +

◆ HCI_DISABLE_SCAN_STATE

+
@@ -688,11 +750,13 @@ Macros
-

Definition at line 56 of file BTD.h.

+

Definition at line 59 of file BTD.h.

- + +

◆ HCI_DONE_STATE

+
@@ -702,11 +766,13 @@ Macros
-

Definition at line 57 of file BTD.h.

+

Definition at line 60 of file BTD.h.

- + +

◆ HCI_DISCONNECT_STATE

+
@@ -716,11 +782,13 @@ Macros
-

Definition at line 58 of file BTD.h.

+

Definition at line 61 of file BTD.h.

- + +

◆ HCI_FLAG_CMD_COMPLETE

+
@@ -730,11 +798,13 @@ Macros
-

Definition at line 61 of file BTD.h.

+

Definition at line 64 of file BTD.h.

- + +

◆ HCI_FLAG_CONNECT_COMPLETE

+
@@ -744,11 +814,13 @@ Macros
-

Definition at line 62 of file BTD.h.

+

Definition at line 65 of file BTD.h.

- + +

◆ HCI_FLAG_DISCONNECT_COMPLETE

+
@@ -758,11 +830,13 @@ Macros
-

Definition at line 63 of file BTD.h.

+

Definition at line 66 of file BTD.h.

- + +

◆ HCI_FLAG_REMOTE_NAME_COMPLETE

+
@@ -772,11 +846,13 @@ Macros
-

Definition at line 64 of file BTD.h.

+

Definition at line 67 of file BTD.h.

- + +

◆ HCI_FLAG_INCOMING_REQUEST

+
@@ -786,11 +862,13 @@ Macros
-

Definition at line 65 of file BTD.h.

+

Definition at line 68 of file BTD.h.

- + +

◆ HCI_FLAG_READ_BDADDR

+
@@ -800,11 +878,13 @@ Macros
-

Definition at line 66 of file BTD.h.

+

Definition at line 69 of file BTD.h.

- + +

◆ HCI_FLAG_READ_VERSION

+
@@ -814,11 +894,13 @@ Macros
-

Definition at line 67 of file BTD.h.

+

Definition at line 70 of file BTD.h.

- + +

◆ HCI_FLAG_DEVICE_FOUND

+
@@ -828,11 +910,13 @@ Macros
-

Definition at line 68 of file BTD.h.

+

Definition at line 71 of file BTD.h.

- + +

◆ HCI_FLAG_CONNECT_EVENT

+
@@ -842,11 +926,13 @@ Macros
-

Definition at line 69 of file BTD.h.

+

Definition at line 72 of file BTD.h.

- + +

◆ hci_check_flag

+
@@ -860,11 +946,13 @@ Macros
-

Definition at line 72 of file BTD.h.

+

Definition at line 75 of file BTD.h.

- + +

◆ hci_set_flag

+
@@ -878,11 +966,13 @@ Macros
-

Definition at line 73 of file BTD.h.

+

Definition at line 76 of file BTD.h.

- + +

◆ hci_clear_flag

+
@@ -896,11 +986,13 @@ Macros
-

Definition at line 74 of file BTD.h.

+

Definition at line 77 of file BTD.h.

- + +

◆ EV_INQUIRY_COMPLETE

+
@@ -910,11 +1002,13 @@ Macros
-

Definition at line 77 of file BTD.h.

+

Definition at line 80 of file BTD.h.

- + +

◆ EV_INQUIRY_RESULT

+
@@ -924,11 +1018,13 @@ Macros
-

Definition at line 78 of file BTD.h.

+

Definition at line 81 of file BTD.h.

- + +

◆ EV_CONNECT_COMPLETE

+
@@ -938,11 +1034,13 @@ Macros
-

Definition at line 79 of file BTD.h.

+

Definition at line 82 of file BTD.h.

- + +

◆ EV_INCOMING_CONNECT

+
@@ -952,11 +1050,13 @@ Macros
-

Definition at line 80 of file BTD.h.

+

Definition at line 83 of file BTD.h.

- + +

◆ EV_DISCONNECT_COMPLETE

+
@@ -966,11 +1066,13 @@ Macros
-

Definition at line 81 of file BTD.h.

+

Definition at line 84 of file BTD.h.

- + +

◆ EV_AUTHENTICATION_COMPLETE

+
@@ -980,11 +1082,13 @@ Macros
-

Definition at line 82 of file BTD.h.

+

Definition at line 85 of file BTD.h.

- + +

◆ EV_REMOTE_NAME_COMPLETE

+
@@ -994,11 +1098,13 @@ Macros
-

Definition at line 83 of file BTD.h.

+

Definition at line 86 of file BTD.h.

- + +

◆ EV_ENCRYPTION_CHANGE

+
@@ -1008,11 +1114,13 @@ Macros
-

Definition at line 84 of file BTD.h.

+

Definition at line 87 of file BTD.h.

- + +

◆ EV_CHANGE_CONNECTION_LINK

+
@@ -1022,11 +1130,13 @@ Macros
-

Definition at line 85 of file BTD.h.

+

Definition at line 88 of file BTD.h.

- + +

◆ EV_ROLE_CHANGED

+
@@ -1036,11 +1146,13 @@ Macros
-

Definition at line 86 of file BTD.h.

+

Definition at line 89 of file BTD.h.

- + +

◆ EV_NUM_COMPLETE_PKT

+
@@ -1050,11 +1162,13 @@ Macros
-

Definition at line 87 of file BTD.h.

+

Definition at line 90 of file BTD.h.

- + +

◆ EV_PIN_CODE_REQUEST

+
@@ -1064,11 +1178,13 @@ Macros
-

Definition at line 88 of file BTD.h.

+

Definition at line 91 of file BTD.h.

- + +

◆ EV_LINK_KEY_REQUEST

+
@@ -1078,11 +1194,13 @@ Macros
-

Definition at line 89 of file BTD.h.

+

Definition at line 92 of file BTD.h.

- + +

◆ EV_LINK_KEY_NOTIFICATION

+
@@ -1092,11 +1210,13 @@ Macros
-

Definition at line 90 of file BTD.h.

+

Definition at line 93 of file BTD.h.

- + +

◆ EV_DATA_BUFFER_OVERFLOW

+
@@ -1106,11 +1226,13 @@ Macros
-

Definition at line 91 of file BTD.h.

+

Definition at line 94 of file BTD.h.

- + +

◆ EV_MAX_SLOTS_CHANGE

+
@@ -1120,11 +1242,13 @@ Macros
-

Definition at line 92 of file BTD.h.

+

Definition at line 95 of file BTD.h.

- + +

◆ EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE

+
@@ -1134,11 +1258,13 @@ Macros
-

Definition at line 93 of file BTD.h.

+

Definition at line 96 of file BTD.h.

- + +

◆ EV_QOS_SETUP_COMPLETE

+
@@ -1148,11 +1274,13 @@ Macros
-

Definition at line 94 of file BTD.h.

+

Definition at line 97 of file BTD.h.

- + +

◆ EV_COMMAND_COMPLETE

+
@@ -1162,11 +1290,13 @@ Macros
-

Definition at line 95 of file BTD.h.

+

Definition at line 98 of file BTD.h.

- + +

◆ EV_COMMAND_STATUS

+
@@ -1176,11 +1306,13 @@ Macros
-

Definition at line 96 of file BTD.h.

+

Definition at line 99 of file BTD.h.

- + +

◆ EV_LOOPBACK_COMMAND

+
@@ -1190,11 +1322,13 @@ Macros
-

Definition at line 97 of file BTD.h.

+

Definition at line 100 of file BTD.h.

- + +

◆ EV_PAGE_SCAN_REP_MODE

+
@@ -1204,11 +1338,13 @@ Macros
-

Definition at line 98 of file BTD.h.

+

Definition at line 101 of file BTD.h.

- + +

◆ L2CAP_WAIT

+
@@ -1218,11 +1354,13 @@ Macros
-

Definition at line 101 of file BTD.h.

+

Definition at line 104 of file BTD.h.

- + +

◆ L2CAP_DONE

+
@@ -1232,11 +1370,13 @@ Macros
-

Definition at line 102 of file BTD.h.

+

Definition at line 105 of file BTD.h.

- + +

◆ L2CAP_CONTROL_CONNECT_REQUEST

+
@@ -1246,11 +1386,13 @@ Macros
-

Definition at line 105 of file BTD.h.

+

Definition at line 108 of file BTD.h.

- + +

◆ L2CAP_CONTROL_CONFIG_REQUEST

+
@@ -1260,11 +1402,13 @@ Macros
-

Definition at line 106 of file BTD.h.

+

Definition at line 109 of file BTD.h.

- + +

◆ L2CAP_CONTROL_SUCCESS

+
@@ -1274,11 +1418,13 @@ Macros
-

Definition at line 107 of file BTD.h.

+

Definition at line 110 of file BTD.h.

- + +

◆ L2CAP_CONTROL_DISCONNECT

+
@@ -1288,11 +1434,13 @@ Macros
-

Definition at line 108 of file BTD.h.

+

Definition at line 111 of file BTD.h.

- + +

◆ L2CAP_INTERRUPT_SETUP

+
@@ -1302,11 +1450,13 @@ Macros
-

Definition at line 111 of file BTD.h.

+

Definition at line 114 of file BTD.h.

- + +

◆ L2CAP_INTERRUPT_CONNECT_REQUEST

+
@@ -1316,11 +1466,13 @@ Macros
-

Definition at line 112 of file BTD.h.

+

Definition at line 115 of file BTD.h.

- + +

◆ L2CAP_INTERRUPT_CONFIG_REQUEST

+
@@ -1330,11 +1482,13 @@ Macros
-

Definition at line 113 of file BTD.h.

+

Definition at line 116 of file BTD.h.

- + +

◆ L2CAP_INTERRUPT_DISCONNECT

+
@@ -1344,11 +1498,13 @@ Macros
-

Definition at line 114 of file BTD.h.

+

Definition at line 117 of file BTD.h.

- + +

◆ L2CAP_SDP_WAIT

+
@@ -1358,11 +1514,13 @@ Macros
-

Definition at line 117 of file BTD.h.

+

Definition at line 120 of file BTD.h.

- + +

◆ L2CAP_SDP_SUCCESS

+
@@ -1372,11 +1530,13 @@ Macros
-

Definition at line 118 of file BTD.h.

+

Definition at line 121 of file BTD.h.

- + +

◆ L2CAP_RFCOMM_WAIT

+
@@ -1386,11 +1546,13 @@ Macros
-

Definition at line 121 of file BTD.h.

+

Definition at line 124 of file BTD.h.

- + +

◆ L2CAP_RFCOMM_SUCCESS

+
@@ -1400,11 +1562,13 @@ Macros
-

Definition at line 122 of file BTD.h.

+

Definition at line 125 of file BTD.h.

- + +

◆ L2CAP_DISCONNECT_RESPONSE

+
@@ -1414,11 +1578,13 @@ Macros
-

Definition at line 124 of file BTD.h.

+

Definition at line 127 of file BTD.h.

- + +

◆ TURN_ON_LED

+
@@ -1428,11 +1594,13 @@ Macros
-

Definition at line 127 of file BTD.h.

+

Definition at line 130 of file BTD.h.

- + +

◆ PS3_ENABLE_SIXAXIS

+
@@ -1442,11 +1610,13 @@ Macros
-

Definition at line 128 of file BTD.h.

+

Definition at line 131 of file BTD.h.

- + +

◆ WII_CHECK_MOTION_PLUS_STATE

+
@@ -1456,11 +1626,13 @@ Macros
-

Definition at line 129 of file BTD.h.

+

Definition at line 132 of file BTD.h.

- + +

◆ WII_CHECK_EXTENSION_STATE

+
@@ -1470,11 +1642,13 @@ Macros
-

Definition at line 130 of file BTD.h.

+

Definition at line 133 of file BTD.h.

- + +

◆ WII_INIT_MOTION_PLUS_STATE

+
@@ -1484,11 +1658,13 @@ Macros
-

Definition at line 131 of file BTD.h.

+

Definition at line 134 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONNECTION_CONTROL_REQUEST

+
@@ -1498,11 +1674,13 @@ Macros
-

Definition at line 134 of file BTD.h.

+

Definition at line 137 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONFIG_CONTROL_SUCCESS

+
@@ -1512,11 +1690,13 @@ Macros
-

Definition at line 135 of file BTD.h.

+

Definition at line 138 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONTROL_CONNECTED

+
@@ -1526,11 +1706,13 @@ Macros
-

Definition at line 136 of file BTD.h.

+

Definition at line 139 of file BTD.h.

- + +

◆ L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE

+
@@ -1540,11 +1722,13 @@ Macros
-

Definition at line 137 of file BTD.h.

+

Definition at line 140 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST

+
@@ -1554,11 +1738,13 @@ Macros
-

Definition at line 140 of file BTD.h.

+

Definition at line 143 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS

+
@@ -1568,11 +1754,13 @@ Macros
-

Definition at line 141 of file BTD.h.

+

Definition at line 144 of file BTD.h.

- + +

◆ L2CAP_FLAG_INTERRUPT_CONNECTED

+
@@ -1582,11 +1770,13 @@ Macros
-

Definition at line 142 of file BTD.h.

+

Definition at line 145 of file BTD.h.

- + +

◆ L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE

+
@@ -1596,11 +1786,13 @@ Macros
-

Definition at line 143 of file BTD.h.

+

Definition at line 146 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONNECTION_SDP_REQUEST

+
@@ -1610,11 +1802,13 @@ Macros
-

Definition at line 146 of file BTD.h.

+

Definition at line 149 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONFIG_SDP_SUCCESS

+
@@ -1624,11 +1818,13 @@ Macros
-

Definition at line 147 of file BTD.h.

+

Definition at line 150 of file BTD.h.

- + +

◆ L2CAP_FLAG_DISCONNECT_SDP_REQUEST

+
@@ -1638,11 +1834,13 @@ Macros
-

Definition at line 148 of file BTD.h.

+

Definition at line 151 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST

+
@@ -1652,11 +1850,13 @@ Macros
-

Definition at line 151 of file BTD.h.

+

Definition at line 154 of file BTD.h.

- + +

◆ L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS

+
@@ -1666,11 +1866,13 @@ Macros
-

Definition at line 152 of file BTD.h.

+

Definition at line 155 of file BTD.h.

- + +

◆ L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST

+
@@ -1680,11 +1882,13 @@ Macros
-

Definition at line 153 of file BTD.h.

+

Definition at line 156 of file BTD.h.

- + +

◆ L2CAP_FLAG_DISCONNECT_RESPONSE

+
@@ -1694,11 +1898,13 @@ Macros
-

Definition at line 155 of file BTD.h.

+

Definition at line 158 of file BTD.h.

- + +

◆ l2cap_check_flag

+
@@ -1712,11 +1918,13 @@ Macros
-

Definition at line 158 of file BTD.h.

+

Definition at line 161 of file BTD.h.

- + +

◆ l2cap_set_flag

+
@@ -1730,11 +1938,13 @@ Macros
-

Definition at line 159 of file BTD.h.

+

Definition at line 162 of file BTD.h.

- + +

◆ l2cap_clear_flag

+
@@ -1748,11 +1958,13 @@ Macros
-

Definition at line 160 of file BTD.h.

+

Definition at line 163 of file BTD.h.

- + +

◆ L2CAP_CMD_COMMAND_REJECT

+
@@ -1762,11 +1974,13 @@ Macros
-

Definition at line 163 of file BTD.h.

+

Definition at line 166 of file BTD.h.

- + +

◆ L2CAP_CMD_CONNECTION_REQUEST

+
@@ -1776,11 +1990,13 @@ Macros
-

Definition at line 164 of file BTD.h.

+

Definition at line 167 of file BTD.h.

- + +

◆ L2CAP_CMD_CONNECTION_RESPONSE

+
@@ -1790,11 +2006,13 @@ Macros
-

Definition at line 165 of file BTD.h.

+

Definition at line 168 of file BTD.h.

- + +

◆ L2CAP_CMD_CONFIG_REQUEST

+
@@ -1804,11 +2022,13 @@ Macros
-

Definition at line 166 of file BTD.h.

+

Definition at line 169 of file BTD.h.

- + +

◆ L2CAP_CMD_CONFIG_RESPONSE

+
@@ -1818,11 +2038,13 @@ Macros
-

Definition at line 167 of file BTD.h.

+

Definition at line 170 of file BTD.h.

- + +

◆ L2CAP_CMD_DISCONNECT_REQUEST

+
@@ -1832,11 +2054,13 @@ Macros
-

Definition at line 168 of file BTD.h.

+

Definition at line 171 of file BTD.h.

- + +

◆ L2CAP_CMD_DISCONNECT_RESPONSE

+
@@ -1846,11 +2070,13 @@ Macros
-

Definition at line 169 of file BTD.h.

+

Definition at line 172 of file BTD.h.

- + +

◆ L2CAP_CMD_INFORMATION_REQUEST

+
@@ -1860,11 +2086,13 @@ Macros
-

Definition at line 170 of file BTD.h.

+

Definition at line 173 of file BTD.h.

- + +

◆ L2CAP_CMD_INFORMATION_RESPONSE

+
@@ -1874,11 +2102,13 @@ Macros
-

Definition at line 171 of file BTD.h.

+

Definition at line 174 of file BTD.h.

- + +

◆ PENDING

+
@@ -1888,11 +2118,13 @@ Macros
-

Definition at line 174 of file BTD.h.

+

Definition at line 177 of file BTD.h.

- + +

◆ SUCCESSFUL

+
@@ -1902,11 +2134,13 @@ Macros
-

Definition at line 175 of file BTD.h.

+

Definition at line 178 of file BTD.h.

- + +

◆ SDP_PSM

+
@@ -1916,11 +2150,13 @@ Macros
-

Definition at line 178 of file BTD.h.

+

Definition at line 181 of file BTD.h.

- + +

◆ RFCOMM_PSM

+
@@ -1930,11 +2166,13 @@ Macros
-

Definition at line 179 of file BTD.h.

+

Definition at line 182 of file BTD.h.

- + +

◆ HID_CTRL_PSM

+
@@ -1944,11 +2182,13 @@ Macros
-

Definition at line 180 of file BTD.h.

+

Definition at line 183 of file BTD.h.

- + +

◆ HID_INTR_PSM

+
@@ -1958,11 +2198,13 @@ Macros
-

Definition at line 181 of file BTD.h.

+

Definition at line 184 of file BTD.h.

- + +

◆ WI_SUBCLASS_RF

+
@@ -1972,11 +2214,13 @@ Macros
-

Definition at line 184 of file BTD.h.

+

Definition at line 187 of file BTD.h.

- + +

◆ WI_PROTOCOL_BT

+
@@ -1986,11 +2230,13 @@ Macros
-

Definition at line 185 of file BTD.h.

+

Definition at line 188 of file BTD.h.

- + +

◆ BTD_MAX_ENDPOINTS

+
@@ -2000,11 +2246,13 @@ Macros
-

Definition at line 187 of file BTD.h.

+

Definition at line 190 of file BTD.h.

- + +

◆ BTD_NUM_SERVICES

+
@@ -2014,11 +2262,13 @@ Macros
-

Definition at line 188 of file BTD.h.

+

Definition at line 191 of file BTD.h.

- + +

◆ PAIR

+
@@ -2028,7 +2278,7 @@ Macros
-

Definition at line 190 of file BTD.h.

+

Definition at line 193 of file BTD.h.

@@ -2037,7 +2287,7 @@ Macros diff --git a/_b_t_d_8h__dep__incl.map b/_b_t_d_8h__dep__incl.map index a919230e..ff7d411a 100644 --- a/_b_t_d_8h__dep__incl.map +++ b/_b_t_d_8h__dep__incl.map @@ -1,9 +1,9 @@ - - + + - - + + diff --git a/_b_t_d_8h__dep__incl.md5 b/_b_t_d_8h__dep__incl.md5 index 3f896a89..a703410a 100644 --- a/_b_t_d_8h__dep__incl.md5 +++ b/_b_t_d_8h__dep__incl.md5 @@ -1 +1 @@ -1cf25c5527b32b2a9e530f3758fe7f24 \ No newline at end of file +6ddcb94ecd8f707ee805731d13407a4b \ 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 2b26b8cf5aa5f7248bfefec9e0301006e6597d26..ca0b23cebd03718eee0a3e43811c9b0c00548d5e 100644 GIT binary patch literal 18674 zcmbTeWmH|kvNejkY}|vpySqzpC%C(NaQEQu5Zv7z5(w^Y!9BR99QZO0hF7W%@}gF`zf;d2#?06`WRs9r%#8Grb*Z)st$2oGE&s}9fc&!*r&Q8>5D zjZCR{LThD*rRnc(Cv(l#^HgVA>NYfR+F;vOlH&#|RM+3plVusz5p&gn!HbXN43gN$4641tszSSqcRe zs+Mh6RFbiod0N{XchLfIwA_7$T_*(BMsIE4_aFlbP&eH5mflf0QS) zIN`@QZI@<>Bx5!%y9_uSHZoL83c45rP|MT@N8Yq74Yiuc$XulKG!_~IZe3?=iV0;BJ0@&{5S_?gqfY-PB<*7IV z?uDzB22&2>L8wl*lO%SO$AnLUm3z)8MZV8}%u|m{69lE?(->}aj}UQ~W&q!*3mIU@ zlmKSq#s@krgp1SRAwVRGl6=nMSSXdpu{5@v$|;N|;-4D~L#)v6@=)(^F?V;|AB}4^ z8i4TGi=w8nU8y&4&SW!p8THLGA_E)D<#n}~ z)^lM5JP1QZLf8^yB&QiH!hr^6`StejbLah%-cY4fGS%nfy^$CW&&x0Q&#|8bvvixS zL;?4ynK+fC|J#~F65vtZcDdT%z!NwTbwRro77di)HQVJ{%J#$1h$bfpIKSF29dLW@ zhP(LzABAY-QXsdb9-n*Fm+P1NvsXE$8(@<`Fc5<(5#V_ObZ`;`;7+qolvGr7ko7fs zZAnyfC}j?9n;zMQrmV*eO_tM&ZQK6*sWd9V4;Sk=iq3zk0bf0dityM7@BCmC?H`8| zsY7~iw8iDL!4zd6V$$;4=?Cxp`|+yZu+HDR*qRsk^X0rLKB{GSFM}i%sfUTqd+|=MD=MXG13<~@~AYTVE z3hME?F~Jx17g(%NlO8#F=l6f(83-o)!rGemb~mq7p;o4-Slm3B%{^Zz9#L-4;-)!*TIRQ@@et5U|P-TU^iRJX;35+ee(a-KXvpeV_R(Y->o zv|Ky_Wue#4_sG;KCpaHuLrvjA1}A|TgegGpDbXxJs{n*g66s8btL0j&z227#Y2-`& zV8As{QX*~(L99ub{~JreA`2jp7!l`jsnLIs|2@1@k#CEFa60d^tX7>xiR)4AA1U05Av)%a z2&J5M30{{H#6vV$dcc2ZQXJYDM^`laR{OE+f9~#n)e1DJ2x9a8F@C=N#G+Tr4OBZc+inKUQx6^q$F=;Q4+J23UL!mlZ) zGmj6fV)Y6a_5ps;v4jNkfNh26V5F!ho#QmUPx~)ZJ3W=2P|qB!&QoH%t|rJH2%RqG zs8^OfAqidHE-oXE23F#i8}>Y#0eZHbLf^i93#O)re{-e&$apfFNXz3UKAFHk%x%J3 zjy?DSs;7luTeDwtR<%DP1>2i#y&zH$xp!`hih_@pC*(Yp&EmeYZRvp7z;FK$c}r*7 zl=OR5EVNmCVKcrM&Ng1ql)yiDzZnCg@><@=bN1WXel8I0qXDhA_%fCp)#>wpet&H% z#iUhL?R1muFhFIo{L63^CYT}>r#pxd>1uG><8c9Hzrqq(sZRSlb!V#^-g+3BGBeOk z?6p)OGx)al@*eLj4yGcJ#E1|GU4n?x-xP2&OEnS4TfVR`5@Z^cP+M|rh;c-(99WE5 z6O8X+h*}w4TXId7jwQUVT#Z{VY^93GL=VW8e4rXF18WK9Zl`>9rj=yf7MPh@ed$bg zMWf}ycWv&=+#%!?$J@jFn|S?KOlL{m1>`SWa1ICKVdd8Ia=@j+OSQMU(J1EY^FSz{ zOkJl5wR!P9A*S!cC&cr-b7V|E3LDA<1GrEcR_o>}X-J(;<~S?$9wE0To}n;^uTlfG z+jLvjk6*94c-(6uP;ylyyqBu)&zpS9*aYMi6e?n;1YAYGp3He$AO6Bgj*1YRf9dqd zRTdc*@N)9?kk*~la_PHyeaJ0XYY{eT@ccv6oFuU_Eb&IwMctE{#R)mfbj8JsC-9{8 za$LOXKOrKNN{3ZqJ>U8InVK6qNLxY#&Yj_*vYB=djzRB%`~7a-B}>R}vv1Ul8>``7 zGg10eM~viXO%BZk3r!A^&CyuBJsl`I5MiIn zr=6SS{_)m`Q2yZatgR@4+IjGcppf_4koJj_+3%E$83(ROSG$3{@cXNuw}Hof5>ed? zRm)zL%7qDhwK`3x334DPlTScVVcHv08YD&L^znv;-B)XV=^DoNXFQdjy~R#PGAd3! z?bjJYrCOO|Y98JOc_dC6zTe~Kes`CKvnBpAMs<_JiWAGlit}*AnR`!yE2zFw1Cd?S zcj;DBc^Mz}>IH-}|MFn3m>_I0!O2&C`~IplC-~TXr2$oI4#n{4Ydsk<-keH|3%|*q z`Pxmb?y?8kBMFG4);dAKK?ZqEjIHU|^wsiU#p zSqL~&CvEXvp2SBr6tI8Ts2N&ZZ~{V-71Nop7`3nYt}t>J9fg7%9xeqF{okA$l0jsG zf0(tHgbC_Sj4~b>o)8;mc1Aq{>oEtFcEDl zv0c72{gO^=%Ap;;9T1?imDdDwHW5?x&`z0#DB3>?2UpnYd?dR#DQR>xRUGXK1M7J_ zV~wq{{XNpP$s(23)#5Mq+|IX&^njQE=;L)qV#JJ3jH}(x#8k>d$NfQS1_TeQmZ+TI&&l%~INxHVqyT9KyLr9Y;KpCBEwVVkqba|@PO?OC% zp@XwNwmVOh%OrjgQ1RKkZ(Zj_dLlUhOGnlN*G>PaL)fN{9$;qO+>2-Yy!y4{vGx zqEk}w4`tiQF1K0gr0tfo46@6a0r4aMX~7Y!^v!x>-j?A>+aXF-Q2oD~hH*<&Rqz%q zF!iR}TMx^5w9_0^Efq&cbBQMby-}dE`zuraZZF2v+j@!Wbha40j^3fa=*rfHk?XE` zC$Py(R$5!wE)=EJ_mLF}(Uu4E1{=b;ZY%Ewo7?3#na_S4{5S$31~P7p--|Wu16^xE zo{vq5ZY`&q6?Nx+{NUCnRDKk{m)EOo9gf}<#@}uA668c@4OKKn`jra-tx(1|6nMZz zEdrz^D3LU>>L@UY$(60M8h5B2;lS2- ze>6lu2e%pye@RdLFTO*&%K=|qpMS_^7?t7Gc@}q?e+T|(#}?utVcIoF63919FBfg; zsqsY9rY>{EW4KEijw+geriFYRSyo|kAATe@RpygQZTGz5>c!!x!&ouus;g)oidxd3 z{-=U5o9n?D;SE*`s?W=&@r%2COr4`0k3%Dv~ln z!GXI#lyDKM{+zLa>#sj++vcL(Lt>?=F56u~A6{jctzt%s|0F0sEyN$qnC01|vKTVn zKCY!ZERGbPTM`SW-{r4#{q?X@k@u&sE`nsUGK|EY_aC#uRQgw36^dK|?}54>{`aRn z0<5?dgt=eu7mIB^caTEE{(y4ODTD~L`uhIzKK=nVYI!{sPU#6WhxGq?C%GO{cUDaB zWAOprAs(bXOd-l0fC7OYVUa6Xgc9MP1WT>7Nl2x9E68s||8qy9j=?v_J+ zIe`mZ90u3m+e8^C-0Pm}LEM(hw>WNm`gkGq0~>P@Xf}^?HcD%7@QB?{YYD~YbESn8 zV^(B9mdiSpUkxXBdb-9t070V2?g*4Zg?=4=ldg4&W1AKpZ2y>ierK z;kFaB7JWZXDc?I)tJL-EHjGY#N`4jad_WvKslZi2Uy3x%QW#~{PeuBTCvf89td6K# zO^0g4IAlI8PK0a~Lp6;Wh%Q02MB8;zuqhCVlt@kk1p={`-A7V3-9tQ~b zP@7$k&<+iV5qyc76XP223#HZz(2ticU=8NdL<|Go%hw`@esG;lBHFGFn44zeR9_h% zFZcSn+su^|&C@748YC%#;QqDIyJR%e(#YW2m?1nvtI!OY15u)5+I{|b+=6z^bZ|t+ zRdpZL0!hZSNsH}l^yoHsSa)mF!opb{YZv3Z;}}XC7&T1l6BG3hgfLdxo#|Ac$v7Pi zbnpr!ebI3_l}mOa$pI(seUlH`B>|H+@j?i>^uF5Kmz!SiyeB$$>|#6kk;s};jqLj{ zS6XF5P0Ii~C*W+X244kTg>HjfHZ7bl4+%R}0)sqWf8YzNzqQ$HImu%J5!3)X`}A-T zvDlis(^xq5BaN{KPf{)~I8Y48n@CU-pv#57_T<|%Tt199ZELLj# zQitW$wCY+Q{R4zWyuhJq5eiiO5-yA&$rQ_VP+7&x{RG{t$7UxbqjlWbDU92XZ_+f5 zTgSL{CxKd&4UmOWk^?`5Ue6P{v5uHtw*O{@w+y8l*xh{(xidRmXo;Q(_ZJNKI6pUi zL&=lSw0vyZwa+VRLrG$KKm(ebS3kQd>_M$t=DuoWGAY~}_1Z5oI`%_640D?OK0&vK zFqp4OdV(uq%8=3u8$$1Q+%10}AyHGx213>)?VdBX{D-NSb{dVjgMLaT<=>n}uY2fs z)p85VQo~sR)+~MdX1V|ZE6nEOv?h-Q>a%it!otU)tfL}HSIHU!AB2Y^81?DfSp`#S zv6|gxuN%b!4=g4FW32cZ-Wu%sTO7jkK&$EOHp$N{4GoA(7U?vJV>XMaFDqcc+2T4b z(XJ-r%I=p&Dzev}A8df)p#)j-A3xu9g15MAuO=!(DxF6|6Q8WqbvkZiFI3Fyr-k92 zy|9joHXFZ1Zq6D7hJTi0GmDHB$D0Ty$C{4=@R3brSut|ZO6UEz7pH;khX&K5lmv4g z3h(Oygw|&#=rfoFxQ$;whH69cwT+56ysinkR3(>{_qi1;b*<5OycqZNIs9e4O4rSPh2l}=G0`Z!BV;{CXC4^-2!5JNA-wNdj)k07)2_~7^Y6sq z-!bPlT3iHdua1{N?U|5ygwqI$g6=7H9>HrCAkl$AP78M>;_@9Z8mji&XD1T#+8u~=frNJh8UyAe$b4}~*-Q3zK?(LWaMA5b3< z#<)sI)?%O`U3NFo zbTQP_K1^}hOsK5~l45B9j!6pwp+oF|Sxj#gv>!nuwyJzruwInH1=$0o3`>bX&D}Ts zjll2_9R_rp9dLPD?XWt%HsBhwEhYRG8lu*m7nZU!E!;+@&z0s|Dxa>a6Eg%>^VR!| zQ9cG+@kY58bn10%4!IubKE#3$!u>r4r%pAOk22M&OEjeM{BYLiqgvd$GZ%QnoX|z4 zHsyj9vA`-aAx}*2lSysTxsk03h_4H#y=24}c9y5rkx`8*f6lzkPA9C<0!w(`<3g+F z9$Tyir-DZj7S;Gk=I!lPZms7vqp=$LC^iA=&0$QnJ{xd;eS$ddj4V*aRYw^Jx`?9q6O9TOwAwFimSkdjJ=fiWnG=2-sHR?4U`?SM0Q^SPJP zaUn+{@0?sjK2A3jGMP9qE!+VyhvKh@U~cvOMS3}{^0rxS`FPh;VZgHxC5*q|Za_W) zx`hgl3-oa?WIEa#_D|#M#x<6q%6e78MXK4GT?zEFTwFsuPCJ+y)!ND@x!K%xg!3{B4k9b^W@y$mfd_<%uN2H z_j^_?Zery%OXO&k(;cqqsVhjGmQE>8PP<_+kA$|w%#PniqY0E9?dJ(_5`b0rAMRC@ zNzDNr{pwD2OJmDSOlIyJ5uaPQ|BE$V96?)7{qHKd)b$iALjKvPd}sc9ibRl&@4c3G z%ZN(?P&GGL`SQNMoJq9|_zi`dr*3t4Txl2V7(l0F zan-w?)N@1`4p~;3KeBZ>V?LeL5+s;MsXYH3ONYZCq*AkIa_&BDobn$qg(3x!^9?}P z5Dpw)eXtQcF z`2$xh`?Lu=8~!?HGU7tdM6ew~$ZKK?EzRIw06Nt^{hZ!v1YlG*p~koyK7(YK%;f%I z2nSBGc*JE5r!X8jTNq-wp<5sC)F(fwrRM;sVinn%;GmtF@XN)Y^Ot*A%z^MnL7t}y z!@gLuHTSbLbm4vMGYQfK?6Yr9m5|P#xCWn|j}A^V_}s}jtyM)&a<96ZWO#JeUskm} zAn_H);0ixb1!eTMye;W~t`%Zy`^BN9L%N#h`nfK3YnsWh_xoGy5SabXB>i!N($CpI z!o1%(FIg_T{;u>CQI^rS7XH-k#dAja9t1XJ2aM)-UQ#iX$PJpr<0s218 zfa6-^>a;@JU@PCVC2{ombLyT)|fNL&r9T$N`)-Q!Ga#gpn zTPPGG4c3=b%B6~JeTtfB_i_Oo1B+Pr5Vy5h#eICyMvXB#x1X?FB;=PhQnUYUe~eRj zU)~yMNr4OAf8<}HNoBKCJR^|kFvSIGLgbLS?pV#5wW`S5g$mo_w`Y0>0^{L7Nl8X% zanjrc117(-4B%Sm@wcWMo_|d+|COkRiKuhJH6L}=?)}=f*I4#hZ_GDvo1%Pqt*vhA zwAJJWDdxl;N6emYxDdZc|2U8izL64D zNX0#I=FP89ik07!LQnfC3GoIS5q;c@U3g=}y1aaf-Brh7`m(D*DeFI~Rkt<4_ns4N zv`+wiB#Ry^3Dji`Ug4<(vH3fu1U{Be8>3RVKsTh>X&ISKK_N}DwHZhyEfEk4vU%4Q zy|`P_OSW1lAGrf?nCEU<07yTcCJ9$_SohF&Ud5oQE}Ac6ri&uZsW9qDH!@QgLoDQi z8LM|0NP;`gEmJa-)~Yk`T!kxcMsgGWF-UjcaU?~HQ{Lk%ETiAGwNKr$@dtpcTByl_ z>KYo0wCZlg9Ur*21u6+kq5SEDRE?qt?5vCexdJ{sMy&c7StC6J+9|o3(!-RqqiXZJ z8;~Gg`Au~egCMCZzCJ_P$YL?j@5&ek2S5!Ymj`^k+rSd5fi3-Q4HS^yC3XQc?z@uE zi3l=&ifkUulxaaH>FYS|@{~=i z2ZAr6C-MY+A?4xJ=%yV>)*4kQBL@bChf?}AoPIF#!tlDbdYVlv{Yd1xu#d;2MJEJU z3^wQhGd|PN*o?D~&`|aG9A18&xiV&Z?e&+33tL^{c8iTl4f>%|yWy@>GD*2l5n)8| z@Fxr!bz)%%9fR1jw+X@@JTwfzBL_0+wGztHxU-&8zgf-4QzA`#PZyxa>WvWz?@y84 zeow9ssdPQO#@F?I%scN5dut?^Po%A)O9%Kl-yN%nvv9e0WdMtx%k|v)dGT!rIcV9y zcT%r;*ID@EiQE@U&eW@ScCx;Mbi_1PifzMvS%0BeIza~8x~lQJVy+y(J;mDO{v%fm z{q8l?&x|Z~m+K5Idz@j}W3ID2m#R-HfFj{E;vH5h!9XqqX7aoL`}c;I0tVNW)dduP z@o=QV99~zS$swl1Y%Y5;3oxXr+KNzoiB9*krEm?dCAOEH5LB|ck~Bs=)t9@X#|IdX zd?CMX$!zR&;Q)Vc>bHU}%jvvwj8lL@8*wAn@9|kwLX|kgwsX1meZ4sBo-@x?CGEbQ z;*-nmB=HTlRe(msj#ZFUpgTy@b6`zTo_K*s=96p0`p1HbfUXlnI^8N#*7u_@@{0?_ zv#%@D{XU2z=evNCuX(?8^*^MBHhfUGH#-`=Ta7y9#DXMTi+QIQ9T~t<{O5lu02ImH zMS()Wa#J_S#50kH8R}(o?c+AvWXo1P^IEG(mFD&8-dCN6x zbkDKtQLfzm#_NJ4fWE21bS(bvw5qQ0HjT?}L}!Gt4q(o%`Nkzu4*?$UZcd(gc3w$% z(*Kuy_<|>}aTdbI0rTwB0{fbZ)n63yg>wD>zI$4_qNAgidt9v92<+$1Krkr4qJH|t zPjK-&H*Q>IC>(jUYtt{(QwH%LrwGuUwB)$}A!;+*>~nAP0ssLy%e1N`JAxUG`z^JT z3o4HJoYhnwz@iW; zZ&PdG&cL!XPv-KsU2?45zQ5e7z3cV(xHHl*B^2P*8wLFNNu7I<&+o|u&|h&|-bX}R ztMpCLeNMX&JCNceM8oK#oWH5NyC7P1`NMQF%G5>+?DrjXm}J z^IP_w6gE*33~gYHs1HEE)%;dkYzfgmp7v1(|Db>%-;6}pdVD>B`ko44W|d15g}33r z_LYR+QxtP}3SYpI2^8{9muk+w)b2$;*BcL60lPZoKX40Y=>JT4mDt0nBidb?t&j9k zxtEAKE=EimI_C)xt)!qcZR8jnX3hOC1k+lzUsQ+*4J;MXnGH23x9W`{je|oIRLT@{ zz0%9pS8GmP7fNI?7MW#26STIvy;s@QeK}9)47%Gf9_`m#Z)%md`L_8>V0TBMaEMu< z1pVUONVEYsqNVA}@Q6>l#|8dkl~%&$Uqvlx(1~m^l?uS+T8+gMRX%6*8&wxi&!lHK z8E+g;q)+qu-v02>Ma~dEF2{DW{yAfD*iN)un(|Hp|75r@!uQ$Rzt6~li%<}pXbDr<7 zkDdZgJ0YjuckBUh$*FiWML-zE%kT*p%ZeA!@m}?Pyqv{%0mY+t9LC|)%77H#*zs(! zhQJmc6^es3m*ZA-y?&cRZnP!S`hY6R*hmZxk%Al1{n@f-_n&e4)2$3v)0H3v#kQkN zt9rFOyZ9hT*v^stL9P7#Pp)^BU+y4B(UqP+MCu}$0%-83c;pyEyYLvwn>uXs{fee@ zRIeT>jCxD6U7n7qsPc@MOn={Q6ZCo+?wvRsx4wAdUl@O#_F^k#y3yZ*Z}gB~R`Go# zySS!MKH!L;X5d9mQQtIdG>aP4C`QF~{Uyn-4N-0tlm@?bMJ5?-mEIY@YZB{7(_8v+ z99|p!mi>c`u!SqxS&;48=6hXK#FwiR!H6eF6YXCvc+F-BqHcc%5t++ZvD*{*FWbeV z>c4@=bRz$dApA~<=!Ag{0kfpsF(Qc`&gx^(X{4Ew*oM7t@Dv&s9jyPh?{C>tTpyp z=?^ZN+6-Zb+S$%&Z-~+tNJaW<{~Uf##m6QO`5(!|!6id#jNHz95~X`L%b%VyXG*Yp z=bq&tnb58%Mj=OqYWEpgZVQIjvpSRE+f*N~p_XYoAgR7Bh+&0-VWF`j{hZPW9m`K; zX^oA?#|6hdMhBq~@s+qCL&6}z>GgfR>UpGV3iz4>h)GKSEPs$Z49SP#z{D(M&KDfz z2jqF0=@tsHFkq47ozRMXoHtF+0erd`s6#Av(i>Sgv*lJIX0v=~Z_N zzh+O#wY=2@a5D6Zs&V+7Df{r2MI?&KhKHw%!?;C83(r6XMj?ZJr5KTbYQ`W5MI;QHO|OBb0mTiNA*7k%qjul#ofp2)$PYjvVK$a^KA;P z8eO+&Icsl$rm1z}An_gKwy%PPh*qB09())qm4-3~X?tE3T!JvYu^n$bev|jxjw~V} zxX{x~W;h1NU{w4)61jAI$y6@CS`Y;Eg5CK=+qR~UJtNVEpvfo#PR`%g?Z1&DQO%Cq zLhi45zLzQz_&5xMsy>3)2Q~?759RmZNHHX|BK^{o8DI{$$z;pWD#4~E^Snm>k(1`tIB!J~d(DC)t&HicYL&L(HiAmw+{NB0OFc`E}0rW40AT&pkA_;rl z?mlw3Flw9wrHxa1<^aD4%Nc6jelvt*MEZ7_g;UH+v?8So@!yQh<*qx~_{msr1>-@+ z7{k8xOA*GI*!3q(Bkoa7DCt{Yfkfx<#yhphbx#D7y6HdKf|#g$0ZR z_ldM0f!LIIWjbGY`x%Y`xpsxeu|4NlHsp7fB=3}HMnBQ0DcGTQMKBg>#)4Q@DA-Ao zMSJv56`J0mn$U&=9-HNXa2&9`V<%pUjGGV{-~Hp6pkp(}K>nbE0&JtW3TP+1db_2& zmfFW}QuEeUC#DDG6^I;Yb`oHriF3JxO+S z10|nM=F3igB$Df@Hz5Own@04}w3l&F32?C}Vu@cXt8f+%EHLu~1@rTN0`ri(cT7KgnAm!){aGY&Ms9(iW4r8jq@! z;CdT^k{EJ2{FQ0bLyeSF5W&t4weD%LG{WS~ZNHWx^mZ*?#s_l`1B-Gg)|4KYK|s(i z!VQaZ-83zv*7+HijMV5)#XWaykq`hgwHO#o`$qh%IFk@H$CVD~J{4JY6sakImf(6={?t3EG*H?0mb=Flx5Yaxnvn{7+n}Kp-bo41hM)Ocf<&16g0%o;IE@i(Npw;sqhAjl=PAAjqhv z1xl183r>VHD8DX{6^Y&${*VMLM4(#a8wp%S5P*RTmz&^)wF>-X$CHQyu>(Sd{}ogH z`qwWLyX|glYW2U^!2efJ6}SqgJ$|}=J}UR|f4|xUgjx1&pPIb=95-avj3*8!BQsA8 z`mPd~{MJ8{N@_5~y$$kMKLv?~ zn0RI@@6WO^j{yi+y>wH+FM1Id5Al8nuk6ZV5B-F*@T4z1XfqoqeB=r|L6SB!q@<+C zuVGWu{!@s5>OggreZLg-{Vfd7xy63QF9&j27;YS`o{R=KV2O|a7)3RPM1HFVp`)ud zDP2-~PrBoH+^K&xkc0mO{%mVW!;ArI%gV_odI7Sw;sPWppx6;hHvDJ4?{ z8;O zW706USgB|~x>`^V53^ws?@KKpI;btz>f1_aiXPltc2#+!e+_%Nt04TtkF6e*lkv#s zd5iby{8p+gVn0`zI~cx|DRGeCAhF>PzegjSp`A z$G*`|X{wFu>YlaFU00vVU_Zh6iQU|cxvsElqPNw%Svx+&r;@WFr>K4^ zYJvsD^j(~#DY&l|vZ4}T=acq7hD+`vnO>e@^H zJ6~2#+NBw&!a0-cgK-Bnpyk<2b{vhCTK%q{FGs)ezYPzks8?${mj_aY`74%#sz_XnoWHZ4}dvKS|u+sy;?M>S5uzJ3K+YE4s zDTievQ6PYfouyg3u}>x0;j~NVxK2kGCG+^>X8*{0`xL`rB#+NMh)T)e0-G9Vl*C92 z@EyVY-`4SiJl|-*1W(%dRlO0?aNG3iuV?4P{@TAW&#cW$6?18PY>;DV2+I_7 zlB=&~j{saQR?L2{>j#CObyBmeI0QW-Kze#!sK&#P{m&Qkz?~;80)*Z1&cJ*Mm%R

~t6NO&WY2k5y>Yl}E+hd!OBMl0=*-!71OY^*hy#wLax!*P;GRB)7C4izhcuC&hz`0DJLUZyhqQ#}ujF zZIBiF4ayMyEBxMUTTzet{N}n_sn5!~w^8c_;EhF(_TR?-38hZT0(Q1#0A8K!jNDLV zqPE^)KDFv{yAKPC`O?>L-zbaEZUrL$r&{SCTg{}<)daFDD1*bgMVI=D(GwRm_(MU= z3>0WKp(b3DibQ-apMJS_f3f8Jt$1;=R+@jGF?6lAm?_dnyhNvL>eWu9IeS^zv-oj4 zAd>fx!jZSGXGuG%Gf}_E0;@ti0$=p^IseJa{p+gd&43wU*8@~{!A~|uME`Hf0|83e|lguP+}K5Mn*Q)Fk+mcG-#-6%G8KeSE`;Z7-(R zeC}60kg2vaXyl!9)cMWS43mGb>C|aN*e!cy@Yq5R$JW`W*)5qGAmbLJv%_oSer#51 z$mb6aPjcAadAh#Mq6{ zz(pSv@4xh#_)fTc-&dLk2+ABOPlbFR(2;SkL7euwvuyVSEJopLV0+7khAvg}0FyBI z@bxgQ@XN8(&iU$udgJdiK(M`8uF2?`8hNQeVJrh@ROIt?ts@!9ZmF2$HqibjQM&h_ zRELFDpG zN2kr?wYs*F(O@uIPPIg`wr^4;LGbOCP}eYo0995jf>wG8CYvsEMu+LN~rpUgR9%? zsweI4xY&~*sV*}!uy`t&Iwn(6W-BG-v}X5Bb_d>!7Abio5pXs2O$I#+0j@NL@oxiKFYB_i^957Y^kAK4$#Gjett9}0`W)AOBc+5 zh=SJXNi1Hac~O`rNHB9dy?xXgB=v1olCuLhSrW^ic7qB|1T!X;5S=U}Q2(DtGH*a` zw8c`4Dz?Rl*uO;CE$&JHehNA_LgQ0l7~jM9ht~KtI`8_j+2&`>rtBLCaawnAAW5l7u=p z*}#;HL}Fa~=NYc%^`Qy7!O+wNfQ}esa2!v;DR(&#+cmdJEF*o80_Im@+#=P78sS7N zvwp+=t!zh&6JcJ3c627i4;lcKM`BP<&F?3m9<|Jx0^#!JJSQ8j5*d{7MT5b4wbawHexg zNr7^6a{xDP)SfKi3l3}n)hFx8+mhk{WIW*7)0r3UlCmACCZ&8?4uJOAN@}D7kh^jF z?5=NYEd%0>;cGCt6dKJ)5IcVWrEURkR#)0y;5r@Zm~{=OSV^Pm#0gg07F zgEaFzd~ri{k$#>p*{W_^ks9H&rOghG9lKlv0-Im#yGhvxC=qCI3d$7qcl?Tpzo#)) zwQt1btD*UgDH+Pk4@rX+X*-kS3&s1m{%3vn4;G-4T7w?Zf7-0N-j`(L5xJS+sA&~o ziYnv>X=@TyRPPAAj@^A_^C$z zW$GwiY#@DvrPESUF3!LAfNYqFaA<6Ra&V#VuN$2z15-f7>IZxvx9U;@Osx-rXkc9f|?2S~NXDXyw zJ`c%W!b8;l%UIk+wUHUV4(>o+Jv;x)YMM5;?x<9#=Qt@hU-nq==iv72D_d`}e!Eku zNcBjV)z<__YdoVlt!U@^+r>PEOcd!R)MP zEPlz=MoK)9%-L&;$*kESRAD=*rONG@08NCWsnSAn={dF8qA~`x8a;=OFu`$T)>0t= z^eq5}_A-*%W;3_i6N5c2#^s<9ax538IE$OOfu1#!eIB506n+w9KAbMbJe;qZ>VEjJ z_qx$0K3q*p0Apj}>494dui6rGz*t^3Ee6Sw zHv4rcc8gzdrL>)SI_*xRHQEhgT5DF+a+!0YBQg1n$cbAWuGF7%`4-hzL}<9|R*Y=$ zeAtxIFFQ{O=+RC>U{UGToNmAKVnhH$&+TcJ@O{6j7k<@FkHaP(MD8_`ko&^^Si++M z{jxEcGQgs+xWc_X>3eRDbl&GfP{+<=68k?DT5mMNSZ{W^TR&azu9XrZi|tG>_n8^O zI1;2}U)kxl+Q|aTzs)64yi&;Ghzg9$EVNr~#GGzEO4Twbe7-%R4&lL*&SeOb_+KIv z`1t=jF!mMTOZ_=$p&7sozuri;{RRS~0GMo3$>noD1`@?Wo1RPk4xJISAbI)gTso0$Z_$azbV53&99^}tmU#;nM8cP~QzBF4Uvip5k$Sem2Ht+f& zQR^vf`7FD0yrhj@?oJ%A!?j&hx;*T|3{Mv-a#8Kqnq?W^gBR^PTn@^Ohr$6B;G+ug znq2GVWME=*9+>Z}0EkaIgtQ#tx9boOy_$;Ni`I3xi3O(xexYvz4W?tqHEml(%)L)y zaqyPkxrA67QKxcvf!d;`C>R>CvD8n6nojB=h+U1>nGAINJ_G0xdLBO!3HxtkQl}NR zSj~$0P3I)K>`CkZq_GVxFtK@Y9M6C0G>VGP5eb+u(nZj_6Z;A-dP+=o{ofE(#T@(CuR9_Q5e)K6_QetBn?pTX>|Zqp9+BprTJ=Hv$57< zo4cGO}3aE_Izg7RL# zkSUxnqY>`{5K&d5Fr%;#aNJbtfMKf3Yb*V;%TFSM03kiMY#4CS@+CD9`ETqgq(c0k z!%6vz^){{K-@rU6|278sYkxQ>Ti0ChDk4t^Mm+fH`vVg&Uz>iqSS76_^juPL-)4K* z55N5v*aN=oK*t3F$L>OZK%L?~nt;z4U2pdXu-S$TF)PH8h^htu-I=QO6rM1z9fm6| z0upnXrtfIOE7kuW=XkObyRA~A%h|^BWdmTQQ4S-MMsB4y1_G&K0*(tK2!A2Wkb&mK(6I*f=bAwme&<)?nZ!()vOfhgst+uxvBQRtMP7>NaW@Kmhw zu7nAK4;h!zfJ4*Vc(myb+P!XyLZ}7efwRT$RS{7ck?2>ziDZ7h-lo*0;BogDzau#6 zi*IK{&57cniE(Z!T3V-E7#t$}(3wAb>wkQ*4^WLfLeIZ3+FZO3LF|AmlRo%(pvG)^75_^DMW={b{cXh;R%gu$1yo zCe_*q0}tTs5&s6jff?)+2}C-i*j*xikEc+|93fyXoNb^>54fsUt8~DF+tCKL`5Wz4 z*&bfBVxPoIMn41B3A~AXEHgiB&sBsaf#B=Ptx)YQMi8}u+tami+j?*SI^j2-enb)$ zvB2M0K(ry_^OV*r*RYxvmSA*2wtuMx1A{C0_qPB%uQa#c0p2h9%v;sr?|XzC`7gqK z0fXNM zF7k0~UKZuUwNEQXLC?1UB-Smv8&Vg|%Gbc^wVN~{940ttqp@a3}auRo>cNKBxIEqEvdnN~Ta5%mrp zNm8&35jZn^H|ioV#gEVJaGt5Y%y}AYBXhsy>XtG)M-KRpeMf?I3b6yG%{s~DR^{A>WIxJO8P z#Dy^#NTQYpCb75(c#ygTrCdtCJr+~|GJKKmWrwu>jxVwX{U{kBzGyXa1m}$KkQ%w$ z3GW_VY_}X2Mq9G{(t0S=;Hm+q!F!h9{w(H zT+JIx0AllZ4Lv`-BA9pIWL|v1@)ATlx|8kk#^3j=fNtt@J`=S3&bT1(!N8erZ`XVD z23!OE^?OuyRqV$K;x*Vhi|ddYJaW-JFh5}!p-6^yDkob&$U*rTb=ZV*tEwxD4Rjk8 z!X;#M3|@q40?}hbvkR!RRQ#ZZxQ?gW>{ij`xYE2wBZX%0Lu3)p1&xr7X{}j`P+6=Y zacVyQX7PSKNH6REH2bt?YiBgT1=Ab-fS2Gu3t=E)KUgrbdV%Xe+~2N*NF4CSx*L%o z2_W^k$<)O!{kQL;9kmXWz_H2b7uPQg)AkDZe*tX;lKKL@A6nl8>SJI6LhZ^lXgIkZ z1%FpGNQtyTj3FHb*Q^<=Vge5-6I65>bLIY|?<-G?gP{>-jd8;`YR_hCB4yOA2brR;A2aWIW z%$YOY2r?u+U>5KVhb}vq;E8cCG{USgZWy7)3yKEe2hbq8fq@J3P-X@Y1+84@EqnIt zsq|+M|7ii{`RFhN5E(2<0V=IEDMrPaqy*-l0Q>Dz1>Nm~l%j2hf&~fp}p_ znyVB+C5o}XrcIkFy^kjTNAoa)g(wfi8vQ$a_H5@5I!EZK5eGdq0wz0JA7R@$LNNRwt6)dyJr4pqaHDN_{G zu+@Mr74JF%mdyBiM^FbWuS3|reY?s7A5=SsKz(CG+g#rP!QUNGNGkBX#xh>lu>>v} z2E|Zediv&Y&mrl`C>mkb7&lDx?fTKhj08GM7!8@t{ouo(Ss#O-f^gy^g7UQhF(8b> z5C?rKEV&{6hDZauwLk=`1>^z!832cMH!p3`Zc+L2<&{MtB4DrpP8{o1V>v*K3K1&w z(!c{85paY49+MtD;pEAa&OX9;;3X7FTLN{OoPcQ z`U?97Yr&{KfTW6-5vhqdR3dm^P(Mgo5PZEOn8-u?4sj&X;~EBNm{{96=;@nq+voZY z2>$M9!rlSQ0@k3z)LLif6WsIw`cWSu!!Aq z>!`JQ2kILwol(bV;BU2c)J9?HE1zI#gb`!h*E(v$IBIQXVwWQZqsMsM66)mLLR7hOW#`f|&-?f&xf;TF-j{1ZAl?!1_m04B!Brg=)OArJE0pAGtdq<$VhC?I?<{=>Xn}@BIvp*VP<`_53 z>RW4w90dVEKoAfF1OY+7I0S@H8;7OjBnSusf`A|(2pEol5Ng9Al?(*|K|l}?1Ox%& z5b&v^c3l^3TygQ86CA4q>m?^x#IX0R^qp_i;9l13fQ>Pv4~$3I)uW*Cx&N0VHth-3 zYuekGFo#Ei?SweCI;N=dq!K`l#`qu7yCnQHL zxEMHX@${FE98zGhcW_xrYC%8{5CjAPK|m0Q6au27jug^Tjvyci2m*qDAP@oqLa0Lk zO&$>h1OY)n5D)|+g@6$1NFgod2m*qDARq_`0wEwEggOM!c(7 W94!h#B`I|P0000B`T!q4tc5v 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 literal 12208 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 diff --git a/_b_t_d_8h_source.html b/_b_t_d_8h_source.html index a961ed8b..42189be1 100644 --- a/_b_t_d_8h_source.html +++ b/_b_t_d_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: BTD.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

- + - - + + + +
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 #define IOGEAR_GBU521_VID 0x0A5C // The IOGEAR GBU521 dongle does not presents itself correctly, so we have to check for it manually
31 #define IOGEAR_GBU521_PID 0x21E8
32 
33 /* Bluetooth dongle data taken from descriptors */
34 #define BULK_MAXPKTSIZE 64 // Max size for ACL data
35 
36 // Used in control endpoint header for HCI Commands
37 #define bmREQ_HCI_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
38 
39 /* Bluetooth HCI states for hci_task() */
40 #define HCI_INIT_STATE 0
41 #define HCI_RESET_STATE 1
42 #define HCI_CLASS_STATE 2
43 #define HCI_BDADDR_STATE 3
44 #define HCI_LOCAL_VERSION_STATE 4
45 #define HCI_SET_NAME_STATE 5
46 #define HCI_CHECK_DEVICE_SERVICE 6
47 
48 #define HCI_INQUIRY_STATE 7 // These three states are only used if it should pair and connect to a device
49 #define HCI_CONNECT_DEVICE_STATE 8
50 #define HCI_CONNECTED_DEVICE_STATE 9
51 
52 #define HCI_SCANNING_STATE 10
53 #define HCI_CONNECT_IN_STATE 11
54 #define HCI_REMOTE_NAME_STATE 12
55 #define HCI_CONNECTED_STATE 13
56 #define HCI_DISABLE_SCAN_STATE 14
57 #define HCI_DONE_STATE 15
58 #define HCI_DISCONNECT_STATE 16
59 
60 /* HCI event flags*/
61 #define HCI_FLAG_CMD_COMPLETE (1UL << 0)
62 #define HCI_FLAG_CONNECT_COMPLETE (1UL << 1)
63 #define HCI_FLAG_DISCONNECT_COMPLETE (1UL << 2)
64 #define HCI_FLAG_REMOTE_NAME_COMPLETE (1UL << 3)
65 #define HCI_FLAG_INCOMING_REQUEST (1UL << 4)
66 #define HCI_FLAG_READ_BDADDR (1UL << 5)
67 #define HCI_FLAG_READ_VERSION (1UL << 6)
68 #define HCI_FLAG_DEVICE_FOUND (1UL << 7)
69 #define HCI_FLAG_CONNECT_EVENT (1UL << 8)
70 
71 /* Macros for HCI event flag tests */
72 #define hci_check_flag(flag) (hci_event_flag & (flag))
73 #define hci_set_flag(flag) (hci_event_flag |= (flag))
74 #define hci_clear_flag(flag) (hci_event_flag &= ~(flag))
75 
76 /* HCI Events managed */
77 #define EV_INQUIRY_COMPLETE 0x01
78 #define EV_INQUIRY_RESULT 0x02
79 #define EV_CONNECT_COMPLETE 0x03
80 #define EV_INCOMING_CONNECT 0x04
81 #define EV_DISCONNECT_COMPLETE 0x05
82 #define EV_AUTHENTICATION_COMPLETE 0x06
83 #define EV_REMOTE_NAME_COMPLETE 0x07
84 #define EV_ENCRYPTION_CHANGE 0x08
85 #define EV_CHANGE_CONNECTION_LINK 0x09
86 #define EV_ROLE_CHANGED 0x12
87 #define EV_NUM_COMPLETE_PKT 0x13
88 #define EV_PIN_CODE_REQUEST 0x16
89 #define EV_LINK_KEY_REQUEST 0x17
90 #define EV_LINK_KEY_NOTIFICATION 0x18
91 #define EV_DATA_BUFFER_OVERFLOW 0x1A
92 #define EV_MAX_SLOTS_CHANGE 0x1B
93 #define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C
94 #define EV_QOS_SETUP_COMPLETE 0x0D
95 #define EV_COMMAND_COMPLETE 0x0E
96 #define EV_COMMAND_STATUS 0x0F
97 #define EV_LOOPBACK_COMMAND 0x19
98 #define EV_PAGE_SCAN_REP_MODE 0x20
99 
100 /* Bluetooth states for the different Bluetooth drivers */
101 #define L2CAP_WAIT 0
102 #define L2CAP_DONE 1
103 
104 /* Used for HID Control channel */
105 #define L2CAP_CONTROL_CONNECT_REQUEST 2
106 #define L2CAP_CONTROL_CONFIG_REQUEST 3
107 #define L2CAP_CONTROL_SUCCESS 4
108 #define L2CAP_CONTROL_DISCONNECT 5
109 
110 /* Used for HID Interrupt channel */
111 #define L2CAP_INTERRUPT_SETUP 6
112 #define L2CAP_INTERRUPT_CONNECT_REQUEST 7
113 #define L2CAP_INTERRUPT_CONFIG_REQUEST 8
114 #define L2CAP_INTERRUPT_DISCONNECT 9
115 
116 /* Used for SDP channel */
117 #define L2CAP_SDP_WAIT 10
118 #define L2CAP_SDP_SUCCESS 11
119 
120 /* Used for RFCOMM channel */
121 #define L2CAP_RFCOMM_WAIT 12
122 #define L2CAP_RFCOMM_SUCCESS 13
123 
124 #define L2CAP_DISCONNECT_RESPONSE 14 // Used for both SDP and RFCOMM channel
125 
126 /* Bluetooth states used by some drivers */
127 #define TURN_ON_LED 17
128 #define PS3_ENABLE_SIXAXIS 18
129 #define WII_CHECK_MOTION_PLUS_STATE 19
130 #define WII_CHECK_EXTENSION_STATE 20
131 #define WII_INIT_MOTION_PLUS_STATE 21
132 
133 /* L2CAP event flags for HID Control channel */
134 #define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST (1UL << 0)
135 #define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS (1UL << 1)
136 #define L2CAP_FLAG_CONTROL_CONNECTED (1UL << 2)
137 #define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE (1UL << 3)
138 
139 /* L2CAP event flags for HID Interrupt channel */
140 #define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST (1UL << 4)
141 #define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS (1UL << 5)
142 #define L2CAP_FLAG_INTERRUPT_CONNECTED (1UL << 6)
143 #define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE (1UL << 7)
144 
145 /* L2CAP event flags for SDP channel */
146 #define L2CAP_FLAG_CONNECTION_SDP_REQUEST (1UL << 8)
147 #define L2CAP_FLAG_CONFIG_SDP_SUCCESS (1UL << 9)
148 #define L2CAP_FLAG_DISCONNECT_SDP_REQUEST (1UL << 10)
149 
150 /* L2CAP event flags for RFCOMM channel */
151 #define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST (1UL << 11)
152 #define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS (1UL << 12)
153 #define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST (1UL << 13)
154 
155 #define L2CAP_FLAG_DISCONNECT_RESPONSE (1UL << 14)
156 
157 /* Macros for L2CAP event flag tests */
158 #define l2cap_check_flag(flag) (l2cap_event_flag & (flag))
159 #define l2cap_set_flag(flag) (l2cap_event_flag |= (flag))
160 #define l2cap_clear_flag(flag) (l2cap_event_flag &= ~(flag))
161 
162 /* L2CAP signaling commands */
163 #define L2CAP_CMD_COMMAND_REJECT 0x01
164 #define L2CAP_CMD_CONNECTION_REQUEST 0x02
165 #define L2CAP_CMD_CONNECTION_RESPONSE 0x03
166 #define L2CAP_CMD_CONFIG_REQUEST 0x04
167 #define L2CAP_CMD_CONFIG_RESPONSE 0x05
168 #define L2CAP_CMD_DISCONNECT_REQUEST 0x06
169 #define L2CAP_CMD_DISCONNECT_RESPONSE 0x07
170 #define L2CAP_CMD_INFORMATION_REQUEST 0x0A
171 #define L2CAP_CMD_INFORMATION_RESPONSE 0x0B
172 
173 // Used For Connection Response - Remember to Include High Byte
174 #define PENDING 0x01
175 #define SUCCESSFUL 0x00
176 
177 /* Bluetooth L2CAP PSM - see http://www.bluetooth.org/Technical/AssignedNumbers/logical_link.htm */
178 #define SDP_PSM 0x01 // Service Discovery Protocol PSM Value
179 #define RFCOMM_PSM 0x03 // RFCOMM PSM Value
180 #define HID_CTRL_PSM 0x11 // HID_Control PSM Value
181 #define HID_INTR_PSM 0x13 // HID_Interrupt PSM Value
182 
183 // Used to determine if it is a Bluetooth dongle
184 #define WI_SUBCLASS_RF 0x01 // RF Controller
185 #define WI_PROTOCOL_BT 0x01 // Bluetooth Programming Interface
186 
187 #define BTD_MAX_ENDPOINTS 4
188 #define BTD_NUM_SERVICES 4 // Max number of Bluetooth services - if you need more than 4 simply increase this number
189 
190 #define PAIR 1
191 
192 class BluetoothService;
193 
198 class BTD : public USBDeviceConfig, public UsbConfigXtracter {
199 public:
204  BTD(USB *p);
205 
214  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
222  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
227  uint8_t Release();
232  uint8_t Poll();
233 
238  virtual uint8_t GetAddress() {
239  return bAddress;
240  };
241 
246  virtual bool isReady() {
247  return bPollEnable;
248  };
249 
255  virtual bool DEVCLASSOK(uint8_t klass) {
256  return (klass == USB_CLASS_WIRELESS_CTRL);
257  };
258 
266  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
267  if(vid == IOGEAR_GBU521_VID && pid == IOGEAR_GBU521_PID)
268  return true;
269  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
270  if(vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID))
271  return true;
272  }
273  return false;
274  };
286  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
290  void disconnect();
291 
298  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
299  if(!btService[i]) {
300  btService[i] = pService;
301  return i; // Return ID
302  }
303  }
304  return -1; // Error registering BluetoothService
305  };
306 
313  void HCI_Command(uint8_t* data, uint16_t nbytes);
315  void hci_reset();
317  void hci_read_bdaddr();
324  void hci_set_local_name(const char* name);
326  void hci_write_scan_enable();
328  void hci_write_scan_disable();
330  void hci_remote_name();
332  void hci_accept_connection();
337  void hci_disconnect(uint16_t handle);
354  void hci_inquiry();
356  void hci_inquiry_cancel();
358  void hci_connect();
363  void hci_connect(uint8_t *bdaddr);
377  void L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow = 0x01, uint8_t channelHigh = 0x00);
385  void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm);
394  void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result);
401  void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid);
408  void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid);
416  void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid);
424  void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid);
431  void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh);
442 
444  const char* btdName;
446  const char* btdPin;
447 
449  uint8_t my_bdaddr[6];
451  uint16_t hci_handle;
453  uint8_t disc_bdaddr[6];
455  char remote_name[30];
461  uint8_t hci_version;
462 
465  pairWithWii = true;
466  hci_state = HCI_CHECK_DEVICE_SERVICE;
467  };
469  bool connectToWii;
478 
480  void pairWithHID() {
481  pairWithHIDDevice = true;
482  hci_state = HCI_CHECK_DEVICE_SERVICE;
483  };
485  bool connectToHIDDevice;
490 
495  uint8_t readPollInterval() {
496  return pollInterval;
497  };
498 
499 protected:
501  USB *pUsb;
503  uint8_t bAddress;
506 
508  uint8_t bConfNum;
510  uint8_t bNumEP;
512  uint32_t qNextPollTime;
513 
515  static const uint8_t BTD_CONTROL_PIPE;
517  static const uint8_t BTD_EVENT_PIPE;
519  static const uint8_t BTD_DATAIN_PIPE;
521  static const uint8_t BTD_DATAOUT_PIPE;
522 
528 
529 private:
530  void Initialize(); // Set all variables, endpoint structs etc. to default values
532 
533  uint16_t PID, VID; // PID and VID of device connected
534 
535  uint8_t pollInterval;
536  bool bPollEnable;
537 
538  bool pairWiiUsingSync; // True if pairing was done using the Wii SYNC button.
539  bool checkRemoteName; // Used to check remote device's name before connecting.
540  bool incomingPS4; // True if a PS4 controller is connecting
541  uint8_t classOfDevice[3]; // Class of device of last device
542 
543  /* Variables used by high level HCI task */
544  uint8_t hci_state; // Current state of Bluetooth HCI connection
545  uint16_t hci_counter; // Counter used for Bluetooth HCI reset loops
546  uint16_t hci_num_reset_loops; // This value indicate how many times it should read before trying to reset
547  uint16_t hci_event_flag; // HCI flags of received Bluetooth events
548  uint8_t inquiry_counter;
549 
550  uint8_t hcibuf[BULK_MAXPKTSIZE]; // General purpose buffer for HCI data
551  uint8_t l2capinbuf[BULK_MAXPKTSIZE]; // General purpose buffer for L2CAP in data
552  uint8_t l2capoutbuf[14]; // General purpose buffer for L2CAP out data
553 
554  /* State machines */
555  void HCI_event_task(); // Poll the HCI event pipe
556  void HCI_task(); // HCI state machine
557  void ACL_event_task(); // ACL input pipe
558 
559  /* Used to set the Bluetooth Address internally to the PS3 Controllers */
560  void setBdaddr(uint8_t* BDADDR);
561  void setMoveBdaddr(uint8_t* BDADDR);
562 };
563 
566 public:
567  BluetoothService(BTD *p) : pBtd(p) {
568  if(pBtd)
569  pBtd->registerBluetoothService(this); // Register it as a Bluetooth service
570  };
575  virtual void ACLData(uint8_t* ACLData) = 0;
577  virtual void Run() = 0;
579  virtual void Reset() = 0;
581  virtual void disconnect() = 0;
582 
587  void attachOnInit(void (*funcOnInit)(void)) {
588  pFuncOnInit = funcOnInit; // TODO: This really belong in a class of it's own as it is repeated several times
589  };
590 
591 protected:
597  virtual void onInit() = 0;
598 
600  bool checkHciHandle(uint8_t *buf, uint16_t handle) {
601  return (buf[0] == (handle & 0xFF)) && (buf[1] == ((handle >> 8) | 0x20));
602  }
603 
605  void (*pFuncOnInit)(void);
606 
609 
611  uint16_t hci_handle;
612 
615 
617  uint8_t identifier;
618 };
619 
620 #endif
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:521
-
bool incomingWii
Definition: BTD.h:471
-
void hci_connect()
Definition: BTD.cpp:1073
-
uint8_t bNumEP
Definition: BTD.h:510
-
const char * btdName
Definition: BTD.h:444
-
void hci_reset()
Definition: BTD.cpp:955
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1262
-
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1249
-
bool sdpConnectionClaimed
Definition: BTD.h:439
-
Definition: BTD.h:198
-
int8_t registerBluetoothService(BluetoothService *pService)
Definition: BTD.h:297
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1315
-
bool rfcommConnectionClaimed
Definition: BTD.h:441
-
uint8_t hci_version
Definition: BTD.h:461
-
void hci_inquiry()
Definition: BTD.cpp:1051
-
static const uint8_t BTD_EVENT_PIPE
Definition: BTD.h:517
+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
+
bool incomingWii
Definition: BTD.h:474
+
void hci_connect()
Definition: BTD.cpp:1071
+
uint8_t bNumEP
Definition: BTD.h:514
+
const char * btdName
Definition: BTD.h:447
+
void hci_reset()
Definition: BTD.cpp:953
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1260
+
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1247
+
bool sdpConnectionClaimed
Definition: BTD.h:442
+
Definition: BTD.h:201
+
int8_t registerBluetoothService(BluetoothService *pService)
Definition: BTD.h:300
+
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1313
+
bool rfcommConnectionClaimed
Definition: BTD.h:444
+
uint8_t hci_version
Definition: BTD.h:464
+
bool waitingForConnection
Definition: BTD.h:438
+
void hci_inquiry()
Definition: BTD.cpp:1049
+
static const uint8_t BTD_EVENT_PIPE
Definition: BTD.h:521
#define PS3MOVE_PID
Definition: BTD.h:28
- -
bool pairWithWii
Definition: BTD.h:473
-
uint8_t identifier
Definition: BTD.h:617
-
void hci_write_scan_disable()
Definition: BTD.cpp:977
+ +
bool pairWithWii
Definition: BTD.h:476
+
uint8_t identifier
Definition: BTD.h:621
+
void hci_write_scan_disable()
Definition: BTD.cpp:975
+
#define BELKIN_F8T065BF_PID
Definition: BTD.h:34
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: BTD.cpp:327
-
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: BTD.h:266
-
virtual uint8_t GetAddress()
Definition: BTD.h:238
-
#define BTD_NUM_SERVICES
Definition: BTD.h:188
-
const char * btdPin
Definition: BTD.h:446
-
bool motionPlusInside
Definition: BTD.h:475
-
void hci_remote_name()
Definition: BTD.cpp:1020
- +
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: BTD.h:269
+
virtual uint8_t GetAddress()
Definition: BTD.h:241
+
#define BTD_NUM_SERVICES
Definition: BTD.h:191
+
const char * btdPin
Definition: BTD.h:449
+
bool motionPlusInside
Definition: BTD.h:478
+
void hci_remote_name()
Definition: BTD.cpp:1018
+ +
#define BELKIN_F8T065BF_VID
Definition: BTD.h:33
#define PS3_VID
Definition: BTD.h:25
BTD(USB *p)
Definition: BTD.cpp:27
-
char remote_name[30]
Definition: BTD.h:455
-
uint8_t readPollInterval()
Definition: BTD.h:495
-
static const uint8_t BTD_DATAIN_PIPE
Definition: BTD.h:519
-
void hci_set_local_name(const char *name)
Definition: BTD.cpp:1039
-
void hci_write_scan_enable()
Definition: BTD.cpp:964
-
uint8_t Release()
Definition: BTD.cpp:378
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1328
-
#define USB_CLASS_WIRELESS_CTRL
Definition: UsbCore.h:71
-
bool watingForConnection
Definition: BTD.h:435
-
bool connectToHIDDevice
Definition: BTD.h:483
-
uint8_t bAddress
Definition: BTD.h:503
-
bool incomingHIDDevice
Definition: BTD.h:487
-
bool pairWithHIDDevice
Definition: BTD.h:489
-
uint32_t qNextPollTime
Definition: BTD.h:512
-
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: BTD.cpp:359
-
#define IOGEAR_GBU521_PID
Definition: BTD.h:31
-
bool connectToWii
Definition: BTD.h:467
+
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
+
uint8_t Release()
Definition: BTD.cpp:376
+
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1326
+
#define USB_CLASS_WIRELESS_CTRL
Definition: UsbCore.h:82
+
bool connectToHIDDevice
Definition: BTD.h:487
+
uint8_t bAddress
Definition: BTD.h:507
+
bool incomingHIDDevice
Definition: BTD.h:491
+
bool pairWithHIDDevice
Definition: BTD.h:493
+
uint32_t qNextPollTime
Definition: BTD.h:516
+
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: BTD.cpp:357
+
#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
-
bool wiiUProController
Definition: BTD.h:477
-
uint16_t hci_handle
Definition: BTD.h:451
+
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
-
Definition: address.h:32
-
void pairWithHID()
Definition: BTD.h:480
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1173
- -
void hci_read_bdaddr()
Definition: BTD.cpp:986
-
void hci_inquiry_cancel()
Definition: BTD.cpp:1065
-
uint8_t my_bdaddr[6]
Definition: BTD.h:449
-
void attachOnInit(void(*funcOnInit)(void))
Definition: BTD.h:587
-
uint8_t Poll()
Definition: BTD.cpp:384
-
static const uint8_t BTD_CONTROL_PIPE
Definition: BTD.h:515
- -
BTD * pBtd
Definition: BTD.h:608
-
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
-
void disconnect()
Definition: BTD.cpp:396
-
uint8_t disc_bdaddr[6]
Definition: BTD.h:453
-
bool l2capConnectionClaimed
Definition: BTD.h:437
-
EpInfo epInfo[BTD_MAX_ENDPOINTS]
Definition: BTD.h:505
-
#define IOGEAR_GBU521_VID
Definition: BTD.h:30
+
Definition: address.h:39
+
void pairWithHID()
Definition: BTD.h:483
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1171
+ +
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(* pFuncOnInit)(void)
Definition: BTD.h:609
+
void attachOnInit(void(*funcOnInit)(void))
Definition: BTD.h:591
+
uint8_t Poll()
Definition: BTD.cpp:382
+
static const uint8_t BTD_CONTROL_PIPE
Definition: BTD.h:519
+ +
BTD * pBtd
Definition: BTD.h:612
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:37
+
void disconnect()
Definition: BTD.cpp:394
+
uint8_t disc_bdaddr[6]
Definition: BTD.h:456
+
bool l2capConnectionClaimed
Definition: BTD.h:440
+
EpInfo epInfo[BTD_MAX_ENDPOINTS]
Definition: BTD.h:509
+
#define IOGEAR_GBU521_VID
Definition: BTD.h:31
#define PS3_PID
Definition: BTD.h:26
-
#define BTD_MAX_ENDPOINTS
Definition: BTD.h:187
+
#define BTD_MAX_ENDPOINTS
Definition: BTD.h:190
#define PS3NAVIGATION_PID
Definition: BTD.h:27
-
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1341
-
BluetoothService(BTD *p)
Definition: BTD.h:567
+
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1339
+
BluetoothService(BTD *p)
Definition: BTD.h:571
-
void hci_write_class_of_device()
Definition: BTD.cpp:1185
-
uint16_t hci_handle
Definition: BTD.h:611
-
void hci_pin_code_negative_request_reply()
Definition: BTD.cpp:1135
-
virtual bool DEVCLASSOK(uint8_t klass)
Definition: BTD.h:255
-
uint32_t l2cap_event_flag
Definition: BTD.h:614
-
#define HCI_CHECK_DEVICE_SERVICE
Definition: BTD.h:46
-
Definition: UsbCore.h:197
-
uint8_t bConfNum
Definition: BTD.h:508
-
void hci_link_key_request_negative_reply()
Definition: BTD.cpp:1149
-
void pairWithWiimote()
Definition: BTD.h:464
-
virtual bool isReady()
Definition: BTD.h:246
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1221
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1296
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1279
-
void hci_pin_code_request_reply()
Definition: BTD.cpp:1099
-
USB * pUsb
Definition: BTD.h:497
-
void hci_authentication_request()
Definition: BTD.cpp:1163
-
void hci_read_local_version_information()
Definition: BTD.cpp:995
-
void hci_accept_connection()
Definition: BTD.cpp:1004
-
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:600
-
void HCI_Command(uint8_t *data, uint16_t nbytes)
Definition: BTD.cpp:950
+
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
+
Definition: UsbCore.h:208
+
uint8_t bConfNum
Definition: BTD.h:512
+
void hci_link_key_request_negative_reply()
Definition: BTD.cpp:1147
+
void pairWithWiimote()
Definition: BTD.h:467
+
virtual bool isReady()
Definition: BTD.h:249
+
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1219
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1294
+
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1277
+
void hci_pin_code_request_reply()
Definition: BTD.cpp:1097
+
USB * pUsb
Definition: BTD.h:501
+
void hci_authentication_request()
Definition: BTD.cpp:1161
+
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 b92953ce..bc4a1a41 100644 --- a/_b_t_h_i_d_8cpp.html +++ b/_b_t_h_i_d_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: BTHID.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
diff --git a/_b_t_h_i_d_8cpp__incl.md5 b/_b_t_h_i_d_8cpp__incl.md5 index 457a9283..0f3b1317 100644 --- a/_b_t_h_i_d_8cpp__incl.md5 +++ b/_b_t_h_i_d_8cpp__incl.md5 @@ -1 +1 @@ -2fddcbac34cc48df9a24e3c113c74570 \ No newline at end of file +b0bd84a1b94c9a61dc97b5614bffe745 \ 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 cb5a69c45061607b74f5bb9217b25905070963d7..eee07efb117a6a3fc5faccfd45919f15344f007e 100644 GIT binary patch literal 19135 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 L!`nVQMZEl9HNR?+ literal 19315 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 - + + USB Host Shield 2.0: BTHID.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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:137
-
#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS
Definition: BTD.h:141
-
#define L2CAP_INTERRUPT_CONFIG_REQUEST
Definition: BTD.h:113
-
#define L2CAP_INTERRUPT_SETUP
Definition: BTD.h:111
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1262
-
#define SUCCESSFUL
Definition: BTD.h:175
+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
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1260
+
#define SUCCESSFUL
Definition: BTD.h:178
void ACLData(uint8_t *ACLData)
Definition: BTHID.cpp:56
-
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1249
-
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
Definition: BTD.h:140
-
Definition: BTD.h:198
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1315
+
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1247
+
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
Definition: BTD.h:143
+
Definition: BTD.h:201
+
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1313
uint8_t interrupt_scid[2]
Definition: BTHID.h:142
-
uint8_t identifier
Definition: BTD.h:617
+
uint8_t identifier
Definition: BTD.h:621
bool connected
Definition: BTHID.h:88
void Run()
Definition: BTHID.cpp:344
-
const char * btdPin
Definition: BTD.h:446
-
#define L2CAP_DONE
Definition: BTD.h:102
-
#define L2CAP_CONTROL_SUCCESS
Definition: BTD.h:107
-
#define L2CAP_WAIT
Definition: BTD.h:101
+
const char * btdPin
Definition: BTD.h:449
+
#define L2CAP_DONE
Definition: BTD.h:105
+
#define L2CAP_CONTROL_SUCCESS
Definition: BTD.h:110
+
#define L2CAP_WAIT
Definition: BTD.h:104
virtual void ResetBTHID()
Definition: BTHID.h:133
void Reset()
Definition: BTHID.cpp:41
-
#define L2CAP_CONTROL_CONFIG_REQUEST
Definition: BTD.h:106
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1328
+
#define L2CAP_CONTROL_CONFIG_REQUEST
Definition: BTD.h:109
+
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1326
uint8_t control_scid[2]
Definition: BTHID.h:139
-
#define Notify(...)
Definition: message.h:44
-
bool connectToHIDDevice
Definition: BTD.h:483
-
#define L2CAP_CONTROL_CONNECT_REQUEST
Definition: BTD.h:105
-
#define HID_CTRL_PSM
Definition: BTD.h:180
-
bool incomingHIDDevice
Definition: BTD.h:487
-
bool pairWithHIDDevice
Definition: BTD.h:489
+
#define Notify(...)
Definition: message.h:51
+
bool connectToHIDDevice
Definition: BTD.h:487
+
#define L2CAP_CONTROL_CONNECT_REQUEST
Definition: BTD.h:108
+
#define HID_CTRL_PSM
Definition: BTD.h:183
+
bool incomingHIDDevice
Definition: BTD.h:491
+
bool pairWithHIDDevice
Definition: BTD.h:493
#define MOUSE_PARSER_ID
Definition: BTHID.h:25
-
uint16_t hci_handle
Definition: BTD.h:451
+
uint16_t hci_handle
Definition: BTD.h:454
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1173
- -
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
Definition: BTD.h:143
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1171
+ +
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
Definition: BTD.h:146
void disconnect()
Definition: BTHID.cpp:49
virtual void ParseBTHIDData(uint8_t len, uint8_t *buf)
Definition: BTHID.h:125
-
#define l2cap_check_flag(flag)
Definition: BTD.h:158
-
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:166
-
#define L2CAP_FLAG_CONTROL_CONNECTED
Definition: BTD.h:136
-
#define PSTR(str)
-
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:168
-
#define L2CAP_CONTROL_DISCONNECT
Definition: BTD.h:108
-
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
Definition: BTD.h:134
-
BTD * pBtd
Definition: BTD.h:608
-
#define HID_INTR_PSM
Definition: BTD.h:181
-
bool l2capConnectionClaimed
Definition: BTD.h:437
-
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:169
-
#define L2CAP_CMD_CONNECTION_RESPONSE
Definition: BTD.h:165
-
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:167
+
#define l2cap_check_flag(flag)
Definition: BTD.h:161
+
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:169
+
#define L2CAP_FLAG_CONTROL_CONNECTED
Definition: BTD.h:139
+
#define PSTR(str)
+
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:171
+
#define L2CAP_CONTROL_DISCONNECT
Definition: BTD.h:111
+
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
Definition: BTD.h:137
+
BTD * pBtd
Definition: BTD.h:612
+
#define HID_INTR_PSM
Definition: BTD.h:184
+
bool l2capConnectionClaimed
Definition: BTD.h:440
+
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:172
+
#define L2CAP_CMD_CONNECTION_RESPONSE
Definition: BTD.h:168
+
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:170
void setLeds(struct KBDLEDS data)
Definition: BTHID.h:81
-
uint16_t hci_handle
Definition: BTD.h:611
+
uint16_t hci_handle
Definition: BTD.h:615
#define NUM_PARSERS
Definition: BTHID.h:26
#define KEYBOARD_PARSER_ID
Definition: BTHID.h:24
#define USB_HID_BOOT_PROTOCOL
Definition: usbhid.h:82
-
uint32_t l2cap_event_flag
Definition: BTD.h:614
+
uint32_t l2cap_event_flag
Definition: BTD.h:618
void onInit()
Definition: BTHID.h:112
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1221
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1296
-
#define PENDING
Definition: BTD.h:174
-
#define L2CAP_FLAG_INTERRUPT_CONNECTED
Definition: BTD.h:142
-
#define l2cap_set_flag(flag)
Definition: BTD.h:159
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1279
-
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
Definition: BTD.h:135
-
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:164
+
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1219
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1294
+
#define PENDING
Definition: BTD.h:177
+
#define L2CAP_FLAG_INTERRUPT_CONNECTED
Definition: BTD.h:145
+
#define l2cap_set_flag(flag)
Definition: BTD.h:162
+
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1277
+
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
Definition: BTD.h:138
+
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:167
virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
BTHID(BTD *p, bool pair=false, const char *pin="0000")
Definition: BTHID.cpp:23
-
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:600
-
#define L2CAP_INTERRUPT_CONNECT_REQUEST
Definition: BTD.h:112
+
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:604
+
#define L2CAP_INTERRUPT_CONNECT_REQUEST
Definition: BTD.h:115
#define HID_RPT_PROTOCOL
Definition: usbhid.h:83
void pair(void)
Definition: BTHID.h:91
-
#define L2CAP_INTERRUPT_DISCONNECT
Definition: BTD.h:114
-
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:163
+
#define L2CAP_INTERRUPT_DISCONNECT
Definition: BTD.h:117
+
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:166
diff --git a/_b_t_h_i_d_8h.html b/_b_t_h_i_d_8h.html index 163b51bf..8773d4b9 100644 --- a/_b_t_h_i_d_8h.html +++ b/_b_t_h_i_d_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: BTHID.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ KEYBOARD_PARSER_ID

+
@@ -144,11 +126,13 @@ Macros
-

Definition at line 24 of file BTHID.h.

+

Definition at line 24 of file BTHID.h.

- + +

◆ MOUSE_PARSER_ID

+
@@ -158,11 +142,13 @@ Macros
-

Definition at line 25 of file BTHID.h.

+

Definition at line 25 of file BTHID.h.

- + +

◆ NUM_PARSERS

+
@@ -172,7 +158,7 @@ Macros
-

Definition at line 26 of file BTHID.h.

+

Definition at line 26 of file BTHID.h.

@@ -181,7 +167,7 @@ Macros diff --git a/_b_t_h_i_d_8h__dep__incl.md5 b/_b_t_h_i_d_8h__dep__incl.md5 index 053bda1f..87c17ba3 100644 --- a/_b_t_h_i_d_8h__dep__incl.md5 +++ b/_b_t_h_i_d_8h__dep__incl.md5 @@ -1 +1 @@ -0205aeed5db75f7b218ba6ecd920ddcd \ No newline at end of file +d55a0202ec74c18d421575f50280304c \ 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 9dd814d6dd393c2ddfb7b1ddf7f706c56c22c15b..535e5a2cd92a4ee83e4695c735c5f4ca9ea8dc19 100644 GIT binary patch literal 5579 zcmV;+6*TIJP)Px~g-Jv~RCodHT?cqo#S$JuNob)f#ZV;DLRCbHbPS=2ClPSJW&K85~M=}H1a4SB@{tGL5c}Igus3CFP_US=Op*s5^~Sk`M#T+vwdfG zc4ua1=j5_5kOYYViGkPvi35oNiGlkVki;Nog2cez7?8vur-HelGdqbYCRyt?w3CGo6Tv&_;}lElD6-Lz>_ z3JMA`&7kY)=%Pi7^d$G|w5Dd0{CebM1+v^yR#Nc(5 z$^!ir15$w2F>?3r-6KcsN^o#6)vjHe>ej7G*REZo%mmJ=Rjbl-&pk(T=gy@TEm{!X zZDHNIb(A}IZjt8h-Mch<_H63hxigh7U!JyZ-Acdw@{2Wj{`~pri6@?*XP$Y60s{lB z;kFM+NlEm_AAeAnE?sPc<+BC`eV6(Cb9DS_SZ2M=|u3dx)3_x1cb^iQ$@xEuz9@?>E zhaeUZ48mv3m_d<|k#zCmMUlqw&#`02tmQez$#-WA$eqC%Cs~Gc=+Hsz1WLj&W5y5; z@UV(UMMWvWl$e-E&6_u;7hZV58s^DEg$fmDz<>ePB5vHcLDA9Cf+(^&7(-f|rGS7X zsAE9x4C;8%6`GNeL1oL9)s@E^i3=7iNG)5o6hxPjlA>DV&6_uA$Y{(AEohYo% z08DN@P@q5oDq6It-On8sreej4qFTriY5*a-UAuOIJqiyG7X*Cf%o(+$rVo=lgBw$z zW5(cLsheuC{e;1t`Hm8Itk7g zkUN7jPIQN0g$F>5nca|(kRS*_ndpx7!zx#TYZ#C_gKK!QOO=|MYE@@KwffapUs3Vm z#dY)hc7?j|lAfM!tryy%`1p9C#fpoIv*zBgVFQJPgiy6=)vRIi!8Hs>VsH&lcB#gV z8)tpTp&KUNv}w}>yJC&-!NcCYd#QW(?xN&Eg$fB)ZQ{gZr^@}Zr^tQ1bEY?Q*07$S_PmthCs6n zdCtJ7f$fg3As`@#iWGT{?;{kV_ugCPc6CLHw4yn4N>gfT0%c^VTdKNUxXCk``kVn5 zWN_!e*KqXc75eP6qkI$Y4ijDoMMQ+SUFE@pDKu~1VZNIXKwZ05qQ;FMb-OHAGlqqQ zQH>fkTutt;>0(Vy489(zkW}*FKzYCL|1{I(6J9hFiDp@QL#%LfJ&Q z__VnOn`QT8bCCPiv%c<=fy=O^5CL> znAjmatrF$jCk7HbL~80y>e+J+jUBs+($leHNN@)Ok{H~m#_X<2-HL6SxOVLjzT#QHHprvrh=^LOQF6ZOi5&yN^_Vd$`R3gmzW;E| zqk7DgSrUT>qkZ`BIcn7^hSjD!MJZa=@R+o1+t&1;Cg-fJTUY;EqvRZi5VU3I&f_dx zPo|9<52+`Tp>`OM#9)UGeJ{bmL9Eg&pvo56mV}kMRjcZ@K^{LhY81+s{IfbUwNSx= zLF_d{s$E?{xFiNwu%wX&eEaIvQS6GPy}0F;CyzQhF&S&s@=T@b*o45qJbd65YSk*) z#w*vJyL5SqRjwoHsi!K~M$2an45*KuMq(N4i~(G@A3V4X-$#xTE3hL$fJMT=m@gna z+*wtN`T_&<^7+PVG=2Ijyfdi#Vf96O{Jl&`3|<<+LWP3p#*H*KTPP<=RJ>ATWZY$S zXPB32u`dR!mvWAQ7@R#+uKWn4rQKm0C^@wD*vk4%Vk~PMWtjpRoVVUuOjW9sVP|5| z^y#OsQ{lpaVshrn6~IEQcT}p54Jlu~1bgT%E)MdrBaI&2kv44_&SxEsX!!6i=+8f| zI%bjYnP5N?Lng>^HR^*8*0Q(l3p8_PAF(30YgdbT^-%;N7yLQ|ZC^n|L~W{Au>=$0 z5E?kJl^~4qt+Fr{ebQJ8cOG8D^O~cdJvJ3{b^DjI>(yV2#5e8*GqZg*tzJKMzXsP1fntH?l?R zckF0vC{?ds#y6E1r&MXR>d9D+9QmaXU}Ixn_M{k}<&BJNP4((kVD{;Ak8aobtbsYK zU@0@WIUrwt`4g>KvybB9USXB0_slHZY>sL+XtZX`=tbwwrP9Cuy+$>S419nANemBg z;quez)0f#E>1+DOKbo^~UKN+~J&c4n7@R!$CDw3lr!8BKJd7szO`TF^&^c81?pgSQ zfzyeFR>6zs%jaw?r?bdxNgf%wgtl)_W`YHf=qBb@O-r>SrIe z4e}2{KyM~ZdQqHA4;}hn?arAzMzTpdCcyvx_Zw?x*3-ZK)rk+-O6$n^@RJrU97G>~ z+?x;O4$vrs*PU0>!mQrFz+i&U* zB=AIO@AWI2nw4gA1k6ZaP6D$Mn3tFxq|Bf)18`Gp(4fz$e*KCxU_eWi6vhdHISI^4 zpe=)$iJ3tXgUaYb4-bDsGiLPmiaSV^DsoiNs8JoMLWL4S-3qqJtRRWOVdUXs2)

7~?;}yyV?? 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 diff --git a/_b_t_h_i_d_8h__incl.md5 b/_b_t_h_i_d_8h__incl.md5 index aefec681..d3d074cc 100644 --- a/_b_t_h_i_d_8h__incl.md5 +++ b/_b_t_h_i_d_8h__incl.md5 @@ -1 +1 @@ -d78862557f9f3bddfcdcfa91190beeac \ No newline at end of file +b3c29136fe98c9d8e7c6c6b7a9475517 \ 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 eb4c910875c1c9738596e08d46d30e30d3ebffbd..092bd7d64c615a675337bc1503881c1a42431fe4 100644 GIT binary patch literal 16920 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 Vm}P$i_^SsnX>kRyIuXO*{{wVr9Z8 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 diff --git a/_b_t_h_i_d_8h_source.html b/_b_t_h_i_d_8h_source.html index ac276c9c..b638e35b 100644 --- a/_b_t_h_i_d_8h_source.html +++ b/_b_t_h_i_d_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: BTHID.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

- + - - + + + +
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, uint8_t *buf) {
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
virtual void OnInitBTHID()
Definition: BTHID.h:129
void ACLData(uint8_t *ACLData)
Definition: BTHID.cpp:56
-
Definition: BTD.h:198
+
Definition: BTD.h:201
uint8_t interrupt_scid[2]
Definition: BTHID.h:142
bool connected
Definition: BTHID.h:88
void Run()
Definition: BTHID.cpp:344
virtual void ResetBTHID()
Definition: BTHID.h:133
void Reset()
Definition: BTHID.cpp:41
uint8_t control_scid[2]
Definition: BTHID.h:139
-
void pairWithHID()
Definition: BTD.h:480
- +
void pairWithHID()
Definition: BTD.h:483
+
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:605
-
BTD * pBtd
Definition: BTD.h:608
+
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
void onInit()
Definition: BTHID.h:112
@@ -123,7 +103,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 5fc2ad94..7c91c940 100644 --- a/_p_s3_b_t_8cpp.html +++ b/_p_s3_b_t_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3BT.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- + - + - +
@@ -112,7 +92,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 e3f29912..6ec2377b 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 47f6eaf8..0d2883f6 100644 --- a/_p_s3_b_t_8cpp__incl.md5 +++ b/_p_s3_b_t_8cpp__incl.md5 @@ -1 +1 @@ -50d55f1029d7b23c50d71899212fd03f \ No newline at end of file +fcd6fdd81a5a62e824f047cf224529eb \ 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 213a65549c9eb6d802b5232c948a74d8709dc31f..745d25fc2c5f5a473b92f087b691c15c8950a445 100644 GIT binary patch literal 22019 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ℜ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 diff --git a/_p_s3_b_t_8cpp_source.html b/_p_s3_b_t_8cpp_source.html index b90b5438..8c67f1c4 100644 --- a/_p_s3_b_t_8cpp_source.html +++ b/_p_s3_b_t_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3BT.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 = 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 = 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(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 = millis();
464  }
465  break;
466 
467  case TURN_ON_LED:
468  if(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 = 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(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 = 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(millis() - timerHID <= 150) // Check if is has been more than 150ms since last command
514  delay((uint32_t)(150 - (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 = 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(millis() - timerHID <= 150)// Check if is has been less than 150ms since last command
599  delay((uint32_t)(150 - (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 = 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:137
-
bool incomingWii
Definition: BTD.h:471
+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) {
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
-
#define pgm_read_dword(addr)
+
#define pgm_read_dword(addr)
bool PS3NavigationConnected
Definition: PS3BT.h:184
-
#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS
Definition: BTD.h:141
-
#define L2CAP_INTERRUPT_CONFIG_REQUEST
Definition: BTD.h:113
-
#define L2CAP_INTERRUPT_SETUP
Definition: BTD.h:111
+
#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
bool getStatus(StatusEnum c)
Definition: PS3BT.cpp:156
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1262
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1260
void Run()
Definition: PS3BT.cpp:454
-
#define SUCCESSFUL
Definition: BTD.h:175
-
#define strcpy_P(dest, src)
-
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
Definition: BTD.h:140
-
Definition: BTD.h:198
- +
#define SUCCESSFUL
Definition: BTD.h:178
+
#define strcpy_P(dest, src)
+
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
Definition: BTD.h:143
+
Definition: BTD.h:201
+
void setLedOn(LEDEnum a)
Definition: PS3BT.cpp:569
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1315
+
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1313
-
uint8_t hci_version
Definition: BTD.h:461
- - -
bool pairWithWii
Definition: BTD.h:473
-
uint8_t identifier
Definition: BTD.h:617
+
uint8_t hci_version
Definition: BTD.h:464
+ + +
bool pairWithWii
Definition: BTD.h:476
+
uint8_t identifier
Definition: BTD.h:621
String getTemperature()
Definition: PS3BT.cpp:141
-
AnalogHatEnum
+
AnalogHatEnum
void moveSetRumble(uint8_t rumble)
Definition: PS3BT.cpp:617
-
#define TURN_ON_LED
Definition: BTD.h:127
- - +
#define TURN_ON_LED
Definition: BTD.h:130
+ +
void printStatusString()
Definition: PS3BT.cpp:160
void setAllOff()
Definition: PS3BT.cpp:519
- -
#define L2CAP_DONE
Definition: BTD.h:102
+ +
#define L2CAP_DONE
Definition: BTD.h:105
-
#define L2CAP_CONTROL_SUCCESS
Definition: BTD.h:107
-
#define L2CAP_WAIT
Definition: BTD.h:101
+
#define L2CAP_CONTROL_SUCCESS
Definition: BTD.h:110
+
#define L2CAP_WAIT
Definition: BTD.h:104
StatusEnum
Definition: PS3Enums.h:113
#define HID_BUFFERSIZE
Definition: PS3BT.h:24
void Reset()
Definition: PS3BT.cpp:204
-
#define pgm_read_byte(addr)
- -
char remote_name[30]
Definition: BTD.h:455
- +
#define pgm_read_byte(addr)
+ +
char remote_name[30]
Definition: BTD.h:458
+
const uint32_t PS3_BUTTONS[]
Definition: PS3Enums.h:62
bool getButtonPress(ButtonEnum b)
Definition: PS3BT.cpp:49
-
LEDEnum
+
LEDEnum
int16_t getSensor(SensorEnum a)
Definition: PS3BT.cpp:68
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1328
-
#define Notify(...)
Definition: message.h:44
-
RumbleEnum
-
#define USB_HOST_SERIAL
Definition: settings.h:34
-
#define HID_CTRL_PSM
Definition: BTD.h:180
- +
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1326
+
#define Notify(...)
Definition: message.h:51
+
RumbleEnum
+
#define USB_HOST_SERIAL
Definition: settings.h:49
+
#define HID_CTRL_PSM
Definition: BTD.h:183
+
Definition: PS3Enums.h:123
- -
bool connectToWii
Definition: BTD.h:467
+ +
bool connectToWii
Definition: BTD.h:470
uint8_t getAnalogHat(AnalogHatEnum a)
Definition: PS3BT.cpp:64
-
uint16_t hci_handle
Definition: BTD.h:451
+
uint16_t hci_handle
Definition: BTD.h:454
bool PS3Connected
Definition: PS3BT.h:176
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1173
- -
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
Definition: BTD.h:143
- -
ButtonEnum
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1171
+ +
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
Definition: BTD.h:146
+ +
ButtonEnum
void moveSetBulb(uint8_t r, uint8_t g, uint8_t b)
Definition: PS3BT.cpp:604
bool PS3MoveConnected
Definition: PS3BT.h:182
-
uint8_t my_bdaddr[6]
Definition: BTD.h:449
- +
uint8_t my_bdaddr[6]
Definition: BTD.h:452
+
void setRumbleOn(RumbleEnum mode)
Definition: PS3BT.cpp:540
-
void(* pFuncOnInit)(void)
Definition: BTD.h:605
+
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:158
+
#define l2cap_check_flag(flag)
Definition: BTD.h:161
-
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:166
-
#define PSTR(str)
-
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:168
-
#define L2CAP_CONTROL_DISCONNECT
Definition: BTD.h:108
-
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
Definition: BTD.h:134
-
ColorsEnum
-
BTD * pBtd
Definition: BTD.h:608
-
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
- -
#define HID_INTR_PSM
Definition: BTD.h:181
+
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:169
+
#define PSTR(str)
+
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:171
+
#define L2CAP_CONTROL_DISCONNECT
Definition: BTD.h:111
+
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
Definition: BTD.h:137
+
ColorsEnum
+
BTD * pBtd
Definition: BTD.h:612
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:37
+ +
#define HID_INTR_PSM
Definition: BTD.h:184
const uint8_t PS3_ANALOG_BUTTONS[]
Definition: PS3Enums.h:92
- - -
bool l2capConnectionClaimed
Definition: BTD.h:437
-
AngleEnum
-
#define PS3_ENABLE_SIXAXIS
Definition: BTD.h:128
+ + +
bool l2capConnectionClaimed
Definition: BTD.h:440
+
AngleEnum
+
#define PS3_ENABLE_SIXAXIS
Definition: BTD.h:131
-
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:169
+
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:172
void ACLData(uint8_t *ACLData)
Definition: PS3BT.cpp:224
-
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:167
+
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:170
-
uint16_t hci_handle
Definition: BTD.h:611
+
uint16_t hci_handle
Definition: BTD.h:615
void setLedOff()
Definition: PS3BT.h:138
- -
#define strcat_P(dest, src)
+ +
#define strcat_P(dest, src)
void setLedToggle(LEDEnum a)
Definition: PS3BT.cpp:578
-
uint32_t l2cap_event_flag
Definition: BTD.h:614
+
uint32_t l2cap_event_flag
Definition: BTD.h:618
#define PS3_REPORT_BUFFER_SIZE
Definition: PS3Enums.h:24
void disconnect()
Definition: PS3BT.cpp:217
- -
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1221
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1296
-
#define PENDING
Definition: BTD.h:174
-
#define l2cap_set_flag(flag)
Definition: BTD.h:159
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1279
-
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
Definition: BTD.h:135
-
SensorEnum
+ +
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1219
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1294
+
#define PENDING
Definition: BTD.h:177
+
#define l2cap_set_flag(flag)
Definition: BTD.h:162
+
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1277
+
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
Definition: BTD.h:138
+
SensorEnum
-
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:164
+
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:167
uint8_t getAnalogButton(ButtonEnum a)
Definition: PS3BT.cpp:60
- +
float getAngle(AngleEnum a)
Definition: PS3BT.cpp:85
void setLedRaw(uint8_t value)
Definition: PS3BT.cpp:559
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)
Definition: PS3BT.cpp:23
- -
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:600
+ +
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:604
void onInit()
Definition: PS3BT.cpp:628
Definition: PS3Enums.h:125
-
#define L2CAP_INTERRUPT_DISCONNECT
Definition: BTD.h:114
+
#define L2CAP_INTERRUPT_DISCONNECT
Definition: BTD.h:117
void setRumbleOff()
Definition: PS3BT.cpp:530
bool getButtonClick(ButtonEnum b)
Definition: PS3BT.cpp:53
const uint8_t PS3_REPORT_BUFFER[PS3_REPORT_BUFFER_SIZE]
Definition: PS3Enums.h:27
-
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:163
+
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:166
diff --git a/_p_s3_b_t_8h.html b/_p_s3_b_t_8h.html index 30a2c8f3..b36ac4d3 100644 --- a/_p_s3_b_t_8h.html +++ b/_p_s3_b_t_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3BT.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- + - +
@@ -130,7 +110,9 @@ Macros  

Macro Definition Documentation

- + +

◆ HID_BUFFERSIZE

+
@@ -140,7 +122,7 @@ Macros
-

Definition at line 24 of file PS3BT.h.

+

Definition at line 24 of file PS3BT.h.

@@ -149,7 +131,7 @@ Macros diff --git a/_p_s3_b_t_8h__dep__incl.md5 b/_p_s3_b_t_8h__dep__incl.md5 index 80c124ec..2014c83c 100644 --- a/_p_s3_b_t_8h__dep__incl.md5 +++ b/_p_s3_b_t_8h__dep__incl.md5 @@ -1 +1 @@ -eba794dfcd5eea5cd385cf4d1f0cee96 \ No newline at end of file +ac5ec06c541321e25eb4c20223ecb1d0 \ 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 57d10ec12abaddedce1266e3a3abd0148d131895..3d898a9106feafc22ee2f942739a226211e17867 100644 GIT binary patch literal 3474 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 literal 3525 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 diff --git a/_p_s3_b_t_8h__incl.map b/_p_s3_b_t_8h__incl.map index 58f4967c..e6415992 100644 --- a/_p_s3_b_t_8h__incl.map +++ b/_p_s3_b_t_8h__incl.map @@ -1,8 +1,8 @@ - + - + diff --git a/_p_s3_b_t_8h__incl.md5 b/_p_s3_b_t_8h__incl.md5 index dbb83515..4fa201c6 100644 --- a/_p_s3_b_t_8h__incl.md5 +++ b/_p_s3_b_t_8h__incl.md5 @@ -1 +1 @@ -90cb54a3b8ad4256770707efdc9f2bdc \ No newline at end of file +099874d321d87a5f12d52372f8d8ae4d \ 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 d863f3ef2566de9c28e0f500fdbd66717d28a19c..be1253bbb445e408bed8b0acc5bbd67fa811b0b7 100644 GIT binary patch literal 19479 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 Saw7bA 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 H?h*SxVBrqM diff --git a/_p_s3_b_t_8h_source.html b/_p_s3_b_t_8h_source.html index 4ce85745..9cb6083c 100644 --- a/_p_s3_b_t_8h_source.html +++ b/_p_s3_b_t_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3BT.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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:198
+
Definition: BTD.h:201
void setLedOn(LEDEnum a)
Definition: PS3BT.cpp:569
String getTemperature()
Definition: PS3BT.cpp:141
-
AnalogHatEnum
+
AnalogHatEnum
void moveSetRumble(uint8_t rumble)
Definition: PS3BT.cpp:617
void printStatusString()
Definition: PS3BT.cpp:160
void setAllOff()
Definition: PS3BT.cpp:519
@@ -104,28 +84,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#define HID_BUFFERSIZE
Definition: PS3BT.h:24
void Reset()
Definition: PS3BT.cpp:204
bool getButtonPress(ButtonEnum b)
Definition: PS3BT.cpp:49
-
LEDEnum
+
LEDEnum
int16_t getSensor(SensorEnum a)
Definition: PS3BT.cpp:68
-
RumbleEnum
+
RumbleEnum
Definition: PS3BT.h:32
uint8_t getAnalogHat(AnalogHatEnum a)
Definition: PS3BT.cpp:64
bool PS3Connected
Definition: PS3BT.h:176
- -
ButtonEnum
+ +
ButtonEnum
void moveSetBulb(uint8_t r, uint8_t g, uint8_t b)
Definition: PS3BT.cpp:604
bool PS3MoveConnected
Definition: PS3BT.h:182
void setRumbleOn(RumbleEnum mode)
Definition: PS3BT.cpp:540
float get9DOFValues(SensorEnum a)
Definition: PS3BT.cpp:112
-
ColorsEnum
-
BTD * pBtd
Definition: BTD.h:608
-
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
-
AngleEnum
+
ColorsEnum
+
BTD * pBtd
Definition: BTD.h:612
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:37
+
AngleEnum
void ACLData(uint8_t *ACLData)
Definition: PS3BT.cpp:224
void setLedOff()
Definition: PS3BT.h:138
void setLedToggle(LEDEnum a)
Definition: PS3BT.cpp:578
void disconnect()
Definition: PS3BT.cpp:217
-
SensorEnum
+
SensorEnum
uint8_t getAnalogButton(ButtonEnum a)
Definition: PS3BT.cpp:60
float getAngle(AngleEnum a)
Definition: PS3BT.cpp:85
@@ -140,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s3_enums_8h.html b/_p_s3_enums_8h.html index 6bff533b..e93f0284 100644 --- a/_p_s3_enums_8h.html +++ b/_p_s3_enums_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3Enums.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- + @@ -167,7 +147,9 @@ Variables  

Macro Definition Documentation

- + +

◆ PS3_REPORT_BUFFER_SIZE

+
@@ -178,11 +160,13 @@ Variables

Size of the output report buffer for the Dualshock and Navigation controllers

-

Definition at line 24 of file PS3Enums.h.

+

Definition at line 24 of file PS3Enums.h.

- + +

◆ MOVE_REPORT_BUFFER_SIZE

+
@@ -193,12 +177,14 @@ Variables

Size of the output report buffer for the Move Controller

-

Definition at line 40 of file PS3Enums.h.

+

Definition at line 40 of file PS3Enums.h.

Enumeration Type Documentation

- + +

◆ StatusEnum

+
@@ -208,54 +194,36 @@ Variables
- - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
Enumerator
Plugged  -
Unplugged  -
Charging  -
NotCharging  -
Shutdown  -
Dying  -
Low  -
High  -
Full  -
MoveCharging  -
MoveNotCharging  -
MoveShutdown  -
MoveDying  -
MoveLow  -
MoveHigh  -
MoveFull  -
CableRumble  -
Cable  -
BluetoothRumble  -
Bluetooth  -
Enumerator
Plugged 
Unplugged 
Charging 
NotCharging 
Shutdown 
Dying 
Low 
High 
Full 
MoveCharging 
MoveNotCharging 
MoveShutdown 
MoveDying 
MoveLow 
MoveHigh 
MoveFull 
CableRumble 
Cable 
BluetoothRumble 
Bluetooth 
-

Definition at line 113 of file PS3Enums.h.

+

Definition at line 113 of file PS3Enums.h.

Variable Documentation

- + +

◆ PS3_REPORT_BUFFER

+
@@ -266,11 +234,13 @@ 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

-

Definition at line 27 of file PS3Enums.h.

+

Definition at line 27 of file PS3Enums.h.

- + +

◆ PS3_LEDS

+
@@ -281,11 +251,13 @@ Variables
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.

+

Definition at line 43 of file PS3Enums.h.

- + +

◆ PS3_BUTTONS

+
@@ -296,11 +268,13 @@ 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.

-

Definition at line 62 of file PS3Enums.h.

+

Definition at line 62 of file PS3Enums.h.

- + +

◆ PS3_ANALOG_BUTTONS

+
@@ -311,7 +285,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.

-

Definition at line 92 of file PS3Enums.h.

+

Definition at line 92 of file PS3Enums.h.

@@ -320,7 +294,7 @@ Variables diff --git a/_p_s3_enums_8h__dep__incl.map b/_p_s3_enums_8h__dep__incl.map index 7b47deac..9a0a8dcb 100644 --- a/_p_s3_enums_8h__dep__incl.map +++ b/_p_s3_enums_8h__dep__incl.map @@ -1,5 +1,5 @@ - + diff --git a/_p_s3_enums_8h__dep__incl.md5 b/_p_s3_enums_8h__dep__incl.md5 index 7e6c593e..d15e13ed 100644 --- a/_p_s3_enums_8h__dep__incl.md5 +++ b/_p_s3_enums_8h__dep__incl.md5 @@ -1 +1 @@ -2ee6fe4e5f4f5bb8864f711284e44ace \ No newline at end of file +c77fa45db98b8115b80889d20542091c \ 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 eb68bef811abfa5f68996b0d08af895dd2e2fe77..d294a169a909de10f5178a423c536aab462667ad 100644 GIT binary patch literal 10839 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 BQ7`}i literal 10795 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 bxu$(x$+8-X6J-JZZh*AZ_0<|w5UBqFn_Nxc literal 4359 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 P!2!_GFi=OS+C~2l1o?7H diff --git a/_p_s3_enums_8h_source.html b/_p_s3_enums_8h_source.html index b640ff35..7383baa1 100644 --- a/_p_s3_enums_8h_source.html +++ b/_p_s3_enums_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3Enums.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + + - + - - + + + +
- + - - + + @@ -111,7 +91,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 33f2b9ad..ca5089dd 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 a9693dff..b62523cb 100644 --- a/_p_s3_u_s_b_8cpp__incl.md5 +++ b/_p_s3_u_s_b_8cpp__incl.md5 @@ -1 +1 @@ -6fe7e16b5e65f19d54865f8f0649448b \ No newline at end of file +d1b34b2e5c4f9117dc52f0fee30ee629 \ 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 2d5a6d8dc3b14daced02b1306388d3ccd81cea2c..762e4d00104e9ce712f3a04af42aa2c3a8644157 100644 GIT binary patch literal 19810 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 H%=^YaJ?AJ0 literal 21158 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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 46ca7c21..3e98f875 100644 --- a/_p_s3_u_s_b_8cpp_source.html +++ b/_p_s3_u_s_b_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3USB.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 = 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(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(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 = 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:41
+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
-
#define pgm_read_dword(addr)
-
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
-
#define strcpy_P(dest, src)
-
uint8_t bmNakPower
Definition: address.h:42
+
#define pgm_read_dword(addr)
+
EpInfo * epinfo
Definition: address.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
+
#define strcpy_P(dest, src)
+
uint8_t bmNakPower
Definition: address.h:49
void setLedRaw(uint8_t value)
Definition: PS3USB.cpp:441
bool PS3NavigationConnected
Definition: PS3USB.h:264
void setLedOff()
Definition: PS3USB.h:215
#define PS3_INPUT_PIPE
Definition: PS3USB.h:31
- - + +
#define PS3MOVE_PID
Definition: BTD.h:28
void setBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:465
@@ -115,113 +95,113 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
bool getButtonPress(ButtonEnum b)
Definition: PS3USB.cpp:316
#define PS3_OUTPUT_PIPE
Definition: PS3USB.h:30
-
#define NotifyFail(...)
Definition: message.h:55
+
#define NotifyFail(...)
Definition: message.h:62
bool PS3MoveConnected
Definition: PS3USB.h:262
-
AnalogHatEnum
- -
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
+
AnalogHatEnum
+ +
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
-
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:86
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:93
StatusEnum
Definition: PS3Enums.h:113
void getMoveBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:543
#define bmREQ_HID_OUT
Definition: usbhid.h:63
#define PS3_VID
Definition: BTD.h:25
-
#define pgm_read_byte(addr)
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
+
#define pgm_read_byte(addr)
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
uint8_t getAnalogButton(ButtonEnum a)
Definition: PS3USB.cpp:327
- +
uint16_t getSensor(SensorEnum a)
Definition: PS3USB.cpp:335
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
void setRumbleOff()
Definition: PS3USB.cpp:410
const uint32_t PS3_BUTTONS[]
Definition: PS3Enums.h:62
#define EP_MAXPKTSIZE
Definition: PS3USB.h:26
bool PS3Connected
Definition: PS3USB.h:256
virtual void FreeAddress(uint8_t addr)=0
-
LEDEnum
-
uint8_t epAttribs
Definition: address.h:37
-
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
+
LEDEnum
+
uint8_t epAttribs
Definition: address.h:44
+
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:133
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
#define Notify(...)
Definition: message.h:44
+
#define Notify(...)
Definition: message.h:51
#define PS3_CONTROL_PIPE
Definition: PS3USB.h:29
-
RumbleEnum
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
#define USB_HOST_SERIAL
Definition: settings.h:34
+
RumbleEnum
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
#define USB_HOST_SERIAL
Definition: settings.h:49
void setLedToggle(LEDEnum a)
Definition: PS3USB.cpp:460
-
uint8_t epAddr
Definition: address.h:33
-
#define NotifyFailUnknownDevice(...)
Definition: message.h:54
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
+
uint8_t epAddr
Definition: address.h:40
+
#define NotifyFailUnknownDevice(...)
Definition: message.h:61
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
void moveSetBulb(uint8_t r, uint8_t g, uint8_t b)
Definition: PS3USB.cpp:504
Definition: PS3Enums.h:123
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: PS3USB.cpp:47
-
Definition: address.h:32
+
Definition: address.h:39
#define MOVE_REPORT_BUFFER_SIZE
Definition: PS3Enums.h:40
void printStatusString()
Definition: PS3USB.cpp:364
void setAllOff()
Definition: PS3USB.cpp:403
-
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:293
- -
ButtonEnum
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
+ +
ButtonEnum
const uint8_t PS3_LEDS[]
Definition: PS3Enums.h:43
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bmSndToggle
Definition: address.h:40
+
uint8_t bmSndToggle
Definition: address.h:47
uint8_t getAnalogHat(AnalogHatEnum a)
Definition: PS3USB.cpp:331
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define PSTR(str)
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define PSTR(str)
USB * pUsb
Definition: PS3USB.h:268
-
ColorsEnum
+
ColorsEnum
const uint8_t PS3_ANALOG_BUTTONS[]
Definition: PS3Enums.h:92
- -
#define USB_NAK_NOWAIT
Definition: address.h:29
-
AngleEnum
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
+ +
#define USB_NAK_NOWAIT
Definition: address.h:36
+
AngleEnum
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
#define PS3_PID
Definition: BTD.h:26
#define PS3NAVIGATION_PID
Definition: BTD.h:27
void moveSetRumble(uint8_t rumble)
Definition: PS3USB.cpp:517
uint8_t Poll()
Definition: PS3USB.cpp:272
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
#define PS3_MAX_ENDPOINTS
Definition: PS3USB.h:39
EpInfo epInfo[PS3_MAX_ENDPOINTS]
Definition: PS3USB.h:272
void setRumbleOn(RumbleEnum mode)
Definition: PS3USB.cpp:420
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
- +
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
+
void setLedOn(LEDEnum a)
Definition: PS3USB.cpp:451
-
#define strcat_P(dest, src)
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
+
#define strcat_P(dest, src)
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
uint8_t bAddress
Definition: PS3USB.h:270
void setMoveBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:527
#define PS3_REPORT_BUFFER_SIZE
Definition: PS3Enums.h:24
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
#define bmREQ_HID_IN
Definition: usbhid.h:64
float getAngle(AngleEnum a)
Definition: PS3USB.cpp:339
- -
SensorEnum
+ +
SensorEnum
#define HID_REQUEST_SET_REPORT
Definition: usbhid.h:72
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
#define HID_REQUEST_GET_REPORT
Definition: usbhid.h:69
- +
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)
Definition: PS3USB.cpp:23
void getMoveCalibration(uint8_t *data)
Definition: PS3USB.cpp:553
Definition: PS3Enums.h:125
bool getStatus(StatusEnum c)
Definition: PS3USB.cpp:360
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
const uint8_t PS3_REPORT_BUFFER[PS3_REPORT_BUFFER_SIZE]
Definition: PS3Enums.h:27
bool getButtonClick(ButtonEnum b)
Definition: PS3USB.cpp:320
- +
diff --git a/_p_s3_u_s_b_8h.html b/_p_s3_u_s_b_8h.html index c52f8a0f..93cbd3e9 100644 --- a/_p_s3_u_s_b_8h.html +++ b/_p_s3_u_s_b_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3USB.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- - + + @@ -146,7 +126,9 @@ Macros  

Macro Definition Documentation

- + +

◆ EP_MAXPKTSIZE

+
@@ -156,11 +138,13 @@ Macros
-

Definition at line 26 of file PS3USB.h.

+

Definition at line 26 of file PS3USB.h.

- + +

◆ PS3_CONTROL_PIPE

+
@@ -170,11 +154,13 @@ Macros
-

Definition at line 29 of file PS3USB.h.

+

Definition at line 29 of file PS3USB.h.

- + +

◆ PS3_OUTPUT_PIPE

+
@@ -184,11 +170,13 @@ Macros
-

Definition at line 30 of file PS3USB.h.

+

Definition at line 30 of file PS3USB.h.

- + +

◆ PS3_INPUT_PIPE

+
@@ -198,11 +186,13 @@ Macros
-

Definition at line 31 of file PS3USB.h.

+

Definition at line 31 of file PS3USB.h.

- + +

◆ PS3_VID

+
@@ -212,11 +202,13 @@ Macros
-

Definition at line 34 of file PS3USB.h.

+

Definition at line 34 of file PS3USB.h.

- + +

◆ PS3_PID

+
@@ -226,11 +218,13 @@ Macros
-

Definition at line 35 of file PS3USB.h.

+

Definition at line 35 of file PS3USB.h.

- + +

◆ PS3NAVIGATION_PID

+
@@ -240,11 +234,13 @@ Macros
-

Definition at line 36 of file PS3USB.h.

+

Definition at line 36 of file PS3USB.h.

- + +

◆ PS3MOVE_PID

+
@@ -254,11 +250,13 @@ Macros
-

Definition at line 37 of file PS3USB.h.

+

Definition at line 37 of file PS3USB.h.

- + +

◆ PS3_MAX_ENDPOINTS

+
@@ -268,7 +266,7 @@ Macros
-

Definition at line 39 of file PS3USB.h.

+

Definition at line 39 of file PS3USB.h.

@@ -277,7 +275,7 @@ Macros diff --git a/_p_s3_u_s_b_8h__dep__incl.md5 b/_p_s3_u_s_b_8h__dep__incl.md5 index 12e5013f..a0ef30bd 100644 --- a/_p_s3_u_s_b_8h__dep__incl.md5 +++ b/_p_s3_u_s_b_8h__dep__incl.md5 @@ -1 +1 @@ -0475266e9b2a94b52ed82e482fd5e58c \ No newline at end of file +30b451c7325a69f7529dfbe204eb0dfb \ 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 11ba1896cb074d1dfab207dec276fc74e217eeae..3e8065156a2ca40dcb5753bef627d5a24329f95c 100644 GIT binary patch literal 3796 zcmcJS=Q|tT`^SmB)t;dxXe+i-yGBwowpuAsTL~>{BvzH8Ms0%HjXkTVJzB9Fq-M=3 zYJJe!zIpWf4}K5Mxv%@dxz2UJ&->ixb>12qK^bUyXh}#&7<3u6Mp`JA5@BID+cT z?#vDX%kC}=sSX`?wtop3SN>@~)^Vit6f~e|Y0#))>5P~AbbjqgN{1;_?E$z($W8&u zDi}8VYsKMTxDpet`nxHEf`ZVF8m(Ym=PhJ0Q6%`2ffqAI`|E=rhDEI&!3n6GfKNamOZjA0&5Va-I_4hMPjFd*|k0-Ro z8lOFTHj%(B`+KXrfFo*uwh;=k+nsAJ9qIVDq@SevmkVs)mPX0IqrJ7Y^>R{&b8@pF zOhPqmvPkEcxWY6EsQS^*ISeJKtektNIcl)dqEh6!hx4R6Flhajrt3DLw!r8w{n618 z*0S2h9BT?1zjPDHphNc1{zUdM$ZYVd2AlW3*c=;rJk?!zxl`L^v^idoX)A3*@+H59 zN8Up_hDjhJL|W;Ry6nf}-B;6nXqG5^l1QCNQ<|AyQUAR{5 zwApA+6qWN!`;gt{sU~+bkBJYY_F-2ia$Y~AvhU3|dqRnNmd{k%DhC8#9)8{6F`FeO zTa~q)MHhSR<76he*+~hg93XD* zKW!oB{$2Q-=smZE&%U>Zp+d!W;ZcS7@87kbD$-d!Maiq)TpqD}r5UNRZgj(!8NNON zc;YVhyI`X^^2O3lgA?)uyEPTjG9`oD-{dU|esqq)MQZA%IRR2Q!H*Yl_iK{J8hqCv zv=l%kli>{T22fEZYtRXNoqrB!4tH9CuPsdX;QN#)#_0v9NqE%JDnx4bHqF8{v`L;cma%xk&hYbxPeOt zY#S;p3ZDfo`g2y>w`bIqcFV>1Zx<)274`ONauR^i zv9V?WeX)D|?`Ig^v$jJ7FA*MPdp*eO6WbTAblDW;_cckNyc2b?YPxX#hJhCs5s|Mp z*>mtHm;G+~=a@6}@DB07ME}$y@7&t0^{)du_Awj~I|Ljd`8t)=z>1_)H&rAb2>Qen z@^3F4&uLH!XTkE+{By+bYBx2L7hr{H@qa9XCcR9aUT3r9ap z^_cM*5WNywwYQ%fM=fnZS4>G`UUbC>pnt$R*lk?)?D$a5rs!*KkI6gPFvlE=k81U9 zDz^!r&yEO(L;B9>`8HbclR9aRfXV|UR>sd!RCK2k=V5+as69Jr)X`{gr;!Si>`J&k z>}S6u=<44X6pg-J4ew~|g+6X#f2_FtYt$CHr)p=)QZ~#m`N=k#kZIh#yM&7M^JDxL z=rPxzqcf0}QlCAR51!Gbxh2AeL~1W5lj}RKJhW-`vqd&c9=--JE(!C!chJ?V=r__s z7-rIt*;&r0p{X_=OS!N}-cy1NXS(8tQe9P!3=IspmN_Jj^F`#v1_n0IaxbctJVLXW zyH|GOo0?AY@g)#yA4F+sHQr>c?=^|{XwKrL-uYpjgF}BcJWn5*luvIvmNsIVXEC^= zb#;A#_8`>gc0Ul5+!wncgR*q3!to~Udg-{!!DBdDt1|QkgfkJ0<17sxz8|+c_@zP( zRd%F&^X{~{OHJCR62Mc}wP8UDNzzNDsUOrCV0mMKh>)e1s;;3hvhA�Jw5F*x1uy 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 - - + + diff --git a/_p_s3_u_s_b_8h__incl.md5 b/_p_s3_u_s_b_8h__incl.md5 index 8fa52d90..016045ba 100644 --- a/_p_s3_u_s_b_8h__incl.md5 +++ b/_p_s3_u_s_b_8h__incl.md5 @@ -1 +1 @@ -6e3e4f5a4587d0eabc83a6049ce6f258 \ No newline at end of file +80bc9dd64df8547bd5be104488ba1f29 \ 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 703cb46fe1c78d3893149021bffb81a34c886965..fe3673f6e1410ca37363bece433ea61644cad731 100644 GIT binary patch literal 16947 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

Y@e;G_XBvXF6J#fvPKUs(iqp|1edsoz*tLrQ9 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 VNv{wEegy(XN=#m~QrIx){{f2AJP!Z> literal 18252 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 diff --git a/_p_s3_u_s_b_8h_source.html b/_p_s3_u_s_b_8h_source.html index 56d5a903..a71a4a42 100644 --- a/_p_s3_u_s_b_8h_source.html +++ b/_p_s3_u_s_b_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS3USB.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

- + - - + + + +
uint8_t Release()
Definition: PS3USB.cpp:262
bool getButtonPress(ButtonEnum b)
Definition: PS3USB.cpp:316
bool PS3MoveConnected
Definition: PS3USB.h:262
-
AnalogHatEnum
+
AnalogHatEnum
StatusEnum
Definition: PS3Enums.h:113
- +
void getMoveBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:543
uint8_t getAnalogButton(ButtonEnum a)
Definition: PS3USB.cpp:327
@@ -109,24 +89,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
void setRumbleOff()
Definition: PS3USB.cpp:410
#define EP_MAXPKTSIZE
Definition: PS3USB.h:26
bool PS3Connected
Definition: PS3USB.h:256
-
LEDEnum
+
LEDEnum
virtual uint8_t GetAddress()
Definition: PS3USB.h:84
-
RumbleEnum
+
RumbleEnum
void attachOnInit(void(*funcOnInit)(void))
Definition: PS3USB.h:254
void setLedToggle(LEDEnum a)
Definition: PS3USB.cpp:460
void moveSetBulb(uint8_t r, uint8_t g, uint8_t b)
Definition: PS3USB.cpp:504
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: PS3USB.cpp:47
-
Definition: address.h:32
+
Definition: address.h:39
void printStatusString()
Definition: PS3USB.cpp:364
void setAllOff()
Definition: PS3USB.cpp:403
-
ButtonEnum
+
ButtonEnum
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: PS3USB.h:102
#define PS3_PID
Definition: PS3USB.h:35
uint8_t getAnalogHat(AnalogHatEnum a)
Definition: PS3USB.cpp:331
USB * pUsb
Definition: PS3USB.h:268
-
ColorsEnum
-
AngleEnum
+
ColorsEnum
+
AngleEnum
void moveSetRumble(uint8_t rumble)
Definition: PS3USB.cpp:517
uint8_t Poll()
Definition: PS3USB.cpp:272
#define PS3MOVE_PID
Definition: PS3USB.h:37
@@ -139,9 +119,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#define PS3_VID
Definition: PS3USB.h:34
uint8_t bAddress
Definition: PS3USB.h:270
void setMoveBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:527
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
float getAngle(AngleEnum a)
Definition: PS3USB.cpp:339
-
SensorEnum
+
SensorEnum
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)
Definition: PS3USB.cpp:23
void getMoveCalibration(uint8_t *data)
Definition: PS3USB.cpp:553
bool getStatus(StatusEnum c)
Definition: PS3USB.cpp:360
@@ -152,7 +132,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 af48fb7e..e6b55ff4 100644 --- a/_p_s4_b_t_8h.html +++ b/_p_s4_b_t_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS4BT.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
diff --git a/_p_s4_b_t_8h__incl.md5 b/_p_s4_b_t_8h__incl.md5 index 13fdf4c6..1116a2ed 100644 --- a/_p_s4_b_t_8h__incl.md5 +++ b/_p_s4_b_t_8h__incl.md5 @@ -1 +1 @@ -57aad865c1c7b4a544a7eac684f0ffd9 \ No newline at end of file +d83187f481bdeb098a3bb36f43274a13 \ 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 b681e6fae0ce1c598cd7214865cf33236d555615..9d0b8474b9dac5cabc9461e5fc6c4241cb66e1ae 100644 GIT binary patch literal 30089 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≤f`>lN4jC@=lv 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 literal 30445 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 diff --git a/_p_s4_b_t_8h_source.html b/_p_s4_b_t_8h_source.html index a921275b..af6f235e 100644 --- a/_p_s4_b_t_8h_source.html +++ b/_p_s4_b_t_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS4BT.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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:198
+
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:321
+
void setLed(uint8_t r, uint8_t g, uint8_t b)
Definition: PS4Parser.h:320
bool connected()
Definition: PS4BT.h:45
bool connected
Definition: BTHID.h:88
uint8_t flashOn
Definition: PS4Parser.h:119
@@ -107,18 +87,18 @@ 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:605
+
void(* pFuncOnInit)(void)
Definition: BTD.h:609
uint8_t smallRumble
Definition: PS4Parser.h:117
virtual void sendOutputReport(PS4Output *output)
Definition: PS4BT.h:81
-
BTD * pBtd
Definition: BTD.h:608
+
BTD * pBtd
Definition: BTD.h:612
virtual void ResetBTHID()
Definition: PS4BT.h:75
- +
PS4BT(BTD *p, bool pair=false, const char *pin="0000")
Definition: PS4BT.h:36
-
uint16_t hci_handle
Definition: BTD.h:611
+
uint16_t hci_handle
Definition: BTD.h:615
virtual void OnInitBTHID()
Definition: PS4BT.h:65
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1221
+
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1219
Definition: BTHID.h:29
void pair(void)
Definition: BTHID.h:91
Definition: PS4BT.h:28
@@ -127,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s4_parser_8cpp.html b/_p_s4_parser_8cpp.html index dce613c7..1461506e 100644 --- a/_p_s4_parser_8cpp.html +++ b/_p_s4_parser_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS4Parser.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Enumeration Type Documentation

- + +

◆ DPADEnum

+
@@ -135,27 +117,18 @@ Enumerations
- - - - - - - - - + + + + + + + + +
Enumerator
DPAD_UP  -
DPAD_UP_RIGHT  -
DPAD_RIGHT  -
DPAD_RIGHT_DOWN  -
DPAD_DOWN  -
DPAD_DOWN_LEFT  -
DPAD_LEFT  -
DPAD_LEFT_UP  -
DPAD_OFF  -
Enumerator
DPAD_UP 
DPAD_UP_RIGHT 
DPAD_RIGHT 
DPAD_RIGHT_DOWN 
DPAD_DOWN 
DPAD_DOWN_LEFT 
DPAD_LEFT 
DPAD_LEFT_UP 
DPAD_OFF 
-

Definition at line 20 of file PS4Parser.cpp.

+

Definition at line 20 of file PS4Parser.cpp.

@@ -164,7 +137,7 @@ Enumerations diff --git a/_p_s4_parser_8cpp__incl.md5 b/_p_s4_parser_8cpp__incl.md5 index 1f9ffe4e..37924f33 100644 --- a/_p_s4_parser_8cpp__incl.md5 +++ b/_p_s4_parser_8cpp__incl.md5 @@ -1 +1 @@ -03082f2d3fd4c67e7d5789f05b2dd70a \ No newline at end of file +d25b4790cd5001e08560c2238a2e6903 \ No newline at end of file diff --git a/_p_s4_parser_8cpp__incl.png b/_p_s4_parser_8cpp__incl.png index bf34613be63a6c287c729659b21ee8ea9c076d65..ec7855c67127d5256d5ee803c895281c9adc928c 100644 GIT binary patch literal 9305 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 literal 9559 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 - + + USB Host Shield 2.0: PS4Parser.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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), 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), 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
uint8_t hatValue[4]
Definition: PS4Parser.h:94
uint8_t b
Definition: PS4Parser.h:118
bool getButtonPress(ButtonEnum b)
Definition: PS4Parser.cpp:50
-
AnalogHatEnum
+
AnalogHatEnum
DPADEnum
Definition: PS4Parser.cpp:20
uint8_t touching
Definition: PS4Parser.h:78
uint8_t flashOn
Definition: PS4Parser.h:119
-
#define pgm_read_byte(addr)
- - -
#define Notify(...)
Definition: message.h:44
+
#define pgm_read_byte(addr)
+ + +
#define Notify(...)
Definition: message.h:51
uint8_t g
Definition: PS4Parser.h:118
bool reportChanged
Definition: PS4Parser.h:120
void Parse(uint8_t len, uint8_t *buf)
Definition: PS4Parser.cpp:76
uint8_t trigger[2]
Definition: PS4Parser.h:96
- +
const uint8_t PS4_BUTTONS[]
Definition: PS4Parser.h:25
-
ButtonEnum
+
ButtonEnum
uint8_t r
Definition: PS4Parser.h:118
uint8_t bigRumble
Definition: PS4Parser.h:117
virtual void sendOutputReport(PS4Output *output)=0
- +
uint8_t flashOff
Definition: PS4Parser.h:119
uint8_t smallRumble
Definition: PS4Parser.h:117
-
#define PSTR(str)
+
#define PSTR(str)
+
#define MFK_CASTUINT8T
Definition: settings.h:196
uint8_t dpad
Definition: PS4Parser.h:52
struct touchpadXY::@30 finger[2]
touchpadXY xy[3]
Definition: PS4Parser.h:108
@@ -129,19 +110,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
PS4Buttons btn
Definition: PS4Parser.h:95
bool getButtonClick(ButtonEnum b)
Definition: PS4Parser.cpp:57
- +
uint8_t getAnalogHat(AnalogHatEnum a)
Definition: PS4Parser.cpp:72
- +
diff --git a/_p_s4_parser_8h.html b/_p_s4_parser_8h.html index 163b91f3..e4c63be9 100644 --- a/_p_s4_parser_8h.html +++ b/_p_s4_parser_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS4Parser.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Variable Documentation

- + +

◆ PS4_BUTTONS

+
@@ -147,13 +129,13 @@ 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,
}
+ + +

Buttons on the controller

-

Definition at line 25 of file PS4Parser.h.

+

Definition at line 25 of file PS4Parser.h.

@@ -162,7 +144,7 @@ Variables diff --git a/_p_s4_parser_8h__dep__incl.md5 b/_p_s4_parser_8h__dep__incl.md5 index 2dc29627..f0c27ce8 100644 --- a/_p_s4_parser_8h__dep__incl.md5 +++ b/_p_s4_parser_8h__dep__incl.md5 @@ -1 +1 @@ -4d5a405a295dec480becbdb408726c5e \ No newline at end of file +479deb6480f10f264b96e5acadbf5ee5 \ 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 cfa5c5fde0ae68dce6d79fa80b57a579cf879e69..480690ac6af198b83bab9ce77bdb1a6f21f888f6 100644 GIT binary patch literal 9094 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 DTrGR> literal 9114 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 EKR~5Nxc~qF literal 6743 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 - + + USB Host Shield 2.0: PS4Parser.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

- + - - + + + +
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);
154  uint8_t getAnalogButton(ButtonEnum b);
155 
161  uint8_t getAnalogHat(AnalogHatEnum a);
162 
171  uint16_t getX(uint8_t finger = 0, uint8_t xyId = 0) {
172  return ps4Data.xy[xyId].finger[finger].x;
173  };
174 
183  uint16_t getY(uint8_t finger = 0, uint8_t xyId = 0) {
184  return ps4Data.xy[xyId].finger[finger].y;
185  };
186 
195  bool isTouching(uint8_t finger = 0, uint8_t xyId = 0) {
196  return !(ps4Data.xy[xyId].finger[finger].touching); // The bit is cleared when a finger is touching the touchpad
197  };
198 
207  uint8_t getTouchCounter(uint8_t finger = 0, uint8_t xyId = 0) {
208  return ps4Data.xy[xyId].finger[finger].counter;
209  };
210 
216  float getAngle(AngleEnum a) {
217  if (a == Pitch)
218  return (atan2f(ps4Data.accY, ps4Data.accZ) + PI) * RAD_TO_DEG;
219  else
220  return (atan2f(ps4Data.accX, ps4Data.accZ) + PI) * RAD_TO_DEG;
221  };
222 
228  int16_t getSensor(SensorEnum s) {
229  switch(s) {
230  case gX:
231  return ps4Data.gyroX;
232  case gY:
233  return ps4Data.gyroY;
234  case gZ:
235  return ps4Data.gyroZ;
236  case aX:
237  return ps4Data.accX;
238  case aY:
239  return ps4Data.accY;
240  case aZ:
241  return ps4Data.accZ;
242  default:
243  return 0;
244  }
245  };
246 
251  uint8_t getBatteryLevel() {
252  return ps4Data.status.battery;
253  };
254 
259  bool getUsbStatus() {
260  return ps4Data.status.usb;
261  };
262 
267  bool getAudioStatus() {
268  return ps4Data.status.audio;
269  };
270 
275  bool getMicStatus() {
276  return ps4Data.status.mic;
277  };
278 
280  void setAllOff() {
281  setRumbleOff();
282  setLedOff();
283  };
284 
286  void setRumbleOff() {
287  setRumbleOn(0, 0);
288  };
289 
294  void setRumbleOn(RumbleEnum mode) {
295  if (mode == RumbleLow)
296  setRumbleOn(0x00, 0xFF);
297  else
298  setRumbleOn(0xFF, 0x00);
299  };
300 
306  void setRumbleOn(uint8_t bigRumble, uint8_t smallRumble) {
307  ps4Output.bigRumble = bigRumble;
308  ps4Output.smallRumble = smallRumble;
309  ps4Output.reportChanged = true;
310  };
311 
313  void setLedOff() {
314  setLed(0, 0, 0);
315  };
316 
321  void setLed(uint8_t r, uint8_t g, uint8_t b) {
322  ps4Output.r = r;
323  ps4Output.g = g;
324  ps4Output.b = b;
325  ps4Output.reportChanged = true;
326  };
327 
332  void setLed(ColorsEnum color) {
333  setLed((uint8_t)(color >> 16), (uint8_t)(color >> 8), (uint8_t)(color));
334  };
335 
341  void setLedFlash(uint8_t flashOn, uint8_t flashOff) {
342  ps4Output.flashOn = flashOn;
343  ps4Output.flashOff = flashOff;
344  ps4Output.reportChanged = true;
345  };
348 protected:
354  void Parse(uint8_t len, uint8_t *buf);
355 
357  void Reset();
358 
363  virtual void sendOutputReport(PS4Output *output) = 0;
364 
365 private:
366  bool checkDpad(ButtonEnum b); // Used to check PS4 DPAD buttons
367 
368  PS4Data ps4Data;
369  PS4Buttons oldButtonState, buttonClickState;
370  PS4Output ps4Output;
371  uint8_t oldDpad;
372 };
373 #endif
uint8_t getBatteryLevel()
Definition: PS4Parser.h:251
+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
+
void Reset()
Definition: PS4Parser.cpp:130
uint32_t val
Definition: PS4Parser.h:71
-
uint16_t getY(uint8_t finger=0, uint8_t xyId=0)
Definition: PS4Parser.h:183
- +
uint16_t getY(uint8_t finger=0, uint8_t xyId=0)
Definition: PS4Parser.h:182
+
uint8_t dummy3[3]
Definition: PS4Parser.h:105
+
uint8_t usb
Definition: PS4Parser.h:86
+ +
int16_t gyroY
Definition: PS4Parser.h:100
+
uint8_t hatValue[4]
Definition: PS4Parser.h:94
+
uint8_t dummy2[5]
Definition: PS4Parser.h:103
uint8_t r1
Definition: PS4Parser.h:59
PS4Status status
Definition: PS4Parser.h:104
-
void setLed(uint8_t r, uint8_t g, uint8_t b)
Definition: PS4Parser.h:321
-
AnalogHatEnum
+
uint8_t dummy[3]
Definition: PS4Parser.h:99
+
uint8_t b
Definition: PS4Parser.h:118
+
void setLed(uint8_t r, uint8_t g, uint8_t b)
Definition: PS4Parser.h:320
+
int16_t accX
Definition: PS4Parser.h:101
+
uint8_t mic
Definition: PS4Parser.h:88
+
bool getButtonPress(ButtonEnum b)
Definition: PS4Parser.cpp:50
+
AnalogHatEnum
uint8_t reportCounter
Definition: PS4Parser.h:69
- -
void setLed(ColorsEnum color)
Definition: PS4Parser.h:332
-
void setRumbleOn(uint8_t bigRumble, uint8_t smallRumble)
Definition: PS4Parser.h:306
+ +
void setLed(ColorsEnum color)
Definition: PS4Parser.h:331
+
uint8_t audio
Definition: PS4Parser.h:87
+
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:228
+
int16_t getSensor(SensorEnum s)
Definition: PS4Parser.h:227
uint8_t flashOn
Definition: PS4Parser.h:119
- +
int16_t accY
Definition: PS4Parser.h:101
+
uint8_t share
Definition: PS4Parser.h:62
- -
void setRumbleOn(RumbleEnum mode)
Definition: PS4Parser.h:294
+ +
uint8_t unknown
Definition: PS4Parser.h:89
+
void setRumbleOn(RumbleEnum mode)
Definition: PS4Parser.h:293
uint8_t dummy
Definition: PS4Parser.h:75
- +
int16_t gyroX
Definition: PS4Parser.h:100
+
uint8_t cross
Definition: PS4Parser.h:54
-
void setAllOff()
Definition: PS4Parser.h:280
+
void setAllOff()
Definition: PS4Parser.h:279
uint8_t l2
Definition: PS4Parser.h:60
-
RumbleEnum
+
RumbleEnum
+
uint8_t g
Definition: PS4Parser.h:118
uint8_t square
Definition: PS4Parser.h:53
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:195
- - +
void Parse(uint8_t len, uint8_t *buf)
Definition: PS4Parser.cpp:76
+
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
+
uint8_t trigger[2]
Definition: PS4Parser.h:96
+
const uint8_t PS4_BUTTONS[]
Definition: PS4Parser.h:25
- -
ButtonEnum
+ +
ButtonEnum
uint8_t r
Definition: PS4Parser.h:118
-
void setRumbleOff()
Definition: PS4Parser.h:286
+
uint8_t bigRumble
Definition: PS4Parser.h:117
+
virtual void sendOutputReport(PS4Output *output)=0
+
uint8_t flashOff
Definition: PS4Parser.h:119
+
void setRumbleOff()
Definition: PS4Parser.h:285
uint8_t l1
Definition: PS4Parser.h:58
uint8_t smallRumble
Definition: PS4Parser.h:117
uint8_t r3
Definition: PS4Parser.h:65
-
void setLedOff()
Definition: PS4Parser.h:313
+
void setLedOff()
Definition: PS4Parser.h:312
uint8_t dpad
Definition: PS4Parser.h:52
-
ColorsEnum
+
struct touchpadXY::@30 finger[2]
+
touchpadXY xy[3]
Definition: PS4Parser.h:108
+
ColorsEnum
int16_t gyroZ
Definition: PS4Parser.h:100
- -
AngleEnum
+ +
AngleEnum
-
uint16_t getX(uint8_t finger=0, uint8_t xyId=0)
Definition: PS4Parser.h:171
+
uint16_t getX(uint8_t finger=0, uint8_t xyId=0)
Definition: PS4Parser.h:170
uint8_t triangle
Definition: PS4Parser.h:56
uint8_t r2
Definition: PS4Parser.h:61
-
float getAngle(AngleEnum a)
Definition: PS4Parser.h:216
-
uint8_t getTouchCounter(uint8_t finger=0, uint8_t xyId=0)
Definition: PS4Parser.h:207
+
float getAngle(AngleEnum a)
Definition: PS4Parser.h:215
+
uint8_t getTouchCounter(uint8_t finger=0, uint8_t xyId=0)
Definition: PS4Parser.h:206
uint8_t options
Definition: PS4Parser.h:63
-
bool getMicStatus()
Definition: PS4Parser.h:275
+
bool getMicStatus()
Definition: PS4Parser.h:274
uint8_t touchpad
Definition: PS4Parser.h:68
+
uint8_t getAnalogButton(ButtonEnum b)
Definition: PS4Parser.cpp:64
+
uint8_t battery
Definition: PS4Parser.h:85
uint8_t l3
Definition: PS4Parser.h:64
PS4Buttons btn
Definition: PS4Parser.h:95
-
SensorEnum
+
bool getButtonClick(ButtonEnum b)
Definition: PS4Parser.cpp:57
+
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:341
- -
bool getUsbStatus()
Definition: PS4Parser.h:259
-
bool getAudioStatus()
Definition: PS4Parser.h:267
- - + +
void setLedFlash(uint8_t flashOn, uint8_t flashOff)
Definition: PS4Parser.h:340
+
uint8_t getAnalogHat(AnalogHatEnum a)
Definition: PS4Parser.cpp:72
+ +
bool getUsbStatus()
Definition: PS4Parser.h:258
+
bool getAudioStatus()
Definition: PS4Parser.h:266
+ +
diff --git a/_p_s4_u_s_b_8h.html b/_p_s4_u_s_b_8h.html index 3b544656..e60f6d8e 100644 --- a/_p_s4_u_s_b_8h.html +++ b/_p_s4_u_s_b_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS4USB.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- - - + + +
@@ -122,9 +102,13 @@ Macros   #define PS4_PID   0x05C4   +#define PS4_PID_SLIM   0x09CC + 

Macro Definition Documentation

- + +

◆ PS4_VID

+
@@ -134,11 +118,13 @@ Macros
-

Definition at line 24 of file PS4USB.h.

+

Definition at line 24 of file PS4USB.h.

- + +

◆ PS4_PID

+
@@ -148,7 +134,23 @@ Macros
-

Definition at line 25 of file PS4USB.h.

+

Definition at line 25 of file PS4USB.h.

+ +
+
+ +

◆ PS4_PID_SLIM

+ +
+
+ + + + +
#define PS4_PID_SLIM   0x09CC
+
+ +

Definition at line 26 of file PS4USB.h.

@@ -157,7 +159,7 @@ Macros diff --git a/_p_s4_u_s_b_8h__incl.map b/_p_s4_u_s_b_8h__incl.map index 70551cf9..31784600 100644 --- a/_p_s4_u_s_b_8h__incl.map +++ b/_p_s4_u_s_b_8h__incl.map @@ -2,7 +2,7 @@ - - - + + + diff --git a/_p_s4_u_s_b_8h__incl.md5 b/_p_s4_u_s_b_8h__incl.md5 index 9a8140ab..76233869 100644 --- a/_p_s4_u_s_b_8h__incl.md5 +++ b/_p_s4_u_s_b_8h__incl.md5 @@ -1 +1 @@ -3d9cec3e6d601d983fe2992427af4c58 \ No newline at end of file +d2a18154f1cb36761bff05421187bd1f \ 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 2a69bcab7f2dcffaa32be192f9c9a0725c90166d..d1e8c024d4e752b84f76916945094109517b29b8 100644 GIT binary patch literal 21639 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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 72a1730d..5ece9ee8 100644 --- a/_p_s4_u_s_b_8h_source.html +++ b/_p_s4_u_s_b_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PS4USB.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
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 
31 class PS4USB : public HIDUniversal, public PS4Parser {
32 public:
37  PS4USB(USB *p) :
38  HIDUniversal(p) {
40  };
41 
46  bool connected() {
48  };
49 
54  void attachOnInit(void (*funcOnInit)(void)) {
55  pFuncOnInit = funcOnInit;
56  };
57 
58 protected:
67  virtual void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
69  PS4Parser::Parse(len, buf);
70  };
71 
77  virtual uint8_t OnInitSuccessful() {
80  if (pFuncOnInit)
81  pFuncOnInit(); // Call the user function
82  else
83  setLed(Blue);
84  };
85  return 0;
86  };
90  virtual void sendOutputReport(PS4Output *output) { // Source: https://github.com/chrippa/ds4drv
91  uint8_t buf[32];
92  memset(buf, 0, sizeof(buf));
93 
94  buf[0] = 0x05; // Report ID
95  buf[1]= 0xFF;
96 
97  buf[4] = output->smallRumble; // Small Rumble
98  buf[5] = output->bigRumble; // Big rumble
99 
100  buf[6] = output->r; // Red
101  buf[7] = output->g; // Green
102  buf[8] = output->b; // Blue
103 
104  buf[9] = output->flashOn; // Time to flash bright (255 = 2.5 seconds)
105  buf[10] = output->flashOff; // Time to flash dark (255 = 2.5 seconds)
106 
107  output->reportChanged = false;
108 
109  // The PS4 console actually set the four last bytes to a CRC32 checksum, but it seems like it is actually not needed
110 
111  pUsb->outTransfer(bAddress, epInfo[ hidInterfaces[0].epIndex[epInterruptOutIndex] ].epAddr, sizeof(buf), buf);
112  };
122  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
123  return (vid == PS4_VID && pid == PS4_PID);
124  };
127 private:
128  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
129 };
130 #endif
uint16_t PID
Definition: hiduniversal.h:69
-
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: PS4USB.h:122
+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() {
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
+
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: PS4USB.h:123
Definition: usbhid.h:143
void Reset()
Definition: PS4Parser.cpp:130
USB * pUsb
Definition: usbhid.h:145
-
void attachOnInit(void(*funcOnInit)(void))
Definition: PS4USB.h:54
+
void attachOnInit(void(*funcOnInit)(void))
Definition: PS4USB.h:55
virtual bool isReady()
Definition: hiduniversal.h:97
-
virtual uint8_t OnInitSuccessful()
Definition: PS4USB.h:77
+
virtual uint8_t OnInitSuccessful()
Definition: PS4USB.h:78
uint8_t b
Definition: PS4Parser.h:118
-
void setLed(uint8_t r, uint8_t g, uint8_t b)
Definition: PS4Parser.h:321
-
Definition: PS4USB.h:31
+
void setLed(uint8_t r, uint8_t g, uint8_t b)
Definition: PS4Parser.h:320
+
Definition: PS4USB.h:32
uint8_t flashOn
Definition: PS4Parser.h:119
HIDInterface hidInterfaces[maxHidInterfaces]
Definition: hiduniversal.h:65
@@ -108,32 +88,33 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
uint8_t g
Definition: PS4Parser.h:118
bool reportChanged
Definition: PS4Parser.h:120
void Parse(uint8_t len, uint8_t *buf)
Definition: PS4Parser.cpp:76
-
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:293
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
static const uint8_t epInterruptOutIndex
Definition: usbhid.h:150
uint8_t bAddress
Definition: usbhid.h:146
uint8_t r
Definition: PS4Parser.h:118
uint8_t bigRumble
Definition: PS4Parser.h:117
-
bool connected()
Definition: PS4USB.h:46
+
bool connected()
Definition: PS4USB.h:47
uint8_t flashOff
Definition: PS4Parser.h:119
uint8_t smallRumble
Definition: PS4Parser.h:117
#define PS4_VID
Definition: PS4USB.h:24
- +
#define PS4_PID_SLIM
Definition: PS4USB.h:26
+
#define PS4_PID
Definition: PS4USB.h:25
-
virtual void sendOutputReport(PS4Output *output)
Definition: PS4USB.h:90
-
PS4USB(USB *p)
Definition: PS4USB.h:37
-
Definition: UsbCore.h:197
+
virtual void sendOutputReport(PS4Output *output)
Definition: PS4USB.h:91
+
PS4USB(USB *p)
Definition: PS4USB.h:38
+
Definition: UsbCore.h:208
EpInfo epInfo[totalEndpoints]
Definition: hiduniversal.h:64
-
virtual void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
Definition: PS4USB.h:67
+
virtual void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
Definition: PS4USB.h:68
diff --git a/_p_s_buzz_8cpp.html b/_p_s_buzz_8cpp.html index cce31532..591a59e0 100644 --- a/_p_s_buzz_8cpp.html +++ b/_p_s_buzz_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PSBuzz.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
diff --git a/_p_s_buzz_8cpp__incl.md5 b/_p_s_buzz_8cpp__incl.md5 index b600c9e8..254fa80c 100644 --- a/_p_s_buzz_8cpp__incl.md5 +++ b/_p_s_buzz_8cpp__incl.md5 @@ -1 +1 @@ -4060fd39043c7564a19c22e4b422acd8 \ No newline at end of file +5a74379adade31d51d1b0ef98c2b52fe \ No newline at end of file diff --git a/_p_s_buzz_8cpp__incl.png b/_p_s_buzz_8cpp__incl.png index 058e40792e26ddff3a1cd9ef383c39eda8afae13..459ab3d3e8ad4653c5a9548b3e9351a31257ac91 100644 GIT binary patch literal 18408 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
&O8=Lr(4An-zii$L+UH}E;(F0b@Bno|-{ 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 literal 18591 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 P00000NkvXXu0mjfI(!&x diff --git a/_p_s_buzz_8cpp_source.html b/_p_s_buzz_8cpp_source.html index dc830257..37aec3ec 100644 --- a/_p_s_buzz_8cpp_source.html +++ b/_p_s_buzz_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PSBuzz.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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, bool is_rpt_id, 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), 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
@@ -98,16 +78,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
bool getButtonClick(ButtonEnum b, uint8_t controller=0)
Definition: PSBuzz.cpp:56
#define bmREQ_HID_OUT
Definition: usbhid.h:63
uint16_t VID
Definition: hiduniversal.h:69
-
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 Notify(...)
Definition: message.h:44
+
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:133
+
#define Notify(...)
Definition: message.h:51
bool getButtonPress(ButtonEnum b, uint8_t controller=0)
Definition: PSBuzz.cpp:52
#define PSBUZZ_VID
Definition: PSBuzz.h:24
-
ButtonEnum
+
ButtonEnum
#define PSBUZZ_PID
Definition: PSBuzz.h:25
uint8_t bAddress
Definition: usbhid.h:146
void setLedRaw(bool value, uint8_t controller=0)
Definition: PSBuzz.cpp:64
-
#define PSTR(str)
+
#define PSTR(str)
+
#define MFK_CASTUINT8T
Definition: settings.h:196
uint8_t OnInitSuccessful()
Definition: PSBuzz.cpp:41
void setLedOnAll()
Definition: PSBuzz.h:114
#define HID_REQUEST_SET_REPORT
Definition: usbhid.h:72
@@ -118,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s_buzz_8h.html b/_p_s_buzz_8h.html index f5a70b48..6d05a4bf 100644 --- a/_p_s_buzz_8h.html +++ b/_p_s_buzz_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PSBuzz.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ PSBUZZ_VID

+
@@ -143,11 +125,13 @@ Macros
-

Definition at line 24 of file PSBuzz.h.

+

Definition at line 24 of file PSBuzz.h.

- + +

◆ PSBUZZ_PID

+
@@ -157,7 +141,7 @@ Macros
-

Definition at line 25 of file PSBuzz.h.

+

Definition at line 25 of file PSBuzz.h.

@@ -166,7 +150,7 @@ Macros diff --git a/_p_s_buzz_8h__dep__incl.md5 b/_p_s_buzz_8h__dep__incl.md5 index 5caa0d46..0d832b03 100644 --- a/_p_s_buzz_8h__dep__incl.md5 +++ b/_p_s_buzz_8h__dep__incl.md5 @@ -1 +1 @@ -88928a152c2f379aa7b4a52bc6f3da10 \ No newline at end of file +89fdce8c433f9f3ff883c438cb91a471 \ 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 94e565dc4bbae470b17826ebdc3e19a7e5563d90..626e62c753033d996a612f53b18c41b416d5a15f 100644 GIT binary patch literal 3598 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 P@BnZv1I-%sXJP*X1g`Gw literal 3569 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 diff --git a/_p_s_buzz_8h__incl.md5 b/_p_s_buzz_8h__incl.md5 index 801930e6..063dac97 100644 --- a/_p_s_buzz_8h__incl.md5 +++ b/_p_s_buzz_8h__incl.md5 @@ -1 +1 @@ -460aa9dc1a3fdb1c5075c5daa680120f \ No newline at end of file +e9865eba6bb7dc48f5f354e4dc3ccb30 \ No newline at end of file diff --git a/_p_s_buzz_8h__incl.png b/_p_s_buzz_8h__incl.png index cdce103d6b1b11458b8e8a580b55c8b418f56754..428a2f35abed3b9df5055c98f535bb869863e84b 100644 GIT binary patch literal 15688 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
ENMRhs*D*Wn%%!aD#gZ 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 literal 15844 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 SgMHjcNJ?_*vh~uIq5lPC>C}b* diff --git a/_p_s_buzz_8h_source.html b/_p_s_buzz_8h_source.html index 200e0a6b..404204b6 100644 --- a/_p_s_buzz_8h_source.html +++ b/_p_s_buzz_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PSBuzz.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
Definition: PSBuzz.cpp:23
void setLedToggle(uint8_t controller=0)
Definition: PSBuzz.h:132
void attachOnInit(void(*funcOnInit)(void))
Definition: PSBuzz.h:66
virtual bool isReady()
Definition: hiduniversal.h:97
void Reset()
Definition: PSBuzz.h:157
+
bool getButtonClick(ButtonEnum b, uint8_t controller=0)
Definition: PSBuzz.cpp:56
bool connected()
Definition: PSBuzz.h:58
uint8_t blue
Definition: PSBuzz.h:34
uint16_t VID
Definition: hiduniversal.h:69
uint8_t green
Definition: PSBuzz.h:32
+
bool getButtonPress(ButtonEnum b, uint8_t controller=0)
Definition: PSBuzz.cpp:52
Definition: PSBuzz.h:43
#define PSBUZZ_VID
Definition: PSBuzz.h:24
-
ButtonEnum
+
ButtonEnum
#define PSBUZZ_PID
Definition: PSBuzz.h:25
uint8_t yellow
Definition: PSBuzz.h:31
+
void setLedRaw(bool value, uint8_t controller=0)
Definition: PSBuzz.cpp:64
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: PSBuzz.h:172
void setLedOff(uint8_t controller=0)
Definition: PSBuzz.h:108
struct PSBUZZButtons::@31 btn[4]
PSBuzz(USB *p)
Definition: PSBuzz.h:49
+
uint8_t OnInitSuccessful()
Definition: PSBuzz.cpp:41
void setLedOnAll()
Definition: PSBuzz.h:114
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
void setLedOn(uint8_t controller=0)
Definition: PSBuzz.h:124
uint32_t val
Definition: PSBuzz.h:36
uint8_t orange
Definition: PSBuzz.h:33
@@ -125,7 +110,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 a5b29531..7600810e 100644 --- a/_r_e_a_d_m_e_8md.html +++ b/_r_e_a_d_m_e_8md.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: README.md File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + + - + - - + + + +
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)](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: <http://felis.github.com/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 
127 The following boards need to be activated manually in [settings.h](settings.h):
128 
129 * Arduino Mega ADK
130  * If you are using Arduino 1.5.5 or newer there is no need to activate the Arduino Mega ADK manually
131 * Black Widdow
132 
133 Simply set the corresponding value to 1 instead of 0.
134 
135 ### [Bluetooth libraries](BTD.cpp)
136 
137 The [BTD library](BTD.cpp) is a general purpose library for an ordinary Bluetooth dongle.
138 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.
139 Some different examples can be found in the [example directory](examples/Bluetooth).
140 
141 The BTD library also makes it possible to use multiple services at once, the following example sketch is an example of this:
142 [PS3SPP.ino](examples/Bluetooth/PS3SPP/PS3SPP.ino).
143 
144 ### [BTHID library](BTHID.cpp)
145 
146 The [Bluetooth HID library](BTHID.cpp) allows you to connect HID devices via Bluetooth to the USB Host Shield.
147 
148 Currently HID mice and keyboards are supported.
149 
150 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.
151 
152 The [PS4 library](#ps4-library) also uses this class to handle all Bluetooth communication.
153 
154 For information see the following blog post: <http://blog.tkjelectronics.dk/2013/12/bluetooth-hid-devices-now-supported-by-the-usb-host-library/>.
155 
156 ### [SPP library](SPP.cpp)
157 
158 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.
159 It has been tested successfully on Windows, Mac OS X, Linux, and Android.
160 
161 Take a look at the [SPP.ino](examples/Bluetooth/SPP/SPP.ino) example for more information.
162 
163 More information can be found at these blog posts:
164 
165 * <http://www.circuitsathome.com/mcu/bluetooth-rfcommspp-service-support-for-usb-host-2-0-library-released>
166 * <http://blog.tkjelectronics.dk/2012/07/rfcommspp-library-for-arduino/>
167 
168 To implement the SPP protocol I used a Bluetooth sniffing tool called [PacketLogger](http://www.tkjelectronics.com/uploads/PacketLogger.zip) developed by Apple.
169 It enables me to see the Bluetooth communication between my Mac and any device.
170 
171 ### PS4 Library
172 
173 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.
174 
175 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.
176 
177 Before you can use the PS4 controller via Bluetooth you will need to pair with it.
178 
179 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.
180 
181 It should then automatically pair the dongle with your controller. This only have to be done once.
182 
183 For information see the following blog post: <http://blog.tkjelectronics.dk/2014/01/ps4-controller-now-supported-by-the-usb-host-library/>.
184 
185 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>.
186 
187 ### PS3 Library
188 
189 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.
190 
191 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.
192 
193 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.
194 
195 __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).
196 
197 For more information about the PS3 protocol see the official wiki: <https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information>.
198 
199 Also take a look at the blog posts:
200 
201 * <http://blog.tkjelectronics.dk/2012/01/ps3-controller-bt-library-for-arduino/>
202 * <http://www.circuitsathome.com/mcu/sony-ps3-controller-support-added-to-usb-host-library>
203 * <http://www.circuitsathome.com/mcu/arduino/interfacing-ps3-controllers-via-usb>
204 
205 A special thanks go to the following people:
206 
207 1. _Richard Ibbotson_ who made this excellent guide: <http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part>
208 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>
209 
210 Also a big thanks all the people behind these sites about the Motion controller:
211 
212 * <http://thp.io/2010/psmove/>
213 * <http://www.copenhagengamecollective.org/unimove/>
214 * <https://github.com/thp/psmoveapi>
215 * <http://code.google.com/p/moveonpc/>
216 
217 ### Xbox Libraries
218 
219 The library supports both the original Xbox controller via USB and the Xbox 360 controller both via USB and wirelessly.
220 
221 #### Xbox library
222 
223 The [XBOXOLD](XBOXOLD.cpp) class implements support for the original Xbox controller via USB.
224 
225 All the information are from the following sites:
226 
227 * <https://github.com/torvalds/linux/blob/master/Documentation/input/xpad.txt>
228 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
229 * <http://euc.jp/periphs/xbox-controller.ja.html>
230 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL#L15>
231 
232 #### Xbox 360 Library
233 
234 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).
235 
236 To use it via USB use the [XBOXUSB](XBOXUSB.cpp) library or to use it wirelessly use the [XBOXRECV](XBOXRECV.cpp) library.
237 
238 __Note that a Wireless controller can NOT be used via USB!__
239 
240 Examples code can be found in the [examples directory](examples/Xbox).
241 
242 Also see the following blog posts:
243 
244 * <http://www.circuitsathome.com/mcu/xbox360-controller-support-added-to-usb-host-shield-2-0-library>
245 * <http://blog.tkjelectronics.dk/2012/07/xbox-360-controller-support-added-to-the-usb-host-library/>
246 * <http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/>
247 
248 All the information regarding the Xbox 360 controller protocol are form these sites:
249 
250 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/UsbInfo>
251 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/WirelessUsbInfo>
252 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL>
253 
254 #### Xbox ONE Library
255 
256 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:
257 
258 * <https://github.com/quantus/xbox-one-controller-protocol>
259 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
260 * <https://github.com/kylelemons/xbox/blob/master/xbox.go>
261 
262 ### [Wii library](Wii.cpp)
263 
264 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.
265 
266 First you have to pair with the controller, this is done automatically by the library if you create the instance like so:
267 
268 ```C++
269 WII Wii(&Btd, PAIR);
270 ```
271 
272 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.
273 
274 After that you can simply create the instance like so:
275 
276 ```C++
277 WII Wii(&Btd);
278 ```
279 
280 Then just press any button on the Wiimote and it will then connect to the dongle.
281 
282 Take a look at the example for more information: [Wii.ino](examples/Bluetooth/Wii/Wii.ino).
283 
284 Also take a look at the blog post:
285 
286 * <http://blog.tkjelectronics.dk/2012/08/wiimote-added-to-usb-host-library/>
287 
288 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).
289 
290 The [WiiIRCamera.ino](examples/Bluetooth/WiiIRCamera/WiiIRCamera.ino) example shows how it can be used.
291 
292 All the information about the Wii controllers are from these sites:
293 
294 * <http://wiibrew.org/wiki/Wiimote>
295 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers>
296 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Nunchuck>
297 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus>
298 * <http://wiibrew.org/wiki/Wii_Balance_Board>
299 * The old library created by _Tomoyuki Tanaka_: <https://github.com/moyuchin/WiiRemote_on_Arduino> also helped a lot.
300 
301 ### [PS Buzz Library](PSBuzz.cpp)
302 
303 This library implements support for the Playstation Buzz controllers via USB.
304 
305 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.
306 
307 The example [PSBuzz.ino](examples/PSBuzz/PSBuzz.ino) shows how one can do this with just a few lines of code.
308 
309 More information about the controller can be found at the following sites:
310 
311 * http://www.developerfusion.com/article/84338/making-usb-c-friendly/
312 * https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
313 
314 ### HID Libraries
315 
316 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).
317 
318 ### [MIDI Library](usbh_midi.cpp)
319 
320 The library support MIDI devices.
321 You can convert USB MIDI keyboard to legacy serial MIDI.
322 
323 * [USB_MIDI_converter.ino](USBH_MIDI/USB_MIDI_converter)
324 * [USB_MIDI_converter_multi.ino](USBH_MIDI/USB_MIDI_converter_multi)
325 
326 For information see the following page: <http://yuuichiakagawa.github.io/USBH_MIDI/>.
327 
328 # Interface modifications
329 
330 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.
331 
332 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!
333 
334 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.
335 
336 After that you need modify the following entry in [UsbCore.h](UsbCore.h):
337 
338 ```C++
339 typedef MAX3421e<P10, P9> MAX3421E;
340 ```
341 
342 For instance if you have rerouted SS to pin 7 it should read:
343 
344 ```C++
345 typedef MAX3421e<P7, P9> MAX3421E;
346 ```
347 
348 See the "Interface modifications" section in the [hardware manual](https://www.circuitsathome.com/usb-host-shield-hardware-manual) for more information.
349 
350 # FAQ
351 
352 > When I plug my device into the USB connector nothing happens?
353 
354 * Try to connect a external power supply to the Arduino - this solves the problem in most cases.
355 * 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);```.
356 
357 > When I connecting my PS3 controller I get a output like this:
358 
359 ```
360 Dualshock 3 Controller Enabled
361 
362 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
363 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
364 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
365 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
366 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
367 ```
368 
369 * 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.
370 
371 > When compiling I am getting the following error: "fatal error: SPI.h: No such file or directory".
372 
373 * Please make sure to include the SPI library like so: ```#include <SPI.h>``` in your .ino file.
+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: <http://felis.github.com/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 ### PS3 Library
195 
196 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.
197 
198 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.
199 
200 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.
201 
202 __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).
203 
204 For more information about the PS3 protocol see the official wiki: <https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information>.
205 
206 Also take a look at the blog posts:
207 
208 * <http://blog.tkjelectronics.dk/2012/01/ps3-controller-bt-library-for-arduino/>
209 * <http://www.circuitsathome.com/mcu/sony-ps3-controller-support-added-to-usb-host-library>
210 * <http://www.circuitsathome.com/mcu/arduino/interfacing-ps3-controllers-via-usb>
211 
212 A special thanks go to the following people:
213 
214 1. _Richard Ibbotson_ who made this excellent guide: <http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part>
215 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>
216 
217 Also a big thanks all the people behind these sites about the Motion controller:
218 
219 * <http://thp.io/2010/psmove/>
220 * <http://www.copenhagengamecollective.org/unimove/>
221 * <https://github.com/thp/psmoveapi>
222 * <http://code.google.com/p/moveonpc/>
223 
224 ### Xbox Libraries
225 
226 The library supports both the original Xbox controller via USB and the Xbox 360 controller both via USB and wirelessly.
227 
228 #### Xbox library
229 
230 The [XBOXOLD](XBOXOLD.cpp) class implements support for the original Xbox controller via USB.
231 
232 All the information are from the following sites:
233 
234 * <https://github.com/torvalds/linux/blob/master/Documentation/input/xpad.txt>
235 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
236 * <http://euc.jp/periphs/xbox-controller.ja.html>
237 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL#L15>
238 
239 #### Xbox 360 Library
240 
241 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).
242 
243 To use it via USB use the [XBOXUSB](XBOXUSB.cpp) library or to use it wirelessly use the [XBOXRECV](XBOXRECV.cpp) library.
244 
245 __Note that a Wireless controller can NOT be used via USB!__
246 
247 Examples code can be found in the [examples directory](examples/Xbox).
248 
249 Also see the following blog posts:
250 
251 * <http://www.circuitsathome.com/mcu/xbox360-controller-support-added-to-usb-host-shield-2-0-library>
252 * <http://blog.tkjelectronics.dk/2012/07/xbox-360-controller-support-added-to-the-usb-host-library/>
253 * <http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/>
254 
255 All the information regarding the Xbox 360 controller protocol are form these sites:
256 
257 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/UsbInfo>
258 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/WirelessUsbInfo>
259 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL>
260 
261 #### Xbox ONE Library
262 
263 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:
264 
265 * <https://github.com/quantus/xbox-one-controller-protocol>
266 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
267 * <https://github.com/kylelemons/xbox/blob/master/xbox.go>
268 
269 ### [Wii library](Wii.cpp)
270 
271 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.
272 
273 First you have to pair with the controller, this is done automatically by the library if you create the instance like so:
274 
275 ```C++
276 WII Wii(&Btd, PAIR);
277 ```
278 
279 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.
280 
281 After that you can simply create the instance like so:
282 
283 ```C++
284 WII Wii(&Btd);
285 ```
286 
287 Then just press any button on the Wiimote and it will then connect to the dongle.
288 
289 Take a look at the example for more information: [Wii.ino](examples/Bluetooth/Wii/Wii.ino).
290 
291 Also take a look at the blog post:
292 
293 * <http://blog.tkjelectronics.dk/2012/08/wiimote-added-to-usb-host-library/>
294 
295 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).
296 
297 The [WiiIRCamera.ino](examples/Bluetooth/WiiIRCamera/WiiIRCamera.ino) example shows how it can be used.
298 
299 All the information about the Wii controllers are from these sites:
300 
301 * <http://wiibrew.org/wiki/Wiimote>
302 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers>
303 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Nunchuck>
304 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus>
305 * <http://wiibrew.org/wiki/Wii_Balance_Board>
306 * The old library created by _Tomoyuki Tanaka_: <https://github.com/moyuchin/WiiRemote_on_Arduino> also helped a lot.
307 
308 ### [PS Buzz Library](PSBuzz.cpp)
309 
310 This library implements support for the Playstation Buzz controllers via USB.
311 
312 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.
313 
314 The example [PSBuzz.ino](examples/PSBuzz/PSBuzz.ino) shows how one can do this with just a few lines of code.
315 
316 More information about the controller can be found at the following sites:
317 
318 * http://www.developerfusion.com/article/84338/making-usb-c-friendly/
319 * https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
320 
321 ### HID Libraries
322 
323 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).
324 
325 ### [MIDI Library](usbh_midi.cpp)
326 
327 The library support MIDI devices.
328 You can convert USB MIDI keyboard to legacy serial MIDI.
329 
330 * [USB_MIDI_converter.ino](examples/USBH_MIDI/USB_MIDI_converter/USB_MIDI_converter.ino)
331 * [USB_MIDI_converter_multi.ino](examples/USBH_MIDI/USB_MIDI_converter_multi/USB_MIDI_converter_multi.ino)
332 
333 For information see the following page: <http://yuuichiakagawa.github.io/USBH_MIDI/>.
334 
335 # Interface modifications
336 
337 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.
338 
339 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!
340 
341 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.
342 
343 After that you need modify the following entry in [UsbCore.h](UsbCore.h):
344 
345 ```C++
346 typedef MAX3421e<P10, P9> MAX3421E;
347 ```
348 
349 For instance if you have rerouted SS to pin 7 it should read:
350 
351 ```C++
352 typedef MAX3421e<P7, P9> MAX3421E;
353 ```
354 
355 See the "Interface modifications" section in the [hardware manual](https://www.circuitsathome.com/usb-host-shield-hardware-manual) for more information.
356 
357 # FAQ
358 
359 > When I plug my device into the USB connector nothing happens?
360 
361 * Try to connect a external power supply to the Arduino - this solves the problem in most cases.
362 * 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);```.
363 
364 > When I connecting my PS3 controller I get a output like this:
365 
366 ```
367 Dualshock 3 Controller Enabled
368 
369 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
370 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
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 ```
375 
376 * 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.
377 
378 > When compiling I am getting the following error: "fatal error: SPI.h: No such file or directory".
379 
380 * 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 9e3f6c63..4c79b845 100644 --- a/_s_p_p_8cpp.html +++ b/_s_p_p_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: SPP.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
 

Variable Documentation

- + +

◆ rfcomm_crc_table

+
@@ -124,7 +106,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
}
-

Definition at line 26 of file SPP.cpp.

+

Definition at line 26 of file SPP.cpp.

@@ -133,7 +115,7 @@ Variables diff --git a/_s_p_p_8cpp__incl.md5 b/_s_p_p_8cpp__incl.md5 index 2e490ec2..48f872c1 100644 --- a/_s_p_p_8cpp__incl.md5 +++ b/_s_p_p_8cpp__incl.md5 @@ -1 +1 @@ -13ec96c550e18a5b87013a932cc6a9c2 \ No newline at end of file +b9aa79f21f664e4fd1d522234b09e828 \ No newline at end of file diff --git a/_s_p_p_8cpp__incl.png b/_s_p_p_8cpp__incl.png index d9bb31f246417732c13a90ff1fd13f7fa6765d4d..edb7b346b3a44362a8aee9062f832e5224f25bb2 100644 GIT binary patch literal 15728 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 literal 16057 zcmd^mWmg5fKDbMQTW}8$+}$CN+q~=k zh`ZMP1Z!rhySl6DoW1wiCqhX<3ImN84Gs2hJrpEDP8-e=RpSXp2!h+eM+d=+_6Q+}Vcxa;R|A0vh5H}|1<--0 zbP<)6l`ZGW)sk~^PKn=7M2qAIdX8A$pU+FXW|WVO~+*< zwW)KiEY8rhi>1&&o7<7|)0tT8A&=*|p^U8T=v4cqvLz)1!OOBSEqPu96hev|#G(~S zfFKq-Y0b(|6$l3Np@Vel&{%-4^5^uGwGnZKKI){*baelF@qXM0r`R7!VVZ4mGHE+$ zS}9ep(q?SEzxRCHPEyQDtX9fLXtY^~l}V=07l>6sxP*W~?*ap^Nhy5J;XAK>38)s! zy=!|qZO0eQ@wxo+`1fi;?E)7UH)27No{KBxa%Z%JV4B-*`LpliHKp#xb>CNs9vp&{w7tuQK+A3;bbez83J8{Z2G@U_UEcl5C*vClI}J9x{5e zT3eOdoUL`1eMzEK@TRtczz_)o_(dLIA%~xfr z`-`oE$D1Qh zJ-%c*|ChfZY=zx^&rk%uKg67th7<$&;bmV7!V2M!uzBHybjen0gu!7Lqrl$ z1dZV-AM~_uAQ>o7QmH-SQzF{CjhKM-dNu!-2RhNN7Wb13vSBKTNTq)-�H+Vkg9d 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 - + + USB Host Shield 2.0: SPP.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

- + - - + + + +
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 = 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 && (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
+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:444
+
const char * btdName
Definition: BTD.h:447
#define BT_RFCOMM_RPN_RSP
Definition: SPP.h:44
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1262
-
#define SUCCESSFUL
Definition: BTD.h:175
-
bool sdpConnectionClaimed
Definition: BTD.h:439
-
#define RFCOMM_PSM
Definition: BTD.h:179
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1260
+
#define SUCCESSFUL
Definition: BTD.h:178
+
bool sdpConnectionClaimed
Definition: BTD.h:442
+
#define RFCOMM_PSM
Definition: BTD.h:182
SPP(BTD *p, const char *name="Arduino", const char *pin="0000")
Definition: SPP.cpp:45
-
Definition: BTD.h:198
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1315
+
Definition: BTD.h:201
+
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1313
#define RFCOMM_SABM
Definition: SPP.h:30
#define L2CAP_UUID
Definition: SPP.h:27
const uint8_t rfcomm_crc_table[256]
Definition: SPP.cpp:26
-
bool rfcommConnectionClaimed
Definition: BTD.h:441
+
bool rfcommConnectionClaimed
Definition: BTD.h:444
#define SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU
Definition: SPP.h:25
-
uint8_t identifier
Definition: BTD.h:617
-
#define L2CAP_FLAG_CONFIG_SDP_SUCCESS
Definition: BTD.h:147
+
uint8_t identifier
Definition: BTD.h:621
+
#define L2CAP_FLAG_CONFIG_SDP_SUCCESS
Definition: BTD.h:150
#define RFCOMM_DISC
Definition: SPP.h:34
#define SERIALPORT_UUID
Definition: SPP.h:26
-
#define L2CAP_SDP_SUCCESS
Definition: BTD.h:118
-
const char * btdPin
Definition: BTD.h:446
+
#define L2CAP_SDP_SUCCESS
Definition: BTD.h:121
+
const char * btdPin
Definition: BTD.h:449
bool connected
Definition: SPP.h:84
-
#define pgm_read_byte(addr)
-
#define L2CAP_CMD_INFORMATION_REQUEST
Definition: BTD.h:170
-
#define SDP_PSM
Definition: BTD.h:178
+
#define pgm_read_byte(addr)
+
#define L2CAP_CMD_INFORMATION_REQUEST
Definition: BTD.h:173
+
#define SDP_PSM
Definition: BTD.h:181
int read(void)
Definition: SPP.cpp:811
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1328
+
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1326
#define extendAddress
Definition: SPP.h:36
-
#define L2CAP_RFCOMM_WAIT
Definition: BTD.h:121
-
#define Notify(...)
Definition: message.h:44
+
#define L2CAP_RFCOMM_WAIT
Definition: BTD.h:124
+
#define Notify(...)
Definition: message.h:51
void Run()
Definition: SPP.cpp:423
-
#define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST
Definition: BTD.h:151
-
uint16_t hci_handle
Definition: BTD.h:451
-
#define Notifyc(...)
Definition: message.h:46
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1173
- +
#define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST
Definition: BTD.h:154
+
uint16_t hci_handle
Definition: BTD.h:454
+
#define Notifyc(...)
Definition: message.h:53
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1171
+
void Reset()
Definition: SPP.cpp:60
-
void(* pFuncOnInit)(void)
Definition: BTD.h:605
-
#define L2CAP_FLAG_DISCONNECT_SDP_REQUEST
Definition: BTD.h:148
+
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
-
#define l2cap_check_flag(flag)
Definition: BTD.h:158
-
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:166
-
#define PSTR(str)
-
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:168
+
#define l2cap_check_flag(flag)
Definition: BTD.h:161
+
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:169
+
#define PSTR(str)
+
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:171
void discard(void)
Definition: SPP.cpp:801
-
#define L2CAP_SDP_WAIT
Definition: BTD.h:117
-
BTD * pBtd
Definition: BTD.h:608
-
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
-
#define L2CAP_RFCOMM_SUCCESS
Definition: BTD.h:122
+
#define L2CAP_SDP_WAIT
Definition: BTD.h:120
+
BTD * pBtd
Definition: BTD.h:612
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:37
+
#define L2CAP_RFCOMM_SUCCESS
Definition: BTD.h:125
#define BT_RFCOMM_RPN_CMD
Definition: SPP.h:43
-
#define L2CAP_FLAG_DISCONNECT_RESPONSE
Definition: BTD.h:155
-
#define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS
Definition: BTD.h:152
+
#define L2CAP_FLAG_DISCONNECT_RESPONSE
Definition: BTD.h:158
+
#define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS
Definition: BTD.h:155
void disconnect()
Definition: SPP.cpp:72
#define BT_RFCOMM_MSC_CMD
Definition: SPP.h:41
#define SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU
Definition: SPP.h:24
-
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:169
+
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:172
#define RFCOMM_UA
Definition: SPP.h:31
-
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1341
-
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:167
-
uint16_t hci_handle
Definition: BTD.h:611
+
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1339
+
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:170
+
uint16_t hci_handle
Definition: BTD.h:615
#define BT_RFCOMM_PN_CMD
Definition: SPP.h:39
#define BT_RFCOMM_MSC_RSP
Definition: SPP.h:42
-
#define L2CAP_FLAG_CONNECTION_SDP_REQUEST
Definition: BTD.h:146
-
uint32_t l2cap_event_flag
Definition: BTD.h:614
-
#define l2cap_clear_flag(flag)
Definition: BTD.h:160
-
#define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST
Definition: BTD.h:153
-
#define L2CAP_DISCONNECT_RESPONSE
Definition: BTD.h:124
+
#define L2CAP_FLAG_CONNECTION_SDP_REQUEST
Definition: BTD.h:149
+
uint32_t l2cap_event_flag
Definition: BTD.h:618
+
#define l2cap_clear_flag(flag)
Definition: BTD.h:163
+
#define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST
Definition: BTD.h:156
+
#define L2CAP_DISCONNECT_RESPONSE
Definition: BTD.h:127
void send(void)
Definition: SPP.cpp:769
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1221
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1296
-
#define PENDING
Definition: BTD.h:174
-
#define l2cap_set_flag(flag)
Definition: BTD.h:159
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1279
-
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:164
+
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1219
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1294
+
#define PENDING
Definition: BTD.h:177
+
#define l2cap_set_flag(flag)
Definition: BTD.h:162
+
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1277
+
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:167
#define BT_RFCOMM_PN_RSP
Definition: SPP.h:40
-
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:600
+
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:604
void ACLData(uint8_t *ACLData)
Definition: SPP.cpp:84
int peek(void)
Definition: SPP.cpp:805
-
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:163
+
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:166
diff --git a/_s_p_p_8h.html b/_s_p_p_8h.html index 2437697e..96185b96 100644 --- a/_s_p_p_8h.html +++ b/_s_p_p_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: SPP.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU

+
@@ -165,11 +147,13 @@ Macros
-

Definition at line 24 of file SPP.h.

+

Definition at line 24 of file SPP.h.

- + +

◆ SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU

+
@@ -179,11 +163,13 @@ Macros
-

Definition at line 25 of file SPP.h.

+

Definition at line 25 of file SPP.h.

- + +

◆ SERIALPORT_UUID

+
@@ -193,11 +179,13 @@ Macros
-

Definition at line 26 of file SPP.h.

+

Definition at line 26 of file SPP.h.

- + +

◆ L2CAP_UUID

+
@@ -207,11 +195,13 @@ Macros
-

Definition at line 27 of file SPP.h.

+

Definition at line 27 of file SPP.h.

- + +

◆ RFCOMM_SABM

+
@@ -221,11 +211,13 @@ Macros
-

Definition at line 30 of file SPP.h.

+

Definition at line 30 of file SPP.h.

- + +

◆ RFCOMM_UA

+
@@ -235,11 +227,13 @@ Macros
-

Definition at line 31 of file SPP.h.

+

Definition at line 31 of file SPP.h.

- + +

◆ RFCOMM_UIH

+
@@ -249,11 +243,13 @@ Macros
-

Definition at line 32 of file SPP.h.

+

Definition at line 32 of file SPP.h.

- + +

◆ RFCOMM_DISC

+
@@ -263,11 +259,13 @@ Macros
-

Definition at line 34 of file SPP.h.

+

Definition at line 34 of file SPP.h.

- + +

◆ extendAddress

+
@@ -277,11 +275,13 @@ Macros
-

Definition at line 36 of file SPP.h.

+

Definition at line 36 of file SPP.h.

- + +

◆ BT_RFCOMM_PN_CMD

+
@@ -291,11 +291,13 @@ Macros
-

Definition at line 39 of file SPP.h.

+

Definition at line 39 of file SPP.h.

- + +

◆ BT_RFCOMM_PN_RSP

+
@@ -305,11 +307,13 @@ Macros
-

Definition at line 40 of file SPP.h.

+

Definition at line 40 of file SPP.h.

- + +

◆ BT_RFCOMM_MSC_CMD

+
@@ -319,11 +323,13 @@ Macros
-

Definition at line 41 of file SPP.h.

+

Definition at line 41 of file SPP.h.

- + +

◆ BT_RFCOMM_MSC_RSP

+
@@ -333,11 +339,13 @@ Macros
-

Definition at line 42 of file SPP.h.

+

Definition at line 42 of file SPP.h.

- + +

◆ BT_RFCOMM_RPN_CMD

+
@@ -347,11 +355,13 @@ Macros
-

Definition at line 43 of file SPP.h.

+

Definition at line 43 of file SPP.h.

- + +

◆ BT_RFCOMM_RPN_RSP

+
@@ -361,7 +371,7 @@ Macros
-

Definition at line 44 of file SPP.h.

+

Definition at line 44 of file SPP.h.

@@ -370,7 +380,7 @@ Macros diff --git a/_s_p_p_8h__dep__incl.md5 b/_s_p_p_8h__dep__incl.md5 index c4196b87..026dbd27 100644 --- a/_s_p_p_8h__dep__incl.md5 +++ b/_s_p_p_8h__dep__incl.md5 @@ -1 +1 @@ -8fa503e9bcede23521cf22418b0e794e \ No newline at end of file +f36e77e58f6fed5fcd04ea59c72b0abb \ 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 55aae5b1c2be23d7dec4dd0b75c227a9a3062d99..d5bb2950f8a97ce3b4df0f13383bfc2ec0a8a1e5 100644 GIT binary patch delta 2699 zcmai!c{J3G_s1gp> zpG6IBc!x?l<(SzQ3l^l(tsGX>8zX{yCIWgtgkd80+@FsB)SrbgG~5qcV~Cc z)&@q1GR#W_dPS%#Phvn=yd)ZW2_MJHTW}^TogT72i@JULL@;+{yw)cnp^GhiQ@5q1 z<&F1H$)xI$!r1SLdh0Nq&n)*B`Y4w9hUX>(4;)0qw4-dotmj?xMXwB>lg3vB^*hML z4xS?{p8=zX>lPHZy{q~ovwemu`nz+~7ng_M4whO2N=s9XI-$QuGE4UvGpr=7upW%t zK%t4(Naa0?yxU(Yav}RRm)lD10 zf1>DCUDBz2Km68dJT!Xjz1LuUSU~-i_N)qr`tPTLi9cTHndpomesgzi3MkTk_{VH_b)q<6s^QQx(q(P(bAGN4up!#} z^($;g)7YX2Q^PN*aK)3sn9;YZc0cDgT9r_7_k&)2*jk}&wY&ND($LCQ%5@b8Iwa)y za9{QQzvz$AN1C;~+@YWN74FvIWlUaCC%e98UoJMz1{`oJV>SDD98vjwhwi2f zI#I2>K9K?XenC@nNgA)&v?2Y+p2^m(Btm;D1i}L{475FgZCIBD63Ryj#*pp-=`X z`t03)q1$Cab3j|vFS}}-1e*o6Y7};?IIbp3Lyo_4h|J3nN%!&hme?P5^5WKwIxuY0QJ9T(;1Xom? z5Q2a_)fDh5DhOX14aeit*@50XAK+ukcAei`E;ZE{7zw+|GkVdTPy)`eBoI!_a5%D^ zdtn+P_BOi1)hV7|YX-!Xo^BE>r>-B1h)sKfnb#2r1aSy>(`WoNphI5daAd}Lkcq5(5D^uS zUeFiA>^E5TwP#`Ms5q@BF#%;^Mc2AY6tr%eS92P$)VB|QYXXPILblAL@nAHPg99t2 zfMr2&FeAOGC}Sv_Bov+g9?eOGfgnP|yfXg><-bB8AnJe;Zf&C8s2;ZhrcQ>btxd64-d&1aUsfLVbMpG+`bF zjg=RK`LTe}e%G=uU;6*RUslwwyBzD$OLjZ43?T<6W(cXo1^D-Iaix=ZX%-+;_)eMTdFFM+>9X9+-I=TZQYXM4iW!V5S10W}5fhCJ2P)f$0N-z3u;54Pa3i9=VtGMQ^NqI{#HwPg`) zIc>45?AIhW28vAgA0_lY++O0(7|+}DsC#~z8ThlktdXw1@mNp^w_o`8xU5Npk?6L& zr+)ifdxnBgPiqoSt@3KXtgg&OanS&5$#3S0v6W=XjM!f==A zK=t+MX4VQ(0Bd2PkXGH@q6cPZ{tOt>1R-7ejrTM*=RN`6m%8#Wrg^Gi`s2TBbM|2u z`9Sf$Gcz-XthYw%f~0`4ELl@433y^qmW;_@ur*=B)%l$e8;!fy_(zgf*eU~<8OuYm z-cd^ocO+-ewq=S>y>s+?^Vi&FUqj@sB70F~-$yOhsrUC<&tU$U7h>pnoDjb>Kj`I7 zA?ws$;ea|~^z>L>pmZR)$t-&&d)P}FPdi*{yJ(J?1Cd+8Xi#Mg8`O?Hhi!iw`Qlve zog$3*61_ZUQd^_5^>toG_xtNW9wP zcSy;?6ntZ=DR8)#`BDqJ{JDFNTe?Zl_m!x+f8ez8m(lyl;0qTxKg~Ng?W*1L;c1R< zayu{Qe;Yil*Zyrh--zcT#dW#~K=2WGe)8$t(R^>-h}@C>_UE!ynOQv(5CLk@9iQ)d zF>riz5V~$qk}7sZ`vASrYU1kZ%9uH`+>KM{ z_82*k?gvjS@U6cbHD?CJJK!s?c+e`w!<99k2iZ literal 2717 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 diff --git a/_s_p_p_8h__incl.md5 b/_s_p_p_8h__incl.md5 index f139a88d..39ec78f3 100644 --- a/_s_p_p_8h__incl.md5 +++ b/_s_p_p_8h__incl.md5 @@ -1 +1 @@ -ebaf4a19e87d528fa81f6393cdd2bc87 \ No newline at end of file +a91a331bec3537c7a4cb45239da270de \ No newline at end of file diff --git a/_s_p_p_8h__incl.png b/_s_p_p_8h__incl.png index 1814c5677c6950c5bd5b2270dc3cc1d317119252..ab21d2635e0b51fb7ffd833b09ecccf885daf778 100644 GIT binary patch literal 13649 zcmd5@^;=ZY)`oGEA%vm3krq%u8VM1OB->F)0C4(aZclsvhs4w zIOfYCFx3he?HnkpUnGat8Xg-8jiJtTgg{-${GP^m4%F&WRt^nimkv3`q7S)PZSz`e zS6MGc+%BX)BwP1{qeJw;!2v&48uvqCUtkg)%tG^&9aNA96&Sn@#wic<8d4CY^LTrv zSfW~4ar^Pbp9OAtewZP>O{G9(1{HpfiI^D3=7K* zC+2yR?jxeW>G|9uBKf=bBLV!(dgO%P+9Mu3E4mIwLJ>!DC5coWMM}lS9WZ#i-EnfYJXWL8@#RKaIvSb)3JQuXf}SS(gWWXO zWAeu?i-jsbl`)1E(#!GTJ)z^iV3jhBU)o2TeG$<@pdZiY zL(Ee%#VYP`lze=t%H>)|>@wfJVZ5WEnVQHJ+qM-Zt1xi54@T zO$KHohyQ(4Yc`js+wDKF4n0n0GZDJlpSkFNnXlCMol%d}-x*E4e7gCgP_ETVbjG5= z?RHzy(r&kh@$`5xW_P+KxWC+3O&Mx+oFdolJoUq#DV1o5x7Xa_Se zh~PlfyS>(%)$Bi>FPf;|;~3S1NZn51m5P{xm&*i&;e8Nl+eIB~XFhJ&L@iRt4{tG>DwfJq}W9z&;4U^115g^R1QYj-Os+Cl84XF5yG5|{qTLcPP=(7~ZjqXUFqq*89V z=j?h(yVC5KpDP*fqUmXk5ONYi{m-zF*gkyt5EB=dw|ve_3B`aIQ(*djk#39(h2a9H zNeiZXaw-Uufbv_6uwQw@MRy>x91`;b$Ez#9v@uT$ddkfM&aIV6<#u+Kay=<1_)@iC zL&tnlavfwF9124ND@wqX${70*>`_bKE6^^-<~1J|>HesjE|8}bzStZt34rbECF1uU zuDVyL>XuO}W|y19B*~+WvOYp}63HGHQ_K$ifl=Q=+unW#=CeNcS3{ozXjsBdEpEvH z@6!HhhoBi~SikbM>PCa77QC(Hnwx(MPwhoW=0@o8Z>HrVjlV5{#xmUc(y1`87!Qk4 zb_bxb_6G9DpA;nJeQIV~R!Inw0&xi3ega0u@YPPX4O;;k4e(v{>j7}l|1(p8?Mtw` zbXPbWk#JkD#Yle2m(k2f<%yU`;c9QZ<*-l>Go2|~+vwv6g~dSkuGXw$_r1h!oy{BQYnZ6bePdzLf3{?6H8f z&{@L3m6a3IwPvrnD*9GLzF=kZyF1Ztg(Lqt@PX|R7Rd4!6e(Z>nk6(q(B6*TEJn|vixgK?Q91Mg^UU|@DdCIa8M~Wwim>HK5}jkM`6S_Zk>?bFxVbd!}I+CEqP{5361YoIPt-^ zg{luObIDUiU?NC@49M+{oJ>qqv>$u3`Q)z}x!A#}ANjw(PoI}HCk3fxxdn%Z=OkOn zaO7;HAW~+K$w|=`EyNH$mZ??yQ_H069vbvt-CtqTF);<~Pjgv_dyFQwJRCR2B=jTO zjwbj{)r!el0}e5Bl()|sg?A7Eu{R{T0@D!C!h?7!o8lS5}r>q&? z=6EJ!k!oehK2nwcLIYK;gnJ=^tNGkd}lF8&)hsA7Sddoj!;-nAcx86qyqG z??iN!_BOVW01aL;-3V)8GULRx{h4Am(`j1VWeg0A0{4e&y{mdk0|SGJ5azaBjAOT{ zED>avH7^9?!}&@(AgYSVZ4bs40xs=*Y<N7KmW zDdfu_hK)~RVPXnfghjX3Z+-o+ z%`E;!I*BdwX4Q4f%&o+lGJSelu@Zq?t<1?aY#2Tih6EBE0)I`y`^%`=q=;(EQqn1e zb?jr0r|kZGx1$xUR%852A-kAL-6wcpnR&u`J(0b4jkab;YVCR6Y_c}@A@tb zhT>xHV0fKPmzQ?wd1`OaNTf!RIr4!l0Pz5e&*b6ysMBy@EC3&rbOm<8|3H}25E_aC z_*g*y5^!Ys(Z@rU(C(XQ0M-4$nKm@Og8{) zKq2bX9UC}cJx}7cOH)+sJMR=#T3ogXdW?x7Z(Omz-`+1GSODIm!MkH{CTHO!BIXeJWu?Af|9 zQ{3CbEz~(x{QMiariG=kD;)iF7qLRlZ$^t!LsXQj@)vcdk#fFle9j+_Vp_&&XRMhW z+h=ebv$oc(l3M7+4t}`8CG@mHz~~1ykDZgWdIkw!Q}UcSvql3&oopMUa;6n@(5c=z ztPeg^Ko@=d`C{Kl;?(A3HI?quh~m{981>BQuu|r7LX5$06#6~*0ucuR2MK;k{B$Qh zAP4Eo=5Hk=#@i0Bqrxvi;+5UzYFsquyk9y~d9S*zjqy!fDl>#OBiqS^xu-7o zihKQ^kzb4KSc{U8fu$%r|BfIa6CrWU<#@h0C>AN!$mRZB?ZC%vLnQ$Qfu(h%XGVVO zO-P_6_*8;Cl5)ptV3?-Tau<&d0er1E9Q;j(mje71xM0r*tu9uKtM%zRLQo|IQwNL% zmLiAu7qa%c1P7w6JKdf#T`m~4k5}p&t@i@>;NRP)eWVDzs8#2RZEl4y2J4rnxex_| z4d0pOwUI_}3fE^jDs&)*By%88qj6G3uttc5HYB#)>Xpt%xc%k|EXVf}BG*Ae{A7V- zZrI;yc(b~sE>kL#*3!clc!KW*LuW|=CoFKeTuODE!)!;aSI?ql9deo5HE3R&@36EP zf zMRvbxd$y)sAHSdfCeqP=`byUawoWzQbj6aJpKl5})pTUX#VL&LX&ee+mx#bblm$M5 z;M4tLWQNn3UKU4#U)z%d<Z0o%AgxWN79Seo|z`^4v` z6A?k5PDEcC;2(4zuCvc~b1yH=;&Ocah~GG;yX-6Lmi>&L&;9)u-=~+AD4in)yi`Yw zzLON2Q>5f>RftkU-ehm~)LMCaxO^%%wteT*%kzoy{d&M> zlY?2xrkt@L98ECFyUyz)u>#8#EY0zj?YK9-wE>8j9^>!aWomXQbZ8MT4-v<|%m=pr z7{K{fqZndY{d1(|O9u-^3a_)EW!Q8v4IFJM&m87Xywc99zz_!&%H+pT@Zhj?tIIt~ zKun#td4>6c0|2DjH+tJcVX|NpO29f05p%cG$1q;wJ8g#9`=(|kEfa!+^f~z~@en_L z3?CACPubzVU$|tvJ=ku1w8$s=qtDrw6XgF(XRd5hu{iGOi)8Buv!yzm6>DLF);sDk zti3RMdGS927%40zGy>fj9Jg0PfXkwPq|R8HRFU%gUm0g6H9r1(zr!AYfKrE_ z%D#h3@vn=g2U+NWzphNgFtra4S3~VyO4y?y4k?%xd zAYEdG0w8hwd3z?}^l$#xM?-9};CV9`A423?YfcEGBAeN@Y!aIZ;?pxvv5N0bv1jS5 z7TR$$&btN%ygvZcT~frzcq8n;{N)wGXe9H?_E6&nN=_3r0V9>nXD z`efk`lGOd9qq(yDYSIdMjIpf(9&JzCDoMx7jpj{GXTh8g8NR^o>H5QtsW|OuC5fig zQ@(v0#78=cWpKXS%Wn_N9MkK%ec4xQc}wyWFsA(1uS4Fk@gOAYa`3m1OnkJKfYrQ5Pb@@sJRNgE*(#~P4ZIgRjh zb9-MO=_5O6!6W&=`H1TreyyCeJUgrGVwqzx9nXl`4Vn&u$z#lZnD=7_y@_0_S>MMP z9l^&{iTXQAOkb~Agig-PteuiSJbRGx0lD66MZ$WkAOEW~dp?aE0V_4Ndcsf7(8XFw zO1yJ>N7oy}Cf74}Jo2?WQDar-;c)?$Uguszo)pJVwtvZhq^1o49UvjZjur9^U}Y=$`YGEsh;E_qo}&&R+D?L|eYB`t-&-Isgo-D>=4TNzoQurex6k7XGU z!zK7D<;He8_m#)~TzMEWx+Pg5my0<&W{IEkf5d5BUhJdm&RbMfoFjrcSfAYm@5P;%_eO37x&jm>}Fo;&In1m%??M# zGet^X{J+oK$ubxaSy&azG)f{4XMAjIY-s7}zw*h^{Fy0c?ZMjjwEwD^{6j1hkKAFv zVw(DcOs^NL>?8bi0kSYiY!9WSg8iSnkRurJ7sI|wtA;rAVD}Ui;#}l0VMcyOq>$A;1 zix?%%WdYi zPpD}vcgDDG%HUFc1ucGa)loxROk3dWP?5UO4`!Xyn zz=44`fjJ+b!Ns(@9#Ya0m@O8OXO!-)j4C@@`dzHN^_qZ~`^Ov_U@|d^$K8C>P>+`< zN8Mk?(qif%IPbH#Z2v-{&uIz(hVEagI>Z7!1`y@>{gPEXcJu7tNsd2m!hi)uJ->Ee zCyy{+s*_HsXjJ281&AoIG&fyT5V^FsH(5wvAoO0K`d^w45Ip*WgM(RLW6Khi@mUQ+ z1y^n9UWcJ zZvdB(^lm=q#%o3K33mIxEffjCDcW=4?ICHRklPZ6Yo+WRN%-KCm7V<$py=t#in#nu zG|G8P|jCvefH)}R!odp zz9YageUl>5U?`^~Z)3rNU%}c9#Y3gbTa8^ui|n?3)tz&AXwJph75RplV9V#>q+Po} z#xb{{fs<>vb6i4xTG&dy)>H}M_Uj@lS}bzT=CZJk>2!Q#7?n<7XlgBVyi~--_6S5# z$F{$H`Ys|gG-sjOXo&H&i|60(U$K@N%Cc9t4IK3Fe;7y5W>VXElbbSra zlh&Iziqpp{%|k7MV5r6ZbRpB2KJA+;Ylm4;VB2YDu6II;dfr~*b_f0A1~2<5Bl>aO z?l1Rj+`{dkZ!+SLqqLxrO}pWFa=!Sh zE3``8R^;*7C(vj#r84NwZN{i4#N^>>PTN9HRE%9?7^m7@(--!HOHFF+^!wOyGqY!Cv&K%1`7z;Mg~x4})NqAHDj&PHK&%3EY+4Vu+GMH^-8@xdm8IuZjU=$s%!D zO--4xWZiG_Yi5hy<~kH+1-7H|`pM^YLT^J$xkd>8N_?#uj%W~)5C#jUVre!_`AoS+ z3Ti_9J$NsmYwjjQia?KcsDXZ(+jT?`eF72`aKz}KwaO^dZujuw&oX($cvmDRCDp`2 z?Is;xkby!$IfNV=l-$FL-21gwv$HJ22nqAJBu_qJ=MG;MY)6PHBDQpwTSDY&c(gZ_ zErwQj4%<^=eOYz0<(?^BV#@eP^w~pzcj`-tR67+KXu9~(+-c~d6>(Nf3}ZfkbzT$4 zl!Y$*e ztAFH9RT3_<|LiDTBwSq-2Bsv!id1)iV`!C(+6Ow@@Hflj zlpf~;WD~5S!S17^foQ_Ux*J;QSq|k4h}KDNv~L4+h}On4OEL`oTUyD01Vrz{(Fbnl zbI@BNPEFMkM5Pw|n{`P~ZD;OS?>iE>q5- zXDlm$RQg~~UYi}@a~d_I9(F$OAPU17>|QSsJ_L{Ia#H|7K10oUf0|u#jC)o%I%fj2 z#^SqVbj_p0RuBz$NJNhs0k>V8YD!4#-N-z%fV_6T} zlRuh;JktG5v9 zC}IgSkuWW)on-E8m}22KuKO`hlHB*-QA6}Ip0n-GQ_^q&gYeQM=E8CTHOrYl%JsKu z?$1j963!M0dCvK{`L_|_q7@a`F7Mr4NMUk%qRCVD-XWh?C9Cl2;sp>2F$2(6nd?l- zu=?7{PI1DX*o6e<>_IUA*IH#GFP?qAA0_4BfJ)3|^ZOLojM%-^)}WrFUflL*yzAYG zX%#zEWDvZtxbL!yzhwyNtuX;e9sCn?t{geY?&|))z-&C?IHsxv?bdSAxM{B* z!R!YCaLK!hDOC6s3Aj!?g&gHo2|vG&rS*!Yb6>7wDmY%5LFA5LY4W-##Acd#Sy5@^ zRIs1w3}`_W*~5c;UguToJ|Ne8&nJ7Sq@VC*hu&fxP>hTO7DY3WfDhNXl3Z~~Bv*cz zcF8Pk>UHKkd@qmn|4v6b1W&;GqfP#7r%(P9V^rk?3zj#sUz&j6n+Mbk=lcPg&r>`n zj0!Dx^^uTW8BhUIe%^0M22?-B?6L?!S{ZTL_r9a5nimt?XO=4j=+_i2_xm7|N0o!i zZaTgd+#xu_So-ZffWL_Anfbbp;ROOh;?edfn`&9dXbmc{DMAvs4;T0#m~aN>TJ`(Z z{big+Z&Ne7T7K#GtqQI*bL0y87>XY$+^|&;jNXeK7c{IA3V~c@b(9i2Zr{h2Nkbor z8CBTKl%?@ro;nQX8+E%qD!n`@q!TIvGe~=7h~c}%t+&MEcwb4i;{CnVQ-)M4XHsDm zll#S5&VMYDBbPapa!s#@wmRE*KizzzX!3Y?zD-2VVXo*J^8^M^FkFbie4p7n1ZTL> zePn}Y9sknA3d;bI8ZnYYrWe@VOfe_;7g$31K3Yok_lHohz?`WKe4bcllw7Up9mT{g zHhm0w9K-(9Vr?@qja8POs^U`RCauMCL%aC2!ogQOA&_y@#&~$EtE{Q!bH=34I3zlR zr4?@QSoOIzk98^-24On>^-|F)kGTKEO$;<87o#3tMK3wawe|O z*_?Ly4ZY*`UoGrwS0W{gl2q-xV~+D(tj4940Ct>erWd;0l}I!{9PaCmN<>GL0I|1ain^Q~`D zC00ZJlBd0k-k5El%6MBNd9M81_uK*^;bxr=3f0Dtqg!}m#}F_PV7qp-MlFi zClL3hN@V@Lu568uPm|O3ma!e1Jz&#_MrxO`?KXSQpK$WW)xQF-mDZ{fP)R&$k)A4? zcuNUi!&b=$-Lz(CkekClM-V>b>!40qs7{Ag$wuws9}3evjwW4&e3tMPA?g-~V>{}q zWOwn-`pCCG_Iizws`>}RfE6QMK3mke#lioOM$V>G zA)n&CT9r~G`w{LAg!HqA^0kx;4h28IR>23^Db^67eD`&sGP&FW+4t)62DL&oSVCw( zTvx8Gc@s@0lCtTlrJl|*1m>2L^R?x31#Kx*{g7zdNprOx7zIJ3QaI&nvHSN6fQR_j!N3a0N0FUANWge zZXSE)l)3Fz$UOZ~l)a?D>As6*o|`}hM5KhYlw+7^&~yCBT(Bl-WBH{0MaI~eJs{o_ zKn;4uIrkg0K$tWEsD0B2^+hxTpiGmeZE)!qp^bPO_=6J>0P9pC)doZ4q`i~O{RMjy zI;PeDV2m&KFg2wwRj&=!)6=+0sj5acN+tNg?I88EX6>8Gf3)&3u$)(LHUyWsNLlm! z*z&RlxBb@@l9`3-)tl_*&FmyyxHSK0xN6~8hWPx_?-5`*siQ0*k`Aq9ptf!tUm!}C z`Lo&nfEx9aL>>Spbajv4C7!Rgx)y3Q+UVuZc_8fqI8Y3LLV9_njGBOCLGR>RPz>=O zmee)Ks^26riKCSlq8%oV^AN8V4I|L=&I+$UN%*=ef^~CPJvP{a?%)0z8HZNzpJE`9 zW^kg>)~NE=3%bk22!{dZ`R-hKIwRVk$I$!w@gU5(Y5nQ*r z9~E#f9K9Ry`577#N7MVEvfJcxcjBX^sOTH_s~HtN*)HxxrpHV@*p6V8>q%=oK&E;k z+lMeZ^8s1~1iG^>5IBKH&{DdhJ!Yj?wO+-Q zOaU5@^#Y&&E+j9KjE|U##fbBVN=o(LxWPQ>sdy5DM}ZNB6Z)Au^5 zYosyWi_ph&3ax*ra>J>)6FF>sFo4v9R^s$>N*1}7yIJs0P7W2d@9PmmGjOF zF4S9TyKDr}^x#{h?Grt(Wycu`dH}@#%d^6HN02vCfjy@Ss2H*LEAiQDB_e+oImYg} ziG}w-9qJIhp>rVwkiHz*oVaa1x&fx^d%Y`_sm}Ku)lVSJ4;goG*C{dG^VvDmAW59h z& zv^YRM1~5Inal>tw^ZF5pm|+XxQk5L!1^DjV5Bk43)4Ej__+(LR*G{hj9srTbb_Jp^ zjjwK?GJvhqod*$K-R_|A!&B`9sEurXx>!Ga=oIoeyI4jRTU{NwEc-&}sNMLG3bHp~gJpebp*=c4C?rcZ3!r`3ow4+IUyv6Wr%zY1HH%zmoN9GOfLS8faV5m@M_%dY$|On;!rMP zjeyFTffXPN5Ro9egH5&n-2BbuZzi+4sEuTpyrJdc+*WG4!|`_HJCU)jYTAaRDJFBW z1j@~j%xIM6yT8d6z*KB`!;Jv*F~$6GDn6%@CN40n$Tc}}Ap~8bHmu^U3Y<<; ze$JiGkx(+>_{_tj!Uz(%yOE2m44!P$Lou2*l*0;S8Or|4^2H0T`0u#>bg{}9y6-yD z@5e||vI>vKvp$<$p9PA3@=*|1TB&w>+oswMvbHmYmXMIQtzCDyG$E=NxFY>-C;hi{ ztl_%wWM9&tZLxrc zXgV9>_Dw%#+8-QCy@LnqL;6J{;rQS`UE*z55PUC;`g!MEJa>1|sAp)@EN3yA2h_hc zV(4bSPgk7wZDcmH#)4_3LU7o7CU3QFY)m{N($+?Kl8w{K>cN?9u+OY3aqk2EAL4OK zF}~O2)+iyX=FOQU$r}XI%3b`OvHvW0Je(-0hcNYe$TXseU8=$ZFix7QLoSg~|M#ja zQHX1=~U~b7zO>Ob#r5%9NiYBpq)JNNywEaAvQ4esNY@bU|VZvktbp zw}u4UaV}s8Q?#1Hdx863Ef$L`biz6c&pwugPFlrx-J z`2nvi!hX*V&zaQr@;pEx>!bwrK4ojA5m*oep{QM|vsIf#sM~7)gj&#$8o+a^g5UDz zbbtT(L6|D0rI#tkeKiYfku<;ZaLMs2hjaG$>!~$C92h&CJe6+HI&_r2!}@jC&z;e^ z%Z1tk3ap*;^Yf5t>%iAK?^i?3OjNzWv@*$`<|fM97dfo78MIDSA`vp0U>B3Y-ac@T zr`@DOKB6p73vI1CNXGI7`M>Nde5GJW^(G1mMY3xQ`MEwN@&LH4G$klCsLIQE4S!p= zME!LE5yXNikZf21MKqOge+eVJF;l2+SExkpon@=U5EoH{Lj{+1Y^eK#Rr|feCfUtu zh%vDJ_T+J3uUrdXg<0TZWURULzrM~^7p|u17`N_^9P@oU-fQz3ued{1<468`P@E8! zO(#(3V&nNiutWC4KoeykksQ*|>LQK(iO>19>XOPTE4$>cwfh6J2>|ZtU9^7s&Lph# zQwAM2mO2#2(7_1j+SZ_cuNn*nFvMW>tC}ceGPIuGanL3DA=9A5GLuTU5{8zdpzpz8 zTHU3(THn+ml$owK`}n5kaL65Abrqk^-ivt?T8d}an%zKnZteu>_do=NyBB`u^4R2 z2-n;iM!f<&?0|3W9Q%wQ=I#C<^Ywea@)4pc+^4-Tm4VqPDwqab?f#+pTz0VH;K>ZK zFgfk0+D|cj^O&GFn0j4AR=k!0-bS|o$(DRqf+B_Ipx z`_+rOAF?o8|EbBSUi@aB*7z0}bQnc#&-~-+D-8jkL_G6>G&m=nST?+Myv6MKO2gNE zuCUT^q}3rE;6d+eL~9trr6?cNOaXy9$^Z6kjbxxeUck-0pnqb>msj zq2EUwSeSbva&oeP1RUl*-YB5IrCe(gB!RIO)2v~y!IFok5f~XT;bH+seUc`<1Qm~L z7zLozq5!G^{AgZ*CICmmvZlXSz2nQ~-Aj~Ip#mgwCeOUIxwh7Klc z-^Z}+AE04y>&vr^1Y8EPPZJV+%7n5wOql;Ps+g-E_3Qk6rDKuE**=iEYfCB}(kXc4 zShX#z1@?g|UIkOw>T+Q$dwLS;npXVUg{NroM)7KtO2orQ#aJ6U86i)VN!^z}m}PGj zIXev)hSyz|Y13n~+1feRV2A3BXW;krkvR+COp?SAqQZ{^VV+>`5VSL)Ee(y;qj{#t zhX>OB<%}W3q5m2aNChc0MIHNmlk(CE_XFh;6iIwYRe>0Vo$c|o8vj6ei$}#CBfKNb9ID z3zUwBC%#Bg0@^AdIkPj*YKLAyg$PIE&n(Nopp-zYm^?y9eS}C?!C~@EdKlFiHJuET z_d<%}ow`^1eDve>(&w*g9ef{0IXRt9W1umg?a?+Kpkf_WRB&b4qAL_=R|?T+89Mo# z%^GX;cx!;*VkxNH(fQxo09$=Ur!64?MtXS)q0uLX z3cZ3Xlz=q^jJ4PH4lEixHd`a3TKwhlOe^$99vdMiLz#|0(?6VJr+1e`z;Y$vZYyM+ zHhMgmw2fN=$1#*r9ui2AO@;mK;#|bO5^1+Xi_+a4$|BiYx-(JgCnxDALzq|JsZ_b= z4(Mk3z}^`JEU!0Tj8dO7@Hrm4-1P=z?DGo4bQm=N+2L1_xzG zcUdc9zc0y~sY>^Ux+sP0y}j5+>9|cl2#8z|q!Uyqfw%8R@LC*(`)6TY;IunntUobZ zKHJisJjj;!#%vc~5FXW}OK@9g58XOYr`^M1H!pdADAw%8=&sF}4Em9(BT=8!ItWs2+r8HFguJ}B0YfF;Jb%j9rBBVjy=BmQ>ac%A73%r@_f8t_!zp_5nWWs)eSS|;kGyW-afvnqx%DfV`~2%%-e@2T&6`e!1m8gjRqNfl3)o zonYBDoagUQd^P|Vpm{n*0BZWFGR@}YR;81^2vX)xhviCd^~X-XbYM{30&>Wnh2CU7 z^)&!r;3n_ly52Us!f3@JTsS&6h&%ypMvbk}+O>4*)Y?IoAMBkt6q19>)G>doHY0X^ zaq&d`3Zs8`7%SL0sSLX)E`+Z%OrSp!F2ve#)j40oRa{C6P^Y#f0$`kIcQlRfdjVGr zu0uc(0FG*V($>PlS#Cnu&1M68E0ctT*_GxQq;a?<%$BoH0eJ*q47b45gWh0kMu67- z@~pe<@OL;dJP!aR`2VPo>ytmspElU?5J=s|g&7osS^%P^ao=^L2N6&V`^-~aG-33# z>jwUtPEu<7<2mvZ(3@UvLre^|KMMYaaa90`OCWHY;tRlQuo({HWs22En+NdjLLA%h zc%3R(9#&I;yAd?kWH(sU#PvJ~7xoF{I*1rOy}gC|1ez^Q@^}lu(b6By=UFmmmm^5r zFXg!o0ouL!5IyGF^iNx>jl^5RPcbwqdc);^>6M!5Xn@TYRV`}B0@(X5FuY`BhRfA{ z4IrRJ>j(7qEDeBWehQhnh3p!WDC_EA4*BWDt+M+-1mE9tRNI{w!K?mjEPc534zg;2 zP9KC80_1XdgE|R5bn-1N@l2XoJL#Tjqp3VJm-ns%ReHIi|`O=sbZQZK0KKY;%jac+tYXLfZBAsj0wdj zDk{ntD2ChQA-o3mfa)J3Qvvf|An$+OpsaDUSnKy|^=nl?N9b6WAF=^-l9=1BfJ(&8 ztpy_$=nestWL30KV-h`oI;qGc{<`RE7(OYaF!EKAa_K&8jt#sGAng_QSZ7cvD{PJN6L)JGVb)$CSZPM z=rWKBDX2{8h`o{sOdRL6r6;J L%$G7D9q<1GC7~

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 - + + USB Host Shield 2.0: SPP.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

- + - - + + + +
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:198
+
Definition: BTD.h:201
void flush(void)
Definition: SPP.h:94
bool connected
Definition: SPP.h:84
int read(void)
Definition: SPP.cpp:811
void Run()
Definition: SPP.cpp:423
- +
void Reset()
Definition: SPP.cpp:60
int available(void)
Definition: SPP.cpp:797
void discard(void)
Definition: SPP.cpp:801
-
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:37
void disconnect()
Definition: SPP.cpp:72
Definition: SPP.h:61
void send(void)
Definition: SPP.cpp:769
@@ -114,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_usb_8cpp.html b/_usb_8cpp.html index 8dc43187..f621de40 100644 --- a/_usb_8cpp.html +++ b/_usb_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Usb.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
diff --git a/_usb_8cpp__incl.md5 b/_usb_8cpp__incl.md5 index f71e6530..08cf02a4 100644 --- a/_usb_8cpp__incl.md5 +++ b/_usb_8cpp__incl.md5 @@ -1 +1 @@ -983a9d4c5eeb9a3736dcb2d9192937eb \ No newline at end of file +c0083b07bac0c537372ef8120287eeb6 \ No newline at end of file diff --git a/_usb_8cpp__incl.png b/_usb_8cpp__incl.png index 3e3251d9e087ec94cf02d5416fd2c23460998a9f..20416d37f0b17641ed945203ccbb040266b7b0ff 100644 GIT binary patch literal 2820 zcmd5;_d6So^S9M{iyAQ+q|~NH31Y=wrB;nlByCku-dco&DneR~QR5wyv{q@&QX`dW zNl<&WwMTu-mUrz~@yYl3{u7^jp1b?yp1bGnUiZB2=?w=fK5lVtCMG668*6iChIe9U z$OR6DorK^Q7>@a&vy~}R&ETbVCMNDrHs&x_6!T_bpuLcdM7I>+h7dcI2hTaT?Y(T# zz;zk*`R-E+s=8}8HO{GIzD*eKUM$yzlG?^~p{OSg6rN}*T)=9~!T=-0R*Z48rK2=0@6!Z~HNlIdyznT_Ks2&{!bIz&(~%tYa=CAMv3jH?aMx&Fq87W{iu@zRgiIT|q+)Oh1aInH!X+Dgo@NLT2l@xcT zU+vxc;(bHI5tG$(QCMd(-;y>rH}}284lHJa)x_KT()Bz|tf`qEqRKNWSjhm))v7GL!kG2Ga#@g~|LHuQUq` z3>+`D5hMl?1{Aa%y~#1!d}5kO2bJ4iPye(FPz)$YoG%t6!jL;bs&c6uDgU^Q~Kw!XhF&9?68Lr7pgFt$@GM16r7; z5Uf4wC}l)$v)j9y_y98I=!LlUeahI68lR=wKlb*X-aHzB$kjnmdV$Ow0e!f&U8$0= zoFhxGrwC?cWv!2v*G5YmGnn%|x(Ta+S7<*izNASXk=%2>GF`ASJ7iE%Bai^(n zvevcoqEBl$wyy5;FH+>DEiN%1i^V#%$DOrsey{Nmn|yOkZ>y7pHtu)z|le?nP63amF&8rVHtd z`V%XnVr~6BOzs7A%T>Zav#eY`xdOC`1P;HyW7k>Efc&6)Xs4j<4ZlkH+*eXpYMzl- z8PMmOhGCle=%EH9Y9{o?chbjZm4t^v6a>?eOR%UQL(VEgf9XAW0uJtT$=ca%n4EJs zU($j@7Xp@yPAFAXD(R5TxF%#@U|t?^0TdD|bTymV3e+SVrZTWm!_@<(s~=~ZK+M{9B?<-x*Ho_>Bz z=(gX+TTAa9Xqed+6{rvpl1`^XQw;BmNIznA95^#jQ&6})#HQoVe?3ibP;soZ!CYa{ z2L@yQt$1v@ICQ0yM{L2wDjNKNSb{(hjS4498nIN8o2_jMVn}g7@DjU*K1mM!yUFOW zkrzKpkpezF^y^RL$k=JjYPLmDi8RY+smGKUDuw9bU1O?~gN(bYE4!?VtE>ch^6sJ7 zrtwO;Ei7jTaOh#Z%f+-rk2en5a(aMGk;!2bc6N5>@NnpXNenJ`nc&_HW6NV^MRmS!I|6j%fGn@dx-V<6z zCa#nS+&^i=;SA&ed*pE@)0T@%i5VGUS;q!{_vNZS(AL)iX6Zp>WKy_9q7By7#-95| zyrR+^e_C7Ob#>(KgVa>xr}l5(0`WWDy;0_41#66NN$`-AE-xz^nQRD%C6W9)IXYO} zUcxNh96RB)lH+)Avgg#@kMcF}=CsuH7=GTj`5EDAgG}OZ<;T3-M1DzwKdY{GL-nBI zygAbfZ=q4)U#2WmzJv-+n4Mg?jE+BiN&o=%nfe$Nn$QIvPmkH(Sgv2h+AC3%!Cli; zo>~ciS~Fp9rEFgVDwFaR(l&LhOuRovs?N8W1z&oc0iA6O%tHTW(AR$uX}OIRxuf68c0gAq!Ie1u)%7qcAD@psw?hqYQKpt-KQ^Nkq|^u(c1 zKf0=lvA!jiHIMjQ70(WO?Ul@{;(B^|jhLhGbPH?#s@Z5~;!nc5P`RQ3moX`RA|;Sl z@!pz0vJ88jp#J2=ix(Fp!m0*wsn$Ws^T5y7uqg=Y)$}94gme67W9x^e;Am|b z`<^x~iK{?X|8jBTf0)BGBBFqB|A=4j4U1E+-vP2BJ>t&ku|RlEL|=8!?e^`C?rztm zfolP$JTGp}YoNg6-|@V2Df6=Gn%SK)h4-4e&E@}^+AvbYi2&RH!sa{|Jcg5Y%z313 zHwCv#yr&$&p2M8o*Pa+wJbV7m^0U0O$zaud&Eizq1+^t zBV&;xA4hXF)gp5w-~AciAD-v=<#}Gu^Ljn+=ly=tkymZOg3^Kj004}zv%bcOD2@g3 zpWyfz1JWV@AUKS$ws4LFZWUu4#Ba$A!ZRd5Q0JXl5t>E@#A7E;M1z_>#8991dk*(F zqS$mxMUym9A@>{dKlubUu&qg*nbQlDE-$Mj!5c`g|F+HNZ?c)+dYBmKz%W5{-Y9%* ze-!^d%lMeppsVP6Sw4I9R_?^JKr4_=N=PfKQ!4)ET{ zDhJqHv2lcK=+Yjkdpjla=->i_!JxhLpDfC;58s=tc6{m8%N2FFTMOcoOhac~ExzcV zx|susJpR+E#n=2|ouXS(CMS)3Qs`tszwBdTVWBr>Z&0l!GF|WK*c$v9XY_9AP3p!T zYekEd1=05CD3j2*ZfJ89HduAZB=U!xY25EmPqrnsJt~LuwcGoRZ7Qp)CmVbQWh>&^ ze4ON>CISK_a5&sNwAbUThQ@FZ8LzY$f4DnpL{9CFKfX%6^1&=-uPk3lqQ2cR_gU>d zOHSWv#&Et98ZG^OFD{=DDm8Li=-2~9T*Ho)$aeZa*0Xlng zsy4uUz$i8*COIsclFC;#k{-TEU$Pq9pMNzGH2bog$qbBh;>N>PJ7f%k$DiM9+KVBA z$~5)w2_?09kKtO>U7r1*y4HK3-Vnk2tmc5}JyjDiE9hFEEPs16yY5b?toF#!A$uQr zmuDD+`0bOSdiVQ6v6g#Vf9lEAf_l&HiP`1=LiNS4^`82@by@|XT8B=dP|oP+WG7uN z44w8{8!PVE2Sl!p!1}U@y*ZrfQOS&hUtjUs^UVR0?3m}{1&YnQ{A&X-d{+>Na{SsD zinB3-)UlTau^4E>zq-0QTIj@hpSQKq$X6BVJzeL%|I8S_>R@IKglx~vzsBz?+#A54 zU`9A4wpl098bv1a zIGHx^Z=J!Rn5L3iZq!@CtJsj4?g6n*-XXhAK?=k^* zVZ0J}B5n;#b-QGdyP}eNO@vqW{~#H+|GFU?J(5sVWU_0r_@H{Dsj-m&I(NQFO>w2B z^8yg)J5%pci$8LY3l0qN7m(dqXGtC%Mc9{Pvq)g9@crY~@tC){y=aA82;>*&myV|= zd^h{mA4UJSJXZ}#;R8GYQ}B4}M)>@i066UA7skw|qzu#;O!Y zcVy36WnbujB+_8tE;GSm)z}Gc;L;n-d>k~6P>ym z5pHgVV!cDI?v3J|@zN_aFh4bz!`|0jkH?uOyW&puDAjY#{4N;V>33@$8Zm=!CV2?= z-!GH%9XDwQ0^b_i{oF{mlQwy}6lh^lI#Z&Xqj|e8_93J%uTVb-S7VPxhF@cg z8H6kZx>jgVf0k;3(f4`N6*qnjHsUEBNwre-a^yQM;?^9^=2CH93U^FS{4vvnbtkt4 zf46DP|Hm5F?NQ_Y0T$ouNwAFmr^C4AegUm1(9@4o zwYTt3BEN)UZL?&T$c^KalruWX(Van$@9`5RIdmhoKnB(Zj^vH6ObPWZLm&{hZ!p|J zb{sLP!B|E=u)y6E=FLFHvReqJ6#7G1rvcbEZ0ElWBj{8Vy*oZ$+APKp-Xb6%Ft6Br z4yiUJgk$e{T105iTb{PHYBqD4Hb877B|w&&0TXbONH3q7MyT(BYV;uJJKTxHt_+?w zu!~~YH`p(wAa6~dkAyEE%CL5+wrE<1nJT(r^6yrJgN)RU~9t4ao-{wYn% z$GsNY(l0kvM)U5zIJf#xb@`;A{)c0md-qa<#21vQu>v}R^a{^QQnfF08QV-rktae~ tOW&gOionz8_vh5pRNU@xpqX~eccRV>;%i-S%=vBsh|5>4>nyzz{|Cs?Mgsr< diff --git a/_usb_8cpp_source.html b/_usb_8cpp_source.html index 1c54b9e0..f8967fdd 100644 --- a/_usb_8cpp_source.html +++ b/_usb_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Usb.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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  uint16_t read = nbytes;
168  //uint16_t read = (left<nbytes) ? left : nbytes;
169 
170  rcode = InTransfer(pep, nak_limit, &read, dataptr);
171  if(rcode == hrTOGERR) {
172  // yes, we flip it wrong here so that next time it is actually correct!
173  pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
174  continue;
175  }
176 
177  if(rcode)
178  return rcode;
179 
180  // Invoke callback function if inTransfer completed successfully and callback function pointer is specified
181  if(!rcode && p)
182  ((USBReadParser*)p)->Parse(read, dataptr, total - left);
183 
184  left -= read;
185 
186  if(read < nbytes)
187  break;
188  }
189  } else //OUT transfer
190  {
191  pep->bmSndToggle = 1; //bmSNDTOG1;
192  rcode = OutTransfer(pep, nak_limit, nbytes, dataptr);
193  }
194  if(rcode) //return error
195  return ( rcode);
196  }
197  // Status stage
198  return dispatchPkt((direction) ? tokOUTHS : tokINHS, ep, nak_limit); //GET if direction
199 }
200 
201 /* IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
202 /* Keep sending INs and writes data to memory area pointed by 'data' */
203 
204 /* rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error,
205  fe USB xfer timeout */
206 uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) {
207  EpInfo *pep = NULL;
208  uint16_t nak_limit = 0;
209 
210  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
211 
212  if(rcode) {
213  USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81);
214  USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81);
215  USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81);
216  return rcode;
217  }
218  return InTransfer(pep, nak_limit, nbytesptr, data, bInterval);
219 }
220 
221 uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) {
222  uint8_t rcode = 0;
223  uint8_t pktsize;
224 
225  uint16_t nbytes = *nbytesptr;
226  //printf("Requesting %i bytes ", nbytes);
227  uint8_t maxpktsize = pep->maxPktSize;
228 
229  *nbytesptr = 0;
230  regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
231 
232  // use a 'break' to exit this loop
233  while(1) {
234  rcode = dispatchPkt(tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS.
235  if(rcode == hrTOGERR) {
236  // yes, we flip it wrong here so that next time it is actually correct!
237  pep->bmRcvToggle = (regRd(rHRSL) & bmRCVTOGRD) ? 0 : 1;
238  regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
239  continue;
240  }
241  if(rcode) {
242  //printf(">>>>>>>> Problem! dispatchPkt %2.2x\r\n", rcode);
243  break; //should be 0, indicating ACK. Else return error code.
244  }
245  /* check for RCVDAVIRQ and generate error if not present */
246  /* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */
247  if((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) {
248  //printf(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n");
249  rcode = 0xf0; //receive error
250  break;
251  }
252  pktsize = regRd(rRCVBC); //number of received bytes
253  //printf("Got %i bytes \r\n", pktsize);
254  // This would be OK, but...
255  //assert(pktsize <= nbytes);
256  if(pktsize > nbytes) {
257  // This can happen. Use of assert on Arduino locks up the Arduino.
258  // So I will trim the value, and hope for the best.
259  //printf(">>>>>>>> Problem! Wanted %i bytes but got %i.\r\n", nbytes, pktsize);
260  pktsize = nbytes;
261  }
262 
263  int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr);
264 
265  if(mem_left < 0)
266  mem_left = 0;
267 
268  data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data);
269 
270  regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer
271  *nbytesptr += pktsize; // add this packet's byte count to total transfer length
272 
273  /* The transfer is complete under two conditions: */
274  /* 1. The device sent a short packet (L.T. maxPacketSize) */
275  /* 2. 'nbytes' have been transferred. */
276  if((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) // have we transferred 'nbytes' bytes?
277  {
278  // Save toggle value
279  pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0;
280  //printf("\r\n");
281  rcode = 0;
282  break;
283  } else if(bInterval > 0)
284  delay(bInterval); // Delay according to polling interval
285  } //while( 1 )
286  return ( rcode);
287 }
288 
289 /* OUT transfer to arbitrary endpoint. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
290 /* Handles NAK bug per Maxim Application Note 4000 for single buffer transfer */
291 
292 /* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */
293 uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) {
294  EpInfo *pep = NULL;
295  uint16_t nak_limit = 0;
296 
297  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
298 
299  if(rcode)
300  return rcode;
301 
302  return OutTransfer(pep, nak_limit, nbytes, data);
303 }
304 
305 uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) {
306  uint8_t rcode = hrSUCCESS, retry_count;
307  uint8_t *data_p = data; //local copy of the data pointer
308  uint16_t bytes_tosend, nak_count;
309  uint16_t bytes_left = nbytes;
310 
311  uint8_t maxpktsize = pep->maxPktSize;
312 
313  if(maxpktsize < 1 || maxpktsize > 64)
315 
316  unsigned long timeout = millis() + USB_XFER_TIMEOUT;
317 
318  regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
319 
320  while(bytes_left) {
321  retry_count = 0;
322  nak_count = 0;
323  bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left;
324  bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO
325  regWr(rSNDBC, bytes_tosend); //set number of bytes
326  regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet
327  while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ
328  regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
329  rcode = (regRd(rHRSL) & 0x0f);
330 
331  while(rcode && ((long)(millis() - timeout) < 0L)) {
332  switch(rcode) {
333  case hrNAK:
334  nak_count++;
335  if(nak_limit && (nak_count == nak_limit))
336  goto breakout;
337  //return ( rcode);
338  break;
339  case hrTIMEOUT:
340  retry_count++;
341  if(retry_count == USB_RETRY_LIMIT)
342  goto breakout;
343  //return ( rcode);
344  break;
345  case hrTOGERR:
346  // yes, we flip it wrong here so that next time it is actually correct!
347  pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
348  regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
349  break;
350  default:
351  goto breakout;
352  }//switch( rcode
353 
354  /* process NAK according to Host out NAK bug */
355  regWr(rSNDBC, 0);
356  regWr(rSNDFIFO, *data_p);
357  regWr(rSNDBC, bytes_tosend);
358  regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet
359  while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ
360  regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
361  rcode = (regRd(rHRSL) & 0x0f);
362  }//while( rcode && ....
363  bytes_left -= bytes_tosend;
364  data_p += bytes_tosend;
365  }//while( bytes_left...
366 breakout:
367 
368  pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle
369  return ( rcode); //should be 0 in all cases
370 }
371 /* dispatch USB packet. Assumes peripheral address is set and relevant buffer is loaded/empty */
372 /* If NAK, tries to re-send up to nak_limit times */
373 /* If nak_limit == 0, do not count NAKs, exit after timeout */
374 /* If bus timeout, re-sends up to USB_RETRY_LIMIT times */
375 
376 /* return codes 0x00-0x0f are HRSLT( 0x00 being success ), 0xff means timeout */
377 uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) {
378  unsigned long timeout = millis() + USB_XFER_TIMEOUT;
379  uint8_t tmpdata;
380  uint8_t rcode = hrSUCCESS;
381  uint8_t retry_count = 0;
382  uint16_t nak_count = 0;
383 
384  while((long)(millis() - timeout) < 0L) {
385  regWr(rHXFR, (token | ep)); //launch the transfer
387 
388  while((long)(millis() - timeout) < 0L) //wait for transfer completion
389  {
390  tmpdata = regRd(rHIRQ);
391 
392  if(tmpdata & bmHXFRDNIRQ) {
393  regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt
394  rcode = 0x00;
395  break;
396  }//if( tmpdata & bmHXFRDNIRQ
397 
398  }//while ( millis() < timeout
399 
400  //if (rcode != 0x00) //exit if timeout
401  // return ( rcode);
402 
403  rcode = (regRd(rHRSL) & 0x0f); //analyze transfer result
404 
405  switch(rcode) {
406  case hrNAK:
407  nak_count++;
408  if(nak_limit && (nak_count == nak_limit))
409  return (rcode);
410  break;
411  case hrTIMEOUT:
412  retry_count++;
413  if(retry_count == USB_RETRY_LIMIT)
414  return (rcode);
415  break;
416  default:
417  return (rcode);
418  }//switch( rcode
419 
420  }//while( timeout > millis()
421  return ( rcode);
422 }
423 
424 /* USB main task. Performs enumeration/cleanup */
425 void USB::Task(void) //USB state machine
426 {
427  uint8_t rcode;
428  uint8_t tmpdata;
429  static unsigned long delay = 0;
430  //USB_DEVICE_DESCRIPTOR buf;
431  bool lowspeed = false;
432 
433  MAX3421E::Task();
434 
435  tmpdata = getVbusState();
436 
437  /* modify USB task state if Vbus changed */
438  switch(tmpdata) {
439  case SE1: //illegal state
440  usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL;
441  lowspeed = false;
442  break;
443  case SE0: //disconnected
444  if((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED)
445  usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE;
446  lowspeed = false;
447  break;
448  case LSHOST:
449 
450  lowspeed = true;
451  //intentional fallthrough
452  case FSHOST: //attached
453  if((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) {
454  delay = millis() + USB_SETTLE_DELAY;
455  usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE;
456  }
457  break;
458  }// switch( tmpdata
459 
460  for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
461  if(devConfig[i])
462  rcode = devConfig[i]->Poll();
463 
464  switch(usb_task_state) {
466  init();
467 
468  for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
469  if(devConfig[i])
470  rcode = devConfig[i]->Release();
471 
472  usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE;
473  break;
474  case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: //just sit here
475  break;
476  case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here
477  break;
478  case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device
479  if((long)(millis() - delay) >= 0L)
480  usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE;
481  else break; // don't fall through
483  regWr(rHCTL, bmBUSRST); //issue bus reset
485  break;
487  if((regRd(rHCTL) & bmBUSRST) == 0) {
488  tmpdata = regRd(rMODE) | bmSOFKAENAB; //start SOF generation
489  regWr(rMODE, tmpdata);
490  usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF;
491  //delay = millis() + 20; //20ms wait after reset per USB spec
492  }
493  break;
494  case USB_ATTACHED_SUBSTATE_WAIT_SOF: //todo: change check order
495  if(regRd(rHIRQ) & bmFRAMEIRQ) {
496  //when first SOF received _and_ 20ms has passed we can continue
497  /*
498  if (delay < millis()) //20ms passed
499  usb_task_state = USB_STATE_CONFIGURING;
500  */
501  usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET;
502  delay = millis() + 20;
503  }
504  break;
506  if((long)(millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING;
507  else break; // don't fall through
509 
510  //Serial.print("\r\nConf.LS: ");
511  //Serial.println(lowspeed, HEX);
512 
513  rcode = Configuring(0, 0, lowspeed);
514 
515  if(rcode) {
517  usb_error = rcode;
518  usb_task_state = USB_STATE_ERROR;
519  }
520  } else
521  usb_task_state = USB_STATE_RUNNING;
522  break;
523  case USB_STATE_RUNNING:
524  break;
525  case USB_STATE_ERROR:
526  //MAX3421E::Init();
527  break;
528  } // switch( usb_task_state )
529 }
530 
531 uint8_t USB::DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed) {
532  //uint8_t buf[12];
533  uint8_t rcode;
534  UsbDevice *p0 = NULL, *p = NULL;
535 
536  // Get pointer to pseudo device with address 0 assigned
537  p0 = addrPool.GetUsbDevicePtr(0);
538 
539  if(!p0)
541 
542  if(!p0->epinfo)
544 
545  p0->lowspeed = (lowspeed) ? true : false;
546 
547  // Allocate new address according to device class
548  uint8_t bAddress = addrPool.AllocAddress(parent, false, port);
549 
550  if(!bAddress)
552 
553  p = addrPool.GetUsbDevicePtr(bAddress);
554 
555  if(!p)
557 
558  p->lowspeed = lowspeed;
559 
560  // Assign new address to the device
561  rcode = setAddr(0, 0, bAddress);
562 
563  if(rcode) {
564  addrPool.FreeAddress(bAddress);
565  bAddress = 0;
566  return rcode;
567  }
568  return 0;
569 };
570 
571 uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed) {
572  //printf("AttemptConfig: parent = %i, port = %i\r\n", parent, port);
573  uint8_t retries = 0;
574 
575 again:
576  uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed);
578  if(parent == 0) {
579  // Send a bus reset on the root interface.
580  regWr(rHCTL, bmBUSRST); //issue bus reset
581  delay(102); // delay 102ms, compensate for clock inaccuracy.
582  } else {
583  // reset parent port
584  devConfig[parent]->ResetHubPort(port);
585  }
586  } else if(rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
587  delay(100);
588  retries++;
589  goto again;
590  } else if(rcode)
591  return rcode;
592 
593  rcode = devConfig[driver]->Init(parent, port, lowspeed);
594  if(rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
595  delay(100);
596  retries++;
597  goto again;
598  }
599  if(rcode) {
600  // Issue a bus reset, because the device may be in a limbo state
601  if(parent == 0) {
602  // Send a bus reset on the root interface.
603  regWr(rHCTL, bmBUSRST); //issue bus reset
604  delay(102); // delay 102ms, compensate for clock inaccuracy.
605  } else {
606  // reset parent port
607  devConfig[parent]->ResetHubPort(port);
608  }
609  }
610  return rcode;
611 }
612 
613 /*
614  * This is broken. We need to enumerate differently.
615  * It causes major problems with several devices if detected in an unexpected order.
616  *
617  *
618  * Oleg - I wouldn't do anything before the newly connected device is considered sane.
619  * i.e.(delays are not indicated for brevity):
620  * 1. reset
621  * 2. GetDevDescr();
622  * 3a. If ACK, continue with allocating address, addressing, etc.
623  * 3b. Else reset again, count resets, stop at some number (5?).
624  * 4. When max.number of resets is reached, toggle power/fail
625  * 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()
626  * it doesn't need to be reset again
627  * New steps proposal:
628  * 1: get address pool instance. exit on fail
629  * 2: pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf). exit on fail.
630  * 3: bus reset, 100ms delay
631  * 4: set address
632  * 5: pUsb->setEpInfoEntry(bAddress, 1, epInfo), exit on fail
633  * 6: while (configurations) {
634  * for(each configuration) {
635  * for (each driver) {
636  * 6a: Ask device if it likes configuration. Returns 0 on OK.
637  * If successful, the driver configured device.
638  * The driver now owns the endpoints, and takes over managing them.
639  * The following will need codes:
640  * Everything went well, instance consumed, exit with success.
641  * Instance already in use, ignore it, try next driver.
642  * Not a supported device, ignore it, try next driver.
643  * Not a supported configuration for this device, ignore it, try next driver.
644  * Could not configure device, fatal, exit with fail.
645  * }
646  * }
647  * }
648  * 7: for(each driver) {
649  * 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID
650  * 8: if we get here, no driver likes the device plugged in, so exit failure.
651  *
652  */
653 uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) {
654  //uint8_t bAddress = 0;
655  //printf("Configuring: parent = %i, port = %i\r\n", parent, port);
656  uint8_t devConfigIndex;
657  uint8_t rcode = 0;
658  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
659  USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR *>(buf);
660  UsbDevice *p = NULL;
661  EpInfo *oldep_ptr = NULL;
662  EpInfo epInfo;
663 
664  epInfo.epAddr = 0;
665  epInfo.maxPktSize = 8;
666  epInfo.bmSndToggle = 0;
667  epInfo.bmRcvToggle = 0;
668  epInfo.bmNakPower = USB_NAK_MAX_POWER;
669 
670  //delay(2000);
671  AddressPool &addrPool = GetAddressPool();
672  // Get pointer to pseudo device with address 0 assigned
673  p = addrPool.GetUsbDevicePtr(0);
674  if(!p) {
675  //printf("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n");
677  }
678 
679  // Save old pointer to EP_RECORD of address 0
680  oldep_ptr = p->epinfo;
681 
682  // Temporary assign new pointer to epInfo to p->epinfo in order to
683  // avoid toggle inconsistence
684 
685  p->epinfo = &epInfo;
686 
687  p->lowspeed = lowspeed;
688  // Get device descriptor
689  rcode = getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf);
690 
691  // Restore p->epinfo
692  p->epinfo = oldep_ptr;
693 
694  if(rcode) {
695  //printf("Configuring error: Can't get USB_DEVICE_DESCRIPTOR\r\n");
696  return rcode;
697  }
698 
699  // to-do?
700  // Allocate new address according to device class
701  //bAddress = addrPool.AllocAddress(parent, false, port);
702 
703  uint16_t vid = udd->idVendor;
704  uint16_t pid = udd->idProduct;
705  uint8_t klass = udd->bDeviceClass;
706  uint8_t subklass = udd->bDeviceSubClass;
707  // Attempt to configure if VID/PID or device class matches with a driver
708  // Qualify with subclass too.
709  //
710  // VID/PID & class tests default to false for drivers not yet ported
711  // subclass defaults to true, so you don't have to define it if you don't have to.
712  //
713  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
714  if(!devConfig[devConfigIndex]) continue; // no driver
715  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
716  if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) {
717  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
719  break;
720  }
721  }
722 
723  if(devConfigIndex < USB_NUMDEVICES) {
724  return rcode;
725  }
726 
727 
728  // blindly attempt to configure
729  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
730  if(!devConfig[devConfigIndex]) continue;
731  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
732  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
733  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
734 
735  //printf("ERROR ENUMERATING %2.2x\r\n", rcode);
737  // in case of an error dev_index should be reset to 0
738  // in order to start from the very beginning the
739  // next time the program gets here
740  //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE)
741  // devConfigIndex = 0;
742  return rcode;
743  }
744  }
745  // if we get here that means that the device class is not supported by any of registered classes
746  rcode = DefaultAddressing(parent, port, lowspeed);
747 
748  return rcode;
749 }
750 
751 uint8_t USB::ReleaseDevice(uint8_t addr) {
752  if(!addr)
753  return 0;
754 
755  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
756  if(!devConfig[i]) continue;
757  if(devConfig[i]->GetAddress() == addr)
758  return devConfig[i]->Release();
759  }
760  return 0;
761 }
762 
763 #if 1
764 //get device descriptor
765 
766 uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
767  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, NULL));
768 }
769 //get configuration descriptor
770 
771 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
772  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, NULL));
773 }
774 
775 /* 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
776  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 */
777 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) {
778  const uint8_t bufSize = 64;
779  uint8_t buf[bufSize];
780  USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR *>(buf);
781 
782  uint8_t ret = getConfDescr(addr, ep, 9, conf, buf);
783 
784  if(ret)
785  return ret;
786 
787  uint16_t total = ucd->wTotalLength;
788 
789  //USBTRACE2("\r\ntotal conf.size:", total);
790 
791  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p));
792 }
793 
794 //get string descriptor
795 
796 uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) {
797  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, NULL));
798 }
799 //set address
800 
801 uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
802  uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL);
803  //delay(2); //per USB 2.0 sect.9.2.6.3
804  delay(300); // Older spec says you should wait at least 200ms
805  return rcode;
806  //return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
807 }
808 //set configuration
809 
810 uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
811  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
812 }
813 
814 #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:771
-
uint8_t bmRcvToggle
Definition: address.h:41
- -
virtual uint8_t Poll()
Definition: UsbCore.h:136
-
#define USB_ERROR_EP_NOT_FOUND_IN_TBL
Definition: UsbCore.h:87
-
#define bmHUBPRE
Definition: max3421e.h:165
-
#define USB_ATTACHED_SUBSTATE_WAIT_RESET
Definition: UsbCore.h:114
-
#define FSHOST
Definition: max3421e.h:30
-
#define rHCTL
Definition: max3421e.h:174
-
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
-
uint8_t bmNakPower
Definition: address.h:42
- -
EpInfo * getEpInfoEntry(uint8_t addr, uint8_t ep)
Definition: Usb.cpp:44
- -
#define bmSOFKAENAB
Definition: max3421e.h:166
-
#define USB_DESCRIPTOR_STRING
Definition: usb_ch9.h:65
-
uint16_t wLength
Definition: UsbCore.h:185
-
#define USB_SETTLE_DELAY
Definition: UsbCore.h:97
-
#define USB_ATTACHED_SUBSTATE_SETTLE
Definition: UsbCore.h:110
-
uint8_t getVbusState(void)
Definition: usbhost.h:128
-
#define bmRCVTOGRD
Definition: max3421e.h:199
-
#define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE
Definition: UsbCore.h:78
-
#define USB_RETRY_LIMIT
Definition: UsbCore.h:96
-
#define USB_REQUEST_GET_DESCRIPTOR
Definition: usb_ch9.h:37
-
#define USB_DESCRIPTOR_DEVICE
Definition: usb_ch9.h:63
-
#define bmRCVTOG1
Definition: max3421e.h:181
-
#define USB_ERROR_INVALID_MAX_PKT_SIZE
Definition: UsbCore.h:86
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
-
#define USB_STATE_DETACHED
Definition: UsbCore.h:106
-
#define USB_NUMDEVICES
Definition: UsbCore.h:99
+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 
26 #include "Usb.h"
27 
28 static uint8_t usb_error = 0;
29 static uint8_t usb_task_state;
30 
31 /* constructor */
32 USB::USB() : bmHubPre(0) {
33  usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; //set up state machine
34  init();
35 }
36 
37 /* Initialize data structures */
38 void USB::init() {
39  //devConfigIndex = 0;
40  bmHubPre = 0;
41 }
42 
43 uint8_t USB::getUsbTaskState(void) {
44  return ( usb_task_state);
45 }
46 
47 void USB::setUsbTaskState(uint8_t state) {
48  usb_task_state = state;
49 }
50 
51 EpInfo* USB::getEpInfoEntry(uint8_t addr, uint8_t ep) {
52  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
53 
54  if(!p || !p->epinfo)
55  return NULL;
56 
57  EpInfo *pep = p->epinfo;
58 
59  for(uint8_t i = 0; i < p->epcount; i++) {
60  if((pep)->epAddr == ep)
61  return pep;
62 
63  pep++;
64  }
65  return NULL;
66 }
67 
68 /* set device table entry */
69 
70 /* each device is different and has different number of endpoints. This function plugs endpoint record structure, defined in application, to devtable */
71 uint8_t USB::setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr) {
72  if(!eprecord_ptr)
74 
75  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
76 
77  if(!p)
79 
80  p->address.devAddress = addr;
81  p->epinfo = eprecord_ptr;
82  p->epcount = epcount;
83 
84  return 0;
85 }
86 
87 uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit) {
88  UsbDevice *p = addrPool.GetUsbDevicePtr(addr);
89 
90  if(!p)
92 
93  if(!p->epinfo)
95 
96  *ppep = getEpInfoEntry(addr, ep);
97 
98  if(!*ppep)
100 
101  *nak_limit = (0x0001UL << (((*ppep)->bmNakPower > USB_NAK_MAX_POWER) ? USB_NAK_MAX_POWER : (*ppep)->bmNakPower));
102  (*nak_limit)--;
103  /*
104  USBTRACE2("\r\nAddress: ", addr);
105  USBTRACE2(" EP: ", ep);
106  USBTRACE2(" NAK Power: ",(*ppep)->bmNakPower);
107  USBTRACE2(" NAK Limit: ", nak_limit);
108  USBTRACE("\r\n");
109  */
110  regWr(rPERADDR, addr); //set peripheral address
111 
112  uint8_t mode = regRd(rMODE);
113 
114  //Serial.print("\r\nMode: ");
115  //Serial.println( mode, HEX);
116  //Serial.print("\r\nLS: ");
117  //Serial.println(p->lowspeed, HEX);
118 
119 
120 
121  // Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise
122  regWr(rMODE, (p->lowspeed) ? mode | bmLOWSPEED | bmHubPre : mode & ~(bmHUBPRE | bmLOWSPEED));
123 
124  return 0;
125 }
126 
127 /* Control transfer. Sets address, endpoint, fills control packet with necessary data, dispatches control packet, and initiates bulk IN transfer, */
128 /* depending on request. Actual requests are defined as inlines */
129 /* return codes: */
130 /* 00 = success */
131 
132 /* 01-0f = non-zero HRSLT */
133 uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
134  uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) {
135  bool direction = false; //request direction, IN or OUT
136  uint8_t rcode;
137  SETUP_PKT setup_pkt;
138 
139  EpInfo *pep = NULL;
140  uint16_t nak_limit = 0;
141 
142  rcode = SetAddress(addr, ep, &pep, &nak_limit);
143 
144  if(rcode)
145  return rcode;
146 
147  direction = ((bmReqType & 0x80) > 0);
148 
149  /* fill in setup packet */
150  setup_pkt.ReqType_u.bmRequestType = bmReqType;
151  setup_pkt.bRequest = bRequest;
152  setup_pkt.wVal_u.wValueLo = wValLo;
153  setup_pkt.wVal_u.wValueHi = wValHi;
154  setup_pkt.wIndex = wInd;
155  setup_pkt.wLength = total;
156 
157  bytesWr(rSUDFIFO, 8, (uint8_t*) & setup_pkt); //transfer to setup packet FIFO
158 
159  rcode = dispatchPkt(tokSETUP, ep, nak_limit); //dispatch packet
160 
161  if(rcode) //return HRSLT if not zero
162  return ( rcode);
163 
164  if(dataptr != NULL) //data stage, if present
165  {
166  if(direction) //IN transfer
167  {
168  uint16_t left = total;
169 
170  pep->bmRcvToggle = 1; //bmRCVTOG1;
171 
172  while(left) {
173  // Bytes read into buffer
174  uint16_t read = nbytes;
175  //uint16_t read = (left<nbytes) ? left : nbytes;
176 
177  rcode = InTransfer(pep, nak_limit, &read, dataptr);
178  if(rcode == hrTOGERR) {
179  // yes, we flip it wrong here so that next time it is actually correct!
180  pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
181  continue;
182  }
183 
184  if(rcode)
185  return rcode;
186 
187  // Invoke callback function if inTransfer completed successfully and callback function pointer is specified
188  if(!rcode && p)
189  ((USBReadParser*)p)->Parse(read, dataptr, total - left);
190 
191  left -= read;
192 
193  if(read < nbytes)
194  break;
195  }
196  } else //OUT transfer
197  {
198  pep->bmSndToggle = 1; //bmSNDTOG1;
199  rcode = OutTransfer(pep, nak_limit, nbytes, dataptr);
200  }
201  if(rcode) //return error
202  return ( rcode);
203  }
204  // Status stage
205  return dispatchPkt((direction) ? tokOUTHS : tokINHS, ep, nak_limit); //GET if direction
206 }
207 
208 /* IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
209 /* Keep sending INs and writes data to memory area pointed by 'data' */
210 
211 /* rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error,
212  fe USB xfer timeout */
213 uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) {
214  EpInfo *pep = NULL;
215  uint16_t nak_limit = 0;
216 
217  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
218 
219  if(rcode) {
220  USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81);
221  USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81);
222  USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81);
223  return rcode;
224  }
225  return InTransfer(pep, nak_limit, nbytesptr, data, bInterval);
226 }
227 
228 uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) {
229  uint8_t rcode = 0;
230  uint8_t pktsize;
231 
232  uint16_t nbytes = *nbytesptr;
233  //printf("Requesting %i bytes ", nbytes);
234  uint8_t maxpktsize = pep->maxPktSize;
235 
236  *nbytesptr = 0;
237  regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
238 
239  // use a 'break' to exit this loop
240  while(1) {
241  rcode = dispatchPkt(tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS.
242  if(rcode == hrTOGERR) {
243  // yes, we flip it wrong here so that next time it is actually correct!
244  pep->bmRcvToggle = (regRd(rHRSL) & bmRCVTOGRD) ? 0 : 1;
245  regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value
246  continue;
247  }
248  if(rcode) {
249  //printf(">>>>>>>> Problem! dispatchPkt %2.2x\r\n", rcode);
250  break; //should be 0, indicating ACK. Else return error code.
251  }
252  /* check for RCVDAVIRQ and generate error if not present */
253  /* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */
254  if((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) {
255  //printf(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n");
256  rcode = 0xf0; //receive error
257  break;
258  }
259  pktsize = regRd(rRCVBC); //number of received bytes
260  //printf("Got %i bytes \r\n", pktsize);
261  // This would be OK, but...
262  //assert(pktsize <= nbytes);
263  if(pktsize > nbytes) {
264  // This can happen. Use of assert on Arduino locks up the Arduino.
265  // So I will trim the value, and hope for the best.
266  //printf(">>>>>>>> Problem! Wanted %i bytes but got %i.\r\n", nbytes, pktsize);
267  pktsize = nbytes;
268  }
269 
270  int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr);
271 
272  if(mem_left < 0)
273  mem_left = 0;
274 
275  data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data);
276 
277  regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer
278  *nbytesptr += pktsize; // add this packet's byte count to total transfer length
279 
280  /* The transfer is complete under two conditions: */
281  /* 1. The device sent a short packet (L.T. maxPacketSize) */
282  /* 2. 'nbytes' have been transferred. */
283  if((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) // have we transferred 'nbytes' bytes?
284  {
285  // Save toggle value
286  pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0;
287  //printf("\r\n");
288  rcode = 0;
289  break;
290  } else if(bInterval > 0)
291  delay(bInterval); // Delay according to polling interval
292  } //while( 1 )
293  return ( rcode);
294 }
295 
296 /* OUT transfer to arbitrary endpoint. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
297 /* Handles NAK bug per Maxim Application Note 4000 for single buffer transfer */
298 
299 /* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */
300 uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) {
301  EpInfo *pep = NULL;
302  uint16_t nak_limit = 0;
303 
304  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
305 
306  if(rcode)
307  return rcode;
308 
309  return OutTransfer(pep, nak_limit, nbytes, data);
310 }
311 
312 uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) {
313  uint8_t rcode = hrSUCCESS, retry_count;
314  uint8_t *data_p = data; //local copy of the data pointer
315  uint16_t bytes_tosend, nak_count;
316  uint16_t bytes_left = nbytes;
317 
318  uint8_t maxpktsize = pep->maxPktSize;
319 
320  if(maxpktsize < 1 || maxpktsize > 64)
322 
323  uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT;
324 
325  regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
326 
327  while(bytes_left) {
328  retry_count = 0;
329  nak_count = 0;
330  bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left;
331  bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO
332  regWr(rSNDBC, bytes_tosend); //set number of bytes
333  regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet
334  while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ
335  regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
336  rcode = (regRd(rHRSL) & 0x0f);
337 
338  while(rcode && ((int32_t)((uint32_t)millis() - timeout) < 0L)) {
339  switch(rcode) {
340  case hrNAK:
341  nak_count++;
342  if(nak_limit && (nak_count == nak_limit))
343  goto breakout;
344  //return ( rcode);
345  break;
346  case hrTIMEOUT:
347  retry_count++;
348  if(retry_count == USB_RETRY_LIMIT)
349  goto breakout;
350  //return ( rcode);
351  break;
352  case hrTOGERR:
353  // yes, we flip it wrong here so that next time it is actually correct!
354  pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1;
355  regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value
356  break;
357  default:
358  goto breakout;
359  }//switch( rcode
360 
361  /* process NAK according to Host out NAK bug */
362  regWr(rSNDBC, 0);
363  regWr(rSNDFIFO, *data_p);
364  regWr(rSNDBC, bytes_tosend);
365  regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet
366  while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ
367  regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
368  rcode = (regRd(rHRSL) & 0x0f);
369  }//while( rcode && ....
370  bytes_left -= bytes_tosend;
371  data_p += bytes_tosend;
372  }//while( bytes_left...
373 breakout:
374 
375  pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle
376  return ( rcode); //should be 0 in all cases
377 }
378 /* dispatch USB packet. Assumes peripheral address is set and relevant buffer is loaded/empty */
379 /* If NAK, tries to re-send up to nak_limit times */
380 /* If nak_limit == 0, do not count NAKs, exit after timeout */
381 /* If bus timeout, re-sends up to USB_RETRY_LIMIT times */
382 
383 /* return codes 0x00-0x0f are HRSLT( 0x00 being success ), 0xff means timeout */
384 uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) {
385  uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT;
386  uint8_t tmpdata;
387  uint8_t rcode = hrSUCCESS;
388  uint8_t retry_count = 0;
389  uint16_t nak_count = 0;
390 
391  while((int32_t)((uint32_t)millis() - timeout) < 0L) {
392 #if defined(ESP8266) || defined(ESP32)
393  yield(); // needed in order to reset the watchdog timer on the ESP8266
394 #endif
395  regWr(rHXFR, (token | ep)); //launch the transfer
397 
398  while((int32_t)((uint32_t)millis() - timeout) < 0L) //wait for transfer completion
399  {
400 #if defined(ESP8266) || defined(ESP32)
401  yield(); // needed in order to reset the watchdog timer on the ESP8266
402 #endif
403  tmpdata = regRd(rHIRQ);
404 
405  if(tmpdata & bmHXFRDNIRQ) {
406  regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt
407  rcode = 0x00;
408  break;
409  }//if( tmpdata & bmHXFRDNIRQ
410 
411  }//while ( millis() < timeout
412 
413  //if (rcode != 0x00) //exit if timeout
414  // return ( rcode);
415 
416  rcode = (regRd(rHRSL) & 0x0f); //analyze transfer result
417 
418  switch(rcode) {
419  case hrNAK:
420  nak_count++;
421  if(nak_limit && (nak_count == nak_limit))
422  return (rcode);
423  break;
424  case hrTIMEOUT:
425  retry_count++;
426  if(retry_count == USB_RETRY_LIMIT)
427  return (rcode);
428  break;
429  default:
430  return (rcode);
431  }//switch( rcode
432 
433  }//while( timeout > millis()
434  return ( rcode);
435 }
436 
437 /* USB main task. Performs enumeration/cleanup */
438 void USB::Task(void) //USB state machine
439 {
440  uint8_t rcode;
441  uint8_t tmpdata;
442  static uint32_t delay = 0;
443  //USB_DEVICE_DESCRIPTOR buf;
444  bool lowspeed = false;
445 
446  MAX3421E::Task();
447 
448  tmpdata = getVbusState();
449 
450  /* modify USB task state if Vbus changed */
451  switch(tmpdata) {
452  case SE1: //illegal state
453  usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL;
454  lowspeed = false;
455  break;
456  case SE0: //disconnected
457  if((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED)
458  usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE;
459  lowspeed = false;
460  break;
461  case LSHOST:
462 
463  lowspeed = true;
464  //intentional fallthrough
465  case FSHOST: //attached
466  if((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) {
467  delay = (uint32_t)millis() + USB_SETTLE_DELAY;
468  usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE;
469  }
470  break;
471  }// switch( tmpdata
472 
473  for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
474  if(devConfig[i])
475  rcode = devConfig[i]->Poll();
476 
477  switch(usb_task_state) {
479  init();
480 
481  for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
482  if(devConfig[i])
483  rcode = devConfig[i]->Release();
484 
485  usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE;
486  break;
487  case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: //just sit here
488  break;
489  case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here
490  break;
491  case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device
492  if((int32_t)((uint32_t)millis() - delay) >= 0L)
493  usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE;
494  else break; // don't fall through
496  regWr(rHCTL, bmBUSRST); //issue bus reset
498  break;
500  if((regRd(rHCTL) & bmBUSRST) == 0) {
501  tmpdata = regRd(rMODE) | bmSOFKAENAB; //start SOF generation
502  regWr(rMODE, tmpdata);
503  usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF;
504  //delay = (uint32_t)millis() + 20; //20ms wait after reset per USB spec
505  }
506  break;
507  case USB_ATTACHED_SUBSTATE_WAIT_SOF: //todo: change check order
508  if(regRd(rHIRQ) & bmFRAMEIRQ) {
509  //when first SOF received _and_ 20ms has passed we can continue
510  /*
511  if (delay < (uint32_t)millis()) //20ms passed
512  usb_task_state = USB_STATE_CONFIGURING;
513  */
514  usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET;
515  delay = (uint32_t)millis() + 20;
516  }
517  break;
519  if((int32_t)((uint32_t)millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING;
520  else break; // don't fall through
522 
523  //Serial.print("\r\nConf.LS: ");
524  //Serial.println(lowspeed, HEX);
525 
526  rcode = Configuring(0, 0, lowspeed);
527 
528  if(rcode) {
530  usb_error = rcode;
531  usb_task_state = USB_STATE_ERROR;
532  }
533  } else
534  usb_task_state = USB_STATE_RUNNING;
535  break;
536  case USB_STATE_RUNNING:
537  break;
538  case USB_STATE_ERROR:
539  //MAX3421E::Init();
540  break;
541  } // switch( usb_task_state )
542 }
543 
544 uint8_t USB::DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed) {
545  //uint8_t buf[12];
546  uint8_t rcode;
547  UsbDevice *p0 = NULL, *p = NULL;
548 
549  // Get pointer to pseudo device with address 0 assigned
550  p0 = addrPool.GetUsbDevicePtr(0);
551 
552  if(!p0)
554 
555  if(!p0->epinfo)
557 
558  p0->lowspeed = (lowspeed) ? true : false;
559 
560  // Allocate new address according to device class
561  uint8_t bAddress = addrPool.AllocAddress(parent, false, port);
562 
563  if(!bAddress)
565 
566  p = addrPool.GetUsbDevicePtr(bAddress);
567 
568  if(!p)
570 
571  p->lowspeed = lowspeed;
572 
573  // Assign new address to the device
574  rcode = setAddr(0, 0, bAddress);
575 
576  if(rcode) {
577  addrPool.FreeAddress(bAddress);
578  bAddress = 0;
579  return rcode;
580  }
581  return 0;
582 };
583 
584 uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed) {
585  //printf("AttemptConfig: parent = %i, port = %i\r\n", parent, port);
586  uint8_t retries = 0;
587 
588 again:
589  uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed);
591  if(parent == 0) {
592  // Send a bus reset on the root interface.
593  regWr(rHCTL, bmBUSRST); //issue bus reset
594  delay(102); // delay 102ms, compensate for clock inaccuracy.
595  } else {
596  // reset parent port
597  devConfig[parent]->ResetHubPort(port);
598  }
599  } else if(rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
600  delay(100);
601  retries++;
602  goto again;
603  } else if(rcode)
604  return rcode;
605 
606  rcode = devConfig[driver]->Init(parent, port, lowspeed);
607  if(rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works
608  delay(100);
609  retries++;
610  goto again;
611  }
612  if(rcode) {
613  // Issue a bus reset, because the device may be in a limbo state
614  if(parent == 0) {
615  // Send a bus reset on the root interface.
616  regWr(rHCTL, bmBUSRST); //issue bus reset
617  delay(102); // delay 102ms, compensate for clock inaccuracy.
618  } else {
619  // reset parent port
620  devConfig[parent]->ResetHubPort(port);
621  }
622  }
623  return rcode;
624 }
625 
626 /*
627  * This is broken. We need to enumerate differently.
628  * It causes major problems with several devices if detected in an unexpected order.
629  *
630  *
631  * Oleg - I wouldn't do anything before the newly connected device is considered sane.
632  * i.e.(delays are not indicated for brevity):
633  * 1. reset
634  * 2. GetDevDescr();
635  * 3a. If ACK, continue with allocating address, addressing, etc.
636  * 3b. Else reset again, count resets, stop at some number (5?).
637  * 4. When max.number of resets is reached, toggle power/fail
638  * 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()
639  * it doesn't need to be reset again
640  * New steps proposal:
641  * 1: get address pool instance. exit on fail
642  * 2: pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf). exit on fail.
643  * 3: bus reset, 100ms delay
644  * 4: set address
645  * 5: pUsb->setEpInfoEntry(bAddress, 1, epInfo), exit on fail
646  * 6: while (configurations) {
647  * for(each configuration) {
648  * for (each driver) {
649  * 6a: Ask device if it likes configuration. Returns 0 on OK.
650  * If successful, the driver configured device.
651  * The driver now owns the endpoints, and takes over managing them.
652  * The following will need codes:
653  * Everything went well, instance consumed, exit with success.
654  * Instance already in use, ignore it, try next driver.
655  * Not a supported device, ignore it, try next driver.
656  * Not a supported configuration for this device, ignore it, try next driver.
657  * Could not configure device, fatal, exit with fail.
658  * }
659  * }
660  * }
661  * 7: for(each driver) {
662  * 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID
663  * 8: if we get here, no driver likes the device plugged in, so exit failure.
664  *
665  */
666 uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) {
667  //uint8_t bAddress = 0;
668  //printf("Configuring: parent = %i, port = %i\r\n", parent, port);
669  uint8_t devConfigIndex;
670  uint8_t rcode = 0;
671  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
672  USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR *>(buf);
673  UsbDevice *p = NULL;
674  EpInfo *oldep_ptr = NULL;
675  EpInfo epInfo;
676 
677  epInfo.epAddr = 0;
678  epInfo.maxPktSize = 8;
679  epInfo.bmSndToggle = 0;
680  epInfo.bmRcvToggle = 0;
681  epInfo.bmNakPower = USB_NAK_MAX_POWER;
682 
683  //delay(2000);
684  AddressPool &addrPool = GetAddressPool();
685  // Get pointer to pseudo device with address 0 assigned
686  p = addrPool.GetUsbDevicePtr(0);
687  if(!p) {
688  //printf("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n");
690  }
691 
692  // Save old pointer to EP_RECORD of address 0
693  oldep_ptr = p->epinfo;
694 
695  // Temporary assign new pointer to epInfo to p->epinfo in order to
696  // avoid toggle inconsistence
697 
698  p->epinfo = &epInfo;
699 
700  p->lowspeed = lowspeed;
701  // Get device descriptor
702  rcode = getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf);
703 
704  // Restore p->epinfo
705  p->epinfo = oldep_ptr;
706 
707  if(rcode) {
708  //printf("Configuring error: Can't get USB_DEVICE_DESCRIPTOR\r\n");
709  return rcode;
710  }
711 
712  // to-do?
713  // Allocate new address according to device class
714  //bAddress = addrPool.AllocAddress(parent, false, port);
715 
716  uint16_t vid = udd->idVendor;
717  uint16_t pid = udd->idProduct;
718  uint8_t klass = udd->bDeviceClass;
719  uint8_t subklass = udd->bDeviceSubClass;
720  // Attempt to configure if VID/PID or device class matches with a driver
721  // Qualify with subclass too.
722  //
723  // VID/PID & class tests default to false for drivers not yet ported
724  // subclass defaults to true, so you don't have to define it if you don't have to.
725  //
726  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
727  if(!devConfig[devConfigIndex]) continue; // no driver
728  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
729  if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) {
730  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
732  break;
733  }
734  }
735 
736  if(devConfigIndex < USB_NUMDEVICES) {
737  return rcode;
738  }
739 
740 
741  // blindly attempt to configure
742  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
743  if(!devConfig[devConfigIndex]) continue;
744  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
745  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
746  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
747 
748  //printf("ERROR ENUMERATING %2.2x\r\n", rcode);
750  // in case of an error dev_index should be reset to 0
751  // in order to start from the very beginning the
752  // next time the program gets here
753  //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE)
754  // devConfigIndex = 0;
755  return rcode;
756  }
757  }
758  // if we get here that means that the device class is not supported by any of registered classes
759  rcode = DefaultAddressing(parent, port, lowspeed);
760 
761  return rcode;
762 }
763 
764 uint8_t USB::ReleaseDevice(uint8_t addr) {
765  if(!addr)
766  return 0;
767 
768  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
769  if(!devConfig[i]) continue;
770  if(devConfig[i]->GetAddress() == addr)
771  return devConfig[i]->Release();
772  }
773  return 0;
774 }
775 
776 #if 1
777 //get device descriptor
778 
779 uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
780  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, NULL));
781 }
782 //get configuration descriptor
783 
784 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
785  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, NULL));
786 }
787 
788 /* 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
789  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 */
790 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) {
791  const uint8_t bufSize = 64;
792  uint8_t buf[bufSize];
793  USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR *>(buf);
794 
795  uint8_t ret = getConfDescr(addr, ep, 9, conf, buf);
796 
797  if(ret)
798  return ret;
799 
800  uint16_t total = ucd->wTotalLength;
801 
802  //USBTRACE2("\r\ntotal conf.size:", total);
803 
804  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p));
805 }
806 
807 //get string descriptor
808 
809 uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) {
810  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, NULL));
811 }
812 //set address
813 
814 uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
815  uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL);
816  //delay(2); //per USB 2.0 sect.9.2.6.3
817  delay(300); // Older spec says you should wait at least 200ms
818  return rcode;
819  //return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
820 }
821 //set configuration
822 
823 uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
824  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
825 }
826 
827 #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:784
+
uint8_t bmRcvToggle
Definition: address.h:48
+ +
virtual uint8_t Poll()
Definition: UsbCore.h:147
+
#define USB_ERROR_EP_NOT_FOUND_IN_TBL
Definition: UsbCore.h:98
+
#define bmHUBPRE
Definition: max3421e.h:172
+
#define USB_ATTACHED_SUBSTATE_WAIT_RESET
Definition: UsbCore.h:125
+
#define FSHOST
Definition: max3421e.h:37
+
#define rHCTL
Definition: max3421e.h:181
+
EpInfo * epinfo
Definition: address.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
+
uint8_t bmNakPower
Definition: address.h:49
+ +
EpInfo * getEpInfoEntry(uint8_t addr, uint8_t ep)
Definition: Usb.cpp:51
+ +
#define bmSOFKAENAB
Definition: max3421e.h:173
+
#define USB_DESCRIPTOR_STRING
Definition: usb_ch9.h:72
+
uint16_t wLength
Definition: UsbCore.h:196
+
#define USB_SETTLE_DELAY
Definition: UsbCore.h:108
+
#define USB_ATTACHED_SUBSTATE_SETTLE
Definition: UsbCore.h:121
+
uint8_t getVbusState(void)
Definition: usbhost.h:151
+
#define bmRCVTOGRD
Definition: max3421e.h:206
+
#define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE
Definition: UsbCore.h:89
+
#define USB_RETRY_LIMIT
Definition: UsbCore.h:107
+
#define USB_REQUEST_GET_DESCRIPTOR
Definition: usb_ch9.h:44
+
#define USB_DESCRIPTOR_DEVICE
Definition: usb_ch9.h:70
+
#define bmRCVTOG1
Definition: max3421e.h:188
+
#define USB_ERROR_INVALID_MAX_PKT_SIZE
Definition: UsbCore.h:97
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
+
#define USB_STATE_DETACHED
Definition: UsbCore.h:117
+
#define USB_NUMDEVICES
Definition: UsbCore.h:110
-
#define rRCVBC
Definition: max3421e.h:40
-
#define hrJERR
Definition: max3421e.h:220
-
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:128
-
uint8_t Task()
Definition: usbhost.h:502
-
#define hrSUCCESS
Definition: max3421e.h:207
-
#define USB_STATE_ERROR
Definition: UsbCore.h:119
-
uint8_t bmRequestType
Definition: UsbCore.h:166
-
#define bmSNDTOGRD
Definition: max3421e.h:200
-
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:64
+
#define rRCVBC
Definition: max3421e.h:47
+
#define hrJERR
Definition: max3421e.h:227
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
+
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:139
+
uint8_t Task()
Definition: usbhost.h:525
+
#define hrSUCCESS
Definition: max3421e.h:214
+
#define USB_STATE_ERROR
Definition: UsbCore.h:130
+
uint8_t bmRequestType
Definition: UsbCore.h:177
+
#define bmSNDTOGRD
Definition: max3421e.h:207
+
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:133
+
#define USB_DESCRIPTOR_CONFIGURATION
Definition: usb_ch9.h:71
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
#define bmHXFRDNIRQ
Definition: max3421e.h:146
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
USB(void)
Definition: Usb.cpp:25
-
#define USB_STATE_RUNNING
Definition: UsbCore.h:118
- -
uint8_t epAddr
Definition: address.h:33
-
#define rRCVFIFO
Definition: max3421e.h:37
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
-
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)
Definition: address.h:181
-
uint16_t wIndex
Definition: UsbCore.h:184
-
#define bmBUSRST
Definition: max3421e.h:176
-
#define tokOUT
Definition: max3421e.h:190
-
#define tokIN
Definition: max3421e.h:189
-
#define LSHOST
Definition: max3421e.h:31
-
#define USB_XFER_TIMEOUT
Definition: UsbCore.h:94
+
#define bmHXFRDNIRQ
Definition: max3421e.h:153
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
USB(void)
Definition: Usb.cpp:32
+
#define USB_STATE_RUNNING
Definition: UsbCore.h:129
+ +
uint8_t epAddr
Definition: address.h:40
+
#define rRCVFIFO
Definition: max3421e.h:44
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
+
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)
Definition: address.h:188
+
uint16_t wIndex
Definition: UsbCore.h:195
+
#define bmBUSRST
Definition: max3421e.h:183
+
#define tokOUT
Definition: max3421e.h:197
+
#define tokIN
Definition: max3421e.h:196
+
#define LSHOST
Definition: max3421e.h:38
+
#define USB_XFER_TIMEOUT
Definition: UsbCore.h:105
union SETUP_PKT::@33 wVal_u
-
Definition: address.h:32
-
#define rMODE
Definition: max3421e.h:160
-
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:293
-
#define hrNAK
Definition: max3421e.h:211
-
#define bmREQ_GET_DESCR
Definition: UsbCore.h:47
-
#define rSNDBC
Definition: max3421e.h:41
-
#define rHRSL
Definition: max3421e.h:196
-
#define USB_ATTACHED_SUBSTATE_RESET_DEVICE
Definition: UsbCore.h:111
-
uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
Definition: usbhost.h:298
-
#define tokINHS
Definition: max3421e.h:191
-
#define bmLOWSPEED
Definition: max3421e.h:164
-
virtual void ResetHubPort(uint8_t port)
Definition: UsbCore.h:144
-
uint8_t * bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
Definition: usbhost.h:196
-
uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
Definition: Usb.cpp:796
- -
#define USB_REQUEST_SET_ADDRESS
Definition: usb_ch9.h:36
-
#define tokSETUP
Definition: max3421e.h:188
-
#define rHXFR
Definition: max3421e.h:185
-
#define rHIRQ
Definition: max3421e.h:137
-
uint8_t bmSndToggle
Definition: address.h:40
-
#define rSNDFIFO
Definition: max3421e.h:38
- -
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
uint8_t devAddress
Definition: address.h:67
- -
#define tokOUTHS
Definition: max3421e.h:192
-
uint8_t getUsbTaskState(void)
Definition: Usb.cpp:36
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
-
#define USB_STATE_MASK
Definition: UsbCore.h:104
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
-
void Task(void)
Definition: Usb.cpp:425
-
#define USB_DETACHED_SUBSTATE_ILLEGAL
Definition: UsbCore.h:109
-
#define hrTIMEOUT
Definition: max3421e.h:221
-
#define rPERADDR
Definition: max3421e.h:172
-
#define bmRCVDAVIRQ
Definition: max3421e.h:141
-
#define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE
Definition: UsbCore.h:112
-
void regWr(uint8_t reg, uint8_t data)
Definition: usbhost.h:153
-
#define bmRCVTOG0
Definition: max3421e.h:180
-
uint8_t epcount
Definition: address.h:78
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
-
#define USB_STATE_CONFIGURING
Definition: UsbCore.h:117
-
uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit)
Definition: Usb.cpp:377
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:124
-
#define bmSNDTOG0
Definition: max3421e.h:182
-
uint8_t regRd(uint8_t reg)
Definition: usbhost.h:259
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
#define USB_ERROR_INVALID_ARGUMENT
Definition: UsbCore.h:84
-
uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
Definition: Usb.cpp:653
+
Definition: address.h:39
+
#define rMODE
Definition: max3421e.h:167
+
void setUsbTaskState(uint8_t state)
Definition: Usb.cpp:47
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
+
#define hrNAK
Definition: max3421e.h:218
+
#define bmREQ_GET_DESCR
Definition: UsbCore.h:58
+
#define rSNDBC
Definition: max3421e.h:48
+
#define rHRSL
Definition: max3421e.h:203
+
#define USB_ATTACHED_SUBSTATE_RESET_DEVICE
Definition: UsbCore.h:122
+
uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
Definition: usbhost.h:321
+
#define tokINHS
Definition: max3421e.h:198
+
#define bmLOWSPEED
Definition: max3421e.h:171
+
virtual void ResetHubPort(uint8_t port)
Definition: UsbCore.h:155
+
uint8_t * bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
Definition: usbhost.h:219
+
uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
Definition: Usb.cpp:809
+ +
#define USB_REQUEST_SET_ADDRESS
Definition: usb_ch9.h:43
+
#define tokSETUP
Definition: max3421e.h:195
+
#define rHXFR
Definition: max3421e.h:192
+
#define rHIRQ
Definition: max3421e.h:144
+
uint8_t bmSndToggle
Definition: address.h:47
+
#define rSNDFIFO
Definition: max3421e.h:45
+ +
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
uint8_t devAddress
Definition: address.h:74
+ +
#define tokOUTHS
Definition: max3421e.h:199
+
uint8_t getUsbTaskState(void)
Definition: Usb.cpp:43
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
+
#define USB_STATE_MASK
Definition: UsbCore.h:115
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
+
void Task(void)
Definition: Usb.cpp:438
+
#define USB_DETACHED_SUBSTATE_ILLEGAL
Definition: UsbCore.h:120
+
#define hrTIMEOUT
Definition: max3421e.h:228
+
#define rPERADDR
Definition: max3421e.h:179
+
#define bmRCVDAVIRQ
Definition: max3421e.h:148
+
#define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE
Definition: UsbCore.h:123
+
void regWr(uint8_t reg, uint8_t data)
Definition: usbhost.h:176
+
#define bmRCVTOG0
Definition: max3421e.h:187
+
uint8_t epcount
Definition: address.h:85
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
+
#define USB_STATE_CONFIGURING
Definition: UsbCore.h:128
+
uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit)
Definition: Usb.cpp:384
+
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:135
+
#define bmSNDTOG0
Definition: max3421e.h:189
+
uint8_t regRd(uint8_t reg)
Definition: usbhost.h:282
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
#define USB_ERROR_INVALID_ARGUMENT
Definition: UsbCore.h:95
+
uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
Definition: Usb.cpp:666
union SETUP_PKT::@32 ReqType_u
-
#define USBTRACE3(s, r, l)
Definition: macros.h:78
-
uint8_t bRequest
Definition: UsbCore.h:174
-
#define SE0
Definition: max3421e.h:28
-
virtual void FreeAddress(uint8_t addr)
Definition: address.h:255
-
virtual uint8_t Release()
Definition: UsbCore.h:132
-
#define bmFRAMEIRQ
Definition: max3421e.h:145
-
#define hrTOGERR
Definition: max3421e.h:213
-
#define SE1
Definition: max3421e.h:29
-
#define rSUDFIFO
Definition: max3421e.h:39
-
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)
Definition: address.h:203
-
#define bmREQ_SET
Definition: UsbCore.h:48
-
UsbDeviceAddress address
Definition: address.h:77
-
#define USB_REQUEST_SET_CONFIGURATION
Definition: usb_ch9.h:40
-
#define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE
Definition: UsbCore.h:108
-
uint8_t wValueHi
Definition: UsbCore.h:181
-
uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed)
Definition: Usb.cpp:531
-
#define USB_DETACHED_SUBSTATE_INITIALIZE
Definition: UsbCore.h:107
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define USB_ATTACHED_SUBSTATE_WAIT_SOF
Definition: UsbCore.h:113
-
uint8_t wValueLo
Definition: UsbCore.h:180
-
#define bmSNDTOG1
Definition: max3421e.h:183
-
uint8_t ReleaseDevice(uint8_t addr)
Definition: Usb.cpp:751
-
#define USB_ERROR_TRANSFER_TIMEOUT
Definition: UsbCore.h:92
-
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:88
- +
#define USBTRACE3(s, r, l)
Definition: macros.h:85
+
uint8_t bRequest
Definition: UsbCore.h:185
+
#define SE0
Definition: max3421e.h:35
+
virtual void FreeAddress(uint8_t addr)
Definition: address.h:262
+
virtual uint8_t Release()
Definition: UsbCore.h:143
+
#define bmFRAMEIRQ
Definition: max3421e.h:152
+
#define hrTOGERR
Definition: max3421e.h:220
+
#define SE1
Definition: max3421e.h:36
+
#define rSUDFIFO
Definition: max3421e.h:46
+
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)
Definition: address.h:210
+
#define bmREQ_SET
Definition: UsbCore.h:59
+
UsbDeviceAddress address
Definition: address.h:84
+
#define USB_REQUEST_SET_CONFIGURATION
Definition: usb_ch9.h:47
+
#define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE
Definition: UsbCore.h:119
+
uint8_t wValueHi
Definition: UsbCore.h:192
+
uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed)
Definition: Usb.cpp:544
+
#define USB_DETACHED_SUBSTATE_INITIALIZE
Definition: UsbCore.h:118
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define USB_ATTACHED_SUBSTATE_WAIT_SOF
Definition: UsbCore.h:124
+
uint8_t wValueLo
Definition: UsbCore.h:191
+
#define bmSNDTOG1
Definition: max3421e.h:190
+
uint8_t ReleaseDevice(uint8_t addr)
Definition: Usb.cpp:764
+
#define USB_ERROR_TRANSFER_TIMEOUT
Definition: UsbCore.h:103
+
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:99
+
diff --git a/_usb_8h.html b/_usb_8h.html index 1b198c20..5087c235 100644 --- a/_usb_8h.html +++ b/_usb_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Usb.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- + @@ -153,7 +133,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 2953461a..9057c61b 100644 --- a/_usb_8h__dep__incl.map +++ b/_usb_8h__dep__incl.map @@ -17,7 +17,7 @@ - + diff --git a/_usb_8h__dep__incl.md5 b/_usb_8h__dep__incl.md5 index 5590cd87..e1d7ac1c 100644 --- a/_usb_8h__dep__incl.md5 +++ b/_usb_8h__dep__incl.md5 @@ -1 +1 @@ -cbd29ebc2b06737d0300e8c7453ef569 \ No newline at end of file +6b21142e913bd435243a744ada379d21 \ No newline at end of file diff --git a/_usb_8h__dep__incl.png b/_usb_8h__dep__incl.png index 8e292d1e38a965a65511d0e09ae32091292f63a2..90150ef77b5bed03856547cf45e4be65805af584 100644 GIT binary patch literal 165149 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 iJzr%)vp}bYPza2Aq-aNT}fR`btg{WP% zn2*aWUDKRc|1>bt0DMll`BJ%$_@2Y|a3z1Qg(reCCuQv4Gt%MD`LJkNg zc2B%37U|dlWB~EePI6s;CXEE7;ha7l7a5w33Pg}RUc{dUIDULDc_V%T*d&R%g@*Be zW5g=-fMh=LDC~W|K^)=ZYockb)qOmwufo2BbG(l0oM_91uKUwCHb4JZIr(y%N#m(1 zp3w-GFGj~s1I(^IRXo<+JV?QFS(C@>e&FWBhj{sO?(57`_ud)Y0r+o(LBM|KOrDri zw(Ou|(*7T|-a4$RcIy`=79}0RqEkY;Lpl{vQbJllq`SLw5t2%Wf`W8PcQ?}Ajda6z z^Xzx;bN2h4zql^sV#%EI9&?OejdQ(9BbG=qiz(N}_ z6Ef7#Akx=py39v9=hJ!?9b84 z{E8$Igg)QE&lQcR3sCWDlRsnMr}#X;GnH7+GpvcrC$TRQ_!Ez#P5weRO&ItiiNmhO z7;)N%oP|RtjX5C!*LxuVQeIPyuiL|3J991HUcHb`8CC9|7_vy zb41ESit(9V9CeI{2T5;w1BBO7Q_>!}x>LJ~th4~%`+VAxlcwEW{D(^Ies3VO!0$1} z4S=)}aOsq`Blf=kE&%=?=7 zkEITE3tEFl5Z-f^ToP z=3)Ot`AIM&rmv$z#OyYV;@e5}gpt?hxaUMT@n=Wx*zT8?mqc~my3cY`flsAWdqIaY z^cfF(Plg!nGFWh#ZRvVA=avc_I1I*;kwZ)L212rC0Tc_(Sd z?$*4E#mRTO{i!+Ya0?V{J;rdwv=@^&>tw3N&ndV$4VrcQ(FYs7NUvG{)VWZW^e&mx zC$h!D2o2^zj-vD3Y4YOec<5t0NQMgR`SjD4Y5c`?*7?7Ge5R2pdqQlu-uuAhHjF7- zdRO}@j%x)ESRUiT%`96^R@|Y{6&4yn38~B@se-d+Qzh#PRJZD=e2?#`_m$!1VoUJ) zjM1W3#%~2V)LSpnb~Kc_z`JJE3N=IWXhew~Vkgt3N+EvM#sqCvdz^TreRd~AoJD+I zb_aq^0zdMzxNslv&ei1bp$663YrRgG#~#*t-rF9AFTaT7PlZ6R?F`oQ0M)A?mg)Lw z2ZYz@)Wf9rR*oK`MRH*dY*CpUs5uZaRA4uNt?jrjHM{K{+!B6!8B6!MU{&SYG0rvm z<75Jc1^`h+b}9W7f{K0WvUv`U!)NJ9>{X((=3Hb1urzQJF|OvjITHlX=3sovBN-zO z#izP1{_onhMFY1kVOgW~=4h~&*ZF+!o%_jva)ryGnR=3$RHX$`xtd)G^=!ip1W5B= z00{{*SpTK=RamH@p}|Jc{O*821GxX;89kpuZ%22f6@{Ts2^Qe75u z`Sa7O0*D$&gdB;V$;Zd^Ja@~tU+17F2rlh4dh4`Hh-m5MhSr@DWvwVdc6)Q!=4{fc z*H9JiPZuAv^qnHyNh!7CB(p^bRXlc(>cXE6R^szO41{*coED#!nrkJ=Ab!I@%d9KJ z9@ks=t=A^)J(|K>kUM33m=cQ^iC#*NfCpN3LxGdCN%UOyVDNH$4U>90f}m>p)%?@H z7!h2$MIavBipLAyMZ^C&yP}kD$A~Sttr0+jLyn;26=L2L{D7l$yyT;~#sA+kFOD2s zirH^QN*@?pE;kN}pWt}z6M}96pRgOMXE@XED@mA0Me*q?h|UNpr7eCiE}gG7T+knV zG?g$P࿐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 aBW%0Q{3fog>&-dvM_N)|qEO5*@c#ky@A literal 162614 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 diff --git a/_usb_8h_source.html b/_usb_8h_source.html index ee76a791..98c818e2 100644 --- a/_usb_8h_source.html +++ b/_usb_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Usb.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
Usb.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 /* USB functions */
18 #ifndef _usb_h_
19 #define _usb_h_
20 
21 // WARNING: Do not change the order of includes, or stuff will break!
22 #include <inttypes.h>
23 #include <stddef.h>
24 #include <stdio.h>
25 
26 // None of these should ever be included by a driver, or a user's sketch.
27 #include "settings.h"
28 #include "printhex.h"
29 #include "message.h"
30 #include "hexdump.h"
31 #include "sink_parser.h"
32 #include "max3421e.h"
33 #include "address.h"
34 #include "avrpins.h"
35 #include "usb_ch9.h"
36 #include "usbhost.h"
37 #include "UsbCore.h"
38 #include "parsetools.h"
39 #include "confdescparser.h"
40 
41 #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_
@@ -108,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_usb_core_8h.html b/_usb_core_8h.html index d13f686e..a8ea182e 100644 --- a/_usb_core_8h.html +++ b/_usb_core_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: UsbCore.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ bmREQ_GET_DESCR

+
@@ -245,11 +227,13 @@ Typedefs
-

Definition at line 47 of file UsbCore.h.

+

Definition at line 58 of file UsbCore.h.

- + +

◆ bmREQ_SET

+
@@ -259,11 +243,13 @@ Typedefs
-

Definition at line 48 of file UsbCore.h.

+

Definition at line 59 of file UsbCore.h.

- + +

◆ bmREQ_CL_GET_INTF

+
@@ -273,11 +259,13 @@ Typedefs
-

Definition at line 49 of file UsbCore.h.

+

Definition at line 60 of file UsbCore.h.

- + +

◆ USB_CLASS_USE_CLASS_INFO

+
@@ -287,11 +275,13 @@ Typedefs
-

Definition at line 56 of file UsbCore.h.

+

Definition at line 67 of file UsbCore.h.

- + +

◆ USB_CLASS_AUDIO

+
@@ -301,11 +291,13 @@ Typedefs
-

Definition at line 57 of file UsbCore.h.

+

Definition at line 68 of file UsbCore.h.

- + +

◆ USB_CLASS_COM_AND_CDC_CTRL

+
@@ -315,11 +307,13 @@ Typedefs
-

Definition at line 58 of file UsbCore.h.

+

Definition at line 69 of file UsbCore.h.

- + +

◆ USB_CLASS_HID

+
@@ -329,11 +323,13 @@ Typedefs
-

Definition at line 59 of file UsbCore.h.

+

Definition at line 70 of file UsbCore.h.

- + +

◆ USB_CLASS_PHYSICAL

+
@@ -343,11 +339,13 @@ Typedefs
-

Definition at line 60 of file UsbCore.h.

+

Definition at line 71 of file UsbCore.h.

- + +

◆ USB_CLASS_IMAGE

+
@@ -357,11 +355,13 @@ Typedefs
-

Definition at line 61 of file UsbCore.h.

+

Definition at line 72 of file UsbCore.h.

- + +

◆ USB_CLASS_PRINTER

+
@@ -371,11 +371,13 @@ Typedefs
-

Definition at line 62 of file UsbCore.h.

+

Definition at line 73 of file UsbCore.h.

- + +

◆ USB_CLASS_MASS_STORAGE

+
@@ -385,11 +387,13 @@ Typedefs
-

Definition at line 63 of file UsbCore.h.

+

Definition at line 74 of file UsbCore.h.

- + +

◆ USB_CLASS_HUB

+
@@ -399,11 +403,13 @@ Typedefs
-

Definition at line 64 of file UsbCore.h.

+

Definition at line 75 of file UsbCore.h.

- + +

◆ USB_CLASS_CDC_DATA

+
@@ -413,11 +419,13 @@ Typedefs
-

Definition at line 65 of file UsbCore.h.

+

Definition at line 76 of file UsbCore.h.

- + +

◆ USB_CLASS_SMART_CARD

+
@@ -427,11 +435,13 @@ Typedefs
-

Definition at line 66 of file UsbCore.h.

+

Definition at line 77 of file UsbCore.h.

- + +

◆ USB_CLASS_CONTENT_SECURITY

+
@@ -441,11 +451,13 @@ Typedefs
-

Definition at line 67 of file UsbCore.h.

+

Definition at line 78 of file UsbCore.h.

- + +

◆ USB_CLASS_VIDEO

+
@@ -455,11 +467,13 @@ Typedefs
-

Definition at line 68 of file UsbCore.h.

+

Definition at line 79 of file UsbCore.h.

- + +

◆ USB_CLASS_PERSONAL_HEALTH

+
@@ -469,11 +483,13 @@ Typedefs
-

Definition at line 69 of file UsbCore.h.

+

Definition at line 80 of file UsbCore.h.

- + +

◆ USB_CLASS_DIAGNOSTIC_DEVICE

+
@@ -483,11 +499,13 @@ Typedefs
-

Definition at line 70 of file UsbCore.h.

+

Definition at line 81 of file UsbCore.h.

- + +

◆ USB_CLASS_WIRELESS_CTRL

+
@@ -497,11 +515,13 @@ Typedefs
-

Definition at line 71 of file UsbCore.h.

+

Definition at line 82 of file UsbCore.h.

- + +

◆ USB_CLASS_MISC

+
@@ -511,11 +531,13 @@ Typedefs
-

Definition at line 72 of file UsbCore.h.

+

Definition at line 83 of file UsbCore.h.

- + +

◆ USB_CLASS_APP_SPECIFIC

+
@@ -525,11 +547,13 @@ Typedefs
-

Definition at line 73 of file UsbCore.h.

+

Definition at line 84 of file UsbCore.h.

- + +

◆ USB_CLASS_VENDOR_SPECIFIC

+
@@ -539,11 +563,13 @@ Typedefs
-

Definition at line 74 of file UsbCore.h.

+

Definition at line 85 of file UsbCore.h.

- + +

◆ USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED

+
@@ -553,11 +579,13 @@ Typedefs
-

Definition at line 77 of file UsbCore.h.

+

Definition at line 88 of file UsbCore.h.

- + +

◆ USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE

+
@@ -567,11 +595,13 @@ Typedefs
-

Definition at line 78 of file UsbCore.h.

+

Definition at line 89 of file UsbCore.h.

- + +

◆ USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS

+
@@ -581,11 +611,13 @@ Typedefs
-

Definition at line 79 of file UsbCore.h.

+

Definition at line 90 of file UsbCore.h.

- + +

◆ USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL

+
@@ -595,11 +627,13 @@ Typedefs
-

Definition at line 80 of file UsbCore.h.

+

Definition at line 91 of file UsbCore.h.

- + +

◆ USB_ERROR_HUB_ADDRESS_OVERFLOW

+
@@ -609,11 +643,13 @@ Typedefs
-

Definition at line 81 of file UsbCore.h.

+

Definition at line 92 of file UsbCore.h.

- + +

◆ USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL

+
@@ -623,11 +659,13 @@ Typedefs
-

Definition at line 82 of file UsbCore.h.

+

Definition at line 93 of file UsbCore.h.

- + +

◆ USB_ERROR_EPINFO_IS_NULL

+
@@ -637,11 +675,13 @@ Typedefs
-

Definition at line 83 of file UsbCore.h.

+

Definition at line 94 of file UsbCore.h.

- + +

◆ USB_ERROR_INVALID_ARGUMENT

+
@@ -651,11 +691,13 @@ Typedefs
-

Definition at line 84 of file UsbCore.h.

+

Definition at line 95 of file UsbCore.h.

- + +

◆ USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE

+
@@ -665,11 +707,13 @@ Typedefs
-

Definition at line 85 of file UsbCore.h.

+

Definition at line 96 of file UsbCore.h.

- + +

◆ USB_ERROR_INVALID_MAX_PKT_SIZE

+
@@ -679,11 +723,13 @@ Typedefs
-

Definition at line 86 of file UsbCore.h.

+

Definition at line 97 of file UsbCore.h.

- + +

◆ USB_ERROR_EP_NOT_FOUND_IN_TBL

+
@@ -693,11 +739,13 @@ Typedefs
-

Definition at line 87 of file UsbCore.h.

+

Definition at line 98 of file UsbCore.h.

- + +

◆ USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET

+
@@ -707,11 +755,13 @@ Typedefs
-

Definition at line 88 of file UsbCore.h.

+

Definition at line 99 of file UsbCore.h.

- + +

◆ USB_ERROR_FailGetDevDescr

+
@@ -721,11 +771,13 @@ Typedefs
-

Definition at line 89 of file UsbCore.h.

+

Definition at line 100 of file UsbCore.h.

- + +

◆ USB_ERROR_FailSetDevTblEntry

+
@@ -735,11 +787,13 @@ Typedefs
-

Definition at line 90 of file UsbCore.h.

+

Definition at line 101 of file UsbCore.h.

- + +

◆ USB_ERROR_FailGetConfDescr

+
@@ -749,11 +803,13 @@ Typedefs
-

Definition at line 91 of file UsbCore.h.

+

Definition at line 102 of file UsbCore.h.

- + +

◆ USB_ERROR_TRANSFER_TIMEOUT

+
@@ -763,11 +819,13 @@ Typedefs
-

Definition at line 92 of file UsbCore.h.

+

Definition at line 103 of file UsbCore.h.

- + +

◆ USB_XFER_TIMEOUT

+
@@ -777,11 +835,13 @@ Typedefs
-

Definition at line 94 of file UsbCore.h.

+

Definition at line 105 of file UsbCore.h.

- + +

◆ USB_RETRY_LIMIT

+
@@ -791,11 +851,13 @@ Typedefs
-

Definition at line 96 of file UsbCore.h.

+

Definition at line 107 of file UsbCore.h.

- + +

◆ USB_SETTLE_DELAY

+
@@ -805,11 +867,13 @@ Typedefs
-

Definition at line 97 of file UsbCore.h.

+

Definition at line 108 of file UsbCore.h.

- + +

◆ USB_NUMDEVICES

+
@@ -819,11 +883,13 @@ Typedefs
-

Definition at line 99 of file UsbCore.h.

+

Definition at line 110 of file UsbCore.h.

- + +

◆ HUB_PORT_RESET_DELAY

+
@@ -833,11 +899,13 @@ Typedefs
-

Definition at line 101 of file UsbCore.h.

+

Definition at line 112 of file UsbCore.h.

- + +

◆ USB_STATE_MASK

+
@@ -847,11 +915,13 @@ Typedefs
-

Definition at line 104 of file UsbCore.h.

+

Definition at line 115 of file UsbCore.h.

- + +

◆ USB_STATE_DETACHED

+
@@ -861,11 +931,13 @@ Typedefs
-

Definition at line 106 of file UsbCore.h.

+

Definition at line 117 of file UsbCore.h.

- + +

◆ USB_DETACHED_SUBSTATE_INITIALIZE

+
@@ -875,11 +947,13 @@ Typedefs
-

Definition at line 107 of file UsbCore.h.

+

Definition at line 118 of file UsbCore.h.

- + +

◆ USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE

+
@@ -889,11 +963,13 @@ Typedefs
-

Definition at line 108 of file UsbCore.h.

+

Definition at line 119 of file UsbCore.h.

- + +

◆ USB_DETACHED_SUBSTATE_ILLEGAL

+
@@ -903,11 +979,13 @@ Typedefs
-

Definition at line 109 of file UsbCore.h.

+

Definition at line 120 of file UsbCore.h.

- + +

◆ USB_ATTACHED_SUBSTATE_SETTLE

+
@@ -917,11 +995,13 @@ Typedefs
-

Definition at line 110 of file UsbCore.h.

+

Definition at line 121 of file UsbCore.h.

- + +

◆ USB_ATTACHED_SUBSTATE_RESET_DEVICE

+
@@ -931,11 +1011,13 @@ Typedefs
-

Definition at line 111 of file UsbCore.h.

+

Definition at line 122 of file UsbCore.h.

- + +

◆ USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE

+
@@ -945,11 +1027,13 @@ Typedefs
-

Definition at line 112 of file UsbCore.h.

+

Definition at line 123 of file UsbCore.h.

- + +

◆ USB_ATTACHED_SUBSTATE_WAIT_SOF

+
@@ -959,11 +1043,13 @@ Typedefs
-

Definition at line 113 of file UsbCore.h.

+

Definition at line 124 of file UsbCore.h.

- + +

◆ USB_ATTACHED_SUBSTATE_WAIT_RESET

+
@@ -973,11 +1059,13 @@ Typedefs
-

Definition at line 114 of file UsbCore.h.

+

Definition at line 125 of file UsbCore.h.

- + +

◆ USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE

+
@@ -987,11 +1075,13 @@ Typedefs
-

Definition at line 115 of file UsbCore.h.

+

Definition at line 126 of file UsbCore.h.

- + +

◆ USB_STATE_ADDRESSING

+
@@ -1001,11 +1091,13 @@ Typedefs
-

Definition at line 116 of file UsbCore.h.

+

Definition at line 127 of file UsbCore.h.

- + +

◆ USB_STATE_CONFIGURING

+
@@ -1015,11 +1107,13 @@ Typedefs
-

Definition at line 117 of file UsbCore.h.

+

Definition at line 128 of file UsbCore.h.

- + +

◆ USB_STATE_RUNNING

+
@@ -1029,11 +1123,13 @@ Typedefs
-

Definition at line 118 of file UsbCore.h.

+

Definition at line 129 of file UsbCore.h.

- + +

◆ USB_STATE_ERROR

+
@@ -1043,12 +1139,14 @@ Typedefs
-

Definition at line 119 of file UsbCore.h.

+

Definition at line 130 of file UsbCore.h.

Typedef Documentation

- + +

◆ MAX3421E

+
@@ -1058,11 +1156,13 @@ Typedefs
-

Definition at line 43 of file UsbCore.h.

+

Definition at line 54 of file UsbCore.h.

- + +

◆ PSETUP_PKT

+
@@ -1079,7 +1179,7 @@ Typedefs diff --git a/_usb_core_8h_source.html b/_usb_core_8h_source.html index 27e91655..694e771c 100644 --- a/_usb_core_8h_source.html +++ b/_usb_core_8h_source.html @@ -3,7 +3,8 @@ - + +USB Host Shield 2.0: UsbCore.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
UsbCore.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(_usb_h_) || defined(USBCORE_H)
19 #error "Never include UsbCore.h directly; include Usb.h instead"
20 #else
21 #define USBCORE_H
22 
23 // Not used anymore? If anyone uses this, please let us know so that this may be
24 // moved to the proper place, settings.h.
25 //#define USB_METHODS_INLINE
26 
27 /* shield pins. First parameter - SS pin, second parameter - INT pin */
28 #ifdef BOARD_BLACK_WIDDOW
29 typedef MAX3421e<P6, P3> MAX3421E; // Black Widow
30 #elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
31 #if EXT_RAM
32 typedef MAX3421e<P20, P7> MAX3421E; // Teensy++ 2.0 with XMEM2
33 #else
34 typedef MAX3421e<P9, P8> MAX3421E; // Teensy++ 1.0 and 2.0
35 #endif
36 #elif defined(BOARD_MEGA_ADK)
37 typedef MAX3421e<P53, P54> MAX3421E; // Arduino Mega ADK
38 #elif defined(ARDUINO_AVR_BALANDUINO)
39 typedef MAX3421e<P20, P19> MAX3421E; // Balanduino
40 #elif defined(__ARDUINO_X86__) && PLATFORM_ID == 0x06
41 typedef MAX3421e<P3, P2> MAX3421E; // The Intel Galileo supports much faster read and write speed at pin 2 and 3
42 #else
43 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.0
44 #endif
45 
46 /* Common setup data constant combinations */
47 #define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //get descriptor request type
48 #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'
49 #define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE //get interface request type
50 
51 // D7 data transfer direction (0 - host-to-device, 1 - device-to-host)
52 // D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved)
53 // D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved)
54 
55 // USB Device Classes
56 #define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors
57 #define USB_CLASS_AUDIO 0x01 // Audio
58 #define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control
59 #define USB_CLASS_HID 0x03 // HID
60 #define USB_CLASS_PHYSICAL 0x05 // Physical
61 #define USB_CLASS_IMAGE 0x06 // Image
62 #define USB_CLASS_PRINTER 0x07 // Printer
63 #define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage
64 #define USB_CLASS_HUB 0x09 // Hub
65 #define USB_CLASS_CDC_DATA 0x0a // CDC-Data
66 #define USB_CLASS_SMART_CARD 0x0b // Smart-Card
67 #define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security
68 #define USB_CLASS_VIDEO 0x0e // Video
69 #define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare
70 #define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device
71 #define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller
72 #define USB_CLASS_MISC 0xef // Miscellaneous
73 #define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific
74 #define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific
75 
76 // Additional Error Codes
77 #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1
78 #define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2
79 #define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3
80 #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4
81 #define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5
82 #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6
83 #define USB_ERROR_EPINFO_IS_NULL 0xD7
84 #define USB_ERROR_INVALID_ARGUMENT 0xD8
85 #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9
86 #define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA
87 #define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB
88 #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET 0xE0
89 #define USB_ERROR_FailGetDevDescr 0xE1
90 #define USB_ERROR_FailSetDevTblEntry 0xE2
91 #define USB_ERROR_FailGetConfDescr 0xE3
92 #define USB_ERROR_TRANSFER_TIMEOUT 0xFF
93 
94 #define USB_XFER_TIMEOUT 5000 // (5000) USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec
95 //#define USB_NAK_LIMIT 32000 // NAK limit for a transfer. 0 means NAKs are not counted
96 #define USB_RETRY_LIMIT 3 // 3 retry limit for a transfer
97 #define USB_SETTLE_DELAY 200 // settle delay in milliseconds
98 
99 #define USB_NUMDEVICES 16 //number of USB devices
100 //#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller
101 #define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms
102 
103 /* USB state machine states */
104 #define USB_STATE_MASK 0xf0
105 
106 #define USB_STATE_DETACHED 0x10
107 #define USB_DETACHED_SUBSTATE_INITIALIZE 0x11
108 #define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12
109 #define USB_DETACHED_SUBSTATE_ILLEGAL 0x13
110 #define USB_ATTACHED_SUBSTATE_SETTLE 0x20
111 #define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30
112 #define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40
113 #define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50
114 #define USB_ATTACHED_SUBSTATE_WAIT_RESET 0x51
115 #define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60
116 #define USB_STATE_ADDRESSING 0x70
117 #define USB_STATE_CONFIGURING 0x80
118 #define USB_STATE_RUNNING 0x90
119 #define USB_STATE_ERROR 0xa0
120 
122 public:
123 
124  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed) {
125  return 0;
126  }
127 
128  virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
129  return 0;
130  }
131 
132  virtual uint8_t Release() {
133  return 0;
134  }
135 
136  virtual uint8_t Poll() {
137  return 0;
138  }
139 
140  virtual uint8_t GetAddress() {
141  return 0;
142  }
143 
144  virtual void ResetHubPort(uint8_t port) {
145  return;
146  } // Note used for hubs only!
147 
148  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
149  return false;
150  }
151 
152  virtual bool DEVCLASSOK(uint8_t klass) {
153  return false;
154  }
155 
156  virtual bool DEVSUBCLASSOK(uint8_t subklass) {
157  return true;
158  }
159 
160 };
161 
162 /* USB Setup Packet Structure */
163 typedef struct {
164 
165  union { // offset description
166  uint8_t bmRequestType; // 0 Bit-map of request type
167 
168  struct {
169  uint8_t recipient : 5; // Recipient of the request
170  uint8_t type : 2; // Type of request
171  uint8_t direction : 1; // Direction of data X-fer
172  } __attribute__((packed));
173  } ReqType_u;
174  uint8_t bRequest; // 1 Request
175 
176  union {
177  uint16_t wValue; // 2 Depends on bRequest
178 
179  struct {
180  uint8_t wValueLo;
181  uint8_t wValueHi;
182  } __attribute__((packed));
183  } wVal_u;
184  uint16_t wIndex; // 4 Depends on bRequest
185  uint16_t wLength; // 6 Depends on bRequest
186 } __attribute__((packed)) SETUP_PKT, *PSETUP_PKT;
187 
188 
189 
190 // Base class for incoming data parser
191 
193 public:
194  virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) = 0;
195 };
196 
197 class USB : public MAX3421E {
199  USBDeviceConfig* devConfig[USB_NUMDEVICES];
200  uint8_t bmHubPre;
201 
202 public:
203  USB(void);
204 
205  void SetHubPreMask() {
206  bmHubPre |= bmHUBPRE;
207  };
208 
210  bmHubPre &= (~bmHUBPRE);
211  };
212 
214  return (AddressPool&)addrPool;
215  };
216 
218  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
219  if(!devConfig[i]) {
220  devConfig[i] = pdev;
221  return 0;
222  }
223  }
225  };
226 
228  addrPool.ForEachUsbDevice(pfunc);
229  };
230  uint8_t getUsbTaskState(void);
231  void setUsbTaskState(uint8_t state);
232 
233  EpInfo* getEpInfoEntry(uint8_t addr, uint8_t ep);
234  uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr);
235 
236  /* Control requests */
237  uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
238  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr);
239 
240  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p);
241 
242  uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr);
243  uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr);
244  uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value);
245 
246  uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, bool direction);
247  uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit);
248  uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval = 0);
249  uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data);
250  uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit);
251 
252  void Task(void);
253 
254  uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed);
255  uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed);
256  uint8_t ReleaseDevice(uint8_t addr);
257 
258  uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
259  uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p);
260 
261 private:
262  void init();
263  uint8_t SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit);
264  uint8_t OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data);
265  uint8_t InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0);
266  uint8_t AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed);
267 };
268 
269 #if 0 //defined(USB_METHODS_INLINE)
270 //get device descriptor
271 
272 inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
273  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr));
274 }
275 //get configuration descriptor
276 
277 inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
278  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr));
279 }
280 //get string descriptor
281 
282 inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) {
283  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr));
284 }
285 //set address
286 
287 inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
288  return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, NULL));
289 }
290 //set configuration
291 
292 inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
293  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, NULL));
294 }
295 
296 #endif // defined(USB_METHODS_INLINE)
297 
298 #endif /* USBCORE_H */
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:771
- -
uint16_t wValue
Definition: UsbCore.h:177
-
virtual uint8_t Poll()
Definition: UsbCore.h:136
-
#define bmHUBPRE
Definition: max3421e.h:165
-
virtual uint8_t GetAddress()
Definition: UsbCore.h:140
-
#define USB_DESCRIPTOR_STRING
Definition: usb_ch9.h:65
-
uint16_t wLength
Definition: UsbCore.h:185
- -
#define USB_REQUEST_GET_DESCRIPTOR
Definition: usb_ch9.h:37
-
#define USB_DESCRIPTOR_DEVICE
Definition: usb_ch9.h:63
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
-
#define USB_NUMDEVICES
Definition: UsbCore.h:99
- -
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:128
-
uint8_t bmRequestType
Definition: UsbCore.h:166
-
#define USB_DESCRIPTOR_CONFIGURATION
Definition: usb_ch9.h:64
-
void ResetHubPreMask()
Definition: UsbCore.h:209
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
uint16_t wIndex
Definition: UsbCore.h:184
-
void SetHubPreMask()
Definition: UsbCore.h:205
-
Definition: address.h:32
-
#define bmREQ_GET_DESCR
Definition: UsbCore.h:47
-
virtual void ResetHubPort(uint8_t port)
Definition: UsbCore.h:144
-
#define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS
Definition: UsbCore.h:79
-
uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
Definition: Usb.cpp:796
-
#define USB_REQUEST_SET_ADDRESS
Definition: usb_ch9.h:36
-
MAX3421e< P10, P9 > MAX3421E
Definition: UsbCore.h:43
- - -
virtual bool DEVSUBCLASSOK(uint8_t subklass)
Definition: UsbCore.h:156
+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 #else
54 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
55 #endif
56 
57 /* Common setup data constant combinations */
58 #define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //get descriptor request type
59 #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'
60 #define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE //get interface request type
61 
62 // D7 data transfer direction (0 - host-to-device, 1 - device-to-host)
63 // D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved)
64 // D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved)
65 
66 // USB Device Classes
67 #define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors
68 #define USB_CLASS_AUDIO 0x01 // Audio
69 #define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control
70 #define USB_CLASS_HID 0x03 // HID
71 #define USB_CLASS_PHYSICAL 0x05 // Physical
72 #define USB_CLASS_IMAGE 0x06 // Image
73 #define USB_CLASS_PRINTER 0x07 // Printer
74 #define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage
75 #define USB_CLASS_HUB 0x09 // Hub
76 #define USB_CLASS_CDC_DATA 0x0a // CDC-Data
77 #define USB_CLASS_SMART_CARD 0x0b // Smart-Card
78 #define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security
79 #define USB_CLASS_VIDEO 0x0e // Video
80 #define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare
81 #define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device
82 #define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller
83 #define USB_CLASS_MISC 0xef // Miscellaneous
84 #define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific
85 #define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific
86 
87 // Additional Error Codes
88 #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1
89 #define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2
90 #define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3
91 #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4
92 #define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5
93 #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6
94 #define USB_ERROR_EPINFO_IS_NULL 0xD7
95 #define USB_ERROR_INVALID_ARGUMENT 0xD8
96 #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9
97 #define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA
98 #define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB
99 #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET 0xE0
100 #define USB_ERROR_FailGetDevDescr 0xE1
101 #define USB_ERROR_FailSetDevTblEntry 0xE2
102 #define USB_ERROR_FailGetConfDescr 0xE3
103 #define USB_ERROR_TRANSFER_TIMEOUT 0xFF
104 
105 #define USB_XFER_TIMEOUT 5000 // (5000) USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec
106 //#define USB_NAK_LIMIT 32000 // NAK limit for a transfer. 0 means NAKs are not counted
107 #define USB_RETRY_LIMIT 3 // 3 retry limit for a transfer
108 #define USB_SETTLE_DELAY 200 // settle delay in milliseconds
109 
110 #define USB_NUMDEVICES 16 //number of USB devices
111 //#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller
112 #define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms
113 
114 /* USB state machine states */
115 #define USB_STATE_MASK 0xf0
116 
117 #define USB_STATE_DETACHED 0x10
118 #define USB_DETACHED_SUBSTATE_INITIALIZE 0x11
119 #define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12
120 #define USB_DETACHED_SUBSTATE_ILLEGAL 0x13
121 #define USB_ATTACHED_SUBSTATE_SETTLE 0x20
122 #define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30
123 #define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40
124 #define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50
125 #define USB_ATTACHED_SUBSTATE_WAIT_RESET 0x51
126 #define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60
127 #define USB_STATE_ADDRESSING 0x70
128 #define USB_STATE_CONFIGURING 0x80
129 #define USB_STATE_RUNNING 0x90
130 #define USB_STATE_ERROR 0xa0
131 
133 public:
134 
135  virtual uint8_t Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) {
136  return 0;
137  }
138 
139  virtual uint8_t ConfigureDevice(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) {
140  return 0;
141  }
142 
143  virtual uint8_t Release() {
144  return 0;
145  }
146 
147  virtual uint8_t Poll() {
148  return 0;
149  }
150 
151  virtual uint8_t GetAddress() {
152  return 0;
153  }
154 
155  virtual void ResetHubPort(uint8_t port __attribute__((unused))) {
156  return;
157  } // Note used for hubs only!
158 
159  virtual bool VIDPIDOK(uint16_t vid __attribute__((unused)), uint16_t pid __attribute__((unused))) {
160  return false;
161  }
162 
163  virtual bool DEVCLASSOK(uint8_t klass __attribute__((unused))) {
164  return false;
165  }
166 
167  virtual bool DEVSUBCLASSOK(uint8_t subklass __attribute__((unused))) {
168  return true;
169  }
170 
171 };
172 
173 /* USB Setup Packet Structure */
174 typedef struct {
175 
176  union { // offset description
177  uint8_t bmRequestType; // 0 Bit-map of request type
178 
179  struct {
180  uint8_t recipient : 5; // Recipient of the request
181  uint8_t type : 2; // Type of request
182  uint8_t direction : 1; // Direction of data X-fer
183  } __attribute__((packed));
184  } ReqType_u;
185  uint8_t bRequest; // 1 Request
186 
187  union {
188  uint16_t wValue; // 2 Depends on bRequest
189 
190  struct {
191  uint8_t wValueLo;
192  uint8_t wValueHi;
193  } __attribute__((packed));
194  } wVal_u;
195  uint16_t wIndex; // 4 Depends on bRequest
196  uint16_t wLength; // 6 Depends on bRequest
197 } __attribute__((packed)) SETUP_PKT, *PSETUP_PKT;
198 
199 
200 
201 // Base class for incoming data parser
202 
204 public:
205  virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) = 0;
206 };
207 
208 class USB : public MAX3421E {
210  USBDeviceConfig* devConfig[USB_NUMDEVICES];
211  uint8_t bmHubPre;
212 
213 public:
214  USB(void);
215 
216  void SetHubPreMask() {
217  bmHubPre |= bmHUBPRE;
218  };
219 
221  bmHubPre &= (~bmHUBPRE);
222  };
223 
225  return (AddressPool&)addrPool;
226  };
227 
229  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
230  if(!devConfig[i]) {
231  devConfig[i] = pdev;
232  return 0;
233  }
234  }
236  };
237 
239  addrPool.ForEachUsbDevice(pfunc);
240  };
241  uint8_t getUsbTaskState(void);
242  void setUsbTaskState(uint8_t state);
243 
244  EpInfo* getEpInfoEntry(uint8_t addr, uint8_t ep);
245  uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr);
246 
247  /* Control requests */
248  uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
249  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr);
250 
251  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p);
252 
253  uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr);
254  uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr);
255  uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value);
256 
257  uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, bool direction);
258  uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit);
259  uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval = 0);
260  uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data);
261  uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit);
262 
263  void Task(void);
264 
265  uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed);
266  uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed);
267  uint8_t ReleaseDevice(uint8_t addr);
268 
269  uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
270  uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p);
271 
272 private:
273  void init();
274  uint8_t SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit);
275  uint8_t OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data);
276  uint8_t InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0);
277  uint8_t AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed);
278 };
279 
280 #if 0 //defined(USB_METHODS_INLINE)
281 //get device descriptor
282 
283 inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
284  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr));
285 }
286 //get configuration descriptor
287 
288 inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
289  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr));
290 }
291 //get string descriptor
292 
293 inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) {
294  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr));
295 }
296 //set address
297 
298 inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
299  return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, NULL));
300 }
301 //set configuration
302 
303 inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
304  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, NULL));
305 }
306 
307 #endif // defined(USB_METHODS_INLINE)
308 
309 #endif /* USBCORE_H */
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:784
+ +
uint16_t wValue
Definition: UsbCore.h:188
+
virtual uint8_t Poll()
Definition: UsbCore.h:147
+
#define bmHUBPRE
Definition: max3421e.h:172
+
virtual uint8_t GetAddress()
Definition: UsbCore.h:151
+
EpInfo * getEpInfoEntry(uint8_t addr, uint8_t ep)
Definition: Usb.cpp:51
+
#define USB_DESCRIPTOR_STRING
Definition: usb_ch9.h:72
+
uint16_t wLength
Definition: UsbCore.h:196
+
virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)=0
+ +
#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:823
+
#define USB_NUMDEVICES
Definition: UsbCore.h:110
+ +
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
+
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:139
+
uint8_t bmRequestType
Definition: UsbCore.h:177
+
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:133
+
#define USB_DESCRIPTOR_CONFIGURATION
Definition: usb_ch9.h:71
+
void ResetHubPreMask()
Definition: UsbCore.h:220
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
USB(void)
Definition: Usb.cpp:32
+
uint16_t wIndex
Definition: UsbCore.h:195
+
void SetHubPreMask()
Definition: UsbCore.h:216
+
Definition: address.h:39
+
void setUsbTaskState(uint8_t state)
Definition: Usb.cpp:47
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
+
#define bmREQ_GET_DESCR
Definition: UsbCore.h:58
+
uint8_t direction
Definition: UsbCore.h:182
+
virtual void ResetHubPort(uint8_t port)
Definition: UsbCore.h:155
+
#define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS
Definition: UsbCore.h:90
+
uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
Definition: Usb.cpp:809
+
uint8_t type
Definition: UsbCore.h:181
+
#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:54
+ + +
uint8_t getUsbTaskState(void)
Definition: Usb.cpp:43
+
void Task(void)
Definition: Usb.cpp:438
+
virtual bool DEVSUBCLASSOK(uint8_t subklass)
Definition: UsbCore.h:167
-
void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
Definition: address.h:192
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:124
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: UsbCore.h:148
-
Definition: UsbCore.h:197
-
uint8_t bRequest
Definition: UsbCore.h:174
-
virtual uint8_t Release()
Definition: UsbCore.h:132
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define bmREQ_SET
Definition: UsbCore.h:48
-
virtual bool DEVCLASSOK(uint8_t klass)
Definition: UsbCore.h:152
-
void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
Definition: UsbCore.h:227
-
#define USB_REQUEST_SET_CONFIGURATION
Definition: usb_ch9.h:40
-
uint8_t wValueHi
Definition: UsbCore.h:181
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
uint8_t wValueLo
Definition: UsbCore.h:180
-
void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
Definition: address.h:90
+
struct SETUP_PKT * PSETUP_PKT
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
Definition: address.h:199
+
uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit)
Definition: Usb.cpp:384
+
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:135
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: UsbCore.h:159
+
uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
Definition: Usb.cpp:666
+
Definition: UsbCore.h:208
+
uint8_t bRequest
Definition: UsbCore.h:185
+
virtual uint8_t Release()
Definition: UsbCore.h:143
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define bmREQ_SET
Definition: UsbCore.h:59
+
virtual bool DEVCLASSOK(uint8_t klass)
Definition: UsbCore.h:163
+
void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
Definition: UsbCore.h:238
+
#define USB_REQUEST_SET_CONFIGURATION
Definition: usb_ch9.h:47
+
uint8_t recipient
Definition: UsbCore.h:180
+
uint8_t wValueHi
Definition: UsbCore.h:192
+
uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed)
Definition: Usb.cpp:544
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
uint8_t wValueLo
Definition: UsbCore.h:191
+
void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
Definition: address.h:97
+
uint8_t ReleaseDevice(uint8_t addr)
Definition: Usb.cpp:764
diff --git a/_wii_8cpp.html b/_wii_8cpp.html index 11db60e2..17830163 100644 --- a/_wii_8cpp.html +++ b/_wii_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Wii.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Variable Documentation

- + +

◆ WII_LEDS

+
@@ -129,11 +111,13 @@ Variables
Initial value:
= {
0x00,
0x10,
0x20,
0x40,
0x80,
0x90,
0xA0,
0xC0,
0xD0,
0xE0,
0xF0,
}
-

Definition at line 25 of file Wii.cpp.

+

Definition at line 25 of file Wii.cpp.

- + +

◆ WII_BUTTONS

+
@@ -143,11 +127,13 @@ Variables
Initial value:
= {
0x00008,
0x00002,
0x00004,
0x00001,
0,
0x00010,
0x00100,
0x00200,
0x01000,
0x08000,
0x10000,
0x20000,
0x00400,
0x00800,
}
-

Definition at line 40 of file Wii.cpp.

+

Definition at line 40 of file Wii.cpp.

- + +

◆ WII_PROCONTROLLER_BUTTONS

+
@@ -157,7 +143,7 @@ Variables
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.

+

Definition at line 59 of file Wii.cpp.

@@ -166,7 +152,7 @@ Variables diff --git a/_wii_8cpp__incl.md5 b/_wii_8cpp__incl.md5 index 90a48635..16fb198e 100644 --- a/_wii_8cpp__incl.md5 +++ b/_wii_8cpp__incl.md5 @@ -1 +1 @@ -38127c822874d8407cb01375c5f2f11b \ No newline at end of file +230d657150b96397e6c72f7fb46df52c \ No newline at end of file diff --git a/_wii_8cpp__incl.png b/_wii_8cpp__incl.png index dd421431705069fd5ad01d15e1fff3520cadc569..bf5f565bc7d1a8406186dcff7400565a2dd3bd8e 100644 GIT binary patch literal 17953 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 literal 19018 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 YKZ`!DK_}G`6aWAK07*qoM6N<$f`|BPNB{r; diff --git a/_wii_8cpp_source.html b/_wii_8cpp_source.html index fd29ecf6..d757b976 100644 --- a/_wii_8cpp_source.html +++ b/_wii_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Wii.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 = millis() + 1000; // We have to wait for the message before the rest of the channels can be deactivated
125  } else
126  timer = 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  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
331  } else
332  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
333  }
334  }
335  else {
336 #ifdef EXTRADEBUG
337  Notify(PSTR("\r\nChecking battery level"), 0x80);
338 #endif
339  checkBatteryLevel = false; // Check for extensions by default
340  }
341 #ifdef DEBUG_USB_HOST
342  if(l2capinbuf[12] & 0x01)
343  Notify(PSTR("\r\nWARNING: Battery is nearly empty"), 0x80);
344 #endif
345 
346  break;
347  case 0x21: // Read Memory Data
348  if((l2capinbuf[12] & 0x0F) == 0) { // No error
349  uint8_t reportLength = (l2capinbuf[12] >> 4) + 1; // // Bit 4-7 is the length - 1
350  // See: http://wiibrew.org/wiki/Wiimote/Extension_Controllers
351  if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x00) {
352 #ifdef DEBUG_USB_HOST
353  Notify(PSTR("\r\nNunchuck connected"), 0x80);
354 #endif
356  } else if(l2capinbuf[16] == 0x00 && (l2capinbuf[17] == 0xA6 || l2capinbuf[17] == 0xA4) && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x05) {
357 #ifdef DEBUG_USB_HOST
358  Notify(PSTR("\r\nMotion Plus connected"), 0x80);
359 #endif
361  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x04 && l2capinbuf[20] == 0x05) {
362 #ifdef DEBUG_USB_HOST
363  Notify(PSTR("\r\nMotion Plus activated in normal mode"), 0x80);
364 #endif
365  motionPlusConnected = true;
366 #ifdef WIICAMERA
367  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
368 #endif
369  setReportMode(false, 0x35); // Also read the extension
370  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x05 && l2capinbuf[20] == 0x05) {
371 #ifdef DEBUG_USB_HOST
372  Notify(PSTR("\r\nMotion Plus activated in Nunchuck pass-through mode"), 0x80);
373 #endif
374  activateNunchuck = false;
375  motionPlusConnected = true;
376  nunchuckConnected = true;
377 #ifdef WIICAMERA
378  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
379 #endif
380  setReportMode(false, 0x35); // Also read the extension
381  } 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) {
382 #ifdef DEBUG_USB_HOST
383  Notify(PSTR("\r\nInactive Wii Motion Plus"), 0x80);
384  Notify(PSTR("\r\nPlease unplug the Motion Plus, disconnect the Wiimote and then replug the Motion Plus Extension"), 0x80);
385 #endif
386  stateCounter = 300; // Skip the rest in "WII_CHECK_MOTION_PLUS_STATE"
387  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x01 && l2capinbuf[20] == 0x20) {
388 #ifdef DEBUG_USB_HOST
389  Notify(PSTR("\r\nWii U Pro Controller connected"), 0x80);
390 #endif
392  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x04 && l2capinbuf[20] == 0x02) {
393 #ifdef DEBUG_USB_HOST
394  Notify(PSTR("\r\nWii Balance Board connected"), 0x80);
395 #endif
396  setReportMode(false, 0x32); // Read the Wii Balance Board extension
398  }
399  // Wii Balance Board calibration reports (24 bits in total)
400  else if(l2capinbuf[13] == 0x00 && l2capinbuf[14] == 0x24 && reportLength == 16) { // First 16-bit
401  for(uint8_t i = 0; i < 2; i++) {
402  for(uint8_t j = 0; j < 4; j++)
403  wiiBalanceBoardCal[i][j] = l2capinbuf[16 + 8 * i + 2 * j] | l2capinbuf[15 + 8 * i + 2 * j] << 8;
404  }
405  } else if(l2capinbuf[13] == 0x00 && l2capinbuf[14] == 0x34 && reportLength == 8) { // Last 8-bit
406  for(uint8_t j = 0; j < 4; j++)
407  wiiBalanceBoardCal[2][j] = l2capinbuf[16 + 2 * j] | l2capinbuf[15 + 2 * j] << 8;
408 #ifdef DEBUG_USB_HOST
409  Notify(PSTR("\r\nWii Balance Board calibration values read successfully"), 0x80);
410 #endif
413  }
414 #ifdef DEBUG_USB_HOST
415  else {
416  Notify(PSTR("\r\nUnknown Device: "), 0x80);
417  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
418  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
419  Notify(PSTR("\r\nData: "), 0x80);
420  for(uint8_t i = 0; i < reportLength; i++) {
421  D_PrintHex<uint8_t > (l2capinbuf[15 + i], 0x80);
422  Notify(PSTR(" "), 0x80);
423  }
424  }
425 #endif
426  }
427 #ifdef EXTRADEBUG
428  else {
429  Notify(PSTR("\r\nReport Error: "), 0x80);
430  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
431  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
432  }
433 #endif
434  break;
435  case 0x22: // Acknowledge output report, return function result
436 #ifdef DEBUG_USB_HOST
437  if(l2capinbuf[13] != 0x00) { // Check if there is an error
438  Notify(PSTR("\r\nCommand failed: "), 0x80);
439  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
440  }
441 #endif
442  break;
443  case 0x30: // Core buttons - (a1) 30 BB BB
444  break;
445  case 0x31: // Core Buttons and Accelerometer - (a1) 31 BB BB AA AA AA
446  break;
447  case 0x32: // Core Buttons with 8 Extension bytes - (a1) 32 BB BB EE EE EE EE EE EE EE EE
448  // See: http://wiibrew.org/wiki/Wii_Balance_Board#Data_Format
449  wiiBalanceBoardRaw[TopRight] = l2capinbuf[13] | l2capinbuf[12] << 8; // Top right
450  wiiBalanceBoardRaw[BotRight] = l2capinbuf[15] | l2capinbuf[14] << 8; // Bottom right
451  wiiBalanceBoardRaw[TopLeft] = l2capinbuf[17] | l2capinbuf[16] << 8; // Top left
452  wiiBalanceBoardRaw[BotLeft] = l2capinbuf[19] | l2capinbuf[18] << 8; // Bottom left
453  break;
454  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
455 #ifdef WIICAMERA
456  // Read the IR data
457  IR_object_x1 = (l2capinbuf[15] | ((uint16_t)(l2capinbuf[17] & 0x30) << 4)); // x position
458  IR_object_y1 = (l2capinbuf[16] | ((uint16_t)(l2capinbuf[17] & 0xC0) << 2)); // y position
459  IR_object_s1 = (l2capinbuf[17] & 0x0F); // Size value, 0-15
460 
461  IR_object_x2 = (l2capinbuf[18] | ((uint16_t)(l2capinbuf[20] & 0x30) << 4));
462  IR_object_y2 = (l2capinbuf[19] | ((uint16_t)(l2capinbuf[20] & 0xC0) << 2));
463  IR_object_s2 = (l2capinbuf[20] & 0x0F);
464 
465  IR_object_x3 = (l2capinbuf[21] | ((uint16_t)(l2capinbuf[23] & 0x30) << 4));
466  IR_object_y3 = (l2capinbuf[22] | ((uint16_t)(l2capinbuf[23] & 0xC0) << 2));
467  IR_object_s3 = (l2capinbuf[23] & 0x0F);
468 
469  IR_object_x4 = (l2capinbuf[24] | ((uint16_t)(l2capinbuf[26] & 0x30) << 4));
470  IR_object_y4 = (l2capinbuf[25] | ((uint16_t)(l2capinbuf[26] & 0xC0) << 2));
471  IR_object_s4 = (l2capinbuf[26] & 0x0F);
472 #endif
473  break;
474  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
475  break;
476  /* 0x3e and 0x3f both give unknown report types when report mode is 0x3e or 0x3f with mode number 0x05 */
477  case 0x3E: // Core Buttons with Accelerometer and 32 IR bytes
478  // (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
479  // corresponds to output report mode 0x3e
480 
481  /**** for reading in full mode: DOES NOT WORK YET ****/
482  /* When it works it will also have intensity and bounding box data */
483  /*
484  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
485  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
486  IR_object_s1 = (l2capinbuf[15] & 0x0F);
487  */
488  break;
489  case 0x3F:
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 0x35: // Core Buttons and Accelerometer with 16 Extension Bytes
497  // (a1) 35 BB BB AA AA AA EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE
498 #if 1 // Set this to 0 if you don't want to use an extension, this reduceds the size of the library a lot!
499  if(motionPlusConnected) {
500  if(l2capinbuf[20] & 0x02) { // Check if it's a report from the Motion controller or the extension
501  if(motionValuesReset) { // We will only use the values when the gyro value has been set
502  gyroYawRaw = ((l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6)) - gyroYawZero);
503  gyroRollRaw = ((l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6)) - gyroRollZero);
504  gyroPitchRaw = ((l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6)) - gyroPitchZero);
505 
506  yawGyroSpeed = (float)gyroYawRaw / ((float)gyroYawZero / yawGyroScale);
507  rollGyroSpeed = -(float)gyroRollRaw / ((float)gyroRollZero / rollGyroScale); // We invert these values so they will fit the acc values
509 
510  /* The onboard gyro has two ranges for slow and fast mode */
511  if(!(l2capinbuf[18] & 0x02)) // Check if fast mode is used
512  yawGyroSpeed *= 4.545;
513  if(!(l2capinbuf[18] & 0x01)) // Check if fast mode is used
514  pitchGyroSpeed *= 4.545;
515  if(!(l2capinbuf[19] & 0x02)) // Check if fast mode is used
516  rollGyroSpeed *= 4.545;
517 
518  compPitch = (0.93f * (compPitch + (pitchGyroSpeed * (float)(micros() - timer) / 1000000.0f)))+(0.07f * getWiimotePitch()); // Use a complimentary filter to calculate the angle
519  compRoll = (0.93f * (compRoll + (rollGyroSpeed * (float)(micros() - timer) / 1000000.0f)))+(0.07f * getWiimoteRoll());
520 
521  gyroYaw += (yawGyroSpeed * ((float)(micros() - timer) / 1000000.0f));
522  gyroRoll += (rollGyroSpeed * ((float)(micros() - timer) / 1000000.0f));
523  gyroPitch += (pitchGyroSpeed * ((float)(micros() - timer) / 1000000.0f));
524  timer = micros();
525  /*
526  // Uncomment these lines to tune the gyro scale variabels
527  Notify(PSTR("\r\ngyroYaw: "), 0x80);
528  Notify(gyroYaw, 0x80);
529  Notify(PSTR("\tgyroRoll: "), 0x80);
530  Notify(gyroRoll, 0x80);
531  Notify(PSTR("\tgyroPitch: "), 0x80);
532  Notify(gyroPitch, 0x80);
533  */
534  /*
535  Notify(PSTR("\twiimoteRoll: "), 0x80);
536  Notify(wiimoteRoll, 0x80);
537  Notify(PSTR("\twiimotePitch: "), 0x80);
538  Notify(wiimotePitch, 0x80);
539  */
540  } else {
541  if((micros() - timer) > 1000000) { // Loop for 1 sec before resetting the values
542 #ifdef DEBUG_USB_HOST
543  Notify(PSTR("\r\nThe gyro values has been reset"), 0x80);
544 #endif
545  gyroYawZero = (l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6));
546  gyroRollZero = (l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6));
547  gyroPitchZero = (l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6));
548 
549  rollGyroScale = 500; // You might need to adjust these
550  pitchGyroScale = 400;
551  yawGyroScale = 415;
552 
553  gyroYaw = 0;
554  gyroRoll = 0;
555  gyroPitch = 0;
556 
557  motionValuesReset = true;
558  timer = micros();
559  }
560  }
561  } else {
562  if(nunchuckConnected) {
563  hatValues[HatX] = l2capinbuf[15];
564  hatValues[HatY] = l2capinbuf[16];
565  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x10 >> 3)) - 416;
566  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x20 >> 4)) - 416;
567  accZnunchuck = (((l2capinbuf[19] & 0xFE) << 2) | (l2capinbuf[20] & 0xC0 >> 5)) - 416;
568  }
569  //else if(classicControllerConnected) { }
570  }
571  if(l2capinbuf[19] & 0x01) {
572  if(!extensionConnected) {
573  extensionConnected = true;
574  unknownExtensionConnected = true;
575 #ifdef DEBUG_USB_HOST
576  Notify(PSTR("\r\nExtension connected to Motion Plus"), 0x80);
577 #endif
578  }
579  } else {
580  if(extensionConnected && !unknownExtensionConnected) {
581  extensionConnected = false;
582  unknownExtensionConnected = true;
583 #ifdef DEBUG_USB_HOST
584  Notify(PSTR("\r\nExtension disconnected from Motion Plus"), 0x80);
585 #endif
586  nunchuckConnected = false; // There is no extension connected to the Motion Plus if this report is sent
587  }
588  }
589 
590  } else if(nunchuckConnected) {
591  hatValues[HatX] = l2capinbuf[15];
592  hatValues[HatY] = l2capinbuf[16];
593  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x0C >> 2)) - 416;
594  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x30 >> 4)) - 416;
595  accZnunchuck = ((l2capinbuf[19] << 2) | (l2capinbuf[20] & 0xC0 >> 6)) - 416;
596  } else if(wiiUProControllerConnected) {
597  hatValues[LeftHatX] = (l2capinbuf[15] | l2capinbuf[16] << 8);
598  hatValues[RightHatX] = (l2capinbuf[17] | l2capinbuf[18] << 8);
599  hatValues[LeftHatY] = (l2capinbuf[19] | l2capinbuf[20] << 8);
600  hatValues[RightHatY] = (l2capinbuf[21] | l2capinbuf[22] << 8);
601  }
602 #endif
603  break;
604 #ifdef DEBUG_USB_HOST
605  default:
606  Notify(PSTR("\r\nUnknown Report type: "), 0x80);
607  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
608  break;
609 #endif
610  }
611  }
612  }
613  L2CAP_task();
614  }
615 }
616 
617 void WII::L2CAP_task() {
618  switch(l2cap_state) {
619  /* These states are used if the Wiimote is the host */
622 #ifdef DEBUG_USB_HOST
623  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
624 #endif
625  l2cap_state = L2CAP_INTERRUPT_SETUP;
626  }
627  break;
628 
631 #ifdef DEBUG_USB_HOST
632  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
633 #endif
634  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, PENDING);
635  delay(1);
636  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, SUCCESSFUL);
637  identifier++;
638  delay(1);
639  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
640 
641  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
642  }
643  break;
644 
645  /* These states are used if the Arduino is the host */
648 #ifdef DEBUG_USB_HOST
649  Notify(PSTR("\r\nSend HID Control Config Request"), 0x80);
650 #endif
651  identifier++;
653  l2cap_state = L2CAP_CONTROL_CONFIG_REQUEST;
654  }
655  break;
656 
659 #ifdef DEBUG_USB_HOST
660  Notify(PSTR("\r\nSend HID Interrupt Connection Request"), 0x80);
661 #endif
662  identifier++;
664  l2cap_state = L2CAP_INTERRUPT_CONNECT_REQUEST;
665  }
666  break;
667 
670 #ifdef DEBUG_USB_HOST
671  Notify(PSTR("\r\nSend HID Interrupt Config Request"), 0x80);
672 #endif
673  identifier++;
674  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
675  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
676  }
677  break;
678 
680  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
681 #ifdef DEBUG_USB_HOST
682  Notify(PSTR("\r\nHID Channels Established"), 0x80);
683 #endif
684  pBtd->connectToWii = false;
685  pBtd->pairWithWii = false;
686  stateCounter = 0;
687  l2cap_state = WII_CHECK_MOTION_PLUS_STATE;
688  }
689  break;
690 
691  /* The next states are in run() */
692 
694  if(l2cap_check_flag(L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE) && ((long)(millis() - timer) >= 0L)) {
695 #ifdef DEBUG_USB_HOST
696  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
697 #endif
698  identifier++;
699  pBtd->l2cap_disconnection_request(hci_handle, identifier, control_scid, control_dcid);
700  l2cap_state = L2CAP_CONTROL_DISCONNECT;
701  }
702  break;
703 
706 #ifdef DEBUG_USB_HOST
707  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
708 #endif
710  hci_handle = -1; // Reset handle
711  l2cap_event_flag = 0; // Reset flags
712  l2cap_state = L2CAP_WAIT;
713  }
714  break;
715  }
716 }
717 
718 void WII::Run() {
719  if(l2cap_state == L2CAP_INTERRUPT_DISCONNECT && ((long)(millis() - timer) >= 0L))
720  L2CAP_task(); // Call the rest of the disconnection routine after we have waited long enough
721 
722  switch(l2cap_state) {
723  case L2CAP_WAIT:
724  if(pBtd->connectToWii && !pBtd->l2capConnectionClaimed && !wiimoteConnected && !activeConnection) {
726  activeConnection = true;
727  motionPlusInside = pBtd->motionPlusInside;
728 #ifdef DEBUG_USB_HOST
729  Notify(PSTR("\r\nSend HID Control Connection Request"), 0x80);
730 #endif
731  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
732  l2cap_event_flag = 0; // Reset flags
733  identifier = 0;
735  l2cap_state = L2CAP_CONTROL_CONNECT_REQUEST;
737 #ifdef DEBUG_USB_HOST
738  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
739 #endif
740  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, PENDING);
741  delay(1);
742  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, SUCCESSFUL);
743  identifier++;
744  delay(1);
746  l2cap_state = L2CAP_CONTROL_SUCCESS;
747  }
748  break;
749 
751 #ifdef DEBUG_USB_HOST
752  if(stateCounter == 0) // Only print onnce
753  Notify(PSTR("\r\nChecking if a Motion Plus is connected"), 0x80);
754 #endif
755  stateCounter++;
756  if(stateCounter % 200 == 0)
757  checkMotionPresent(); // Check if there is a motion plus connected
759  stateCounter = 0;
760  l2cap_state = WII_INIT_MOTION_PLUS_STATE;
761  timer = micros();
762 
763  if(unknownExtensionConnected) {
764 #ifdef DEBUG_USB_HOST
765  Notify(PSTR("\r\nA extension is also connected"), 0x80);
766 #endif
767  activateNunchuck = true; // For we will just set this to true as this the only extension supported so far
768  }
769 
770  } else if(stateCounter == 601) { // We will try three times to check for the motion plus
771 #ifdef DEBUG_USB_HOST
772  Notify(PSTR("\r\nNo Motion Plus was detected"), 0x80);
773 #endif
774  stateCounter = 0;
775  l2cap_state = WII_CHECK_EXTENSION_STATE;
776  }
777  break;
778 
779  case WII_CHECK_EXTENSION_STATE: // This is used to check if there is anything plugged in to the extension port
780 #ifdef DEBUG_USB_HOST
781  if(stateCounter == 0) // Only print onnce
782  Notify(PSTR("\r\nChecking if there is any extension connected"), 0x80);
783 #endif
784  stateCounter++; // We use this counter as there has to be a short delay between the commands
785  if(stateCounter == 1)
786  statusRequest(); // See if a new device has connected
787  if(stateCounter == 100) {
788  if(unknownExtensionConnected) // Check if there is a extension is connected to the port
789  initExtension1();
790  else
791  stateCounter = 499;
792  } else if(stateCounter == 200)
793  initExtension2();
794  else if(stateCounter == 300) {
795  readExtensionType();
796  unknownExtensionConnected = false;
797  } else if(stateCounter == 400) {
799 #ifdef DEBUG_USB_HOST
800  Notify(PSTR("\r\nReading Wii Balance Board calibration values"), 0x80);
801 #endif
802  readWiiBalanceBoardCalibration();
803  } else
804  stateCounter = 499;
805  } else if(stateCounter == 500) {
806  stateCounter = 0;
807  l2cap_state = TURN_ON_LED;
808  }
809  break;
810 
812  stateCounter++;
813  if(stateCounter == 1)
814  initMotionPlus();
815  else if(stateCounter == 100)
816  activateMotionPlus();
817  else if(stateCounter == 200)
818  readExtensionType(); // Check if it has been activated
819  else if(stateCounter == 300) {
820  stateCounter = 0;
821  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
822  l2cap_state = TURN_ON_LED;
823  }
824  break;
825 
826  case TURN_ON_LED:
828  nunchuckConnected = true;
829  wiimoteConnected = true;
830  onInit();
831  l2cap_state = L2CAP_DONE;
832  break;
833 
834  case L2CAP_DONE:
835  if(unknownExtensionConnected) {
836 #ifdef DEBUG_USB_HOST
837  if(stateCounter == 0) // Only print once
838  Notify(PSTR("\r\nChecking extension port"), 0x80);
839 #endif
840  stateCounter++; // We will use this counter as there has to be a short delay between the commands
841  if(stateCounter == 50)
842  statusRequest();
843  else if(stateCounter == 100)
844  initExtension1();
845  else if(stateCounter == 150)
846  if((extensionConnected && motionPlusConnected) || (unknownExtensionConnected && !motionPlusConnected))
847  initExtension2();
848  else
849  stateCounter = 299; // There is no extension connected
850  else if(stateCounter == 200)
851  readExtensionType();
852  else if(stateCounter == 250) {
854 #ifdef DEBUG_USB_HOST
855  Notify(PSTR("\r\nNunchuck was reconnected"), 0x80);
856 #endif
857  activateNunchuck = true;
858  nunchuckConnected = true;
859  }
861  stateCounter = 449;
862  } else if(stateCounter == 300) {
863  if(motionPlusConnected) {
864 #ifdef DEBUG_USB_HOST
865  Notify(PSTR("\r\nReactivating the Motion Plus"), 0x80);
866 #endif
867  initMotionPlus();
868  } else
869  stateCounter = 449;
870  } else if(stateCounter == 350)
871  activateMotionPlus();
872  else if(stateCounter == 400)
873  readExtensionType(); // Check if it has been activated
874  else if(stateCounter == 450) {
875  onInit();
876  stateCounter = 0;
877  unknownExtensionConnected = false;
878  }
879  } else
880  stateCounter = 0;
881  break;
882  }
883 }
884 
885 /************************************************************/
886 /* HID Commands */
887 /************************************************************/
888 
889 void WII::HID_Command(uint8_t* data, uint8_t nbytes) {
890  if(motionPlusInside)
891  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
892  else
893  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]);
894 }
895 
897  HIDBuffer[1] = 0x11;
898  HIDBuffer[2] = 0x00;
899  HID_Command(HIDBuffer, 3);
900 }
901 
903  HIDBuffer[1] = 0x11;
904  HIDBuffer[2] &= ~0x01; // Bit 0 control the rumble
905  HID_Command(HIDBuffer, 3);
906 }
907 
909  HIDBuffer[1] = 0x11;
910  HIDBuffer[2] |= 0x01; // Bit 0 control the rumble
911  HID_Command(HIDBuffer, 3);
912 }
913 
915  HIDBuffer[1] = 0x11;
916  HIDBuffer[2] ^= 0x01; // Bit 0 control the rumble
917  HID_Command(HIDBuffer, 3);
918 }
919 
920 void WII::setLedRaw(uint8_t value) {
921  HIDBuffer[1] = 0x11;
922  HIDBuffer[2] = value | (HIDBuffer[2] & 0x01); // Keep the rumble bit
923  HID_Command(HIDBuffer, 3);
924 }
925 
927  HIDBuffer[1] = 0x11;
928  HIDBuffer[2] &= ~(pgm_read_byte(&WII_LEDS[(uint8_t)a]));
929  HID_Command(HIDBuffer, 3);
930 }
931 
933  if(a == OFF)
934  setLedRaw(0);
935  else {
936  HIDBuffer[1] = 0x11;
937  HIDBuffer[2] |= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
938  HID_Command(HIDBuffer, 3);
939  }
940 }
941 
943  HIDBuffer[1] = 0x11;
944  HIDBuffer[2] ^= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
945  HID_Command(HIDBuffer, 3);
946 }
947 
949  HIDBuffer[1] = 0x11;
950  HIDBuffer[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
951  if(wiimoteConnected)
952  HIDBuffer[2] |= 0x10; // If it's connected LED1 will light up
954  HIDBuffer[2] |= 0x20; // If it's connected LED2 will light up
956  HIDBuffer[2] |= 0x40; // If it's connected LED3 will light up
957 
958  HID_Command(HIDBuffer, 3);
959 }
960 
962  checkBatteryLevel = true; // This is needed so the library knows that the status response is a response to this function
963  statusRequest(); // This will update the battery level
964  return batteryLevel;
965 };
966 
967 void WII::setReportMode(bool continuous, uint8_t mode) {
968  uint8_t cmd_buf[4];
969  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
970  cmd_buf[1] = 0x12;
971  if(continuous)
972  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
973  else
974  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
975  cmd_buf[3] = mode;
976  HID_Command(cmd_buf, 4);
977 }
978 
979 void WII::statusRequest() {
980  uint8_t cmd_buf[3];
981  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
982  cmd_buf[1] = 0x15;
983  cmd_buf[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
984  HID_Command(cmd_buf, 3);
985 }
986 
987 /************************************************************/
988 /* Memmory Commands */
989 /************************************************************/
990 
991 void WII::writeData(uint32_t offset, uint8_t size, uint8_t* data) {
992  uint8_t cmd_buf[23];
993  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
994  cmd_buf[1] = 0x16; // Write data
995  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Write to memory, clear bit 2 to write to EEPROM
996  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
997  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
998  cmd_buf[5] = (uint8_t)(offset & 0xFF);
999  cmd_buf[6] = size;
1000  uint8_t i = 0;
1001  for(; i < size; i++)
1002  cmd_buf[7 + i] = data[i];
1003  for(; i < 16; i++) // Set the rest to zero
1004  cmd_buf[7 + i] = 0x00;
1005  HID_Command(cmd_buf, 23);
1006 }
1007 
1008 void WII::initExtension1() {
1009  uint8_t buf[1];
1010  buf[0] = 0x55;
1011  writeData(0xA400F0, 1, buf);
1012 }
1013 
1014 void WII::initExtension2() {
1015  uint8_t buf[1];
1016  buf[0] = 0x00;
1017  writeData(0xA400FB, 1, buf);
1018 }
1019 
1020 void WII::initMotionPlus() {
1021  uint8_t buf[1];
1022  buf[0] = 0x55;
1023  writeData(0xA600F0, 1, buf);
1024 }
1025 
1026 void WII::activateMotionPlus() {
1027  uint8_t buf[1];
1028  if(pBtd->wiiUProController) {
1029 #ifdef DEBUG_USB_HOST
1030  Notify(PSTR("\r\nActivating Wii U Pro Controller"), 0x80);
1031 #endif
1032  buf[0] = 0x00; // It seems like you can send anything but 0x04, 0x05, and 0x07
1033  } else if(activateNunchuck) {
1034 #ifdef DEBUG_USB_HOST
1035  Notify(PSTR("\r\nActivating Motion Plus in pass-through mode"), 0x80);
1036 #endif
1037  buf[0] = 0x05; // Activate nunchuck pass-through mode
1038  }//else if(classicControllerConnected && extensionConnected)
1039  //buf[0] = 0x07;
1040  else {
1041 #ifdef DEBUG_USB_HOST
1042  Notify(PSTR("\r\nActivating Motion Plus in normal mode"), 0x80);
1043 #endif
1044  buf[0] = 0x04; // Don't use any extension
1045  }
1046  writeData(0xA600FE, 1, buf);
1047 }
1048 
1049 void WII::readData(uint32_t offset, uint16_t size, bool EEPROM) {
1050  uint8_t cmd_buf[8];
1051  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
1052  cmd_buf[1] = 0x17; // Read data
1053  if(EEPROM)
1054  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Read from EEPROM
1055  else
1056  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Read from memory
1057  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
1058  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
1059  cmd_buf[5] = (uint8_t)(offset & 0xFF);
1060  cmd_buf[6] = (uint8_t)((size & 0xFF00) >> 8);
1061  cmd_buf[7] = (uint8_t)(size & 0xFF);
1062 
1063  HID_Command(cmd_buf, 8);
1064 }
1065 
1066 void WII::readExtensionType() {
1067  readData(0xA400FA, 6, false);
1068 }
1069 
1070 void WII::readCalData() {
1071  readData(0x0016, 8, true);
1072 }
1073 
1074 void WII::checkMotionPresent() {
1075  readData(0xA600FA, 6, false);
1076 }
1077 
1078 void WII::readWiiBalanceBoardCalibration() {
1079  readData(0xA40024, 24, false);
1080 }
1081 
1082 /************************************************************/
1083 /* WII Commands */
1084 /************************************************************/
1085 
1086 bool WII::getButtonPress(ButtonEnum b) { // Return true when a button is pressed
1088  return (ButtonState & pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]));
1089  else
1090  return (ButtonState & pgm_read_dword(&WII_BUTTONS[(uint8_t)b]));
1091 }
1092 
1093 bool WII::getButtonClick(ButtonEnum b) { // Only return true when a button is clicked
1094  uint32_t button;
1096  button = pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]);
1097  else
1098  button = pgm_read_dword(&WII_BUTTONS[(uint8_t)b]);
1099  bool click = (ButtonClickState & button);
1100  ButtonClickState &= ~button; // clear "click" event
1101  return click;
1102 }
1103 
1105  if(!nunchuckConnected)
1106  return 127; // Return center position
1107  else {
1108  uint8_t output = hatValues[(uint8_t)a];
1109  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
1110  return 127;
1111  else
1112  return output;
1113  }
1114 }
1115 
1118  return 2000;
1119  else {
1120  uint16_t output = hatValues[(uint8_t)a];
1121  if(output == 0x00) // The joystick will only read 0 when it is first initializing, so we will just return the center position
1122  return 2000;
1123  else
1124  return output;
1125  }
1126 }
1127 
1128 void WII::onInit() {
1129  if(pFuncOnInit)
1130  pFuncOnInit(); // Call the user function
1131  else
1132  setLedStatus();
1133 }
1134 
1135 /************************************************************/
1136 /* Wii Balance Board Commands */
1137 /************************************************************/
1138 
1140  // Use interpolating between two points - based on: https://github.com/skorokithakis/gr8w8upd8m8/blob/master/gr8w8upd8m8.py
1141  // wiiBalanceBoardCal[pos][0] is calibration values for 0 kg
1142  // wiiBalanceBoardCal[pos][1] is calibration values for 17 kg
1143  // wiiBalanceBoardCal[pos][2] is calibration values for 34 kg
1144  if(wiiBalanceBoardRaw[pos] < wiiBalanceBoardCal[0][pos])
1145  return 0.0f; // Below 0 kg
1146  else if(wiiBalanceBoardRaw[pos] < wiiBalanceBoardCal[1][pos]) // Between 0 and 17 kg
1147  return 17.0f * (float)(wiiBalanceBoardRaw[pos] - wiiBalanceBoardCal[0][pos]) / (float)(wiiBalanceBoardCal[1][pos] - wiiBalanceBoardCal[0][pos]);
1148  else // More than 17 kg
1149  return 17.0f + 17.0f * (float)(wiiBalanceBoardRaw[pos] - wiiBalanceBoardCal[1][pos]) / (float)(wiiBalanceBoardCal[2][pos] - wiiBalanceBoardCal[1][pos]);
1150 };
1151 
1154 };
1155 
1156 /************************************************************/
1157 /* The following functions are for the IR camera */
1158 /************************************************************/
1159 
1160 #ifdef WIICAMERA
1161 
1162 void WII::IRinitialize() { // Turns on and initialises the IR camera
1163 
1164  enableIRCamera1();
1165 #ifdef DEBUG_USB_HOST
1166  Notify(PSTR("\r\nEnable IR Camera1 Complete"), 0x80);
1167 #endif
1168  delay(80);
1169 
1170  enableIRCamera2();
1171 #ifdef DEBUG_USB_HOST
1172  Notify(PSTR("\r\nEnable IR Camera2 Complete"), 0x80);
1173 #endif
1174  delay(80);
1175 
1176  write0x08Value();
1177 #ifdef DEBUG_USB_HOST
1178  Notify(PSTR("\r\nWrote hex number 0x08"), 0x80);
1179 #endif
1180  delay(80);
1181 
1182  writeSensitivityBlock1();
1183 #ifdef DEBUG_USB_HOST
1184  Notify(PSTR("\r\nWrote Sensitivity Block 1"), 0x80);
1185 #endif
1186  delay(80);
1187 
1188  writeSensitivityBlock2();
1189 #ifdef DEBUG_USB_HOST
1190  Notify(PSTR("\r\nWrote Sensitivity Block 2"), 0x80);
1191 #endif
1192  delay(80);
1193 
1194  uint8_t mode_num = 0x03;
1195  setWiiModeNumber(mode_num); // Change input for whatever mode you want i.e. 0x01, 0x03, or 0x05
1196 #ifdef DEBUG_USB_HOST
1197  Notify(PSTR("\r\nSet Wii Mode Number To 0x"), 0x80);
1198  D_PrintHex<uint8_t > (mode_num, 0x80);
1199 #endif
1200  delay(80);
1201 
1202  write0x08Value();
1203 #ifdef DEBUG_USB_HOST
1204  Notify(PSTR("\r\nWrote Hex Number 0x08"), 0x80);
1205 #endif
1206  delay(80);
1207 
1208  setReportMode(false, 0x33);
1209  //setReportMode(false, 0x3f); // For full reporting mode, doesn't work yet
1210 #ifdef DEBUG_USB_HOST
1211  Notify(PSTR("\r\nSet Report Mode to 0x33"), 0x80);
1212 #endif
1213  delay(80);
1214 
1215  statusRequest(); // Used to update wiiState - call isIRCameraEnabled() afterwards to check if it actually worked
1216 #ifdef DEBUG_USB_HOST
1217  Notify(PSTR("\r\nIR Initialized"), 0x80);
1218 #endif
1219 }
1220 
1221 void WII::enableIRCamera1() {
1222  uint8_t cmd_buf[3];
1223  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
1224  cmd_buf[1] = 0x13; // Output report 13
1225  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
1226  HID_Command(cmd_buf, 3);
1227 }
1228 
1229 void WII::enableIRCamera2() {
1230  uint8_t cmd_buf[3];
1231  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
1232  cmd_buf[1] = 0x1A; // Output report 1A
1233  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
1234  HID_Command(cmd_buf, 3);
1235 }
1236 
1237 void WII::writeSensitivityBlock1() {
1238  uint8_t buf[9];
1239  buf[0] = 0x00;
1240  buf[1] = 0x00;
1241  buf[2] = 0x00;
1242  buf[3] = 0x00;
1243  buf[4] = 0x00;
1244  buf[5] = 0x00;
1245  buf[6] = 0x90;
1246  buf[7] = 0x00;
1247  buf[8] = 0x41;
1248 
1249  writeData(0xB00000, 9, buf);
1250 }
1251 
1252 void WII::writeSensitivityBlock2() {
1253  uint8_t buf[2];
1254  buf[0] = 0x40;
1255  buf[1] = 0x00;
1256 
1257  writeData(0xB0001A, 2, buf);
1258 }
1259 
1260 void WII::write0x08Value() {
1261  uint8_t cmd = 0x08;
1262  writeData(0xb00030, 1, &cmd);
1263 }
1264 
1265 void WII::setWiiModeNumber(uint8_t mode_number) { // mode_number in hex i.e. 0x03 for extended mode
1266  writeData(0xb00033, 1, &mode_number);
1267 }
1268 #endif
bool wiimoteConnected
Definition: Wii.h:191
-
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
Definition: BTD.h:137
-
bool incomingWii
Definition: BTD.h:471
-
void onInit()
Definition: Wii.cpp:1128
- +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
+
bool incomingWii
Definition: BTD.h:474
+
void onInit()
Definition: Wii.cpp:1139
+
int16_t gyroPitchRaw
Definition: Wii.h:265
-
#define pgm_read_dword(addr)
+
#define pgm_read_dword(addr)
#define wii_clear_flag(flag)
Definition: Wii.h:33
-
#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS
Definition: BTD.h:141
-
#define L2CAP_INTERRUPT_CONFIG_REQUEST
Definition: BTD.h:113
-
#define L2CAP_INTERRUPT_SETUP
Definition: BTD.h:111
+
#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
uint16_t rollGyroScale
Definition: Wii.h:257
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1262
-
#define SUCCESSFUL
Definition: BTD.h:175
-
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1249
-
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
Definition: BTD.h:140
-
void setLedToggle(LEDEnum a)
Definition: Wii.cpp:942
-
void setLedRaw(uint8_t value)
Definition: Wii.cpp:920
-
uint8_t getAnalogHat(HatEnum a)
Definition: Wii.cpp:1104
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1260
+
#define SUCCESSFUL
Definition: BTD.h:178
+
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1247
+
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
Definition: BTD.h:143
+
void setLedToggle(LEDEnum a)
Definition: Wii.cpp:949
+
void setLedRaw(uint8_t value)
Definition: Wii.cpp:927
+
uint8_t getAnalogHat(HatEnum a)
Definition: Wii.cpp:1115
uint16_t yawGyroScale
Definition: Wii.h:258
Definition: Wii.h:40
-
Definition: BTD.h:198
+
Definition: BTD.h:201
#define WII_FLAG_NUNCHUCK_CONNECTED
Definition: Wii.h:28
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1315
+
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1313
void ACLData(uint8_t *ACLData)
Definition: Wii.cpp:133
-
bool pairWithWii
Definition: BTD.h:473
-
uint8_t identifier
Definition: BTD.h:617
+
bool pairWithWii
Definition: BTD.h:476
+
uint8_t identifier
Definition: BTD.h:621
float pitchGyroSpeed
Definition: Wii.h:249
-
void setRumbleOn()
Definition: Wii.cpp:908
+
void setRumbleOn()
Definition: Wii.cpp:915
void Reset()
Definition: Wii.cpp:101
-
AnalogHatEnum
-
#define TURN_ON_LED
Definition: BTD.h:127
+
AnalogHatEnum
+
#define TURN_ON_LED
Definition: BTD.h:130
int16_t accZnunchuck
Definition: Wii.h:236
Definition: Wii.h:48
-
uint8_t getBatteryLevel()
Definition: Wii.cpp:961
+
uint8_t getBatteryLevel()
Definition: Wii.cpp:968
void disconnect()
Definition: Wii.cpp:116
-
bool motionPlusInside
Definition: BTD.h:475
-
#define L2CAP_DONE
Definition: BTD.h:102
+
bool motionPlusInside
Definition: BTD.h:478
+
#define L2CAP_DONE
Definition: BTD.h:105
#define wii_set_flag(flag)
Definition: Wii.h:32
-
#define L2CAP_CONTROL_SUCCESS
Definition: BTD.h:107
-
#define L2CAP_WAIT
Definition: BTD.h:101
+
#define L2CAP_CONTROL_SUCCESS
Definition: BTD.h:110
+
#define L2CAP_WAIT
Definition: BTD.h:104
Definition: Wii.h:47
int16_t accXnunchuck
Definition: Wii.h:236
-
#define pgm_read_byte(addr)
-
#define L2CAP_CONTROL_CONFIG_REQUEST
Definition: BTD.h:106
+
#define pgm_read_byte(addr)
+
#define L2CAP_CONTROL_CONFIG_REQUEST
Definition: BTD.h:109
int16_t gyroRollRaw
Definition: Wii.h:264
-
LEDEnum
+
LEDEnum
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1328
-
void IRinitialize()
Definition: Wii.cpp:1162
+
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1326
+
void IRinitialize()
Definition: Wii.cpp:1173
Definition: Wii.h:38
-
#define Notify(...)
Definition: message.h:44
-
void setRumbleToggle()
Definition: Wii.cpp:914
+
#define Notify(...)
Definition: message.h:51
+
void setRumbleToggle()
Definition: Wii.cpp:921
int16_t gyroPitchZero
Definition: Wii.h:272
uint16_t pitchGyroScale
Definition: Wii.h:256
-
#define L2CAP_CONTROL_CONNECT_REQUEST
Definition: BTD.h:105
-
#define HID_CTRL_PSM
Definition: BTD.h:180
+
#define L2CAP_CONTROL_CONNECT_REQUEST
Definition: BTD.h:108
+
#define HID_CTRL_PSM
Definition: BTD.h:183
WII(BTD *p, bool pair=false)
Definition: Wii.cpp:85
-
#define WII_CHECK_EXTENSION_STATE
Definition: BTD.h:130
- +
#define WII_CHECK_EXTENSION_STATE
Definition: BTD.h:133
+
float rollGyroSpeed
Definition: Wii.h:250
-
bool connectToWii
Definition: BTD.h:467
-
bool wiiUProController
Definition: BTD.h:477
-
uint16_t hci_handle
Definition: BTD.h:451
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1173
- -
void setLedStatus()
Definition: Wii.cpp:948
-
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
Definition: BTD.h:143
+
bool connectToWii
Definition: BTD.h:470
+
bool wiiUProController
Definition: BTD.h:480
+
uint16_t hci_handle
Definition: BTD.h:454
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1171
+ +
void setLedStatus()
Definition: Wii.cpp:955
+
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
Definition: BTD.h:146
BalanceBoardEnum
Definition: Wii.h:44
#define WII_FLAG_MOTION_PLUS_CONNECTED
Definition: Wii.h:27
const uint8_t WII_LEDS[]
Definition: Wii.cpp:25
-
ButtonEnum
-
bool getButtonClick(ButtonEnum b)
Definition: Wii.cpp:1093
+
ButtonEnum
+
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:605
- +
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:158
-
void setRumbleOff()
Definition: Wii.cpp:902
+
#define l2cap_check_flag(flag)
Definition: BTD.h:161
+
void setRumbleOff()
Definition: Wii.cpp:909
bool wiiBalanceBoardConnected
Definition: Wii.h:204
-
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:166
-
#define L2CAP_FLAG_CONTROL_CONNECTED
Definition: BTD.h:136
-
#define PSTR(str)
-
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:168
+
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:169
+
#define L2CAP_FLAG_CONTROL_CONNECTED
Definition: BTD.h:139
+
#define PSTR(str)
+
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:171
float gyroRoll
Definition: Wii.h:243
-
void setAllOff()
Definition: Wii.cpp:896
-
#define L2CAP_CONTROL_DISCONNECT
Definition: BTD.h:108
+
void setAllOff()
Definition: Wii.cpp:903
+
#define L2CAP_CONTROL_DISCONNECT
Definition: BTD.h:111
const uint32_t WII_BUTTONS[]
Definition: Wii.cpp:40
-
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
Definition: BTD.h:134
+
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
Definition: BTD.h:137
void setLedOff()
Definition: Wii.h:152
float getWiimoteRoll()
Definition: Wii.h:216
-
#define WII_CHECK_MOTION_PLUS_STATE
Definition: BTD.h:129
-
BTD * pBtd
Definition: BTD.h:608
-
#define HID_INTR_PSM
Definition: BTD.h:181
+
#define WII_CHECK_MOTION_PLUS_STATE
Definition: BTD.h:132
+
BTD * pBtd
Definition: BTD.h:612
+
#define HID_INTR_PSM
Definition: BTD.h:184
bool nunchuckConnected
Definition: Wii.h:198
- -
bool l2capConnectionClaimed
Definition: BTD.h:437
+ +
bool l2capConnectionClaimed
Definition: BTD.h:440
float gyroPitch
Definition: Wii.h:241
Definition: Wii.h:45
int16_t gyroYawRaw
Definition: Wii.h:263
@@ -195,48 +175,48 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
bool isIRCameraEnabled()
Definition: Wii.h:408
const uint32_t WII_PROCONTROLLER_BUTTONS[]
Definition: Wii.cpp:59
float yawGyroSpeed
Definition: Wii.h:251
-
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:169
-
#define L2CAP_CMD_CONNECTION_RESPONSE
Definition: BTD.h:165
-
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:167
+
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:172
+
#define L2CAP_CMD_CONNECTION_RESPONSE
Definition: BTD.h:168
+
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:170
void pair(void)
Definition: Wii.h:89
-
uint16_t hci_handle
Definition: BTD.h:611
-
void setLedOn(LEDEnum a)
Definition: Wii.cpp:932
+
uint16_t hci_handle
Definition: BTD.h:615
+
void setLedOn(LEDEnum a)
Definition: Wii.cpp:939
HatEnum
Definition: Wii.h:36
int16_t accYnunchuck
Definition: Wii.h:236
int16_t gyroYawZero
Definition: Wii.h:270
-
uint32_t l2cap_event_flag
Definition: BTD.h:614
+
uint32_t l2cap_event_flag
Definition: BTD.h:618
#define wii_check_flag(flag)
Definition: Wii.h:31
Definition: Wii.h:46
-
#define WII_INIT_MOTION_PLUS_STATE
Definition: BTD.h:131
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1221
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1296
-
#define PENDING
Definition: BTD.h:174
-
#define L2CAP_FLAG_INTERRUPT_CONNECTED
Definition: BTD.h:142
-
#define l2cap_set_flag(flag)
Definition: BTD.h:159
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1279
- -
bool getButtonPress(ButtonEnum b)
Definition: Wii.cpp:1086
-
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
Definition: BTD.h:135
- -
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:164
+
#define WII_INIT_MOTION_PLUS_STATE
Definition: BTD.h:134
+
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1219
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1294
+
#define PENDING
Definition: BTD.h:177
+
#define L2CAP_FLAG_INTERRUPT_CONNECTED
Definition: BTD.h:145
+
#define l2cap_set_flag(flag)
Definition: BTD.h:162
+
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1277
+ +
bool getButtonPress(ButtonEnum b)
Definition: Wii.cpp:1097
+
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
Definition: BTD.h:138
+ +
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:167
float getWiimotePitch()
Definition: Wii.h:212
bool motionPlusConnected
Definition: Wii.h:200
int16_t gyroRollZero
Definition: Wii.h:271
-
float getTotalWeight()
Definition: Wii.cpp:1152
-
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:600
-
#define L2CAP_INTERRUPT_CONNECT_REQUEST
Definition: BTD.h:112
-
void Run()
Definition: Wii.cpp:718
-
#define L2CAP_INTERRUPT_DISCONNECT
Definition: BTD.h:114
+
float getTotalWeight()
Definition: Wii.cpp:1163
+
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:604
+
#define L2CAP_INTERRUPT_CONNECT_REQUEST
Definition: BTD.h:115
+
void Run()
Definition: Wii.cpp:725
+
#define L2CAP_INTERRUPT_DISCONNECT
Definition: BTD.h:117
int16_t accXwiimote
Definition: Wii.h:230
-
float getWeight(BalanceBoardEnum pos)
Definition: Wii.cpp:1139
+
float getWeight(BalanceBoardEnum pos)
Definition: Wii.cpp:1150
int16_t accZwiimote
Definition: Wii.h:230
-
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:163
+
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:166
diff --git a/_wii_8h.html b/_wii_8h.html index b1ea30d6..7d33fab2 100644 --- a/_wii_8h.html +++ b/_wii_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Wii.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ WII_FLAG_MOTION_PLUS_CONNECTED

+
@@ -163,11 +145,13 @@ Enumerations
-

Definition at line 27 of file Wii.h.

+

Definition at line 27 of file Wii.h.

- + +

◆ WII_FLAG_NUNCHUCK_CONNECTED

+
@@ -177,11 +161,13 @@ Enumerations
-

Definition at line 28 of file Wii.h.

+

Definition at line 28 of file Wii.h.

- + +

◆ WII_FLAG_CALIBRATE_BALANCE_BOARD

+
@@ -191,11 +177,13 @@ Enumerations
-

Definition at line 29 of file Wii.h.

+

Definition at line 29 of file Wii.h.

- + +

◆ wii_check_flag

+
@@ -209,11 +197,13 @@ Enumerations
-

Definition at line 31 of file Wii.h.

+

Definition at line 31 of file Wii.h.

- + +

◆ wii_set_flag

+
@@ -227,11 +217,13 @@ Enumerations
-

Definition at line 32 of file Wii.h.

+

Definition at line 32 of file Wii.h.

- + +

◆ wii_clear_flag

+
@@ -245,12 +237,14 @@ Enumerations
-

Definition at line 33 of file Wii.h.

+

Definition at line 33 of file Wii.h.

Enumeration Type Documentation

- + +

◆ HatEnum

+
@@ -261,19 +255,19 @@ Enumerations

Enum used to read the joystick on the Nunchuck.

- -
Enumerator
HatX  -

Read the x-axis on the Nunchuck joystick.

+
Enumerator
HatX 

Read the x-axis on the Nunchuck joystick.

HatY  -

Read the y-axis on the Nunchuck joystick.

+
HatY 

Read the y-axis on the Nunchuck joystick.

-

Definition at line 36 of file Wii.h.

+

Definition at line 36 of file Wii.h.

- + +

◆ BalanceBoardEnum

+
@@ -284,17 +278,13 @@ Enumerations

Enum used to read the weight on Wii Balance Board.

- - - - + + + +
Enumerator
TopRight  -
BotRight  -
TopLeft  -
BotLeft  -
Enumerator
TopRight 
BotRight 
TopLeft 
BotLeft 
-

Definition at line 44 of file Wii.h.

+

Definition at line 44 of file Wii.h.

@@ -303,7 +293,7 @@ Enumerations diff --git a/_wii_8h__dep__incl.md5 b/_wii_8h__dep__incl.md5 index 141f0cf4..0f042ba6 100644 --- a/_wii_8h__dep__incl.md5 +++ b/_wii_8h__dep__incl.md5 @@ -1 +1 @@ -68e486939ecaf1de2be16bf264fe38d3 \ No newline at end of file +cd6696ab2d85cd1fa739c986e5b9679c \ No newline at end of file diff --git a/_wii_8h__dep__incl.png b/_wii_8h__dep__incl.png index f66dbfa2b2074ffc0c513c1dc15cbf1c28046e5d..b6f6e0ba7ffa410b3c52ef13e10dd9f9a80e23f8 100644 GIT binary patch literal 2493 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 TD$tYnj{&SKu9#P&aq<5F@!Y|v literal 2498 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 - + + USB Host Shield 2.0: Wii.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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:1128
+
void onInit()
Definition: Wii.cpp:1139
int16_t gyroPitchRaw
Definition: Wii.h:265
uint16_t rollGyroScale
Definition: Wii.h:257
-
void setLedToggle(LEDEnum a)
Definition: Wii.cpp:942
-
void setLedRaw(uint8_t value)
Definition: Wii.cpp:920
-
uint8_t getAnalogHat(HatEnum a)
Definition: Wii.cpp:1104
+
void setLedToggle(LEDEnum a)
Definition: Wii.cpp:949
+
void setLedRaw(uint8_t value)
Definition: Wii.cpp:927
+
uint8_t getAnalogHat(HatEnum a)
Definition: Wii.cpp:1115
uint16_t yawGyroScale
Definition: Wii.h:258
Definition: Wii.h:40
-
Definition: BTD.h:198
+
Definition: BTD.h:201
uint8_t getIRs1()
Definition: Wii.h:327
uint8_t getIRs3()
Definition: Wii.h:375
void ACLData(uint8_t *ACLData)
Definition: Wii.cpp:133
uint16_t getIRx4()
Definition: Wii.h:383
float pitchGyroSpeed
Definition: Wii.h:249
-
void setRumbleOn()
Definition: Wii.cpp:908
+
void setRumbleOn()
Definition: Wii.cpp:915
void Reset()
Definition: Wii.cpp:101
-
AnalogHatEnum
+
AnalogHatEnum
int16_t accZnunchuck
Definition: Wii.h:236
Definition: Wii.h:48
-
uint8_t getBatteryLevel()
Definition: Wii.cpp:961
+
uint8_t getBatteryLevel()
Definition: Wii.cpp:968
void disconnect()
Definition: Wii.cpp:116
Definition: Wii.h:47
int16_t accXnunchuck
Definition: Wii.h:236
uint8_t getWiiState()
Definition: Wii.h:189
uint16_t getIRy2()
Definition: Wii.h:343
int16_t gyroRollRaw
Definition: Wii.h:264
-
LEDEnum
-
void IRinitialize()
Definition: Wii.cpp:1162
+
LEDEnum
+
void IRinitialize()
Definition: Wii.cpp:1173
Definition: Wii.h:38
uint16_t getIRx2()
Definition: Wii.h:335
uint16_t getIRx1()
Definition: Wii.h:311
-
void setRumbleToggle()
Definition: Wii.cpp:914
+
void setRumbleToggle()
Definition: Wii.cpp:921
int16_t gyroPitchZero
Definition: Wii.h:272
uint16_t pitchGyroScale
Definition: Wii.h:256
float getPitch()
Definition: Wii.h:110
@@ -132,23 +112,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
uint8_t getIRs4()
Definition: Wii.h:399
float rollGyroSpeed
Definition: Wii.h:250
uint16_t getIRy3()
Definition: Wii.h:367
- -
void setLedStatus()
Definition: Wii.cpp:948
+ +
void setLedStatus()
Definition: Wii.cpp:955
BalanceBoardEnum
Definition: Wii.h:44
-
ButtonEnum
-
bool getButtonClick(ButtonEnum b)
Definition: Wii.cpp:1093
+
ButtonEnum
+
bool getButtonClick(ButtonEnum b)
Definition: Wii.cpp:1104
int16_t accYwiimote
Definition: Wii.h:230
bool wiiUProControllerConnected
Definition: Wii.h:202
float getYaw()
Definition: Wii.h:132
-
void setRumbleOff()
Definition: Wii.cpp:902
+
void setRumbleOff()
Definition: Wii.cpp:909
bool wiiBalanceBoardConnected
Definition: Wii.h:204
float gyroRoll
Definition: Wii.h:243
-
void setAllOff()
Definition: Wii.cpp:896
+
void setAllOff()
Definition: Wii.cpp:903
void setLedOff()
Definition: Wii.h:152
float getWiimoteRoll()
Definition: Wii.h:216
uint16_t getIRy1()
Definition: Wii.h:319
uint16_t getIRx3()
Definition: Wii.h:359
-
BTD * pBtd
Definition: BTD.h:608
+
BTD * pBtd
Definition: BTD.h:612
bool nunchuckConnected
Definition: Wii.h:198
uint16_t getIRy4()
Definition: Wii.h:391
float gyroPitch
Definition: Wii.h:241
@@ -158,33 +138,33 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
bool isIRCameraEnabled()
Definition: Wii.h:408
float yawGyroSpeed
Definition: Wii.h:251
void pair(void)
Definition: Wii.h:89
-
void setLedOn(LEDEnum a)
Definition: Wii.cpp:932
+
void setLedOn(LEDEnum a)
Definition: Wii.cpp:939
uint16_t getWeightRaw(BalanceBoardEnum pos)
Definition: Wii.h:295
float getRoll()
Definition: Wii.h:120
HatEnum
Definition: Wii.h:36
int16_t accYnunchuck
Definition: Wii.h:236
int16_t gyroYawZero
Definition: Wii.h:270
Definition: Wii.h:46
-
void pairWithWiimote()
Definition: BTD.h:464
+
void pairWithWiimote()
Definition: BTD.h:467
uint8_t getIRs2()
Definition: Wii.h:351
Definition: Wii.h:56
-
bool getButtonPress(ButtonEnum b)
Definition: Wii.cpp:1086
+
bool getButtonPress(ButtonEnum b)
Definition: Wii.cpp:1097
float getWiimotePitch()
Definition: Wii.h:212
bool motionPlusConnected
Definition: Wii.h:200
int16_t gyroRollZero
Definition: Wii.h:271
-
float getTotalWeight()
Definition: Wii.cpp:1152
+
float getTotalWeight()
Definition: Wii.cpp:1163
float getNunchuckRoll()
Definition: Wii.h:228
-
void Run()
Definition: Wii.cpp:718
+
void Run()
Definition: Wii.cpp:725
int16_t accXwiimote
Definition: Wii.h:230
-
float getWeight(BalanceBoardEnum pos)
Definition: Wii.cpp:1139
+
float getWeight(BalanceBoardEnum pos)
Definition: Wii.cpp:1150
int16_t accZwiimote
Definition: Wii.h:230
diff --git a/_wii_camera_readme_8md.html b/_wii_camera_readme_8md.html index ff934b29..2475f815 100644 --- a/_wii_camera_readme_8md.html +++ b/_wii_camera_readme_8md.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: WiiCameraReadme.md File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + + - + - - + + + + - + - - + + + +
 

Variable Documentation

- + +

◆ XBOXOLD_BUTTONS

+
@@ -125,7 +107,7 @@ Variables
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.

+

Definition at line 24 of file XBOXOLD.cpp.

@@ -134,7 +116,7 @@ Variables 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 4e66fc26..bc962cd7 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 @@ -6e170bd84842a4541b9931c43ed0f42c \ No newline at end of file +d14013d39d687e63de1d15795f5252c3 \ 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 35ad093418224c0bec834dada1b3297332f28fc7..1d62839312bcba9a084fd38ffd3379953639a574 100644 GIT binary patch literal 18728 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 literal 19080 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 diff --git a/_x_b_o_x_o_l_d_8cpp_source.html b/_x_b_o_x_o_l_d_8cpp_source.html index a37cc976..83efcaee 100644 --- a/_x_b_o_x_o_l_d_8cpp_source.html +++ b/_x_b_o_x_o_l_d_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXOLD.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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) { //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:41
- - -
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
-
uint8_t bmNakPower
Definition: address.h:42
- +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
+ + +
EpInfo * epinfo
Definition: address.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
+
uint8_t bmNakPower
Definition: address.h:49
+
uint8_t Release()
Definition: XBOXOLD.cpp:237
-
#define NotifyFail(...)
Definition: message.h:55
- -
AnalogHatEnum
- -
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
-
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:86
+
#define NotifyFail(...)
Definition: message.h:62
+ +
AnalogHatEnum
+ +
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:93
#define bmREQ_HID_OUT
Definition: usbhid.h:63
-
#define pgm_read_byte(addr)
+
#define pgm_read_byte(addr)
void setRumbleOn(uint8_t lValue, uint8_t rValue)
Definition: XBOXOLD.cpp:327
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
- -
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
+ +
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
#define XBOX_OLD_PID4
Definition: XBOXOLD.h:41
EpInfo epInfo[XBOX_MAX_ENDPOINTS]
Definition: XBOXOLD.h:153
#define EP_MAXPKTSIZE
Definition: PS3USB.h:26
virtual void FreeAddress(uint8_t addr)=0
-
uint8_t epAttribs
Definition: address.h:37
- -
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
+
uint8_t epAttribs
Definition: address.h:44
+ +
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:133
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
const uint8_t XBOXOLD_BUTTONS[]
Definition: XBOXOLD.cpp:24
-
#define Notify(...)
Definition: message.h:44
- -
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
- -
uint8_t epAddr
Definition: address.h:33
-
#define NotifyFailUnknownDevice(...)
Definition: message.h:54
- -
#define USB_NAK_MAX_POWER
Definition: address.h:27
+
#define Notify(...)
Definition: message.h:51
+ +
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+ +
uint8_t epAddr
Definition: address.h:40
+
#define NotifyFailUnknownDevice(...)
Definition: message.h:61
+ +
#define USB_NAK_MAX_POWER
Definition: address.h:34
int16_t getAnalogHat(AnalogHatEnum a)
Definition: XBOXOLD.cpp:317
#define XBOX_VID
Definition: XBOXOLD.h:34
#define XBOX_INPUT_PIPE
Definition: XBOXOLD.h:30
- +
XBOXOLD(USB *pUsb)
Definition: XBOXOLD.cpp:47
#define XBOX_OLD_PID1
Definition: XBOXOLD.h:38
-
Definition: address.h:32
-
ButtonEnum
+
Definition: address.h:39
+
ButtonEnum
#define JOYTECH_VID
Definition: XBOXOLD.h:36
USB * pUsb
Definition: XBOXOLD.h:149
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bmSndToggle
Definition: address.h:40
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define PSTR(str)
+
uint8_t bmSndToggle
Definition: address.h:47
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define PSTR(str)
uint8_t Poll()
Definition: XBOXOLD.cpp:245
#define XBOX_OLD_PID2
Definition: XBOXOLD.h:39
#define MADCATZ_VID
Definition: XBOXOLD.h:35
#define XBOX_OUTPUT_PIPE
Definition: XBOXOLD.h:31
-
#define USB_NAK_NOWAIT
Definition: address.h:29
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
- -
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
+
#define USB_NAK_NOWAIT
Definition: address.h:36
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
+ +
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXOLD.cpp:63
#define XBOX_MAX_ENDPOINTS
Definition: XBOXOLD.h:43
#define XBOX_OLD_PID3
Definition: XBOXOLD.h:40
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
bool XboxConnected
Definition: XBOXOLD.h:141
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
Definition: UsbCore.h:197
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
Definition: UsbCore.h:208
bool getButtonClick(ButtonEnum b)
Definition: XBOXOLD.cpp:302
uint8_t getButtonPress(ButtonEnum b)
Definition: XBOXOLD.cpp:295
#define XBOX_CONTROL_PIPE
Definition: XBOXOLD.h:29
uint8_t bAddress
Definition: XBOXOLD.h:151
- - + +
#define HID_REQUEST_SET_REPORT
Definition: usbhid.h:72
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
- +
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
+
diff --git a/_x_b_o_x_o_l_d_8h.html b/_x_b_o_x_o_l_d_8h.html index f5540bc9..f512d7d3 100644 --- a/_x_b_o_x_o_l_d_8h.html +++ b/_x_b_o_x_o_l_d_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXOLD.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- + - +
@@ -151,7 +131,9 @@ Macros  

Macro Definition Documentation

- + +

◆ EP_MAXPKTSIZE

+
@@ -161,11 +143,13 @@ Macros
-

Definition at line 26 of file XBOXOLD.h.

+

Definition at line 26 of file XBOXOLD.h.

- + +

◆ XBOX_CONTROL_PIPE

+
@@ -175,11 +159,13 @@ Macros
-

Definition at line 29 of file XBOXOLD.h.

+

Definition at line 29 of file XBOXOLD.h.

- + +

◆ XBOX_INPUT_PIPE

+
@@ -189,11 +175,13 @@ Macros
-

Definition at line 30 of file XBOXOLD.h.

+

Definition at line 30 of file XBOXOLD.h.

- + +

◆ XBOX_OUTPUT_PIPE

+
@@ -203,11 +191,13 @@ Macros
-

Definition at line 31 of file XBOXOLD.h.

+

Definition at line 31 of file XBOXOLD.h.

- + +

◆ XBOX_VID

+
@@ -217,11 +207,13 @@ Macros
-

Definition at line 34 of file XBOXOLD.h.

+

Definition at line 34 of file XBOXOLD.h.

- + +

◆ MADCATZ_VID

+
@@ -231,11 +223,13 @@ Macros
-

Definition at line 35 of file XBOXOLD.h.

+

Definition at line 35 of file XBOXOLD.h.

- + +

◆ JOYTECH_VID

+
@@ -245,11 +239,13 @@ Macros
-

Definition at line 36 of file XBOXOLD.h.

+

Definition at line 36 of file XBOXOLD.h.

- + +

◆ XBOX_OLD_PID1

+
@@ -259,11 +255,13 @@ Macros
-

Definition at line 38 of file XBOXOLD.h.

+

Definition at line 38 of file XBOXOLD.h.

- + +

◆ XBOX_OLD_PID2

+
@@ -273,11 +271,13 @@ Macros
-

Definition at line 39 of file XBOXOLD.h.

+

Definition at line 39 of file XBOXOLD.h.

- + +

◆ XBOX_OLD_PID3

+
@@ -287,11 +287,13 @@ Macros
-

Definition at line 40 of file XBOXOLD.h.

+

Definition at line 40 of file XBOXOLD.h.

- + +

◆ XBOX_OLD_PID4

+
@@ -301,11 +303,13 @@ Macros
-

Definition at line 41 of file XBOXOLD.h.

+

Definition at line 41 of file XBOXOLD.h.

- + +

◆ XBOX_MAX_ENDPOINTS

+
@@ -315,7 +319,7 @@ Macros
-

Definition at line 43 of file XBOXOLD.h.

+

Definition at line 43 of file XBOXOLD.h.

@@ -324,7 +328,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 cc366f2a..5636aca6 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 @@ -82c0a98cce5027def9ffaed26c3bac43 \ No newline at end of file +40aa5e977625e2239fdc92221cc54178 \ 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 fc4cb21603f6611ffe9ef88aed1dacbcabeacac6..6db368608e0cc66a12ecfd3e2234dc3caf88db52 100644 GIT binary patch literal 4188 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 TRYzdI3ji7_I?CUbtRnscxQHOw literal 4198 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 - + - + 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 00cfe4cd..4d76a76a 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 @@ -6f0fa83f2b72b0b7a7795b417af236ee \ No newline at end of file +a5adfa0570ca84123bf5bd39bb76ff4d \ 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 683b12a85baab8c47f59954e1b3842ba2b234ff9..f5b39a4c40d4e07f885718e64d95ef35aea6c45f 100644 GIT binary patch literal 15868 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 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 f7e9cd0c..e4d96b7b 100644 --- a/_x_b_o_x_o_l_d_8h_source.html +++ b/_x_b_o_x_o_l_d_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXOLD.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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
+
AnalogHatEnum
virtual uint8_t GetAddress()
Definition: XBOXOLD.h:78
- +
void setRumbleOn(uint8_t lValue, uint8_t rValue)
Definition: XBOXOLD.cpp:327
@@ -106,8 +86,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#define XBOX_VID
Definition: XBOXOLD.h:34
XBOXOLD(USB *pUsb)
Definition: XBOXOLD.cpp:47
#define XBOX_OLD_PID1
Definition: XBOXOLD.h:38
-
Definition: address.h:32
-
ButtonEnum
+
Definition: address.h:39
+
ButtonEnum
#define JOYTECH_VID
Definition: XBOXOLD.h:36
USB * pUsb
Definition: XBOXOLD.h:149
uint8_t Poll()
Definition: XBOXOLD.cpp:245
@@ -118,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#define XBOX_OLD_PID3
Definition: XBOXOLD.h:40
bool XboxConnected
Definition: XBOXOLD.h:141
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
bool getButtonClick(ButtonEnum b)
Definition: XBOXOLD.cpp:302
void setRumbleOff()
Definition: XBOXOLD.h:125
uint8_t getButtonPress(ButtonEnum b)
Definition: XBOXOLD.cpp:295
@@ -130,7 +110,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 536ed2fb..c9713956 100644 --- a/_x_b_o_x_o_n_e_8cpp.html +++ b/_x_b_o_x_o_n_e_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXONE.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 adfce4de..561c5fc7 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 @@ -a31c4a2760319c972359266d1c3ccfe5 \ No newline at end of file +4f538d4414a636d7fa50b4947c386571 \ 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 48da411f309dbe145a074afc8bdd4d4884c7aa52..2dde9b7cf44d27a77ab9f9b70c1563d1c87a116b 100644 GIT binary patch literal 11982 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 - + + USB Host Shield 2.0: XBOXONE.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 bPollEnable(false) { // don't start polling before dongle is connected
31  for(uint8_t i = 0; i < XBOX_MAX_ENDPOINTS; i++) {
32  epInfo[i].epAddr = 0;
33  epInfo[i].maxPktSize = (i) ? 0 : 8;
34  epInfo[i].bmSndToggle = 0;
35  epInfo[i].bmRcvToggle = 0;
37  }
38 
39  if(pUsb) // register in USB subsystem
40  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
41 }
42 
43 uint8_t XBOXONE::Init(uint8_t parent, uint8_t port, bool lowspeed) {
44  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
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  uint16_t PID;
50  uint16_t VID;
51 
52  // get memory address of USB device address pool
53  AddressPool &addrPool = pUsb->GetAddressPool();
54 #ifdef EXTRADEBUG
55  Notify(PSTR("\r\nXBOXONE Init"), 0x80);
56 #endif
57  // check if address has already been assigned to an instance
58  if(bAddress) {
59 #ifdef DEBUG_USB_HOST
60  Notify(PSTR("\r\nAddress in use"), 0x80);
61 #endif
63  }
64 
65  // Get pointer to pseudo device with address 0 assigned
66  p = addrPool.GetUsbDevicePtr(0);
67 
68  if(!p) {
69 #ifdef DEBUG_USB_HOST
70  Notify(PSTR("\r\nAddress not found"), 0x80);
71 #endif
73  }
74 
75  if(!p->epinfo) {
76 #ifdef DEBUG_USB_HOST
77  Notify(PSTR("\r\nepinfo is null"), 0x80);
78 #endif
80  }
81 
82  // Save old pointer to EP_RECORD of address 0
83  oldep_ptr = p->epinfo;
84 
85  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
86  p->epinfo = epInfo;
87 
88  p->lowspeed = lowspeed;
89 
90  // Get device descriptor
91  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
92  // Restore p->epinfo
93  p->epinfo = oldep_ptr;
94 
95  if(rcode)
96  goto FailGetDevDescr;
97 
98  VID = udd->idVendor;
99  PID = udd->idProduct;
100 
101  if(!VIDPIDOK(VID, PID)) // Check VID
102  goto FailUnknownDevice;
103 
104  // Allocate new address according to device class
105  bAddress = addrPool.AllocAddress(parent, false, port);
106 
107  if(!bAddress)
109 
110  // Extract Max Packet Size from device descriptor
111  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
112 
113  // Assign new address to the device
114  rcode = pUsb->setAddr(0, 0, bAddress);
115  if(rcode) {
116  p->lowspeed = false;
117  addrPool.FreeAddress(bAddress);
118  bAddress = 0;
119 #ifdef DEBUG_USB_HOST
120  Notify(PSTR("\r\nsetAddr: "), 0x80);
121  D_PrintHex<uint8_t > (rcode, 0x80);
122 #endif
123  return rcode;
124  }
125 #ifdef EXTRADEBUG
126  Notify(PSTR("\r\nAddr: "), 0x80);
127  D_PrintHex<uint8_t > (bAddress, 0x80);
128 #endif
129  //delay(300); // Spec says you should wait at least 200ms
130 
131  p->lowspeed = false;
132 
133  //get pointer to assigned address record
134  p = addrPool.GetUsbDevicePtr(bAddress);
135  if(!p)
137 
138  p->lowspeed = lowspeed;
139 
140  // Assign epInfo to epinfo pointer - only EP0 is known
141  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
142  if(rcode)
143  goto FailSetDevTblEntry;
144 
145  /* The application will work in reduced host mode, so we can save program and data
146  memory space. After verifying the VID we will use known values for the
147  configuration values for device, interface, endpoints and HID for the XBOXONE Controllers */
148 
149  /* Initialize data structures for endpoints of device */
150  epInfo[ XBOX_OUTPUT_PIPE ].epAddr = 0x01; // XBOX one output endpoint
152  epInfo[ XBOX_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
156  epInfo[ XBOX_INPUT_PIPE ].epAddr = 0x01; // XBOX one input endpoint
158  epInfo[ XBOX_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
162 
163  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
164  if(rcode)
165  goto FailSetDevTblEntry;
166 
167  delay(200); // Give time for address change
168 
169  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_CONTROL_PIPE ].epAddr, 1);
170  if(rcode)
171  goto FailSetConfDescr;
172 
173 #ifdef DEBUG_USB_HOST
174  Notify(PSTR("\r\nXbox One Controller Connected\r\n"), 0x80);
175 #endif
176 
177  delay(200); // let things settle
178 
179  // initialize the controller for input
180  writeBuf[0] = 0x05;
181  writeBuf[1] = 0x20;
182  rcode = XboxCommand(writeBuf, 2);
183  if (rcode)
184  goto Fail;
185 
186  onInit();
187  XboxOneConnected = true;
188  bPollEnable = true;
189  return 0; // Successful configuration
190 
191  /* Diagnostic messages */
192 FailGetDevDescr:
193 #ifdef DEBUG_USB_HOST
195  goto Fail;
196 #endif
197 
198 FailSetDevTblEntry:
199 #ifdef DEBUG_USB_HOST
201  goto Fail;
202 #endif
203 
204 FailSetConfDescr:
205 #ifdef DEBUG_USB_HOST
207 #endif
208  goto Fail;
209 
210 FailUnknownDevice:
211 #ifdef DEBUG_USB_HOST
212  NotifyFailUnknownDevice(VID, PID);
213 #endif
215 
216 Fail:
217 #ifdef DEBUG_USB_HOST
218  Notify(PSTR("\r\nXbox One Init Failed, error code: "), 0x80);
219  NotifyFail(rcode);
220 #endif
221  Release();
222  return rcode;
223 }
224 
225 /* Performs a cleanup after failed Init() attempt */
226 uint8_t XBOXONE::Release() {
227  XboxOneConnected = false;
229  bAddress = 0;
230  bPollEnable = false;
231 #ifdef DEBUG_USB_HOST
232  Notify(PSTR("\r\nXbox One Controller Disconnected\r\n"), 0x80);
233 #endif
234  return 0;
235 }
236 
237 uint8_t XBOXONE::Poll() {
238  if(!bPollEnable)
239  return 0;
240  uint16_t BUFFER_SIZE = EP_MAXPKTSIZE;
241  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ XBOX_INPUT_PIPE ].epAddr, &BUFFER_SIZE, readBuf);
242  if (!rcode) {
243  readReport();
244 #ifdef PRINTREPORT
245  printReport(); // Uncomment "#define PRINTREPORT" to print the report send by the Xbox ONE Controller
246 #endif
247  }
248 #ifdef DEBUG_USB_HOST
249  else if (rcode != 0x04) { // not a matter of no update to send
250  Notify(PSTR("\r\nXbox One Poll Failed, error code: "), 0x80);
251  NotifyFail(rcode);
252  }
253 #endif
254  return rcode;
255 }
256 
257 void XBOXONE::readReport() {
258  if(readBuf == NULL)
259  return;
260  if(readBuf[0] == 0x07) {
261  // The XBOX button has a separate message
262  if(readBuf[4] == 1)
263  ButtonState |= XBOX_BUTTONS[XBOX];
264  else
265  ButtonState &= ~XBOX_BUTTONS[XBOX];
266  }
267  if(readBuf[0] != 0x20) { // Check if it's the correct report, otherwise return - the controller also sends different status reports
268 #ifdef EXTRADEBUG
269  Notify(PSTR("\r\nXbox Poll: "), 0x80);
270  D_PrintHex<uint8_t > (readBuf[0], 0x80); // 0x03 is a heart beat report!
271 #endif
272  return;
273  }
274 
275  uint16_t xbox = ButtonState & XBOX_BUTTONS[XBOX]; // Since the XBOX button is separate, save it and add it back in
276  // xbox button from before, dpad, abxy, start/back, sync, stick click, shoulder buttons
277  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);
278 
279  triggerValue[0] = (uint16_t)(((uint16_t)readBuf[7] << 8) | readBuf[6]);
280  triggerValue[1] = (uint16_t)(((uint16_t)readBuf[9] << 8) | readBuf[8]);
281 
282  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
283  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
284  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[15] << 8) | readBuf[14]);
285  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[17] << 8) | readBuf[16]);
286 
287  //Notify(PSTR("\r\nButtonState"), 0x80);
288  //PrintHex<uint16_t>(ButtonState, 0x80);
289 
290  if(ButtonState != OldButtonState) {
291  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
292  OldButtonState = ButtonState;
293  }
294 
295  // Handle click detection for triggers
296  if(triggerValue[0] != 0 && triggerValueOld[0] == 0)
297  L2Clicked = true;
298  triggerValueOld[0] = triggerValue[0];
299  if(triggerValue[1] != 0 && triggerValueOld[1] == 0)
300  R2Clicked = true;
301  triggerValueOld[1] = triggerValue[1];
302 }
303 
304 void XBOXONE::printReport() { //Uncomment "#define PRINTREPORT" to print the report send by the Xbox ONE Controller
305 #ifdef PRINTREPORT
306  if(readBuf == NULL)
307  return;
308  for(uint8_t i = 0; i < XBOX_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  if(b == L2) // These are analog buttons
318  return triggerValue[0];
319  else if(b == R2)
320  return triggerValue[1];
321  return (bool)(ButtonState & ((uint16_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b])));
322 }
323 
325  if(b == L2) {
326  if(L2Clicked) {
327  L2Clicked = false;
328  return true;
329  }
330  return false;
331  } else if(b == R2) {
332  if(R2Clicked) {
333  R2Clicked = false;
334  return true;
335  }
336  return false;
337  }
338  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
339  bool click = (ButtonClickState & button);
340  ButtonClickState &= ~button; // clear "click" event
341  return click;
342 }
343 
345  return hatValue[a];
346 }
347 
348 /* Xbox Controller commands */
349 uint8_t XBOXONE::XboxCommand(uint8_t* data, uint16_t nbytes) {
350  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ XBOX_OUTPUT_PIPE ].epAddr, nbytes, data);
351 #ifdef DEBUG_USB_HOST
352  Notify(PSTR("\r\nXboxCommand, Return: "), 0x80);
353  D_PrintHex<uint8_t > (rcode, 0x80);
354 #endif
355  return rcode;
356 }
357 
358 void XBOXONE::onInit() {
359  // a short buzz to show the controller is active
360  writeBuf[0] = 0x09;
361  writeBuf[1] = 0x08;
362  writeBuf[2] = 0x00;
363  writeBuf[3] = 0x09;
364  writeBuf[4] = 0x00;
365  writeBuf[5] = 0x0f;
366  writeBuf[6] = 0x04;
367  writeBuf[7] = 0x04;
368  writeBuf[8] = 0x20;
369  writeBuf[9] = 0x20;
370  writeBuf[10] = 0x80;
371  XboxCommand(writeBuf, 11);
372 
373  if(pFuncOnInit)
374  pFuncOnInit(); // Call the user function
375 }
uint8_t bmRcvToggle
Definition: address.h:41
- - -
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
-
uint8_t bmNakPower
Definition: address.h:42
- -
#define pgm_read_word(addr)
-
USB * pUsb
Definition: XBOXONE.h:136
-
#define NotifyFail(...)
Definition: message.h:55
-
AnalogHatEnum
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
-
uint8_t bAddress
Definition: XBOXONE.h:138
-
EpInfo epInfo[XBOX_MAX_ENDPOINTS]
Definition: XBOXONE.h:140
+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 
166  if(rcode)
167  goto FailSetDevTblEntry;
168 
169  delay(200); // Give time for address change
170 
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, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
240  bConfNum = conf;
241  uint8_t index;
242 
243  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT) { // Interrupt endpoint
244  index = (pep->bEndpointAddress & 0x80) == 0x80 ? XBOX_ONE_INPUT_PIPE : XBOX_ONE_OUTPUT_PIPE; // Set the endpoint index
245  } else
246  return;
247 
248  // Fill the rest of endpoint data structure
249  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
250  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
251 #ifdef EXTRADEBUG
253 #endif
254  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
255  pollInterval = pep->bInterval;
256  bNumEP++;
257 }
258 
260 #ifdef EXTRADEBUG
261  Notify(PSTR("\r\nEndpoint descriptor:"), 0x80);
262  Notify(PSTR("\r\nLength:\t\t"), 0x80);
263  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
264  Notify(PSTR("\r\nType:\t\t"), 0x80);
265  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
266  Notify(PSTR("\r\nAddress:\t"), 0x80);
267  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
268  Notify(PSTR("\r\nAttributes:\t"), 0x80);
269  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
270  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
271  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
272  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
273  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
274 #endif
275 }
276 
277 /* Performs a cleanup after failed Init() attempt */
278 uint8_t XBOXONE::Release() {
279  XboxOneConnected = false;
281  bAddress = 0; // Clear device address
282  bNumEP = 1; // Must have to be reset to 1
283  qNextPollTime = 0; // Reset next poll time
284  pollInterval = 0;
285  bPollEnable = false;
286 #ifdef DEBUG_USB_HOST
287  Notify(PSTR("\r\nXbox One Controller Disconnected\r\n"), 0x80);
288 #endif
289  return 0;
290 }
291 
292 uint8_t XBOXONE::Poll() {
293  uint8_t rcode = 0;
294 
295  if(!bPollEnable)
296  return 0;
297 
298  if((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) { // Do not poll if shorter than polling interval
299  qNextPollTime = (uint32_t)millis() + pollInterval; // Set new poll time
300  uint16_t length = (uint16_t)epInfo[ XBOX_ONE_INPUT_PIPE ].maxPktSize; // Read the maximum packet size from the endpoint
301  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ XBOX_ONE_INPUT_PIPE ].epAddr, &length, readBuf, pollInterval);
302  if(!rcode) {
303  readReport();
304 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send by the Xbox ONE Controller
305  for(uint8_t i = 0; i < length; i++) {
306  D_PrintHex<uint8_t > (readBuf[i], 0x80);
307  Notify(PSTR(" "), 0x80);
308  }
309  Notify(PSTR("\r\n"), 0x80);
310 #endif
311  }
312 #ifdef DEBUG_USB_HOST
313  else if(rcode != hrNAK) { // Not a matter of no update to send
314  Notify(PSTR("\r\nXbox One Poll Failed, error code: "), 0x80);
315  NotifyFail(rcode);
316  }
317 #endif
318  }
319  return rcode;
320 }
321 
322 void XBOXONE::readReport() {
323  if(readBuf[0] == 0x07) {
324  // The XBOX button has a separate message
325  if(readBuf[4] == 1)
326  ButtonState |= pgm_read_word(&XBOX_BUTTONS[XBOX]);
327  else
328  ButtonState &= ~pgm_read_word(&XBOX_BUTTONS[XBOX]);
329 
330  if(ButtonState != OldButtonState) {
331  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
332  OldButtonState = ButtonState;
333  }
334  }
335  if(readBuf[0] != 0x20) { // Check if it's the correct report, otherwise return - the controller also sends different status reports
336 #ifdef EXTRADEBUG
337  Notify(PSTR("\r\nXbox Poll: "), 0x80);
338  D_PrintHex<uint8_t > (readBuf[0], 0x80); // 0x03 is a heart beat report!
339 #endif
340  return;
341  }
342 
343  uint16_t xbox = ButtonState & pgm_read_word(&XBOX_BUTTONS[XBOX]); // Since the XBOX button is separate, save it and add it back in
344  // xbox button from before, dpad, abxy, start/back, sync, stick click, shoulder buttons
345  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);
346 
347  triggerValue[0] = (uint16_t)(((uint16_t)readBuf[7] << 8) | readBuf[6]);
348  triggerValue[1] = (uint16_t)(((uint16_t)readBuf[9] << 8) | readBuf[8]);
349 
350  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
351  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
352  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[15] << 8) | readBuf[14]);
353  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[17] << 8) | readBuf[16]);
354 
355  //Notify(PSTR("\r\nButtonState"), 0x80);
356  //PrintHex<uint16_t>(ButtonState, 0x80);
357 
358  if(ButtonState != OldButtonState) {
359  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
360  OldButtonState = ButtonState;
361  }
362 
363  // Handle click detection for triggers
364  if(triggerValue[0] != 0 && triggerValueOld[0] == 0)
365  L2Clicked = true;
366  triggerValueOld[0] = triggerValue[0];
367  if(triggerValue[1] != 0 && triggerValueOld[1] == 0)
368  R2Clicked = true;
369  triggerValueOld[1] = triggerValue[1];
370 }
371 
373  if(b == L2) // These are analog buttons
374  return triggerValue[0];
375  else if(b == R2)
376  return triggerValue[1];
377  return (bool)(ButtonState & ((uint16_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b])));
378 }
379 
381  if(b == L2) {
382  if(L2Clicked) {
383  L2Clicked = false;
384  return true;
385  }
386  return false;
387  } else if(b == R2) {
388  if(R2Clicked) {
389  R2Clicked = false;
390  return true;
391  }
392  return false;
393  }
394  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
395  bool click = (ButtonClickState & button);
396  ButtonClickState &= ~button; // Clear "click" event
397  return click;
398 }
399 
401  return hatValue[a];
402 }
403 
404 /* Xbox Controller commands */
405 uint8_t XBOXONE::XboxCommand(uint8_t* data, uint16_t nbytes) {
406  data[2] = cmdCounter++; // Increment the output command counter
407  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ XBOX_ONE_OUTPUT_PIPE ].epAddr, nbytes, data);
408 #ifdef DEBUG_USB_HOST
409  Notify(PSTR("\r\nXboxCommand, Return: "), 0x80);
410  D_PrintHex<uint8_t > (rcode, 0x80);
411 #endif
412  return rcode;
413 }
414 
415 // The Xbox One packets are described at: https://github.com/quantus/xbox-one-controller-protocol
416 void XBOXONE::onInit() {
417  // A short buzz to show the controller is active
418  uint8_t writeBuf[13];
419 
420  // Activate rumble
421  writeBuf[0] = 0x09;
422  writeBuf[1] = 0x00;
423  // Byte 2 is set in "XboxCommand"
424 
425  // Single rumble effect
426  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
427  writeBuf[4] = 0x00; // Mode
428  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
429  writeBuf[6] = 0x04; // lT force
430  writeBuf[7] = 0x04; // rT force
431  writeBuf[8] = 0x20; // L force
432  writeBuf[9] = 0x20; // R force
433  writeBuf[10] = 0x80; // Length of pulse
434  writeBuf[11] = 0x00; // Off period
435  writeBuf[12] = 0x00; // Repeat count
436  XboxCommand(writeBuf, 13);
437 
438  if(pFuncOnInit)
439  pFuncOnInit(); // Call the user function
440 }
441 
443  uint8_t writeBuf[13];
444 
445  // Activate rumble
446  writeBuf[0] = 0x09;
447  writeBuf[1] = 0x00;
448  // Byte 2 is set in "XboxCommand"
449 
450  // Continuous rumble effect
451  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
452  writeBuf[4] = 0x00; // Mode
453  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
454  writeBuf[6] = 0x00; // lT force
455  writeBuf[7] = 0x00; // rT force
456  writeBuf[8] = 0x00; // L force
457  writeBuf[9] = 0x00; // R force
458  writeBuf[10] = 0x00; // On period
459  writeBuf[11] = 0x00; // Off period
460  writeBuf[12] = 0x00; // Repeat count
461  XboxCommand(writeBuf, 13);
462 }
463 
464 void XBOXONE::setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor) {
465  uint8_t writeBuf[13];
466 
467  // Activate rumble
468  writeBuf[0] = 0x09;
469  writeBuf[1] = 0x00;
470  // Byte 2 is set in "XboxCommand"
471 
472  // Continuous rumble effect
473  writeBuf[3] = 0x09; // Substructure (what substructure rest of this packet has)
474  writeBuf[4] = 0x00; // Mode
475  writeBuf[5] = 0x0F; // Rumble mask (what motors are activated) (0000 lT rT L R)
476  writeBuf[6] = leftTrigger; // lT force
477  writeBuf[7] = rightTrigger; // rT force
478  writeBuf[8] = leftMotor; // L force
479  writeBuf[9] = rightMotor; // R force
480  writeBuf[10] = 0xFF; // On period
481  writeBuf[11] = 0x00; // Off period
482  writeBuf[12] = 0xFF; // Repeat count
483  XboxCommand(writeBuf, 13);
484 }
uint8_t bConfNum
Definition: XBOXONE.h:185
+
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:784
+
uint8_t bmRcvToggle
Definition: address.h:48
+ + +
EpInfo * epinfo
Definition: address.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
+
uint8_t bmNakPower
Definition: address.h:49
+ +
#define pgm_read_word(addr)
+ + + +
USB * pUsb
Definition: XBOXONE.h:178
+
#define NotifyFail(...)
Definition: message.h:62
+
AnalogHatEnum
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
+
uint8_t bAddress
Definition: XBOXONE.h:180
XBOXONE(USB *pUsb)
Definition: XBOXONE.cpp:27
-
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:86
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
-
#define EP_MAXPKTSIZE
Definition: PS3USB.h:26
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:93
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
+
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: XBOXONE.cpp:239
virtual void FreeAddress(uint8_t addr)=0
-
uint8_t epAttribs
Definition: address.h:37
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
#define Notify(...)
Definition: message.h:44
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
uint8_t epAddr
Definition: address.h:33
-
bool XboxOneConnected
Definition: XBOXONE.h:128
-
#define NotifyFailUnknownDevice(...)
Definition: message.h:54
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
-
virtual uint8_t Release()
Definition: XBOXONE.cpp:226
-
#define XBOX_INPUT_PIPE
Definition: XBOXOLD.h:30
- -
Definition: address.h:32
-
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:293
-
ButtonEnum
- -
uint16_t getButtonPress(ButtonEnum b)
Definition: XBOXONE.cpp:316
+
uint8_t bNumEP
Definition: XBOXONE.h:187
+
#define Notify(...)
Definition: message.h:51
+ + +
#define USBTRACE2(s, r)
Definition: macros.h:84
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
#define NotifyFailGetConfDescr(...)
Definition: message.h:59
+
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: XBOXONE.cpp:259
+
uint8_t epAddr
Definition: address.h:40
+
bool XboxOneConnected
Definition: XBOXONE.h:174
+
#define XBOX_ONE_MAX_ENDPOINTS
Definition: XBOXONE.h:37
+
#define NotifyFailUnknownDevice(...)
Definition: message.h:61
+
void setRumbleOff()
Definition: XBOXONE.cpp:442
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
+
virtual uint8_t Release()
Definition: XBOXONE.cpp:278
+ +
Definition: address.h:39
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
+
#define hrNAK
Definition: max3421e.h:218
+
ButtonEnum
+
uint16_t wMaxPacketSize
Definition: usb_ch9.h:153
+
#define bmUSB_TRANSFER_TYPE
Definition: usb_ch9.h:94
+ +
uint16_t getButtonPress(ButtonEnum b)
Definition: XBOXONE.cpp:372
+ +
uint32_t qNextPollTime
Definition: XBOXONE.h:189
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bmSndToggle
Definition: address.h:40
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define PSTR(str)
- -
bool getButtonClick(ButtonEnum b)
Definition: XBOXONE.cpp:324
-
virtual uint8_t Poll()
Definition: XBOXONE.cpp:237
-
#define XBOX_OUTPUT_PIPE
Definition: XBOXOLD.h:31
-
#define USB_NAK_NOWAIT
Definition: address.h:29
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
-
#define XBOX_MAX_ENDPOINTS
Definition: XBOXOLD.h:43
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXONE.cpp:43
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
Definition: UsbCore.h:197
-
#define XBOX_CONTROL_PIPE
Definition: XBOXOLD.h:29
- -
int16_t getAnalogHat(AnalogHatEnum a)
Definition: XBOXONE.cpp:344
- - +
uint8_t bEndpointAddress
Definition: usb_ch9.h:151
+
uint8_t bmSndToggle
Definition: address.h:47
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define PSTR(str)
+
#define XBOX_ONE_INPUT_PIPE
Definition: XBOXONE.h:35
+ +
EpInfo epInfo[XBOX_ONE_MAX_ENDPOINTS]
Definition: XBOXONE.h:182
+ +
bool getButtonClick(ButtonEnum b)
Definition: XBOXONE.cpp:380
+
virtual uint8_t Poll()
Definition: XBOXONE.cpp:292
+
#define USB_NAK_NOWAIT
Definition: address.h:36
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
+
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXONE.cpp:46
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
Definition: UsbCore.h:208
+
#define XBOX_ONE_CONTROL_PIPE
Definition: XBOXONE.h:33
+
#define XBOX_ONE_OUTPUT_PIPE
Definition: XBOXONE.h:34
+ +
int16_t getAnalogHat(AnalogHatEnum a)
Definition: XBOXONE.cpp:400
+ +
const uint16_t XBOX_BUTTONS[]
Definition: xboxEnums.h:41
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
-
#define XBOX_REPORT_BUFFER_SIZE
Definition: XBOXONE.h:41
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
-
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: XBOXONE.h:96
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
- +
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: XBOXONE.h:123
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
+
void setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor)
Definition: XBOXONE.cpp:464
+
diff --git a/_x_b_o_x_o_n_e_8h.html b/_x_b_o_x_o_n_e_8h.html index fb8afa1e..2d02f2cd 100644 --- a/_x_b_o_x_o_n_e_8h.html +++ b/_x_b_o_x_o_n_e_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXONE.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Macros

#define EP_MAXPKTSIZE   32
 
#define XBOX_CONTROL_PIPE   0
 
#define XBOX_OUTPUT_PIPE   1
 
#define XBOX_INPUT_PIPE   2
 
#define XBOX_VID   0x045E
 
#define XBOX_ONE_PID   0x02D1
 
#define XBOX_REPORT_BUFFER_SIZE   14
 
#define XBOX_MAX_ENDPOINTS   3
 
#define XBOX_ONE_EP_MAXPKTSIZE   64
 
#define XBOX_ONE_CONTROL_PIPE   0
 
#define XBOX_ONE_OUTPUT_PIPE   1
 
#define XBOX_ONE_INPUT_PIPE   2
 
#define XBOX_ONE_MAX_ENDPOINTS   3
 
#define XBOX_VID1   0x045E
 
#define XBOX_ONE_PID1   0x02D1
 
#define XBOX_ONE_PID2   0x02DD
 
#define XBOX_ONE_PID3   0x02E3
 
#define XBOX_ONE_PID4   0x02EA
 
#define XBOX_VID2   0x0738
 
#define XBOX_VID3   0x0E6F
 
#define XBOX_VID4   0x0F0D
 
#define XBOX_VID5   0x1532
 
#define XBOX_VID6   0x24C6
 
#define XBOX_ONE_PID5   0x4A01
 
#define XBOX_ONE_PID6   0x0139
 
#define XBOX_ONE_PID7   0x0146
 
#define XBOX_ONE_PID8   0x0067
 
#define XBOX_ONE_PID9   0x0A03
 
#define XBOX_ONE_PID10   0x541A
 
#define XBOX_ONE_PID11   0x542A
 
#define XBOX_ONE_PID12   0x543A
 

Macro Definition Documentation

- + +

◆ XBOX_ONE_EP_MAXPKTSIZE

+
- +
#define EP_MAXPKTSIZE   32#define XBOX_ONE_EP_MAXPKTSIZE   64
-

Definition at line 30 of file XBOXONE.h.

+

Definition at line 30 of file XBOXONE.h.

- + +

◆ XBOX_ONE_CONTROL_PIPE

+
- +
#define XBOX_CONTROL_PIPE   0#define XBOX_ONE_CONTROL_PIPE   0
-

Definition at line 33 of file XBOXONE.h.

+

Definition at line 33 of file XBOXONE.h.

- + +

◆ XBOX_ONE_OUTPUT_PIPE

+
- +
#define XBOX_OUTPUT_PIPE   1#define XBOX_ONE_OUTPUT_PIPE   1
-

Definition at line 34 of file XBOXONE.h.

+

Definition at line 34 of file XBOXONE.h.

- + +

◆ XBOX_ONE_INPUT_PIPE

+
- +
#define XBOX_INPUT_PIPE   2#define XBOX_ONE_INPUT_PIPE   2
-

Definition at line 35 of file XBOXONE.h.

+

Definition at line 35 of file XBOXONE.h.

- + +

◆ XBOX_ONE_MAX_ENDPOINTS

+
- +
#define XBOX_VID   0x045E#define XBOX_ONE_MAX_ENDPOINTS   3
-

Definition at line 38 of file XBOXONE.h.

+

Definition at line 37 of file XBOXONE.h.

- + +

◆ XBOX_VID1

+
- +
#define XBOX_ONE_PID   0x02D1#define XBOX_VID1   0x045E
-

Definition at line 39 of file XBOXONE.h.

+

Definition at line 42 of file XBOXONE.h.

- + +

◆ XBOX_ONE_PID1

+
- +
#define XBOX_REPORT_BUFFER_SIZE   14#define XBOX_ONE_PID1   0x02D1
-

Definition at line 41 of file XBOXONE.h.

+

Definition at line 43 of file XBOXONE.h.

- + +

◆ XBOX_ONE_PID2

+
- +
#define XBOX_MAX_ENDPOINTS   3#define XBOX_ONE_PID2   0x02DD
-

Definition at line 43 of file XBOXONE.h.

+

Definition at line 44 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID3

+ +
+
+ + + + +
#define XBOX_ONE_PID3   0x02E3
+
+ +

Definition at line 45 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID4

+ +
+
+ + + + +
#define XBOX_ONE_PID4   0x02EA
+
+ +

Definition at line 46 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_VID2

+ +
+
+ + + + +
#define XBOX_VID2   0x0738
+
+ +

Definition at line 49 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_VID3

+ +
+
+ + + + +
#define XBOX_VID3   0x0E6F
+
+ +

Definition at line 50 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_VID4

+ +
+
+ + + + +
#define XBOX_VID4   0x0F0D
+
+ +

Definition at line 51 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_VID5

+ +
+
+ + + + +
#define XBOX_VID5   0x1532
+
+ +

Definition at line 52 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_VID6

+ +
+
+ + + + +
#define XBOX_VID6   0x24C6
+
+ +

Definition at line 53 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID5

+ +
+
+ + + + +
#define XBOX_ONE_PID5   0x4A01
+
+ +

Definition at line 55 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID6

+ +
+
+ + + + +
#define XBOX_ONE_PID6   0x0139
+
+ +

Definition at line 56 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID7

+ +
+
+ + + + +
#define XBOX_ONE_PID7   0x0146
+
+ +

Definition at line 57 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID8

+ +
+
+ + + + +
#define XBOX_ONE_PID8   0x0067
+
+ +

Definition at line 58 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID9

+ +
+
+ + + + +
#define XBOX_ONE_PID9   0x0A03
+
+ +

Definition at line 59 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID10

+ +
+
+ + + + +
#define XBOX_ONE_PID10   0x541A
+
+ +

Definition at line 60 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID11

+ +
+
+ + + + +
#define XBOX_ONE_PID11   0x542A
+
+ +

Definition at line 61 of file XBOXONE.h.

+ +
+
+ +

◆ XBOX_ONE_PID12

+ +
+
+ + + + +
#define XBOX_ONE_PID12   0x543A
+
+ +

Definition at line 62 of file XBOXONE.h.

@@ -258,7 +524,7 @@ Macros 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 c13f788f..138afee0 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 @@ -fd61d6c8f3280fcb7695abf658ecef71 \ No newline at end of file +62b27de5bf2e11b4776c6317ba9ba67c \ 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 9ddbb2a6ef06021651e4bf0a03d6b9be4a8bf720..473cae86c9c4829d867961b667317f84378b1027 100644 GIT binary patch literal 4255 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 CBUcRo literal 4333 zcmchb2Uk-|7luO%NL53m;I0&NiRxYL1w zIzkJ23<6!P(biBi_NUmgVn|MS%u0mXzgbnI<4-CvPeMP48lehcGa{CIdul5{Yk6y_9*}+w%pJoOv;f^+Ix6l538I(WW z+{p?#l)uCT(F+Mku(JJg=LTD=6o!?F6PxdJlM~BCFe->}TEBav1|`JLugNBaq-Mq( zTT&`$X=%~1D=fg*9Z+aT$B}eN^y;{&O<`IZr=TX2M~t+%@21&wvtL!d1y96h*S7ru z#Zv#hMFp2^4mGNs)}!ntlZ43MW>2?8P#Fur}J=0XyFxR9(yTXv-_k4%G2S_ocxO%xT;stXl((dXxCwg*3`dK3_Lz z3OPN5t}P_K@^Pd>-FZRYU7#%6?kh3MciNcvECIT>IQ7uc(fQQSAa@*2tFt{*FSa#R zjo`@R*G(CEF{q3nT+})Zzg!k?f{$)|*xIRcpP}}AGIDvH zaidSvvO&D{?+-ZT?B-N;Y0%L&X(iPL>Ed!XguD>lNh>wdOCXp9F2)L0FxyY~Y)mAi zh&=h%s>wSK*xK-n2TlZ}e74)cZquE}<4nNXN~AgVXJ~51von<`Cr2D`-m{}-gPZ8B zyUsO9OFIpP6NC33rq9*7j3;?B=5}^!xJ-R5>q%KyH~guk^UL6MSjlfr-;N&AN5+-$)cd0*3|EBxcDU2NH101@~Y}b(y|DU zN*|Y-NC5}vrAfNSF?PUhE^wyK-TC#iGXP8eo4Q z`)Sm@cPvmPr><)ymW>k9t`mKH4-r@rYKl|AyF~cO()R=i91Q0W{X1@*X7O^0dac+` zGOeGCXH6Bev7R6SbI^0^&9RwUE?8+SVnOoq@+#H(_4zqXyMUQe<5Hw?i6IQLyr&d$ zQe$A{befLN&J%i6G!#Kat3>vp)@7OSI_>5T?vFhcj8y>S53yae#>BD30~}srA*YH90Y!|U&9$zMS5ITV@Z6nvXeRth?|>| z+r z{~=;c(9yGRbyp*Yd0WYg@uZ((xR}&!v0vI2H-9b`Fc-Jj(sC#Ee>An$Rt`F3ox;jS z*-M9>`Rkgb?Nn3lOrMC?2eqEaPdXkx_iwv&XbY$q}AcC znvql87Nk~c zLl}ylGjhsl7VBd^l|3%Ea7Bwh6_a5B^R$_Uw{r14|C7W96o-!1RDd-m`8EZkW3kj4YF zw=O-za4Rgti@FX+KbtavyJXBz4HN0=HeK|ey?2&MP`it#y zJ=pjvzoq$DI0h5)GL&o!$B8Jqwo^!EXRL4LELD6HWz=9IXlrvXD>v}ur={IG%MM6T z7W&j-MCEH|M<2Nr`&55`>mp;%mPyJIQauuxxE#Blo>u}=gu$YCB!8JRY1#gG-ec!Cdkf<7DTX%a z&%k+2z&@1sPapH@LWdyvXT0-aK@1~8iI7$s=)ps$mL)lu$#HBQ&>7k4SM(&cnT*#{w+I;S>vyq&Kzeu}{;)mK7P z^m~$JG({!zlk{uQ7=KCV0$F}Nn_}jD(`>&R-d8p>u>jCmWNLFd6Jh)N;Cm9-4YBSe zTTL-DN0v__hHq(EZ9B@Knz>aGBivY?(w}pEU^l;|KU#rQb$mXJnN#6g&(3aWd*FQw zMExYWv2zJId}~aE#IcoUj#PEcdoOOc{(p?+*jVE+<_%)>e%6||R+d?dq+NgP8yND= z^QNn^#abonu3Gyq&@^_B5!G_iTLTYVF0RB4ZYo`4ON^EOsiXDQESG{^bf#nc1CezX zE%UoCeW~AdQFIvpPbcNU5m8=VMPFfn9iqKnyl_4tt(kmm;Nz~JsdJsw&o%+mntZm< zymIAAi?W4!s!gc;c%{{o^|tM%jsKX$b3uMJC+y`C|3T-zp^=vjRkhH1>5I{aH)IS`QC@@QtsOD^-4jth3 z9BwQEg8UDV1`m;!*7V)Ry66BTwQwf3-je*;F$mdaYf{m)`SmC3AoIdg6n~=k5P%`$ z040jpo(sa^x>i2pkK;UwQ*WD8E^@Dqk@uFQ->7#pIV#aO=+&($WEc9pF$m z)UURXI5GdDp985i<(r#sxBx8&*8=jlmhj^U34r@5Uo&z4{;(Cf9u=NoA^0$(0H6>7 z9lL$_^SKOFtfZtQ8~JyCrl4CSm6%0eM&9 zv>3ILMs&;EroP5iwIsI(pOK%xNAJ$J$9*nn+Nf+UxbY)wx1H8^Z=Z>lvKjAMSBEfA zJ(m(O!-h}SIP(=f!Xx4=gP=gDQyO4iCXdh-L?IoJ!uoxTCt{^D*Dk)2Hja? zT^*>j2N`zz8$7T<1uRo1Ra6As31!2)y`NVys{iyya^CZ$@5Aq4>M;+ilz-B9sC8I8 zyTnF){p$l#p#@7mfpd8SJ}m&U5PDPwtqSFn2M?f6*zL*-t7Fi$dYrdwJbqaRbCcO= z3g7i_cExkVL%?YCJU$}$i!<$in99#vwI&rz_Jk*b7I%H0)VgTO&U!}P8ID{CcG#M( z^`6I5Ec%T87${dBi{hd)jOP%0_Hj63dD$V|R-rNnI06usV0<{m;?SD+xx=WKA{7q{ z$pIot#Z+zm2+BR-xs|dfuwCryM=zoKyPl-Qj4LVAB|E6Aqvy|Y) zqu_nVz#NrP?>-}-Bw|r>GaT!;W1S#{_1E^}wB*Oe=XU(|s9rti^e)=x}W+L|{yLk_D^w zp~uj4{aeDxv{o^Z-{T$u*pA#4RrAy!bd~|sWVz@$M5wrHoxj}i!vrFrXXy50yn0Xt zuC&{0fLMo_Z$%U8DL{tz6)OcAblR$x^M(FY{}**!s5+ z{e0a_)F^%=c9E`O{S+4Oxccp$?a4iCzTNISeMNR}pMt?gWAtWj4?%w# zQy>0@5JtlL_|FD|j0Batv9qtjC>pI9HJx}|(7-hYNLy21qw)dj<^KThq=q*D 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 14781353..77d2358c 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 @@ -0dde0ce6aa02e651aff1df3147ecf48a \ No newline at end of file +2a496eec75d3a13d8c9db56169dc7730 \ 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 5b9e64918f0e7575d19279f93550daaefcee5141..63261062d29a4c82c91bbe19c73d16ded72640dd 100644 GIT binary patch literal 9107 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 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 da87d4d9..bc7e85e8 100644 --- a/_x_b_o_x_o_n_e_8h_source.html +++ b/_x_b_o_x_o_n_e_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXONE.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 /* Data Xbox ONE taken from descriptors */
30 #define EP_MAXPKTSIZE 32 // max size for data via USB
31 
32 /* Names we give to the 3 XboxONE pipes */
33 #define XBOX_CONTROL_PIPE 0
34 #define XBOX_OUTPUT_PIPE 1
35 #define XBOX_INPUT_PIPE 2
36 
37 // PID and VID of the different devices
38 #define XBOX_VID 0x045E // Microsoft Corporation
39 #define XBOX_ONE_PID 0x02D1 // Microsoft One Wired controller
40 
41 #define XBOX_REPORT_BUFFER_SIZE 14 // Size of the input report buffer
42 
43 #define XBOX_MAX_ENDPOINTS 3
44 
46 class XBOXONE : public USBDeviceConfig {
47 public:
52  XBOXONE(USB *pUsb);
53 
62  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
67  virtual uint8_t Release();
72  virtual 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 && pid == XBOX_ONE_PID);
98  };
112  uint16_t getButtonPress(ButtonEnum b);
113  bool getButtonClick(ButtonEnum b);
114 
120  int16_t getAnalogHat(AnalogHatEnum a);
121 
126  void attachOnInit(void (*funcOnInit)(void)) {
127  pFuncOnInit = funcOnInit;
128  };
132  bool XboxOneConnected;
133 
134 protected:
138  uint8_t bAddress;
141 
142 private:
147  void onInit();
148  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
149 
150  bool bPollEnable;
151 
152  /* Variables to store the buttons */
153  uint16_t ButtonState;
154  uint16_t OldButtonState;
155  uint16_t ButtonClickState;
156  int16_t hatValue[4];
157  uint16_t triggerValue[2];
158  uint16_t triggerValueOld[2];
159 
160  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
161  bool R2Clicked;
162 
163  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
164  uint8_t writeBuf[12]; // General purpose buffer for output data
165 
166  void readReport(); // read incoming data
167  void printReport(); // print incoming date - Uncomment for debugging
168 
169  /* Private commands */
170  uint8_t XboxCommand(uint8_t* data, uint16_t nbytes);
171 };
172 #endif
-
virtual bool isReady()
Definition: XBOXONE.h:86
-
#define XBOX_VID
Definition: XBOXONE.h:38
-
USB * pUsb
Definition: XBOXONE.h:136
-
void attachOnInit(void(*funcOnInit)(void))
Definition: XBOXONE.h:126
-
AnalogHatEnum
-
uint8_t bAddress
Definition: XBOXONE.h:138
-
EpInfo epInfo[XBOX_MAX_ENDPOINTS]
Definition: XBOXONE.h:140
+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 
48 // Unofficial controllers
49 #define XBOX_VID2 0x0738 // Mad Catz
50 #define XBOX_VID3 0x0E6F // Afterglow
51 #define XBOX_VID4 0x0F0D // HORIPAD ONE
52 #define XBOX_VID5 0x1532 // Razer
53 #define XBOX_VID6 0x24C6 // PowerA
54 
55 #define XBOX_ONE_PID5 0x4A01 // Mad Catz FightStick TE 2 - might have different mapping for triggers?
56 #define XBOX_ONE_PID6 0x0139 // Afterglow Prismatic Wired Controller
57 #define XBOX_ONE_PID7 0x0146 // Rock Candy Wired Controller for Xbox One
58 #define XBOX_ONE_PID8 0x0067 // HORIPAD ONE
59 #define XBOX_ONE_PID9 0x0A03 // Razer Wildcat
60 #define XBOX_ONE_PID10 0x541A // PowerA Xbox One Mini Wired Controller
61 #define XBOX_ONE_PID11 0x542A // Xbox ONE spectra
62 #define XBOX_ONE_PID12 0x543A // PowerA Xbox One wired controller
63 
65 class XBOXONE : public USBDeviceConfig, public UsbConfigXtracter {
66 public:
71  XBOXONE(USB *pUsb);
72 
81  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
86  virtual uint8_t Release();
91  virtual uint8_t Poll();
92 
97  virtual uint8_t GetAddress() {
98  return bAddress;
99  };
100 
105  virtual bool isReady() {
106  return bPollEnable;
107  };
108 
113  uint8_t readPollInterval() {
114  return pollInterval;
115  };
116 
123  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
124  return ((vid == XBOX_VID1 || vid == XBOX_VID2 || vid == XBOX_VID3 || vid == XBOX_VID4 || vid == XBOX_VID5 || vid == XBOX_VID6) &&
125  (pid == XBOX_ONE_PID1 || pid == XBOX_ONE_PID2 || pid == XBOX_ONE_PID3 || pid == XBOX_ONE_PID4 ||
126  pid == XBOX_ONE_PID5 || pid == XBOX_ONE_PID6 || pid == XBOX_ONE_PID7 || pid == XBOX_ONE_PID8 ||
127  pid == XBOX_ONE_PID9 || pid == XBOX_ONE_PID10 || pid == XBOX_ONE_PID11 || pid == XBOX_ONE_PID12));
128  };
142  uint16_t getButtonPress(ButtonEnum b);
143  bool getButtonClick(ButtonEnum b);
144 
150  int16_t getAnalogHat(AnalogHatEnum a);
151 
156  void attachOnInit(void (*funcOnInit)(void)) {
157  pFuncOnInit = funcOnInit;
158  };
159 
161  void setRumbleOff();
162 
170  void setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor);
175 
176 protected:
180  uint8_t bAddress;
183 
185  uint8_t bConfNum;
187  uint8_t bNumEP;
189  uint32_t qNextPollTime;
190 
200  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
208 
209 private:
214  void onInit();
215  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
216 
217  uint8_t pollInterval;
218  bool bPollEnable;
219 
220  /* Variables to store the buttons */
221  uint16_t ButtonState;
222  uint16_t OldButtonState;
223  uint16_t ButtonClickState;
224  int16_t hatValue[4];
225  uint16_t triggerValue[2];
226  uint16_t triggerValueOld[2];
227 
228  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
229  bool R2Clicked;
230 
231  uint8_t readBuf[XBOX_ONE_EP_MAXPKTSIZE]; // General purpose buffer for input data
232  uint8_t cmdCounter;
233 
234  void readReport(); // Used to read the incoming data
235 
236  /* Private commands */
237  uint8_t XboxCommand(uint8_t* data, uint16_t nbytes);
238 };
239 #endif
uint8_t bConfNum
Definition: XBOXONE.h:185
+
#define XBOX_ONE_PID5
Definition: XBOXONE.h:55
+
#define XBOX_ONE_PID10
Definition: XBOXONE.h:60
+
#define XBOX_ONE_PID9
Definition: XBOXONE.h:59
+ +
virtual bool isReady()
Definition: XBOXONE.h:105
+
#define XBOX_ONE_EP_MAXPKTSIZE
Definition: XBOXONE.h:30
+ +
USB * pUsb
Definition: XBOXONE.h:178
+
void attachOnInit(void(*funcOnInit)(void))
Definition: XBOXONE.h:156
+
AnalogHatEnum
+
uint8_t bAddress
Definition: XBOXONE.h:180
XBOXONE(USB *pUsb)
Definition: XBOXONE.cpp:27
- + -
#define XBOX_MAX_ENDPOINTS
Definition: XBOXONE.h:43
-
bool XboxOneConnected
Definition: XBOXONE.h:128
-
virtual uint8_t Release()
Definition: XBOXONE.cpp:226
-
Definition: address.h:32
-
ButtonEnum
-
uint16_t getButtonPress(ButtonEnum b)
Definition: XBOXONE.cpp:316
-
virtual uint8_t GetAddress()
Definition: XBOXONE.h:78
-
#define EP_MAXPKTSIZE
Definition: XBOXONE.h:30
-
bool getButtonClick(ButtonEnum b)
Definition: XBOXONE.cpp:324
-
virtual uint8_t Poll()
Definition: XBOXONE.cpp:237
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXONE.cpp:43
-
Definition: UsbCore.h:197
-
int16_t getAnalogHat(AnalogHatEnum a)
Definition: XBOXONE.cpp:344
-
#define XBOX_ONE_PID
Definition: XBOXONE.h:39
- -
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: XBOXONE.h:96
+
#define XBOX_VID3
Definition: XBOXONE.h:50
+
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: XBOXONE.cpp:239
+
uint8_t bNumEP
Definition: XBOXONE.h:187
+
#define XBOX_VID6
Definition: XBOXONE.h:53
+
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: XBOXONE.cpp:259
+
bool XboxOneConnected
Definition: XBOXONE.h:174
+
#define XBOX_ONE_MAX_ENDPOINTS
Definition: XBOXONE.h:37
+
#define XBOX_VID2
Definition: XBOXONE.h:49
+
void setRumbleOff()
Definition: XBOXONE.cpp:442
+
#define XBOX_ONE_PID8
Definition: XBOXONE.h:58
+
virtual uint8_t Release()
Definition: XBOXONE.cpp:278
+
#define XBOX_VID4
Definition: XBOXONE.h:51
+
Definition: address.h:39
+
ButtonEnum
+
uint16_t getButtonPress(ButtonEnum b)
Definition: XBOXONE.cpp:372
+
virtual uint8_t GetAddress()
Definition: XBOXONE.h:97
+
uint32_t qNextPollTime
Definition: XBOXONE.h:189
+
#define XBOX_ONE_PID2
Definition: XBOXONE.h:44
+
EpInfo epInfo[XBOX_ONE_MAX_ENDPOINTS]
Definition: XBOXONE.h:182
+ +
bool getButtonClick(ButtonEnum b)
Definition: XBOXONE.cpp:380
+
uint8_t readPollInterval()
Definition: XBOXONE.h:113
+
virtual uint8_t Poll()
Definition: XBOXONE.cpp:292
+
#define XBOX_ONE_PID11
Definition: XBOXONE.h:61
+
#define XBOX_ONE_PID4
Definition: XBOXONE.h:46
+
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXONE.cpp:46
+
#define XBOX_ONE_PID7
Definition: XBOXONE.h:57
+
#define XBOX_ONE_PID12
Definition: XBOXONE.h:62
+
Definition: UsbCore.h:208
+
#define XBOX_VID5
Definition: XBOXONE.h:52
+
#define XBOX_ONE_PID6
Definition: XBOXONE.h:56
+
int16_t getAnalogHat(AnalogHatEnum a)
Definition: XBOXONE.cpp:400
+
#define XBOX_VID1
Definition: XBOXONE.h:42
+ +
#define XBOX_ONE_PID1
Definition: XBOXONE.h:43
+
#define XBOX_ONE_PID3
Definition: XBOXONE.h:45
+
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: XBOXONE.h:123
+
void setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor)
Definition: XBOXONE.cpp:464
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 91c53db9..a44cd1c3 100644 --- a/_x_b_o_x_r_e_c_v_8cpp.html +++ b/_x_b_o_x_r_e_c_v_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXRECV.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 b0488834..e9c2cced 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 @@ -afd0356fb2e414737dbcea38c7c8282b \ No newline at end of file +6ca63669978b108ea8fd430b01be5e9e \ 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 159381160f7848a3e2738c0a96558d03003ce56a..98e619329a7b992ea28ad81cf6f3c810d2eadd37 100644 GIT binary patch literal 12163 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 V;?VA?1!&bn$xACs)k>Iz{tuKZDi;6% literal 12175 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 U)B8TqXb&SVts+$;VH*0s0J}?6iU0rr 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 b20d418a..db819b8c 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,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXRECV.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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, uint8_t port, 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 || ((millis() - checkStatusTimer) > 3000)) { // Run checkStatus every 3 seconds
297  checkStatusTimer = 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, uint8_t nBytes) { //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:41
- +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
- +
LEDModeEnum
Definition: xboxEnums.h:24
-
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
+
EpInfo * epinfo
Definition: address.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
uint8_t Poll()
Definition: XBOXRECV.cpp:293
void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller=0)
Definition: XBOXRECV.cpp:557
-
uint8_t bmNakPower
Definition: address.h:42
+
uint8_t bmNakPower
Definition: address.h:49
#define XBOX_WIRELESS_RECEIVER_PID
Definition: XBOXRECV.h:45
- +
uint8_t bAddress
Definition: XBOXRECV.h:237
- - -
#define pgm_read_word(addr)
+ + +
#define pgm_read_word(addr)
-
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:105
-
#define NotifyFail(...)
Definition: message.h:55
+
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:112
+
#define NotifyFail(...)
Definition: message.h:62
uint8_t Xbox360Connected[4]
Definition: XBOXRECV.h:231
void setLedMode(LEDModeEnum lm, uint8_t controller=0)
Definition: XBOXRECV.cpp:527
-
AnalogHatEnum
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
+
AnalogHatEnum
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
bool buttonChanged(uint8_t controller=0)
Definition: XBOXRECV.cpp:442
#define XBOX_OUTPUT_PIPE_3
Definition: XBOXRECV.h:36
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXRECV.cpp:41
-
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:86
-
#define USB_ERROR_FailGetDevDescr
Definition: UsbCore.h:89
-
#define pgm_read_byte(addr)
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
-
#define hrJERR
Definition: max3421e.h:220
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:93
+
#define USB_ERROR_FailGetDevDescr
Definition: UsbCore.h:100
+
#define pgm_read_byte(addr)
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
+
#define hrJERR
Definition: max3421e.h:227
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
#define EP_MAXPKTSIZE
Definition: PS3USB.h:26
virtual void FreeAddress(uint8_t addr)=0
-
LEDEnum
-
uint8_t epAttribs
Definition: address.h:37
+
LEDEnum
+
uint8_t epAttribs
Definition: address.h:44
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
#define Notify(...)
Definition: message.h:44
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
uint8_t epAddr
Definition: address.h:33
+
#define Notify(...)
Definition: message.h:51
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
uint8_t epAddr
Definition: address.h:40
#define XBOX_INPUT_PIPE_2
Definition: XBOXRECV.h:33
-
#define NotifyFailUnknownDevice(...)
Definition: message.h:54
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
- +
#define NotifyFailUnknownDevice(...)
Definition: message.h:61
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
+
#define XBOX_VID
Definition: XBOXOLD.h:34
- +
uint8_t Release()
Definition: XBOXRECV.cpp:283
-
Definition: address.h:32
+
Definition: address.h:39
bool getButtonClick(ButtonEnum b, uint8_t controller=0)
Definition: XBOXRECV.cpp:418
-
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:293
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
void setLedOn(LEDEnum l, uint8_t controller=0)
Definition: XBOXRECV.cpp:516
-
ButtonEnum
+
ButtonEnum
uint8_t getButtonPress(ButtonEnum b, uint8_t controller=0)
Definition: XBOXRECV.cpp:410
bool XboxReceiverConnected
Definition: XBOXRECV.h:225
- - + +
#define JOYTECH_VID
Definition: XBOXOLD.h:36
- +
uint8_t getBatteryLevel(uint8_t controller=0)
Definition: XBOXRECV.cpp:467
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
#define XBOX_OUTPUT_PIPE_1
Definition: XBOXRECV.h:32
-
uint8_t bmSndToggle
Definition: address.h:40
+
uint8_t bmSndToggle
Definition: address.h:47
int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller=0)
Definition: XBOXRECV.cpp:438
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define PSTR(str)
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define PSTR(str)
XBOXRECV(USB *pUsb)
Definition: XBOXRECV.cpp:25
#define MADCATZ_VID
Definition: XBOXOLD.h:35
#define XBOX_INPUT_PIPE_1
Definition: XBOXRECV.h:31
void setLedBlink(LEDEnum l, uint8_t controller=0)
Definition: XBOXRECV.cpp:523
- -
#define USB_NAK_NOWAIT
Definition: address.h:29
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
+ +
#define USB_NAK_NOWAIT
Definition: address.h:36
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXRECV.cpp:138
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
void setLedRaw(uint8_t value, uint8_t controller=0)
Definition: XBOXRECV.cpp:507
const uint8_t XBOX_LEDS[]
Definition: xboxEnums.h:32
-
uint16_t idProduct
Definition: usb_ch9.h:107
+
uint16_t idProduct
Definition: usb_ch9.h:114
#define XBOX_MAX_ENDPOINTS
Definition: XBOXOLD.h:43
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
Definition: UsbCore.h:197
- +
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
Definition: UsbCore.h:208
+
#define XBOX_INPUT_PIPE_3
Definition: XBOXRECV.h:35
#define XBOX_CONTROL_PIPE
Definition: XBOXOLD.h:29
- - - + + +
#define XBOX_INPUT_PIPE_4
Definition: XBOXRECV.h:37
const uint16_t XBOX_BUTTONS[]
Definition: xboxEnums.h:41
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
void disconnect(uint8_t controller=0)
Definition: XBOXRECV.cpp:498
#define XBOX_OUTPUT_PIPE_4
Definition: XBOXRECV.h:38
USB * pUsb
Definition: XBOXRECV.h:235
#define XBOX_OUTPUT_PIPE_2
Definition: XBOXRECV.h:34
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
EpInfo epInfo[XBOX_MAX_ENDPOINTS]
Definition: XBOXRECV.h:239
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
-
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:88
- +
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
+
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:99
+
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 52a7132c..7f33823e 100644 --- a/_x_b_o_x_r_e_c_v_8h.html +++ b/_x_b_o_x_r_e_c_v_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXRECV.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ EP_MAXPKTSIZE

+
@@ -167,11 +149,13 @@ Macros
-

Definition at line 27 of file XBOXRECV.h.

+

Definition at line 27 of file XBOXRECV.h.

- + +

◆ XBOX_CONTROL_PIPE

+
@@ -181,11 +165,13 @@ Macros
-

Definition at line 30 of file XBOXRECV.h.

+

Definition at line 30 of file XBOXRECV.h.

- + +

◆ XBOX_INPUT_PIPE_1

+
@@ -195,11 +181,13 @@ Macros
-

Definition at line 31 of file XBOXRECV.h.

+

Definition at line 31 of file XBOXRECV.h.

- + +

◆ XBOX_OUTPUT_PIPE_1

+
@@ -209,11 +197,13 @@ Macros
-

Definition at line 32 of file XBOXRECV.h.

+

Definition at line 32 of file XBOXRECV.h.

- + +

◆ XBOX_INPUT_PIPE_2

+
@@ -223,11 +213,13 @@ Macros
-

Definition at line 33 of file XBOXRECV.h.

+

Definition at line 33 of file XBOXRECV.h.

- + +

◆ XBOX_OUTPUT_PIPE_2

+
@@ -237,11 +229,13 @@ Macros
-

Definition at line 34 of file XBOXRECV.h.

+

Definition at line 34 of file XBOXRECV.h.

- + +

◆ XBOX_INPUT_PIPE_3

+
@@ -251,11 +245,13 @@ Macros
-

Definition at line 35 of file XBOXRECV.h.

+

Definition at line 35 of file XBOXRECV.h.

- + +

◆ XBOX_OUTPUT_PIPE_3

+
@@ -265,11 +261,13 @@ Macros
-

Definition at line 36 of file XBOXRECV.h.

+

Definition at line 36 of file XBOXRECV.h.

- + +

◆ XBOX_INPUT_PIPE_4

+
@@ -279,11 +277,13 @@ Macros
-

Definition at line 37 of file XBOXRECV.h.

+

Definition at line 37 of file XBOXRECV.h.

- + +

◆ XBOX_OUTPUT_PIPE_4

+
@@ -293,11 +293,13 @@ Macros
-

Definition at line 38 of file XBOXRECV.h.

+

Definition at line 38 of file XBOXRECV.h.

- + +

◆ XBOX_VID

+
@@ -307,11 +309,13 @@ Macros
-

Definition at line 41 of file XBOXRECV.h.

+

Definition at line 41 of file XBOXRECV.h.

- + +

◆ MADCATZ_VID

+
@@ -321,11 +325,13 @@ Macros
-

Definition at line 42 of file XBOXRECV.h.

+

Definition at line 42 of file XBOXRECV.h.

- + +

◆ JOYTECH_VID

+
@@ -335,11 +341,13 @@ Macros
-

Definition at line 43 of file XBOXRECV.h.

+

Definition at line 43 of file XBOXRECV.h.

- + +

◆ XBOX_WIRELESS_RECEIVER_PID

+
@@ -349,11 +357,13 @@ Macros
-

Definition at line 45 of file XBOXRECV.h.

+

Definition at line 45 of file XBOXRECV.h.

- + +

◆ XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID

+
@@ -363,11 +373,13 @@ Macros
-

Definition at line 46 of file XBOXRECV.h.

+

Definition at line 46 of file XBOXRECV.h.

- + +

◆ XBOX_MAX_ENDPOINTS

+
@@ -377,7 +389,7 @@ Macros
-

Definition at line 48 of file XBOXRECV.h.

+

Definition at line 48 of file XBOXRECV.h.

@@ -386,7 +398,7 @@ Macros 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 10cd6192..ca6d54fe 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 @@ -1b17ab2dd30a29c1f644e03c41d46777 \ No newline at end of file +c63f097fed6791ddd934ab2f88d1fc85 \ 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 9374524144ed641e0090aa98e2c1dbae25c50502..986a93650355b8de0ebd221c72982fd22905f38a 100644 GIT binary patch literal 4611 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 L`l<~ocG3R>>M5bW literal 4625 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 f=x2F>;d@e%L38Oj$uKJ5R}V-eClt`J 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 e4e3f6bf..63f0f207 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 @@ -b243ba8a771536bf11d1fde69b3f7cff \ No newline at end of file +78db048a5c5881107b171aa2f31c9649 \ 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 d6a2233b865094b9f2756e95d314ac299babd50f..ee7023a2a08a9ba9017ed5515e79ddab7a507649 100644 GIT binary patch literal 9230 zcmdsdRa;wKv@QfM4n;$O65QRjP~05~CAbua7A@}X#ohUEcXziUMT!S0?$*6}aW2pP z0sA6Z$;^CKri?kpD=S=8SqAeB=^HpWI7~TNDRtmF1-zP3k%4!8PUA`70`H$4l*JqC86mK|Hlx;n_%##Se!U2C5vmJLNXOjgliE52Nd+#TbMyT7=`d&6KE(9 zEt@NJ3zE5mSNG;Fn~Rh^dzY~0@QUEI{%d?AW3AI`>g>nby0y?%j)2QlTKa$)Ckqv= zv>)y{qW_f~;!dh?c&{-DytE${tvL=cymXHXVyctyaFi)KXdtRT8t4b|S7qD2ryh$2 z^I83BvJ;hy#J^wz6)F5Eetx)mx`PNRh|CfnEZ3SYba=RA^_owd_&oh-zTOI@Agw>g zlFzb=D%iDLsWVR!{qDJ!?2CZmKNJl{(TxE?glu;Zr9~WBT|?lwVx}0Q>cPaQ?Eg!X zcz$eoYvj^Oz2)ISj&CtCCaG$+u*bw~m0`PdBoSM&=gpCtfdQG_a!v0^Xy|`>_3C?L z$$QnSJNFkm4PTG71wAgQixkt;r!=^2m*Y4sr^HmYlm)4&gPeCq zBvPN;Uv8F)g!caO?&{T_J7JGE$JeLr zXX<6@MX(-!goRcYOF>sy9LB-a9S)AQ|3eS^J;Ig!YJ;4QhTQS#dV7QGp?aI|Ur`Z{ z%Yp4PV9_qUYHMq`p*?WvqTdDg#(%_;^4Lh_<>g)P{Vm&&cFVNVxup*3uE{y3!e z>OX2Rkt#8oNT-vzd*=K1$>{NFT8w4wevl6pCcRCql%6E|a;>pKIXm9`Wl8yVN+y=P z$a=nbR2p4&rsefv+Bbc+)$NSD(e77Dlf$Mm%crI!k%y6ZNZF@m`-KK;4VM;LrSzE^ z<9=$>sSG|9UVXQ&P(((}Qt`@9&AcTy&krsP1V1Z3$GH4VlCcT$LMsJ*2yo*D&&E&G28rjYDlyDYT0&|!I z4bl-Z>r&F>uhz;ZGbW7Y%CCOHMz$!`EK3lO2ZGdkHvc1MEY!BtT2)Kz5e9J~zUklS z^s=7Gm8h%t(?_>{S=2Eq3p}qULWRXRsY(+s92q_2KbD+K21duxC=jm189N4gkc)Vl z@vdsA?Lw&MffH63r2f?UNRG@ha~z06(KPYNq4VR%h_~_fV`8#gyK+iU`{j@KO^wm{ zSS7-NtxyDGC;}t>0=F!mEAlOBAVUNNvK(b)S_1^C7r8or<@E+8!2t&c-fKVWf?O}h z$H(uV70bp42!1^>^BL}6Yjr{UhE7cPsmYdis1fgep-kiYcP~P{K8l;prX(>pv~kj3 z0;BXhF~6#U6oxE+om0>6r`tb?5I!UW$rQ4QSHQq#v;v2X&bK; z0=5hza*P`P0XnQUlT3%M2k98{udo>jLh}CM8hBd8R46in2=~6yIm!z~MYZqqg-rS9 z&Nd8<3T>9MvwrEmOw_&tqL49!vg=siXGuwC0RoufA>QJ{AFklP$=gZx!lZS$?PWI=xokEYNv@%^7) z&20X);-}s!A}jQevR7kw_oXVspgil~9B2XFgPAI(-DyfvouQsJ1ppG`_{~&=63ja2S>FF-(Kd=^y&`-vQT^LyZ-cAYC ziiqVj{9|cYW>gN& zOmg%N9R|OibdTx3`V|rd0qWPVq!R>+*dgIZ6T?^PMAi?9g9RcGnTsFGs3lk1!)>6betJtQIE;pah-XJm zCq8zj&1+)1GdMMWk;JTrT4}JN!0ml@*D#UQu5iMnPn9z3T5`E})q3+C>#ZZ|xgFA} z<|yCheaPn>N30?aB?Gl#W(hs&qfTEM!f)q{2!0p`aLOj=jDR4PZ@7 zUJnwfCGnk&XQi>`w_LwI9ut~;H|U5Hjx-F}gYypuDrTam$K`G?e+HCXt5RRpHn<8# zU1<54gtIXJV&@ZD)y4s^ aA#ozd|85^2p#Hm6<`8Qx*D+AGV)^ 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 OoZLrcsj3gqfd2u?q`^`E literal 9240 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 KOIC@S2LBJYy24oi 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 48f4174f..93e844bf 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,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXRECV.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
virtual uint8_t GetAddress()
Definition: XBOXRECV.h:95
uint8_t Xbox360Connected[4]
Definition: XBOXRECV.h:231
void setLedMode(LEDModeEnum lm, uint8_t controller=0)
Definition: XBOXRECV.cpp:527
-
AnalogHatEnum
+
AnalogHatEnum
bool buttonChanged(uint8_t controller=0)
Definition: XBOXRECV.cpp:442
void setRumbleOff(uint8_t controller=0)
Definition: XBOXRECV.h:162
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXRECV.cpp:41
- +
virtual bool isReady()
Definition: XBOXRECV.h:103
-
LEDEnum
+
LEDEnum
#define XBOX_VID
Definition: XBOXRECV.h:41
void setAllOff(uint8_t controller=0)
Definition: XBOXRECV.h:153
uint8_t Release()
Definition: XBOXRECV.cpp:283
-
Definition: address.h:32
+
Definition: address.h:39
bool getButtonClick(ButtonEnum b, uint8_t controller=0)
Definition: XBOXRECV.cpp:418
void setLedOn(LEDEnum l, uint8_t controller=0)
Definition: XBOXRECV.cpp:516
-
ButtonEnum
+
ButtonEnum
uint8_t getButtonPress(ButtonEnum b, uint8_t controller=0)
Definition: XBOXRECV.cpp:410
bool XboxReceiverConnected
Definition: XBOXRECV.h:225
uint8_t getBatteryLevel(uint8_t controller=0)
Definition: XBOXRECV.cpp:467
@@ -128,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXRECV.cpp:138
#define MADCATZ_VID
Definition: XBOXRECV.h:42
void setLedRaw(uint8_t value, uint8_t controller=0)
Definition: XBOXRECV.cpp:507
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
void attachOnInit(void(*funcOnInit)(void))
Definition: XBOXRECV.h:223
void disconnect(uint8_t controller=0)
Definition: XBOXRECV.cpp:498
@@ -140,7 +120,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 0adea0bc..0a847d67 100644 --- a/_x_b_o_x_u_s_b_8cpp.html +++ b/_x_b_o_x_u_s_b_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXUSB.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
- + - - + + @@ -111,7 +91,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 3a3769ca..05f473ea 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 56fff921..d4f8925b 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 @@ -c0796622753a276d2229e35ba1e7b14a \ No newline at end of file +807e2c62bb3b87c5cd4d582d24faff91 \ 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 92c907c7ffb1dad4c0d9b8c20c73d6856bfd07c8..750b45c14f8d1e2d948d3e727c1c1f4edec3a5f1 100644 GIT binary patch literal 21115 zcmeEuWmi;hxHmE2Akxy^-Q5im(%m85-QA5yNq2W6-3`(y9nvLT&*p#D^9jz|^TNfN zanI~~-}$R+A{68#5kBI4gn)oRkoqE~1OWjl4g8Y=!vgQTbbKoZ{y;h@Ns2&JP2wFw zKnOudi3zK?L!Rn>$WR`*CTz(k=(t0i`M%EkMY+r$OcEK+2BR1mp65>`UF-iPOfcNv zIi4nmr~^~D0P_$()^Tl5aAWVTw@oKO<}4v4<=gGG)YbY~C;i5s@$}4}nO_aIgit|{ z!a~T%AUxt4#@zhR5tyL=-f)lfN0$Bx7wAt!1nv*?M;_IHNci^Og~1A=c*yS;5n+Ht zjHT`@ujb3usg;Xl^(sX_-Z4Poa@rQ8v0HgIqf+Z4Uob-nkSA(w==;66jQ*gEbEWO_ z_3wUpx;sp_>%0s~mPUgKxFLQ}rf`c=nKr6y2p+u;5;BxpFz+k9=IG}mmgvN)t?`=hcRHky$Iqe(yL3!A` z;hT@C@6DW+{Cu@H#^(3xZ8=whvNw^QG8jilSUIdxs-!rQKyFMGZM)I=RVIa@(C_sj z>}9IL^ueR&F9hiMm7SK zJa134)sZ|TG&JFsj&0z2eVgbEsKte06H9}cohzkDa5u^fm*cYeNipkID$vsvX>sWlG!^obO;VGk;0t)CQpjh?5)%`vL9G->{V>PdrOfuuYnd+knod&?hD2D^(ttuL zL1h&Ag-^ND+v5?K0F`(~z}+pzlIj2LrRdMZ3BG<=tky4vL!(ewtkR`cuhLv9GMTgoImo~iQzQAIhvnqbuvRwA(KKqW+xH4;C22hL{wJYeib=te11F_gPTYq z{?SVRp9cvE$=}PJq0bl?MR84feRGmlKiHKR-X9~7XoEjK8?Z<+MmD|d)^RD>yRwOV8l|2CP$U!J_bB8Q6nT`U5X z`e(r__9;#YNObTtKoQBQUt3bXj_^-10# zA$}u}Rs4_B!KA7f3m;!b%?t9Cj(wgx0SQ7o-`c5m1MEl)5wbt{J}Fu$PB0uZ@U~pO zkDZHog0i-07j!As;&x6@DEo7USh$;IK6wm!ClvubSh8dzmqWTRs%y9p}3bst8V`G`eG@Cs7aS75(JB&B&IYLeRZiMqy?#*qaGDHUdheSYGCpM2E>$j3zzlRStYhENe7SO~<6hp)r!y>%PFp;mi=Gb)Lpkn{cV@WA#q{;L zmxD7{I4)nytLWo;Cbohg0#^!UQq09C(%5C_pKMyC>Do~K)hXFmf@u*pj3``jdL zqh=yxNz~Nf4JcuN9OuhanF%0;Vbo!^%R_37hiLMkVJ5=}eM@#zew$lC2E(w(uRsV}|>T}JB#hOu%0*aXurguAbB>J;g_>8Pz1Dpu%) zBl2PFD>uL0^efB!&=)3JLIEZpx8)qwKw$u{nETUdb5fJ`&Ts=H42nN4r?=2tPDwWl zS_VnDX*!2Z;;rY)<4t6Jzf-&k386IuyGVp{DzY#^BspD+%CMMW0_Z0Zlr?p;-9}Z* zS7h8_>|)uUd0^ET9Cno~8r3qYpVZ&VwII~Xe^OdFxa(PQat#6t4b_^%YQC(nZd1J0 ze43;%W8^1m@iv7aBFq_jnq9jX+bl^Uj4}l%l_1x4$<`7w4@}j1agsnTlbArmU<6ai z_ka$9LWk_q@(h9wE=5dUCDH;DecZgN`5YRGNeD6zY=oGE|A=EBs_{zFP4__zk|W_a zVm=-+*OKz>*&l6sQQ?}wXzcuPrv`HREEqGm?WhKM!I#9Ng-V%t%-#y{UOpb32XWk7 z!zB~lP=e=Djp3*OTAiG|S52vykCwkHju;-KG`hV%(aMS=-i`O&A2*d>&KC2pz{Zz) zu{<1!ohk{Ot?~}z8lJ}3NX$@)-0luJc*Eq4{v1LX5P=`Na)6b&kg%%`oR7|6vQ5E= zDLF$BaWCO#kR+r0T;tSn3X{%RsGM5PIR!sFBSb)~t9( z9SIGw53S{DqV8iTjP5r0qi$$7oj$@bxV{`)WQSYZf!pBX*l zpiU+p2XUJqc(>;CSYp0Nw2-!}(g12j0f7Rrz#x7}Z0PS05&l6)RGoM*!}8={s6c-! zFj(>sM=n7Ic*H;~00Ic}-OsoH5WpS*cu}=Q*7}Y_!cmw)qES0ZpqYb1i%hSx6>f2y z`H|ZweNaJxu#nlP(pZ6gJ8n6l57+WDg)&rAFK}wjQ`t3sdIz%#ZDFx z=W5)}p>9Q-sdJvNN{lIAP(lB|;lM5xssj(ShREOpa93BM?^ORmp?_d-?p!|c;(sV< zNmvM6h_65<4YU*l$qxXO8}s2t0Fr>AT#=DQEIxdWK>ZI}0dPf{AIFg%_>Vw;d{D5$ z3Z!@*@DxJGze$OL|L<1+s}4ji>-v7<Z1qM84AXrqciwOV}l=UcH|CaP1}$HT8oM zI*BoxQ!8Wbz4JX#z8Gv7tnWX_kKLZ}%Y03X&JBh`QwRjXy)N1#tQ6n*^U#cn7!Nk& zH`&nM%O4aJ1`64e*2pKX6Qn^D${gfbFVE13U}0m6%L`(>4jdfvhkr9S7qMJxDG0Mn zGJ3}qU|@Vbk@prV#}xC#h!JHzAt2=ba*0wJO_ajl{|*8Morw^bD*Rj&^je9z;o)Dx z$R#8sX2uv(oKhLyPbLGo_iwP*`G`I$0t0XAs$rBs7J)8#$P`5O{s`14$RdYZh8D9$ zP>fy1y^$t&QH;q21yX1pEfUmnz*KCH5gPYvXtw%vah1-=I5Bo!g4N-DMV6q|M2AbN zNAljrXJ8utyTCG;%1V|_nVc{cna=&1M1!qbtvB4)DCO|p2oTit+l0g%7RW{DsS@dT zaI>XqtcVE6mY)Hb$M^71S5r5=U)XK5c(h7?2OCQ<2m^P1Mg!K09#*sSVQ-06W1t!$ zi_^YJoyjyjm(2G-f5rEkqR!N$^e2m-^jrM-)t+Mc-3aFYcNyHCM2s|5?A6E*D$8k+ zhCh0Nnvv+BPr}^|a?Aw$o?-yXOd}?8FHazqoSA)j%2laaGqF=O{L)G)5uNk=aE+^! zqCx^rMTWfQ8F0Vag=?csm&at(ViG zAa{_NIs``ppg+_#XATY$Z}+4T2*wszEuPh>=duyd&9~&qWea@uxQ^VA-9b)C8;|rK zrt08gi9idxr~m$sgifh}Xw&We(b|ZAz`k!8)4&Th9EVc*_Z~q6dc>FW+l;~cxZ^<1 z(mLtD>~8i1v6+m1_5{w)QuFD&g&_d6$pFZ)h;zgHM;cT&)8Tx#w zTBX+XcC~(&92$jePA0G0J2Wf>sLWi0g>spCb=D{*3W_jrFchJZODjCxp62sE0kB^= zi_fFPcqq2P{nCiX@0IW7WSLbftHbMV=4844osB78x}B}%D&|W}H`%N%L3>JDF4g2J z8JUbFe=R&;t`9Sv%&?$`KDf$>HJwN+)wc>fGrGUnD(e7v$K1eZA+XW4LLIi!WGTiQuc;^KP5*e@eJ4hx*`Gr

(BGu~q-pud~uN)-D%t975R#u$^yq!LP20sN(vK=IWQK%9}u6}~^Ao4lVd zhmIZ(vi+LA0o|bW2%rFZV2L+I<8iZSwY&C-&Gq)H{K>O!Sj@CPnxmfIz~^;sxlY{$ z;0!`Q2V|e(wokwxQjJcQ+=30?rMdDKPrUbz8)288&zP5qbip~yQQs2yL(a{Gr%Kp?ji;k-Zo(_9mSLFWrT zk8?Oiao5)JFeRS^&mZ=n&K$etdb45xU6gkoj>TI66FeM0!2i3Vr7nP0Y3ViVg5z}E z73q^4>~MwtE>!83hmTL^OGa>0xWsvfA>u26P+6qB0=VTH`xj>%4<^3?Q?+n1lUMm@ zu5@1Mb-8t2i{YSaJn5a0FYhR@H~t&s|5ilw>(PJjEk`&=<+IaTe?|!^3Y*1@ST_C2 z4M5)KW(XPK!-hYIpMvX%yn>_ASfo3i(WcC8!lFNW z`EbvD>X@#Nu(I((C?5?qNXpab}~)nAqezb&h+|GUnzbA?$xJ z1Y&#YOeb)x-tb1KG`9@l;NWU&TvzIx50!4#fYn|OZ&IJkHO?ZuTG_Er-i&k#B;@R6BA{b z-<&4`HhC0m#a-9yV|hqK`HesmJfN$D#ut2mg9;$e59WA^;at!0eR)&_I7f-s-I+A4 z&+!6%arGzjYLp!Q(57^BTIpN!CuFwYOK;<&gjPy%1pJ@XM?azuBn7gDc&or~K6azC zY|ZD*F*clj5yfIMfB-0~oUWDrCPi&VbCR~@;fmctg=S@%1HIhaaTS)(Tg5w`0_ZE# zF)lF!9(lu}^`g1qK=={H=x--~97%4wb-n@qz@T8Y4xn8aYOWd@%z0VHPha3yS+syz zXgu$IoiIPTWwByh5ajiz!>bv6(Du(S%~W^IRP*u{K+4f{r?&F|5HgS)P#nb4(r z(UVk!OByE18xHD>qz03PQ5n_^Zm+>&mX5BuzQ)kC;nkn&lDDUqVYOmkxMfj*snuex z%*jP^z;?p>HC7SPL4oRoQg@^5CObZ34L|vV;PK$7YJFpa^gNjBLJNZV?U#^AJ0c} z1=w}wSw*POKV6Z7`!NGLid@#<5g0#}=WbpkrL(85cmKv6Gd($~Wydti+f};DvN6p8F5)v#{ zyR7uBeXLF$Vm#>`f-dDHl*bkEf;{? zA)fQg?^~iIydUXCk_OqsRQUd%0T6iJ&KmUkc+BYly*m{WSr&+)*T^*fL*=d(3-2` zPf8kKKO2`?FwIU5da!RyWAlCX6lbE8dk*3+7UUHi=A%ze21C7u0N;>)x&7z*-&tEd zfTj9m$s8I)_0sY7I}qSydW&T_6hQU5ZINt_yLR5r15B=<_7Eb8_;+sNAPUeH1lta; zsoW%5q`IOP`rEHRHz?)>ZD$Lll$ctR(PYTFRx zC9A{$c?Scc?HlCVAGc%km4*rL1=kN{n%CTf2w`qz6IuKS*)+?^ulL3fNmSp1l2lj^ zLohoHFMBuEOBJMnL+%rRqxf`ErRjU!%n}>FGNDi_Rs)$uDOqiYTtOC?A#)U{p7B}u>eT*N67h7-7E$TDQ!rj+k5PdG6=RcB;*T-*V+RaokSkt4| z!;gv)=(PL!A@E)_eUIhp=QIx{i&d@_JIwDm3h~bPB^C4vVNl%|L%Q6fliQ zgf1t)*DIlJi~Wz+^S5=30~EP^3^{-6>AX)b4+jt!U)#rnukFf|Ot=9367`pZ=vp;* zfLsC;azGAABB^B6uHZ9@i9!~y+am;?+>{$N85wcMqb0dXgMj&O8M?8x%G>YIW4vwz zo}D7pipWgFP{N{AKog4FkGvmDtOW8`{BG^iO(uoJrdyp{R+?;>Zq8nyCQ>gk?Jn^~ z$F5yYoRs;{f0|?z;I9i4QGxezMKMd{v$;>S>nJ*|q+!m9u*nK3WRk=AY3B_CADBBH zOkFq(-ZHtz4FP#gE3Iai;DZ~P%*qD6y z9tzhKVja|-z?YV-_Y3YUilfPknW&nca0)k3VxIJP|2XwLuZ>C>} zA-n%zp*CrXzaGods{JF*IGrtXslmn^@6%XXuL=RCbVRlzVGS`8~0sh2^`I6OntY%f$$-mSG z^k(8H9CrrEHA&aw24iiCKl7`W`vQIrJy}cd4Ox;>#V*n%ZlbMA{Ut zHm0#%$42}MmANui?v(}$A_Uxp1hr~`;ilBS2hfO#^R;P9`M?(e;chGNJ%4V$EBDDx zXnxe9e)SQ1PJzKWDKbu4JU)%OT2>_NC-b~X;%W^CDs9G!Jg++fk1j~1AfinO$S%sn zouTUD+2U$yQnL>}iROZ$L{bR~94gg4Ps4(0SNo;PoYaf9JA;*G^5Q7I3%C}xL`0j5 z!B;2C$D=MdYrYYFBSNXM(@zlEOKuyL#X4<oX0=NGV2bzJ8NsE>=lj0%S%OFMke<5Z z>#39yR$cqKGHj?s>GpA zw7J*DS9jE!tZmact8sBF+=|=W2x*3TxHu29{TR3_ak8S**q`KLw_GBX>?t16bA$19 zlj$tn?(9PUC$*7o@I%bDwt=8#H zK=H3M$hqvHYBiov)c0X0t{UYTs#|&b1L3%dym)g(Od#o&%kit)-SBMf&NpVu<~&kN zUs0-|n5Rq@Gr6x^IP>F>kvLxag7(k9e>Kvz`Ea{3cKqX8UB4|>%wIvBR4G%l;mRgz z4X@Jc7?U^|tGqHvb+K7>4Xnf}Dn;Y-SvDHd(x=Y1T%whFmPy_uWBKFIO`pPM~;n684_0HAcS;cwkQdTu2iA-KP6?cp%CR z%@sllYzs1)MEtP@=@f&_`noNpo3yDqNEmo}#Y;1q_e}pNx*Aj&quqpOCO+j7<~7Ld z%4+sHz#E_j!eyJ$$A>DSOpL-jSEL}wm0zk~e9|eO4gdHa;1pDy- z&^0jxCC-IMDNL$;z|&B5K9fPWw^oaNbN;soBn6Nx{l9cpGu*wA9|1l{7|w9707;() z1T@`IE3qOx?%uyEjgrsY{cU21xQZqfF1vuyKAHqi*ZZ>J_jY-S;y1A3w)%W{u3)goH5QZai!;qc z$<^P<7cEFuiYkR}S!PNwTPCySFRej=9zeE`L2MvdNvbUmv%OJh5U<$(BsfwbA!n(b zIBa-|_+i-ZwJ}yUfFfq>rS*gu6!rZEcM=9Fz&P@naXE#U0SA!J|z${Uk!GbV%XFEPL`uI?a1=QJMt z#NpYALyBL7L6nTz9wlULjJvo}ET28uHtq@tym!XlDIIqrS*qL?yjmLl?gmr0u~BTkBf{+bNO2W+-r0*L{{qx`Ao-4V2bTpk+H zY|KSK>NJ#>mYN&l_G<=`3g`Sy*B zH?S3#lHq#2!^;vgnqvbH8wQ4c6m08?PkZDo?Kj%wTOZWgc;;+KN=^-R3_OgRP3axf ze~rYML8S}RYP2+|lpz(uWYAG?$o6~X_JSOhnc~0010?s%4kNp!{Q;I1KqLe~yUF$g zG<`iSGzu7-ON*$7Ij5hjW@>lgg#4at9e`xm^3CkickhOQwj&Q@Wx8^d1F9S!CLBo* zK+`5`kPmzUd%xT)9u2rXT$$W3weUwXf=L7GYjpulvzO2)30MlVUgsUfgD1n^NsnFu zfla@;xfXP(P;>ktA+X z%oZUSTfMG@`Xl9iM!6iXXXgq5WMA4dL^QXPrCRT$IY@GCDBWo6efwl7O^4S8BOXlUUlE(1c zAD(MrK8vCAb|=$o7Y*hC5gAJXfBV3vz)!ybMY`RmF|(1J%I)v(+-ZSSQY{F~Rsika z#(Bg}k!@7%gPQh84D^ol^I9bEpw!4{)vLb2m^-m=2pQ;m?4gTuDVhQ*{9$=@r;>+p z`XbGbv$1Ku1rxYPnOT(4H1=$#qmF?RMaXH;RvMc{0!boZljq+YXFrhAX*X4@=x4B5 zD3t@Fc{IPU?{YX3692)@N!Gv~ugUP?YA-V122km@Nrc=pVeHYD%42wVT~A70xnjTN zPL9IeHpIsxyTbB|qNJ=eTGdzohV_2ED_7INi#cWNdd_R<2hv80dlSj@=_JAKTg2W# zg2D1evBT2^xEk~PLw3n_BO{fQTqY0tDRgbD0H8iA(PwV8fP!!TPUk;<3tL>G3Fn5a zY5*3)xP5^t?dNdV--0$-{T$UcwDu+hs{&}@cSXdBTU&AS0dg+K7?;?SE4VlaR0=u% zkF3J*ktUiz`szKURo{eQXX7LEORqda@H+;RW{=cLD4-x-L8?!UQmd52YjrN~&z{wr zPL%1=Jdo`wJaTBG?UAT~{9SHTo}nRpYHi1=-n)>?sf;Z&Zf)9Rumi@X>&|p6ef8#Tec>T z%K6HdUo3Hr?E%kLI3jTML`w?W*4X)hzEHVx!$l4LBXNS`Ks0BGd&oqfx|qJ>dXm?B z{d%_W3pIoLW)M$JR(M z^?lr{0gmeLl7u?+>Tj|{dg-AGwoCSjNu=DG;hDWm8Sof%!@e+g)KyS*(z3Sn-HG{t zc_3{H-r`B5`u*7wa_j^Un9BsQk{#kT8_lOhWLyt1_kxUJYC&NT!kq%+Y3xy(BC>&I zC}1Qc^|855pC=k@=6!$P6Z{zZ&lFfr!{jJL@}X-eS3)3UDZ1mu3QbX$qd8*x_($#_ z6OM1eO@vV60ZxXFEXHL-XfQCJ3I9w=Z|Xg3oSAI-yy+hwMl z6@ zy9>l5G%WO^Fd3^_P}@&$e4h-$EA-FWl$&;4q9LLmg@3~$5ma1+%^-@&?O*^+-wjoW z6l#kmr=uew(hs$^2ac}DVL%+wZ1qfMGK2y=jW3$q=Jdio?vuCBA%@nF(j-)BHJ_{W zyE<1HO)9<3u5qLbviQBU#Nk$0ug1U^34I3v_y!tvrl&R!FLzx#^B5dIYHC_zS50cZ zW`t}UF#~#OckfzONXk5h&MIvGW%gJvUZhRJ*qs)(c~CR-n-pEerz=m|X4cQSCG7m%B}EbDUwwrDQ?azC(-6G!!p$Bt8n*%SdggY`5@ zw$b>-$$IgO9$^>DW&vh~&cl_5&kSmZwc-ZEu-QjUS2|X49&5TCG(JTM@1qp6Q_@Xq z9fJ{n)zE23TvRp>bMK>A8@-|86Ct04&obwytMUrpNi>(kc`S0a>45wL2vSg@`*X14 zYSRxO`{kEix;5k^l=dFHtR>oX5{Yn2lDJo!G7VUxq6v6|;W->1U+NhQkl8d1d<#y^5c}nfH`<$U$&sH9 z?0k3zR@tG+?=uw6)_n%^hgy4y1DYq@n>hbUCF~l+_^_AP3M~w0Dv*(o$ zoXDMrF9O-4R8yI4!p*iJ$`PpC-m@?63%>wHy6)o;@TZ#HwYVCb99zuCywLkZ1p+>IJ?u10+S~Ej*e-*qbljydVsD6K)BJyC zdOkW9f^w|O2wS!<5zt`w?Kb~47;&AQx zuGe2t9ep~=MnNr!5LKwLkwBocH087$Bj1F+o58qzx;CWXrN*n0hg%)q- zii5AZ1Flbw&wpC6=(frFz`5DyOH^)0Xa@jG5V^Q%p;|vWlk{62q2C&E@xfm1rs(F) zVtI|^t#*UwP44D#dz{yavPeW>v*0MD*~H2y!`=A>3KYUNySHxJ!nQGyYkA$aYCIp_ zXYlT5Qr4el^xVT)&JW^#6LV78D5Ekdw)K)1Z2+kTAWm;5{9>(DW!a^G(%oLlSiR)+ zx06%PA3yhl8wUEp-8>+F(I>&M~iXn-Zm+S znZh0rU8mi7hnpnqNbxlG`VjBt)oD?{M}E9~tKXy>y!lT8pn zF`=*gy5V}cj>AJUL?V>$$CjgF)bGqcLAj)0b4q13_Z*)F;}+Zuw=nnif1) z@sOdF8=+3D{yS2epbu^@1fEk>rgmzzVhaed>{Bc%x4EM8Hx;jDc8)elxcyFO7lK%? z*p$U#bc4&1?4}H60aS9r^t6@hj!T7zB~kdvX6R@6sZAME}!3P5lI43vgxN(>kH(6S7UorUbk!lRz{NiXh114B4L~RrK`R3QjQ*u9MweoKLSo$eju}& zI_^B#Vr|9tHyfE~9zeX2GsW^fLs7$uC|P()qHyHxEE~Vj<$kghUVS6vQ(6dsKKNVR z^;&rL=h(e~PacD06^B2<)F1^N&{$WRt1DtLdfvVUnjteKD(H3j$~UekA56Hz1{N3k zr}ty;%$K46`&LUpEz`vA2^!3y-fdi@0m#BugZIO0&S8BsuO(G(yXz@+ZvRZT?AG|t z;|8MvNM*+#-BL~LX%)s9gBCRNgyihiZ!$>qxgwgu<^O(v2HJ0QXv1L(9RKu*REps|EDNHko|RbKmD5(gVZZe-3F$YO zbN*?)W+Hkr`&RskBGE1BFz`FRvl?cGe)o=a7@{hWw&|a&OCy<>wus@hT`Qi>S1*4# zEHW=)>-`LFu+_~%rI7vNbYR=u^g-Ksv05+>Pf45f9b5xnw!i%@F^FzDIuOKmfnJ&h z0bzQ&JD}^z!dvujx}6#|CC=*%l11?y3K(7{&l^KF`!$7SEQqet`yqE6OIBr6=DeB6 z-V)4SN6UmHoh?xKU6rTOYP(->&UK(dbK-bpxCwe`L8C$g@o3&EdBq2^jeA1x>}bBN zX?agz7{$NB@pPq6rEHG!GrEZ)p%Bz^J7^JwDMMj@;`oVw&fjdc3C;Op(*uXQF6P+$ zfr&C%wp^XibV}k_IUB;RbE z>3-Kfx(q*EQ4opf3E-t-1!c_ZR_PG<&hE2`I^i`zf>4W3dTv%*ojAWZ$(!+B5=Z@V z{mLaBCIl-5)iQLq{`3=_3#nyDzLLxO;A2jUpFX&dSGiXKo4lQ|SoY9M1TG8`FdKJg z(I*(wW#fqgcubJQPWj zz6&mG($n4E5?JznX%JVMikYc%pNe=ko!={+1upQVpeq=#skWUI%W7J~e2gL@{0#-8UN0e~STKwgEe@ro7HoDnw zp`8zTJ9dWs;VGr6<&J9Hg*Hzi`3>S^?&tL;GWp@;T(V!QY@$M`oUKtDyzQ`Z=U@jG zW$dt0IW1KJSch|WZL%6md`qz{H=$dt4SfQ4BxvbRG8$Z@kHhGj? zz?lZ?oVOVUEAdLqrpVagA$M6VT6FDFG!hTYJPi@@(tPM^8Y{cF81gptbY?|9<$ger z1JS4q%Lu;Ajo2Qr?+@7KiAjidGl`TUL^5(qr!IHL)?2DxKV(F6(A2K^3(5VwqR5U* z5De|sv!*tNWCZ`f<)D+(_nGI>n(8qeCAct;=jvdNR#1TbL|tC_1I?{B>6@WLgf$1yO@>LemQjq*k(f)r~;H;^sWRorjk`3Q?TT3iG+ zH0*Q`fV7*^NZZc27lH#Aa2~hQFU751%?cKoEh=aeXZ{VO)SvHuDZ9Es9Ick!A~Q#{ zf`IR{7(zTLLdNmeSnbKTr!IPFI3tepBZuRO`eFldCObX1dYwjN97zU z#d0W(2ij<11LNe(%*X~m@I`yqT6yUnuJ2e27*?f$WUSFhT4VDbz@uuvI=XM@l=X={)2LTyuyJBGNGSr=u4Fs;UZrx zUtDj1tle8M=qri&TQxn%Yj^^8+u~)nvZBt+=0BtAPpuo2CCAcBpo6wV7~s zy~9L<^i>#7hUv~2Fd}X}p*MW)bOj8m(iV>|U0}AhABW%$+fThmwSngQz1FPCdu z7#&X_k{Dz<&gOFVf z%?esG!OP;u_Erx?k*4dY%^dy9WVepECr1z1rxNP)H$cio2nfbv<^CI(!PV*jOk%}! zjsRoS&qUX9zledNC@A2A?x)Nv+EX)yPl=>JYEt@XKIe<^d&E@-j8!z=^_^lSG8i|z`zo%T!a0fB1JokM{n z6p2s{(1esn6NCq=JLd`MPcpE*E`zB^-Y?q0R4LU>`xoMXU2NF2W$3L{RAMm#6JJc zk1KIIUuR%<=m~^zK3QT;xq@|~7!LyCj|13&txg9sfV?_){b=O|pCRD$E3N+Se8cQR z*R)^_8ME=lJ|1gyKBz^)@!jPh=3*LP0Oj`q!~Hp|#3AlIFbJd%2h0ZnIpUu0@*DHE zanyV54h?a|s3oH*p0q$|oC+frNDM5Ar3?3KhuOzY`gMkk!08Z3=!4T>p;4jb+=mT%m;=xAD~PFfbKn;o$#v0>eq}RCO%h4w%gi|QJR9=k$?vLwf#&Gzme-GW;bsL*Qi^rPi z&o}%SuM66`p%oW6M#}GiByjO#y}vsUx0OSYwzqf34U8w=BoKr1!)w1W5bFTyBMY5H z9(RV~D*dR|c5Gs}f&s>?2#{cOMJPj&Rw5NJkrpuF)xP-xd6w!;MLv%pkky>OUDWr}Me&VhT;T@d-r|3m z4{e|+-hiw+I!cvdKCBN=m)4~DeAEdX!YV+@Gh`Xa$39?f^;xbl>a^tS_WYOkm$OhUUn&xrx|-}ZJuprV0PC#8t z)MO3qCTqnXpT?4auru1Zl=_sB%c0=fgifrnKK!muNR=bBl zl5D+PSIc>+sRArtAe*B9ne$;gim~jB7=cle{~*kPR;d6CEJ3*#_`z{S^VOzGCDcHt zK6u28@+J@rClZ6qRKRjF+A0>Q;3zEdhuQ_8D2r(L5h=W0z`xs=A(>WP?&goC;J>LP zYUNOTb2k;npkFS>WthC5bCJajU(Mfe+x;(Ry5S*DA=gvWV*{J_Qw>>0i-TvdezluV z6ZmRl=l4$|VR13jZ%#oYYVE)_-UC8--Ogs&O6B8#(zxPpK_nudZvl+@gb6>!2q}VtvWa~6!oHq5y~DWB?=-Izq|;Tyyd?6 znHrJJfWTb1>g!<@i!IvP!nx*ld^OYLl-0h`^@a!kyIOg+XmC~T2redHK-kq{OiI|e z3MMi4D{6nw?iYBCP=gV#*Jlrb8KacZyJfR%Y8~d>ONzldT$T)=Mzb6)%uJZc=2%P< zydw4i6T|>VSYTM1N~_M`VpA=5QZjyT26@|UnLV3}(mUr$8=xpu>Q z-kvX}al3M8*?ODhf?wHKS`FQCa|}` z?Y=akE~ZYmo_%>C$b+{(t5NOOfb_FBh`$zAbhy|QzNr%y%vI@26+y(*{*u8}s}*9N z4Bhlln=zDOpl(0|Cu2JoN8a*2)V!XEW7h3#HiA_ZAYdbqyjhM4)6|_U`idUvz9p(z zHep42kZLGnhb&Fk)qyWWCDY$S`vGxn>2kQ<_fqh3N49HnDtrZ` zhBzkr(J>r};nj@!h=x!E+%leA=8#@t!tS3yzy7dXtg76Ve{2wHft9N_n^OA-*Pd8o z9h{+oW+8M5wFgQb*t}vMj2{`m0DQbcF8N`ifLt3aHgn{Fp#B8HU>wF-z+cr;hi!Uj z^fEK9*sFcP=W}P;GRE!x6L8N1Ke=C9e_%Ze_!9+s3mRpjpa4w9SHaZl%?gBc_swf zqx7U%!lTK-zeN}o)XPry$_QKWt?p>1uGZ90DDE9_)`oCPBuy5HV=OppU0*qF^lE9t zzroQD7b8s`iFthCB)M>0+_o9&kbPb|`e<+bP!p15z?`)s*ccKK8N!{7Wl<~MfBR_+ zpPsI+mgxXnTXDhJ%-DKjw+G(rdMVSAiBQwI;L(bg^A9y;Q+xLhxW<9vSg&k`j*c-! zBRftxO*%ckw$rE)=Q|Av^HGe|K|`tX6tlzG9&r&TYsPLpdAs1Mj+N zYo7F>s^kD~4dTNj(=)!~()Q31Du*N7E(E@L+qOMA{m!^O?5WkS@cUn|-1^#$fXW}~ zs)&xgcy&t(ik|40f4a!_Fpz!U65Z21lz#%_j=cc8v71RNLUoGZ4OC=<3Ey)Mn*vY( zBs?Ril4f5V}75dnq z3yJ&FX6Ta;as)5Bk-h2dt=(SjTVRjI^e=|MnznhUpZj>4`1S6tckmR9P zPkuKQ7o$&=UL(<(nATUBx8mvJWaCd$+=|_G-ixCotUK~U;mZ4qwU0`k5ESqHVhu=6 z$%|P{mI)wqi|LO#IcEu>jv~=DHu}K$5BV|D6fSVj`%S9GLRJl`k+^zO{{%^4!7?(# zK5x=aU=tbtV~{OA1i{cp@9p&B)kR5}?mG{}enCmzdgl;1V`ZF2J4WU_NulGbOf?Im z`?;3#e4nU;I;LAo!!)++FI97oD_@t`j=sEJUKezEQa-2ZB&X|BT~vf1y&>$vRJ@+r z4(vPDG*EK3C$qt$!g0oAMWcn85KZl1&eBZ`QB$U;TZlH$mmk-T``ynaHvT+8o;Owz zuwH+Yn^U#Iz68@Wlpuobkx@?k!wdc)hF|mArOlTxTiqL;BeRa@o$XG2H6{y<@gUeF zNbBD_$+^VZrJJfaX&J#X(g%4A+As>^%C^U{2*jbGL2!mw{q6N_@^;kFZ(kp#&`N_0 zkrmm_2u7T<9fD#UE;MG1U=t$&i>?6L_O@cJfwJKXO6DVXcfx!V?b=#le~b=KHBif{ zjC;8#_IjAsi4Vn4u%(S%%C)LiUy z!TIq<9UqA2a(g?Tn!Z*JH6|%6#pO&Mri)xPSR6KgTxQLmANbx7%U!3#FL62PxjW8z z;wOp%9OqGyvF*(>0@kq{S}aSYx2AqYS#;#GtlTjnDXiQ#WZhMTLM;0a-D4K^NggpW z;-1Q@C6M>3GFgxmRKskg4kK>ghx@|W)b{E9Kv{k54*;S{gMYQ08v|MBQ92UWr zXp~dSBNt@YP|))USh~;|#<3pkn&fJMNVo>`jnB25LT&^ZJ~_%SKX0%ndlkGIU=uMU zx@eG#p*48~!1cU+hi^2*OlK%@u*CT{dKE9O%4c?A@O*?Ui~|_$1P6_Wf{6EhRlqt= z^4qQXXLq}=2x~MkMN&Ja#^Yl`)C`5-&F)DMI|ORF*A8ww8xw+3mU7HWzxAhARYb-Bdm|+Xm0HTQhg2nP$7{))YR9_>ykCggm@qxU$0xL&Sqix%)O$MrVs;`F*?w#n+T#y8hPDb8Voo5 zY|5TbRFHRkc|L64R^Qv&vY)oAyTU2d;Eb30S&;egD!A|jOC#JpaY^n5wW3>;f<8@2 z5vxK&ZmYU-iG1Dl_gwL!XtgZhQ4szsQOCXBo39TVl7sH)ifj7SrE*q#>E;Ry=f-## zw_cR>_)WxKqf|+VygC_=5I$xqHS_%HC!$K=M|BoX)c1ZrSu+uq`iXGC-ico<8$PnG zqj#uQIT+Ux!>%y;_&y?N0Ol}EYYUceupX&q(Osx?pkeW5E8y`%QVCG}HrgEd?zVQi z^1mEFhBD{JUkK0{;38+G4i9FMA z^UlML*m>>aFARH9#p(KBgT>wg{74B`>ieYz#X z-|ler)B0wNS8@ERSNX~(dlSTBb#<3YFB19_#I~-W@FbS{sh^7yPP6?EHKtunumqCP z-~gQFs#8*S6e(ee5<_9~wLFz~WS}f=j)(83poc99BBEp|H#LhROkL^{dV^{nGfQry z^Iriagz_X9$`j7h5J5GXI5p8pDD<5BQgj(!)TobYK1p9LJaPHD7-udiXZ*Y`#*DPK zH`T+b&1V7Y5c_D~E*CUi_!1_YZJ)0CaAPOQG)Xo?xB4WA@F|1*X9k-lz9no?5|uzw z-7NW+msSQldmzO*N%B#eW}J&gdz6C*$@ITr+z%SRh*t6`>rI^*om(0XFA{c}jCPGi zV)G9)dZNnpydAn@UyuW9NDdDPZagwU*jHUg;;=S>)tuGN7gUF~SDjL(H0f+s24*DM z0P~Nj`d`~?1Jd<6+{L#!7w^T$$*sw@lDxh4V*%a_cBM;U$H2YbTfR?p#mF-h6!K~Zq?5r zDfHAI{%ad^FnaII=Ni{sXiGZ_^pZ1Gd}PIxIE-nRB`AXQdZj zg&lk`A%6OMd8EDHRqXMK)=%8>)0|&ycxLTD*SjF5lfD~>KjI2+I$6mlZn}^BtZy=L z-sRI0Z5113oY((7D{|5`YP}@%on?D`JPXj}P*O%;d5^z6Zd69}A&Mk`&yCsdMh^+^ z&VPEpC7*()g%m*W%QnrtNt^LH__1^glrI4_7pAv=YnAlqpo`zw-{$q+SiU^MWTLEk zzUw(;D9Rp*JxbCX%aTYau4=Hy{0+AMD0h2KqeeA<|L$C&X!Rnz-k` zkx!!+$E=J3!X%CRY}o+sbQXec-T4%_{GeAhBfuG`Tx0moCZ=GZHJrmyl(uL<)6Usl zE)&-x8hQ&Lv8uZ}+vr8BiYrXyygEhA7ph;uSml(*v|b?T-8|Di?tZWyN}rC$?WUn} zWRMmN#@OjJ-SaryU?8FG_lFw^vL?ywL9JPvM@xANH2YWZk0(PNw(SqL{;z@ zqRBnjo*^4-mG69Mt*@j0Rn?|)>en{4EM)@{UE%KUy~eggNA6)~G6+C!XzkYY3ri=_@TO?{Dt~4%~**kg+FiTAz}%m_q1+$~K~Jz<>ZUVuuHRyRx+P z8_fdbBxq)q1dzK1+|&Y5tvD=2YGwB@Y2#yffP!sZsJz?Vc#_v+XFE`xm+{nCB$vb! zus16IEBe?ez{9Go4>$`w_M@pPSy$M1Cq&V3sZCiDMjqkZ=_I5VpMewLf{4H8X0W+`)b6U(oyE1-_ zi;@n{wCFl&0F0NY0DI;vJp+=sz}wEJ`3*){+A6zo%^pC07;Rf?00#)fx{J__+Y(a0})r;NHD+21CxqI+XS+5yrS2&56!^&{#PeD zKZTyP*AZ9H>01rwjGK4gG;xhfwrp`!dv?d*zQT$h;&PBN?KY3q`N~JDJkia1_|kIknZl3MnFnJx?8%t;eGg?^Zp6v zx8qu@<*;XF&pdhE*ZsK(R+N`Oefjz&3=9mal%%LK3=FI^_>qFV0Ka)?H7bFD5rmNv z6;g45JWp6P;pJ6v7b|qAD`-qM{X2ghfLfOd0_W=ug+f|{1%s5ueZl`AaH~+LC?T4lz2<)>l1mf9|96VtcW(pHM%z{45KPK| z`y1L9Vxf4brrUkSLeN_%#(ZJ9Zlk?F)*D&LR<{ebT|DIqA;|t*U8vLkjDg~Tav5~R z9YP=;=S?A>`d+2ZTyi1@qg^(5CDNmhV>jHMVs%w1^E z6%fbcXdZuXzB69?`S(lnznQScL&=j`=W}%y=e=ZJii=H-lcf*$H)lH!SIY(0C+pg0 z`mXnW$k>J79&Y29wBI?BT8T8uB)(O;+@CG_x-+JdEsD&U<^Sp@{$UZd>{sLd82@7R z3VB#q*g3Ns9MB8c6#B1&+4R~x5R{YIO(SsML`_v1bkVY~C`R}Dqu_s;tu_v+h9e1?V*Vx8@%Y~Qmgw;7rH>M=iOzICA8PDH)8a7wQJ{hD881` zYd$v)5*ITDa=Ac}Q{DEY(VP z&bc0(t#$>5cv$7x9%xBQLipS-Wub5lj|TrR*KKWR5KGNDSHErC-In&()gY zu;)Ac!XG2)qw>5xFTM)JXU=~`$fh`+FDH@(OL4QE6IrNQqJ|K-Yrip20E@m~?*6;=aS1v#k(sB|LM^UAcJr`0?T>0o@jtI7UsjKv(bIg-SUPzeHLk z3iHuy#5(K6OJX%FbUs=#u#8mvPJTj;h=lY}Q4wQfBqL)WfvIHpms%2y z0%_pCmt)fDA6#iUTa|Le5qN1QjAn387RUYAh~8N$QmGZI(9wVT$+B9b|I0V47%te% zDp0H4aZk+{%~n*Og-CGD&m4_+b2yE6(k@RrJ}&NhTFyXT0 z7AI#nlFmoJmm?7wCpWIdEtwuQd~BA&QKx=a+q$_+&>evg|2h{zo34)ti);`^B;b|O zRZW?Q1uvBp2A5?yl>N>xm{#_K4^^~aP$9afI2_?RF;=dGWH;eUA?|3b=gyW6X1r*Edrm5ySV`oSx$ z_%SQQ+??ms`;(wrr5RYgqM=psjGD^0y_Vc#>%Ea8MZJo3(Y1TdhYML$QZa=;><1GJ z?IGP9U;aYHz9bXE#8g<#N26cqG+3uqXBA67-63f+OgPW0G};^Qsk@)SNUBqQDy`~8 zNJ_A*Fx&d~5iEEM5*;d7)GCrQlbPSX3+ksJ*aaji=Smu=7O)Dz5mCJn+{Ydk(VC=K z_ts!JIh)e9DMHTa2`6H(?*XeBw`NTJ6@w zsU15Xi;6CnzuhrW%O%Gxd0y$L;vI@WnSWkF$@OkdH&nU9Gmnw`u`eaUlcKh+mc7u$ zLTnLz5iBeU{ItsJNQ`*D-MehmtCVSRItpMUi~odbUB{by_HMPfp2daZ{xC3q@AcS1 zAIN6QHKq%*eKwXSGszjnVp*A-TrNK#06P2_0y|!~l(gv2Cr8P24)++T_)F-^>s3L= zo;h$vb5=@d$p(`Qqo&F)ABMJf!ae}#$C2D2Lv2;+rp;aP!fj+{lRY8>` zCQ=rCZ{;il2ft!evl_)LVRI8r)$S+$$7@5e(>{1Q>@i{$yK}^gFUb5E$z3g*wrIkE zt(eGu0qw6j%@x5;gv>shlq;kIwOT-W5b=d?#p^_4_9f+W!}wH+af9UPfBveOt__}S zFi8dr0l_DT9OHW)x`>lO_dq;Yk?Dh(Kg)%B&`H`RAqKv-uo*wAb(%m#erwnhmSve= ze<4U8&=lrw;G`3YFy@as;gpRWLpygiYnm|%HiXFs4mf`*lvDpjT=p&KQ+F`7`$Qbr z#4-2VA_nnERjGa;!afN?`#7-jFkO79SbVZ2gmr9r?c)U_+%R*U$bO>D#^gGYW>jXF z45!XssuUVpHJTL0o{E71`$4>;B6!S@!y^|aXxyo~r+$_N-A`h>{$@i1eA+1?7{ulg zCY#t5--=l;GxL=i8EoX=AW0@u+U;+pdnT*nP6+t1y@lre~$N%i#!@{ zU4*sRZ%wj^I}cndlioRQwoN#hl|VDO-~zZ)_ZAgvCe;i73hEMm3{+oMVbLDXwrFj^#lhK z_zM63lK;0Y7F1^A_^3VqaHk;bIQ*IXB^ny}{F&Wacecw3obX2Me|yXwq`T7g^ud~7 z{yVGT)Zgt4iY2)FUDnsQGwY*Q8(V@?SG6f9ErjrFYxX)k%{Y?w)Xq39TIZK@Q zX=le}9?STAipBFOH{HqanB>XHM@Tj!2-#o6GyaGl%R~942hbiv-gkWdy@$CR)5$HT1mJTSd5z`$J5#G{J|W;2l`E%y6;8k5Y$jJccY zfeBvz3CR4ht}P%dixhXcR8DvtU%G098sUSF^#1#(z_{dFm-A^j*GnZ|1iKHVV%5(9 z0`qgjtd0--VCUTEk5!BJJu<2>$#!ywWPwXP&|t|2ARpLPi9*8OZPbPF8BwAE9LOs2$CGB*f*{_*7ig~9SxYaZ7#Db z-@xJ)xjB?#daRS{W(o--oQP{@~W;6zZ zC1|Z$SP?WtSa4|j9Ar?c{7d~W2zmz*oi&P(BkJV4-$>Nk?u(}6_`0naLUQLAo5-js ztleO(x&<_uB#^MxQ~qBBG;2&Y^qayb3ohWu_7@ssfl!ipdc0$%mWuHU!J!i-`*uxk zJP;>k%xk*>BbUabn)W9{puKJzh{T=dqqZD05+23XPXGAOk3-3vMWAP=KDHkpTla7W3Jt+ou@}2wbyeQi0maTiv8jY zA};H{9X{}8_tz&`$CYYOr02Db0gj(sDS_@|Ku-jT42Xbgok(*LDWrimrNI8#ESvt} zM}wtg?qd{Yw`QpZE05!DT;0O{Y)z4Jp7ht%PDHo8vW6Lhme*x^?dj5Sv_en!XORQy znS!u$t?pc{K(n9U-|XqPlJGhiJ@xDO?MZ&jm(6+(OAP0|{v`39SD(+p2>$Gxe#vMD!@r$^7* zo2`tpjWYay&pj6=1k=po##_~GES1EPCDHJ(8c4>-sH3TIs=Q%7U2X*)I>f(U+%p42 zRn(x}vv!U8|HJ_8{Rar|i5qs)VGRw6x-cTHw<`Q^L}d1+%9wtzo7R5-v4M`^jzZnZ zALe$I%+8VZGR7oI$;C)IlYaz__{@`wH}j{_Gw$7PT%W znb$pQuV<<3QR@}y!}+*Et=0UyWLCo$zr%J~Q0~3sC*mn3&{Tx5Y2>MhMY3z;g6M9B zxRx<;Cpayp3T67P4jPuRu&K*5s)VInuFEHlwU;LCY;9T6_}mj3q9Ii#pzX=5W~=>0 z>WypDYXk(pN%oqJaLnVqVPs zAg$erB5Wqz7LB6*N`|%Of+B~l;eo33Jgx|i^8n>L&DZ%L`V1_7SrT7cuLn$ngtt1< zl;UBTAfgT&Fug;3gP0({18zKUh@4`T^3KY#rmqT2%586N2Rqrofs1kq@B)4Uk|AIn zbI{-`UquHhjb;XCx=g#^bg9`n66(nOF#0(llEfhgA98X98>$M-zyO<&DG@QH;= z^e#+r>EZU`qhnRELg{88eRdt6kS~JtoZnFVs7D>t%WR-$IR|W>Qc|JkSlvXEaVNN~rGWicMz7^zhD~Codt1nzYIO8XUqdn<1 zS*&XA3t?XbrU*qnwQ`wOU8yk^jr_jiqQ6nfv)zC`rhEFYU)6ooL>A59G#}_O>86Q6 zm?#gc`G{ar+0Ru6@lB3gOv}ma^m`7%t%;Y?hOyH0)R0P|1e9&G9Oh1Y+ zZv~8vI*aM;@96xB<_s#bh55EaKe!$8tI5q<18-k(;(Kikr%|TU6_ASr9II8Aso?#* z6a4IFfwth3xhwoqyHejLW;2S5<#=*w;kX1r39JE<@%|QAlJc=Ic36k}4C>`nKjE{= zfkVUaB>wY=!(vJ{-eRHaxN&?p})kZ=!ZhSK=#99I$9Mo$bSfhgcSR^8~%Rv z#@X^92Gb0kN>ets!=%4039aO(+eNXxM{jGAEXn4{rWDiQ>raVP&th2y!Pmo_t=Cxn zLkomVOg3RVdc``oY|2iJtZ(!c!cM8Dy)Nj$RLT|XchXx!i40&RfjRw9yS*Xu&eGwD9_R5365sFe z@2|V}w)x8)+_!dXOsn1p7{gTHxqa?K#ccohJc)h=3dUhjPjMQSvEQTT@GLgrW`LbY z-t}y0lXLc$HP_bpPHr597)!-J*Ig$<1-7L&k_<{h#8diQj3t44@(Qe%o7ADlGSf6b zgan4*F%>HqD~Cc?wjiRxU5%P7IxQ~DNU2FfS^Wd{D`9w~oF$4`KE$*+XsvhFh>-)X zF*nDne~9}%;F+{)1F8S`wIGU7M>OfCM`F7uhyTL`(N-Th29A|g+}Y;Antn(7*xix( zX%ZD>VB=lh*_MLBdQa<+4_8~}RGExJ$69-lN)b7Seg_+u9Q5G5J5O_qcOBz zH^vM|Y1iR-{jZ77v+Z(W&c#Tu8Y zGS71q8}}1jq}PvurhmeJ=(ClIC|5!C?Gdt3mE@CaqZ@AX?PpZr848*%1s#9?T`P4xNH|k4Ups+ls{Eq@{ZQd^@ zLH+B?0A{_uRBps0f?1VW)@G+NAr$<_KcmrY|7@Mw?W5L0+ZH&@nxPmQkZV4r;q=zD z$E$Y#`{}5h+`CAs9m{_RFM3SvOS4P{+V2kKE-_mNVm2H08+d#kZ}%!|KL0n4KS5Wf zMT3#iWEVUxXNg+2)_ny>i|Hhx=vVzS=}!L*3B8-7Vw45%LzP zdGjUL(`cKo!di3?QF6F%QgO}B8OCH?J1xJ|k&P3>ggxXO_ZAw**|^*K-P6#O89ee8 zmUAIB3K^~~pH7>K=IFyQ5eEIdmocfo9V@ajs1KJ({*u*C$z!7X_-4(@WpC_o@q1j! zM7>o(ob*!pB2GG=fLVfxG%o_|ICMo_)b-)k)9vmc!?mVTg~RSMFB%1A7l&X<75T{; z;&DRr#!iOU?P#qTiAzlbjrmxCeA>}O=}joU5?O6`*iWgHY%;iSB5`0y<pqAC7}4wZrSpA{cb`1nxGVb9SW)P( zrHO;{bxD*dJ|6YD3Dt$&}zxO%SQU(JYcJYFG5Jpt#oa?rA%aY;J6} zhRZeWhQNI897(Hg7b=vTNCmm(h2xitYj#S@8WGUzARjmXxZd;o{y|gB>{^*bp zR_<@bmOp%akX4czLU1K2 zoeM2zi8%~=?mlQQWzee)iirfiReDT<^!fa?i9vw%66v4`W~2J&A7c{pMy_L5pUBJo z4gWaVPXo^fM;RymCtp3Sc-M;&r-%;zICbHN@~NadS&7^%U%~f~Ybqs*d@ABUtgf*v z1`D=Lw29&3P}ftxfqU3aV*VCx2^Joi$zsnTcg%-DjYiT3Y`y=zIHbhjvbJ=(W|kr1x?JxdB2$*^lW{v63RbDv{BpY!yg&^}f{2@i@WD-%Y~{F~@vm)*wbJReom)zz%jC&;_2`k_DHQB5tuOKC7^_@;-$@^nC*zLM86;+W+T&EGG%L`06yD!pHvXb0S1MFxz*yl{dq2|BYxT1d*6YZNlOsWq}@ECE0N`beJf(j8E z^UT&Cc-_m+pHz>#PZW;6&tqcLYg2HF;aFvleS`TUotBK>qj*7XcbZwaOgk~bbdv@G zt;XIT{F88z`#ZE5`||D4gc)8uvp`tB{GuqtoCrRZYm?Ql$Z=@%*{9#XswB0fLH_?2cas;=F+N?X~nW*UvYh)8m)8)6r{j;Z@-k zO05>Nrj=~DL}Z0oA@ON%bss5-|FqcjFwmAH!|h~dtTz4!v%W5h3L*+trd^kLKV>q`g$;m2%oSMLAgZ`epUytxglA#otBoKLYH@zO**W-?~Q!xaepMYs49C zW~+1mkRXlc$w>bW{qr`;xwDYV=w!)0Zq!rh6Rh-6M81&b+S`&px~ zA?f&lao!_YH5oGsSTC*-kk?N28Ev#OvpTs`az}}Cl7wMcWm7mA zgi6%Cdj3#07g~w3$VAMZ>V2D)R!H|-l)~bb<@b7wxe6EP8J+Wr(I*-G$|%OIwAB72 zYIShD8mLOE+X6Gr|3VgFqExfPfKj$^Q7$=X&T1}jE7Jg%{@-W&dqFF0rSeZ`o&2)L zz1<;|DO_a5SQRBq6?FDk65t+t=^hg?~2O-ymV!^VRv0$sa8_7FkTc zo};@tH$XTJtHPYil_J`ntGn}aDLfvn1%q@jikyz=(@Z!s#j9ki6a^9iq_&6dy!dZTQ)Zm zy?OX=F@uzeHqLiac7Rcbwea49+JFs40Eg;5H$GGHY{A?S!+QxwUcJT=?k89MR~-qO z?T;Efc57NHTey2{n}y*r_fp-~ zWZ)$os4Z>B>?}Gj=K+sTtf`sxbN5;zk8gUnsc-jI$@+8#^35mV%b=N&?k0h;t57st zkm8NWJJxCYJ6RY^>c`mtm2{TEl5BH1@pZe{{f+i3#}ihgqW)wwM}nA;Cc3k)gzM5L z#bANMd?Ki!TW24>ESz6%f4N_%*eX?@-+nw|I0Jdsv3Le`V*ZG`tD`erMgd;OE^hmOkcy|) zol3^tR6h6mE(;VqMkq!Rl>_C9xut0B1~koXy=U}bzG3$1RH?9iWo0Eu&EiYr@i(M^ zr4J$WS91fzj2E5X{(MK`ipVYxXgvT19qta|ivZMk#HZ%H>54P9KVJ<{P6;LB30V4L zX&Q7hcpQr_GPY6mGfoIb`zz3rX8QXD(~qTFHmru9xjOkD&0xYSq}|X z^NkGNH(P=*&C<3IqUkddYO)V5f*^5U&rcFnb8tQR_UEn67uQ+^iFWvdWC72nCo0O> zJwEs06Sj&1VkZG-DhvAxm#WXdzkqz;)F8P1mg9!%#8tENk#bi6sw?v6w_?(D=9AgH z&W9Rj!zo+}sF{qK)yJ;BQIW~1)!730}o8eSc&EZRC!|{9$6U)OQjgtYG-ZB zQtz7-#ghfR+IWuk$<#=UN7B>QiA@w8Q_OH?>FkinG{4g?BEYt%b=;i@ z*>AgELs7-idL@aCP?q-s_4QwnzpZF{_Ly(acSJPaLMX}=v*19yEm=pSTC76+P)xhJ z5r(sLBy3!Lv$gN6AN$(|tyMfuyFOKMwXfPpY8Cf5ozERlTC7K~hdUSa&lxEn^7b>V zak>=(tdm(MR*en>Nq8I6jB|80uoi zrS3UC{)h9AoGie$D^~L_)oGs6YR~x&$PK%W8G$$)luiUJOs{r@Fu(L8X+|vVk{e9GtFo^QQ+yV#;0UEQ>|7YBDPT3p7JzdfmH>XMQ{j{EBbehJz!vRPP&ihuiwA>WBhVI6KfU8`kL;*Id@6x#BG_&0lx2CGoZ7!MJ??Vvpz?zyN`}-5`BI2at%YVIQ126=1J+HaSvF zAf5W_%%?$Vq2iJel87&HpkJiFpkPtSV$dqPw4=oLZ|b?U!>5$;du`)pcTXWJwqkPg z6vrHBH-M~)H0tef7y9HsnTy>?v$gJEbC@j8czV_9ci5wH7@7FH!6qWr53Ah($QdLe zL3uDp3Y^QKCT^w}0A{a+X1v_ET70!`6nq5~W+Xu9`wKc>OJL6xy7Leb0m?{~zTCFp1fDKTnRXRFtNWZxvu=JU4&1}s7EjBw>lu)p_u49oL>2}Y+^#A$} z%d9wWRH8W(fhybaYw&Z5tqu{_e7)62dY1jEs25h81oLde5kg-gVw{$oN)0{crz$q= zRF*D3fo7d=d5?DFte>%**xvm3dvAh$hQ?t-x@))iYVCZrtnrzrngwYKso5{JhaHbd zMCg5`0Q6C5aXC?hw*Yw}V*Z2R>gA3^)LpCzOXrV|_cxPNe*suDG5G#a!1?f#h21?2 zjcgKzIb6S+5?VG6>`Xo@d^j?`Y|#1PB5#~tSxuD>GR_cM5SrjdfEp~_>B)L8Li|I` z2><#b5xye$N83zu+EtI7UH$Mq{6h=Eyy^Z-RhcsVet5kRsjln%Uimltq)&bv#5%F+ zDmI0SdD6yb^gVoT=PThIuQ61#2B}2+eb0jsko3B({B)3G1UvnZC#$9e3#DiS8#o|X zJ)R0!FAka8?>kw!QfMhZ?D`DJr1w)5F|s4pud42eq;}Gtg#;5^0QN?kC%(pm$AQ**gQRrtv!iT-$r4BFO6rG3 z(u6~ODb?=zd5jgPqzgj^SqV1k)8Wl%ZuTo+d6^4Uk zj|DN`*2U+?<9Wkj;y($9bp1bpwY2&UqvozFfOCB#_U_AikKyWO;wxW4QOu5n5hS!v z|2865Ex0jT1LNHNy?=?ircHlnZWo^`MK?ZKYi(I5&7_cVp3|r^*9Ckj%TaWVx9Wv@ zwB`aGjVl7I0tPK$4VZt)4Q>`f6+)zzAkWAQ(4#TaMN2B~E)tnK`E>R-r#f?uXRnaB zTyWb*76VWT$KpgR7uUDhy_&T}Pm$qB$uZbXUPYKH`c3OMN62m{<;BdB!v$b&+?+MU zb8PGtb1h9t#dI4s8|nta@bLa17g0uQQ%a#6E#0uSc1|^pJ@XaJ#ppn}?~DFJyt?g{ zyBpnEj>!^6Ymgy2@MFBeDlQc7K-K)Ks2ZN*u8OLa*U4{uucmJ=?Nu>?pm2FIrt5{f zJ`}3r7y{0rgpzSHzgXywr#Kh1A+;+aZ1c?M=bP`){r}FGg|8V3(id| zMAE<4Cwmkh!{cxfh$$4aMe&T+FpI{>KQyIsgwe8Ur}BF$>%1n!jVBiP7Jnt!xOQUM zkW=3o01SGPrAGr28z1*SN_gBf5Yd-D0jQzDX>7`nrni;^O1iDP^P<60#2B7G*k*Mo zw>KvvNEjRhr{hX}nZMTf83Er%B2y_Rdw|5|=`r*WKPJ_hQXitU)b=1byZ%g`G?SbB zfpESMw{KMjnSHbFpiOgS)5+rRZmJ9y5V)7H27{z~9> zco~sXq~P*?e)RG;e)#rMYj2Crj@JCRJtIW)HSFLwV6>!E?iEpaVzLC$9x09GBGZ1m zhw;?j%bUw=b7?XfUCal7Y0~X^Q9;5xVe@z@$hNu>&9Ow{Srj+(m=^`TZ zT9O2^H@D4m?<4_}Xi`hZX5r)E>JvnevdL~8)@sph?1^_TkMy;8T++p5o?ip=zW=e< znF$C~KLCZC{^FI!%Fz5k>pg+b{_IDkU%rH*4^tL(Q zI!Hb%CidlLwix@zly}Bvz|cS69v%N8K#Sv|U4r~ZaB3Rd(+5)y3lz5~HA;!7ha!LJ-Pp@+Ah-cw?4-WOU1EX*rleEFM6+lvd?eAtM*m5R(R zCu+i`hU16kYOHmiWS6UxE)d2lu((O&ahT12DxI0F+hZKcXrI5VB}RcGrSwh{tg19P z`5a99kJZHq@hgqAtoZd;STw#AUtWN;}Xgb1IM*^%OvAL-HVK4~Z zlO^bXYfPCve&Q=Fe_aedovqoz;VM58MP&<}v*N|My(p>pfFvHSW#FzAfe0Ik38TdC zb{;lWA+TnrNq77jb}<->7ZqT-cNZkG9!Br#w7=6!#klxwgtMDkXMIOvHY)(I?lFN6 zNHbzwJ|@iCL}sC=Lbb5-W+$xYX})_CQcD}f2a{+k{(CPB(Z6&bN*2LV6%gKTr8j~o z^#rdI0j=P)HIl(UVA`C|F=@c_OH08I3t^572y^9Qi!F@>PO#Z+nYke?lXN3rstF7BM&Z6x2~ zvYAL*RZoPewmZ$$YuQj^I@9c|vti8%wpdfme=Sgqw{RMF;mB!V%l02|2gxJF<&987 zgs(IMGz#gl%!NxqIB{GyO|+Wx2iHpP`BP|>J}uQ%VGe=Z;pIWI{t)0#barR#cu4ksr+P95o{Ekrc9!SFe4@;3-bT_6V*ZIFbYMMS zpK9?{*1k@&1}lX2?jmJm_ahg;(CUoB_wN^hsUh{P3C9PYg;~#eGh}_cYQWOq!B_aUZO^#@^dbhD%aVv zia`paQUa#lDxB(|V)mQF@fRtuQ+v}IVyLwwaSGi6h9*J*gZlGFiX`U!HegSx#amXP zBD+dGJ-Sa_#(}x=(x=H0MXAA>bJn7h6SF6*h!^#G5&JI*c}v=0%Nh3KC(jpaEg?#~Q+?XF@LWe8zq9ln=f7M{dx zr5J$VT?(^`vQ_A{SK=Sy+-T>@5%m$JU*vKv(H7b|s;xiV{Q|_Am1*LJ2ZuNeHfJnN zdvB~~aGXFnC9M%#FD8A~2%%t{k=Eqh->g4hFZbm#k`E&AnFUeL!B$&Hv(=Z5fQ>Et z66|skkPgbvJz-Zj#(UfJ(S=J9c2#^Oyh>{aMrxBpZLvG!G^*~wGrlV*y%`?LDf#jT znW;C1zh9PxAR%-oAd~311S!pk?`N=kxS#|wVFZtnGiJ%}%Ey`1EBVsyO9luAk<822wh#&;Z# z@arnro&nd2>oj+%la0WE_%gSk{c%^$|D`d+*g<$fn%$j<;9Mh53mx^JoB|);b()C#I4|7Ua(Ry zjIa4f(rENrZ=_+JW{4=^Blc(-Ehff#e{9t8(f$T8bO2DKRjYHsV)K6vg7*(9)tnc8 zHkkd*6rUnI$;?EFE>jzjfJXp0Y7YwG(t3K^Ez|pCXxIxDmkBYjuGQ3+X0S-(N!B5C&vwb+N?K zR$a^a$}cs4rF_|)9JzKYR@<+spsWV1-Gy>+X4JE+fiT#9vKT&&R_Q~r2CFjxOlsOs zz<}|(Zx#Idj>P-tbMYC_5$l;qxGqS8<@x4`>EW(V4_AO~U~p3-EG`H5+{dfKMb}i7 zSB^^=?VlP?lg9E=c1Co*HroJ8A&=kl_E>lOiWb;gSp$T^agYW5{95}B*kUEhj9#U1 z(7sYk+VvbC)w3P7`ER!=yYBSzWeHt319B{fi4YLEm!B43Cg(rBleWzAmh1MIW$H`q zlGdVzh>{_^f=WBg(oUE2<-W0nD*Z<<3qdKKVTn$DP2izQC$U(I9!InNhwwxliXuNT z)(pBKAqD;oK@M52N#x$F$Qq835NBhq+l?Ey`CUPLD zyw0q{W-I_UrCx(cX@|-!`+d{9+nMp6&n=%9c%+XJq>?#`a%7a;hWl9an?-+6Nqs=X z6ZR5w^qtcI(pZ-$t?xL0f3Z0+C#u5UC8Izg!`^n$%QbjaCU6>5ZVh6~&y(n~pY_AS zzfc4;-J&Cwo^08DKN$NbTLg1th?7uQ+x8pS4Ye0SlMs*O!}gH-dWAz z&Vz+AO!p0fVyU zGbR>RXEW83Jp|?cuGTcd)bV0h6_hH)N*IiN;xk+T#!9oA*-4u7QWmh`KT4rjygyGwfXxhZmI#`P?anq zS6Pl~BO_>5=<-R&zCopyPfZFyBPq7_+#Dq23}T^;!eiDQlyBRa$P5etOXpr*Ah3vY zxE(eNJ+8StZ@(4;p7u6EXrj_UWQl+&ks?{E&U`eDx8hx8Z)BnQWN{p;p|~nnYW@l3 z#28S&6Rw4_fQKvqRP*0w;MTbIuB>56`9NrX*<~G-lh$r@mT$BHIOb!6KiG?aqmN)} z)k5%Bw}k+3rJ1|+4+T;(KO^q0vvI8EGe95HeT1VDj3W22KFJo=YV&B^rIba5Hh`*` z!bGC-RbrKSkk2SIh1=Q$Q;k-t(&=E%ZwvOcgC?C$Ef|+xCFq%VRF$aEZJlrdMRai# z5g;XtJ=r8%o_+#awnNEZ3p0pSyWaBc-sszO9!F`+Il!XEJ2(MyJ1&R+@cTb=VqhUB ze>a`p(m))Vc;A!ce;(Slh8V(XUXo@|nx)f$Vu)>STvMF^9c>U|5UkdfpynsO&Pk`3Q`C1#zbiPw_nA=`7nnCg&fWd0UX^Ur}%x#KRURR6GxF;fR!n}YBDh?w3zQk{E{B+Vw z7UBm`OW9`}d}Qt8^0NC8AHe(zI`;v)4}b*ni-oFUlw2UbIjAoTej}x`_8?&8im&)> zBz2H5%e2(K#AB4Sm?~95K@EL0I_~`5x7-AEg9Vxc~WQCiv~*8s8;>MKx>OwXg1nYKSQV&u*{BO zQW!M5mgD*1)mu5F7^i^lGJAS_7%&Nm{|GqT-_(Kqg{=9!N}s2Q3{tY^#DjHE_<%yh za70&FW14I8bkDo2x0sfXPHok(2Gs9v_-uuq0JRxZZ?*H#|67;Vb9rpB(2HP0;5l1r zU2D`~eMhlzrn>(kl>Jt_^m8TO*Sk^mpIBr4no)|94v7PaP0$QaXyL*=C;iRE8Wh8=Grf)}+442rWCSIlT5?#zr`;%MRHa3kQJdt(v(oyP z7k*b^(PWO_`-A{_Y=j1xy+r?KnId>h5K1kRpyKH~i9T-+oH3d(&z4u_6NOp2`$-Ug zx|iz`cZ(~CVTmtvAz#psduF~SguOOwnx`FwEnHSI%lTmc@8x`ebrAq*VK~=5P_Z(t z_QE%ZzCktLnl9Io0W;`tTd{&V`>*;9A^plgpKX>enZgz^R7;!RU!W>0qki)y(4TWt zEev|j-Z_p`8~-UjigFSxCdh?~fmwG5^>)kr0`SOS`=aUZ{qA;IV>i2q# z^zgAZvifyg$1nYlEeAH#pgJ1C<2V@M6Zr;((C5IZbC9hq`j(TX_#4pU#pUx)?B-#u zkH$00tXRwN@Yu(ZjHS^6SgLL+UoUpy@5Ry2Zxhh#Mb}GzRqD*iC?~N_W9|NZfjs zIZjR56*<-A!$5n?3~pZ@sEb>vb8+pyo;aMVLm^Q0%-#KM^h#w7WNJ#tUQaZD@@I{` zZc$WA5k)TjJvbjTzn61(p#a8 zo`)=7UYS)sL(`2+ll45ar>%%LE9S(!%^5jowj}@okM6`^_K;05U!O}c9K@I;!u)Bo z=*HQ#S9m6#F0$YMaK~Kvt06tQA=q{iTC>^}h`kh+bmKpVco(0*(*Kn9GXkDq3^$LRKN{%dS^$YzPr0CRZlA%-CVxh%u99Pt`JS+T3 zo_-dXCIkjH4vq?+Nslz(xn!57C90j|;-%He>yhd)cvpDnO!`-^3#$4sGZ1%v2&1V#uuw9;JJWZGU z@#MrwPn3~4t!s%dLj3dpcGC;dr(2^n7VGXoJ~Uu4gxUxtHbde9o~s^R+XahJmitjj zJ4uC+@y4$aZz=eApmK4v^9>P-O!}&-aVvOFZT1}((8KQbL}3!|NQxfkBIOizk(rr~ zjk4=2YppXJE6A~^-)RfDO*GogK9*%|InU6Ps15De?Mv~^ugL2tQr7n4fiYxeb)Z>4 zO)mC%b4JOxJ$*AOY;R7R%$$6w$5zTG85J4gq%@C=RJadO*{5x6D#)3&l5o7<<6bcl zP|Cl+ee^zd43qRloly174G~a?DKQ1NKiqWWj94s#zsV$@l}~n6R;y?Un4$fc>m5FJ zSA3Ntp)hNAMOETgp+kHQH;}mJ6M}vf0_xM~n%_(%bm=%jhidsEVNknlz* z$}#HV@c>i_SN|c#%O5iRZ}~`)sD|);1&Ue6_8v`KS$8MNiX;ROURC{17v~m*u#H@1J*t4Bqb7NKJLur z_dY(KzkYviJ7?$ezMS`YzMjvAB{@vY*x!g~LHU`2^Ap{cBZz)TbmKICVfXrAKxgZM ze#-93tpa7;2T?A39@$7E%~$Q56;aU*6rX{U&c`EM-L-`g+xW@zyXNvX^M88030jG6 zQ*AbKQ^4*n#s?QTY3WGutS9hU#_#T|KRMBUVZu3^d`xL%8=6|tub3uP%^S^zUdU13F*)PUC}DSa!S*6wGeUYOrdfJ zW>g8j!3io39xeFKns27nnwrX7YAJU&9T35Ci5K;Vq{ywD?^cmExDW0|+*}#yorMeu z!ZFx3J5y7v>ZKR9|IFqZA5YWQckBVLd!e=8o}j|N|6Na&5wE9rDI=0X1n=#Jv2X=5 zxab=E6XuqmB_LywKDF{Q;!PEm#D~6GGc(7t5x#aP8Ow7D&ad@86A0=}Imu?$((xnJ z+Llx8Z|_wJ^?9PGbY2xxGR&yaVCL5+?T68^BMVqowT=95or7iY1M9*Suc~At@{{si zn$RbY!cGtXMkX#DwR75P)seE6yL1YVJm^^Ny!88i=pK<2s?p+5Ut!GsAT=XLtd1WT zmbiITOjiwsR6UW2vQ<)w`PNRaE-tMd?x(Du9jER(LFQokx@A)gM(QfmG9^4JnX;+H zg!lLvME?S?ms%vB$if#nu7iZ^`wnd(^GgiE-qzfKvy`21z3boorH??t&~mtdF%iH^ zE;r};B!z3oL{uyCCctK85FqorV5Jg>q`ip1xGh?P()192bxr55H zUGMH-`fniAx)19`tYK+M_j~HYC`A`Z?*QP%>?=2$cP==NrXkgW+&r!YDr+)49-rdh zBI?ALy`Bf>gsF3pr5pBkgFsI6OxKgm_rAeLqrDUiU`%S_&PB6?ME#vXwfLkF+sXOS zI}g`so9Qw0x<6<1NN}TU?-~<(STy_uDB*%rvSJ+|I5Qd#f2*YtPdv|7@2WfgC&Q`M zD&Z)@)@)+3-~Io+Q25Ez2K@So9;-~_Rsp{yYP?3RT(uWqec zOe7{`;jHHn=^{>2Vh2~ijG{h)3z!o@3eD0U35sm$eeiR%(;efQfz!T)o?R`Mel`lG z>8N^r=}%rDU4~Fc(`f1~GG0_KYUr+v#5_@81V(;oqv%9jAS`chnm~SMyXx-+CU>$= zP2MwpqUq>Pk%oppwHYpOGY|bE@Q=BWH@QAUIWw59+wqT3-pvXcaHlR=HUAA-oRG>^ zEzlV#vu|sDY?CbwjutLHp-vtHX4U*r{7zXi`D7;Aq9<$$oj5ajB_6&6;tFu)UKXY% zYkz8{cF6HYH2#xooJvV1ttI?#kwst?N0s+iQCa`-AfPW5>ZkBV##>qNESkaU(M0b7 zLpNT|UkS1kKw17LoCgo`w0(QKbxGlCPtJ=*UPH=EYFuOG2KV z^&Wt6U}*s7&^S4`%b;Hk{uuV#x=w8VSYpq0#@e-9qtx*{5C#YxyD10VuHEP;Tgi6d z1GY$4kedN&Kd-*u_jgSWx>8{stX`n@c%$JomZoGsc>aQ_{zbEc?996{QMR#sw_HYk zK0lvv0*9DSeSITL<^mndN(r0lUXLf*mT#j+q$K*U%RyHk851=W`|4aY2XBh3_yCHp z%(CeU8K)DlIAPFV_RTjKRe~PYJ?-5Gi(JkvkN~ng%pWBR7luSd0eZ z5MRZRdC^+^NFDvGuwEqL{oZ@d0@JM6;~Kk;pURtGxWsB)1QI!kPohrpLuNb2Ny1EZT|YWg2K_#2ECpyPYcfv z#LofW=4B6{M|a)`KpjD7fPl{PrIE;wcJnSx>3ukMIxd-yK7P+s^d2&y@&Ql^%8J64 zQ)&(NSs&1)U^%KSrA^Y4oC77pkGwqAN7gYSt6MaoQZ6KVW?8bq5`vbeSsaC{2@WG# z;)MCMY+5ClgrR9MNc8QfH ztX^_wIAQN8Fbj(i1gcE^w4*Oo-ZuwPiJ`1Vm6Gq$&IA=T^Pe}ne9c@w`Ov-`J1joo zaJRZcptmB=@U>N{YGQlSTBcTDz?>98woJyCE7uC-=P62g2Uh8O7+Gt3dEJl&F0NX8 z()+EFtfYLl_`A?!=^Hek4LfioQ^k2l3;%RG6{$~*ZldE5m}%6=Gaa8&6(2iCMmJb% z@$MocUeN9&DO_Fx#`e)?>2CY0#W8&`g^0J-ozGuzh6*U`~p71Aw@#^9>8RUg6UShrO(#@bi7z19VYn}MS8!|K5+riRzX z;!!TI2AVZJ<2eWM7H53H<(nA3;=x|aJR4PB-JmNU(hu~_m41Hu2{_{S9miBfXwU2H zYZ=8>QjbsQmU%ESos#n#Jx7yAtv)1fp1FFxzbIYF?MkB;AOGocNrMa7Vs`MF;fQ^f z1f2PqnDflbx_jph6Ma9=)ncw(EHugJ5680q1ahtr?6AH8V54@m#f1jbf++~SY)2tNBQX7xZikx3WoroDm?#q8o)?)_L zQgoc*9hzNCB*X8(wfA=)z4C~l`6l{Qcr_>@@*7{v16$?#$ak+es{!$QjcjoP=M?SJ z-2)U*2J!CtX`sjiS}GRF>@pZm(h7XY#vwrE`%&rKk-kctA;b zcaBE4as)S4;Yww$)0){CDKMqCh)t-ki@9YhzupIMfY`7;vBgax1e)|j0T-yRRWujr z1m-|I^dS^K#RX1rViG>1PmDRh{Q?jd9!0wXH!VqDs^LH9ge6EK&IQBMBhVG|^1re#DEx^4{JQ8&5hlby1Gb4&V zwRj`%$yyjF)ZmVwlg$59Y=g3Gm7vQOxfQ=Q3WY*clHuRq20jWwoBI3d z4Q3QxNXDMLTtpS`wc~H=xwqn*943F98@!91K12?dd80A`fT22F8N^0Y&X&o{bNRBL zj@;g;zrS&bf>^TNf3EHD^gNISkd%^sZ-%FfG-3!F6Jw1$QPctKu~Uk^UL|^FH)==| z(ft4(;K`VM`Qs^#;MTPdECJMo*eE6RNclBwJ0J#s6oy;2it0t0vK-)&>~wW=Wox!6 zFg`N12QPjFnig?X@kndR-PgUxqyquqr1TwYz_mBG#2YrJb7mQ!7g=9G7R~-Q*bc&6 z=Wc(k8xK!Va(I*5rU=aKurwj`8{ZLCNc?`sDjkp;EKwuqS<{iO*uj|TF8~U0!2D;0 z8kZ)vE#Q1kYbR`}97@E615lqaXq8K9zh?8dp|=$jH36lXE52+? zF|)Az1p=zI`NFh+S&aqwm(Hkj0*?aKkjA6XDi9kL#{)koVVPZYyYKM+2r`WZ_y9SP s7^FV5F&=!#A|=*92(AD33w4jl)}L@wDd0X20G|HO$iN(3uJ4TfKUQpl6aWAK 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 c423d887..6d8a6ce3 100644 --- a/_x_b_o_x_u_s_b_8cpp_source.html +++ b/_x_b_o_x_u_s_b_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXUSB.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

- + - - + + + +
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
-
uint8_t bmRcvToggle
Definition: address.h:41
- +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
- +
LEDModeEnum
Definition: xboxEnums.h:24
-
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
-
uint8_t bmNakPower
Definition: address.h:42
+
EpInfo * epinfo
Definition: address.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
+
uint8_t bmNakPower
Definition: address.h:49
#define XBOX_WIRELESS_RECEIVER_PID
Definition: XBOXRECV.h:45
void setLedOn(LEDEnum l)
Definition: XBOXUSB.cpp:329
- - -
#define pgm_read_word(addr)
+ + +
#define pgm_read_word(addr)
#define JOYTECH_WIRED_PID
Definition: XBOXUSB.h:44
-
#define NotifyFail(...)
Definition: message.h:55
-
AnalogHatEnum
+
#define NotifyFail(...)
Definition: message.h:62
+
AnalogHatEnum
USB * pUsb
Definition: XBOXUSB.h:189
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
+
#define XBOX_REPORT_BUFFER_SIZE
Definition: XBOXUSB.h:48
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXUSB.cpp:39
-
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:86
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:93
int16_t getAnalogHat(AnalogHatEnum a)
Definition: XBOXUSB.cpp:311
#define bmREQ_HID_OUT
Definition: usbhid.h:63
void setLedBlink(LEDEnum l)
Definition: XBOXUSB.cpp:336
-
#define pgm_read_byte(addr)
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
+
#define pgm_read_byte(addr)
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
#define AFTERGLOW_WIRED_PID
Definition: XBOXUSB.h:46
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
#define EP_MAXPKTSIZE
Definition: PS3USB.h:26
virtual void FreeAddress(uint8_t addr)=0
-
LEDEnum
-
uint8_t epAttribs
Definition: address.h:37
-
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
+
LEDEnum
+
uint8_t epAttribs
Definition: address.h:44
+
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:133
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
#define Notify(...)
Definition: message.h:44
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
uint8_t epAddr
Definition: address.h:33
-
#define NotifyFailUnknownDevice(...)
Definition: message.h:54
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
+
#define Notify(...)
Definition: message.h:51
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
uint8_t epAddr
Definition: address.h:40
+
#define NotifyFailUnknownDevice(...)
Definition: message.h:61
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
#define XBOX_VID
Definition: XBOXOLD.h:34
#define XBOX_INPUT_PIPE
Definition: XBOXOLD.h:30
- +
uint8_t bAddress
Definition: XBOXUSB.h:191
uint8_t getButtonPress(ButtonEnum b)
Definition: XBOXUSB.cpp:283
-
Definition: address.h:32
+
Definition: address.h:39
#define XBOX_WIRELESS_PID
Definition: XBOXUSB.h:40
-
ButtonEnum
+
ButtonEnum
bool Xbox360Connected
Definition: XBOXUSB.h:181
- +
#define JOYTECH_VID
Definition: XBOXOLD.h:36
- +
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bmSndToggle
Definition: address.h:40
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define PSTR(str)
+
uint8_t bmSndToggle
Definition: address.h:47
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define PSTR(str)
void setRumbleOn(uint8_t lValue, uint8_t rValue)
Definition: XBOXUSB.cpp:344
XBOXUSB(USB *pUsb)
Definition: XBOXUSB.cpp:23
#define MADCATZ_VID
Definition: XBOXOLD.h:35
- +
#define XBOX_OUTPUT_PIPE
Definition: XBOXOLD.h:31
-
#define USB_NAK_NOWAIT
Definition: address.h:29
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
+
#define USB_NAK_NOWAIT
Definition: address.h:36
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
#define GAMESTOP_VID
Definition: XBOXUSB.h:37
const uint8_t XBOX_LEDS[]
Definition: xboxEnums.h:32
bool getButtonClick(ButtonEnum b)
Definition: XBOXUSB.cpp:291
#define XBOX_MAX_ENDPOINTS
Definition: XBOXOLD.h:43
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
void setLedRaw(uint8_t value)
Definition: XBOXUSB.cpp:321
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
void setLedMode(LEDModeEnum lm)
Definition: XBOXUSB.cpp:340
#define MADCATZ_WIRED_PID
Definition: XBOXUSB.h:43
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
Definition: UsbCore.h:197
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
Definition: UsbCore.h:208
#define XBOX_CONTROL_PIPE
Definition: XBOXOLD.h:29
- - - + + +
uint8_t Release()
Definition: XBOXUSB.cpp:224
#define HID_REQUEST_SET_REPORT
Definition: usbhid.h:72
const uint16_t XBOX_BUTTONS[]
Definition: xboxEnums.h:41
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
-
#define XBOX_REPORT_BUFFER_SIZE
Definition: XBOXONE.h:41
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
uint8_t Poll()
Definition: XBOXUSB.cpp:232
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
EpInfo epInfo[XBOX_MAX_ENDPOINTS]
Definition: XBOXUSB.h:193
#define GAMESTOP_WIRED_PID
Definition: XBOXUSB.h:45
- +
diff --git a/_x_b_o_x_u_s_b_8h.html b/_x_b_o_x_u_s_b_8h.html index 6967af08..fc1efcdf 100644 --- a/_x_b_o_x_u_s_b_8h.html +++ b/_x_b_o_x_u_s_b_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXUSB.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
- - + + @@ -164,7 +144,9 @@ Macros  

Macro Definition Documentation

- + +

◆ EP_MAXPKTSIZE

+
@@ -174,11 +156,13 @@ Macros
-

Definition at line 26 of file XBOXUSB.h.

+

Definition at line 26 of file XBOXUSB.h.

- + +

◆ XBOX_CONTROL_PIPE

+
@@ -188,11 +172,13 @@ Macros
-

Definition at line 29 of file XBOXUSB.h.

+

Definition at line 29 of file XBOXUSB.h.

- + +

◆ XBOX_INPUT_PIPE

+
@@ -202,11 +188,13 @@ Macros
-

Definition at line 30 of file XBOXUSB.h.

+

Definition at line 30 of file XBOXUSB.h.

- + +

◆ XBOX_OUTPUT_PIPE

+
@@ -216,11 +204,13 @@ Macros
-

Definition at line 31 of file XBOXUSB.h.

+

Definition at line 31 of file XBOXUSB.h.

- + +

◆ XBOX_VID

+
@@ -230,11 +220,13 @@ Macros
-

Definition at line 34 of file XBOXUSB.h.

+

Definition at line 34 of file XBOXUSB.h.

- + +

◆ MADCATZ_VID

+
@@ -244,11 +236,13 @@ Macros
-

Definition at line 35 of file XBOXUSB.h.

+

Definition at line 35 of file XBOXUSB.h.

- + +

◆ JOYTECH_VID

+
@@ -258,11 +252,13 @@ Macros
-

Definition at line 36 of file XBOXUSB.h.

+

Definition at line 36 of file XBOXUSB.h.

- + +

◆ GAMESTOP_VID

+
@@ -272,11 +268,13 @@ Macros
-

Definition at line 37 of file XBOXUSB.h.

+

Definition at line 37 of file XBOXUSB.h.

- + +

◆ XBOX_WIRED_PID

+
@@ -286,11 +284,13 @@ Macros
-

Definition at line 39 of file XBOXUSB.h.

+

Definition at line 39 of file XBOXUSB.h.

- + +

◆ XBOX_WIRELESS_PID

+
@@ -300,11 +300,13 @@ Macros
-

Definition at line 40 of file XBOXUSB.h.

+

Definition at line 40 of file XBOXUSB.h.

- + +

◆ XBOX_WIRELESS_RECEIVER_PID

+
@@ -314,11 +316,13 @@ Macros
-

Definition at line 41 of file XBOXUSB.h.

+

Definition at line 41 of file XBOXUSB.h.

- + +

◆ XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID

+
@@ -328,11 +332,13 @@ Macros
-

Definition at line 42 of file XBOXUSB.h.

+

Definition at line 42 of file XBOXUSB.h.

- + +

◆ MADCATZ_WIRED_PID

+
@@ -342,11 +348,13 @@ Macros
-

Definition at line 43 of file XBOXUSB.h.

+

Definition at line 43 of file XBOXUSB.h.

- + +

◆ JOYTECH_WIRED_PID

+
@@ -356,11 +364,13 @@ Macros
-

Definition at line 44 of file XBOXUSB.h.

+

Definition at line 44 of file XBOXUSB.h.

- + +

◆ GAMESTOP_WIRED_PID

+
@@ -370,11 +380,13 @@ Macros
-

Definition at line 45 of file XBOXUSB.h.

+

Definition at line 45 of file XBOXUSB.h.

- + +

◆ AFTERGLOW_WIRED_PID

+
@@ -384,11 +396,13 @@ Macros
-

Definition at line 46 of file XBOXUSB.h.

+

Definition at line 46 of file XBOXUSB.h.

- + +

◆ XBOX_REPORT_BUFFER_SIZE

+
@@ -398,11 +412,13 @@ Macros
-

Definition at line 48 of file XBOXUSB.h.

+

Definition at line 48 of file XBOXUSB.h.

- + +

◆ XBOX_MAX_ENDPOINTS

+
@@ -412,7 +428,7 @@ Macros
-

Definition at line 50 of file XBOXUSB.h.

+

Definition at line 50 of file XBOXUSB.h.

@@ -421,7 +437,7 @@ Macros 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 ffb0405c..3486b50b 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 @@ -18da52fa9e2758f5b169a34307b52822 \ No newline at end of file +e72de7b87014e17ae5652145a0bf146b \ 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 d7f2e38450bffd997f82eaa5e18ada8fc8fa10de..2d2b9deac9f67c02e2fd83381235db2afd758891 100644 GIT binary patch literal 4297 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 G^#1^EMq70N literal 4370 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 - - + + 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 9ea5abe3..55decb56 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 @@ -bffb200b269ce5778ffd1fb3cca482e2 \ No newline at end of file +6f08202f11b618a1375a96c653bf625c \ 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 a368b3c6aa50763a3a2d09e3ced9196c25d26e66..240d98eca8e8a7a04d8e7042e13905067c7768e4 100644 GIT binary patch literal 17782 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 ODh!^kelF{r5}E+#I953T literal 18508 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 - + + USB Host Shield 2.0: XBOXUSB.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: XBOXUSB.h:103
#define JOYTECH_WIRED_PID
Definition: XBOXUSB.h:44
-
AnalogHatEnum
+
AnalogHatEnum
USB * pUsb
Definition: XBOXUSB.h:189
void setLedOff()
Definition: XBOXUSB.h:156
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXUSB.cpp:39
- +
int16_t getAnalogHat(AnalogHatEnum a)
Definition: XBOXUSB.cpp:311
void setLedBlink(LEDEnum l)
Definition: XBOXUSB.cpp:336
virtual bool isReady()
Definition: XBOXUSB.h:93
#define AFTERGLOW_WIRED_PID
Definition: XBOXUSB.h:46
-
LEDEnum
+
LEDEnum
void attachOnInit(void(*funcOnInit)(void))
Definition: XBOXUSB.h:179
uint8_t bAddress
Definition: XBOXUSB.h:191
uint8_t getButtonPress(ButtonEnum b)
Definition: XBOXUSB.cpp:283
-
Definition: address.h:32
-
ButtonEnum
+
Definition: address.h:39
+
ButtonEnum
bool Xbox360Connected
Definition: XBOXUSB.h:181
#define XBOX_VID
Definition: XBOXUSB.h:34
void setRumbleOn(uint8_t lValue, uint8_t rValue)
Definition: XBOXUSB.cpp:344
@@ -129,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
void setLedMode(LEDModeEnum lm)
Definition: XBOXUSB.cpp:340
#define MADCATZ_WIRED_PID
Definition: XBOXUSB.h:43
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
void setAllOff()
Definition: XBOXUSB.h:132
uint8_t Release()
Definition: XBOXUSB.cpp:224
uint8_t Poll()
Definition: XBOXUSB.cpp:232
@@ -140,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/address_8h.html b/address_8h.html index 7fb7ddab..a47e663e 100644 --- a/address_8h.html +++ b/address_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: address.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
 

Macro Definition Documentation

- + +

◆ USB_NAK_MAX_POWER

+
@@ -147,11 +129,13 @@ Typedefs
-

Definition at line 27 of file address.h.

+

Definition at line 34 of file address.h.

- + +

◆ USB_NAK_DEFAULT

+
@@ -161,11 +145,13 @@ Typedefs
-

Definition at line 28 of file address.h.

+

Definition at line 35 of file address.h.

- + +

◆ USB_NAK_NOWAIT

+
@@ -175,11 +161,13 @@ Typedefs
-

Definition at line 29 of file address.h.

+

Definition at line 36 of file address.h.

- + +

◆ USB_NAK_NONAK

+
@@ -189,11 +177,13 @@ Typedefs
-

Definition at line 30 of file address.h.

+

Definition at line 37 of file address.h.

- + +

◆ bmUSB_DEV_ADDR_ADDRESS

+
@@ -203,11 +193,13 @@ Typedefs
-

Definition at line 71 of file address.h.

+

Definition at line 78 of file address.h.

- + +

◆ bmUSB_DEV_ADDR_PARENT

+
@@ -217,11 +209,13 @@ Typedefs
-

Definition at line 72 of file address.h.

+

Definition at line 79 of file address.h.

- + +

◆ bmUSB_DEV_ADDR_HUB

+
@@ -231,11 +225,13 @@ Typedefs
-

Definition at line 73 of file address.h.

+

Definition at line 80 of file address.h.

- + +

◆ ADDR_ERROR_INVALID_INDEX

+
@@ -245,11 +241,13 @@ Typedefs
-

Definition at line 92 of file address.h.

+

Definition at line 99 of file address.h.

- + +

◆ ADDR_ERROR_INVALID_ADDRESS

+
@@ -259,12 +257,14 @@ Typedefs
-

Definition at line 93 of file address.h.

+

Definition at line 100 of file address.h.

Typedef Documentation

- + +

◆ UsbDeviceHandleFunc

+
@@ -274,7 +274,7 @@ Typedefs
-

Definition at line 90 of file address.h.

+

Definition at line 97 of file address.h.

@@ -283,7 +283,7 @@ Typedefs diff --git a/address_8h_source.html b/address_8h_source.html index bbeb394c..4e461709 100644 --- a/address_8h_source.html +++ b/address_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: address.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
address.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(_usb_h_) || defined(__ADDRESS_H__)
19 #error "Never include address.h directly; include Usb.h instead"
20 #else
21 #define __ADDRESS_H__
22 
23 
24 
25 /* NAK powers. To save space in endpoint data structure, amount of retries before giving up and returning 0x4 is stored in */
26 /* bmNakPower as a power of 2. The actual nak_limit is then calculated as nak_limit = ( 2^bmNakPower - 1) */
27 #define USB_NAK_MAX_POWER 15 //NAK binary order maximum value
28 #define USB_NAK_DEFAULT 14 //default 32K-1 NAKs before giving up
29 #define USB_NAK_NOWAIT 1 //Single NAK stops transfer
30 #define USB_NAK_NONAK 0 //Do not count NAKs, stop retrying after USB Timeout
31 
32 struct EpInfo {
33  uint8_t epAddr; // Endpoint address
34  uint8_t maxPktSize; // Maximum packet size
35 
36  union {
37  uint8_t epAttribs;
38 
39  struct {
40  uint8_t bmSndToggle : 1; // Send toggle, when zero bmSNDTOG0, bmSNDTOG1 otherwise
41  uint8_t bmRcvToggle : 1; // Send toggle, when zero bmRCVTOG0, bmRCVTOG1 otherwise
42  uint8_t bmNakPower : 6; // Binary order for NAK_LIMIT value
43  } __attribute__((packed));
44  };
45 } __attribute__((packed));
46 
47 // 7 6 5 4 3 2 1 0
48 // ---------------------------------
49 // | | H | P | P | P | A | A | A |
50 // ---------------------------------
51 //
52 // H - if 1 the address is a hub address
53 // P - parent hub address
54 // A - device address / port number in case of hub
55 //
56 
58 
59  union {
60 
61  struct {
62  uint8_t bmAddress : 3; // device address/port number
63  uint8_t bmParent : 3; // parent hub address
64  uint8_t bmHub : 1; // hub flag
65  uint8_t bmReserved : 1; // reserved, must be zero
66  } __attribute__((packed));
67  uint8_t devAddress;
68  };
69 } __attribute__((packed));
70 
71 #define bmUSB_DEV_ADDR_ADDRESS 0x07
72 #define bmUSB_DEV_ADDR_PARENT 0x38
73 #define bmUSB_DEV_ADDR_HUB 0x40
74 
75 struct UsbDevice {
76  EpInfo *epinfo; // endpoint info pointer
78  uint8_t epcount; // number of endpoints
79  bool lowspeed; // indicates if a device is the low speed one
80  // uint8_t devclass; // device class
81 } __attribute__((packed));
82 
83 class AddressPool {
84 public:
85  virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) = 0;
86  virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) = 0;
87  virtual void FreeAddress(uint8_t addr) = 0;
88 };
89 
90 typedef void (*UsbDeviceHandleFunc)(UsbDevice *pdev);
91 
92 #define ADDR_ERROR_INVALID_INDEX 0xFF
93 #define ADDR_ERROR_INVALID_ADDRESS 0xFF
94 
95 template <const uint8_t MAX_DEVICES_ALLOWED>
96 class AddressPoolImpl : public AddressPool {
97  EpInfo dev0ep; //Endpoint data structure used during enumeration for uninitialized device
98 
99  uint8_t hubCounter; // hub counter is kept
100  // in order to avoid hub address duplication
101 
102  UsbDevice thePool[MAX_DEVICES_ALLOWED];
103 
104  // Initializes address pool entry
105 
106  void InitEntry(uint8_t index) {
107  thePool[index].address.devAddress = 0;
108  thePool[index].epcount = 1;
109  thePool[index].lowspeed = 0;
110  thePool[index].epinfo = &dev0ep;
111  };
112 
113  // Returns thePool index for a given address
114 
115  uint8_t FindAddressIndex(uint8_t address = 0) {
116  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) {
117  if(thePool[i].address.devAddress == address)
118  return i;
119  }
120  return 0;
121  };
122 
123  // Returns thePool child index for a given parent
124 
125  uint8_t FindChildIndex(UsbDeviceAddress addr, uint8_t start = 1) {
126  for(uint8_t i = (start < 1 || start >= MAX_DEVICES_ALLOWED) ? 1 : start; i < MAX_DEVICES_ALLOWED; i++) {
127  if(thePool[i].address.bmParent == addr.bmAddress)
128  return i;
129  }
130  return 0;
131  };
132 
133  // Frees address entry specified by index parameter
134 
135  void FreeAddressByIndex(uint8_t index) {
136  // Zero field is reserved and should not be affected
137  if(index == 0)
138  return;
139 
140  UsbDeviceAddress uda = thePool[index].address;
141  // If a hub was switched off all port addresses should be freed
142  if(uda.bmHub == 1) {
143  for(uint8_t i = 1; (i = FindChildIndex(uda, i));)
144  FreeAddressByIndex(i);
145 
146  // If the hub had the last allocated address, hubCounter should be decremented
147  if(hubCounter == uda.bmAddress)
148  hubCounter--;
149  }
150  InitEntry(index);
151  }
152 
153  // Initializes the whole address pool at once
154 
155  void InitAllAddresses() {
156  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++)
157  InitEntry(i);
158 
159  hubCounter = 0;
160  };
161 
162 public:
163 
164  AddressPoolImpl() : hubCounter(0) {
165  // Zero address is reserved
166  InitEntry(0);
167 
168  thePool[0].address.devAddress = 0;
169  thePool[0].epinfo = &dev0ep;
170  dev0ep.epAddr = 0;
171  dev0ep.maxPktSize = 8;
172  dev0ep.bmSndToggle = 0; // Set DATA0/1 toggles to 0
173  dev0ep.bmRcvToggle = 0;
174  dev0ep.bmNakPower = USB_NAK_MAX_POWER;
175 
176  InitAllAddresses();
177  };
178 
179  // Returns a pointer to a specified address entry
180 
181  virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) {
182  if(!addr)
183  return thePool;
184 
185  uint8_t index = FindAddressIndex(addr);
186 
187  return (!index) ? NULL : thePool + index;
188  };
189 
190  // Performs an operation specified by pfunc for each addressed device
191 
193  if(!pfunc)
194  return;
195 
196  for(uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++)
197  if(thePool[i].address.devAddress)
198  pfunc(thePool + i);
199  };
200 
201  // Allocates new address
202 
203  virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) {
204  /* if (parent != 0 && port == 0)
205  USB_HOST_SERIAL.println("PRT:0"); */
206  UsbDeviceAddress _parent;
207  _parent.devAddress = parent;
208  if(_parent.bmReserved || port > 7)
209  //if(parent > 127 || port > 7)
210  return 0;
211 
212  if(is_hub && hubCounter == 7)
213  return 0;
214 
215  // finds first empty address entry starting from one
216  uint8_t index = FindAddressIndex(0);
217 
218  if(!index) // if empty entry is not found
219  return 0;
220 
221  if(_parent.devAddress == 0) {
222  if(is_hub) {
223  thePool[index].address.devAddress = 0x41;
224  hubCounter++;
225  } else
226  thePool[index].address.devAddress = 1;
227 
228  return thePool[index].address.devAddress;
229  }
230 
231  UsbDeviceAddress addr;
232  addr.devAddress = 0; // Ensure all bits are zero
233  addr.bmParent = _parent.bmAddress;
234  if(is_hub) {
235  addr.bmHub = 1;
236  addr.bmAddress = ++hubCounter;
237  } else {
238  addr.bmHub = 0;
239  addr.bmAddress = port;
240  }
241  thePool[index].address = addr;
242  /*
243  USB_HOST_SERIAL.print("Addr:");
244  USB_HOST_SERIAL.print(addr.bmHub, HEX);
245  USB_HOST_SERIAL.print(".");
246  USB_HOST_SERIAL.print(addr.bmParent, HEX);
247  USB_HOST_SERIAL.print(".");
248  USB_HOST_SERIAL.println(addr.bmAddress, HEX);
249  */
250  return thePool[index].address.devAddress;
251  };
252 
253  // Empties pool entry
254 
255  virtual void FreeAddress(uint8_t addr) {
256  // if the root hub is disconnected all the addresses should be initialized
257  if(addr == 0x41) {
258  InitAllAddresses();
259  return;
260  }
261  uint8_t index = FindAddressIndex(addr);
262  FreeAddressByIndex(index);
263  };
264 
265  // Returns number of hubs attached
266  // It can be rather helpfull to find out if there are hubs attached than getting the exact number of hubs.
267  //uint8_t GetNumHubs()
268  //{
269  // return hubCounter;
270  //};
271  //uint8_t GetNumDevices()
272  //{
273  // uint8_t counter = 0;
274 
275  // for (uint8_t i=1; i<MAX_DEVICES_ALLOWED; i++)
276  // if (thePool[i].address != 0);
277  // counter ++;
278 
279  // return counter;
280  //};
281 };
282 
283 #endif // __ADDRESS_H__
uint8_t bmRcvToggle
Definition: address.h:41
- -
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
uint8_t bmNakPower
Definition: address.h:42
- - -
uint8_t bmReserved
Definition: address.h:65
-
uint8_t epAttribs
Definition: address.h:37
-
uint8_t epAddr
Definition: address.h:33
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
-
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)
Definition: address.h:181
-
Definition: address.h:32
-
uint8_t bmSndToggle
Definition: address.h:40
-
uint8_t devAddress
Definition: address.h:67
-
uint8_t bmAddress
Definition: address.h:62
-
uint8_t bmParent
Definition: address.h:63
- -
uint8_t epcount
Definition: address.h:78
-
void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
Definition: address.h:192
-
uint8_t maxPktSize
Definition: address.h:34
-
virtual void FreeAddress(uint8_t addr)
Definition: address.h:255
- -
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)
Definition: address.h:203
-
UsbDeviceAddress address
Definition: address.h:77
-
uint8_t bmHub
Definition: address.h:64
-
void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
Definition: address.h:90
+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
+
uint8_t bmNakPower
Definition: address.h:49
+ + +
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
+
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
+
uint8_t bmParent
Definition: address.h:70
+ +
uint8_t epcount
Definition: address.h:85
+
void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
Definition: address.h:199
+
uint8_t maxPktSize
Definition: address.h:41
+
virtual void FreeAddress(uint8_t addr)
Definition: address.h:262
+ +
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 99d83a7f..c95fef2a 100644 --- a/adk_8cpp.html +++ b/adk_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: adk.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
diff --git a/adk_8cpp__incl.md5 b/adk_8cpp__incl.md5 index aeb01f6d..b86ac594 100644 --- a/adk_8cpp__incl.md5 +++ b/adk_8cpp__incl.md5 @@ -1 +1 @@ -44064901c7f950ea3e40c91d455ee2ad \ No newline at end of file +37a39de020a1edaf438fb10fe5d6d241 \ No newline at end of file diff --git a/adk_8cpp__incl.png b/adk_8cpp__incl.png index 50af6776d500c35b7d5ef7be980f6ee76936d887..85e64546e11b6715979a9004a420d28c0b7bbbca 100644 GIT binary patch literal 4008 zcmcInXHXMbx1~r35C}@|AWf8Bqy=fBa8W5<;1UFZfP^M00s%q|9RUTACZS#FOsME8XB;($$kAl5wzR6OkP~yMS8;+pwRqC9Sq&4 zH$TOe<@3Xtc@2j~3}mD{43@5o^T#KIJ1#}@-=Hg$FlHAQcBBPANw2uXvLrCZv4c5> zp#{#@ZxJo$!oEIT^_y3k4bk?Q7jOy1Z|*#6Q^`Bdfi?Mb<}B=={_!JIfX@W`!(H+G!_P5FV8mI1mpe80vQtbOo z&aYPb`R+(<)v)eC7M-V?e0bV;4vv1M=oZ`7zle5a{~hbJpJ~iQOK(QkV}glTjY^eB ziIArKB{9|IYhaQpy+TSB)HE>7kYE0HvcZ$bd$P{RQthG$#yDe+--Ft@1aVagwgpSAoFHa0f8i^qw?k@e9MTyaa% zNBLB7P0`kQ7KL`b@QnBG^~Rrv={(L-juu&(sD&L&z*2^>C`K7Mxuh6Y0q&zA_{qWg zsEo99tT2*h)8fm-4sGx-qK2ybhy=9Gg~`g=dStir>dAb_u@Eh(<9NlwPFUAJOnyUI%?mqGeAOq{G}MzM;C{3hs7nHbIT9Cb9Ha z*9$=4dDYvS>d%~YO&zP_Sfk+9F%Y8AU0EiElk8oZD;&++Q0IZ@Da*^Q4M zKIk(rFj%zh70h@KPo&(V#03krdS%Glm%5J@x6iGWZ$)MY9ju8>VUHKHx?eGt*wi>+ z!mdIo`vl#-!)j{{tB3M&Dbm5*zl-(Vog-_wY)$BQ zUK|PJ`6-<=c~5^*oO3KTgrRncG$6=P1f#I%Bj%H?p&wOtP2`Zb-*K_vv(fjlvs(MX z>(sv)jAe3pzz1RoIXhZ*RXVG&Yf9dQCB-}3Y}H8l^Q36TyQX#HHnjc)D;EzB2ZYU@ zT}24+R+Xm7S5YeTWHEMzg&G&;m4^U$Kbm*Tf-UKr+gPau@>Ulp!S<{$QGTgj?uD-s zr~UIqgcXyY8gwc4~j zlCol?2&dEcX!KwQv&u~=c7#(Rx7-$+}b0v zOT}%3a=3X)VaEZ3OeCasRu=`GH7HHzTCM~RuG+i6*O`-1l9H0Icdt7&*;Nii62z0E zFvfZU%oKMUhHymjjt_2C8A?Jdl67)XTX=g51a!GE~PsLxCoTR8L`cF zgpKj%u+id>w`bdZYd<~&dd(IuuQ`WGN`949x0CC%RA-HU$VYD$(Hh~lAj58c%L78_ zdMcW4K88R?l<4UdlEp@Xuae18gMszN=}&bfar|sqxw#Jr5b-c% zzF5g|Ftn?$|Iru2*yLKqcbj?6n7eJ5gK){rF7%SHJ5z6fO^%Y!$ls77((4P~);ALO zZp#XankBzZxJzPYrqoK~aEW(-QbO7<>SA*@^NP4$@6CA7D`;!y1|7d7n$DL6@O)V>)aNy|qHKv@4i*+nX zpvKIQRjpjO^`-r63x!#kfKuOpL%RiZTBX%|(BA@+`2S6lu^daBSp%4xBJlY5P@fz{ zeS&;nr*WyIwpuYQm&)Gy@85#Yt%;n^4GiitKc|@_YJ3+Zrec#Lwk?df`&@4awgv!GA&p#9z=mF0`n=l;oa7lR{?X9Ijg zEE(9U6Fim!&5_89!|_1FduLlJlm!&nOMoH0hvzxcqCCYbm?j#egkp4k+1LuQvjUzO z;qsG%&rkN?foV z&~e-DSJNDIA2xRd7x{-N!UK|#!#cS2TSY@)-SaLZXeVXk4uz^zlmFtU-ouQvyGNI` zt#^12+WaSP?6&U{kMC=Bz?T~19;UlZZYtOzQI?clM>RiF_g&Ab; z+A#z%-xWdMa-&Js2eYJe2thDGZc`-`02b~~hez|?=5!IeN<=sjL%!)3^4u(8FMRpP zTqH1BUiruZaI?lCr-U@5BNB38!A1++9!idNz6&aE3%W-wcc{vzi*uRdMKUl%i^ns#p-S)izZr_iUTo2E(Xkapgq^^&}i1g<-kw!i9jW!iIIw#E}M=DRx+wcxEhzB}cU0$4S!U`>H z+hAL>!Ji$1)>ia(`8j=%-iTH4~Zu8-NGnotrd+vVksyC7# zI4QOUU@W%H-QAZM z_^|ihlB-UQa3?5w$T2ijS6-P_?@&Z!dP%(dFevDO%M|6}qD?mx8CG89{mg}5D`?zd zTIbRF$$fVfCy?+=eEgjse)=37IU~)lFX(?O{z6qQR!(){%uWkfnT;1g|3jV(4CHE- zny7#c7bv!GfVHNZ)hEiPHE`&g=>!yOXej+ekaNUu*!4fG=}-D6nFZ}vzyz)t8^EB( z%Q)r&hl%q>!>);mhLQw7nld4X9&Kgu}{Noj^! zok}!(;>I_=|5R2URFwIWof%P4S@}D`@B>in!CPH$N^i!;kKYnRg27P9G>e~c_*4I# z8562`NLhOZO%5z%sHKx02^pE!!1UI7LpQd^$~YQ4$CESkCrlHy+o@B)Xn&SUOES6IzHP!TEl=!L z08TVMxvdwtJ5h_uf1w?)^GpUDw^svgNa&+W;Z=%6haB0u&%q_Wv7(#5u+9D+cL+|Z z2smCJjm`hzo&G(lJ0K`X%Rc1r-z~1HG+?+3;B=ps9zgOOjf|utL>KFzGP0ppKHnUZ z{FNf&4l7eHDki`Mo55fQl zDt21y^z@V##@i#mCIl9^`!1N1KT#d%7y{Tuu_0f)D83q?&s5}={i`bnyynw!$UTeP zAAnS%hA?iVA%i$$*h(KBUx2}=?x@Ab$6u-g^l(CH3=ZQo1sBw3v+NALfcIxA39`4> zV=y0wa+Sove9BRTuf}5r@TszVmEhdSl)$vnE!xuwa<`4O^$N_hAslhtk;OxVgK&)h zR*}_9$t-O8v4j6KuyQ^Sy1cynBxQFeDR@Ti<_YRh;Dvq`wx0BXuifV1K4yAjVgXLX zQo)!2KhQ8i10sL|H0(b`g! zBo%6psy$*8#huS{KhK-z{e8bU=e#)M^FROdKfllSmjE@=Wum`DPeDP!q_3y_h&&pT zTQeOExi>wc+NYpk=GE8MfCU1!3;*(9C-4n~H9m4J373Ex0EUDx$ZsI%GLipwi8_5k zZ!TSQAa$uoWct^{z;u?+RMG0xCZew+>Cqw>kmGNUK4{Gi?XuK~kbBLPdwKx4_9Nzv+d1>vg+y+2N|u{Mm+n7_CKGwKDY z(g3^WVe=jW%Wa^qs7aA+BXPyU$4r6D#4foShc0Jt75nQp@f4%QBM0>4=`w%HF&q<#5wGEF^&(9 zd#4Le4LVpc@$r$7uxU!R3q6CAR`R{Yi^{6d?BTO726#2PKvU&Lg^*wUDeqEv_g5UD$^u>-n+SJyhGyO|bcR_ESy@_& zM1aHqeQHbTT(1)w-3g_39l`n&sl4~`N#HMf&2!dM&#fEXALvDa>UiY69=b9O61z$t z%DIod)rg|Ok%Op2e9GB!NgCXl`E07go9FRPCq+b6)sBeGMtFbm02YI2h#ROP=j^JZoEjo^9fWc^c{ zfS?JJGquapp0<>1|IKk$l4&lbkbJM&q5t~&x=(#eOKx>kwtw*;-});iW?nf`L#zMh zpp3`-mqMcg1(2?--(};oi93h#-0M)Qt2Q}`sCeW?Wd&Un<>eFfa*l+}vQpmCC#Qk- z^K@Z(`3at~kdvM4S!$UcT3e0$d!8t;&K0?WF#f~RI0)><>xAU6Etil{m6P-qT0KQY z#prmg8@+mQ*LgWQw{IUNOgDLEn&cK1ZpS!E$g4XYYCmOGgRzBmgq-Bq0(79sQ)X4> z+3zHDdqCw(suLw&i5!$Hj-KL_!uJ-u|?yCy+f zN3WGIpuafdOnsM)cbL<$eGgLX^n&9vz~@cY*)J^tSh_n*+%h|Dhbg zr8kXuVU8E!yI;X9X%HcNB1c=F6Y9mB(;PAYx#!UrW=s(j(EH>;elelRL-B#~E&nds zEVZ;Mix0SXR@>ei^NN>kj-P5qN8Qhlo=Jp-FsdWM_zxGNB%A^js|2^4D8QhaAhyPciAqzdJ&~7Y)1~HU7GsL)AK+h&5wz}FaR?S`in6qy=cd}Q z>$k>6)D+97t-FRsyu7FVShM4e3LoAL{GLC-X-##dQcnsEom=RNvKmw_p=VD*rhiJJF3LgLiBstK7*T=Q+^mgkF_Hppce=1vUMi}-d}!X-~5iQeI>EBDIVry~Uk{Ux_~d;9}g0=%Xg zD#tz<7#L(uy?yTtwT||B~EZ($7SdOOwhk&QA{B^<8p3VA4J16sD#j0n^nc*bOl{({M)kl)t-~Y)? zl_>}%tqY6dgBLmhq`d(?w+qq{U?35pscpe+#1Qf3zS710-F8zkf}?sTocA!(rpZI} zTy`x;^KX`Wj=gldJPaRG?$A9?-;SYIfO&3jm64w^BW`UITM`9ZY8v9H@v{(QHi?WM z93E!3pYwYKX@D?t(ATA3J!qBLRKoM)7&1)hOybzabnVKLlKoHBmkFM}9KgKQEK$?H zsa+ej?gJAirO;EQQO$`)yVK316<^2^W=>(!nM3!#2_uisyno6)y?Tk8L2v-0OK=sU zI8(Gc89zpS#yrQX-@ra1f2GKyL}b}pKrg-J{4QPJV;|E5YD;^N)$nlS{;p+xzw@kF zAQcT`x}d~Z+vdava7>YI8c^ceVaZmCjg4zwAP+$H7hm8)#9J1MTLSnrmE+tjnSm$a z^0#|uB4>Zs8{CLI-7iP2Rc+N#8*&+r3+fo|sTo=p=B(RxE}3lAVhr#JsyYXof|m7V28 z(*_=5DRyZZpa`#8MNll3(oH%L9>)%ixOiujy&#id%E_tQ)6O z%8&(ny?5Ac<7JxZdsH;PsN{(M1xfpVdKr5(1nmzR^y}~`iRlRn{~Rl% zS~p-sXeCFCO1_6LYC}09qoMobeGL(`lRo!ToIAUn7_F=fdk@<5TR;9--K#{Qs9Uct zIRTKy#H<0|lvqZb!6);43>6Bbr9>@45DScl6lx!tNY*SIZB4>lnPIT@b_0=d0WsD> zC9;;W*s|Ch?Vi82OhS)+Z-}H-h@z$4=n?!Mr9%)~{oM2_E6v&qwn}mNpxC=pT~X|G zd1&`mY>ck#hU-)p)!&;oRxB~`I=qGkfi*T09PeF3UvZU6WyQk8OO(DyKPPieo|6Cj z8fu${yDzpZ%?3w}IqN_by@!2BTam1I?r{Aj}7ZKmY~3Kw%Nm~?7H3{XA5<1G=2*neacQ2(5};wwK!(Mv zj0_O+<90cDPxN0mT$g$i9_a>+7O5O=RDEE}YI8`}9`KiFYWAKtg4UC7-YUTyzxTnq z5i&^m6b?_=4Y05O&Xd9`9aSNDyjSzn#=Ap^&}P%@B{5g~GN-yO7kX-BXjn$}B>0aG zJ=Nta@;_P!QD@8o*qjd*ABtwUwu%#1o}AC<`7#0XMmi&?kR+)?TkQRv@tXW( z5g4a8OXnX(94+rD*>44Vhd6ZRD*BdJ%fJ0qJ3?IS`Q3C~^G9u$786JyB?D}#cTtW) zVbEP2GDrOst}RXjDrTu%)R)*$<33jGI0+O?WbBL4;SQ - + + USB Host Shield 2.0: adk.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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, uint8_t alt, uint8_t proto, 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 
324  if((pep->bmAttributes & 0x02) == 2) {
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:771
-
uint8_t bmRcvToggle
Definition: address.h:41
- +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:784
+
uint8_t bmRcvToggle
Definition: address.h:48
+
#define ADB_PID
Definition: adk.h:27
#define ACCESSORY_STRING_MODEL
Definition: adk.h:43
static const uint8_t epDataInIndex
Definition: adk.h:69
uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
Definition: adk.cpp:347
-
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
-
uint8_t bmNakPower
Definition: address.h:42
- +
EpInfo * epinfo
Definition: address.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
+
uint8_t bmNakPower
Definition: address.h:49
+
uint8_t Release()
Definition: adk.cpp:337
uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
Definition: adk.cpp:353
- - - + + +
#define ACCESSORY_STRING_URI
Definition: adk.h:46
#define ACCESSORY_STRING_MANUFACTURER
Definition: adk.h:42
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: adk.cpp:312
USB * pUsb
Definition: adk.h:73
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: adk.cpp:59
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
static const uint8_t epDataOutIndex
Definition: adk.h:70
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
#define ADK_PID
Definition: adk.h:26
virtual void FreeAddress(uint8_t addr)=0
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
#define Notify(...)
Definition: message.h:44
- - -
#define USBTRACE2(s, r)
Definition: macros.h:77
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
#define NotifyFailGetConfDescr(...)
Definition: message.h:52
-
uint8_t epAddr
Definition: address.h:33
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
+
#define Notify(...)
Definition: message.h:51
+ + +
#define USBTRACE2(s, r)
Definition: macros.h:84
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
#define NotifyFailGetConfDescr(...)
Definition: message.h:59
+
uint8_t epAddr
Definition: address.h:40
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
bool ready
Definition: adk.h:78
#define ACCESSORY_STRING_SERIAL
Definition: adk.h:47
-
Definition: address.h:32
-
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:293
-
uint16_t wMaxPacketSize
Definition: usb_ch9.h:146
+
Definition: address.h:39
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
+
uint16_t wMaxPacketSize
Definition: usb_ch9.h:153
+
#define bmUSB_TRANSFER_TYPE
Definition: usb_ch9.h:94
#define ACCESSORY_STRING_VERSION
Definition: adk.h:45
ADK(USB *pUsb, const char *manufacturer, const char *model, const char *description, const char *version, const char *uri, const char *serial)
Definition: adk.cpp:25
EpInfo epInfo[ADK_MAX_ENDPOINTS]
Definition: adk.h:81
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bEndpointAddress
Definition: usb_ch9.h:144
-
uint8_t bmSndToggle
Definition: address.h:40
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define PSTR(str)
+
uint8_t bEndpointAddress
Definition: usb_ch9.h:151
+
uint8_t bmSndToggle
Definition: address.h:47
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define PSTR(str)
#define ADK_MAX_ENDPOINTS
Definition: adk.h:49
- +
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: adk.cpp:357
-
#define USB_NAK_NOWAIT
Definition: address.h:29
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
+
#define USB_NAK_NOWAIT
Definition: address.h:36
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: adk.cpp:64
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
+
#define USB_TRANSFER_TYPE_BULK
Definition: usb_ch9.h:92
#define ACCESSORY_STRING_DESCRIPTION
Definition: adk.h:44
uint8_t bNumEP
Definition: adk.h:77
#define ADK_VID
Definition: adk.h:25
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
uint8_t bConfNum
Definition: adk.h:75
-
#define USBTRACE(s)
Definition: macros.h:75
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
+
#define USBTRACE(s)
Definition: macros.h:82
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
uint8_t bAddress
Definition: adk.h:74
-
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:88
- +
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:99
+
diff --git a/adk_8h.html b/adk_8h.html index a8006e0e..1b36397d 100644 --- a/adk_8h.html +++ b/adk_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: adk.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ ADK_VID

+
@@ -164,11 +146,13 @@ Macros
-

Definition at line 25 of file adk.h.

+

Definition at line 25 of file adk.h.

- + +

◆ ADK_PID

+
@@ -178,11 +162,13 @@ Macros
-

Definition at line 26 of file adk.h.

+

Definition at line 26 of file adk.h.

- + +

◆ ADB_PID

+
@@ -192,11 +178,13 @@ Macros
-

Definition at line 27 of file adk.h.

+

Definition at line 27 of file adk.h.

- + +

◆ XOOM

+
@@ -206,11 +194,13 @@ Macros
-

Definition at line 29 of file adk.h.

+

Definition at line 29 of file adk.h.

- + +

◆ ADK_GETPROTO

+
@@ -220,11 +210,13 @@ Macros
-

Definition at line 35 of file adk.h.

+

Definition at line 35 of file adk.h.

- + +

◆ ADK_SENDSTR

+
@@ -234,11 +226,13 @@ Macros
-

Definition at line 36 of file adk.h.

+

Definition at line 36 of file adk.h.

- + +

◆ ADK_ACCSTART

+
@@ -248,11 +242,13 @@ Macros
-

Definition at line 37 of file adk.h.

+

Definition at line 37 of file adk.h.

- + +

◆ bmREQ_ADK_GET

+
@@ -262,11 +258,13 @@ Macros
-

Definition at line 39 of file adk.h.

+

Definition at line 39 of file adk.h.

- + +

◆ bmREQ_ADK_SEND

+
@@ -276,11 +274,13 @@ Macros
-

Definition at line 40 of file adk.h.

+

Definition at line 40 of file adk.h.

- + +

◆ ACCESSORY_STRING_MANUFACTURER

+
@@ -290,11 +290,13 @@ Macros
-

Definition at line 42 of file adk.h.

+

Definition at line 42 of file adk.h.

- + +

◆ ACCESSORY_STRING_MODEL

+
@@ -304,11 +306,13 @@ Macros
-

Definition at line 43 of file adk.h.

+

Definition at line 43 of file adk.h.

- + +

◆ ACCESSORY_STRING_DESCRIPTION

+
@@ -318,11 +322,13 @@ Macros
-

Definition at line 44 of file adk.h.

+

Definition at line 44 of file adk.h.

- + +

◆ ACCESSORY_STRING_VERSION

+
@@ -332,11 +338,13 @@ Macros
-

Definition at line 45 of file adk.h.

+

Definition at line 45 of file adk.h.

- + +

◆ ACCESSORY_STRING_URI

+
@@ -346,11 +354,13 @@ Macros
-

Definition at line 46 of file adk.h.

+

Definition at line 46 of file adk.h.

- + +

◆ ACCESSORY_STRING_SERIAL

+
@@ -360,11 +370,13 @@ Macros
-

Definition at line 47 of file adk.h.

+

Definition at line 47 of file adk.h.

- + +

◆ ADK_MAX_ENDPOINTS

+
@@ -374,7 +386,7 @@ Macros
-

Definition at line 49 of file adk.h.

+

Definition at line 49 of file adk.h.

@@ -383,7 +395,7 @@ Macros diff --git a/adk_8h__dep__incl.md5 b/adk_8h__dep__incl.md5 index 721031bf..18dadafe 100644 --- a/adk_8h__dep__incl.md5 +++ b/adk_8h__dep__incl.md5 @@ -1 +1 @@ -e6d0d56c52d3fb6e81b76806cae456b2 \ No newline at end of file +a78ec97d5c424edcde2b6c3a1b1b88c2 \ No newline at end of file diff --git a/adk_8h__dep__incl.png b/adk_8h__dep__incl.png index 119386d5a72c8df9ae1eec024628b5f08e74c47d..e5ddcbf093dfd5ed8a28b1a2998eac23763dc3c3 100644 GIT binary patch literal 2767 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 aA^HYG^_ diff --git a/adk_8h__incl.md5 b/adk_8h__incl.md5 index 78ab8688..383ea7d2 100644 --- a/adk_8h__incl.md5 +++ b/adk_8h__incl.md5 @@ -1 +1 @@ -6316d3a392a1c1e1b044b310cd053323 \ No newline at end of file +42c5ecb0a034afd3b6c9fa96def7afb2 \ No newline at end of file diff --git a/adk_8h__incl.png b/adk_8h__incl.png index 890613155883b13373322fa85eef947126d4d0d8..0799da79ffacecbb941ee7b30ee2269b015e1185 100644 GIT binary patch literal 2350 zcmb`J`#Td37rV5 zMeSDeRkL;WEc55<VUYv(1`B}FCZ=2<(Sv~+99RVXBES|)$K zruNHx%=|pTag4CiGMMu0nupijb`EFgc@=@C1BbxvlgwSpUw7st0lRWQ>bl}kAs(7y zlFaPu`^WgJjz%Zi?yhDctXp-9c>M<}oJ#Bk1O!-1r~W)xo3b2vb*F-SV9_}@-eyRq zP_FpylS&@uaP$z`R$SU(4QC znr=#XczNNa>J)}0*lIdD!#pi_ejfK}i>moTiQ{agWy>0G_+u4R^_5k1DOr0Pvl+n& zKCmgd)rpSU#ek+l5fe6b`=%#gg>ie_1PB!s71h7-=0wrifOO6Eg&~bAEog=Dw!1lb z`T3P$6O1MM4$k_tO_4!}WK-~G9OYuEQ*JIcyDel`+a!AJbo}o%Y-`lAy~AT|GEVp; zCv4+XBXfkY8TgO~qUuPrd~p12G2H~$nC-3IlWCZ@tPcKkxTTMCO%67Z-%cQC8d%=hMyZY!!b2u@Uv!&kC z-Q7Rkn^Rd;WzR~j_wRMhkkq2a@BJDGY3W4A0C;Mj>iOd;ZGOMISZw4{7&7{@hAy>G z=MXxtibkDNhz7OVwnZ(gojGGa@{qQ^yNO!pf0l9^77?9&QQMbpTVfJfR#v8XZ}Uf1 zX!UCG`jfo8GE@(XH85OzZF?)xBXnIT;=u>J;paRRhoGI6@dge3pnmfaNhv9tHQDHl zi}L59C*5ZCOil4$Xg(VLJ>2HqEQYB9qFTBob$uCe>i+QOo;BqqKR=d`q;!1WxPUr! zwY0K+t&BTB+V>uDV*v$$CH=6I_? zmb_UJD^uDM#U_xici}#92Qat2IIJJ`{T$ru4VzuDKHclaCYT{c`6itMw-<&|b3r~~ zz1eb=(bxo`d z2Pcg;k!yY1?O~{o1zjC)V~Z5MfmHUxA0P00?lGYwjg7S?zJB zJ3G$Cy2Q~djbGxg8?!sh`w;4CYF`o#cSUOG`y_lIaRn{`douB#t)rY_J0o@Zo>ZOt zUm+0KGO6+%?B6T-|8#V|}ZD1P)WC ztLU&xw1K8qd3k+$7HeK9X{xIe!ox=}ak4``yh;X5dI6~Bp>`!z)pYBug=ZCVR#V;q zG%S{5M)19d*V|#rb|WwnnPX$L)<4S0DlUP6A%^v6oj~G{fPnDU^}%V34w^$SXTp~U z$PRg(-Cn21dK(&yEL3tGFJC5$OQ9whzebk84i0^VS~2y^`!Z_CI*(CxJEudu7(_#k z7q~AUR4Ofk!mqH25@krHY6S;l+3CRhQPH@$Dq$Vap7b#xv<;ehr7$G6u7ayL&Y{X7rmxbSloX4r653uRr;D1Vu(_`{It1n&u#^B`cDO32WaAbOuX`ks1QVoE(Z`c>L3C5(ZJ;50>D!B*jf05=9(!wRT!OLD z-U*TF)D(Vs-8O!4Zc2eGI-Z0~?KIYH!B&bMQ|=$XHTn{97ON&gY;DLxi$4Aa zWVK+X=f2kahpSmd)KaNL&@st3j}(#>GPxJ2qxcll6f7dIsb0%m0$Tt;hEjY0c_Xy> zM!bUXJ&hA8$v?E0fHXdBzozv1bkzNFookG%5Lut1$&P^was3y(`uW`O3Cr9QY4Ax) zzus>!wK*tx%n^bN@@t?7P;9ge4ZR>rDVj>Qq6VFdDz)vHXq6}30da{NO``I>>)#vwplJZpyHWr#x5~-mJEfN&^FOZ?lm7+=^=8fh literal 2310 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 diff --git a/adk_8h_source.html b/adk_8h_source.html index 70e5d293..394baaf0 100644 --- a/adk_8h_source.html +++ b/adk_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: adk.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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
uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
Definition: adk.cpp:353
- +
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: adk.cpp:312
USB * pUsb
Definition: adk.h:73
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: adk.cpp:59
#define ADK_GETPROTO
Definition: adk.h:35
- +
virtual bool isReady()
Definition: adk.h:111
static const uint8_t epDataOutIndex
Definition: adk.h:70
@@ -108,21 +88,21 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#define ADK_ACCSTART
Definition: adk.h:37
#define ADK_PID
Definition: adk.h:26
virtual uint8_t Poll()
Definition: adk.h:103
-
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
+
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:133
#define ADK_SENDSTR
Definition: adk.h:36
#define bmREQ_ADK_GET
Definition: adk.h:39
bool ready
Definition: adk.h:78
virtual uint8_t GetAddress()
Definition: adk.h:107
-
Definition: address.h:32
+
Definition: address.h:39
ADK(USB *pUsb, const char *manufacturer, const char *model, const char *description, const char *version, const char *uri, const char *serial)
Definition: adk.cpp:25
EpInfo epInfo[ADK_MAX_ENDPOINTS]
Definition: adk.h:81
#define bmREQ_ADK_SEND
Definition: adk.h:40
#define ADK_MAX_ENDPOINTS
Definition: adk.h:49
- +
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: adk.cpp:357
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: adk.h:115
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: adk.cpp:64
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
uint8_t bNumEP
Definition: adk.h:77
#define ADK_VID
Definition: adk.h:25
uint8_t bConfNum
Definition: adk.h:75
@@ -132,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/annotated.html b/annotated.html index 7792e895..0d44efd1 100644 --- a/annotated.html +++ b/annotated.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
- + - - + + + +
- + - - + + + + - + - - + + + +
avrpins.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 /* derived from Konstantin Chizhov's AVR port templates */
19 
20 #if !defined(_usb_h_) || defined(_avrpins_h_)
21 #error "Never include avrpins.h directly; include Usb.h instead"
22 #else
23 #define _avrpins_h_
24 
25 #if defined(__AVR__)
26 
27 // pointers are 16 bits on AVR
28 #define pgm_read_pointer(p) pgm_read_word(p)
29 
30 // Support for these boards needs to be manually activated in settings.h or in a makefile
31 #if !defined(BOARD_MEGA_ADK) && defined(__AVR_ATmega2560__) && (USE_UHS_MEGA_ADK || defined(ARDUINO_AVR_ADK))
32 #define BOARD_MEGA_ADK
33 #elif !defined(BOARD_BLACK_WIDDOW) && USE_UHS_BLACK_WIDDOW
34 #define BOARD_BLACK_WIDDOW
35 #endif
36 
37 #ifdef PORTA
38 #define USE_PORTA
39 #endif
40 #ifdef PORTB
41 #define USE_PORTB
42 #endif
43 #ifdef PORTC
44 #define USE_PORTC
45 #endif
46 #ifdef PORTD
47 #define USE_PORTD
48 #endif
49 #ifdef PORTE
50 #define USE_PORTE
51 #endif
52 #ifdef PORTF
53 #define USE_PORTF
54 #endif
55 #ifdef PORTG
56 #define USE_PORTG
57 #endif
58 #ifdef PORTH
59 #define USE_PORTH
60 #endif
61 #ifdef PORTJ
62 #define USE_PORTJ
63 #endif
64 #ifdef PORTK
65 #define USE_PORTK
66 #endif
67 #ifdef PORTL
68 #define USE_PORTL
69 #endif
70 #ifdef PORTQ
71 #define USE_PORTQ
72 #endif
73 #ifdef PORTR
74 #define USE_PORTR
75 #endif
76 
77 #ifdef TCCR0A
78 #define USE_TCCR0A
79 #endif
80 #ifdef TCCR1A
81 #define USE_TCCR1A
82 #endif
83 #ifdef TCCR2A
84 #define USE_TCCR2A
85 #endif
86 
87 //Port definitions for AtTiny, AtMega families.
88 
89 #define MAKE_PORT(portName, ddrName, pinName, className, ID) \
90  class className{\
91  public:\
92  typedef uint8_t DataT;\
93  public:\
94  static void Write(DataT value){portName = value;}\
95  static void ClearAndSet(DataT clearMask, DataT value){portName = (portName & ~clearMask) | value;}\
96  static DataT Read(){return portName;}\
97  static void DirWrite(DataT value){ddrName = value;}\
98  static DataT DirRead(){return ddrName;}\
99  static void Set(DataT value){portName |= value;}\
100  static void Clear(DataT value){portName &= ~value;}\
101  static void Toggle(DataT value){portName ^= value;}\
102  static void DirSet(DataT value){ddrName |= value;}\
103  static void DirClear(DataT value){ddrName &= ~value;}\
104  static void DirToggle(DataT value){ddrName ^= value;}\
105  static DataT PinRead(){return pinName;}\
106  enum{Id = ID};\
107  enum{Width=sizeof(DataT)*8};\
108  };
109 
110 // TCCR registers to set/clear Arduino PWM
111 #define MAKE_TCCR(TccrName, className) \
112  class className{\
113  public:\
114  typedef uint8_t DataT;\
115  public:\
116  static void Write(DataT value){TccrName = value;}\
117  static void ClearAndSet(DataT clearMask, DataT value){TccrName = (TccrName & ~clearMask) | value;}\
118  static DataT Read(){return TccrName;}\
119  static void Set(DataT value){TccrName |= value;}\
120  static void Clear(DataT value){TccrName &= ~value;}\
121  static void Toggle(DataT value){TccrName ^= value;}\
122  enum{Width=sizeof(DataT)*8};\
123  };
124 
125 #ifdef USE_PORTA
126 
127 MAKE_PORT(PORTA, DDRA, PINA, Porta, 'A')
128 #endif
129 #ifdef USE_PORTB
130 MAKE_PORT(PORTB, DDRB, PINB, Portb, 'B')
131 #endif
132 #ifdef USE_PORTC
133 MAKE_PORT(PORTC, DDRC, PINC, Portc, 'C')
134 #endif
135 #ifdef USE_PORTD
136 MAKE_PORT(PORTD, DDRD, PIND, Portd, 'D')
137 #endif
138 #ifdef USE_PORTE
139 MAKE_PORT(PORTE, DDRE, PINE, Porte, 'E')
140 #endif
141 #ifdef USE_PORTF
142 MAKE_PORT(PORTF, DDRF, PINF, Portf, 'F')
143 #endif
144 #ifdef USE_PORTG
145 MAKE_PORT(PORTG, DDRG, PING, Portg, 'G')
146 #endif
147 #ifdef USE_PORTH
148 MAKE_PORT(PORTH, DDRH, PINH, Porth, 'H')
149 #endif
150 #ifdef USE_PORTJ
151 MAKE_PORT(PORTJ, DDRJ, PINJ, Portj, 'J')
152 #endif
153 #ifdef USE_PORTK
154 MAKE_PORT(PORTK, DDRK, PINK, Portk, 'K')
155 #endif
156 #ifdef USE_PORTL
157 MAKE_PORT(PORTL, DDRL, PINL, Portl, 'L')
158 #endif
159 #ifdef USE_PORTQ
160 MAKE_PORT(PORTQ, DDRQ, PINQ, Portq, 'Q')
161 #endif
162 #ifdef USE_PORTR
163 MAKE_PORT(PORTR, DDRR, PINR, Portr, 'R')
164 #endif
165 
166 #ifdef USE_TCCR0A
167 MAKE_TCCR(TCCR0A, Tccr0a)
168 #endif
169 #ifdef USE_TCCR1A
170 MAKE_TCCR(TCCR1A, Tccr1a)
171 #endif
172 #ifdef USE_TCCR2A
173 MAKE_TCCR(TCCR2A, Tccr2a)
174 #endif
175 
176 // this class represents one pin in a IO port.
177 // It is fully static.
178 template<typename PORT, uint8_t PIN>
179 class TPin {
180  // BOOST_STATIC_ASSERT(PIN < PORT::Width);
181 public:
182  typedef PORT Port;
183 
184  enum {
185  Number = PIN
186  };
187 
188  static void Set() {
189  PORT::Set(1 << PIN);
190  }
191 
192  static void Set(uint8_t val) {
193  if(val)
194  Set();
195  else Clear();
196  }
197 
198  static void SetDir(uint8_t val) {
199  if(val)
200  SetDirWrite();
201  else SetDirRead();
202  }
203 
204  static void Clear() {
205  PORT::Clear(1 << PIN);
206  }
207 
208  static void Toggle() {
209  PORT::Toggle(1 << PIN);
210  }
211 
212  static void SetDirRead() {
213  PORT::DirClear(1 << PIN);
214  }
215 
216  static void SetDirWrite() {
217  PORT::DirSet(1 << PIN);
218  }
219 
220  static uint8_t IsSet() {
221  return PORT::PinRead() & (uint8_t)(1 << PIN);
222  }
223 
224  static void WaiteForSet() {
225  while(IsSet() == 0) {
226  }
227  }
228 
229  static void WaiteForClear() {
230  while(IsSet()) {
231  }
232  }
233 }; //class TPin...
234 
235 // this class represents one bit in TCCR port.
236 // used to set/clear TCCRx bits
237 // It is fully static.
238 
239 template<typename TCCR, uint8_t COM>
240 class TCom {
241  // BOOST_STATIC_ASSERT(PIN < PORT::Width);
242 public:
243  typedef TCCR Tccr;
244 
245  enum {
246  Com = COM
247  };
248 
249  static void Set() {
250  TCCR::Set(1 << COM);
251  }
252 
253  static void Clear() {
254  TCCR::Clear(1 << COM);
255  }
256 
257  static void Toggle() {
258  TCCR::Toggle(1 << COM);
259  }
260 }; //class TCom...
261 
262 //Short pin definitions
263 #ifdef USE_PORTA
264 typedef TPin<Porta, 0 > Pa0;
265 typedef TPin<Porta, 1 > Pa1;
266 typedef TPin<Porta, 2 > Pa2;
267 typedef TPin<Porta, 3 > Pa3;
268 typedef TPin<Porta, 4 > Pa4;
269 typedef TPin<Porta, 5 > Pa5;
270 typedef TPin<Porta, 6 > Pa6;
271 typedef TPin<Porta, 7 > Pa7;
272 #endif
273 
274 #ifdef USE_PORTB
275 typedef TPin<Portb, 0 > Pb0;
276 typedef TPin<Portb, 1 > Pb1;
277 typedef TPin<Portb, 2 > Pb2;
278 typedef TPin<Portb, 3 > Pb3;
279 typedef TPin<Portb, 4 > Pb4;
280 typedef TPin<Portb, 5 > Pb5;
281 typedef TPin<Portb, 6 > Pb6;
282 typedef TPin<Portb, 7 > Pb7;
283 #endif
284 
285 #ifdef USE_PORTC
286 typedef TPin<Portc, 0 > Pc0;
287 typedef TPin<Portc, 1 > Pc1;
288 typedef TPin<Portc, 2 > Pc2;
289 typedef TPin<Portc, 3 > Pc3;
290 typedef TPin<Portc, 4 > Pc4;
291 typedef TPin<Portc, 5 > Pc5;
292 typedef TPin<Portc, 6 > Pc6;
293 typedef TPin<Portc, 7 > Pc7;
294 #endif
295 
296 #ifdef USE_PORTD
297 typedef TPin<Portd, 0 > Pd0;
298 typedef TPin<Portd, 1 > Pd1;
299 typedef TPin<Portd, 2 > Pd2;
300 typedef TPin<Portd, 3 > Pd3;
301 typedef TPin<Portd, 4 > Pd4;
302 typedef TPin<Portd, 5 > Pd5;
303 typedef TPin<Portd, 6 > Pd6;
304 typedef TPin<Portd, 7 > Pd7;
305 #endif
306 
307 #ifdef USE_PORTE
308 typedef TPin<Porte, 0 > Pe0;
309 typedef TPin<Porte, 1 > Pe1;
310 typedef TPin<Porte, 2 > Pe2;
311 typedef TPin<Porte, 3 > Pe3;
312 typedef TPin<Porte, 4 > Pe4;
313 typedef TPin<Porte, 5 > Pe5;
314 typedef TPin<Porte, 6 > Pe6;
315 typedef TPin<Porte, 7 > Pe7;
316 #endif
317 
318 #ifdef USE_PORTF
319 typedef TPin<Portf, 0 > Pf0;
320 typedef TPin<Portf, 1 > Pf1;
321 typedef TPin<Portf, 2 > Pf2;
322 typedef TPin<Portf, 3 > Pf3;
323 typedef TPin<Portf, 4 > Pf4;
324 typedef TPin<Portf, 5 > Pf5;
325 typedef TPin<Portf, 6 > Pf6;
326 typedef TPin<Portf, 7 > Pf7;
327 #endif
328 
329 #ifdef USE_PORTG
330 typedef TPin<Portg, 0 > Pg0;
331 typedef TPin<Portg, 1 > Pg1;
332 typedef TPin<Portg, 2 > Pg2;
333 typedef TPin<Portg, 3 > Pg3;
334 typedef TPin<Portg, 4 > Pg4;
335 typedef TPin<Portg, 5 > Pg5;
336 typedef TPin<Portg, 6 > Pg6;
337 typedef TPin<Portg, 7 > Pg7;
338 #endif
339 
340 #ifdef USE_PORTH
341 typedef TPin<Porth, 0 > Ph0;
342 typedef TPin<Porth, 1 > Ph1;
343 typedef TPin<Porth, 2 > Ph2;
344 typedef TPin<Porth, 3 > Ph3;
345 typedef TPin<Porth, 4 > Ph4;
346 typedef TPin<Porth, 5 > Ph5;
347 typedef TPin<Porth, 6 > Ph6;
348 typedef TPin<Porth, 7 > Ph7;
349 #endif
350 
351 #ifdef USE_PORTJ
352 typedef TPin<Portj, 0 > Pj0;
353 typedef TPin<Portj, 1 > Pj1;
354 typedef TPin<Portj, 2 > Pj2;
355 typedef TPin<Portj, 3 > Pj3;
356 typedef TPin<Portj, 4 > Pj4;
357 typedef TPin<Portj, 5 > Pj5;
358 typedef TPin<Portj, 6 > Pj6;
359 typedef TPin<Portj, 7 > Pj7;
360 #endif
361 
362 #ifdef USE_PORTK
363 typedef TPin<Portk, 0 > Pk0;
364 typedef TPin<Portk, 1 > Pk1;
365 typedef TPin<Portk, 2 > Pk2;
366 typedef TPin<Portk, 3 > Pk3;
367 typedef TPin<Portk, 4 > Pk4;
368 typedef TPin<Portk, 5 > Pk5;
369 typedef TPin<Portk, 6 > Pk6;
370 typedef TPin<Portk, 7 > Pk7;
371 #endif
372 
373 #ifdef USE_PORTL
374 typedef TPin<Portl, 0 > Pl0;
375 typedef TPin<Portl, 1 > Pl1;
376 typedef TPin<Portl, 2 > Pl2;
377 typedef TPin<Portl, 3 > Pl3;
378 typedef TPin<Portl, 4 > Pl4;
379 typedef TPin<Portl, 5 > Pl5;
380 typedef TPin<Portl, 6 > Pl6;
381 typedef TPin<Portl, 7 > Pl7;
382 #endif
383 
384 #ifdef USE_PORTQ
385 typedef TPin<Portq, 0 > Pq0;
386 typedef TPin<Portq, 1 > Pq1;
387 typedef TPin<Portq, 2 > Pq2;
388 typedef TPin<Portq, 3 > Pq3;
389 typedef TPin<Portq, 4 > Pq4;
390 typedef TPin<Portq, 5 > Pq5;
391 typedef TPin<Portq, 6 > Pq6;
392 typedef TPin<Portq, 7 > Pq7;
393 #endif
394 
395 #ifdef USE_PORTR
396 typedef TPin<Portr, 0 > Pr0;
397 typedef TPin<Portr, 1 > Pr1;
398 typedef TPin<Portr, 2 > Pr2;
399 typedef TPin<Portr, 3 > Pr3;
400 typedef TPin<Portr, 4 > Pr4;
401 typedef TPin<Portr, 5 > Pr5;
402 typedef TPin<Portr, 6 > Pr6;
403 typedef TPin<Portr, 7 > Pr7;
404 #endif
405 
406 #ifdef USE_TCCR0A
407 typedef TCom<Tccr0a, COM0A1> Tc0a; //P6
408 typedef TCom<Tccr0a, COM0B1> Tc0b; //P5
409 #endif
410 
411 #ifdef USE_TCCR1A
412 typedef TCom<Tccr1a, COM1A1> Tc1a; //P9
413 typedef TCom<Tccr1a, COM1B1> Tc1b; //P10
414 #endif
415 
416 #ifdef USE_TCCR2A
417 typedef TCom<Tccr2a, COM2A1> Tc2a; //P11
418 typedef TCom<Tccr2a, COM2B1> Tc2b; //P3
419 #endif
420 
421 template<typename Tp_pin, typename Tc_bit>
422 class Tp_Tc {
423 public:
424 
425  static void SetDir(uint8_t val) {
426  if(val)
427  SetDirWrite();
428  else SetDirRead();
429  }
430 
431  static void SetDirRead() {
432  Tp_pin::SetDirRead(); //set pin direction
433  Tc_bit::Clear(); //disconnect pin from PWM
434  }
435 
436  static void SetDirWrite() {
437  Tp_pin::SetDirWrite();
438  Tc_bit::Clear();
439  }
440 };
441 
442 /* pin definitions for cases where it's necessary to clear compare output mode bits */
443 
444 //typedef Tp_Tc<Pd3, Tc2b> P3; //Arduino pin 3
445 //typedef Tp_Tc<Pd5, Tc0b> P5; //Arduino pin 5
446 //typedef Tp_Tc<Pd6, Tc0a> P6; //Arduino pin 6
447 //typedef Tp_Tc<Pb1, Tc1a> P9; //Arduino pin 9
448 //typedef Tp_Tc<Pb2, Tc1b> P10; //Arduino pin 10
449 //typedef Tp_Tc<Pb3, Tc2a> P11; //Arduino pin 11
450 
451 /* Arduino pin definitions */
452 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
453 // "Mega" Arduino pin numbers
454 
455 #define P0 Pe0
456 #define P1 Pe1
457 #define P2 Pe4
458 #define P3 Pe5
459 #define P4 Pg5
460 #define P5 Pe3
461 #define P6 Ph3
462 #define P7 Ph4
463 
464 #define P8 Ph5
465 #define P9 Ph6
466 #define P10 Pb4
467 #define P11 Pb5
468 #define P12 Pb6
469 #define P13 Pb7
470 
471 #define P14 Pj1
472 #define P15 Pj0
473 #define P16 Ph1
474 #define P17 Ph0
475 #define P18 Pd3
476 #define P19 Pd2
477 #define P20 Pd1
478 #define P21 Pd0
479 
480 #define P22 Pa0
481 #define P23 Pa1
482 #define P24 Pa2
483 #define P25 Pa3
484 #define P26 Pa4
485 #define P27 Pa5
486 #define P28 Pa6
487 #define P29 Pa7
488 #define P30 Pc7
489 #define P31 Pc6
490 #define P32 Pc5
491 #define P33 Pc4
492 #define P34 Pc3
493 #define P35 Pc2
494 #define P36 Pc1
495 #define P37 Pc0
496 
497 #define P38 Pd7
498 #define P39 Pg2
499 #define P40 Pg1
500 #define P41 Pg0
501 #define P42 Pl7
502 #define P43 Pl6
503 #define P44 Pl5
504 #define P45 Pl4
505 #define P46 Pl3
506 #define P47 Pl2
507 #define P48 Pl1
508 #define P49 Pl0
509 #define P50 Pb3
510 #define P51 Pb2
511 #define P52 Pb1
512 #define P53 Pb0
513 
514 #ifdef BOARD_MEGA_ADK // These pins are not broken out on the Arduino ADK
515 #define P54 Pe6 // INT on Arduino ADK
516 #define P55 Pj2 // MAX_RESET on Arduino ADK
517 #endif
518 
519 // "Mega" pin numbers
520 
521 #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
522 // "Classic" Arduino pin numbers
523 
524 #define P0 Pd0
525 #define P1 Pd1
526 #define P2 Pd2
527 #define P3 Pd3
528 #define P4 Pd4
529 #define P5 Pd5
530 #define P6 Pd6
531 #define P7 Pd7
532 
533 #define P8 Pb0
534 #define P9 Pb1
535 #define P10 Pb2
536 #define P11 Pb3
537 #define P12 Pb4
538 #define P13 Pb5
539 
540 #define P14 Pc0
541 #define P15 Pc1
542 #define P16 Pc2
543 #define P17 Pc3
544 #define P18 Pc4
545 #define P19 Pc5
546 
547 // "Classic" Arduino pin numbers
548 
549 #elif defined(CORE_TEENSY) && defined(__AVR_ATmega32U4__)
550 // Teensy 2.0 pin numbers
551 // http://www.pjrc.com/teensy/pinout.html
552 #define P0 Pb0
553 #define P1 Pb1
554 #define P2 Pb2
555 #define P3 Pb3
556 #define P4 Pb7
557 #define P5 Pd0
558 #define P6 Pd1
559 #define P7 Pd2
560 #define P8 Pd3
561 #define P9 Pc6
562 #define P10 Pc7
563 #define P11 Pd6
564 #define P12 Pd7
565 #define P13 Pb4
566 #define P14 Pb5
567 #define P15 Pb6
568 #define P16 Pf7
569 #define P17 Pf6
570 #define P18 Pf5
571 #define P19 Pf4
572 #define P20 Pf1
573 #define P21 Pf0
574 #define P22 Pd4
575 #define P23 Pd5
576 #define P24 Pe6
577 // Teensy 2.0
578 
579 #elif defined(__AVR_ATmega32U4__)
580 // Arduino Leonardo pin numbers
581 
582 #define P0 Pd2 // D0 - PD2
583 #define P1 Pd3 // D1 - PD3
584 #define P2 Pd1 // D2 - PD1
585 #define P3 Pd0 // D3 - PD0
586 #define P4 Pd4 // D4 - PD4
587 #define P5 Pc6 // D5 - PC6
588 #define P6 Pd7 // D6 - PD7
589 #define P7 Pe6 // D7 - PE6
590 
591 #define P8 Pb4 // D8 - PB4
592 #define P9 Pb5 // D9 - PB5
593 #define P10 Pb6 // D10 - PB6
594 #define P11 Pb7 // D11 - PB7
595 #define P12 Pd6 // D12 - PD6
596 #define P13 Pc7 // D13 - PC7
597 
598 #define P14 Pb3 // D14 - MISO - PB3
599 #define P15 Pb1 // D15 - SCK - PB1
600 #define P16 Pb2 // D16 - MOSI - PB2
601 #define P17 Pb0 // D17 - SS - PB0
602 
603 #define P18 Pf7 // D18 - A0 - PF7
604 #define P19 Pf6 // D19 - A1 - PF6
605 #define P20 Pf5 // D20 - A2 - PF5
606 #define P21 Pf4 // D21 - A3 - PF4
607 #define P22 Pf1 // D22 - A4 - PF1
608 #define P23 Pf0 // D23 - A5 - PF0
609 
610 #define P24 Pd4 // D24 / D4 - A6 - PD4
611 #define P25 Pd7 // D25 / D6 - A7 - PD7
612 #define P26 Pb4 // D26 / D8 - A8 - PB4
613 #define P27 Pb5 // D27 / D9 - A9 - PB5
614 #define P28 Pb6 // D28 / D10 - A10 - PB6
615 #define P29 Pd6 // D29 / D12 - A11 - PD6
616 
617 // Arduino Leonardo pin numbers
618 
619 #elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
620 // Teensy++ 1.0 and 2.0 pin numbers
621 // http://www.pjrc.com/teensy/pinout.html
622 #define P0 Pd0
623 #define P1 Pd1
624 #define P2 Pd2
625 #define P3 Pd3
626 #define P4 Pd4
627 #define P5 Pd5
628 #define P6 Pd6
629 #define P7 Pd7
630 #define P8 Pe0
631 #define P9 Pe1
632 #define P10 Pc0
633 #define P11 Pc1
634 #define P12 Pc2
635 #define P13 Pc3
636 #define P14 Pc4
637 #define P15 Pc5
638 #define P16 Pc6
639 #define P17 Pc7
640 #define P18 Pe6
641 #define P19 Pe7
642 #define P20 Pb0
643 #define P21 Pb1
644 #define P22 Pb2
645 #define P23 Pb3
646 #define P24 Pb4
647 #define P25 Pb5
648 #define P26 Pb6
649 #define P27 Pb7
650 #define P28 Pa0
651 #define P29 Pa1
652 #define P30 Pa2
653 #define P31 Pa3
654 #define P32 Pa4
655 #define P33 Pa5
656 #define P34 Pa6
657 #define P35 Pa7
658 #define P36 Pe4
659 #define P37 Pe5
660 #define P38 Pf0
661 #define P39 Pf1
662 #define P40 Pf2
663 #define P41 Pf3
664 #define P42 Pf4
665 #define P43 Pf5
666 #define P44 Pf6
667 #define P45 Pf7
668 // Teensy++ 1.0 and 2.0
669 
670 #elif defined(ARDUINO_AVR_BALANDUINO) && (defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284P__))
671 // Balanduino pin numbers
672 // http://balanduino.net/
673 #define P0 Pd0 /* 0 - PD0 */
674 #define P1 Pd1 /* 1 - PD1 */
675 
676 #if BALANDUINO_REVISION < 13
677  #define P2 Pb2 /* 2 - PB2 */
678  #define P3 Pd6 /* 3 - PD6 */
679  #define P4 Pd7 /* 4 - PD7 */
680  #define P5 Pb3 /* 5 - PB3 */
681 #else
682  #define P2 Pd2 /* 2 - PD2 */
683  #define P3 Pd3 /* 3 - PD3 */
684  #define P4 Pd6 /* 4 - PD6 */
685  #define P5 Pd7 /* 5 - PD7 */
686 #endif
687 
688 #define P6 Pb4 /* 6 - PB4 */
689 #define P7 Pa0 /* 7 - PA0 */
690 #define P8 Pa1 /* 8 - PA1 */
691 #define P9 Pa2 /* 9 - PA2 */
692 #define P10 Pa3 /* 10 - PA3 */
693 #define P11 Pa4 /* 11 - PA4 */
694 #define P12 Pa5 /* 12 - PA5 */
695 #define P13 Pc1 /* 13 - PC1 */
696 #define P14 Pc0 /* 14 - PC0 */
697 
698 #if BALANDUINO_REVISION < 13
699  #define P15 Pd2 /* 15 - PD2 */
700  #define P16 Pd3 /* 16 - PD3 */
701 #else
702  #define P15 Pb2 /* 15 - PB2 */
703  #define P16 Pb3 /* 16 - PB2 */
704 #endif
705 
706 #define P17 Pd4 /* 17 - PD4 */
707 #define P18 Pd5 /* 18 - PD5 */
708 #define P19 Pc2 /* 19 - PC2 */
709 #define P20 Pc3 /* 20 - PC3 */
710 #define P21 Pc4 /* 21 - PC4 */
711 #define P22 Pc5 /* 22 - PC5 */
712 #define P23 Pc6 /* 23 - PC6 */
713 #define P24 Pc7 /* 24 - PC7 */
714 #define P25 Pb0 /* 25 - PB0 */
715 #define P26 Pb1 /* 26 - PB1 */
716 #define P27 Pb5 /* 27 - PB5 */
717 #define P28 Pb6 /* 28 - PB6 */
718 #define P29 Pb7 /* 29 - PB7 */
719 #define P30 Pa6 /* 30 - PA6 */
720 #define P31 Pa7 /* 31 - PA7 */
721 // Balanduino
722 
723 #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
724 // Sanguino pin numbers
725 // Homepage: http://sanguino.cc/hardware
726 // Hardware add-on: https://github.com/Lauszus/Sanguino
727 #define P0 Pb0
728 #define P1 Pb1
729 #define P2 Pb2
730 #define P3 Pb3
731 #define P4 Pb4
732 #define P5 Pb5
733 #define P6 Pb6
734 #define P7 Pb7
735 #define P8 Pd0
736 #define P9 Pd1
737 #define P10 Pd2
738 #define P11 Pd3
739 #define P12 Pd4
740 #define P13 Pd5
741 #define P14 Pd6
742 #define P15 Pd7
743 #define P16 Pc0
744 #define P17 Pc1
745 #define P18 Pc2
746 #define P19 Pc3
747 #define P20 Pc4
748 #define P21 Pc5
749 #define P22 Pc6
750 #define P23 Pc7
751 #define P24 Pa0
752 #define P25 Pa1
753 #define P26 Pa2
754 #define P27 Pa3
755 #define P28 Pa4
756 #define P29 Pa5
757 #define P30 Pa6
758 #define P31 Pa7
759 // Sanguino
760 
761 #else
762 #error "Please define board in avrpins.h"
763 
764 #endif // Arduino pin definitions
765 
766 #elif defined(__arm__)
767 
768 // pointers are 32 bits on ARM
769 #define pgm_read_pointer(p) pgm_read_dword(p)
770 
771 #if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__))
772 
773 #include "core_pins.h"
774 #include "avr_emulation.h"
775 
776 #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
777 #define GPIO_BITBAND_PTR(reg, bit) ((uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
778 
779 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
780 class className { \
781 public: \
782  static void Set() { \
783  *GPIO_BITBAND_PTR(baseReg, pinNum) = 1; \
784  } \
785  static void Clear() { \
786  *GPIO_BITBAND_PTR(baseReg, pinNum) = 0; \
787  } \
788  static void SetDirRead() { \
789  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
790  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 0; \
791  } \
792  static void SetDirWrite() { \
793  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
794  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 1; \
795  } \
796  static uint8_t IsSet() { \
797  return *(GPIO_BITBAND_PTR(baseReg, pinNum) + 512); \
798  } \
799 };
800 
801 MAKE_PIN(P0, CORE_PIN0_PORTREG, CORE_PIN0_BIT, CORE_PIN0_CONFIG);
802 MAKE_PIN(P1, CORE_PIN1_PORTREG, CORE_PIN1_BIT, CORE_PIN1_CONFIG);
803 MAKE_PIN(P2, CORE_PIN2_PORTREG, CORE_PIN2_BIT, CORE_PIN2_CONFIG);
804 MAKE_PIN(P3, CORE_PIN3_PORTREG, CORE_PIN3_BIT, CORE_PIN3_CONFIG);
805 MAKE_PIN(P4, CORE_PIN4_PORTREG, CORE_PIN4_BIT, CORE_PIN4_CONFIG);
806 MAKE_PIN(P5, CORE_PIN5_PORTREG, CORE_PIN5_BIT, CORE_PIN5_CONFIG);
807 MAKE_PIN(P6, CORE_PIN6_PORTREG, CORE_PIN6_BIT, CORE_PIN6_CONFIG);
808 MAKE_PIN(P7, CORE_PIN7_PORTREG, CORE_PIN7_BIT, CORE_PIN7_CONFIG);
809 MAKE_PIN(P8, CORE_PIN8_PORTREG, CORE_PIN8_BIT, CORE_PIN8_CONFIG);
810 MAKE_PIN(P9, CORE_PIN9_PORTREG, CORE_PIN9_BIT, CORE_PIN9_CONFIG);
811 MAKE_PIN(P10, CORE_PIN10_PORTREG, CORE_PIN10_BIT, CORE_PIN10_CONFIG);
812 MAKE_PIN(P11, CORE_PIN11_PORTREG, CORE_PIN11_BIT, CORE_PIN11_CONFIG);
813 MAKE_PIN(P12, CORE_PIN12_PORTREG, CORE_PIN12_BIT, CORE_PIN12_CONFIG);
814 MAKE_PIN(P13, CORE_PIN13_PORTREG, CORE_PIN13_BIT, CORE_PIN13_CONFIG);
815 MAKE_PIN(P14, CORE_PIN14_PORTREG, CORE_PIN14_BIT, CORE_PIN14_CONFIG);
816 MAKE_PIN(P15, CORE_PIN15_PORTREG, CORE_PIN15_BIT, CORE_PIN15_CONFIG);
817 MAKE_PIN(P16, CORE_PIN16_PORTREG, CORE_PIN16_BIT, CORE_PIN16_CONFIG);
818 MAKE_PIN(P17, CORE_PIN17_PORTREG, CORE_PIN17_BIT, CORE_PIN17_CONFIG);
819 MAKE_PIN(P18, CORE_PIN18_PORTREG, CORE_PIN18_BIT, CORE_PIN18_CONFIG);
820 MAKE_PIN(P19, CORE_PIN19_PORTREG, CORE_PIN19_BIT, CORE_PIN19_CONFIG);
821 MAKE_PIN(P20, CORE_PIN20_PORTREG, CORE_PIN20_BIT, CORE_PIN20_CONFIG);
822 MAKE_PIN(P21, CORE_PIN21_PORTREG, CORE_PIN21_BIT, CORE_PIN21_CONFIG);
823 MAKE_PIN(P22, CORE_PIN22_PORTREG, CORE_PIN22_BIT, CORE_PIN22_CONFIG);
824 MAKE_PIN(P23, CORE_PIN23_PORTREG, CORE_PIN23_BIT, CORE_PIN23_CONFIG);
825 MAKE_PIN(P24, CORE_PIN24_PORTREG, CORE_PIN24_BIT, CORE_PIN24_CONFIG);
826 MAKE_PIN(P25, CORE_PIN25_PORTREG, CORE_PIN25_BIT, CORE_PIN25_CONFIG);
827 MAKE_PIN(P26, CORE_PIN26_PORTREG, CORE_PIN26_BIT, CORE_PIN26_CONFIG);
828 MAKE_PIN(P27, CORE_PIN27_PORTREG, CORE_PIN27_BIT, CORE_PIN27_CONFIG);
829 MAKE_PIN(P28, CORE_PIN28_PORTREG, CORE_PIN28_BIT, CORE_PIN28_CONFIG);
830 MAKE_PIN(P29, CORE_PIN29_PORTREG, CORE_PIN29_BIT, CORE_PIN29_CONFIG);
831 MAKE_PIN(P30, CORE_PIN30_PORTREG, CORE_PIN30_BIT, CORE_PIN30_CONFIG);
832 MAKE_PIN(P31, CORE_PIN31_PORTREG, CORE_PIN31_BIT, CORE_PIN31_CONFIG);
833 MAKE_PIN(P32, CORE_PIN32_PORTREG, CORE_PIN32_BIT, CORE_PIN32_CONFIG);
834 MAKE_PIN(P33, CORE_PIN33_PORTREG, CORE_PIN33_BIT, CORE_PIN33_CONFIG);
835 
836 #undef MAKE_PIN
837 
838 #elif defined(CORE_TEENSY) && (defined(__MKL26Z64__))
839 
840 // we could get lower level by making these macros work properly.
841 // for now just use the semi optimised version, it costs a lookup in the pin pgm table per op
842 // but for now it will do.
843 //#define GPIO_BITBAND_ADDR(reg, bit) (((volatile uint8_t *)&(reg) + ((bit) >> 3)))
844 //#define GPIO_BITBAND_MASK(reg, bit) (1<<((bit) & 7))
845 //#define GPIO_BITBAND_PTR(reg, bit) ((volatile uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
846 
847 #include "core_pins.h"
848 #include "avr_emulation.h"
849 
850 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
851 class className { \
852 public: \
853  static void Set() { \
854  *portSetRegister(pinNum) = digitalPinToBitMask(pinNum); \
855  } \
856  static void Clear() { \
857  *portClearRegister(pinNum) = digitalPinToBitMask(pinNum); \
858  } \
859  static void SetDirRead() { \
860  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
861  *portModeRegister(pinNum) &= ~digitalPinToBitMask(pinNum); \
862  } \
863  static void SetDirWrite() { \
864  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
865  *portModeRegister(pinNum) |= digitalPinToBitMask(pinNum); \
866  } \
867  static uint8_t IsSet() { \
868  return (*portInputRegister(pinNum) & digitalPinToBitMask(pinNum)) ? 1 : 0; \
869  } \
870 };
871 
872 MAKE_PIN(P0, CORE_PIN0_PORTREG, 0, CORE_PIN0_CONFIG);
873 MAKE_PIN(P1, CORE_PIN1_PORTREG, 1, CORE_PIN1_CONFIG);
874 MAKE_PIN(P2, CORE_PIN2_PORTREG, 2, CORE_PIN2_CONFIG);
875 MAKE_PIN(P3, CORE_PIN3_PORTREG, 3, CORE_PIN3_CONFIG);
876 MAKE_PIN(P4, CORE_PIN4_PORTREG, 4, CORE_PIN4_CONFIG);
877 MAKE_PIN(P5, CORE_PIN5_PORTREG, 5, CORE_PIN5_CONFIG);
878 MAKE_PIN(P6, CORE_PIN6_PORTREG, 6, CORE_PIN6_CONFIG);
879 MAKE_PIN(P7, CORE_PIN7_PORTREG, 7, CORE_PIN7_CONFIG);
880 MAKE_PIN(P8, CORE_PIN8_PORTREG, 8, CORE_PIN8_CONFIG);
881 MAKE_PIN(P9, CORE_PIN9_PORTREG, 9, CORE_PIN9_CONFIG);
882 MAKE_PIN(P10, CORE_PIN10_PORTREG, 10, CORE_PIN10_CONFIG);
883 MAKE_PIN(P11, CORE_PIN11_PORTREG, 11, CORE_PIN11_CONFIG);
884 MAKE_PIN(P12, CORE_PIN12_PORTREG, 12, CORE_PIN12_CONFIG);
885 MAKE_PIN(P13, CORE_PIN13_PORTREG, 13, CORE_PIN13_CONFIG);
886 MAKE_PIN(P14, CORE_PIN14_PORTREG, 14, CORE_PIN14_CONFIG);
887 MAKE_PIN(P15, CORE_PIN15_PORTREG, 15, CORE_PIN15_CONFIG);
888 MAKE_PIN(P16, CORE_PIN16_PORTREG, 16, CORE_PIN16_CONFIG);
889 MAKE_PIN(P17, CORE_PIN17_PORTREG, 17, CORE_PIN17_CONFIG);
890 MAKE_PIN(P18, CORE_PIN18_PORTREG, 18, CORE_PIN18_CONFIG);
891 MAKE_PIN(P19, CORE_PIN19_PORTREG, 19, CORE_PIN19_CONFIG);
892 MAKE_PIN(P20, CORE_PIN20_PORTREG, 20, CORE_PIN20_CONFIG);
893 MAKE_PIN(P21, CORE_PIN21_PORTREG, 21, CORE_PIN21_CONFIG);
894 MAKE_PIN(P22, CORE_PIN22_PORTREG, 22, CORE_PIN22_CONFIG);
895 MAKE_PIN(P23, CORE_PIN23_PORTREG, 23, CORE_PIN23_CONFIG);
896 MAKE_PIN(P24, CORE_PIN24_PORTREG, 24, CORE_PIN24_CONFIG);
897 MAKE_PIN(P25, CORE_PIN25_PORTREG, 25, CORE_PIN25_CONFIG);
898 MAKE_PIN(P26, CORE_PIN26_PORTREG, 26, CORE_PIN26_CONFIG);
899 
900 #undef MAKE_PIN
901 
902 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
903 
904 // SetDirRead:
905 // Disable interrupts
906 // Disable the pull up resistor
907 // Set to INPUT
908 // Enable PIO
909 
910 // SetDirWrite:
911 // Disable interrupts
912 // Disable the pull up resistor
913 // Set to OUTPUT
914 // Enable PIO
915 
916 #define MAKE_PIN(className, pio, pinMask) \
917 class className { \
918 public: \
919  static void Set() { \
920  pio->PIO_SODR = pinMask; \
921  } \
922  static void Clear() { \
923  pio->PIO_CODR = pinMask; \
924  } \
925  static void SetDirRead() { \
926  pio->PIO_IDR = pinMask ; \
927  pio->PIO_PUDR = pinMask; \
928  pio->PIO_ODR = pinMask; \
929  pio->PIO_PER = pinMask; \
930  } \
931  static void SetDirWrite() { \
932  pio->PIO_IDR = pinMask ; \
933  pio->PIO_PUDR = pinMask; \
934  pio->PIO_OER = pinMask; \
935  pio->PIO_PER = pinMask; \
936  } \
937  static uint8_t IsSet() { \
938  return pio->PIO_PDSR & pinMask; \
939  } \
940 };
941 
942 // See: http://arduino.cc/en/Hacking/PinMappingSAM3X and variant.cpp
943 
944 MAKE_PIN(P0, PIOA, PIO_PA8);
945 MAKE_PIN(P1, PIOA, PIO_PA9);
946 MAKE_PIN(P2, PIOB, PIO_PB25);
947 MAKE_PIN(P3, PIOC, PIO_PC28);
948 MAKE_PIN(P4, PIOC, PIO_PC26);
949 MAKE_PIN(P5, PIOC, PIO_PC25);
950 MAKE_PIN(P6, PIOC, PIO_PC24);
951 MAKE_PIN(P7, PIOC, PIO_PC23);
952 MAKE_PIN(P8, PIOC, PIO_PC22);
953 MAKE_PIN(P9, PIOC, PIO_PC21);
954 MAKE_PIN(P10, PIOC, PIO_PC29);
955 MAKE_PIN(P11, PIOD, PIO_PD7);
956 MAKE_PIN(P12, PIOD, PIO_PD8);
957 MAKE_PIN(P13, PIOB, PIO_PB27);
958 MAKE_PIN(P14, PIOD, PIO_PD4);
959 MAKE_PIN(P15, PIOD, PIO_PD5);
960 MAKE_PIN(P16, PIOA, PIO_PA13);
961 MAKE_PIN(P17, PIOA, PIO_PA12);
962 MAKE_PIN(P18, PIOA, PIO_PA11);
963 MAKE_PIN(P19, PIOA, PIO_PA10);
964 MAKE_PIN(P20, PIOB, PIO_PB12);
965 MAKE_PIN(P21, PIOB, PIO_PB13);
966 MAKE_PIN(P22, PIOB, PIO_PB26);
967 MAKE_PIN(P23, PIOA, PIO_PA14);
968 MAKE_PIN(P24, PIOA, PIO_PA15);
969 MAKE_PIN(P25, PIOD, PIO_PD0);
970 MAKE_PIN(P26, PIOD, PIO_PD1);
971 MAKE_PIN(P27, PIOD, PIO_PD2);
972 MAKE_PIN(P28, PIOD, PIO_PD3);
973 MAKE_PIN(P29, PIOD, PIO_PD6);
974 MAKE_PIN(P30, PIOD, PIO_PD9);
975 MAKE_PIN(P31, PIOA, PIO_PA7);
976 MAKE_PIN(P32, PIOD, PIO_PD10);
977 MAKE_PIN(P33, PIOC, PIO_PC1);
978 MAKE_PIN(P34, PIOC, PIO_PC2);
979 MAKE_PIN(P35, PIOC, PIO_PC3);
980 MAKE_PIN(P36, PIOC, PIO_PC4);
981 MAKE_PIN(P37, PIOC, PIO_PC5);
982 MAKE_PIN(P38, PIOC, PIO_PC6);
983 MAKE_PIN(P39, PIOC, PIO_PC7);
984 MAKE_PIN(P40, PIOC, PIO_PC8);
985 MAKE_PIN(P41, PIOC, PIO_PC9);
986 MAKE_PIN(P42, PIOA, PIO_PA19);
987 MAKE_PIN(P43, PIOA, PIO_PA20);
988 MAKE_PIN(P44, PIOC, PIO_PC19);
989 MAKE_PIN(P45, PIOC, PIO_PC18);
990 MAKE_PIN(P46, PIOC, PIO_PC17);
991 MAKE_PIN(P47, PIOC, PIO_PC16);
992 MAKE_PIN(P48, PIOC, PIO_PC15);
993 MAKE_PIN(P49, PIOC, PIO_PC14);
994 MAKE_PIN(P50, PIOC, PIO_PC13);
995 MAKE_PIN(P51, PIOC, PIO_PC12);
996 MAKE_PIN(P52, PIOB, PIO_PB21);
997 MAKE_PIN(P53, PIOB, PIO_PB14);
998 MAKE_PIN(P54, PIOA, PIO_PA16);
999 MAKE_PIN(P55, PIOA, PIO_PA24);
1000 MAKE_PIN(P56, PIOA, PIO_PA23);
1001 MAKE_PIN(P57, PIOA, PIO_PA22);
1002 MAKE_PIN(P58, PIOA, PIO_PA6);
1003 MAKE_PIN(P59, PIOA, PIO_PA4);
1004 MAKE_PIN(P60, PIOA, PIO_PA3);
1005 MAKE_PIN(P61, PIOA, PIO_PA2);
1006 MAKE_PIN(P62, PIOB, PIO_PB17);
1007 MAKE_PIN(P63, PIOB, PIO_PB18);
1008 MAKE_PIN(P64, PIOB, PIO_PB19);
1009 MAKE_PIN(P65, PIOB, PIO_PB20);
1010 MAKE_PIN(P66, PIOB, PIO_PB15);
1011 MAKE_PIN(P67, PIOB, PIO_PB16);
1012 MAKE_PIN(P68, PIOA, PIO_PA1);
1013 MAKE_PIN(P69, PIOA, PIO_PA0);
1014 MAKE_PIN(P70, PIOA, PIO_PA17);
1015 MAKE_PIN(P71, PIOA, PIO_PA18);
1016 MAKE_PIN(P72, PIOC, PIO_PC30);
1017 MAKE_PIN(P73, PIOA, PIO_PA21);
1018 MAKE_PIN(P74, PIOA, PIO_PA25); // MISO
1019 MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI
1020 MAKE_PIN(P76, PIOA, PIO_PA27); // CLK
1021 MAKE_PIN(P77, PIOA, PIO_PA28);
1022 MAKE_PIN(P78, PIOB, PIO_PB23); // Unconnected
1023 
1024 #undef MAKE_PIN
1025 
1026 #elif defined(RBL_NRF51822)
1027 
1028 #define MAKE_PIN(className, pin) \
1029 class className { \
1030 public: \
1031  static void Set() { \
1032  nrf_gpio_pin_set(pin); \
1033  } \
1034  static void Clear() { \
1035  nrf_gpio_pin_clear(pin); \
1036  } \
1037  static void SetDirRead() { \
1038  nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
1039  } \
1040  static void SetDirWrite() { \
1041  nrf_gpio_cfg_output(pin); \
1042  } \
1043  static uint8_t IsSet() { \
1044  return (uint8_t)nrf_gpio_pin_read(pin); \
1045  } \
1046 };
1047 
1048 // See: pin_transform.c in RBL nRF51822 SDK
1049 MAKE_PIN(P0, Pin_nRF51822_to_Arduino(D0));
1050 MAKE_PIN(P1, Pin_nRF51822_to_Arduino(D1));
1051 MAKE_PIN(P2, Pin_nRF51822_to_Arduino(D2));
1052 MAKE_PIN(P3, Pin_nRF51822_to_Arduino(D3));
1053 MAKE_PIN(P4, Pin_nRF51822_to_Arduino(D4));
1054 MAKE_PIN(P5, Pin_nRF51822_to_Arduino(D5));
1055 MAKE_PIN(P6, Pin_nRF51822_to_Arduino(D6));
1056 MAKE_PIN(P7, Pin_nRF51822_to_Arduino(D7));
1057 MAKE_PIN(P8, Pin_nRF51822_to_Arduino(D8));
1058 MAKE_PIN(P9, Pin_nRF51822_to_Arduino(D9)); // INT
1059 MAKE_PIN(P10, Pin_nRF51822_to_Arduino(D10)); // SS
1060 MAKE_PIN(P11, Pin_nRF51822_to_Arduino(D11));
1061 MAKE_PIN(P12, Pin_nRF51822_to_Arduino(D12));
1062 MAKE_PIN(P13, Pin_nRF51822_to_Arduino(D13));
1063 MAKE_PIN(P14, Pin_nRF51822_to_Arduino(D14));
1064 MAKE_PIN(P15, Pin_nRF51822_to_Arduino(D15));
1065 MAKE_PIN(P17, Pin_nRF51822_to_Arduino(D17)); // MISO
1066 MAKE_PIN(P18, Pin_nRF51822_to_Arduino(D18)); // MOSI
1067 MAKE_PIN(P16, Pin_nRF51822_to_Arduino(D16)); // CLK
1068 MAKE_PIN(P19, Pin_nRF51822_to_Arduino(D19));
1069 MAKE_PIN(P20, Pin_nRF51822_to_Arduino(D20));
1070 MAKE_PIN(P21, Pin_nRF51822_to_Arduino(D21));
1071 MAKE_PIN(P22, Pin_nRF51822_to_Arduino(D22));
1072 MAKE_PIN(P23, Pin_nRF51822_to_Arduino(D23));
1073 MAKE_PIN(P24, Pin_nRF51822_to_Arduino(D24));
1074 
1075 #undef MAKE_PIN
1076 
1077 #elif defined(STM32F446xx)
1078 // NUCLEO-F446RE
1079 
1080 #define MAKE_PIN(className, port, pin) \
1081 class className { \
1082 public: \
1083  static void Set() { \
1084  HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); \
1085  } \
1086  static void Clear() { \
1087  HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET); \
1088  } \
1089  static void SetDirRead() { \
1090  static GPIO_InitTypeDef GPIO_InitStruct; \
1091  GPIO_InitStruct.Pin = pin; \
1092  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \
1093  GPIO_InitStruct.Pull = GPIO_NOPULL; \
1094  HAL_GPIO_Init(port, &GPIO_InitStruct); \
1095  } \
1096  static void SetDirWrite() { \
1097  static GPIO_InitTypeDef GPIO_InitStruct; \
1098  GPIO_InitStruct.Pin = pin; \
1099  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \
1100  GPIO_InitStruct.Pull = GPIO_NOPULL; \
1101  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; \
1102  HAL_GPIO_Init(port, &GPIO_InitStruct); \
1103  } \
1104  static GPIO_PinState IsSet() { \
1105  return HAL_GPIO_ReadPin(port, pin); \
1106  } \
1107 };
1108 
1109 MAKE_PIN(P0, GPIOA, GPIO_PIN_3); // D0
1110 MAKE_PIN(P1, GPIOA, GPIO_PIN_2); // D1
1111 MAKE_PIN(P2, GPIOA, GPIO_PIN_10); // D2
1112 MAKE_PIN(P3, GPIOB, GPIO_PIN_3); // D3
1113 MAKE_PIN(P4, GPIOB, GPIO_PIN_5); // D4
1114 MAKE_PIN(P5, GPIOB, GPIO_PIN_4); // D5
1115 MAKE_PIN(P6, GPIOB, GPIO_PIN_10); // D6
1116 MAKE_PIN(P7, GPIOA, GPIO_PIN_8); // D7
1117 MAKE_PIN(P8, GPIOA, GPIO_PIN_9); // D8
1118 MAKE_PIN(P9, GPIOC, GPIO_PIN_7); // D9
1119 MAKE_PIN(P10, GPIOB, GPIO_PIN_6); // D10
1120 MAKE_PIN(P11, GPIOA, GPIO_PIN_7); // D11
1121 MAKE_PIN(P12, GPIOA, GPIO_PIN_6); // D12
1122 MAKE_PIN(P13, GPIOA, GPIO_PIN_5); // D13
1123 
1124 MAKE_PIN(P14, GPIOA, GPIO_PIN_0); // A0
1125 MAKE_PIN(P15, GPIOA, GPIO_PIN_1); // A1
1126 MAKE_PIN(P16, GPIOA, GPIO_PIN_4); // A2
1127 MAKE_PIN(P17, GPIOB, GPIO_PIN_0); // A3
1128 MAKE_PIN(P18, GPIOC, GPIO_PIN_1); // A4
1129 MAKE_PIN(P19, GPIOC, GPIO_PIN_0); // A5
1130 
1131 #undef MAKE_PIN
1132 
1133 #else
1134 #error "Please define board in avrpins.h"
1135 
1136 #endif
1137 
1138 #elif defined(__ARDUINO_X86__) // Intel Galileo, Intel Galileo 2 and Intel Edison
1139 
1140 #include <avr/pgmspace.h>
1141 
1142 // Pointers are 32 bits on x86
1143 #define pgm_read_pointer(p) pgm_read_dword(p)
1144 
1145 #if PLATFORM_ID == 0xE1 // Edison platform id
1146 #define pinToFastPin(pin) 1 // As far as I can tell all pins can be used as fast pins
1147 #endif
1148 
1149 // Pin 2 and 3 on the Intel Galileo supports a higher rate,
1150 // so it is recommended to use one of these as the SS pin.
1151 
1152 #define MAKE_PIN(className, pin) \
1153 class className { \
1154 public: \
1155  static void Set() { \
1156  fastDigitalWrite(pin, HIGH); \
1157  } \
1158  static void Clear() { \
1159  fastDigitalWrite(pin, LOW); \
1160  } \
1161  static void SetDirRead() { \
1162  if (pinToFastPin(pin)) \
1163  pinMode(pin, INPUT_FAST); \
1164  else \
1165  pinMode(pin, INPUT); \
1166  } \
1167  static void SetDirWrite() { \
1168  if (pinToFastPin(pin)) \
1169  pinMode(pin, OUTPUT_FAST); \
1170  else \
1171  pinMode(pin, OUTPUT); \
1172  } \
1173  static uint8_t IsSet() { \
1174  return fastDigitalRead(pin); \
1175  } \
1176 };
1177 
1178 MAKE_PIN(P0, 0);
1179 MAKE_PIN(P1, 1);
1180 MAKE_PIN(P2, 2);
1181 MAKE_PIN(P3, 3);
1182 MAKE_PIN(P4, 4);
1183 MAKE_PIN(P5, 5);
1184 MAKE_PIN(P6, 6);
1185 MAKE_PIN(P7, 7);
1186 MAKE_PIN(P8, 8);
1187 MAKE_PIN(P9, 9);
1188 MAKE_PIN(P10, 10);
1189 MAKE_PIN(P11, 11);
1190 MAKE_PIN(P12, 12);
1191 MAKE_PIN(P13, 13);
1192 MAKE_PIN(P14, 14); // A0
1193 MAKE_PIN(P15, 15); // A1
1194 MAKE_PIN(P16, 16); // A2
1195 MAKE_PIN(P17, 17); // A3
1196 MAKE_PIN(P18, 18); // A4
1197 MAKE_PIN(P19, 19); // A5
1198 
1199 #undef MAKE_PIN
1200 
1201 #elif defined(__MIPSEL__)
1202 // MIPSEL (MIPS architecture using a little endian byte order)
1203 
1204 // MIPS size_t = 4
1205 #define pgm_read_pointer(p) pgm_read_dword(p)
1206 
1207 #define MAKE_PIN(className, pin) \
1208 class className { \
1209 public: \
1210  static void Set() { \
1211  digitalWrite(pin, HIGH);\
1212  } \
1213  static void Clear() { \
1214  digitalWrite(pin, LOW); \
1215  } \
1216  static void SetDirRead() { \
1217  pinMode(pin, INPUT); \
1218  } \
1219  static void SetDirWrite() { \
1220  pinMode(pin, OUTPUT); \
1221  } \
1222  static uint8_t IsSet() { \
1223  return digitalRead(pin); \
1224  } \
1225 };
1226 
1227 // 0 .. 13 - Digital pins
1228 MAKE_PIN(P0, 0); // RX
1229 MAKE_PIN(P1, 1); // TX
1230 MAKE_PIN(P2, 2); //
1231 MAKE_PIN(P3, 3); //
1232 MAKE_PIN(P4, 4); //
1233 MAKE_PIN(P5, 5); //
1234 MAKE_PIN(P6, 6); //
1235 MAKE_PIN(P7, 7); //
1236 MAKE_PIN(P8, 8); //
1237 MAKE_PIN(P9, 9); //
1238 MAKE_PIN(P10, 10); //
1239 MAKE_PIN(P11, 11); //
1240 MAKE_PIN(P12, 12); //
1241 MAKE_PIN(P13, 13); //
1242 
1243 #undef MAKE_PIN
1244 
1245 #else
1246 #error "Please define board in avrpins.h"
1247 
1248 #endif
1249 
1250 #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 // Pinout for ESP-12 module
1399 // 0 .. 16 - Digital pins
1400 // GPIO 6 to 11 and 16 are not usable in this library.
1401 
1402 MAKE_PIN(P0, 0);
1403 MAKE_PIN(P1, 1); // TX0
1404 MAKE_PIN(P2, 2); // TX1
1405 MAKE_PIN(P3, 3); // RX0
1406 MAKE_PIN(P4, 4); // SDA
1407 MAKE_PIN(P5, 5); // SCL
1408 MAKE_PIN(P12, 12); // MISO
1409 MAKE_PIN(P13, 13); // MOSI
1410 MAKE_PIN(P14, 14); // SCK
1411 MAKE_PIN(P15, 15); // SS
1412 
1413 #elif defined(ESP32)
1414 
1415 // Workaround strict-aliasing warnings
1416 #ifdef pgm_read_word
1417 #undef pgm_read_word
1418 #endif
1419 #ifdef pgm_read_dword
1420 #undef pgm_read_dword
1421 #endif
1422 #ifdef pgm_read_float
1423 #undef pgm_read_float
1424 #endif
1425 #ifdef pgm_read_ptr
1426 #undef pgm_read_ptr
1427 #endif
1428 
1429 #define pgm_read_word(addr) ({ \
1430  typeof(addr) _addr = (addr); \
1431  *(const unsigned short *)(_addr); \
1432 })
1433 #define pgm_read_dword(addr) ({ \
1434  typeof(addr) _addr = (addr); \
1435  *(const unsigned long *)(_addr); \
1436 })
1437 #define pgm_read_float(addr) ({ \
1438  typeof(addr) _addr = (addr); \
1439  *(const float *)(_addr); \
1440 })
1441 #define pgm_read_ptr(addr) ({ \
1442  typeof(addr) _addr = (addr); \
1443  *(void * const *)(_addr); \
1444 })
1445 
1446 // Pinout for ESP32 dev module
1447 
1448 MAKE_PIN(P0, 0);
1449 MAKE_PIN(P1, 1); // TX0
1450 MAKE_PIN(P10, 10); // TX1
1451 MAKE_PIN(P3, 3); // RX0
1452 MAKE_PIN(P21, 21); // SDA
1453 MAKE_PIN(P22, 22); // SCL
1454 MAKE_PIN(P19, 19); // MISO
1455 MAKE_PIN(P23, 23); // MOSI
1456 MAKE_PIN(P18, 18); // SCK
1457 MAKE_PIN(P5, 5); // SS
1458 MAKE_PIN(P17, 17); // INT
1459 
1460 #endif
1461 
1462 #undef MAKE_PIN
1463 
1464 // pgm_read_ptr is not defined in the ESP32, so we have to undef the diffinition from version_helper.h
1465 #ifdef pgm_read_pointer
1466 #undef pgm_read_pointer
1467 #endif
1468 #define pgm_read_pointer(p) pgm_read_ptr(p)
1469 
1470 #else
1471 #error "Please define board in avrpins.h"
1472 
1473 #endif
1474 
1475 #endif //_avrpins_h_
diff --git a/cdc___x_r21_b1411_8cpp.html b/cdc___x_r21_b1411_8cpp.html index 459dd375..b05adf25 100644 --- a/cdc___x_r21_b1411_8cpp.html +++ b/cdc___x_r21_b1411_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdc_XR21B1411.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
diff --git a/cdc___x_r21_b1411_8cpp__incl.md5 b/cdc___x_r21_b1411_8cpp__incl.md5 index 488365a4..96940093 100644 --- a/cdc___x_r21_b1411_8cpp__incl.md5 +++ b/cdc___x_r21_b1411_8cpp__incl.md5 @@ -1 +1 @@ -94c1f3e832d30d1e0699ba30de20f4fa \ No newline at end of file +91e9029051e41cc4e0144ef4cbbca25d \ 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 fb15fdd73f394558e7107bda2f7c82985f34f351..9b16c9780158b49ea50298e487719f96c7629d8e 100644 GIT binary patch literal 8512 zcmds-WmHtr-|qpD25BUOp%I1@38lMhh!H_RK%`r`8w8P(Mr!B|0m&f+k?t-DC8hJ( z{MWrN?p^D?ylXw{d3ENz*!!Hb>-+hBe-ojhCXbIpg@b~Eg0H9`qXn+%C@82XSQy}! zoHbnsxS%>~$xES>|DxGOL4jN<%1COvqwX4Fx|8XUi!q@SLnMfmAlW4Ph4cyeAq;4^ zqu33QLfle(hs5%daISEiezcPCLacDQN-Q>6<~}qo*%w+}gt0l}3i!;y-_F_`Lk0H- zo8#6+dptJ1m&|@=&fQ%NHEu4ZeEDHPA_e{EpGAmu1QRvDXM_+LBYBCgBT-0xRX8}C zs|fw}HzMlWhtExxy|$dKwT!VMc!u_dak$CV+H%qqN{Z?gB&*QIKTU#`VNl8g^C3+PIF2g2`?ntr; zzF(Q59C}k3FI;ojb&7`zvV4`cx3{gl9UOSNySg-_q|my1dWtcmg`H(zt^(`_^nm`ItV`9th)Zlk1=N2g@C`Zu@Ui_D^@`j#s0&N5|B~ zRsU@c70^qE4vXJisMo1%yqzq4#qYLfz|1xT!AiO{F)=x6aN5ARxmvnI@S66#AEo!N z1)b)-{$?lKEqS>6ZE5uUa19&XiL|BZGYcbQP^Qz*@&g=?ofq{YV|4vuM301!RByxmRre7CHKqDkU=Y0^+6Uc8n zn{a#drLC~r-}nJ0LEdxgNsSiIllN;q(JseZn)(e6^kkg+30g21^LA{3R=(2l#b(yn zl#w52#C)M9V;#*#&bz_XvRoC262ZX&& zZCFd*YYSfTxbA3sjJbQREjD|^JCJg}nXmGsloOV7oGLer7fkqUKFK*8GMa+QMNBPg zyV#tv=)Q*E|MO=8ORL-d;`ldvBTF5Jus}k{+=E9V5|CsDxr+q%+-Ha$)-3P1cR!OQ z9UUDiCq{RdUsx6k?dBa^cg8qfmQH> z*XwtRMIN=Ok*`|0vucC$<}ac>D;4GgBjZ)ag=%x<891D%ORq#Xdb!Q8#Z#w#Oh?Rr zSFP#8uF{gv*%Ol>qCClI&E?LHKuMkq6PzxW7am7uMbrW|$s!zn#u39@wNFO#6iGa8 zH@+COHT1>ES20b%HtrS*eSDB5=F?PLm>ef)GYzrVJr5Y}R0Ug%pd%7_ z<9>58#az#W2Ql^bZf+)u-uWk!WsU5(Yv;$QmgG6FXg-RpeScu6UuVVa8cxk)?4O?F zu**)jDoSL&lAZqKpRpsV27P7gLCtc5DSIsiJkWd~X(Wu!R{?Cc20gWgqg!?;b-EiK zUnQGvX|fNQ+7v{*6c+(A!oJ>!dGfN@?pN+7vEsuE9+Ia~qzzOzmnV$y=L!o=t`m;1 zQvQ$F2GR2h<=B{X=!n@j5`2B2NuG3hS0aa=nosL*_N=(Y3CfJ#<<%9QJp*`tSC@<` zIpO?bSm)aZFm4R}s_=t3o-z}2>?N$R=z_r7WCAi&$C1p01k#AhFJ6HVAbnI)n_T@(db~ZB zTD)?QDejkvL&h#6es^6%g^5yb)W+3WepEz>$2IJjd<8}!`SN&M8hlLdQy7Af#y~I7 z79ZZQ*86F|Y#OJd_HsGs(Wuvc%O=^(@lJqgw6958cZNR}3M7n)LUHiU;H!<(09v0CK3*8hkN}^j%%T*nCmIR z&IkjCTFbE>L*2$cq?EF7C6A=I1IdP*af>7^7SHXz-yH`&8ae;;Y=C$%7P<3qE**z% z=~t@fR)x5EU=99gQOpbJ)}1F}wpSZ!%+#u??!>`RV@5m>`Z_&@hFWQk8g^0DOB;{g zfhcjpZ0z4Ger7#Yp7=``p=lmO=4FyA7aiwih%z%#q61;~Ru<|x$Q^E7UpG@tJXjn4 z;1MN~?DpJL*fvnafwfW?{|--(>YCe&0>yNqM338YW;yI`jqXk( zEqc)T?-MCwsNBcLk`57092dcqbu$!!ZYw+}4m&MGrD#>nA6%9-MG%jLCOo}dVy!&LzHe0+tzSu-JM1V=hMU04 zx4cJ<`_oIqOrl?gvY9=m8)u`++#advV;h91rNJkQeX@=`G;*I-oZuO$gD%0a*F6+s zvJx}blO^b5Wfe?d5gI-JI8euerXpk=Q)21W9sF!}7+zx%Dn@fU0e>8j&ftHeY7-?C zNwQMe7}hHb?ZHZap(7)rhezfGr}#+n&>e5lf5aAuCs|r2A1UMfHB%9K)Z6Ce zc4PV6?-p`MpD0J0g#3~0KjS~;ZYn)@}J(2*+=D##xYxx|H*J$DAKQEfBt^B{h!LJ z-3eT`OrN=#9Opb&BU`^dJp32xrw0uO<1lrPpL9&e{m7^Mt-d!e$k^9ss7aM*IWj5? zzstV-KvOVT)>fX2fo^shw_m|XxsOM)(hiL&I80S+<7m^%9sOI+4`K9knmMOy!D%nPUH#*TnS>oc| z-QAjV^|l+YA_z;|FAsa^HUb1DN;a<_|3QY}x?G<-DygVwSN}&2uTFPioq$rRMS;YT zwC%8e-ARmc{WGZvhNo)`_hxFk`$Gb>&Be00%t`%tNB6DY`3mOY>yN9X)YK(~{F`;w zQ(F4^R1voL(Th{4uvZNp|9+2L{M&S%-#kBeuQIF(qV-rOYI5F;(f_sF5wv}^-^SV{ zO%8=ieE+b^K!`7|t4q#l(4Zm0TBc4dXqRAVx6mZJ@ZGHdNXAG>MJv0YAST{p$lBjK zk+XT{d+MDn*&5((%NtA+jGC|^^2jSF82dLQt`2~HG*24Ea_*bGIwd8gnxh63NRLRx zu2e$`jckQoUZdv;J9yie*2^7^UZ|D(+1>*B=!IePOdU+Xw_7Y-aK`4Xge|gv>-UeJ zKWi6SeO~t@LSK#6`&@l^o>Ag$#Sj)XKCb;5_!HYeCcbxI3Gv~zFn}KGTW&A^C~0Kc zFE(42Xk-W44u6&8gJQ9DQgFXXFyWPO%GHAtP-gO)hL$<5^#~k7mL{{MF^gcg$6F(v zmeMXGIkJ3rz#*7b+s@U`++J^r&jEtWzwJ-tQ2KBJg%+s7b<-+i>+M@FD$@gPtZ4NpR(s+m)l$f#$T(Oy*?5LYj8UW5 z!zEWSw3aj^^>dqo0s{*H`5q&2xfOmUe$zkh4^xXxN8iS_CGIMSAYr9q9(>vIQf{`_ z%X-Cl0*OT0G<>H=1}jH70Fy8m$E<7vz^$(ARZY)_y?J2|i^w;MxSQ-*K3)cfQQOLs zAvL+}$mqws$a-LmJZxsFyH9_o+4t8Y^74dOzL@Y%%yu1HzjWP6VDSY`rHP!2p1woC z_uAb<(L`J*1Rt1aG9un?56}ub zF$u~x4gML^Vb`?>K5Lvm$6_dx59&=U9IIqjXElK}hS#Md#@tf!EZqc;OBVqQAgTDu zANnWGS0a$}WL{HkGIDCwRQ}IVVQn|N_FCM~uj!MO)m=)&hnYBiQQI0sDxdrAwhOXG zD@{5{>-Jv31w7)}aUZX&#Z@9#7rra(Fa8|nyveLqN#V0X;d+QL9^X(tEP8~wq$2bu z^>nSAY%K1WlHkdUyq*9vq(`EO-o-c`21O;L!CL+kt*YPM)l$BF_--s1J<9byUDMYO z9_2ow5rU9~J)%SW9!wh`aBa?%yJ%(75p@u}9K9hc)b8HX;R-DorE zx%Vx3*5q{AYeBRk6moQ2RH1{Bk&*E_YrV#Gd6B(h;4F%L+!EDQ%^U(mh4B7@Lj(#7 zpD3KabO+uE&uJbOwB?XTUt=*uZhu_Q1gHKxlOg7#Pdn{&AX9Gm9q~ILAN`_gSwT(h zLz>}voznnX5)~$t`Z6GmO)zj5GB0ul^L~;4*8J?(%l&Xc(<_Bx1_p+8{>T>YzlPXh zDZvl8u>*Y=&6&5^vp6d6G4T={W>_35fH65lR4S(bAY1kK7hCY7P&BK4u-9X)M~+qUmPKGJQd?M2Ef{X#8v;tvgzsGac>0o>j z7I}YcizC!({eQ_0y40HSXRPvK^C0-ZdN~FSh?Y=$!#qH=a?tt;qWu0nb5#nB;#B!A zp4nrwrK;zv(e8DRHdQ-x)n1zSTPZ0DD;W8Sj`lAcD=tlk{lhLbC?o>f&1eSSCjrzZ z7LbVhTnaoa81IiyAc&Y)E1k0Cfb4&aHEB@?uyTQ}%QcP#z>kQp^b8xc%xdosp`vdO zekK)qA|?rFg9P5F!3esN>#JO31uebNI4G=wL04FmlUL}VrMmHkRP;Uf(06)fK>#-X zH+l)ce$lZPhHbX5sRoljGl)wUF^PKc8G1vxf_BCubhMA=n_OL~_?Q%P*Zj!?Xl_0k z*%D0>Oq9M#60j3daod}B-P!uKw0K3uz;JbDzmpJ3rjPEfG_kru%C66!Fk4^t^fsc_ zx)6z!Dm47AuXgb&TekgqAJO zU%OaalbP*D?^qE|m^_7w&?n=jFNNw^a(OBxi5y>YsGj%FN3C;wyJuUeJk_r%B^O5< zx$En4vkC-__n=D7U>kUTUaejAHo-f2Xsn2wT3rg^Lq1jnW7Yrup^Vk%z$^9OfMu0e zmzmv2tbgCtOMe9b47TpH&0BpWYN3Gb>~Orgn5DqaEo4ZV%fYh!>b8{nSe-4vLJ*Si zkJTw##uj1g6=^Y7?GDRZmK6Q^X1Bn*(RumxD+ERo6MpOZcF^}SBPFTGBo3(X!diZ1}dwsx|A_Vq#Fk3}1O zZ<6D3h&ffXabAWIUSWg7t4~>m}_uSls`L+j|kbCpZ zXWp+-^|pIU-S3hlL&QVt2`=8>d+cyOT;;O|5unZ=w~HfltA(cLAZ_ix=G3p%P+VrG zo8|R9et&4(h9N5>qw(+epe2|K(kD+;nU$0BE>HeY$5G>_@mmt#hhRzxY?6wKifVZ} z)OVQ8m3S+(KF6BH`gO%jT_82vZV!0CZ#@YO)bToB3A5}9Cvu8CTn7hktA^jShy}>Y zhn|RfYWD;|J45l~r7wWMYK7pCF-e--NMwFn^i=L??EjLIqL}4(E9`SRV{r^ZHch~} z__QL)AYqjTXh$lZ(<-B!1m(@copm}`mYn_W#+{EqjDqpSAG;l4P`SzLfbp1A3D`_a zc%A+w`hNGY2mng0aR-{PDu`s>=vM&f>tDqnpiuy1rW2J3a?OC!jsC>=CTtQGg}0F5 zHb1`m2@FZeIa-w$e3QZC|m_u z=X(30w=iS50nESnN(D=1z{Z|wd*%*4Vj}^uV1(%2c!4obJGshOf8x$p$)NkJ{CHUU(GN?9?a}-=nPgA5 z-P!yY3xMqT;t!A7&pcN`D3~0pMrDQJGX5y6YU#1tJY`ZJkBT08xd-f0{>8!n+H?;6S< z=fBgu+h2oRP6Ks*-) z%(?@#KmOg#zOntsVC`NB!dkvtukO6aK*dL=SbL-l|H??{BRYqaXvg9c0$Cbt%LH}B zAq!5lq=S`O!`0XnaMq@HxIm``SkfP2PW&`{`+wf@oz#cF^7}$XL&GHyB;74nb^Ax< z-D8KETds-P;JI4M_<6x+oy)@YCKJUZM{Y&Aaud!U`BbM%#Vh!C#b`2Lr|OK3>W*=@ z(eUruzZ;CCo&`23MZP!C))e{5L1S>9ndN`_?bxlfRE__KztazAtJabc!eInA46Poi z^sOx?Epl`uB$9)vIulz$UuD~C@0@hzeqK>1sfx;%>8mC!&EnwnpLt2!v}M(Fp2q=6 z5b)ec+~YS>7`?InOZW9%rq%+U)?FE*LU4by+M5= zD2w63Px32hWq*uS)0WCu44M(W(9`0U5uFm0I>JkM1nV)IClQODMKU3}v{zrJRzTUI5 z*}GeVj)|%HXYzR$D_7^=32$3}Ku0K#@;l= z7x^RoJ{;0M^+#gxIbPu~e8S-zi`ejq8LZ>I425ZD7!wmy@(b5uX%iFr$jBi(Aj*xX zePT_fy|d_XPvcTjm=R;4O0h$<_q>I|#HN2Suu^uz0S}Ry-zLAXCH&F=M`w;wVfUR${>r=->VOyi*mz)uddwuovC@s z%-sDwbCbc<$_hQdfP(Z>&9C(w(*0^VIl2F&+lDM8i2ANSiZ9*v@}j8)BW0dCieCgRf-Cx4zdvPTp%PQxNF3ln6Dr+ev?5KH<=&-l0~*r4~f4gO5?hikpt zGZtC-AZxaiBaK4cx=&W37kTfEFO{fgZLYqc_y5-McZW|F&Lve&Jk)M*F!9{2n;IX741v6+`;mnbOhyL%$5;wTGVV79*RMm%sj~1|r~5uL7J(RK z)X79Y#JSCOPQY@5)_ob3{Z)0|IUU1{eT4Cdf7lKoq3cYw`FMqqIOSrKD+iz=g*X4` zIMGlQg(P_VZoMNTBC;dNIEWXY2f5;4V{2x3sCdD7j9-K-kx@{{<5Teyil=Tf5e1XY zSDM@_Zk+9GZIMA812Hbz6^><&%>YlZ5k_R1E0S5Y&H9j>}8+%MQ z8UbTKqS+x$fPaRTXjnMxH#3?_L$gf$fDvBpx<`b+ zxo#0i9sy>rH+S{$o3B^|>Jljv63kJ#Uz_O^>6WF=!|SE)poarq9C$Kcj{|%fBq%N8 zkK?f|;sUS|-tnxUndhmFs~=EnbU z@BM-2%(G`Wv)OB%^}Xv`guhag$HO7VK|(^pQ&f<74X&9;NXST77~qwh4Rr?+60NYJ zjHH$a^1d-y$bZRU!1`60%&Z9jKCm>nZ`ricB)-5Dmdq5g9GC z5CQ=bhN5=bmB3Hy4Dm7o@!uF(D{!69N!<=r)MrAL?8q#aZd#WPytK<3Z_3+DTZ(sP zNB$5>u|~DCNzv>*$@-|?g{6R&3R4L&j6fnjNbdZ}Y|+VyY5yDr())u-#3N2FicE5* z+?4;lV>;vrH!xe&`}IeBDkIwktUAX(a_OSpd^J|%op2gvGGu?k->tsF8>3&Ag;%SU z%V2>gidNf@@RUhL5^~KA2|-h?feOF^l3Deo?B;9XP8)*=*GvJ&pv{pifO-9qWiMy=g*(h4VM3%O{!}Zs8MygrVcc^?!LW~jUaIx;1jOX zLDJMi$05mC>xr}}4p?4xBDgr8F`aC1-eN^Xjla7+9p&*lvr1{`bo|ph4vxu%$nR#q zuG;<3WVYSv?Jx_wX=~>7`L4WSoqf_)o7+Bl%jH_+*?NNd#2I1|F)mLH=U?*Z+Mi=m zO_$LuP;(s*rXjoT>+bGn6BW(6zZ&(Q82c)1JV+Z@6^u!cU!q&yxFLD`<=?IRh;NXD z9H%ha|U4(CopvztE5%cD+qcN-$BVL4Un#`mb0QHR$|cF(aAXSgFQl zCV#3#ck=%3#(Hx&O{?$~?OdJ17X~WZ!4wX4Q=emW-_xJ`@%`t!Gc&v6_{F;AYW_F# z%hlh`vddfkrk{l!tu(nG=37tZkJsAGpKM3)mBB(dmX z8QR*G9-nbVdue%+a+o9%Bo1pTMk6l>Nbl z@ssJwn&U#LKDTG(5nX@zYd8+AUlVLKs98GiFU5#p}N#nIiUMRU|HK_hHU8+z2 zN8jV+iujvOG=#=DW4S?%l33{{)UWcX;9yCDNM$dNH!~cRY*)!7de_(AUeOefY(_TyFKf!|ANK&|RG+Y|i@}D7)Gjnx($#_UNRmDMz?QnUG`I z|KFWg>giDzK~uNSc6hZUj#M;M)Qhm0{F}~q1Ft4)6Y>$XuX1V(U_XygboW_lo}%qm zVfFJqH*TypGL@c7$kJJwg!0Gs`mTjDuP5M^C#I+Gn4<&<_rb_)b9QB=ZJ-cGibmcj zRtUw{rep0_PZqy2(Xf|U_C!4X)!=NYYS-8&D5=8M+J%Z78?Hz6M#>)Rr5ir&5n=U* zDW&qc2Il7m)rEW6oG-%2x`;(o46;oELxU+}Upo@Z$3k5Nc~O?Y)34F$bG1EV>OXag z)DBlpc?-5>pCiy7-L)uwxf1-V#zwb6Ld0!PPby$n@#S}90{87PTKz|wwA(s|Ef*%& zGi~=9q_e{#!R_Q1q1I0vQ0M~oO#QCl3lah@#vTgJ%28x_s$+cV0t7-YJ3rPe(6- z58oQ0Ly(-rEsEsJXe7$ur`={>i8)b&XtHTrL!GmTTSNPVJ5}#_pcnNx`g-s;lu( zi5D=TxtUna{QaoNz01BASuR*)V`d*Pj|-W|h9zTf^eW7dwM%qVscG!ysuf36b6G`d zpTtRbpOyymRx!orYbY(z!N*_M+;QqiX|^IQKc&mj2{Q7kH%y(h9b49fXiSPYV0 zhFOo%@6%Cnj;%(dssh~-39asAtSE^5>NP0qn@&pIj`eO1LC=Y83GLQMgUPzZ>y*Xr z&NOH3f<&;GUkXNFJ|ZAr}=bS@bnO_QOxqlqz5Ak+-3V$xYBD-q2 zJsE0!vgPyy(yl;8Joz4_@2f!=H_Krx`wG_9Xpgi0E|yio@_XK#rW$1@5v7{l&ibVl znE-6k%zg3-_nr{k-}%@hxSGANR9%ZVXr*)kSE?$JWIfR^z1VI#_GxteVTgdQkR0o{ zY{c_mms6C|B!_mFz2D<_*mdEibws5wX|uiGjOGoNDSGef1&I%J0v;=&3501%bv<>X zX%G2~QYu!o|M#scWO#Q{_;n3;|)bFQX@UhK`&vLcUi zi2&>Zq+WeI0#Yg}M5&YD$Y3M8n4rn1Y#+8WAjQr4daJx#xO;}IwW*(F3 zi>BYOPD*5Fw4Xy^)wP-hUiqjW`}<)^%F2w7*!7y}+e1!cKC_NDdpTp4TYWd!z zAcjiQr!+K@bJb@ZNrY^T$AiaGQ7IxXF|lgoh1lN!kP)Z?y`^edud$%2#Bt>|Gg@o| z-qeIG_;Y2AU%Bgl#=(Rzu!|Yet;Gm31$~-DIWa@8)F{{ zIsI|RDIrmp&KxW4QgD7(y}9Q19sd6P`w75u=qqWo(MHE>oGv?BVS4%ka?V>Lc-E}x zJl0Z*ii)ikD@W4FY=)bJydQ6q#r@gjjg02w`jCyt1YkMTkDLTAO$V{20FvrzQkjF#MgKQ5U z__u9kty568yF?`>U-lq~dy>@q@D-55BA{wKKnR4~_ENK{ArM*}ycdzW-G|BEY|>E|2tdcl6lFzj`*Q}#t^e*W zmJt9VfugnKUjsdz{7(!UA0I#Q@;ck5-8?wi@!B`LI@xdm6+3+9x3TG?u@laV@asQ+ z{_rL(WMmn#R9N)kM?^=%U&EEGU!=68uH~X);*Sxli>&6>2}52%?dPhk&85y0H@wx< z)bgV#_$QV*BxI@B6#?>(yJ?P*!fWRD_#?Ep@NseT@>Me? za5tnp6)B>EpBU}$ zr=kj4xy}GM`12VW6;syq8a*!--Qmmun9ua9zA3jBppC@h4FzB=$zG`CM*e+EclyBk z>0-V@s_8rfHnW)|5=Jke7{`&-Rz${}9VMUx;%C!}ztU~GW?faF@q3GXYohSYhM!WNG+NkyIHKMpS1@3PPXlv9FCd!O>xO6oVaI z%m41(i%6lb+-%77%^AXdOwre6-3zhFiT{4_zZb+KdnuuraS&>mKv2XN0O4fE=1|#Q zl8j%72L##jB7|f+$dO&RXPOMZG7W3mxQtr;`*t!GXBXJxxk#J}S~=JLfExcR%J$%u zA}X%8SfZ!H++2L!F8!dFCV9d?mFm`Rem0UN3^xbCSS#>XUH?Q%Z{*+q-i=PhlP3AR zCwPT+vFcsq8LS;+7UK3_ODi7Z^3m;#F3V2 zrhrD9`@>`0gS@#iR#D!362VF09x}Z(OfreD`$NQgHOBl{>0LYUl z@+o~jN0M^v@Es-6h+|MLHoBgEU|%y3e21(ajhBsg5%}>La}a_?M5IpBb{_z$Hz4rt zj7nohD@RAiDvF+4(#0u~IrON?rW&bX>T4wA0^{x|1Vd;8o)Tr1^RE1=ByJFZAh2ZWwRh{3R7lLyU=l*K|Gr&utdaMPa&W-7Pi*hUhR3Le1#3?MH_bhvq{)SKCiBehX0b1vLoonmuOvVM&YNYWj+ zr85dAVq9l$ZVOEZVdHFKN5H48i*Uk`1(%`!^I9Go+sL+Y5B_ck+d+hgkZ*b2wZgUJJI- zU(?*&Ju~c+S379o*Z1iS7gxy*Hg{_O=QM>zVmVc5u~lT!@|gq*WfD8w&P?!SZCzn# z<@E~gjoxJ!!MR~jJtfJt%LR3ohhXc&&*${ubLp2a+XFFpY$c8u_?Fxooj^CX?*Fs z&a3vo%S)+WIg*};f#HZeVc(TNgZKKS+#s6VNV!V+@TnBXbWU+Px~PNJCZWeKNbH8! zs`zW zcFy;3ID8NRQH?zysWfzP`If)dLJHn7L2?>ty;u@{=CHKa^K^K~74dqs0gKujWY88m z&DLIOs=|lGMkZOgFlE=TQk=g4p>EOn>^&q9X+YHMkyTpSOpm2VSD|JBNnPrQUiM@e z$Q7gGqx8=9uVx)q4c${k#O?(q$lN4YdY!=fQXlbt^O`q~&!vD_?e>`tl>O62X#}#X z9l09d$*}kMnQz-$*(Lz49OH~>d)*%Qp<;d)FI(T4+Ff&nvqnVXHjh@6o3>>yd2Ug0 zrng>6N#+Emh_2&Qvk=c{w)%Kh%FXg3m9xS)p0l#55V5~1e`(hAO9DNroW&As%qfi8 z@CGzhBkJw-9wQ)&Hy(-C{v{5KV*pOl4=Z4#_({Fp7^YtkhB7k z{r+4{2qIV_0T4&Jh-X#mpC+hPO0vxiu}g@s;~JWAgHsPlPE^z*P0_>@4pSx%GVTT! zM0^!+qY8IBLvh))vjv@d8NVyF4_z7PXv@>=1c$-e?yp&RZGXqT&?=N*R7#9Hb*I63 z+YyAGn40=*$(lvQ|7yr|yKdQUavlXw7`7q-&@!nOkDO<$Wf@==0zmFJK$?m-03LQ2 zj^2LUB?Ef#;0~zZ_h}?BsdhUUwtWLe@v(Hq+5<&0HaNZkAe0Y`wii03sUDc+p%m8V zk^hLHXn3nozsonpT1D{;-Jr{|+8W8?v7TTE()B*-z_cFAk*xY$>2y4$Yx)^goaym{ zmGyLVf4R+cGnf?><58R^wa*c95}Tn85y=w4x+k!9Tjt(@7J}5&NAic|Xg;u4Lh&gD zB=m|68(p4fiTS1j1(OHOMACWcT}RE{Tuo%H{i4#%-~Bv*N$HPoGzXA)c(_jtY@mu}|rwt`U3lL+bl3k$e(bVE5sh$9*WPLmPoUlT&QuMW|Cuk#(o$s_g$p*%}| zhFboK9kMonf3@Ao8y*$)4G^G>qUZN)42+Rl&_cNE8~klc8)LajfTGE!;KTjI_<=z(uT3K6a$S+*20V!hiL4ui}v!1kZbYiKGLD{ z(Te2LoM4xcAdSuAKYcyo`9-uQxNTP%Xj?uW+}#EbGX@>ve7Tp@VY+Y{0XZYku#2VX z%nl6CA8i2`tGmpyC2u2eXQ_~%(XBL>oz$fLJ%i%+1BDEdj=gzMVQtRvZBUJ6)LR!V zh%U^zg;5Qi3q_?~!aj?pnUBecknaP{G7&L*oFOw-c{Da@NHlqW9ZAI`-NRI+Cz2GC z%MIDvj_ms%yX4GLx8JVL$jSn&_7M;xxtH9*@tOC5`maC&F-yRzBJKdgw5PQF|nMv1Z z>SbvkZkC(L)a=2q4^a0a69X~YuW^?O4t^YP`}fSuDQ87S&q&QXJ*|CjnUAWgz1F%M z4yZ$%`Pek`pMe?Ipngvu6F7bq3C?06Hx&ryf@_|EdT^9+)AY=wPmUa5t6sU$BF%zF zNvuyx3ZgM-=oJRm9^&90^)|fBm?G7!WZS7kSDom~Pu2qq)vv};*jpAi?gvJr)rNQk zqtc6wj_y13QQaY@kRqidrB_qM*tylIFz5KvQVIax#>{xsUVz}Xu&Jb>7#I-9Y}{&w z&iQUiL3j5aha829fVBh-g{U+J^CATJ*Rno5Y~IxoQ|QpF#y{(dT_L9-F|-8qQ(otT zul4lY>gMuQ?WCWp{r4RcM51&!xn$kva%Ht6B8MzrM`-^S?2%m8+Sw#Xvz9E?I|etp zC~7B~*Wd)^=rx;GTS0vP&RQ0G54+yQP|5aW&}sZC9Oqm`G;{21^`ieO)lV?-LckXa zcWS30Bv5-WT&M;$&=BKogA+olXrjSTuC~SdVq$$D!D04p)-yN9le+A|f3X~)6s~Nv zb8Wj=@;>`J@335Zy0sY|+}X9kL}QfF0z$CYlVZdFpV-r>=nbBP*+`BVdkGo_><8oC z>l#sj09F(`OrRT$;!N0W4>nFgd~Iu2MObR(%>D0zN~gn))&j z3>Eh#mS`x?F!3oLeyJ~(`oeRGLsZmQ&Dy9fy9L9hlp}G1R#Cv8;u36o&A47glbdh{ zPGjK9?89FA& zMZPK#5fh)6f`MNnuzj-e;lXhXMn$jT-!7#15vG{Dt?1NJ%oCtWtV(BO;!KRkAG zJPp<+!vb*uq^z3xQO>UHeIEWXp;D*vJe8G|YacoGjm^2b%^$|KfM1kGL+u}T+yQro zrp0I|nXSm<*7|-j z78x}-X?;_GAhPJ_>Cerei%^V5+iDPZ?J}dZo$2on1My_6PTVpujss#k!1v*oLX5%Z zaOA+#Pt%W22-U*}M#Ni0uDA1IK+5Vj5>(Eu{H}M*lOBer%|$Aj_dPf#DeT5vKS{I4 z9oM?CCz}^uw*qO#KZdRAxYpHVgKQruUT(hyPThIpCK;=lCU!Fea9%@fQ+9-9jJWt8 zJWi%`qZHi-?515qX#gC`&Og51*bL0hQyd6szbabL`@}}OdA?(ZAB`JKe8`%leoSPn zL?j_y#mLEDg0umi(fMsGGd{EDc;@FxO~MADp$(rYsnnln#&T lS=~SgZelXl=iN(j>$)}u)*lK8@ZS_jin3}lWm0BA{{g3{X3hWr diff --git a/cdc___x_r21_b1411_8cpp_source.html b/cdc___x_r21_b1411_8cpp_source.html index 9030df02..df7fb151 100644 --- a/cdc___x_r21_b1411_8cpp_source.html +++ b/cdc___x_r21_b1411_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdc_XR21B1411.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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:58
-
#define USB_CLASS_CDC_DATA
Definition: UsbCore.h:65
-
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:771
- +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:69
+
#define USB_CLASS_CDC_DATA
Definition: UsbCore.h:76
+
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:784
+
#define CDC_SUBCLASS_ACM
Definition: cdcacm.h:27
#define CDC_PROTOCOL_ITU_T_V_250
Definition: cdcacm.h:40
-
EpInfo * epinfo
Definition: address.h:76
-
#define CP_MASK_COMPARE_PROTOCOL
+
EpInfo * epinfo
Definition: address.h:83
+
#define CP_MASK_COMPARE_PROTOCOL
virtual void autoflowRTS(bool s)
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
virtual uint8_t OnInit(ACM *pacm)
Definition: cdcacm.h:131
- - -
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:105
-
volatile bool ready
Definition: cdcacm.h:178
-
#define NotifyFail(...)
Definition: message.h:55
-
USB * pUsb
Definition: cdcacm.h:169
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
-
uint8_t bNumEP
Definition: cdcacm.h:175
-
EpInfo epInfo[ACM_MAX_ENDPOINTS]
Definition: cdcacm.h:181
+ + +
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:112
+
volatile bool ready
Definition: cdcacm.h:174
+
#define NotifyFail(...)
Definition: message.h:62
+
USB * pUsb
Definition: cdcacm.h:165
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
+
uint8_t bNumEP
Definition: cdcacm.h:171
+
EpInfo epInfo[ACM_MAX_ENDPOINTS]
Definition: cdcacm.h:183
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
-
#define CP_MASK_COMPARE_CLASS
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
+
#define CP_MASK_COMPARE_CLASS
virtual void FreeAddress(uint8_t addr)=0
virtual void half_duplex(bool s)
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
CDCAsyncOper * pAsync
Definition: cdcacm.h:170
+
CDCAsyncOper * pAsync
Definition: cdcacm.h:166
XR21B1411(USB *pusb, CDCAsyncOper *pasync)
- -
#define USBTRACE2(s, r)
Definition: macros.h:77
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
#define NotifyFailGetConfDescr(...)
Definition: message.h:52
-
virtual void wide(bool s)
Definition: cdcacm.h:245
+ +
#define USBTRACE2(s, r)
Definition: macros.h:84
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
#define NotifyFailGetConfDescr(...)
Definition: message.h:59
+
virtual void wide(bool s)
Definition: cdcacm.h:244
virtual void autoflowXON(bool s)
-
Definition: address.h:32
-
#define CP_MASK_COMPARE_SUBCLASS
+
Definition: address.h:39
+
#define CP_MASK_COMPARE_SUBCLASS
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bAddress
Definition: cdcacm.h:171
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
+
uint8_t bAddress
Definition: cdcacm.h:167
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
virtual tty_features enhanced_features(void)
virtual void autoflowDSR(bool s)
-
uint16_t idProduct
Definition: usb_ch9.h:107
-
uint8_t Release()
Definition: cdcacm.cpp:259
-
uint8_t bConfNum
Definition: cdcacm.h:172
-
uint8_t bNumConfigurations
Definition: usb_ch9.h:112
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
+
uint16_t idProduct
Definition: usb_ch9.h:114
+
uint8_t Release()
Definition: cdcacm.cpp:258
+
uint8_t bConfNum
Definition: cdcacm.h:168
+
uint8_t bNumConfigurations
Definition: usb_ch9.h:119
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
Definition: UsbCore.h:197
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
Definition: UsbCore.h:208
Definition: cdcacm.h:163
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
-
tty_features _enhanced_status
Definition: cdcacm.h:179
-
#define USBTRACE(s)
Definition: macros.h:75
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
- +
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
+
tty_features _enhanced_status
Definition: cdcacm.h:175
+
#define USBTRACE(s)
Definition: macros.h:82
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
+
diff --git a/cdc___x_r21_b1411_8h.html b/cdc___x_r21_b1411_8h.html index 428f0f6a..1fc8e3e7 100644 --- a/cdc___x_r21_b1411_8h.html +++ b/cdc___x_r21_b1411_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdc_XR21B1411.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
  #define XR_REG_ERROR_STATUS_MASK   (0x00F8U)   -#define XR_REG_ERROR_STATUS_ERROR   (0x0078U) +#define XR_REG_ERROR_STATUS_ERROR   (0x0070U)   #define XR_REG_ERROR_STATUS_BREAK   (0x0008U)   -#define XR_REG_ERROR_STATUS_FRAME   (0x0010U) -  +#define XR_REG_ERROR_STATUS_OVERRUN   (0x0010U) +  #define XR_REG_ERROR_STATUS_PARITY   (0x0020U)   -#define XR_REG_ERROR_STATUS_OVERRUN   (0x0040U) -  -#define XR_REG_ERROR_STATUS_BREAK_STATUS   (0x0080U) -  +#define XR_REG_ERROR_STATUS_FRAME   (0x0040U) +  +#define XR_REG_ERROR_STATUS_BREAKING   (0x0080U) +  #define XR_REG_TX_BREAK   (0x0C0AU)   #define XR_REG_XCVR_EN_DELAY   (0x0C0BU) @@ -235,7 +215,9 @@ Macros  

Macro Definition Documentation

- + +

◆ XR_REG_CUSTOM_DRIVER

+
@@ -245,11 +227,13 @@ Macros
-

Definition at line 24 of file cdc_XR21B1411.h.

+

Definition at line 24 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_CUSTOM_DRIVER_ACTIVE

+
@@ -259,11 +243,13 @@ Macros
-

Definition at line 25 of file cdc_XR21B1411.h.

+

Definition at line 25 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ACM_FLOW_CTL

+
@@ -273,11 +259,13 @@ Macros
-

Definition at line 27 of file cdc_XR21B1411.h.

+

Definition at line 27 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_FLOW_CTL

+
@@ -287,11 +275,13 @@ Macros
-

Definition at line 28 of file cdc_XR21B1411.h.

+

Definition at line 28 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_FLOW_CTL_HALF_DPLX

+
@@ -301,11 +291,13 @@ Macros
-

Definition at line 29 of file cdc_XR21B1411.h.

+

Definition at line 29 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_FLOW_CTL_MODE_MASK

+
@@ -315,11 +307,13 @@ Macros
-

Definition at line 30 of file cdc_XR21B1411.h.

+

Definition at line 30 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_FLOW_CTL_NONE

+
@@ -329,11 +323,13 @@ Macros
-

Definition at line 31 of file cdc_XR21B1411.h.

+

Definition at line 31 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_FLOW_CTL_HW

+
@@ -343,11 +339,13 @@ Macros
-

Definition at line 32 of file cdc_XR21B1411.h.

+

Definition at line 32 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_FLOW_CTL_SW

+
@@ -357,11 +355,13 @@ Macros
-

Definition at line 33 of file cdc_XR21B1411.h.

+

Definition at line 33 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_FLOW_CTL_MMMRX

+
@@ -371,11 +371,13 @@ Macros
-

Definition at line 34 of file cdc_XR21B1411.h.

+

Definition at line 34 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_FLOW_CTL_MMMRXTX

+
@@ -385,11 +387,13 @@ Macros
-

Definition at line 35 of file cdc_XR21B1411.h.

+

Definition at line 35 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ACM_GPIO_MODE

+
@@ -399,11 +403,13 @@ Macros
-

Definition at line 37 of file cdc_XR21B1411.h.

+

Definition at line 37 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_MODE

+
@@ -413,11 +419,13 @@ Macros
-

Definition at line 38 of file cdc_XR21B1411.h.

+

Definition at line 38 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_MODE_GPIO

+
@@ -427,11 +435,13 @@ Macros
-

Definition at line 39 of file cdc_XR21B1411.h.

+

Definition at line 39 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_MODE_FC_RTSCTS

+
@@ -441,11 +451,13 @@ Macros
-

Definition at line 40 of file cdc_XR21B1411.h.

+

Definition at line 40 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_MODE_FC_DTRDSR

+
@@ -455,11 +467,13 @@ Macros
-

Definition at line 41 of file cdc_XR21B1411.h.

+

Definition at line 41 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_MODE_ATE

+
@@ -469,11 +483,13 @@ Macros
-

Definition at line 42 of file cdc_XR21B1411.h.

+

Definition at line 42 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_MODE_ATE_ADDRESS

+
@@ -483,11 +499,13 @@ Macros
-

Definition at line 43 of file cdc_XR21B1411.h.

+

Definition at line 43 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ACM_GPIO_DIR

+
@@ -497,11 +515,13 @@ Macros
-

Definition at line 45 of file cdc_XR21B1411.h.

+

Definition at line 45 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_DIR

+
@@ -511,11 +531,13 @@ Macros
-

Definition at line 46 of file cdc_XR21B1411.h.

+

Definition at line 46 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ACM_GPIO_INT

+
@@ -525,11 +547,13 @@ Macros
-

Definition at line 48 of file cdc_XR21B1411.h.

+

Definition at line 48 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_INT

+
@@ -539,11 +563,13 @@ Macros
-

Definition at line 49 of file cdc_XR21B1411.h.

+

Definition at line 49 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_MASK

+
@@ -553,11 +579,13 @@ Macros
-

Definition at line 50 of file cdc_XR21B1411.h.

+

Definition at line 50 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_UART_ENABLE

+
@@ -567,11 +595,13 @@ Macros
-

Definition at line 52 of file cdc_XR21B1411.h.

+

Definition at line 52 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_UART_ENABLE_RX

+
@@ -581,11 +611,13 @@ Macros
-

Definition at line 53 of file cdc_XR21B1411.h.

+

Definition at line 53 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_UART_ENABLE_TX

+
@@ -595,11 +627,13 @@ Macros
-

Definition at line 54 of file cdc_XR21B1411.h.

+

Definition at line 54 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ERROR_STATUS

+
@@ -609,11 +643,13 @@ Macros
-

Definition at line 56 of file cdc_XR21B1411.h.

+

Definition at line 56 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ERROR_STATUS_MASK

+
@@ -623,25 +659,29 @@ Macros
-

Definition at line 57 of file cdc_XR21B1411.h.

+

Definition at line 57 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ERROR_STATUS_ERROR

+
- +
#define XR_REG_ERROR_STATUS_ERROR   (0x0078U)#define XR_REG_ERROR_STATUS_ERROR   (0x0070U)
-

Definition at line 58 of file cdc_XR21B1411.h.

+

Definition at line 58 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ERROR_STATUS_BREAK

+
@@ -651,25 +691,29 @@ Macros
-

Definition at line 59 of file cdc_XR21B1411.h.

+

Definition at line 59 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ERROR_STATUS_OVERRUN

+
- +
#define XR_REG_ERROR_STATUS_FRAME   (0x0010U)#define XR_REG_ERROR_STATUS_OVERRUN   (0x0010U)
-

Definition at line 60 of file cdc_XR21B1411.h.

+

Definition at line 60 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ERROR_STATUS_PARITY

+
@@ -679,39 +723,45 @@ Macros
-

Definition at line 61 of file cdc_XR21B1411.h.

+

Definition at line 61 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ERROR_STATUS_FRAME

+
- +
#define XR_REG_ERROR_STATUS_OVERRUN   (0x0040U)#define XR_REG_ERROR_STATUS_FRAME   (0x0040U)
-

Definition at line 62 of file cdc_XR21B1411.h.

+

Definition at line 62 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_ERROR_STATUS_BREAKING

+
- +
#define XR_REG_ERROR_STATUS_BREAK_STATUS   (0x0080U)#define XR_REG_ERROR_STATUS_BREAKING   (0x0080U)
-

Definition at line 63 of file cdc_XR21B1411.h.

+

Definition at line 63 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_TX_BREAK

+
@@ -721,11 +771,13 @@ Macros
-

Definition at line 65 of file cdc_XR21B1411.h.

+

Definition at line 65 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_XCVR_EN_DELAY

+
@@ -735,11 +787,13 @@ Macros
-

Definition at line 67 of file cdc_XR21B1411.h.

+

Definition at line 67 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_SET

+
@@ -749,11 +803,13 @@ Macros
-

Definition at line 69 of file cdc_XR21B1411.h.

+

Definition at line 69 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_CLR

+
@@ -763,11 +819,13 @@ Macros
-

Definition at line 71 of file cdc_XR21B1411.h.

+

Definition at line 71 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_GPIO_STATUS

+
@@ -777,11 +835,13 @@ Macros
-

Definition at line 73 of file cdc_XR21B1411.h.

+

Definition at line 73 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_CUSTOMISED_INT

+
@@ -791,11 +851,13 @@ Macros
-

Definition at line 75 of file cdc_XR21B1411.h.

+

Definition at line 75 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_PIN_PULLUP_ENABLE

+
@@ -805,11 +867,13 @@ Macros
-

Definition at line 77 of file cdc_XR21B1411.h.

+

Definition at line 77 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_PIN_PULLDOWN_ENABLE

+
@@ -819,11 +883,13 @@ Macros
-

Definition at line 79 of file cdc_XR21B1411.h.

+

Definition at line 79 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_LOOPBACK

+
@@ -833,11 +899,13 @@ Macros
-

Definition at line 81 of file cdc_XR21B1411.h.

+

Definition at line 81 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_RX_FIFO_LATENCY

+
@@ -847,11 +915,13 @@ Macros
-

Definition at line 83 of file cdc_XR21B1411.h.

+

Definition at line 83 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_RX_FIFO_LATENCY_ENABLE

+
@@ -861,11 +931,13 @@ Macros
-

Definition at line 84 of file cdc_XR21B1411.h.

+

Definition at line 84 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_WIDE_MODE

+
@@ -875,11 +947,13 @@ Macros
-

Definition at line 86 of file cdc_XR21B1411.h.

+

Definition at line 86 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_WIDE_MODE_ENABLE

+
@@ -889,11 +963,13 @@ Macros
-

Definition at line 87 of file cdc_XR21B1411.h.

+

Definition at line 87 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_XON_CHAR

+
@@ -903,11 +979,13 @@ Macros
-

Definition at line 89 of file cdc_XR21B1411.h.

+

Definition at line 89 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_XOFF_CHAR

+
@@ -917,11 +995,13 @@ Macros
-

Definition at line 90 of file cdc_XR21B1411.h.

+

Definition at line 90 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_TX_FIFO_RESET

+
@@ -931,11 +1011,13 @@ Macros
-

Definition at line 92 of file cdc_XR21B1411.h.

+

Definition at line 92 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_TX_FIFO_COUNT

+
@@ -945,11 +1027,13 @@ Macros
-

Definition at line 93 of file cdc_XR21B1411.h.

+

Definition at line 93 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_RX_FIFO_RESET

+
@@ -959,11 +1043,13 @@ Macros
-

Definition at line 94 of file cdc_XR21B1411.h.

+

Definition at line 94 of file cdc_XR21B1411.h.

- + +

◆ XR_REG_RX_FIFO_COUNT

+
@@ -973,11 +1059,13 @@ Macros
-

Definition at line 95 of file cdc_XR21B1411.h.

+

Definition at line 95 of file cdc_XR21B1411.h.

- + +

◆ XR_WRITE_REQUEST_TYPE

+
@@ -987,11 +1075,13 @@ Macros
-

Definition at line 97 of file cdc_XR21B1411.h.

+

Definition at line 97 of file cdc_XR21B1411.h.

- + +

◆ XR_READ_REQUEST_TYPE

+
@@ -1001,11 +1091,13 @@ Macros
-

Definition at line 99 of file cdc_XR21B1411.h.

+

Definition at line 99 of file cdc_XR21B1411.h.

- + +

◆ XR_MAX_ENDPOINTS

+
@@ -1015,7 +1107,7 @@ Macros
-

Definition at line 101 of file cdc_XR21B1411.h.

+

Definition at line 101 of file cdc_XR21B1411.h.

@@ -1024,7 +1116,7 @@ Macros diff --git a/cdc___x_r21_b1411_8h__dep__incl.md5 b/cdc___x_r21_b1411_8h__dep__incl.md5 index d1f48836..ccb81d4b 100644 --- a/cdc___x_r21_b1411_8h__dep__incl.md5 +++ b/cdc___x_r21_b1411_8h__dep__incl.md5 @@ -1 +1 @@ -250b78e5b50dfc5c4569c99531678ec3 \ No newline at end of file +e53d5ac5df7beb8def48e46bf452afe4 \ 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 f110787f80370220f905fffe3bf65e14100025ba..0b1a46b79249a3038e3f482b422dc3697c61192b 100644 GIT binary patch literal 4947 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 literal 4928 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 iATmRhLS|jiEm2?ys>2HP{l7nBIOS$cK7Ypm diff --git a/cdc___x_r21_b1411_8h__incl.md5 b/cdc___x_r21_b1411_8h__incl.md5 index 8ab25f05..833d38dd 100644 --- a/cdc___x_r21_b1411_8h__incl.md5 +++ b/cdc___x_r21_b1411_8h__incl.md5 @@ -1 +1 @@ -ab5d3dff2680fe378e5afcfe3049b74b \ No newline at end of file +81ae8245618e642787cd8f06ec2914c8 \ 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 0d676005ccc02fddba01833e043b2ac2a36d9328..d29f5958a8c175db1a14de84b5269b6a1282f325 100644 GIT binary patch literal 5590 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 literal 5528 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 - + + USB Host Shield 2.0: cdc_XR21B1411.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 (0x0078U) // ERROR STATUS ERROR BITMASK
59 #define XR_REG_ERROR_STATUS_BREAK (0x0008U) // BREAK ERROR HAS BEEN DETECTED
60 #define XR_REG_ERROR_STATUS_FRAME (0x0010U) // FRAMING ERROR HAS BEEN DETECTED
61 #define XR_REG_ERROR_STATUS_PARITY (0x0020U) // PARITY ERROR HAS BEEN DETECTED
62 #define XR_REG_ERROR_STATUS_OVERRUN (0x0040U) // RX OVERRUN ERROR HAS BEEN DETECTED
63 #define XR_REG_ERROR_STATUS_BREAK_STATUS (0x0080U) // BREAK CONDITION IS CURRENTLY 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:169
-
#define BGRAB0(__usi__)
Definition: macros.h:49
+
USB * pUsb
Definition: cdcacm.h:165
+
#define BGRAB0(__usi__)
Definition: macros.h:56
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
#define XR_WRITE_REQUEST_TYPE
Definition: cdc_XR21B1411.h:97
virtual void half_duplex(bool s)
-
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
+
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:133
XR21B1411(USB *pusb, CDCAsyncOper *pasync)
#define XR_REG_GPIO_MODE_FC_DTRDSR
Definition: cdc_XR21B1411.h:41
-
uint8_t GetLineCoding(LINE_CODING *dataptr)
Definition: cdcacm.cpp:306
+
uint8_t GetLineCoding(LINE_CODING *dataptr)
Definition: cdcacm.cpp:328
#define XR_REG_FLOW_CTL_HW
Definition: cdc_XR21B1411.h:32
bool enhanced
Definition: cdcacm.h:149
bool wide
Definition: cdcacm.h:152
@@ -113,9 +93,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
bool autoflow_DSR
Definition: cdcacm.h:154
-
uint8_t bAddress
Definition: cdcacm.h:171
+
uint8_t bAddress
Definition: cdcacm.h:167
-
uint8_t SetLineCoding(const LINE_CODING *dataptr)
Definition: cdcacm.cpp:302
+
uint8_t SetLineCoding(const LINE_CODING *dataptr)
Definition: cdcacm.cpp:320
#define XR_REG_FLOW_CTL_HALF_DPLX
Definition: cdc_XR21B1411.h:29
@@ -123,12 +103,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
virtual void autoflowDSR(bool s)
bool half_duplex
Definition: cdcacm.h:156
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
uint8_t read_register(uint16_t reg, uint16_t *val)
Definition: cdcacm.h:163
#define XR_REG_ACM_GPIO_MODE
Definition: cdc_XR21B1411.h:37
-
tty_features _enhanced_status
Definition: cdcacm.h:179
-
#define BGRAB1(__usi__)
Definition: macros.h:50
+
tty_features _enhanced_status
Definition: cdcacm.h:175
+
#define BGRAB1(__usi__)
Definition: macros.h:57
#define XR_REG_GPIO_MODE_GPIO
Definition: cdc_XR21B1411.h:39
#define XR_REG_FLOW_CTL_MODE_MASK
Definition: cdc_XR21B1411.h:30
@@ -136,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/cdcacm_8cpp.html b/cdcacm_8cpp.html index 51e66a6b..040ed2f5 100644 --- a/cdcacm_8cpp.html +++ b/cdcacm_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcacm.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
diff --git a/cdcacm_8cpp__incl.md5 b/cdcacm_8cpp__incl.md5 index 9fd4609d..de6f288e 100644 --- a/cdcacm_8cpp__incl.md5 +++ b/cdcacm_8cpp__incl.md5 @@ -1 +1 @@ -8836c5951dac28c739547b666b24d9f8 \ No newline at end of file +dc13b74ea4b2ee21c679139ece235c5e \ No newline at end of file diff --git a/cdcacm_8cpp__incl.png b/cdcacm_8cpp__incl.png index d83a5703d27247b11ebc163df3f355c1f1505ce1..0e5c7949f2eff82e46441f480fafc004dc626005 100644 GIT binary patch literal 4588 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

Yb>2> zlMXh5f<4~qIbUbey^MYP$$z6)CV1Dv+Q(ILcT>Dn-_0A1EQh&$Wt8R=Y$_+A;L(U8 zaERfF?wDixz?oEbX)#YJki^#3);}huNDHY>P6+R`{=*)uxr>W6G47SVzCNjJ4d~J> zQJCybmsauFCe+XND0xs};+r9;#;BaocvF5-=j5TE)ZArZDd>!8W$X@sf{NmH-ZwfO zbql7@uZh6YIjj4LcDMsUW6)G);3n_H3**!6X;$s#+}zyFk7fiidiT|ZCq@uCl<3bZ z_9p8x6RxyW-!knd)wp+b>+3B8hWPMYUJqH?wC!EiQsGk_>OX;*FfemS!!dy?v2}00 zw%B?Dj7^k@j=DAP1y7l=z5IVA`BaVi&I+q% TcLEn-d;`#bVxrxo=@j!nlx*km literal 4578 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 diff --git a/cdcacm_8cpp_source.html b/cdcacm_8cpp_source.html index 14cf81fd..c228b37d 100644 --- a/cdcacm_8cpp_source.html +++ b/cdcacm_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcacm.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

- + - - + + + +
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, uint8_t alt, uint8_t proto, 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 & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
241  index = epInterruptInIndex;
242  else
243  if((pep->bmAttributes & 0x02) == 2)
244  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
245  else
246  return;
247 
248  // Fill in the endpoint info structure
249  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
250  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
251  epInfo[index].bmSndToggle = 0;
252  epInfo[index].bmRcvToggle = 0;
253 
254  bNumEP++;
255 
257 }
258 
259 uint8_t ACM::Release() {
260  ready = false;
262 
263  bControlIface = 0;
264  bDataIface = 0;
265  bNumEP = 1;
266 
267  bAddress = 0;
268  qNextPollTime = 0;
269  bPollEnable = false;
270  return 0;
271 }
272 
273 uint8_t ACM::Poll() {
274  uint8_t rcode = 0;
275 
276  if(!bPollEnable)
277  return 0;
278 
279  return rcode;
280 }
281 
282 uint8_t ACM::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
283  return pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
284 }
285 
286 uint8_t ACM::SndData(uint16_t nbytes, uint8_t *dataptr) {
287  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
288 }
289 
290 uint8_t ACM::SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
291  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
292 }
293 
294 uint8_t ACM::GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
295  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
296 }
297 
298 uint8_t ACM::ClearCommFeature(uint16_t fid) {
299  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_CLEAR_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, 0, 0, NULL, NULL));
300 }
301 
302 uint8_t ACM::SetLineCoding(const LINE_CODING *dataptr) {
303  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
304 }
305 
306 uint8_t ACM::GetLineCoding(LINE_CODING *dataptr) {
307  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
308 }
309 
310 uint8_t ACM::SetControlLineState(uint8_t state) {
311  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_CONTROL_LINE_STATE, state, 0, bControlIface, 0, 0, NULL, NULL));
312 }
313 
314 uint8_t ACM::SendBreak(uint16_t duration) {
315  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SEND_BREAK, (duration & 0xff), (duration >> 8), bControlIface, 0, 0, NULL, NULL));
316 }
317 
319  Notify(PSTR("Endpoint descriptor:"), 0x80);
320  Notify(PSTR("\r\nLength:\t\t"), 0x80);
321  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
322  Notify(PSTR("\r\nType:\t\t"), 0x80);
323  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
324  Notify(PSTR("\r\nAddress:\t"), 0x80);
325  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
326  Notify(PSTR("\r\nAttributes:\t"), 0x80);
327  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
328  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
329  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
330  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
331  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
332  Notify(PSTR("\r\n"), 0x80);
333 }
#define USB_CLASS_COM_AND_CDC_CTRL
Definition: UsbCore.h:58
-
#define USB_CLASS_CDC_DATA
Definition: UsbCore.h:65
-
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:771
-
uint8_t bmRcvToggle
Definition: address.h:41
- +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:69
+
#define USB_CLASS_CDC_DATA
Definition: UsbCore.h:76
+
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:784
+
uint8_t bmRcvToggle
Definition: address.h:48
+
#define CDC_SUBCLASS_ACM
Definition: cdcacm.h:27
-
virtual tty_features enhanced_features(void)
Definition: cdcacm.h:222
+
virtual tty_features enhanced_features(void)
Definition: cdcacm.h:221
ACM(USB *pusb, CDCAsyncOper *pasync)
Definition: cdcacm.cpp:23
#define CDC_PROTOCOL_ITU_T_V_250
Definition: cdcacm.h:40
-
EpInfo * epinfo
Definition: address.h:76
-
#define CP_MASK_COMPARE_PROTOCOL
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
+
EpInfo * epinfo
Definition: address.h:83
+
#define CP_MASK_COMPARE_PROTOCOL
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
virtual uint8_t OnInit(ACM *pacm)
Definition: cdcacm.h:131
-
static const uint8_t epInterruptInIndex
Definition: cdcacm.h:167
-
uint8_t bmNakPower
Definition: address.h:42
-
static const uint8_t epDataOutIndex
Definition: cdcacm.h:166
+
static const uint8_t epInterruptInIndex
Definition: cdcacm.h:182
+
uint8_t bmNakPower
Definition: address.h:49
+
static const uint8_t epDataOutIndex
Definition: cdcacm.h:181
#define CDC_CLEAR_COMM_FEATURE
Definition: cdcacm.h:55
-
uint32_t qNextPollTime
Definition: cdcacm.h:176
- -
uint8_t bControlIface
Definition: cdcacm.h:173
+
uint32_t qNextPollTime
Definition: cdcacm.h:172
+ +
uint8_t bControlIface
Definition: cdcacm.h:169
#define CDC_SET_COMM_FEATURE
Definition: cdcacm.h:53
- - + +
#define CDC_SET_LINE_CODING
Definition: cdcacm.h:62
- -
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:105
-
volatile bool ready
Definition: cdcacm.h:178
-
#define NotifyFail(...)
Definition: message.h:55
-
uint8_t bDataIface
Definition: cdcacm.h:174
-
USB * pUsb
Definition: cdcacm.h:169
-
virtual void autoflowRTS(bool s)
Definition: cdcacm.h:233
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
-
uint8_t bNumEP
Definition: cdcacm.h:175
+ +
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:112
+
volatile bool ready
Definition: cdcacm.h:174
+
#define NotifyFail(...)
Definition: message.h:62
+
uint8_t bDataIface
Definition: cdcacm.h:170
+
USB * pUsb
Definition: cdcacm.h:165
+
virtual void autoflowRTS(bool s)
Definition: cdcacm.h:232
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
+
uint8_t bNumEP
Definition: cdcacm.h:171
#define bmREQ_CDCOUT
Definition: cdcacm.h:22
-
EpInfo epInfo[ACM_MAX_ENDPOINTS]
Definition: cdcacm.h:181
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
-
#define CP_MASK_COMPARE_CLASS
+
EpInfo epInfo[ACM_MAX_ENDPOINTS]
Definition: cdcacm.h:183
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:93
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
+
#define CP_MASK_COMPARE_CLASS
#define CDC_SEND_BREAK
Definition: cdcacm.h:65
#define CDC_GET_COMM_FEATURE
Definition: cdcacm.h:54
virtual void FreeAddress(uint8_t addr)=0
-
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
+
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:133
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: cdcacm.cpp:318
-
#define Notify(...)
Definition: message.h:44
-
CDCAsyncOper * pAsync
Definition: cdcacm.h:170
- - -
#define USBTRACE2(s, r)
Definition: macros.h:77
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
+
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: cdcacm.cpp:352
+
#define Notify(...)
Definition: message.h:51
+
CDCAsyncOper * pAsync
Definition: cdcacm.h:166
+ + +
#define USBTRACE2(s, r)
Definition: macros.h:84
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
#define ACM_MAX_ENDPOINTS
Definition: cdcacm.h:161
-
#define NotifyFailGetConfDescr(...)
Definition: message.h:52
-
virtual void wide(bool s)
Definition: cdcacm.h:245
-
uint8_t GetLineCoding(LINE_CODING *dataptr)
Definition: cdcacm.cpp:306
-
uint8_t epAddr
Definition: address.h:33
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
-
virtual void autoflowXON(bool s)
Definition: cdcacm.h:239
+
#define NotifyFailGetConfDescr(...)
Definition: message.h:59
+
virtual void wide(bool s)
Definition: cdcacm.h:244
+
uint8_t GetLineCoding(LINE_CODING *dataptr)
Definition: cdcacm.cpp:328
+
uint8_t epAddr
Definition: address.h:40
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
+
virtual void autoflowXON(bool s)
Definition: cdcacm.h:238
#define bmREQ_CDCIN
Definition: cdcacm.h:23
-
uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
Definition: cdcacm.cpp:286
-
uint8_t Poll()
Definition: cdcacm.cpp:273
-
Definition: address.h:32
+
uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
Definition: cdcacm.cpp:288
+
uint8_t Poll()
Definition: cdcacm.cpp:272
+
Definition: address.h:39
#define CDC_GET_LINE_CODING
Definition: cdcacm.h:63
-
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:293
-
uint16_t wMaxPacketSize
Definition: usb_ch9.h:146
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
+
#define hrNAK
Definition: max3421e.h:218
+
uint16_t wMaxPacketSize
Definition: usb_ch9.h:153
+
#define bmUSB_TRANSFER_TYPE
Definition: usb_ch9.h:94
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: cdcacm.cpp:46
-
#define CP_MASK_COMPARE_SUBCLASS
+
#define CP_MASK_COMPARE_SUBCLASS
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bEndpointAddress
Definition: usb_ch9.h:144
-
static const uint8_t epDataInIndex
Definition: cdcacm.h:165
-
virtual void autoflowDSR(bool s)
Definition: cdcacm.h:236
-
uint8_t bAddress
Definition: cdcacm.h:171
-
uint8_t bmSndToggle
Definition: address.h:40
+
uint8_t bEndpointAddress
Definition: usb_ch9.h:151
+
static const uint8_t epDataInIndex
Definition: cdcacm.h:180
+
virtual void autoflowDSR(bool s)
Definition: cdcacm.h:235
+
uint8_t bAddress
Definition: cdcacm.h:167
+
uint8_t bmSndToggle
Definition: address.h:47
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define PSTR(str)
- -
uint8_t SetLineCoding(const LINE_CODING *dataptr)
Definition: cdcacm.cpp:302
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define PSTR(str)
+ +
uint8_t SetLineCoding(const LINE_CODING *dataptr)
Definition: cdcacm.cpp:320
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: cdcacm.cpp:231
-
#define USB_NAK_NOWAIT
Definition: address.h:29
-
uint8_t SendBreak(uint16_t duration)
Definition: cdcacm.cpp:314
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
+
#define USB_NAK_NOWAIT
Definition: address.h:36
+
uint8_t SendBreak(uint16_t duration)
Definition: cdcacm.cpp:344
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
-
uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
Definition: cdcacm.cpp:294
-
uint8_t Release()
Definition: cdcacm.cpp:259
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
-
uint8_t bConfNum
Definition: cdcacm.h:172
-
uint8_t bNumConfigurations
Definition: usb_ch9.h:112
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
+
uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
Definition: cdcacm.cpp:304
+
uint8_t Release()
Definition: cdcacm.cpp:258
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
uint8_t bConfNum
Definition: cdcacm.h:168
+
uint8_t bNumConfigurations
Definition: usb_ch9.h:119
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
#define CDC_SET_CONTROL_LINE_STATE
Definition: cdcacm.h:64
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
Definition: UsbCore.h:197
-
volatile bool bPollEnable
Definition: cdcacm.h:177
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
-
tty_features _enhanced_status
Definition: cdcacm.h:179
-
uint8_t SetControlLineState(uint8_t state)
Definition: cdcacm.cpp:310
-
uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
Definition: cdcacm.cpp:290
-
uint8_t ClearCommFeature(uint16_t fid)
Definition: cdcacm.cpp:298
-
virtual void half_duplex(bool s)
Definition: cdcacm.h:242
-
#define USBTRACE(s)
Definition: macros.h:75
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
-
uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
Definition: cdcacm.cpp:282
- +
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
Definition: UsbCore.h:208
+
#define USB_TRANSFER_TYPE_BULK
Definition: usb_ch9.h:92
+
volatile bool bPollEnable
Definition: cdcacm.h:173
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
+
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
+
virtual void half_duplex(bool s)
Definition: cdcacm.h:241
+
#define USBTRACE(s)
Definition: macros.h:82
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
+
uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
Definition: cdcacm.cpp:280
+
diff --git a/cdcacm_8h.html b/cdcacm_8h.html index be60d2aa..14e2b548 100644 --- a/cdcacm_8h.html +++ b/cdcacm_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcacm.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ bmREQ_CDCOUT

+
@@ -264,11 +246,13 @@ Typedefs
-

Definition at line 22 of file cdcacm.h.

+

Definition at line 22 of file cdcacm.h.

- + +

◆ bmREQ_CDCIN

+
@@ -278,11 +262,13 @@ Typedefs
-

Definition at line 23 of file cdcacm.h.

+

Definition at line 23 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_DLCM

+
@@ -292,11 +278,13 @@ Typedefs
-

Definition at line 26 of file cdcacm.h.

+

Definition at line 26 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_ACM

+
@@ -306,11 +294,13 @@ Typedefs
-

Definition at line 27 of file cdcacm.h.

+

Definition at line 27 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_TCM

+
@@ -320,11 +310,13 @@ Typedefs
-

Definition at line 28 of file cdcacm.h.

+

Definition at line 28 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_MCCM

+
@@ -334,11 +326,13 @@ Typedefs
-

Definition at line 29 of file cdcacm.h.

+

Definition at line 29 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_CAPI

+
@@ -348,11 +342,13 @@ Typedefs
-

Definition at line 30 of file cdcacm.h.

+

Definition at line 30 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_ETHERNET

+
@@ -362,11 +358,13 @@ Typedefs
-

Definition at line 31 of file cdcacm.h.

+

Definition at line 31 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_ATM

+
@@ -376,11 +374,13 @@ Typedefs
-

Definition at line 32 of file cdcacm.h.

+

Definition at line 32 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_WIRELESS_HANDSET

+
@@ -390,11 +390,13 @@ Typedefs
-

Definition at line 33 of file cdcacm.h.

+

Definition at line 33 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_DEVICE_MANAGEMENT

+
@@ -404,11 +406,13 @@ Typedefs
-

Definition at line 34 of file cdcacm.h.

+

Definition at line 34 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_MOBILE_DIRECT_LINE

+
@@ -418,11 +422,13 @@ Typedefs
-

Definition at line 35 of file cdcacm.h.

+

Definition at line 35 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_OBEX

+
@@ -432,11 +438,13 @@ Typedefs
-

Definition at line 36 of file cdcacm.h.

+

Definition at line 36 of file cdcacm.h.

- + +

◆ CDC_SUBCLASS_ETHERNET_EMU

+
@@ -446,11 +454,13 @@ Typedefs
-

Definition at line 37 of file cdcacm.h.

+

Definition at line 37 of file cdcacm.h.

- + +

◆ CDC_PROTOCOL_ITU_T_V_250

+
@@ -460,11 +470,13 @@ Typedefs
-

Definition at line 40 of file cdcacm.h.

+

Definition at line 40 of file cdcacm.h.

- + +

◆ CDC_PROTOCOL_PCCA_101

+
@@ -474,11 +486,13 @@ Typedefs
-

Definition at line 41 of file cdcacm.h.

+

Definition at line 41 of file cdcacm.h.

- + +

◆ CDC_PROTOCOL_PCCA_101_O

+
@@ -488,11 +502,13 @@ Typedefs
-

Definition at line 42 of file cdcacm.h.

+

Definition at line 42 of file cdcacm.h.

- + +

◆ CDC_PROTOCOL_GSM_7_07

+
@@ -502,11 +518,13 @@ Typedefs
-

Definition at line 43 of file cdcacm.h.

+

Definition at line 43 of file cdcacm.h.

- + +

◆ CDC_PROTOCOL_3GPP_27_07

+
@@ -516,11 +534,13 @@ Typedefs
-

Definition at line 44 of file cdcacm.h.

+

Definition at line 44 of file cdcacm.h.

- + +

◆ CDC_PROTOCOL_C_S0017_0

+
@@ -530,11 +550,13 @@ Typedefs
-

Definition at line 45 of file cdcacm.h.

+

Definition at line 45 of file cdcacm.h.

- + +

◆ CDC_PROTOCOL_USB_EEM

+
@@ -544,11 +566,13 @@ Typedefs
-

Definition at line 46 of file cdcacm.h.

+

Definition at line 46 of file cdcacm.h.

- + +

◆ CDC_SEND_ENCAPSULATED_COMMAND

+
@@ -558,11 +582,13 @@ Typedefs
-

Definition at line 49 of file cdcacm.h.

+

Definition at line 49 of file cdcacm.h.

- + +

◆ CDC_GET_ENCAPSULATED_RESPONSE

+
@@ -572,11 +598,13 @@ Typedefs
-

Definition at line 50 of file cdcacm.h.

+

Definition at line 50 of file cdcacm.h.

- + +

◆ CDC_SET_COMM_FEATURE

+
@@ -586,11 +614,13 @@ Typedefs
-

Definition at line 53 of file cdcacm.h.

+

Definition at line 53 of file cdcacm.h.

- + +

◆ CDC_GET_COMM_FEATURE

+
@@ -600,11 +630,13 @@ Typedefs
-

Definition at line 54 of file cdcacm.h.

+

Definition at line 54 of file cdcacm.h.

- + +

◆ CDC_CLEAR_COMM_FEATURE

+
@@ -614,11 +646,13 @@ Typedefs
-

Definition at line 55 of file cdcacm.h.

+

Definition at line 55 of file cdcacm.h.

- + +

◆ CDC_SET_AUX_LINE_STATE

+
@@ -628,11 +662,13 @@ Typedefs
-

Definition at line 56 of file cdcacm.h.

+

Definition at line 56 of file cdcacm.h.

- + +

◆ CDC_SET_HOOK_STATE

+
@@ -642,11 +678,13 @@ Typedefs
-

Definition at line 57 of file cdcacm.h.

+

Definition at line 57 of file cdcacm.h.

- + +

◆ CDC_PULSE_SETUP

+
@@ -656,11 +694,13 @@ Typedefs
-

Definition at line 58 of file cdcacm.h.

+

Definition at line 58 of file cdcacm.h.

- + +

◆ CDC_SEND_PULSE

+
@@ -670,11 +710,13 @@ Typedefs
-

Definition at line 59 of file cdcacm.h.

+

Definition at line 59 of file cdcacm.h.

- + +

◆ CDC_SET_PULSE_TIME

+
@@ -684,11 +726,13 @@ Typedefs
-

Definition at line 60 of file cdcacm.h.

+

Definition at line 60 of file cdcacm.h.

- + +

◆ CDC_RING_AUX_JACK

+
@@ -698,11 +742,13 @@ Typedefs
-

Definition at line 61 of file cdcacm.h.

+

Definition at line 61 of file cdcacm.h.

- + +

◆ CDC_SET_LINE_CODING

+
@@ -712,11 +758,13 @@ Typedefs
-

Definition at line 62 of file cdcacm.h.

+

Definition at line 62 of file cdcacm.h.

- + +

◆ CDC_GET_LINE_CODING

+
@@ -726,11 +774,13 @@ Typedefs
-

Definition at line 63 of file cdcacm.h.

+

Definition at line 63 of file cdcacm.h.

- + +

◆ CDC_SET_CONTROL_LINE_STATE

+
@@ -740,11 +790,13 @@ Typedefs
-

Definition at line 64 of file cdcacm.h.

+

Definition at line 64 of file cdcacm.h.

- + +

◆ CDC_SEND_BREAK

+
@@ -754,11 +806,13 @@ Typedefs
-

Definition at line 65 of file cdcacm.h.

+

Definition at line 65 of file cdcacm.h.

- + +

◆ CDC_SET_RINGER_PARMS

+
@@ -768,11 +822,13 @@ Typedefs
-

Definition at line 66 of file cdcacm.h.

+

Definition at line 66 of file cdcacm.h.

- + +

◆ CDC_GET_RINGER_PARMS

+
@@ -782,11 +838,13 @@ Typedefs
-

Definition at line 67 of file cdcacm.h.

+

Definition at line 67 of file cdcacm.h.

- + +

◆ CDC_SET_OPERATION_PARMS

+
@@ -796,11 +854,13 @@ Typedefs
-

Definition at line 68 of file cdcacm.h.

+

Definition at line 68 of file cdcacm.h.

- + +

◆ CDC_GET_OPERATION_PARMS

+
@@ -810,11 +870,13 @@ Typedefs
-

Definition at line 69 of file cdcacm.h.

+

Definition at line 69 of file cdcacm.h.

- + +

◆ CDC_SET_LINE_PARMS

+
@@ -824,11 +886,13 @@ Typedefs
-

Definition at line 70 of file cdcacm.h.

+

Definition at line 70 of file cdcacm.h.

- + +

◆ CDC_GET_LINE_PARMS

+
@@ -838,11 +902,13 @@ Typedefs
-

Definition at line 71 of file cdcacm.h.

+

Definition at line 71 of file cdcacm.h.

- + +

◆ CDC_DIAL_DIGITS

+
@@ -852,11 +918,13 @@ Typedefs
-

Definition at line 72 of file cdcacm.h.

+

Definition at line 72 of file cdcacm.h.

- + +

◆ NETWORK_CONNECTION

+
@@ -866,11 +934,13 @@ Typedefs
-

Definition at line 75 of file cdcacm.h.

+

Definition at line 75 of file cdcacm.h.

- + +

◆ RESPONSE_AVAILABLE

+
@@ -880,11 +950,13 @@ Typedefs
-

Definition at line 76 of file cdcacm.h.

+

Definition at line 76 of file cdcacm.h.

- + +

◆ AUX_JACK_HOOK_STATE

+
@@ -894,11 +966,13 @@ Typedefs
-

Definition at line 77 of file cdcacm.h.

+

Definition at line 77 of file cdcacm.h.

- + +

◆ RING_DETECT

+
@@ -908,11 +982,13 @@ Typedefs
-

Definition at line 78 of file cdcacm.h.

+

Definition at line 78 of file cdcacm.h.

- + +

◆ SERIAL_STATE

+
@@ -922,11 +998,13 @@ Typedefs
-

Definition at line 79 of file cdcacm.h.

+

Definition at line 79 of file cdcacm.h.

- + +

◆ CALL_STATE_CHANGE

+
@@ -936,11 +1014,13 @@ Typedefs
-

Definition at line 80 of file cdcacm.h.

+

Definition at line 80 of file cdcacm.h.

- + +

◆ LINE_STATE_CHANGE

+
@@ -950,11 +1030,13 @@ Typedefs
-

Definition at line 81 of file cdcacm.h.

+

Definition at line 81 of file cdcacm.h.

- + +

◆ CONNECTION_SPEED_CHANGE

+
@@ -964,11 +1046,13 @@ Typedefs
-

Definition at line 82 of file cdcacm.h.

+

Definition at line 82 of file cdcacm.h.

- + +

◆ ACM_MAX_ENDPOINTS

+
@@ -978,12 +1062,14 @@ Typedefs
-

Definition at line 161 of file cdcacm.h.

+

Definition at line 161 of file cdcacm.h.

Typedef Documentation

- + +

◆ DLM_FUNC_DESCR

+
@@ -995,7 +1081,9 @@ Typedefs - + +

◆ TEL_OPER_MODES_FUNC_DESCR

+
@@ -1007,7 +1095,9 @@ Typedefs - + +

◆ TEL_CALL_STATE_REP_CPBL_FUNC_DESCR

+
@@ -1025,7 +1115,7 @@ Typedefs diff --git a/cdcacm_8h__dep__incl.md5 b/cdcacm_8h__dep__incl.md5 index 9355f061..b8fe34c4 100644 --- a/cdcacm_8h__dep__incl.md5 +++ b/cdcacm_8h__dep__incl.md5 @@ -1 +1 @@ -d9684fa8dbbab21f6c77cde6aba312ed \ No newline at end of file +a290fd140b9c53cb509a0c1f221809bd \ No newline at end of file diff --git a/cdcacm_8h__dep__incl.png b/cdcacm_8h__dep__incl.png index 03fa1f4ed9682cc170152b33533954a8dfe6e2e4..5eca2cca9dc5741965bc7a7928c2f62cfc684fdd 100644 GIT binary patch literal 13488 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 literal 2628 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 - + + USB Host Shield 2.0: cdcacm.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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) {
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:
165  static const uint8_t epDataInIndex; // DataIn endpoint index
166  static const uint8_t epDataOutIndex; // DataOUT endpoint index
167  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
168 
171  uint8_t bAddress;
172  uint8_t bConfNum; // configuration number
173  uint8_t bControlIface; // Control interface value
174  uint8_t bDataIface; // Data interface value
175  uint8_t bNumEP; // total number of EP in the configuration
176  uint32_t qNextPollTime; // next poll time
177  volatile bool bPollEnable; // poll enable flag
178  volatile bool ready; //device ready indicator
179  tty_features _enhanced_status; // current status
180 
182 
183  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
184 
185 public:
186  ACM(USB *pusb, CDCAsyncOper *pasync);
187 
188  uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr);
189  uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr);
190  uint8_t ClearCommFeature(uint16_t fid);
191  uint8_t SetLineCoding(const LINE_CODING *dataptr);
192  uint8_t GetLineCoding(LINE_CODING *dataptr);
193  uint8_t SetControlLineState(uint8_t state);
194  uint8_t SendBreak(uint16_t duration);
195  uint8_t GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr);
196 
197  // Methods for receiving and sending data
198  uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr);
199  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
200 
201  // USBDeviceConfig implementation
202  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
203  uint8_t Release();
204  uint8_t Poll();
205 
206  bool available(void) {
207  return false;
208  };
209 
210  virtual uint8_t GetAddress() {
211  return bAddress;
212  };
213 
214  virtual bool isReady() {
215  return ready;
216  };
217 
219  return _enhanced_status;
220  };
221 
223  tty_features rv;
224  rv.enhanced = false;
225  rv.autoflow_RTS = false;
226  rv.autoflow_DSR = false;
227  rv.autoflow_XON = false;
228  rv.half_duplex = false;
229  rv.wide = false;
230  return rv;
231  };
232 
233  virtual void autoflowRTS(bool s) {
234  };
235 
236  virtual void autoflowDSR(bool s) {
237  };
238 
239  virtual void autoflowXON(bool s) {
240  };
241 
242  virtual void half_duplex(bool s) {
243  };
244 
245  virtual void wide(bool s) {
246  };
247 
248  // UsbConfigXtracter implementation
249  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
250 };
251 
252 #endif // __CDCACM_H__
uint16_t wIndex
Definition: cdcacm.h:121
-
virtual tty_features enhanced_features(void)
Definition: cdcacm.h:222
-
bool available(void)
Definition: cdcacm.h:206
+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
+
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:167
-
virtual uint8_t GetAddress()
Definition: cdcacm.h:210
-
static const uint8_t epDataOutIndex
Definition: cdcacm.h:166
-
uint32_t qNextPollTime
Definition: cdcacm.h:176
+
static const uint8_t epInterruptInIndex
Definition: cdcacm.h:182
+
virtual uint8_t GetAddress()
Definition: cdcacm.h:209
+
static const uint8_t epDataOutIndex
Definition: cdcacm.h:181
+
uint32_t qNextPollTime
Definition: cdcacm.h:172
uint8_t bParityType
Definition: cdcacm.h:113
uint8_t bCharFormat
Definition: cdcacm.h:112
uint8_t bDataBits
Definition: cdcacm.h:114
uint8_t bNotification
Definition: cdcacm.h:119
-
uint8_t bControlIface
Definition: cdcacm.h:173
+
uint8_t bControlIface
Definition: cdcacm.h:169
uint16_t wValue
Definition: cdcacm.h:120
- -
volatile bool ready
Definition: cdcacm.h:178
-
uint8_t bDataIface
Definition: cdcacm.h:174
-
USB * pUsb
Definition: cdcacm.h:169
+ +
volatile bool ready
Definition: cdcacm.h:174
+
uint8_t bDataIface
Definition: cdcacm.h:170
+
USB * pUsb
Definition: cdcacm.h:165
uint8_t bDataInterface
Definition: cdcacm.h:91
uint8_t bDescriptorType
Definition: cdcacm.h:88
-
virtual void autoflowRTS(bool s)
Definition: cdcacm.h:233
-
uint8_t bNumEP
Definition: cdcacm.h:175
+
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
uint8_t bFunctionLength
Definition: cdcacm.h:95
-
virtual tty_features enhanced_status(void)
Definition: cdcacm.h:218
+
virtual tty_features enhanced_status(void)
Definition: cdcacm.h:217
uint8_t bDescriptorSubtype
Definition: cdcacm.h:89
uint8_t bNumRingerPatterns
Definition: cdcacm.h:107
uint8_t bDescriptorSubtype
Definition: cdcacm.h:97
uint16_t bmState
Definition: cdcacm.h:123
-
CDCAsyncOper * pAsync
Definition: cdcacm.h:170
+
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:245
+
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
bool wide
Definition: cdcacm.h:152
-
virtual void autoflowXON(bool s)
Definition: cdcacm.h:239
+
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
-
Definition: address.h:32
+
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
-
static const uint8_t epDataInIndex
Definition: cdcacm.h:165
-
virtual void autoflowDSR(bool s)
Definition: cdcacm.h:236
-
uint8_t bAddress
Definition: cdcacm.h:171
+
static const uint8_t epDataInIndex
Definition: cdcacm.h:180
+
virtual void autoflowDSR(bool s)
Definition: cdcacm.h:235
+
uint8_t bAddress
Definition: cdcacm.h:167
-
virtual bool isReady()
Definition: cdcacm.h:214
- +
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 bConfNum
Definition: cdcacm.h:172
+
uint8_t Release()
Definition: cdcacm.cpp:258
+
uint8_t bConfNum
Definition: cdcacm.h:168
struct ACM_FUNC_DESCR TEL_OPER_MODES_FUNC_DESCR
-
Definition: UsbCore.h:197
-
volatile bool bPollEnable
Definition: cdcacm.h:177
+
Definition: UsbCore.h:208
+
volatile bool bPollEnable
Definition: cdcacm.h:173
Definition: cdcacm.h:163
uint8_t bDescriptorType
Definition: cdcacm.h:104
-
tty_features _enhanced_status
Definition: cdcacm.h:179
+
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:242
+
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 71bea6e7..3ab7765a 100644 --- a/cdcftdi_8cpp.html +++ b/cdcftdi_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcftdi.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
diff --git a/cdcftdi_8cpp__incl.md5 b/cdcftdi_8cpp__incl.md5 index f6dd1fa8..c172e2fa 100644 --- a/cdcftdi_8cpp__incl.md5 +++ b/cdcftdi_8cpp__incl.md5 @@ -1 +1 @@ -e865f32d985af2b4d5e2da82e7c52bae \ No newline at end of file +5aa4a4ebba11b439405ccd1452ff839b \ No newline at end of file diff --git a/cdcftdi_8cpp__incl.png b/cdcftdi_8cpp__incl.png index be6e12a6b7414e8714d52b2001520653a44e0278..c1892317970856aab51477b9501795af1abc9f72 100644 GIT binary patch literal 4477 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 em=0^^Zh+-`_0`&t<}%{v48TAarc - + + USB Host Shield 2.0: cdcftdi.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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)
58 
59  // Get pointer to pseudo device with address 0 assigned
60  p = addrPool.GetUsbDevicePtr(0);
61 
62  if(!p)
64 
65  if(!p->epinfo) {
66  USBTRACE("epinfo\r\n");
68  }
69 
70  // Save old pointer to EP_RECORD of address 0
71  oldep_ptr = p->epinfo;
72 
73  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
74  p->epinfo = epInfo;
75 
76  p->lowspeed = lowspeed;
77 
78  // Get device descriptor
79  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), buf);
80 
81  // Restore p->epinfo
82  p->epinfo = oldep_ptr;
83 
84  if(rcode)
85  goto FailGetDevDescr;
86  if(udd->idVendor != FTDI_VID || udd->idProduct != wIdProduct)
87  {
88  USBTRACE("FTDI Init: Product not supported\r\n");
89  USBTRACE2("Expected VID:", FTDI_VID);
90  USBTRACE2("Found VID:", udd->idVendor);
91 
92  USBTRACE2("Expected PID:", wIdProduct);
93  USBTRACE2("Found PID:", udd->idProduct);
95  }
96 
97  // Save type of FTDI chip
98  wFTDIType = udd->bcdDevice;
99 
100  // Allocate new address according to device class
101  bAddress = addrPool.AllocAddress(parent, false, port);
102 
103  if(!bAddress)
105 
106  // Extract Max Packet Size from the device descriptor
107  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
108 
109  // Assign new address to the device
110  rcode = pUsb->setAddr(0, 0, bAddress);
111 
112  if(rcode) {
113  p->lowspeed = false;
114  addrPool.FreeAddress(bAddress);
115  bAddress = 0;
116  USBTRACE2("setAddr:", rcode);
117  return rcode;
118  }
119 
120  USBTRACE2("Addr:", bAddress);
121 
122  p->lowspeed = false;
123 
124  p = addrPool.GetUsbDevicePtr(bAddress);
125 
126  if(!p)
128 
129  p->lowspeed = lowspeed;
130 
131  num_of_conf = udd->bNumConfigurations;
132 
133  // Assign epInfo to epinfo pointer
134  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
135 
136  if(rcode)
137  goto FailSetDevTblEntry;
138 
139  USBTRACE2("NC:", num_of_conf);
140 
141  for(uint8_t i = 0; i < num_of_conf; i++) {
144 
145  rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
146 
147  if(rcode)
148  goto FailGetConfDescr;
149 
150  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
151 
152  if(rcode)
153  goto FailGetConfDescr;
154 
155  if(bNumEP > 1)
156  break;
157  } // for
158 
159  if(bNumEP < 2)
161 
162  USBTRACE2("NumEP:", bNumEP);
163 
164  // Assign epInfo to epinfo pointer
165  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
166 
167  USBTRACE2("Conf:", bConfNum);
168 
169  // Set Configuration Value
170  rcode = pUsb->setConf(bAddress, 0, bConfNum);
171 
172  if(rcode)
173  goto FailSetConfDescr;
174 
175  rcode = pAsync->OnInit(this);
176 
177  if(rcode)
178  goto FailOnInit;
179 
180  USBTRACE("FTDI configured\r\n");
181 
182  bPollEnable = true;
183  return 0;
184 
185 FailGetDevDescr:
186 #ifdef DEBUG_USB_HOST
188  goto Fail;
189 #endif
190 
191 FailSetDevTblEntry:
192 #ifdef DEBUG_USB_HOST
194  goto Fail;
195 #endif
196 
197 FailGetConfDescr:
198 #ifdef DEBUG_USB_HOST
200  goto Fail;
201 #endif
202 
203 FailSetConfDescr:
204 #ifdef DEBUG_USB_HOST
206  goto Fail;
207 #endif
208 
209 FailOnInit:
210 #ifdef DEBUG_USB_HOST
211  USBTRACE("OnInit:");
212 
213 Fail:
214  NotifyFail(rcode);
215 #endif
216  Release();
217  return rcode;
218 }
219 
220 void FTDI::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
221  ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
222  ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
223  ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
224 
225  bConfNum = conf;
226 
227  uint8_t index;
228 
229  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
230  index = epInterruptInIndex;
231  else
232  if((pep->bmAttributes & 0x02) == 2)
233  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
234  else
235  return;
236 
237  // Fill in the endpoint info structure
238  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
239  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
240  epInfo[index].bmSndToggle = 0;
241  epInfo[index].bmRcvToggle = 0;
242 
243  bNumEP++;
244 
245  PrintEndpointDescriptor(pep);
246 }
247 
248 uint8_t FTDI::Release() {
249  pUsb->GetAddressPool().FreeAddress(bAddress);
250 
251  bAddress = 0;
252  bNumEP = 1;
253  qNextPollTime = 0;
254  bPollEnable = false;
255  return pAsync->OnRelease(this);
256 }
257 
258 uint8_t FTDI::Poll() {
259  uint8_t rcode = 0;
260 
261  //if (!bPollEnable)
262  // return 0;
263 
264  //if (qNextPollTime <= millis())
265  //{
266  // USB_HOST_SERIAL.println(bAddress, HEX);
267 
268  // qNextPollTime = millis() + 100;
269  //}
270  return rcode;
271 }
272 
273 uint8_t FTDI::SetBaudRate(uint32_t baud) {
274  uint16_t baud_value, baud_index = 0;
275  uint32_t divisor3;
276 
277  divisor3 = 48000000 / 2 / baud; // divisor shifted 3 bits to the left
278 
279  if(wFTDIType == FT232AM) {
280  if((divisor3 & 0x7) == 7)
281  divisor3++; // round x.7/8 up to x+1
282 
283  baud_value = divisor3 >> 3;
284  divisor3 &= 0x7;
285 
286  if(divisor3 == 1) baud_value |= 0xc000;
287  else // 0.125
288  if(divisor3 >= 4) baud_value |= 0x4000;
289  else // 0.5
290  if(divisor3 != 0) baud_value |= 0x8000; // 0.25
291  if(baud_value == 1) baud_value = 0; /* special case for maximum baud rate */
292  } else {
293  static const unsigned char divfrac [8] = {0, 3, 2, 0, 1, 1, 2, 3};
294  static const unsigned char divindex[8] = {0, 0, 0, 1, 0, 1, 1, 1};
295 
296  baud_value = divisor3 >> 3;
297  baud_value |= divfrac [divisor3 & 0x7] << 14;
298  baud_index = divindex[divisor3 & 0x7];
299 
300  /* Deal with special cases for highest baud rates. */
301  if(baud_value == 1) baud_value = 0;
302  else // 1.0
303  if(baud_value == 0x4001) baud_value = 1; // 1.5
304  }
305  USBTRACE2("baud_value:", baud_value);
306  USBTRACE2("baud_index:", baud_index);
307  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_BAUD_RATE, baud_value & 0xff, baud_value >> 8, baud_index, 0, 0, NULL, NULL);
308 }
309 
310 uint8_t FTDI::SetModemControl(uint16_t signal) {
311  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_MODEM_CTRL, signal & 0xff, signal >> 8, 0, 0, 0, NULL, NULL);
312 }
313 
314 uint8_t FTDI::SetFlowControl(uint8_t protocol, uint8_t xon, uint8_t xoff) {
315  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_FLOW_CTRL, xon, xoff, protocol << 8, 0, 0, NULL, NULL);
316 }
317 
318 uint8_t FTDI::SetData(uint16_t databm) {
319  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_DATA, databm & 0xff, databm >> 8, 0, 0, 0, NULL, NULL);
320 }
321 
322 uint8_t FTDI::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
323  return pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
324 }
325 
326 uint8_t FTDI::SndData(uint16_t nbytes, uint8_t *dataptr) {
327  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
328 }
329 
330 void FTDI::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr) {
331  Notify(PSTR("Endpoint descriptor:"), 0x80);
332  Notify(PSTR("\r\nLength:\t\t"), 0x80);
333  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
334  Notify(PSTR("\r\nType:\t\t"), 0x80);
335  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
336  Notify(PSTR("\r\nAddress:\t"), 0x80);
337  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
338  Notify(PSTR("\r\nAttributes:\t"), 0x80);
339  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
340  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
341  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
342  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
343  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
344  Notify(PSTR("\r\n"), 0x80);
345 }
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:771
-
uint8_t bmRcvToggle
Definition: address.h:41
- +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  {
91  USBTRACE("FTDI Init: Product not supported\r\n");
92  USBTRACE2("Expected VID:", FTDI_VID);
93  USBTRACE2("Found VID:", udd->idVendor);
94 
95  USBTRACE2("Expected PID:", wIdProduct);
96  USBTRACE2("Found PID:", udd->idProduct);
98  }
99 
100  // Save type of FTDI chip
101  wFTDIType = udd->bcdDevice;
102 
103  // Allocate new address according to device class
104  bAddress = addrPool.AllocAddress(parent, false, port);
105 
106  if(!bAddress)
108 
109  // Extract Max Packet Size from the device descriptor
110  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
111 
112  // Assign new address to the device
113  rcode = pUsb->setAddr(0, 0, bAddress);
114 
115  if(rcode) {
116  p->lowspeed = false;
117  addrPool.FreeAddress(bAddress);
118  bAddress = 0;
119  USBTRACE2("setAddr:", rcode);
120  return rcode;
121  }
122 
123  USBTRACE2("Addr:", bAddress);
124 
125  p->lowspeed = false;
126 
127  p = addrPool.GetUsbDevicePtr(bAddress);
128 
129  if(!p)
131 
132  p->lowspeed = lowspeed;
133 
134  num_of_conf = udd->bNumConfigurations;
135 
136  // Assign epInfo to epinfo pointer
137  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
138 
139  if(rcode)
140  goto FailSetDevTblEntry;
141 
142  USBTRACE2("NC:", num_of_conf);
143 
144  for(uint8_t i = 0; i < num_of_conf; i++) {
146 
147  // This interferes with serial output, and should be opt-in for debugging.
148  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
149  //rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
150  //if(rcode)
151  // goto FailGetConfDescr;
152 
153  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
154 
155  if(rcode)
156  goto FailGetConfDescr;
157 
158  if(bNumEP > 1)
159  break;
160  } // for
161 
162  if(bNumEP < 2)
164 
165  USBTRACE2("NumEP:", bNumEP);
166 
167  // Assign epInfo to epinfo pointer
168  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
169 
170  USBTRACE2("Conf:", bConfNum);
171 
172  // Set Configuration Value
173  rcode = pUsb->setConf(bAddress, 0, bConfNum);
174 
175  if(rcode)
176  goto FailSetConfDescr;
177 
178  rcode = pAsync->OnInit(this);
179 
180  if(rcode)
181  goto FailOnInit;
182 
183  USBTRACE("FTDI configured\r\n");
184 
185  ready = true;
186  return 0;
187 
188 FailGetDevDescr:
189 #ifdef DEBUG_USB_HOST
191  goto Fail;
192 #endif
193 
194 FailSetDevTblEntry:
195 #ifdef DEBUG_USB_HOST
197  goto Fail;
198 #endif
199 
200 FailGetConfDescr:
201 #ifdef DEBUG_USB_HOST
203  goto Fail;
204 #endif
205 
206 FailSetConfDescr:
207 #ifdef DEBUG_USB_HOST
209  goto Fail;
210 #endif
211 
212 FailOnInit:
213 #ifdef DEBUG_USB_HOST
214  USBTRACE("OnInit:");
215 
216 Fail:
217  NotifyFail(rcode);
218 #endif
219  Release();
220  return rcode;
221 }
222 
223 void FTDI::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *pep) {
224  ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
225  ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
226  ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
227 
228  bConfNum = conf;
229 
230  uint8_t index;
231 
232  if((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80)
233  index = epInterruptInIndex;
235  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
236  else
237  return;
238 
239  // Fill in the endpoint info structure
240  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
241  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
242  epInfo[index].bmSndToggle = 0;
243  epInfo[index].bmRcvToggle = 0;
244 
245  bNumEP++;
246 
247  PrintEndpointDescriptor(pep);
248 }
249 
250 uint8_t FTDI::Release() {
251  pUsb->GetAddressPool().FreeAddress(bAddress);
252 
253  bAddress = 0;
254  bNumEP = 1;
255  qNextPollTime = 0;
256  bPollEnable = false;
257  ready = false;
258  return pAsync->OnRelease(this);
259 }
260 
261 uint8_t FTDI::Poll() {
262  uint8_t rcode = 0;
263 
264  //if (!bPollEnable)
265  // return 0;
266 
267  //if (qNextPollTime <= (uint32_t)millis())
268  //{
269  // USB_HOST_SERIAL.println(bAddress, HEX);
270 
271  // qNextPollTime = (uint32_t)millis() + 100;
272  //}
273  return rcode;
274 }
275 
276 uint8_t FTDI::SetBaudRate(uint32_t baud) {
277  uint16_t baud_value, baud_index = 0;
278  uint32_t divisor3;
279  divisor3 = 48000000 / 2 / baud; // divisor shifted 3 bits to the left
280 
281  if(wFTDIType == FT232AM) {
282  if((divisor3 & 0x7) == 7)
283  divisor3++; // round x.7/8 up to x+1
284 
285  baud_value = divisor3 >> 3;
286  divisor3 &= 0x7;
287 
288  if(divisor3 == 1) baud_value |= 0xc000;
289  else // 0.125
290  if(divisor3 >= 4) baud_value |= 0x4000;
291  else // 0.5
292  if(divisor3 != 0) baud_value |= 0x8000; // 0.25
293  if(baud_value == 1) baud_value = 0; /* special case for maximum baud rate */
294  } else {
295  static const uint8_t divfrac [8] = {0, 3, 2, 0, 1, 1, 2, 3};
296  static const uint8_t divindex[8] = {0, 0, 0, 1, 0, 1, 1, 1};
297 
298  baud_value = divisor3 >> 3;
299  baud_value |= divfrac [divisor3 & 0x7] << 14;
300  baud_index = divindex[divisor3 & 0x7];
301 
302  /* Deal with special cases for highest baud rates. */
303  if(baud_value == 1) baud_value = 0;
304  else // 1.0
305  if(baud_value == 0x4001) baud_value = 1; // 1.5
306  }
307  USBTRACE2("baud_value:", baud_value);
308  USBTRACE2("baud_index:", baud_index);
309  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);
310  if(rv && rv != hrNAK) {
311  Release();
312  }
313  return rv;
314 }
315 
316 uint8_t FTDI::SetModemControl(uint16_t signal) {
317  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_MODEM_CTRL, signal & 0xff, signal >> 8, 0, 0, 0, NULL, NULL);
318  if(rv && rv != hrNAK) {
319  Release();
320  }
321  return rv;
322 }
323 
324 uint8_t FTDI::SetFlowControl(uint8_t protocol, uint8_t xon, uint8_t xoff) {
325  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_FLOW_CTRL, xon, xoff, protocol << 8, 0, 0, NULL, NULL);
326  if(rv && rv != hrNAK) {
327  Release();
328  }
329  return rv;
330 }
331 
332 uint8_t FTDI::SetData(uint16_t databm) {
333  uint8_t rv = pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_DATA, databm & 0xff, databm >> 8, 0, 0, 0, NULL, NULL);
334  if(rv && rv != hrNAK) {
335  Release();
336  }
337  return rv;
338 }
339 
340 uint8_t FTDI::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
341  uint8_t rv = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
342  if(rv && rv != hrNAK) {
343  Release();
344  }
345  return rv;
346 }
347 
348 uint8_t FTDI::SndData(uint16_t nbytes, uint8_t *dataptr) {
349  uint8_t rv = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
350  if(rv && rv != hrNAK) {
351  Release();
352  }
353  return rv;
354 }
355 
356 void FTDI::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr) {
357  Notify(PSTR("Endpoint descriptor:"), 0x80);
358  Notify(PSTR("\r\nLength:\t\t"), 0x80);
359  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
360  Notify(PSTR("\r\nType:\t\t"), 0x80);
361  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
362  Notify(PSTR("\r\nAddress:\t"), 0x80);
363  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
364  Notify(PSTR("\r\nAttributes:\t"), 0x80);
365  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
366  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
367  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
368  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
369  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
370  Notify(PSTR("\r\n"), 0x80);
371 }
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:784
+
uint8_t bmRcvToggle
Definition: address.h:48
+
#define bmREQ_FTDI_OUT
Definition: cdcftdi.h:22
-
EpInfo * epinfo
Definition: address.h:76
-
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: cdcftdi.cpp:220
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
-
uint8_t SetBaudRate(uint32_t baud)
Definition: cdcftdi.cpp:273
-
uint8_t bmNakPower
Definition: address.h:42
+
EpInfo * epinfo
Definition: address.h:83
+
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: cdcftdi.cpp:223
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
+
uint8_t SetBaudRate(uint32_t baud)
Definition: cdcftdi.cpp:276
+
uint8_t bmNakPower
Definition: address.h:49
#define FT232AM
Definition: cdcftdi.h:31
- -
uint16_t bcdDevice
Definition: usb_ch9.h:108
-
uint8_t SetModemControl(uint16_t control)
Definition: cdcftdi.cpp:310
- - + +
uint16_t bcdDevice
Definition: usb_ch9.h:115
+
uint8_t SetModemControl(uint16_t control)
Definition: cdcftdi.cpp:316
+
#define FTDI_SIO_SET_BAUD_RATE
Definition: cdcftdi.h:40
- - - -
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:105
+ + + +
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:112
-
#define NotifyFail(...)
Definition: message.h:55
+
#define NotifyFail(...)
Definition: message.h:62
#define FTDI_SIO_SET_DATA
Definition: cdcftdi.h:41
-
uint8_t SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)
Definition: cdcftdi.cpp:314
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
+
uint8_t SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)
Definition: cdcftdi.cpp:324
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:93
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
-
uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
Definition: cdcftdi.cpp:322
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
+
uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
Definition: cdcftdi.cpp:340
virtual void FreeAddress(uint8_t addr)=0
-
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
+
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:133
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
#define Notify(...)
Definition: message.h:44
- - -
#define USBTRACE2(s, r)
Definition: macros.h:77
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
#define NotifyFailGetConfDescr(...)
Definition: message.h:52
-
uint8_t epAddr
Definition: address.h:33
-
#define USB_NAK_MAX_POWER
Definition: address.h:27
+
#define Notify(...)
Definition: message.h:51
+ + +
#define USBTRACE2(s, r)
Definition: macros.h:84
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
#define NotifyFailGetConfDescr(...)
Definition: message.h:59
+
uint8_t epAddr
Definition: address.h:40
+
#define USB_NAK_MAX_POWER
Definition: address.h:34
FTDI(USB *pusb, FTDIAsyncOper *pasync, uint16_t idProduct=FTDI_PID)
Definition: cdcftdi.cpp:23
-
uint8_t Poll()
Definition: cdcftdi.cpp:258
-
Definition: address.h:32
-
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:293
-
uint16_t wMaxPacketSize
Definition: usb_ch9.h:146
+
uint8_t Poll()
Definition: cdcftdi.cpp:261
+
Definition: address.h:39
+
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:300
+
#define hrNAK
Definition: max3421e.h:218
+
uint16_t wMaxPacketSize
Definition: usb_ch9.h:153
+
#define bmUSB_TRANSFER_TYPE
Definition: usb_ch9.h:94
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: cdcftdi.cpp:41
#define FTDI_SIO_SET_FLOW_CTRL
Definition: cdcftdi.h:39
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bEndpointAddress
Definition: usb_ch9.h:144
+
uint8_t bEndpointAddress
Definition: usb_ch9.h:151
virtual uint8_t OnInit(FTDI *pftdi)
Definition: cdcftdi.h:82
-
uint8_t bmSndToggle
Definition: address.h:40
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
#define PSTR(str)
-
uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
Definition: cdcftdi.cpp:326
- -
#define USB_NAK_NOWAIT
Definition: address.h:29
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
+
uint8_t bmSndToggle
Definition: address.h:47
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
#define PSTR(str)
+
uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
Definition: cdcftdi.cpp:348
+ +
#define USB_NAK_NOWAIT
Definition: address.h:36
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
virtual uint8_t OnRelease(FTDI *pftdi)
Definition: cdcftdi.h:86
#define FTDI_VID
Definition: cdcftdi.h:28
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
-
uint8_t Release()
Definition: cdcftdi.cpp:248
-
uint16_t idProduct
Definition: usb_ch9.h:107
-
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:206
-
uint8_t bNumConfigurations
Definition: usb_ch9.h:112
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
+
uint8_t Release()
Definition: cdcftdi.cpp:250
+
uint16_t idProduct
Definition: usb_ch9.h:114
+
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
Definition: Usb.cpp:213
+
uint8_t bNumConfigurations
Definition: usb_ch9.h:119
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
#define FTDI_SIO_MODEM_CTRL
Definition: cdcftdi.h:38
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
Definition: UsbCore.h:197
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
-
uint8_t SetData(uint16_t databm)
Definition: cdcftdi.cpp:318
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
Definition: UsbCore.h:208
+
#define USB_TRANSFER_TYPE_BULK
Definition: usb_ch9.h:92
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:228
+
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
+
uint8_t SetData(uint16_t databm)
Definition: cdcftdi.cpp:332
#define FTDI_MAX_ENDPOINTS
Definition: cdcftdi.h:94
-
#define USBTRACE(s)
Definition: macros.h:75
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
- +
#define USBTRACE(s)
Definition: macros.h:82
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
+
diff --git a/cdcftdi_8h.html b/cdcftdi_8h.html index bad006db..0c6a5b3f 100644 --- a/cdcftdi_8h.html +++ b/cdcftdi_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcftdi.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
 

Macro Definition Documentation

- + +

◆ bmREQ_FTDI_OUT

+
@@ -220,11 +202,13 @@ Macros
-

Definition at line 22 of file cdcftdi.h.

+

Definition at line 22 of file cdcftdi.h.

- + +

◆ bmREQ_FTDI_IN

+
@@ -234,11 +218,13 @@ Macros
-

Definition at line 23 of file cdcftdi.h.

+

Definition at line 23 of file cdcftdi.h.

- + +

◆ FTDI_VID

+
@@ -248,11 +234,13 @@ Macros
-

Definition at line 28 of file cdcftdi.h.

+

Definition at line 28 of file cdcftdi.h.

- + +

◆ FTDI_PID

+
@@ -262,11 +250,13 @@ Macros
-

Definition at line 29 of file cdcftdi.h.

+

Definition at line 29 of file cdcftdi.h.

- + +

◆ FT232AM

+
@@ -276,11 +266,13 @@ Macros
-

Definition at line 31 of file cdcftdi.h.

+

Definition at line 31 of file cdcftdi.h.

- + +

◆ FT232BM

+
@@ -290,11 +282,13 @@ Macros
-

Definition at line 32 of file cdcftdi.h.

+

Definition at line 32 of file cdcftdi.h.

- + +

◆ FT2232

+
@@ -304,11 +298,13 @@ Macros
-

Definition at line 33 of file cdcftdi.h.

+

Definition at line 33 of file cdcftdi.h.

- + +

◆ FT232R

+
@@ -318,11 +314,13 @@ Macros
-

Definition at line 34 of file cdcftdi.h.

+

Definition at line 34 of file cdcftdi.h.

- + +

◆ FTDI_SIO_RESET

+
@@ -332,11 +330,13 @@ Macros
-

Definition at line 37 of file cdcftdi.h.

+

Definition at line 37 of file cdcftdi.h.

- + +

◆ FTDI_SIO_MODEM_CTRL

+
@@ -346,11 +346,13 @@ Macros
-

Definition at line 38 of file cdcftdi.h.

+

Definition at line 38 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_FLOW_CTRL

+
@@ -360,11 +362,13 @@ Macros
-

Definition at line 39 of file cdcftdi.h.

+

Definition at line 39 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_BAUD_RATE

+
@@ -374,11 +378,13 @@ Macros
-

Definition at line 40 of file cdcftdi.h.

+

Definition at line 40 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA

+
@@ -388,11 +394,13 @@ Macros
-

Definition at line 41 of file cdcftdi.h.

+

Definition at line 41 of file cdcftdi.h.

- + +

◆ FTDI_SIO_GET_MODEM_STATUS

+
@@ -402,11 +410,13 @@ Macros
-

Definition at line 42 of file cdcftdi.h.

+

Definition at line 42 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_EVENT_CHAR

+
@@ -416,11 +426,13 @@ Macros
-

Definition at line 43 of file cdcftdi.h.

+

Definition at line 43 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_ERROR_CHAR

+
@@ -430,11 +442,13 @@ Macros
-

Definition at line 44 of file cdcftdi.h.

+

Definition at line 44 of file cdcftdi.h.

- + +

◆ FTDI_SIO_RESET_SIO

+
@@ -444,11 +458,13 @@ Macros
-

Definition at line 46 of file cdcftdi.h.

+

Definition at line 46 of file cdcftdi.h.

- + +

◆ FTDI_SIO_RESET_PURGE_RX

+
@@ -458,11 +474,13 @@ Macros
-

Definition at line 47 of file cdcftdi.h.

+

Definition at line 47 of file cdcftdi.h.

- + +

◆ FTDI_SIO_RESET_PURGE_TX

+
@@ -472,11 +490,13 @@ Macros
-

Definition at line 48 of file cdcftdi.h.

+

Definition at line 48 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA_PARITY_NONE

+
@@ -486,11 +506,13 @@ Macros
-

Definition at line 50 of file cdcftdi.h.

+

Definition at line 50 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA_PARITY_ODD

+
@@ -500,11 +522,13 @@ Macros
-

Definition at line 51 of file cdcftdi.h.

+

Definition at line 51 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA_PARITY_EVEN

+
@@ -514,11 +538,13 @@ Macros
-

Definition at line 52 of file cdcftdi.h.

+

Definition at line 52 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA_PARITY_MARK

+
@@ -528,11 +554,13 @@ Macros
-

Definition at line 53 of file cdcftdi.h.

+

Definition at line 53 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA_PARITY_SPACE

+
@@ -542,11 +570,13 @@ Macros
-

Definition at line 54 of file cdcftdi.h.

+

Definition at line 54 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA_STOP_BITS_1

+
@@ -556,11 +586,13 @@ Macros
-

Definition at line 55 of file cdcftdi.h.

+

Definition at line 55 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA_STOP_BITS_15

+
@@ -570,11 +602,13 @@ Macros
-

Definition at line 56 of file cdcftdi.h.

+

Definition at line 56 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DATA_STOP_BITS_2

+
@@ -584,11 +618,13 @@ Macros
-

Definition at line 57 of file cdcftdi.h.

+

Definition at line 57 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_BREAK

+
@@ -598,11 +634,13 @@ Macros
-

Definition at line 58 of file cdcftdi.h.

+

Definition at line 58 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DTR_MASK

+
@@ -612,11 +650,13 @@ Macros
-

Definition at line 60 of file cdcftdi.h.

+

Definition at line 60 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DTR_HIGH

+
@@ -626,11 +666,13 @@ Macros
-

Definition at line 61 of file cdcftdi.h.

+

Definition at line 61 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_DTR_LOW

+
@@ -640,11 +682,13 @@ Macros
-

Definition at line 62 of file cdcftdi.h.

+

Definition at line 62 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_RTS_MASK

+
@@ -654,11 +698,13 @@ Macros
-

Definition at line 63 of file cdcftdi.h.

+

Definition at line 63 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_RTS_HIGH

+
@@ -668,11 +714,13 @@ Macros
-

Definition at line 64 of file cdcftdi.h.

+

Definition at line 64 of file cdcftdi.h.

- + +

◆ FTDI_SIO_SET_RTS_LOW

+
@@ -682,11 +730,13 @@ Macros
-

Definition at line 65 of file cdcftdi.h.

+

Definition at line 65 of file cdcftdi.h.

- + +

◆ FTDI_SIO_DISABLE_FLOW_CTRL

+
@@ -696,11 +746,13 @@ Macros
-

Definition at line 67 of file cdcftdi.h.

+

Definition at line 67 of file cdcftdi.h.

- + +

◆ FTDI_SIO_RTS_CTS_HS

+
@@ -710,11 +762,13 @@ Macros
-

Definition at line 68 of file cdcftdi.h.

+

Definition at line 68 of file cdcftdi.h.

- + +

◆ FTDI_SIO_DTR_DSR_HS

+
@@ -724,11 +778,13 @@ Macros
-

Definition at line 69 of file cdcftdi.h.

+

Definition at line 69 of file cdcftdi.h.

- + +

◆ FTDI_SIO_XON_XOFF_HS

+
@@ -738,11 +794,13 @@ Macros
-

Definition at line 70 of file cdcftdi.h.

+

Definition at line 70 of file cdcftdi.h.

- + +

◆ FTDI_SIO_CTS_MASK

+
@@ -752,11 +810,13 @@ Macros
-

Definition at line 72 of file cdcftdi.h.

+

Definition at line 72 of file cdcftdi.h.

- + +

◆ FTDI_SIO_DSR_MASK

+
@@ -766,11 +826,13 @@ Macros
-

Definition at line 73 of file cdcftdi.h.

+

Definition at line 73 of file cdcftdi.h.

- + +

◆ FTDI_SIO_RI_MASK

+
@@ -780,11 +842,13 @@ Macros
-

Definition at line 74 of file cdcftdi.h.

+

Definition at line 74 of file cdcftdi.h.

- + +

◆ FTDI_SIO_RLSD_MASK

+
@@ -794,11 +858,13 @@ Macros
-

Definition at line 75 of file cdcftdi.h.

+

Definition at line 75 of file cdcftdi.h.

- + +

◆ FTDI_MAX_ENDPOINTS

+
@@ -808,7 +874,7 @@ Macros
-

Definition at line 94 of file cdcftdi.h.

+

Definition at line 94 of file cdcftdi.h.

@@ -817,7 +883,7 @@ Macros diff --git a/cdcftdi_8h__dep__incl.md5 b/cdcftdi_8h__dep__incl.md5 index d2a73e5f..d21df7d0 100644 --- a/cdcftdi_8h__dep__incl.md5 +++ b/cdcftdi_8h__dep__incl.md5 @@ -1 +1 @@ -bb94e7e9d10e1bde33f1040736fc690f \ No newline at end of file +2580f835598c65f780bc9a84dd4f7552 \ No newline at end of file diff --git a/cdcftdi_8h__dep__incl.png b/cdcftdi_8h__dep__incl.png index 023738cb22d654424fb2cf0962da68ed88abb0f6..f483ac2ed5a8be983b9add38c27468099f5cc019 100644 GIT binary patch literal 3034 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 literal 3116 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 Nn4!?dBtsAU{{U%F*lGX( diff --git a/cdcftdi_8h__incl.md5 b/cdcftdi_8h__incl.md5 index 8f85634d..51c8bad8 100644 --- a/cdcftdi_8h__incl.md5 +++ b/cdcftdi_8h__incl.md5 @@ -1 +1 @@ -5a325c73b89e2318a59e437a1ca1f735 \ No newline at end of file +891212ff8fe5d0168dc1f0aa39801762 \ No newline at end of file diff --git a/cdcftdi_8h__incl.png b/cdcftdi_8h__incl.png index d9c699cee5c47c794f6bb92a2c18ce6f06b6ff63..5ff6d0f82322aac8b380498b3fdfbe1ec9d070bf 100644 GIT binary patch literal 2619 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 D^rYj^ literal 2606 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 R{p1e>nEq)2t2Oe#{|B6?@6`YR diff --git a/cdcftdi_8h_source.html b/cdcftdi_8h_source.html index b203316d..4f6b1333 100644 --- a/cdcftdi_8h_source.html +++ b/cdcftdi_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcftdi.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 
46 #define FTDI_SIO_RESET_SIO 0
47 #define FTDI_SIO_RESET_PURGE_RX 1
48 #define FTDI_SIO_RESET_PURGE_TX 2
49 
50 #define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8 )
51 #define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8 )
52 #define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8 )
53 #define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8 )
54 #define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8 )
55 #define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11)
56 #define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
57 #define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
58 #define FTDI_SIO_SET_BREAK (0x1 << 14)
59 
60 #define FTDI_SIO_SET_DTR_MASK 0x1
61 #define FTDI_SIO_SET_DTR_HIGH ( 1 | ( FTDI_SIO_SET_DTR_MASK << 8))
62 #define FTDI_SIO_SET_DTR_LOW ( 0 | ( FTDI_SIO_SET_DTR_MASK << 8))
63 #define FTDI_SIO_SET_RTS_MASK 0x2
64 #define FTDI_SIO_SET_RTS_HIGH ( 2 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
65 #define FTDI_SIO_SET_RTS_LOW ( 0 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
66 
67 #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
68 #define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
69 #define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
70 #define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
71 
72 #define FTDI_SIO_CTS_MASK 0x10
73 #define FTDI_SIO_DSR_MASK 0x20
74 #define FTDI_SIO_RI_MASK 0x40
75 #define FTDI_SIO_RLSD_MASK 0x80
76 
77 class FTDI;
78 
80 public:
81 
82  virtual uint8_t OnInit(FTDI *pftdi) {
83  return 0;
84  };
85 
86  virtual uint8_t OnRelease(FTDI *pftdi) {
87  return 0;
88  };
89 };
90 
91 
92 // Only single port chips are currently supported by the library,
93 // so only three endpoints are allocated.
94 #define FTDI_MAX_ENDPOINTS 3
95 
96 class FTDI : public USBDeviceConfig, public UsbConfigXtracter {
97  static const uint8_t epDataInIndex; // DataIn endpoint index
98  static const uint8_t epDataOutIndex; // DataOUT endpoint index
99  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
100 
101  FTDIAsyncOper *pAsync;
102  USB *pUsb;
103  uint8_t bAddress;
104  uint8_t bConfNum; // configuration number
105  uint8_t bNumIface; // number of interfaces in the configuration
106  uint8_t bNumEP; // total number of EP in the configuration
107  uint32_t qNextPollTime; // next poll time
108  bool bPollEnable; // poll enable flag
109  uint16_t wFTDIType; // Type of FTDI chip
110  uint16_t wIdProduct; // expected PID
111 
112  EpInfo epInfo[FTDI_MAX_ENDPOINTS];
113 
114  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
115 
116 public:
117  FTDI(USB *pusb, FTDIAsyncOper *pasync, uint16_t idProduct = FTDI_PID);
118 
119  uint8_t SetBaudRate(uint32_t baud);
120  uint8_t SetModemControl(uint16_t control);
121  uint8_t SetFlowControl(uint8_t protocol, uint8_t xon = 0x11, uint8_t xoff = 0x13);
122  uint8_t SetData(uint16_t databm);
123 
124  // Methods for recieving and sending data
125  uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr);
126  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
127 
128  // USBDeviceConfig implementation
129  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
130  uint8_t Release();
131  uint8_t Poll();
132 
133  virtual uint8_t GetAddress() {
134  return bAddress;
135  };
136 
137  // UsbConfigXtracter implementation
138  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
139 
140  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
141  return (vid == FTDI_VID && pid == FTDI_PID);
142  }
143 
144 };
145 
146 #endif // __CDCFTDI_H__
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: cdcftdi.h:140
- - +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 
46 #define FTDI_SIO_RESET_SIO 0
47 #define FTDI_SIO_RESET_PURGE_RX 1
48 #define FTDI_SIO_RESET_PURGE_TX 2
49 
50 #define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8 )
51 #define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8 )
52 #define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8 )
53 #define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8 )
54 #define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8 )
55 #define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11)
56 #define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
57 #define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
58 #define FTDI_SIO_SET_BREAK (0x1 << 14)
59 
60 #define FTDI_SIO_SET_DTR_MASK 0x1
61 #define FTDI_SIO_SET_DTR_HIGH ( 1 | ( FTDI_SIO_SET_DTR_MASK << 8))
62 #define FTDI_SIO_SET_DTR_LOW ( 0 | ( FTDI_SIO_SET_DTR_MASK << 8))
63 #define FTDI_SIO_SET_RTS_MASK 0x2
64 #define FTDI_SIO_SET_RTS_HIGH ( 2 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
65 #define FTDI_SIO_SET_RTS_LOW ( 0 | ( FTDI_SIO_SET_RTS_MASK << 8 ))
66 
67 #define FTDI_SIO_DISABLE_FLOW_CTRL 0x0
68 #define FTDI_SIO_RTS_CTS_HS (0x1 << 8)
69 #define FTDI_SIO_DTR_DSR_HS (0x2 << 8)
70 #define FTDI_SIO_XON_XOFF_HS (0x4 << 8)
71 
72 #define FTDI_SIO_CTS_MASK 0x10
73 #define FTDI_SIO_DSR_MASK 0x20
74 #define FTDI_SIO_RI_MASK 0x40
75 #define FTDI_SIO_RLSD_MASK 0x80
76 
77 class FTDI;
78 
80 public:
81 
82  virtual uint8_t OnInit(FTDI *pftdi __attribute__((unused))) {
83  return 0;
84  };
85 
86  virtual uint8_t OnRelease(FTDI *pftdi __attribute__((unused))) {
87  return 0;
88  };
89 };
90 
91 
92 // Only single port chips are currently supported by the library,
93 // so only three endpoints are allocated.
94 #define FTDI_MAX_ENDPOINTS 3
95 
96 class FTDI : public USBDeviceConfig, public UsbConfigXtracter {
97  static const uint8_t epDataInIndex; // DataIn endpoint index
98  static const uint8_t epDataOutIndex; // DataOUT endpoint index
99  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
100 
101  FTDIAsyncOper *pAsync;
102  USB *pUsb;
103  uint8_t bAddress;
104  uint8_t bConfNum; // configuration number
105  uint8_t bNumIface; // number of interfaces in the configuration
106  uint8_t bNumEP; // total number of EP in the configuration
107  uint32_t qNextPollTime; // next poll time
108  volatile bool bPollEnable; // poll enable flag
109  volatile bool ready; //device ready indicator
110  uint16_t wFTDIType; // Type of FTDI chip
111  uint16_t wIdProduct; // expected PID
112 
113  EpInfo epInfo[FTDI_MAX_ENDPOINTS];
114 
115  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
116 
117 public:
118  FTDI(USB *pusb, FTDIAsyncOper *pasync, uint16_t idProduct = FTDI_PID);
119 
120  uint8_t SetBaudRate(uint32_t baud);
121  uint8_t SetModemControl(uint16_t control);
122  uint8_t SetFlowControl(uint8_t protocol, uint8_t xon = 0x11, uint8_t xoff = 0x13);
123  uint8_t SetData(uint16_t databm);
124 
125  // Methods for recieving and sending data
126  uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr);
127  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
128 
129  // USBDeviceConfig implementation
130  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
131  uint8_t Release();
132  uint8_t Poll();
133 
134  virtual uint8_t GetAddress() {
135  return bAddress;
136  };
137 
138  // UsbConfigXtracter implementation
139  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
140 
141  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
142  return (vid == FTDI_VID && pid == wIdProduct);
143  }
144  virtual bool isReady() {
145  return ready;
146  };
147 
148 };
149 
150 #endif // __CDCFTDI_H__
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: cdcftdi.h:141
+
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: cdcftdi.cpp:223
+
uint8_t SetBaudRate(uint32_t baud)
Definition: cdcftdi.cpp:276
+
uint8_t SetModemControl(uint16_t control)
Definition: cdcftdi.cpp:316
+ +
uint8_t SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)
Definition: cdcftdi.cpp:324
+ -
Definition: address.h:32
+
uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
Definition: cdcftdi.cpp:340
+
FTDI(USB *pusb, FTDIAsyncOper *pasync, uint16_t idProduct=FTDI_PID)
Definition: cdcftdi.cpp:23
+
uint8_t Poll()
Definition: cdcftdi.cpp:261
+
Definition: address.h:39
Definition: cdcftdi.h:96
#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:144
virtual uint8_t OnInit(FTDI *pftdi)
Definition: cdcftdi.h:82
-
virtual uint8_t GetAddress()
Definition: cdcftdi.h:133
- +
uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
Definition: cdcftdi.cpp:348
+
virtual uint8_t GetAddress()
Definition: cdcftdi.h:134
+
virtual uint8_t OnRelease(FTDI *pftdi)
Definition: cdcftdi.h:86
#define FTDI_VID
Definition: cdcftdi.h:28
-
Definition: UsbCore.h:197
+
uint8_t Release()
Definition: cdcftdi.cpp:250
+
Definition: UsbCore.h:208
+
uint8_t SetData(uint16_t databm)
Definition: cdcftdi.cpp:332
#define FTDI_MAX_ENDPOINTS
Definition: cdcftdi.h:94
diff --git a/cdcprolific_8cpp.html b/cdcprolific_8cpp.html index aa541235..b0b2ed6a 100644 --- a/cdcprolific_8cpp.html +++ b/cdcprolific_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcprolific.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
diff --git a/cdcprolific_8cpp__incl.md5 b/cdcprolific_8cpp__incl.md5 index 1e1ab220..23a54331 100644 --- a/cdcprolific_8cpp__incl.md5 +++ b/cdcprolific_8cpp__incl.md5 @@ -1 +1 @@ -a91e5714ebd81502b745c96a64138390 \ No newline at end of file +80a2f4a7375bdcd59e0374c878b54419 \ No newline at end of file diff --git a/cdcprolific_8cpp__incl.png b/cdcprolific_8cpp__incl.png index 3487f759a31b1dedb8c7c17c063bb74035de9cc2..670eae4344646afad3e0b3d3f04be71e10ab6a23 100644 GIT binary patch literal 7137 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 O22zq!m#vVt2>l=8_J$(> diff --git a/cdcprolific_8cpp_source.html b/cdcprolific_8cpp_source.html index f1bf2334..2a786002 100644 --- a/cdcprolific_8cpp_source.html +++ b/cdcprolific_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcprolific.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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 <= millis())
241 // //{
242 // // USB_HOST_SERIAL.println(bAddress, HEX);
243 //
244 // // qNextPollTime = 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:771
- -
EpInfo * epinfo
Definition: address.h:76
-
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
+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:784
+ +
EpInfo * epinfo
Definition: address.h:83
+
bool lowspeed
Definition: address.h:86
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:94
virtual uint8_t OnInit(ACM *pacm)
Definition: cdcacm.h:131
- -
uint16_t bcdDevice
Definition: usb_ch9.h:108
+ +
uint16_t bcdDevice
Definition: usb_ch9.h:115
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: cdcprolific.cpp:24
- +
PL2303(USB *pusb, CDCAsyncOper *pasync)
Definition: cdcprolific.cpp:19
- -
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:105
-
volatile bool ready
Definition: cdcacm.h:178
-
#define NotifyFail(...)
Definition: message.h:55
-
#define CHECK_PID(pid)
Definition: cdcprolific.h:25
-
USB * pUsb
Definition: cdcacm.h:169
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:810
-
uint8_t bNumEP
Definition: cdcacm.h:175
-
EpInfo epInfo[ACM_MAX_ENDPOINTS]
Definition: cdcacm.h:181
-
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
-
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
+ +
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:112
+
volatile bool ready
Definition: cdcacm.h:174
+
#define NotifyFail(...)
Definition: message.h:62
+
USB * pUsb
Definition: cdcacm.h:165
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:823
+
uint8_t bNumEP
Definition: cdcacm.h:171
+
EpInfo epInfo[ACM_MAX_ENDPOINTS]
Definition: cdcacm.h:183
+
#define NotifyFailGetDevDescr(...)
Definition: message.h:57
+
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:71
virtual void FreeAddress(uint8_t addr)=0
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
CDCAsyncOper * pAsync
Definition: cdcacm.h:170
- -
#define USBTRACE2(s, r)
Definition: macros.h:77
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:801
-
#define NotifyFailGetConfDescr(...)
Definition: message.h:52
+
CDCAsyncOper * pAsync
Definition: cdcacm.h:166
+ +
#define USBTRACE2(s, r)
Definition: macros.h:84
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:814
+
#define NotifyFailGetConfDescr(...)
Definition: message.h:59
-
Definition: address.h:32
+
Definition: address.h:39
#define PL_VID
Definition: cdcprolific.h:24
pl2303_type
Definition: cdcprolific.h:112
virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
-
uint8_t bAddress
Definition: cdcacm.h:171
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
-
uint8_t bDeviceClass
Definition: usb_ch9.h:102
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
+
uint8_t bAddress
Definition: cdcacm.h:167
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:96
+
uint8_t bDeviceClass
Definition: usb_ch9.h:109
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:93
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:88
-
uint16_t idProduct
Definition: usb_ch9.h:107
-
uint8_t Release()
Definition: cdcacm.cpp:259
-
uint8_t bConfNum
Definition: cdcacm.h:172
-
uint8_t bNumConfigurations
Definition: usb_ch9.h:112
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
-
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
-
Definition: UsbCore.h:197
+
uint16_t idProduct
Definition: usb_ch9.h:114
+
uint8_t Release()
Definition: cdcacm.cpp:258
+
uint8_t bConfNum
Definition: cdcacm.h:168
+
uint8_t bNumConfigurations
Definition: usb_ch9.h:119
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:91
+
uint8_t maxPktSize
Definition: address.h:41
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:224
+
Definition: UsbCore.h:208
Definition: cdcacm.h:163
-
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
-
#define USBTRACE(s)
Definition: macros.h:75
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:766
-
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
- +
#define NotifyFailSetConfDescr(...)
Definition: message.h:60
+
#define CHECK_PID(pid)
Definition: cdcprolific.h:25
+
#define USBTRACE(s)
Definition: macros.h:82
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:779
+
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:58
+
diff --git a/cdcprolific_8h.html b/cdcprolific_8h.html index 683ca157..a07ee4e8 100644 --- a/cdcprolific_8h.html +++ b/cdcprolific_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcprolific.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
Macros #define PL_VID   0x067B   -#define CHECK_PID(pid)    ( pid != 0x2303 && pid != 0x0609 ) -  +#define CHECK_PID(pid)   ( pid != 0x2303 && pid != 0x0609 ) +  #define PROLIFIC_REV_H   0x0202   #define PROLIFIC_REV_X   0x0300 @@ -266,7 +246,9 @@ Enumerations  

Macro Definition Documentation

- + +

◆ PL_VID

+
@@ -276,11 +258,13 @@ Enumerations
-

Definition at line 24 of file cdcprolific.h.

+

Definition at line 24 of file cdcprolific.h.

- + +

◆ CHECK_PID

+
@@ -294,11 +278,13 @@ Enumerations
-

Definition at line 25 of file cdcprolific.h.

+

Definition at line 25 of file cdcprolific.h.

- + +

◆ PROLIFIC_REV_H

+
@@ -308,11 +294,13 @@ Enumerations
-

Definition at line 29 of file cdcprolific.h.

+

Definition at line 29 of file cdcprolific.h.

- + +

◆ PROLIFIC_REV_X

+
@@ -322,11 +310,13 @@ Enumerations
-

Definition at line 30 of file cdcprolific.h.

+

Definition at line 30 of file cdcprolific.h.

- + +

◆ PROLIFIC_REV_HX_CHIP_D

+
@@ -336,11 +326,13 @@ Enumerations
-

Definition at line 31 of file cdcprolific.h.

+

Definition at line 31 of file cdcprolific.h.

- + +

◆ PROLIFIC_REV_1

+
@@ -350,11 +342,13 @@ Enumerations
-

Definition at line 32 of file cdcprolific.h.

+

Definition at line 32 of file cdcprolific.h.

- + +

◆ kXOnChar

+
@@ -364,11 +358,13 @@ Enumerations
-

Definition at line 34 of file cdcprolific.h.

+

Definition at line 34 of file cdcprolific.h.

- + +

◆ kXOffChar

+
@@ -378,11 +374,13 @@ Enumerations
-

Definition at line 35 of file cdcprolific.h.

+

Definition at line 35 of file cdcprolific.h.

- + +

◆ SPECIAL_SHIFT

+
@@ -392,11 +390,13 @@ Enumerations
-

Definition at line 37 of file cdcprolific.h.

+

Definition at line 37 of file cdcprolific.h.

- + +

◆ SPECIAL_MASK

+
@@ -406,11 +406,13 @@ Enumerations
-

Definition at line 38 of file cdcprolific.h.

+

Definition at line 38 of file cdcprolific.h.

- + +

◆ STATE_ALL

+
@@ -420,11 +422,13 @@ Enumerations
-

Definition at line 39 of file cdcprolific.h.

+

Definition at line 39 of file cdcprolific.h.

- + +

◆ FLOW_RX_AUTO

+
@@ -434,11 +438,13 @@ Enumerations
-

Definition at line 40 of file cdcprolific.h.

+

Definition at line 40 of file cdcprolific.h.

- + +

◆ FLOW_TX_AUTO

+
@@ -448,11 +454,13 @@ Enumerations
-

Definition at line 41 of file cdcprolific.h.

+

Definition at line 41 of file cdcprolific.h.

- + +

◆ CAN_BE_AUTO

+
@@ -462,11 +470,13 @@ Enumerations
-

Definition at line 42 of file cdcprolific.h.

+

Definition at line 42 of file cdcprolific.h.

- + +

◆ CAN_NOTIFY

+
@@ -476,11 +486,13 @@ Enumerations
-

Definition at line 43 of file cdcprolific.h.

+

Definition at line 43 of file cdcprolific.h.

- + +

◆ EXTERNAL_MASK

+
@@ -490,11 +502,13 @@ Enumerations
-

Definition at line 44 of file cdcprolific.h.

+

Definition at line 44 of file cdcprolific.h.

- + +

◆ INTERNAL_DELAY

+
@@ -504,11 +518,13 @@ Enumerations
-

Definition at line 45 of file cdcprolific.h.

+

Definition at line 45 of file cdcprolific.h.

- + +

◆ DEFAULT_AUTO

+
@@ -518,11 +534,13 @@ Enumerations
-

Definition at line 46 of file cdcprolific.h.

+

Definition at line 46 of file cdcprolific.h.

- + +

◆ DEFAULT_NOTIFY

+
@@ -532,11 +550,13 @@ Enumerations
-

Definition at line 47 of file cdcprolific.h.

+

Definition at line 47 of file cdcprolific.h.

- + +

◆ DEFAULT_STATE

+
@@ -546,11 +566,13 @@ Enumerations
-

Definition at line 48 of file cdcprolific.h.

+

Definition at line 48 of file cdcprolific.h.

- + +

◆ CONTINUE_SEND

+
@@ -560,11 +582,13 @@ Enumerations
-

Definition at line 50 of file cdcprolific.h.

+

Definition at line 50 of file cdcprolific.h.

- + +

◆ PAUSE_SEND

+
@@ -574,11 +598,13 @@ Enumerations
-

Definition at line 51 of file cdcprolific.h.

+

Definition at line 51 of file cdcprolific.h.

- + +

◆ kRxAutoFlow

+
@@ -588,11 +614,13 @@ Enumerations
-

Definition at line 53 of file cdcprolific.h.

+

Definition at line 53 of file cdcprolific.h.

- + +

◆ kTxAutoFlow

+
@@ -602,11 +630,13 @@ Enumerations
-

Definition at line 54 of file cdcprolific.h.

+

Definition at line 54 of file cdcprolific.h.

- + +

◆ kControl_StateMask

+
@@ -616,11 +646,13 @@ Enumerations
-

Definition at line 55 of file cdcprolific.h.

+

Definition at line 55 of file cdcprolific.h.

- + +

◆ kRxQueueState

+
@@ -630,11 +662,13 @@ Enumerations
-

Definition at line 56 of file cdcprolific.h.

+

Definition at line 56 of file cdcprolific.h.

- + +

◆ kTxQueueState

+
@@ -644,11 +678,13 @@ Enumerations
-

Definition at line 57 of file cdcprolific.h.

+

Definition at line 57 of file cdcprolific.h.

- + +

◆ kCONTROL_DTR

+
@@ -658,11 +694,13 @@ Enumerations
-

Definition at line 59 of file cdcprolific.h.

+

Definition at line 59 of file cdcprolific.h.

- + +

◆ kCONTROL_RTS

+
@@ -672,11 +710,13 @@ Enumerations
-

Definition at line 60 of file cdcprolific.h.

+

Definition at line 60 of file cdcprolific.h.

- + +

◆ kStateTransientMask

+
@@ -686,11 +726,13 @@ Enumerations
-

Definition at line 62 of file cdcprolific.h.

+

Definition at line 62 of file cdcprolific.h.

- + +

◆ kBreakError

+
@@ -700,11 +742,13 @@ Enumerations
-

Definition at line 63 of file cdcprolific.h.

+

Definition at line 63 of file cdcprolific.h.

- + +

◆ kFrameError

+
@@ -714,11 +758,13 @@ Enumerations
-

Definition at line 64 of file cdcprolific.h.

+

Definition at line 64 of file cdcprolific.h.

- + +

◆ kParityError

+
@@ -728,11 +774,13 @@ Enumerations
-

Definition at line 65 of file cdcprolific.h.

+

Definition at line 65 of file cdcprolific.h.

- + +

◆ kOverrunError

+
@@ -742,11 +790,13 @@ Enumerations
-

Definition at line 66 of file cdcprolific.h.

+

Definition at line 66 of file cdcprolific.h.

- + +

◆ kCTS

+
@@ -756,11 +806,13 @@ Enumerations
-

Definition at line 68 of file cdcprolific.h.

+

Definition at line 68 of file cdcprolific.h.

- + +

◆ kDSR

+
@@ -770,11 +822,13 @@ Enumerations
-

Definition at line 69 of file cdcprolific.h.

+

Definition at line 69 of file cdcprolific.h.

- + +

◆ kRI

+
@@ -784,11 +838,13 @@ Enumerations
-

Definition at line 70 of file cdcprolific.h.

+

Definition at line 70 of file cdcprolific.h.

- + +

◆ kDCD

+
@@ -798,11 +854,13 @@ Enumerations
-

Definition at line 71 of file cdcprolific.h.

+

Definition at line 71 of file cdcprolific.h.

- + +

◆ kHandshakeInMask

+
@@ -812,11 +870,13 @@ Enumerations
-

Definition at line 72 of file cdcprolific.h.

+

Definition at line 72 of file cdcprolific.h.

- + +

◆ VENDOR_WRITE_REQUEST_TYPE

+
@@ -826,11 +886,13 @@ Enumerations
-

Definition at line 74 of file cdcprolific.h.

+

Definition at line 74 of file cdcprolific.h.

- + +

◆ VENDOR_WRITE_REQUEST

+
@@ -840,11 +902,13 @@ Enumerations
-

Definition at line 75 of file cdcprolific.h.

+

Definition at line 75 of file cdcprolific.h.

- + +

◆ VENDOR_READ_REQUEST_TYPE

+
@@ -854,11 +918,13 @@ Enumerations
-

Definition at line 77 of file cdcprolific.h.

+

Definition at line 77 of file cdcprolific.h.

- + +

◆ VENDOR_READ_REQUEST

+
@@ -868,11 +934,13 @@ Enumerations
-

Definition at line 78 of file cdcprolific.h.

+

Definition at line 78 of file cdcprolific.h.

- + +

◆ SET_DCR0

+
@@ -882,11 +950,13 @@ Enumerations
-

Definition at line 81 of file cdcprolific.h.

+

Definition at line 81 of file cdcprolific.h.

- + +

◆ GET_DCR0

+
@@ -896,11 +966,13 @@ Enumerations
-

Definition at line 82 of file cdcprolific.h.

+

Definition at line 82 of file cdcprolific.h.

- + +

◆ DCR0_INIT

+
@@ -910,11 +982,13 @@ Enumerations
-

Definition at line 83 of file cdcprolific.h.

+

Definition at line 83 of file cdcprolific.h.

- + +

◆ DCR0_INIT_H

+
@@ -924,11 +998,13 @@ Enumerations
-

Definition at line 84 of file cdcprolific.h.

+

Definition at line 84 of file cdcprolific.h.

- + +

◆ DCR0_INIT_X

+
@@ -938,11 +1014,13 @@ Enumerations
-

Definition at line 85 of file cdcprolific.h.

+

Definition at line 85 of file cdcprolific.h.

- + +

◆ SET_DCR1

+
@@ -952,11 +1030,13 @@ Enumerations
-

Definition at line 87 of file cdcprolific.h.

+

Definition at line 87 of file cdcprolific.h.

- + +

◆ GET_DCR1

+
@@ -966,11 +1046,13 @@ Enumerations
-

Definition at line 88 of file cdcprolific.h.

+

Definition at line 88 of file cdcprolific.h.

- + +

◆ DCR1_INIT_H

+
@@ -980,11 +1062,13 @@ Enumerations
-

Definition at line 89 of file cdcprolific.h.

+

Definition at line 89 of file cdcprolific.h.

- + +

◆ DCR1_INIT_X

+
@@ -994,11 +1078,13 @@ Enumerations
-

Definition at line 90 of file cdcprolific.h.

+

Definition at line 90 of file cdcprolific.h.

- + +

◆ SET_DCR2

+
@@ -1008,11 +1094,13 @@ Enumerations
-

Definition at line 92 of file cdcprolific.h.

+

Definition at line 92 of file cdcprolific.h.

- + +

◆ GET_DCR2

+
@@ -1022,11 +1110,13 @@ Enumerations
-

Definition at line 93 of file cdcprolific.h.

+

Definition at line 93 of file cdcprolific.h.

- + +

◆ DCR2_INIT_H

+
@@ -1036,11 +1126,13 @@ Enumerations
-

Definition at line 94 of file cdcprolific.h.

+

Definition at line 94 of file cdcprolific.h.

- + +

◆ DCR2_INIT_X

+
@@ -1050,11 +1142,13 @@ Enumerations
-

Definition at line 95 of file cdcprolific.h.

+

Definition at line 95 of file cdcprolific.h.

- + +

◆ RESET_DOWNSTREAM_DATA_PIPE

+
@@ -1064,11 +1158,13 @@ Enumerations
-

Definition at line 98 of file cdcprolific.h.

+

Definition at line 98 of file cdcprolific.h.

- + +

◆ RESET_UPSTREAM_DATA_PIPE

+
@@ -1078,11 +1174,13 @@ Enumerations
-

Definition at line 99 of file cdcprolific.h.

+

Definition at line 99 of file cdcprolific.h.

- + +

◆ PL_MAX_ENDPOINTS

+
@@ -1092,12 +1190,14 @@ Enumerations
-

Definition at line 102 of file cdcprolific.h.

+

Definition at line 102 of file cdcprolific.h.

Enumeration Type Documentation

- + +

◆ tXO_State

+
@@ -1107,23 +1207,20 @@ Enumerations
- - - - - + + + + +
Enumerator
kXOnSent  -
kXOffSent  -
kXO_Idle  -
kXOffNeeded  -
kXOnNeeded  -
Enumerator
kXOnSent 
kXOffSent 
kXO_Idle 
kXOffNeeded 
kXOnNeeded 
-

Definition at line 104 of file cdcprolific.h.

+

Definition at line 104 of file cdcprolific.h.

- + +

◆ pl2303_type

+
@@ -1133,21 +1230,15 @@ Enumerations
- - - - - - + + + + + +
Enumerator
unknown  -
type_0  -
type_1  -
rev_X  -
rev_HX  -
rev_H  -
Enumerator
unknown 
type_0 
type_1 
rev_X 
rev_HX 
rev_H 
-

Definition at line 112 of file cdcprolific.h.

+

Definition at line 112 of file cdcprolific.h.

@@ -1156,7 +1247,7 @@ Enumerations diff --git a/cdcprolific_8h__dep__incl.md5 b/cdcprolific_8h__dep__incl.md5 index 3f648651..c78552e9 100644 --- a/cdcprolific_8h__dep__incl.md5 +++ b/cdcprolific_8h__dep__incl.md5 @@ -1 +1 @@ -5601c68c5c5e913b421194d3f765f64d \ No newline at end of file +2a214c1fef9fd137dcc008a5d205d6e0 \ No newline at end of file diff --git a/cdcprolific_8h__dep__incl.png b/cdcprolific_8h__dep__incl.png index 38b579897502c4d99824ba8007b85ae6e4523af2..ffc64fe9a3e187a86d8913616cfdd8c3f33c666f 100644 GIT binary patch literal 3950 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 literal 3923 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 PSq8|tUTB3wR7rjM~ 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 ZGI+b1-=mOP*#8$CO;uf$I%R0Y{{eh!woCv3 literal 4491 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 diff --git a/cdcprolific_8h_source.html b/cdcprolific_8h_source.html index 81350929..1bb64d12 100644 --- a/cdcprolific_8h_source.html +++ b/cdcprolific_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: cdcprolific.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
- + - - + + + +
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
PL2303(USB *pusb, CDCAsyncOper *pasync)
Definition: cdcprolific.cpp:19
-
USB * pUsb
Definition: cdcacm.h:169
+
USB * pUsb
Definition: cdcacm.h:165
#define VENDOR_WRITE_REQUEST_TYPE
Definition: cdcprolific.h:74
#define VENDOR_READ_REQUEST
Definition: cdcprolific.h:78
tXO_State
Definition: cdcprolific.h:104
-
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
+
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:133
pl2303_type
Definition: cdcprolific.h:112
-
uint8_t bAddress
Definition: cdcacm.h:171
+
uint8_t bAddress
Definition: cdcacm.h:167
#define VENDOR_WRITE_REQUEST
Definition: cdcprolific.h:75
-
Definition: UsbCore.h:197
+
Definition: UsbCore.h:208
Definition: cdcacm.h:163
diff --git a/class_a_c_m-members.html b/class_a_c_m-members.html index deed73fc..3ecc3d05 100644 --- a/class_a_c_m-members.html +++ b/class_a_c_m-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
- + - - + + + +
EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)ACMvirtual enhanced_features(void)ACMinlinevirtual enhanced_status(void)ACMinlinevirtual - epDataInIndexACMprotectedstatic - epDataOutIndexACMprotectedstatic - epInfoACMprotected - epInterruptInIndexACMprotectedstatic + epDataInIndexACMstatic + epDataOutIndexACMstatic + epInfoACM + epInterruptInIndexACMstatic GetAddress()ACMinlinevirtual GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM GetLineCoding(LINE_CODING *dataptr)ACM @@ -142,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_a_c_m.html b/class_a_c_m.html index 0ee9a3fe..50d7d03e 100644 --- a/class_a_c_m.html +++ b/class_a_c_m.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: ACM Class Reference @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
- + - - + + + +
ACM Class Reference
@@ -186,6 +165,20 @@ Public Member Functions virtual bool DEVSUBCLASSOK (uint8_t subklass)   + + + +

+Public Attributes

EpInfo epInfo [ACM_MAX_ENDPOINTS]
 
+ + + + + + + +

+Static Public Attributes

static const uint8_t epDataInIndex = 1
 
static const uint8_t epDataOutIndex = 2
 
static const uint8_t epInterruptInIndex = 3
 
@@ -215,23 +208,14 @@ Protected Attributes - - -

Protected Member Functions

void PrintEndpointDescriptor (const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
 
tty_features _enhanced_status
 
EpInfo epInfo [ACM_MAX_ENDPOINTS]
 
- - - - - - -

-Static Protected Attributes

static const uint8_t epDataInIndex = 1
 
static const uint8_t epDataOutIndex = 2
 
static const uint8_t epInterruptInIndex = 3
 

Detailed Description

-

Definition at line 163 of file cdcacm.h.

+

Definition at line 163 of file cdcacm.h.

Constructor & Destructor Documentation

- + +

◆ ACM()

+
@@ -255,12 +239,14 @@ Static Protected Attributes
-

Definition at line 23 of file cdcacm.cpp.

+

Definition at line 23 of file cdcacm.cpp.

Member Function Documentation

- + +

◆ PrintEndpointDescriptor()

+
@@ -282,11 +268,13 @@ Static Protected Attributes
-

Definition at line 318 of file cdcacm.cpp.

+

Definition at line 352 of file cdcacm.cpp.

- + +

◆ SetCommFeature()

+
@@ -316,11 +304,13 @@ Static Protected Attributes
-

Definition at line 290 of file cdcacm.cpp.

+

Definition at line 296 of file cdcacm.cpp.

- + +

◆ GetCommFeature()

+
@@ -350,11 +340,13 @@ Static Protected Attributes
-

Definition at line 294 of file cdcacm.cpp.

+

Definition at line 304 of file cdcacm.cpp.

- + +

◆ ClearCommFeature()

+
@@ -368,11 +360,13 @@ Static Protected Attributes
-

Definition at line 298 of file cdcacm.cpp.

+

Definition at line 312 of file cdcacm.cpp.

- + +

◆ SetLineCoding()

+
@@ -386,11 +380,13 @@ Static Protected Attributes
-

Definition at line 302 of file cdcacm.cpp.

+

Definition at line 320 of file cdcacm.cpp.

- + +

◆ GetLineCoding()

+
@@ -404,11 +400,13 @@ Static Protected Attributes
-

Definition at line 306 of file cdcacm.cpp.

+

Definition at line 328 of file cdcacm.cpp.

- + +

◆ SetControlLineState()

+
@@ -422,11 +420,13 @@ Static Protected Attributes
-

Definition at line 310 of file cdcacm.cpp.

+

Definition at line 336 of file cdcacm.cpp.

- + +

◆ SendBreak()

+
@@ -440,11 +440,13 @@ Static Protected Attributes
-

Definition at line 314 of file cdcacm.cpp.

+

Definition at line 344 of file cdcacm.cpp.

- + +

◆ GetNotif()

+
@@ -470,7 +472,9 @@ Static Protected Attributes - + +

◆ RcvData()

+
@@ -494,11 +498,13 @@ Static Protected Attributes
-

Definition at line 282 of file cdcacm.cpp.

+

Definition at line 280 of file cdcacm.cpp.

- + +

◆ SndData()

+
@@ -522,11 +528,13 @@ Static Protected Attributes
-

Definition at line 286 of file cdcacm.cpp.

+

Definition at line 288 of file cdcacm.cpp.

- + +

◆ Init()

+
@@ -568,11 +576,13 @@ Static Protected Attributes

Reimplemented in PL2303.

-

Definition at line 46 of file cdcacm.cpp.

+

Definition at line 46 of file cdcacm.cpp.

- + +

◆ Release()

+
@@ -595,11 +605,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 259 of file cdcacm.cpp.

+

Definition at line 258 of file cdcacm.cpp.

- + +

◆ Poll()

+
@@ -622,11 +634,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 273 of file cdcacm.cpp.

+

Definition at line 272 of file cdcacm.cpp.

- + +

◆ available()

+
@@ -648,11 +662,13 @@ Static Protected Attributes
-

Definition at line 206 of file cdcacm.h.

+

Definition at line 205 of file cdcacm.h.

- + +

◆ GetAddress()

+
@@ -675,11 +691,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 210 of file cdcacm.h.

+

Definition at line 209 of file cdcacm.h.

- + +

◆ isReady()

+
@@ -700,11 +718,13 @@ Static Protected Attributes
-

Definition at line 214 of file cdcacm.h.

+

Definition at line 213 of file cdcacm.h.

- + +

◆ enhanced_status()

+
@@ -726,11 +746,13 @@ Static Protected Attributes
-

Definition at line 218 of file cdcacm.h.

+

Definition at line 217 of file cdcacm.h.

- + +

◆ enhanced_features()

+
@@ -754,11 +776,13 @@ Static Protected Attributes

Reimplemented in XR21B1411.

-

Definition at line 222 of file cdcacm.h.

+

Definition at line 221 of file cdcacm.h.

- + +

◆ autoflowRTS()

+
@@ -782,11 +806,13 @@ Static Protected Attributes

Reimplemented in XR21B1411.

-

Definition at line 233 of file cdcacm.h.

+

Definition at line 232 of file cdcacm.h.

- + +

◆ autoflowDSR()

+
@@ -810,11 +836,13 @@ Static Protected Attributes

Reimplemented in XR21B1411.

-

Definition at line 236 of file cdcacm.h.

+

Definition at line 235 of file cdcacm.h.

- + +

◆ autoflowXON()

+
@@ -838,11 +866,13 @@ Static Protected Attributes

Reimplemented in XR21B1411.

-

Definition at line 239 of file cdcacm.h.

+

Definition at line 238 of file cdcacm.h.

- + +

◆ half_duplex()

+
@@ -866,11 +896,13 @@ Static Protected Attributes

Reimplemented in XR21B1411.

-

Definition at line 242 of file cdcacm.h.

+

Definition at line 241 of file cdcacm.h.

- + +

◆ wide()

+
@@ -892,11 +924,13 @@ Static Protected Attributes
-

Definition at line 245 of file cdcacm.h.

+

Definition at line 244 of file cdcacm.h.

- + +

◆ EndpointXtract()

+
@@ -948,78 +982,14 @@ Static Protected Attributes

Reimplemented from UsbConfigXtracter.

-

Definition at line 231 of file cdcacm.cpp.

+

Definition at line 231 of file cdcacm.cpp.

Member Data Documentation

- -
-
-
- - - - -
- - - - -
const uint8_t ACM::epDataInIndex = 1
-
-staticprotected
-
+ +

◆ pUsb

-

Definition at line 165 of file cdcacm.h.

- -
-
- -
-
- - - - - -
- - - - -
const uint8_t ACM::epDataOutIndex = 2
-
-staticprotected
-
- -

Definition at line 166 of file cdcacm.h.

- -
-
- -
-
- - - - - -
- - - - -
const uint8_t ACM::epInterruptInIndex = 3
-
-staticprotected
-
- -

Definition at line 167 of file cdcacm.h.

- -
-
-
@@ -1037,11 +1007,13 @@ Static Protected Attributes
-

Definition at line 169 of file cdcacm.h.

+

Definition at line 165 of file cdcacm.h.

- + +

◆ pAsync

+
@@ -1059,11 +1031,13 @@ Static Protected Attributes
-

Definition at line 170 of file cdcacm.h.

+

Definition at line 166 of file cdcacm.h.

- + +

◆ bAddress

+
@@ -1081,11 +1055,13 @@ Static Protected Attributes
-

Definition at line 171 of file cdcacm.h.

+

Definition at line 167 of file cdcacm.h.

- + +

◆ bConfNum

+
@@ -1103,11 +1079,13 @@ Static Protected Attributes
-

Definition at line 172 of file cdcacm.h.

+

Definition at line 168 of file cdcacm.h.

- + +

◆ bControlIface

+
@@ -1125,11 +1103,13 @@ Static Protected Attributes
-

Definition at line 173 of file cdcacm.h.

+

Definition at line 169 of file cdcacm.h.

- + +

◆ bDataIface

+
@@ -1147,11 +1127,13 @@ Static Protected Attributes
-

Definition at line 174 of file cdcacm.h.

+

Definition at line 170 of file cdcacm.h.

- + +

◆ bNumEP

+
@@ -1169,11 +1151,13 @@ Static Protected Attributes
-

Definition at line 175 of file cdcacm.h.

+

Definition at line 171 of file cdcacm.h.

- + +

◆ qNextPollTime

+
@@ -1191,11 +1175,13 @@ Static Protected Attributes
-

Definition at line 176 of file cdcacm.h.

+

Definition at line 172 of file cdcacm.h.

- + +

◆ bPollEnable

+
@@ -1213,11 +1199,13 @@ Static Protected Attributes
-

Definition at line 177 of file cdcacm.h.

+

Definition at line 173 of file cdcacm.h.

- + +

◆ ready

+
@@ -1235,11 +1223,13 @@ Static Protected Attributes
-

Definition at line 178 of file cdcacm.h.

+

Definition at line 174 of file cdcacm.h.

- + +

◆ _enhanced_status

+
@@ -1257,11 +1247,13 @@ Static Protected Attributes
-

Definition at line 179 of file cdcacm.h.

+

Definition at line 175 of file cdcacm.h.

- + +

◆ epDataInIndex

+
@@ -1269,17 +1261,81 @@ Static Protected Attributes +static
- +
EpInfo ACM::epInfo[ACM_MAX_ENDPOINTS]const uint8_t ACM::epDataInIndex = 1
-protected
-

Definition at line 181 of file cdcacm.h.

+

Definition at line 180 of file cdcacm.h.

+ +
+
+ +

◆ epDataOutIndex

+ +
+
+ + + + + +
+ + + + +
const uint8_t ACM::epDataOutIndex = 2
+
+static
+
+ +

Definition at line 181 of file cdcacm.h.

+ +
+
+ +

◆ epInterruptInIndex

+ +
+
+ + + + + +
+ + + + +
const uint8_t ACM::epInterruptInIndex = 3
+
+static
+
+ +

Definition at line 182 of file cdcacm.h.

+ +
+
+ +

◆ epInfo

+ +
+
+ + + + +
EpInfo ACM::epInfo[ACM_MAX_ENDPOINTS]
+
+ +

Definition at line 183 of file cdcacm.h.

@@ -1292,7 +1348,7 @@ Static Protected Attributes diff --git a/class_a_c_m__coll__graph.md5 b/class_a_c_m__coll__graph.md5 index f43712cc..be335838 100644 --- a/class_a_c_m__coll__graph.md5 +++ b/class_a_c_m__coll__graph.md5 @@ -1 +1 @@ -587ce662854a9a2b4677918117ea2d18 \ No newline at end of file +38f287d7d437d8845cd9849dda3c4ebc \ 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 8544d30d0904ff2ef6b37be1bfbd0e647916f398..d08e029afd263d69feb512c0d275244c64f4906e 100644 GIT binary patch literal 23727 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 literal 24008 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 naqw^swF3gY|E@bN0unPGfKOTXP diff --git a/class_a_c_m__inherit__graph.md5 b/class_a_c_m__inherit__graph.md5 index 69d55cdc..f0237ac2 100644 --- a/class_a_c_m__inherit__graph.md5 +++ b/class_a_c_m__inherit__graph.md5 @@ -1 +1 @@ -1778af41b23c3b83c73bd88577cd17cc \ No newline at end of file +34233ca0a4afb6e0d20ee9a1d854c8cf \ 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 ff988c4b12b84472c1019e354a3ea482eeb3588e..863fa977be51dff7edbbe544dda5e88dd946fee4 100644 GIT binary patch literal 12659 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 literal 12723 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 diff --git a/class_a_d_k-members.html b/class_a_d_k-members.html index 13ffc9ca..33f16e4f 100644 --- a/class_a_d_k-members.html +++ b/class_a_d_k-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
- + - - + + + + - + - - + + + +

Detailed Description

-

Definition at line 53 of file adk.h.

+

Definition at line 53 of file adk.h.

Constructor & Destructor Documentation

- + +

◆ ADK()

+
@@ -235,12 +215,14 @@ Static Protected Attributes
-

Definition at line 25 of file adk.cpp.

+

Definition at line 25 of file adk.cpp.

Member Function Documentation

- + +

◆ PrintEndpointDescriptor()

+
@@ -262,11 +244,13 @@ Static Protected Attributes
-

Definition at line 357 of file adk.cpp.

+

Definition at line 357 of file adk.cpp.

- + +

◆ RcvData()

+
@@ -290,11 +274,13 @@ Static Protected Attributes
-

Definition at line 347 of file adk.cpp.

+

Definition at line 347 of file adk.cpp.

- + +

◆ SndData()

+
@@ -318,11 +304,13 @@ Static Protected Attributes
-

Definition at line 353 of file adk.cpp.

+

Definition at line 353 of file adk.cpp.

- + +

◆ ConfigureDevice()

+
@@ -362,11 +350,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 59 of file adk.cpp.

+

Definition at line 59 of file adk.cpp.

- + +

◆ Init()

+
@@ -406,11 +396,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 64 of file adk.cpp.

+

Definition at line 64 of file adk.cpp.

- + +

◆ Release()

+
@@ -433,11 +425,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 337 of file adk.cpp.

+

Definition at line 337 of file adk.cpp.

- + +

◆ Poll()

+
@@ -460,11 +454,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 103 of file adk.h.

+

Definition at line 103 of file adk.h.

- + +

◆ GetAddress()

+
@@ -487,11 +483,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 107 of file adk.h.

+

Definition at line 107 of file adk.h.

- + +

◆ isReady()

+
@@ -512,11 +510,13 @@ Static Protected Attributes
-

Definition at line 111 of file adk.h.

+

Definition at line 111 of file adk.h.

- + +

◆ VIDPIDOK()

+
@@ -550,11 +550,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 115 of file adk.h.

+

Definition at line 115 of file adk.h.

- + +

◆ EndpointXtract()

+
@@ -606,12 +608,14 @@ Static Protected Attributes

Reimplemented from UsbConfigXtracter.

-

Definition at line 312 of file adk.cpp.

+

Definition at line 312 of file adk.cpp.

Member Data Documentation

- + +

◆ epDataInIndex

+
@@ -629,11 +633,13 @@ Static Protected Attributes
-

Definition at line 69 of file adk.h.

+

Definition at line 69 of file adk.h.

- + +

◆ epDataOutIndex

+
@@ -651,11 +657,13 @@ Static Protected Attributes
-

Definition at line 70 of file adk.h.

+

Definition at line 70 of file adk.h.

- + +

◆ pUsb

+
@@ -673,11 +681,13 @@ Static Protected Attributes
-

Definition at line 73 of file adk.h.

+

Definition at line 73 of file adk.h.

- + +

◆ bAddress

+
@@ -695,11 +705,13 @@ Static Protected Attributes
-

Definition at line 74 of file adk.h.

+

Definition at line 74 of file adk.h.

- + +

◆ bConfNum

+
@@ -717,11 +729,13 @@ Static Protected Attributes
-

Definition at line 75 of file adk.h.

+

Definition at line 75 of file adk.h.

- + +

◆ bNumEP

+
@@ -739,11 +753,13 @@ Static Protected Attributes
-

Definition at line 77 of file adk.h.

+

Definition at line 77 of file adk.h.

- + +

◆ ready

+
@@ -761,11 +777,13 @@ Static Protected Attributes
-

Definition at line 78 of file adk.h.

+

Definition at line 78 of file adk.h.

- + +

◆ epInfo

+
@@ -783,7 +801,7 @@ Static Protected Attributes
-

Definition at line 81 of file adk.h.

+

Definition at line 81 of file adk.h.

@@ -796,7 +814,7 @@ Static Protected Attributes diff --git a/class_a_d_k__coll__graph.md5 b/class_a_d_k__coll__graph.md5 index 6e64816d..25bc8093 100644 --- a/class_a_d_k__coll__graph.md5 +++ b/class_a_d_k__coll__graph.md5 @@ -1 +1 @@ -677a6776b852e96bee247fd946d74be2 \ No newline at end of file +348104757e62d2b90a8ea7ecf8b2514d \ 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 db04a5dfba5407c0a6ae2d49dc84e76ce5ba7341..a8a123a6a3c232f363edcbf3d225604aaab498b9 100644 GIT binary patch literal 16673 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 BlNUfhbI~GOf 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 MrIn?AN|*%wA3CuKUH||9 diff --git a/class_a_d_k__inherit__graph.md5 b/class_a_d_k__inherit__graph.md5 index 55e30802..473c9f33 100644 --- a/class_a_d_k__inherit__graph.md5 +++ b/class_a_d_k__inherit__graph.md5 @@ -1 +1 @@ -bca330dbfb30c1761bf024a703ee6a77 \ No newline at end of file +5f518fcc911734c80c7fef9e0bbfcf11 \ 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 a3c46fda0508e21a06e2657dbc34f7c1f3907a66..748f40ddfa6d9ee0725a96962da10a5daf37a95c 100644 GIT binary patch literal 7649 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 diff --git a/class_address_pool-members.html b/class_address_pool-members.html index 63250730..3943f453 100644 --- a/class_address_pool-members.html +++ b/class_address_pool-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
- + - - + + + + - + - - + + + +

Detailed Description

-

Definition at line 83 of file address.h.

+

Definition at line 90 of file address.h.

Member Function Documentation

- + +

◆ GetUsbDevicePtr()

+
@@ -142,7 +122,9 @@ Public Member Functions - + +

◆ AllocAddress()

+
@@ -184,7 +166,9 @@ Public Member Functions - + +

◆ FreeAddress()

+
@@ -218,7 +202,7 @@ Public Member Functions diff --git a/class_address_pool__inherit__graph.md5 b/class_address_pool__inherit__graph.md5 index 67a01c56..01fc9bff 100644 --- a/class_address_pool__inherit__graph.md5 +++ b/class_address_pool__inherit__graph.md5 @@ -1 +1 @@ -1e8b44e83a78a2dc42bcafc432f2a436 \ No newline at end of file +555ffc408a79052867a3f670eda97a3c \ No newline at end of file diff --git a/class_address_pool__inherit__graph.png b/class_address_pool__inherit__graph.png index e9f3f0da07d5b6a690916268a53a7cf5da4d9d55..8c5c24adf7f127b73c201f7491c12f917397105c 100644 GIT binary patch literal 11612 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 literal 12002 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 x`3$t2mS diff --git a/class_address_pool_impl-members.html b/class_address_pool_impl-members.html index 367af086..245a09b9 100644 --- a/class_address_pool_impl-members.html +++ b/class_address_pool_impl-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
- + - - + + + + - + - - + + + +
class AddressPoolImpl< MAX_DEVICES_ALLOWED > -

Definition at line 96 of file address.h.

+

Definition at line 103 of file address.h.

Constructor & Destructor Documentation

- + +

◆ AddressPoolImpl()

+
@@ -153,12 +133,14 @@ template<const uint8_t MAX_DEVICES_ALLOWED>
-

Definition at line 164 of file address.h.

+

Definition at line 171 of file address.h.

Member Function Documentation

- + +

◆ GetUsbDevicePtr()

+
@@ -184,11 +166,13 @@ template<const uint8_t MAX_DEVICES_ALLOWED>

Implements AddressPool.

-

Definition at line 181 of file address.h.

+

Definition at line 188 of file address.h.

- + +

◆ ForEachUsbDevice()

+
@@ -212,11 +196,13 @@ template<const uint8_t MAX_DEVICES_ALLOWED>
-

Definition at line 192 of file address.h.

+

Definition at line 199 of file address.h.

- + +

◆ AllocAddress()

+
@@ -258,11 +244,13 @@ template<const uint8_t MAX_DEVICES_ALLOWED>

Implements AddressPool.

-

Definition at line 203 of file address.h.

+

Definition at line 210 of file address.h.

- + +

◆ FreeAddress()

+
@@ -288,7 +276,7 @@ template<const uint8_t MAX_DEVICES_ALLOWED>

Implements AddressPool.

-

Definition at line 255 of file address.h.

+

Definition at line 262 of file address.h.

@@ -300,7 +288,7 @@ template<const uint8_t MAX_DEVICES_ALLOWED>
diff --git a/class_address_pool_impl__coll__graph.md5 b/class_address_pool_impl__coll__graph.md5 index 77f1e07a..b9076984 100644 --- a/class_address_pool_impl__coll__graph.md5 +++ b/class_address_pool_impl__coll__graph.md5 @@ -1 +1 @@ -77bc5e9fa2748d39429df403e8aba060 \ No newline at end of file +0ccbc0934c894d97b943ba1fd85404e1 \ 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 81e28399a31071ca88f7d1b86f822c260c96b792..c74587b36df5d4455d74fe3bf2c68521208b4d39 100644 GIT binary patch literal 6940 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 cp(6=i{jPS+k_Y(#KfgfAZ#3j - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
- + - - + + + + diff --git a/class_b_t_d.html b/class_b_t_d.html index 2b7d8ef2..d3e8213b 100644 --- a/class_b_t_d.html +++ b/class_b_t_d.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: BTD Class Reference @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@ - + - - + + + +
- - + + @@ -290,9 +268,11 @@ Static Protected Attributes

Detailed Description

The Bluetooth Dongle class will take care of all the USB communication and then pass the data to the BluetoothService classes.

-

Definition at line 198 of file BTD.h.

+

Definition at line 201 of file BTD.h.

Constructor & Destructor Documentation

- + +

◆ BTD()

+

Public Attributes

bool watingForConnection
 
bool waitingForConnection
 
bool l2capConnectionClaimed
 
bool sdpConnectionClaimed
@@ -312,12 +292,14 @@ Static Protected Attributes -

Definition at line 27 of file BTD.cpp.

+

Definition at line 27 of file BTD.cpp.

Member Function Documentation

- + +

◆ ConfigureDevice()

+
@@ -366,11 +348,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 48 of file BTD.cpp.

+

Definition at line 48 of file BTD.cpp.

- + +

◆ Init()

+
@@ -419,11 +403,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 134 of file BTD.cpp.

+

Definition at line 134 of file BTD.cpp.

- + +

◆ Release()

+
@@ -447,11 +433,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 378 of file BTD.cpp.

+

Definition at line 376 of file BTD.cpp.

- + +

◆ Poll()

+
@@ -475,11 +463,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 384 of file BTD.cpp.

+

Definition at line 382 of file BTD.cpp.

- + +

◆ GetAddress()

+
@@ -503,11 +493,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 238 of file BTD.h.

+

Definition at line 241 of file BTD.h.

- + +

◆ isReady()

+
@@ -529,11 +521,13 @@ Static Protected Attributes

Used to check if the dongle has been initialized.

Returns
True if it's ready.
-

Definition at line 246 of file BTD.h.

+

Definition at line 249 of file BTD.h.

- + +

◆ DEVCLASSOK()

+
@@ -564,11 +558,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 255 of file BTD.h.

+

Definition at line 258 of file BTD.h.

- + +

◆ VIDPIDOK()

+
@@ -610,11 +606,13 @@ Static Protected Attributes

Reimplemented from USBDeviceConfig.

-

Definition at line 266 of file BTD.h.

+

Definition at line 269 of file BTD.h.

- + +

◆ EndpointXtract()

+
@@ -676,11 +674,13 @@ Static Protected Attributes

Reimplemented from UsbConfigXtracter.

-

Definition at line 327 of file BTD.cpp.

+

Definition at line 327 of file BTD.cpp.

- + +

◆ disconnect()

+
@@ -694,11 +694,13 @@ Static Protected Attributes

Disconnects both the L2CAP Channel and the HCI Connection for all Bluetooth services.

-

Definition at line 396 of file BTD.cpp.

+

Definition at line 394 of file BTD.cpp.

- + +

◆ registerBluetoothService()

+
@@ -727,11 +729,13 @@ Static Protected Attributes
Returns
The service ID on success or -1 on fail.
-

Definition at line 297 of file BTD.h.

+

Definition at line 300 of file BTD.h.

- + +

◆ HCI_Command()

+
@@ -762,11 +766,13 @@ Static Protected Attributes -

Definition at line 950 of file BTD.cpp.

+

Definition at line 948 of file BTD.cpp.

- + +

◆ hci_reset()

+
@@ -780,11 +786,13 @@ Static Protected Attributes

Reset the Bluetooth dongle.

-

Definition at line 955 of file BTD.cpp.

+

Definition at line 953 of file BTD.cpp.

- + +

◆ hci_read_bdaddr()

+
@@ -798,11 +806,13 @@ Static Protected Attributes

Read the Bluetooth address of the dongle.

-

Definition at line 986 of file BTD.cpp.

+

Definition at line 984 of file BTD.cpp.

- + +

◆ hci_read_local_version_information()

+
@@ -816,11 +826,13 @@ Static Protected Attributes

Read the HCI Version of the Bluetooth dongle.

-

Definition at line 995 of file BTD.cpp.

+

Definition at line 993 of file BTD.cpp.

- + +

◆ hci_set_local_name()

+
@@ -840,11 +852,13 @@ Static Protected Attributes -

Definition at line 1039 of file BTD.cpp.

+

Definition at line 1037 of file BTD.cpp.

- + +

◆ hci_write_scan_enable()

+
@@ -858,11 +872,13 @@ Static Protected Attributes

Enable visibility to other Bluetooth devices.

-

Definition at line 964 of file BTD.cpp.

+

Definition at line 962 of file BTD.cpp.

- + +

◆ hci_write_scan_disable()

+
@@ -876,11 +892,13 @@ Static Protected Attributes

Disable visibility to other Bluetooth devices.

-

Definition at line 977 of file BTD.cpp.

+

Definition at line 975 of file BTD.cpp.

- + +

◆ hci_remote_name()

+
@@ -894,11 +912,13 @@ Static Protected Attributes

Read the remote devices name.

-

Definition at line 1020 of file BTD.cpp.

+

Definition at line 1018 of file BTD.cpp.

- + +

◆ hci_accept_connection()

+
@@ -912,11 +932,13 @@ Static Protected Attributes

Accept the connection with the Bluetooth device.

-

Definition at line 1004 of file BTD.cpp.

+

Definition at line 1002 of file BTD.cpp.

- + +

◆ hci_disconnect()

+
@@ -936,11 +958,13 @@ Static Protected Attributes -

Definition at line 1173 of file BTD.cpp.

+

Definition at line 1171 of file BTD.cpp.

- + +

◆ hci_pin_code_request_reply()

+
@@ -954,11 +978,13 @@ Static Protected Attributes

Respond with the pin for the connection. The pin is automatically set for the Wii library, but can be customized for the SPP library.

-

Definition at line 1099 of file BTD.cpp.

+

Definition at line 1097 of file BTD.cpp.

- + +

◆ hci_pin_code_negative_request_reply()

+
@@ -972,11 +998,13 @@ Static Protected Attributes

Respons when no pin was set.

-

Definition at line 1135 of file BTD.cpp.

+

Definition at line 1133 of file BTD.cpp.

- + +

◆ hci_link_key_request_negative_reply()

+
@@ -990,11 +1018,13 @@ Static Protected Attributes

Command is used to reply to a Link Key Request event from the BR/EDR Controller if the Host does not have a stored Link Key for the connection.

-

Definition at line 1149 of file BTD.cpp.

+

Definition at line 1147 of file BTD.cpp.

- + +

◆ hci_authentication_request()

+
@@ -1008,11 +1038,13 @@ Static Protected Attributes

Used to try to authenticate with the remote device.

-

Definition at line 1163 of file BTD.cpp.

+

Definition at line 1161 of file BTD.cpp.

- + +

◆ hci_inquiry()

+
@@ -1026,11 +1058,13 @@ Static Protected Attributes

Start a HCI inquiry.

-

Definition at line 1051 of file BTD.cpp.

+

Definition at line 1049 of file BTD.cpp.

- + +

◆ hci_inquiry_cancel()

+
@@ -1044,11 +1078,13 @@ Static Protected Attributes

Cancel a HCI inquiry.

-

Definition at line 1065 of file BTD.cpp.

+

Definition at line 1063 of file BTD.cpp.

- + +

◆ hci_connect() [1/2]

+
@@ -1062,11 +1098,13 @@ Static Protected Attributes

Connect to last device communicated with.

-

Definition at line 1073 of file BTD.cpp.

+

Definition at line 1071 of file BTD.cpp.

- + +

◆ hci_connect() [2/2]

+
@@ -1086,11 +1124,13 @@ Static Protected Attributes -

Definition at line 1077 of file BTD.cpp.

+

Definition at line 1075 of file BTD.cpp.

- + +

◆ hci_write_class_of_device()

+
@@ -1104,11 +1144,13 @@ Static Protected Attributes

Used to a set the class of the device.

-

Definition at line 1185 of file BTD.cpp.

+

Definition at line 1183 of file BTD.cpp.

- + +

◆ L2CAP_Command()

+
@@ -1159,11 +1201,13 @@ Static Protected Attributes -

Definition at line 1221 of file BTD.cpp.

+

Definition at line 1219 of file BTD.cpp.

- + +

◆ l2cap_connection_request()

+
@@ -1208,11 +1252,13 @@ Static Protected Attributes -

Definition at line 1249 of file BTD.cpp.

+

Definition at line 1247 of file BTD.cpp.

- + +

◆ l2cap_connection_response()

+
@@ -1264,11 +1310,13 @@ Static Protected Attributes -

Definition at line 1262 of file BTD.cpp.

+

Definition at line 1260 of file BTD.cpp.

- + +

◆ l2cap_config_request()

+
@@ -1306,11 +1354,13 @@ Static Protected Attributes -

Definition at line 1279 of file BTD.cpp.

+

Definition at line 1277 of file BTD.cpp.

- + +

◆ l2cap_config_response()

+
@@ -1348,11 +1398,13 @@ Static Protected Attributes -

Definition at line 1296 of file BTD.cpp.

+

Definition at line 1294 of file BTD.cpp.

- + +

◆ l2cap_disconnection_request()

+
@@ -1397,11 +1449,13 @@ Static Protected Attributes -

Definition at line 1315 of file BTD.cpp.

+

Definition at line 1313 of file BTD.cpp.

- + +

◆ l2cap_disconnection_response()

+
@@ -1446,11 +1500,13 @@ Static Protected Attributes -

Definition at line 1328 of file BTD.cpp.

+

Definition at line 1326 of file BTD.cpp.

- + +

◆ l2cap_information_response()

+
@@ -1494,11 +1550,13 @@ Static Protected Attributes -

Definition at line 1341 of file BTD.cpp.

+

Definition at line 1339 of file BTD.cpp.

- + +

◆ pairWithWiimote()

+
@@ -1520,11 +1578,13 @@ Static Protected Attributes

Call this function to pair with a Wiimote

-

Definition at line 464 of file BTD.h.

+

Definition at line 467 of file BTD.h.

- + +

◆ pairWithHID()

+
@@ -1544,13 +1604,15 @@ Static Protected Attributes
-

Call this function to pair with a Wiimote

+

Call this function to pair with a HID device

-

Definition at line 480 of file BTD.h.

+

Definition at line 483 of file BTD.h.

- + +

◆ readPollInterval()

+
@@ -1572,11 +1634,13 @@ Static Protected Attributes

Read the poll interval taken from the endpoint descriptors.

Returns
The poll interval in ms.
-

Definition at line 495 of file BTD.h.

+

Definition at line 499 of file BTD.h.

- + +

◆ PrintEndpointDescriptor()

+
@@ -1604,27 +1668,31 @@ Static Protected Attributes -

Definition at line 359 of file BTD.cpp.

+

Definition at line 357 of file BTD.cpp.

Member Data Documentation

- + +

◆ waitingForConnection

+
- +
bool BTD::watingForConnectionbool BTD::waitingForConnection

Use this to see if it is waiting for a incoming connection.

-

Definition at line 435 of file BTD.h.

+

Definition at line 438 of file BTD.h.

- + +

◆ l2capConnectionClaimed

+
@@ -1635,11 +1703,13 @@ Static Protected Attributes

This is used by the service to know when to store the device information.

-

Definition at line 437 of file BTD.h.

+

Definition at line 440 of file BTD.h.

- + +

◆ sdpConnectionClaimed

+
@@ -1650,11 +1720,13 @@ Static Protected Attributes

This is used by the SPP library to claim the current SDP incoming request.

-

Definition at line 439 of file BTD.h.

+

Definition at line 442 of file BTD.h.

- + +

◆ rfcommConnectionClaimed

+
@@ -1665,11 +1737,13 @@ Static Protected Attributes

This is used by the SPP library to claim the current RFCOMM incoming request.

-

Definition at line 441 of file BTD.h.

+

Definition at line 444 of file BTD.h.

- + +

◆ btdName

+
@@ -1680,11 +1754,13 @@ Static Protected Attributes

The name you wish to make the dongle show up as. It is set automatically by the SPP library.

-

Definition at line 444 of file BTD.h.

+

Definition at line 447 of file BTD.h.

- + +

◆ btdPin

+
@@ -1695,11 +1771,13 @@ Static Protected Attributes

The pin you wish to make the dongle use for authentication. It is set automatically by the SPP and BTHID library.

-

Definition at line 446 of file BTD.h.

+

Definition at line 449 of file BTD.h.

- + +

◆ my_bdaddr

+
@@ -1710,11 +1788,13 @@ Static Protected Attributes

The bluetooth dongles Bluetooth address.

-

Definition at line 449 of file BTD.h.

+

Definition at line 452 of file BTD.h.

- + +

◆ hci_handle

+
@@ -1725,11 +1805,13 @@ Static Protected Attributes

HCI handle for the last connection.

-

Definition at line 451 of file BTD.h.

+

Definition at line 454 of file BTD.h.

- + +

◆ disc_bdaddr

+
@@ -1740,11 +1822,13 @@ Static Protected Attributes

Last incoming devices Bluetooth address.

-

Definition at line 453 of file BTD.h.

+

Definition at line 456 of file BTD.h.

- + +

◆ remote_name

+
@@ -1755,11 +1839,13 @@ Static Protected Attributes

First 30 chars of last remote name.

-

Definition at line 455 of file BTD.h.

+

Definition at line 458 of file BTD.h.

- + +

◆ hci_version

+
@@ -1770,11 +1856,13 @@ Static Protected Attributes

The supported HCI Version read from the Bluetooth dongle. Used by the PS3BT library to check the HCI Version of the Bluetooth dongle, it should be at least 3 to work properly with the library.

-

Definition at line 461 of file BTD.h.

+

Definition at line 464 of file BTD.h.

- + +

◆ connectToWii

+
@@ -1785,11 +1873,13 @@ Static Protected Attributes

Used to only send the ACL data to the Wiimote.

-

Definition at line 467 of file BTD.h.

+

Definition at line 470 of file BTD.h.

- + +

◆ incomingWii

+
@@ -1800,11 +1890,13 @@ Static Protected Attributes

True if a Wiimote is connecting.

-

Definition at line 471 of file BTD.h.

+

Definition at line 474 of file BTD.h.

- + +

◆ pairWithWii

+
@@ -1815,11 +1907,13 @@ Static Protected Attributes

True when it should pair with a Wiimote.

-

Definition at line 473 of file BTD.h.

+

Definition at line 476 of file BTD.h.

- + +

◆ motionPlusInside

+
@@ -1830,11 +1924,13 @@ Static Protected Attributes

True if it's the new Wiimote with the Motion Plus Inside or a Wii U Pro Controller.

-

Definition at line 475 of file BTD.h.

+

Definition at line 478 of file BTD.h.

- + +

◆ wiiUProController

+
@@ -1845,11 +1941,13 @@ Static Protected Attributes

True if it's a Wii U Pro Controller.

-

Definition at line 477 of file BTD.h.

+

Definition at line 480 of file BTD.h.

- + +

◆ connectToHIDDevice

+
@@ -1858,13 +1956,15 @@ Static Protected Attributes
-

Used to only send the ACL data to the Wiimote.

+

Used to only send the ACL data to the HID device.

-

Definition at line 483 of file BTD.h.

+

Definition at line 487 of file BTD.h.

- + +

◆ incomingHIDDevice

+
@@ -1873,13 +1973,15 @@ Static Protected Attributes
-

True if a Wiimote is connecting.

+

True if a HID device is connecting.

-

Definition at line 487 of file BTD.h.

+

Definition at line 491 of file BTD.h.

- + +

◆ pairWithHIDDevice

+
@@ -1890,11 +1992,13 @@ Static Protected Attributes

True when it should pair with a device like a mouse or keyboard.

-

Definition at line 489 of file BTD.h.

+

Definition at line 493 of file BTD.h.

- + +

◆ pUsb

+
@@ -1913,11 +2017,13 @@ Static Protected Attributes

Pointer to USB class instance.

-

Definition at line 497 of file BTD.h.

+

Definition at line 501 of file BTD.h.

- + +

◆ bAddress

+
@@ -1936,11 +2042,13 @@ Static Protected Attributes

Device address.

-

Definition at line 503 of file BTD.h.

+

Definition at line 507 of file BTD.h.

- + +

◆ epInfo

+
@@ -1959,11 +2067,13 @@ Static Protected Attributes

Endpoint info structure.

-

Definition at line 505 of file BTD.h.

+

Definition at line 509 of file BTD.h.

- + +

◆ bConfNum

+
@@ -1982,11 +2092,13 @@ Static Protected Attributes

Configuration number.

-

Definition at line 508 of file BTD.h.

+

Definition at line 512 of file BTD.h.

- + +

◆ bNumEP

+
@@ -2005,11 +2117,13 @@ Static Protected Attributes

Total number of endpoints in the configuration.

-

Definition at line 510 of file BTD.h.

+

Definition at line 514 of file BTD.h.

- + +

◆ qNextPollTime

+
@@ -2028,11 +2142,13 @@ Static Protected Attributes

Next poll time based on poll interval taken from the USB descriptor.

-

Definition at line 512 of file BTD.h.

+

Definition at line 516 of file BTD.h.

- + +

◆ BTD_CONTROL_PIPE

+
@@ -2051,11 +2167,13 @@ Static Protected Attributes

Bluetooth dongle control endpoint.

-

Definition at line 515 of file BTD.h.

+

Definition at line 519 of file BTD.h.

- + +

◆ BTD_EVENT_PIPE

+
@@ -2074,11 +2192,13 @@ Static Protected Attributes

HCI event endpoint index.

-

Definition at line 517 of file BTD.h.

+

Definition at line 521 of file BTD.h.

- + +

◆ BTD_DATAIN_PIPE

+
@@ -2097,11 +2217,13 @@ Static Protected Attributes

ACL In endpoint index.

-

Definition at line 519 of file BTD.h.

+

Definition at line 523 of file BTD.h.

- + +

◆ BTD_DATAOUT_PIPE

+
@@ -2120,7 +2242,7 @@ Static Protected Attributes

ACL Out endpoint index.

-

Definition at line 521 of file BTD.h.

+

Definition at line 525 of file BTD.h.

@@ -2133,7 +2255,7 @@ Static Protected Attributes diff --git a/class_b_t_d__coll__graph.md5 b/class_b_t_d__coll__graph.md5 index 7288133e..6b850d5b 100644 --- a/class_b_t_d__coll__graph.md5 +++ b/class_b_t_d__coll__graph.md5 @@ -1 +1 @@ -e72568841cb2f05e3bfabb29e1ce8457 \ No newline at end of file +d30fe5eedeff8ac785a92b5f99c8d16d \ 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 fccee6447a106d7dc89c88fe494e264c5ce4c519..35f6912128adfcf5b09ca55351ab09afa4e3181b 100644 GIT binary patch literal 16519 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 Jg^0fY{{eK9rGNkc diff --git a/class_b_t_d__inherit__graph.md5 b/class_b_t_d__inherit__graph.md5 index 95bb3a3b..bf83e9fe 100644 --- a/class_b_t_d__inherit__graph.md5 +++ b/class_b_t_d__inherit__graph.md5 @@ -1 +1 @@ -36ee382408a95d482da81524513435df \ No newline at end of file +cc3b5af420b1b442f97eb1e44ba768a6 \ 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 e847ffd32d196ac09af2a083dfd562ff52f39e59..54fca8b336d15c8948411b0e02b50a3da4cbddf4 100644 GIT binary patch literal 7476 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 D*XcT- diff --git a/class_b_t_h_i_d-members.html b/class_b_t_h_i_d-members.html index d2b57a60..c0b6d610 100644 --- a/class_b_t_h_i_d-members.html +++ b/class_b_t_h_i_d-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
- + - - + + + + - + - - + + + +

Detailed Description

This BluetoothService class implements support for Bluetooth HID devices.

-

Definition at line 29 of file BTHID.h.

+

Definition at line 29 of file BTHID.h.

Constructor & Destructor Documentation

- + +

◆ BTHID()

+
@@ -234,12 +214,14 @@ BluetoothService implementation -

Definition at line 23 of file BTHID.cpp.

+

Definition at line 23 of file BTHID.cpp.

Member Function Documentation

- + +

◆ disconnect()

+
@@ -263,11 +245,13 @@ BluetoothService implementation

Implements BluetoothService.

-

Definition at line 49 of file BTHID.cpp.

+

Definition at line 49 of file BTHID.cpp.

- + +

◆ GetReportParser()

+
@@ -296,11 +280,13 @@ BluetoothService implementation
Returns
Returns the corresponding HIDReportParser. Returns NULL if id is not valid.
-

Definition at line 49 of file BTHID.h.

+

Definition at line 49 of file BTHID.h.

- + +

◆ SetReportParser()

+
@@ -340,11 +326,13 @@ BluetoothService implementation
Returns
Returns true if the HIDReportParser is set. False otherwise.
-

Definition at line 61 of file BTHID.h.

+

Definition at line 61 of file BTHID.h.

- + +

◆ setProtocolMode()

+
@@ -372,11 +360,13 @@ BluetoothService implementation -

Definition at line 72 of file BTHID.h.

+

Definition at line 72 of file BTHID.h.

- + +

◆ setLeds() [1/2]

+
@@ -404,11 +394,13 @@ BluetoothService implementation -

Definition at line 81 of file BTHID.h.

+

Definition at line 81 of file BTHID.h.

- + +

◆ setLeds() [2/2]

+
@@ -428,11 +420,13 @@ BluetoothService implementation -

Definition at line 393 of file BTHID.cpp.

+

Definition at line 393 of file BTHID.cpp.

- + +

◆ pair()

+
@@ -455,11 +449,13 @@ BluetoothService implementation

Call this to start the pairing sequence with a device

-

Definition at line 91 of file BTHID.h.

+

Definition at line 91 of file BTHID.h.

- + +

◆ ACLData()

+
@@ -489,11 +485,13 @@ BluetoothService implementation

Implements BluetoothService.

-

Definition at line 56 of file BTHID.cpp.

+

Definition at line 56 of file BTHID.cpp.

- + +

◆ Run()

+
@@ -517,11 +515,13 @@ BluetoothService implementation

Implements BluetoothService.

-

Definition at line 344 of file BTHID.cpp.

+

Definition at line 344 of file BTHID.cpp.

- + +

◆ Reset()

+
@@ -545,11 +545,13 @@ BluetoothService implementation

Implements BluetoothService.

-

Definition at line 41 of file BTHID.cpp.

+

Definition at line 41 of file BTHID.cpp.

- + +

◆ onInit()

+
@@ -573,11 +575,13 @@ BluetoothService implementation

Implements BluetoothService.

-

Definition at line 112 of file BTHID.h.

+

Definition at line 112 of file BTHID.h.

- + +

◆ ParseBTHIDData()

+
@@ -618,11 +622,13 @@ BluetoothService implementation

Reimplemented in PS4BT.

-

Definition at line 125 of file BTHID.h.

+

Definition at line 125 of file BTHID.h.

- + +

◆ OnInitBTHID()

+
@@ -646,11 +652,13 @@ BluetoothService implementation

Reimplemented in PS4BT.

-

Definition at line 129 of file BTHID.h.

+

Definition at line 129 of file BTHID.h.

- + +

◆ ResetBTHID()

+
@@ -674,12 +682,14 @@ BluetoothService implementation

Reimplemented in PS4BT.

-

Definition at line 133 of file BTHID.h.

+

Definition at line 133 of file BTHID.h.

Member Data Documentation

- + +

◆ connected

+
@@ -690,11 +700,13 @@ BluetoothService implementation

True if a device is connected

-

Definition at line 88 of file BTHID.h.

+

Definition at line 88 of file BTHID.h.

- + +

◆ control_scid

+
@@ -713,11 +725,13 @@ BluetoothService implementation

L2CAP source CID for HID_Control

-

Definition at line 139 of file BTHID.h.

+

Definition at line 139 of file BTHID.h.

- + +

◆ interrupt_scid

+
@@ -736,7 +750,7 @@ BluetoothService implementation

L2CAP source CID for HID_Interrupt

-

Definition at line 142 of file BTHID.h.

+

Definition at line 142 of file BTHID.h.

@@ -749,7 +763,7 @@ BluetoothService implementation diff --git a/class_b_t_h_i_d__coll__graph.md5 b/class_b_t_h_i_d__coll__graph.md5 index b8a6fc7c..996a40fc 100644 --- a/class_b_t_h_i_d__coll__graph.md5 +++ b/class_b_t_h_i_d__coll__graph.md5 @@ -1 +1 @@ -328440863f58d32544996d4a0a7788ae \ No newline at end of file +e6ad60679e1606b380d672df2dfdcf2c \ 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 76ed39710e46aa3ba76034c5bcd4b5f4b1613d34..1f7b2e4ab67926a315e11c89c4d4d349387017be 100644 GIT binary patch literal 23312 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 literal 22478 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

vK2rQH50HaOET< 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 Y1@R}}A19ZIGQpRLfyKcxeM;EB0ClsNI{*Lx diff --git a/class_b_t_h_i_d__inherit__graph.md5 b/class_b_t_h_i_d__inherit__graph.md5 index d99946b7..d58d7c11 100644 --- a/class_b_t_h_i_d__inherit__graph.md5 +++ b/class_b_t_h_i_d__inherit__graph.md5 @@ -1 +1 @@ -0461eab4196d51bce1337c7c83a0da9f \ No newline at end of file +73f12b410d2c8d19939b12cd5c431b1f \ 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 2df7f9ccecdb6cccba41e5d46b8b43fb6b2f8bca..af60699ec9a139ad18bae097d28adf31a4a0ca22 100644 GIT binary patch literal 5419 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 HCHlVr2Z2#> diff --git a/class_bluetooth_service-members.html b/class_bluetooth_service-members.html index b0a89b3e..5fac88ee 100644 --- a/class_bluetooth_service-members.html +++ b/class_bluetooth_service-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

- + - - + + + + - + - - + + + +

Detailed Description

All Bluetooth services should inherit this class.

-

Definition at line 565 of file BTD.h.

+

Definition at line 569 of file BTD.h.

Constructor & Destructor Documentation

- + +

◆ BluetoothService()

+
@@ -183,12 +163,14 @@ Protected Attributes
-

Definition at line 567 of file BTD.h.

+

Definition at line 571 of file BTD.h.

Member Function Documentation

- + +

◆ ACLData()

+
@@ -220,7 +202,9 @@ Protected Attributes - + +

◆ Run()

+
@@ -246,7 +230,9 @@ Protected Attributes - + +

◆ Reset()

+
@@ -272,7 +258,9 @@ Protected Attributes - + +

◆ disconnect()

+
@@ -298,7 +286,9 @@ Protected Attributes - + +

◆ attachOnInit()

+
@@ -326,11 +316,13 @@ Protected Attributes -

Definition at line 587 of file BTD.h.

+

Definition at line 591 of file BTD.h.

- + +

◆ onInit()

+
@@ -356,7 +348,9 @@ Protected Attributes - + +

◆ checkHciHandle()

+
@@ -389,12 +383,14 @@ Protected Attributes

Used to check if the incoming L2CAP data matches the HCI Handle

-

Definition at line 600 of file BTD.h.

+

Definition at line 604 of file BTD.h.

Member Data Documentation

- + +

◆ pFuncOnInit

+
@@ -413,11 +409,13 @@ Protected Attributes

Pointer to function called in onInit().

-

Definition at line 605 of file BTD.h.

+

Definition at line 609 of file BTD.h.

- + +

◆ pBtd

+
@@ -436,11 +434,13 @@ Protected Attributes

Pointer to BTD instance.

-

Definition at line 608 of file BTD.h.

+

Definition at line 612 of file BTD.h.

- + +

◆ hci_handle

+
@@ -459,11 +459,13 @@ Protected Attributes

The HCI Handle for the connection.

-

Definition at line 611 of file BTD.h.

+

Definition at line 615 of file BTD.h.

- + +

◆ l2cap_event_flag

+
@@ -482,11 +484,13 @@ Protected Attributes

L2CAP flags of received Bluetooth events.

-

Definition at line 614 of file BTD.h.

+

Definition at line 618 of file BTD.h.

- + +

◆ identifier

+
@@ -505,7 +509,7 @@ Protected Attributes

Identifier for L2CAP commands.

-

Definition at line 617 of file BTD.h.

+

Definition at line 621 of file BTD.h.

@@ -517,7 +521,7 @@ Protected Attributes diff --git a/class_bluetooth_service__coll__graph.md5 b/class_bluetooth_service__coll__graph.md5 index c59d7e12..490b9a94 100644 --- a/class_bluetooth_service__coll__graph.md5 +++ b/class_bluetooth_service__coll__graph.md5 @@ -1 +1 @@ -63004da77f15c2792f7eb5740b2b02f1 \ No newline at end of file +4848ab684b54b7ac5bf7a1f2400768da \ No newline at end of file diff --git a/class_bluetooth_service__coll__graph.png b/class_bluetooth_service__coll__graph.png index acd45b9a4320c01ef297b185ea867b6f63d0d93b..da585752443e6d16a08586ef9f6ad99e42fffb23 100644 GIT binary patch literal 20915 zcmeGEQ*>or7d4E=c2Y4bwr#s&yJA$ODz35dx7G6IOKrJpthEomNs8jJ)a!Kn{mh3< z%S2T-BO@E~M;185vV^@A^LT$cP_8lT6`C{)x|WP& z5^Xt51@6Lwh>MFe+3E|ld%m@_g_vae;(K#2X+7}!_wU^;F(2Gqbd;<(5ZK44p2O+< zy)5_hD?KnUuKh;qMVY}U0&uS2)Ja_SzOnk9`2SiCD&*tG1OgYU^`yWN&V;IK-_B+*&6M;|Z|7pqrl zvp5_ouH1Ehyz4MkZiZ53#kk!aFI5o)(-9_>HM5tL_P2Ihc0xz*;j7) zWt494;y;?qI9lEPPSffB(9~Ta`Sa&mo7(lkB%^#f$NZ7=WzILRr#&qG5^^>+)eRok z>w=Dlb@z$&Th~MyHIv<;*wXc#zX&Kjc`N@Lr%hR~+S*#p*A2}!hfJsDCmvOiR+B{8Vz=*I2EMYh;KmK&JU*et&j+sv-H z9%M?KEL2AR`6K3ev}B$=zqL@Mw?d_u<1<}tAUIpz{~_S{j4d9H>DY1)T*hg&Kj26J zVVmO<$k%SP8VE(F#D69J7*bJHO*ngQ`mu7`7)<2#PqA-hs~8uQ!~2M!LaSaP*d7?> z+YYFeH*DA@eAaGYz}_W^>-}n!@+Ahs8M_W+ND7y5n%CXRt8OzPw|acR5ex4ug}J=n zJ%SIA2zX4W~(`znr*XVDHRBf=gZWdU*}3yo;^mB=$}_#S&at} z@@{A1U-^L5$Q4itAx^4fYmP` za*PCbj#Vx};kK1X
  • Y>XI)DVKccaMA{9Rk!3&#_0B#Jgc88<9 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 literal 20220 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 diff --git a/class_bluetooth_service__inherit__graph.md5 b/class_bluetooth_service__inherit__graph.md5 index 89adea58..63b5ecd4 100644 --- a/class_bluetooth_service__inherit__graph.md5 +++ b/class_bluetooth_service__inherit__graph.md5 @@ -1 +1 @@ -ed04eb4acfc3583220d1627fb69bac21 \ No newline at end of file +b3a86935fe164ef9bcd701cb63ba4e37 \ No newline at end of file diff --git a/class_bluetooth_service__inherit__graph.png b/class_bluetooth_service__inherit__graph.png index 5723a86546421294e9a5dc599ccc42b61c3b3e27..886abc94765b124b426bc5b7d494f944af1d431e 100644 GIT binary patch literal 11017 zcmeHtRaab1v@QDKt|3U{u7ThV!QCOa1rOG^JA~lwt^tAumxkaj!QI_m&gPE$7tY&x z0mf!mb#+y(wdR_0Mkp&vp&=6?LqS2I$w*76LP0?@0)ICl{s;V&b#vzdenC5{N{K;L zjS(L}K`}sNBt+HSp-=P?QgQp{+EH4i{~H9gz~RXRVyja{(&Yw%WK?jG^1CPza4?dX zRC;hEeS6{Vp+p1yWtHv`-&azHE(gPYJ=#`(0=16xnw38^P$8DNHW4dGnE>IFs*qL%i-kcu`GUq z#>>Lo0rK;|9~~yT0$?e%0_f;Xa0p)@31EHOQ%=CQ>CU~ zK}${?K4AZg$N)pjlae(nVlNtun5N_O?3A)7s09nNHuCf}VG#w!F~~nwW7(yFQynwh z9?tADTg%h9$`d>a{={m#7s>bs4zt|tZ8Oj9I4L@MdYLp)`81A@#ReOxre&un%4~i6 zu}og^1X`tH7X23G$Lj;M3fI?Xk92m^|6X37&JuZ@Ey}+(a|oVy!6wowkwWhCJhKJ8 zl7*g*KlR9ye8;uKfRm`Ll@cy&#;?$-E@swiR4$fJn_;D<4xy1x74dnzR`D=wbC0ta z%e0EjJCI{-m-xtSFYlZs{CaOn#BHBBgdlN!(zG^pbMz1GsvUen6)XZ0}1M>*YV}-8?tdov&h;4R%YK zE1frUde2*vXO{Us>nf5fzWN zhusWMm&eU0R`uslw2$TF8zCqJ>V(p0a7a_mV327&{Fqj|C}()n_YE=YsX`>5`;D-f zdMh;;qyzhrRQB=}sh`9uC(vml>0CBn z#s%+)?dEH`v1qt=DM0Z_&F)_~x%ZuD6w(V1zaP%f>o!;?O|||xDg`0=4`h;L-(a{s z-(See!sLmNahmiZ60sTiw@~7jn4L%KhtWvud1tv(wK0 zY3mtHVOVeY-sR3PPNB@oLwVDx#r~~GeP1M=8f0uVgS*08Bv&qlMZ+8h0h4U`Vyi#N zC31uF+V5!YmzwyI^=x_B25o39NPY&13hk?iMVDA+GmrwzS+cRl(a5NMV@ugG)3_Z- z18`wnV;e#2qK{qQQKhFUf;SNQE&O;XYe)Qv_ekb1c{t`tSUsyRjEqM53VSihQTT%wUVD)gh!{Aqs0nws6<lX71zVWBcAHG8skq)O_c^69?n*%m8ll(PZi0jm#I=q z_QulmrN#J5Ywns7{U*McTsNH|DTGJu^u6Ce2&7scKH#I7?E5KQWIfwK2mbO5>ZQ59 z;cz7Q_)w=Rd;8z+)GL%A1yb zUneev0GC}e%I0}!Xu9AF(Jcg3e;p`!R1xB_Dx>beNauq@;vb{J}PF^0GB@QPiPaXIim{8chtO-Badm$m?6S97~0>_96PJDf-s%=1p!y{c=!_<|v*k%dEP2F5UqC7F|GZ0OoSn?Sk%x0kSbkcEBK^5|FNRU+4oWK zFfbb3_=olOY1@_J;Y?XVIc+%c4)}Op1&x4R{Ey8)7O|zge?7t|^MNal{Ul#>A`FSJ zVn^?$5OXyKe?P2NRCib(_-amwidKi@{cMF`VnO(W#mBdV1jKdc4G;K8_rdF77_%$B zNUyPNBA%z_qMbn;%XZDnM+L$`n6U(i71D7Oq&JsZ4uUyG)u1oZ@*sV;ur#e$&PDX$ zMRu{u%p!Xu6g>_`Uha-lMF-WXar2)Vom;gWv=bOw$ z0EiF?M?};KLCmDWfrAS;rvRDZ8MGB~ep!EXjXudx{kQ!9yE8@ouSoQDQ_kI%0)!0y zcz5)Zgg-D_A6d$I9-NqRzP$dS#-`1dI!*x><}D|TIzlcv)AA~W$@U0O+pfv3b)=Q6 zuz>$e{xZYp?X^Naw0GD5+hb6r9KK^M7%LKr(a$k}98`=Fuz`E44d&%$BPWj|pxQH5 z3uyBm?eBa(Ors-N;yu|pcy>tI@d7~=DdnU^{9;c~r(jh}!zSoqh1zqRjjdABPb5%4m;*O=KchxD=9%t9(n-Oy96!`q zSHN@|k7rv80MC-$%-wm7TcnxhyrnTBqS4t#bg18&7c28Ik?ux=NBkUYV%_OA3Ft=-nuJ3C7UVi0>$ z?==K@_KD~=J6oE|J&@WqWVP^SliItyyxc)-?|A}>^5r7$`CQ9Kmnz}h+-)v4+ZV*1 z%PB@e(a!d$ImUn2@A(ivOiB%VxCQf)s^%yf{L!q`4z`|alQGyCTB*AHT;6%V01JKA zZWr??!_4#rM7=|SGp>oClE)*h^hE-Gkb#~)?yl+(lTGE9L3q5EEKUF$)DWMo|Ke^$F z`$CI-_CpASiVb}qAch)L0%E}BlSFiH#a(K!A(^8zztC1z8G>}urhE{z9iNL~N@Z)Tl; zNs?&B(LE|D6o}Sw`OtDFCTHr!JNEGU?do`MtH0|BFZ)i22A- zh=h^xBW3gtZ5GFl^_)ANd%*ew5{5WLm4N~ymzVucH?Jf0;pt{ye?(_d%S zf0dK^nQ2Tva7D;O_xosuesrl#V5iA`g7#*gJvwPk4s}bcoI$5H);LvI$w6ESQ(Jb3 zx`;rp!Me%#b9I~Qw6b5wKq~b}x<(2MT0&Hb0w!i{t&CJ~E78Q0eD*VrLp*n^lJ`PS zNsGX!*DtN_`yt9?(!>)=3aJxAC1!ztQdsnNK0VW1{B`McAL$||W}&AiNzgEQtjeHQ zeZyz@VcPbCnj@C!+Jss6IV_jD>%S`o-I=Gs;n+hXduYKA*XE~V(thw|SSQ)SogdE{lGJ1@#Y0CdVO5oo zrUivP(1n3R+vpcCp*~&ni^PC`k&prPMegh*=s(ulAIJp8lT?WW5Vsv!kho$54O&eb znA@D&9xnVN!;}m`9+dyiX7`;7@4I4{yK-XKAsc0BLYWGwa@QJo>6gLLab;&9DU0P8 zQ`^-yQ^f?eG*eWfYgEQy`l2Twhy+&eVkAd z2x2a7bc|9z<-L6kO+QhMSMy{Sgq3zowQGC1T^`CeNWr}M?x4lQ7}!zeb(i7Q z{jm?C?9}D&A-~-G@TY3;9y5CBM}CAMAr|H!!w;jdx>B@{w^y$x1vAHAUmovj4GtAN zA9k#LBamI?QB=rZ{ux$V>Xmz6KkS_(B^IBpk(N7=c=Q~IOG|4F;Ls4@&~^+=Z6X

    =`TZ4G+N8`vI43z=; zmc{2&g~u?XuoVJXygdnnEVj&6xY@v?fM=6g*UE-=7Czf8);BD+-*x=D&~4|Oh4;Xt zpHlPM2#KlJZ~e)8X+3*r`b#nEj%3_oO+LL|Y^x!n9Mxdo4tyJL=#MzS#-$Kx0@4;v z8kWWaqQ8&^%Y!sahQ~qj`gNZtMb##I!!l~#l@`G-S^UC8v57>wR`ElK(BzDi>iHuW zVAYo=Kk*X9ti9;~vYom|>skfX`#X*2+a(3t1EHiFDZz*J$%!Ar;vpTD;|Jd5mx`K~ zomLBTtV~en0o9D(24dl@(a6ERh%VR^Ghmq(bvOyjq)5q`m6Lf#3A^^G#*?>;fV{rM zcH995YzcUuvGwk&Br_cQe6jwULk%Tn>udp!5c3yAL7i4GmwU-{b|j|pCX@{Rr>Ms-c1Xa1X$)G)#g-o~{jlsh zta`6pJtC$50@vrmnfL@RYgh!|ii@fYtSS}ji#7>KMx9Hv=#vyxK}wgqL0ZO{9~<34 zB@j*6SK9pOk9R=~DcqONX=SK-)SJ1WxXQ|BB_pxb*W`gzWr_6KF4VPtGFGj~m-C}a}y%Cq-+eyh%ge1b73tOPFBf-$4 zMD_NCg!=DSia|za)aTQiocCBuMT6MeY|Ouy_XnNG9?PqPf~e&h%b0@{;30)0q~0}u z7B^hF{F`ZZ2)#dR_oCU{g`l)vv74nFOiHb3=}o}pBosmc4TR*mV9hXgnldQ-nvF4* zZ^XK99- zpkLK1G*I6cxf;j2nOJWd`jZ7WVZ;Goz?LZ=1>bkHSI>rr?Uw0WDW0eQ~ zN`WK0MbTbKGtU?1{6R6-6;d4F^EgxDan&*rf#aw4OIO_Eta>(pCT7WcOfPUM}u>_BTrvA*4hP2b8FK&LiL&E9>E!T84dd;vvASbDEFan8@q2)o>*q zxp+KMD(&0nX}yS(3Y|(Ztop4%a-#ZyoDs#d=Ty#2%&K-Jc@}QzKc5d{6L}~>3Pj2G zJHu;v_>z#0Dz~%hGV|dGTL}0wlev@}xtJ!+tvXxDK&rN_cCF{zOGqN47JfsWm^LzJ zGiIhgERx0U$W6Un#)Zli4Z#N&@O&654$HjnE`X$EQ@DH{TXL@=X5sSdILa&w%p>IK zMjH~^Rq1Zr6migQjZ0Y@14#K?pjojEy9-@0js!BKW-EVx+O=3g(J8_j{H6!&vhztB zu*nC_!*osEAFp{`SxgdW=8oCPZbL(qb7M6SbIFmC2T+N5 zVk|}%MKsEn2U%4qTlTU8$#*T*%pUurr_(4K{*KwY12K7UzGzW2hW>y(czS{nrqHXs0wWL`Y3|x(u90R6PJ}1bM5L`d6IT~bs7~S zodE{_pHa8e9MGJTl(O~A6&K(9$uRg?AQx)pDMn2HdU!)q14wz!KUmM73#FWEdt*++ zleH5u%9(j{PTDBH4_L%xg$92O-6|>%U7bi^(O(Qxnxj{$?%+#Ox=qXfN%83iF=aM| z&IcDWCgwQyZ`p>d{H#hBdJiCqURi#>R}TW$GoffU31WdiNI2TfAm#AvQVN~s8;wfl zI7b@;k(kMrN}Aliyppw79K`dya4k|Bh}4`hke$7!)Kxa zN0Z&fCtYEu0VS?Xu$5NHmzO01ne|}QoJ*$wtfNpvrpw6$K`K^Ya|vOoP|Q-DDIPTw zqB#Dvc|{yF*wg5^rCS@hL(P%b<~V8XhbybMGToamxG+`3pO^?wa$I9PdOx#2bvpX9 zeD4ocg}XKd&X69VUGhp^{iI&HcKwW$o|-C)N~dp~)!!ek*CU_s7QR%lFKn>sI=rk8 z3s(&=7$gteAAWZ*{{8sd)22Gkk165iZtZPMs&#a|4uyTj;Y))}3P)hqoUfy(=6p0( zzsHtYoPb9y!w#>7Vs8-zW)viMW)2=qa0FSevt+%*=d7Fg%sZN)RqVEACjme+R8(UA z-YL{&;AU}E>5V*36%FU^4FA&|PH(79j*Z=~(?9Ec>wu=%b?35MoUvSp>wN|q;)cRP zf#iP<0ExKkZxt)I(GxQL^-VtQbaJX>Jbu?(>}1#&68fQjgt*%EXs!%wKBAr38J6-V zYk_i3(eECWOlY}aG9q)JB7@BsMvmgQV_@aqmH1fYaT`6X^F^EL2UKoKfafDKgY7uA zFvHXE$mDenwew%pGuYGorTbfDJ0Us6R1%tmA6!qN7b76`W5257C^-0$)EIp3elx3u zR-Gs;(rivMc$sRIV5Ic zm?JI{40_o^GW2ekZ;K2^}1yOsA^G#R1n6>3&6T_x*n>(#97MYlmdiNTbiD@>&sDf z=YE#ks$+2LntG*n+yv|7;j=LS!UY}yC4^)Y;EGAeI90^k4FOF>`4#p*)LcL};oCGD z&(0#^vMyW|53|HwmCqJP13KAVj;JRHhVXenL&d^Ne)*Z#-AUqJh+1;hfo|<<~n?yX0Bp{U!|S*#x%_Sn+oy+I>l0e z$M$|aCEv5nKYi_uz$yO)JXAe_gk1uX!o|gAQyC*sz4$m2!=Wnbt@*l+NK4)(Q-qI;(vGp65?}PgVWh!aG2`wR&$)hGSWL7nL2e zU;g8GnAPi6(hAV!be+I;FTd+~cT|mVDRq1oRo^5Z8lSSP=?B#gfb6ZVGY`v`xnYS43N*Z9Pt%%ol# z`-TAc6r+r{xx4f?Kx-v8(^8w%+y;7}C9M_C?tM z1Uxw6ljEiYGa%p)Eu}QyKY1EO%wakkS_L9aM~gj>d5R2bRvY|!JO&O}`Qjq0ja*$f*Nxz-3PlpZ72XTSE?@j<)?(%%^ zSP>ba-GL!^9V>p=?0%6SAMf9ADx1ty7W&tAQbDWgYaR?d@_8AZeo`;W0V&rDSTqz=!hp8h%w^4GmCsm750ju9KlDa@|GP@=;F zYkV5kB3&aGw;wLCFXO^*l{4s8bPTzL#ru`l@oW;>wPq2XljN`L2^E%t03U?vEbsfL@76Mj|xi{c!mZVRvSPYIm_|%JUxy)OSE8sw?MoahpI|-|_%N zhFP|=-~FU&WKpZ-eNhAzdh3tFteq2DhCY2q5R1cZ^ek8bK!Pm^J*cS!qismp$>nYXyW3bobo4sjb{j?H)Dp18izpo=u4*1wai=@dERAx$2 z8%^hmpf2gfhhK&1Yv#T!eJ3gDLL2 zQ|R@{)7&?I^V^rZwQT)B{g@yHy! zS|ppK3gHtp#N=dLn`Ju(?oi<`y(a8J`PkIcnh64ws2CFdVlNLs56OE@I3F1JOZr+< z=Qs<|b-8+#-9IKz+tc z+-s>vxq>ATmTv`?p}C-G98Zy)C46kse9~Qy_Gp;Rr712VND`iH`NIlO*oWlB@0u>H z57{Ojc0#qo7vSdAjsF{xMaaMy@$QBeL6wB27>aQXGbRajN!@^;e@NX36t(a4eMt-s zxyAUvA<+k27BG+Huvl+}{tal>Pr5LCH0r;pnABl#p}I&!c4vsxM0HyrtWcrCv(v*` z4J{bcA!Y~=`i1rVR-J{w+gR?zi6(l^kB%`A5*qjSVkd=G#F-w*Zs}-5yLu2|AVueE zA6iQBGq!iX)=Y2d`0V)cG}hMDwzRKa-dR|hmz&|?gOkKivAVv06m~$LJ2)LqZR?BX z_Vb(X`$!75t8Uo()Y_p{+vu>?uHc(`S+(@pr1cHGhy1$_UQyceYUs;^F?w|e=)488I1a3=?;KxILe0boAx{39ffC>Nv|`F&1sW_ zo}cu|xJJ%=jKrEHWIW%yA}b4Ml$hKbtVuq6w(32_ojiWm6l<+Z{yTm=Y&$B;a^!eK zM;l~Njh+WI3)V#9v3P_F-NL^!#R{oRrj)Zr^jg3IVZL-}@>Mu=JR~*IbtkhRwIv<1 zLUW5zAOn)mF{Ke>?czv3HUvR^gs@`gfNFBPRH{)x}Cl`uXI}POHqTPP}Gbf zaM+?OP{r7HIYU5&&+{gr1rGNjTBLW-8fZBah1&0|jp)KdM!D_RschbDG{Cg(mJw{A z_;{y?n9GH+eu;-w?A_x96hPE}>rtkp7X!BMIMRPypP;hpx>&(ab)h!oLHk<07Eo#( zgz|QfbGqV}R0P2E^Bpg2Il4IQQjYvYl-%!AW5YD+4*bAxdpi9Z$o2I6pf7G6ON9+6 zYx5GId`Q=Pu)6O1-O~gC=oG#@z63z3sXzT=lMZ5KLxJ%|@b6+lE`tYfO8y4`^__-Z zW=8ja1OE4RDK_`F^O!qOG2aonWp&MJjzC%(i-COMl7kYGP4igDY=u?~0EJKf{}ncd z6QHVqML?eb+!G|ft#<~U$@3)|0I;|C$I-NRkrf^VI5~Ehh`*~6pDaes@o}eL-)A_u zmDz#|_$JvUUK=?VD%}nbEedLU=lD-vlje|M*x$WTBQ8ap5}4t3KrS+A^(%4>6d3`n zYjl&!qadIXiqI-$yHE{g3-WVW&x8Y}5uq?cSy|+0LiRu-qBv%~&*geeEVI>yImmbn z+u>W@pZs3E%e8+~?2PB+0N7P@rPa+1y?D9VSq)IkN-ajyhx}$rRqFlTd{cNH#Z62o z(8z?o`XyEX7gB=!9p$SP%jW^+6C7!1;n*)Hiw!_Ge~TOsc&EzuJg#=j7{jdrpr+p9 zVg=yj6a?GU2=B{5TC3q?W(HI(epY621e{xy8s+MPeHa)3 zE}XTVDc#s03rCQ%(cK%%f{kEs1d$`dWFM>BO&5*L`j%&FpCoP*Z$HOA^yUwLnA7VGH&OOaw63g*@Z=$C$LaxN#r z2Zb!YBvSWv=%Tu*8&yWFs={%hryl^+I>R$d=3y7oz}5n=y}AHqD$jea^nsI4s1(uE zZ*gIlK>ZYOFkPahiidml9cV@ifb&oVl!0%6Yv-^7K$-9ECOluj#-`iu$pu)PqK1;0 zE1rRa-b;N6LP)%#mP;-KOncLIO)JHl17z>hE5ON9G8&#=pDd-IlM1}IcCHc-d83Ta zb~E3xvO!r28K29@vh%jmKUt!i55#thYM#4+fzMNmA@oJo;iaU!1IiLPCVs8wVOdGI zzpTUVJs=Btxz(OiV{^~MuGnWfTlQo literal 11579 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 a_#QwBwgi;YqXVL7FlliGu}Trcfd2wgL`e_; diff --git a/class_bulk_only-members.html b/class_bulk_only-members.html index 8fd4e61d..1105034a 100644 --- a/class_bulk_only-members.html +++ b/class_bulk_only-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

  • - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 462 of file masstorage.h.

    +

    Definition at line 469 of file masstorage.h.

    Constructor & Destructor Documentation

    - + +

    ◆ BulkOnly()

    +
    @@ -241,12 +221,14 @@ Static Protected Attributes
    -

    Definition at line 222 of file masstorage.cpp.

    +

    Definition at line 229 of file masstorage.cpp.

    Member Function Documentation

    - + +

    ◆ PrintEndpointDescriptor()

    +
    @@ -274,11 +256,13 @@ Static Protected Attributes -

    Definition at line 1214 of file masstorage.cpp.

    +

    Definition at line 1220 of file masstorage.cpp.

    - + +

    ◆ OnInit()

    +
    @@ -299,11 +283,13 @@ Static Protected Attributes
    -

    Definition at line 492 of file masstorage.h.

    +

    Definition at line 499 of file masstorage.h.

    - + +

    ◆ GetLastUsbError()

    +
    @@ -324,11 +310,13 @@ Static Protected Attributes
    -

    Definition at line 498 of file masstorage.h.

    +

    Definition at line 505 of file masstorage.h.

    - + +

    ◆ GetbMaxLUN()

    +
    @@ -349,11 +337,13 @@ Static Protected Attributes
    -

    Definition at line 502 of file masstorage.h.

    +

    Definition at line 509 of file masstorage.h.

    - + +

    ◆ GetbTheLUN()

    +
    @@ -374,11 +364,13 @@ Static Protected Attributes
    -

    Definition at line 506 of file masstorage.h.

    +

    Definition at line 513 of file masstorage.h.

    - + +

    ◆ WriteProtected()

    +
    @@ -400,11 +392,13 @@ Static Protected Attributes
    Returns
    cached status of write protect switch
    -

    Definition at line 70 of file masstorage.cpp.

    +

    Definition at line 77 of file masstorage.cpp.

    - + +

    ◆ MediaCTL()

    +
    @@ -437,11 +431,13 @@ Static Protected Attributes
    Returns
    0 on success
    -

    Definition at line 130 of file masstorage.cpp.

    +

    Definition at line 137 of file masstorage.cpp.

    - + +

    ◆ Read() [1/2]

    +
    @@ -495,11 +491,13 @@ Static Protected Attributes
    Returns
    0 on success
    -

    Definition at line 154 of file masstorage.cpp.

    +

    Definition at line 161 of file masstorage.cpp.

    - + +

    ◆ Read() [2/2]

    +
    @@ -541,11 +539,13 @@ Static Protected Attributes
    -

    Definition at line 1241 of file masstorage.cpp.

    +

    Definition at line 1247 of file masstorage.cpp.

    - + +

    ◆ Write()

    +
    @@ -599,11 +599,13 @@ Static Protected Attributes
    Returns
    0 on success
    -

    Definition at line 188 of file masstorage.cpp.

    +

    Definition at line 195 of file masstorage.cpp.

    - + +

    ◆ LockMedia()

    +
    @@ -636,11 +638,13 @@ Static Protected Attributes
    Returns
    -

    Definition at line 114 of file masstorage.cpp.

    +

    Definition at line 121 of file masstorage.cpp.

    - + +

    ◆ LUNIsGood()

    +
    @@ -662,11 +666,13 @@ Static Protected Attributes
    Returns
    true if LUN is ready for use
    -

    Definition at line 60 of file masstorage.cpp.

    +

    Definition at line 67 of file masstorage.cpp.

    - + +

    ◆ GetCapacity()

    +
    @@ -688,11 +694,13 @@ Static Protected Attributes
    Returns
    media capacity
    -

    Definition at line 36 of file masstorage.cpp.

    +

    Definition at line 43 of file masstorage.cpp.

    - + +

    ◆ GetSectorSize()

    +
    @@ -714,11 +722,13 @@ Static Protected Attributes
    Returns
    media sector size
    -

    Definition at line 48 of file masstorage.cpp.

    +

    Definition at line 55 of file masstorage.cpp.

    - + +

    ◆ Init()

    +
    @@ -767,11 +777,13 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 326 of file masstorage.cpp.

    +

    Definition at line 333 of file masstorage.cpp.

    - + +

    ◆ ConfigureDevice()

    +
    @@ -822,11 +834,13 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 251 of file masstorage.cpp.

    +

    Definition at line 258 of file masstorage.cpp.

    - + +

    ◆ Release()

    +
    @@ -851,11 +865,13 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 592 of file masstorage.cpp.

    +

    Definition at line 598 of file masstorage.cpp.

    - + +

    ◆ Poll()

    +
    @@ -880,11 +896,13 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 670 of file masstorage.cpp.

    +

    Definition at line 676 of file masstorage.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -907,11 +925,13 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 528 of file masstorage.h.

    +

    Definition at line 535 of file masstorage.h.

    - + +

    ◆ EndpointXtract()

    +
    @@ -974,11 +994,13 @@ Static Protected Attributes

    Reimplemented from UsbConfigXtracter.

    -

    Definition at line 543 of file masstorage.cpp.

    +

    Definition at line 550 of file masstorage.cpp.

    - + +

    ◆ DEVCLASSOK()

    +
    @@ -1002,11 +1024,13 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 535 of file masstorage.h.

    +

    Definition at line 542 of file masstorage.h.

    - + +

    ◆ SCSITransaction6()

    +
    @@ -1053,11 +1077,13 @@ Static Protected Attributes
    Returns
    -

    Definition at line 83 of file masstorage.cpp.

    +

    Definition at line 90 of file masstorage.cpp.

    - + +

    ◆ SCSITransaction10()

    +
    @@ -1104,12 +1130,14 @@ Static Protected Attributes
    Returns
    -

    Definition at line 99 of file masstorage.cpp.

    +

    Definition at line 106 of file masstorage.cpp.

    Member Data Documentation

    - + +

    ◆ epDataInIndex

    +
    @@ -1127,11 +1155,13 @@ Static Protected Attributes
    -

    Definition at line 464 of file masstorage.h.

    +

    Definition at line 471 of file masstorage.h.

    - + +

    ◆ epDataOutIndex

    +
    @@ -1149,11 +1179,13 @@ Static Protected Attributes
    -

    Definition at line 465 of file masstorage.h.

    +

    Definition at line 472 of file masstorage.h.

    - + +

    ◆ epInterruptInIndex

    +
    @@ -1171,11 +1203,13 @@ Static Protected Attributes
    -

    Definition at line 466 of file masstorage.h.

    +

    Definition at line 473 of file masstorage.h.

    - + +

    ◆ pUsb

    +
    @@ -1193,11 +1227,13 @@ Static Protected Attributes
    -

    Definition at line 468 of file masstorage.h.

    +

    Definition at line 475 of file masstorage.h.

    - + +

    ◆ bAddress

    +
    @@ -1215,11 +1251,13 @@ Static Protected Attributes
    -

    Definition at line 469 of file masstorage.h.

    +

    Definition at line 476 of file masstorage.h.

    - + +

    ◆ bConfNum

    +
    @@ -1237,11 +1275,13 @@ Static Protected Attributes
    -

    Definition at line 470 of file masstorage.h.

    +

    Definition at line 477 of file masstorage.h.

    - + +

    ◆ bIface

    +
    @@ -1259,11 +1299,13 @@ Static Protected Attributes
    -

    Definition at line 471 of file masstorage.h.

    +

    Definition at line 478 of file masstorage.h.

    - + +

    ◆ bNumEP

    +
    @@ -1281,11 +1323,13 @@ Static Protected Attributes
    -

    Definition at line 472 of file masstorage.h.

    +

    Definition at line 479 of file masstorage.h.

    - + +

    ◆ qNextPollTime

    +
    @@ -1303,11 +1347,13 @@ Static Protected Attributes
    -

    Definition at line 473 of file masstorage.h.

    +

    Definition at line 480 of file masstorage.h.

    - + +

    ◆ bPollEnable

    +
    @@ -1325,11 +1371,13 @@ Static Protected Attributes
    -

    Definition at line 474 of file masstorage.h.

    +

    Definition at line 481 of file masstorage.h.

    - + +

    ◆ epInfo

    +
    @@ -1347,11 +1395,13 @@ Static Protected Attributes
    -

    Definition at line 476 of file masstorage.h.

    +

    Definition at line 483 of file masstorage.h.

    - + +

    ◆ dCBWTag

    +
    @@ -1369,11 +1419,13 @@ Static Protected Attributes
    -

    Definition at line 478 of file masstorage.h.

    +

    Definition at line 485 of file masstorage.h.

    - + +

    ◆ bLastUsbError

    +
    @@ -1391,11 +1443,13 @@ Static Protected Attributes
    -

    Definition at line 480 of file masstorage.h.

    +

    Definition at line 487 of file masstorage.h.

    - + +

    ◆ bMaxLUN

    +
    @@ -1413,11 +1467,13 @@ Static Protected Attributes
    -

    Definition at line 481 of file masstorage.h.

    +

    Definition at line 488 of file masstorage.h.

    - + +

    ◆ bTheLUN

    +
    @@ -1435,11 +1491,13 @@ Static Protected Attributes
    -

    Definition at line 482 of file masstorage.h.

    +

    Definition at line 489 of file masstorage.h.

    - + +

    ◆ CurrentCapacity

    +
    @@ -1457,11 +1515,13 @@ Static Protected Attributes
    -

    Definition at line 483 of file masstorage.h.

    +

    Definition at line 490 of file masstorage.h.

    - + +

    ◆ CurrentSectorSize

    +
    @@ -1479,11 +1539,13 @@ Static Protected Attributes
    -

    Definition at line 484 of file masstorage.h.

    +

    Definition at line 491 of file masstorage.h.

    - + +

    ◆ LUNOk

    +
    @@ -1501,11 +1563,13 @@ Static Protected Attributes
    -

    Definition at line 485 of file masstorage.h.

    +

    Definition at line 492 of file masstorage.h.

    - + +

    ◆ WriteOk

    +
    @@ -1523,7 +1587,7 @@ Static Protected Attributes
    -

    Definition at line 486 of file masstorage.h.

    +

    Definition at line 493 of file masstorage.h.

    @@ -1536,7 +1600,7 @@ Static Protected Attributes diff --git a/class_bulk_only__coll__graph.md5 b/class_bulk_only__coll__graph.md5 index 65616e8f..38e17c78 100644 --- a/class_bulk_only__coll__graph.md5 +++ b/class_bulk_only__coll__graph.md5 @@ -1 +1 @@ -f9839364bbfdcee0034202ae5496cf49 \ No newline at end of file +922595c1eab8d375f2394c87eb7b7d3b \ No newline at end of file diff --git a/class_bulk_only__coll__graph.png b/class_bulk_only__coll__graph.png index 6f091d3b8c70b7c25908b239fcb61353a56b3d30..46536924fe58091c7488b2b2ef024dd0c335dfe3 100644 GIT binary patch literal 17001 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 S5_oq6l#HaJM5UNf;Qs)!)A8#7 literal 16386 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≻uL~Yv{+l*-Jwt@?(R_B9lm}4d_S_u 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 TdKCm1=WxpM8gdmfW?}yWV1Gk8 literal 8093 zcmX|`WmHsM7sp{3VCc@Fk?vL+2Bf4zIz>T15RjUo84v~m328|I>5`D{kP?s*3F#gh z9_qb*dB5B>>#j5F?tS*zaen`3JsmY7e0qEg3=AR-brk~)3``E-w;Kcpcy2*`yD>1B zUudW(8TnxzSmCA_sgetN5`%^l!8(aAD6uIiAA`X|`j0dcSv>#xGjQSm<-s5RSU{f4 zo%m#h6p2O2QIM$m=v6|~y6<`F?AmX?e3RtJF`_iHg~0EWo0dfrq2os zA>5#t5E!ZYPJ*YC2qmVfA{i;zh}#*a2d2bSW6f0_(%+xx{++hEn|4mk zf?>F!9k&}o-hX@X;z4i-2StG@ih9$eiY!8Lb0l4r8@pv#!eyqA*SHic1Jz#cg0x<5 zW?E|%OLA0IJLR(FLLSk8c#{(e{70XY>496>0EhVa=}Q2whmaxoU)GhaPmKXjs~}(% zZX$Z|_mZx2D<8Y2zZyFC$I?}zty+Bax5lz}c8YU~Qf-3LKM7bom3p)2A(tcSh~LHL zet&;|*)dg|6T~Z~#5vjOe`+~SM$%u4O+c;Z?Oh+8xU$#mwe{#AQ_7w5G12MY>(edg z&JfJA{kn0@K=}EtY7_~xWIV;YwxB!dz>^`av;X$02!c98ix((Tijr(D8UwFOVI4tt z+rXAxoSSw7pH`QHUlf)aml@psckVn_ZAbauC#096y9(G!iiL-fbTPSMIX|@RwV*6h zgodJG1o;j9#8|eB9Lx1($Ak96^?2~3+X3d_!Wb&P$!{*RC4n~=XT=J48sI6faXBtQ z$a^p=_G%;@%dJ(DN2oRYK;pVu`>###orHi{ZG=IwjzDn7{eOJtJ5y@(Q^#uq+Vx5)-|7cCzY;r)B@u_%8ZxH%Dkwjmer;6&~mv4aZP~M??NI1>Is&WD^=!h5| z>!BlVaE4=fZap}H7oNMmQycI*S=Y$X=hVqkmv}u*+TL+Csby63jE-I*NY=Q@T8^cO zGs4DWz;7iKx5ThmC&GPTqEI7g`|fhNSTluJV?yEnm}EzN^iios{=RfCT zH4XzMo*To{rN(@CUP5A^yeBUQ6S~fI3KuQg0*s}bUFU24jp$52Kk<_~5uPhYgd8+tx?l9Ca*%`S~KiIjk_9?YD8|CDe2E5?eh%eCD%ZROu zhS%c*%QsCOM!|+L>`e0H5bBaIk)3Dm?bnefTjTCwvX$>iDtLSk7n#PNVMOTs_#~hT z$^9AH;P(6J7p>GHAQKG6vYt4m;j)JH<6_#*Mh09S3WOa^@|(r;oz;VH8J* zv!80@alsA)abIo@TXegb1GZWJ+byeFrvvkgKO%gxh$IYfbqZoZums=j*>H3WFu`N< z^YaUD{d~|XN@Rr&{jnc!^@9lcSP(!e32vBv_x=ib!d@Nw2_itw%t(&|mJV3RgGI5; zS92l=fdtRZS4EM-3#Y`!W!V`czlvvt{`9BhH%*A4QCCJma�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 ZZhr&Y%^=Hu9w578XsGI_R4Uts{SPZuS*id4 diff --git a/class_byte_skipper-members.html b/class_byte_skipper-members.html index a53e8f7c..e0f40c90 100644 --- a/class_byte_skipper-members.html +++ b/class_byte_skipper-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 50 of file parsetools.h.

    +

    Definition at line 57 of file parsetools.h.

    Constructor & Destructor Documentation

    - + +

    ◆ ByteSkipper()

    +
    @@ -128,12 +108,14 @@ Public Member Functions
    -

    Definition at line 57 of file parsetools.h.

    +

    Definition at line 64 of file parsetools.h.

    Member Function Documentation

    - + +

    ◆ Initialize()

    +
    @@ -155,11 +137,13 @@ Public Member Functions
    -

    Definition at line 60 of file parsetools.h.

    +

    Definition at line 67 of file parsetools.h.

    - + +

    ◆ Skip()

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

    Definition at line 65 of file parsetools.h.

    +

    Definition at line 72 of file parsetools.h.

    @@ -209,7 +193,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 f1af7c38..bc2c3c63 100644 --- a/class_c_d_c_async_oper-members.html +++ b/class_c_d_c_async_oper-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 128 of file cdcacm.h.

    +

    Definition at line 128 of file cdcacm.h.

    Member Function Documentation

    - + +

    ◆ OnInit()

    +
    @@ -125,7 +105,7 @@ Public Member Functions
    -

    Definition at line 131 of file cdcacm.h.

    +

    Definition at line 131 of file cdcacm.h.

    @@ -137,7 +117,7 @@ Public Member Functions diff --git a/class_config_desc_parser-members.html b/class_config_desc_parser-members.html index 46d3e697..e56efc82 100644 --- a/class_config_desc_parser-members.html +++ b/class_config_desc_parser-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +
    class ConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK > -

    Definition at line 40 of file confdescparser.h.

    +

    Definition at line 47 of file confdescparser.h.

    Constructor & Destructor Documentation

    - + +

    ◆ ConfigDescParser()

    +
    @@ -142,12 +122,14 @@ template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PRO
    -

    Definition at line 72 of file confdescparser.h.

    +

    Definition at line 79 of file confdescparser.h.

    Member Function Documentation

    - + +

    ◆ SetOR()

    +
    @@ -171,11 +153,13 @@ template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PRO
    -

    Definition at line 64 of file confdescparser.h.

    +

    Definition at line 71 of file confdescparser.h.

    - + +

    ◆ Parse()

    +
    @@ -217,7 +201,7 @@ template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PRO

    Implements USBReadParser.

    -

    Definition at line 84 of file confdescparser.h.

    +

    Definition at line 91 of file confdescparser.h.

    @@ -229,7 +213,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.md5 b/class_config_desc_parser__coll__graph.md5 index 6d67d32a..9543b832 100644 --- a/class_config_desc_parser__coll__graph.md5 +++ b/class_config_desc_parser__coll__graph.md5 @@ -1 +1 @@ -43e2ececa16e23c2ef0bb98404d9dd99 \ No newline at end of file +8d46f1e236686517ba32dc78e05067b2 \ 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 291852078875339ea9158d22887a86312f25f600..d27e87241a0a29d5093eaa536de37a74a9f37648 100644 GIT binary patch literal 9055 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 MR7a&k*)rt603EG$^Z)<= literal 9067 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 K<*$l1@Ba_t44KIQ diff --git a/class_config_desc_parser__inherit__graph.md5 b/class_config_desc_parser__inherit__graph.md5 index 6d67d32a..007fa887 100644 --- a/class_config_desc_parser__inherit__graph.md5 +++ b/class_config_desc_parser__inherit__graph.md5 @@ -1 +1 @@ -43e2ececa16e23c2ef0bb98404d9dd99 \ No newline at end of file +09e7aef4816627c161587a65c67bc25c \ 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 291852078875339ea9158d22887a86312f25f600..d27e87241a0a29d5093eaa536de37a74a9f37648 100644 GIT binary patch literal 9055 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 MR7a&k*)rt603EG$^Z)<= literal 9067 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 K<*$l1@Ba_t44KIQ diff --git a/class_f_t_d_i-members.html b/class_f_t_d_i-members.html index f9bbdefa..f46df995 100644 --- a/class_f_t_d_i-members.html +++ b/class_f_t_d_i-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    FTDI(USB *pusb, FTDIAsyncOper *pasync, uint16_t idProduct=FTDI_PID)FTDI GetAddress()FTDIinlinevirtual Init(uint8_t parent, uint8_t port, bool lowspeed)FTDIvirtual - Poll()FTDIvirtual - RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)FTDI - Release()FTDIvirtual - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - SetBaudRate(uint32_t baud)FTDI - SetData(uint16_t databm)FTDI - SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)FTDI - SetModemControl(uint16_t control)FTDI - SndData(uint16_t nbytes, uint8_t *dataptr)FTDI - VIDPIDOK(uint16_t vid, uint16_t pid)FTDIinlinevirtual + isReady()FTDIinlinevirtual + Poll()FTDIvirtual + RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)FTDI + Release()FTDIvirtual + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + SetBaudRate(uint32_t baud)FTDI + SetData(uint16_t databm)FTDI + SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)FTDI + SetModemControl(uint16_t control)FTDI + SndData(uint16_t nbytes, uint8_t *dataptr)FTDI + VIDPIDOK(uint16_t vid, uint16_t pid)FTDIinlinevirtual
    diff --git a/class_f_t_d_i.html b/class_f_t_d_i.html index 739a3f08..f6fdef54 100644 --- a/class_f_t_d_i.html +++ b/class_f_t_d_i.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: FTDI Class Reference @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
      virtual bool VIDPIDOK (uint16_t vid, uint16_t pid)   +virtual bool isReady () +  - Public Member Functions inherited from USBDeviceConfig virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)   @@ -152,9 +132,11 @@ Public Member Functions

    Detailed Description

    -

    Definition at line 96 of file cdcftdi.h.

    +

    Definition at line 96 of file cdcftdi.h.

    Constructor & Destructor Documentation

    - + +

    ◆ FTDI()

    +
    @@ -184,12 +166,14 @@ Public Member Functions
    -

    Definition at line 23 of file cdcftdi.cpp.

    +

    Definition at line 23 of file cdcftdi.cpp.

    Member Function Documentation

    - + +

    ◆ SetBaudRate()

    +
    @@ -203,11 +187,13 @@ Public Member Functions
    -

    Definition at line 273 of file cdcftdi.cpp.

    +

    Definition at line 276 of file cdcftdi.cpp.

    - + +

    ◆ SetModemControl()

    +
    @@ -221,11 +207,13 @@ Public Member Functions
    -

    Definition at line 310 of file cdcftdi.cpp.

    +

    Definition at line 316 of file cdcftdi.cpp.

    - + +

    ◆ SetFlowControl()

    +
    @@ -255,11 +243,13 @@ Public Member Functions
    -

    Definition at line 314 of file cdcftdi.cpp.

    +

    Definition at line 324 of file cdcftdi.cpp.

    - + +

    ◆ SetData()

    +
    @@ -273,11 +263,13 @@ Public Member Functions
    -

    Definition at line 318 of file cdcftdi.cpp.

    +

    Definition at line 332 of file cdcftdi.cpp.

    - + +

    ◆ RcvData()

    +
    @@ -301,11 +293,13 @@ Public Member Functions
    -

    Definition at line 322 of file cdcftdi.cpp.

    +

    Definition at line 340 of file cdcftdi.cpp.

    - + +

    ◆ SndData()

    +
    @@ -329,11 +323,13 @@ Public Member Functions
    -

    Definition at line 326 of file cdcftdi.cpp.

    +

    Definition at line 348 of file cdcftdi.cpp.

    - + +

    ◆ Init()

    +
    @@ -373,11 +369,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 41 of file cdcftdi.cpp.

    +

    Definition at line 41 of file cdcftdi.cpp.

    - + +

    ◆ Release()

    +
    @@ -400,11 +398,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 248 of file cdcftdi.cpp.

    +

    Definition at line 250 of file cdcftdi.cpp.

    - + +

    ◆ Poll()

    +
    @@ -427,11 +427,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 258 of file cdcftdi.cpp.

    +

    Definition at line 261 of file cdcftdi.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -454,11 +456,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 133 of file cdcftdi.h.

    +

    Definition at line 134 of file cdcftdi.h.

    - + +

    ◆ EndpointXtract()

    +
    @@ -510,11 +514,13 @@ Public Member Functions

    Reimplemented from UsbConfigXtracter.

    -

    Definition at line 220 of file cdcftdi.cpp.

    +

    Definition at line 223 of file cdcftdi.cpp.

    - + +

    ◆ VIDPIDOK()

    +
    @@ -548,7 +554,34 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 140 of file cdcftdi.h.

    +

    Definition at line 141 of file cdcftdi.h.

    + + + + +

    ◆ isReady()

    + +
    +
    +
    + + + + +
    + + + + + + + +
    virtual bool FTDI::isReady ()
    +
    +inlinevirtual
    +
    + +

    Definition at line 144 of file cdcftdi.h.

    @@ -561,7 +594,7 @@ Public Member Functions diff --git a/class_f_t_d_i__coll__graph.md5 b/class_f_t_d_i__coll__graph.md5 index 8736ae0b..03701d05 100644 --- a/class_f_t_d_i__coll__graph.md5 +++ b/class_f_t_d_i__coll__graph.md5 @@ -1 +1 @@ -7639ae03a2a3c77cae9f7ef89dc8dcfd \ No newline at end of file +ce47df1c759cd4a94063a5e7d0082de2 \ 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 a4f7ea181919379c8d555c3b3d9dee9649d34f17..8375b67e62b1e9289d9ad98fe9ab5d5f230b2a95 100644 GIT binary patch literal 7420 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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 8736ae0b..64b84c33 100644 --- a/class_f_t_d_i__inherit__graph.md5 +++ b/class_f_t_d_i__inherit__graph.md5 @@ -1 +1 @@ -7639ae03a2a3c77cae9f7ef89dc8dcfd \ No newline at end of file +5c89ec39cab7057f56e7027e29a41346 \ 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 a4f7ea181919379c8d555c3b3d9dee9649d34f17..8375b67e62b1e9289d9ad98fe9ab5d5f230b2a95 100644 GIT binary patch literal 7420 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 diff --git a/class_f_t_d_i_async_oper-members.html b/class_f_t_d_i_async_oper-members.html index d1083ae9..8b59e822 100644 --- a/class_f_t_d_i_async_oper-members.html +++ b/class_f_t_d_i_async_oper-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 79 of file cdcftdi.h.

    +

    Definition at line 79 of file cdcftdi.h.

    Member Function Documentation

    - + +

    ◆ OnInit()

    +
    @@ -127,11 +107,13 @@ Public Member Functions
    -

    Definition at line 82 of file cdcftdi.h.

    +

    Definition at line 82 of file cdcftdi.h.

    - + +

    ◆ OnRelease()

    +
    @@ -153,7 +135,7 @@ Public Member Functions
    -

    Definition at line 86 of file cdcftdi.h.

    +

    Definition at line 86 of file cdcftdi.h.

    @@ -165,7 +147,7 @@ Public Member Functions diff --git a/class_h_i_d_boot-members.html b/class_h_i_d_boot-members.html index f1e06336..59807807 100644 --- a/class_h_i_d_boot-members.html +++ b/class_h_i_d_boot-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +
    class HIDBoot< BOOT_PROTOCOL > -

    Definition at line 201 of file hidboot.h.

    +

    Definition at line 201 of file hidboot.h.

    Constructor & Destructor Documentation

    - + +

    ◆ HIDBoot()

    +
    @@ -224,12 +204,14 @@ template<const uint8_t BOOT_PROTOCOL>
    -

    Definition at line 256 of file hidboot.h.

    +

    Definition at line 256 of file hidboot.h.

    Member Function Documentation

    - + +

    ◆ SetReportParser()

    +
    @@ -265,11 +247,13 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBHID.

    -

    Definition at line 224 of file hidboot.h.

    +

    Definition at line 224 of file hidboot.h.

    - + +

    ◆ Init()

    +
    @@ -311,11 +295,13 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 285 of file hidboot.h.

    +

    Definition at line 285 of file hidboot.h.

    - + +

    ◆ Release()

    +
    @@ -340,11 +326,13 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 561 of file hidboot.h.

    +

    Definition at line 564 of file hidboot.h.

    - + +

    ◆ Poll()

    +
    @@ -369,11 +357,13 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 575 of file hidboot.h.

    +

    Definition at line 578 of file hidboot.h.

    - + +

    ◆ GetAddress()

    +
    @@ -398,11 +388,13 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 234 of file hidboot.h.

    +

    Definition at line 234 of file hidboot.h.

    - + +

    ◆ isReady()

    +
    @@ -425,11 +417,13 @@ template<const uint8_t BOOT_PROTOCOL>
    -

    Definition at line 238 of file hidboot.h.

    +

    Definition at line 238 of file hidboot.h.

    - + +

    ◆ EndpointXtract()

    +
    @@ -483,11 +477,13 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from UsbConfigXtracter.

    -

    Definition at line 536 of file hidboot.h.

    +

    Definition at line 539 of file hidboot.h.

    - + +

    ◆ DEVCLASSOK()

    +
    @@ -513,11 +509,13 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 246 of file hidboot.h.

    +

    Definition at line 246 of file hidboot.h.

    - + +

    ◆ DEVSUBCLASSOK()

    +
    @@ -543,7 +541,7 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 250 of file hidboot.h.

    +

    Definition at line 250 of file hidboot.h.

    @@ -555,7 +553,7 @@ template<const uint8_t BOOT_PROTOCOL>
    diff --git a/class_h_i_d_boot__coll__graph.md5 b/class_h_i_d_boot__coll__graph.md5 index de81f923..3625c217 100644 --- a/class_h_i_d_boot__coll__graph.md5 +++ b/class_h_i_d_boot__coll__graph.md5 @@ -1 +1 @@ -a19c6c2c9e133ec0ee972f6c6da3910c \ No newline at end of file +f259975bab1bae919945e1d52865d138 \ 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 7d07de44b6c80af8a1fd17263a25f2e1115b1a17..60b6cc67f19f2020a6ef9af8b18b0483121add39 100644 GIT binary patch literal 16958 zcmeIaRaDhq6z@xHU?a6blrCwIl6R4f?rsE;MpC2%B&EAUQY1IhB_Q41XYoJd zjC&vMeLF8_jPt-?z-I5?`mHs8GrsdPiBM6J#d<>g1OWj7>$RMe8Ug}hF!+K&QNeFo zHC#HuH$)dTSqX%)VbU!G1TloyQsNq(hDT&d!!;7UUpKNc412Y>qXE}2Fg5hWA_k?pkxjqCvb#zOwX^`|*W<=M1_jI_P9 zt8Fj$g65{CuD6qJ#luBqF&v3c1@I^l@hF2VY2#99^%RDkKO>;WA)xEiiivk5iy_g7 zA*m__22&1_AVexZ{)7*)MF!t!VC#^--&$^8ilD~@VnJzWX$L}ZL@YzTO8GyhQ%t37 zblGrcVz7WH@p(!h(Zmr!)YR184<<5J1w7mj$%!zH3;AAFnEP&x)7Bq5%Pfb5l7kOT zlQ!-MM0CDb@UYN2#?7#Q_wE~)-7MUch@blK^VhEfA#xqmh{Tb??{etD@-oo%8=a-E&vxk1(a|}5FCFVkV~Dxs z-S=i`kjYj0Ls^}j&VkSL>nTS5@#lMUZ(C8AJ^qyHQuDj~OKfu6 z*}fG-QK83p{&G}iVR~A}&+1^YmD71mZp!$&#dfA@yg->Ec4~Yr;?2gU99THzD|Gz^ zN5pg^V$s{f5ThBD1G3G-28*-pNu>)?QUCdmv9VKAybg=Iu6BzpUNVY`QStQ36LOd`qFk9lV)F!YfpTtDe=)BG;;J#~#>UQ1w zaDNjG-YIzHcRD63Q)fGaNsEA48?(e<)YejIF+yIz&LBGIdVOjY{&3L#P5w3n5$aC3~q?BiHA$){i@t9r<%IeB-|ZvPRl^2I02(!)55Xf>N+s9N+3R@rHLx zX+#s|x;5UTlIza`ZM)eQEV!w&n=>zrZ#p^%czAmgaC_8uO?vN`&SS?}WietulqG7E zbud@2oK>z@E1#AAAab?#G*_qcol@}fe4~quzW!GZk9~bIObMtLsgP%dh*9Oc4`aoe z%q)~G=t$6ps0KI$(GK!SfDD+1Ctl#T+40(dQd(alalGKw${M^#ozt`zb8E4+dEV!s z^%$Iz(xsk40Qs==()-Qvt;RR8?s8 zKFhP4tIM=^xnx|Sl{c14<21{&nJU8$FhXP3KbUWv*iuHvH>$t#STM5ca{SLcULtK} z;2P6q!U-YY3lOR(E5K3v{Sf=tIZC*HGQ*)TZEYn8IrfH&-kO zskgyt)z#l%Rmn~UrbvRA5_?V0M)V0dhwl*k<~^Ry?{2ABFAbVBG%R+LCnBEGf6}{K zeNUj$C9YR*&vN-gzp;u`&|Ps3;ril$&Dt$)ce+xNjihIM-1q8u;H^VzK5tL=xCS3B zgH%zh>z5QZqd%{3^N>CM{zPx|Jo;9MZNz4z87!N~p~FV7(BPCik)Y)#Y5w4nBqv1w z=y6q^_V-62c==s#6=3CKbMCjCC}p_qL?I}Ma+r1~c20^bmoIXUF3R`3*C;n!2rQ$( z_V&#u=Y*e6Uz1kjoGAsHCI?PR<;y2=!hO)Mo6eRJXcfNNLVhK)OjO5Z~J=a6gWyw#ccHgB~JHU9o3!dg}-XQglox{ zCb%#C&L*{klf%-YElS2wF%ec2+ z%E(iT7$)NiX>*lQ4imoMVJrDBDs97yR^8FvQCpUiRSA%B6UO8`MIVF9`%nZpgN|Cn z@bvzi3I(5|m~jJ(K~qiP1q!FyZrq}cz2pyb1tiU+9$IG^(|6IK^LPh`|I)c%9 zr(2uKKOEXHs>e-)(us+~I+K2V16CauC<=nZZO%{j|17N&{P3c|S(od-w}&I31c@dR zhCzUn)rWo+a1&>t65jhul3Ae7jh}hetN&R{3XhQEU8wI-4}pnlT?pD!ILU9_JgEqT zy^E)7YOA??i=-$)yqu@t@SsG9zR@L;;n-9PY%p{(k+16L!KoFv5KnaMsL4L3`A;JR zgY$8tA&(bRqj%gKwJI|3`M8+xdUYIRU7%J#P@~p97>ykvh{2TD2$mm-kyKE6dJJ|1R##0Y z>tTOF-LA@$=t?6yhaO|Tm?cy(txCQqw2Ti=L0&$-NL^cSxcdmi{{M9ie58PfR^_7L zGXLD^FNiHVb?Ch^2U4c°E&QQr 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 HFb@77JA`_M literal 17747 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 E7u|JIF#rGn diff --git a/class_h_i_d_boot__inherit__graph.md5 b/class_h_i_d_boot__inherit__graph.md5 index bb37f2b2..22fee73b 100644 --- a/class_h_i_d_boot__inherit__graph.md5 +++ b/class_h_i_d_boot__inherit__graph.md5 @@ -1 +1 @@ -0163fec2b92b9cadecd0eed3ad26c28f \ No newline at end of file +33a2d817f07a1965ceb3d476c83e4fdb \ 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 7e7c6fec75f173b700822df6bf43bc04294e2c2f..f7f4d2348f1120b16e945ad97fc80b197a4b7489 100644 GIT binary patch literal 11723 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 B9BBXm literal 11778 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 24 of file hidcomposite.h.

    +

    Definition at line 24 of file hidcomposite.h.

    Constructor & Destructor Documentation

    - + +

    ◆ HIDComposite()

    +
    @@ -239,12 +219,14 @@ Additional Inherited Members
    -

    Definition at line 20 of file hidcomposite.cpp.

    +

    Definition at line 20 of file hidcomposite.cpp.

    Member Function Documentation

    - + +

    ◆ GetReportParser()

    +
    @@ -268,11 +250,13 @@ Additional Inherited Members

    Reimplemented from USBHID.

    -

    Definition at line 83 of file hidcomposite.cpp.

    +

    Definition at line 83 of file hidcomposite.cpp.

    - + +

    ◆ OnInitSuccessful()

    +
    @@ -293,11 +277,13 @@ Additional Inherited Members
    -

    Definition at line 71 of file hidcomposite.h.

    +

    Definition at line 71 of file hidcomposite.h.

    - + +

    ◆ ParseHIDData()

    +
    @@ -347,11 +333,13 @@ Additional Inherited Members
    -

    Definition at line 75 of file hidcomposite.h.

    +

    Definition at line 75 of file hidcomposite.h.

    - + +

    ◆ SetReportParser()

    +
    @@ -385,11 +373,13 @@ Additional Inherited Members

    Reimplemented from USBHID.

    -

    Definition at line 72 of file hidcomposite.cpp.

    +

    Definition at line 72 of file hidcomposite.cpp.

    - + +

    ◆ Init()

    +
    @@ -429,11 +419,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 94 of file hidcomposite.cpp.

    +

    Definition at line 94 of file hidcomposite.cpp.

    - + +

    ◆ Release()

    +
    @@ -456,11 +448,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 342 of file hidcomposite.cpp.

    +

    Definition at line 340 of file hidcomposite.cpp.

    - + +

    ◆ Poll()

    +
    @@ -483,11 +477,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 357 of file hidcomposite.cpp.

    +

    Definition at line 355 of file hidcomposite.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -510,11 +506,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 90 of file hidcomposite.h.

    +

    Definition at line 90 of file hidcomposite.h.

    - + +

    ◆ isReady()

    +
    @@ -535,11 +533,13 @@ Additional Inherited Members
    -

    Definition at line 94 of file hidcomposite.h.

    +

    Definition at line 94 of file hidcomposite.h.

    - + +

    ◆ EndpointXtract()

    +
    @@ -591,11 +591,13 @@ Additional Inherited Members

    Reimplemented from UsbConfigXtracter.

    -

    Definition at line 297 of file hidcomposite.cpp.

    +

    Definition at line 297 of file hidcomposite.cpp.

    - + +

    ◆ SndRpt()

    +
    @@ -619,11 +621,13 @@ Additional Inherited Members
    -

    Definition at line 415 of file hidcomposite.cpp.

    +

    Definition at line 413 of file hidcomposite.cpp.

    - + +

    ◆ SelectInterface()

    +
    @@ -658,7 +662,9 @@ Additional Inherited Members

    Member Data Documentation

    - + +

    ◆ epInfo

    +
    @@ -676,11 +682,13 @@ Additional Inherited Members
    -

    Definition at line 61 of file hidcomposite.h.

    +

    Definition at line 61 of file hidcomposite.h.

    - + +

    ◆ hidInterfaces

    +
    @@ -698,11 +706,13 @@ Additional Inherited Members
    -

    Definition at line 62 of file hidcomposite.h.

    +

    Definition at line 62 of file hidcomposite.h.

    - + +

    ◆ bHasReportId

    +
    @@ -720,11 +730,13 @@ Additional Inherited Members
    -

    Definition at line 64 of file hidcomposite.h.

    +

    Definition at line 64 of file hidcomposite.h.

    - + +

    ◆ PID

    +
    @@ -742,11 +754,13 @@ Additional Inherited Members
    -

    Definition at line 66 of file hidcomposite.h.

    +

    Definition at line 66 of file hidcomposite.h.

    - + +

    ◆ VID

    +
    @@ -764,7 +778,7 @@ Additional Inherited Members
    -

    Definition at line 66 of file hidcomposite.h.

    +

    Definition at line 66 of file hidcomposite.h.

    @@ -777,7 +791,7 @@ Additional Inherited Members diff --git a/class_h_i_d_composite__coll__graph.md5 b/class_h_i_d_composite__coll__graph.md5 index cb51ec95..8c822c0b 100644 --- a/class_h_i_d_composite__coll__graph.md5 +++ b/class_h_i_d_composite__coll__graph.md5 @@ -1 +1 @@ -cb1afeb4ef0790903388054fd3bdbf40 \ No newline at end of file +53a6c18af1475d71fd895b0881f48e79 \ 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 e8859751b34ac19e46c8c8791c9ff02b659d726d..78c89664c2bf59a4e138a24a30fe2061139c21e9 100644 GIT binary patch literal 24833 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 literal 25592 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 z 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 literal 10788 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 diff --git a/class_h_i_d_report_parser-members.html b/class_h_i_d_report_parser-members.html index a8dfd0a0..d9d5465d 100644 --- a/class_h_i_d_report_parser-members.html +++ b/class_h_i_d_report_parser-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 138 of file usbhid.h.

    +

    Definition at line 138 of file usbhid.h.

    Member Function Documentation

    - + +

    ◆ Parse()

    +
    @@ -169,7 +149,7 @@ Public Member Functions diff --git a/class_h_i_d_report_parser__inherit__graph.md5 b/class_h_i_d_report_parser__inherit__graph.md5 index 25b71fe2..593cf846 100644 --- a/class_h_i_d_report_parser__inherit__graph.md5 +++ b/class_h_i_d_report_parser__inherit__graph.md5 @@ -1 +1 @@ -8be112e5d3300b51cf0649c53a258712 \ No newline at end of file +7f123ea9da7dc06b494537ace718925b \ 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 c140d3409a2aaa542e72ca93cf1a05efeaa145b1..d454483382eed8d329e2482c8bb6467fd9fa8728 100644 GIT binary patch literal 11648 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ⅅG+iPD&RHkZW^otO5QJ{D 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 diff --git a/class_h_i_d_universal-members.html b/class_h_i_d_universal-members.html index 61c1b3c4..08b7f9e1 100644 --- a/class_h_i_d_universal-members.html +++ b/class_h_i_d_universal-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 24 of file hiduniversal.h.

    +

    Definition at line 24 of file hiduniversal.h.

    Constructor & Destructor Documentation

    - + +

    ◆ HIDUniversal()

    +
    @@ -239,12 +219,14 @@ Additional Inherited Members
    -

    Definition at line 20 of file hiduniversal.cpp.

    +

    Definition at line 20 of file hiduniversal.cpp.

    Member Function Documentation

    - + +

    ◆ GetReportParser()

    +
    @@ -268,11 +250,13 @@ Additional Inherited Members

    Reimplemented from USBHID.

    -

    Definition at line 85 of file hiduniversal.cpp.

    +

    Definition at line 85 of file hiduniversal.cpp.

    - + +

    ◆ OnInitSuccessful()

    +
    @@ -295,11 +279,13 @@ Additional Inherited Members

    Reimplemented in PSBuzz, and PS4USB.

    -

    Definition at line 74 of file hiduniversal.h.

    +

    Definition at line 74 of file hiduniversal.h.

    - + +

    ◆ ParseHIDData()

    +
    @@ -345,11 +331,13 @@ Additional Inherited Members

    Reimplemented in PSBuzz, and PS4USB.

    -

    Definition at line 78 of file hiduniversal.h.

    +

    Definition at line 78 of file hiduniversal.h.

    - + +

    ◆ SetReportParser()

    +
    @@ -383,11 +371,13 @@ Additional Inherited Members

    Reimplemented from USBHID.

    -

    Definition at line 74 of file hiduniversal.cpp.

    +

    Definition at line 74 of file hiduniversal.cpp.

    - + +

    ◆ Init()

    +
    @@ -427,11 +417,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 96 of file hiduniversal.cpp.

    +

    Definition at line 96 of file hiduniversal.cpp.

    - + +

    ◆ Release()

    +
    @@ -454,11 +446,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 342 of file hiduniversal.cpp.

    +

    Definition at line 340 of file hiduniversal.cpp.

    - + +

    ◆ Poll()

    +
    @@ -481,11 +475,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 369 of file hiduniversal.cpp.

    +

    Definition at line 367 of file hiduniversal.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -508,11 +504,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 93 of file hiduniversal.h.

    +

    Definition at line 93 of file hiduniversal.h.

    - + +

    ◆ isReady()

    +
    @@ -533,11 +531,13 @@ Additional Inherited Members
    -

    Definition at line 97 of file hiduniversal.h.

    +

    Definition at line 97 of file hiduniversal.h.

    - + +

    ◆ EndpointXtract()

    +
    @@ -589,11 +589,13 @@ Additional Inherited Members

    Reimplemented from UsbConfigXtracter.

    -

    Definition at line 295 of file hiduniversal.cpp.

    +

    Definition at line 295 of file hiduniversal.cpp.

    - + +

    ◆ SndRpt()

    +
    @@ -617,12 +619,14 @@ Additional Inherited Members
    -

    Definition at line 425 of file hiduniversal.cpp.

    +

    Definition at line 423 of file hiduniversal.cpp.

    Member Data Documentation

    - + +

    ◆ epInfo

    +
    @@ -640,11 +644,13 @@ Additional Inherited Members
    -

    Definition at line 64 of file hiduniversal.h.

    +

    Definition at line 64 of file hiduniversal.h.

    - + +

    ◆ hidInterfaces

    +
    @@ -662,11 +668,13 @@ Additional Inherited Members
    -

    Definition at line 65 of file hiduniversal.h.

    +

    Definition at line 65 of file hiduniversal.h.

    - + +

    ◆ bHasReportId

    +
    @@ -684,11 +692,13 @@ Additional Inherited Members
    -

    Definition at line 67 of file hiduniversal.h.

    +

    Definition at line 67 of file hiduniversal.h.

    - + +

    ◆ PID

    +
    @@ -706,11 +716,13 @@ Additional Inherited Members
    -

    Definition at line 69 of file hiduniversal.h.

    +

    Definition at line 69 of file hiduniversal.h.

    - + +

    ◆ VID

    +
    @@ -728,7 +740,7 @@ Additional Inherited Members
    -

    Definition at line 69 of file hiduniversal.h.

    +

    Definition at line 69 of file hiduniversal.h.

    @@ -741,7 +753,7 @@ Additional Inherited Members diff --git a/class_h_i_d_universal__coll__graph.md5 b/class_h_i_d_universal__coll__graph.md5 index 5c56aa71..13f76bd9 100644 --- a/class_h_i_d_universal__coll__graph.md5 +++ b/class_h_i_d_universal__coll__graph.md5 @@ -1 +1 @@ -9798e993ef1d49a2c1f0b1530f49b8e4 \ No newline at end of file +358769c50e28d51b35035f35270dea75 \ 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 43bbf8e6cb1c5b9c72334b4333cca3d041b7711a..3df6464c468b2d4cb8b1d32f99452744937a3948 100644 GIT binary patch literal 24219 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 literal 25059 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 iCK3Ot0+9y%gS;?6g#AXbmc%&knb%3 literal 15320 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 diff --git a/class_hex_dumper-members.html b/class_hex_dumper-members.html index 8d952b32..d084cb01 100644 --- a/class_hex_dumper-members.html +++ b/class_hex_dumper-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

    - + - - + + + + - + - - + + + +
    Inheritance graph
    + +
    [legend]
    Collaboration diagram for HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >:
    Collaboration graph
    + +
    [legend]
    class HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE > -

    Definition at line 25 of file hexdump.h.

    +

    Definition at line 33 of file hexdump.h.

    Constructor & Destructor Documentation

    - + +

    ◆ HexDumper()

    +
    @@ -143,12 +127,14 @@ template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>

    @@ -118,9 +100,11 @@ Public Member Functions

    -

    Definition at line 31 of file hexdump.h.

    +

    Definition at line 39 of file hexdump.h.

    Member Function Documentation

    - + +

    ◆ Initialize()

    +
    @@ -171,11 +157,13 @@ template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    -

    Definition at line 34 of file hexdump.h.

    +

    Definition at line 42 of file hexdump.h.

    - + +

    ◆ Parse()

    +
    @@ -207,7 +195,7 @@ template<class BASE_CLASS , class LEN_TYPE , class OFFSET_TYPE >
    -

    Definition at line 43 of file hexdump.h.

    +

    Definition at line 51 of file hexdump.h.

    @@ -219,7 +207,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 c9f3f213..5f2c81dd 100644 --- a/class_hex_dumper__coll__graph.md5 +++ b/class_hex_dumper__coll__graph.md5 @@ -1 +1 @@ -5be5e99ec5970ed3fe98ca3cc812cd40 \ No newline at end of file +d0d43b636db83e71ec57c3a665a482d9 \ No newline at end of file diff --git a/class_hex_dumper__coll__graph.png b/class_hex_dumper__coll__graph.png index 9890adfec355777c89bdc7be6e1b6200c7e9e6ce..73120ef735979c17ca4ef613dc318e4b270ab85f 100644 GIT binary patch literal 7020 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 literal 7008 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 literal 7008 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 121 of file hidboot.h.

    +

    Definition at line 121 of file hidboot.h.

    Constructor & Destructor Documentation

    - + +

    ◆ KeyboardReportParser()

    +
    @@ -184,12 +164,14 @@ Protected Attributes
    -

    Definition at line 143 of file hidboot.h.

    +

    Definition at line 143 of file hidboot.h.

    Member Function Documentation

    - + +

    ◆ OemToAscii()

    +
    @@ -221,11 +203,13 @@ Protected Attributes
    -

    Definition at line 165 of file hidboot.cpp.

    +

    Definition at line 165 of file hidboot.cpp.

    - + +

    ◆ Parse()

    +
    @@ -271,11 +255,13 @@ Protected Attributes

    Implements HIDReportParser.

    -

    Definition at line 127 of file hidboot.cpp.

    +

    Definition at line 127 of file hidboot.cpp.

    - + +

    ◆ HandleLockingKeys()

    +
    @@ -307,11 +293,13 @@ Protected Attributes
    -

    Definition at line 151 of file hidboot.h.

    +

    Definition at line 151 of file hidboot.h.

    - + +

    ◆ OnControlKeysChanged()

    +
    @@ -343,11 +331,13 @@ Protected Attributes
    -

    Definition at line 174 of file hidboot.h.

    +

    Definition at line 174 of file hidboot.h.

    - + +

    ◆ OnKeyDown()

    +
    @@ -379,11 +369,13 @@ Protected Attributes
    -

    Definition at line 177 of file hidboot.h.

    +

    Definition at line 177 of file hidboot.h.

    - + +

    ◆ OnKeyUp()

    +
    @@ -415,11 +407,13 @@ Protected Attributes
    -

    Definition at line 180 of file hidboot.h.

    +

    Definition at line 180 of file hidboot.h.

    - + +

    ◆ getNumKeys()

    +
    @@ -440,11 +434,13 @@ Protected Attributes
    -

    Definition at line 183 of file hidboot.h.

    +

    Definition at line 183 of file hidboot.h.

    - + +

    ◆ getSymKeysUp()

    +
    @@ -465,11 +461,13 @@ Protected Attributes
    -

    Definition at line 187 of file hidboot.h.

    +

    Definition at line 187 of file hidboot.h.

    - + +

    ◆ getSymKeysLo()

    +
    @@ -490,11 +488,13 @@ Protected Attributes
    -

    Definition at line 191 of file hidboot.h.

    +

    Definition at line 191 of file hidboot.h.

    - + +

    ◆ getPadKeys()

    +
    @@ -515,12 +515,14 @@ Protected Attributes
    -

    Definition at line 195 of file hidboot.h.

    +

    Definition at line 195 of file hidboot.h.

    Member Data Documentation

    - + +

    ◆ kbdInfo

    +
    @@ -530,11 +532,13 @@ Protected Attributes
    -

    Definition at line 130 of file hidboot.h.

    +

    Definition at line 130 of file hidboot.h.

    - + +

    ◆ bInfo

    +
    @@ -544,11 +548,13 @@ Protected Attributes
    -

    Definition at line 131 of file hidboot.h.

    +

    Definition at line 131 of file hidboot.h.

    - + +

    ◆ prevState

    +
    @@ -560,7 +566,9 @@ Protected Attributes - + +

    ◆ kbdLeds

    +
    @@ -570,11 +578,13 @@ Protected Attributes
    -

    Definition at line 135 of file hidboot.h.

    +

    Definition at line 135 of file hidboot.h.

    - + +

    ◆ bLeds

    +
    @@ -584,11 +594,13 @@ Protected Attributes
    -

    Definition at line 136 of file hidboot.h.

    +

    Definition at line 136 of file hidboot.h.

    - + +

    ◆ kbdLockingKeys

    +
    @@ -609,7 +621,7 @@ Protected Attributes diff --git a/class_keyboard_report_parser__coll__graph.md5 b/class_keyboard_report_parser__coll__graph.md5 index b3538af0..f53186dd 100644 --- a/class_keyboard_report_parser__coll__graph.md5 +++ b/class_keyboard_report_parser__coll__graph.md5 @@ -1 +1 @@ -bb7b1a74ec2625233c79c3d3448ef47a \ No newline at end of file +f2c6d00835acadc8658c82e0cf0d6156 \ 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 46745bc2debf7b056f4050139bcbd9b273e0bd52..103a65c2707ea0ecf1a42d611a1c1cf968726ead 100644 GIT binary patch literal 12026 zcmXY%b6_0Z`}Sis+So?pO`|sU#z|wdvD(JA+1R%2G)`mNXl$dwJJ0X??jO4|yE8lI zoH^&7`}*8hn34hn4TT5=3JMBMT1s3Q3JO{W*!Dm|0Nz({sO^CdXa{A8C{)!1$q^J3 zYlF17h^i~}nI592ssuK<%pr6EVk~+tbq*CN97wzn8R;X11OuZ##S-S%Qbr0X5GF`M z9CXwvRSh%a0Vi4=j436x!SlYoy1Tx2{!{uqu6=ak!sTIO_4m7%y)*FQNi-sGkdBuW zrp^IPA-UrCsgBv8#q8%`FCtmMal#Nm%T%&Y{r}BL>YUWd1NMb4|NDhy`Pk)ur_sQ} zSlV)YaXBZkU2mIT&=UH`4nr%GkTa6VEx( z{N3?un1;^tjD>OsT@x|J&^s73NsgjI}_F@&$%t%Nvff z-btv4SK|M6F+Tvunuz3){x>F3zW+eqEut{9D-h60q-<9ja?8}pwI%*-hmd~+_HIX* zs;AD^+r!33EdCDt!U~r6x479KPrCH;^D{nKE|A6^Nny`#F=%rP3&tR~Lk>u1)~Zu_ zy51|boGl9cJS<&9`FcIdRv8XOJhV`$qq5QAR=IW;aDsGuvKXW9^XkN?*VaHglO^C` zu|JkNmnZST@`2pvWqK!>QH_yNxd4gFdO@!0^0W8LXRm)}%}HQa4EFZ7F^);4T+txr z^Ln%KxPKZ3Uh_LecBhTi*J9om9XHXVPZS$H0fupZ7=fDlKxc)ob;BcVO_G1@8txPpc-}6eslDfPf`*90z*m(9jYM7po15ftF35tv0i4SLt`k z7@i{`J`@!F+#8v0b2_0}WzwjUdOF|eWZIL>}*^O0h)fHl4AFOT<&>+{2= z56e7sKD-KWc#>xhB!;Z8RHazvPs9X1+r|V2*-OO}^ z*lYGNh8Wj^(TMvqQ(F`HI0OO+YZB9+wttFUZ>)_(34IJO;AY~vf%WM?@DA_o?Tt+5u`h#^TkGDbnl^_2 z-SVUTK+S;1^?7Kcih~2f6zTAH$f)CLkQl+I0V}Hzk6NQjSN+G6*e5c#zaW#jlCL|z z&Blo=iQfz>dVfG{zm2EO8zL~C1CxS-*YVI0S5lzlUd<@6{pr|BP&2ffyy{C??uLES zaKlfR`)=iwUpNs&O57R@RrkihbhbUB;c9V@6WOji$Uhu#Av%Ko9c~5IH8@rjvhs;7>b@jjF3X3LNK<>ey*m%QLk2{gN3HrQiFwp7;; zisR6yn*(ePLE_Dj7}L?DLSJ8~9ij;8B!X***m9j|{Pw^4NkQwd7_#bb!*O$6K0b_^ zH56ANvTR*1pHgYDrG{fU!|_;TfQ5>~K#ZKf80ZcsCif_CzhnY8kHDeqAKnjAtJYtq zGNK&&chSYRhk}ky_mc2!AWHFQwz!y(!z`4u!~50U7(te;D2$;JaO$Tx2q zEN90iklS1$Ch)$PXch-AmeG{J5omcH9u;Tf(V>u{6Hp_GAr^jW`M&KBrss^CX}mpK zP2Tc;yfiY>w#d0ZTO9@OyuJR*qwZ58ZzC?DRH8f77J7R$aX)KZ46LnfkRv#Eyx7o7 zVS4y>ef9QqkUiIEtK>JzivNRs#{@*b&TdS-DO>W+-eF-!3@9KwPqqcWw_5Bj96#3BS_yk}BO?u2gf4=*Gj3?b$>3)e%p90&}hAORQMm_oK7%N`=EBz+E2yzk?q z@Q^tW-|}QDG^(=>v3nBqN{g9H)!f|w;YQ-*gX9c5U+-4~6-JWgh7j^eJPp&iZR760 z-6hy6m78~%9DCJWf4}^`KSt>0GPY56!_&UJk$&TLJxp)P3UhHZQz&aWl_T;Ad8tf| zsg!y{-hfVH^@D9N2t_iN0&F-o`k9&|I=UAca(I@DXwYEsYu)hieC{tFOpW%}UOz?Q z8VAmwz0HUs%(Z{H%_6jf7QD0)5fdZWM0UDEpn?(i;d)uW9c~L-RA2}`3eyd@IUZ5T zfrNei(g>;OO1o1;EHqJvagCM`N%mlKfWlfY|{uEQwAFo@v+5ym*T{ze4!}ME#-j8#OHd25gvj`$G3R)@lXE z6&;MFQgfuG%){M?T@=ZAy4DTnxBOBVXQkZ|GVVJe_K5P5_^8RAA)tWy`M{E?;Mk=s-Hw$&|%{Dkok{1ru$a=Q7j76g zj-Y_BuwO&WaFt&&l7Ny8wO16PTPTBjq^Vn4Y^(itjrz(fD7R!?zD-hfybe7WD>%(y zB-$s(h{`*c?enH}N;jQa`U|Ufr?Usq{;gD6`q2dL+kIc>GAEkR&Isat+SF?rA=4b$ z)W3l3XY6HbwmFQlFG1L<3-iUx)| znA?$$CYiiW{l8b|Z%Kl8V>ZI$W^N-s(3;`4^xA}=MWW#?v+R8>Vt@Imvo?nY`|UDT zhb+~Ph(8c7o~)n`b;J<%=hZI$ilL-=P2jg0;Mq1YxHZfXked2fpJ4rcmtbrRRh^Om zmr0%TaTiO-tQUc}XSDNq7hPn=7df1Xj#esr9uI-TDS(zO;I0cnhnt|neiSvuJ9U#({f59M$S}vY z1vdHPNP<+*uELDr(dgF1n6YTEFZfm2XiOt(yQ!giS#Nz;54trCW9-ooWf;b{!+gz+ zfIqM)rA*qG^~J6ID7nnPwbL-J@Vkme$L=GY*3X2GRXY}wx1$RMs6~#h8apP>1DVY| z9~4ltGPqrT4;jwq`?&-MaWlossR@~DK#B}v(<(kvjx8|yeRJR1ZUWOnp>5&#EyH}q zl*PsSC$ksBRE~wJPEKHWyx+19-uD1QI)tmRMuMZo2K+kNPC`i}%^6k=as7Mx_BD-2 z<~h`b@ku*=Ew^bpW}^tc&;4B22SW7tQ*Qlk13{T7=4@u#^WI;C=zZm8vt zjCwB(-mUS(&@VE)GH8ey`TdMTfpHB!p4~@cIv5-yWrd^ig!Ctr#DKFI^Suih0X0pp zJ3%@sBBgR?`j|(ui#aU56oCMr{#Zo%68N>Op$6|pzSlYGeu%QZkqf;UU#neg-?OGS(8oN=M9!Gu_Aw5mfw9vZ6EQ z4xNGG5gH`SU>O+{^a>d^d=g;|DvYWA_}BPP)-itz?|IqjvrxFdnIU>*e}a&hR1c}qm>7a^dHT=G6DcbMuRZ;1bKXKL=>D>I=-@FQqy&DQcEUyljR zH4}nU$wEoRj?aiD#(>LdTfV>h!rOV@BSUq46Xif+y7vuW1HPWdctnuq{5wwOvTMX;kNMD``F>@U zRO#(p?H^2`-+y^+$+2Y~-r5z}r!f!~N@ol57}org*0ucz+NMX zH73J1@EA7acs%5}&R)&(*A`)fHH0M6ujloe9G<=tvRt=%oCs!ag7$}*Rcuz0A3|nd z&>@G_ilQHP_QfPW26!c1GzUk+2p*%7xF2nQ6oZb&!9+U*uFv2rtw= zwB$HIyF7NMY5JbFOot~ze-(j0DGzAYB(cv~0dncwXxSX<(b|pfYtk|+qbf)w2JYi! zY=Mm1bH~Iuq(?2|{AzeUvOLdOA|6Hh1z*O|r;fOI3fvKPtz{9)u|}FkY)?*ICexPP zTcmZGDn>ji1c#3Um#__|Rz+dnUT*sB}y60%?Swk1G%v2>?iEJT?^ut z6*t?1yBkeFz297XT(XQ?c17v;LqB~}lnt`__gPydOU}-I!AGpWcPOIDXin; zE6R+I`4(3J@!?cs-rFPX3f|HjRoGOdLy#hHLbYAPUUFAF=@V$WjE^{pDPYCbgbg zX@vb~y%2f3=3sCW*1<$tCGLogx5pQ(T<$r#>a~w(|p0 z4u{U%U5d@|>|yzi`U1jKh&`EG(n#~9{Bp$Opn3tT>X!+MwBR<;Tt8|LHDwR(5YE=UEsf=XX#slX7LM z#?2HgUNEjmm4iCYX^3^roUH==fEf9EedyX5oWYbCS5Q^khIP?xMw zho*Vz_#1lV98togEerPd(x1yDqvz4eKG!kk3ZfC#`D!<3NgYfaNt0w-bl@ltQ7M|^ zt5oAC>m`?$rdEzBxhV>t2CR1Zm}qxAk_z6Oa@&gvhI_xcr9a>(C5r?2FEq&4tf`jb ziZmn~_rpv$?uBx(0vB?6qRZhWsa{73kJ42p-W;vGG?Inc$!=v-l#SrarJHummMs92 z%01tfrP6rplVcWT@C~T9e2^?=*@UcSLqk6{4eO1iC)pPaMvcyve6@XSFtDXQmcceD z)WjiwBuEi5t(bLz$2K>r*@C5K`&(In@y9VZep!)2hl9xbXP487wEIEkvg3gQ4aa8k zHy3uH(zL2zd#)e}%76FH ztpRTYN~mNYF$1tICO_MjXARJ_NBv>g&abCm&w-jQ|{JyS6h988F_i?uvfapcPO`2bkI{ zpp?#vUH~*U9rOYJ6!^=GFAj8itv@9?24lz-0pizy&%9v=$k{yGReoy|Qf$+yGH7}R z$A3O^-$ao=$u|6l9qqeb7wlS_ZI(p=zSVSMJ~^$MObv;i0y=sIAF=0rw!&pKl>@yu znVrqE_n>d70{~_DgD&(*L7l9HYI5-yA^n7v#&o#=gjd#hi#HvU$wg*f-WAH(PM>TR zlDs@DRix8L1j+qSDk>@xx9PpnWbBOUPVtNNa5@sm+gg8I!b5GK7P&Btb6`+?+Y%GT zcWA+IQ8BT-C!k|{w$k;C<}ldmq!|P3g!Y{E@{*VF)Ycj3>~23HX`c$QtA$sY$|sv_ z9bys^N$#Y}`0dx*B)F{RasXDXA~zOLKMaVb z>9jkusFf-Q0izE|tASryf`a>@JX6T!vQmpW` zP$m(M8Z0Vx7oIUM5%hJ@YQ9X`%Rj(PNVm%8e63Z&Y7i+`A(I!2SuuOY(-jqiy|xB}2EF#u86Q!Hf&$m)myu*U^pD)XAGDU0R0LjJz@=1p%C zxf@~tkZ@>@aPm5zBC(Gx)tZF#%cpZ!UL9onXzvx0VbX)aQpeCGuG{bdg%bHdZKC%@6$(5HqLwUym@HQ5 z^=i6e$r0S@*ms&<@wwlYjE*&F)th0x17jBaoXDUun8IzFR_l6Y98kzB+tyO5S(}%e z!XoR_>)UP7Q*yE1Zhk~kLDhOC!mg7Am7oAa8bbwM1u7|Jkk+~e%Sa+F#)-Bilcsz~ zOjE%Cc5?61wxL-Q@C*i3xSX$9BDcF-=>HJ=lblg7k2L%#>#|Btr`cPS84m?_L}Wb8 zi<(|cT(V8@^sZ{9rI|AVk0lS4@Y57fPm#d4Qs@MhYSJGRT*jf`^C?i3cB4#i?MQr~ z0O5VPxw!^vJ9`H!P-EG{#~U=yUGHQ%GM2KTL#@UgPhk(xM8R`{{Puj(q!$X+j8okp zYp+X?Vg4oiYJ_V@hk7vHp9yQ9<;XSBma<#oQG$$98>qOJS^^opyFHrqhnDTd<0)|y zo+75Fcl%8nSMSVgpA14m85!gY>7-Tp)Pqg}*I+kf|GCWR5Vn&FAx*oWad z!R6pkHB`70#23Tg`;10UwqssMepl4s$0%Z+aD~J|Eu$hvcy)#noz}dLd$50TS%ezg zYyeYnyl^rxAt6JXF>WHQPOHT4VQC-%qJP#;d0?tmHNUBOaNVKj;IidS`u*lE5iV$h zg{}KI1O!pJ3Ul026)xfv3W*&!2Vy>F=JdJwVt`y>onRryn;W(~UV7?5GIbcc$slIA5lt8{QEM-!G)GcmIoEMR9@G{KKsAzE(-4PC#C09+210Hd z_SG~p9KQ9fEzbpLl__k+;48A;*MYhm{Z4mf2hX{hvp{iVx^~AS{Mu1cDq7ccHdC1LOA1Kt3juKd40xbudQz@T} zk`+;kfbTAGRY@5|54A^Q;xDkmD68v;F;!$KT_P z5+NFd0^&vD_);G6Mc4C!U8egZ)KbsO=oM~A;~oDQ(+J#{vX5viduZrCF%CBEEsQPTfnHBB{Y?I_ z*44h*@Or;sVQ8f*H``%E4wFh=QpO}SWS?c0f933Y1#Q$av0OMPWx#wm6!47SQJWv* zW>C7%=g-SGIZU@#zX_a@(Yohzw&5eA^Duing4DR_siD8Q2hAgVVW5c5qE;*$oF3yY zjlHk;L?=Ni6!bEiP32g$xZJ{D)-4Uro>$U}4^U-Wh3Z)>2)ypKKJ-{jXK!mXbn| zhm;{haC7(NE;@uXr^t8u1~ZEn76#a;cSJ zre6OtIOW$|2_%nct7~-Nyt`=U%TZ;UrSEd+>5-8giqw#%?YpDB&Zew?K5cSjQ8nAq6mqmN{%`K(&rI61yCsvA*-0VVF53VK z>R2}rLgj?smNL0*J~M{MR~h*98#My3=KjE0|CX%j3C;j{0}+FE&3%ld!!tCJU;R(r(j+>A3chhZQ+i19OUY zX;A!%laWPw?V@A|Q!aRLy{Y?hbnow8M#N#$z4cjk;ODsC-iG6etIKvX- z=`jZm6?j))KRwq-H&p+~wzzmmK78N~v6y@q_R!4j>aZWy!mu?@&p15ksKiVW@F4zA zJjJ99Ppp1!I+#U>JNFf|U!A<)$@;#+d5RjO*8)*%ga109ajneQDcE!Db=8OnT()xH zrK2M^m#4&j^Gk#6sMZ>^35nM#meW$qmt-+H;_f2h*2)Xif4JBkPos*cZlAR@rf4B}P9B&Rf_qR@gc5K$pf}@xxfo6zuQ1WNjDzem%TD^O(!&u~_C< zy!k>e7;-85wc)%E^SSekGCcZklsQ-7XSjxMClLAH&S%P^odVPl*9p zYnm&QSf!N29Hw(lOpqD^lgBZA7fBh-As?vNIHi!`Ey$q!<1GoM>&w5~7R z(Am)X%*K$&9e*De{2js$B+L>%FIR~3Woo0O!){(ggdF;LR1z?U6PX|1XscS1kFEpY zda;tD^Ovk=<%&anb#SmJ%6EH7gRbQtU=h)kfMObFeN_Gv@CHj^a5E8030vJuv|~N6 zuy1^r~~3ViiyefjFHw>GuqBo-Y>N=iykbxjXIRHP?nmtz3R zFJ4VwQRuay{OcOtIZ#t=FdjfTUZ_kj_~LPI)8_r!M*GTXIiutU1Mg}ijti9Ca|Q%j z?EqaM(QLO~_br=2h0dQr4M+x9?4Ac7KvQv*7tKcg)|f;@GJt@o2^TV-Akojg<4R=G zVC{*-Lk1G@SVOD?5=TJW9f_-Ml&e?fnf!?cr7(L>Pfzb)n04513gR*kR{_#xFY!Az z^V5HZ6NM~(ONPxt*<{zV?PigQGb!e!ze4VETdcCm-C&iALa&DfD)VcUtu&7}K;KvK5cH;4@s#sy@u z1v}SP-vsXFRH#asT>8(JYN@Lwbp|7-7#Yk3X{nS`ehfz5$H2vehsS{d@zvD-m1pAE zA6z1v#H{t$(TK!Q9v)&1NVlWHWc|9&EZPmB7=K=p9)b=je{6y9$&m7|y9KUA{`m9T zGE}*z&DKVhXJZEopEe5_9UW>4Mne&tMG|tjVl1;AhS6u$l#RbU-B>=~9yz|hd5r)v z5`YTrs*P4^&wt|;|B8`;4SfUugaD2pYklQaNEVxJi?Ck1^IoF9`C(7+CxH?`ZSA-` zU7J3i)=wgpp@M(y3`Ag`a^38W(!XtbJ&>|!)rp_?lz7}7(~@@2mur*)XHz}Nr*TT} z;IL?`+C;>Ve4*NNF#U>1;0XAfXuMv6LPBN%pOXY2>amdPJ)f>`dl1Q|sAKp=L(oaF zbYofPun!%9xg!hAZ=C(}3RcZ;*MMkJ5*CI6d~9l$U-QENnJ?3pB${FuE5wW8sA`xL zeJPyavf&0LmWhV2Oh3!Awx+f)Hi4DLj!O*%a2N=YeZ ze{W3kNav9R2GwGPOwCB=KhdO~w~wmNx3h{8D1ilB7E=^PFaR|xMkD4%!bU*-PkDop zXmRaVo1*mH_Hc~=XVrZ|E=TZa&M#_6_y!IZiJ;Y?LeHVd!9?b+!|=lJj0uw5(|3pmS4!P;P~N55Y$fTr~fUOs5>c(9ZH^MY6u)NuuS^8#QMiJ&RKvw$4TiD?G7 z$o?~1jihoE7r-kzQXNcYb?VmH1e1cN+@=_PX>o)nqjGtJ)B?jK;DXO;lz^IXdh z6Iric2nEI^PM2a&wWn?3VOTSipZj2cP}=6}NoYP48hr%|`m8wM0gi&%jcEsN2C_nC}+kXV; z0NfFQm^PRaEFiJo?ov#j?Ww$TvCI8B{TfTpbA4jvyn+2|s{ zln8@JgU}3UjIbpigkul4?3h?~`rxq#z7xseSq1&4&#XlJ)N@7QotPE@yb%V6h=B6S zLc=2=;{|nuMb7W|M+yV=VH#pW{u0_CtVAlzgIrXK^dJMDyGCKu*Cq-IUW#pEcSATL znArpvMbOt$uwhyFvM9v5X>2HyuUXbfL|Y;p=a+&=q4fny*jz4^-Mi`=y%04KMUKP^)JwlVUuQyf=??|< zy5`iwakvAXLl&nHOI!jfBxM>JcCa4UAW+S5Zv+?U31BTmQjye^iZN^(xkd4&0BfXJ zy#jWfPn?67#7S^U8cWoVCXW%h+ywB4k5?@&^Zsy=b-n$Sfa=1szufBa%(Ith{WC>k zI+V`CmPg|3o%~LP|4-tMrs1=#@sNkn!;tJz$4xAnGxhde-l)x#%yz41S(^@XKNJodBWY1yb_Sby9rs1IJ^~MPLv`;#)yW zOg$LGpw8d~SI24tiW(t;{5CRHMg;H};^4y51sFa9=7LC^GFUJ%=1eUuShIvH7LTsA zn;`eXDTt!fKg<{g9a~u`^|-bkj2tr# zAYv4RO`tTjccYhmSUSmjshXRe|8(^I3bM7G40> z%@{`!0tKtt*V<*-Rg^v}HC zHATX29`~oe9Mv=r1*efIF%H#?LL$Han3ovfG03%+EDi$sG2xK&$CCAmMftaN+^<+G z;~S!emuF!~y}Q9dce=Ge4CS-LDWi<22C?b*G(SR>g5>b9YElh}f{osQjBsq?Cq@`b z97XVM6L$@Pw+TVaEtp0_nTAS~%hxrQq-P3T5%Pv(h2{YljEv18)!MXIkH3*cd@W8C zi$tkaeto*xWk5IY%XGUK+hX);NN4WE9-{K_k?mSUyGqIPsyh_g$?u$$G$WN{ewKtz z@BzHshXjjVnMOh#yHJ~aKaIpM4ppS|n2J1x;Vxf7Vu)xR(_NE*V{>B9CvA2g(y!a{ z-3WLhsgkm5!}&Az@o$@j5yTMxMK0Qo%u#8AOdK1t@sALbhqI9x?o7$9QfnMrvSm5T zlE7$3#eRNKcC z6-iUa5&#)tI>D`@?*Ht_RDeQgLrOp|0&LnAa99DrA`BBz{4@W5-fUK?9H%B$m_4SR z8Xv#%`}E(+^m+;xl2EcmyLCI4=R`E}K=LL}lo3yZzZ6`?f*MaFmKi4L3+lEc0TRMl z&3->${W(lT;T4_#8KYsLE9;#Q!+FvE=Y2*5u004Hd%y617dsaQgp*57$?X4p;Xf#H mQf*0~Ebaf-PIS08MAt!lQhPrA4ZzF}B`u*KUL|Vi|Nj7|CoP)* literal 11864 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 diff --git a/class_keyboard_report_parser__inherit__graph.md5 b/class_keyboard_report_parser__inherit__graph.md5 index 5b9658e5..c76aa0ce 100644 --- a/class_keyboard_report_parser__inherit__graph.md5 +++ b/class_keyboard_report_parser__inherit__graph.md5 @@ -1 +1 @@ -c874e74f72d0db473ce869577e6f92d6 \ No newline at end of file +adfb83fe955c3333a5c32778e9b1fc68 \ 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 a9cb1ccb1973a8c45c97cdbce2de19e737d5e92c..d4ab049fba6e8ee1a18a424ec7c1f0c032939725 100644 GIT binary patch literal 5212 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 literal 5232 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 diff --git a/class_m_a_x3421e-members.html b/class_m_a_x3421e-members.html index ce57661a..9c590ac4 100644 --- a/class_m_a_x3421e-members.html +++ b/class_m_a_x3421e-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +
    class MAX3421e< SPI_SS, INTR > -

    Definition at line 109 of file usbhost.h.

    +

    Definition at line 132 of file usbhost.h.

    Constructor & Destructor Documentation

    - + +

    ◆ MAX3421e()

    +
    @@ -159,12 +139,14 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 142 of file usbhost.h.

    +

    Definition at line 165 of file usbhost.h.

    Member Function Documentation

    - + +

    ◆ regWr()

    +
    @@ -190,11 +172,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 153 of file usbhost.h.

    +

    Definition at line 176 of file usbhost.h.

    - + +

    ◆ bytesWr()

    +
    @@ -226,11 +210,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 196 of file usbhost.h.

    +

    Definition at line 219 of file usbhost.h.

    - + +

    ◆ gpioWr()

    +
    @@ -246,11 +232,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 250 of file usbhost.h.

    +

    Definition at line 273 of file usbhost.h.

    - + +

    ◆ regRd()

    +
    @@ -266,11 +254,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 259 of file usbhost.h.

    +

    Definition at line 282 of file usbhost.h.

    - + +

    ◆ bytesRd()

    +
    @@ -302,11 +292,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 298 of file usbhost.h.

    +

    Definition at line 321 of file usbhost.h.

    - + +

    ◆ gpioRd()

    +
    @@ -321,11 +313,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 361 of file usbhost.h.

    +

    Definition at line 384 of file usbhost.h.

    - + +

    ◆ reset()

    +
    @@ -340,11 +334,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 372 of file usbhost.h.

    +

    Definition at line 395 of file usbhost.h.

    - + +

    ◆ Init() [1/2]

    +
    @@ -359,11 +355,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 386 of file usbhost.h.

    +

    Definition at line 409 of file usbhost.h.

    - + +

    ◆ Init() [2/2]

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

    Definition at line 423 of file usbhost.h.

    +

    Definition at line 446 of file usbhost.h.

    - + +

    ◆ vbusPower()

    +
    @@ -407,11 +407,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 124 of file usbhost.h.

    +

    Definition at line 147 of file usbhost.h.

    - + +

    ◆ getVbusState()

    +
    @@ -435,11 +437,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 128 of file usbhost.h.

    +

    Definition at line 151 of file usbhost.h.

    - + +

    ◆ busprobe()

    +
    @@ -454,11 +458,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 467 of file usbhost.h.

    +

    Definition at line 490 of file usbhost.h.

    - + +

    ◆ GpxHandler()

    +
    @@ -475,7 +481,9 @@ template<typename SPI_SS , typename INTR >
    - + +

    ◆ IntHandler()

    +
    @@ -490,11 +498,13 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 521 of file usbhost.h.

    +

    Definition at line 544 of file usbhost.h.

    - + +

    ◆ Task()

    +
    @@ -510,7 +520,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 502 of file usbhost.h.

    +

    Definition at line 525 of file usbhost.h.

    @@ -522,7 +532,7 @@ template<typename SPI_SS , typename INTR >
    diff --git a/class_m_a_x3421e__inherit__graph.md5 b/class_m_a_x3421e__inherit__graph.md5 index e9dc0389..c1c302a9 100644 --- a/class_m_a_x3421e__inherit__graph.md5 +++ b/class_m_a_x3421e__inherit__graph.md5 @@ -1 +1 @@ -6b7dcdcf5b00fbf00c69a08de5fc301c \ No newline at end of file +0fb6ebaa0a7caab1752808a63748c691 \ 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 48dba11b330a4c0ef93ea5a3293fc4fba55dace3..d3ff945999a2b880519d75d87617aa5daba9180d 100644 GIT binary patch literal 5690 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 So&qp~vDB5dl`0f1kpBaw2gG>* literal 5717 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +
    Inheritance graph
    + +
    [legend]
    Collaboration diagram for Max_LCD:
    Collaboration graph
    + +
    [legend]

    @@ -151,9 +133,11 @@ Public Member Functions

    Detailed Description

    -

    Definition at line 65 of file max_LCD.h.

    +

    Definition at line 65 of file max_LCD.h.

    Constructor & Destructor Documentation

    - + +

    ◆ Max_LCD()

    +
    @@ -167,12 +151,14 @@ Public Member Functions
    -

    Definition at line 42 of file max_LCD.cpp.

    +

    Definition at line 42 of file max_LCD.cpp.

    Member Function Documentation

    - + +

    ◆ init()

    +
    @@ -185,11 +171,13 @@ Public Member Functions
    -

    Definition at line 46 of file max_LCD.cpp.

    +

    Definition at line 46 of file max_LCD.cpp.

    - + +

    ◆ begin()

    +
    @@ -219,11 +207,13 @@ Public Member Functions
    -

    Definition at line 54 of file max_LCD.cpp.

    +

    Definition at line 54 of file max_LCD.cpp.

    - + +

    ◆ clear()

    +
    @@ -236,11 +226,13 @@ Public Member Functions
    -

    Definition at line 114 of file max_LCD.cpp.

    +

    Definition at line 114 of file max_LCD.cpp.

    - + +

    ◆ home()

    +
    @@ -253,11 +245,13 @@ Public Member Functions
    -

    Definition at line 119 of file max_LCD.cpp.

    +

    Definition at line 119 of file max_LCD.cpp.

    - + +

    ◆ noDisplay()

    +
    @@ -270,11 +264,13 @@ Public Member Functions
    -

    Definition at line 135 of file max_LCD.cpp.

    +

    Definition at line 135 of file max_LCD.cpp.

    - + +

    ◆ display()

    +
    @@ -287,11 +283,13 @@ Public Member Functions
    -

    Definition at line 140 of file max_LCD.cpp.

    +

    Definition at line 140 of file max_LCD.cpp.

    - + +

    ◆ noBlink()

    +
    @@ -304,11 +302,13 @@ Public Member Functions
    -

    Definition at line 160 of file max_LCD.cpp.

    +

    Definition at line 160 of file max_LCD.cpp.

    - + +

    ◆ blink()

    +
    @@ -321,11 +321,13 @@ Public Member Functions
    -

    Definition at line 165 of file max_LCD.cpp.

    +

    Definition at line 165 of file max_LCD.cpp.

    - + +

    ◆ noCursor()

    +
    @@ -338,11 +340,13 @@ Public Member Functions
    -

    Definition at line 147 of file max_LCD.cpp.

    +

    Definition at line 147 of file max_LCD.cpp.

    - + +

    ◆ cursor()

    +
    @@ -355,11 +359,13 @@ Public Member Functions
    -

    Definition at line 152 of file max_LCD.cpp.

    +

    Definition at line 152 of file max_LCD.cpp.

    - + +

    ◆ scrollDisplayLeft()

    +
    @@ -373,11 +379,13 @@ Public Member Functions
    -

    Definition at line 172 of file max_LCD.cpp.

    +

    Definition at line 172 of file max_LCD.cpp.

    - + +

    ◆ scrollDisplayRight()

    +
    @@ -391,11 +399,13 @@ Public Member Functions
    -

    Definition at line 176 of file max_LCD.cpp.

    +

    Definition at line 176 of file max_LCD.cpp.

    - + +

    ◆ leftToRight()

    +
    @@ -409,11 +419,13 @@ Public Member Functions
    -

    Definition at line 182 of file max_LCD.cpp.

    +

    Definition at line 182 of file max_LCD.cpp.

    - + +

    ◆ rightToLeft()

    +
    @@ -427,11 +439,13 @@ Public Member Functions
    -

    Definition at line 189 of file max_LCD.cpp.

    +

    Definition at line 189 of file max_LCD.cpp.

    - + +

    ◆ autoscroll()

    +
    @@ -445,11 +459,13 @@ Public Member Functions
    -

    Definition at line 196 of file max_LCD.cpp.

    +

    Definition at line 196 of file max_LCD.cpp.

    - + +

    ◆ noAutoscroll()

    +
    @@ -463,11 +479,13 @@ Public Member Functions
    -

    Definition at line 203 of file max_LCD.cpp.

    +

    Definition at line 203 of file max_LCD.cpp.

    - + +

    ◆ createChar()

    +
    @@ -491,11 +509,13 @@ Public Member Functions
    -

    Definition at line 211 of file max_LCD.cpp.

    +

    Definition at line 211 of file max_LCD.cpp.

    - + +

    ◆ setCursor()

    +
    @@ -519,11 +539,13 @@ Public Member Functions
    -

    Definition at line 124 of file max_LCD.cpp.

    +

    Definition at line 124 of file max_LCD.cpp.

    - + +

    ◆ command()

    +
    @@ -545,11 +567,13 @@ Public Member Functions
    -

    Definition at line 221 of file max_LCD.cpp.

    +

    Definition at line 221 of file max_LCD.cpp.

    - + +

    ◆ write()

    +
    @@ -571,7 +595,7 @@ Public Member Functions
    -

    Definition at line 228 of file max_LCD.cpp.

    +

    Definition at line 228 of file max_LCD.cpp.

    @@ -584,7 +608,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 8d049f39..3f3bddcb 100644 --- a/class_max___l_c_d__coll__graph.md5 +++ b/class_max___l_c_d__coll__graph.md5 @@ -1 +1 @@ -14cf14911886c71d7e91596c82a5010c \ No newline at end of file +e2f8a913599c12410a410520826dbb8e \ 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 6d1bd6b6ead40e61dfd5fec52b18244eefff625c..92c76c3323a5d98a35a2f690faf6be6afc35cd6c 100644 GIT binary patch delta 2556 zcmbW2`9BkmAIG)1rZmT>oGa0sp9+&}h$(j{6{+b~nG+EK zaUJYzF2?LzB3}H8)YiO1tPnF_wX@9s-idX~GQ zzC@-GhsDIi+|v%KHhEnP^hY9*We*I+ZeuV|8^dj5PW)DW!p?Tbn@wiQ^rL|$YtTrc z^iK$=$lPNJpotBDk9s=KK`kpaV|S#L;X-mBJB;9yk)Hm%ji@}*N|*S`^Qu8P+!(BR zG5?WH@68|IM6t#>c-ta)Sn2XO*E1sGr2p|863Ov>k;!!*%VevBZHiB0_$%Y9SL%ah z-;>QR*B+j{g&4#(w07p}Q_Eb6s?vzzetWS~wd4ldeJXB!9{E_!@@hws$<4A`Q*FI8hn$M&g->hK z9rEH3Xm+_P*{uFrry`tP>&Hc`FO3u+2s_TYUe%PPk;eYF@ms-Ng{SOGQ(JxPStW>g zfsxEGNS+b*Gn`}@2L~oKO-~1A5Q&{ z>>6e4Oi|a{Ts(hXazT&Shitoy7uNm0-d*fZJ(7)C4;1^J@cL1j#A9`e0l4MvRj( zq;@_?pq-|3<_k!whwhNv76@VmR|QM4c)TguiZGU2mRqn(`}bd56?$ub^rDalIRYDa z*a&QTcMuGoMIah9N%{HZU7z#%-^BT8n~|2CjM$M~F@ToeWo>MJ&|-Vrj*GVTP)5)o zWpwnCpkH;Dk-FpQ`9+YIze8bNj~X)8)BaUcsI%ZgeeH3Qn=DNv)KqU9%Yi^3T1!h& z&2Z2wBW^M|D1xO57K@DQ^Kv!-6g{z={Rm8xwtsw%(MIKtxWBe{lb$+6%;m0ZhTG`5S88L))&T? zv#*>bM(geqNyFYk&j0@8daJ;PyYm&aae{h7jap|cX+xmwbJ5@g`(c0aErHM@v70q}; z()Ztg9C{&l01NVg?n^4A1vv=;AW4X(@qb2vRSxa#0RTvc_xW{VaxyT-(EkvG|BIn0 zIWpIoLcd(=fkGAYbYirmNqpPIGkFL%2m$j-{5+-=z< zX}J~$&-S%wQxC~rQCB{yqa&z;oS|8xC+Kns;S&mh{8Z2Y%|ZV5!B0mCT^$|0-R&Mb zOT!J+XO?l1Q5Mq;K~t+UEiHCt5fh0y{Vp*>LPmguQ~O)*$>D|@0>Obc-FelkmVlGxWDV+MPQmzcJEy^TSSFDEZHZP^97Y?m%v9 z<{{k@?DDl}QJh+mGImtd)Buzb&|XAc7_9A|?#LOsxhQ0GsY)sRSR67`GL57$!^gcp z83fDs_4oC0LQm8ynH=#fbH4RM96*VH2SVzeY*TDf3cE1hXmWgHm}d%BI(WiLXodelV+zh9Z0MN5=g5eVd)h#~6!5O`SnBMD z64pHqhN=o2eaX{mmfBNdK!*kDePoKX`5>1-FuU_jg+BVish}ciwp;K7vR==o7^0bh zpngRWByb{(0JN5Ad#vuJ@582+ERF6qryyhKm*_L~k)-A?l|eE~tMG^v zVg}}iriMn!kg0XMUk{vDaKP;7LjXqklv!PvXx~1SRYMK?hZCn`LwZZal;fvo%xZTf zOt*e6-x<0C1<#8$rjLo&)HUPg_?#e004MIJK|hW#BE?574zbd_YJFWKz-oaA)iAOZ z=Dec1x*JSFLnTIh1wK)d?5`4Js0uXL=q&gH9UAZGC6$^zs<_Q?++M6Q>ycmtbFU!<(2D{CG9AjrW{_ zsg{Y7$9YLW)ttf<<6u2|k)B{&;`fL&#u=5HTAG@SgL1d;?ri_6)@a53;oMom&(pmu zX*F^(Y}jb#Q^eZW-s*mIL#RS?%#{xc8U*Pz^~21n$&ICv;jhPyjBgS@}ebi2`2@+@c;CQaN4-nZdUruppmt|@upGq{MW5&i7Mu#J}(G&+cF z!-wb8*zWlWC}RlL#2U_-<%S7u1mz0{X%=VnU@(lWRl8>~X6l=PmR8%T5{r#QUe9ye z=rpRUiLqL)HY@hL^)MEkgwH|qH|{@6n{^bb0amq|Q1tPV7L)ux)D6~U literal 2613 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 literal 2613 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 51 of file hidboot.h.

    +

    Definition at line 51 of file hidboot.h.

    Member Function Documentation

    - + +

    ◆ Parse()

    +
    @@ -184,11 +164,13 @@ Protected Member Functions

    Implements HIDReportParser.

    -

    Definition at line 19 of file hidboot.cpp.

    +

    Definition at line 19 of file hidboot.cpp.

    - + +

    ◆ OnMouseMove()

    +
    @@ -210,11 +192,13 @@ Protected Member Functions
    -

    Definition at line 63 of file hidboot.h.

    +

    Definition at line 63 of file hidboot.h.

    - + +

    ◆ OnLeftButtonUp()

    +
    @@ -236,11 +220,13 @@ Protected Member Functions
    -

    Definition at line 66 of file hidboot.h.

    +

    Definition at line 66 of file hidboot.h.

    - + +

    ◆ OnLeftButtonDown()

    +
    @@ -262,11 +248,13 @@ Protected Member Functions
    -

    Definition at line 69 of file hidboot.h.

    +

    Definition at line 69 of file hidboot.h.

    - + +

    ◆ OnRightButtonUp()

    +
    @@ -288,11 +276,13 @@ Protected Member Functions
    -

    Definition at line 72 of file hidboot.h.

    +

    Definition at line 72 of file hidboot.h.

    - + +

    ◆ OnRightButtonDown()

    +
    @@ -314,11 +304,13 @@ Protected Member Functions
    -

    Definition at line 75 of file hidboot.h.

    +

    Definition at line 75 of file hidboot.h.

    - + +

    ◆ OnMiddleButtonUp()

    +
    @@ -340,11 +332,13 @@ Protected Member Functions
    -

    Definition at line 78 of file hidboot.h.

    +

    Definition at line 78 of file hidboot.h.

    - + +

    ◆ OnMiddleButtonDown()

    +
    @@ -366,12 +360,14 @@ Protected Member Functions
    -

    Definition at line 81 of file hidboot.h.

    +

    Definition at line 81 of file hidboot.h.

    Member Data Documentation

    - + +

    ◆ mouseInfo

    +
    @@ -381,11 +377,13 @@ Protected Member Functions
    -

    Definition at line 54 of file hidboot.h.

    +

    Definition at line 54 of file hidboot.h.

    - + +

    ◆ bInfo

    +
    @@ -395,7 +393,7 @@ Protected Member Functions
    -

    Definition at line 55 of file hidboot.h.

    +

    Definition at line 55 of file hidboot.h.

    @@ -408,7 +406,7 @@ Protected Member Functions diff --git a/class_mouse_report_parser__coll__graph.md5 b/class_mouse_report_parser__coll__graph.md5 index 0d410a43..d0d55908 100644 --- a/class_mouse_report_parser__coll__graph.md5 +++ b/class_mouse_report_parser__coll__graph.md5 @@ -1 +1 @@ -405a7d8e938e10b74a7c678fcf2f2523 \ No newline at end of file +f9c222dcf7223f947690ce165b721cd3 \ 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 617492db99c14f824c1c9ca34df034219823ab99..633f0cec2de9a5c080c3fe4d418b3f17b52a0582 100644 GIT binary patch literal 9593 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 KSSxQG@_zuH>P?vd literal 9458 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 Qo@GK&Rnk1KbLdgA^-pY diff --git a/class_mouse_report_parser__inherit__graph.md5 b/class_mouse_report_parser__inherit__graph.md5 index 6dbeddc2..74c8e5f2 100644 --- a/class_mouse_report_parser__inherit__graph.md5 +++ b/class_mouse_report_parser__inherit__graph.md5 @@ -1 +1 @@ -06cbf9c7fbacf4aaec1bcdfdc9d69628 \ No newline at end of file +a2dc8148933377ae624709e45bd68601 \ 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 986daf6fe6522d9d5327c4eea436b13bfd482ad1..f9c953eeb937d4247b75e83f51c70bccf021c730 100644 GIT binary patch literal 4874 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 vdL2m&+w?KvnQ$3uHbNv4S_e>{z literal 4918 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 KsZc3r8TLPVR9)Ht diff --git a/class_multi_byte_value_parser-members.html b/class_multi_byte_value_parser-members.html index 915006af..9bf583d8 100644 --- a/class_multi_byte_value_parser-members.html +++ b/class_multi_byte_value_parser-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 28 of file parsetools.h.

    +

    Definition at line 35 of file parsetools.h.

    Constructor & Destructor Documentation

    - + +

    ◆ MultiByteValueParser()

    +
    @@ -130,12 +110,14 @@ Public Member Functions
    -

    Definition at line 35 of file parsetools.h.

    +

    Definition at line 42 of file parsetools.h.

    Member Function Documentation

    - + +

    ◆ GetBuffer()

    +
    @@ -156,11 +138,13 @@ Public Member Functions
    -

    Definition at line 38 of file parsetools.h.

    +

    Definition at line 45 of file parsetools.h.

    - + +

    ◆ Initialize()

    +
    @@ -182,11 +166,13 @@ Public Member Functions
    -

    Definition at line 42 of file parsetools.h.

    +

    Definition at line 49 of file parsetools.h.

    - + +

    ◆ Parse()

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

    Definition at line 19 of file parsetools.cpp.

    +

    Definition at line 26 of file parsetools.cpp.

    @@ -223,7 +209,7 @@ Public Member Functions diff --git a/class_p_l2303-members.html b/class_p_l2303-members.html index a7afffe9..4d65e089 100644 --- a/class_p_l2303-members.html +++ b/class_p_l2303-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)ACMvirtual enhanced_features(void)ACMinlinevirtual enhanced_status(void)ACMinlinevirtual - epDataInIndexACMprotectedstatic - epDataOutIndexACMprotectedstatic - epInfoACMprotected - epInterruptInIndexACMprotectedstatic + epDataInIndexACMstatic + epDataOutIndexACMstatic + epInfoACM + epInterruptInIndexACMstatic GetAddress()ACMinlinevirtual GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM GetLineCoding(LINE_CODING *dataptr)ACM @@ -143,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_l2303.html b/class_p_l2303.html index c1e543f6..dd842b76 100644 --- a/class_p_l2303.html +++ b/class_p_l2303.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: PL2303 Class Reference @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    Collaboration graph
    - + @@ -188,6 +166,16 @@ Public Member Functions + + + + + + + + + + @@ -214,21 +202,14 @@ Additional Inherited Members - - - - - - - - -

    Additional Inherited Members

    - Public Attributes inherited from ACM
    EpInfo epInfo [ACM_MAX_ENDPOINTS]
     
    - Static Public Attributes inherited from ACM
    static const uint8_t epDataInIndex = 1
     
    static const uint8_t epDataOutIndex = 2
     
    static const uint8_t epInterruptInIndex = 3
     
    - Protected Member Functions inherited from ACM
    void PrintEndpointDescriptor (const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
     
     
    tty_features _enhanced_status
     
    EpInfo epInfo [ACM_MAX_ENDPOINTS]
     
    - Static Protected Attributes inherited from ACM
    static const uint8_t epDataInIndex = 1
     
    static const uint8_t epDataOutIndex = 2
     
    static const uint8_t epInterruptInIndex = 3
     

    Detailed Description

    -

    Definition at line 122 of file cdcprolific.h.

    +

    Definition at line 122 of file cdcprolific.h.

    Constructor & Destructor Documentation

    - + +

    ◆ PL2303()

    +
    @@ -252,12 +233,14 @@ Additional Inherited Members
    -

    Definition at line 19 of file cdcprolific.cpp.

    +

    Definition at line 19 of file cdcprolific.cpp.

    Member Function Documentation

    - + +

    ◆ Init()

    +
    @@ -297,7 +280,7 @@ Additional Inherited Members

    Reimplemented from ACM.

    -

    Definition at line 24 of file cdcprolific.cpp.

    +

    Definition at line 24 of file cdcprolific.cpp.

    @@ -310,7 +293,7 @@ Additional Inherited Members diff --git a/class_p_l2303__coll__graph.map b/class_p_l2303__coll__graph.map index abad38d3..3d1e5069 100644 --- a/class_p_l2303__coll__graph.map +++ b/class_p_l2303__coll__graph.map @@ -1,5 +1,5 @@ - + diff --git a/class_p_l2303__coll__graph.md5 b/class_p_l2303__coll__graph.md5 index 3fccb2c3..747c3494 100644 --- a/class_p_l2303__coll__graph.md5 +++ b/class_p_l2303__coll__graph.md5 @@ -1 +1 @@ -da3590f8b39ab5267484ef72f2899a2c \ No newline at end of file +a109a304a1e8b7c2885b5ed40e050f2d \ No newline at end of file diff --git a/class_p_l2303__coll__graph.png b/class_p_l2303__coll__graph.png index fec05578fd9a8ad768ab3998458bd8eab7ab9699..996af39891d7ba50356ee250ed46997a2a1ebe0f 100644 GIT binary patch literal 26989 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 literal 26973 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 diff --git a/class_p_l2303__inherit__graph.md5 b/class_p_l2303__inherit__graph.md5 index 8fff62d8..71c336d7 100644 --- a/class_p_l2303__inherit__graph.md5 +++ b/class_p_l2303__inherit__graph.md5 @@ -1 +1 @@ -dd455d55317b48c08e2327d045dafb04 \ No newline at end of file +2921424f538e5b4baf7916aede8cb89f \ No newline at end of file diff --git a/class_p_l2303__inherit__graph.png b/class_p_l2303__inherit__graph.png index 997e842221a89d00e42c6b169cc036464396fa5a..49ad0460baef587512b5084a19495d775e539283 100644 GIT binary patch literal 10093 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 literal 10151 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    This BluetoothService class implements support for all the official PS3 Controllers: Dualshock 3, Navigation or a Motion controller via Bluetooth.

    Information about the protocol can be found at the wiki: https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information.

    -

    Definition at line 32 of file PS3BT.h.

    +

    Definition at line 32 of file PS3BT.h.

    Constructor & Destructor Documentation

    - + +

    ◆ PS3BT()

    +
    @@ -280,12 +260,14 @@ Additional Inherited Members -

    Definition at line 23 of file PS3BT.cpp.

    +

    Definition at line 23 of file PS3BT.cpp.

    Member Function Documentation

    - + +

    ◆ disconnect()

    +
    @@ -309,11 +291,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 217 of file PS3BT.cpp.

    +

    Definition at line 217 of file PS3BT.cpp.

    - + +

    ◆ getButtonPress()

    +
    @@ -336,11 +320,13 @@ Additional Inherited Members
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 49 of file PS3BT.cpp.

    +

    Definition at line 49 of file PS3BT.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -363,11 +349,13 @@ Additional Inherited Members
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 53 of file PS3BT.cpp.

    +

    Definition at line 53 of file PS3BT.cpp.

    - + +

    ◆ getAnalogButton()

    +
    @@ -388,11 +376,13 @@ Additional Inherited Members
    Returns
    Analog value in the range of 0-255.
    -

    Definition at line 60 of file PS3BT.cpp.

    +

    Definition at line 60 of file PS3BT.cpp.

    - + +

    ◆ getAnalogHat()

    +
    @@ -413,11 +403,13 @@ Additional Inherited Members
    Returns
    Return the analog value in the range of 0-255.
    -

    Definition at line 64 of file PS3BT.cpp.

    +

    Definition at line 64 of file PS3BT.cpp.

    - + +

    ◆ getSensor()

    +
    @@ -438,11 +430,13 @@ Additional Inherited Members
    Returns
    Return the raw sensor value.
    -

    Definition at line 68 of file PS3BT.cpp.

    +

    Definition at line 68 of file PS3BT.cpp.

    - + +

    ◆ getAngle()

    +
    @@ -463,11 +457,13 @@ Additional Inherited Members
    Returns
    Return the angle in the range of 0-360.
    -

    Definition at line 85 of file PS3BT.cpp.

    +

    Definition at line 85 of file PS3BT.cpp.

    - + +

    ◆ get9DOFValues()

    +
    @@ -488,11 +484,13 @@ Additional Inherited Members
    Returns
    The value in SI units.
    -

    Definition at line 112 of file PS3BT.cpp.

    +

    Definition at line 112 of file PS3BT.cpp.

    - + +

    ◆ getStatus()

    +
    @@ -513,11 +511,13 @@ Additional Inherited Members
    Returns
    True if correct and false if not.
    -

    Definition at line 156 of file PS3BT.cpp.

    +

    Definition at line 156 of file PS3BT.cpp.

    - + +

    ◆ printStatusString()

    +
    @@ -531,11 +531,13 @@ Additional Inherited Members

    Read all the available statuses from the controller and prints it as a nice formated string.

    -

    Definition at line 160 of file PS3BT.cpp.

    +

    Definition at line 160 of file PS3BT.cpp.

    - + +

    ◆ getTemperature()

    +
    @@ -549,11 +551,13 @@ Additional Inherited Members

    Read the temperature from the Move controller.

    Returns
    The temperature in degrees Celsius.
    -

    Definition at line 141 of file PS3BT.cpp.

    +

    Definition at line 141 of file PS3BT.cpp.

    - + +

    ◆ setAllOff()

    +
    @@ -567,11 +571,13 @@ Additional Inherited Members

    Used to set all LEDs and rumble off.

    -

    Definition at line 519 of file PS3BT.cpp.

    +

    Definition at line 519 of file PS3BT.cpp.

    - + +

    ◆ setRumbleOff()

    +
    @@ -585,11 +591,13 @@ Additional Inherited Members

    Turn off rumble.

    -

    Definition at line 530 of file PS3BT.cpp.

    +

    Definition at line 530 of file PS3BT.cpp.

    - + +

    ◆ setRumbleOn() [1/2]

    +
    @@ -609,11 +617,13 @@ Additional Inherited Members -

    Definition at line 540 of file PS3BT.cpp.

    +

    Definition at line 540 of file PS3BT.cpp.

    - + +

    ◆ setRumbleOn() [2/2]

    +
    @@ -658,11 +668,13 @@ Additional Inherited Members -

    Definition at line 549 of file PS3BT.cpp.

    +

    Definition at line 549 of file PS3BT.cpp.

    - + +

    ◆ setLedRaw()

    +
    @@ -682,11 +694,13 @@ Additional Inherited Members -

    Definition at line 559 of file PS3BT.cpp.

    +

    Definition at line 559 of file PS3BT.cpp.

    - + +

    ◆ setLedOff() [1/2]

    +
    @@ -708,11 +722,13 @@ Additional Inherited Members

    Turn all LEDs off.

    -

    Definition at line 138 of file PS3BT.h.

    +

    Definition at line 138 of file PS3BT.h.

    - + +

    ◆ setLedOff() [2/2]

    +
    @@ -732,11 +748,13 @@ Additional Inherited Members -

    Definition at line 564 of file PS3BT.cpp.

    +

    Definition at line 564 of file PS3BT.cpp.

    - + +

    ◆ setLedOn()

    +
    @@ -756,11 +774,13 @@ Additional Inherited Members -

    Definition at line 569 of file PS3BT.cpp.

    +

    Definition at line 569 of file PS3BT.cpp.

    - + +

    ◆ setLedToggle()

    +
    @@ -780,11 +800,13 @@ Additional Inherited Members -

    Definition at line 578 of file PS3BT.cpp.

    +

    Definition at line 578 of file PS3BT.cpp.

    - + +

    ◆ moveSetBulb() [1/2]

    +
    @@ -820,11 +842,13 @@ Additional Inherited Members -

    Definition at line 604 of file PS3BT.cpp.

    +

    Definition at line 604 of file PS3BT.cpp.

    - + +

    ◆ moveSetBulb() [2/2]

    +
    @@ -844,11 +868,13 @@ Additional Inherited Members -

    Definition at line 613 of file PS3BT.cpp.

    +

    Definition at line 613 of file PS3BT.cpp.

    - + +

    ◆ moveSetRumble()

    +
    @@ -868,11 +894,13 @@ Additional Inherited Members -

    Definition at line 617 of file PS3BT.cpp.

    +

    Definition at line 617 of file PS3BT.cpp.

    - + +

    ◆ getLastMessageTime()

    +
    @@ -894,11 +922,13 @@ Additional Inherited Members

    Used to get the millis() of the last message

    -

    Definition at line 174 of file PS3BT.h.

    +

    Definition at line 174 of file PS3BT.h.

    - + +

    ◆ ACLData()

    +
    @@ -928,11 +958,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 224 of file PS3BT.cpp.

    +

    Definition at line 224 of file PS3BT.cpp.

    - + +

    ◆ Run()

    +
    @@ -956,11 +988,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 454 of file PS3BT.cpp.

    +

    Definition at line 454 of file PS3BT.cpp.

    - + +

    ◆ Reset()

    +
    @@ -984,11 +1018,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 204 of file PS3BT.cpp.

    +

    Definition at line 204 of file PS3BT.cpp.

    - + +

    ◆ onInit()

    +
    @@ -1012,12 +1048,14 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 628 of file PS3BT.cpp.

    +

    Definition at line 628 of file PS3BT.cpp.

    Member Data Documentation

    - + +

    ◆ PS3Connected

    +
    @@ -1028,11 +1066,13 @@ Additional Inherited Members

    Variable used to indicate if the normal Playstation controller is successfully connected.

    -

    Definition at line 176 of file PS3BT.h.

    +

    Definition at line 176 of file PS3BT.h.

    - + +

    ◆ PS3MoveConnected

    +
    @@ -1043,11 +1083,13 @@ Additional Inherited Members

    Variable used to indicate if the Move controller is successfully connected.

    -

    Definition at line 182 of file PS3BT.h.

    +

    Definition at line 182 of file PS3BT.h.

    - + +

    ◆ PS3NavigationConnected

    +
    @@ -1058,7 +1100,7 @@ Additional Inherited Members

    Variable used to indicate if the Navigation controller is successfully connected.

    -

    Definition at line 184 of file PS3BT.h.

    +

    Definition at line 184 of file PS3BT.h.

    @@ -1071,7 +1113,7 @@ Additional Inherited Members diff --git a/class_p_s3_b_t__coll__graph.md5 b/class_p_s3_b_t__coll__graph.md5 index 9944a07a..8d1c35cc 100644 --- a/class_p_s3_b_t__coll__graph.md5 +++ b/class_p_s3_b_t__coll__graph.md5 @@ -1 +1 @@ -7cded78e6e9cacc4756734b2d8e3a17f \ No newline at end of file +2afa3c1ee396396537c80a9e82e8ab8c \ 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 fafb7c64f54caa906f46b2905aefd2e9e1d44770..066951bb1c2613c0b497368ccf94ad4543b49474 100644 GIT binary patch literal 23649 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 q?IZ&(pC|K8{yk^_BbVIOFrGu=U(WOl$tAxG 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 m? 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 diff --git a/class_p_s3_b_t__inherit__graph.md5 b/class_p_s3_b_t__inherit__graph.md5 index c4a47a9b..485bbf3f 100644 --- a/class_p_s3_b_t__inherit__graph.md5 +++ b/class_p_s3_b_t__inherit__graph.md5 @@ -1 +1 @@ -af123ea0ba1b2bc2c3a6775f7cb65fa0 \ No newline at end of file +3d26891ef8cb1c025100fb5c239bf7cb \ 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 8cad5dca7ac0bce7da7070e3a39f2e976f9e0257..0991a4b69b1ef6078a11d7742891df4db7387d78 100644 GIT binary patch literal 4037 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    One can only set the color of the bulb, set the rumble, set and get the bluetooth address and calibrate the magnetometer via USB on the Move controller.

    Information about the protocol can be found at the wiki: https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information.

    -

    Definition at line 49 of file PS3USB.h.

    +

    Definition at line 49 of file PS3USB.h.

    Constructor & Destructor Documentation

    - + +

    ◆ PS3USB()

    +
    @@ -281,12 +261,14 @@ Protected Attributes -

    Definition at line 23 of file PS3USB.cpp.

    +

    Definition at line 23 of file PS3USB.cpp.

    Member Function Documentation

    - + +

    ◆ Init()

    +
    @@ -335,11 +317,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 47 of file PS3USB.cpp.

    +

    Definition at line 47 of file PS3USB.cpp.

    - + +

    ◆ Release()

    +
    @@ -363,11 +347,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 262 of file PS3USB.cpp.

    +

    Definition at line 262 of file PS3USB.cpp.

    - + +

    ◆ Poll()

    +
    @@ -391,11 +377,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 272 of file PS3USB.cpp.

    +

    Definition at line 272 of file PS3USB.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -419,11 +407,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 84 of file PS3USB.h.

    +

    Definition at line 84 of file PS3USB.h.

    - + +

    ◆ isReady()

    +
    @@ -445,11 +435,13 @@ Protected Attributes

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.
    -

    Definition at line 92 of file PS3USB.h.

    +

    Definition at line 92 of file PS3USB.h.

    - + +

    ◆ VIDPIDOK()

    +
    @@ -491,11 +483,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 102 of file PS3USB.h.

    +

    Definition at line 102 of file PS3USB.h.

    - + +

    ◆ setBdaddr()

    +
    @@ -515,11 +509,13 @@ Protected Attributes -

    Definition at line 465 of file PS3USB.cpp.

    +

    Definition at line 465 of file PS3USB.cpp.

    - + +

    ◆ getBdaddr()

    +
    @@ -539,11 +535,13 @@ Protected Attributes -

    Definition at line 478 of file PS3USB.cpp.

    +

    Definition at line 478 of file PS3USB.cpp.

    - + +

    ◆ setMoveBdaddr()

    +
    @@ -563,11 +561,13 @@ Protected Attributes -

    Definition at line 527 of file PS3USB.cpp.

    +

    Definition at line 527 of file PS3USB.cpp.

    - + +

    ◆ getMoveBdaddr()

    +
    @@ -587,11 +587,13 @@ Protected Attributes -

    Definition at line 543 of file PS3USB.cpp.

    +

    Definition at line 543 of file PS3USB.cpp.

    - + +

    ◆ getMoveCalibration()

    +
    @@ -611,11 +613,13 @@ Protected Attributes -

    Definition at line 553 of file PS3USB.cpp.

    +

    Definition at line 553 of file PS3USB.cpp.

    - + +

    ◆ getButtonPress()

    +
    @@ -638,11 +642,13 @@ Protected Attributes
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 316 of file PS3USB.cpp.

    +

    Definition at line 316 of file PS3USB.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -665,11 +671,13 @@ Protected Attributes
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 320 of file PS3USB.cpp.

    +

    Definition at line 320 of file PS3USB.cpp.

    - + +

    ◆ getAnalogButton()

    +
    @@ -690,11 +698,13 @@ Protected Attributes
    Returns
    Analog value in the range of 0-255.
    -

    Definition at line 327 of file PS3USB.cpp.

    +

    Definition at line 327 of file PS3USB.cpp.

    - + +

    ◆ getAnalogHat()

    +
    @@ -715,11 +725,13 @@ Protected Attributes
    Returns
    Return the analog value in the range of 0-255.
    -

    Definition at line 331 of file PS3USB.cpp.

    +

    Definition at line 331 of file PS3USB.cpp.

    - + +

    ◆ getSensor()

    +
    @@ -740,11 +752,13 @@ Protected Attributes
    Returns
    Return the raw sensor value.
    -

    Definition at line 335 of file PS3USB.cpp.

    +

    Definition at line 335 of file PS3USB.cpp.

    - + +

    ◆ getAngle()

    +
    @@ -765,11 +779,13 @@ Protected Attributes
    Returns
    Return the angle in the range of 0-360.
    -

    Definition at line 339 of file PS3USB.cpp.

    +

    Definition at line 339 of file PS3USB.cpp.

    - + +

    ◆ getStatus()

    +
    @@ -790,11 +806,13 @@ Protected Attributes
    Returns
    True if correct and false if not.
    -

    Definition at line 360 of file PS3USB.cpp.

    +

    Definition at line 360 of file PS3USB.cpp.

    - + +

    ◆ printStatusString()

    +
    @@ -808,11 +826,13 @@ Protected Attributes

    Read all the available statuses from the controller and prints it as a nice formated string.

    -

    Definition at line 364 of file PS3USB.cpp.

    +

    Definition at line 364 of file PS3USB.cpp.

    - + +

    ◆ setAllOff()

    +
    @@ -826,11 +846,13 @@ Protected Attributes

    Used to set all LEDs and rumble off.

    -

    Definition at line 403 of file PS3USB.cpp.

    +

    Definition at line 403 of file PS3USB.cpp.

    - + +

    ◆ setRumbleOff()

    +
    @@ -844,11 +866,13 @@ Protected Attributes

    Turn off rumble.

    -

    Definition at line 410 of file PS3USB.cpp.

    +

    Definition at line 410 of file PS3USB.cpp.

    - + +

    ◆ setRumbleOn() [1/2]

    +
    @@ -868,11 +892,13 @@ Protected Attributes -

    Definition at line 420 of file PS3USB.cpp.

    +

    Definition at line 420 of file PS3USB.cpp.

    - + +

    ◆ setRumbleOn() [2/2]

    +
    @@ -917,11 +943,13 @@ Protected Attributes -

    Definition at line 431 of file PS3USB.cpp.

    +

    Definition at line 431 of file PS3USB.cpp.

    - + +

    ◆ setLedRaw()

    +
    @@ -941,11 +969,13 @@ Protected Attributes -

    Definition at line 441 of file PS3USB.cpp.

    +

    Definition at line 441 of file PS3USB.cpp.

    - + +

    ◆ setLedOff() [1/2]

    +
    @@ -967,11 +997,13 @@ Protected Attributes

    Turn all LEDs off.

    -

    Definition at line 215 of file PS3USB.h.

    +

    Definition at line 215 of file PS3USB.h.

    - + +

    ◆ setLedOff() [2/2]

    +
    @@ -991,11 +1023,13 @@ Protected Attributes -

    Definition at line 446 of file PS3USB.cpp.

    +

    Definition at line 446 of file PS3USB.cpp.

    - + +

    ◆ setLedOn()

    +
    @@ -1015,11 +1049,13 @@ Protected Attributes -

    Definition at line 451 of file PS3USB.cpp.

    +

    Definition at line 451 of file PS3USB.cpp.

    - + +

    ◆ setLedToggle()

    +
    @@ -1039,11 +1075,13 @@ Protected Attributes -

    Definition at line 460 of file PS3USB.cpp.

    +

    Definition at line 460 of file PS3USB.cpp.

    - + +

    ◆ moveSetBulb() [1/2]

    +
    @@ -1079,11 +1117,13 @@ Protected Attributes -

    Definition at line 504 of file PS3USB.cpp.

    +

    Definition at line 504 of file PS3USB.cpp.

    - + +

    ◆ moveSetBulb() [2/2]

    +
    @@ -1103,11 +1143,13 @@ Protected Attributes -

    Definition at line 513 of file PS3USB.cpp.

    +

    Definition at line 513 of file PS3USB.cpp.

    - + +

    ◆ moveSetRumble()

    +
    @@ -1127,11 +1169,13 @@ Protected Attributes -

    Definition at line 517 of file PS3USB.cpp.

    +

    Definition at line 517 of file PS3USB.cpp.

    - + +

    ◆ attachOnInit()

    +
    @@ -1159,12 +1203,14 @@ Protected Attributes -

    Definition at line 254 of file PS3USB.h.

    +

    Definition at line 254 of file PS3USB.h.

    Member Data Documentation

    - + +

    ◆ PS3Connected

    +
    @@ -1175,11 +1221,13 @@ Protected Attributes

    Variable used to indicate if the normal playstation controller is successfully connected.

    -

    Definition at line 256 of file PS3USB.h.

    +

    Definition at line 256 of file PS3USB.h.

    - + +

    ◆ PS3MoveConnected

    +
    @@ -1190,11 +1238,13 @@ Protected Attributes

    Variable used to indicate if the move controller is successfully connected.

    -

    Definition at line 262 of file PS3USB.h.

    +

    Definition at line 262 of file PS3USB.h.

    - + +

    ◆ PS3NavigationConnected

    +
    @@ -1205,11 +1255,13 @@ Protected Attributes

    Variable used to indicate if the navigation controller is successfully connected.

    -

    Definition at line 264 of file PS3USB.h.

    +

    Definition at line 264 of file PS3USB.h.

    - + +

    ◆ pUsb

    +
    @@ -1228,11 +1280,13 @@ Protected Attributes

    Pointer to USB class instance.

    -

    Definition at line 268 of file PS3USB.h.

    +

    Definition at line 268 of file PS3USB.h.

    - + +

    ◆ bAddress

    +
    @@ -1251,11 +1305,13 @@ Protected Attributes

    Device address.

    -

    Definition at line 270 of file PS3USB.h.

    +

    Definition at line 270 of file PS3USB.h.

    - + +

    ◆ epInfo

    +
    @@ -1274,7 +1330,7 @@ Protected Attributes

    Endpoint info structure.

    -

    Definition at line 272 of file PS3USB.h.

    +

    Definition at line 272 of file PS3USB.h.

    @@ -1287,7 +1343,7 @@ Protected Attributes diff --git a/class_p_s3_u_s_b__coll__graph.md5 b/class_p_s3_u_s_b__coll__graph.md5 index 1aae81d3..3cb61626 100644 --- a/class_p_s3_u_s_b__coll__graph.md5 +++ b/class_p_s3_u_s_b__coll__graph.md5 @@ -1 +1 @@ -06f5f28fefcd0973f7f3cf5ab5f01033 \ No newline at end of file +419b4e935c78301cc0a62882347018ba \ 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 4e1da01815ded5603cdd3c78f9053f92df11ffd8..fec3c74988f4a5d7b32cfde491580a75dffdacc6 100644 GIT binary patch literal 12589 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 NR#Hi#THH9~{{Xj#`dR=0 diff --git a/class_p_s3_u_s_b__inherit__graph.md5 b/class_p_s3_u_s_b__inherit__graph.md5 index b241da78..25fa853d 100644 --- a/class_p_s3_u_s_b__inherit__graph.md5 +++ b/class_p_s3_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -77f7ca570be060c1a40a0845510a4a59 \ No newline at end of file +b322f707cca63b07e436aa0d678c09f6 \ 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 2cbfcbd357a82640bd095c0f9e446a3cea9a8b3e..887c41f0a77f4ac09445ddff07c05e9ce98ff342 100644 GIT binary patch literal 4395 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 literal 4425 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 diff --git a/class_p_s4_b_t-members.html b/class_p_s4_b_t-members.html index d6fb78d6..548cffb2 100644 --- a/class_p_s4_b_t-members.html +++ b/class_p_s4_b_t-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    This class implements support for the PS4 controller via Bluetooth. It uses the BTHID class for all the Bluetooth communication.

    -

    Definition at line 28 of file PS4BT.h.

    +

    Definition at line 28 of file PS4BT.h.

    Constructor & Destructor Documentation

    - + +

    ◆ PS4BT()

    +
    @@ -299,12 +279,14 @@ Additional Inherited Members -

    Definition at line 36 of file PS4BT.h.

    +

    Definition at line 36 of file PS4BT.h.

    Member Function Documentation

    - + +

    ◆ connected()

    +
    @@ -326,11 +308,13 @@ Additional Inherited Members

    Used to check if a PS4 controller is connected.

    Returns
    Returns true if it is connected.
    -

    Definition at line 45 of file PS4BT.h.

    +

    Definition at line 45 of file PS4BT.h.

    - + +

    ◆ ParseBTHIDData()

    +
    @@ -371,11 +355,13 @@ Additional Inherited Members

    Reimplemented from BTHID.

    -

    Definition at line 56 of file PS4BT.h.

    +

    Definition at line 56 of file PS4BT.h.

    - + +

    ◆ OnInitBTHID()

    +
    @@ -399,11 +385,13 @@ Additional Inherited Members

    Reimplemented from BTHID.

    -

    Definition at line 65 of file PS4BT.h.

    +

    Definition at line 65 of file PS4BT.h.

    - + +

    ◆ ResetBTHID()

    +
    @@ -427,11 +415,13 @@ Additional Inherited Members

    Reimplemented from BTHID.

    -

    Definition at line 75 of file PS4BT.h.

    +

    Definition at line 75 of file PS4BT.h.

    - + +

    ◆ sendOutputReport()

    +
    @@ -461,7 +451,7 @@ Additional Inherited Members

    Implements PS4Parser.

    -

    Definition at line 81 of file PS4BT.h.

    +

    Definition at line 81 of file PS4BT.h.

    @@ -473,7 +463,7 @@ Additional Inherited Members diff --git a/class_p_s4_b_t__coll__graph.md5 b/class_p_s4_b_t__coll__graph.md5 index 57a44763..62540081 100644 --- a/class_p_s4_b_t__coll__graph.md5 +++ b/class_p_s4_b_t__coll__graph.md5 @@ -1 +1 @@ -4bb85a2b4d5163f1d591f32b835727dc \ No newline at end of file +caf6d41b8cdc6da742f8f2054e40560a \ 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 d96b67a9d31ed67fe01fa960b6905bffee79f9ca..bc7cb1966d26de383a47fc44e628cf110212998b 100644 GIT binary patch literal 28207 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 MC2hqDd8^?612$z9qyPW_ literal 27019 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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 22e73541..10dc4741 100644 --- a/class_p_s4_b_t__inherit__graph.md5 +++ b/class_p_s4_b_t__inherit__graph.md5 @@ -1 +1 @@ -405752bfa16040ed3832aa96d3e4fa2f \ No newline at end of file +2de412526e28e795ed39015c162d3536 \ 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 25a19bcfa56b80b132ebdba8311ba171d684c147..7c38731597c7b403d43847f59abc9ead43d88202 100644 GIT binary patch literal 8673 zcmd5?Wmg+rv_?yS0>RzgiWDoZ#WlD~DP96pkPzHmixZ#}cQ4vPp}5oH?(PnE-n-WQ z5BEbdXJuvPoY}L_-j7U#mWCn@76ld(5)zKGlDrOZoB}>gpclZmV+ZsAI3RoID9R#L zj!^9)A<<_l%gg9`A|IMzwy953JVTE+Gs5D%^n+O^Uz5<=gbtDGvE z?UhdgCz~s2KkX`^ZF^iFE$Wu&6s~Y(;i)p)u+awcC}Yq9bNw_Z(qW)wphMe~J7L~k zk&^~--0bP9Y{;PnBVeEoCTbW+WcsYdWa|Ffe~Z6R4>Z$Z)L@S-_xy~ zDC~x}{cf);;^B6%Z*RJ6ccVXPs?30=$Vl|#4p=>nHz1Z)O2c+AwJ;QiQm5VflFjVL zM~!Z#zSW{!I74x*&&5tc)(SyyALv_}TmXVaJwx80%Dga|{I$-zcTA6W`&GI{8q^s= zE*Tt4OYJ_p^RAuhZrV*Q^Y3S~`Uy3~W%mD837=u)yT8Y!5<%z=`8{5ee%hT-*v$KK zyfjts08vp=f|76O@-v+74tQng3K_P}hFn^*@l~BZ>#eMUokK(Nm)$L|)3}rI2Dv3#% z{BgGECx!>-;lueR%$|dC*y-tM?c7fiUfPc5MPu#}G>Xmw@*6zK8)^K^oUA4P(QL7z z@~eYcIopBcyf&|M0{K3x?ofP|bUYeyrBTUyuAfq=11nxzL*%7Kb>CHrloA+p3*O?~ zt;b2}imy-wy}-#YH>%Uw97x$6SELnees_Dexx4l|YARm=`))0YC)uwj%vPkuWBa>W zI{&!OaeL9h>6h&hYGR&&Z<#uUD&t$jne2W~4+8^69jhQ~Dhcm;0%9O5ss_f3G-)L` zes4;jM3M67Tifo>RHRUXHZT8L7}z4E>Xqu!LmkLAn&iT8BSjLnU*J%T6{>zs&V0B9 zBOip-3PzD||9WCGDGTfHV1zu0eLg5|znn3di>H^X2c~o~?Wc%>a~$+U5H{Rh?w4KT zGrqMSmAKBrXT9Fx5GM@#yg$Rut(hY}ce2_oc$ClpDbjFIW1G9!olJR-p%iu;YKX4> zv_CWbLl{jHUFhWHAq7Vj)pcV_zP#AG)f!lI^|ggqOo;-)qu}mK0+s3JXPsL+jte__ zp5NkN-6ze;HopuU7Juvxrn43&}%ZK?5R$Fc8dgQ?j43g z8b~c*+Nd-~89+L*FMJYTz+ru&iR>~P6d__Q5Wy5yllzv=XA@ddX+2wOtMXEgC-$Z* zZw#BqsFq1td_}|QZ)M?Mb075xcPlHasVWPpxq1gevkqAL`_UYAASbo6Fay&6L{PH6 zq2!df-AKBaP~~A~M(tHzfhxw)= zb{Dw@hYFNWdxnLoUF&;)rA$NxYy)~0OXf=1+n?F^mxuFTkCxiYL^z=XDV(GM9)ar> zCQTZ@%NSCma_KB*$x3~$k5uZ%RRaP9d-8>sJms3)Z|bT0q$fjPU~^|w1c2;a;m?m> zBE!S!z=0pIh&jHQ^Suw;vC9=&Sl#-=YbQ|77b@F_*v84%1+t&`XTT0!WQAdkEdGo7 zbfEkc4Z`MQ>v)BnXKM=yPSbo!aBYC<^!Dx!djRR>ry$%H>t&3JvBi9hpsCN%5xA%} z&0#U)7tI^HQ*W(0zVWTy4E*!}g<79=(MR%4OR8^iC zmmBgmomceXyaFlU_J)ux2Vl=pCL=p~FZ!#>n%w=u=3(Q63V{V)R(DOw{|rQ*ZhE+V zfjlTL8E#YzebBEobqF`nqWDK402hFTL%@10nmNuQ1#Wpwxl(=|1h>+LT0}c@f>0&_ zs&Mh}qIdm?rFlVRKZml#42JP!@R3u5e(iGDhkMhhg~NGQS63Y^t0YYy1f6E0feKU< zu6T{*hBJvw$6;_g)BR79FARN{Deg^*q22!X&LI1O{Cpy9N~G zhzcQ1CqZ0UbgWXGT#otME_ir~X(5`O36A^eMvk6MLv3%2k%DVkvSr{nhkkjn8&6eD zsM@+)K<~m&vW?e#?C3}yPXaER^$3;DMr&B&bNjq5uj?l_~xVyZp z(}qNoy|L6~3#ZrBFgbQ)g|K#VanEWU_)a8Y^E?N0bHP|z8nM3Cne;C7>A{N_=ZjLQ zsn*21!Bq7!t-Qcq4%j_Y7CcJl7rOwvTXUv-wp}VBF;i5)Ks4`PUqEQR$F@e$pM%9J z(-vz(zP^dHb@oH*>zmN_r(f&fm^TrKV7_XbuahVIRmmG|5&j)N!8WFf z=OIf&s^CKAzHoGHTNUjGB;>(l0=O1Qe<0n8$A7Ka96d3>QdSzY_uSz1^l)ieYQP>9 z2ZoB)U~kG7r!_a<3wUhdo0D6J>PD7t)yaOZHs>ma1Y#A|-7+w$o4)-GA$&l!ZGS58u9N~S0hA$Q9&xj`PLPJP6ST=*l3C+*{ zEQ+FhfQHv+E-qBPKC4_5z~y}IjhU}^TMt4trt$`>%5-6((5q@iksPjY z-}vRaSVd_XlGXdRx>RhK{qJl{Y(s)pBmL)i@OHWta6mj08yj_2 zgpa7om!lp^PPUI?URWrVV32a4ahvB?V`_Z-gwW9|pA*yo1^HldDanG6(LutRQ9V?G z>mHDZnM=+;lM|TLp?Mrl10nIwM!%|n-3W;})qI*OUIg#L#CIIwrA-Ae6a(4FWrXeV zY*1TL{}yt0*rW~HbNnXO96>A7g^yA@w}8)K%?e^74Tz_bVo{ zCJl_x4A=C)&=7xcGG}m)8JIT!7-3fTl+mqVA=9%NfFfGyEKz_Fp=E@DOcyZ#2P?q@ zUu3$_fDua&7avE9oYZ`l4+4uT0lo81V-sds%`(>JUGxj zB)%CNg#{S#Bd2;2qnXkJs1l3bjTB9djt7db3edY1s3M*Wf2&% z%k|wl4QzCn3_T&V!9f9V<5Z1}Vpzg0wTvFn3%+qY19&$-iB(gyoT`i~*K;i*{?`=8 zLe_6WO3M9Y#JiW9F9mBz(Gr2Dq{}azL>K7)8i;uoJ>ylNG(Qkkl^6B|@?dDF|1vvs zmhDu+BLL@i{#y76W&t2m5r9%iv>kdGF`FMZj zvNuzaS@9YGoN)lMDthR$+8Rnvmh|=B8_PolDr)q1jcmsoMbq+}?*P<-04L$xOT&z6 ztkGq(^E0PPAd{1tQtAM#)k)jC3d5z&$0TGKJ6-Q90h;erwUu09wgUA($|?L8XDOTp z`WkklIfBsXM-m=$Q+5sa?U4!-^o`euH$)tMli$^o`E1@^0x*LDhe||CPttMy>G3`} zJ{|$56mmus7qhKXUhzsj-7s=nbeOi!KLyxJKHb=KW5F*%KLZdqL%@OHlnE^$O*&r7 z?<+ebG`>h$$fVI(TO`l)CIGwyzjxu#Ee0>P`xp=(b_JjU+=m$;5}n1WUtj6g+iUMF zwh9Zn%;~N=nLGiYwKVp9Z!~%6<>ug5Vt6>7gTFn%K-2+%4AJbiLFzyg2t!$Ve%O}U z4Z@S;Mfh!{+Yyo80>GNcZ5Q|P{<^5$=XxTU9rCe^ND6>d70szM0I(8 zF#2)hzZ1ka<@bDVK`Qw;Pu||KR6QKuwr>hiBuN@&q4<-7ShS!uk`TarS?oZlB?ZGMX%e7Nlm>6aNbW} z<3{I_=B;Aw0wTVJ)-RedPMvpqoPxb_G@-cErM*^U&ojl^K>&+TF{*p7mv0X+Y6svJ zKW+{XE6Af`5z&40567@M1n7w&|1I?i8u|sjahJ4%Kh5F!sFZ;#0$pG zlMl3yYAOCr+25i4#Akp_E3jG4i&Q0%1^~wmmxfc;l z-OX4MUzg^0KaAwWKf0{@OR@3lR~T<{g+uNO6yr(*en9Y$SCGcB2WaeGtS2AL)=jGN zw10!s(Lob|1Sop}+mW-v3Og*64+?N)*WDhkmw=9w&4#?0_DE8 z(=g#tQJdtZd%~fWG^QVBB|Ld4KT3m>M86!BM`Fe<08Dl|O-5~ni>z-Cg5CLemAS?XUU$YEAb(3o z1H}t>CZmrDhkEfigxHb*<8c%AO&eGFq%O^6r2U2PeUpo`q=MwBfWj zhs&K7HJ_2@8eL2@S5nwCB+M=X&$ma5fZQ)JC$K586k^+Mc3anFoF2rCeW8uNUfi_g ztyc@Bg*FaDU$qh;ZD*&fNJ&>Wb@c>Op` zrRy^HG8`wAW>=6&Cywp}C?y2&9R9R-4cYd;4R@@ztZsiU5b1yMoI`sc8<<2=ehBm@ z2b$dwf*FpEO!^raWz(RTTAHYBcXBFgsKFj}$VM4la^2$7m4tnYM zlG~*5Z-i64Vdf0EH?M!y$mV(}Y-jcpIe+qB_f2mjY`oD+Ex*b&w=Ej1?XyC46Y0V1 zdtz?>Gq*U)otGw>b7DG~MJT?|e7IFAx5@X^*c*lS&iwe)zL~wzvwhgSkW=r5eDMJL z!%7`zL9e}%B4?fYqsuT_xR!}ZdDOV6n!UNxOxF4*n4JjXEu*6TmaVe#HAi~Xv=q!n zHDb}Y$FP%u?b*NI?G=rWGuz^iOX&lr#UK1J)bpWD#Au4$P}8;KdGiifl=sC=;^zaA zpM(Aa9Qs_O0PY)0Ry^qB>lq*$7#=9mE_A5Ml6)C0k!75w*?~xRc3Ad_}uG-+f@5KsepA4|K;I( zU77vEiNegby3bgyz7_@gpXV!aHM2#Dk-II0Wwk!cKzAp+JbAN)5?sx)U)%J)UCQT; zFyLQS+MrRPr4**wtk|SIBZ-|<>8a!KN$0;!TCqE3CF=+Qrd4o8EjDgQo4A<8kkN#l zth_0OY|GJn^zpMP@P)VC;@Ecot10s|xfNhulc}#0#>cmc9$vqik-6nYv&}bln&IlF zT%tL+tH%os{kX5sMf;9lJwp8I=;w{^>6-e|vp`7P`+L5Ka66MFpX)U*zqz1xo5ri3 zH?M%R^~>})dxM<%THoTwNWSkvz%~auHR}Zv4CleZ9k-41#s_ zJFwWaM8|3=Az*axO5{Lc~dQDWmPi$uhez<4krDF5*Dq8Y_g4j^B7bj zRai&`kM5Nfd?)q~sldcm?H-6+$@QBU%xb>)Q6ZkqpjG!iLVlesx}?@_REb%2D-Ri! z0^F0S^?F5;T1FmRBP#pC|cq$@1?eL=1t%>YKTcwsZKh^YKKXpI&hvfo}p6KARO?8Ac6 z!~}qV285M9Zd^Lx;aVIlKN}TFei%c%B!2Y}-c+|ac_H}>W3+ho$iRC+jo8Xq@+x|h zE210gx{=mbq_wHsGwz$A&BOF6$|eb!pM{UU7lAQ@qpu<0C=kGJtJ2r^a5YmA^yIbH z6U1ytCbeegbhHq$PH4$ycwM;klT)FXYMf4oc`rXCkCG6_v z4T-N9i0`p8RG!_+4MNR}px+$MOwo*goLftKf$a7M9rYB&p#W(}?K5~|P=4jYo z05)3hpJcq^cviKYuDQyBi_5=aY9Tm8qnMc2UTyXMJi>#DRUO8xTD6BMFf17_q^(F| z?3%r164!mh0bz-S3u&y5n6ve`zh~-X<0^x@&MpP69y_g5Aqer{$9Q`68{@ApVK{@< zc!evO_I~%=8CA7L-J6cqYUDR8tWW8s;N-A9W`6#xr}Ny;7u|Rmw<^QFG%CMa$E_U^ zuFJQ&9Wa?C!`*Z_+cp!1eF$M-Ee(Y6t#jt_R0+j0@&k@V^FcaxM|4ly3BSWc+#Xd- zoaA1-J?;p$GKLy~tQJjWsa1DI$z(z(j>+0;vN)xLkX9g~dWvI8KQK*3A2jgNxc?-| z<=m#PvCy@1v3q-xTIKD_4!pqOB;R|u0w4(HeOPq7m6U^Lq0+PQ=;Ai|H90`iG0wD+ zy}q3XV@i#cKn%QC-7$C&#Q&5*GF~N5OTJC$JmW2z#~rOxs_e!|Lr;%(Ajh-S?o90f z6ui!pp$sBaF%sZn(-t%3ySF0SLiLtEKmS^rljglXVjkPC8r?1^ih_K7HH}I?C^=dH zP9`lwXcyE1PJowr<+r6(>^XWDc28BCNh(Pm1M`kgMJna*0ddry>viRU_;of-Y z0|CGqQMKBvE?2``o|f$md>G#}O(Om68J}3m2jHulSe7TuAE54W#wZl~C#%B_cNaKl z)Adqh&PK<}egQu|e|MQ5c#1Fd9}EH~H&!&DKlVgkOcqs@d~)v?8c5~tbGSNCZ}WZj0tDPTo;rdt2W*+!=DX@U%bhV6 z*vgY;aQoX1-ZVngug?FfU&>f9u-tEm*LIjA6gFT?fX?KEGpPpKkI&51~XSshS(SE7>a4*@P3pHg^fBS zdCvSU%z6<@YR*1gxKmcuh|iK1 zl2#sMEHAlVUC+cqRk>WGDM2A|=OgN|mBH*br|5pZW!A9PZaattqwz8FvAfkk2E-6{ zq)~{B+YbC^;H(#HJ$=&7tpi<1ES73^0HOez^$bBgRPVVR6Uld0n8Zy!+|F|iuf|Ey zSq@rvxJ6dSzCM|E@Y4oe3(aah86=utF zBKU^yeGtV{LBZ>jnR}>Y+`{W?{muTQFwz?h{t4`H(w3iNk&&IB_DQbq(r@<$YsHHQ zy%k*m%PLZ#UjX*F?Z&zCazn&=bHWk3tP1d4bPH98v29*P7X!*dUm3R$+S~UMS*ql6 zUSyULlJ&q=z^b@Qo$w|D0)dChH6BI+gf&lZS;rWUkxm5@5A}fS4)C5P0AT-e8?Z_s z6~+z4@(~1~)aEmlW`m@b&uV;pd>0!@njD3FHgOWEf8w6p0JBr_fH{`N@4?Ns!F^Mu zgYNLSTY!;)p;#+V_G0MusFtUv$RXg*3ArwnV`!c^Pkh592AFt6yP=4pv`Dgtv-n=E z_od^KlBaA*W}bV8=P83LFI88VYOL@C`nY;Je+Zs>|L<)H0bTj&)-SG0oGBMC;sC$p z6zfc;E#=XN@d2PayMVqxL{44;2bl8)_0QZfz`07Mb#B*GQqt-i{K_*aybO~|gG?T- zyy~Sw`IR@cYFlzlA?TAul{B5-nweMU64O|i%JNQu@88Q|CD1HR$8d2!%CC15=R z;w9Bwiw7$pa%ore6zi5GdhaO%YLc2;?e1jJLrzm7^(6^Dl2F*6QQ0i3}>$QJ}9hGV9}{n{yGdm?sye1NhEd{YCPLWXQ9YX=HKl ze0T5j#>Og^I*==gsHrQ$F)5_|rbc$>h2KdL^}~zbX~&bIS`8&h`N1#Gt!oo?`SHPp z^85iwmj8JG!3e56hR=W&i4SOzEKmY9Ffu z+^(a?o40DQ_(>6FNj>X-#7G(eZL~K5qV&&df*ivvlAZvUxdM2@0T&slHKJV1EHeH| y$pjNvXvo;W47Fgj2o<1gBnr`i48yygk%A}ltBXbN`+#>gkdzfP^io3hJ6{m#a4s9te1zH@66nWxI4M0MnZ zDeRlC%5*BT!W*9c(}u4w62Ck5bH8&34@bwku)&R-6t!Y-|t{Pjomn3JUxo4K;>6Wu}ZWHnlaAGbl1V76sC~829mGv3{L_ zwwhYPZ`Qz05_l3GyJ93T>9=~l7j_LcC_Hb6)56GLPwH|SIAZYSF&>SOE!*w*yLgEa zMujQ^_sjRsC;orFNfWRd;H!Vxcgf^Vp9n|m*;bGuX6gQIsp7!{KcdBez_K4n_Qtw; zyD^Npe*y(XHV30R1>GHFWBkw;y|*(O!)G-FSLO7*)xOMSrB*wUlt29ymPmHIJsfod zBl8f7Zkrs<<##>0zua5??C;TKEb@LEE|G*6nnWqCVn3Bx@p$`N_w+{xvwAL{`ySol z*pCj^<8Ljt%WaNxU*xicJ}6L6;G$vN9%NZAuGAT#;zc_zRaW!|-z`pY4yvUwY8s5K zceoO<8@JL;$ZvGMBO_qep_}lLD)u>Eyt$r}WHtFpl|5Oo-sMrm!@boXoF(FWQhqgG zrAg)Tv%BTk;TJj)$NZ*#drnbao*Cv#4{|`V{q^(h0*sK2|cip0M^Z9bQ~@-D0OBs01Es?o^(P%xQJqgl^UEMsBu>(ejE zNvg2B^DRRkZHA2uHsjPzx9>6!R|mQlXIF_?Rxsc?vglu)c5N9P9IbaXX{a0!U<^7f z&{h}#2kP`Al->MZ)695dWKgRYOI@*(veo%+o#jxj@b^lcVit$F&iVdaGK!UCdYNgn z)tkSH!a-xfbBSuv9$N$be>a2AouiPkR&xd3)q2vq)<4#C+m0u#oGjOroyA~LHTGXk zvLdOUE$D|hV4nUxT{kHd3v9=dxR=_aG!_lKDu*SMs^{>?M{l(|r@?flKAP4Uus5h? zagg#RLqoO;N!0osYf5(uCBrPlIn8_ZfNu(5dw93g7?mx#RcDe9`*`ehbaJ+_wcOWE zx>Xu0I+bcQEp}SxVgF7A6LX9Xz|Lw#66UfWe6zF$>hx+#TYMH6H1exG%M33+NnC-) z_ZSjMEGrWGF7DMHG;{fsgRdqSJAj31{OcWD`g*1N|NWADt)TgcwzzPr#u*UXD{O6^QyfeNCa!tJb1%+34+Jez`xlJ*Wqo4FZr;+a&7k<^aFSF4p@Zq1G-_d*%he{!rX!Zp zt6xMQH8NS>^G)*_fgonCW~j-{+2`{U3r`D*aqi~!lHrlK!=qyO-d;RL4Xs+e8kB@$ z(a=wfFg2}bvn5z?U;I>y9bX?eRA#*R7r0h$wceOuG~&28uED59h8w9qXRXOnlWQw! zk1YY5C+N|rCzfeZJ8IM))bVNHLlh63>_$n{@cqeriLA>s3X(6mZRzL`F~)2w;Bl?#^-?X)tn+Ih%ev^r$K#o5FkSC zzGDG&!GHhM?g+!y+Z?evTvjF*rn>#zvZ24W1i2)df2dH1`sqoeK#9ZpFGkQ=nl#04 z)5jlHon_HRQldO*VE!qQjhOb~ITrpYsm+<4u4@{B(yb9CJK>0x3~2aF#f1lRk|^1g zSJE>w(R(rM)V;lkWf5hvdy1nmB8d9-PxqHFS3ZuLzt@K|x-3-0=ur5LUZhwE6d?oI zCyt1-kyNCd^k=@X_wo}q1`e0=+d}t9s4;m0>IxPI8=D&V&x$O37$ChR3uTI|hYL|M z=21NqY8hGsw?avV)7Ha06Sf)^tHJ|I=fmxQQtGK8)&r7IDT3`IGDNVdNIA${hMH^{ zJFc&wSiY3v%JX(x(OeP1Cocu zov!oKNN?H*)cZ%Nk|p^Hd6y1n3+jfkx1E@VgNd0xygvK?bm7Xs=vI87p~x&Jt+V-2 ztzEVp{4|#3K}>IT^xiiL39JLd+ISy%m!yDt#>D5~5KWLE#wC(3>aX!>2U9r%T_Kmv zxYg-kDr@Z<CN&)^d1#Cs*xRaoG2IO3Ag`$|KZ_)tLgZ2)5-hw&b_|dJwNKTs{M^Q6p*-V=<72k8d$ximPS4f+oaPi ztEf&c70V73nOj0jTk3Q$+21#Kyx@mxfu@8`2toD=RoQ$_kkaB^{?UQ_fSomt++p>+ z`||7oUCszw3v%d(r`&+39^v8A3(TkRZ+SF85d=TL;Y7$hATgwqB?MI+~| z?xR-vV>BjYp7A>7P;mn<;3JCdnGy=P9O9-5ggkS)(u(4LXWXO0U(#Z?V*upj*EIx* zt|+fil|S`HPw9IfFQvtUf0*0pE`DMlBQHO8VT@^W>b>r=A8iVXOfC6vZ!JhQNU%$Y z-`5>*Nf;ed^ieRO4z*B@K{Whj3ZqZAgP@n0(mNC8~#` zQeOVOs>xp&DTBQAI*AIt7lrMX4}0hNN{^A@U~Ft?t2Dg|PJL83SGw(GUoI@DC=BDvg2=1N08pwZE!4Puj^7ISx)v)c~vr ztN|O_vY_8wfvBQ*&<(XaC?QeOEZI)e2jCEh*T2aE@!(90;8XtFYkksT1wj^;xF1~} zngH9x>HDa1<9ivF$V3;{J^?E)Uha+C>L=t-vOPqh>GHP3#~aw$mD^NzZ%z=iaOi!} z#8#pM?m;X_qZAe16L0_oL@c|ED0H|0jLX3@E`TDsv77U?X&cpguk!#-J>B@c7Er*T zPRarRW{2| zJsf|$RHfVNb6ovyz0+s^D^9MEXDJS4yGkaTGQhAU@Q7%{FA)K4He+a!C361EI_1SD zD|Nbnn&MaXzD6J*J56VE``jF9vzT_Wtu$F$8arwuH)8riBAx&UZ?Y&5_J$4VW0|%) zY1<1;WUywP5u~hzXKGbH&EyH{LNQ2|&jIk~d%rEE|4^L>@SF}{YaZWyYmOk~Fmnp#m;bn6?a-{Xz*ZJqpzxjznaprIjIgw>1!|*J2~z8+^xcNlprw1<2#gv1}rlpuxRJ=IicQ zd~I2dz`NX?(1$DgXsRO`FxTmS_GN;xNYC)C72GDM9Rk1kdOt4d^yMQC(ha}ss-Dh% z)8LEFbj4u6ztb+~wMKJ3>k-ff>%`iBI9yYKN6KUOk*A9G6xdddHsAQOn{_v*friZt zT5QIgE_cV48_h*?#R7R&sJn+*Q1wY9Yf>R!+u3_O|5U1no7y0mk6 zIFkn)&45gG?tx$;Gp28*)+=rEAnQ9+egjyPbW#$-P52e8R0Ld=BF@iYuM#CoaI3vh zlb`LU2q&{Ri_YZtV2QdE8cUVx;K6%$0Lo;>lPGkh=evj7i;*jXFUN>bNm0ldMgW*q z=XIRb(*ge&2V7lE$io#xxa;P4Nz}Jh)c;KHhwNrwAhT(w+s(_rbJkP%_7o%$h3bYQ zpR^Nr3z^F+tcp~)kJrEESZ~2_73z7bwrywyZ)&k%T465_j_@=M z&!qhWo6QT-PZy(DK1cI3`~vc`!M7*!=!9%qY6eXf;@kSr!31h-FqoJ^(1S zhyL?>TpN6`zZcyMXD;E8eco)bMV4m&16UQbs}(~_=0~j(n$TQ;8_N$Fi$Y4XcZQ>o zUCe;Hx>d_fdBx>(q{WXpdfx>Y-Q@~ZBEUSg>Bs|SO#|>Hm8^!1ObnAnl7l802qMI; zSX2@}(_sG?#{0RT)f151Q^3tXNNJYEiCH z-Z`VMYUw`h5As4Qpu;HrG56BzjoWm9;a|bR04XoF+N-V%X%>i7 zY|1VUXCo*>U>Jw4-066c>i-s8+{yF=mSqM_4Ol8gtW7Z?X70XKSZlwi@GjY{>r^jZkz&sj_g z?B((#3ej2{8CpTtRW*JGE<8GPSj*$`2vyiq2_43=kRsG81}7VN5rKsarq~QGgVw8C z!Cfh<7^i`~h_c75Bvf58FE;e_m8hJZTm(cc8nOew$rQ1Pe1iM|AbjmoittW=?ui0~ z7nYagIfXnn#atH4V^8S0Gh5qag%y)28%S#`G?e(N2)cpTN38AGlP)Kkeog z&hLp@(0sRYR~!d9!1IP17ylhQ7-Gt1{cpCG%}D%Mi*@A#xCoXdm$8Tm+Ea)W(e2In z@O~3r;GX1p4A4AnTYU@<3U@T`(qQ8%{K9I{*NujR$Ie0(wd=nXx|UY`h5~63RUuy{ z8jbla1|0~-pw&ZNlX{|+Y^CBR8WD|yu{0P4fCJ#tS~~BBoZkEyo=zz|vg5`NXQuMx zX2yy|&L!e7(^^Eo&XDk&?#T2M3oE`9gVp02h$eh`p!HaH8i$?mqh2|b9$$*}~NT4}t=vY{50Xm!fxodN5(kqqfogaE(9ji#P zMK{DU%Z@1fvjuq<*BPU9b$fEGFqzAq`>UuP=K8aX4)lBO^rkns0Ky0YOcEHC2_XRC z0#L&8CVanxdK(Pvh?~Xq)`$@xfN)gcr~}zi0;0p~Hs*@vzPCAc?UQ&NFJ>$+Rif8sP zJ;rUA*DT?zdKD@h7H}rncR#XOzqMr6%f;eKFbfzY-`kR8+FGAz7+^&@Cn>;-b@P{aT=~mb2=?!k1~e-1U{*Y+lw+LB|z}stL^kfA%Np`YM9? zp0{3~-7DBkI5@evv5wp33|i!hzLFuFvpA^a@F1S+vbgm0<>t^>GhxlMX;G6kp#-$^ zi-?Fo4f)0|Xn&puoX?tVQr`_BpbZo3-yFO4)p(E>O|)pRDf~bg8PBla#F~jg9TGHC344gf-$M` zaVZ!L_+7*(=Iw9ju5HpUK=hbVo>DnHo<)flALUR0ZOly`cbQ}S{Y4^gcGM1@=iAvv zRdw*4abL`_1DnDkdOE#oP^QV-8^zBSV@x~FGY&Jkg@qqP1~OJi8%*zFbo~8JMGlz1 zhhqskF9ro2WO(+?eHG`8hE^7vbf_SO7>hH9SBDf9-}q+(S=VJ>)IaeYE~8@W{@c|q z3oY=^;=6Oj7P*&C>;e0H7GCVyY6&pg8J)(>&JaTARjG+(Pz}iRzH|eo^obU7_Y?nc z$-nnA*tUuYK(7`(%IVe5GGdB%M}0{C2TN6yKl{7l2f5OT_>F6HtR-?;1ne%*(N!l* z+w%aa3=K5xb{x+N{M2qAbvTtJpAmR84+}{*M7#B#ajVe@d?-%8`R{j=HbmTv)x6O% z7}T>3b^j-3B7ER7LzOD4KVe#Sf{rzLh ztZ}W4D?JGkvzBGaQA4Wcq# zgtj)fTlM9Ph&)yuTVPZVM^?tKdmJmgmP|&?u+xex1sAcv8u;r}x`x1OR8q|=7cp2| zQ8;+(?7O!KtCm%KQp8QzRh3jYTqfpttj02(<@@dx*wJ^g@VtO_ATg#9IsAP^;9@%%5G-lKI zpSQp70>++0UZ&LoCD{K8yV}nt_uxQzNJ6T`sX}j9OrHf7RvVHfC>^|TGpS?1S=l_{ zKDc+p0H%){W&5qQ+RIxonL_9GUNQ%-u$@WG>#$9_x$-5|+p@AKI?#Kghfr4{xb$RD z=&zouwHuZXN3kT$GL_I)6Z{UReP3vIY%I(z3fK$A>T{GO4^@aK6}KJd3L_+*+v%Hr zuTO3XiR_o@rDn0s(P$5TxW11kHojLSOiUBJgi}^0o{S+_sb1i9nU}B{3h52J9>CI7 zp7_zWh6Vn%NAM(3lb2fBUv9F!-Mtzj2~`^X||8 z;s{EzrOoA9{kTD~7cAdSs?J5^Try!VL_ih`7}T7o((8`O*jRj*TG?+_8Ka~4y)?zd)D`SP8#assW*vrT zGJ!t?9TXwkLk|qvH((NSqaL^K9GSK6P@x2#g@D;QAknCd9vNoXgLUjpY)U$B_PwiI z;7^}Eyh6=3n^c9L~E|~ya&CY?}@_W^WB~s?YWdtx5M#mQ}xP|MXN=Nuc zVF%pUiv$^Sa~+T+gObP7tuO^;mM}ZyqSJh_z^EV2N!#s@T0vZozDh0&kn=>lS24R@Jz1yc5;UN!eoZWcp$Ww zv-L;QR#&^{9?j#!uVHELmu}AYPkEIIB_Sw{hUK0TLJT3E`Ip~XB!dV9TOthWzl|y~ z#w=xXzk}r9qL-?QX+N03UH-D&8TpQ?n)Y7fezU(SG?$>Bo?I+|#`i=oLlR0zzU6+! zTpWf+l))*i^_M5npkbg?HOqbB^+hm6r^@d&LXdMp1kq#79j!pbH)G~DD!?>WZCfNF z?H*bC0XMne+{Pwv{NY+KAmh%Zh>ph=#t8}45F(Swo-q3;f51zmsatLRcI#qi#%VGg z>_Q*SEceRbb#p|&$<`ftC%jVPSj29{;9N3>@^R8}$6>x^iBBZxhBnL(&&9Zw?iZiP zBMra1m`3Q@NetCvjcaNw+8afX+<~{;sLP$uPsGm-l8;V3%*OwASF@YbtQoEy;$iGL2Yg3 z`!B0zdd=JKUUar8nwZVIQwoU&9QM6$IWE^uZ2OYVl_7BitXHub=Rvs3v(}K3>FN!j zmbf-#;?V)xhrlsu170OqDGmh%Z0Zy4D^6EAEIES)IT=VES|i@lC(k8`+#?;lEB9~! zN8zfL0@I^ap)%Yx%aI4(yx*%0d*E=gW571w z{Pdnn!f^`w#r{PT@FE-tPVND)jH%sX5NC?r4pRC=pltLGNPsRX!qyX!#Wxp$|f z?53T>=jI-y{4QV8hN8{;4}>W}ax!BGNt~7q#%)kRJWAa|hwOY#i#{a;B#iBM7e!b*+VfJhvk6nWvx6}s={J7?_EYI+cE>nz)hfM+dTcObGO?x?@ve34t-s5VD&Ps}&C#wL9T>$f?a(+BZ!WQ6*Z|$|)*d$2L1N zsS-Y{rX>~S7+N#&F5ILN!nA;`O237gn~=>&3h=HK@Q9SBx`2Hq;7lk`-`UyGE0IC$ zz(r6EX{MF+S4<+;PIUvaju7}$pN;iyphZmq3|?hn3*X6_Wf;AZI9IXIH4ZkEhe|h@ zdA3Nh2usbX#77TNKk%CgQ@(M!A-K z3`w(q0AXTXU^S4#omi+$Mm%hDIYjkPUTYeCWt|NHZtC>-GJYIa@@OB}TWI<)J04zE z>~>lA=DTB2pqt)3Q1qcn3WeJEAI+CM_2hb0?(2ROdP^SY?X$=0f_9Sl6CbMOJhgZfMzR?#2SQG=5++o1V&$X~aR1NL5*r$aPH>3_ z!i@! - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    This class parses all the data sent by the PS4 controller

    -

    Definition at line 124 of file PS4Parser.h.

    +

    Definition at line 124 of file PS4Parser.h.

    Constructor & Destructor Documentation

    - + +

    ◆ PS4Parser()

    +
    @@ -190,12 +170,14 @@ Protected Member Functions

    Constructor for the PS4Parser class.

    -

    Definition at line 127 of file PS4Parser.h.

    +

    Definition at line 127 of file PS4Parser.h.

    Member Function Documentation

    - + +

    ◆ getButtonPress()

    +
    @@ -218,11 +200,13 @@ Protected Member Functions
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 50 of file PS4Parser.cpp.

    +

    Definition at line 50 of file PS4Parser.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -245,11 +229,13 @@ Protected Member Functions
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 57 of file PS4Parser.cpp.

    +

    Definition at line 57 of file PS4Parser.cpp.

    - + +

    ◆ getAnalogButton()

    +
    @@ -264,17 +250,19 @@ Protected Member Functions

    Used to get the analog value from button presses.

    Parameters
    - +
    bThe ButtonEnum to read. The supported buttons are: UP, RIGHT, DOWN, LEFT, L1, L2, R1, R2, TRIANGLE, CIRCLE, CROSS, SQUARE, and T.
    bThe ButtonEnum to read. The supported buttons are: L2 and R2.
    Returns
    Analog value in the range of 0-255.
    -

    Definition at line 64 of file PS4Parser.cpp.

    +

    Definition at line 64 of file PS4Parser.cpp.

    - + +

    ◆ getAnalogHat()

    +
    @@ -295,11 +283,13 @@ Protected Member Functions
    Returns
    Return the analog value in the range of 0-255.
    -

    Definition at line 72 of file PS4Parser.cpp.

    +

    Definition at line 72 of file PS4Parser.cpp.

    - + +

    ◆ getX()

    +
    @@ -339,11 +329,13 @@ Protected Member Functions
    Returns
    Returns the x-coordinate of the finger.
    -

    Definition at line 171 of file PS4Parser.h.

    +

    Definition at line 170 of file PS4Parser.h.

    - + +

    ◆ getY()

    +
    @@ -383,11 +375,13 @@ Protected Member Functions
    Returns
    Returns the y-coordinate of the finger.
    -

    Definition at line 183 of file PS4Parser.h.

    +

    Definition at line 182 of file PS4Parser.h.

    - + +

    ◆ isTouching()

    +
    @@ -427,11 +421,13 @@ Protected Member Functions
    Returns
    Returns true if the specific finger is touching the touchpad.
    -

    Definition at line 195 of file PS4Parser.h.

    +

    Definition at line 194 of file PS4Parser.h.

    - + +

    ◆ getTouchCounter()

    +
    @@ -471,11 +467,13 @@ Protected Member Functions
    Returns
    Return the value of the counter, note that it is only a 7-bit value.
    -

    Definition at line 207 of file PS4Parser.h.

    +

    Definition at line 206 of file PS4Parser.h.

    - + +

    ◆ getAngle()

    +
    @@ -504,11 +502,13 @@ Protected Member Functions
    Returns
    Return the angle in the range of 0-360.
    -

    Definition at line 216 of file PS4Parser.h.

    +

    Definition at line 215 of file PS4Parser.h.

    - + +

    ◆ getSensor()

    +
    @@ -537,11 +537,13 @@ Protected Member Functions
    Returns
    Returns the raw sensor reading.
    -

    Definition at line 228 of file PS4Parser.h.

    +

    Definition at line 227 of file PS4Parser.h.

    - + +

    ◆ getBatteryLevel()

    +
    @@ -563,11 +565,13 @@ Protected Member Functions

    Return the battery level of the PS4 controller.

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

    Definition at line 251 of file PS4Parser.h.

    +

    Definition at line 250 of file PS4Parser.h.

    - + +

    ◆ getUsbStatus()

    +
    @@ -589,11 +593,13 @@ 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.
    -

    Definition at line 259 of file PS4Parser.h.

    +

    Definition at line 258 of file PS4Parser.h.

    - + +

    ◆ getAudioStatus()

    +
    @@ -615,11 +621,13 @@ 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.
    -

    Definition at line 267 of file PS4Parser.h.

    +

    Definition at line 266 of file PS4Parser.h.

    - + +

    ◆ getMicStatus()

    +
    @@ -641,11 +649,13 @@ Protected Member Functions

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

    Returns
    Returns true if a microphone is connected.
    -

    Definition at line 275 of file PS4Parser.h.

    +

    Definition at line 274 of file PS4Parser.h.

    - + +

    ◆ setAllOff()

    +
    @@ -667,11 +677,13 @@ Protected Member Functions

    Turn both rumble and the LEDs off.

    -

    Definition at line 280 of file PS4Parser.h.

    +

    Definition at line 279 of file PS4Parser.h.

    - + +

    ◆ setRumbleOff()

    +
    @@ -693,11 +705,13 @@ Protected Member Functions

    Set rumble off.

    -

    Definition at line 286 of file PS4Parser.h.

    +

    Definition at line 285 of file PS4Parser.h.

    - + +

    ◆ setRumbleOn() [1/2]

    +
    @@ -725,11 +739,13 @@ Protected Member Functions -

    Definition at line 294 of file PS4Parser.h.

    +

    Definition at line 293 of file PS4Parser.h.

    - + +

    ◆ setRumbleOn() [2/2]

    +
    @@ -768,11 +784,13 @@ Protected Member Functions -

    Definition at line 306 of file PS4Parser.h.

    +

    Definition at line 305 of file PS4Parser.h.

    - + +

    ◆ setLedOff()

    +
    @@ -794,11 +812,13 @@ Protected Member Functions

    Turn all LEDs off.

    -

    Definition at line 313 of file PS4Parser.h.

    +

    Definition at line 312 of file PS4Parser.h.

    - + +

    ◆ setLed() [1/2]

    +
    @@ -842,11 +862,13 @@ Protected Member Functions -

    Definition at line 321 of file PS4Parser.h.

    +

    Definition at line 320 of file PS4Parser.h.

    - + +

    ◆ setLed() [2/2]

    +
    @@ -874,11 +896,13 @@ Protected Member Functions -

    Definition at line 332 of file PS4Parser.h.

    +

    Definition at line 331 of file PS4Parser.h.

    - + +

    ◆ setLedFlash()

    +
    @@ -917,11 +941,13 @@ Protected Member Functions -

    Definition at line 341 of file PS4Parser.h.

    +

    Definition at line 340 of file PS4Parser.h.

    - + +

    ◆ Parse()

    +
    @@ -960,11 +986,13 @@ Protected Member Functions -

    Definition at line 76 of file PS4Parser.cpp.

    +

    Definition at line 76 of file PS4Parser.cpp.

    - + +

    ◆ Reset()

    +
    @@ -986,11 +1014,13 @@ Protected Member Functions

    Used to reset the different buffers to their default values

    -

    Definition at line 130 of file PS4Parser.cpp.

    +

    Definition at line 130 of file PS4Parser.cpp.

    - + +

    ◆ sendOutputReport()

    +
    @@ -1031,7 +1061,7 @@ Protected Member Functions diff --git a/class_p_s4_parser__inherit__graph.md5 b/class_p_s4_parser__inherit__graph.md5 index 7d6cd78a..65bfd4cb 100644 --- a/class_p_s4_parser__inherit__graph.md5 +++ b/class_p_s4_parser__inherit__graph.md5 @@ -1 +1 @@ -b842fe07d690c9e08045bf8e0d96d45b \ No newline at end of file +dc6cd7ca1f2260cb5f86a8ae5bfdc9df \ 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 46483571cd6ff8db3c7c08eec2783be48bbe110d..bb50076961261525ea0323e844893fc19e726d46 100644 GIT binary patch literal 5296 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    This class implements support for the PS4 controller via USB. It uses the HIDUniversal class for all the USB communication.

    -

    Definition at line 31 of file PS4USB.h.

    +

    Definition at line 32 of file PS4USB.h.

    Constructor & Destructor Documentation

    - + +

    ◆ PS4USB()

    +
    @@ -316,12 +296,14 @@ Additional Inherited Members -

    Definition at line 37 of file PS4USB.h.

    +

    Definition at line 38 of file PS4USB.h.

    Member Function Documentation

    - + +

    ◆ connected()

    +
    @@ -343,11 +325,13 @@ Additional Inherited Members

    Used to check if a PS4 controller is connected.

    Returns
    Returns true if it is connected.
    -

    Definition at line 46 of file PS4USB.h.

    +

    Definition at line 47 of file PS4USB.h.

    - + +

    ◆ attachOnInit()

    +
    @@ -375,11 +359,13 @@ Additional Inherited Members -

    Definition at line 54 of file PS4USB.h.

    +

    Definition at line 55 of file PS4USB.h.

    - + +

    ◆ ParseHIDData()

    +
    @@ -434,11 +420,13 @@ Additional Inherited Members

    Reimplemented from HIDUniversal.

    -

    Definition at line 67 of file PS4USB.h.

    +

    Definition at line 68 of file PS4USB.h.

    - + +

    ◆ OnInitSuccessful()

    +
    @@ -462,11 +450,13 @@ Additional Inherited Members

    Reimplemented from HIDUniversal.

    -

    Definition at line 77 of file PS4USB.h.

    +

    Definition at line 78 of file PS4USB.h.

    - + +

    ◆ sendOutputReport()

    +
    @@ -496,11 +486,13 @@ Additional Inherited Members

    Implements PS4Parser.

    -

    Definition at line 90 of file PS4USB.h.

    +

    Definition at line 91 of file PS4USB.h.

    - + +

    ◆ VIDPIDOK()

    +
    @@ -542,7 +534,7 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 122 of file PS4USB.h.

    +

    Definition at line 123 of file PS4USB.h.

    @@ -554,7 +546,7 @@ Additional Inherited Members diff --git a/class_p_s4_u_s_b__coll__graph.md5 b/class_p_s4_u_s_b__coll__graph.md5 index 31d2a590..58a3f35e 100644 --- a/class_p_s4_u_s_b__coll__graph.md5 +++ b/class_p_s4_u_s_b__coll__graph.md5 @@ -1 +1 @@ -6510784396c1c05ff338806741b9ed6c \ No newline at end of file +c1e443ad969075b8a7ad79af4e899d3e \ 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 74c54723a5bae9e32996209f011c7478d9fc1c68..810a0a8dbe7527a392702c87558f9052ab193796 100644 GIT binary patch literal 29130 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 KVud_9^#1^t!QLYP literal 30083 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 Z3kMpZ3(q;+g0q=0in3}l)l#NG{{x&;Jdywa literal 15696 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 WDP$Ki^#sr<4JIWnFIFL95b!_y;Saz7 diff --git a/class_p_s_buzz-members.html b/class_p_s_buzz-members.html index 1c84c0fe..844dc8b0 100644 --- a/class_p_s_buzz-members.html +++ b/class_p_s_buzz-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    This class implements support for the PS Buzz controllers via USB. It uses the HIDUniversal class for all the USB communication.

    -

    Definition at line 43 of file PSBuzz.h.

    +

    Definition at line 43 of file PSBuzz.h.

    Constructor & Destructor Documentation

    - + +

    ◆ PSBuzz()

    +
    @@ -279,12 +259,14 @@ Additional Inherited Members -

    Definition at line 49 of file PSBuzz.h.

    +

    Definition at line 49 of file PSBuzz.h.

    Member Function Documentation

    - + +

    ◆ connected()

    +
    @@ -306,11 +288,13 @@ Additional Inherited Members

    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.

    +

    Definition at line 58 of file PSBuzz.h.

    - + +

    ◆ attachOnInit()

    +
    @@ -338,11 +322,13 @@ Additional Inherited Members -

    Definition at line 66 of file PSBuzz.h.

    +

    Definition at line 66 of file PSBuzz.h.

    - + +

    ◆ getButtonPress()

    +
    @@ -376,11 +362,13 @@ Additional Inherited Members
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 52 of file PSBuzz.cpp.

    +

    Definition at line 52 of file PSBuzz.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -414,11 +402,13 @@ Additional Inherited Members
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 56 of file PSBuzz.cpp.

    +

    Definition at line 56 of file PSBuzz.cpp.

    - + +

    ◆ setLedRaw()

    +
    @@ -450,11 +440,13 @@ Additional Inherited Members -

    Definition at line 64 of file PSBuzz.cpp.

    +

    Definition at line 64 of file PSBuzz.cpp.

    - + +

    ◆ setLedOffAll()

    +
    @@ -476,11 +468,13 @@ Additional Inherited Members

    Turn all LEDs off.

    -

    Definition at line 98 of file PSBuzz.h.

    +

    Definition at line 98 of file PSBuzz.h.

    - + +

    ◆ setLedOff()

    +
    @@ -508,11 +502,13 @@ Additional Inherited Members -

    Definition at line 108 of file PSBuzz.h.

    +

    Definition at line 108 of file PSBuzz.h.

    - + +

    ◆ setLedOnAll()

    +
    @@ -534,11 +530,13 @@ Additional Inherited Members

    Turn all LEDs on.

    -

    Definition at line 114 of file PSBuzz.h.

    +

    Definition at line 114 of file PSBuzz.h.

    - + +

    ◆ setLedOn()

    +
    @@ -566,11 +564,13 @@ Additional Inherited Members -

    Definition at line 124 of file PSBuzz.h.

    +

    Definition at line 124 of file PSBuzz.h.

    - + +

    ◆ setLedToggle()

    +
    @@ -598,11 +598,13 @@ Additional Inherited Members -

    Definition at line 132 of file PSBuzz.h.

    +

    Definition at line 132 of file PSBuzz.h.

    - + +

    ◆ ParseHIDData()

    +
    @@ -657,11 +659,13 @@ Additional Inherited Members

    Reimplemented from HIDUniversal.

    -

    Definition at line 23 of file PSBuzz.cpp.

    +

    Definition at line 23 of file PSBuzz.cpp.

    - + +

    ◆ OnInitSuccessful()

    +
    @@ -685,11 +689,13 @@ Additional Inherited Members

    Reimplemented from HIDUniversal.

    -

    Definition at line 41 of file PSBuzz.cpp.

    +

    Definition at line 41 of file PSBuzz.cpp.

    - + +

    ◆ Reset()

    +
    @@ -711,11 +717,13 @@ Additional Inherited Members

    Used to reset the different buffers to their default values

    -

    Definition at line 157 of file PSBuzz.h.

    +

    Definition at line 157 of file PSBuzz.h.

    - + +

    ◆ VIDPIDOK()

    +
    @@ -757,7 +765,7 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 172 of file PSBuzz.h.

    +

    Definition at line 172 of file PSBuzz.h.

    @@ -770,7 +778,7 @@ Additional Inherited Members diff --git a/class_p_s_buzz__coll__graph.md5 b/class_p_s_buzz__coll__graph.md5 index babb5e21..a7baa4ca 100644 --- a/class_p_s_buzz__coll__graph.md5 +++ b/class_p_s_buzz__coll__graph.md5 @@ -1 +1 @@ -fea9ba05db96f5aefabee7a11c9c9f52 \ No newline at end of file +21462fd15ee84876fa8daa1b607dba33 \ 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 2c6a7ba898f520acb10dd4e0a174a8519360a9fb..780e676373677f1c6dc7ffbaa5588c5d861e81b6 100644 GIT binary patch literal 26841 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 diff --git a/class_p_t_p_list_parser-members.html b/class_p_t_p_list_parser-members.html index 20cd64dd..e72f78e4 100644 --- a/class_p_t_p_list_parser-members.html +++ b/class_p_t_p_list_parser-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 83 of file parsetools.h.

    +

    Definition at line 90 of file parsetools.h.

    Member Enumeration Documentation

    - + +

    ◆ ParseMode

    +
    @@ -125,18 +105,18 @@ Public Member Functions
    - - + +
    Enumerator
    modeArray  -
    modeRange  -
    Enumerator
    modeArray 
    modeRange 
    -

    Definition at line 86 of file parsetools.h.

    +

    Definition at line 93 of file parsetools.h.

    Constructor & Destructor Documentation

    - + +

    ◆ PTPListParser()

    +
    @@ -157,12 +137,14 @@ Public Member Functions
    -

    Definition at line 109 of file parsetools.h.

    +

    Definition at line 116 of file parsetools.h.

    Member Function Documentation

    - + +

    ◆ Initialize()

    +
    @@ -206,11 +188,13 @@ Public Member Functions
    -

    Definition at line 120 of file parsetools.h.

    +

    Definition at line 127 of file parsetools.h.

    - + +

    ◆ Parse()

    +
    @@ -246,7 +230,7 @@ Public Member Functions
    -

    Definition at line 34 of file parsetools.cpp.

    +

    Definition at line 41 of file parsetools.cpp.

    @@ -259,7 +243,7 @@ Public Member Functions diff --git a/class_report_desc_parser-members.html b/class_report_desc_parser-members.html index 84967627..1b7889ee 100644 --- a/class_report_desc_parser-members.html +++ b/class_report_desc_parser-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 145 of file hidescriptorparser.h.

    +

    Definition at line 145 of file hidescriptorparser.h.


    The documentation for this class was generated from the following file: @@ -313,7 +291,7 @@ Additional Inherited Members diff --git a/class_report_desc_parser2-members.html b/class_report_desc_parser2-members.html index 2f4844f5..7d3cfcdb 100644 --- a/class_report_desc_parser2-members.html +++ b/class_report_desc_parser2-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 148 of file hidescriptorparser.h.

    +

    Definition at line 148 of file hidescriptorparser.h.

    Constructor & Destructor Documentation

    - + +

    ◆ ReportDescParser2()

    +
    @@ -348,12 +328,14 @@ Additional Inherited Members
    -

    Definition at line 165 of file hidescriptorparser.h.

    +

    Definition at line 165 of file hidescriptorparser.h.

    Member Function Documentation

    - + +

    ◆ ParseItem()

    +
    @@ -387,7 +369,7 @@ Additional Inherited Members

    Reimplemented from ReportDescParserBase.

    -

    Definition at line 1429 of file hidescriptorparser.cpp.

    +

    Definition at line 1429 of file hidescriptorparser.cpp.

    @@ -400,7 +382,7 @@ Additional Inherited Members diff --git a/class_report_desc_parser2__coll__graph.md5 b/class_report_desc_parser2__coll__graph.md5 index af9db977..a7dc2736 100644 --- a/class_report_desc_parser2__coll__graph.md5 +++ b/class_report_desc_parser2__coll__graph.md5 @@ -1 +1 @@ -27a80771267ed2f61d1a7277c51beb79 \ No newline at end of file +337962214a97d1da9120f71057904a21 \ 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 285ac140c2e4f3c824730cbbb660e3143f2d7541..db10a0398d9706fba9be1dd1293b421157dd434a 100644 GIT binary patch literal 21179 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 literal 21449 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 literal 8430 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 Y|2ektsU8jRe+(c^RXvq@C7Y=K0s81Gd;kCd diff --git a/class_report_desc_parser__coll__graph.md5 b/class_report_desc_parser__coll__graph.md5 index 60356562..ece91e52 100644 --- a/class_report_desc_parser__coll__graph.md5 +++ b/class_report_desc_parser__coll__graph.md5 @@ -1 +1 @@ -4eeff98c7d713241096fda58cb34b342 \ No newline at end of file +bba4c01c09194908b45e06e17ad8b5da \ 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 7d4dca49c31675bea0703163c3ee29661c79a2ea..fc16daece69342958c8a498f1f1e92e360d444e8 100644 GIT binary patch literal 21053 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 Re!5)nGc~lNl;~4q{|guIEt3EM literal 21308 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 literal 8483 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 22 of file hidescriptorparser.h.

    +

    Definition at line 22 of file hidescriptorparser.h.

    Member Typedef Documentation

    - + +

    ◆ UsagePageFunc

    +
    @@ -337,12 +317,14 @@ Static Protected Attributes
    -

    Definition at line 24 of file hidescriptorparser.h.

    +

    Definition at line 24 of file hidescriptorparser.h.

    Member Enumeration Documentation

    - + +

    ◆ anonymous enum

    +
    @@ -352,20 +334,19 @@ Static Protected Attributes
    - - - + + +
    Enumerator
    enErrorSuccess  -
    enErrorIncomplete  -
    enErrorBufferTooSmall  -
    Enumerator
    enErrorSuccess 
    enErrorIncomplete 
    enErrorBufferTooSmall 
    -

    Definition at line 138 of file hidescriptorparser.h.

    +

    Definition at line 138 of file hidescriptorparser.h.

    Constructor & Destructor Documentation

    - + +

    ◆ ReportDescParserBase()

    +
    @@ -386,12 +367,14 @@ Static Protected Attributes
    -

    Definition at line 124 of file hidescriptorparser.h.

    +

    Definition at line 124 of file hidescriptorparser.h.

    Member Function Documentation

    - + +

    ◆ PrintGenericDesktopPageUsage()

    +
    @@ -413,11 +396,13 @@ Static Protected Attributes
    -

    Definition at line 1293 of file hidescriptorparser.cpp.

    +

    Definition at line 1293 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintSimulationControlsPageUsage()

    +
    @@ -439,11 +424,13 @@ Static Protected Attributes
    -

    Definition at line 1305 of file hidescriptorparser.cpp.

    +

    Definition at line 1305 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintVRControlsPageUsage()

    +
    @@ -465,11 +452,13 @@ Static Protected Attributes
    -

    Definition at line 1315 of file hidescriptorparser.cpp.

    +

    Definition at line 1315 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintSportsControlsPageUsage()

    +
    @@ -491,11 +480,13 @@ Static Protected Attributes
    -

    Definition at line 1324 of file hidescriptorparser.cpp.

    +

    Definition at line 1324 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintGameControlsPageUsage()

    +
    @@ -517,11 +508,13 @@ Static Protected Attributes
    -

    Definition at line 1334 of file hidescriptorparser.cpp.

    +

    Definition at line 1334 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintGenericDeviceControlsPageUsage()

    +
    @@ -543,11 +536,13 @@ Static Protected Attributes
    -

    Definition at line 1343 of file hidescriptorparser.cpp.

    +

    Definition at line 1343 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintLEDPageUsage()

    +
    @@ -569,11 +564,13 @@ Static Protected Attributes
    -

    Definition at line 1351 of file hidescriptorparser.cpp.

    +

    Definition at line 1351 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintButtonPageUsage()

    +
    @@ -595,11 +592,13 @@ Static Protected Attributes
    -

    Definition at line 1276 of file hidescriptorparser.cpp.

    +

    Definition at line 1276 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintOrdinalPageUsage()

    +
    @@ -621,11 +620,13 @@ Static Protected Attributes
    -

    Definition at line 1284 of file hidescriptorparser.cpp.

    +

    Definition at line 1284 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintTelephonyPageUsage()

    +
    @@ -647,11 +648,13 @@ Static Protected Attributes
    -

    Definition at line 1359 of file hidescriptorparser.cpp.

    +

    Definition at line 1359 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintConsumerPageUsage()

    +
    @@ -673,11 +676,13 @@ Static Protected Attributes
    -

    Definition at line 1372 of file hidescriptorparser.cpp.

    +

    Definition at line 1372 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintDigitizerPageUsage()

    +
    @@ -699,11 +704,13 @@ Static Protected Attributes
    -

    Definition at line 1394 of file hidescriptorparser.cpp.

    +

    Definition at line 1394 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintAlphanumDisplayPageUsage()

    +
    @@ -725,11 +732,13 @@ Static Protected Attributes
    -

    Definition at line 1404 of file hidescriptorparser.cpp.

    +

    Definition at line 1404 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintMedicalInstrumentPageUsage()

    +
    @@ -751,11 +760,13 @@ Static Protected Attributes
    -

    Definition at line 1414 of file hidescriptorparser.cpp.

    +

    Definition at line 1414 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintValue()

    +
    @@ -787,11 +798,13 @@ Static Protected Attributes
    -

    Definition at line 1013 of file hidescriptorparser.cpp.

    +

    Definition at line 1013 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintByteValue()

    +
    @@ -813,11 +826,13 @@ Static Protected Attributes
    -

    Definition at line 1020 of file hidescriptorparser.cpp.

    +

    Definition at line 1020 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintItemTitle()

    +
    @@ -839,11 +854,13 @@ Static Protected Attributes
    -

    Definition at line 1026 of file hidescriptorparser.cpp.

    +

    Definition at line 1026 of file hidescriptorparser.cpp.

    - + +

    ◆ ParseItem()

    +
    @@ -877,11 +894,13 @@ Static Protected Attributes

    Reimplemented in ReportDescParser2.

    -

    Definition at line 1091 of file hidescriptorparser.cpp.

    +

    Definition at line 1091 of file hidescriptorparser.cpp.

    - + +

    ◆ PrintUsagePage()

    +
    @@ -903,11 +922,13 @@ Static Protected Attributes
    -

    Definition at line 1251 of file hidescriptorparser.cpp.

    +

    Definition at line 1251 of file hidescriptorparser.cpp.

    - + +

    ◆ SetUsagePage()

    +
    @@ -929,11 +950,13 @@ Static Protected Attributes
    -

    Definition at line 1233 of file hidescriptorparser.cpp.

    +

    Definition at line 1233 of file hidescriptorparser.cpp.

    - + +

    ◆ Parse()

    +
    @@ -973,12 +996,14 @@ Static Protected Attributes

    Implements USBReadParser.

    -

    Definition at line 993 of file hidescriptorparser.cpp.

    +

    Definition at line 993 of file hidescriptorparser.cpp.

    Member Data Documentation

    - + +

    ◆ usagePageTitles0

    +
    @@ -996,11 +1021,13 @@ Static Protected Attributes
    - + +

    ◆ usagePageTitles1

    +
    @@ -1018,11 +1045,13 @@ Static Protected Attributes
    - + +

    ◆ genDesktopTitles0

    +
    @@ -1040,11 +1069,13 @@ Static Protected Attributes
    - + +

    ◆ genDesktopTitles1

    + - + +

    ◆ genDesktopTitles2

    + - + +

    ◆ genDesktopTitles3

    + - + +

    ◆ genDesktopTitles4

    + - + +

    ◆ simuTitles0

    + - + +

    ◆ simuTitles1

    +
    @@ -1172,11 +1213,13 @@ Static Protected Attributes
    - + +

    ◆ simuTitles2

    +
    @@ -1194,11 +1237,13 @@ Static Protected Attributes
    -

    Definition at line 55 of file hidescriptorparser.h.

    +

    Definition at line 55 of file hidescriptorparser.h.

    - + +

    ◆ vrTitles0

    +
    @@ -1216,11 +1261,13 @@ Static Protected Attributes
    - + +

    ◆ vrTitles1

    +
    @@ -1238,11 +1285,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 57 of file hidescriptorparser.h.

    +

    Definition at line 57 of file hidescriptorparser.h.

    - + +

    ◆ sportsCtrlTitles0

    +
    @@ -1260,11 +1309,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 58 of file hidescriptorparser.h.

    +

    Definition at line 58 of file hidescriptorparser.h.

    - + +

    ◆ sportsCtrlTitles1

    +
    @@ -1282,11 +1333,13 @@ Static Protected Attributes
    - + +

    ◆ sportsCtrlTitles2

    + - + +

    ◆ gameTitles0

    +
    @@ -1326,11 +1381,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 61 of file hidescriptorparser.h.

    +

    Definition at line 61 of file hidescriptorparser.h.

    - + +

    ◆ gameTitles1

    + - + +

    ◆ genDevCtrlTitles

    + - + +

    ◆ ledTitles

    +
    @@ -1392,11 +1453,13 @@ Static Protected Attributes
    -

    Definition at line 64 of file hidescriptorparser.h.

    +

    Definition at line 64 of file hidescriptorparser.h.

    - + +

    ◆ telTitles0

    +
    @@ -1414,11 +1477,13 @@ Static Protected Attributes
    - + +

    ◆ telTitles1

    + - + +

    ◆ telTitles2

    +
    @@ -1458,11 +1525,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 67 of file hidescriptorparser.h.

    +

    Definition at line 67 of file hidescriptorparser.h.

    - + +

    ◆ telTitles3

    +
    @@ -1480,11 +1549,13 @@ Static Protected Attributes
    - + +

    ◆ telTitles4

    + - + +

    ◆ telTitles5

    + - + +

    ◆ consTitles0

    +
    @@ -1546,11 +1621,13 @@ Static Protected Attributes
    - + +

    ◆ consTitles1

    +
    @@ -1568,11 +1645,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 72 of file hidescriptorparser.h.

    +

    Definition at line 72 of file hidescriptorparser.h.

    - + +

    ◆ consTitles2

    +
    @@ -1590,11 +1669,13 @@ Static Protected Attributes
    - + +

    ◆ consTitles3

    +
    @@ -1612,11 +1693,13 @@ Static Protected Attributes
    - + +

    ◆ consTitles4

    +
    @@ -1634,11 +1717,13 @@ Static Protected Attributes
    - + +

    ◆ consTitles5

    +
    @@ -1656,11 +1741,13 @@ Static Protected Attributes
    -

    Definition at line 76 of file hidescriptorparser.h.

    +

    Definition at line 76 of file hidescriptorparser.h.

    - + +

    ◆ consTitles6

    +
    @@ -1678,11 +1765,13 @@ Static Protected Attributes
    -

    Definition at line 77 of file hidescriptorparser.h.

    +

    Definition at line 77 of file hidescriptorparser.h.

    - + +

    ◆ consTitles7

    +
    @@ -1700,11 +1789,13 @@ Static Protected Attributes
    - + +

    ◆ consTitles8

    +
    @@ -1722,11 +1813,13 @@ Static Protected Attributes
    - + +

    ◆ consTitles9

    + - + +

    ◆ consTitlesA

    +
    @@ -1766,11 +1861,13 @@ Static Protected Attributes
    - + +

    ◆ consTitlesB

    + - + +

    ◆ consTitlesC

    +
    @@ -1810,11 +1909,13 @@ Static Protected Attributes
    - + +

    ◆ consTitlesD

    +
    @@ -1832,11 +1933,13 @@ Static Protected Attributes
    -

    Definition at line 84 of file hidescriptorparser.h.

    +

    Definition at line 84 of file hidescriptorparser.h.

    - + +

    ◆ consTitlesE

    +
    @@ -1854,11 +1957,13 @@ Static Protected Attributes
    -

    Definition at line 85 of file hidescriptorparser.h.

    +

    Definition at line 85 of file hidescriptorparser.h.

    - + +

    ◆ digitTitles0

    + - + +

    ◆ digitTitles1

    +
    @@ -1898,11 +2005,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 87 of file hidescriptorparser.h.

    +

    Definition at line 87 of file hidescriptorparser.h.

    - + +

    ◆ digitTitles2

    + - + +

    ◆ aplphanumTitles0

    +
    @@ -1942,11 +2053,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 89 of file hidescriptorparser.h.

    +

    Definition at line 89 of file hidescriptorparser.h.

    - + +

    ◆ aplphanumTitles1

    +
    @@ -1964,11 +2077,13 @@ Static Protected Attributes
    -

    Definition at line 90 of file hidescriptorparser.h.

    +

    Definition at line 90 of file hidescriptorparser.h.

    - + +

    ◆ aplphanumTitles2

    + - + +

    ◆ medInstrTitles0

    +
    @@ -2008,11 +2125,13 @@ Static Protected Attributes
    - + +

    ◆ medInstrTitles1

    +
    @@ -2030,11 +2149,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 93 of file hidescriptorparser.h.

    +

    Definition at line 93 of file hidescriptorparser.h.

    - + +

    ◆ medInstrTitles2

    +
    @@ -2052,11 +2173,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 94 of file hidescriptorparser.h.

    +

    Definition at line 94 of file hidescriptorparser.h.

    - + +

    ◆ medInstrTitles3

    + - + +

    ◆ medInstrTitles4

    +
    @@ -2096,11 +2221,13 @@ Static Protected Attributes
    Initial value: -

    Definition at line 96 of file hidescriptorparser.h.

    +

    Definition at line 96 of file hidescriptorparser.h.

    - + +

    ◆ usagePageFunctions

    + - + +

    ◆ theBuffer

    +
    @@ -2140,11 +2269,13 @@ Static Protected Attributes
    -

    Definition at line 101 of file hidescriptorparser.h.

    +

    Definition at line 101 of file hidescriptorparser.h.

    - + +

    ◆ valParser

    +
    @@ -2162,11 +2293,13 @@ Static Protected Attributes
    -

    Definition at line 102 of file hidescriptorparser.h.

    +

    Definition at line 102 of file hidescriptorparser.h.

    - + +

    ◆ theSkipper

    +
    @@ -2184,11 +2317,13 @@ Static Protected Attributes
    -

    Definition at line 103 of file hidescriptorparser.h.

    +

    Definition at line 103 of file hidescriptorparser.h.

    - + +

    ◆ varBuffer

    +
    @@ -2206,11 +2341,13 @@ Static Protected Attributes
    -

    Definition at line 104 of file hidescriptorparser.h.

    +

    Definition at line 104 of file hidescriptorparser.h.

    - + +

    ◆ itemParseState

    +
    @@ -2228,11 +2365,13 @@ Static Protected Attributes
    -

    Definition at line 106 of file hidescriptorparser.h.

    +

    Definition at line 106 of file hidescriptorparser.h.

    - + +

    ◆ itemSize

    +
    @@ -2250,11 +2389,13 @@ Static Protected Attributes
    -

    Definition at line 107 of file hidescriptorparser.h.

    +

    Definition at line 107 of file hidescriptorparser.h.

    - + +

    ◆ itemPrefix

    +
    @@ -2272,11 +2413,13 @@ Static Protected Attributes
    -

    Definition at line 108 of file hidescriptorparser.h.

    +

    Definition at line 108 of file hidescriptorparser.h.

    - + +

    ◆ rptSize

    +
    @@ -2294,11 +2437,13 @@ Static Protected Attributes
    -

    Definition at line 109 of file hidescriptorparser.h.

    +

    Definition at line 109 of file hidescriptorparser.h.

    - + +

    ◆ rptCount

    +
    @@ -2316,11 +2461,13 @@ Static Protected Attributes
    -

    Definition at line 110 of file hidescriptorparser.h.

    +

    Definition at line 110 of file hidescriptorparser.h.

    - + +

    ◆ totalSize

    +
    @@ -2338,11 +2485,13 @@ Static Protected Attributes
    -

    Definition at line 112 of file hidescriptorparser.h.

    +

    Definition at line 112 of file hidescriptorparser.h.

    - + +

    ◆ pfUsage

    +
    @@ -2360,7 +2509,7 @@ Static Protected Attributes
    -

    Definition at line 117 of file hidescriptorparser.h.

    +

    Definition at line 117 of file hidescriptorparser.h.

    @@ -2373,7 +2522,7 @@ Static Protected Attributes diff --git a/class_report_desc_parser_base__coll__graph.md5 b/class_report_desc_parser_base__coll__graph.md5 index 668df278..bbe75e65 100644 --- a/class_report_desc_parser_base__coll__graph.md5 +++ b/class_report_desc_parser_base__coll__graph.md5 @@ -1 +1 @@ -b9d3bd37562883d7bba8b8814d6dc468 \ No newline at end of file +f73fbd568e2e89c15da6964b370648d9 \ 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 ee696701af61ae5b20401e7c2ffa2523dbd97ed6..f4e3a1df4202841e0df0899f48bd95084d0983c5 100644 GIT binary patch literal 17177 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 D;c8Ve literal 17617 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 diff --git a/class_report_desc_parser_base__inherit__graph.md5 b/class_report_desc_parser_base__inherit__graph.md5 index 92049196..d89bf997 100644 --- a/class_report_desc_parser_base__inherit__graph.md5 +++ b/class_report_desc_parser_base__inherit__graph.md5 @@ -1 +1 @@ -e17b83123517010d14d04955e7bfd25a \ No newline at end of file +bf2a9d7ab53e22e743a9e609df1e484c \ 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 3992f0556781bc1586d2425cef801b42418287a7..d45b37f7c8cbd552af080cdb099e0d126c0e2bf1 100644 GIT binary patch literal 11362 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 diff --git a/class_s_p_p-members.html b/class_s_p_p-members.html index e4f89282..b70048a7 100644 --- a/class_s_p_p-members.html +++ b/class_s_p_p-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    This BluetoothService class implements the Serial Port Protocol (SPP). It inherits the Arduino Stream class. This allows it to use all the standard Arduino print and stream functions.

    -

    Definition at line 61 of file SPP.h.

    +

    Definition at line 61 of file SPP.h.

    Constructor & Destructor Documentation

    - + +

    ◆ SPP()

    +
    @@ -224,12 +204,14 @@ Additional Inherited Members -

    Definition at line 45 of file SPP.cpp.

    +

    Definition at line 45 of file SPP.cpp.

    Member Function Documentation

    - + +

    ◆ disconnect()

    +
    @@ -253,11 +235,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 72 of file SPP.cpp.

    +

    Definition at line 72 of file SPP.cpp.

    - + +

    ◆ operator bool()

    +
    @@ -279,11 +263,13 @@ Additional Inherited Members

    Used to provide Boolean tests for the class.

    Returns
    Return true if SPP communication is connected.
    -

    Definition at line 80 of file SPP.h.

    +

    Definition at line 80 of file SPP.h.

    - + +

    ◆ available()

    +
    @@ -298,11 +284,13 @@ Additional Inherited Members

    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.

    +

    Definition at line 797 of file SPP.cpp.

    - + +

    ◆ flush()

    +
    @@ -325,11 +313,13 @@ Additional Inherited Members

    Send out all bytes in the buffer.

    -

    Definition at line 94 of file SPP.h.

    +

    Definition at line 94 of file SPP.h.

    - + +

    ◆ peek()

    +
    @@ -344,11 +334,13 @@ 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.
    -

    Definition at line 805 of file SPP.cpp.

    +

    Definition at line 805 of file SPP.cpp.

    - + +

    ◆ read()

    +
    @@ -363,11 +355,13 @@ Additional Inherited Members

    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.

    +

    Definition at line 811 of file SPP.cpp.

    - + +

    ◆ write() [1/2]

    +
    @@ -388,11 +382,13 @@ Additional Inherited Members
    Returns
    Return the number of bytes written.
    -

    Definition at line 742 of file SPP.cpp.

    +

    Definition at line 742 of file SPP.cpp.

    - + +

    ◆ write() [2/2]

    +
    @@ -424,11 +420,13 @@ Additional Inherited Members
    Returns
    Return the number of bytes written.
    -

    Definition at line 754 of file SPP.cpp.

    +

    Definition at line 754 of file SPP.cpp.

    - + +

    ◆ discard()

    +
    @@ -443,11 +441,13 @@ Additional Inherited Members

    Discard all the bytes in the buffer.

    -

    Definition at line 801 of file SPP.cpp.

    +

    Definition at line 801 of file SPP.cpp.

    - + +

    ◆ send()

    +
    @@ -462,11 +462,13 @@ Additional Inherited Members

    This will send all the bytes in the buffer. This is called whenever Usb.Task() is called, but can also be called via this function.

    -

    Definition at line 769 of file SPP.cpp.

    +

    Definition at line 769 of file SPP.cpp.

    - + +

    ◆ ACLData()

    +
    @@ -496,11 +498,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 84 of file SPP.cpp.

    +

    Definition at line 84 of file SPP.cpp.

    - + +

    ◆ Run()

    +
    @@ -524,11 +528,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 423 of file SPP.cpp.

    +

    Definition at line 423 of file SPP.cpp.

    - + +

    ◆ Reset()

    +
    @@ -552,11 +558,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 60 of file SPP.cpp.

    +

    Definition at line 60 of file SPP.cpp.

    - + +

    ◆ onInit()

    +
    @@ -580,12 +588,14 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 433 of file SPP.cpp.

    +

    Definition at line 433 of file SPP.cpp.

    Member Data Documentation

    - + +

    ◆ connected

    +
    @@ -596,7 +606,7 @@ Additional Inherited Members

    Variable used to indicate if the connection is established.

    -

    Definition at line 84 of file SPP.h.

    +

    Definition at line 84 of file SPP.h.

    @@ -609,7 +619,7 @@ Additional Inherited Members diff --git a/class_s_p_p__coll__graph.md5 b/class_s_p_p__coll__graph.md5 index 7a218c80..787a2f39 100644 --- a/class_s_p_p__coll__graph.md5 +++ b/class_s_p_p__coll__graph.md5 @@ -1 +1 @@ -cad9aa3d2819cbf714312820a38ed5ae \ No newline at end of file +1e3a16374007af2c1704b8030bf6cd2e \ 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 c74e80611be039bee113ccc96cefe4f3aeb73e73..073b40616d47c8c5ca75ac603ea54697069023a0 100644 GIT binary patch literal 24804 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 z z$qYd04U8UW;p6$Jz?isCk^13V9l(*1$Diez?&Iza3%v56kWIb`K#<)&u73qLE4MJP zIptD9IzydL%3O@Q2OIB>aH^(>oY0wynYu%FFKZ?>5!oDF&53gfWNp)IHe=1M4lr0GJn^5UBi0>K6YF8utqmNX4 zSjCzLv+>1wc_54ra|j^jT~6f>5?)M730>vFr=Cd*cXdItNKp@r_%?4%4f3{PY1b*N zH`}_vhK2gEy*ulA`6K@W#i~0EpYua$o!sT14mfxkUFbC!7wwu!ausJc`@N=6@rwgh0 zS}Ilmxl%~dU{`N=aw3~fPQV5RpX)`g;{jNsO#X0&-YS(V2qadGt-8{}mq

    o)cHV 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 literal 24243 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 literal 6292 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 KMNUMnLSTXjq%J!E diff --git a/class_s_pi-members.html b/class_s_pi-members.html index f5815981..10801325 100644 --- a/class_s_pi-members.html +++ b/class_s_pi-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

    - + - - + + + + - + - - + + + +
    class SPi< SPI_CLK, SPI_MOSI, SPI_MISO, SPI_SS > -

    Definition at line 31 of file usbhost.h.

    +

    Definition at line 38 of file usbhost.h.

    Member Function Documentation

    - + +

    ◆ init()

    +
    @@ -129,7 +109,7 @@ template<typename SPI_CLK , typename SPI_MOSI , typename SPI_MISO , typename
    -

    Definition at line 54 of file usbhost.h.

    +

    Definition at line 61 of file usbhost.h.

    @@ -141,7 +121,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 c7f21334..252bbdd8 100644 --- a/class_sink_parser-members.html +++ b/class_sink_parser-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +
    Inheritance graph
    + +
    [legend]
    Collaboration diagram for SinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >:
    Collaboration graph
    + +
    [legend]
    class SinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE > -

    Definition at line 27 of file sink_parser.h.

    +

    Definition at line 35 of file sink_parser.h.

    Constructor & Destructor Documentation

    - + +

    ◆ SinkParser()

    +
    @@ -143,12 +127,14 @@ template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>

    @@ -118,9 +100,11 @@ Public Member Functions

    -

    Definition at line 30 of file sink_parser.h.

    +

    Definition at line 38 of file sink_parser.h.

    Member Function Documentation

    - + +

    ◆ Initialize()

    +
    @@ -171,11 +157,13 @@ template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    -

    Definition at line 33 of file sink_parser.h.

    +

    Definition at line 41 of file sink_parser.h.

    - + +

    ◆ Parse()

    +
    @@ -215,7 +203,7 @@ template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    -

    Definition at line 36 of file sink_parser.h.

    +

    Definition at line 44 of file sink_parser.h.

    @@ -227,7 +215,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 1a5a95f4..d1545881 100644 --- a/class_sink_parser__coll__graph.md5 +++ b/class_sink_parser__coll__graph.md5 @@ -1 +1 @@ -d02f7fd8d26a0375ade46df3226bf199 \ No newline at end of file +d020ff3f97932ad0814add922e6e3f64 \ No newline at end of file diff --git a/class_sink_parser__coll__graph.png b/class_sink_parser__coll__graph.png index 15c7ad1398b3f9593d1f4fb43f9076c1690c6a35..ca29fb69abba46081dbd2ec029cf3ea9d47cf785 100644 GIT binary patch literal 7184 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 z z8@Sg>-z5ZshOnAS@F~B#Q=qdMnb*llt2j69UcLYXk~4CCQ?*NchR{LIAAPa;Q6fp! zTR8m4Anll%pmY)v_JpU6?EdCbZ-KFN+()zX^a5f6(wIKTn23T zm=ohm>MAjjV&5LO9Y~%E(pd=I$5F8<$v@?!!Bmu8=n~ow6aF31+!Zd%gPADbk58;i z&udHEjH$%*Z;NbOaEk2Tw?H?H_=E9#{IY*tBN=70mrn<2A|9{=FrRQu1-VuLTYMO5 MO4^F`FRdc~5Bm1q3;+NC literal 7170 zcmd^E1K3{9D;x}2uO#tIKb!p zok{w@#Ki`_$=~L|F)$cL zUnnaW_&qw##Y1S#EhCxrBT@?OiJ$66E5Z)=bt7J;V5jPVh3)fji0Hp5I|vBtM5N$5 zz*C|X6{C|<;7RzlK5O@H*SwdY>z=5!o4gOJ9};$NgW|hxOdV@~w$3-^S;?Sz$YX|7 zW0JrHxZ7Nq$uUyR`MLRg_N&n$U>3({9$erG|A)(6{7Y_lDGbaqX5WEJ8Oj)fA!_=1 zro;Qt=Kk-MiA0MNqroS9suI7mqc=&55_LZ<98p<_yhWsnGlc9umE==ZGRoJw0v35c3m<>h31Ll$ zBx6$@$#`zPUEA}JRHl{vvikMc5(OCcna9og$DS{y%{&iB-TQOZ=_&jcYq=?xOeCut zeK6be?a}kC1i6=URfeVd<=Qh1w&Q-chc%tr&$=%4D$QD5q$dNn#Hiz6FnzexHEFU> z1o~3th2sSjfRFVJJxn>mOeb7UEQf`gYM3d z4ORo#bfQifIe{nboa-jUoX6orCJyG`q7{d@yP@^XKsbgNV~j^6f&)qv+n%s^Z%O#Rnb>Le!enFo6Y0w_=zpC_=m z@lmdP2$IqF4T9K(Q!|5w*QiEQz1pxkE$4&J->JvCi*@M-z`*@}MiMV9bU&Jy2xeV1 z_A3P%BN%XL4^%h0$$nZM8U}#rW+)k#yk3+ESSjzLx>jDMX zc7ohPRC>U}?QW?xGJb~+o5!doNBqEAni)FW|B0X!I1Y-&WU-Cw!RS$;DQOD+0U{J> z4($mu;h~yYi_`P##AUjlH`-M}J@p{(S>4Tw@-RkKxF|78&NKDjTG^tR?_u#`hRi-$ zUQk_Ij!#y_5;2lHegxL{=o>LwKI6LH1+E11so>a zSq7u2`RL8MgW5;OXH|i7msKfL$hzBi#xi`;b+eW+u*b=p8@D4y&Ev-IGNH?$_4aPy zexcqvjxkDx)(dflKeJ-f8COQmH<=dAvqOtMU-ezj)bk@aV?pJ~n92UT^Sl@^&zA5k z6DKf|MIQ+*Li0b^01Z7e<$e9d9sz5c{&@Q<-7kPsERJ3z=`#h_PQ|;il&70c_@Us9 z`(edjAlHqK)`@kUxTUDu|b+TJLMU0QD< zByxzx!f9ott>d=YWz`gf$1xB|B39$3HZwXYw(bPNHHg!?n$>?b>e6|f=9c#pK9V|O1JRS-AJ3G=xF@yEy>!xYWtjh*>;jqne81T0YB69Stpp0K zo9=a5s8m39-XG`wSr?u`=sJqg}62lh~)tKmf*QLnWUpLr{E&$+=`8eIo zwM%42oG|u4wKHCSAVp>yuJjItjIHO?${H-w&ZYlIGB>@NhGwGT!PUwVerk8T(~Lzi*YdpQt!LMTkVODM3DGdTp}FQd!f`u$nL90@e)Of)Q3%v^j@tED<# zg|<`Zk%^ig=`HnFmTonrXg+hqg1Gd-kJ|i=W63A|MpkG3!!@xK5J$a%1heiH=5WfE4Ed&}z0c{t5uAdK%1J+kkzT1Ox zUTGV;jc|^qkfQUH?T2t$BZF@(%GOkv9@#dHyqdly*3J@MzYPd%^j|>uS6`&wq!WL4 z=4J2t;lfi)l_c_e$+2;QX11l%asEqsf~=`M^A){2K$&1!1uxg*C899pobLOcRDfTIU7WmCNR!e;G?nkj6DXLj2=UFKHq;+`3RUjrV5V!l32X6+IE~ z-lFFuF9O{UDkC*UlZGhRm)H^zTX!@%bK8Ryj>GE!zorP9fa2`eY>qAZqB&PGZ>rq4 z)@BL^o_ow0{=6@z%e;B%_*=m;YRO&}*P#VWij6sDZ&gs?&5bDw6zUeEWHDNv7P$Kq zS~OpX`-i0O=U3D``9=Ahr9L6_5N z4KAya5}Q$M+ZDy}u9P51p~} zB0Q`gdhV~20pL^zCZA%a_~AD|Jfi@FrGJ|Qc*`ta?!oWp0jG5Dl*~;I$gTI0$3bOz zN8`jjz{cFQ-G8h4ZVF(;f^A~<-{gH3ZE2F_oR@?j{j*UHygK~xDlL`G`Qh%iY$}F^ zKkcpW>Kwv%Clfln><>Jo#QShw@2hDu=(K}^_69&M{`oQb4o+j%!gfl57+6!PvQA%Z%3fhk0ZnQctzt)z$wYg~YzaHBj5caug-rujG zu?VU^sz)-Nfqz(h?5ZP$7o@>4)#rh3t#Wd_v3fnyq9JFTVLP6t#f^MyI|_T6M0U&` z$ZuleYdV_5QR=yiIx7L1ZuSiETQO78yDGcFY#mA zQU$Mi|9E@WR15$w;5yhf(jbX|jLW{{F{~Pi6I-L@PtImQ8RiF_zi2<{IGo^ozpf(H zzE>0z{&4HSbDg{Yy`16cFztddydo_umP4J+%wo2NPKdq}6mynt5&VL7*#w%)p~mE2 z@c}fz&G!|Pu;kO&3%TO+uOF@6G zCraXcGlqXGmQDx@y-_znoD58T7O!EkIg1Dj?Ks{=QnqXNVo2PqQf}Ku7=dQ@Jx*u% z>ix7Dvq%i~9N9aoLY{i=dT&b}rzf~}yEYG*(7fmGXO~@j_!fwfAkSFcKx24GpN#;O zb2^XVSVf7z5^%VAPrK1IO|I)}h{&<=w(AwoR|8)E8O8P)QNj=`sBWhNDn}yXY$P&q zx!G|S6~8VN(FeoHhSuEz&O_7x@B7d7bp`d_Rsyv5Q*!@=C$#C<@!tOgd=f99K?Mmi zc(cQ@Uw<)XgICdB5k1kEPHUl4wC?n!0=bZ_?)5jG2mcA3 z23$}9-B>(sJ7ModYglU1Xs6nhDHGUY(gxXh_O^rFkoWyu6_t^a4xg1U=j_Rt0RDT- zmV7g<5{$4+IZQjCl z|6Rrbzgaw3zks+y1qGOq;Zt`nT!34XkfH(I^Shs*;fHx(W<%veAzzfcz7JqU!?f%& ziSR;>pVYe-78NNL@yP=QQZ$}al%4u{Hih1wkN?p5Rxb~oD)*cX`)lwbk*yx^w2-qE*&p|(Z^!#KO-2n!zr}Y{g5rcx|ZTba%F@5xcLK) zfvEWY?qW)H=wZJ+Kb9-aqoNU_J#K%=c-3ZD{dxx(5yqpD!;}3vwd|6L2+Z%b5sHJK ztu0ulEEH-s^R#1YL|4a(iaZMuzMnym9L`0 zFnLL=g#|v3oVBVo7@!#_HIE+NJ94+|O);$apNQHU@Y=O(1f%~lt>*B);&Cf$=7F(WE|DUAWeSX6sHCWCVnxKP@dV9>PuGGFZ8Woic)>yf30sMyI&xcBuDb%KFNZm?>=_`(rE$62w-?Ytw_n(QFA? zvr0;WY4$CO)D$t<77FAuk&WycertNq>1-DYbsdt(y#I@H&a+4N7$#DUu(#CNs0s@= zj+?MNf6>4e0q@B1mJX4PrLG*OXx&snq=}{=eB^8JqE4*nZ8T{wx87c?sx-amE5Te4 zhMR0b7&{x{rMRNF&9KNR(Xmyl;#gZTThbit@1YNA+c=ArxDJ=(6DcIGyZFB%XRjbv zi+Z*CVz(^$QOsOtvkIey_X@buZV1xCu%*xscsYzx*cJW5=<;F zak8W8H%3@&Vyp>9T&2aKZVM$~VVKvN$c2TR)PSlFS?T7sOAJfYU(%OFC^vEZBfuBXm*G;`KAqBD;k(lLsCME&tL?EdY7`?m#4u`-5u2Mf@?*YhH zg>FT^(edZ_Lc}@4Nd4-cT2XAJ?S^DsaG-W912jNiJdKZ?BcUVLpQ>94t%rRIPX!=_ z?gDf;s}M;BS?Hm<7?W810(*GIqOjX5wcv~Xop7xq?QAh0<&PnZ?t6N`) zrf7EU{GL9yIYYIRbRQ;Jo8Av1}W6h708nkiPtM zZ=vJrHH4U;Yx6CyY;D4$31esFT_G;M>f|G$d>?T8D;KX zog9A!brK&<%!Kb`F3u%Xd9|8&qw)CTVfC7Jhc=H{(nu@Gu&1Fu!L=_Zr!^(L`D0r= z^>MO^C#L#DvzgT>?CC)RCChGSw4Q^BklBga512GjWj`BvQ16YU3o^(ni6 zXLpr%F}{w8oho6G?OVLsjFq zO4tp8)C_f6$AqU8cK6anEVmon(E?f8b}FjjVR$c9+JNC$@J z&Y zbceP4g(Q=&oM5|}2Wwy5+eCv=*}`|pTN)S|ST76ai_FdNJ5aq5u7|j88;1l(QYAb~ z1lg2iPuFgnow2$&YvK!BZHB2y>Eh=NSHs)s|2#UyDS< zs3^W~rp-+_E9;^ackO|?zpRvpkeptMeX5tTj#mRWy>z^~JA1*E9ay)XY;oj|2~e*i zwAGtLOLfb?VS zn;*O2U1K{%#>s27i)giOb>WrE*B@IL2dG0GSXM^Xf@X9nl8%qCXst;-)50D=B8o)A z94DN!%ttSCI5lbW1Zrmo&}wZAYuZkFs7_kBXD-t5SiF%#_7!sKN=|g>ee#)ECf+u5 zo{RK}hi(r^2TEt^Ryc+zfmak##ip>b4-#mn``9f&&v=7f-w?Q|9oe=N=nJi9b;Iz( ztAwHAx4_Zi0s9=%mJ7ZR(|4y)<~M@$rvil~H~Zg_748);7T&d$-PQ?zVa$a�%rr z4X=gNpD8y~*dw*}hqs>5T%ijNW3`w?DEH&p8*%lauRhNQ?Lh>*1kvSnFw zVOfgL_99MU+p|f&ID*dGezk?}9YLU7GL|vA6BN-v0^Hq(ETOEi5@X0?o2bL?y z(>a%CzGt*o0HTA}@IA+6DI(0LxvX6QS4$4^-$HqSbY~-O-TOx-Z2Aua*_|N=iaLez zkqV1Arn2m!oXg<{USw!LXVFGjL1;h+qSCHo_{ea?h0Ug<9d{I`ekLPcA-M$t0te*i>*)%^ef diff --git a/class_sink_parser__inherit__graph.md5 b/class_sink_parser__inherit__graph.md5 index 1a5a95f4..10b46018 100644 --- a/class_sink_parser__inherit__graph.md5 +++ b/class_sink_parser__inherit__graph.md5 @@ -1 +1 @@ -d02f7fd8d26a0375ade46df3226bf199 \ No newline at end of file +2cc3cf9eea33b15a4670b329f94ff207 \ No newline at end of file diff --git a/class_sink_parser__inherit__graph.png b/class_sink_parser__inherit__graph.png index 15c7ad1398b3f9593d1f4fb43f9076c1690c6a35..ca29fb69abba46081dbd2ec029cf3ea9d47cf785 100644 GIT binary patch literal 7184 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 z z8@Sg>-z5ZshOnAS@F~B#Q=qdMnb*llt2j69UcLYXk~4CCQ?*NchR{LIAAPa;Q6fp! zTR8m4Anll%pmY)v_JpU6?EdCbZ-KFN+()zX^a5f6(wIKTn23T zm=ohm>MAjjV&5LO9Y~%E(pd=I$5F8<$v@?!!Bmu8=n~ow6aF31+!Zd%gPADbk58;i z&udHEjH$%*Z;NbOaEk2Tw?H?H_=E9#{IY*tBN=70mrn<2A|9{=FrRQu1-VuLTYMO5 MO4^F`FRdc~5Bm1q3;+NC literal 7170 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�%rr z4X=gNpD8y~*dw*}hqs>5T%ijNW3`w?DEH&p8*%lauRhNQ?Lh>*1kvSnFw zVOfgL_99MU+p|f&ID*dGezk?}9YLU7GL|vA6BN-v0^Hq(ETOEi5@X0?o2bL?y z(>a%CzGt*o0HTA}@IA+6DI(0LxvX6QS4$4^-$HqSbY~-O-TOx-Z2Aua*_|N=iaLez zkqV1Arn2m!oXg<{USw!LXVFGjL1;h+qSCHo_{ea?h0Ug<9d{I`ekLPcA-M$t0te*i>*)%^ef diff --git a/class_u_s_b-members.html b/class_u_s_b-members.html index 2731b9fd..8cf00f93 100644 --- a/class_u_s_b-members.html +++ b/class_u_s_b-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 197 of file UsbCore.h.

    +

    Definition at line 208 of file UsbCore.h.

    Constructor & Destructor Documentation

    - + +

    ◆ USB()

    +
    @@ -217,12 +197,14 @@ Public Member Functions
    -

    Definition at line 25 of file Usb.cpp.

    +

    Definition at line 32 of file Usb.cpp.

    Member Function Documentation

    - + +

    ◆ SetHubPreMask()

    +
    @@ -243,11 +225,13 @@ Public Member Functions
    -

    Definition at line 205 of file UsbCore.h.

    +

    Definition at line 216 of file UsbCore.h.

    - + +

    ◆ ResetHubPreMask()

    +
    @@ -268,11 +252,13 @@ Public Member Functions
    -

    Definition at line 209 of file UsbCore.h.

    +

    Definition at line 220 of file UsbCore.h.

    - + +

    ◆ GetAddressPool()

    +
    @@ -293,11 +279,13 @@ Public Member Functions
    -

    Definition at line 213 of file UsbCore.h.

    +

    Definition at line 224 of file UsbCore.h.

    - + +

    ◆ RegisterDeviceClass()

    +
    @@ -319,11 +307,13 @@ Public Member Functions
    -

    Definition at line 217 of file UsbCore.h.

    +

    Definition at line 228 of file UsbCore.h.

    - + +

    ◆ ForEachUsbDevice()

    +
    @@ -345,11 +335,13 @@ Public Member Functions
    -

    Definition at line 227 of file UsbCore.h.

    +

    Definition at line 238 of file UsbCore.h.

    - + +

    ◆ getUsbTaskState()

    +
    @@ -363,11 +355,13 @@ Public Member Functions
    -

    Definition at line 36 of file Usb.cpp.

    +

    Definition at line 43 of file Usb.cpp.

    - + +

    ◆ setUsbTaskState()

    +
    @@ -381,11 +375,13 @@ Public Member Functions
    -

    Definition at line 40 of file Usb.cpp.

    +

    Definition at line 47 of file Usb.cpp.

    - + +

    ◆ getEpInfoEntry()

    +
    @@ -409,11 +405,13 @@ Public Member Functions
    -

    Definition at line 44 of file Usb.cpp.

    +

    Definition at line 51 of file Usb.cpp.

    - + +

    ◆ setEpInfoEntry()

    +
    @@ -443,11 +441,13 @@ Public Member Functions
    -

    Definition at line 64 of file Usb.cpp.

    +

    Definition at line 71 of file Usb.cpp.

    - + +

    ◆ getDevDescr()

    +
    @@ -485,11 +485,13 @@ Public Member Functions

    defined(USB_METHODS_INLINE)

    -

    Definition at line 766 of file Usb.cpp.

    +

    Definition at line 779 of file Usb.cpp.

    - + +

    ◆ getConfDescr() [1/2]

    +
    @@ -531,11 +533,13 @@ Public Member Functions
    -

    Definition at line 771 of file Usb.cpp.

    +

    Definition at line 784 of file Usb.cpp.

    - + +

    ◆ getConfDescr() [2/2]

    +
    @@ -571,11 +575,13 @@ Public Member Functions
    -

    Definition at line 777 of file Usb.cpp.

    +

    Definition at line 790 of file Usb.cpp.

    - + +

    ◆ getStrDescr()

    +
    @@ -623,11 +629,13 @@ Public Member Functions
    -

    Definition at line 796 of file Usb.cpp.

    +

    Definition at line 809 of file Usb.cpp.

    - + +

    ◆ setAddr()

    +
    @@ -657,11 +665,13 @@ Public Member Functions
    -

    Definition at line 801 of file Usb.cpp.

    +

    Definition at line 814 of file Usb.cpp.

    - + +

    ◆ setConf()

    +
    @@ -691,11 +701,13 @@ Public Member Functions
    -

    Definition at line 810 of file Usb.cpp.

    +

    Definition at line 823 of file Usb.cpp.

    - + +

    ◆ ctrlData()

    +
    @@ -739,7 +751,9 @@ Public Member Functions - + +

    ◆ ctrlStatus()

    +
    @@ -771,7 +785,9 @@ Public Member Functions - + +

    ◆ inTransfer()

    +
    @@ -813,11 +829,13 @@ Public Member Functions
    -

    Definition at line 206 of file Usb.cpp.

    +

    Definition at line 213 of file Usb.cpp.

    - + +

    ◆ outTransfer()

    +
    @@ -853,11 +871,13 @@ Public Member Functions
    -

    Definition at line 293 of file Usb.cpp.

    +

    Definition at line 300 of file Usb.cpp.

    - + +

    ◆ dispatchPkt()

    +
    @@ -887,11 +907,13 @@ Public Member Functions
    -

    Definition at line 377 of file Usb.cpp.

    +

    Definition at line 384 of file Usb.cpp.

    - + +

    ◆ Task()

    +
    @@ -905,11 +927,13 @@ Public Member Functions
    -

    Definition at line 425 of file Usb.cpp.

    +

    Definition at line 438 of file Usb.cpp.

    - + +

    ◆ DefaultAddressing()

    +
    @@ -939,11 +963,13 @@ Public Member Functions
    -

    Definition at line 531 of file Usb.cpp.

    +

    Definition at line 544 of file Usb.cpp.

    - + +

    ◆ Configuring()

    +
    @@ -973,11 +999,13 @@ Public Member Functions
    -

    Definition at line 653 of file Usb.cpp.

    +

    Definition at line 666 of file Usb.cpp.

    - + +

    ◆ ReleaseDevice()

    +
    @@ -991,11 +1019,13 @@ Public Member Functions
    -

    Definition at line 751 of file Usb.cpp.

    +

    Definition at line 764 of file Usb.cpp.

    - + +

    ◆ ctrlReq()

    +
    @@ -1073,7 +1103,7 @@ Public Member Functions
    -

    Definition at line 126 of file Usb.cpp.

    +

    Definition at line 133 of file Usb.cpp.

    @@ -1086,7 +1116,7 @@ Public Member Functions diff --git a/class_u_s_b__coll__graph.md5 b/class_u_s_b__coll__graph.md5 index 2b3a8617..ca823f4a 100644 --- a/class_u_s_b__coll__graph.md5 +++ b/class_u_s_b__coll__graph.md5 @@ -1 +1 @@ -48f1f6d22e8ca875c8c73c2869a63fbd \ No newline at end of file +f6ccf1fad8d6ecd2cff38fc98711f46e \ 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 522ab8ddb645efef41b24c28f7ee376ace4cee25..020093c93547e4228cdac44f30611b642406f7b1 100644 GIT binary patch literal 3017 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 literal 3088 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 Z%8DeDM5TjxL$cGSFw!^GtJiUg`!9df?qUD{ diff --git a/class_u_s_b__inherit__graph.md5 b/class_u_s_b__inherit__graph.md5 index 2b3a8617..9e938cee 100644 --- a/class_u_s_b__inherit__graph.md5 +++ b/class_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -48f1f6d22e8ca875c8c73c2869a63fbd \ No newline at end of file +23dbf1d6fae001672365342de66fd798 \ 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 522ab8ddb645efef41b24c28f7ee376ace4cee25..020093c93547e4228cdac44f30611b642406f7b1 100644 GIT binary patch literal 3017 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 literal 3088 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 Z%8DeDM5TjxL$cGSFw!^GtJiUg`!9df?qUD{ diff --git a/class_u_s_b_device_config-members.html b/class_u_s_b_device_config-members.html index a7627f28..a48093b7 100644 --- a/class_u_s_b_device_config-members.html +++ b/class_u_s_b_device_config-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 121 of file UsbCore.h.

    +

    Definition at line 132 of file UsbCore.h.

    Member Function Documentation

    - + +

    ◆ Init()

    +
    @@ -184,13 +164,15 @@ Public Member Functions
    - + +

    ◆ ConfigureDevice()

    +
    @@ -230,11 +212,13 @@ Public Member Functions

    Reimplemented in BulkOnly, BTD, ADK, and XBOXRECV.

    -

    Definition at line 128 of file UsbCore.h.

    +

    Definition at line 139 of file UsbCore.h.

    - + +

    ◆ Release()

    +
    @@ -255,13 +239,15 @@ Public Member Functions
    - + +

    ◆ Poll()

    +
    @@ -282,13 +268,15 @@ Public Member Functions
    -

    Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, ACM, USBHub, FTDI, ADK, HIDUniversal, XBOXRECV, HIDComposite, XBOXUSB, PS3USB, XBOXOLD, and XBOXONE.

    +

    Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, ACM, USBHub, FTDI, ADK, HIDUniversal, XBOXONE, XBOXRECV, HIDComposite, XBOXUSB, PS3USB, and XBOXOLD.

    -

    Definition at line 136 of file UsbCore.h.

    +

    Definition at line 147 of file UsbCore.h.

    - + +

    ◆ GetAddress()

    +
    @@ -309,13 +297,15 @@ Public Member Functions
    - + +

    ◆ ResetHubPort()

    +
    @@ -339,11 +329,13 @@ Public Member Functions

    Reimplemented in USBHub.

    -

    Definition at line 144 of file UsbCore.h.

    +

    Definition at line 155 of file UsbCore.h.

    - + +

    ◆ VIDPIDOK()

    +
    @@ -375,13 +367,15 @@ Public Member Functions
    -

    Reimplemented in BTD, PSBuzz, FTDI, PS4USB, ADK, XR21B1411, XBOXRECV, XBOXUSB, PS3USB, XBOXOLD, and XBOXONE.

    +

    Reimplemented in BTD, PSBuzz, FTDI, PS4USB, XBOXONE, ADK, XR21B1411, XBOXRECV, XBOXUSB, PS3USB, and XBOXOLD.

    -

    Definition at line 148 of file UsbCore.h.

    +

    Definition at line 159 of file UsbCore.h.

    - + +

    ◆ DEVCLASSOK()

    +
    @@ -405,11 +399,13 @@ Public Member Functions

    Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, and USBHub.

    -

    Definition at line 152 of file UsbCore.h.

    +

    Definition at line 163 of file UsbCore.h.

    - + +

    ◆ DEVSUBCLASSOK()

    +
    @@ -433,7 +429,7 @@ Public Member Functions

    Reimplemented in HIDBoot< BOOT_PROTOCOL >.

    -

    Definition at line 156 of file UsbCore.h.

    +

    Definition at line 167 of file UsbCore.h.

    @@ -445,7 +441,7 @@ Public Member Functions diff --git a/class_u_s_b_device_config__inherit__graph.md5 b/class_u_s_b_device_config__inherit__graph.md5 index 336e2e81..3348af13 100644 --- a/class_u_s_b_device_config__inherit__graph.md5 +++ b/class_u_s_b_device_config__inherit__graph.md5 @@ -1 +1 @@ -fd915a8e1b72b3dd4dec81d6c1c419c0 \ No newline at end of file +994d0cc22c63895732978d50034f369c \ 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 c283d4b0d993aa41148087ab84891b05a2eba9c4..7ef6d2eaf8d8a7a9893ff28241e4ddafd04e33ff 100644 GIT binary patch literal 56319 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 E0JrpF4*&oF literal 56125 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

    R0|zZBj&PJXSPrhS4B0hW~z`F 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 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 e90abf5c..7dd638f9 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,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

    - + - - + + + +
    bConfNumUSBH_MIDIprotected bNumEPUSBH_MIDIprotected bPollEnableUSBH_MIDIprotected - ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual - countSysExDataSize(uint8_t *dataptr)USBH_MIDIprotected - DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual - DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual - epDataInIndexUSBH_MIDIprotectedstatic - epDataInIndexVSPUSBH_MIDIprotectedstatic - epDataOutIndexUSBH_MIDIprotectedstatic - epDataOutIndexVSPUSBH_MIDIprotectedstatic - epInfoUSBH_MIDIprotected + bTransferTypeMaskUSBH_MIDIprotected + ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual + countSysExDataSize(uint8_t *dataptr)USBH_MIDIprotected + DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + epDataInIndexUSBH_MIDIprotectedstatic + epDataInIndexVSPUSBH_MIDIprotectedstatic + epDataOutIndexUSBH_MIDIprotectedstatic + epDataOutIndexVSPUSBH_MIDIprotectedstatic + epInfoUSBH_MIDIprotected + extractSysExData(uint8_t *p, uint8_t *buf)USBH_MIDI GetAddress()USBH_MIDIinlinevirtual + idProduct()USBH_MIDIinline + idVendor()USBH_MIDIinline Init(uint8_t parent, uint8_t port, bool lowspeed)USBH_MIDIvirtual isMidiFoundUSBH_MIDIprotected - parseConfigDescr(byte addr, byte conf)USBH_MIDIprotected - pidUSBH_MIDI + lookupMsgSize(uint8_t midiMsg, uint8_t cin=0)USBH_MIDI + operator bool()USBH_MIDIinline + parseConfigDescr(uint8_t addr, uint8_t conf)USBH_MIDIprotected + pidUSBH_MIDIprotected Poll()USBDeviceConfiginlinevirtual pUsbUSBH_MIDIprotected RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)USBH_MIDIinline @@ -116,20 +100,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); readPtrUSBH_MIDIprotected recvBufUSBH_MIDIprotected RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)USBH_MIDI - RecvData(uint8_t *outBuf)USBH_MIDI - Release()USBH_MIDIvirtual - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - SendData(uint8_t *dataptr, byte nCable=0)USBH_MIDI - SendSysEx(uint8_t *dataptr, unsigned int datasize, byte nCable=0)USBH_MIDI - USBH_MIDI(USB *p)USBH_MIDI - vidUSBH_MIDI - VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual + RecvData(uint8_t *outBuf, bool isRaw=false)USBH_MIDI + RecvRawData(uint8_t *outBuf)USBH_MIDI + Release()USBH_MIDIvirtual + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + SendData(uint8_t *dataptr, uint8_t nCable=0)USBH_MIDI + SendRawData(uint16_t bytes_send, uint8_t *dataptr)USBH_MIDI + SendSysEx(uint8_t *dataptr, uint16_t datasize, uint8_t nCable=0)USBH_MIDI + setupDeviceSpecific()USBH_MIDIprotected + USBH_MIDI(USB *p)USBH_MIDI + vidUSBH_MIDIprotected + VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    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 565d10b2..cb7768da 100644 --- a/class_u_s_b_h___m_i_d_i.html +++ b/class_u_s_b_h___m_i_d_i.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: USBH_MIDI Class Reference @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    Public Member Functions  USBH_MIDI (USB *p)   + operator bool () +  +uint16_t idVendor () +  +uint16_t idProduct () +  uint8_t RecvData (uint16_t *bytes_rcvd, uint8_t *dataptr)   -uint8_t RecvData (uint8_t *outBuf) -  -uint8_t SendData (uint8_t *dataptr, byte nCable=0) -  -uint8_t SendSysEx (uint8_t *dataptr, unsigned int datasize, byte nCable=0) -  +uint8_t RecvData (uint8_t *outBuf, bool isRaw=false) +  +uint8_t RecvRawData (uint8_t *outBuf) +  +uint8_t SendData (uint8_t *dataptr, uint8_t nCable=0) +  +uint8_t lookupMsgSize (uint8_t midiMsg, uint8_t cin=0) +  +uint8_t SendSysEx (uint8_t *dataptr, uint16_t datasize, uint8_t nCable=0) +  +uint8_t extractSysExData (uint8_t *p, uint8_t *buf) +  +uint8_t SendRawData (uint16_t bytes_send, uint8_t *dataptr) +  uint8_t RcvData (uint16_t *bytes_rcvd, uint8_t *dataptr)   uint8_t RcvData (uint8_t *outBuf) @@ -153,19 +144,14 @@ Public Member Functions virtual bool DEVSUBCLASSOK (uint8_t subklass)   - - - - - -

    -Public Attributes

    uint16_t pid
     
    uint16_t vid
     
    - - - - + + + + + +

    Protected Member Functions

    void parseConfigDescr (byte addr, byte conf)
     
    unsigned int countSysExDataSize (uint8_t *dataptr)
     
    uint8_t parseConfigDescr (uint8_t addr, uint8_t conf)
     
    uint16_t countSysExDataSize (uint8_t *dataptr)
     
    void setupDeviceSpecific ()
     
    @@ -181,6 +167,12 @@ Protected Attributes + + + + + + @@ -201,9 +193,11 @@ Static Protected Attributes

    Protected Attributes

     
    bool isMidiFound
     
    uint16_t pid
     
    uint16_t vid
     
    uint8_t bTransferTypeMask
     
    EpInfo epInfo [MIDI_MAX_ENDPOINTS]
     
    uint8_t recvBuf [MIDI_EVENT_PACKET_SIZE]

    Detailed Description

    -

    Definition at line 37 of file usbh_midi.h.

    +

    Definition at line 39 of file usbh_midi.h.

    Constructor & Destructor Documentation

    - + +

    ◆ USBH_MIDI()

    +
    @@ -217,12 +211,14 @@ Static Protected Attributes
    -

    Definition at line 87 of file usbh_midi.cpp.

    +

    Definition at line 87 of file usbh_midi.cpp.

    Member Function Documentation

    - + +

    ◆ parseConfigDescr()

    +
    @@ -230,15 +226,15 @@ Static Protected Attributes
    - + - + - + @@ -254,11 +250,13 @@ Static Protected Attributes
    void USBH_MIDI::parseConfigDescr uint8_t USBH_MIDI::parseConfigDescr (byte uint8_t  addr,
    byte uint8_t  conf 
    -

    Definition at line 240 of file usbh_midi.cpp.

    +

    Definition at line 253 of file usbh_midi.cpp.

    - + +

    ◆ countSysExDataSize()

    +
    @@ -266,7 +264,7 @@ Static Protected Attributes 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 9672b222..0da20209 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 @@ -25cb7fd7fbb45243f203aae31cb09034 \ No newline at end of file +68a4b7f7cabc03126d08e6372706b04f \ 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 118c32045d1735db3f2e157cc868a60abd5f6b04..970bc205f3b59d00504b585f4ca23b40ba36c7dd 100644 GIT binary patch literal 12645 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 literal 12112 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 literal 4483 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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 cfecbb96..4beb2751 100644 --- a/class_u_s_b_h_i_d-members.html +++ b/class_u_s_b_h_i_d-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + @@ -280,11 +278,121 @@ Static Protected Attributes
    unsigned int USBH_MIDI::countSysExDataSize uint16_t USBH_MIDI::countSysExDataSize ( uint8_t *  dataptr)
    -

    Definition at line 487 of file usbh_midi.cpp.

    +

    Definition at line 532 of file usbh_midi.cpp.

    - + +

    ◆ setupDeviceSpecific()

    + +
    +
    + + + + + +
    + + + + + + + +
    void USBH_MIDI::setupDeviceSpecific ()
    +
    +protected
    +
    + +

    Definition at line 345 of file usbh_midi.cpp.

    + +
    +
    + +

    ◆ operator bool()

    + +
    +
    + + + + + +
    + + + + + + + +
    USBH_MIDI::operator bool ()
    +
    +inline
    +
    + +

    Definition at line 71 of file usbh_midi.h.

    + +
    +
    + +

    ◆ idVendor()

    + +
    +
    + + + + + +
    + + + + + + + +
    uint16_t USBH_MIDI::idVendor ()
    +
    +inline
    +
    + +

    Definition at line 72 of file usbh_midi.h.

    + +
    +
    + +

    ◆ idProduct()

    + +
    +
    + + + + + +
    + + + + + + + +
    uint16_t USBH_MIDI::idProduct ()
    +
    +inline
    +
    + +

    Definition at line 73 of file usbh_midi.h.

    + +
    +
    + +

    ◆ RecvData() [1/2]

    +
    @@ -308,11 +416,13 @@ Static Protected Attributes
    -

    Definition at line 321 of file usbh_midi.cpp.

    +

    Definition at line 357 of file usbh_midi.cpp.

    - + +

    ◆ RecvData() [2/2]

    +
    @@ -320,17 +430,49 @@ Static Protected Attributes + + + + + + + + + + + + + +
    uint8_t USBH_MIDI::RecvData ( uint8_t * outBuf,
    bool isRaw = false 
    )
    +
    + +

    Definition at line 370 of file usbh_midi.cpp.

    + +
    +
    + +

    ◆ RecvRawData()

    + +
    +
    + + + + +
    uint8_t USBH_MIDI::RecvRawData (uint8_t *  outBuf)
    -

    Definition at line 334 of file usbh_midi.cpp.

    +

    Definition at line 411 of file usbh_midi.cpp.

    - + +

    ◆ SendData()

    +
    @@ -343,7 +485,7 @@ Static Protected Attributes - + @@ -354,11 +496,43 @@ Static Protected Attributes
    byte uint8_t  nCable = 0 
    -

    Definition at line 373 of file usbh_midi.cpp.

    +

    Definition at line 417 of file usbh_midi.cpp.

    - + +

    ◆ lookupMsgSize()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    uint8_t USBH_MIDI::lookupMsgSize (uint8_t midiMsg,
    uint8_t cin = 0 
    )
    +
    + +

    Definition at line 481 of file usbh_midi.cpp.

    + +
    +
    + +

    ◆ SendSysEx()

    +
    @@ -371,13 +545,13 @@ Static Protected Attributes - + - + @@ -388,11 +562,73 @@ Static Protected Attributes
    unsigned int uint16_t  datasize,
    byte uint8_t  nCable = 0 
    -

    Definition at line 511 of file usbh_midi.cpp.

    +

    Definition at line 556 of file usbh_midi.cpp.

    - + +

    ◆ extractSysExData()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    uint8_t USBH_MIDI::extractSysExData (uint8_t * p,
    uint8_t * buf 
    )
    +
    + +

    Definition at line 619 of file usbh_midi.cpp.

    + +
    +
    + +

    ◆ SendRawData()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    uint8_t USBH_MIDI::SendRawData (uint16_t bytes_send,
    uint8_t * dataptr 
    )
    +
    + +

    Definition at line 613 of file usbh_midi.cpp.

    + +
    +
    + +

    ◆ RcvData() [1/2]

    +
    @@ -424,11 +660,13 @@ Static Protected Attributes
    -

    Definition at line 76 of file usbh_midi.h.

    +

    Definition at line 84 of file usbh_midi.h.

    - + +

    ◆ RcvData() [2/2]

    +
    @@ -450,11 +688,13 @@ Static Protected Attributes
    -

    Definition at line 77 of file usbh_midi.h.

    +

    Definition at line 85 of file usbh_midi.h.

    - + +

    ◆ Init()

    +
    @@ -494,11 +734,13 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 110 of file usbh_midi.cpp.

    +

    Definition at line 108 of file usbh_midi.cpp.

    - + +

    ◆ Release()

    +
    @@ -521,11 +763,13 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 310 of file usbh_midi.cpp.

    +

    Definition at line 334 of file usbh_midi.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -548,12 +792,14 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 82 of file usbh_midi.h.

    +

    Definition at line 90 of file usbh_midi.h.

    Member Data Documentation

    - + +

    ◆ epDataInIndex

    +
    @@ -571,11 +817,13 @@ Static Protected Attributes
    -

    Definition at line 43 of file usbh_midi.h.

    +

    Definition at line 42 of file usbh_midi.h.

    - + +

    ◆ epDataOutIndex

    +
    @@ -593,11 +841,13 @@ Static Protected Attributes
    -

    Definition at line 44 of file usbh_midi.h.

    +

    Definition at line 43 of file usbh_midi.h.

    - + +

    ◆ epDataInIndexVSP

    +
    @@ -615,11 +865,13 @@ Static Protected Attributes
    -

    Definition at line 45 of file usbh_midi.h.

    +

    Definition at line 44 of file usbh_midi.h.

    - + +

    ◆ epDataOutIndexVSP

    +
    @@ -637,11 +889,13 @@ Static Protected Attributes
    -

    Definition at line 46 of file usbh_midi.h.

    +

    Definition at line 45 of file usbh_midi.h.

    - + +

    ◆ pUsb

    +
    @@ -659,11 +913,13 @@ Static Protected Attributes
    -

    Definition at line 49 of file usbh_midi.h.

    +

    Definition at line 48 of file usbh_midi.h.

    - + +

    ◆ bAddress

    +
    @@ -681,11 +937,13 @@ Static Protected Attributes
    -

    Definition at line 50 of file usbh_midi.h.

    +

    Definition at line 49 of file usbh_midi.h.

    - + +

    ◆ bConfNum

    +
    @@ -703,11 +961,13 @@ Static Protected Attributes
    -

    Definition at line 51 of file usbh_midi.h.

    +

    Definition at line 50 of file usbh_midi.h.

    - + +

    ◆ bNumEP

    +
    @@ -725,11 +985,13 @@ Static Protected Attributes
    -

    Definition at line 52 of file usbh_midi.h.

    +

    Definition at line 51 of file usbh_midi.h.

    - + +

    ◆ bPollEnable

    +
    @@ -747,11 +1009,13 @@ Static Protected Attributes
    -

    Definition at line 53 of file usbh_midi.h.

    +

    Definition at line 52 of file usbh_midi.h.

    - + +

    ◆ isMidiFound

    +
    @@ -769,11 +1033,85 @@ Static Protected Attributes
    -

    Definition at line 55 of file usbh_midi.h.

    +

    Definition at line 53 of file usbh_midi.h.

    - + +

    ◆ pid

    + +
    +
    + + + + + +
    + + + + +
    uint16_t USBH_MIDI::pid
    +
    +protected
    +
    + +

    Definition at line 54 of file usbh_midi.h.

    + +
    +
    + +

    ◆ vid

    + +
    +
    + + + + + +
    + + + + +
    uint16_t USBH_MIDI::vid
    +
    +protected
    +
    + +

    Definition at line 54 of file usbh_midi.h.

    + +
    +
    + +

    ◆ bTransferTypeMask

    + +
    +
    + + + + + +
    + + + + +
    uint8_t USBH_MIDI::bTransferTypeMask
    +
    +protected
    +
    + +

    Definition at line 55 of file usbh_midi.h.

    + +
    +
    + +

    ◆ epInfo

    +
    @@ -791,11 +1129,13 @@ Static Protected Attributes
    -

    Definition at line 57 of file usbh_midi.h.

    +

    Definition at line 57 of file usbh_midi.h.

    - + +

    ◆ recvBuf

    +
    @@ -813,11 +1153,13 @@ Static Protected Attributes
    -

    Definition at line 59 of file usbh_midi.h.

    +

    Definition at line 59 of file usbh_midi.h.

    - + +

    ◆ readPtr

    +
    @@ -835,35 +1177,7 @@ Static Protected Attributes
    -

    Definition at line 60 of file usbh_midi.h.

    - -
    -
    - -
    -
    - - - - -
    uint16_t USBH_MIDI::pid
    -
    - -

    Definition at line 68 of file usbh_midi.h.

    - -
    -
    - -
    -
    - - - - -
    uint16_t USBH_MIDI::vid
    -
    - -

    Definition at line 68 of file usbh_midi.h.

    +

    Definition at line 60 of file usbh_midi.h.

    @@ -876,7 +1190,7 @@ Static Protected Attributes
    - + - - + + + +
    - + - - + + + +

    Detailed Description

    -

    Definition at line 143 of file usbhid.h.

    +

    Definition at line 143 of file usbhid.h.

    Constructor & Destructor Documentation

    - + +

    ◆ USBHID()

    +
    @@ -224,12 +204,14 @@ Static Protected Attributes
    -

    Definition at line 165 of file usbhid.h.

    +

    Definition at line 165 of file usbhid.h.

    Member Function Documentation

    - + +

    ◆ PrintEndpointDescriptor()

    +
    @@ -251,11 +233,13 @@ Static Protected Attributes
    -

    Definition at line 74 of file usbhid.cpp.

    +

    Definition at line 74 of file usbhid.cpp.

    - + +

    ◆ PrintHidDescriptor()

    +
    @@ -277,11 +261,13 @@ Static Protected Attributes
    -

    Definition at line 90 of file usbhid.cpp.

    +

    Definition at line 90 of file usbhid.cpp.

    - + +

    ◆ GetReportParser()

    +
    @@ -305,11 +291,13 @@ Static Protected Attributes

    Reimplemented in HIDUniversal, and HIDComposite.

    -

    Definition at line 159 of file usbhid.h.

    +

    Definition at line 159 of file usbhid.h.

    - + +

    ◆ GetUsb()

    +
    @@ -330,11 +318,13 @@ Static Protected Attributes
    -

    Definition at line 168 of file usbhid.h.

    +

    Definition at line 168 of file usbhid.h.

    - + +

    ◆ SetReportParser()

    +
    @@ -368,11 +358,13 @@ Static Protected Attributes

    Reimplemented in HIDBoot< BOOT_PROTOCOL >, HIDUniversal, and HIDComposite.

    -

    Definition at line 172 of file usbhid.h.

    +

    Definition at line 172 of file usbhid.h.

    - + +

    ◆ SetProtocol()

    +
    @@ -396,11 +388,13 @@ Static Protected Attributes
    -

    Definition at line 66 of file usbhid.cpp.

    +

    Definition at line 66 of file usbhid.cpp.

    - + +

    ◆ GetProtocol()

    +
    @@ -424,11 +418,13 @@ Static Protected Attributes
    -

    Definition at line 70 of file usbhid.cpp.

    +

    Definition at line 70 of file usbhid.cpp.

    - + +

    ◆ GetIdle()

    +
    @@ -458,11 +454,13 @@ Static Protected Attributes
    -

    Definition at line 58 of file usbhid.cpp.

    +

    Definition at line 58 of file usbhid.cpp.

    - + +

    ◆ SetIdle()

    +
    @@ -492,11 +490,13 @@ Static Protected Attributes
    -

    Definition at line 62 of file usbhid.cpp.

    +

    Definition at line 62 of file usbhid.cpp.

    - + +

    ◆ GetReportDescr()

    +
    @@ -520,11 +520,13 @@ Static Protected Attributes
    -

    Definition at line 34 of file usbhid.cpp.

    +

    Definition at line 34 of file usbhid.cpp.

    - + +

    ◆ GetHidDescr()

    +
    @@ -556,7 +558,9 @@ Static Protected Attributes - + +

    ◆ GetReport()

    +
    @@ -604,11 +608,13 @@ Static Protected Attributes
    -

    Definition at line 54 of file usbhid.cpp.

    +

    Definition at line 54 of file usbhid.cpp.

    - + +

    ◆ SetReport()

    +
    @@ -656,12 +662,14 @@ Static Protected Attributes
    -

    Definition at line 50 of file usbhid.cpp.

    +

    Definition at line 50 of file usbhid.cpp.

    Member Data Documentation

    - + +

    ◆ pUsb

    +
    @@ -679,11 +687,13 @@ Static Protected Attributes
    -

    Definition at line 145 of file usbhid.h.

    +

    Definition at line 145 of file usbhid.h.

    - + +

    ◆ bAddress

    +
    @@ -701,11 +711,13 @@ Static Protected Attributes
    -

    Definition at line 146 of file usbhid.h.

    +

    Definition at line 146 of file usbhid.h.

    - + +

    ◆ epInterruptInIndex

    +
    @@ -723,11 +735,13 @@ Static Protected Attributes
    -

    Definition at line 149 of file usbhid.h.

    +

    Definition at line 149 of file usbhid.h.

    - + +

    ◆ epInterruptOutIndex

    +
    @@ -745,11 +759,13 @@ Static Protected Attributes
    -

    Definition at line 150 of file usbhid.h.

    +

    Definition at line 150 of file usbhid.h.

    - + +

    ◆ maxHidInterfaces

    +
    @@ -767,11 +783,13 @@ Static Protected Attributes
    -

    Definition at line 152 of file usbhid.h.

    +

    Definition at line 152 of file usbhid.h.

    - + +

    ◆ maxEpPerInterface

    +
    @@ -789,11 +807,13 @@ Static Protected Attributes
    -

    Definition at line 153 of file usbhid.h.

    +

    Definition at line 153 of file usbhid.h.

    - + +

    ◆ totalEndpoints

    +
    @@ -811,7 +831,7 @@ Static Protected Attributes
    -

    Definition at line 154 of file usbhid.h.

    +

    Definition at line 154 of file usbhid.h.

    @@ -824,7 +844,7 @@ Static Protected Attributes 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 92be9460..b8d9dc3c 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 @@ -cf485acf15d75bd6f1697dfca03233cb \ No newline at end of file +55575cb1417a298be7b19ac4ba5cc390 \ 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 6a2aa4d1595d8e46e9d7cff943a6d4f098fb09f8..a4aa62982a065491f6650161dcbef67dc0a65319 100644 GIT binary patch literal 12994 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 diff --git a/class_u_s_b_hub-members.html b/class_u_s_b_hub-members.html index 9c2d71ce..b0f323c0 100644 --- a/class_u_s_b_hub-members.html +++ b/class_u_s_b_hub-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 164 of file usbhub.h.

    +

    Definition at line 164 of file usbhub.h.

    Constructor & Destructor Documentation

    - + +

    ◆ USBHub()

    +
    @@ -163,12 +143,14 @@ Public Member Functions
    -

    Definition at line 21 of file usbhub.cpp.

    +

    Definition at line 21 of file usbhub.cpp.

    Member Function Documentation

    - + +

    ◆ ClearHubFeature()

    +
    @@ -190,11 +172,13 @@ Public Member Functions
    -

    Definition at line 211 of file usbhub.h.

    +

    Definition at line 211 of file usbhub.h.

    - + +

    ◆ ClearPortFeature()

    +
    @@ -232,11 +216,13 @@ Public Member Functions
    -

    Definition at line 216 of file usbhub.h.

    +

    Definition at line 216 of file usbhub.h.

    - + +

    ◆ GetHubDescriptor()

    +
    @@ -274,11 +260,13 @@ Public Member Functions
    -

    Definition at line 221 of file usbhub.h.

    +

    Definition at line 221 of file usbhub.h.

    - + +

    ◆ GetHubStatus()

    +
    @@ -310,11 +298,13 @@ Public Member Functions
    -

    Definition at line 226 of file usbhub.h.

    +

    Definition at line 226 of file usbhub.h.

    - + +

    ◆ GetPortStatus()

    +
    @@ -352,11 +342,13 @@ Public Member Functions
    -

    Definition at line 231 of file usbhub.h.

    +

    Definition at line 231 of file usbhub.h.

    - + +

    ◆ SetHubDescriptor()

    +
    @@ -394,11 +386,13 @@ Public Member Functions
    -

    Definition at line 236 of file usbhub.h.

    +

    Definition at line 236 of file usbhub.h.

    - + +

    ◆ SetHubFeature()

    +
    @@ -420,11 +414,13 @@ Public Member Functions
    -

    Definition at line 241 of file usbhub.h.

    +

    Definition at line 241 of file usbhub.h.

    - + +

    ◆ SetPortFeature()

    +
    @@ -462,11 +458,13 @@ Public Member Functions
    -

    Definition at line 246 of file usbhub.h.

    +

    Definition at line 246 of file usbhub.h.

    - + +

    ◆ PrintHubStatus()

    +
    @@ -481,7 +479,9 @@ Public Member Functions - + +

    ◆ Init()

    +
    @@ -521,11 +521,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 44 of file usbhub.cpp.

    +

    Definition at line 44 of file usbhub.cpp.

    - + +

    ◆ Release()

    +
    @@ -548,11 +550,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 216 of file usbhub.cpp.

    +

    Definition at line 216 of file usbhub.cpp.

    - + +

    ◆ Poll()

    +
    @@ -575,11 +579,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 229 of file usbhub.cpp.

    +

    Definition at line 229 of file usbhub.cpp.

    - + +

    ◆ ResetHubPort()

    +
    @@ -603,11 +609,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 309 of file usbhub.cpp.

    +

    Definition at line 309 of file usbhub.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -630,11 +638,13 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 199 of file usbhub.h.

    +

    Definition at line 199 of file usbhub.h.

    - + +

    ◆ DEVCLASSOK()

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

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 203 of file usbhub.h.

    +

    Definition at line 203 of file usbhub.h.

    @@ -671,7 +681,7 @@ Public Member Functions diff --git a/class_u_s_b_hub__coll__graph.md5 b/class_u_s_b_hub__coll__graph.md5 index 5328fe8d..acaaeb5a 100644 --- a/class_u_s_b_hub__coll__graph.md5 +++ b/class_u_s_b_hub__coll__graph.md5 @@ -1 +1 @@ -bf8ca3c3b9277566d37448eda78dfa47 \ No newline at end of file +19a6b573cae00d583786c381a3eb5446 \ 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 2821222910d050002064b3cdcf9c836f4d709a24..d0a58c21725604e246ce979ee1b6449409e1bd06 100644 GIT binary patch literal 4319 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 diff --git a/class_u_s_b_hub__inherit__graph.md5 b/class_u_s_b_hub__inherit__graph.md5 index 5328fe8d..33450caf 100644 --- a/class_u_s_b_hub__inherit__graph.md5 +++ b/class_u_s_b_hub__inherit__graph.md5 @@ -1 +1 @@ -bf8ca3c3b9277566d37448eda78dfa47 \ No newline at end of file +f8fb8ebf62ffeb914faf5e448f0fa095 \ 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 2821222910d050002064b3cdcf9c836f4d709a24..d0a58c21725604e246ce979ee1b6449409e1bd06 100644 GIT binary patch literal 4319 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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 5b07368b..610cecf2 100644 --- a/class_u_s_b_read_parser-members.html +++ b/class_u_s_b_read_parser-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 192 of file UsbCore.h.

    +

    Definition at line 203 of file UsbCore.h.

    Member Function Documentation

    - + +

    ◆ Parse()

    +
    @@ -164,7 +144,7 @@ Public Member Functions diff --git a/class_u_s_b_read_parser__inherit__graph.md5 b/class_u_s_b_read_parser__inherit__graph.md5 index b9ca8675..083c726c 100644 --- a/class_u_s_b_read_parser__inherit__graph.md5 +++ b/class_u_s_b_read_parser__inherit__graph.md5 @@ -1 +1 @@ -ec3e429c5021a90ad76c1c993c8aa8bc \ No newline at end of file +bfbf139c46e46f9f8d2fef64f5bb2e5b \ 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 5fa1ca019813f49e39dfc93716533d204f56520c..cc993a2ac455b3cea4a84e77385ad357fa869755 100644 GIT binary patch literal 20718 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 literal 19907 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 170 of file hidescriptorparser.h.

    +

    Definition at line 170 of file hidescriptorparser.h.

    Member Function Documentation

    - + +

    ◆ Parse()

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

    Implements HIDReportParser.

    -

    Definition at line 1581 of file hidescriptorparser.cpp.

    +

    Definition at line 1581 of file hidescriptorparser.cpp.

    @@ -178,7 +158,7 @@ Public Member Functions diff --git a/class_universal_report_parser__coll__graph.md5 b/class_universal_report_parser__coll__graph.md5 index 18ce6809..b9a0d07a 100644 --- a/class_universal_report_parser__coll__graph.md5 +++ b/class_universal_report_parser__coll__graph.md5 @@ -1 +1 @@ -6ae2ae36eea0ce9a020916893890ce48 \ No newline at end of file +77621cd9b3f148b98b1c0c2ce929a351 \ 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 e3af2bebee640a474cb0c0badac14bf54895dbcb..bea114d50b8199e3fb61dcc6291b74207c6baf60 100644 GIT binary patch literal 5200 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 literal 5174 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 literal 5174 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +
    + @@ -121,9 +100,11 @@ Public Member Functions

    Detailed Description

    -

    Definition at line 23 of file confdescparser.h.

    +

    Definition at line 30 of file confdescparser.h.

    Member Function Documentation

    - + +

    ◆ EndpointXtract()

    +
    @@ -173,9 +154,9 @@ Public Member Functions
    -

    Reimplemented in BulkOnly, BTD, ACM, HIDBoot< BOOT_PROTOCOL >, FTDI, ADK, HIDUniversal, and HIDComposite.

    +

    Reimplemented in BulkOnly, BTD, ACM, HIDBoot< BOOT_PROTOCOL >, XBOXONE, FTDI, ADK, HIDUniversal, and HIDComposite.

    -

    Definition at line 28 of file confdescparser.h.

    +

    Definition at line 35 of file confdescparser.h.

    @@ -187,7 +168,7 @@ Public Member Functions diff --git a/class_usb_config_xtracter__inherit__graph.map b/class_usb_config_xtracter__inherit__graph.map index 129cf935..5c747991 100644 --- a/class_usb_config_xtracter__inherit__graph.map +++ b/class_usb_config_xtracter__inherit__graph.map @@ -5,6 +5,7 @@ + diff --git a/class_usb_config_xtracter__inherit__graph.md5 b/class_usb_config_xtracter__inherit__graph.md5 index 905b81e5..122b897f 100644 --- a/class_usb_config_xtracter__inherit__graph.md5 +++ b/class_usb_config_xtracter__inherit__graph.md5 @@ -1 +1 @@ -3da5adc5fba589839a6e9363a14c8467 \ No newline at end of file +9c2a0c5b68bd54ead963169aff634d3f \ 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 3c31a225eaa7ea6108fa0b27e41c6ac599e40893..24ab644e964ed277b6945eca28660cdab58d0c1d 100644 GIT binary patch literal 36095 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 O0D-5gpUXO@geCxMVhBV4 literal 34135 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    This BluetoothService class implements support for the Wiimote including the Nunchuck and Motion Plus extension.

    It also support the Wii U Pro Controller.

    -

    Definition at line 56 of file Wii.h.

    +

    Definition at line 56 of file Wii.h.

    Constructor & Destructor Documentation

    - + +

    ◆ WII()

    +
    @@ -344,12 +324,14 @@ Additional Inherited Members -

    Definition at line 85 of file Wii.cpp.

    +

    Definition at line 85 of file Wii.cpp.

    Member Function Documentation

    - + +

    ◆ disconnect()

    +
    @@ -373,11 +355,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 116 of file Wii.cpp.

    +

    Definition at line 116 of file Wii.cpp.

    - + +

    ◆ getButtonPress()

    +
    @@ -400,11 +384,13 @@ Additional Inherited Members
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 1086 of file Wii.cpp.

    +

    Definition at line 1097 of file Wii.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -427,11 +413,13 @@ Additional Inherited Members
    Returns
    getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
    -

    Definition at line 1093 of file Wii.cpp.

    +

    Definition at line 1104 of file Wii.cpp.

    - + +

    ◆ pair()

    +
    @@ -454,11 +442,13 @@ Additional Inherited Members

    Call this to start the pairing sequence with a controller

    -

    Definition at line 89 of file Wii.h.

    +

    Definition at line 89 of file Wii.h.

    - + +

    ◆ getAnalogHat() [1/2]

    +
    @@ -479,11 +469,13 @@ Additional Inherited Members
    Returns
    Return the analog value in the range from approximately 25-230.
    -

    Definition at line 1104 of file Wii.cpp.

    +

    Definition at line 1115 of file Wii.cpp.

    - + +

    ◆ getAnalogHat() [2/2]

    +
    @@ -504,11 +496,13 @@ Additional Inherited Members
    Returns
    Return the analog value in the range from approximately 800-3200.
    -

    Definition at line 1116 of file Wii.cpp.

    +

    Definition at line 1127 of file Wii.cpp.

    - + +

    ◆ getPitch()

    +
    @@ -530,11 +524,13 @@ 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.
    -

    Definition at line 110 of file Wii.h.

    +

    Definition at line 110 of file Wii.h.

    - + +

    ◆ getRoll()

    +
    @@ -556,11 +552,13 @@ 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.
    -

    Definition at line 120 of file Wii.h.

    +

    Definition at line 120 of file Wii.h.

    - + +

    ◆ getYaw()

    +
    @@ -583,11 +581,13 @@ 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.
    -

    Definition at line 132 of file Wii.h.

    +

    Definition at line 132 of file Wii.h.

    - + +

    ◆ setAllOff()

    +
    @@ -601,11 +601,13 @@ Additional Inherited Members

    Used to set all LEDs and rumble off.

    -

    Definition at line 896 of file Wii.cpp.

    +

    Definition at line 903 of file Wii.cpp.

    - + +

    ◆ setRumbleOff()

    +
    @@ -619,11 +621,13 @@ Additional Inherited Members

    Turn off rumble.

    -

    Definition at line 902 of file Wii.cpp.

    +

    Definition at line 909 of file Wii.cpp.

    - + +

    ◆ setRumbleOn()

    +
    @@ -637,11 +641,13 @@ Additional Inherited Members

    Turn on rumble.

    -

    Definition at line 908 of file Wii.cpp.

    +

    Definition at line 915 of file Wii.cpp.

    - + +

    ◆ setRumbleToggle()

    +
    @@ -655,11 +661,13 @@ Additional Inherited Members

    Toggle rumble.

    -

    Definition at line 914 of file Wii.cpp.

    +

    Definition at line 921 of file Wii.cpp.

    - + +

    ◆ setLedRaw()

    +
    @@ -679,11 +687,13 @@ Additional Inherited Members -

    Definition at line 920 of file Wii.cpp.

    +

    Definition at line 927 of file Wii.cpp.

    - + +

    ◆ setLedOff() [1/2]

    +
    @@ -705,11 +715,13 @@ Additional Inherited Members

    Turn all LEDs off.

    -

    Definition at line 152 of file Wii.h.

    +

    Definition at line 152 of file Wii.h.

    - + +

    ◆ setLedOff() [2/2]

    +
    @@ -729,11 +741,13 @@ Additional Inherited Members -

    Definition at line 926 of file Wii.cpp.

    +

    Definition at line 933 of file Wii.cpp.

    - + +

    ◆ setLedOn()

    +
    @@ -753,11 +767,13 @@ Additional Inherited Members -

    Definition at line 932 of file Wii.cpp.

    +

    Definition at line 939 of file Wii.cpp.

    - + +

    ◆ setLedToggle()

    +
    @@ -777,11 +793,13 @@ Additional Inherited Members -

    Definition at line 942 of file Wii.cpp.

    +

    Definition at line 949 of file Wii.cpp.

    - + +

    ◆ setLedStatus()

    +
    @@ -796,11 +814,13 @@ Additional Inherited Members

    This will set the LEDs, so the user can see which connections are active.

    The first LEDEnum indicate that the Wiimote is connected, the second LEDEnum indicate indicate that a Motion Plus is also connected the third LEDEnum will indicate that a Nunchuck controller is also connected.

    -

    Definition at line 948 of file Wii.cpp.

    +

    Definition at line 955 of file Wii.cpp.

    - + +

    ◆ getBatteryLevel()

    +
    @@ -814,11 +834,13 @@ Additional Inherited Members

    Return the battery level of the Wiimote.

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

    Definition at line 961 of file Wii.cpp.

    +

    Definition at line 968 of file Wii.cpp.

    - + +

    ◆ getWiiState()

    +
    @@ -840,11 +862,13 @@ Additional Inherited Members

    Return the Wiimote state.

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

    Definition at line 189 of file Wii.h.

    +

    Definition at line 189 of file Wii.h.

    - + +

    ◆ getWiimotePitch()

    +
    @@ -866,11 +890,13 @@ Additional Inherited Members

    Pitch and roll calculated from the accelerometer inside the Wiimote.

    -

    Definition at line 212 of file Wii.h.

    +

    Definition at line 212 of file Wii.h.

    - + +

    ◆ getWiimoteRoll()

    +
    @@ -892,11 +918,13 @@ Additional Inherited Members

    Pitch and roll calculated from the accelerometer inside the Wiimote.

    -

    Definition at line 216 of file Wii.h.

    +

    Definition at line 216 of file Wii.h.

    - + +

    ◆ getNunchuckPitch()

    +
    @@ -918,11 +946,13 @@ Additional Inherited Members

    Pitch and roll calculated from the accelerometer inside the Nunchuck.

    -

    Definition at line 224 of file Wii.h.

    +

    Definition at line 224 of file Wii.h.

    - + +

    ◆ getNunchuckRoll()

    +
    @@ -944,11 +974,13 @@ Additional Inherited Members

    Pitch and roll calculated from the accelerometer inside the Nunchuck.

    -

    Definition at line 228 of file Wii.h.

    +

    Definition at line 228 of file Wii.h.

    - + +

    ◆ getWeight()

    +
    @@ -969,11 +1001,13 @@ Additional Inherited Members
    Returns
    Returns the weight in kg.
    -

    Definition at line 1139 of file Wii.cpp.

    +

    Definition at line 1150 of file Wii.cpp.

    - + +

    ◆ getTotalWeight()

    +
    @@ -987,11 +1021,13 @@ Additional Inherited Members

    Used to get total weight on the Wii Balance Board.

    Returns
    Returns the weight in kg.
    -

    Definition at line 1152 of file Wii.cpp.

    +

    Definition at line 1163 of file Wii.cpp.

    - + +

    ◆ getWeightRaw()

    +
    @@ -1020,11 +1056,13 @@ Additional Inherited Members
    Returns
    Returns the raw reading.
    -

    Definition at line 295 of file Wii.h.

    +

    Definition at line 295 of file Wii.h.

    - + +

    ◆ IRinitialize()

    +
    @@ -1038,11 +1076,13 @@ Additional Inherited Members

    Initialises the camera as per the steps from: http://wiibrew.org/wiki/Wiimote#IR_Camera

    -

    Definition at line 1162 of file Wii.cpp.

    +

    Definition at line 1173 of file Wii.cpp.

    - + +

    ◆ getIRx1()

    +
    @@ -1064,11 +1104,13 @@ 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.
    -

    Definition at line 311 of file Wii.h.

    +

    Definition at line 311 of file Wii.h.

    - + +

    ◆ getIRy1()

    +
    @@ -1090,11 +1132,13 @@ 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.
    -

    Definition at line 319 of file Wii.h.

    +

    Definition at line 319 of file Wii.h.

    - + +

    ◆ getIRs1()

    +
    @@ -1116,11 +1160,13 @@ Additional Inherited Members

    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.

    +

    Definition at line 327 of file Wii.h.

    - + +

    ◆ getIRx2()

    +
    @@ -1142,11 +1188,13 @@ 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.
    -

    Definition at line 335 of file Wii.h.

    +

    Definition at line 335 of file Wii.h.

    - + +

    ◆ getIRy2()

    +
    @@ -1168,11 +1216,13 @@ 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.
    -

    Definition at line 343 of file Wii.h.

    +

    Definition at line 343 of file Wii.h.

    - + +

    ◆ getIRs2()

    +
    @@ -1194,11 +1244,13 @@ Additional Inherited Members

    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.

    +

    Definition at line 351 of file Wii.h.

    - + +

    ◆ getIRx3()

    +
    @@ -1220,11 +1272,13 @@ 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.
    -

    Definition at line 359 of file Wii.h.

    +

    Definition at line 359 of file Wii.h.

    - + +

    ◆ getIRy3()

    +
    @@ -1246,11 +1300,13 @@ 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.
    -

    Definition at line 367 of file Wii.h.

    +

    Definition at line 367 of file Wii.h.

    - + +

    ◆ getIRs3()

    +
    @@ -1272,11 +1328,13 @@ Additional Inherited Members

    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.

    +

    Definition at line 375 of file Wii.h.

    - + +

    ◆ getIRx4()

    +
    @@ -1298,11 +1356,13 @@ 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.
    -

    Definition at line 383 of file Wii.h.

    +

    Definition at line 383 of file Wii.h.

    - + +

    ◆ getIRy4()

    +
    @@ -1324,11 +1384,13 @@ 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.
    -

    Definition at line 391 of file Wii.h.

    +

    Definition at line 391 of file Wii.h.

    - + +

    ◆ getIRs4()

    +
    @@ -1350,11 +1412,13 @@ Additional Inherited Members

    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.

    +

    Definition at line 399 of file Wii.h.

    - + +

    ◆ isIRCameraEnabled()

    +
    @@ -1376,11 +1440,13 @@ 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.
    -

    Definition at line 408 of file Wii.h.

    +

    Definition at line 408 of file Wii.h.

    - + +

    ◆ ACLData()

    +
    @@ -1410,11 +1476,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 133 of file Wii.cpp.

    +

    Definition at line 133 of file Wii.cpp.

    - + +

    ◆ Run()

    +
    @@ -1438,11 +1506,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 718 of file Wii.cpp.

    +

    Definition at line 725 of file Wii.cpp.

    - + +

    ◆ Reset()

    +
    @@ -1466,11 +1536,13 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 101 of file Wii.cpp.

    +

    Definition at line 101 of file Wii.cpp.

    - + +

    ◆ onInit()

    +
    @@ -1494,12 +1566,14 @@ Additional Inherited Members

    Implements BluetoothService.

    -

    Definition at line 1128 of file Wii.cpp.

    +

    Definition at line 1139 of file Wii.cpp.

    Member Data Documentation

    - + +

    ◆ wiimoteConnected

    +
    @@ -1510,11 +1584,13 @@ Additional Inherited Members

    Variable used to indicate if a Wiimote is connected.

    -

    Definition at line 191 of file Wii.h.

    +

    Definition at line 191 of file Wii.h.

    - + +

    ◆ nunchuckConnected

    +
    @@ -1525,11 +1601,13 @@ Additional Inherited Members

    Variable used to indicate if a Nunchuck controller is connected.

    -

    Definition at line 198 of file Wii.h.

    +

    Definition at line 198 of file Wii.h.

    - + +

    ◆ motionPlusConnected

    +
    @@ -1540,11 +1618,13 @@ Additional Inherited Members

    Variable used to indicate if a Nunchuck controller is connected.

    -

    Definition at line 200 of file Wii.h.

    +

    Definition at line 200 of file Wii.h.

    - + +

    ◆ wiiUProControllerConnected

    +
    @@ -1555,11 +1635,13 @@ Additional Inherited Members

    Variable used to indicate if a Wii U Pro controller is connected.

    -

    Definition at line 202 of file Wii.h.

    +

    Definition at line 202 of file Wii.h.

    - + +

    ◆ wiiBalanceBoardConnected

    +
    @@ -1570,11 +1652,13 @@ Additional Inherited Members

    Variable used to indicate if a Wii Balance Board is connected.

    -

    Definition at line 204 of file Wii.h.

    +

    Definition at line 204 of file Wii.h.

    - + +

    ◆ accXwiimote

    +
    @@ -1585,11 +1669,13 @@ Additional Inherited Members

    Accelerometer values used to calculate pitch and roll.

    -

    Definition at line 230 of file Wii.h.

    +

    Definition at line 230 of file Wii.h.

    - + +

    ◆ accYwiimote

    +
    @@ -1600,11 +1686,13 @@ Additional Inherited Members

    Accelerometer values used to calculate pitch and roll.

    -

    Definition at line 230 of file Wii.h.

    +

    Definition at line 230 of file Wii.h.

    - + +

    ◆ accZwiimote

    +
    @@ -1615,11 +1703,13 @@ Additional Inherited Members

    Accelerometer values used to calculate pitch and roll.

    -

    Definition at line 230 of file Wii.h.

    +

    Definition at line 230 of file Wii.h.

    - + +

    ◆ accXnunchuck

    +
    @@ -1630,11 +1720,13 @@ Additional Inherited Members

    Accelerometer values used to calculate pitch and roll.

    -

    Definition at line 236 of file Wii.h.

    +

    Definition at line 236 of file Wii.h.

    - + +

    ◆ accYnunchuck

    +
    @@ -1645,11 +1737,13 @@ Additional Inherited Members

    Accelerometer values used to calculate pitch and roll.

    -

    Definition at line 236 of file Wii.h.

    +

    Definition at line 236 of file Wii.h.

    - + +

    ◆ accZnunchuck

    +
    @@ -1660,11 +1754,13 @@ Additional Inherited Members

    Accelerometer values used to calculate pitch and roll.

    -

    Definition at line 236 of file Wii.h.

    +

    Definition at line 236 of file Wii.h.

    - + +

    ◆ gyroPitch

    +
    @@ -1675,11 +1771,13 @@ Additional Inherited Members

    This is the pitch calculated by the gyro - use this to tune WII::pitchGyroScale.

    -

    Definition at line 241 of file Wii.h.

    +

    Definition at line 241 of file Wii.h.

    - + +

    ◆ gyroRoll

    +
    @@ -1690,11 +1788,13 @@ Additional Inherited Members

    This is the roll calculated by the gyro - use this to tune WII::rollGyroScale.

    -

    Definition at line 243 of file Wii.h.

    +

    Definition at line 243 of file Wii.h.

    - + +

    ◆ gyroYaw

    +
    @@ -1705,11 +1805,13 @@ Additional Inherited Members

    This is the yaw calculated by the gyro - use this to tune WII::yawGyroScale.

    -

    Definition at line 245 of file Wii.h.

    +

    Definition at line 245 of file Wii.h.

    - + +

    ◆ pitchGyroSpeed

    +
    @@ -1720,11 +1822,13 @@ Additional Inherited Members

    The speed in deg/s from the gyro.

    -

    Definition at line 249 of file Wii.h.

    +

    Definition at line 249 of file Wii.h.

    - + +

    ◆ rollGyroSpeed

    +
    @@ -1735,11 +1839,13 @@ Additional Inherited Members

    The speed in deg/s from the gyro.

    -

    Definition at line 250 of file Wii.h.

    +

    Definition at line 250 of file Wii.h.

    - + +

    ◆ yawGyroSpeed

    +
    @@ -1750,11 +1856,13 @@ Additional Inherited Members

    The speed in deg/s from the gyro.

    -

    Definition at line 251 of file Wii.h.

    +

    Definition at line 251 of file Wii.h.

    - + +

    ◆ pitchGyroScale

    +
    @@ -1765,11 +1873,13 @@ Additional Inherited Members

    You might need to fine-tune these values.

    -

    Definition at line 256 of file Wii.h.

    +

    Definition at line 256 of file Wii.h.

    - + +

    ◆ rollGyroScale

    +
    @@ -1780,11 +1890,13 @@ Additional Inherited Members

    You might need to fine-tune these values.

    -

    Definition at line 257 of file Wii.h.

    +

    Definition at line 257 of file Wii.h.

    - + +

    ◆ yawGyroScale

    +
    @@ -1795,11 +1907,13 @@ Additional Inherited Members

    You might need to fine-tune these values.

    -

    Definition at line 258 of file Wii.h.

    +

    Definition at line 258 of file Wii.h.

    - + +

    ◆ gyroYawRaw

    +
    @@ -1810,11 +1924,13 @@ Additional Inherited Members

    Raw value read directly from the Motion Plus.

    -

    Definition at line 263 of file Wii.h.

    +

    Definition at line 263 of file Wii.h.

    - + +

    ◆ gyroRollRaw

    +
    @@ -1825,11 +1941,13 @@ Additional Inherited Members

    Raw value read directly from the Motion Plus.

    -

    Definition at line 264 of file Wii.h.

    +

    Definition at line 264 of file Wii.h.

    - + +

    ◆ gyroPitchRaw

    +
    @@ -1840,11 +1958,13 @@ Additional Inherited Members

    Raw value read directly from the Motion Plus.

    -

    Definition at line 265 of file Wii.h.

    +

    Definition at line 265 of file Wii.h.

    - + +

    ◆ gyroYawZero

    +
    @@ -1855,11 +1975,13 @@ Additional Inherited Members

    These values are set when the controller is first initialized.

    -

    Definition at line 270 of file Wii.h.

    +

    Definition at line 270 of file Wii.h.

    - + +

    ◆ gyroRollZero

    +
    @@ -1870,11 +1992,13 @@ Additional Inherited Members

    These values are set when the controller is first initialized.

    -

    Definition at line 271 of file Wii.h.

    +

    Definition at line 271 of file Wii.h.

    - + +

    ◆ gyroPitchZero

    +
    @@ -1885,7 +2009,7 @@ Additional Inherited Members

    These values are set when the controller is first initialized.

    -

    Definition at line 272 of file Wii.h.

    +

    Definition at line 272 of file Wii.h.

    @@ -1898,7 +2022,7 @@ Additional Inherited Members diff --git a/class_w_i_i__coll__graph.md5 b/class_w_i_i__coll__graph.md5 index 32ea2769..a10fe2cb 100644 --- a/class_w_i_i__coll__graph.md5 +++ b/class_w_i_i__coll__graph.md5 @@ -1 +1 @@ -e2fa40aab171687d763b41a969505c68 \ No newline at end of file +e1501afe750d6b78ef0a9e4e2bae788b \ 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 4fc5e0850a095b7c1bf09acab4044061dc95f305..a33059400548e92e00ff2121b66d9bd978d685a5 100644 GIT binary patch literal 23107 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 DuK5OM literal 22282 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 KfL#NDoboR#7FQww diff --git a/class_w_i_i__inherit__graph.md5 b/class_w_i_i__inherit__graph.md5 index 6b41428e..7b7bcaf0 100644 --- a/class_w_i_i__inherit__graph.md5 +++ b/class_w_i_i__inherit__graph.md5 @@ -1 +1 @@ -0f2ab569d0b7006cfff8d64fe9f9fda1 \ No newline at end of file +e76134827ecba3876499802eaee4ce30 \ 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 3255cae96c68ab7aa9b406fb6523026b4ed15220..c1c53ca44a931e45eb197a3b70dabd78ee788495 100644 GIT binary patch literal 3498 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 T`xzb9=L=wFWQnF3c*Ol5cdeUp literal 3461 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 JmFc2l{s$&Jo$det 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 d04599e4..68adb942 100644 --- a/class_x_b_o_x_o_l_d-members.html +++ b/class_x_b_o_x_o_l_d-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    This class implements support for a the original Xbox controller via USB.

    -

    Definition at line 46 of file XBOXOLD.h.

    +

    Definition at line 46 of file XBOXOLD.h.

    Constructor & Destructor Documentation

    - + +

    ◆ XBOXOLD()

    +
    @@ -194,12 +174,14 @@ Protected Attributes -

    Definition at line 47 of file XBOXOLD.cpp.

    +

    Definition at line 47 of file XBOXOLD.cpp.

    Member Function Documentation

    - + +

    ◆ Init()

    +
    @@ -248,11 +230,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 63 of file XBOXOLD.cpp.

    +

    Definition at line 63 of file XBOXOLD.cpp.

    - + +

    ◆ Release()

    +
    @@ -276,11 +260,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 237 of file XBOXOLD.cpp.

    +

    Definition at line 237 of file XBOXOLD.cpp.

    - + +

    ◆ Poll()

    +
    @@ -304,11 +290,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 245 of file XBOXOLD.cpp.

    +

    Definition at line 245 of file XBOXOLD.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -332,11 +320,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 78 of file XBOXOLD.h.

    +

    Definition at line 78 of file XBOXOLD.h.

    - + +

    ◆ isReady()

    +
    @@ -358,11 +348,13 @@ Protected Attributes

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.
    -

    Definition at line 86 of file XBOXOLD.h.

    +

    Definition at line 86 of file XBOXOLD.h.

    - + +

    ◆ VIDPIDOK()

    +
    @@ -404,11 +396,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 96 of file XBOXOLD.h.

    +

    Definition at line 96 of file XBOXOLD.h.

    - + +

    ◆ getButtonPress()

    +
    @@ -431,11 +425,13 @@ Protected Attributes
    Returns
    getButtonClick(ButtonEnum b) will return a bool, while getButtonPress(ButtonEnum b) will return a byte if reading L2 or R2.
    -

    Definition at line 295 of file XBOXOLD.cpp.

    +

    Definition at line 295 of file XBOXOLD.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -458,11 +454,13 @@ Protected Attributes
    Returns
    getButtonClick(ButtonEnum b) will return a bool, while getButtonPress(ButtonEnum b) will return a byte if reading L2 or R2.
    -

    Definition at line 302 of file XBOXOLD.cpp.

    +

    Definition at line 302 of file XBOXOLD.cpp.

    - + +

    ◆ getAnalogHat()

    +
    @@ -483,11 +481,13 @@ Protected Attributes
    Returns
    Returns a signed 16-bit integer.
    -

    Definition at line 317 of file XBOXOLD.cpp.

    +

    Definition at line 317 of file XBOXOLD.cpp.

    - + +

    ◆ setRumbleOff()

    +
    @@ -509,11 +509,13 @@ Protected Attributes

    Turn rumble off the controller.

    -

    Definition at line 125 of file XBOXOLD.h.

    +

    Definition at line 125 of file XBOXOLD.h.

    - + +

    ◆ setRumbleOn()

    +
    @@ -544,11 +546,13 @@ Protected Attributes -

    Definition at line 327 of file XBOXOLD.cpp.

    +

    Definition at line 327 of file XBOXOLD.cpp.

    - + +

    ◆ attachOnInit()

    +
    @@ -576,12 +580,14 @@ Protected Attributes -

    Definition at line 139 of file XBOXOLD.h.

    +

    Definition at line 139 of file XBOXOLD.h.

    Member Data Documentation

    - + +

    ◆ XboxConnected

    +
    @@ -592,11 +598,13 @@ Protected Attributes

    True if a Xbox controller is connected.

    -

    Definition at line 141 of file XBOXOLD.h.

    +

    Definition at line 141 of file XBOXOLD.h.

    - + +

    ◆ pUsb

    +
    @@ -615,11 +623,13 @@ Protected Attributes

    Pointer to USB class instance.

    -

    Definition at line 149 of file XBOXOLD.h.

    +

    Definition at line 149 of file XBOXOLD.h.

    - + +

    ◆ bAddress

    +
    @@ -638,11 +648,13 @@ Protected Attributes

    Device address.

    -

    Definition at line 151 of file XBOXOLD.h.

    +

    Definition at line 151 of file XBOXOLD.h.

    - + +

    ◆ epInfo

    +
    @@ -661,7 +673,7 @@ Protected Attributes

    Endpoint info structure.

    -

    Definition at line 153 of file XBOXOLD.h.

    +

    Definition at line 153 of file XBOXOLD.h.

    @@ -674,7 +686,7 @@ Protected Attributes 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 c02a188a..42b7005f 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 @@ -3285ca35607fc26fc3c6347499cd29e6 \ No newline at end of file +c0023cd1084e2018409a7a9723373210 \ 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 f9be51b0e1a4bb8aac8e3239bab03a4d4d3638ab..dc6c3dccb2d9f0a97f4a2a6f45991461dfb4c691 100644 GIT binary patch literal 12733 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 T#Rl+u3>Y~nWyxA`qu~Dm514z< literal 12179 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 Fe*o%)Froke 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 73dafbc3..de29cd5b 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 @@ -1eeb2bcd708d5b17ef18f534c5633a29 \ No newline at end of file +8ea0f3477d33c1fccfccfb30f84bc05e \ 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 03a81f7824451fb748c9ca3532f1a0c3b9e4e61c..b24a6a908ecdc92ddd7b65e6f8dd78d7d5687766 100644 GIT binary patch literal 4516 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 literal 4540 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 diff --git a/class_x_b_o_x_o_n_e-members.html b/class_x_b_o_x_o_n_e-members.html index 2d8aaa8d..3ed5b264 100644 --- a/class_x_b_o_x_o_n_e-members.html +++ b/class_x_b_o_x_o_n_e-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    attachOnInit(void(*funcOnInit)(void))XBOXONEinline bAddressXBOXONEprotected + bConfNumXBOXONEprotected + bNumEPXBOXONEprotected ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual - epInfoXBOXONEprotected - GetAddress()XBOXONEinlinevirtual - getAnalogHat(AnalogHatEnum a)XBOXONE - getButtonClick(ButtonEnum b)XBOXONE - getButtonPress(ButtonEnum b)XBOXONE - Init(uint8_t parent, uint8_t port, bool lowspeed)XBOXONEvirtual - isReady()XBOXONEinlinevirtual - Poll()XBOXONEvirtual + EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)XBOXONEprotectedvirtual + epInfoXBOXONEprotected + GetAddress()XBOXONEinlinevirtual + getAnalogHat(AnalogHatEnum a)XBOXONE + getButtonClick(ButtonEnum b)XBOXONE + getButtonPress(ButtonEnum b)XBOXONE + Init(uint8_t parent, uint8_t port, bool lowspeed)XBOXONEvirtual + isReady()XBOXONEinlinevirtual + Poll()XBOXONEvirtual + PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)XBOXONEprotected pUsbXBOXONEprotected + qNextPollTimeXBOXONEprotected + readPollInterval()XBOXONEinline Release()XBOXONEvirtual ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + setRumbleOff()XBOXONE + setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor)XBOXONE VIDPIDOK(uint16_t vid, uint16_t pid)XBOXONEinlinevirtual XBOXONE(USB *pUsb)XBOXONE XboxOneConnectedXBOXONE @@ -115,7 +101,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 fc1ba634..674955be 100644 --- a/class_x_b_o_x_o_n_e.html +++ b/class_x_b_o_x_o_n_e.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XBOXONE Class Reference @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    @@ -101,6 +80,7 @@ Inheritance diagram for XBOXONE:
    Inheritance graph
    +
    [legend]
    @@ -109,9 +89,10 @@ Collaboration diagram for XBOXONE:
    Collaboration graph
    - - - + + + +
    [legend]
    @@ -130,6 +111,8 @@ Public Member Functions + + @@ -141,6 +124,10 @@ Public Member Functions + + + + @@ -156,21 +143,37 @@ Public Attributes
     
    virtual bool isReady ()
     
    uint8_t readPollInterval ()
     
    virtual bool VIDPIDOK (uint16_t vid, uint16_t pid)
     
    Xbox Controller functions
     
    void attachOnInit (void(*funcOnInit)(void))
     
    void setRumbleOff ()
     
    void setRumbleOn (uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor)
     
    - Public Member Functions inherited from USBDeviceConfig
    virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)
     
    bool XboxOneConnected
     
    + + + + + + +

    +Protected Member Functions

    void PrintEndpointDescriptor (const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
     
    UsbConfigXtracter implementation
    void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
     
    - - + + + + + + + +

    Protected Attributes

    USBpUsb
     
    uint8_t bAddress
     
    EpInfo epInfo [XBOX_MAX_ENDPOINTS]
     
    EpInfo epInfo [XBOX_ONE_MAX_ENDPOINTS]
     
    uint8_t bConfNum
     
    uint8_t bNumEP
     
    uint32_t qNextPollTime
     

    Detailed Description

    This class implements support for a Xbox ONE controller connected via USB.

    -

    Definition at line 46 of file XBOXONE.h.

    +

    Definition at line 65 of file XBOXONE.h.

    Constructor & Destructor Documentation

    - + +

    ◆ XBOXONE()

    +
    @@ -190,12 +193,14 @@ Protected Attributes -

    Definition at line 27 of file XBOXONE.cpp.

    +

    Definition at line 27 of file XBOXONE.cpp.

    Member Function Documentation

    - + +

    ◆ Init()

    +
    @@ -244,11 +249,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 43 of file XBOXONE.cpp.

    +

    Definition at line 46 of file XBOXONE.cpp.

    - + +

    ◆ Release()

    +
    @@ -272,11 +279,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 226 of file XBOXONE.cpp.

    +

    Definition at line 278 of file XBOXONE.cpp.

    - + +

    ◆ Poll()

    +
    @@ -300,11 +309,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 237 of file XBOXONE.cpp.

    +

    Definition at line 292 of file XBOXONE.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -328,11 +339,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 78 of file XBOXONE.h.

    +

    Definition at line 97 of file XBOXONE.h.

    - + +

    ◆ isReady()

    +
    @@ -354,11 +367,41 @@ Protected Attributes

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.
    -

    Definition at line 86 of file XBOXONE.h.

    +

    Definition at line 105 of file XBOXONE.h.

    - + +

    ◆ readPollInterval()

    + +
    +
    +
    + + + + +
    + + + + + + + +
    uint8_t XBOXONE::readPollInterval ()
    +
    +inline
    +
    +

    Read the poll interval taken from the endpoint descriptors.

    Returns
    The poll interval in ms.
    + +

    Definition at line 113 of file XBOXONE.h.

    + +
    +
    + +

    ◆ VIDPIDOK()

    +
    @@ -400,11 +443,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 96 of file XBOXONE.h.

    +

    Definition at line 123 of file XBOXONE.h.

    - + +

    ◆ getButtonPress()

    +
    @@ -427,11 +472,13 @@ Protected Attributes
    Returns
    getButtonClick(ButtonEnum b) will return a bool, while getButtonPress(ButtonEnum b) will return a word if reading L2 or R2.
    -

    Definition at line 316 of file XBOXONE.cpp.

    +

    Definition at line 372 of file XBOXONE.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -454,11 +501,13 @@ Protected Attributes
    Returns
    getButtonClick(ButtonEnum b) will return a bool, while getButtonPress(ButtonEnum b) will return a word if reading L2 or R2.
    -

    Definition at line 324 of file XBOXONE.cpp.

    +

    Definition at line 380 of file XBOXONE.cpp.

    - + +

    ◆ getAnalogHat()

    +
    @@ -479,11 +528,13 @@ Protected Attributes
    Returns
    Returns a signed 16-bit integer.
    -

    Definition at line 344 of file XBOXONE.cpp.

    +

    Definition at line 400 of file XBOXONE.cpp.

    - + +

    ◆ attachOnInit()

    +
    @@ -511,12 +562,187 @@ Protected Attributes -

    Definition at line 126 of file XBOXONE.h.

    +

    Definition at line 156 of file XBOXONE.h.

    + + + + +

    ◆ setRumbleOff()

    + +
    +
    +
    + + + + + + +
    void XBOXONE::setRumbleOff ()
    +
    +

    Used to set the rumble off.

    + +

    Definition at line 442 of file XBOXONE.cpp.

    + +
    +
    + +

    ◆ setRumbleOn()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void XBOXONE::setRumbleOn (uint8_t leftTrigger,
    uint8_t rightTrigger,
    uint8_t leftMotor,
    uint8_t rightMotor 
    )
    +
    +

    Used to turn on rumble continuously.

    Parameters
    + + + + + +
    leftTriggerLeft trigger force.
    rightTriggerRight trigger force.
    leftMotorLeft motor force.
    rightMotorRight motor force.
    +
    +
    + +

    Definition at line 464 of file XBOXONE.cpp.

    + +
    +
    + +

    ◆ EndpointXtract()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void XBOXONE::EndpointXtract (uint8_t conf,
    uint8_t iface,
    uint8_t alt,
    uint8_t proto,
    const USB_ENDPOINT_DESCRIPTORep 
    )
    +
    +protectedvirtual
    +
    +

    UsbConfigXtracter implementation, used to extract endpoint information.

    Parameters
    + + + + + + +
    confConfiguration value.
    ifaceInterface number.
    altAlternate setting.
    protoInterface Protocol.
    epEndpoint Descriptor.
    +
    +
    + +

    Reimplemented from UsbConfigXtracter.

    + +

    Definition at line 239 of file XBOXONE.cpp.

    + +
    +
    + +

    ◆ PrintEndpointDescriptor()

    + +
    +
    + + + + + +
    + + + + + + + + +
    void XBOXONE::PrintEndpointDescriptor (const USB_ENDPOINT_DESCRIPTORep_ptr)
    +
    +protected
    +
    +

    Used to print the USB Endpoint Descriptor.

    Parameters
    + + +
    ep_ptrPointer to USB Endpoint Descriptor.
    +
    +
    + +

    Definition at line 259 of file XBOXONE.cpp.

    Member Data Documentation

    - + +

    ◆ XboxOneConnected

    +
    @@ -527,11 +753,13 @@ Protected Attributes

    True if a Xbox ONE controller is connected.

    -

    Definition at line 128 of file XBOXONE.h.

    +

    Definition at line 174 of file XBOXONE.h.

    - + +

    ◆ pUsb

    +
    @@ -550,11 +778,13 @@ Protected Attributes

    Pointer to USB class instance.

    -

    Definition at line 136 of file XBOXONE.h.

    +

    Definition at line 178 of file XBOXONE.h.

    - + +

    ◆ bAddress

    +
    @@ -573,11 +803,13 @@ Protected Attributes

    Device address.

    -

    Definition at line 138 of file XBOXONE.h.

    +

    Definition at line 180 of file XBOXONE.h.

    - + +

    ◆ epInfo

    +
    @@ -585,7 +817,7 @@ Protected Attributes @@ -596,7 +828,82 @@ Protected Attributes

    Endpoint info structure.

    -

    Definition at line 140 of file XBOXONE.h.

    +

    Definition at line 182 of file XBOXONE.h.

    + +
    + + +

    ◆ bConfNum

    + +
    +
    +
    - +
    EpInfo XBOXONE::epInfo[XBOX_MAX_ENDPOINTS]EpInfo XBOXONE::epInfo[XBOX_ONE_MAX_ENDPOINTS]
    + + + + +
    + + + + +
    uint8_t XBOXONE::bConfNum
    +
    +protected
    +
    +

    Configuration number.

    + +

    Definition at line 185 of file XBOXONE.h.

    + +
    +
    + +

    ◆ bNumEP

    + +
    +
    + + + + + +
    + + + + +
    uint8_t XBOXONE::bNumEP
    +
    +protected
    +
    +

    Total number of endpoints in the configuration.

    + +

    Definition at line 187 of file XBOXONE.h.

    + +
    +
    + +

    ◆ qNextPollTime

    + +
    +
    + + + + + +
    + + + + +
    uint32_t XBOXONE::qNextPollTime
    +
    +protected
    +
    +

    Next poll time based on poll interval taken from the USB descriptor.

    + +

    Definition at line 189 of file XBOXONE.h.

    @@ -609,7 +916,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 d57aea04..e391c8a3 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,6 +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 44dc070e..11a3d6d9 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 @@ -57bf78dcea511b3e3448e9603d73bed9 \ No newline at end of file +685a1b999dfc021cbeace7d73ca5f08c \ 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 e6e0603041557da3c6e2a1052d99198e910ea0a4..0f715995b86e42e0db8a030a8b3b5328abcf1037 100644 GIT binary patch literal 17205 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 IY8>?c0Mi%~yZ`_I literal 12240 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 xFY+> + 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 394fccd8..3e4c3048 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 @@ -7524668a9732abeee25eb125a21bda5f \ No newline at end of file +01199dc77ff7dcdfb5dccdc4b3c6381b \ 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 d60bbc9f75a15325c3bc3406cc58c6a6573f539a..06c1ed3d1eaa205487d9f6ee5b447f3d8cb29df4 100644 GIT binary patch literal 8236 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 F{{c?k-wpr( diff --git a/class_x_b_o_x_r_e_c_v-members.html b/class_x_b_o_x_r_e_c_v-members.html index 8204172e..226160a2 100644 --- a/class_x_b_o_x_r_e_c_v-members.html +++ b/class_x_b_o_x_r_e_c_v-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    This class implements support for a Xbox Wireless receiver.

    Up to four controllers can connect to one receiver, if more is needed one can use a second receiver via the USBHub class.

    -

    Definition at line 55 of file XBOXRECV.h.

    +

    Definition at line 55 of file XBOXRECV.h.

    Constructor & Destructor Documentation

    - + +

    ◆ XBOXRECV()

    +
    @@ -215,12 +195,14 @@ Protected Attributes -

    Definition at line 25 of file XBOXRECV.cpp.

    +

    Definition at line 25 of file XBOXRECV.cpp.

    Member Function Documentation

    - + +

    ◆ ConfigureDevice()

    +
    @@ -269,11 +251,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 41 of file XBOXRECV.cpp.

    +

    Definition at line 41 of file XBOXRECV.cpp.

    - + +

    ◆ Init()

    +
    @@ -322,11 +306,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 138 of file XBOXRECV.cpp.

    +

    Definition at line 138 of file XBOXRECV.cpp.

    - + +

    ◆ Release()

    +
    @@ -350,11 +336,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 283 of file XBOXRECV.cpp.

    +

    Definition at line 283 of file XBOXRECV.cpp.

    - + +

    ◆ Poll()

    +
    @@ -378,11 +366,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 293 of file XBOXRECV.cpp.

    +

    Definition at line 293 of file XBOXRECV.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -406,11 +396,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 95 of file XBOXRECV.h.

    +

    Definition at line 95 of file XBOXRECV.h.

    - + +

    ◆ isReady()

    +
    @@ -432,11 +424,13 @@ Protected Attributes

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.
    -

    Definition at line 103 of file XBOXRECV.h.

    +

    Definition at line 103 of file XBOXRECV.h.

    - + +

    ◆ VIDPIDOK()

    +
    @@ -478,11 +472,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 113 of file XBOXRECV.h.

    +

    Definition at line 113 of file XBOXRECV.h.

    - + +

    ◆ getButtonPress()

    +
    @@ -516,11 +512,13 @@ Protected Attributes
    Returns
    getButtonClick(uint8_t controller, ButtonEnum b) will return a bool, while getButtonPress(uint8_t controller, ButtonEnum b) will return a byte if reading L2 or R2.
    -

    Definition at line 410 of file XBOXRECV.cpp.

    +

    Definition at line 410 of file XBOXRECV.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -554,11 +552,13 @@ Protected Attributes
    Returns
    getButtonClick(uint8_t controller, ButtonEnum b) will return a bool, while getButtonPress(uint8_t controller, ButtonEnum b) will return a byte if reading L2 or R2.
    -

    Definition at line 418 of file XBOXRECV.cpp.

    +

    Definition at line 418 of file XBOXRECV.cpp.

    - + +

    ◆ getAnalogHat()

    +
    @@ -590,11 +590,13 @@ Protected Attributes
    Returns
    Returns a signed 16-bit integer.
    -

    Definition at line 438 of file XBOXRECV.cpp.

    +

    Definition at line 438 of file XBOXRECV.cpp.

    - + +

    ◆ disconnect()

    +
    @@ -614,11 +616,13 @@ Protected Attributes -

    Definition at line 498 of file XBOXRECV.cpp.

    +

    Definition at line 498 of file XBOXRECV.cpp.

    - + +

    ◆ setAllOff()

    +
    @@ -646,11 +650,13 @@ Protected Attributes -

    Definition at line 153 of file XBOXRECV.h.

    +

    Definition at line 153 of file XBOXRECV.h.

    - + +

    ◆ setRumbleOff()

    +
    @@ -678,11 +684,13 @@ Protected Attributes -

    Definition at line 162 of file XBOXRECV.h.

    +

    Definition at line 162 of file XBOXRECV.h.

    - + +

    ◆ setRumbleOn()

    +
    @@ -720,11 +728,13 @@ Protected Attributes -

    Definition at line 557 of file XBOXRECV.cpp.

    +

    Definition at line 557 of file XBOXRECV.cpp.

    - + +

    ◆ setLedRaw()

    +
    @@ -755,11 +765,13 @@ Protected Attributes -

    Definition at line 507 of file XBOXRECV.cpp.

    +

    Definition at line 507 of file XBOXRECV.cpp.

    - + +

    ◆ setLedOff()

    +
    @@ -787,11 +799,13 @@ Protected Attributes -

    Definition at line 185 of file XBOXRECV.h.

    +

    Definition at line 185 of file XBOXRECV.h.

    - + +

    ◆ setLedOn()

    +
    @@ -822,11 +836,13 @@ Protected Attributes -

    Definition at line 516 of file XBOXRECV.cpp.

    +

    Definition at line 516 of file XBOXRECV.cpp.

    - + +

    ◆ setLedBlink()

    +
    @@ -857,11 +873,13 @@ Protected Attributes -

    Definition at line 523 of file XBOXRECV.cpp.

    +

    Definition at line 523 of file XBOXRECV.cpp.

    - + +

    ◆ setLedMode()

    +
    @@ -892,11 +910,13 @@ Protected Attributes -

    Definition at line 527 of file XBOXRECV.cpp.

    +

    Definition at line 527 of file XBOXRECV.cpp.

    - + +

    ◆ getBatteryLevel()

    +
    @@ -917,11 +937,13 @@ Protected Attributes
    Returns
    Returns the battery level as an integer in the range of 0-3.
    -

    Definition at line 467 of file XBOXRECV.cpp.

    +

    Definition at line 467 of file XBOXRECV.cpp.

    - + +

    ◆ buttonChanged()

    +
    @@ -942,11 +964,13 @@ Protected Attributes
    Returns
    True if a button has changed.
    -

    Definition at line 442 of file XBOXRECV.cpp.

    +

    Definition at line 442 of file XBOXRECV.cpp.

    - + +

    ◆ attachOnInit()

    +
    @@ -974,12 +998,14 @@ Protected Attributes -

    Definition at line 223 of file XBOXRECV.h.

    +

    Definition at line 223 of file XBOXRECV.h.

    Member Data Documentation

    - + +

    ◆ XboxReceiverConnected

    +
    @@ -990,11 +1016,13 @@ Protected Attributes

    True if a wireless receiver is connected.

    -

    Definition at line 225 of file XBOXRECV.h.

    +

    Definition at line 225 of file XBOXRECV.h.

    - + +

    ◆ Xbox360Connected

    +
    @@ -1005,11 +1033,13 @@ Protected Attributes

    Variable used to indicate if the XBOX 360 controller is successfully connected.

    -

    Definition at line 231 of file XBOXRECV.h.

    +

    Definition at line 231 of file XBOXRECV.h.

    - + +

    ◆ pUsb

    +
    @@ -1028,11 +1058,13 @@ Protected Attributes

    Pointer to USB class instance.

    -

    Definition at line 235 of file XBOXRECV.h.

    +

    Definition at line 235 of file XBOXRECV.h.

    - + +

    ◆ bAddress

    +
    @@ -1051,11 +1083,13 @@ Protected Attributes

    Device address.

    -

    Definition at line 237 of file XBOXRECV.h.

    +

    Definition at line 237 of file XBOXRECV.h.

    - + +

    ◆ epInfo

    +
    @@ -1074,7 +1108,7 @@ Protected Attributes

    Endpoint info structure.

    -

    Definition at line 239 of file XBOXRECV.h.

    +

    Definition at line 239 of file XBOXRECV.h.

    @@ -1087,7 +1121,7 @@ Protected Attributes 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 bb538112..d5c8e537 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 @@ -2d7f0ed5a487b4ea4ec343e72841b2c4 \ No newline at end of file +0ca59a14f198ee4c34dfdb2ce5f86159 \ 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 6a85778105c512cd2d2f219c11c1f764ab46fad8..94f92c1fa34315d95dd7107746f6e67f88d53575 100644 GIT binary patch literal 13031 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 I5re@00n*wUzW@LL literal 12495 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 Bx9hCyl=N{|vs5e9}KM><48NfD7oT5{-8QbJ+~ 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

    - + - - + + + + - + - - + + + +

    Detailed Description

    This class implements support for a Xbox wired controller via USB.

    -

    Definition at line 53 of file XBOXUSB.h.

    +

    Definition at line 53 of file XBOXUSB.h.

    Constructor & Destructor Documentation

    - + +

    ◆ XBOXUSB()

    +
    @@ -206,12 +186,14 @@ Protected Attributes -

    Definition at line 23 of file XBOXUSB.cpp.

    +

    Definition at line 23 of file XBOXUSB.cpp.

    Member Function Documentation

    - + +

    ◆ Init()

    +
    @@ -260,11 +242,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 39 of file XBOXUSB.cpp.

    +

    Definition at line 39 of file XBOXUSB.cpp.

    - + +

    ◆ Release()

    +
    @@ -288,11 +272,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 224 of file XBOXUSB.cpp.

    +

    Definition at line 224 of file XBOXUSB.cpp.

    - + +

    ◆ Poll()

    +
    @@ -316,11 +302,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 232 of file XBOXUSB.cpp.

    +

    Definition at line 232 of file XBOXUSB.cpp.

    - + +

    ◆ GetAddress()

    +
    @@ -344,11 +332,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 85 of file XBOXUSB.h.

    +

    Definition at line 85 of file XBOXUSB.h.

    - + +

    ◆ isReady()

    +
    @@ -370,11 +360,13 @@ Protected Attributes

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.
    -

    Definition at line 93 of file XBOXUSB.h.

    +

    Definition at line 93 of file XBOXUSB.h.

    - + +

    ◆ VIDPIDOK()

    +
    @@ -416,11 +408,13 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 103 of file XBOXUSB.h.

    +

    Definition at line 103 of file XBOXUSB.h.

    - + +

    ◆ getButtonPress()

    +
    @@ -443,11 +437,13 @@ Protected Attributes
    Returns
    getButtonClick(ButtonEnum b) will return a bool, while getButtonPress(ButtonEnum b) will return a byte if reading L2 or R2.
    -

    Definition at line 283 of file XBOXUSB.cpp.

    +

    Definition at line 283 of file XBOXUSB.cpp.

    - + +

    ◆ getButtonClick()

    +
    @@ -470,11 +466,13 @@ Protected Attributes
    Returns
    getButtonClick(ButtonEnum b) will return a bool, while getButtonPress(ButtonEnum b) will return a byte if reading L2 or R2.
    -

    Definition at line 291 of file XBOXUSB.cpp.

    +

    Definition at line 291 of file XBOXUSB.cpp.

    - + +

    ◆ getAnalogHat()

    +
    @@ -495,11 +493,13 @@ Protected Attributes
    Returns
    Returns a signed 16-bit integer.
    -

    Definition at line 311 of file XBOXUSB.cpp.

    +

    Definition at line 311 of file XBOXUSB.cpp.

    - + +

    ◆ setAllOff()

    +
    @@ -521,11 +521,13 @@ Protected Attributes

    Turn rumble off and all the LEDs on the controller.

    -

    Definition at line 132 of file XBOXUSB.h.

    +

    Definition at line 132 of file XBOXUSB.h.

    - + +

    ◆ setRumbleOff()

    +
    @@ -547,11 +549,13 @@ Protected Attributes

    Turn rumble off the controller.

    -

    Definition at line 138 of file XBOXUSB.h.

    +

    Definition at line 138 of file XBOXUSB.h.

    - + +

    ◆ setRumbleOn()

    +
    @@ -582,11 +586,13 @@ Protected Attributes -

    Definition at line 344 of file XBOXUSB.cpp.

    +

    Definition at line 344 of file XBOXUSB.cpp.

    - + +

    ◆ setLedRaw()

    +
    @@ -606,11 +612,13 @@ Protected Attributes -

    Definition at line 321 of file XBOXUSB.cpp.

    +

    Definition at line 321 of file XBOXUSB.cpp.

    - + +

    ◆ setLedOff()

    +
    @@ -632,11 +640,13 @@ Protected Attributes

    Turn all LEDs off the controller.

    -

    Definition at line 156 of file XBOXUSB.h.

    +

    Definition at line 156 of file XBOXUSB.h.

    - + +

    ◆ setLedOn()

    +
    @@ -656,11 +666,13 @@ Protected Attributes -

    Definition at line 329 of file XBOXUSB.cpp.

    +

    Definition at line 329 of file XBOXUSB.cpp.

    - + +

    ◆ setLedBlink()

    +
    @@ -680,11 +692,13 @@ Protected Attributes -

    Definition at line 336 of file XBOXUSB.cpp.

    +

    Definition at line 336 of file XBOXUSB.cpp.

    - + +

    ◆ setLedMode()

    +
    @@ -704,11 +718,13 @@ Protected Attributes -

    Definition at line 340 of file XBOXUSB.cpp.

    +

    Definition at line 340 of file XBOXUSB.cpp.

    - + +

    ◆ attachOnInit()

    +
    @@ -736,12 +752,14 @@ Protected Attributes -

    Definition at line 179 of file XBOXUSB.h.

    +

    Definition at line 179 of file XBOXUSB.h.

    Member Data Documentation

    - + +

    ◆ Xbox360Connected

    +
    @@ -752,11 +770,13 @@ Protected Attributes

    True if a Xbox 360 controller is connected.

    -

    Definition at line 181 of file XBOXUSB.h.

    +

    Definition at line 181 of file XBOXUSB.h.

    - + +

    ◆ pUsb

    +
    @@ -775,11 +795,13 @@ Protected Attributes

    Pointer to USB class instance.

    -

    Definition at line 189 of file XBOXUSB.h.

    +

    Definition at line 189 of file XBOXUSB.h.

    - + +

    ◆ bAddress

    +
    @@ -798,11 +820,13 @@ Protected Attributes

    Device address.

    -

    Definition at line 191 of file XBOXUSB.h.

    +

    Definition at line 191 of file XBOXUSB.h.

    - + +

    ◆ epInfo

    +
    @@ -821,7 +845,7 @@ Protected Attributes

    Endpoint info structure.

    -

    Definition at line 193 of file XBOXUSB.h.

    +

    Definition at line 193 of file XBOXUSB.h.

    @@ -834,7 +858,7 @@ Protected Attributes 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 d2631857..4024397e 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 @@ -654de9f0f1b78cafbc20482878c5abaf \ No newline at end of file +3faed061859104f3cc71c3486dd11752 \ 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 ce00116c8430d357e300c8bcf185abca02d4c392..60ad930eb9b8693f09b7ac4075677b9d86f5ecbc 100644 GIT binary patch literal 12826 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 bhi3S1lodXCh#vT{2ZXe^g4iDsqoDr-e=MCV literal 12280 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 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 816edbfb..5035c5d3 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 @@ -f856eb1a72c58d28a6481d6c3bc6012d \ No newline at end of file +901d7e9b19359e5d2c53012c155e3718 \ 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 dbcbe761e1cb7ac4506573c908c6ed0d17981995..4bfcea8b1be94ba4728b2241ace239eba82863a9 100644 GIT binary patch literal 4602 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�C-yV?Q>pEM_1A(0uMFjp#t&RHC`J&s_e65XM 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 diff --git a/class_x_r21_b1411-members.html b/class_x_r21_b1411-members.html index dd661c36..44ff1e6f 100644 --- a/class_x_r21_b1411-members.html +++ b/class_x_r21_b1411-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)ACMvirtual enhanced_features(void)XR21B1411inlinevirtual enhanced_status(void)ACMinlinevirtual - epDataInIndexACMprotectedstatic - epDataOutIndexACMprotectedstatic - epInfoACMprotected - epInterruptInIndexACMprotectedstatic + epDataInIndexACMstatic + epDataOutIndexACMstatic + epInfoACM + epInterruptInIndexACMstatic GetAddress()ACMinlinevirtual GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM GetLineCoding(LINE_CODING *dataptr)ACM @@ -145,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_x_r21_b1411.html b/class_x_r21_b1411.html index b4ad5eb7..92f550df 100644 --- a/class_x_r21_b1411.html +++ b/class_x_r21_b1411.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: XR21B1411 Class Reference @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    Collaboration graph
    - + @@ -194,6 +172,16 @@ Public Member Functions + + + + + + + + + + @@ -220,21 +208,14 @@ Additional Inherited Members - - - - - - - - -

    Additional Inherited Members

    - Public Attributes inherited from ACM
    EpInfo epInfo [ACM_MAX_ENDPOINTS]
     
    - Static Public Attributes inherited from ACM
    static const uint8_t epDataInIndex = 1
     
    static const uint8_t epDataOutIndex = 2
     
    static const uint8_t epInterruptInIndex = 3
     
    - Protected Member Functions inherited from ACM
    void PrintEndpointDescriptor (const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
     
     
    tty_features _enhanced_status
     
    EpInfo epInfo [ACM_MAX_ENDPOINTS]
     
    - Static Protected Attributes inherited from ACM
    static const uint8_t epDataInIndex = 1
     
    static const uint8_t epDataOutIndex = 2
     
    static const uint8_t epInterruptInIndex = 3
     

    Detailed Description

    -

    Definition at line 103 of file cdc_XR21B1411.h.

    +

    Definition at line 103 of file cdc_XR21B1411.h.

    Constructor & Destructor Documentation

    - + +

    ◆ XR21B1411()

    +
    @@ -258,12 +239,14 @@ Additional Inherited Members
    -

    Definition at line 19 of file cdc_XR21B1411.cpp.

    +

    Definition at line 19 of file cdc_XR21B1411.cpp.

    Member Function Documentation

    - + +

    ◆ VIDPIDOK()

    +
    @@ -305,11 +288,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 115 of file cdc_XR21B1411.h.

    +

    Definition at line 115 of file cdc_XR21B1411.h.

    - + +

    ◆ Init()

    +
    @@ -349,11 +334,13 @@ Additional Inherited Members

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 25 of file cdc_XR21B1411.cpp.

    +

    Definition at line 25 of file cdc_XR21B1411.cpp.

    - + +

    ◆ enhanced_features()

    +
    @@ -377,11 +364,13 @@ Additional Inherited Members

    Reimplemented from ACM.

    -

    Definition at line 121 of file cdc_XR21B1411.h.

    +

    Definition at line 121 of file cdc_XR21B1411.h.

    - + +

    ◆ read_register()

    +
    @@ -413,11 +402,13 @@ Additional Inherited Members
    -

    Definition at line 132 of file cdc_XR21B1411.h.

    +

    Definition at line 132 of file cdc_XR21B1411.h.

    - + +

    ◆ write_register()

    +
    @@ -449,11 +440,13 @@ Additional Inherited Members
    -

    Definition at line 136 of file cdc_XR21B1411.h.

    +

    Definition at line 136 of file cdc_XR21B1411.h.

    - + +

    ◆ autoflowRTS()

    +
    @@ -477,11 +470,13 @@ Additional Inherited Members

    Reimplemented from ACM.

    -

    Definition at line 145 of file cdc_XR21B1411.h.

    +

    Definition at line 145 of file cdc_XR21B1411.h.

    - + +

    ◆ autoflowDSR()

    +
    @@ -505,11 +500,13 @@ Additional Inherited Members

    Reimplemented from ACM.

    -

    Definition at line 176 of file cdc_XR21B1411.h.

    +

    Definition at line 176 of file cdc_XR21B1411.h.

    - + +

    ◆ autoflowXON()

    +
    @@ -533,11 +530,13 @@ Additional Inherited Members

    Reimplemented from ACM.

    -

    Definition at line 211 of file cdc_XR21B1411.h.

    +

    Definition at line 211 of file cdc_XR21B1411.h.

    - + +

    ◆ half_duplex()

    +
    @@ -561,7 +560,7 @@ Additional Inherited Members

    Reimplemented from ACM.

    -

    Definition at line 243 of file cdc_XR21B1411.h.

    +

    Definition at line 243 of file cdc_XR21B1411.h.

    @@ -574,7 +573,7 @@ Additional Inherited Members diff --git a/class_x_r21_b1411__coll__graph.map b/class_x_r21_b1411__coll__graph.map index 130845a5..061eda89 100644 --- a/class_x_r21_b1411__coll__graph.map +++ b/class_x_r21_b1411__coll__graph.map @@ -1,5 +1,5 @@ - + diff --git a/class_x_r21_b1411__coll__graph.md5 b/class_x_r21_b1411__coll__graph.md5 index f6a09260..3553a473 100644 --- a/class_x_r21_b1411__coll__graph.md5 +++ b/class_x_r21_b1411__coll__graph.md5 @@ -1 +1 @@ -2dbccd1b011c53b5f85709ffafe012c5 \ No newline at end of file +74eb1928e681995aa3f1df1987bc06dc \ 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 31c6a205fe2002806b629d55a4452880320b7f21..faadda5abc3266b1ec86fd2ff6e91c4cb5466bca 100644 GIT binary patch literal 27115 zcmeFZWmg?dw*`u`@r}EM;O+#sV8J0+aCdiiNbumn9fCW-CAbE6cXyZDd7t;3^V~mh zKix5Uz#g0K>Z(=CYfio@%1fdk5+FiAK%huVi7P`uKy^bvK!QPVz&Fjv82Z33NGD}U zQHY8$q5}vBVF+n)5mk4{;|zFr)sJ)i3Q|xoptif!d^)nWd11wGSk?L>y_Y{Lb*k?I zU+T#a18IuM0y&W0fhHq@SH0|V-skW6UXgaRoZ2=}E!_!?#~+`zITbydo{prlo0%FS z?*vD~NcsQYl^fA{6p~BdF~W!t3-N!~vzUJ%ixt%WeGx0Hijhr5l-N5a8~?BS6v3v% zWRMvDdxgtDIVh!Cng00C8_28?j7>}i<+xX{8V=Bkf@27|5Vp6s2c}C@cFs3?y5wbk_xU~FJB;#BP*50N4MfI4fD|c4JcXg&0~a_6 zCe!nf_SfzYt8TWFoXq_YBwU#o5&=x zjZUjpmeTtAc;xZ@u?wDbV71L_C)F%74iTG9<8 zH^^eKu4L!&_2p>?*xC4vp0H05IE>dW!7WDps1|b-83}Zshc@RPhk-3KetmvmvtJiJ z8V<}LoGsI&=#9Wl=CWDbzg}`z6!Lw0ace7Pved3pIH>P&ahwSG4%_zf)4 zoxB)9ItvSnq%XKS&T(bBZCarygj5R)3rR=dB=vGF$|f}UjTZR~-pfvCG^v}znVrX@ z%EtTpSI0RWH-y)+6QUoz zr1nB+Anf1ZI>ErKS@ZkxJC5~P%b8#*t5GOUSqw2>AzHmKkv+Y7MS`Hu<3JSms`*v= z4I1bbTv+}l5lv)q60#=k4}%4X*j)zq&-N>cKor8O6v|c)()*$ja187c_@)bZsUhV~ zOy8cZ>9xN;S`i8XvWa(F^8r@9gPqFfRxwMk#a+=O;^p;p(m0H*uASqTOsgVs4$qD- zC8E)Hbz6wc66U|A+vaIeiGYAGS!<^7uoWY8ZI_}!CWj_?pN)?t1We;n+MlcY0j9tI zAMNgr5WYKIsbA>4+!-$LdAfBxoTlySLI>+-d7XYp8xeLwPScv-MJ47{eY`y>wQ;3a zD>J`vyIXM^RuFp0m%}Bi+iW~w>UehSA|1ip9Z98_;NL1XGUHw&F6UIl@&|dBuky z&JJlAocHTG)$Oktg};MxaBzS!nBa)t^-~~9NqlREEJHM6qzT2a0{Qyp(P!%p;ay7JcLpI*Dz9F4cD{P@@2Uod0q@}aT8b9UF0d? z7H=ta#qaH95v@B^hc(zNMeTU8{!^OTvh$SOyUS9&->-QaM8zAD3BL|W~pDpcq&UHwuvP}}?;NIuo|r_bs-1tIE0 z(E&%d5touI-@~giAo^W#L6GXQAold&Drz7Sx5Es8gNIE2zY`}_x)$nqha19 zbRJEEB+UoezWn1Ox~L&GxYJ?Q*D;L{rO2vanyke2J=nSa9aO;N!XiB4h=GIuulU0N zIGTW+(fNOeFVSEie1T~}R6+j=U%;R=AowJ1BZ~h-;BZkWv+=^gi>OMv?jT=li{rQ)hKM}B|zZ-jBr4sHCspY`8) zwUXH%&wu!JzljUGr_QMJ7&%=r3QgDADOve`T>+|cN@70C9iQu;kUx!?^5M$vYgANR zQgSRaA*!PJo9GScDVQTYJXX%Q@=*q&>odAlZy&nN;y@t;~_3p*X+*Z5~FM z0nv0(0z23AjL-MaN`f)wn=WG6LU>ZC-FP&NdcUoBR9peslkhsA%c%TLegBc?doV0a zp@JU$#f3-XQJ4peTTFN$Vkbi=EU@7QO0u%={~4?aJ%!7r9!Q+_q`5{Y$lmX5KU=ZI z^%6P_NFYm={^1@7S8e%4W*@G) zkANW{$$-T|#NxyLGrw!_{ndE6x#JwovvMOzrRaL0w&veX=?q?WYOibmGXuH zg{JrqGQT_d2X(>!9FeVu; zL>~3Oa#Ij0Am^@)F^#|R;D0V)%s~5CB>zAE&T3)8fXCPE&C33n(my{%r~oMpz;^Ec zza9tjWPAH2cD4U5_^%-ckYNIu@-~$I^}iqQ`fKYv%lP#Fqg=prg=7D!ha)75=f59c z2Lq22oksqnt^Z7vY~Zh{|AN31`1j-XfD1=Ob?cM)w>*sh%0n9>GV}iyDMiNf_wg`3 zBg%ivgAI_!|1Zw}RU6^|&%~MLZ?IP=n`&6halt%N>FIjDF4FS-c67X~jG<#L*|7HqUhg-~D=+@R!NK-`O|k?a z|9cX6nLQDs@y-JB6KIU~U)PIPl^==6^^+`sw22sd*~)=V2{i*FoLG0ScYx~rZq09) z(5`jkPPYB=uynG@K&+#`2PB%@`L}eK`;ASnCQBuovOdRy=dKU3UTfFM^tsjSki4BY ziji({J$WXH5qhW5;oFw2bJN(e70s7#HlFz!O|`#aW@vORd8XHy{>Mn=)Y|Q7BB}%5pwp3e_N;rV2oqK!Rr6(8-NeF z{(vW-p)od%`?obQLl#BsTzb0r?)2j7CD2ziiSoLgT5nlA-(Lj6((eup%cXG*dY!dV z^SPZS?2e{=s?=?}cKR5BGc)eFD9X@p4#OCS!9XLZ5YPPS3CWNUub>Am8im^m0824X25Otou13d2vj-Dh2uMZxwGGZ(F~U zGF_qb#rD?@PTJA4l0DSvVF33@47Ux$A&INC$JHn|qm53NQ+x+F_H5GFj zuy+M^YwgYDV|w9n4+%vlKyJ9Vz2df(xHFu5^osbRd$!tEU^(-XU<9aLO*Vgj#gSrV zWqo`(ovX}xty>25FxQ%mCjrIaiosAd4f;tLeR6y}MU3EM@v_snz+{tyk-F|p8!Qse zz~2=0>0^B5QrLc1VT>nGYvo0UD{yoh^+zWHmd1bnx5(*ueJpKnH|T-0m@16QFDyJn zZM9u#c6@ue8|IwTrYJtPcenVPly}j|JZA{{Xm!AV9p&!&N&N%j_U-0>-mL^^14U7d$Cc@?{oDv^7@w(* z#;kn~J@*aRQOsj9YopR+DVNM?W_1tA9{245^djB9NPG$b&uehP6Cj@Qknulxl1CDY zxY}1Lx_H8BWg1GMXrxT;Zn8zU{WIN@1GHZB7cW`XEr3_a?*F`e>Wp_qF!2Hu^Qavq zYdzd1eF9e>n{TCy({j4%S2U@mnQ1^@zV$*4*Bww&3a*6b zbg^%RRIQeO;r7^$leCr?0Jj6JqMtq7FIw=Sq3h2NS6qv_^(C#RWfdK-o+mScqfO!E zdWb*C8|5XNyw%|Y_5-l%nr~4VVn~IUKL1p$US4dp%Oa5y0X6@p^2`Yk7U(I13pSd{ zss5Nzte6w%F}RC)Ar@YrsWf2cA@F?O<2m8BWYakK4V%7>!bGs z&r-|vwX@G)x{U}m79k=1uASAJJIP)7)i#5++ZpC**w#oe_f2Q~ZGRdU1S0f^yTL9J z@%Oxw7VR0Uqnf(6)8ZGF7a~4a+4D?|xvvI2p$D4u`GaLWyY1EHc0{Ak89WZ%g{LVS zd{(5RPxt&@w`KA{H}z7Fs3P`TeNi=jZ@x%*d}pmHXbt4Yh7xF~Ubqa?FO|r5ggh; z%t3nn)UJ<$(8&|c)d%&HwmiXJK_63|Q^Aub`hkx?A4$2@{enMcw~=uKGj;~{ZZaov zFVH(gKU68>h6cVj(sW(Bq6bg3iLrpk9%l zY1;P*Dga)zyngmB0G?!``!-X+%b6N=!k*o9WFiVT*o8mnfN{zPsDU3Tf8TiC91a3I zeZvU4nSc@VGGv|?Wk(oABjTm8UPaBxu~}*el&dG_=@CKl=l21MOpVGUK2}{=l!_>W2>-x ze>UntSayKOyH(a{q-hFgGJA7#7I$$Sk#;bb#P#h)cV+Dz!kysbKE=zcNH|oQy>sR) zw4_I^ogcpq^hlMWE{k6mDU2d=h1_15u2_yg*PmvA-u06{LObULUovgbiy}|<2n+U0WPeJkIjerO*7G z7%p{xx@&n+q?1z)uDmjB?T>m+jPM%9AS$$X-NHW7ABmi(KL3dYlJ>$}Qpq(9DpePNZ{6{XiB1 z3sqT;AB}6iEjYp~h+Wrd^%B^`7wqHwd2eLDMS{LbOl7!Yijoqb$#RRth79(020+77 zSf$v={@{>~ks&XGC@cB+(J075*qIC*tu$aSMPHF45?1vU6@ubwrNwQSx#RgAg=F+J zHnM{VIB*n~gQ03E1Ol0Sc~!)mYm^^MLLdfOlR}diF~>s}B-#`wh(qPTNvR2rMIr$g zDjmE%Unyjm<>Om~>2bURC;Um>e+?Wd8ZwaRZH?jO+)h%HsN0R0OUV z@ZviB)c5^Zx$?jR(kyf54O~>@rP;$;JMnr3iM>H8XX+RE=ycq20@ zQD4aG`-kvnqqxopzGIkHD$5dH={=Ts&*%J@tnK)9cdAH%v^+uMmt%qLrx8u!ZBi49 zTdx#>;9X)WI(MpN;zu6y_LDb7bw#^BjUp5v4~QR5=d4RKPpwAlVYetJC?hK@JVCke z&~P-_EQDc#q<{78b|bXMZUC#}yFAg5WJ!!+1uTow_$MJjVf zaxw@G9Cwj4|Ij5Eqg`14^DueHJaLGsOjMQ^O~3A4MAWGcFd~>L`yG+FD(jGNQOsE} z9$0&QB2L(z6IRtn=|zkJtqZ&RJ&^>JI~+5?2*3VaL?|LQ%H8>9S08?!pDgE(?r*;H zT|%H@uxSoLXpjV&7Qgem!XBjPI8y6UR(;{3ouM4)5XG=>(5@5`kyWxeEuKsmr#Z;1 zC=WoPVP#q+_creLYBWfIlhpML$BZK}S+x*qAAae`JrF1~jTs!~uAhb4qCHYks+?LlJhz%MQYSooLWMN4)|~eJGtX z$JG}#XfV=vAIxjG68*taNHLjJ#XqD4>bdnBC_R|C?c@jDpx;3Gl(2`n;?)iom+l`C-9%*8EsS-e%^l$piA@AU zAcr+To_wu8h^O{&np z>P|rn4eeYtm<~kl61fWa7NJD&%7P(o5*FG3G}@C6bV12@2Pvqq5uwnBF2WAG*?$83 zCx3pXPvy4D#AzVM(&DR)4^<3KM%eQbBSe;i%dB@zx$PS^Jt2GU7O}EwH=n)xqeSKl z>eujz_SWPBNr0hgyxab#*D+(z_Z8j$b~{zn2YjHB^>9-ZhO)%qAUIq zB;7(BP!kiW6zbb+%?z?AEWsM)CS>4Tr3PFG7W=@U5?BHY*{c*(6IipPWEagGik?qL z5to6t_}z3cs?LRYZAM+`^kzC|IW_@Y_*z2KX4_L(g2zWZa9^Vft(4YS-Rn_tFVfC1 z+w+VhGkaz{l+i}+)|5!fmq-&jsDUDakifSN$uw2iyt5Wepl`bQQ#Y^d9KH)Ph|WBC zWW^;`;)vIxft1GSw^bVyspM|ANNt20=p-d?40Dkt1txW@xx5Pkb0@}a{PUB!pj8C| zt6$hw5%md1p=VBd*E^=?t__`F7D!C$k;5(neWR7L4FX>=sZMJn9=;SDL#pA_9uA&G zjVY0b5YO$Ag*hu^{uAO=Qgxe#hxP>_+_8>}G11IGh{$F*l}`iQtGsR}ZKZ;}I@-~X z;Ra&1# zC193aBl8B0o6Z+1M*gAY#p8&LR`WCZMwp09jNaWyIv9vs=Tul*fxOG9p0yrK3u_f- zac1uZ)EL{CTC@ph*2Jv--MI);IgzsPV_;Ah!BiXAwAv-HzDF1(h!O-||AvcaV%7{C zt{haFdMqIQDHKxA%1pqW^pA#G6iAs`A6Hsr6a4}h%e0YBz+_4#+omiiF)M@E$h zG@y>JJQ<&GYj=177QHk2AB*-UCK*B3mxn4Rf35O)52J5xu>mBn^Idtwy|=3S*ArBl ze3B>daD2tMvo82rlEDEY?28Ik@$cCAQ^d3LYDkb%YRS)`Pbhg=r%vZJpUgvX5wbGt zKBYYTw$88b$wo&4pPYo2zpV4Y;TF<9GbO_eJj0P)yXm>#a|@5?k%jfbsMqTrQQtbd4yMK5Pb@}QPk+) z`pL-AGjLX<0ApaT!Agk|g)JtqdS?J!2NE#zHSJel(LQh3Yp>6&yURg-0dR~At( zvF#jx3A}0Ma=lPy1LOo;-f7o00&&MfSi=}ru+EGX4T64i2q!cigJxr%sn&^5&O_e_ zL_@x)SI}cXGwPEq2n~c}MXq=!D@O=-%(B&Om=6gJrx6%DNN|XhV{1AI8u zJvj;=vm&~@MAADJj|1}uamRB>{rLm9Kx54reRkLAVE+peF&bA6yig(avCm#-6@R1s z5TqmdBEhts3Y-&`P(reXl|Md{lRXT(L>YF^djIDy`!xKO6|@FjeI?PjlR=}L3ckf3 z(Lya{QB25eis2R&q4IK$XBlGXAb%@bdWo3~C{7K9et$)oAtRJAue(=@DvKt(*ix|A zLZ+O+L(J@r!GN)TE)JdRbh2C=+l1Fk09zNM4k{AxiG9Wqv+zNgsrvFvgVKO1Y2m>* zmmr*7St2?ymv9j5tA-#OI(dmFb3Zfpd8@KVOm|wUR}t2nMq~~n+Ory^{!+I{?=!O4 z!o5H=tcQ~dYeq(fKX`2;8hRY{U?jG^}EcCZ|reO@p zDKvN1%zOP=q9Z2PalkT-RhYxe|H=J6m%|0_5Kr582q`^Qw_s=1AmvTbPH|5azJxhv zHLol&+mOblX)K5U=Eo`uXZ_E!QhfYTSQi2pIRpc^Aq@mZ-tzUr!YSk`|5{Ys4xKgy zOMiWullQG2I|+(~YnYWJmlL&Yq<> zPWdrI?5W6f3%MX+;%=or#xfv2;PRp`rwsyg+QE+}AAf^>v{}8Y#VQ$$=bmf#`>Cw% zr8!E}%eK8}=vbjY>i!~3P$V^D-?91>dYKaWj3JY|$7N4Q=gBejXM9uX!u=c`267VsOH^n#Y z`h`ML^(>j3qAfK7Y4ue^X9Ze29 zDpA2G&MeXCKWsS?)RxZ+yPU94D@6PybWX=v0GAU{RB=Shv0Pt zi%&pq_&82;iGU@jBY7ilN8_C41bIFC7U~tTgX47FPB5Ock^jV%!aB+?k>1mXBYhN^ z*YPC-8CAi;n?(OOaJ&mwzeAcd4a+67HeGFwsj(}Xu@1~J<(I2`cy*pxZ8=gYn+jvI zr^H;O2A^Rrk_^b-`qY;;Ob8M^tyRDnEMXg3?tccubGA~jLm#miXz8CO==-dYuCadn zYSACaGaufKGZGhsg8Q2OK~|~h3s$Z~t!GG8ElcaK=mYrQ@R-Q5toncnD)U zFQOhsrSHs8?+iBAN4k75{Kkk1bJA@XcaHJZ=X^fv7MoS1ADUaEGInAm)CYYHr}#%$ zk{7{?oNhOrY1f{Ua7{?#nr&)(xGf7skfyjAa~oq_`A~k*=`FW^ z{;+SjkLt7p^XDL!<1U373BF{QI<goebAuzh^k|9kMPmxP^C;w}#U9*@bM# z5BZSI4v$G)W>w=>vFPRI^UdW^5w7auW*XRo*;^hfBmtDARG}=y?y+|pH=SUA;UJkP z9awusC^e&Q-T5VXHkJ|-1_tKYfIzT6BQr1Zm2*vC@XkqXRhOihlq3`^IRqp!(&qz2 zc?c`vi8G@UOzSDRu#Z(0)=qMMf1ag9c)DdspWrrQnD{|et=)O)qO6JYC*&Ha^uG?I zva?}Wg1+_!JHt{#B+a*ljCnx`E^u}~nLoh%>$DCy=}ZQIXu0+kJZ zd_{s&qVMEnfjj-(U>s{vXt8j&R>ZF5{vKB-$pfd0!D{~3*9?ryuN3Q<>eM$Wfu}-Q zVW^a)Pqdaoi&*t~<_#g;es51_2Np>Y&lpKCHMLGNf|VZ*6=UzKWQ8zKhy(H~qov~m zb_&cbxQgp z#g|9_V8bf#p^Y+~jR3`hQMEW+tJCop7Ok?Rjj#>#^EMsKye_yrhCKpLEYsIhTv*Yg z=D|-G1EVW$otWwKAtEJ+Te;{dzch$ra$4{3?QMham8sYZmtoC8&IW{yu4*sn!%=VK zHtqZQTbq)y;Np$Gc!C}an}LshIQIp&yfroOr;olLxI}i*9`9g2+jWC*J9tho{8pPi zDYc~fYvyF)=3($#_B8ECV>I3@3B|JNRYD963k>53lo@j}RT;JPd}fmgdI_Wln`$mQ zGSCL1v6e7ZDR6$qN0tbr5wCvj(zTj(vll<9F&QpnzVO0BSNsAh-NHs2WbPnR?2f|l zv5A;7k^ia2$fO{+p#0P&{bgQsa8CZjqu8zH+@%S5{6m1nlk00|snOSFefnQ?Wb%DusEu|z;tf&cl z8(M#u!uoG1Yt0?BFwDylOn3nVp*!z%V_T_&vi$Ggow(!;4N;_9Ke5tf>Mk6& z9ZMBF*8>p-()!cISu?udJ3JCy%~jOP+~t3&zZJ#b9U6F|@&w>F+QwrNs?5|mk>hg| zd`&1*dcSTFUI4jI|}uS zcM-Lf)D$^(o!+aH)VhnA(>AKlmEk?OSg#{@B;%{PquW77Y`wX-wx*_@_+lv0 zt4_z_emjBoCb$z*L7Q=0@aTbznu$rx^UhX;d>*rje3SZWS*YQ4AG{}2-=B+u7`OdV zmCbehQ&Nc-*Ko!+QPqC&bfj+D`+Xt%NSFqegv+uoKO(e*U?xlfA+e!&K^5e@Bm-)1{Q zWFFs<6HjzAdR%2&XSq!75_dm2_ZBxRKh;de#mdE8#dkE$bYR0L?c|9Vs)_t>jQX)y^OilApr95bYqZ=V5 zyp`YgS?}_4n0;omSbK1+K?gijXYtwO%X8E5lABBt(@M!(65|qW7+O}2K9NEFMnCBs zO>L?)uX?ogfRT}ds^@1Dvsd%r9sZhH_Vy`WLOG?#NzlzpO|`1EE<+7FN%peH)6>&d z3+0Y^p~=s+NP;pu%?V}1XoK~UuKAG)4M6#QZh-GT+8JgS&4O8m0OWB7gaYg67nUI?V!@y`N)UYgo@3S zkZ;E3c?wXN)|#4-?+fEbccfk&Jk5TLG?}Dr8~^-f7S`Se~MMhv15)ZnM)nxw8<@1#go!7cwU5}oh zPqMbJhf1SIXliebNz0{qy>n}Om7MrpLghpLO&2laLhyA=X zYD3R^a3bG~}RtPIU?tSmV;wy~Xo-z3spbLY?mIiWs7pXTvZD+RZD_hVN!WD(42@m5$`F>ed*C;Y3@=p!;HjA}H*dHrOeV&FGy{wd+lE$xQ^=g>5_9YR5)0 z1*id32JX;wN$GX&ut5*+(D{Z=zH-6$jpPN8{KbP<>ZQ(Fl)RJsjMq)RTI0U%$PQL? zJYkr6!N7A|3+0u!Jc$bEN%D~vMZ0&m_k>yU*^X$l<}gppBbd#Y=t#aQzVAjz=Y93Z z*M&*?&47FIpis7_waYC8&8J?aL8Wh{NsX#WS7B_%Psb`ro?jQT+&Pb?{0xm~KQBG` zE~5>i7Ln0{!c;6C=*uH;?UI>v2p-?Ns~2Kvc!vr7P`-z$ABWQHc+Ez}zx5~k&Aj*LnTlF3_A6#G=y)VPUZueAEuww_#(MZ5P+@(#f#cz#k1-lE7v_66B_aSV z4R)Ny`Vg9MN5_%r*IuPiGpUW#eSuKzc$AxDX%^gSApVG*vOUtOW3$vqIkUk;soqu! zr@!(6V%ScgGs&VFJ0^ELSTC;ys3n4v??UaHvAxahWiQ-C| zZ@vj95ngdpKs)%8S3PCs-tz{t%$OT+qMyk1b@D0x@l`<N37Ys^MHZG< zB2m|D&xN@mz%`+GCMR;;sU>bE+Mr2m-t8!9mIoV850tKM`1d4bt9Q_Vyh0)}kpQHb zLjd|CBSeCnsA#Kd*?#ImPj|>t-NNtgkS_%WJwsYz{Py~UCZg!X^m{LA;0KWVSzs;O z8LLU-vr#>SU?+0Iq|?E1`KmUF~Y1~Sc80|b-z&HIL)o{~SF zZwG7zn3^tEnw47(Tc6!~)arfolD2>L23M&Q^Ow`2xv1E*o)HQYzVwR=w0~W=kk8lmD4)t0k&OPa-K)QL&@UGY3onL#M0-dg^c7=Os1s3hgc;{SAytqWg zVo!5T-LDu^mDTC$=X(J^9u4^&Zzh?dyLQ4aiYpElj0?R zekDxrYbeX88Wg3%XQm;sK;DaFyi+gN$#wSo)$m@9pQ=>oLs?9Pf+~O5nB^{2Fz8qL z?z*~)FHS<9x&ABje*s%z<4Yr?`a zUi=tG8?IXWQk-XJff$!XP~&uJp?Uu-cp%W+E=WAe8>wC3&|yzU?>X`=LE=7A3mg`J zqw@;N&lpMSn0eP&KBaJY=e+JF_rBd7%a;4QkoT+Sx4^270k-ANznZ6FM1=R6+4nuc zSy=GNI$$I-Bma)9eJi@c@oJR#J!@RX&m!cu8~F06MjtMjakL}pDEUlA|7)&jsoN}1 zj!(XL&6)(dU*viD35d1Uq?pF_cTu!1^AY-uuh6LTr3QIy#8!&^KASsV{R~9vb+`Y`MmFXc4@CbuI(g2y-**lCFfq_4wc)bS!1&DBr&R}{9oGq{45*m zn(J#;5u=bmf&3da!A*`793+c=4T*&v>Cm=g_W*NYGmXfWk1;vEK4M@}rk& zRDW4QA5Ux4{G0yBQH7$~B=0rt@uOV^eu7Hb>_0_M?)cnaAha5(3&qoEaI@d@o#Qoy zqoq1VhlQ}d&f>tkA?x-W{(Uxa$2bxMsQ*}5!CVc+~)L43Nm2=Q38cwfxhr|@y z|IV3%WWnlZllf&jeg$Wt_jE;Tx2wu$FHqswmMlt2gW;%@;pYY()}i zqb|{v+g84hs@ys-J+*YY9CP*o_nmqSD%W_TTX431=V)q9|9uW2;I`kr0ldSWhO&^= z8^nVdX<>A{#1?Go4kUsyDy?cVNwTp^c4rKYtBcY@NsOmU;dolVF?p)C(|LLC{gG3q zHPS%h-l1c;pe{bG@3h?j;U zSIBlgFq~}laA{*c4M$%wnaFOK%od^i;KTcQcSQO-bNjuD6-P4DN`YH3jVg@A2PnJ*bb@{=Si z*_7l7_RafEzT{^EQmLPdW(?~w00o?IaXnqu9F@Ro;14tECH1{Ga1oYuxzSax({6mL zv6^H0i;Ua>;6ZgA*i~z+KTl|jhX)7aBuPBPE$1p2cZOT$7=o5s&f4k!LOUavnv1jl zz#l(Yo_vz2C8U!|^+fQ+4b<~G;iOg053dk|9L`Qg7kItjvXrRENnp}h9HthVeA>jj z*`%`~|I48f250xp3nffV)))^ZBwEH^6s?03f$;M4B)obUKI07p&^F& zI@u9N@24b&xBzJQApoVA@rV#cn3|fZW&ZTAmo?K_m%Q{|&!HC^0~eRtuI(nN&U#_8 z{LTE@{-PK6sB5~)phuMJ32%Eem0c2GcBP$h2m&xh$Bk~-2LOD!9J&#u*BG#KbIx17 zbtSrijd4yGpjAIKh{CN+N9yAoU#9yKxY%;9>G7}wshlI4yGov;*YPGDPo*$?GZ&MD zCX`N1uYMX=Rz}oOK&=cVFBLvli0=2oshpw4tv!~dpdQ%Q|I^7=0m0m=Zk9*+QftDy zlVtXb+vabCu$XN2UhiL;-$36Lw{~h8u1lBaJe1{Z#G_~9 z`e4ei(u@xvY_b_OuSkH#1_ojQ>fW!&IZaP*2Z1Z^=yjOB=T_X)P081;u2iSb{TImY zOY9syfodxY0{0HTN$1GDdFdq+K3ZDRweC0opgQ>@dy;WiT%vl&rcfcTJsQ2S=S3l_ zmnEh2**lwd`dDY6n@BDyY{4Ei7@tgdxAqnVke`?dKL6x5o-Vx$W;Grt>VqeJHZ2yT zjvN^|220zRQyZ-`zw`;*d7DfZUlf}@92EKC?TrT>0TCyVv$Kolu_K>_%eio}_eL<$}LJ;Am|kp*W&_K)GE&&)c_Sa}Fy2-{ra z^j#8q>I4QpJ^-6m;%K%U#e_@$cYi-&W$Wd)_E!MvnCs#sNHj-7p z6JqNxHgsd>PIB>pVQVhTmB8t2X+sHYHCx7-P!h;w#<@~Htb_3TQB$2LVLkth1EEzI*v2XB|a$Xu+skz#O?`66p$#ELWOcq5#aZPS{yRbYA;1Kqi&Q;B|4%fW+m5 zHjrKdKxVmXAE!x|RSJ2MyejTX15z#kQtm#>rvw@U8k-7A?N&WYmeREifGtU=uH%we zV4IhIPPFL%o$?dG-KtlmQiHXo5wP+k_Y5D0S-95g$xqF4!Y%$>Fk_nS$1k?4t(tR; zoZtrWB>-!+1+a#vJ2HALF4FIYt?-ooQs#nbAk6}+C-F*g{W2{hY4BR;n}gsL2$|b? z#9YP{@KFf(Opowqsz{9w7<#w8bD4!CVtcZKSgY#M&5mH&h#;PkP}o(h;KEUZOQ z5e@{0M_c!VqG%O|tn-?V;C*TWn5N3mP2`Imli>u(ISf&RZKin+*LHV7FrYO67R>q=wkc)-jZ%;?BbuU_RKYWk)D7N@ zMFY{x)E2>u7G?*@3KvU!=<&H-FyqYxz=8W~P0^6iHCeMAFE?icKd$;J(azY~&1+}x zE1nZuJ0KuvQ~&-ifHMiBt?exdQ_EP3tEEQP{06LK#jo|Sw^nlrm-a}W}HD4 zAb1QG>%O2H{SHUyTdaRt7Q!MUM;v8Rq`3!iDx=;k-D%$rc4rDCmGFcwG z_$vVvuK;>QbJHK9%KgG{*iNB6eIeP_+iAvAEF*t+vZeI71vA)eEWMlCJ|s~V zn0MRgT1G11&~<}m>MU<%tAmlXRbSDRFV{nYTUQZtcu0ElN7eRs0IOv`02IuGEO=gI z%@zefjt}2AZLUj!eF2^UqjVO(M-7Q=DsCC9K~Mz4JWu#AQV2L!!dxy z;iA(m?A#Ry>)Bv1nJ@h)nCa3-+Im5fiVDpVjFN-L&WsnHau5QJ)v!l6YRXX7E&j3wZ;U=(uRJDa!B*z!#_NT|A0!#EE zZQ#EdRGn|Pv{Gv2ileukooBeYCN9**Z`Y3F$YcqgmBNy`Tz5C?w*B~O`FtgaXP{p7 zGBxx@{2eH%rJf{z{uYuA}-X$D;l9R1{lpXK2NSDYq}y~IlQVieobcM zBuZ1wxxCD6Db~Nk(I4>((AD_7BGqmhla{@&MjsU{U}uyTRX$qy+qmjgtvZOv4I<*0 z&~9iXD{S?>k>m%4d|Yi-=8PDa&>ZFGh3V3KO~jFxEUhcyirCTjLoiz<74mJRkt@~J z2(z+;AhU$Xd7*(+ahe3&7Y?J=06?6vd%Zrq+F!)dyzdqqlo^hrU#p<6XTI|0?7--& zFE_o~9ktoCo-Iq=X=Fz&#=ISCKTfE!KKuA4;Xx-dze{o$+JOVcp(kbjTlXawS;;&U z_F8Y=+@P_1{^6$t)F2{Xmg<+BM2WeH4?_SeWC^*+G;jm%1eD(8TR)R>Y zGI-oU*qlgtYa)~yR!`O@(K$UF0{Z9-)_r@UY1Ecf{jFtg5sFl#Noy7DO_tDQSy%7% zW?xS_zSLfE$RDvZX^j1V>xdUlL1zgubh-eD8RG-=mD)v(#zFea9YVNk3%C~6*5n6s zmG#fhS3Q=boAB3a07suwgxAGW$F3(S>DDgH_|5wLbF@+#1xLrPT8R};Xp4JEj++N41*H9QGRv(p2h5;|JEEVJbhgyH!UqK z{m2c&i;Ns=26_b3RP_?QCNSpT8g=-~TQnB{tR}7vk4uUhjiixZc3}xtDP%!KTsJZx ziF#XmrE(Eat?Rmao&?I#C&8y^qx_Z* z<>50?77XOV;wgQL*PIHvT9Qw`L^BRoh3ujKPkUz>RaN)zdtxIcNJ&X-1SA9`6bXT? zNFzvhmvna{CEc5pk`fe@mIei+Q@Rlp>2B^^_&oo6&mH5uJnxQU561xZT5GPEzd66( z`I&B82`3RfsgGnh=an_J6->ofj82Cq%I80rYP0zyY6LM0nsy`PQnb{E!d%JhvxE&% zs!h5{yB!G%g>=r>-s6?Q3LD+x9t=07h}3K4i#~aEXZ}g#uor2jyVjjQb?0D%GJz`0 zVvHlxObrL8y)S%wNahdg!Vx~>KxBf=4CQyr(q6^MedKcF;}vG>75>#*!6zB_##CaC z1Jx(C5A2crCyU_^_NDC~nY^#8wcv_k*3$og7aXiML5>46+PjsiqeRdyTsuyDySO)7 zC-CscdI|iwVF7lfx^$LKtE%y4daCLeC3_{ac&SxKAECvm#z-rzYxK%lWBIw!m9kZI zetubHRx}oTTLkRw^RP8|^>xtTew~bvWOEP@>7QMH#5AA{`0E=Bm{Ikdot!A+vN(gu!}>t9 zk)IzmZi2>BpMdxh+}Z$Y__LO58-(Py2yCi~_XD$r+e!o>Gmo|}7j*pE;6&)6dkqe^ zd8>H8X5DP%bm3GmB|6o(8Bj*cYih>X=8sBMbzjM)?F&BrgRVXu+_r)GXKsfhwHD|j ziwZ4KEOt<*N474Oxko~t4XKMH(T3{>HDJ!M$eGW;-?xNburDn%Fb^mZx9xLHMkWa z_OcB3+ahn?ObaYyF(25Qyd zl3*!M!uRNo{*z()^@SD!=hl+aE?IF2^T`&$;-$lzEih*c{Dt=|iL>lz;Y6Q?!?=Zp z!l_3QvQuP&OVOucLE-B2VXj2s3;49cC2cBbbsXsHIR0NEf-G0+!l)U`25$chT-_FC zRicP?iL@KNp>K`iGD`l$t!&Cm<4i2TK>k+McqGOa{IZM~JH42%GNk@Wcgdg9J@`gF z0&P&Vd9vMY;&aBSG4F7DjZ(pl0CX13%J(cgI~Kx1VcMpqQA1TFgB^TJe5)UI?wFq~ z(gFO9&cY$mVkotKXazICoX!@-{O~>C$Cwr-9&LV;3TEo+JGSwF z_xQS&uSZBNX)y63S@VN-*dB^rI=o$(>&eypl^1o!k;25^$&?>&fL`Jv*6B#AG&10( zG3BzdL*j?qiJ9N5K+1W+nNdI`dj(>LJ6Mqq*VXKEQkgjJGpdc`$WI7dyi1>UdD`_u zKBgVLOXjt(NuHhIuL>0liJL-7D0MEwHq-IvwR^8m12wSETUh*6^-Ci)uw3zZSPE?i zU|NFpYHn&=N~oUpf65Zp3oEAzn`To#CU1r0@}lq#bJ}zE3TprCo_)~6lQj|iJ*2_$ zc0q&Q!I?8oD}LcN5%%-@AXK+c<8>a{clI`)YkXT_L#-3A0|bcuPvf{`HY&Jctd{<6 z^Ub^#_G-VJYAy>)^HG*Tn@#*7o~Ef!7d@nZLVtpRKb(1T#A{Ds<^Yyz=~zg%bO&~L ztz0if--xPOd}Q-n^;=Ixmc;AGv!7de>9`k-Pydknq4O5UgZ3V~#g8@vPOvq0v}y<6 zR($*$)&f}nY+Yk47ey0hoR{N_x);gyu+6BQO*wV3QhE=WCD*xDB42)Ai?=MJOdfY! zOds%OKIkT+*XipCK4QO5K(1f#E0TA7%85$dL9XiD?%79jl`%`YA&|s-v{Pnp<8IT^ z#F17j$0b#(?ye|g9^>7{7vSk45Zyp!dnA|`cdCX=JSNg!S&n}ewTS>*f?ZE|ju_^t zfs(*?xL@ye^3yQyyY~C2lis+euO~afvQnOIgKrh#UKF$USvaD7g6hPe)3oRZhr$Nw z%PGCVWA^Fgncur(f6jg$pDLRRybGwPEq(u$EO&nO@%&9bO|Zc@>PMVeqf|2)EJuS= zPNrM&K2nXf{EdhhwNs7@#;f;7^ubB#9LF#pU&H9aAZ2KAU$N%-aq=hqqt}(0w6T$M z)M{Eew};PWlPuE-ys~`c{Ihw7`RaG;_0!6CU+hjQp7DF!plyKmH``9|tTN1df=GNx zQg|L6SIXzYIlhWsx6uo!NunZZ9$NRiA&ueQKsVejnS(XUg*$_%E-qT9#@A*#VFF z4O=2fp;ShZn=@>9rR+@9G#9Q%=zBiQzBZ?qfec%+@l{7^!>NNWHY8Xh$E(S47fXu7}x4s>Npo}EwF&UKFHNY zgCQ+1OdsPSpmk5D@@be_1oDee_p60!?cC1C7uytw8_SkpHQ4(_!U7mq+~nXx7)xNu z-q~=Bo8qxeEET_lYR35JvnfI&+%GSkl2bE}j%|Kln4=fDm>(yTB(p`ANX2Gel`EY_ z*-8p35ldtFyq!$CN8%$|rk}$j1$bEH(IP3(gGTg7Ehs&n(;2?IIA76Os%>O(1D`}*5+g!OP zPlbkrPn0MAC|G^En+o=~hjQqeM!{OsQCy7FtE`ZKp{3+~>A9QX-YmhlX;g3c&Bj{d ziS4Xukw$q*v$5f?0hhQK0?Mk`-`^*=owrSkW*RD-+<6~98e35R5Pg}EbA-;JQ(Wle zS)|Hm+G3t6Z&M5RBukHN@J&x#7BU|K3dPWQewf_F-VN+P0>Gf4QznB=AFY-Gf28iRxb^+>cpUkeAh(<7pWB#pOnS6pe2M>Kz~*7=Uz05<7`Z zR6NM5P_|LIyXaaMnlC`L;GPGkTEOU8k3~Euwlk9+%oe?f5g`)bKM4>>H+mC6dxd0R zDv-XqB(p4klmFs%UC_v)+L0w4=Giuw3Vg}Gk*(SCAiXng)M95LYNFts)dj4QQTHQm0Jz`NK4=rhY%A}bv}!=Gh@>?LOfKnyp^u(+pES`i;fQZzcp&@ z6gR#od@9r46GLaw$e^5iRfw+eRsyG0K^HaIn<&%*txuK(PVTxkf_P@47Dmj}*NxQU zP_6nZ!zd&qa|6#JH_CpK<6uoCv}?DUFO6R0<^i|;^U>E!Bd@9AC z<5EsgdHms7`J!UEBTLal-n#_rW^@jmE@XcQ9#l$7%CgKL@8+<9rXl*Ro$s%DThw#! zlH^r&X-!U16@73s&5O-{q}hNVuOJzi%jIk*>4flVLV{AOA($w(lAZ-ibzqnh5cm|k zGE)pn2!vSEaV_{mkR5^q3QT~7aU%knC+1W_>&sQ%tJ6RCtR=u$#9=;|6FfxV8t-$V zDPv`oy&bq=@ZPmgh#fa`j;TRn4Ef#~y&Cs5soy9*fp4@RYY`K7-i7Gs&z$V+;#hf+ z-1Rz{4tL4KSxLABG!9MXn6-mGvi=@Wu<-NS`B;AY31=Dgr5`AMGR&E_mr$!cS;3D> zRv-Cu?tY4p3l^aMAURLwpGVUhM;mOTDyWeVj~}gi^sp9V7ZcTOszmAYW_NA?``|tY zrK@rhQKIM)3JH%RpTgGsuA{@N6LCG5nk(H^D45YO}gIjt>f^QEX^+THANk?u^jmTQJ!GF^GFEwX#Agg)_s zDkc+bptsg61k#aFBmYWY4Xg3TLwplY-={(M(CDgM#z=fJoU1)2b9HFe;8 zF=<`KL>h;^7_QXMAB^w52-Kjj;G3+S*>aLJ8=5IYm@1OM3n`=lAObxngMudb3l>F1 zZsVbMCfqjDcljNbOZGQsK$l)^vr)Gcw<=OAfnO^8;G)Tb?ae59F2&5rp83gMp7)Tg z7d^`y17}t39?jH;Tg2whbwqymgMv}48Ws3cf@RlZ8S*U2Mwx!7Y{eAHJKA=%ApiLFT~Nn0z%M(Nf&SCjJ0q z{-D-j4?n1GS=cp15f`;OQ(?F3fZY-BoWRukGvGPS7+?4GF}~IuhiMsHR%t_$q_M>! z7H}?Yq)OSEap)x3NdV+ttlW?otuhswDmir(8mqIkPWsI|KLF5T>uw@zVh`Eyu;7sK59+Br)uW-Ii=Ub&IP~hb z3>IcwDzQEuWUL*(BGXj!&EHyYyvbj-TtcOrc$dJ7r|-%!PH$9(C@<`^*wNiwin)U@ zSfty}KmzJl74$H$06+8k9&%e)>6n`2r9#^r@sZ23Qr+8@3lP;=+eh+5@RfoR# zNy;5ibdq=dM0tQ;k)=CnL(x|dU`=@xOVkax9<^f#opAhrsxEW&%#WvviY{(JT#iaP zUz2(h##t$Jg~*uu0n;!6R}fcfNUg*8O3&=zhatO75yOFJ;z61eCTV$IW}i!K_w%x< zY+Mr8c2P9IxeTx)Cn1WzCXS{0i9Bit!Tqo)u?%uE<~62-j9gz(XqIlSx~O|`ziZs* z?w6@!L_>>7U8m#*dS>_?!n87q_wfJduf)8Uw=N#9PX@iNsGh{PZ2-gZlJE;C+fwId zfM``%Y^Z7h_C92DA2iCP%+u4p14Snfa1{J|W1@|wz$R!XbLUzwpQ-+#lgm@ZPqntL z>79H?`eI>$cY$-t{N+qK1&y*ZITmK&L>3}*iyrcGF9qG&IzlO^umc7C$IOFhH^n;l zp~}M!34hp^HZ=>1z0I1O!Fbzgwtb(H72Q0VC2AcSZP&&QdhSj`kPmG6w5VU3<=w% zCr7g6$~lDI4H2_us@5I|*y3{5$Ary~ETupe<&F6mcqC>L60BK1CnPjYgyn>TuM4K-K*TJfTpD#pr?J+mngv|BEzK$9k8ShyAcNTIett@#=+? z)Tik-v48Ak$O8eBtqx&kn8m*ZqOAie$TVl`M-TpM3qexmskg5hXZS+N8g zsGslRLIV*=0?6C|qUAm4X$Uk(8<(zi__+*mlmNY>yTW{!O*soM_}(#uetH&URhMDg zcp^^Yy{{0iHyu(%9#HyQE>rkJ&V~Gh$@i9OG8f5Al!=c9zG{69Ww)9aILEu6#KJ|NFS^+1?D@b6@5exSy>1_a* zEm%HjH}b()zo_8Nh2(1*wATyJuuI=?KYt+#=03-c{j{V=4Jo3cU}dFQceh!aECbgkoF3?%*=1NF|m;@bd< ze1?F^mGj1=3huZ&%?bvTI%Z(=YsG+dc7WJL5}u09rdzMRh4BPHm5a2hKmN2m-d^|& zxK2{i(s4lb>@HNuT?R~x(eO0@Yh~c!QPNj?Vl&OxAW|kIiq%v`=mP*YfGbLOSbdTP zCDH4dA5-@Uj2@j10{Q)7K(V&#e=D^2$_n^L42$%d8g(CrSod!>p4sr*F9t$tMF58V z_(e8=$WD5JEGBiIH#iDyd5zf(=)(sbMD9w?0D9d6Ft zcU~KbO}wur4dfc{w|T%-;ICu%hKSMW$>lV@HK1ksa-2k!93` zmkie&zinF7b(#f9^z|lk3T~(_@G&9o7_3^kh5Wy?vH&RDn{PGw0p9OFpLD2T(($&y zMgRFc=LC66s9n=T3H>gR)gOdk*4atK@4p*;fr>8>g{)gl>M2he^aAsE{wI5@xGpi< z$f+*}5k!HGqph`{FT(cAT}HtP+P*PFGNky~sSQ2CPaZphihrnJVFFY2i<5jM z(#}9i?yZS$c++)J>O+LWn~&)4LK#26^s>&y+B+vrL@6~k_QT-r2?j-dm*>5cY-p4Vc`~k@ zMM^9ucz^pIggLGFaBQTbLf%FE*^_HwYzUyqj!A^gYaukBZ%{?i;e=r;l$rqQ5OiuSJ50QT>@;TT#RyIe-g9beU zj!NK%4U?r?*HKmF=%ruJ-hK=cgMjFfSf=9FWW2!_^UeOlz+l<@-GDlHecD~N%36?e zCMMYv6o((Qo@2Kh5p&&&qfumO_0bl37G@(T9!A@>hm3)gL%{el-x_Y^zt6jm#u?t( z)%EF%;o0q@eA$If!YbwCa8P7(pqS6nINP9+)1R5C%=r)DMCG3vEgXrc^w>(vquK+B zTi4a=KAL?aPUylvmD7(N?d&ikuF+d-YFb))vQ!>fw;VUgJN7AZ@*COM=h}AK>x&+s zaar8zsF!iOxP7PXU)H7Ayg%kWDGQ5Wu%2hP3uTADKA~GiK4HtVem5x7|NR6&4&9eK zJPv=~;rf5@Rq*a?yAjC$`#ni`Ayip!i_rfUyeKJDj(7j}me<+&zj^sTUWr1v5^zRB_=g0a)#?}Q``roH)n{>($#}7ft$aGeD({YQL%(15846W$%(1R0Lnucx0Gn3%c` zH>UD{(`yKXGZ*GdPcPKVO(QETMx_mnj1Jh3AxD~3J>4eop#6C`KK)XpOi2`s%J0CD z1Bcc7Tfo&NrK+0r5Cjta-e)y0ZUKK_Vy;B=+QYQ5V<`}XdBX|`qZ+x*qCoGGlYr3H zP6r-MP4P%d#yZ!ns+SNyUiR%1jns$cIi=PUpT&TY^A>x}Gq-QFfxQr{6EGl++-(lm zC$8hZ1&`&c-^N40`?Lbzw=bQ4g|WLJx287@z(3#UV`4#5nP2x1k#wPXf(l~o)#llEp1vhKj&RGTqWg52PZPtC2+FFql*!QZ*?Ouhrle6^P0cVa>5=3CqjXx{X zu5MUQd#0odO&`t{%qj9w7NS>vNV zCr~sffFPbyfNfe?^c)=VVGIhEGyq^~KLa!<#lu%IjW;&9FX5cNz#L5KyFwNy0xUom z#QlpgVSo;cgOBO|nxX>$NpqWg!8Gf1_;fCcTF`j1!hBM>ZT4%6$~02fqX>Tm9GLRi zaaHaQ{N!)ufN-z%nOPDvv}FN=A|)DW_S169tt>7dKtnt*d1Ybn#Sgw}D=JerM701J9t^K1(5$y<`IzcDI%EMm z6G*JJaLX~+nA=*p*j|;p06<{5203Qh3?aREC-9rSw{~41!<`U5-xk$q^s1c(CaIxP zy{0FrCVx0TG>I01?SOS956pYHdLB(bcRkfw6Lj>hIImP_wY3+ zem!MHKr^R7aWFp+9=J!S4i91PrU5?di{H|rz`I@saaPgjNI007BrGH71`HLbTymKU z+eobs>%{qRh&8R&`3zD`*QcuGr^v4Mhvi8EsZp06fj*=FjOG6Zkp%9rGWJO@TilN# z+}YXj@SSV)KI;PgCi~J=X@j7+0(mGJN~%ymB%Cy$x{QGB$!oG56c?Ii+;LA@-1`so zS5aM#Fz=$;n_<&&#y^gvGc`T8O|?xvPwzj-_#v;*!5dhEOU2I0^BlWs__y-dwslwj zH{Ou%#=GXBV<+RJgZppZ32d(Gav&|rC+a_*I1!98PJTGSJG*G~p5#JBgTZixOm1!%{3D9z_eVWQnz%jN~WU2Mb;0+zY(L+=PJ?nNT_fJ+!~=z?mudw(!09% z1?MX#Pn2g;;Y-5X9E&Z&ktqJ_7*T6jW=+9paD*QUND&snue)%<&7AyO*FS*YA`U?! z*O4z#z~BCUNe9Nzsxz`r_wN;*x`?~!7eqM!+yIWq3io?n6P_ykpDQMC3+exU!~YZR zbG-SEB`%lXr;AN#xb-8L})M%;ux$WadS9G!_5a}Gd9Ij8@%UV=`-vFGE~FA z8NM6DO+&b&=@u%?riO+7O)4A#XP*zEG^bblCuK0K1m<~zS|T+S+5bFS3iXX$TqnkV qerCjx43yDU;UfI^jTta}P?*ZnBYsc3Q$hj%q{QT&e|)AN@P7d6|4b|Z literal 27070 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 Sw(nwqA9ZCNr78uR(EkC(XtNps diff --git a/class_x_r21_b1411__inherit__graph.md5 b/class_x_r21_b1411__inherit__graph.md5 index b61794d2..cf04dca4 100644 --- a/class_x_r21_b1411__inherit__graph.md5 +++ b/class_x_r21_b1411__inherit__graph.md5 @@ -1 +1 @@ -b90701a331346260b7eefd76bf910398 \ No newline at end of file +a23c31938e633c59322b2327db463c90 \ 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 f77673651a07d6e69b0db6caca59813637f5b3b9..4418a917fa1911c2cff530c51fb6a4cb852bab53 100644 GIT binary patch literal 10173 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 literal 10243 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 diff --git a/classes.html b/classes.html index 08f94aed..d563ba18 100644 --- a/classes.html +++ b/classes.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Index @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + +
    Class Index
    -
    A | B | C | E | F | H | I | K | L | M | P | R | S | T | U | W | X
    +
    a | b | c | e | f | h | i | k | l | m | p | r | s | t | u | w | x
    - - - - - - - - - - - + + + + + + + + + + + + - - - + + - - - - - - + + + + + - - - - - - + + + +
      A  
    -
    CommandBlockWrapper   KBDLEDS   PS4USB   USB_HID_DESCRIPTOR   
    CommandBlockWrapperBase   KeyboardReportParser   PSBuzz   USB_INTERFACE_DESCRIPTOR   
    ACM   CommandStatusWrapper   
      L  
    -
    PSBUZZButtons   UsbConfigXtracter   
    ACM_FUNC_DESCR   ConfigDescParser   PTPListParser   UsbDevice   
    AddressPool   
      E  
    -
    LINE_CODING   
      R  
    -
    UsbDeviceAddress   
    AddressPoolImpl   
      M  
    -
    USBDeviceConfig   
    ADK   EpInfo   ReportDescParser   USBH_MIDI   
      B  
    -
      F  
    -
    MainItemIOFeature   ReportDescParser2   USBHID   
    MAX3421e   ReportDescParserBase   USBHub   
    BASICCDB   FTDI   Max_LCD   RequestSenseResponce   USBReadParser   
    BluetoothService   FTDIAsyncOper   MODIFIERKEYS   
      S  
    -
      W  
    +
      a  
    +
    CommandBlockWrapper   KBDLEDS   PS4USB   USB_DEVICE_DESCRIPTOR   
    CommandBlockWrapperBase   KeyboardReportParser   PSBuzz   USB_ENDPOINT_DESCRIPTOR   
    ACM   CommandStatusWrapper   
      l  
    +
    PSBUZZButtons   USB_HID_DESCRIPTOR   
    ACM_FUNC_DESCR   ConfigDescParser   PTPListParser   USB_INTERFACE_DESCRIPTOR   
    AddressPool   
      e  
    +
    LINE_CODING   
      r  
    +
    UsbConfigXtracter   
    AddressPoolImpl   
      m  
    +
    UsbDevice   
    ADK   EpInfo   ReportDescParser   UsbDeviceAddress   
      b  
    +
      f  
    +
    MainItemIOFeature   ReportDescParser2   USBDeviceConfig   
    MAX3421e   ReportDescParserBase   USBH_MIDI   
    BASICCDB   FTDI   Max_LCD   RequestSenseResponce   USBHID   
    BluetoothService   FTDIAsyncOper   MODIFIERKEYS   
      s  
    +
    USBHub   
    BTD   
      h  
    +
    MOUSEINFO   USBReadParser   
    BTHID   MouseReportParser   SETUP_PKT   
      w  
    BTD   
      H  
    -
    MOUSEINFO   
    BTHID   MouseReportParser   SETUP_PKT   WII   
    BulkOnly   HexDumper   MultiByteValueParser   SinkParser   
      X  
    +
    BulkOnly   HexDumper   MultiByteValueParser   SinkParser   
    ByteSkipper   HID_CLASS_DESCRIPTOR_LEN_AND_TYPE   MultiValueBuffer   SPi   WII   
      c  
    +
    HIDBoot   
      p  
    +
    SPP   
      x  
    ByteSkipper   HID_CLASS_DESCRIPTOR_LEN_AND_TYPE   MultiValueBuffer   SPi   
      C  
    -
    HIDBoot   
      P  
    -
    SPP   XBOXOLD   
    HIDComposite   
      T  
    -
    XBOXONE   
    CALL_MGMNT_FUNC_DESCR   HidItemPrefix   PL2303   XBOXRECV   
    Capacity   HIDReportParser   PS3BT   TEL_RINGER_FUNC_DESCR   XBOXUSB   
    CDB10   HIDUniversal   PS3USB   
      U  
    +
    HIDComposite   
      t  
    +
    CALL_MGMNT_FUNC_DESCR   HidItemPrefix   PL2303   XBOXOLD   
    Capacity   HIDReportParser   PS3BT   TEL_RINGER_FUNC_DESCR   XBOXONE   
    CDB10   HIDUniversal   PS3USB   touchpadXY   XBOXRECV   
    CDB12   HubDescriptor   PS4BT   tty_features   XBOXUSB   
    CDB6   HubEvent   PS4Buttons   
      u  
    XR21B1411   
    CDB12   HubDescriptor   PS4BT   
      t  
    -
    CDB6   HubEvent   PS4Buttons   UniversalReportParser   
    CDB_LBA32_16   
      I  
    -
    PS4Data   USB   touchpadXY   
    CDB_LBA64_16   PS4Output   USB_CONFIGURATION_DESCRIPTOR   tty_features   
    CDCAsyncOper   InquiryResponse   PS4Parser   USB_DEVICE_DESCRIPTOR   
    CLASS_NOTIFICATION   
      K  
    -
    PS4Status   USB_ENDPOINT_DESCRIPTOR   
    CDB_LBA32_16   
      i  
    +
    PS4Data   
    CDB_LBA64_16   PS4Output   UniversalReportParser   
    CDCAsyncOper   InquiryResponse   PS4Parser   USB   
    CLASS_NOTIFICATION   
      k  
    +
    PS4Status   USB_CONFIGURATION_DESCRIPTOR   
    KBDINFO   
    -
    A | B | C | E | F | H | I | K | L | M | P | R | S | T | U | W | X
    +
    a | b | c | e | f | h | i | k | l | m | p | r | s | t | u | w | x
    diff --git a/confdescparser_8h.html b/confdescparser_8h.html index b09636a0..19405677 100644 --- a/confdescparser_8h.html +++ b/confdescparser_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: confdescparser.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Macro Definition Documentation

    - + +

    ◆ CP_MASK_COMPARE_CLASS

    +
    @@ -125,11 +107,13 @@ Macros
    -

    Definition at line 32 of file confdescparser.h.

    +

    Definition at line 39 of file confdescparser.h.

    - + +

    ◆ CP_MASK_COMPARE_SUBCLASS

    +
    @@ -139,11 +123,13 @@ Macros
    -

    Definition at line 33 of file confdescparser.h.

    +

    Definition at line 40 of file confdescparser.h.

    - + +

    ◆ CP_MASK_COMPARE_PROTOCOL

    +
    @@ -153,11 +139,13 @@ Macros
    -

    Definition at line 34 of file confdescparser.h.

    +

    Definition at line 41 of file confdescparser.h.

    - + +

    ◆ CP_MASK_COMPARE_ALL

    +
    @@ -167,7 +155,7 @@ Macros
    -

    Definition at line 35 of file confdescparser.h.

    +

    Definition at line 42 of file confdescparser.h.

    @@ -176,7 +164,7 @@ Macros diff --git a/confdescparser_8h_source.html b/confdescparser_8h_source.html index 8c707512..6edb2ee6 100644 --- a/confdescparser_8h_source.html +++ b/confdescparser_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: confdescparser.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    confdescparser.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(_usb_h_) || defined(__CONFDESCPARSER_H__)
    18 #error "Never include confdescparser.h directly; include Usb.h instead"
    19 #else
    20 
    21 #define __CONFDESCPARSER_H__
    22 
    24 public:
    25  //virtual void ConfigXtract(const USB_CONFIGURATION_DESCRIPTOR *conf) = 0;
    26  //virtual void InterfaceXtract(uint8_t conf, const USB_INTERFACE_DESCRIPTOR *iface) = 0;
    27 
    28  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) {
    29  };
    30 };
    31 
    32 #define CP_MASK_COMPARE_CLASS 1
    33 #define CP_MASK_COMPARE_SUBCLASS 2
    34 #define CP_MASK_COMPARE_PROTOCOL 4
    35 #define CP_MASK_COMPARE_ALL 7
    36 
    37 // Configuration Descriptor Parser Class Template
    38 
    39 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    41  UsbConfigXtracter *theXtractor;
    42  MultiValueBuffer theBuffer;
    43  MultiByteValueParser valParser;
    44  ByteSkipper theSkipper;
    45  uint8_t varBuffer[16 /*sizeof(USB_CONFIGURATION_DESCRIPTOR)*/];
    46 
    47  uint8_t stateParseDescr; // ParseDescriptor state
    48 
    49  uint8_t dscrLen; // Descriptor length
    50  uint8_t dscrType; // Descriptor type
    51 
    52  bool isGoodInterface; // Apropriate interface flag
    53  uint8_t confValue; // Configuration value
    54  uint8_t protoValue; // Protocol value
    55  uint8_t ifaceNumber; // Interface number
    56  uint8_t ifaceAltSet; // Interface alternate settings
    57 
    58  bool UseOr;
    59  bool ParseDescriptor(uint8_t **pp, uint16_t *pcntdn);
    60  void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc);
    61 
    62 public:
    63 
    64  void SetOR(void) {
    65  UseOr = true;
    66  }
    68  void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset);
    69 };
    70 
    71 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    73 theXtractor(xtractor),
    74 stateParseDescr(0),
    75 dscrLen(0),
    76 dscrType(0),
    77 UseOr(false) {
    78  theBuffer.pValue = varBuffer;
    79  valParser.Initialize(&theBuffer);
    80  theSkipper.Initialize(&theBuffer);
    81 };
    82 
    83 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    84 void ConfigDescParser<CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK>::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) {
    85  uint16_t cntdn = (uint16_t)len;
    86  uint8_t *p = (uint8_t*)pbuf;
    87 
    88  while(cntdn)
    89  if(!ParseDescriptor(&p, &cntdn))
    90  return;
    91 }
    92 
    93 /* Parser for the configuration descriptor. Takes values for class, subclass, protocol fields in interface descriptor and
    94  compare masks for them. When the match is found, calls EndpointXtract passing buffer containing endpoint descriptor */
    95 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    97  USB_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR*>(varBuffer);
    98  USB_INTERFACE_DESCRIPTOR* uid = reinterpret_cast<USB_INTERFACE_DESCRIPTOR*>(varBuffer);
    99  switch(stateParseDescr) {
    100  case 0:
    101  theBuffer.valueSize = 2;
    102  valParser.Initialize(&theBuffer);
    103  stateParseDescr = 1;
    104  case 1:
    105  if(!valParser.Parse(pp, pcntdn))
    106  return false;
    107  dscrLen = *((uint8_t*)theBuffer.pValue);
    108  dscrType = *((uint8_t*)theBuffer.pValue + 1);
    109  stateParseDescr = 2;
    110  case 2:
    111  // This is a sort of hack. Assuming that two bytes are all ready in the buffer
    112  // the pointer is positioned two bytes ahead in order for the rest of descriptor
    113  // to be read right after the size and the type fields.
    114  // This should be used carefully. varBuffer should be used directly to handle data
    115  // in the buffer.
    116  theBuffer.pValue = varBuffer + 2;
    117  stateParseDescr = 3;
    118  case 3:
    119  switch(dscrType) {
    121  isGoodInterface = false;
    123  theBuffer.valueSize = sizeof (USB_CONFIGURATION_DESCRIPTOR) - 2;
    124  break;
    126  theBuffer.valueSize = sizeof (USB_ENDPOINT_DESCRIPTOR) - 2;
    127  break;
    128  case HID_DESCRIPTOR_HID:
    129  theBuffer.valueSize = dscrLen - 2;
    130  break;
    131  }
    132  valParser.Initialize(&theBuffer);
    133  stateParseDescr = 4;
    134  case 4:
    135  switch(dscrType) {
    137  if(!valParser.Parse(pp, pcntdn))
    138  return false;
    139  confValue = ucd->bConfigurationValue;
    140  break;
    142  if(!valParser.Parse(pp, pcntdn))
    143  return false;
    144  if((MASK & CP_MASK_COMPARE_CLASS) && uid->bInterfaceClass != CLASS_ID)
    145  break;
    146  if((MASK & CP_MASK_COMPARE_SUBCLASS) && uid->bInterfaceSubClass != SUBCLASS_ID)
    147  break;
    148  if(UseOr) {
    149  if((!((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol)))
    150  break;
    151  } else {
    152  if((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol != PROTOCOL_ID)
    153  break;
    154  }
    155  isGoodInterface = true;
    156  ifaceNumber = uid->bInterfaceNumber;
    157  ifaceAltSet = uid->bAlternateSetting;
    158  protoValue = uid->bInterfaceProtocol;
    159  break;
    161  if(!valParser.Parse(pp, pcntdn))
    162  return false;
    163  if(isGoodInterface)
    164  if(theXtractor)
    165  theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_ENDPOINT_DESCRIPTOR*)varBuffer);
    166  break;
    167  //case HID_DESCRIPTOR_HID:
    168  // if (!valParser.Parse(pp, pcntdn))
    169  // return false;
    170  // PrintHidDescriptor((const USB_HID_DESCRIPTOR*)varBuffer);
    171  // break;
    172  default:
    173  if(!theSkipper.Skip(pp, pcntdn, dscrLen - 2))
    174  return false;
    175  }
    176  theBuffer.pValue = varBuffer;
    177  stateParseDescr = 0;
    178  }
    179  return true;
    180 }
    181 
    182 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
    184  Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80);
    185  Notify(PSTR("bDescLength:\t\t"), 0x80);
    186  PrintHex<uint8_t > (pDesc->bLength, 0x80);
    187 
    188  Notify(PSTR("\r\nbDescriptorType:\t"), 0x80);
    189  PrintHex<uint8_t > (pDesc->bDescriptorType, 0x80);
    190 
    191  Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80);
    192  PrintHex<uint16_t > (pDesc->bcdHID, 0x80);
    193 
    194  Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80);
    195  PrintHex<uint8_t > (pDesc->bCountryCode, 0x80);
    196 
    197  Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80);
    198  PrintHex<uint8_t > (pDesc->bNumDescriptors, 0x80);
    199 
    200  for(uint8_t i = 0; i < pDesc->bNumDescriptors; i++) {
    202 
    203  Notify(PSTR("\r\nbDescrType:\t\t"), 0x80);
    204  PrintHex<uint8_t > (pLT[i].bDescrType, 0x80);
    205 
    206  Notify(PSTR("\r\nwDescriptorLength:\t"), 0x80);
    207  PrintHex<uint16_t > (pLT[i].wDescriptorLength, 0x80);
    208  }
    209  Notify(PSTR("\r\n"), 0x80);
    210 }
    211 
    212 
    213 #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:67
    -
    uint8_t bLength
    Definition: usb_ch9.h:152
    - -
    void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
    -
    #define CP_MASK_COMPARE_CLASS
    - - -
    #define USB_DESCRIPTOR_CONFIGURATION
    Definition: usb_ch9.h:64
    -
    #define Notify(...)
    Definition: message.h:44
    - - - - -
    bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip)
    Definition: parsetools.h:65
    -
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:60
    -
    uint8_t bCountryCode
    Definition: usb_ch9.h:155
    - -
    #define CP_MASK_COMPARE_SUBCLASS
    -
    void SetOR(void)
    -
    uint8_t bNumDescriptors
    Definition: usb_ch9.h:156
    -
    bool Parse(uint8_t **pp, uint16_t *pcntdn)
    Definition: parsetools.cpp:19
    - -
    uint8_t bDescriptorType
    Definition: usb_ch9.h:153
    -
    #define PSTR(str)
    - -
    #define HID_DESCRIPTOR_HID
    Definition: usb_ch9.h:73
    -
    uint8_t valueSize
    Definition: parsetools.h:24
    - - -
    ConfigDescParser(UsbConfigXtracter *xtractor)
    -
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:42
    -
    uint8_t bInterfaceSubClass
    Definition: usb_ch9.h:135
    - -
    uint16_t bcdHID
    Definition: usb_ch9.h:154
    -
    uint8_t bInterfaceProtocol
    Definition: usb_ch9.h:136
    -
    uint8_t bDescrType
    Definition: usb_ch9.h:157
    -
    #define USB_DESCRIPTOR_INTERFACE
    Definition: usb_ch9.h:66
    +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
    + +
    void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
    +
    #define CP_MASK_COMPARE_CLASS
    + + +
    #define USB_DESCRIPTOR_CONFIGURATION
    Definition: usb_ch9.h:71
    +
    #define Notify(...)
    Definition: message.h:51
    + + + + +
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:67
    +
    uint8_t bCountryCode
    Definition: usb_ch9.h:162
    + +
    #define CP_MASK_COMPARE_SUBCLASS
    +
    void SetOR(void)
    +
    uint8_t bNumDescriptors
    Definition: usb_ch9.h:163
    + +
    uint8_t bDescriptorType
    Definition: usb_ch9.h:160
    +
    #define PSTR(str)
    + +
    #define HID_DESCRIPTOR_HID
    Definition: usb_ch9.h:80
    + + +
    ConfigDescParser(UsbConfigXtracter *xtractor)
    +
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:49
    +
    uint8_t bInterfaceSubClass
    Definition: usb_ch9.h:142
    + +
    uint16_t bcdHID
    Definition: usb_ch9.h:161
    +
    uint8_t bInterfaceProtocol
    Definition: usb_ch9.h:143
    +
    uint8_t bDescrType
    Definition: usb_ch9.h:164
    +
    #define USB_DESCRIPTOR_INTERFACE
    Definition: usb_ch9.h:73
    diff --git a/controller_enums_8h.html b/controller_enums_8h.html index e9f48667..bd5767bd 100644 --- a/controller_enums_8h.html +++ b/controller_enums_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: controllerEnums.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    - + - + @@ -260,7 +240,9 @@ Enumerations  

    Enumeration Type Documentation

    - + +

    ◆ LEDEnum

    +
    @@ -271,38 +253,28 @@ Enumerations

    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.

    - - - - - - - - - - - - + + + + + + + + + + +
    Enumerator
    OFF  -
    LED1  -
    LED2  -
    LED3  -
    LED4  -
    LED5  -
    LED6  -
    LED7  -
    LED8  -
    LED9  -
    LED10  -
    ALL  -

    Used to blink all LEDs on the Xbox controller

    +
    Enumerator
    OFF 
    LED1 
    LED2 
    LED3 
    LED4 
    LED5 
    LED6 
    LED7 
    LED8 
    LED9 
    LED10 
    ALL 

    Used to blink all LEDs on the Xbox controller

    -

    Definition at line 27 of file controllerEnums.h.

    +

    Definition at line 31 of file controllerEnums.h.

    - + +

    ◆ ColorsEnum

    +
    @@ -313,39 +285,32 @@ Enumerations

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

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

    r = 255, g = 0, b = 0

    +
    Enumerator
    Red 

    r = 255, g = 0, b = 0

    Green  -

    r = 0, g = 255, b = 0

    +
    Green 

    r = 0, g = 255, b = 0

    Blue  -

    r = 0, g = 0, b = 255

    +
    Blue 

    r = 0, g = 0, b = 255

    Yellow  -

    r = 255, g = 235, b = 4

    +
    Yellow 

    r = 255, g = 235, b = 4

    Lightblue  -

    r = 0, g = 255, b = 255

    +
    Lightblue 

    r = 0, g = 255, b = 255

    Purple  -

    r = 255, g = 0, b = 255

    +
    Purple 

    r = 255, g = 0, b = 255

    Purble  +
    Purble 
    White 

    r = 255, g = 255, b = 255

    White  -

    r = 255, g = 255, b = 255

    -
    Off  -

    r = 0, g = 0, b = 0

    +
    Off 

    r = 0, g = 0, b = 0

    -

    Definition at line 46 of file controllerEnums.h.

    +

    Definition at line 50 of file controllerEnums.h.

    - + +

    ◆ RumbleEnum

    +
    @@ -355,17 +320,17 @@ Enumerations
    - - + +
    Enumerator
    RumbleHigh  -
    RumbleLow  -
    Enumerator
    RumbleHigh 
    RumbleLow 
    -

    Definition at line 68 of file controllerEnums.h.

    +

    Definition at line 72 of file controllerEnums.h.

    - + +

    ◆ ButtonEnum

    +
    @@ -376,148 +341,103 @@ Enumerations

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

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

    These buttons are available on all the the controllers

    +
    Enumerator
    UP 

    These buttons are available on all the the controllers

    RIGHT  -

    These buttons are available on all the the controllers

    +
    RIGHT 

    These buttons are available on all the the controllers

    DOWN  -

    These buttons are available on all the the controllers

    +
    DOWN 

    These buttons are available on all the the controllers

    LEFT  -

    These buttons are available on all the the controllers

    +
    LEFT 

    These buttons are available on all the the controllers

    PLUS  -

    Wii buttons

    +
    PLUS 

    Wii buttons

    TWO  -

    Wii buttons

    +
    TWO 

    Wii buttons

    ONE  -

    Wii buttons

    +
    ONE 

    Wii buttons

    MINUS  -

    Wii buttons

    +
    MINUS 

    Wii buttons

    HOME  -

    Wii buttons

    +
    HOME 

    Wii buttons

    -

    Wii buttons

    +

    Wii buttons

    -

    Wii buttons

    +

    Wii buttons

    -

    Wii buttons

    +

    Wii buttons

    -

    Wii buttons

    +

    Wii buttons

    -

    These are only available on the Wii U Pro Controller

    +

    These are only available on the Wii U Pro Controller

    -

    These are only available on the Wii U Pro Controller

    +

    These are only available on the Wii U Pro Controller

    ZL  -

    These are only available on the Wii U Pro Controller

    +
    ZL 

    These are only available on the Wii U Pro Controller

    ZR  -

    These are only available on the Wii U Pro Controller

    +
    ZR 

    These are only available on the Wii U Pro Controller

    SELECT  -

    PS3 controllers buttons

    +
    SELECT 

    PS3 controllers buttons

    START  -

    PS3 controllers buttons

    +
    START 

    PS3 controllers buttons

    L3  -

    PS3 controllers buttons

    +
    L3 

    PS3 controllers buttons

    R3  -

    PS3 controllers buttons

    +
    R3 

    PS3 controllers buttons

    L2  -

    PS3 controllers buttons

    +
    L2 

    PS3 controllers buttons

    R2  -

    PS3 controllers buttons

    +
    R2 

    PS3 controllers buttons

    L1  -

    PS3 controllers buttons

    +
    L1 

    PS3 controllers buttons

    R1  -

    PS3 controllers buttons

    +
    R1 

    PS3 controllers buttons

    TRIANGLE  -

    PS3 controllers buttons

    +
    TRIANGLE 

    PS3 controllers buttons

    CIRCLE  -

    PS3 controllers buttons

    +
    CIRCLE 

    PS3 controllers buttons

    CROSS  -

    PS3 controllers buttons

    +
    CROSS 

    PS3 controllers buttons

    SQUARE  -

    PS3 controllers buttons

    +
    SQUARE 

    PS3 controllers buttons

    PS  -

    PS3 controllers buttons

    +
    PS 

    PS3 controllers buttons

    MOVE  -

    PS3 controllers buttons

    +
    MOVE 

    PS3 controllers buttons

    -

    PS3 controllers buttons

    +

    PS3 controllers buttons

    SHARE  -

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

    +
    SHARE 

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

    OPTIONS  +
    OPTIONS 
    TOUCHPAD 
    BACK 

    Xbox buttons

    TOUCHPAD  +

    Xbox buttons

    BACK  -

    Xbox buttons

    +

    Xbox buttons

    -

    Xbox buttons

    +
    XBOX 

    Xbox buttons

    -

    Xbox buttons

    +
    SYNC 

    Xbox buttons

    XBOX  -

    Xbox buttons

    +
    BLACK 

    Xbox buttons

    SYNC  -

    Xbox buttons

    +
    WHITE 

    Xbox buttons

    BLACK  -

    Xbox buttons

    -
    WHITE  -

    Xbox buttons

    -
    RED  -

    PS Buzz controllers

    -
    YELLOW  -
    GREEN  -
    ORANGE  -
    BLUE  +
    RED 

    PS Buzz controllers

    YELLOW 
    GREEN 
    ORANGE 
    BLUE 
    -

    Definition at line 74 of file controllerEnums.h.

    +

    Definition at line 78 of file controllerEnums.h.

    - + +

    ◆ AnalogHatEnum

    +
    @@ -528,25 +448,23 @@ Enumerations

    Joysticks on the PS3 and Xbox controllers.

    - - - -
    Enumerator
    LeftHatX  -

    Left joystick x-axis

    +
    Enumerator
    LeftHatX 

    Left joystick x-axis

    LeftHatY  -

    Left joystick y-axis

    +
    LeftHatY 

    Left joystick y-axis

    RightHatX  -

    Right joystick x-axis

    +
    RightHatX 

    Right joystick x-axis

    RightHatY  -

    Right joystick y-axis

    +
    RightHatY 

    Right joystick y-axis

    -

    Definition at line 153 of file controllerEnums.h.

    +

    Definition at line 157 of file controllerEnums.h.

    - + +

    ◆ SensorEnum

    +
    @@ -557,57 +475,43 @@ 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  -

    Accelerometer values

    +
    Enumerator
    aX 

    Accelerometer values

    aY  +
    aY 
    aZ 
    gZ 

    Gyro z-axis

    aZ  +
    gX 
    gY 
    aXmove 

    Accelerometer x-axis

    gZ  -

    Gyro z-axis

    +
    aZmove 

    Accelerometer z-axis

    gX  +
    aYmove 

    Accelerometer y-axis

    gY  +
    gXmove 

    Gyro x-axis

    aXmove  -

    Accelerometer x-axis

    +
    gZmove 

    Gyro z-axis

    aZmove  -

    Accelerometer z-axis

    +
    gYmove 

    Gyro y-axis

    aYmove  -

    Accelerometer y-axis

    +
    tempMove 

    Temperature sensor

    gXmove  -

    Gyro x-axis

    +
    mXmove 

    Magnetometer x-axis

    gZmove  -

    Gyro z-axis

    +
    mZmove 

    Magnetometer z-axis

    gYmove  -

    Gyro y-axis

    -
    tempMove  -

    Temperature sensor

    -
    mXmove  -

    Magnetometer x-axis

    -
    mZmove  -

    Magnetometer z-axis

    -
    mYmove  -

    Magnetometer y-axis

    +
    mYmove 

    Magnetometer y-axis

    -

    Definition at line 168 of file controllerEnums.h.

    +

    Definition at line 172 of file controllerEnums.h.

    - + +

    ◆ AngleEnum

    +
    @@ -618,13 +522,11 @@ Enumerations

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

    - - + +
    Enumerator
    Pitch  -
    Roll  -
    Enumerator
    Pitch 
    Roll 
    -

    Definition at line 201 of file controllerEnums.h.

    +

    Definition at line 205 of file controllerEnums.h.

    @@ -633,7 +535,7 @@ Enumerations diff --git a/controller_enums_8h__dep__incl.map b/controller_enums_8h__dep__incl.map index 00c525a3..91d38ced 100644 --- a/controller_enums_8h__dep__incl.map +++ b/controller_enums_8h__dep__incl.map @@ -2,10 +2,10 @@ - + - + diff --git a/controller_enums_8h__dep__incl.png b/controller_enums_8h__dep__incl.png index 539588fa3e1226b018a04517fdeced38b205804b..a25d83208a55337ba9cbafa1713be4743ea728bb 100644 GIT binary patch literal 54964 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

    P%o@ED)XMX8-#N@*q(gQ1vaj0$+;cOHIytP)u^p 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 VIlq}7c)~0LgQu&X%Q~loCIC(QIX(aY literal 54541 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¬BLtD2NctehQ;HOJA;J#Yk}*l7fG(yN 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

    j=_mFNET_rh-hmcgkEOz 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 diff --git a/controller_enums_8h_source.html b/controller_enums_8h_source.html index 03eeb4e8..b12982dd 100644 --- a/controller_enums_8h_source.html +++ b/controller_enums_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: controllerEnums.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

    - + - - + + + +
    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 
    27 enum LEDEnum {
    28  OFF = 0,
    29 #ifndef RBL_NRF51822
    30  LED1 = 1,
    31  LED2 = 2,
    32  LED3 = 3,
    33  LED4 = 4,
    34 #endif
    35  LED5 = 5,
    36  LED6 = 6,
    37  LED7 = 7,
    38  LED8 = 8,
    39  LED9 = 9,
    40  LED10 = 10,
    42  ALL = 5,
    43 };
    44 
    46 enum ColorsEnum {
    48  Red = 0xFF0000,
    50  Green = 0xFF00,
    52  Blue = 0xFF,
    53 
    55  Yellow = 0xFFEB04,
    57  Lightblue = 0xFFFF,
    59  Purple = 0xFF00FF,
    60  Purble = 0xFF00FF,
    61 
    63  White = 0xFFFFFF,
    65  Off = 0x00,
    66 };
    67 
    68 enum RumbleEnum {
    69  RumbleHigh = 0x10,
    70  RumbleLow = 0x20,
    71 };
    72 
    74 enum ButtonEnum {
    77  UP = 0,
    78  RIGHT = 1,
    79  DOWN = 2,
    80  LEFT = 3,
    85  PLUS = 5,
    86  TWO = 6,
    87  ONE = 7,
    88  MINUS = 8,
    89  HOME = 9,
    90  Z = 10,
    91  C = 11,
    92  B = 12,
    93  A = 13,
    98  L = 16,
    99  R = 17,
    100  ZL = 18,
    101  ZR = 19,
    106  SELECT = 4,
    107  START = 5,
    108  L3 = 6,
    109  R3 = 7,
    110 
    111  L2 = 8,
    112  R2 = 9,
    113  L1 = 10,
    114  R1 = 11,
    115  TRIANGLE = 12,
    116  CIRCLE = 13,
    117  CROSS = 14,
    118  SQUARE = 15,
    119 
    120  PS = 16,
    121 
    122  MOVE = 17, // Covers 12 bits - we only need to read the top 8
    123  T = 18, // Covers 12 bits - we only need to read the top 8
    127  SHARE = 4,
    128  OPTIONS = 5,
    129  TOUCHPAD = 17,
    134  BACK = 4,
    135  X = 14,
    136  Y = 15,
    137  XBOX = 16,
    138  SYNC = 17,
    139  BLACK = 8, // Available on the original Xbox controller
    140  WHITE = 9, // Available on the original Xbox controller
    144  RED = 0,
    145  YELLOW = 1,
    146  GREEN = 2,
    147  ORANGE = 3,
    148  BLUE = 4,
    150 };
    151 
    155  LeftHatX = 0,
    157  LeftHatY = 1,
    162 };
    163 
    170  aX = 50, aY = 52, aZ = 54,
    172  gZ = 56,
    173  gX, gY, // These are not available on the PS3 controller
    174 
    176  aXmove = 28,
    178  aZmove = 30,
    180  aYmove = 32,
    181 
    183  gXmove = 40,
    185  gZmove = 42,
    187  gYmove = 44,
    188 
    190  tempMove = 46,
    191 
    193  mXmove = 47,
    195  mZmove = 49,
    197  mYmove = 50,
    198 };
    199 
    201 enum AngleEnum {
    202  Pitch = 0x01,
    203  Roll = 0x02,
    204 };
    205 
    206 #endif
    - - - - - - - - - - - - - - -
    AnalogHatEnum
    - - - - - - - - - - - - - -
    LEDEnum
    - - - - -
    RumbleEnum
    - - - - - - - - - - - - -
    ButtonEnum
    - - - - - - - - - - - - - - - -
    ColorsEnum
    - - - - -
    AngleEnum
    - - - - - - - - - - - - - - - - - - - - -
    SensorEnum
    - - - - - - - - - +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
    + + + + + + + + + + + + + + +
    AnalogHatEnum
    + + + + + + + + + + + + + +
    LEDEnum
    + + + + +
    RumbleEnum
    + + + + + + + + + + + + +
    ButtonEnum
    + + + + + + + + + + + + + + + +
    ColorsEnum
    + + + + +
    AngleEnum
    + + + + + + + + + + + + + + + + + + + + +
    SensorEnum
    + + + + + + + + +
    diff --git a/dir_69161428018e52ad84691a5947f27cc9.html b/dir_69161428018e52ad84691a5947f27cc9.html index 544be4c4..e05cc768 100644 --- a/dir_69161428018e52ad84691a5947f27cc9.html +++ b/dir_69161428018e52ad84691a5947f27cc9.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Github Directory Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/dir_ee762931928e29ae94e054d18c99dc9e.html b/dir_ee762931928e29ae94e054d18c99dc9e.html index 832210da..c359673e 100644 --- a/dir_ee762931928e29ae94e054d18c99dc9e.html +++ b/dir_ee762931928e29ae94e054d18c99dc9e.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: USB_Host_Shield_2_0 Directory Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/doxygen.css b/doxygen.css index 1425ec53..266c8b3a 100644 --- a/doxygen.css +++ b/doxygen.css @@ -1,9 +1,13 @@ -/* The standard CSS for doxygen 1.8.11 */ +/* The standard CSS for doxygen 1.8.14 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; } +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + /* @group Heading Levels */ h1.groupheader { @@ -173,7 +177,7 @@ pre.fragment { } div.fragment { - padding: 4px 6px; + padding: 0px; margin: 4px 8px 4px 2px; background-color: #FBFCFD; border: 1px solid #C4CFE5; @@ -232,6 +236,15 @@ span.lineno a:hover { background-color: #C8C8C8; } +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + div.ah, span.ah { background-color: black; font-weight: bold; @@ -501,6 +514,29 @@ table.memberdecls { /* Styles for detailed member documentation */ +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + .memtemplate { font-size: 80%; color: #4665A2; @@ -539,7 +575,7 @@ table.memberdecls { } .memname { - font-weight: bold; + font-weight: 400; margin-left: 6px; } @@ -555,24 +591,24 @@ table.memberdecls { color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; + background-color: #DFE5F1; /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 4px; - border-top-left-radius: 4px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; } +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + .memdoc, dl.reflist dd { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; @@ -914,6 +950,7 @@ table.fieldtable { padding-bottom: 4px; padding-top: 5px; text-align:left; + font-weight: 400; -moz-border-radius-topleft: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-left-radius: 4px; @@ -1178,6 +1215,11 @@ dl.section dd { text-align: center; } +.plantumlgraph +{ + text-align: center; +} + .diagraph { text-align: center; @@ -1473,3 +1515,82 @@ tr.heading h2 { } } +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + + +/* @end */ diff --git a/dynsections.js b/dynsections.js index 1e6bf07f..537e3e49 100644 --- a/dynsections.js +++ b/dynsections.js @@ -1,3 +1,26 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ function toggleVisibility(linkObj) { var base = $(linkObj).attr('id'); @@ -15,7 +38,7 @@ function toggleVisibility(linkObj) summary.hide(); $(linkObj).removeClass('closed').addClass('opened'); $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } + } return false; } @@ -37,7 +60,7 @@ function toggleLevel(level) $(this).show(); } else if (l==level+1) { i.removeClass('iconfclosed iconfopen').addClass('iconfclosed'); - a.html('►'); + a.html('▶'); $(this).show(); } else { $(this).hide(); @@ -64,7 +87,7 @@ function toggleFolder(id) // replace down arrow by right arrow for current row var currentRowSpans = currentRow.find("span"); currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); - currentRowSpans.filter(".arrow").html('►'); + currentRowSpans.filter(".arrow").html('▶'); rows.filter("[id^=row_"+id+"]").hide(); // hide all children } else { // we are SHOWING // replace right arrow by down arrow for current row @@ -74,7 +97,7 @@ function toggleFolder(id) // replace down arrows by right arrows for child rows var childRowsSpans = childRows.find("span"); childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed"); - childRowsSpans.filter(".arrow").html('►'); + childRowsSpans.filter(".arrow").html('▶'); childRows.show(); //show all children } updateStripes(); @@ -94,7 +117,7 @@ function toggleInherit(id) $(img).attr('src',src.substring(0,src.length-10)+'open.png'); } } - +/* @license-end */ $(document).ready(function() { $('.code,.codeRef').each(function() { diff --git a/files.html b/files.html index 67ff7e08..959b1da9 100644 --- a/files.html +++ b/files.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File List @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - _ -

      +

      - _ -

      • _enhanced_status : ACM
      • @@ -135,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_a.html b/functions_a.html index 64860fc6..29bda365 100644 --- a/functions_a.html +++ b/functions_a.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - a -

      +

      - a -

      • A_M_L_LB : CDB_LBA32_16
      • @@ -284,7 +223,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_b.html b/functions_b.html index b8117f57..3b8b2cc8 100644 --- a/functions_b.html +++ b/functions_b.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - b -

      +

      - b -

      • b : PS4Output
      • @@ -178,6 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , BTD , BulkOnly , USBH_MIDI +, XBOXONE
      • bControlIface : ACM @@ -484,6 +424,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , BTD , BulkOnly , USBH_MIDI +, XBOXONE
      • bNumInterfaces : USB_CONFIGURATION_DESCRIPTOR @@ -557,6 +498,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS4Data , PSBUZZButtons
      • +
      • bTransferTypeMask +: USBH_MIDI +
      • bType : HidItemPrefix
      • @@ -584,7 +528,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_c.html b/functions_c.html index 6043d39c..9727b5d5 100644 --- a/functions_c.html +++ b/functions_c.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - c -

      +

      - c -

      • CBWCB : CommandBlockWrapper
      • @@ -256,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : touchpadXY
      • countSysExDataSize() -: USBH_MIDI +: USBH_MIDI
      • createChar() : Max_LCD @@ -288,7 +227,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_d.html b/functions_d.html index 9e114331..1ec7a80a 100644 --- a/functions_d.html +++ b/functions_d.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - d -

      +

      - d -

      • data : Capacity
      • @@ -229,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_e.html b/functions_e.html index 0a83f942..a8da7700 100644 --- a/functions_e.html +++ b/functions_e.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - e -

    diff --git a/functions_enum.html b/functions_enum.html index 1fe022a9..8317a377 100644 --- a/functions_enum.html +++ b/functions_enum.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Enumerations @@ -11,9 +12,6 @@ - @@ -32,52 +30,22 @@
    - + - - - + + + +
    - + - - - + + + +
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - f -

      +

      - f -

      • finger : touchpadXY
      • @@ -155,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func.html b/functions_func.html index 27a2cbc6..2b56d5ce 100644 --- a/functions_func.html +++ b/functions_func.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - a -

      +

      - a -

      • ACLData() : BluetoothService , BTHID @@ -178,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_b.html b/functions_func_b.html index 6168a012..e8e04849 100644 --- a/functions_func_b.html +++ b/functions_func_b.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - b -

      +

      - b -

      • begin() : Max_LCD
      • @@ -162,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_c.html b/functions_func_c.html index 603e36ec..f3e4626b 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - c -

      +

      - c -

      • CDB10() : CDB10
      • @@ -172,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PSBuzz
      • countSysExDataSize() -: USBH_MIDI +: USBH_MIDI
      • createChar() : Max_LCD @@ -195,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_d.html b/functions_func_d.html index 6ed783df..d33362af 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - d -

      +

      - d -

      • DefaultAddressing() : USB
      • @@ -161,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_e.html b/functions_func_e.html index c960c647..3ea2be78 100644 --- a/functions_func_e.html +++ b/functions_func_e.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - e -

      +

      - e -

      • EndpointXtract() : ACM , ADK @@ -133,6 +75,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , HIDComposite , HIDUniversal , UsbConfigXtracter +, XBOXONE
      • enhanced_features() : ACM @@ -141,13 +84,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • enhanced_status() : ACM
      • +
      • extractSysExData() +: USBH_MIDI +
    diff --git a/functions_func_f.html b/functions_func_f.html index 8d9b4b3a..eb72146f 100644 --- a/functions_func_f.html +++ b/functions_func_f.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - f -

      +

      - f -

      • flush() : SPP
      • @@ -143,7 +85,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_g.html b/functions_func_g.html index d74abfe7..08d97d6d 100644 --- a/functions_func_g.html +++ b/functions_func_g.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - g -

      +

      - g -

      • get9DOFValues() : PS3BT
      • @@ -414,7 +356,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_h.html b/functions_func_h.html index 797287f1..04e9d097 100644 --- a/functions_func_h.html +++ b/functions_func_h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - h -

      +

      - h -

      • half_duplex() : ACM , XR21B1411 @@ -205,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_i.html b/functions_func_i.html index 8377bdfe..bf2fe59b 100644 --- a/functions_func_i.html +++ b/functions_func_i.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - i -

      +

      - i -

        +
      • idProduct() +: USBH_MIDI +
      • +
      • idVendor() +: USBH_MIDI +
      • Init() : ACM , ADK @@ -177,6 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ACM , ADK , BTD +, FTDI , HIDBoot< BOOT_PROTOCOL > , HIDComposite , HIDUniversal @@ -195,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_k.html b/functions_func_k.html index 41c2ae86..7667e286 100644 --- a/functions_func_k.html +++ b/functions_func_k.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - k -

      +

      - k -

      • KeyboardReportParser() : KeyboardReportParser
      • @@ -132,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_l.html b/functions_func_l.html index 8ad97d5a..4a047a62 100644 --- a/functions_func_l.html +++ b/functions_func_l.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - l -

      +

      - l -

      • L2CAP_Command() : BTD
      • @@ -153,6 +95,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • LockMedia() : BulkOnly
      • +
      • lookupMsgSize() +: USBH_MIDI +
      • LUNIsGood() : BulkOnly
      • @@ -162,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_m.html b/functions_func_m.html index 09d1e28c..6b9b1cd7 100644 --- a/functions_func_m.html +++ b/functions_func_m.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - m -

      +

      - m -

      • MAX3421e() : MAX3421e< SPI_SS, INTR >
      • @@ -149,7 +91,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_n.html b/functions_func_n.html index 66c14028..4db1fb57 100644 --- a/functions_func_n.html +++ b/functions_func_n.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - n -

      +

      - n -

      • noAutoscroll() : Max_LCD
      • @@ -141,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_o.html b/functions_func_o.html index 11fa19dc..78e3667d 100644 --- a/functions_func_o.html +++ b/functions_func_o.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - o -

      +

      - o -

      • OemToAscii() : KeyboardReportParser
      • @@ -185,6 +127,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • operator bool() : SPP +, USBH_MIDI
      • outTransfer() : USB @@ -195,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_p.html b/functions_func_p.html index d1670e02..ccd5c942 100644 --- a/functions_func_p.html +++ b/functions_func_p.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - p -

      +

      - p -

      • pair() : BTHID , WII @@ -152,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PS4BT
      • parseConfigDescr() -: USBH_MIDI +: USBH_MIDI
      • ParseHIDData() : HIDComposite @@ -208,6 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , BTD , BulkOnly , USBHID +, XBOXONE
      • PrintGameControlsPageUsage() : ReportDescParserBase @@ -285,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_r.html b/functions_func_r.html index b4538eba..2f032932 100644 --- a/functions_func_r.html +++ b/functions_func_r.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - r -

      +

      - r -

      • RcvData() : ACM , ADK @@ -130,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , USBH_MIDI
      • Read() -: BulkOnly +: BulkOnly
      • read() : SPP @@ -140,10 +82,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • readPollInterval() : BTD +, XBOXONE
      • RecvData() : USBH_MIDI
      • +
      • RecvRawData() +: USBH_MIDI +
      • registerBluetoothService() : BTD
      • @@ -224,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_s.html b/functions_func_s.html index 81460198..d9de453f 100644 --- a/functions_func_s.html +++ b/functions_func_s.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - s -

      +

      - s -

      • scrollDisplayLeft() : Max_LCD
      • @@ -145,15 +87,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ACM
      • SendData() -: USBH_MIDI +: USBH_MIDI
      • sendOutputReport() : PS4BT , PS4Parser , PS4USB
      • +
      • SendRawData() +: USBH_MIDI +
      • SendSysEx() -: USBH_MIDI +: USBH_MIDI
      • setAddr() : USB @@ -299,21 +244,26 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PS4Parser , WII , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB
      • setRumbleOn() : PS3BT , PS3USB -, PS4Parser +, PS4Parser , WII , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB
      • setRumbleToggle() : WII
      • +
      • setupDeviceSpecific() +: USBH_MIDI +
      • SetUsagePage() : ReportDescParserBase
      • @@ -344,7 +294,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_t.html b/functions_func_t.html index 426eec73..eb4e0a2e 100644 --- a/functions_func_t.html +++ b/functions_func_t.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - t -

      +

      - t -

      • Task() : MAX3421e< SPI_SS, INTR > , USB @@ -133,7 +75,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_u.html b/functions_func_u.html index ba1a0f62..b07b4ed4 100644 --- a/functions_func_u.html +++ b/functions_func_u.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - u -

      +

      - u -

      • USB() : USB
      • @@ -141,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_v.html b/functions_func_v.html index b2f6f0ba..5ee372f9 100644 --- a/functions_func_v.html +++ b/functions_func_v.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - v -

      +

      - v -

      • vbusPower() : MAX3421e< SPI_SS, INTR >
      • @@ -146,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_w.html b/functions_func_w.html index 55a88bc8..4d269e8d 100644 --- a/functions_func_w.html +++ b/functions_func_w.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - w -

      +

      - w -

      • wide() : ACM
      • @@ -134,7 +76,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • write() : Max_LCD -, SPP +, SPP
      • write_register() : XR21B1411 @@ -148,7 +90,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_x.html b/functions_func_x.html index 56e144ba..01d86f82 100644 --- a/functions_func_x.html +++ b/functions_func_x.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Functions @@ -11,9 +12,6 @@ - @@ -32,78 +30,22 @@
    - + - - - - + + + +
      -

    - x -

      +

      - x -

      • XBOXOLD() : XBOXOLD
      • @@ -144,7 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_g.html b/functions_g.html index 55135872..dec455f6 100644 --- a/functions_g.html +++ b/functions_g.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - g -

      +

      - g -

      • g : PS4Output
      • @@ -483,7 +422,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_h.html b/functions_h.html index 943b9baf..26886ca4 100644 --- a/functions_h.html +++ b/functions_h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - h -

      +

      - h -

      • half_duplex() : ACM , tty_features @@ -226,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_i.html b/functions_i.html index fd59cd8b..c641790d 100644 --- a/functions_i.html +++ b/functions_i.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - i -

    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - k -

      +

      - k -

      • kbdInfo : KeyboardReportParser
      • @@ -147,7 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_l.html b/functions_l.html index 3935d50c..736a53b1 100644 --- a/functions_l.html +++ b/functions_l.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - l -

      +

      - l -

      • l1 : PS4Buttons
      • @@ -224,6 +163,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • LogPwrSwitchMode : HubDescriptor
      • +
      • lookupMsgSize() +: USBH_MIDI +
      • lowspeed : UsbDevice
      • @@ -244,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_m.html b/functions_m.html index d4500557..c1c7162e 100644 --- a/functions_m.html +++ b/functions_m.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - m -

      +

      - m -

      • MAX3421e() : MAX3421e< SPI_SS, INTR >
      • @@ -213,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_n.html b/functions_n.html index 4ac2463d..643ba4f7 100644 --- a/functions_n.html +++ b/functions_n.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - n -

      +

      - n -

      • noAutoscroll() : Max_LCD
      • @@ -150,7 +89,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_o.html b/functions_o.html index 05633457..ea59e227 100644 --- a/functions_o.html +++ b/functions_o.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - o -

      +

      - o -

      • OemToAscii() : KeyboardReportParser
      • @@ -196,6 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • operator bool() : SPP +, USBH_MIDI
      • options : PS4Buttons @@ -215,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_p.html b/functions_p.html index e86175a0..b514c46c 100644 --- a/functions_p.html +++ b/functions_p.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - p -

      +

      - p -

      • pair() : BTHID , WII @@ -161,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PS4BT
      • parseConfigDescr() -: USBH_MIDI +: USBH_MIDI
      • ParseHIDData() : HIDComposite @@ -254,6 +193,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , BTD , BulkOnly , USBHID +, XBOXONE
      • PrintGameControlsPageUsage() : ReportDescParserBase @@ -368,7 +308,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_q.html b/functions_q.html index f221b12f..4e252e4f 100644 --- a/functions_q.html +++ b/functions_q.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - q -

    @@ -137,7 +77,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_r.html b/functions_r.html index 4cb74242..5ea8981e 100644 --- a/functions_r.html +++ b/functions_r.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@ - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - r -

      +

      - r -

      • r : PS4Output
      • @@ -161,6 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • readPollInterval() : BTD +, XBOXONE
      • readPtr : USBH_MIDI @@ -178,6 +118,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • RecvData() : USBH_MIDI
      • +
      • RecvRawData() +: USBH_MIDI +
      • red : PSBUZZButtons
      • @@ -310,7 +253,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_s.html b/functions_s.html index c5e70773..46cf4e0d 100644 --- a/functions_s.html +++ b/functions_s.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - s -

    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - t -

      +

      - t -

      • Task() : MAX3421e< SPI_SS, INTR > , USB @@ -196,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_type.html b/functions_type.html index d8e38b4d..fa118235 100644 --- a/functions_type.html +++ b/functions_type.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Typedefs @@ -11,9 +12,6 @@ - @@ -32,52 +30,22 @@
    - + - - - + + + + - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - u -

      +

      - u -

      • unknown : PS4Status
      • @@ -165,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_v.html b/functions_v.html index 390db6a2..f0b669d7 100644 --- a/functions_v.html +++ b/functions_v.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - v -

      +

      - v -

      • val : PS4Buttons , PSBUZZButtons @@ -184,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars.html b/functions_vars.html index f14710c9..7d6d0cba 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - _ -

      +

      - _ -

      • _enhanced_status : ACM
      • @@ -135,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_a.html b/functions_vars_a.html index d064ddf0..0a0f9269 100644 --- a/functions_vars_a.html +++ b/functions_vars_a.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - a -

      +

      - a -

      • A_M_L_LB : CDB_LBA32_16
      • @@ -235,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_b.html b/functions_vars_b.html index b43303ec..7153540a 100644 --- a/functions_vars_b.html +++ b/functions_vars_b.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - b -

      +

      - b -

      • b : PS4Output
      • @@ -178,6 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , BTD , BulkOnly , USBH_MIDI +, XBOXONE
      • bControlIface : ACM @@ -475,6 +415,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , BTD , BulkOnly , USBH_MIDI +, XBOXONE
      • bNumInterfaces : USB_CONFIGURATION_DESCRIPTOR @@ -542,6 +483,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS4Data , PSBUZZButtons
      • +
      • bTransferTypeMask +: USBH_MIDI +
      • bType : HidItemPrefix
      • @@ -551,7 +495,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_c.html b/functions_vars_c.html index a9604282..ba7eff80 100644 --- a/functions_vars_c.html +++ b/functions_vars_c.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - c -

      +

      - c -

      • CBWCB : CommandBlockWrapper
      • @@ -224,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_d.html b/functions_vars_d.html index 5097d1fb..b6649930 100644 --- a/functions_vars_d.html +++ b/functions_vars_d.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - d -

      +

      - d -

      • data : Capacity
      • @@ -197,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_e.html b/functions_vars_e.html index 37203420..c21e84f3 100644 --- a/functions_vars_e.html +++ b/functions_vars_e.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - e -

      +

      - e -

      • ENCSERV : InquiryResponse
      • @@ -174,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • epInfo : USBH_MIDI , XBOXOLD -, XBOXONE +, XBOXONE , XBOXRECV , XBOXUSB
      • @@ -195,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_f.html b/functions_vars_f.html index 405759df..5b088ce0 100644 --- a/functions_vars_f.html +++ b/functions_vars_f.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - f -

      +

      - f -

      • finger : touchpadXY
      • @@ -141,7 +80,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_g.html b/functions_vars_g.html index 7bff218f..228d532b 100644 --- a/functions_vars_g.html +++ b/functions_vars_g.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - g -

      +

      - g -

      • g : PS4Output
      • @@ -198,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_h.html b/functions_vars_h.html index b62ea80f..e496c837 100644 --- a/functions_vars_h.html +++ b/functions_vars_h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - h -

      +

      - h -

      • half_duplex : tty_features
      • @@ -152,7 +91,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_i.html b/functions_vars_i.html index 16f01c46..8b2907aa 100644 --- a/functions_vars_i.html +++ b/functions_vars_i.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - i -

      +

      - i -

      • iConfiguration : USB_CONFIGURATION_DESCRIPTOR
      • @@ -183,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_k.html b/functions_vars_k.html index e3dc6971..c321b29e 100644 --- a/functions_vars_k.html +++ b/functions_vars_k.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - k -

      +

      - k -

      • kbdInfo : KeyboardReportParser
      • @@ -144,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_l.html b/functions_vars_l.html index e8293802..25b5f9cd 100644 --- a/functions_vars_l.html +++ b/functions_vars_l.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - l -

      +

      - l -

      • l1 : PS4Buttons
      • @@ -211,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_m.html b/functions_vars_m.html index c03cf671..4868ee7b 100644 --- a/functions_vars_m.html +++ b/functions_vars_m.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - m -

      +

      - m -

      • maxEpPerInterface : USBHID
      • @@ -187,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_n.html b/functions_vars_n.html index 148a7b8c..946fce3d 100644 --- a/functions_vars_n.html +++ b/functions_vars_n.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - n -

      +

      - n -

      • NormACA : InquiryResponse
      • @@ -138,7 +77,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_o.html b/functions_vars_o.html index d0330d0c..c8b7e8e2 100644 --- a/functions_vars_o.html +++ b/functions_vars_o.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - o -

      +

      - o -

      • Opcode : BASICCDB , CDB10 @@ -149,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_p.html b/functions_vars_p.html index 3bb23e09..22d1c47b 100644 --- a/functions_vars_p.html +++ b/functions_vars_p.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - p -

      +

      - p -

      • pairWithHIDDevice : BTD
      • @@ -209,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_q.html b/functions_vars_q.html index 97ffbb9c..7fa66a96 100644 --- a/functions_vars_q.html +++ b/functions_vars_q.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - q -

    @@ -137,7 +77,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_r.html b/functions_vars_r.html index dc4bc2e5..1ab396a5 100644 --- a/functions_vars_r.html +++ b/functions_vars_r.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@ - + - - - - + + + +
      -

    - r -

      +

      - r -

      • r : PS4Output
      • @@ -215,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_s.html b/functions_vars_s.html index e1291860..92f5d613 100644 --- a/functions_vars_s.html +++ b/functions_vars_s.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - s -

      +

      - s -

      • SCCS : InquiryResponse
      • @@ -182,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_t.html b/functions_vars_t.html index 8dad6e32..4a2cfe01 100644 --- a/functions_vars_t.html +++ b/functions_vars_t.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - t -

      +

      - t -

      • telTitles0 : ReportDescParserBase
      • @@ -192,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_u.html b/functions_vars_u.html index 52b34c5a..fac861dc 100644 --- a/functions_vars_u.html +++ b/functions_vars_u.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - u -

      +

      - u -

      • unknown : PS4Status
      • @@ -150,7 +89,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_v.html b/functions_vars_v.html index c905ddb4..f4a18085 100644 --- a/functions_vars_v.html +++ b/functions_vars_v.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - v -

      +

      - v -

      • val : PS4Buttons , PSBUZZButtons @@ -167,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_w.html b/functions_vars_w.html index 92676a13..69e89114 100644 --- a/functions_vars_w.html +++ b/functions_vars_w.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - w -

      -
    • watingForConnection -: BTD +

      - w -

        +
      • waitingForConnection +: BTD
      • wDescriptorLength : HID_CLASS_DESCRIPTOR_LEN_AND_TYPE @@ -190,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_x.html b/functions_vars_x.html index 5d30e8e9..a85866d9 100644 --- a/functions_vars_x.html +++ b/functions_vars_x.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - x -

      +

      - x -

      • x : touchpadXY
      • @@ -151,7 +90,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_y.html b/functions_vars_y.html index d43cabfa..7db85545 100644 --- a/functions_vars_y.html +++ b/functions_vars_y.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members - Variables @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
      -

    - y -

      +

      - y -

      • y : touchpadXY
      • @@ -144,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_w.html b/functions_w.html index 773961c2..c386a5d3 100644 --- a/functions_w.html +++ b/functions_w.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - w -

      -
    • watingForConnection -: BTD +

      - w -

        +
      • waitingForConnection +: BTD
      • wDescriptorLength : HID_CLASS_DESCRIPTOR_LEN_AND_TYPE @@ -174,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • write() : Max_LCD -, SPP +, SPP
      • write_register() : XR21B1411 @@ -207,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_x.html b/functions_x.html index 0892a591..6345878c 100644 --- a/functions_x.html +++ b/functions_x.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - x -

      +

      - x -

      • x : touchpadXY
      • @@ -166,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_y.html b/functions_y.html index 1620b9cc..42791260 100644 --- a/functions_y.html +++ b/functions_y.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all class members with links to the classes they belong to:
    -

    - y -

      +

      - y -

      • y : touchpadXY
      • @@ -144,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals.html b/globals.html index d5b5be40..868667e4 100644 --- a/globals.html +++ b/globals.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - _ -

      +

      - _ -

      • __BYTE_GRABBING_DEFINED__ : macros.h
      • @@ -144,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_a.html b/globals_a.html index 6751d7d2..4a652e5d 100644 --- a/globals_a.html +++ b/globals_a.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - a -

      +

      - a -

      • A : controllerEnums.h
      • @@ -219,7 +158,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_b.html b/globals_b.html index 6581d91c..fe753fa3 100644 --- a/globals_b.html +++ b/globals_b.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - b -

      +

      - b -

      • B : controllerEnums.h
      • @@ -138,6 +77,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • BASICCDB_t : masstorage.h
      • +
      • BELKIN_F8T065BF_PID +: BTD.h +
      • +
      • BELKIN_F8T065BF_VID +: BTD.h +
      • BGRAB0 : macros.h
      • @@ -168,12 +113,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • BLACK : controllerEnums.h
      • -
      • BLUE -: controllerEnums.h -
      • Blue : controllerEnums.h
      • +
      • BLUE +: controllerEnums.h +
      • Bluetooth : PS3Enums.h
      • @@ -729,7 +674,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_c.html b/globals_c.html index c0d3d6ee..1fe98462 100644 --- a/globals_c.html +++ b/globals_c.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - c -

      +

      - c -

      • C : controllerEnums.h
      • @@ -280,7 +219,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS3Enums.h
      • CHECK_PID -: cdcprolific.h +: cdcprolific.h
      • CIRCLE : controllerEnums.h @@ -324,7 +263,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_d.html b/globals_d.html index e80befea..6ecc73c3 100644 --- a/globals_d.html +++ b/globals_d.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - d -

      +

      - d -

      • D_PrintBin() : printhex.h
      • @@ -228,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs.html b/globals_defs.html index c0031b25..935d224d 100644 --- a/globals_defs.html +++ b/globals_defs.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - _ -

      +

      - _ -

      • __BYTE_GRABBING_DEFINED__ : macros.h
      • @@ -142,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_a.html b/globals_defs_a.html index 0d9811e3..aa6654b4 100644 --- a/globals_defs_a.html +++ b/globals_defs_a.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - a -

      +

      - a -

      • ACCESSORY_STRING_DESCRIPTION : adk.h
      • @@ -184,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_b.html b/globals_defs_b.html index c4e2767a..24cefd52 100644 --- a/globals_defs_b.html +++ b/globals_defs_b.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - b -

      +

      - b -

        +
      • BELKIN_F8T065BF_PID +: BTD.h +
      • +
      • BELKIN_F8T065BF_VID +: BTD.h +
      • BGRAB0 : macros.h
      • @@ -691,7 +638,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_c.html b/globals_defs_c.html index f24730dd..2bef55f3 100644 --- a/globals_defs_c.html +++ b/globals_defs_c.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - c -

      +

      - c -

      • CALL_STATE_CHANGE : cdcacm.h
      • @@ -257,7 +198,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : cdcacm.h
      • CHECK_PID -: cdcprolific.h +: cdcprolific.h
      • CLR_E : max_LCD.cpp @@ -292,7 +233,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_d.html b/globals_defs_d.html index cfcdf8dd..b026213d 100644 --- a/globals_defs_d.html +++ b/globals_defs_d.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - d -

      +

      - d -

      • DATA_SIZE_0 : usbhid.h
      • @@ -181,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_e.html b/globals_defs_e.html index ac2c2f81..d1afdad7 100644 --- a/globals_defs_e.html +++ b/globals_defs_e.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - e -

      +

      - e -

      • E : max_LCD.cpp
      • @@ -137,11 +78,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : usb_ch9.h
      • EP_MAXPKTSIZE -: XBOXRECV.h -, XBOXUSB.h +: XBOXUSB.h , PS3USB.h , XBOXOLD.h -, XBOXONE.h +, XBOXRECV.h
      • epMUL : hidboot.h @@ -227,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_f.html b/globals_defs_f.html index 5b1e6938..e1b0b839 100644 --- a/globals_defs_f.html +++ b/globals_defs_f.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - f -

      +

      - f -

      • F : version_helper.h
      • @@ -268,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_g.html b/globals_defs_g.html index fef623d1..24f68711 100644 --- a/globals_defs_g.html +++ b/globals_defs_g.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - g -

      +

      - g -

      • GAMESTOP_VID : XBOXUSB.h
      • @@ -157,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_h.html b/globals_defs_h.html index 9ad60fae..7fb736f7 100644 --- a/globals_defs_h.html +++ b/globals_defs_h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - h -

      +

      - h -

      • HCI_BDADDR_STATE : BTD.h
      • @@ -443,7 +384,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_i.html b/globals_defs_i.html index ceb3d51c..dbc2c9d3 100644 --- a/globals_defs_i.html +++ b/globals_defs_i.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - i -

      +

      - i -

      • INTERNAL_DELAY : cdcprolific.h
      • @@ -142,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_j.html b/globals_defs_j.html index 2ebc593b..ae38f289 100644 --- a/globals_defs_j.html +++ b/globals_defs_j.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - j -

      +

      - j -

      • JOYTECH_VID : XBOXOLD.h , XBOXRECV.h @@ -138,7 +79,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_k.html b/globals_defs_k.html index 858f036b..36cf7319 100644 --- a/globals_defs_k.html +++ b/globals_defs_k.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - k -

      +

      - k -

      • kBreakError : cdcprolific.h
      • @@ -190,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_l.html b/globals_defs_l.html index a17ba478..15996b53 100644 --- a/globals_defs_l.html +++ b/globals_defs_l.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - l -

      +

      - l -

      • l2cap_check_flag : BTD.h
      • @@ -355,7 +296,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_m.html b/globals_defs_m.html index 92bf1308..a289af34 100644 --- a/globals_defs_m.html +++ b/globals_defs_m.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - m -

      +

      - m -

      • MADCATZ_VID : XBOXOLD.h , XBOXRECV.h @@ -297,12 +238,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • memrchr_P : version_helper.h
      • +
      • MFK_CASTUINT8T +: settings.h +
      • MIDI_EVENT_PACKET_SIZE : usbh_midi.h
      • MIDI_MAX_ENDPOINTS : usbh_midi.h
      • +
      • MIDI_MAX_SYSEX_SIZE +: usbh_midi.h +
      • MODE_FS_HOST : max3421e.h
      • @@ -324,7 +271,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_n.html b/globals_defs_n.html index 81f868d1..fd061f60 100644 --- a/globals_defs_n.html +++ b/globals_defs_n.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - n -

      +

      - n -

      • NETWORK_CONNECTION : cdcacm.h
      • @@ -163,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_o.html b/globals_defs_o.html index 841b096b..668de8a1 100644 --- a/globals_defs_o.html +++ b/globals_defs_o.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - o -

      +

      - o -

      • OTG_FEATURE_A_ALT_HNP_SUPPORT : usb_ch9.h
      • @@ -145,7 +86,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_p.html b/globals_defs_p.html index 320ddd67..c8f3e2a3 100644 --- a/globals_defs_p.html +++ b/globals_defs_p.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - p -

      +

      - p -

      • PAIR : BTD.h
      • @@ -227,12 +168,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , BTD.h
      • PS3NAVIGATION_PID -: PS3USB.h -, BTD.h +: BTD.h +, PS3USB.h
      • PS4_PID : PS4USB.h
      • +
      • PS4_PID_SLIM +: PS4USB.h +
      • PS4_VID : PS4USB.h
      • @@ -251,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_r.html b/globals_defs_r.html index 602b2524..e24be947 100644 --- a/globals_defs_r.html +++ b/globals_defs_r.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - r -

      +

      - r -

      • rCPUCTL : max3421e.h
      • @@ -229,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_s.html b/globals_defs_s.html index 1b9d12d8..d537e5be 100644 --- a/globals_defs_s.html +++ b/globals_defs_s.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - s -

      +

      - s -

      • SCSI_ASC_LBA_OUT_OF_RANGE : masstorage.h
      • @@ -362,7 +303,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : max3421e.h
      • SENDlcdPins -: max_LCD.cpp +: max_LCD.cpp
      • SERIAL_STATE : cdcacm.h @@ -472,7 +413,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_t.html b/globals_defs_t.html index dc5a04e1..f1f6faf1 100644 --- a/globals_defs_t.html +++ b/globals_defs_t.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - t -

      +

      - t -

      • TAG_GLOBAL_LOGICALMAX : usbhid.h
      • @@ -232,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_u.html b/globals_defs_u.html index c057f8f0..a7365224 100644 --- a/globals_defs_u.html +++ b/globals_defs_u.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - u -

      +

      - u -

      • UHS_HID_BOOT_KEY_CAPS_LOCK : hidboot.h
      • @@ -418,6 +359,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • USB_SETUP_TYPE_VENDOR : usb_ch9.h
      • +
      • USB_SPI +: settings.h +
      • USB_STATE_ADDRESSING : UsbCore.h
      • @@ -508,7 +452,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_v.html b/globals_defs_v.html index 21c8341e..7626b115 100644 --- a/globals_defs_v.html +++ b/globals_defs_v.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - v -

      +

      - v -

      • VALUE_BETWEEN : macros.h
      • @@ -157,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_w.html b/globals_defs_w.html index c9eaf168..2f42d815 100644 --- a/globals_defs_w.html +++ b/globals_defs_w.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - w -

      +

      - w -

      • WI_PROTOCOL_BT : BTD.h
      • @@ -163,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_x.html b/globals_defs_x.html index 256fcfea..11a785f4 100644 --- a/globals_defs_x.html +++ b/globals_defs_x.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,79 +30,22 @@
    - + - - - - + + + +
      -

    - x -

    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - e -

      +

      - e -

      • E : max_LCD.cpp
      • @@ -155,7 +94,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • EP_MAXPKTSIZE : XBOXOLD.h -, XBOXONE.h , XBOXRECV.h , XBOXUSB.h , PS3USB.h @@ -247,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_enum.html b/globals_enum.html index c0712ad2..3b37c02e 100644 --- a/globals_enum.html +++ b/globals_enum.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,51 +30,22 @@
    - + - - - + + + + - + - - - - + + + +
      -

    - a -

      +

      - a -

      • A : controllerEnums.h
      • @@ -152,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      -

      - b -

        +

        - b -

        • B : controllerEnums.h
        • @@ -183,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
        -

        - c -

          +

          - c -

          • C : controllerEnums.h
          • @@ -205,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
          -

          - d -

            +

            - d -

            • DOWN : controllerEnums.h
            • @@ -242,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
            -

            - f -

              +

              - f -

              • FASTBLINK : xboxEnums.h
              • @@ -252,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
              -

              - g -

                +

                - g -

                • Green : controllerEnums.h
                • @@ -280,7 +223,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                -

                - h -

                  +

                  - h -

                  • HatX : Wii.h
                  • @@ -296,7 +239,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                  -

                  - k -

                    +

                    - k -

                    • kXO_Idle : cdcprolific.h
                    • @@ -315,7 +258,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                    -

                    - l -

                      +

                      - l -

                      • L : controllerEnums.h
                      • @@ -376,7 +319,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                      -

                      - m -

                        +

                        - m -

                        • MINUS : controllerEnums.h
                        • @@ -416,14 +359,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                        -

                        - n -

                          +

                          - n -

                          -

                          - o -

                            +

                            - o -

                            • OFF : controllerEnums.h
                            • @@ -442,7 +385,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                            -

                            - p -

                              +

                              - p -

                              • Pitch : controllerEnums.h
                              • @@ -464,7 +407,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                              -

                              - r -

                                +

                                - r -

                                • R : controllerEnums.h
                                • @@ -516,7 +459,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                                -

                                - s -

                                  +

                                  - s -

                                  • SELECT : controllerEnums.h
                                  • @@ -541,7 +484,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                                  -

                                  - t -

                                    +

                                    - t -

                                    • T : controllerEnums.h
                                    • @@ -572,7 +515,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                                    -

                                    - u -

                                      +

                                      - u -

                                      • unknown : cdcprolific.h
                                      • @@ -585,7 +528,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                                      -

                                      - v -

                                        +

                                        - v -

                                        • vbus_off : usbhost.h
                                        • @@ -595,7 +538,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                                        -

                                        - w -

                                          +

                                          - w -

                                          • WHITE : controllerEnums.h
                                          • @@ -605,7 +548,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                                          -

                                          - x -

                                            +

                                            - x -

                                            • X : controllerEnums.h
                                            • @@ -615,20 +558,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
                                            -

                                            - y -

                                              +

                                              - y -

                                              -

                                              - z -

                                                +

                                                - z -

                                                • Z : controllerEnums.h
                                                • @@ -644,7 +587,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_f.html b/globals_f.html index 2af97df3..99362218 100644 --- a/globals_f.html +++ b/globals_f.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - f -

      +

      - f -

      • F : version_helper.h
      • @@ -276,7 +215,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_func.html b/globals_func.html index 1c2c4d9b..4a0ce664 100644 --- a/globals_func.html +++ b/globals_func.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,51 +30,22 @@
    - + - - - + + + + - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - g -

      +

      - g -

      • GAMESTOP_VID : XBOXUSB.h
      • @@ -183,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_h.html b/globals_h.html index c1f4ca31..b5f7909a 100644 --- a/globals_h.html +++ b/globals_h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - h -

      +

      - h -

      • HatEnum : Wii.h
      • @@ -460,7 +399,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_i.html b/globals_i.html index 08e29c18..686c1515 100644 --- a/globals_i.html +++ b/globals_i.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - i -

      +

      - i -

      • INTERNAL_DELAY : cdcprolific.h
      • @@ -144,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_j.html b/globals_j.html index 184df601..8cb9995f 100644 --- a/globals_j.html +++ b/globals_j.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - j -

      +

      - j -

      • JOYTECH_VID : XBOXOLD.h , XBOXRECV.h @@ -140,7 +79,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_k.html b/globals_k.html index 9084689a..224fead9 100644 --- a/globals_k.html +++ b/globals_k.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - k -

      +

      - k -

      • kBreakError : cdcprolific.h
      • @@ -207,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_l.html b/globals_l.html index ce6cc461..7f774dff 100644 --- a/globals_l.html +++ b/globals_l.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - l -

      +

      - l -

      • L : controllerEnums.h
      • @@ -420,7 +359,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_m.html b/globals_m.html index 122feb83..c6ef1805 100644 --- a/globals_m.html +++ b/globals_m.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - m -

      +

      - m -

      • MADCATZ_VID : XBOXOLD.h , XBOXRECV.h @@ -302,12 +241,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • memrchr_P : version_helper.h
      • +
      • MFK_CASTUINT8T +: settings.h +
      • MIDI_EVENT_PACKET_SIZE : usbh_midi.h
      • MIDI_MAX_ENDPOINTS : usbh_midi.h
      • +
      • MIDI_MAX_SYSEX_SIZE +: usbh_midi.h +
      • MINUS : controllerEnums.h
      • @@ -365,7 +310,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_n.html b/globals_n.html index b5be5f00..aa0a3cbf 100644 --- a/globals_n.html +++ b/globals_n.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - n -

      +

      - n -

      • NETWORK_CONNECTION : cdcacm.h
      • @@ -168,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_o.html b/globals_o.html index 5d58b012..a1765041 100644 --- a/globals_o.html +++ b/globals_o.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - o -

      +

      - o -

      • OFF : controllerEnums.h
      • @@ -162,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_p.html b/globals_p.html index fb7d8b9b..93b77838 100644 --- a/globals_p.html +++ b/globals_p.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - p -

      +

      - p -

      • PAIR : BTD.h
      • @@ -278,6 +217,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • PS4_PID : PS4USB.h
      • +
      • PS4_PID_SLIM +: PS4USB.h +
      • PS4_VID : PS4USB.h
      • @@ -2885,7 +2827,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_r.html b/globals_r.html index 9700cd0a..95c3f089 100644 --- a/globals_r.html +++ b/globals_r.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - r -

      +

      - r -

      • R : controllerEnums.h
      • @@ -285,7 +224,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_s.html b/globals_s.html index ed148594..5acbe437 100644 --- a/globals_s.html +++ b/globals_s.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - s -

      +

      - s -

      • SCSI_ASC_LBA_OUT_OF_RANGE : masstorage.h
      • @@ -367,7 +306,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : controllerEnums.h
      • SENDlcdPins -: max_LCD.cpp +: max_LCD.cpp
      • SensorEnum : controllerEnums.h @@ -504,7 +443,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_t.html b/globals_t.html index 07692099..c79a2b4a 100644 --- a/globals_t.html +++ b/globals_t.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - t -

      +

      - t -

      • T : controllerEnums.h
      • @@ -270,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_type.html b/globals_type.html index abec4bc2..39601046 100644 --- a/globals_type.html +++ b/globals_type.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,51 +30,22 @@
    - + - - - + + + + - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - u -

      +

      - u -

      • UHS_HID_BOOT_KEY_CAPS_LOCK : hidboot.h
      • @@ -429,6 +368,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      • USB_SETUP_TYPE_VENDOR : usb_ch9.h
      • +
      • USB_SPI +: settings.h +
      • USB_STATE_ADDRESSING : UsbCore.h
      • @@ -487,10 +429,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : UsbCore.h
      • UsbDEBUGlvl -: message.h -, sink_parser.h -, hexdump.h +: sink_parser.h , message.cpp +, hexdump.h +, message.h
      • UsbDeviceHandleFunc : address.h @@ -528,7 +470,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_v.html b/globals_v.html index ea4c70f9..0f268619 100644 --- a/globals_v.html +++ b/globals_v.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - v -

      +

      - v -

      • VALUE_BETWEEN : macros.h
      • @@ -168,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars.html b/globals_vars.html index dee4ead6..899f0854 100644 --- a/globals_vars.html +++ b/globals_vars.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,60 +30,22 @@
    - + - - - - + + + +
      -

    - p -

      +

      - p -

      • PS3_ANALOG_BUTTONS : PS3Enums.h
      • @@ -2703,7 +2663,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_r.html b/globals_vars_r.html index dd11cf81..eb7692fc 100644 --- a/globals_vars_r.html +++ b/globals_vars_r.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,60 +30,22 @@
    - + - - - - + + + +
      -

    - r -

      +

      - r -

      • rfcomm_crc_table : SPP.cpp
      • @@ -114,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_u.html b/globals_vars_u.html index 0e912ac4..ab5ba505 100644 --- a/globals_vars_u.html +++ b/globals_vars_u.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,60 +30,22 @@
    - + - - - - + + + +
      -

    - u -

      +

      - u -

      • UsbDEBUGlvl : hexdump.h , sink_parser.h @@ -117,7 +77,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_w.html b/globals_vars_w.html index c9085b94..bff44c34 100644 --- a/globals_vars_w.html +++ b/globals_vars_w.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,60 +30,22 @@
    - + - - - - + + + +
      -

    - w -

      +

      - w -

      • WII_BUTTONS : Wii.cpp
      • @@ -120,7 +80,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_x.html b/globals_vars_x.html index 07ea6983..82f0c721 100644 --- a/globals_vars_x.html +++ b/globals_vars_x.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,60 +30,22 @@
    - + - - - - + + + +
      -

    - x -

      +

      - x -

      • XBOX_BUTTONS : xboxEnums.h
      • @@ -120,7 +80,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_w.html b/globals_w.html index edc83b26..70e107ee 100644 --- a/globals_w.html +++ b/globals_w.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - w -

      +

      - w -

      • WHITE : controllerEnums.h
      • @@ -180,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_x.html b/globals_x.html index 077848dd..8af82667 100644 --- a/globals_x.html +++ b/globals_x.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@
    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - x -

    - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - y -

    diff --git a/globals_z.html b/globals_z.html index ed5c1026..e4f2324b 100644 --- a/globals_z.html +++ b/globals_z.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: File Members @@ -11,9 +12,6 @@ - @@ -32,81 +30,22 @@ - + - - - - + + + +
    Here is a list of all file members with links to the files they belong to:
    -

    - z -

      +

      - z -

      • Z : controllerEnums.h
      • @@ -141,7 +80,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/graph_legend.html b/graph_legend.html index 75dbee35..51981139 100644 --- a/graph_legend.html +++ b/graph_legend.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Graph Legend @@ -11,9 +12,6 @@ - @@ -32,34 +30,22 @@
    - + - + + + +

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

    -

    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:

    +

    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:

    - +

    The boxes in the above graph have the following meaning:

      @@ -105,16 +91,16 @@ A dark green arrow is used for protected inheritance.
    • A dark red arrow is used for private inheritance.
    • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
    • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
    • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
    • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
    diff --git a/graph_legend.png b/graph_legend.png index c13c9d07a8e5c3f4e4713320c11e22e1ccb63d93..881e40f9c0a2ade46e1af7426db5583529540416 100644 GIT binary patch literal 25694 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 ALjV8( literal 26211 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 O^G;G;qD;)d|9=3)OJ9-z diff --git a/hexdump_8h.html b/hexdump_8h.html index baf46ba3..0a360793 100644 --- a/hexdump_8h.html +++ b/hexdump_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hexdump.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Variable Documentation

    - + +

    ◆ UsbDEBUGlvl

    +
    @@ -117,7 +99,7 @@ Variables
    -

    Definition at line 22 of file message.cpp.

    +

    Definition at line 29 of file message.cpp.

    @@ -126,7 +108,7 @@ Variables diff --git a/hexdump_8h_source.html b/hexdump_8h_source.html index 072ffd28..8a272661 100644 --- a/hexdump_8h_source.html +++ b/hexdump_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hexdump.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    hexdump.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(_usb_h_) || defined(__HEXDUMP_H__)
    18 #error "Never include hexdump.h directly; include Usb.h instead"
    19 #else
    20 #define __HEXDUMP_H__
    21 
    22 extern int UsbDEBUGlvl;
    23 
    24 template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    25 class HexDumper : public BASE_CLASS {
    26  uint8_t byteCount;
    27  OFFSET_TYPE byteTotal;
    28 
    29 public:
    30 
    31  HexDumper() : byteCount(0), byteTotal(0) {
    32  };
    33 
    34  void Initialize() {
    35  byteCount = 0;
    36  byteTotal = 0;
    37  };
    38 
    39  void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset);
    40 };
    41 
    42 template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    43 void HexDumper<BASE_CLASS, LEN_TYPE, OFFSET_TYPE>::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset) {
    44  if(UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug.
    45  for(LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) {
    46  if(!byteCount) {
    47  PrintHex<OFFSET_TYPE > (byteTotal, 0x80);
    48  E_Notify(PSTR(": "), 0x80);
    49  }
    50  PrintHex<uint8_t > (pbuf[j], 0x80);
    51  E_Notify(PSTR(" "), 0x80);
    52 
    53  if(byteCount == 15) {
    54  E_Notify(PSTR("\r\n"), 0x80);
    55  byteCount = 0xFF;
    56  }
    57  }
    58  }
    59 }
    60 
    61 #endif // __HEXDUMP_H__
    -
    int UsbDEBUGlvl
    Definition: message.cpp:22
    -
    void Initialize()
    Definition: hexdump.h:34
    -
    #define PSTR(str)
    -
    void E_Notify(char const *msg, int lvl)
    Definition: message.cpp:34
    -
    HexDumper()
    Definition: hexdump.h:31
    -
    void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)
    Definition: hexdump.h:43
    +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)
    +
    void E_Notify(char const *msg, int lvl)
    Definition: message.cpp:41
    +
    HexDumper()
    Definition: hexdump.h:39
    +
    void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)
    Definition: hexdump.h:51
    diff --git a/hidboot_8cpp.html b/hidboot_8cpp.html index 6edc7e57..99161609 100644 --- a/hidboot_8cpp.html +++ b/hidboot_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidboot.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/hidboot_8cpp__incl.md5 b/hidboot_8cpp__incl.md5 index 8925fe78..de6cd8aa 100644 --- a/hidboot_8cpp__incl.md5 +++ b/hidboot_8cpp__incl.md5 @@ -1 +1 @@ -fd9ffd5fbb0339f5a30f2cdb6ce0f03f \ No newline at end of file +b569b0654ae2e389bfc498a0f61c5075 \ No newline at end of file diff --git a/hidboot_8cpp__incl.png b/hidboot_8cpp__incl.png index 71f68b5d79c481aa5de178a6b4caae43f1676a2f..38f3dee94899015a741914c28cfe3d0e7ae0724e 100644 GIT binary patch literal 11683 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 literal 12269 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 diff --git a/hidboot_8cpp_source.html b/hidboot_8cpp_source.html index 67a6f463..588bbfe2 100644 --- a/hidboot_8cpp_source.html +++ b/hidboot_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidboot.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    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, bool is_rpt_id, uint8_t len, 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, uint8_t len, 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 = {'/', '*', '-', '+', 0x13};
    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 (0x13);
    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 = {'/', '*', '-', '+', 0x13};
    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 (0x13);
    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 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:28
    +
    #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
    @@ -120,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidboot_8h.html b/hidboot_8h.html index f4b3703c..b9694f7b 100644 --- a/hidboot_8h.html +++ b/hidboot_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidboot.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Macro Definition Documentation

    - + +

    ◆ UHS_HID_BOOT_KEY_ZERO

    +
    @@ -171,11 +153,13 @@ Macros
    -

    Definition at line 22 of file hidboot.h.

    +

    Definition at line 22 of file hidboot.h.

    - + +

    ◆ UHS_HID_BOOT_KEY_ENTER

    +
    @@ -185,11 +169,13 @@ Macros
    -

    Definition at line 23 of file hidboot.h.

    +

    Definition at line 23 of file hidboot.h.

    - + +

    ◆ UHS_HID_BOOT_KEY_SPACE

    +
    @@ -199,11 +185,13 @@ Macros
    -

    Definition at line 24 of file hidboot.h.

    +

    Definition at line 24 of file hidboot.h.

    - + +

    ◆ UHS_HID_BOOT_KEY_CAPS_LOCK

    +
    @@ -213,11 +201,13 @@ Macros
    -

    Definition at line 25 of file hidboot.h.

    +

    Definition at line 25 of file hidboot.h.

    - + +

    ◆ UHS_HID_BOOT_KEY_SCROLL_LOCK

    +
    @@ -227,11 +217,13 @@ Macros
    -

    Definition at line 26 of file hidboot.h.

    +

    Definition at line 26 of file hidboot.h.

    - + +

    ◆ UHS_HID_BOOT_KEY_NUM_LOCK

    +
    @@ -241,11 +233,13 @@ Macros
    -

    Definition at line 27 of file hidboot.h.

    +

    Definition at line 27 of file hidboot.h.

    - + +

    ◆ UHS_HID_BOOT_KEY_ZERO2

    +
    @@ -255,11 +249,13 @@ Macros
    -

    Definition at line 28 of file hidboot.h.

    +

    Definition at line 28 of file hidboot.h.

    - + +

    ◆ UHS_HID_BOOT_KEY_PERIOD

    +
    @@ -269,11 +265,13 @@ Macros
    -

    Definition at line 29 of file hidboot.h.

    +

    Definition at line 29 of file hidboot.h.

    - + +

    ◆ bitsEndpoints

    +
    @@ -287,11 +285,13 @@ Macros
    -

    Definition at line 32 of file hidboot.h.

    +

    Definition at line 32 of file hidboot.h.

    - + +

    ◆ totalEndpoints

    +
    @@ -305,11 +305,13 @@ Macros
    -

    Definition at line 33 of file hidboot.h.

    +

    Definition at line 33 of file hidboot.h.

    - + +

    ◆ epMUL

    +
    @@ -323,7 +325,7 @@ Macros
    -

    Definition at line 34 of file hidboot.h.

    +

    Definition at line 34 of file hidboot.h.

    @@ -332,7 +334,7 @@ Macros diff --git a/hidboot_8h__dep__incl.md5 b/hidboot_8h__dep__incl.md5 index 4ec250d7..12452ce7 100644 --- a/hidboot_8h__dep__incl.md5 +++ b/hidboot_8h__dep__incl.md5 @@ -1 +1 @@ -eb017a1dbabb14c916b6c609ad0b5f09 \ No newline at end of file +11192c88997fec3c341a31aaf71e25e4 \ No newline at end of file diff --git a/hidboot_8h__dep__incl.png b/hidboot_8h__dep__incl.png index 47cdcb82ba71dad278d2d054cb2e12f096334991..377462e06278d1343af74619b5b4935716d6afc0 100644 GIT binary patch literal 10698 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 BE7t%3 diff --git a/hidboot_8h__incl.md5 b/hidboot_8h__incl.md5 index 0cf8d499..99907aea 100644 --- a/hidboot_8h__incl.md5 +++ b/hidboot_8h__incl.md5 @@ -1 +1 @@ -8dee61608a93687c155ca4b339d92198 \ No newline at end of file +83d1d2f9fe90e118568a3d6b3086c8da \ No newline at end of file diff --git a/hidboot_8h__incl.png b/hidboot_8h__incl.png index 264ef2b1a4b8340f1b56ad0d68f93c2a0f1909eb..67d65ee811dcff8d7aa70f90876ebd186ccb51ad 100644 GIT binary patch literal 9144 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 QTNjM1q~e#F&qjg&15Ya#Hvj+t diff --git a/hidboot_8h_source.html b/hidboot_8h_source.html index 595fe7e2..41d9b092 100644 --- a/hidboot_8h_source.html +++ b/hidboot_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidboot.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    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) {
    64  };
    65 
    66  virtual void OnLeftButtonUp(MOUSEINFO *mi) {
    67  };
    68 
    69  virtual void OnLeftButtonDown(MOUSEINFO *mi) {
    70  };
    71 
    72  virtual void OnRightButtonUp(MOUSEINFO *mi) {
    73  };
    74 
    75  virtual void OnRightButtonDown(MOUSEINFO *mi) {
    76  };
    77 
    78  virtual void OnMiddleButtonUp(MOUSEINFO *mi) {
    79  };
    80 
    81  virtual void OnMiddleButtonDown(MOUSEINFO *mi) {
    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, uint8_t after) {
    175  };
    176 
    177  virtual void OnKeyDown(uint8_t mod, uint8_t key) {
    178  };
    179 
    180  virtual void OnKeyUp(uint8_t mod, uint8_t key) {
    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  uint8_t rcode;
    290  UsbDevice *p = NULL;
    291  EpInfo *oldep_ptr = NULL;
    292  uint8_t len = 0;
    293  //uint16_t cd_len = 0;
    294 
    295  uint8_t num_of_conf; // number of configurations
    296  //uint8_t num_of_intf; // number of interfaces
    297 
    298  AddressPool &addrPool = pUsb->GetAddressPool();
    299 
    300  USBTRACE("BM Init\r\n");
    301  //USBTRACE2("totalEndpoints:", (uint8_t) (totalEndpoints(BOOT_PROTOCOL)));
    302  //USBTRACE2("epMUL:", epMUL(BOOT_PROTOCOL));
    303 
    304  if(bAddress)
    306 
    307  bInterval = 0;
    308  // Get pointer to pseudo device with address 0 assigned
    309  p = addrPool.GetUsbDevicePtr(0);
    310 
    311  if(!p)
    313 
    314  if(!p->epinfo) {
    315  USBTRACE("epinfo\r\n");
    317  }
    318 
    319  // Save old pointer to EP_RECORD of address 0
    320  oldep_ptr = p->epinfo;
    321 
    322  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    323  p->epinfo = epInfo;
    324 
    325  p->lowspeed = lowspeed;
    326 
    327  // Get device descriptor
    328  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    329 
    330  if(!rcode)
    331  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    332 
    333  if(rcode) {
    334  // Restore p->epinfo
    335  p->epinfo = oldep_ptr;
    336 
    337  goto FailGetDevDescr;
    338  }
    339 
    340  // Restore p->epinfo
    341  p->epinfo = oldep_ptr;
    342 
    343  // Allocate new address according to device class
    344  bAddress = addrPool.AllocAddress(parent, false, port);
    345 
    346  if(!bAddress)
    348 
    349  // Extract Max Packet Size from the device descriptor
    350  epInfo[0].maxPktSize = (uint8_t)((USB_DEVICE_DESCRIPTOR*)buf)->bMaxPacketSize0;
    351 
    352  // Assign new address to the device
    353  rcode = pUsb->setAddr(0, 0, bAddress);
    354 
    355  if(rcode) {
    356  p->lowspeed = false;
    357  addrPool.FreeAddress(bAddress);
    358  bAddress = 0;
    359  USBTRACE2("setAddr:", rcode);
    360  return rcode;
    361  }
    362  //delay(2); //per USB 2.0 sect.9.2.6.3
    363 
    364  USBTRACE2("Addr:", bAddress);
    365 
    366  p->lowspeed = false;
    367 
    368  p = addrPool.GetUsbDevicePtr(bAddress);
    369 
    370  if(!p)
    372 
    373  p->lowspeed = lowspeed;
    374 
    375  if(len)
    376  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    377 
    378  if(rcode)
    379  goto FailGetDevDescr;
    380 
    381  num_of_conf = ((USB_DEVICE_DESCRIPTOR*)buf)->bNumConfigurations;
    382 
    383  USBTRACE2("NC:", num_of_conf);
    384 
    385  // GCC will optimize unused stuff away.
    387  USBTRACE("HID_PROTOCOL_KEYBOARD AND MOUSE\r\n");
    392  CP_MASK_COMPARE_ALL > confDescrParser(this);
    393  confDescrParser.SetOR(); // Use the OR variant.
    394  for(uint8_t i = 0; i < num_of_conf; i++) {
    395  pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    396  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    397  break;
    398  }
    399  } else {
    400  // GCC will optimize unused stuff away.
    401  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_KEYBOARD) {
    402  USBTRACE("HID_PROTOCOL_KEYBOARD\r\n");
    403  for(uint8_t i = 0; i < num_of_conf; i++) {
    408  CP_MASK_COMPARE_ALL> confDescrParserA(this);
    409 
    410  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserA);
    411  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    412  break;
    413  }
    414  }
    415 
    416  // GCC will optimize unused stuff away.
    417  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_MOUSE) {
    418  USBTRACE("HID_PROTOCOL_MOUSE\r\n");
    419  for(uint8_t i = 0; i < num_of_conf; i++) {
    424  CP_MASK_COMPARE_ALL> confDescrParserB(this);
    425 
    426  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserB);
    427  if(bNumEP == ((uint8_t)(totalEndpoints(BOOT_PROTOCOL))))
    428  break;
    429 
    430  }
    431  }
    432  }
    433  USBTRACE2("bNumEP:", bNumEP);
    434 
    435  if(bNumEP != (uint8_t)(totalEndpoints(BOOT_PROTOCOL))) {
    437  goto Fail;
    438  }
    439 
    440  // Assign epInfo to epinfo pointer
    441  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    442  //USBTRACE2("setEpInfoEntry returned ", rcode);
    443  USBTRACE2("Cnf:", bConfNum);
    444 
    445  delay(1000);
    446 
    447  // Set Configuration Value
    448  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    449 
    450  if(rcode)
    451  goto FailSetConfDescr;
    452 
    453  delay(1000);
    454 
    455  USBTRACE2("bIfaceNum:", bIfaceNum);
    456  USBTRACE2("bNumIface:", bNumIface);
    457 
    458  // Yes, mouse wants SetProtocol and SetIdle too!
    459  for(uint8_t i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    460  USBTRACE2("\r\nInterface:", i);
    461  rcode = SetProtocol(i, bRptProtoEnable ? HID_RPT_PROTOCOL : USB_HID_BOOT_PROTOCOL);
    462  if(rcode) goto FailSetProtocol;
    463  USBTRACE2("PROTOCOL SET HID_BOOT rcode:", rcode);
    464  rcode = SetIdle(i, 0, 0);
    465  USBTRACE2("SET_IDLE rcode:", rcode);
    466  // if(rcode) goto FailSetIdle; This can fail.
    467  // Get the RPIPE and just throw it away.
    469  rcode = GetReportDescr(i, &sink);
    470  USBTRACE2("RPIPE rcode:", rcode);
    471  }
    472 
    473  // Get RPIPE and throw it away.
    474 
    475  if(BOOT_PROTOCOL & USB_HID_PROTOCOL_KEYBOARD) {
    476  // Wake keyboard interface by twinkling up to 5 LEDs that are in the spec.
    477  // kana, compose, scroll, caps, num
    478  rcode = 0x20; // Reuse rcode.
    479  while(rcode) {
    480  rcode >>= 1;
    481  // Ignore any error returned, we don't care if LED is not supported
    482  SetReport(0, 0, 2, 0, 1, &rcode); // Eventually becomes zero (All off)
    483  delay(25);
    484  }
    485  }
    486  USBTRACE("BM configured\r\n");
    487 
    488  bPollEnable = true;
    489  return 0;
    490 
    491 FailGetDevDescr:
    492 #ifdef DEBUG_USB_HOST
    494  goto Fail;
    495 #endif
    496 
    497  //FailSetDevTblEntry:
    498  //#ifdef DEBUG_USB_HOST
    499  // NotifyFailSetDevTblEntry();
    500  // goto Fail;
    501  //#endif
    502 
    503  //FailGetConfDescr:
    504  //#ifdef DEBUG_USB_HOST
    505  // NotifyFailGetConfDescr();
    506  // goto Fail;
    507  //#endif
    508 
    509 FailSetConfDescr:
    510 #ifdef DEBUG_USB_HOST
    512  goto Fail;
    513 #endif
    514 
    515 FailSetProtocol:
    516 #ifdef DEBUG_USB_HOST
    517  USBTRACE("SetProto:");
    518  goto Fail;
    519 #endif
    520 
    521  //FailSetIdle:
    522  //#ifdef DEBUG_USB_HOST
    523  // USBTRACE("SetIdle:");
    524  //#endif
    525 
    526 Fail:
    527 #ifdef DEBUG_USB_HOST
    528  NotifyFail(rcode);
    529 #endif
    530  Release();
    531 
    532  return rcode;
    533 }
    534 
    535 template <const uint8_t BOOT_PROTOCOL>
    536 void HIDBoot<BOOT_PROTOCOL>::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    537 
    538  // If the first configuration satisfies, the others are not considered.
    539  //if(bNumEP > 1 && conf != bConfNum)
    540  if(bNumEP == totalEndpoints(BOOT_PROTOCOL))
    541  return;
    542 
    543  bConfNum = conf;
    544  bIfaceNum = iface;
    545 
    546  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80) {
    547  if(pep->bInterval > bInterval) bInterval = pep->bInterval;
    548 
    549  // Fill in the endpoint info structure
    550  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    551  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    552  epInfo[bNumEP].bmSndToggle = 0;
    553  epInfo[bNumEP].bmRcvToggle = 0;
    554  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    555  bNumEP++;
    556 
    557  }
    558 }
    559 
    560 template <const uint8_t BOOT_PROTOCOL>
    563 
    564  bConfNum = 0;
    565  bIfaceNum = 0;
    566  bNumEP = 1;
    567  bAddress = 0;
    568  qNextPollTime = 0;
    569  bPollEnable = false;
    570 
    571  return 0;
    572 }
    573 
    574 template <const uint8_t BOOT_PROTOCOL>
    576  uint8_t rcode = 0;
    577 
    578  if(bPollEnable && ((long)(millis() - qNextPollTime) >= 0L)) {
    579 
    580  // To-do: optimize manually, using the for loop only if needed.
    581  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    582  const uint16_t const_buff_len = 16;
    583  uint8_t buf[const_buff_len];
    584 
    585  USBTRACE3("(hidboot.h) i=", i, 0x81);
    586  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].epAddr=", epInfo[epInterruptInIndex + i].epAddr, 0x81);
    587  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].maxPktSize=", epInfo[epInterruptInIndex + i].maxPktSize, 0x81);
    588  uint16_t read = (uint16_t)epInfo[epInterruptInIndex + i].maxPktSize;
    589 
    590  rcode = pUsb->inTransfer(bAddress, epInfo[epInterruptInIndex + i].epAddr, &read, buf);
    591  // SOME buggy dongles report extra keys (like sleep) using a 2 byte packet on the wrong endpoint.
    592  // Since keyboard and mice must report at least 3 bytes, we ignore the extra data.
    593  if(!rcode && read > 2) {
    594  if(pRptParser[i])
    595  pRptParser[i]->Parse((USBHID*)this, 0, (uint8_t)read, buf);
    596 #ifdef DEBUG_USB_HOST
    597  // We really don't care about errors and anomalies unless we are debugging.
    598  } else {
    599  if(rcode != hrNAK) {
    600  USBTRACE3("(hidboot.h) Poll:", rcode, 0x81);
    601  }
    602  if(!rcode && read) {
    603  USBTRACE3("(hidboot.h) Strange read count: ", read, 0x80);
    604  USBTRACE3("(hidboot.h) Interface:", i, 0x80);
    605  }
    606  }
    607 
    608  if(!rcode && read && (UsbDEBUGlvl > 0x7f)) {
    609  for(uint8_t i = 0; i < read; i++) {
    610  PrintHex<uint8_t > (buf[i], 0x80);
    611  USBTRACE1(" ", 0x80);
    612  }
    613  if(read)
    614  USBTRACE1("\r\n", 0x80);
    615 #endif
    616  }
    617 
    618  }
    619  qNextPollTime = millis() + bInterval;
    620  }
    621  return rcode;
    622 }
    623 
    624 #endif // __HIDBOOTMOUSE_H__
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:771
    - -
    uint8_t bmRcvToggle
    Definition: address.h:41
    +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__
    - + -
    #define CP_MASK_COMPARE_ALL
    +
    #define CP_MASK_COMPARE_ALL
    Definition: usbhid.h:143
    USB * pUsb
    Definition: usbhid.h:145
    -
    EpInfo * epinfo
    Definition: address.h:76
    +
    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:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +
    bool lowspeed
    Definition: address.h:86
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:94
    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:42
    -
    uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)
    Definition: usbhid.cpp:34
    -
    uint8_t Poll()
    Definition: hidboot.h:575
    - +
    uint8_t Poll()
    Definition: hidboot.h:578
    + +
    uint8_t bmLeftCtrl
    Definition: hidboot.h:99
    - - -
    #define NotifyFail(...)
    Definition: message.h:55
    + + +
    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:810
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: hidboot.h:536
    +
    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:50
    -
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    +
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:57
    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:22
    -
    #define USB_CLASS_HID
    Definition: UsbCore.h:59
    +
    int UsbDEBUGlvl
    Definition: message.cpp:29
    +
    uint8_t bmLeftGUI
    Definition: hidboot.h:102
    +
    #define USB_CLASS_HID
    Definition: UsbCore.h:70
    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:77
    -
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:801
    +
    #define USBTRACE2(s, r)
    Definition: macros.h:84
    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:33
    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:27
    +
    #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:32
    +
    Definition: address.h:39
    virtual void OnMouseMove(MOUSEINFO *mi)
    Definition: hidboot.h:63
    -
    #define hrNAK
    Definition: max3421e.h:211
    +
    #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: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
    - - -
    static const uint8_t epInterruptInIndex
    Definition: usbhid.h:149
    + + +
    uint8_t bmRightCtrl
    Definition: hidboot.h:90
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    -
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:144
    +
    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 bmSndToggle
    Definition: address.h:40
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    +
    uint8_t bmScrollLock
    Definition: hidboot.h:115
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:96
    #define USB_HID_PROTOCOL_KEYBOARD
    Definition: usbhid.h:93
    #define totalEndpoints(p)
    Definition: hidboot.h:33
    -
    #define USBTRACE1(s, l)
    Definition: macros.h:76
    -
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    -
    uint8_t SetProtocol(uint8_t iface, uint8_t protocol)
    Definition: usbhid.cpp:66
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    +
    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
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:93
    +
    union KeyboardReportParser::@17 prevState
    int8_t dX
    Definition: hidboot.h:47
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:88
    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:561
    +
    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:206
    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
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    +
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:119
    +
    union KeyboardReportParser::@18 kbdLockingKeys
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:91
    +
    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 maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    +
    uint8_t bmRightAlt
    Definition: hidboot.h:92
    int8_t dY
    Definition: hidboot.h:48
    -
    Definition: UsbCore.h:197
    +
    Definition: UsbCore.h:208
    +
    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
    -
    #define USBTRACE3(s, r, l)
    Definition: macros.h:78
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    -
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    -
    virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
    +
    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:228
    +
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:60
    +
    uint8_t bmCompose
    Definition: hidboot.h:116
    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:75
    -
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:766
    - +
    #define USBTRACE(s)
    Definition: macros.h:82
    +
    uint8_t OemToAscii(uint8_t mod, uint8_t key)
    Definition: hidboot.cpp:165
    +
    diff --git a/hidcomposite_8cpp.html b/hidcomposite_8cpp.html index 100b9445..93bcb9a6 100644 --- a/hidcomposite_8cpp.html +++ b/hidcomposite_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidcomposite.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/hidcomposite_8cpp__incl.md5 b/hidcomposite_8cpp__incl.md5 index 26f07e87..d41de51b 100644 --- a/hidcomposite_8cpp__incl.md5 +++ b/hidcomposite_8cpp__incl.md5 @@ -1 +1 @@ -5165af043119ae7e1520852120f4b3a4 \ No newline at end of file +cfde20a929775a9aa01710373822c470 \ No newline at end of file diff --git a/hidcomposite_8cpp__incl.png b/hidcomposite_8cpp__incl.png index 3be31f5a3466ad9e57f9fc2c5635158f701a04f0..349783390ff6a6f261d9b3ad0892b55635aea32e 100644 GIT binary patch literal 12470 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 DB*)`m literal 12993 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 diff --git a/hidcomposite_8cpp_source.html b/hidcomposite_8cpp_source.html index bfc6610b..06c8baad 100644 --- a/hidcomposite_8cpp_source.html +++ b/hidcomposite_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidcomposite.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    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 
    316  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
    317  index = epInterruptInIndex;
    318  else
    319  index = epInterruptOutIndex;
    320 
    321  if(!SelectInterface(iface, proto))
    322  index = 0;
    323 
    324  if(index) {
    325  // Fill in the endpoint info structure
    326  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    327  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    328  epInfo[bNumEP].bmSndToggle = 0;
    329  epInfo[bNumEP].bmRcvToggle = 0;
    330  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    331 
    332  // Fill in the endpoint index list
    333  piface->epIndex[index] = bNumEP; //(pep->bEndpointAddress & 0x0F);
    334 
    335  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
    336  pollInterval = pep->bInterval;
    337 
    338  bNumEP++;
    339  }
    340 }
    341 
    344 
    345  bNumEP = 1;
    346  bAddress = 0;
    347  qNextPollTime = 0;
    348  bPollEnable = false;
    349  return 0;
    350 }
    351 
    352 void HIDComposite::ZeroMemory(uint8_t len, uint8_t *buf) {
    353  for(uint8_t i = 0; i < len; i++)
    354  buf[i] = 0;
    355 }
    356 
    358  uint8_t rcode = 0;
    359 
    360  if(!bPollEnable)
    361  return 0;
    362 
    363  if((long)(millis() - qNextPollTime) >= 0L) {
    364  qNextPollTime = millis() + pollInterval;
    365 
    366  uint8_t buf[constBuffLen];
    367 
    368  for(uint8_t i = 0; i < bNumIface; i++) {
    369  uint8_t index = hidInterfaces[i].epIndex[epInterruptInIndex];
    370 
    371  if (index == 0)
    372  continue;
    373 
    374  uint16_t read = (uint16_t)epInfo[index].maxPktSize;
    375 
    376  ZeroMemory(constBuffLen, buf);
    377 
    378  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[index].epAddr, &read, buf);
    379 
    380  if(rcode) {
    381  if(rcode != hrNAK)
    382  USBTRACE3("(hidcomposite.h) Poll:", rcode, 0x81);
    383  continue;
    384  }
    385 
    386  if(read == 0)
    387  continue;
    388 
    389  if(read > constBuffLen)
    390  read = constBuffLen;
    391 
    392 #if 0
    393  Notify(PSTR("\r\nBuf: "), 0x80);
    394 
    395  for(uint8_t i = 0; i < read; i++) {
    396  D_PrintHex<uint8_t > (buf[i], 0x80);
    397  Notify(PSTR(" "), 0x80);
    398  }
    399 
    400  Notify(PSTR("\r\n"), 0x80);
    401 #endif
    402  ParseHIDData(this, epInfo[index].epAddr, bHasReportId, (uint8_t)read, buf);
    403 
    404  HIDReportParser *prs = GetReportParser(((bHasReportId) ? *buf : 0));
    405 
    406  if(prs)
    407  prs->Parse(this, bHasReportId, (uint8_t)read, buf);
    408  }
    409 
    410  }
    411  return rcode;
    412 }
    413 
    414 // Send a report to interrupt out endpoint. This is NOT SetReport() request!
    415 uint8_t HIDComposite::SndRpt(uint16_t nbytes, uint8_t *dataptr) {
    416  return pUsb->outTransfer(bAddress, epInfo[epInterruptOutIndex].epAddr, nbytes, dataptr);
    417 }
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:771
    -
    uint8_t bmRcvToggle
    Definition: address.h:41
    - +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:784
    +
    uint8_t bmRcvToggle
    Definition: address.h:48
    +
    Definition: usbhid.h:143
    USB * pUsb
    Definition: usbhid.h:145
    -
    EpInfo * epinfo
    Definition: address.h:76
    -
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    -
    #define hrSTALL
    Definition: max3421e.h:212
    -
    uint8_t bmNakPower
    Definition: address.h:42
    +
    EpInfo * epinfo
    Definition: address.h:83
    +
    bool lowspeed
    Definition: address.h:86
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:94
    +
    #define hrSTALL
    Definition: max3421e.h:219
    +
    uint8_t bmNakPower
    Definition: address.h:49
    #define HID_MAX_HID_CLASS_DESCRIPTORS
    Definition: usbhid.h:24
    - - + +
    #define MAX_REPORT_PARSERS
    Definition: usbhid.h:23
    - - -
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:105
    -
    #define NotifyFail(...)
    Definition: message.h:55
    + + +
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:112
    +
    #define NotifyFail(...)
    Definition: message.h:62
    virtual uint8_t OnInitSuccessful()
    Definition: hidcomposite.h:71
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:810
    - +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:823
    +
    HIDInterface hidInterfaces[maxHidInterfaces]
    Definition: hidcomposite.h:62
    virtual void ParseHIDData(USBHID *hid, uint8_t ep, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidcomposite.h:75
    bool bHasReportId
    Definition: hidcomposite.h:64
    -
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    -
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    +
    #define USB_TRANSFER_TYPE_INTERRUPT
    Definition: usb_ch9.h:93
    +
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:57
    +
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:71
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    EpInfo epInfo[totalEndpoints]
    Definition: hidcomposite.h:61
    -
    #define CP_MASK_COMPARE_CLASS
    -
    #define USB_CLASS_HID
    Definition: UsbCore.h:59
    +
    #define CP_MASK_COMPARE_CLASS
    +
    #define USB_CLASS_HID
    Definition: UsbCore.h:70
    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
    -
    #define Notify(...)
    Definition: message.h:44
    - - -
    #define USBTRACE2(s, r)
    Definition: macros.h:77
    -
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:801
    -
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    -
    uint8_t epAddr
    Definition: address.h:33
    -
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    -
    Definition: address.h:32
    -
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:293
    -
    #define hrNAK
    Definition: max3421e.h:211
    +
    #define Notify(...)
    Definition: message.h:51
    + + +
    #define USBTRACE2(s, r)
    Definition: macros.h:84
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:814
    +
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:59
    +
    uint8_t epAddr
    Definition: address.h:40
    +
    #define USB_NAK_MAX_POWER
    Definition: address.h:34
    +
    Definition: address.h:39
    +
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:300
    +
    #define hrNAK
    Definition: max3421e.h:218
    static const uint8_t epInterruptOutIndex
    Definition: usbhid.h:150
    uint8_t bAddress
    Definition: usbhid.h:146
    -
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    -
    uint8_t Poll()
    +
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:153
    +
    #define bmUSB_TRANSFER_TYPE
    Definition: usb_ch9.h:94
    +
    uint8_t Poll()
    static const uint8_t maxEpPerInterface
    Definition: usbhid.h:153
    uint16_t PID
    Definition: hidcomposite.h:66
    virtual bool SelectInterface(uint8_t iface, uint8_t proto)=0
    - +
    HIDComposite(USB *p)
    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:144
    +
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:151
    static const uint8_t maxHidInterfaces
    Definition: usbhid.h:152
    -
    uint8_t bmSndToggle
    Definition: address.h:40
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    -
    #define PSTR(str)
    +
    uint8_t bmSndToggle
    Definition: address.h:47
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:96
    +
    #define PSTR(str)
    uint16_t VID
    Definition: hidcomposite.h:66
    -
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    +
    #define USB_NAK_NOWAIT
    Definition: address.h:36
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:93
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:88
    static const uint8_t totalEndpoints
    Definition: usbhid.h:154
    -
    uint16_t idProduct
    Definition: usb_ch9.h:107
    +
    uint16_t idProduct
    Definition: usb_ch9.h:114
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    -
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:206
    -
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:112
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    -
    uint8_t Release()
    -
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    -
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    +
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:213
    +
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:119
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:91
    +
    uint8_t Release()
    +
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    +
    uint8_t maxPktSize
    Definition: address.h:41
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:224
    -
    Definition: UsbCore.h:197
    +
    Definition: UsbCore.h:208
    bool SetReportParser(uint8_t id, HIDReportParser *prs)
    HIDReportParser * GetReportParser(uint8_t id)
    -
    #define USBTRACE3(s, r, l)
    Definition: macros.h:78
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    -
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    +
    #define USBTRACE3(s, r, l)
    Definition: macros.h:85
    +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:228
    +
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:60
    virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
    -
    #define USBTRACE(s)
    Definition: macros.h:75
    -
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:766
    -
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    - +
    #define USBTRACE(s)
    Definition: macros.h:82
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:779
    +
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:58
    +
    diff --git a/hidcomposite_8h.html b/hidcomposite_8h.html index ba070461..074111b0 100644 --- a/hidcomposite_8h.html +++ b/hidcomposite_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidcomposite.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/hidcomposite_8h__dep__incl.md5 b/hidcomposite_8h__dep__incl.md5 index fa654d6e..3a8e4864 100644 --- a/hidcomposite_8h__dep__incl.md5 +++ b/hidcomposite_8h__dep__incl.md5 @@ -1 +1 @@ -e5cefe8e10450dabf59c09b38501c8d9 \ No newline at end of file +dad990da35aed65ee7e44e6b13e7614e \ No newline at end of file diff --git a/hidcomposite_8h__dep__incl.png b/hidcomposite_8h__dep__incl.png index 2fae936e1f3ba742cf1ca9bc2147bd95a402c1f7..4dcafd5aee17cb90220f156700064e9fa6a59956 100644 GIT binary patch literal 4512 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 RQs9>hNL@u+xk1r7;(v=HoV)-4 literal 4508 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 Sf1rL{0IG_b3g6_c!u}7EzK%-( diff --git a/hidcomposite_8h__incl.md5 b/hidcomposite_8h__incl.md5 index a69ff5ec..7ee388ff 100644 --- a/hidcomposite_8h__incl.md5 +++ b/hidcomposite_8h__incl.md5 @@ -1 +1 @@ -dbac9dbca596a8ac61230cf0b5b0afd8 \ No newline at end of file +87d62da96e30b2fb1795d9cd42c0eb09 \ No newline at end of file diff --git a/hidcomposite_8h__incl.png b/hidcomposite_8h__incl.png index 9c9d6a4e7a1a5a082e2dc4f53e85929b44317433..66fa0839af03809a63aebdba29a338727d34c507 100644 GIT binary patch literal 9721 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 literal 10367 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 s#l!`4!r*b3QFIgqr?Z1*RGz - + + USB Host Shield 2.0: hidcomposite.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    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, uint8_t ep, bool is_rpt_id, uint8_t len, uint8_t *buf) {
    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
    - +
    virtual uint8_t OnInitSuccessful()
    Definition: hidcomposite.h:71
    virtual bool isReady()
    Definition: hidcomposite.h:94
    - +
    HIDInterface hidInterfaces[maxHidInterfaces]
    Definition: hidcomposite.h:62
    virtual void ParseHIDData(USBHID *hid, uint8_t ep, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidcomposite.h:75
    bool bHasReportId
    Definition: hidcomposite.h:64
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    EpInfo epInfo[totalEndpoints]
    Definition: hidcomposite.h:61
    -
    Definition: address.h:32
    +
    Definition: address.h:39
    virtual uint8_t GetAddress()
    Definition: hidcomposite.h:90
    uint8_t bAddress
    Definition: usbhid.h:146
    -
    uint8_t Poll()
    +
    uint8_t Poll()
    static const uint8_t maxEpPerInterface
    Definition: usbhid.h:153
    uint16_t PID
    Definition: hidcomposite.h:66
    virtual bool SelectInterface(uint8_t iface, uint8_t proto)=0
    @@ -116,10 +96,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const uint8_t totalEndpoints
    Definition: usbhid.h:154
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    -
    uint8_t Release()
    -
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    +
    uint8_t Release()
    +
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    -
    Definition: UsbCore.h:197
    +
    Definition: UsbCore.h:208
    bool SetReportParser(uint8_t id, HIDReportParser *prs)
    HIDReportParser * GetReportParser(uint8_t id)
    @@ -127,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidescriptorparser_8cpp.html b/hidescriptorparser_8cpp.html index 87cafdba..cd87bb58 100644 --- a/hidescriptorparser_8cpp.html +++ b/hidescriptorparser_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidescriptorparser.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/hidescriptorparser_8cpp__incl.md5 b/hidescriptorparser_8cpp__incl.md5 index d9090345..5f7a7e19 100644 --- a/hidescriptorparser_8cpp__incl.md5 +++ b/hidescriptorparser_8cpp__incl.md5 @@ -1 +1 @@ -ae4f9bfa13694d05aed5bfbb544f5ac5 \ No newline at end of file +d1d45d08b037bd2134a3e6ccd1c08310 \ No newline at end of file diff --git a/hidescriptorparser_8cpp__incl.png b/hidescriptorparser_8cpp__incl.png index 34e6e08746a6eca793b14402a72581e96cd0182b..767d89f97bc6c76a3fe9ecb09fcb71da29d1678b 100644 GIT binary patch literal 13054 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 diff --git a/hidescriptorparser_8cpp_source.html b/hidescriptorparser_8cpp_source.html index ee8aae92..0dcd1ba5 100644 --- a/hidescriptorparser_8cpp_source.html +++ b/hidescriptorparser_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidescriptorparser.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    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) {
    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, 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[]
    @@ -402,7 +382,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageALLogon[]
    Definition: hidusagestr.h:597
    static const char *const medInstrTitles1[]
    const char pstrUsageALCalendarSchedule[]
    Definition: hidusagestr.h:584
    -
    #define output_if_between(v, l, h, wa, fp, mp, el)
    Definition: macros.h:30
    +
    #define output_if_between(v, l, h, wa, fp, mp, el)
    Definition: macros.h:37
    const char pstrUsageMenu[]
    Definition: hidusagestr.h:434
    const char pstrUsageALNextTaskApplication[]
    Definition: hidusagestr.h:605
    const char pstrUsagePhoneMute[]
    Definition: hidusagestr.h:373
    @@ -573,7 +553,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageMotion[]
    Definition: hidusagestr.h:544
    const char pstrUsageACNew[]
    Definition: hidusagestr.h:642
    const char pstrUsageError[]
    Definition: hidusagestr.h:328
    -
    #define VALUE_BETWEEN(v, l, h)
    Definition: macros.h:27
    +
    #define VALUE_BETWEEN(v, l, h)
    Definition: macros.h:34
    const char pstrUsageSendCalls[]
    Definition: hidusagestr.h:307
    const char pstrUsageACMirrorVertical[]
    Definition: hidusagestr.h:699
    const char pstrUsageSystemDebuggerBreak[]
    Definition: hidusagestr.h:115
    @@ -653,7 +633,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageDigitizer[]
    Definition: hidusagestr.h:784
    const char pstrUsageDisplayData[]
    Definition: hidusagestr.h:839
    const char pstrUsageFeature[]
    Definition: hidusagestr.h:360
    -
    bool Parse(uint8_t **pp, uint16_t *pcntdn)
    Definition: parsetools.cpp:19
    +
    bool Parse(uint8_t **pp, uint16_t *pcntdn)
    Definition: parsetools.cpp:26
    const char pstrUsageFont14Segment[]
    Definition: hidusagestr.h:863
    const char pstrUsageRx[]
    Definition: hidusagestr.h:70
    @@ -689,7 +669,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageDisplayStatus[]
    Definition: hidusagestr.h:840
    const char pstrUsageACFontColor[]
    Definition: hidusagestr.h:701
    const char pstrUsageWheel[]
    Definition: hidusagestr.h:75
    -
    #define PSTR(str)
    +
    #define PSTR(str)
    const char pstrUsageACFontSelect[]
    Definition: hidusagestr.h:700
    const char pstrUsageRingSelect[]
    Definition: hidusagestr.h:372
    const char pstrUsageChannelSide[]
    Definition: hidusagestr.h:560
    @@ -710,7 +690,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageALSpellCheck[]
    Definition: hidusagestr.h:613
    static const char *const vrTitles0[]
    const char pstrUsageACPanLeft[]
    Definition: hidusagestr.h:679
    -
    void E_Notify(char const *msg, int lvl)
    Definition: message.cpp:34
    +
    void E_Notify(char const *msg, int lvl)
    Definition: message.cpp:41
    const char pstrUsageSearchMarkBackwards[]
    Definition: hidusagestr.h:509
    const char pstrUsageZoomAdjust[]
    Definition: hidusagestr.h:913
    const char pstrUsageACClose[]
    Definition: hidusagestr.h:644
    @@ -772,7 +752,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #define TYPE_MASK
    Definition: usbhid.h:27
    const char pstrUsageASCIICharacterSet[]
    Definition: hidusagestr.h:828
    const char pstrUsageExternalPowerConnected[]
    Definition: hidusagestr.h:348
    -
    uint8_t valueSize
    Definition: parsetools.h:24
    +
    uint8_t valueSize
    Definition: parsetools.h:31
    const char pstrUsagePageGenericDeviceControls[]
    Definition: hidusagestr.h:35
    const char pstrUsageBlitData[]
    Definition: hidusagestr.h:886
    const char pstrUsageForwardCalls[]
    Definition: hidusagestr.h:366
    @@ -846,7 +826,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:42
    +
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:49
    const char pstrUsageStickFaceAngle[]
    Definition: hidusagestr.h:205
    const char pstrUsageBarrelPressure[]
    Definition: hidusagestr.h:801
    const char pstrUsageACReply[]
    Definition: hidusagestr.h:762
    @@ -1022,7 +1002,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsagePageAlphaNumericDisplay[]
    Definition: hidusagestr.h:45
    const char pstrUsage5Wood[]
    Definition: hidusagestr.h:228
    const char pstrUsageDuresAlarm[]
    Definition: hidusagestr.h:545
    -
    #define USBTRACE(s)
    Definition: macros.h:75
    +
    #define USBTRACE(s)
    Definition: macros.h:82
    const char pstrUsageACUnderline[]
    Definition: hidusagestr.h:689
    const char pstrUsageALLaunchButtonConfigTool[]
    Definition: hidusagestr.h:571
    const char pstrUsageSailingSimulationDevice[]
    Definition: hidusagestr.h:135
    @@ -1078,7 +1058,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidescriptorparser_8h.html b/hidescriptorparser_8h.html index 846a4bec..936dd0e9 100644 --- a/hidescriptorparser_8h.html +++ b/hidescriptorparser_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidescriptorparser.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/hidescriptorparser_8h__dep__incl.md5 b/hidescriptorparser_8h__dep__incl.md5 index e086c781..a1421715 100644 --- a/hidescriptorparser_8h__dep__incl.md5 +++ b/hidescriptorparser_8h__dep__incl.md5 @@ -1 +1 @@ -f9ba94ed99ad5905f056e92fce988411 \ No newline at end of file +ef699e62c545d11d2c79ea503d951f57 \ No newline at end of file diff --git a/hidescriptorparser_8h__dep__incl.png b/hidescriptorparser_8h__dep__incl.png index aa5ace54a2d516487dfaeab9adf564e84c290fd2..a9e676954d31a2d992d6702f9cfbef1360726674 100644 GIT binary patch literal 5060 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 KQ>{?8iufN^O3*9- literal 5098 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

    @O3$PJ2Qu%^?EnA( diff --git a/hidescriptorparser_8h__incl.md5 b/hidescriptorparser_8h__incl.md5 index bfc34772..f713943a 100644 --- a/hidescriptorparser_8h__incl.md5 +++ b/hidescriptorparser_8h__incl.md5 @@ -1 +1 @@ -fe5843698cf13b222c52c15fd3ff6cda \ No newline at end of file +81e0e69900d2442c43e8471fdfc78594 \ No newline at end of file diff --git a/hidescriptorparser_8h__incl.png b/hidescriptorparser_8h__incl.png index d091cd85f634161d81e40222511f946028a9eb96..70923d3112e0576d903c0989ae6a08c77357d80d 100644 GIT binary patch literal 10037 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 literal 10637 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 diff --git a/hidescriptorparser_8h_source.html b/hidescriptorparser_8h_source.html index 15684222..35a127bb 100644 --- a/hidescriptorparser_8h_source.html +++ b/hidescriptorparser_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidescriptorparser.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

    - + - - + + + +
    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) {
    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[]
    +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[]
    static const char *const usagePageTitles0[]
    static const char *const telTitles1[]
    Definition: usbhid.h:143
    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[]
    @@ -107,7 +88,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)
    @@ -133,8 +114,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const genDesktopTitles2[]
    static const char *const consTitles9[]
    static const char *const telTitles4[]
    - - + +
    static const char *const aplphanumTitles0[]
    static const char *const sportsCtrlTitles2[]
    @@ -143,9 +124,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:60
    +
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:67
    static void PrintVRControlsPageUsage(uint16_t usage)
    - +
    static const char *const medInstrTitles4[]
    ReportDescParser2(uint16_t len, uint8_t *pbuf)
    static const char *const telTitles3[]
    @@ -156,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +
    MultiByteValueParser valParser
    static const char *const consTitles6[]
    @@ -174,7 +155,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:42
    +
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:49
    static const char *const gameTitles0[]
    void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
    static const char *const consTitlesA[]
    @@ -182,6 +163,7 @@ 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[]
    @@ -191,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static UsagePageFunc usagePageFunctions[]
    static const char *const consTitles8[]
    - +
    static const char *const medInstrTitles2[]
    uint8_t varBuffer[sizeof(USB_CONFIGURATION_DESCRIPTOR)]
    @@ -200,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hiduniversal_8cpp.html b/hiduniversal_8cpp.html index 81fbedc8..14a61bb3 100644 --- a/hiduniversal_8cpp.html +++ b/hiduniversal_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hiduniversal.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/hiduniversal_8cpp__incl.md5 b/hiduniversal_8cpp__incl.md5 index c3ad3b07..52c67d09 100644 --- a/hiduniversal_8cpp__incl.md5 +++ b/hiduniversal_8cpp__incl.md5 @@ -1 +1 @@ -1e66e5231753075199ca54c70eb24f20 \ No newline at end of file +61bccc66dff51679312c2d4713fe6ee2 \ No newline at end of file diff --git a/hiduniversal_8cpp__incl.png b/hiduniversal_8cpp__incl.png index 8d95269a4bc5de5bf55747b5ab8b165a3b0add1f..f35423201c2f5d224a0513a33526986de0da31f0 100644 GIT binary patch literal 12328 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 literal 12775 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 PI1m)&RAs9mW}*KJeSN6z diff --git a/hiduniversal_8cpp_source.html b/hiduniversal_8cpp_source.html index f57019a3..247b0cda 100644 --- a/hiduniversal_8cpp_source.html +++ b/hiduniversal_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hiduniversal.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    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 
    318  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
    319  index = epInterruptInIndex;
    320  else
    321  index = epInterruptOutIndex;
    322 
    323  if(index) {
    324  // Fill in the endpoint info structure
    325  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    326  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    327  epInfo[bNumEP].bmSndToggle = 0;
    328  epInfo[bNumEP].bmRcvToggle = 0;
    329  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    330 
    331  // Fill in the endpoint index list
    332  piface->epIndex[index] = bNumEP; //(pep->bEndpointAddress & 0x0F);
    333 
    334  if(pollInterval < pep->bInterval) // Set the polling interval as the largest polling interval obtained from endpoints
    335  pollInterval = pep->bInterval;
    336 
    337  bNumEP++;
    338  }
    339  //PrintEndpointDescriptor(pep);
    340 }
    341 
    344 
    345  bNumEP = 1;
    346  bAddress = 0;
    347  qNextPollTime = 0;
    348  bPollEnable = false;
    349  return 0;
    350 }
    351 
    352 bool HIDUniversal::BuffersIdentical(uint8_t len, uint8_t *buf1, uint8_t *buf2) {
    353  for(uint8_t i = 0; i < len; i++)
    354  if(buf1[i] != buf2[i])
    355  return false;
    356  return true;
    357 }
    358 
    359 void HIDUniversal::ZeroMemory(uint8_t len, uint8_t *buf) {
    360  for(uint8_t i = 0; i < len; i++)
    361  buf[i] = 0;
    362 }
    363 
    364 void HIDUniversal::SaveBuffer(uint8_t len, uint8_t *src, uint8_t *dest) {
    365  for(uint8_t i = 0; i < len; i++)
    366  dest[i] = src[i];
    367 }
    368 
    370  uint8_t rcode = 0;
    371 
    372  if(!bPollEnable)
    373  return 0;
    374 
    375  if((long)(millis() - qNextPollTime) >= 0L) {
    376  qNextPollTime = millis() + pollInterval;
    377 
    378  uint8_t buf[constBuffLen];
    379 
    380  for(uint8_t i = 0; i < bNumIface; i++) {
    381  uint8_t index = hidInterfaces[i].epIndex[epInterruptInIndex];
    382  uint16_t read = (uint16_t)epInfo[index].maxPktSize;
    383 
    384  ZeroMemory(constBuffLen, buf);
    385 
    386  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[index].epAddr, &read, buf);
    387 
    388  if(rcode) {
    389  if(rcode != hrNAK)
    390  USBTRACE3("(hiduniversal.h) Poll:", rcode, 0x81);
    391  return rcode;
    392  }
    393 
    394  if(read > constBuffLen)
    395  read = constBuffLen;
    396 
    397  bool identical = BuffersIdentical(read, buf, prevBuf);
    398 
    399  SaveBuffer(read, buf, prevBuf);
    400 
    401  if(identical)
    402  return 0;
    403 #if 0
    404  Notify(PSTR("\r\nBuf: "), 0x80);
    405 
    406  for(uint8_t i = 0; i < read; i++) {
    407  D_PrintHex<uint8_t > (buf[i], 0x80);
    408  Notify(PSTR(" "), 0x80);
    409  }
    410 
    411  Notify(PSTR("\r\n"), 0x80);
    412 #endif
    413  ParseHIDData(this, bHasReportId, (uint8_t)read, buf);
    414 
    415  HIDReportParser *prs = GetReportParser(((bHasReportId) ? *buf : 0));
    416 
    417  if(prs)
    418  prs->Parse(this, bHasReportId, (uint8_t)read, buf);
    419  }
    420  }
    421  return rcode;
    422 }
    423 
    424 // Send a report to interrupt out endpoint. This is NOT SetReport() request!
    425 uint8_t HIDUniversal::SndRpt(uint16_t nbytes, uint8_t *dataptr) {
    426  return pUsb->outTransfer(bAddress, epInfo[epInterruptOutIndex].epAddr, nbytes, dataptr);
    427 }
    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:771
    -
    uint8_t bmRcvToggle
    Definition: address.h:41
    +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:784
    +
    uint8_t bmRcvToggle
    Definition: address.h:48
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    - +
    bool bHasReportId
    Definition: hiduniversal.h:67
    Definition: usbhid.h:143
    USB * pUsb
    Definition: usbhid.h:145
    -
    EpInfo * epinfo
    Definition: address.h:76
    -
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    -
    #define hrSTALL
    Definition: max3421e.h:212
    -
    uint8_t bmNakPower
    Definition: address.h:42
    +
    EpInfo * epinfo
    Definition: address.h:83
    +
    bool lowspeed
    Definition: address.h:86
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:94
    +
    #define hrSTALL
    Definition: max3421e.h:219
    +
    uint8_t bmNakPower
    Definition: address.h:49
    #define HID_MAX_HID_CLASS_DESCRIPTORS
    Definition: usbhid.h:24
    - - + +
    #define MAX_REPORT_PARSERS
    Definition: usbhid.h:23
    - - -
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:105
    -
    #define NotifyFail(...)
    Definition: message.h:55
    + + +
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:112
    +
    #define NotifyFail(...)
    Definition: message.h:62
    virtual void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hiduniversal.h:78
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:810
    - -
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:823
    + +
    #define USB_TRANSFER_TYPE_INTERRUPT
    Definition: usb_ch9.h:93
    +
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:57
    HIDInterface hidInterfaces[maxHidInterfaces]
    Definition: hiduniversal.h:65
    -
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    -
    uint8_t Release()
    -
    #define CP_MASK_COMPARE_CLASS
    +
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:71
    +
    uint8_t Release()
    +
    #define CP_MASK_COMPARE_CLASS
    uint16_t VID
    Definition: hiduniversal.h:69
    virtual uint8_t OnInitSuccessful()
    Definition: hiduniversal.h:74
    -
    #define USB_CLASS_HID
    Definition: UsbCore.h:59
    +
    #define USB_CLASS_HID
    Definition: UsbCore.h:70
    virtual void FreeAddress(uint8_t addr)=0
    -
    uint8_t Poll()
    - +
    uint8_t Poll()
    +
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
    uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)
    Definition: usbhid.cpp:62
    -
    #define Notify(...)
    Definition: message.h:44
    - - -
    #define USBTRACE2(s, r)
    Definition: macros.h:77
    -
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:801
    -
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    -
    uint8_t epAddr
    Definition: address.h:33
    -
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    +
    #define Notify(...)
    Definition: message.h:51
    + + +
    #define USBTRACE2(s, r)
    Definition: macros.h:84
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:814
    +
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:59
    +
    uint8_t epAddr
    Definition: address.h:40
    +
    #define USB_NAK_MAX_POWER
    Definition: address.h:34
    HIDReportParser * GetReportParser(uint8_t id)
    -
    Definition: address.h:32
    -
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:293
    +
    Definition: address.h:39
    +
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:300
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    -
    #define hrNAK
    Definition: max3421e.h:211
    +
    #define hrNAK
    Definition: max3421e.h:218
    static const uint8_t epInterruptOutIndex
    Definition: usbhid.h:150
    HIDUniversal(USB *p)
    uint8_t bAddress
    Definition: usbhid.h:146
    -
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    +
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:153
    +
    #define bmUSB_TRANSFER_TYPE
    Definition: usb_ch9.h:94
    static const uint8_t maxEpPerInterface
    Definition: usbhid.h:153
    - +
    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:144
    +
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:151
    static const uint8_t maxHidInterfaces
    Definition: usbhid.h:152
    -
    uint8_t bmSndToggle
    Definition: address.h:40
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    -
    #define PSTR(str)
    +
    uint8_t bmSndToggle
    Definition: address.h:47
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:96
    +
    #define PSTR(str)
    -
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    +
    #define USB_NAK_NOWAIT
    Definition: address.h:36
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:93
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:88
    static const uint8_t totalEndpoints
    Definition: usbhid.h:154
    -
    uint16_t idProduct
    Definition: usb_ch9.h:107
    -
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    -
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:206
    -
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:112
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    -
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    +
    uint16_t idProduct
    Definition: usb_ch9.h:114
    +
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    +
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:213
    +
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:119
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:91
    +
    uint8_t maxPktSize
    Definition: address.h:41
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:224
    -
    Definition: UsbCore.h:197
    -
    #define USBTRACE3(s, r, l)
    Definition: macros.h:78
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    -
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    +
    Definition: UsbCore.h:208
    +
    #define USBTRACE3(s, r, l)
    Definition: macros.h:85
    +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:228
    +
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:60
    virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
    EpInfo epInfo[totalEndpoints]
    Definition: hiduniversal.h:64
    bool SetReportParser(uint8_t id, HIDReportParser *prs)
    -
    #define USBTRACE(s)
    Definition: macros.h:75
    -
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:766
    -
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    - +
    #define USBTRACE(s)
    Definition: macros.h:82
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:779
    +
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:58
    +
    diff --git a/hiduniversal_8h.html b/hiduniversal_8h.html index 81430d09..0c9a3b04 100644 --- a/hiduniversal_8h.html +++ b/hiduniversal_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hiduniversal.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/hiduniversal_8h__dep__incl.md5 b/hiduniversal_8h__dep__incl.md5 index 8b07bcbb..9c8e9ff2 100644 --- a/hiduniversal_8h__dep__incl.md5 +++ b/hiduniversal_8h__dep__incl.md5 @@ -1 +1 @@ -6079ba5023de3a9bc19938f024e95433 \ No newline at end of file +1a6e99a32a72ade5845249f3b21766ae \ No newline at end of file diff --git a/hiduniversal_8h__dep__incl.png b/hiduniversal_8h__dep__incl.png index 31efff417816e966018e2b03ef6a6719ff933a43..93e33afdf5bc6c6cae0b3df123aec7256ad795d4 100644 GIT binary patch literal 11879 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 Ud1m?nt#}|sSyh=@sZSyQ2lXBZK>z>% diff --git a/hiduniversal_8h_source.html b/hiduniversal_8h_source.html index 5af9897b..8b05c856 100644 --- a/hiduniversal_8h_source.html +++ b/hiduniversal_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hiduniversal.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

    - + - - + + + +
    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, bool is_rpt_id, uint8_t len, uint8_t *buf) {
    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];
    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
    virtual bool isReady()
    Definition: hiduniversal.h:97
    #define HID_MAX_HID_CLASS_DESCRIPTORS
    Definition: usbhid.h:24
    #define MAX_REPORT_PARSERS
    Definition: usbhid.h:23
    - +
    virtual void ParseHIDData(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hiduniversal.h:78
    - +
    HIDInterface hidInterfaces[maxHidInterfaces]
    Definition: hiduniversal.h:65
    -
    uint8_t Release()
    +
    uint8_t Release()
    uint16_t VID
    Definition: hiduniversal.h:69
    virtual uint8_t OnInitSuccessful()
    Definition: hiduniversal.h:74
    -
    uint8_t Poll()
    +
    uint8_t Poll()
    HIDReportParser * GetReportParser(uint8_t id)
    -
    Definition: address.h:32
    +
    Definition: address.h:39
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    HIDUniversal(USB *p)
    uint8_t bAddress
    Definition: usbhid.h:146
    @@ -114,9 +94,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const uint8_t maxHidInterfaces
    Definition: usbhid.h:152
    static const uint8_t totalEndpoints
    Definition: usbhid.h:154
    -
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    +
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    -
    Definition: UsbCore.h:197
    +
    Definition: UsbCore.h:208
    virtual uint8_t GetAddress()
    Definition: hiduniversal.h:93
    EpInfo epInfo[totalEndpoints]
    Definition: hiduniversal.h:64
    bool SetReportParser(uint8_t id, HIDReportParser *prs)
    @@ -126,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidusagestr_8h.html b/hidusagestr_8h.html index 2acdc6c5..f553e1f5 100644 --- a/hidusagestr_8h.html +++ b/hidusagestr_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidusagestr.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    - - + + - - - - - - - + + + + + + + - + @@ -1864,7 +1844,9 @@ Variables  

    Variable Documentation

    - + +

    ◆ pstrSpace

    +
    @@ -1874,11 +1856,13 @@ Variables
    -

    Definition at line 22 of file hidusagestr.h.

    +

    Definition at line 22 of file hidusagestr.h.

    - + +

    ◆ pstrCRLF

    +
    @@ -1888,11 +1872,13 @@ Variables
    -

    Definition at line 23 of file hidusagestr.h.

    +

    Definition at line 23 of file hidusagestr.h.

    - + +

    ◆ pstrSingleTab

    +
    @@ -1902,11 +1888,13 @@ Variables
    -

    Definition at line 24 of file hidusagestr.h.

    +

    Definition at line 24 of file hidusagestr.h.

    - + +

    ◆ pstrDoubleTab

    +
    @@ -1916,11 +1904,13 @@ Variables
    -

    Definition at line 25 of file hidusagestr.h.

    +

    Definition at line 25 of file hidusagestr.h.

    - + +

    ◆ pstrTripleTab

    +
    @@ -1930,11 +1920,13 @@ Variables
    -

    Definition at line 26 of file hidusagestr.h.

    +

    Definition at line 26 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageUndefined

    +
    @@ -1944,11 +1936,13 @@ Variables
    -

    Definition at line 29 of file hidusagestr.h.

    +

    Definition at line 29 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageGenericDesktopControls

    +
    @@ -1958,11 +1952,13 @@ Variables
    -

    Definition at line 30 of file hidusagestr.h.

    +

    Definition at line 30 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageSimulationControls

    +
    @@ -1972,11 +1968,13 @@ Variables
    -

    Definition at line 31 of file hidusagestr.h.

    +

    Definition at line 31 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageVRControls

    +
    @@ -1986,11 +1984,13 @@ Variables
    -

    Definition at line 32 of file hidusagestr.h.

    +

    Definition at line 32 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageSportControls

    +
    @@ -2000,11 +2000,13 @@ Variables
    -

    Definition at line 33 of file hidusagestr.h.

    +

    Definition at line 33 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageGameControls

    +
    @@ -2014,11 +2016,13 @@ Variables
    -

    Definition at line 34 of file hidusagestr.h.

    +

    Definition at line 34 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageGenericDeviceControls

    +
    @@ -2028,11 +2032,13 @@ Variables
    -

    Definition at line 35 of file hidusagestr.h.

    +

    Definition at line 35 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageKeyboardKeypad

    +
    @@ -2042,11 +2048,13 @@ Variables
    -

    Definition at line 36 of file hidusagestr.h.

    +

    Definition at line 36 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageLEDs

    +
    @@ -2056,11 +2064,13 @@ Variables
    -

    Definition at line 37 of file hidusagestr.h.

    +

    Definition at line 37 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageButton

    +
    @@ -2070,11 +2080,13 @@ Variables
    -

    Definition at line 38 of file hidusagestr.h.

    +

    Definition at line 38 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageOrdinal

    +
    @@ -2084,11 +2096,13 @@ Variables
    -

    Definition at line 39 of file hidusagestr.h.

    +

    Definition at line 39 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageTelephone

    +
    @@ -2098,11 +2112,13 @@ Variables
    -

    Definition at line 40 of file hidusagestr.h.

    +

    Definition at line 40 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageConsumer

    +
    @@ -2112,11 +2128,13 @@ Variables
    -

    Definition at line 41 of file hidusagestr.h.

    +

    Definition at line 41 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageDigitizer

    +
    @@ -2126,11 +2144,13 @@ Variables
    -

    Definition at line 42 of file hidusagestr.h.

    +

    Definition at line 42 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePagePID

    +
    @@ -2140,11 +2160,13 @@ Variables
    -

    Definition at line 43 of file hidusagestr.h.

    +

    Definition at line 43 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageUnicode

    +
    @@ -2154,11 +2176,13 @@ Variables
    -

    Definition at line 44 of file hidusagestr.h.

    +

    Definition at line 44 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageAlphaNumericDisplay

    +
    @@ -2168,11 +2192,13 @@ Variables
    -

    Definition at line 45 of file hidusagestr.h.

    +

    Definition at line 45 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageMedicalInstruments

    +
    @@ -2182,11 +2208,13 @@ Variables
    -

    Definition at line 46 of file hidusagestr.h.

    +

    Definition at line 46 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageMonitor

    +
    @@ -2196,11 +2224,13 @@ Variables
    -

    Definition at line 47 of file hidusagestr.h.

    +

    Definition at line 47 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePagePower

    +
    @@ -2210,11 +2240,13 @@ Variables
    -

    Definition at line 48 of file hidusagestr.h.

    +

    Definition at line 48 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageBarCodeScanner

    +
    @@ -2224,11 +2256,13 @@ Variables
    -

    Definition at line 49 of file hidusagestr.h.

    +

    Definition at line 49 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageScale

    +
    @@ -2238,11 +2272,13 @@ Variables
    -

    Definition at line 50 of file hidusagestr.h.

    +

    Definition at line 50 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageMSRDevices

    +
    @@ -2252,11 +2288,13 @@ Variables
    -

    Definition at line 51 of file hidusagestr.h.

    +

    Definition at line 51 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePagePointOfSale

    +
    @@ -2266,11 +2304,13 @@ Variables
    -

    Definition at line 52 of file hidusagestr.h.

    +

    Definition at line 52 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageCameraControl

    +
    @@ -2280,11 +2320,13 @@ Variables
    -

    Definition at line 53 of file hidusagestr.h.

    +

    Definition at line 53 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageArcade

    +
    @@ -2294,11 +2336,13 @@ Variables
    -

    Definition at line 54 of file hidusagestr.h.

    +

    Definition at line 54 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageReserved

    +
    @@ -2308,11 +2352,13 @@ Variables
    -

    Definition at line 55 of file hidusagestr.h.

    +

    Definition at line 55 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePageVendorDefined

    +
    @@ -2322,11 +2368,13 @@ Variables
    -

    Definition at line 56 of file hidusagestr.h.

    +

    Definition at line 56 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePointer

    +
    @@ -2336,11 +2384,13 @@ Variables
    -

    Definition at line 59 of file hidusagestr.h.

    +

    Definition at line 59 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMouse

    +
    @@ -2350,11 +2400,13 @@ Variables
    -

    Definition at line 60 of file hidusagestr.h.

    +

    Definition at line 60 of file hidusagestr.h.

    - + +

    ◆ pstrUsageJoystick

    +
    @@ -2364,11 +2416,13 @@ Variables
    -

    Definition at line 61 of file hidusagestr.h.

    +

    Definition at line 61 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGamePad

    +
    @@ -2378,11 +2432,13 @@ Variables
    -

    Definition at line 62 of file hidusagestr.h.

    +

    Definition at line 62 of file hidusagestr.h.

    - + +

    ◆ pstrUsageKeyboard

    +
    @@ -2392,11 +2448,13 @@ Variables
    -

    Definition at line 63 of file hidusagestr.h.

    +

    Definition at line 63 of file hidusagestr.h.

    - + +

    ◆ pstrUsageKeypad

    +
    @@ -2406,11 +2464,13 @@ Variables
    -

    Definition at line 64 of file hidusagestr.h.

    +

    Definition at line 64 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMultiAxisController

    +
    @@ -2420,11 +2480,13 @@ Variables
    -

    Definition at line 65 of file hidusagestr.h.

    +

    Definition at line 65 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTabletPCSystemControls

    +
    @@ -2434,11 +2496,13 @@ Variables
    -

    Definition at line 66 of file hidusagestr.h.

    +

    Definition at line 66 of file hidusagestr.h.

    - + +

    ◆ pstrUsageX

    +
    @@ -2448,11 +2512,13 @@ Variables
    -

    Definition at line 67 of file hidusagestr.h.

    +

    Definition at line 67 of file hidusagestr.h.

    - + +

    ◆ pstrUsageY

    +
    @@ -2462,11 +2528,13 @@ Variables
    -

    Definition at line 68 of file hidusagestr.h.

    +

    Definition at line 68 of file hidusagestr.h.

    - + +

    ◆ pstrUsageZ

    +
    @@ -2476,11 +2544,13 @@ Variables
    -

    Definition at line 69 of file hidusagestr.h.

    +

    Definition at line 69 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRx

    +
    @@ -2490,11 +2560,13 @@ Variables
    -

    Definition at line 70 of file hidusagestr.h.

    +

    Definition at line 70 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRy

    +
    @@ -2504,11 +2576,13 @@ Variables
    -

    Definition at line 71 of file hidusagestr.h.

    +

    Definition at line 71 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRz

    +
    @@ -2518,11 +2592,13 @@ Variables
    -

    Definition at line 72 of file hidusagestr.h.

    +

    Definition at line 72 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSlider

    +
    @@ -2532,11 +2608,13 @@ Variables
    -

    Definition at line 73 of file hidusagestr.h.

    +

    Definition at line 73 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDial

    +
    @@ -2546,11 +2624,13 @@ Variables
    -

    Definition at line 74 of file hidusagestr.h.

    +

    Definition at line 74 of file hidusagestr.h.

    - + +

    ◆ pstrUsageWheel

    +
    @@ -2560,11 +2640,13 @@ Variables
    -

    Definition at line 75 of file hidusagestr.h.

    +

    Definition at line 75 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHatSwitch

    +
    @@ -2574,11 +2656,13 @@ Variables
    -

    Definition at line 76 of file hidusagestr.h.

    +

    Definition at line 76 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCountedBuffer

    +
    @@ -2588,11 +2672,13 @@ Variables
    -

    Definition at line 77 of file hidusagestr.h.

    +

    Definition at line 77 of file hidusagestr.h.

    - + +

    ◆ pstrUsageByteCount

    +
    @@ -2602,11 +2688,13 @@ Variables
    -

    Definition at line 78 of file hidusagestr.h.

    +

    Definition at line 78 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMotionWakeup

    +
    @@ -2616,11 +2704,13 @@ Variables
    -

    Definition at line 79 of file hidusagestr.h.

    +

    Definition at line 79 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStart

    +
    @@ -2630,11 +2720,13 @@ Variables
    -

    Definition at line 80 of file hidusagestr.h.

    +

    Definition at line 80 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSelect

    +
    @@ -2644,11 +2736,13 @@ Variables
    -

    Definition at line 81 of file hidusagestr.h.

    +

    Definition at line 81 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVx

    +
    @@ -2658,11 +2752,13 @@ Variables
    -

    Definition at line 82 of file hidusagestr.h.

    +

    Definition at line 82 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVy

    +
    @@ -2672,11 +2768,13 @@ Variables
    -

    Definition at line 83 of file hidusagestr.h.

    +

    Definition at line 83 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVz

    +
    @@ -2686,11 +2784,13 @@ Variables
    -

    Definition at line 84 of file hidusagestr.h.

    +

    Definition at line 84 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVbrx

    +
    @@ -2700,11 +2800,13 @@ Variables
    -

    Definition at line 85 of file hidusagestr.h.

    +

    Definition at line 85 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVbry

    +
    @@ -2714,11 +2816,13 @@ Variables
    -

    Definition at line 86 of file hidusagestr.h.

    +

    Definition at line 86 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVbrz

    +
    @@ -2728,11 +2832,13 @@ Variables
    -

    Definition at line 87 of file hidusagestr.h.

    +

    Definition at line 87 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVno

    +
    @@ -2742,11 +2848,13 @@ Variables
    -

    Definition at line 88 of file hidusagestr.h.

    +

    Definition at line 88 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFeatureNotification

    +
    @@ -2756,11 +2864,13 @@ Variables
    -

    Definition at line 89 of file hidusagestr.h.

    +

    Definition at line 89 of file hidusagestr.h.

    - + +

    ◆ pstrUsageResolutionMultiplier

    +
    @@ -2770,11 +2880,13 @@ Variables
    -

    Definition at line 90 of file hidusagestr.h.

    +

    Definition at line 90 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemControl

    +
    @@ -2784,11 +2896,13 @@ Variables
    -

    Definition at line 91 of file hidusagestr.h.

    +

    Definition at line 91 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemPowerDown

    +
    @@ -2798,11 +2912,13 @@ Variables
    -

    Definition at line 92 of file hidusagestr.h.

    +

    Definition at line 92 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemSleep

    +
    @@ -2812,11 +2928,13 @@ Variables
    -

    Definition at line 93 of file hidusagestr.h.

    +

    Definition at line 93 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemWakeup

    +
    @@ -2826,11 +2944,13 @@ Variables
    -

    Definition at line 94 of file hidusagestr.h.

    +

    Definition at line 94 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemContextMenu

    +
    @@ -2840,11 +2960,13 @@ Variables
    -

    Definition at line 95 of file hidusagestr.h.

    +

    Definition at line 95 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemMainMenu

    +
    @@ -2854,11 +2976,13 @@ Variables
    -

    Definition at line 96 of file hidusagestr.h.

    +

    Definition at line 96 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemAppMenu

    +
    @@ -2868,11 +2992,13 @@ Variables
    -

    Definition at line 97 of file hidusagestr.h.

    +

    Definition at line 97 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemMenuHelp

    +
    @@ -2882,11 +3008,13 @@ Variables
    -

    Definition at line 98 of file hidusagestr.h.

    +

    Definition at line 98 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemMenuExit

    +
    @@ -2896,11 +3024,13 @@ Variables
    -

    Definition at line 99 of file hidusagestr.h.

    +

    Definition at line 99 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemMenuSelect

    +
    @@ -2910,11 +3040,13 @@ Variables
    -

    Definition at line 100 of file hidusagestr.h.

    +

    Definition at line 100 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemMenuRight

    +
    @@ -2924,11 +3056,13 @@ Variables
    -

    Definition at line 101 of file hidusagestr.h.

    +

    Definition at line 101 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemMenuLeft

    +
    @@ -2938,11 +3072,13 @@ Variables
    -

    Definition at line 102 of file hidusagestr.h.

    +

    Definition at line 102 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemMenuUp

    +
    @@ -2952,11 +3088,13 @@ Variables
    -

    Definition at line 103 of file hidusagestr.h.

    +

    Definition at line 103 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemMenuDown

    +
    @@ -2966,11 +3104,13 @@ Variables
    -

    Definition at line 104 of file hidusagestr.h.

    +

    Definition at line 104 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemColdRestart

    +
    @@ -2980,11 +3120,13 @@ Variables
    -

    Definition at line 105 of file hidusagestr.h.

    +

    Definition at line 105 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemWarmRestart

    +
    @@ -2994,11 +3136,13 @@ Variables
    -

    Definition at line 106 of file hidusagestr.h.

    +

    Definition at line 106 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDPadUp

    +
    @@ -3008,11 +3152,13 @@ Variables
    -

    Definition at line 107 of file hidusagestr.h.

    +

    Definition at line 107 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDPadDown

    +
    @@ -3022,11 +3168,13 @@ Variables
    -

    Definition at line 108 of file hidusagestr.h.

    +

    Definition at line 108 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDPadRight

    +
    @@ -3036,11 +3184,13 @@ Variables
    -

    Definition at line 109 of file hidusagestr.h.

    +

    Definition at line 109 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDPadLeft

    +
    @@ -3050,11 +3200,13 @@ Variables
    -

    Definition at line 110 of file hidusagestr.h.

    +

    Definition at line 110 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDock

    +
    @@ -3064,11 +3216,13 @@ Variables
    -

    Definition at line 111 of file hidusagestr.h.

    +

    Definition at line 111 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemUndock

    +
    @@ -3078,11 +3232,13 @@ Variables
    -

    Definition at line 112 of file hidusagestr.h.

    +

    Definition at line 112 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemSetup

    +
    @@ -3092,11 +3248,13 @@ Variables
    -

    Definition at line 113 of file hidusagestr.h.

    +

    Definition at line 113 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemBreak

    +
    @@ -3106,11 +3264,13 @@ Variables
    -

    Definition at line 114 of file hidusagestr.h.

    +

    Definition at line 114 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDebuggerBreak

    +
    @@ -3120,11 +3280,13 @@ Variables
    -

    Definition at line 115 of file hidusagestr.h.

    +

    Definition at line 115 of file hidusagestr.h.

    - + +

    ◆ pstrUsageApplicationBreak

    +
    @@ -3134,11 +3296,13 @@ Variables
    -

    Definition at line 116 of file hidusagestr.h.

    +

    Definition at line 116 of file hidusagestr.h.

    - + +

    ◆ pstrUsageApplicationDebuggerBreak

    +
    @@ -3148,11 +3312,13 @@ Variables
    -

    Definition at line 117 of file hidusagestr.h.

    +

    Definition at line 117 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemSpeakerMute

    +
    @@ -3162,11 +3328,13 @@ Variables
    -

    Definition at line 118 of file hidusagestr.h.

    +

    Definition at line 118 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemHibernate

    +
    @@ -3176,11 +3344,13 @@ Variables
    -

    Definition at line 119 of file hidusagestr.h.

    +

    Definition at line 119 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDisplayInvert

    +
    @@ -3190,11 +3360,13 @@ Variables
    -

    Definition at line 120 of file hidusagestr.h.

    +

    Definition at line 120 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDisplayInternal

    +
    @@ -3204,11 +3376,13 @@ Variables
    -

    Definition at line 121 of file hidusagestr.h.

    +

    Definition at line 121 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDisplayExternal

    +
    @@ -3218,11 +3392,13 @@ Variables
    -

    Definition at line 122 of file hidusagestr.h.

    +

    Definition at line 122 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDisplayBoth

    +
    @@ -3232,11 +3408,13 @@ Variables
    -

    Definition at line 123 of file hidusagestr.h.

    +

    Definition at line 123 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDisplayDual

    +
    @@ -3246,11 +3424,13 @@ Variables
    -

    Definition at line 124 of file hidusagestr.h.

    +

    Definition at line 124 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDisplayToggleIntExt

    +
    @@ -3260,11 +3440,13 @@ Variables
    -

    Definition at line 125 of file hidusagestr.h.

    +

    Definition at line 125 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDisplaySwapPriSec

    +
    @@ -3274,11 +3456,13 @@ Variables
    -

    Definition at line 126 of file hidusagestr.h.

    +

    Definition at line 126 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemDisplayLCDAutoscale

    +
    @@ -3288,11 +3472,13 @@ Variables
    -

    Definition at line 127 of file hidusagestr.h.

    +

    Definition at line 127 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlightSimulationDevice

    +
    @@ -3302,11 +3488,13 @@ Variables
    -

    Definition at line 130 of file hidusagestr.h.

    +

    Definition at line 130 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAutomobileSimulationDevice

    +
    @@ -3316,11 +3504,13 @@ Variables
    -

    Definition at line 131 of file hidusagestr.h.

    +

    Definition at line 131 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTankSimulationDevice

    +
    @@ -3330,11 +3520,13 @@ Variables
    -

    Definition at line 132 of file hidusagestr.h.

    +

    Definition at line 132 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpaceshipSimulationDevice

    +
    @@ -3344,11 +3536,13 @@ Variables
    -

    Definition at line 133 of file hidusagestr.h.

    +

    Definition at line 133 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSubmarineSimulationDevice

    +
    @@ -3358,11 +3552,13 @@ Variables
    -

    Definition at line 134 of file hidusagestr.h.

    +

    Definition at line 134 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSailingSimulationDevice

    +
    @@ -3372,11 +3568,13 @@ Variables
    -

    Definition at line 135 of file hidusagestr.h.

    +

    Definition at line 135 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMotocicleSimulationDevice

    +
    @@ -3386,11 +3584,13 @@ Variables
    -

    Definition at line 136 of file hidusagestr.h.

    +

    Definition at line 136 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSportsSimulationDevice

    +
    @@ -3400,11 +3600,13 @@ Variables
    -

    Definition at line 137 of file hidusagestr.h.

    +

    Definition at line 137 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAirplaneSimulationDevice

    +
    @@ -3414,11 +3616,13 @@ Variables
    -

    Definition at line 138 of file hidusagestr.h.

    +

    Definition at line 138 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHelicopterSimulationDevice

    +
    @@ -3428,11 +3632,13 @@ Variables
    -

    Definition at line 139 of file hidusagestr.h.

    +

    Definition at line 139 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMagicCarpetSimulationDevice

    +
    @@ -3442,11 +3648,13 @@ Variables
    -

    Definition at line 140 of file hidusagestr.h.

    +

    Definition at line 140 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBicycleSimulationDevice

    +
    @@ -3456,11 +3664,13 @@ Variables
    -

    Definition at line 141 of file hidusagestr.h.

    +

    Definition at line 141 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlightControlStick

    +
    @@ -3470,11 +3680,13 @@ Variables
    -

    Definition at line 142 of file hidusagestr.h.

    +

    Definition at line 142 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlightStick

    +
    @@ -3484,11 +3696,13 @@ Variables
    -

    Definition at line 143 of file hidusagestr.h.

    +

    Definition at line 143 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCyclicControl

    +
    @@ -3498,11 +3712,13 @@ Variables
    -

    Definition at line 144 of file hidusagestr.h.

    +

    Definition at line 144 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCyclicTrim

    +
    @@ -3512,11 +3728,13 @@ Variables
    -

    Definition at line 145 of file hidusagestr.h.

    +

    Definition at line 145 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlightYoke

    +
    @@ -3526,11 +3744,13 @@ Variables
    -

    Definition at line 146 of file hidusagestr.h.

    +

    Definition at line 146 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTrackControl

    +
    @@ -3540,11 +3760,13 @@ Variables
    -

    Definition at line 147 of file hidusagestr.h.

    +

    Definition at line 147 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAileron

    +
    @@ -3554,11 +3776,13 @@ Variables
    -

    Definition at line 148 of file hidusagestr.h.

    +

    Definition at line 148 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAileronTrim

    +
    @@ -3568,11 +3792,13 @@ Variables
    -

    Definition at line 149 of file hidusagestr.h.

    +

    Definition at line 149 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAntiTorqueControl

    +
    @@ -3582,11 +3808,13 @@ Variables
    -

    Definition at line 150 of file hidusagestr.h.

    +

    Definition at line 150 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAutopilotEnable

    +
    @@ -3596,11 +3824,13 @@ Variables
    -

    Definition at line 151 of file hidusagestr.h.

    +

    Definition at line 151 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChaffRelease

    +
    @@ -3610,11 +3840,13 @@ Variables
    -

    Definition at line 152 of file hidusagestr.h.

    +

    Definition at line 152 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCollectiveControl

    +
    @@ -3624,11 +3856,13 @@ Variables
    -

    Definition at line 153 of file hidusagestr.h.

    +

    Definition at line 153 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDiveBrake

    +
    @@ -3638,11 +3872,13 @@ Variables
    -

    Definition at line 154 of file hidusagestr.h.

    +

    Definition at line 154 of file hidusagestr.h.

    - + +

    ◆ pstrUsageElectronicCountermeasures

    +
    @@ -3652,11 +3888,13 @@ Variables
    -

    Definition at line 155 of file hidusagestr.h.

    +

    Definition at line 155 of file hidusagestr.h.

    - + +

    ◆ pstrUsageElevator

    +
    @@ -3666,11 +3904,13 @@ Variables
    -

    Definition at line 156 of file hidusagestr.h.

    +

    Definition at line 156 of file hidusagestr.h.

    - + +

    ◆ pstrUsageElevatorTrim

    +
    @@ -3680,11 +3920,13 @@ Variables
    -

    Definition at line 157 of file hidusagestr.h.

    +

    Definition at line 157 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRudder

    +
    @@ -3694,11 +3936,13 @@ Variables
    -

    Definition at line 158 of file hidusagestr.h.

    +

    Definition at line 158 of file hidusagestr.h.

    - + +

    ◆ pstrUsageThrottle

    +
    @@ -3708,11 +3952,13 @@ Variables
    -

    Definition at line 159 of file hidusagestr.h.

    +

    Definition at line 159 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlightCommunications

    +
    @@ -3722,11 +3968,13 @@ Variables
    -

    Definition at line 160 of file hidusagestr.h.

    +

    Definition at line 160 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlareRelease

    +
    @@ -3736,11 +3984,13 @@ Variables
    -

    Definition at line 161 of file hidusagestr.h.

    +

    Definition at line 161 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLandingGear

    +
    @@ -3750,11 +4000,13 @@ Variables
    -

    Definition at line 162 of file hidusagestr.h.

    +

    Definition at line 162 of file hidusagestr.h.

    - + +

    ◆ pstrUsageToeBrake

    +
    @@ -3764,11 +4016,13 @@ Variables
    -

    Definition at line 163 of file hidusagestr.h.

    +

    Definition at line 163 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTrigger

    +
    @@ -3778,11 +4032,13 @@ Variables
    -

    Definition at line 164 of file hidusagestr.h.

    +

    Definition at line 164 of file hidusagestr.h.

    - + +

    ◆ pstrUsageWeaponsArm

    +
    @@ -3792,11 +4048,13 @@ Variables
    -

    Definition at line 165 of file hidusagestr.h.

    +

    Definition at line 165 of file hidusagestr.h.

    - + +

    ◆ pstrUsageWeaponsSelect

    +
    @@ -3806,11 +4064,13 @@ Variables
    -

    Definition at line 166 of file hidusagestr.h.

    +

    Definition at line 166 of file hidusagestr.h.

    - + +

    ◆ pstrUsageWingFlaps

    +
    @@ -3820,11 +4080,13 @@ Variables
    -

    Definition at line 167 of file hidusagestr.h.

    +

    Definition at line 167 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAccelerator

    +
    @@ -3834,11 +4096,13 @@ Variables
    -

    Definition at line 168 of file hidusagestr.h.

    +

    Definition at line 168 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBrake

    +
    @@ -3848,11 +4112,13 @@ Variables
    -

    Definition at line 169 of file hidusagestr.h.

    +

    Definition at line 169 of file hidusagestr.h.

    - + +

    ◆ pstrUsageClutch

    +
    @@ -3862,11 +4128,13 @@ Variables
    -

    Definition at line 170 of file hidusagestr.h.

    +

    Definition at line 170 of file hidusagestr.h.

    - + +

    ◆ pstrUsageShifter

    +
    @@ -3876,11 +4144,13 @@ Variables
    -

    Definition at line 171 of file hidusagestr.h.

    +

    Definition at line 171 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSteering

    +
    @@ -3890,11 +4160,13 @@ Variables
    -

    Definition at line 172 of file hidusagestr.h.

    +

    Definition at line 172 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTurretDirection

    +
    @@ -3904,11 +4176,13 @@ Variables
    -

    Definition at line 173 of file hidusagestr.h.

    +

    Definition at line 173 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBarrelElevation

    +
    @@ -3918,11 +4192,13 @@ Variables
    -

    Definition at line 174 of file hidusagestr.h.

    +

    Definition at line 174 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDivePlane

    +
    @@ -3932,11 +4208,13 @@ Variables
    -

    Definition at line 175 of file hidusagestr.h.

    +

    Definition at line 175 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBallast

    +
    @@ -3946,11 +4224,13 @@ Variables
    -

    Definition at line 176 of file hidusagestr.h.

    +

    Definition at line 176 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBicycleCrank

    +
    @@ -3960,11 +4240,13 @@ Variables
    -

    Definition at line 177 of file hidusagestr.h.

    +

    Definition at line 177 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHandleBars

    +
    @@ -3974,11 +4256,13 @@ Variables
    -

    Definition at line 178 of file hidusagestr.h.

    +

    Definition at line 178 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFrontBrake

    +
    @@ -3988,11 +4272,13 @@ Variables
    -

    Definition at line 179 of file hidusagestr.h.

    +

    Definition at line 179 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRearBrake

    +
    @@ -4002,11 +4288,13 @@ Variables
    -

    Definition at line 180 of file hidusagestr.h.

    +

    Definition at line 180 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBelt

    +
    @@ -4016,11 +4304,13 @@ Variables
    -

    Definition at line 183 of file hidusagestr.h.

    +

    Definition at line 183 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBodySuit

    +
    @@ -4030,11 +4320,13 @@ Variables
    -

    Definition at line 184 of file hidusagestr.h.

    +

    Definition at line 184 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlexor

    +
    @@ -4044,11 +4336,13 @@ Variables
    -

    Definition at line 185 of file hidusagestr.h.

    +

    Definition at line 185 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGlove

    +
    @@ -4058,11 +4352,13 @@ Variables
    -

    Definition at line 186 of file hidusagestr.h.

    +

    Definition at line 186 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHeadTracker

    +
    @@ -4072,11 +4368,13 @@ Variables
    -

    Definition at line 187 of file hidusagestr.h.

    +

    Definition at line 187 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHeadMountedDisplay

    +
    @@ -4086,11 +4384,13 @@ Variables
    -

    Definition at line 188 of file hidusagestr.h.

    +

    Definition at line 188 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHandTracker

    +
    @@ -4100,11 +4400,13 @@ Variables
    -

    Definition at line 189 of file hidusagestr.h.

    +

    Definition at line 189 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOculometer

    +
    @@ -4114,11 +4416,13 @@ Variables
    -

    Definition at line 190 of file hidusagestr.h.

    +

    Definition at line 190 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVest

    +
    @@ -4128,11 +4432,13 @@ Variables
    -

    Definition at line 191 of file hidusagestr.h.

    +

    Definition at line 191 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAnimatronicDevice

    +
    @@ -4142,11 +4448,13 @@ Variables
    -

    Definition at line 192 of file hidusagestr.h.

    +

    Definition at line 192 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStereoEnable

    +
    @@ -4156,11 +4464,13 @@ Variables
    -

    Definition at line 193 of file hidusagestr.h.

    +

    Definition at line 193 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDisplayEnable

    +
    @@ -4170,11 +4480,13 @@ Variables
    -

    Definition at line 194 of file hidusagestr.h.

    +

    Definition at line 194 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBaseballBat

    +
    @@ -4184,11 +4496,13 @@ Variables
    -

    Definition at line 197 of file hidusagestr.h.

    +

    Definition at line 197 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGolfClub

    +
    @@ -4198,11 +4512,13 @@ Variables
    -

    Definition at line 198 of file hidusagestr.h.

    +

    Definition at line 198 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRowingMachine

    +
    @@ -4212,11 +4528,13 @@ Variables
    -

    Definition at line 199 of file hidusagestr.h.

    +

    Definition at line 199 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTreadmill

    +
    @@ -4226,11 +4544,13 @@ Variables
    -

    Definition at line 200 of file hidusagestr.h.

    +

    Definition at line 200 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOar

    +
    @@ -4240,11 +4560,13 @@ Variables
    -

    Definition at line 201 of file hidusagestr.h.

    +

    Definition at line 201 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSlope

    +
    @@ -4254,11 +4576,13 @@ Variables
    -

    Definition at line 202 of file hidusagestr.h.

    +

    Definition at line 202 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRate

    +
    @@ -4268,11 +4592,13 @@ Variables
    -

    Definition at line 203 of file hidusagestr.h.

    +

    Definition at line 203 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStickSpeed

    +
    @@ -4282,11 +4608,13 @@ Variables
    -

    Definition at line 204 of file hidusagestr.h.

    +

    Definition at line 204 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStickFaceAngle

    +
    @@ -4296,11 +4624,13 @@ Variables
    -

    Definition at line 205 of file hidusagestr.h.

    +

    Definition at line 205 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStickHeelToe

    +
    @@ -4310,11 +4640,13 @@ Variables
    -

    Definition at line 206 of file hidusagestr.h.

    +

    Definition at line 206 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStickFollowThough

    +
    @@ -4324,11 +4656,13 @@ Variables
    -

    Definition at line 207 of file hidusagestr.h.

    +

    Definition at line 207 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStickTempo

    +
    @@ -4338,11 +4672,13 @@ Variables
    -

    Definition at line 208 of file hidusagestr.h.

    +

    Definition at line 208 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStickType

    +
    @@ -4352,11 +4688,13 @@ Variables
    -

    Definition at line 209 of file hidusagestr.h.

    +

    Definition at line 209 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStickHeight

    +
    @@ -4366,11 +4704,13 @@ Variables
    -

    Definition at line 210 of file hidusagestr.h.

    +

    Definition at line 210 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePutter

    +
    @@ -4380,11 +4720,13 @@ Variables
    -

    Definition at line 211 of file hidusagestr.h.

    +

    Definition at line 211 of file hidusagestr.h.

    - + +

    ◆ pstrUsage1Iron

    +
    @@ -4394,11 +4736,13 @@ Variables
    -

    Definition at line 212 of file hidusagestr.h.

    +

    Definition at line 212 of file hidusagestr.h.

    - + +

    ◆ pstrUsage2Iron

    +
    @@ -4408,11 +4752,13 @@ Variables
    -

    Definition at line 213 of file hidusagestr.h.

    +

    Definition at line 213 of file hidusagestr.h.

    - + +

    ◆ pstrUsage3Iron

    +
    @@ -4422,11 +4768,13 @@ Variables
    -

    Definition at line 214 of file hidusagestr.h.

    +

    Definition at line 214 of file hidusagestr.h.

    - + +

    ◆ pstrUsage4Iron

    +
    @@ -4436,11 +4784,13 @@ Variables
    -

    Definition at line 215 of file hidusagestr.h.

    +

    Definition at line 215 of file hidusagestr.h.

    - + +

    ◆ pstrUsage5Iron

    +
    @@ -4450,11 +4800,13 @@ Variables
    -

    Definition at line 216 of file hidusagestr.h.

    +

    Definition at line 216 of file hidusagestr.h.

    - + +

    ◆ pstrUsage6Iron

    +
    @@ -4464,11 +4816,13 @@ Variables
    -

    Definition at line 217 of file hidusagestr.h.

    +

    Definition at line 217 of file hidusagestr.h.

    - + +

    ◆ pstrUsage7Iron

    +
    @@ -4478,11 +4832,13 @@ Variables
    -

    Definition at line 218 of file hidusagestr.h.

    +

    Definition at line 218 of file hidusagestr.h.

    - + +

    ◆ pstrUsage8Iron

    +
    @@ -4492,11 +4848,13 @@ Variables
    -

    Definition at line 219 of file hidusagestr.h.

    +

    Definition at line 219 of file hidusagestr.h.

    - + +

    ◆ pstrUsage9Iron

    +
    @@ -4506,11 +4864,13 @@ Variables
    -

    Definition at line 220 of file hidusagestr.h.

    +

    Definition at line 220 of file hidusagestr.h.

    - + +

    ◆ pstrUsage10Iron

    +
    @@ -4520,11 +4880,13 @@ Variables
    -

    Definition at line 221 of file hidusagestr.h.

    +

    Definition at line 221 of file hidusagestr.h.

    - + +

    ◆ pstrUsage11Iron

    +
    @@ -4534,11 +4896,13 @@ Variables
    -

    Definition at line 222 of file hidusagestr.h.

    +

    Definition at line 222 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSandWedge

    +
    @@ -4548,11 +4912,13 @@ Variables
    -

    Definition at line 223 of file hidusagestr.h.

    +

    Definition at line 223 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLoftWedge

    +
    @@ -4562,11 +4928,13 @@ Variables
    -

    Definition at line 224 of file hidusagestr.h.

    +

    Definition at line 224 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePowerWedge

    +
    @@ -4576,11 +4944,13 @@ Variables
    -

    Definition at line 225 of file hidusagestr.h.

    +

    Definition at line 225 of file hidusagestr.h.

    - + +

    ◆ pstrUsage1Wood

    +
    @@ -4590,11 +4960,13 @@ Variables
    -

    Definition at line 226 of file hidusagestr.h.

    +

    Definition at line 226 of file hidusagestr.h.

    - + +

    ◆ pstrUsage3Wood

    +
    @@ -4604,11 +4976,13 @@ Variables
    -

    Definition at line 227 of file hidusagestr.h.

    +

    Definition at line 227 of file hidusagestr.h.

    - + +

    ◆ pstrUsage5Wood

    +
    @@ -4618,11 +4992,13 @@ Variables
    -

    Definition at line 228 of file hidusagestr.h.

    +

    Definition at line 228 of file hidusagestr.h.

    - + +

    ◆ pstrUsage7Wood

    +
    @@ -4632,11 +5008,13 @@ Variables
    -

    Definition at line 229 of file hidusagestr.h.

    +

    Definition at line 229 of file hidusagestr.h.

    - + +

    ◆ pstrUsage9Wood

    +
    @@ -4646,11 +5024,13 @@ Variables
    -

    Definition at line 230 of file hidusagestr.h.

    +

    Definition at line 230 of file hidusagestr.h.

    - + +

    ◆ pstrUsage3DGameController

    +
    @@ -4660,11 +5040,13 @@ Variables
    -

    Definition at line 233 of file hidusagestr.h.

    +

    Definition at line 233 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePinballDevice

    +
    @@ -4674,11 +5056,13 @@ Variables
    -

    Definition at line 234 of file hidusagestr.h.

    +

    Definition at line 234 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGunDevice

    +
    @@ -4688,11 +5072,13 @@ Variables
    -

    Definition at line 235 of file hidusagestr.h.

    +

    Definition at line 235 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePointOfView

    +
    @@ -4702,11 +5088,13 @@ Variables
    -

    Definition at line 236 of file hidusagestr.h.

    +

    Definition at line 236 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTurnRightLeft

    +
    @@ -4716,11 +5104,13 @@ Variables
    -

    Definition at line 237 of file hidusagestr.h.

    +

    Definition at line 237 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePitchForwardBackward

    +
    @@ -4730,11 +5120,13 @@ Variables
    -

    Definition at line 238 of file hidusagestr.h.

    +

    Definition at line 238 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRollRightLeft

    +
    @@ -4744,11 +5136,13 @@ Variables
    -

    Definition at line 239 of file hidusagestr.h.

    +

    Definition at line 239 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMoveRightLeft

    +
    @@ -4758,11 +5152,13 @@ Variables
    -

    Definition at line 240 of file hidusagestr.h.

    +

    Definition at line 240 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMoveForwardBackward

    +
    @@ -4772,11 +5168,13 @@ Variables
    -

    Definition at line 241 of file hidusagestr.h.

    +

    Definition at line 241 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMoveUpDown

    +
    @@ -4786,11 +5184,13 @@ Variables
    -

    Definition at line 242 of file hidusagestr.h.

    +

    Definition at line 242 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLeanRightLeft

    +
    @@ -4800,11 +5200,13 @@ Variables
    -

    Definition at line 243 of file hidusagestr.h.

    +

    Definition at line 243 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLeanForwardBackward

    +
    @@ -4814,11 +5216,13 @@ Variables
    -

    Definition at line 244 of file hidusagestr.h.

    +

    Definition at line 244 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHeightOfPOV

    +
    @@ -4828,11 +5232,13 @@ Variables
    -

    Definition at line 245 of file hidusagestr.h.

    +

    Definition at line 245 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlipper

    +
    @@ -4842,11 +5248,13 @@ Variables
    -

    Definition at line 246 of file hidusagestr.h.

    +

    Definition at line 246 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSecondaryFlipper

    +
    @@ -4856,11 +5264,13 @@ Variables
    -

    Definition at line 247 of file hidusagestr.h.

    +

    Definition at line 247 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBump

    +
    @@ -4870,11 +5280,13 @@ Variables
    -

    Definition at line 248 of file hidusagestr.h.

    +

    Definition at line 248 of file hidusagestr.h.

    - + +

    ◆ pstrUsageNewGame

    +
    @@ -4884,11 +5296,13 @@ Variables
    -

    Definition at line 249 of file hidusagestr.h.

    +

    Definition at line 249 of file hidusagestr.h.

    - + +

    ◆ pstrUsageShootBall

    +
    @@ -4898,11 +5312,13 @@ Variables
    -

    Definition at line 250 of file hidusagestr.h.

    +

    Definition at line 250 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePlayer

    +
    @@ -4912,11 +5328,13 @@ Variables
    -

    Definition at line 251 of file hidusagestr.h.

    +

    Definition at line 251 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGunBolt

    +
    @@ -4926,11 +5344,13 @@ Variables
    -

    Definition at line 252 of file hidusagestr.h.

    +

    Definition at line 252 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGunClip

    +
    @@ -4940,11 +5360,13 @@ Variables
    -

    Definition at line 253 of file hidusagestr.h.

    +

    Definition at line 253 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGunSelector

    +
    @@ -4954,11 +5376,13 @@ Variables
    -

    Definition at line 254 of file hidusagestr.h.

    +

    Definition at line 254 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGunSingleShot

    +
    @@ -4968,11 +5392,13 @@ Variables
    -

    Definition at line 255 of file hidusagestr.h.

    +

    Definition at line 255 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGunBurst

    +
    @@ -4982,11 +5408,13 @@ Variables
    -

    Definition at line 256 of file hidusagestr.h.

    +

    Definition at line 256 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGunAutomatic

    +
    @@ -4996,11 +5424,13 @@ Variables
    -

    Definition at line 257 of file hidusagestr.h.

    +

    Definition at line 257 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGunSafety

    +
    @@ -5010,11 +5440,13 @@ Variables
    -

    Definition at line 258 of file hidusagestr.h.

    +

    Definition at line 258 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGamepadFireJump

    +
    @@ -5024,11 +5456,13 @@ Variables
    -

    Definition at line 259 of file hidusagestr.h.

    +

    Definition at line 259 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGamepadTrigger

    +
    @@ -5038,11 +5472,13 @@ Variables
    -

    Definition at line 260 of file hidusagestr.h.

    +

    Definition at line 260 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBatteryStrength

    +
    @@ -5052,11 +5488,13 @@ Variables
    -

    Definition at line 263 of file hidusagestr.h.

    +

    Definition at line 263 of file hidusagestr.h.

    - + +

    ◆ pstrUsageWirelessChannel

    +
    @@ -5066,11 +5504,13 @@ Variables
    -

    Definition at line 264 of file hidusagestr.h.

    +

    Definition at line 264 of file hidusagestr.h.

    - + +

    ◆ pstrUsageWirelessID

    +
    @@ -5080,11 +5520,13 @@ Variables
    -

    Definition at line 265 of file hidusagestr.h.

    +

    Definition at line 265 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDiscoverWirelessControl

    +
    @@ -5094,11 +5536,13 @@ Variables
    -

    Definition at line 266 of file hidusagestr.h.

    +

    Definition at line 266 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSecurityCodeCharEntered

    +
    @@ -5108,11 +5552,13 @@ Variables
    -

    Definition at line 267 of file hidusagestr.h.

    +

    Definition at line 267 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSecurityCodeCharErased

    +
    @@ -5122,11 +5568,13 @@ Variables
    -

    Definition at line 268 of file hidusagestr.h.

    +

    Definition at line 268 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSecurityCodeCleared

    +
    @@ -5136,11 +5584,13 @@ Variables
    -

    Definition at line 269 of file hidusagestr.h.

    +

    Definition at line 269 of file hidusagestr.h.

    - + +

    ◆ pstrUsageNumLock

    +
    @@ -5150,11 +5600,13 @@ Variables
    -

    Definition at line 272 of file hidusagestr.h.

    +

    Definition at line 272 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCapsLock

    +
    @@ -5164,11 +5616,13 @@ Variables
    -

    Definition at line 273 of file hidusagestr.h.

    +

    Definition at line 273 of file hidusagestr.h.

    - + +

    ◆ pstrUsageScrollLock

    +
    @@ -5178,11 +5632,13 @@ Variables
    -

    Definition at line 274 of file hidusagestr.h.

    +

    Definition at line 274 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCompose

    +
    @@ -5192,11 +5648,13 @@ Variables
    -

    Definition at line 275 of file hidusagestr.h.

    +

    Definition at line 275 of file hidusagestr.h.

    - + +

    ◆ pstrUsageKana

    +
    @@ -5206,11 +5664,13 @@ Variables
    -

    Definition at line 276 of file hidusagestr.h.

    +

    Definition at line 276 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePower

    +
    @@ -5220,11 +5680,13 @@ Variables
    -

    Definition at line 277 of file hidusagestr.h.

    +

    Definition at line 277 of file hidusagestr.h.

    - + +

    ◆ pstrUsageShift

    +
    @@ -5234,11 +5696,13 @@ Variables
    -

    Definition at line 278 of file hidusagestr.h.

    +

    Definition at line 278 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDoNotDisturb

    +
    @@ -5248,11 +5712,13 @@ Variables
    -

    Definition at line 279 of file hidusagestr.h.

    +

    Definition at line 279 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMute

    +
    @@ -5262,11 +5728,13 @@ Variables
    -

    Definition at line 280 of file hidusagestr.h.

    +

    Definition at line 280 of file hidusagestr.h.

    - + +

    ◆ pstrUsageToneEnable

    +
    @@ -5276,11 +5744,13 @@ Variables
    -

    Definition at line 281 of file hidusagestr.h.

    +

    Definition at line 281 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHighCutFilter

    +
    @@ -5290,11 +5760,13 @@ Variables
    -

    Definition at line 282 of file hidusagestr.h.

    +

    Definition at line 282 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLowCutFilter

    +
    @@ -5304,11 +5776,13 @@ Variables
    -

    Definition at line 283 of file hidusagestr.h.

    +

    Definition at line 283 of file hidusagestr.h.

    - + +

    ◆ pstrUsageEqualizerEnable

    +
    @@ -5318,11 +5792,13 @@ Variables
    -

    Definition at line 284 of file hidusagestr.h.

    +

    Definition at line 284 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoundFieldOn

    +
    @@ -5332,11 +5808,13 @@ Variables
    -

    Definition at line 285 of file hidusagestr.h.

    +

    Definition at line 285 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSurroundOn

    +
    @@ -5346,11 +5824,13 @@ Variables
    -

    Definition at line 286 of file hidusagestr.h.

    +

    Definition at line 286 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRepeat

    +
    @@ -5360,11 +5840,13 @@ Variables
    -

    Definition at line 287 of file hidusagestr.h.

    +

    Definition at line 287 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStereo

    +
    @@ -5374,11 +5856,13 @@ Variables
    -

    Definition at line 288 of file hidusagestr.h.

    +

    Definition at line 288 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSamplingRateDetect

    +
    @@ -5388,11 +5872,13 @@ Variables
    -

    Definition at line 289 of file hidusagestr.h.

    +

    Definition at line 289 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpinning

    +
    @@ -5402,11 +5888,13 @@ Variables
    -

    Definition at line 290 of file hidusagestr.h.

    +

    Definition at line 290 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCAV

    +
    @@ -5416,11 +5904,13 @@ Variables
    -

    Definition at line 291 of file hidusagestr.h.

    +

    Definition at line 291 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCLV

    +
    @@ -5430,11 +5920,13 @@ Variables
    -

    Definition at line 292 of file hidusagestr.h.

    +

    Definition at line 292 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRecordingFormatDetect

    +
    @@ -5444,11 +5936,13 @@ Variables
    -

    Definition at line 293 of file hidusagestr.h.

    +

    Definition at line 293 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOffHook

    +
    @@ -5458,11 +5952,13 @@ Variables
    -

    Definition at line 294 of file hidusagestr.h.

    +

    Definition at line 294 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRing

    +
    @@ -5472,11 +5968,13 @@ Variables
    -

    Definition at line 295 of file hidusagestr.h.

    +

    Definition at line 295 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMessageWaiting

    +
    @@ -5486,11 +5984,13 @@ Variables
    -

    Definition at line 296 of file hidusagestr.h.

    +

    Definition at line 296 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDataMode

    +
    @@ -5500,11 +6000,13 @@ Variables
    -

    Definition at line 297 of file hidusagestr.h.

    +

    Definition at line 297 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBatteryOperation

    +
    @@ -5514,11 +6016,13 @@ Variables
    -

    Definition at line 298 of file hidusagestr.h.

    +

    Definition at line 298 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBatteryOK

    +
    @@ -5528,11 +6032,13 @@ Variables
    -

    Definition at line 299 of file hidusagestr.h.

    +

    Definition at line 299 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBatteryLow

    +
    @@ -5542,11 +6048,13 @@ Variables
    -

    Definition at line 300 of file hidusagestr.h.

    +

    Definition at line 300 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpeaker

    +
    @@ -5556,11 +6064,13 @@ Variables
    -

    Definition at line 301 of file hidusagestr.h.

    +

    Definition at line 301 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHeadSet

    +
    @@ -5570,11 +6080,13 @@ Variables
    -

    Definition at line 302 of file hidusagestr.h.

    +

    Definition at line 302 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHold

    +
    @@ -5584,11 +6096,13 @@ Variables
    -

    Definition at line 303 of file hidusagestr.h.

    +

    Definition at line 303 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMicrophone

    +
    @@ -5598,11 +6112,13 @@ Variables
    -

    Definition at line 304 of file hidusagestr.h.

    +

    Definition at line 304 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCoverage

    +
    @@ -5612,11 +6128,13 @@ Variables
    -

    Definition at line 305 of file hidusagestr.h.

    +

    Definition at line 305 of file hidusagestr.h.

    - + +

    ◆ pstrUsageNightMode

    +
    @@ -5626,11 +6144,13 @@ Variables
    -

    Definition at line 306 of file hidusagestr.h.

    +

    Definition at line 306 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSendCalls

    +
    @@ -5640,11 +6160,13 @@ Variables
    -

    Definition at line 307 of file hidusagestr.h.

    +

    Definition at line 307 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCallPickup

    +
    @@ -5654,11 +6176,13 @@ Variables
    -

    Definition at line 308 of file hidusagestr.h.

    +

    Definition at line 308 of file hidusagestr.h.

    - + +

    ◆ pstrUsageConference

    +
    @@ -5668,11 +6192,13 @@ Variables
    -

    Definition at line 309 of file hidusagestr.h.

    +

    Definition at line 309 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStandBy

    +
    @@ -5682,11 +6208,13 @@ Variables
    -

    Definition at line 310 of file hidusagestr.h.

    +

    Definition at line 310 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCameraOn

    +
    @@ -5696,11 +6224,13 @@ Variables
    -

    Definition at line 311 of file hidusagestr.h.

    +

    Definition at line 311 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCameraOff

    +
    @@ -5710,11 +6240,13 @@ Variables
    -

    Definition at line 312 of file hidusagestr.h.

    +

    Definition at line 312 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOnLine

    +
    @@ -5724,11 +6256,13 @@ Variables
    -

    Definition at line 313 of file hidusagestr.h.

    +

    Definition at line 313 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOffLine

    +
    @@ -5738,11 +6272,13 @@ Variables
    -

    Definition at line 314 of file hidusagestr.h.

    +

    Definition at line 314 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBusy

    +
    @@ -5752,11 +6288,13 @@ Variables
    -

    Definition at line 315 of file hidusagestr.h.

    +

    Definition at line 315 of file hidusagestr.h.

    - + +

    ◆ pstrUsageReady

    +
    @@ -5766,11 +6304,13 @@ Variables
    -

    Definition at line 316 of file hidusagestr.h.

    +

    Definition at line 316 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePaperOut

    +
    @@ -5780,11 +6320,13 @@ Variables
    -

    Definition at line 317 of file hidusagestr.h.

    +

    Definition at line 317 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePaperJam

    +
    @@ -5794,11 +6336,13 @@ Variables
    -

    Definition at line 318 of file hidusagestr.h.

    +

    Definition at line 318 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRemote

    +
    @@ -5808,11 +6352,13 @@ Variables
    -

    Definition at line 319 of file hidusagestr.h.

    +

    Definition at line 319 of file hidusagestr.h.

    - + +

    ◆ pstrUsageForward

    +
    @@ -5822,11 +6368,13 @@ Variables
    -

    Definition at line 320 of file hidusagestr.h.

    +

    Definition at line 320 of file hidusagestr.h.

    - + +

    ◆ pstrUsageReverse

    +
    @@ -5836,11 +6384,13 @@ Variables
    -

    Definition at line 321 of file hidusagestr.h.

    +

    Definition at line 321 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStop

    +
    @@ -5850,11 +6400,13 @@ Variables
    -

    Definition at line 322 of file hidusagestr.h.

    +

    Definition at line 322 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRewind

    +
    @@ -5864,11 +6416,13 @@ Variables
    -

    Definition at line 323 of file hidusagestr.h.

    +

    Definition at line 323 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFastForward

    +
    @@ -5878,11 +6432,13 @@ Variables
    -

    Definition at line 324 of file hidusagestr.h.

    +

    Definition at line 324 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePlay

    +
    @@ -5892,11 +6448,13 @@ Variables
    -

    Definition at line 325 of file hidusagestr.h.

    +

    Definition at line 325 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePause

    +
    @@ -5906,11 +6464,13 @@ Variables
    -

    Definition at line 326 of file hidusagestr.h.

    +

    Definition at line 326 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRecord

    +
    @@ -5920,11 +6480,13 @@ Variables
    -

    Definition at line 327 of file hidusagestr.h.

    +

    Definition at line 327 of file hidusagestr.h.

    - + +

    ◆ pstrUsageError

    +
    @@ -5934,11 +6496,13 @@ Variables
    -

    Definition at line 328 of file hidusagestr.h.

    +

    Definition at line 328 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSelectedIndicator

    +
    @@ -5948,11 +6512,13 @@ Variables
    -

    Definition at line 329 of file hidusagestr.h.

    +

    Definition at line 329 of file hidusagestr.h.

    - + +

    ◆ pstrUsageInUseIndicator

    +
    @@ -5962,11 +6528,13 @@ Variables
    -

    Definition at line 330 of file hidusagestr.h.

    +

    Definition at line 330 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMultiModeIndicator

    +
    @@ -5976,11 +6544,13 @@ Variables
    -

    Definition at line 331 of file hidusagestr.h.

    +

    Definition at line 331 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorOn

    +
    @@ -5990,11 +6560,13 @@ Variables
    -

    Definition at line 332 of file hidusagestr.h.

    +

    Definition at line 332 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorFlash

    +
    @@ -6004,11 +6576,13 @@ Variables
    -

    Definition at line 333 of file hidusagestr.h.

    +

    Definition at line 333 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorSlowBlink

    +
    @@ -6018,11 +6592,13 @@ Variables
    -

    Definition at line 334 of file hidusagestr.h.

    +

    Definition at line 334 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorFastBlink

    +
    @@ -6032,11 +6608,13 @@ Variables
    -

    Definition at line 335 of file hidusagestr.h.

    +

    Definition at line 335 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorOff

    +
    @@ -6046,11 +6624,13 @@ Variables
    -

    Definition at line 336 of file hidusagestr.h.

    +

    Definition at line 336 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlashOnTime

    +
    @@ -6060,11 +6640,13 @@ Variables
    -

    Definition at line 337 of file hidusagestr.h.

    +

    Definition at line 337 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSlowBlinkOnTime

    +
    @@ -6074,11 +6656,13 @@ Variables
    -

    Definition at line 338 of file hidusagestr.h.

    +

    Definition at line 338 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSlowBlinkOffTime

    +
    @@ -6088,11 +6672,13 @@ Variables
    -

    Definition at line 339 of file hidusagestr.h.

    +

    Definition at line 339 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFastBlinkOnTime

    +
    @@ -6102,11 +6688,13 @@ Variables
    -

    Definition at line 340 of file hidusagestr.h.

    +

    Definition at line 340 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFastBlinkOffTime

    +
    @@ -6116,11 +6704,13 @@ Variables
    -

    Definition at line 341 of file hidusagestr.h.

    +

    Definition at line 341 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorColor

    +
    @@ -6130,11 +6720,13 @@ Variables
    -

    Definition at line 342 of file hidusagestr.h.

    +

    Definition at line 342 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorRed

    +
    @@ -6144,11 +6736,13 @@ Variables
    -

    Definition at line 343 of file hidusagestr.h.

    +

    Definition at line 343 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorGreen

    +
    @@ -6158,11 +6752,13 @@ Variables
    -

    Definition at line 344 of file hidusagestr.h.

    +

    Definition at line 344 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIndicatorAmber

    +
    @@ -6172,11 +6768,13 @@ Variables
    -

    Definition at line 345 of file hidusagestr.h.

    +

    Definition at line 345 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGenericIndicator

    +
    @@ -6186,11 +6784,13 @@ Variables
    -

    Definition at line 346 of file hidusagestr.h.

    +

    Definition at line 346 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSystemSuspend

    +
    @@ -6200,11 +6800,13 @@ Variables
    -

    Definition at line 347 of file hidusagestr.h.

    +

    Definition at line 347 of file hidusagestr.h.

    - + +

    ◆ pstrUsageExternalPowerConnected

    +
    @@ -6214,11 +6816,13 @@ Variables
    -

    Definition at line 348 of file hidusagestr.h.

    +

    Definition at line 348 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhone

    +
    @@ -6228,11 +6832,13 @@ Variables
    -

    Definition at line 351 of file hidusagestr.h.

    +

    Definition at line 351 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAnsweringMachine

    +
    @@ -6242,11 +6848,13 @@ Variables
    -

    Definition at line 352 of file hidusagestr.h.

    +

    Definition at line 352 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMessageControls

    +
    @@ -6256,11 +6864,13 @@ Variables
    -

    Definition at line 353 of file hidusagestr.h.

    +

    Definition at line 353 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHandset

    +
    @@ -6270,11 +6880,13 @@ Variables
    -

    Definition at line 354 of file hidusagestr.h.

    +

    Definition at line 354 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHeadset

    +
    @@ -6284,11 +6896,13 @@ Variables
    -

    Definition at line 355 of file hidusagestr.h.

    +

    Definition at line 355 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTelephonyKeyPad

    +
    @@ -6298,11 +6912,13 @@ Variables
    -

    Definition at line 356 of file hidusagestr.h.

    +

    Definition at line 356 of file hidusagestr.h.

    - + +

    ◆ pstrUsageProgrammableButton

    +
    @@ -6312,11 +6928,13 @@ Variables
    -

    Definition at line 357 of file hidusagestr.h.

    +

    Definition at line 357 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHookSwitch

    +
    @@ -6326,11 +6944,13 @@ Variables
    -

    Definition at line 358 of file hidusagestr.h.

    +

    Definition at line 358 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFlash

    +
    @@ -6340,11 +6960,13 @@ Variables
    -

    Definition at line 359 of file hidusagestr.h.

    +

    Definition at line 359 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFeature

    +
    @@ -6354,11 +6976,13 @@ Variables
    -

    Definition at line 360 of file hidusagestr.h.

    +

    Definition at line 360 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRedial

    +
    @@ -6368,11 +6992,13 @@ Variables
    -

    Definition at line 362 of file hidusagestr.h.

    +

    Definition at line 362 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTransfer

    +
    @@ -6382,11 +7008,13 @@ Variables
    -

    Definition at line 363 of file hidusagestr.h.

    +

    Definition at line 363 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDrop

    +
    @@ -6396,11 +7024,13 @@ Variables
    -

    Definition at line 364 of file hidusagestr.h.

    +

    Definition at line 364 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePark

    +
    @@ -6410,11 +7040,13 @@ Variables
    -

    Definition at line 365 of file hidusagestr.h.

    +

    Definition at line 365 of file hidusagestr.h.

    - + +

    ◆ pstrUsageForwardCalls

    +
    @@ -6424,11 +7056,13 @@ Variables
    -

    Definition at line 366 of file hidusagestr.h.

    +

    Definition at line 366 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAlternateFunction

    +
    @@ -6438,11 +7072,13 @@ Variables
    -

    Definition at line 367 of file hidusagestr.h.

    +

    Definition at line 367 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLine

    +
    @@ -6452,11 +7088,13 @@ Variables
    -

    Definition at line 368 of file hidusagestr.h.

    +

    Definition at line 368 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpeakerPhone

    +
    @@ -6466,11 +7104,13 @@ Variables
    -

    Definition at line 369 of file hidusagestr.h.

    +

    Definition at line 369 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRingEnable

    +
    @@ -6480,11 +7120,13 @@ Variables
    -

    Definition at line 371 of file hidusagestr.h.

    +

    Definition at line 371 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRingSelect

    +
    @@ -6494,11 +7136,13 @@ Variables
    -

    Definition at line 372 of file hidusagestr.h.

    +

    Definition at line 372 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneMute

    +
    @@ -6508,11 +7152,13 @@ Variables
    -

    Definition at line 373 of file hidusagestr.h.

    +

    Definition at line 373 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCallerID

    +
    @@ -6522,11 +7168,13 @@ Variables
    -

    Definition at line 374 of file hidusagestr.h.

    +

    Definition at line 374 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSend

    +
    @@ -6536,11 +7184,13 @@ Variables
    -

    Definition at line 375 of file hidusagestr.h.

    +

    Definition at line 375 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpeedDial

    +
    @@ -6550,11 +7200,13 @@ Variables
    -

    Definition at line 376 of file hidusagestr.h.

    +

    Definition at line 376 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStoreNumber

    +
    @@ -6564,11 +7216,13 @@ Variables
    -

    Definition at line 377 of file hidusagestr.h.

    +

    Definition at line 377 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRecallNumber

    +
    @@ -6578,11 +7232,13 @@ Variables
    -

    Definition at line 378 of file hidusagestr.h.

    +

    Definition at line 378 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneDirectory

    +
    @@ -6592,11 +7248,13 @@ Variables
    -

    Definition at line 379 of file hidusagestr.h.

    +

    Definition at line 379 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVoiceMail

    +
    @@ -6606,11 +7264,13 @@ Variables
    -

    Definition at line 380 of file hidusagestr.h.

    +

    Definition at line 380 of file hidusagestr.h.

    - + +

    ◆ pstrUsageScreenCalls

    +
    @@ -6620,11 +7280,13 @@ Variables
    -

    Definition at line 381 of file hidusagestr.h.

    +

    Definition at line 381 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMessage

    +
    @@ -6634,11 +7296,13 @@ Variables
    -

    Definition at line 383 of file hidusagestr.h.

    +

    Definition at line 383 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAnswerOnOff

    +
    @@ -6648,11 +7312,13 @@ Variables
    -

    Definition at line 384 of file hidusagestr.h.

    +

    Definition at line 384 of file hidusagestr.h.

    - + +

    ◆ pstrUsageInsideDialTone

    +
    @@ -6662,11 +7328,13 @@ Variables
    -

    Definition at line 385 of file hidusagestr.h.

    +

    Definition at line 385 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOutsideDialTone

    +
    @@ -6676,11 +7344,13 @@ Variables
    -

    Definition at line 386 of file hidusagestr.h.

    +

    Definition at line 386 of file hidusagestr.h.

    - + +

    ◆ pstrUsageInsideRingTone

    +
    @@ -6690,11 +7360,13 @@ Variables
    -

    Definition at line 387 of file hidusagestr.h.

    +

    Definition at line 387 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOutsideRingTone

    +
    @@ -6704,11 +7376,13 @@ Variables
    -

    Definition at line 388 of file hidusagestr.h.

    +

    Definition at line 388 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePriorityRingTone

    +
    @@ -6718,11 +7392,13 @@ Variables
    -

    Definition at line 389 of file hidusagestr.h.

    +

    Definition at line 389 of file hidusagestr.h.

    - + +

    ◆ pstrUsageInsideRingback

    +
    @@ -6732,11 +7408,13 @@ Variables
    -

    Definition at line 390 of file hidusagestr.h.

    +

    Definition at line 390 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePriorityRingback

    +
    @@ -6746,11 +7424,13 @@ Variables
    -

    Definition at line 391 of file hidusagestr.h.

    +

    Definition at line 391 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLineBusyTone

    +
    @@ -6760,11 +7440,13 @@ Variables
    -

    Definition at line 392 of file hidusagestr.h.

    +

    Definition at line 392 of file hidusagestr.h.

    - + +

    ◆ pstrUsageReorderTone

    +
    @@ -6774,11 +7456,13 @@ Variables
    -

    Definition at line 393 of file hidusagestr.h.

    +

    Definition at line 393 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCallWaitingTone

    +
    @@ -6788,11 +7472,13 @@ Variables
    -

    Definition at line 394 of file hidusagestr.h.

    +

    Definition at line 394 of file hidusagestr.h.

    - + +

    ◆ pstrUsageConfirmationTone1

    +
    @@ -6802,11 +7488,13 @@ Variables
    -

    Definition at line 395 of file hidusagestr.h.

    +

    Definition at line 395 of file hidusagestr.h.

    - + +

    ◆ pstrUsageConfirmationTone2

    +
    @@ -6816,11 +7504,13 @@ Variables
    -

    Definition at line 396 of file hidusagestr.h.

    +

    Definition at line 396 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTonesOff

    +
    @@ -6830,11 +7520,13 @@ Variables
    -

    Definition at line 397 of file hidusagestr.h.

    +

    Definition at line 397 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOutsideRingback

    +
    @@ -6844,11 +7536,13 @@ Variables
    -

    Definition at line 398 of file hidusagestr.h.

    +

    Definition at line 398 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRinger

    +
    @@ -6858,11 +7552,13 @@ Variables
    -

    Definition at line 399 of file hidusagestr.h.

    +

    Definition at line 399 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey0

    +
    @@ -6872,11 +7568,13 @@ Variables
    -

    Definition at line 400 of file hidusagestr.h.

    +

    Definition at line 400 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey1

    +
    @@ -6886,11 +7584,13 @@ Variables
    -

    Definition at line 401 of file hidusagestr.h.

    +

    Definition at line 401 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey2

    +
    @@ -6900,11 +7600,13 @@ Variables
    -

    Definition at line 402 of file hidusagestr.h.

    +

    Definition at line 402 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey3

    +
    @@ -6914,11 +7616,13 @@ Variables
    -

    Definition at line 403 of file hidusagestr.h.

    +

    Definition at line 403 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey4

    +
    @@ -6928,11 +7632,13 @@ Variables
    -

    Definition at line 404 of file hidusagestr.h.

    +

    Definition at line 404 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey5

    +
    @@ -6942,11 +7648,13 @@ Variables
    -

    Definition at line 405 of file hidusagestr.h.

    +

    Definition at line 405 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey6

    +
    @@ -6956,11 +7664,13 @@ Variables
    -

    Definition at line 406 of file hidusagestr.h.

    +

    Definition at line 406 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey7

    +
    @@ -6970,11 +7680,13 @@ Variables
    -

    Definition at line 407 of file hidusagestr.h.

    +

    Definition at line 407 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey8

    +
    @@ -6984,11 +7696,13 @@ Variables
    -

    Definition at line 408 of file hidusagestr.h.

    +

    Definition at line 408 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKey9

    +
    @@ -6998,11 +7712,13 @@ Variables
    -

    Definition at line 409 of file hidusagestr.h.

    +

    Definition at line 409 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKeyStar

    +
    @@ -7012,11 +7728,13 @@ Variables
    -

    Definition at line 410 of file hidusagestr.h.

    +

    Definition at line 410 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKeyPound

    +
    @@ -7026,11 +7744,13 @@ Variables
    -

    Definition at line 411 of file hidusagestr.h.

    +

    Definition at line 411 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKeyA

    +
    @@ -7040,11 +7760,13 @@ Variables
    -

    Definition at line 412 of file hidusagestr.h.

    +

    Definition at line 412 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKeyB

    +
    @@ -7054,11 +7776,13 @@ Variables
    -

    Definition at line 413 of file hidusagestr.h.

    +

    Definition at line 413 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKeyC

    +
    @@ -7068,11 +7792,13 @@ Variables
    -

    Definition at line 414 of file hidusagestr.h.

    +

    Definition at line 414 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePhoneKeyD

    +
    @@ -7082,11 +7808,13 @@ Variables
    -

    Definition at line 415 of file hidusagestr.h.

    +

    Definition at line 415 of file hidusagestr.h.

    - + +

    ◆ pstrUsageConsumerControl

    +
    @@ -7096,11 +7824,13 @@ Variables
    -

    Definition at line 418 of file hidusagestr.h.

    +

    Definition at line 418 of file hidusagestr.h.

    - + +

    ◆ pstrUsageNumericKeyPad

    +
    @@ -7110,11 +7840,13 @@ Variables
    -

    Definition at line 419 of file hidusagestr.h.

    +

    Definition at line 419 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHeadphone

    +
    @@ -7124,11 +7856,13 @@ Variables
    -

    Definition at line 422 of file hidusagestr.h.

    +

    Definition at line 422 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGraphicEqualizer

    +
    @@ -7138,11 +7872,13 @@ Variables
    -

    Definition at line 423 of file hidusagestr.h.

    +

    Definition at line 423 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePlus10

    +
    @@ -7152,11 +7888,13 @@ Variables
    -

    Definition at line 424 of file hidusagestr.h.

    +

    Definition at line 424 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePlus100

    +
    @@ -7166,11 +7904,13 @@ Variables
    -

    Definition at line 425 of file hidusagestr.h.

    +

    Definition at line 425 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAMPM

    +
    @@ -7180,11 +7920,13 @@ Variables
    -

    Definition at line 426 of file hidusagestr.h.

    +

    Definition at line 426 of file hidusagestr.h.

    - + +

    ◆ pstrUsageReset

    +
    @@ -7194,11 +7936,13 @@ Variables
    -

    Definition at line 428 of file hidusagestr.h.

    +

    Definition at line 428 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSleep

    +
    @@ -7208,11 +7952,13 @@ Variables
    -

    Definition at line 429 of file hidusagestr.h.

    +

    Definition at line 429 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSleepAfter

    +
    @@ -7222,11 +7968,13 @@ Variables
    -

    Definition at line 430 of file hidusagestr.h.

    +

    Definition at line 430 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSleepMode

    +
    @@ -7236,11 +7984,13 @@ Variables
    -

    Definition at line 431 of file hidusagestr.h.

    +

    Definition at line 431 of file hidusagestr.h.

    - + +

    ◆ pstrUsageIllumination

    +
    @@ -7250,11 +8000,13 @@ Variables
    -

    Definition at line 432 of file hidusagestr.h.

    +

    Definition at line 432 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFunctionButtons

    +
    @@ -7264,11 +8016,13 @@ Variables
    -

    Definition at line 433 of file hidusagestr.h.

    +

    Definition at line 433 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenu

    +
    @@ -7278,11 +8032,13 @@ Variables
    -

    Definition at line 434 of file hidusagestr.h.

    +

    Definition at line 434 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenuPick

    +
    @@ -7292,11 +8048,13 @@ Variables
    -

    Definition at line 435 of file hidusagestr.h.

    +

    Definition at line 435 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenuUp

    +
    @@ -7306,11 +8064,13 @@ Variables
    -

    Definition at line 436 of file hidusagestr.h.

    +

    Definition at line 436 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenuDown

    +
    @@ -7320,11 +8080,13 @@ Variables
    -

    Definition at line 437 of file hidusagestr.h.

    +

    Definition at line 437 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenuLeft

    +
    @@ -7334,11 +8096,13 @@ Variables
    -

    Definition at line 438 of file hidusagestr.h.

    +

    Definition at line 438 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenuRight

    +
    @@ -7348,11 +8112,13 @@ Variables
    -

    Definition at line 439 of file hidusagestr.h.

    +

    Definition at line 439 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenuEscape

    +
    @@ -7362,11 +8128,13 @@ Variables
    -

    Definition at line 440 of file hidusagestr.h.

    +

    Definition at line 440 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenuValueIncrease

    +
    @@ -7376,11 +8144,13 @@ Variables
    -

    Definition at line 441 of file hidusagestr.h.

    +

    Definition at line 441 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMenuValueDecrease

    +
    @@ -7390,11 +8160,13 @@ Variables
    -

    Definition at line 442 of file hidusagestr.h.

    +

    Definition at line 442 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDataOnScreen

    +
    @@ -7404,11 +8176,13 @@ Variables
    -

    Definition at line 443 of file hidusagestr.h.

    +

    Definition at line 443 of file hidusagestr.h.

    - + +

    ◆ pstrUsageClosedCaption

    +
    @@ -7418,11 +8192,13 @@ Variables
    -

    Definition at line 444 of file hidusagestr.h.

    +

    Definition at line 444 of file hidusagestr.h.

    - + +

    ◆ pstrUsageClosedCaptionSelect

    +
    @@ -7432,11 +8208,13 @@ Variables
    -

    Definition at line 445 of file hidusagestr.h.

    +

    Definition at line 445 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVCRTV

    +
    @@ -7446,11 +8224,13 @@ Variables
    -

    Definition at line 446 of file hidusagestr.h.

    +

    Definition at line 446 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBroadcastMode

    +
    @@ -7460,11 +8240,13 @@ Variables
    -

    Definition at line 447 of file hidusagestr.h.

    +

    Definition at line 447 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSnapshot

    +
    @@ -7474,11 +8256,13 @@ Variables
    -

    Definition at line 448 of file hidusagestr.h.

    +

    Definition at line 448 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStill

    +
    @@ -7488,11 +8272,13 @@ Variables
    -

    Definition at line 449 of file hidusagestr.h.

    +

    Definition at line 449 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSelection

    +
    @@ -7502,11 +8288,13 @@ Variables
    -

    Definition at line 450 of file hidusagestr.h.

    +

    Definition at line 450 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAssignSelection

    +
    @@ -7516,11 +8304,13 @@ Variables
    -

    Definition at line 451 of file hidusagestr.h.

    +

    Definition at line 451 of file hidusagestr.h.

    - + +

    ◆ pstrUsageModeStep

    +
    @@ -7530,11 +8320,13 @@ Variables
    -

    Definition at line 452 of file hidusagestr.h.

    +

    Definition at line 452 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRecallLast

    +
    @@ -7544,11 +8336,13 @@ Variables
    -

    Definition at line 453 of file hidusagestr.h.

    +

    Definition at line 453 of file hidusagestr.h.

    - + +

    ◆ pstrUsageEnterChannel

    +
    @@ -7558,11 +8352,13 @@ Variables
    -

    Definition at line 454 of file hidusagestr.h.

    +

    Definition at line 454 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOrderMovie

    +
    @@ -7572,11 +8368,13 @@ Variables
    -

    Definition at line 455 of file hidusagestr.h.

    +

    Definition at line 455 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannel

    +
    @@ -7586,11 +8384,13 @@ Variables
    -

    Definition at line 456 of file hidusagestr.h.

    +

    Definition at line 456 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelection

    +
    @@ -7600,11 +8400,13 @@ Variables
    -

    Definition at line 457 of file hidusagestr.h.

    +

    Definition at line 457 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectComputer

    +
    @@ -7614,11 +8416,13 @@ Variables
    -

    Definition at line 458 of file hidusagestr.h.

    +

    Definition at line 458 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectTV

    +
    @@ -7628,11 +8432,13 @@ Variables
    -

    Definition at line 459 of file hidusagestr.h.

    +

    Definition at line 459 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectWWW

    +
    @@ -7642,11 +8448,13 @@ Variables
    -

    Definition at line 460 of file hidusagestr.h.

    +

    Definition at line 460 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectDVD

    +
    @@ -7656,11 +8464,13 @@ Variables
    -

    Definition at line 461 of file hidusagestr.h.

    +

    Definition at line 461 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectTelephone

    +
    @@ -7670,11 +8480,13 @@ Variables
    -

    Definition at line 462 of file hidusagestr.h.

    +

    Definition at line 462 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectProgramGuide

    +
    @@ -7684,11 +8496,13 @@ Variables
    -

    Definition at line 463 of file hidusagestr.h.

    +

    Definition at line 463 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectVideoPhone

    +
    @@ -7698,11 +8512,13 @@ Variables
    -

    Definition at line 464 of file hidusagestr.h.

    +

    Definition at line 464 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectGames

    +
    @@ -7712,11 +8528,13 @@ Variables
    -

    Definition at line 465 of file hidusagestr.h.

    +

    Definition at line 465 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectMessages

    +
    @@ -7726,11 +8544,13 @@ Variables
    -

    Definition at line 466 of file hidusagestr.h.

    +

    Definition at line 466 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectCD

    +
    @@ -7740,11 +8560,13 @@ Variables
    -

    Definition at line 467 of file hidusagestr.h.

    +

    Definition at line 467 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectVCR

    +
    @@ -7754,11 +8576,13 @@ Variables
    -

    Definition at line 468 of file hidusagestr.h.

    +

    Definition at line 468 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectTuner

    +
    @@ -7768,11 +8592,13 @@ Variables
    -

    Definition at line 469 of file hidusagestr.h.

    +

    Definition at line 469 of file hidusagestr.h.

    - + +

    ◆ pstrUsageQuit

    +
    @@ -7782,11 +8608,13 @@ Variables
    -

    Definition at line 470 of file hidusagestr.h.

    +

    Definition at line 470 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHelp

    +
    @@ -7796,11 +8624,13 @@ Variables
    -

    Definition at line 471 of file hidusagestr.h.

    +

    Definition at line 471 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectTape

    +
    @@ -7810,11 +8640,13 @@ Variables
    -

    Definition at line 472 of file hidusagestr.h.

    +

    Definition at line 472 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectCable

    +
    @@ -7824,11 +8656,13 @@ Variables
    -

    Definition at line 473 of file hidusagestr.h.

    +

    Definition at line 473 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectSatellite

    +
    @@ -7838,11 +8672,13 @@ Variables
    -

    Definition at line 474 of file hidusagestr.h.

    +

    Definition at line 474 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectSecurity

    +
    @@ -7852,11 +8688,13 @@ Variables
    -

    Definition at line 475 of file hidusagestr.h.

    +

    Definition at line 475 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectHome

    +
    @@ -7866,11 +8704,13 @@ Variables
    -

    Definition at line 476 of file hidusagestr.h.

    +

    Definition at line 476 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectCall

    +
    @@ -7880,11 +8720,13 @@ Variables
    -

    Definition at line 477 of file hidusagestr.h.

    +

    Definition at line 477 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelIncrement

    +
    @@ -7894,11 +8736,13 @@ Variables
    -

    Definition at line 478 of file hidusagestr.h.

    +

    Definition at line 478 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelDecrement

    +
    @@ -7908,11 +8752,13 @@ Variables
    -

    Definition at line 479 of file hidusagestr.h.

    +

    Definition at line 479 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMediaSelectSAP

    +
    @@ -7922,11 +8768,13 @@ Variables
    -

    Definition at line 480 of file hidusagestr.h.

    +

    Definition at line 480 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVCRPlus

    +
    @@ -7936,11 +8784,13 @@ Variables
    -

    Definition at line 481 of file hidusagestr.h.

    +

    Definition at line 481 of file hidusagestr.h.

    - + +

    ◆ pstrUsageOnce

    +
    @@ -7950,11 +8800,13 @@ Variables
    -

    Definition at line 482 of file hidusagestr.h.

    +

    Definition at line 482 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDaily

    +
    @@ -7964,11 +8816,13 @@ Variables
    -

    Definition at line 483 of file hidusagestr.h.

    +

    Definition at line 483 of file hidusagestr.h.

    - + +

    ◆ pstrUsageWeekly

    +
    @@ -7978,11 +8832,13 @@ Variables
    -

    Definition at line 484 of file hidusagestr.h.

    +

    Definition at line 484 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMonthly

    +
    @@ -7992,11 +8848,13 @@ Variables
    -

    Definition at line 485 of file hidusagestr.h.

    +

    Definition at line 485 of file hidusagestr.h.

    - + +

    ◆ pstrUsageScanNextTrack

    +
    @@ -8006,11 +8864,13 @@ Variables
    -

    Definition at line 491 of file hidusagestr.h.

    +

    Definition at line 491 of file hidusagestr.h.

    - + +

    ◆ pstrUsageScanPreviousTrack

    +
    @@ -8020,11 +8880,13 @@ Variables
    -

    Definition at line 492 of file hidusagestr.h.

    +

    Definition at line 492 of file hidusagestr.h.

    - + +

    ◆ pstrUsageEject

    +
    @@ -8034,11 +8896,13 @@ Variables
    -

    Definition at line 494 of file hidusagestr.h.

    +

    Definition at line 494 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRandomPlay

    +
    @@ -8048,11 +8912,13 @@ Variables
    -

    Definition at line 495 of file hidusagestr.h.

    +

    Definition at line 495 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSelectDisk

    +
    @@ -8062,11 +8928,13 @@ Variables
    -

    Definition at line 496 of file hidusagestr.h.

    +

    Definition at line 496 of file hidusagestr.h.

    - + +

    ◆ pstrUsageEnterDisk

    +
    @@ -8076,11 +8944,13 @@ Variables
    -

    Definition at line 497 of file hidusagestr.h.

    +

    Definition at line 497 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTracking

    +
    @@ -8090,11 +8960,13 @@ Variables
    -

    Definition at line 499 of file hidusagestr.h.

    +

    Definition at line 499 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTrackNormal

    +
    @@ -8104,11 +8976,13 @@ Variables
    -

    Definition at line 500 of file hidusagestr.h.

    +

    Definition at line 500 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSlowTracking

    +
    @@ -8118,11 +8992,13 @@ Variables
    -

    Definition at line 501 of file hidusagestr.h.

    +

    Definition at line 501 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFrameForward

    +
    @@ -8132,11 +9008,13 @@ Variables
    -

    Definition at line 502 of file hidusagestr.h.

    +

    Definition at line 502 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFrameBackwards

    +
    @@ -8146,11 +9024,13 @@ Variables
    -

    Definition at line 503 of file hidusagestr.h.

    +

    Definition at line 503 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMark

    +
    @@ -8160,11 +9040,13 @@ Variables
    -

    Definition at line 504 of file hidusagestr.h.

    +

    Definition at line 504 of file hidusagestr.h.

    - + +

    ◆ pstrUsageClearMark

    +
    @@ -8174,11 +9056,13 @@ Variables
    -

    Definition at line 505 of file hidusagestr.h.

    +

    Definition at line 505 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRepeatFromMark

    +
    @@ -8188,11 +9072,13 @@ Variables
    -

    Definition at line 506 of file hidusagestr.h.

    +

    Definition at line 506 of file hidusagestr.h.

    - + +

    ◆ pstrUsageReturnToMark

    +
    @@ -8202,11 +9088,13 @@ Variables
    -

    Definition at line 507 of file hidusagestr.h.

    +

    Definition at line 507 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSearchMarkForward

    +
    @@ -8216,11 +9104,13 @@ Variables
    -

    Definition at line 508 of file hidusagestr.h.

    +

    Definition at line 508 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSearchMarkBackwards

    +
    @@ -8230,11 +9120,13 @@ Variables
    -

    Definition at line 509 of file hidusagestr.h.

    +

    Definition at line 509 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCounterReset

    +
    @@ -8244,11 +9136,13 @@ Variables
    -

    Definition at line 510 of file hidusagestr.h.

    +

    Definition at line 510 of file hidusagestr.h.

    - + +

    ◆ pstrUsageShowCounter

    +
    @@ -8258,11 +9152,13 @@ Variables
    -

    Definition at line 511 of file hidusagestr.h.

    +

    Definition at line 511 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTrackingIncrement

    +
    @@ -8272,11 +9168,13 @@ Variables
    -

    Definition at line 512 of file hidusagestr.h.

    +

    Definition at line 512 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTrackingDecrement

    +
    @@ -8286,11 +9184,13 @@ Variables
    -

    Definition at line 513 of file hidusagestr.h.

    +

    Definition at line 513 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStopEject

    +
    @@ -8300,11 +9200,13 @@ Variables
    -

    Definition at line 514 of file hidusagestr.h.

    +

    Definition at line 514 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePlayPause

    +
    @@ -8314,11 +9216,13 @@ Variables
    -

    Definition at line 515 of file hidusagestr.h.

    +

    Definition at line 515 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePlaySkip

    +
    @@ -8328,11 +9232,13 @@ Variables
    -

    Definition at line 516 of file hidusagestr.h.

    +

    Definition at line 516 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVolume

    +
    @@ -8342,11 +9248,13 @@ Variables
    -

    Definition at line 517 of file hidusagestr.h.

    +

    Definition at line 517 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBalance

    +
    @@ -8356,11 +9264,13 @@ Variables
    -

    Definition at line 518 of file hidusagestr.h.

    +

    Definition at line 518 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBass

    +
    @@ -8370,11 +9280,13 @@ Variables
    -

    Definition at line 520 of file hidusagestr.h.

    +

    Definition at line 520 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTreble

    +
    @@ -8384,11 +9296,13 @@ Variables
    -

    Definition at line 521 of file hidusagestr.h.

    +

    Definition at line 521 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBassBoost

    +
    @@ -8398,11 +9312,13 @@ Variables
    -

    Definition at line 522 of file hidusagestr.h.

    +

    Definition at line 522 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSurroundMode

    +
    @@ -8412,11 +9328,13 @@ Variables
    -

    Definition at line 523 of file hidusagestr.h.

    +

    Definition at line 523 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLoudness

    +
    @@ -8426,11 +9344,13 @@ Variables
    -

    Definition at line 524 of file hidusagestr.h.

    +

    Definition at line 524 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMPX

    +
    @@ -8440,11 +9360,13 @@ Variables
    -

    Definition at line 525 of file hidusagestr.h.

    +

    Definition at line 525 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVolumeIncrement

    +
    @@ -8454,11 +9376,13 @@ Variables
    -

    Definition at line 526 of file hidusagestr.h.

    +

    Definition at line 526 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVolumeDecrement

    +
    @@ -8468,11 +9392,13 @@ Variables
    -

    Definition at line 527 of file hidusagestr.h.

    +

    Definition at line 527 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpeedSelect

    +
    @@ -8482,11 +9408,13 @@ Variables
    -

    Definition at line 528 of file hidusagestr.h.

    +

    Definition at line 528 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePlaybackSpeed

    +
    @@ -8496,11 +9424,13 @@ Variables
    -

    Definition at line 529 of file hidusagestr.h.

    +

    Definition at line 529 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStandardPlay

    +
    @@ -8510,11 +9440,13 @@ Variables
    -

    Definition at line 530 of file hidusagestr.h.

    +

    Definition at line 530 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLongPlay

    +
    @@ -8524,11 +9456,13 @@ Variables
    -

    Definition at line 531 of file hidusagestr.h.

    +

    Definition at line 531 of file hidusagestr.h.

    - + +

    ◆ pstrUsageExtendedPlay

    +
    @@ -8538,11 +9472,13 @@ Variables
    -

    Definition at line 532 of file hidusagestr.h.

    +

    Definition at line 532 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSlow

    +
    @@ -8552,11 +9488,13 @@ Variables
    -

    Definition at line 533 of file hidusagestr.h.

    +

    Definition at line 533 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFanEnable

    +
    @@ -8566,11 +9504,13 @@ Variables
    -

    Definition at line 534 of file hidusagestr.h.

    +

    Definition at line 534 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFanSpeed

    +
    @@ -8580,11 +9520,13 @@ Variables
    -

    Definition at line 535 of file hidusagestr.h.

    +

    Definition at line 535 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLightEnable

    +
    @@ -8594,11 +9536,13 @@ Variables
    -

    Definition at line 536 of file hidusagestr.h.

    +

    Definition at line 536 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLightIlluminationLevel

    +
    @@ -8608,11 +9552,13 @@ Variables
    -

    Definition at line 537 of file hidusagestr.h.

    +

    Definition at line 537 of file hidusagestr.h.

    - + +

    ◆ pstrUsageClimateControlEnable

    +
    @@ -8622,11 +9568,13 @@ Variables
    -

    Definition at line 538 of file hidusagestr.h.

    +

    Definition at line 538 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRoomTemperature

    +
    @@ -8636,11 +9584,13 @@ Variables
    -

    Definition at line 539 of file hidusagestr.h.

    +

    Definition at line 539 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSecurityEnable

    +
    @@ -8650,11 +9600,13 @@ Variables
    -

    Definition at line 540 of file hidusagestr.h.

    +

    Definition at line 540 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFireAlarm

    +
    @@ -8664,11 +9616,13 @@ Variables
    -

    Definition at line 541 of file hidusagestr.h.

    +

    Definition at line 541 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePoliceAlarm

    +
    @@ -8678,11 +9632,13 @@ Variables
    -

    Definition at line 542 of file hidusagestr.h.

    +

    Definition at line 542 of file hidusagestr.h.

    - + +

    ◆ pstrUsageProximity

    +
    @@ -8692,11 +9648,13 @@ Variables
    -

    Definition at line 543 of file hidusagestr.h.

    +

    Definition at line 543 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMotion

    +
    @@ -8706,11 +9664,13 @@ Variables
    -

    Definition at line 544 of file hidusagestr.h.

    +

    Definition at line 544 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDuresAlarm

    +
    @@ -8720,11 +9680,13 @@ Variables
    -

    Definition at line 545 of file hidusagestr.h.

    +

    Definition at line 545 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHoldupAlarm

    +
    @@ -8734,11 +9696,13 @@ Variables
    -

    Definition at line 546 of file hidusagestr.h.

    +

    Definition at line 546 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMedicalAlarm

    +
    @@ -8748,11 +9712,13 @@ Variables
    -

    Definition at line 547 of file hidusagestr.h.

    +

    Definition at line 547 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBalanceRight

    +
    @@ -8762,11 +9728,13 @@ Variables
    -

    Definition at line 548 of file hidusagestr.h.

    +

    Definition at line 548 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBalanceLeft

    +
    @@ -8776,11 +9744,13 @@ Variables
    -

    Definition at line 549 of file hidusagestr.h.

    +

    Definition at line 549 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBassIncrement

    +
    @@ -8790,11 +9760,13 @@ Variables
    -

    Definition at line 550 of file hidusagestr.h.

    +

    Definition at line 550 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBassDecrement

    +
    @@ -8804,11 +9776,13 @@ Variables
    -

    Definition at line 551 of file hidusagestr.h.

    +

    Definition at line 551 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTrebleIncrement

    +
    @@ -8818,11 +9792,13 @@ Variables
    -

    Definition at line 552 of file hidusagestr.h.

    +

    Definition at line 552 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTrebleDecrement

    +
    @@ -8832,11 +9808,13 @@ Variables
    -

    Definition at line 553 of file hidusagestr.h.

    +

    Definition at line 553 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpeakerSystem

    +
    @@ -8846,11 +9824,13 @@ Variables
    -

    Definition at line 554 of file hidusagestr.h.

    +

    Definition at line 554 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelLeft

    +
    @@ -8860,11 +9840,13 @@ Variables
    -

    Definition at line 555 of file hidusagestr.h.

    +

    Definition at line 555 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelRight

    +
    @@ -8874,11 +9856,13 @@ Variables
    -

    Definition at line 556 of file hidusagestr.h.

    +

    Definition at line 556 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelCenter

    +
    @@ -8888,11 +9872,13 @@ Variables
    -

    Definition at line 557 of file hidusagestr.h.

    +

    Definition at line 557 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelFront

    +
    @@ -8902,11 +9888,13 @@ Variables
    -

    Definition at line 558 of file hidusagestr.h.

    +

    Definition at line 558 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelCenterFront

    +
    @@ -8916,11 +9904,13 @@ Variables
    -

    Definition at line 559 of file hidusagestr.h.

    +

    Definition at line 559 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelSide

    +
    @@ -8930,11 +9920,13 @@ Variables
    -

    Definition at line 560 of file hidusagestr.h.

    +

    Definition at line 560 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelSurround

    +
    @@ -8944,11 +9936,13 @@ Variables
    -

    Definition at line 561 of file hidusagestr.h.

    +

    Definition at line 561 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelLowFreqEnhancement

    +
    @@ -8958,11 +9952,13 @@ Variables
    -

    Definition at line 562 of file hidusagestr.h.

    +

    Definition at line 562 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelTop

    +
    @@ -8972,11 +9968,13 @@ Variables
    -

    Definition at line 563 of file hidusagestr.h.

    +

    Definition at line 563 of file hidusagestr.h.

    - + +

    ◆ pstrUsageChannelUnknown

    +
    @@ -8986,11 +9984,13 @@ Variables
    -

    Definition at line 564 of file hidusagestr.h.

    +

    Definition at line 564 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSubChannel

    +
    @@ -9000,11 +10000,13 @@ Variables
    -

    Definition at line 565 of file hidusagestr.h.

    +

    Definition at line 565 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSubChannelIncrement

    +
    @@ -9014,11 +10016,13 @@ Variables
    -

    Definition at line 566 of file hidusagestr.h.

    +

    Definition at line 566 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSubChannelDecrement

    +
    @@ -9028,11 +10032,13 @@ Variables
    -

    Definition at line 567 of file hidusagestr.h.

    +

    Definition at line 567 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAlternateAudioIncrement

    +
    @@ -9042,11 +10048,13 @@ Variables
    -

    Definition at line 568 of file hidusagestr.h.

    +

    Definition at line 568 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAlternateAudioDecrement

    +
    @@ -9056,11 +10064,13 @@ Variables
    -

    Definition at line 569 of file hidusagestr.h.

    +

    Definition at line 569 of file hidusagestr.h.

    - + +

    ◆ pstrUsageApplicationLaunchButtons

    +
    @@ -9070,11 +10080,13 @@ Variables
    -

    Definition at line 570 of file hidusagestr.h.

    +

    Definition at line 570 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALLaunchButtonConfigTool

    +
    @@ -9084,11 +10096,13 @@ Variables
    -

    Definition at line 571 of file hidusagestr.h.

    +

    Definition at line 571 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALProgrammableButton

    +
    @@ -9098,11 +10112,13 @@ Variables
    -

    Definition at line 572 of file hidusagestr.h.

    +

    Definition at line 572 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALConsumerControlConfig

    +
    @@ -9112,11 +10128,13 @@ Variables
    -

    Definition at line 573 of file hidusagestr.h.

    +

    Definition at line 573 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALWordProcessor

    +
    @@ -9126,11 +10144,13 @@ Variables
    -

    Definition at line 574 of file hidusagestr.h.

    +

    Definition at line 574 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALTextEditor

    +
    @@ -9140,11 +10160,13 @@ Variables
    -

    Definition at line 575 of file hidusagestr.h.

    +

    Definition at line 575 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALSpreadsheet

    +
    @@ -9154,11 +10176,13 @@ Variables
    -

    Definition at line 576 of file hidusagestr.h.

    +

    Definition at line 576 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALGraphicsEditor

    +
    @@ -9168,11 +10192,13 @@ Variables
    -

    Definition at line 577 of file hidusagestr.h.

    +

    Definition at line 577 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALPresentationApp

    +
    @@ -9182,11 +10208,13 @@ Variables
    -

    Definition at line 578 of file hidusagestr.h.

    +

    Definition at line 578 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALDatabaseApp

    +
    @@ -9196,11 +10224,13 @@ Variables
    -

    Definition at line 579 of file hidusagestr.h.

    +

    Definition at line 579 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALEmailReader

    +
    @@ -9210,11 +10240,13 @@ Variables
    -

    Definition at line 580 of file hidusagestr.h.

    +

    Definition at line 580 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALNewsreader

    +
    @@ -9224,11 +10256,13 @@ Variables
    -

    Definition at line 581 of file hidusagestr.h.

    +

    Definition at line 581 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALVoicemail

    +
    @@ -9238,11 +10272,13 @@ Variables
    -

    Definition at line 582 of file hidusagestr.h.

    +

    Definition at line 582 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALContactsAddressBook

    +
    @@ -9252,11 +10288,13 @@ Variables
    -

    Definition at line 583 of file hidusagestr.h.

    +

    Definition at line 583 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALCalendarSchedule

    +
    @@ -9266,11 +10304,13 @@ Variables
    -

    Definition at line 584 of file hidusagestr.h.

    +

    Definition at line 584 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALTaskProjectManager

    +
    @@ -9280,11 +10320,13 @@ Variables
    -

    Definition at line 585 of file hidusagestr.h.

    +

    Definition at line 585 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALLogJournalTimecard

    +
    @@ -9294,11 +10336,13 @@ Variables
    -

    Definition at line 586 of file hidusagestr.h.

    +

    Definition at line 586 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALCheckbookFinance

    +
    @@ -9308,11 +10352,13 @@ Variables
    -

    Definition at line 587 of file hidusagestr.h.

    +

    Definition at line 587 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALCalculator

    +
    @@ -9322,11 +10368,13 @@ Variables
    -

    Definition at line 588 of file hidusagestr.h.

    +

    Definition at line 588 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALAVCapturePlayback

    +
    @@ -9336,11 +10384,13 @@ Variables
    -

    Definition at line 589 of file hidusagestr.h.

    +

    Definition at line 589 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALLocalMachineBrowser

    +
    @@ -9350,11 +10400,13 @@ Variables
    -

    Definition at line 590 of file hidusagestr.h.

    +

    Definition at line 590 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALLANWANBrow

    +
    @@ -9364,11 +10416,13 @@ Variables
    -

    Definition at line 591 of file hidusagestr.h.

    +

    Definition at line 591 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALInternetBrowser

    +
    @@ -9378,11 +10432,13 @@ Variables
    -

    Definition at line 592 of file hidusagestr.h.

    +

    Definition at line 592 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALRemoteNetISPConnect

    +
    @@ -9392,11 +10448,13 @@ Variables
    -

    Definition at line 593 of file hidusagestr.h.

    +

    Definition at line 593 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALNetworkConference

    +
    @@ -9406,11 +10464,13 @@ Variables
    -

    Definition at line 594 of file hidusagestr.h.

    +

    Definition at line 594 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALNetworkChat

    +
    @@ -9420,11 +10480,13 @@ Variables
    -

    Definition at line 595 of file hidusagestr.h.

    +

    Definition at line 595 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALTelephonyDialer

    +
    @@ -9434,11 +10496,13 @@ Variables
    -

    Definition at line 596 of file hidusagestr.h.

    +

    Definition at line 596 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALLogon

    +
    @@ -9448,11 +10512,13 @@ Variables
    -

    Definition at line 597 of file hidusagestr.h.

    +

    Definition at line 597 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALLogoff

    +
    @@ -9462,11 +10528,13 @@ Variables
    -

    Definition at line 598 of file hidusagestr.h.

    +

    Definition at line 598 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALLogonLogoff

    +
    @@ -9476,11 +10544,13 @@ Variables
    -

    Definition at line 599 of file hidusagestr.h.

    +

    Definition at line 599 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALTermLockScrSav

    +
    @@ -9490,11 +10560,13 @@ Variables
    -

    Definition at line 600 of file hidusagestr.h.

    +

    Definition at line 600 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALControlPannel

    +
    @@ -9504,11 +10576,13 @@ Variables
    -

    Definition at line 601 of file hidusagestr.h.

    +

    Definition at line 601 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALCommandLineProcessorRun

    +
    @@ -9518,11 +10592,13 @@ Variables
    -

    Definition at line 602 of file hidusagestr.h.

    +

    Definition at line 602 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALProcessTaskManager

    +
    @@ -9532,11 +10608,13 @@ Variables
    -

    Definition at line 603 of file hidusagestr.h.

    +

    Definition at line 603 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALSelectTaskApplication

    +
    @@ -9546,11 +10624,13 @@ Variables
    -

    Definition at line 604 of file hidusagestr.h.

    +

    Definition at line 604 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALNextTaskApplication

    +
    @@ -9560,11 +10640,13 @@ Variables
    -

    Definition at line 605 of file hidusagestr.h.

    +

    Definition at line 605 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALPreviousTaskApplication

    +
    @@ -9574,11 +10656,13 @@ Variables
    -

    Definition at line 606 of file hidusagestr.h.

    +

    Definition at line 606 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALPreemptiveHaltTaskApp

    +
    @@ -9588,11 +10672,13 @@ Variables
    -

    Definition at line 607 of file hidusagestr.h.

    +

    Definition at line 607 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALIntegratedHelpCenter

    +
    @@ -9602,11 +10688,13 @@ Variables
    -

    Definition at line 608 of file hidusagestr.h.

    +

    Definition at line 608 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALDocuments

    +
    @@ -9616,11 +10704,13 @@ Variables
    -

    Definition at line 609 of file hidusagestr.h.

    +

    Definition at line 609 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALThesaurus

    +
    @@ -9630,11 +10720,13 @@ Variables
    -

    Definition at line 610 of file hidusagestr.h.

    +

    Definition at line 610 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALDictionary

    +
    @@ -9644,11 +10736,13 @@ Variables
    -

    Definition at line 611 of file hidusagestr.h.

    +

    Definition at line 611 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALDesktop

    +
    @@ -9658,11 +10752,13 @@ Variables
    -

    Definition at line 612 of file hidusagestr.h.

    +

    Definition at line 612 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALSpellCheck

    +
    @@ -9672,11 +10768,13 @@ Variables
    -

    Definition at line 613 of file hidusagestr.h.

    +

    Definition at line 613 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALGrammarCheck

    +
    @@ -9686,11 +10784,13 @@ Variables
    -

    Definition at line 614 of file hidusagestr.h.

    +

    Definition at line 614 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALWirelessStatus

    +
    @@ -9700,11 +10800,13 @@ Variables
    -

    Definition at line 615 of file hidusagestr.h.

    +

    Definition at line 615 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALKeyboardLayout

    +
    @@ -9714,11 +10816,13 @@ Variables
    -

    Definition at line 616 of file hidusagestr.h.

    +

    Definition at line 616 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALVirusProtection

    +
    @@ -9728,11 +10832,13 @@ Variables
    -

    Definition at line 617 of file hidusagestr.h.

    +

    Definition at line 617 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALEncryption

    +
    @@ -9742,11 +10848,13 @@ Variables
    -

    Definition at line 618 of file hidusagestr.h.

    +

    Definition at line 618 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALScreenSaver

    +
    @@ -9756,11 +10864,13 @@ Variables
    -

    Definition at line 619 of file hidusagestr.h.

    +

    Definition at line 619 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALAlarms

    +
    @@ -9770,11 +10880,13 @@ Variables
    -

    Definition at line 620 of file hidusagestr.h.

    +

    Definition at line 620 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALClock

    +
    @@ -9784,11 +10896,13 @@ Variables
    -

    Definition at line 621 of file hidusagestr.h.

    +

    Definition at line 621 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALFileBrowser

    +
    @@ -9798,11 +10912,13 @@ Variables
    -

    Definition at line 622 of file hidusagestr.h.

    +

    Definition at line 622 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALPowerStatus

    +
    @@ -9812,11 +10928,13 @@ Variables
    -

    Definition at line 623 of file hidusagestr.h.

    +

    Definition at line 623 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALImageBrowser

    +
    @@ -9826,11 +10944,13 @@ Variables
    -

    Definition at line 624 of file hidusagestr.h.

    +

    Definition at line 624 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALAudioBrowser

    +
    @@ -9840,11 +10960,13 @@ Variables
    -

    Definition at line 625 of file hidusagestr.h.

    +

    Definition at line 625 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALMovieBrowser

    +
    @@ -9854,11 +10976,13 @@ Variables
    -

    Definition at line 626 of file hidusagestr.h.

    +

    Definition at line 626 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALDigitalRightsManager

    +
    @@ -9868,11 +10992,13 @@ Variables
    -

    Definition at line 627 of file hidusagestr.h.

    +

    Definition at line 627 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALDigitalWallet

    +
    @@ -9882,11 +11008,13 @@ Variables
    -

    Definition at line 628 of file hidusagestr.h.

    +

    Definition at line 628 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALInstantMessaging

    +
    @@ -9896,11 +11024,13 @@ Variables
    -

    Definition at line 629 of file hidusagestr.h.

    +

    Definition at line 629 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALOEMFeaturesBrowser

    +
    @@ -9910,11 +11040,13 @@ Variables
    -

    Definition at line 630 of file hidusagestr.h.

    +

    Definition at line 630 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALOEMHelp

    +
    @@ -9924,11 +11056,13 @@ Variables
    -

    Definition at line 631 of file hidusagestr.h.

    +

    Definition at line 631 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALOnlineCommunity

    +
    @@ -9938,11 +11072,13 @@ Variables
    -

    Definition at line 632 of file hidusagestr.h.

    +

    Definition at line 632 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALEntertainmentContentBrow

    +
    @@ -9952,11 +11088,13 @@ Variables
    -

    Definition at line 633 of file hidusagestr.h.

    +

    Definition at line 633 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALOnlineShoppingBrowser

    +
    @@ -9966,11 +11104,13 @@ Variables
    -

    Definition at line 634 of file hidusagestr.h.

    +

    Definition at line 634 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALSmartCardInfoHelp

    +
    @@ -9980,11 +11120,13 @@ Variables
    -

    Definition at line 635 of file hidusagestr.h.

    +

    Definition at line 635 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALMarketMonitorFinBrowser

    +
    @@ -9994,11 +11136,13 @@ Variables
    -

    Definition at line 636 of file hidusagestr.h.

    +

    Definition at line 636 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALCustomCorpNewsBrowser

    +
    @@ -10008,11 +11152,13 @@ Variables
    -

    Definition at line 637 of file hidusagestr.h.

    +

    Definition at line 637 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALOnlineActivityBrowser

    +
    @@ -10022,11 +11168,13 @@ Variables
    -

    Definition at line 638 of file hidusagestr.h.

    +

    Definition at line 638 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALResearchSearchBrowser

    +
    @@ -10036,11 +11184,13 @@ Variables
    -

    Definition at line 639 of file hidusagestr.h.

    +

    Definition at line 639 of file hidusagestr.h.

    - + +

    ◆ pstrUsageALAudioPlayer

    +
    @@ -10050,11 +11200,13 @@ Variables
    -

    Definition at line 640 of file hidusagestr.h.

    +

    Definition at line 640 of file hidusagestr.h.

    - + +

    ◆ pstrUsageGenericGUIAppControls

    +
    @@ -10064,11 +11216,13 @@ Variables
    -

    Definition at line 641 of file hidusagestr.h.

    +

    Definition at line 641 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACNew

    +
    @@ -10078,11 +11232,13 @@ Variables
    -

    Definition at line 642 of file hidusagestr.h.

    +

    Definition at line 642 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACOpen

    +
    @@ -10092,11 +11248,13 @@ Variables
    -

    Definition at line 643 of file hidusagestr.h.

    +

    Definition at line 643 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACClose

    +
    @@ -10106,11 +11264,13 @@ Variables
    -

    Definition at line 644 of file hidusagestr.h.

    +

    Definition at line 644 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACExit

    +
    @@ -10120,11 +11280,13 @@ Variables
    -

    Definition at line 645 of file hidusagestr.h.

    +

    Definition at line 645 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACMaximize

    +
    @@ -10134,11 +11296,13 @@ Variables
    -

    Definition at line 646 of file hidusagestr.h.

    +

    Definition at line 646 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACMinimize

    +
    @@ -10148,11 +11312,13 @@ Variables
    -

    Definition at line 647 of file hidusagestr.h.

    +

    Definition at line 647 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSave

    +
    @@ -10162,11 +11328,13 @@ Variables
    -

    Definition at line 648 of file hidusagestr.h.

    +

    Definition at line 648 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPrint

    +
    @@ -10176,11 +11344,13 @@ Variables
    -

    Definition at line 649 of file hidusagestr.h.

    +

    Definition at line 649 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACProperties

    +
    @@ -10190,11 +11360,13 @@ Variables
    -

    Definition at line 650 of file hidusagestr.h.

    +

    Definition at line 650 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACUndo

    +
    @@ -10204,11 +11376,13 @@ Variables
    -

    Definition at line 651 of file hidusagestr.h.

    +

    Definition at line 651 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACCopy

    +
    @@ -10218,11 +11392,13 @@ Variables
    -

    Definition at line 652 of file hidusagestr.h.

    +

    Definition at line 652 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACCut

    +
    @@ -10232,11 +11408,13 @@ Variables
    -

    Definition at line 653 of file hidusagestr.h.

    +

    Definition at line 653 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPaste

    +
    @@ -10246,11 +11424,13 @@ Variables
    -

    Definition at line 654 of file hidusagestr.h.

    +

    Definition at line 654 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectAll

    +
    @@ -10260,11 +11440,13 @@ Variables
    -

    Definition at line 655 of file hidusagestr.h.

    +

    Definition at line 655 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFind

    +
    @@ -10274,11 +11456,13 @@ Variables
    -

    Definition at line 656 of file hidusagestr.h.

    +

    Definition at line 656 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFindAndReplace

    +
    @@ -10288,11 +11472,13 @@ Variables
    -

    Definition at line 657 of file hidusagestr.h.

    +

    Definition at line 657 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSearch

    +
    @@ -10302,11 +11488,13 @@ Variables
    -

    Definition at line 658 of file hidusagestr.h.

    +

    Definition at line 658 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACGoto

    +
    @@ -10316,11 +11504,13 @@ Variables
    -

    Definition at line 659 of file hidusagestr.h.

    +

    Definition at line 659 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACHome

    +
    @@ -10330,11 +11520,13 @@ Variables
    -

    Definition at line 660 of file hidusagestr.h.

    +

    Definition at line 660 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACBack

    +
    @@ -10344,11 +11536,13 @@ Variables
    -

    Definition at line 661 of file hidusagestr.h.

    +

    Definition at line 661 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACForward

    +
    @@ -10358,11 +11552,13 @@ Variables
    -

    Definition at line 662 of file hidusagestr.h.

    +

    Definition at line 662 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACStop

    +
    @@ -10372,11 +11568,13 @@ Variables
    -

    Definition at line 663 of file hidusagestr.h.

    +

    Definition at line 663 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACRefresh

    +
    @@ -10386,11 +11584,13 @@ Variables
    -

    Definition at line 664 of file hidusagestr.h.

    +

    Definition at line 664 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPreviousLink

    +
    @@ -10400,11 +11600,13 @@ Variables
    -

    Definition at line 665 of file hidusagestr.h.

    +

    Definition at line 665 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACNextLink

    +
    @@ -10414,11 +11616,13 @@ Variables
    -

    Definition at line 666 of file hidusagestr.h.

    +

    Definition at line 666 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACBookmarks

    +
    @@ -10428,11 +11632,13 @@ Variables
    -

    Definition at line 667 of file hidusagestr.h.

    +

    Definition at line 667 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACHistory

    +
    @@ -10442,11 +11648,13 @@ Variables
    -

    Definition at line 668 of file hidusagestr.h.

    +

    Definition at line 668 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSubscriptions

    +
    @@ -10456,11 +11664,13 @@ Variables
    -

    Definition at line 669 of file hidusagestr.h.

    +

    Definition at line 669 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACZoomIn

    +
    @@ -10470,11 +11680,13 @@ Variables
    -

    Definition at line 670 of file hidusagestr.h.

    +

    Definition at line 670 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACZoomOut

    +
    @@ -10484,11 +11696,13 @@ Variables
    -

    Definition at line 671 of file hidusagestr.h.

    +

    Definition at line 671 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACZoom

    +
    @@ -10498,11 +11712,13 @@ Variables
    -

    Definition at line 672 of file hidusagestr.h.

    +

    Definition at line 672 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFullScreenView

    +
    @@ -10512,11 +11728,13 @@ Variables
    -

    Definition at line 673 of file hidusagestr.h.

    +

    Definition at line 673 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACNormalView

    +
    @@ -10526,11 +11744,13 @@ Variables
    -

    Definition at line 674 of file hidusagestr.h.

    +

    Definition at line 674 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACViewToggle

    +
    @@ -10540,11 +11760,13 @@ Variables
    -

    Definition at line 675 of file hidusagestr.h.

    +

    Definition at line 675 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACScrollUp

    +
    @@ -10554,11 +11776,13 @@ Variables
    -

    Definition at line 676 of file hidusagestr.h.

    +

    Definition at line 676 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACScrollDown

    +
    @@ -10568,11 +11792,13 @@ Variables
    -

    Definition at line 677 of file hidusagestr.h.

    +

    Definition at line 677 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACScroll

    +
    @@ -10582,11 +11808,13 @@ Variables
    -

    Definition at line 678 of file hidusagestr.h.

    +

    Definition at line 678 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPanLeft

    +
    @@ -10596,11 +11824,13 @@ Variables
    -

    Definition at line 679 of file hidusagestr.h.

    +

    Definition at line 679 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPanRight

    +
    @@ -10610,11 +11840,13 @@ Variables
    -

    Definition at line 680 of file hidusagestr.h.

    +

    Definition at line 680 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPan

    +
    @@ -10624,11 +11856,13 @@ Variables
    -

    Definition at line 681 of file hidusagestr.h.

    +

    Definition at line 681 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACNewWindow

    +
    @@ -10638,11 +11872,13 @@ Variables
    -

    Definition at line 682 of file hidusagestr.h.

    +

    Definition at line 682 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACTileHoriz

    +
    @@ -10652,11 +11888,13 @@ Variables
    -

    Definition at line 683 of file hidusagestr.h.

    +

    Definition at line 683 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACTileVert

    +
    @@ -10666,11 +11904,13 @@ Variables
    -

    Definition at line 684 of file hidusagestr.h.

    +

    Definition at line 684 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFormat

    +
    @@ -10680,11 +11920,13 @@ Variables
    -

    Definition at line 685 of file hidusagestr.h.

    +

    Definition at line 685 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACEdit

    +
    @@ -10694,11 +11936,13 @@ Variables
    -

    Definition at line 686 of file hidusagestr.h.

    +

    Definition at line 686 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACBold

    +
    @@ -10708,11 +11952,13 @@ Variables
    -

    Definition at line 687 of file hidusagestr.h.

    +

    Definition at line 687 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACItalics

    +
    @@ -10722,11 +11968,13 @@ Variables
    -

    Definition at line 688 of file hidusagestr.h.

    +

    Definition at line 688 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACUnderline

    +
    @@ -10736,11 +11984,13 @@ Variables
    -

    Definition at line 689 of file hidusagestr.h.

    +

    Definition at line 689 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACStrikethrough

    +
    @@ -10750,11 +12000,13 @@ Variables
    -

    Definition at line 690 of file hidusagestr.h.

    +

    Definition at line 690 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSubscript

    +
    @@ -10764,11 +12016,13 @@ Variables
    -

    Definition at line 691 of file hidusagestr.h.

    +

    Definition at line 691 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSuperscript

    +
    @@ -10778,11 +12032,13 @@ Variables
    -

    Definition at line 692 of file hidusagestr.h.

    +

    Definition at line 692 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACAllCaps

    +
    @@ -10792,11 +12048,13 @@ Variables
    -

    Definition at line 693 of file hidusagestr.h.

    +

    Definition at line 693 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACRotate

    +
    @@ -10806,11 +12064,13 @@ Variables
    -

    Definition at line 694 of file hidusagestr.h.

    +

    Definition at line 694 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACResize

    +
    @@ -10820,11 +12080,13 @@ Variables
    -

    Definition at line 695 of file hidusagestr.h.

    +

    Definition at line 695 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFlipHorizontal

    +
    @@ -10834,11 +12096,13 @@ Variables
    -

    Definition at line 696 of file hidusagestr.h.

    +

    Definition at line 696 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFlipVertical

    +
    @@ -10848,11 +12112,13 @@ Variables
    -

    Definition at line 697 of file hidusagestr.h.

    +

    Definition at line 697 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACMirrorHorizontal

    +
    @@ -10862,11 +12128,13 @@ Variables
    -

    Definition at line 698 of file hidusagestr.h.

    +

    Definition at line 698 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACMirrorVertical

    +
    @@ -10876,11 +12144,13 @@ Variables
    -

    Definition at line 699 of file hidusagestr.h.

    +

    Definition at line 699 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFontSelect

    +
    @@ -10890,11 +12160,13 @@ Variables
    -

    Definition at line 700 of file hidusagestr.h.

    +

    Definition at line 700 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFontColor

    +
    @@ -10904,11 +12176,13 @@ Variables
    -

    Definition at line 701 of file hidusagestr.h.

    +

    Definition at line 701 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFontSize

    +
    @@ -10918,11 +12192,13 @@ Variables
    -

    Definition at line 702 of file hidusagestr.h.

    +

    Definition at line 702 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACJustifyLeft

    +
    @@ -10932,11 +12208,13 @@ Variables
    -

    Definition at line 703 of file hidusagestr.h.

    +

    Definition at line 703 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACJustifyCenterH

    +
    @@ -10946,11 +12224,13 @@ Variables
    -

    Definition at line 704 of file hidusagestr.h.

    +

    Definition at line 704 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACJustifyRight

    +
    @@ -10960,11 +12240,13 @@ Variables
    -

    Definition at line 705 of file hidusagestr.h.

    +

    Definition at line 705 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACJustifyBlockH

    +
    @@ -10974,11 +12256,13 @@ Variables
    -

    Definition at line 706 of file hidusagestr.h.

    +

    Definition at line 706 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACJustifyTop

    +
    @@ -10988,11 +12272,13 @@ Variables
    -

    Definition at line 707 of file hidusagestr.h.

    +

    Definition at line 707 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACJustifyCenterV

    +
    @@ -11002,11 +12288,13 @@ Variables
    -

    Definition at line 708 of file hidusagestr.h.

    +

    Definition at line 708 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACJustifyBottom

    +
    @@ -11016,11 +12304,13 @@ Variables
    -

    Definition at line 709 of file hidusagestr.h.

    +

    Definition at line 709 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACJustifyBlockV

    +
    @@ -11030,11 +12320,13 @@ Variables
    -

    Definition at line 710 of file hidusagestr.h.

    +

    Definition at line 710 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACIndentDecrease

    +
    @@ -11044,11 +12336,13 @@ Variables
    -

    Definition at line 711 of file hidusagestr.h.

    +

    Definition at line 711 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACIndentIncrease

    +
    @@ -11058,11 +12352,13 @@ Variables
    -

    Definition at line 712 of file hidusagestr.h.

    +

    Definition at line 712 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACNumberedList

    +
    @@ -11072,11 +12368,13 @@ Variables
    -

    Definition at line 713 of file hidusagestr.h.

    +

    Definition at line 713 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACRestartNumbering

    +
    @@ -11086,11 +12384,13 @@ Variables
    -

    Definition at line 714 of file hidusagestr.h.

    +

    Definition at line 714 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACBulletedList

    +
    @@ -11100,11 +12400,13 @@ Variables
    -

    Definition at line 715 of file hidusagestr.h.

    +

    Definition at line 715 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPromote

    +
    @@ -11114,11 +12416,13 @@ Variables
    -

    Definition at line 716 of file hidusagestr.h.

    +

    Definition at line 716 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACDemote

    +
    @@ -11128,11 +12432,13 @@ Variables
    -

    Definition at line 717 of file hidusagestr.h.

    +

    Definition at line 717 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACYes

    +
    @@ -11142,11 +12448,13 @@ Variables
    -

    Definition at line 718 of file hidusagestr.h.

    +

    Definition at line 718 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACNo

    +
    @@ -11156,11 +12464,13 @@ Variables
    -

    Definition at line 719 of file hidusagestr.h.

    +

    Definition at line 719 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACCancel

    +
    @@ -11170,11 +12480,13 @@ Variables
    -

    Definition at line 720 of file hidusagestr.h.

    +

    Definition at line 720 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACCatalog

    +
    @@ -11184,11 +12496,13 @@ Variables
    -

    Definition at line 721 of file hidusagestr.h.

    +

    Definition at line 721 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACBuyChkout

    +
    @@ -11198,11 +12512,13 @@ Variables
    -

    Definition at line 722 of file hidusagestr.h.

    +

    Definition at line 722 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACAddToCart

    +
    @@ -11212,11 +12528,13 @@ Variables
    -

    Definition at line 723 of file hidusagestr.h.

    +

    Definition at line 723 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACExpand

    +
    @@ -11226,11 +12544,13 @@ Variables
    -

    Definition at line 724 of file hidusagestr.h.

    +

    Definition at line 724 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACExpandAll

    +
    @@ -11240,11 +12560,13 @@ Variables
    -

    Definition at line 725 of file hidusagestr.h.

    +

    Definition at line 725 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACCollapse

    +
    @@ -11254,11 +12576,13 @@ Variables
    -

    Definition at line 726 of file hidusagestr.h.

    +

    Definition at line 726 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACCollapseAll

    +
    @@ -11268,11 +12592,13 @@ Variables
    -

    Definition at line 727 of file hidusagestr.h.

    +

    Definition at line 727 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPrintPreview

    +
    @@ -11282,11 +12608,13 @@ Variables
    -

    Definition at line 728 of file hidusagestr.h.

    +

    Definition at line 728 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACPasteSpecial

    +
    @@ -11296,11 +12624,13 @@ Variables
    -

    Definition at line 729 of file hidusagestr.h.

    +

    Definition at line 729 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACInsertMode

    +
    @@ -11310,11 +12640,13 @@ Variables
    -

    Definition at line 730 of file hidusagestr.h.

    +

    Definition at line 730 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACDelete

    +
    @@ -11324,11 +12656,13 @@ Variables
    -

    Definition at line 731 of file hidusagestr.h.

    +

    Definition at line 731 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACLock

    +
    @@ -11338,11 +12672,13 @@ Variables
    -

    Definition at line 732 of file hidusagestr.h.

    +

    Definition at line 732 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACUnlock

    +
    @@ -11352,11 +12688,13 @@ Variables
    -

    Definition at line 733 of file hidusagestr.h.

    +

    Definition at line 733 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACProtect

    +
    @@ -11366,11 +12704,13 @@ Variables
    -

    Definition at line 734 of file hidusagestr.h.

    +

    Definition at line 734 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACUnprotect

    +
    @@ -11380,11 +12720,13 @@ Variables
    -

    Definition at line 735 of file hidusagestr.h.

    +

    Definition at line 735 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACAttachComment

    +
    @@ -11394,11 +12736,13 @@ Variables
    -

    Definition at line 736 of file hidusagestr.h.

    +

    Definition at line 736 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACDeleteComment

    +
    @@ -11408,11 +12752,13 @@ Variables
    -

    Definition at line 737 of file hidusagestr.h.

    +

    Definition at line 737 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACViewComment

    +
    @@ -11422,11 +12768,13 @@ Variables
    -

    Definition at line 738 of file hidusagestr.h.

    +

    Definition at line 738 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectWord

    +
    @@ -11436,11 +12784,13 @@ Variables
    -

    Definition at line 739 of file hidusagestr.h.

    +

    Definition at line 739 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectSentence

    +
    @@ -11450,11 +12800,13 @@ Variables
    -

    Definition at line 740 of file hidusagestr.h.

    +

    Definition at line 740 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectParagraph

    +
    @@ -11464,11 +12816,13 @@ Variables
    -

    Definition at line 741 of file hidusagestr.h.

    +

    Definition at line 741 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectColumn

    +
    @@ -11478,11 +12832,13 @@ Variables
    -

    Definition at line 742 of file hidusagestr.h.

    +

    Definition at line 742 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectRow

    +
    @@ -11492,11 +12848,13 @@ Variables
    -

    Definition at line 743 of file hidusagestr.h.

    +

    Definition at line 743 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectTable

    +
    @@ -11506,11 +12864,13 @@ Variables
    -

    Definition at line 744 of file hidusagestr.h.

    +

    Definition at line 744 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectObject

    +
    @@ -11520,11 +12880,13 @@ Variables
    -

    Definition at line 745 of file hidusagestr.h.

    +

    Definition at line 745 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACRedoRepeat

    +
    @@ -11534,11 +12896,13 @@ Variables
    -

    Definition at line 746 of file hidusagestr.h.

    +

    Definition at line 746 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSort

    +
    @@ -11548,11 +12912,13 @@ Variables
    -

    Definition at line 747 of file hidusagestr.h.

    +

    Definition at line 747 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSortAscending

    +
    @@ -11562,11 +12928,13 @@ Variables
    -

    Definition at line 748 of file hidusagestr.h.

    +

    Definition at line 748 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSortDescending

    +
    @@ -11576,11 +12944,13 @@ Variables
    -

    Definition at line 749 of file hidusagestr.h.

    +

    Definition at line 749 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACFilter

    +
    @@ -11590,11 +12960,13 @@ Variables
    -

    Definition at line 750 of file hidusagestr.h.

    +

    Definition at line 750 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSetClock

    +
    @@ -11604,11 +12976,13 @@ Variables
    -

    Definition at line 751 of file hidusagestr.h.

    +

    Definition at line 751 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACViewClock

    +
    @@ -11618,11 +12992,13 @@ Variables
    -

    Definition at line 752 of file hidusagestr.h.

    +

    Definition at line 752 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSelectTimeZone

    +
    @@ -11632,11 +13008,13 @@ Variables
    -

    Definition at line 753 of file hidusagestr.h.

    +

    Definition at line 753 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACEditTimeZone

    +
    @@ -11646,11 +13024,13 @@ Variables
    -

    Definition at line 754 of file hidusagestr.h.

    +

    Definition at line 754 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSetAlarm

    +
    @@ -11660,11 +13040,13 @@ Variables
    -

    Definition at line 755 of file hidusagestr.h.

    +

    Definition at line 755 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACClearAlarm

    +
    @@ -11674,11 +13056,13 @@ Variables
    -

    Definition at line 756 of file hidusagestr.h.

    +

    Definition at line 756 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSnoozeAlarm

    +
    @@ -11688,11 +13072,13 @@ Variables
    -

    Definition at line 757 of file hidusagestr.h.

    +

    Definition at line 757 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACResetAlarm

    +
    @@ -11702,11 +13088,13 @@ Variables
    -

    Definition at line 758 of file hidusagestr.h.

    +

    Definition at line 758 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSyncronize

    +
    @@ -11716,11 +13104,13 @@ Variables
    -

    Definition at line 759 of file hidusagestr.h.

    +

    Definition at line 759 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSendReceive

    +
    @@ -11730,11 +13120,13 @@ Variables
    -

    Definition at line 760 of file hidusagestr.h.

    +

    Definition at line 760 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSendTo

    +
    @@ -11744,11 +13136,13 @@ Variables
    -

    Definition at line 761 of file hidusagestr.h.

    +

    Definition at line 761 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACReply

    +
    @@ -11758,11 +13152,13 @@ Variables
    -

    Definition at line 762 of file hidusagestr.h.

    +

    Definition at line 762 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACReplyAll

    +
    @@ -11772,11 +13168,13 @@ Variables
    -

    Definition at line 763 of file hidusagestr.h.

    +

    Definition at line 763 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACForwardMessage

    +
    @@ -11786,11 +13184,13 @@ Variables
    -

    Definition at line 764 of file hidusagestr.h.

    +

    Definition at line 764 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSend

    +
    @@ -11800,11 +13200,13 @@ Variables
    -

    Definition at line 765 of file hidusagestr.h.

    +

    Definition at line 765 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACAttachFile

    +
    @@ -11814,11 +13216,13 @@ Variables
    -

    Definition at line 766 of file hidusagestr.h.

    +

    Definition at line 766 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACUpload

    +
    @@ -11828,11 +13232,13 @@ Variables
    -

    Definition at line 767 of file hidusagestr.h.

    +

    Definition at line 767 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACDownload

    +
    @@ -11842,11 +13248,13 @@ Variables
    -

    Definition at line 768 of file hidusagestr.h.

    +

    Definition at line 768 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSetBorders

    +
    @@ -11856,11 +13264,13 @@ Variables
    -

    Definition at line 769 of file hidusagestr.h.

    +

    Definition at line 769 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACInsertRow

    +
    @@ -11870,11 +13280,13 @@ Variables
    -

    Definition at line 770 of file hidusagestr.h.

    +

    Definition at line 770 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACInsertColumn

    +
    @@ -11884,11 +13296,13 @@ Variables
    -

    Definition at line 771 of file hidusagestr.h.

    +

    Definition at line 771 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACInsertFile

    +
    @@ -11898,11 +13312,13 @@ Variables
    -

    Definition at line 772 of file hidusagestr.h.

    +

    Definition at line 772 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACInsertPicture

    +
    @@ -11912,11 +13328,13 @@ Variables
    -

    Definition at line 773 of file hidusagestr.h.

    +

    Definition at line 773 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACInsertObject

    +
    @@ -11926,11 +13344,13 @@ Variables
    -

    Definition at line 774 of file hidusagestr.h.

    +

    Definition at line 774 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACInsertSymbol

    +
    @@ -11940,11 +13360,13 @@ Variables
    -

    Definition at line 775 of file hidusagestr.h.

    +

    Definition at line 775 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSaveAndClose

    +
    @@ -11954,11 +13376,13 @@ Variables
    -

    Definition at line 776 of file hidusagestr.h.

    +

    Definition at line 776 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACRename

    +
    @@ -11968,11 +13392,13 @@ Variables
    -

    Definition at line 777 of file hidusagestr.h.

    +

    Definition at line 777 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACMerge

    +
    @@ -11982,11 +13408,13 @@ Variables
    -

    Definition at line 778 of file hidusagestr.h.

    +

    Definition at line 778 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACSplit

    +
    @@ -11996,11 +13424,13 @@ Variables
    -

    Definition at line 779 of file hidusagestr.h.

    +

    Definition at line 779 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACDistributeHorizontaly

    +
    @@ -12010,11 +13440,13 @@ Variables
    -

    Definition at line 780 of file hidusagestr.h.

    +

    Definition at line 780 of file hidusagestr.h.

    - + +

    ◆ pstrUsageACDistributeVerticaly

    +
    @@ -12024,11 +13456,13 @@ Variables
    -

    Definition at line 781 of file hidusagestr.h.

    +

    Definition at line 781 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDigitizer

    +
    @@ -12038,11 +13472,13 @@ Variables
    -

    Definition at line 784 of file hidusagestr.h.

    +

    Definition at line 784 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePen

    +
    @@ -12052,11 +13488,13 @@ Variables
    -

    Definition at line 785 of file hidusagestr.h.

    +

    Definition at line 785 of file hidusagestr.h.

    - + +

    ◆ pstrUsageLightPen

    +
    @@ -12066,11 +13504,13 @@ Variables
    -

    Definition at line 786 of file hidusagestr.h.

    +

    Definition at line 786 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTouchScreen

    +
    @@ -12080,11 +13520,13 @@ Variables
    -

    Definition at line 787 of file hidusagestr.h.

    +

    Definition at line 787 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTouchPad

    +
    @@ -12094,11 +13536,13 @@ Variables
    -

    Definition at line 788 of file hidusagestr.h.

    +

    Definition at line 788 of file hidusagestr.h.

    - + +

    ◆ pstrUsageWhiteBoard

    +
    @@ -12108,11 +13552,13 @@ Variables
    -

    Definition at line 789 of file hidusagestr.h.

    +

    Definition at line 789 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCoordinateMeasuringMachine

    +
    @@ -12122,11 +13568,13 @@ Variables
    -

    Definition at line 790 of file hidusagestr.h.

    +

    Definition at line 790 of file hidusagestr.h.

    - + +

    ◆ pstrUsage3DDigitizer

    +
    @@ -12136,11 +13584,13 @@ Variables
    -

    Definition at line 791 of file hidusagestr.h.

    +

    Definition at line 791 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStereoPlotter

    +
    @@ -12150,11 +13600,13 @@ Variables
    -

    Definition at line 792 of file hidusagestr.h.

    +

    Definition at line 792 of file hidusagestr.h.

    - + +

    ◆ pstrUsageArticulatedArm

    +
    @@ -12164,11 +13616,13 @@ Variables
    -

    Definition at line 793 of file hidusagestr.h.

    +

    Definition at line 793 of file hidusagestr.h.

    - + +

    ◆ pstrUsageArmature

    +
    @@ -12178,11 +13632,13 @@ Variables
    -

    Definition at line 794 of file hidusagestr.h.

    +

    Definition at line 794 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMultiplePointDigitizer

    +
    @@ -12192,11 +13648,13 @@ Variables
    -

    Definition at line 795 of file hidusagestr.h.

    +

    Definition at line 795 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFreeSpaceWand

    +
    @@ -12206,11 +13664,13 @@ Variables
    -

    Definition at line 796 of file hidusagestr.h.

    +

    Definition at line 796 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStylus

    +
    @@ -12220,11 +13680,13 @@ Variables
    -

    Definition at line 797 of file hidusagestr.h.

    +

    Definition at line 797 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePuck

    +
    @@ -12234,11 +13696,13 @@ Variables
    -

    Definition at line 798 of file hidusagestr.h.

    +

    Definition at line 798 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFinger

    +
    @@ -12248,11 +13712,13 @@ Variables
    -

    Definition at line 799 of file hidusagestr.h.

    +

    Definition at line 799 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTipPressure

    +
    @@ -12262,11 +13728,13 @@ Variables
    -

    Definition at line 800 of file hidusagestr.h.

    +

    Definition at line 800 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBarrelPressure

    +
    @@ -12276,11 +13744,13 @@ Variables
    -

    Definition at line 801 of file hidusagestr.h.

    +

    Definition at line 801 of file hidusagestr.h.

    - + +

    ◆ pstrUsageInRange

    +
    @@ -12290,11 +13760,13 @@ Variables
    -

    Definition at line 802 of file hidusagestr.h.

    +

    Definition at line 802 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTouch

    +
    @@ -12304,11 +13776,13 @@ Variables
    -

    Definition at line 803 of file hidusagestr.h.

    +

    Definition at line 803 of file hidusagestr.h.

    - + +

    ◆ pstrUsageUntouch

    +
    @@ -12318,11 +13792,13 @@ Variables
    -

    Definition at line 804 of file hidusagestr.h.

    +

    Definition at line 804 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTap

    +
    @@ -12332,11 +13808,13 @@ Variables
    -

    Definition at line 805 of file hidusagestr.h.

    +

    Definition at line 805 of file hidusagestr.h.

    - + +

    ◆ pstrUsageQuality

    +
    @@ -12346,11 +13824,13 @@ Variables
    -

    Definition at line 806 of file hidusagestr.h.

    +

    Definition at line 806 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDataValid

    +
    @@ -12360,11 +13840,13 @@ Variables
    -

    Definition at line 807 of file hidusagestr.h.

    +

    Definition at line 807 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTransducerIndex

    +
    @@ -12374,11 +13856,13 @@ Variables
    -

    Definition at line 808 of file hidusagestr.h.

    +

    Definition at line 808 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTabletFunctionKeys

    +
    @@ -12388,11 +13872,13 @@ Variables
    -

    Definition at line 809 of file hidusagestr.h.

    +

    Definition at line 809 of file hidusagestr.h.

    - + +

    ◆ pstrUsageProgramChangeKeys

    +
    @@ -12402,11 +13888,13 @@ Variables
    -

    Definition at line 810 of file hidusagestr.h.

    +

    Definition at line 810 of file hidusagestr.h.

    - + +

    ◆ pstrUsageInvert

    +
    @@ -12416,11 +13904,13 @@ Variables
    -

    Definition at line 812 of file hidusagestr.h.

    +

    Definition at line 812 of file hidusagestr.h.

    - + +

    ◆ pstrUsageXTilt

    +
    @@ -12430,11 +13920,13 @@ Variables
    -

    Definition at line 813 of file hidusagestr.h.

    +

    Definition at line 813 of file hidusagestr.h.

    - + +

    ◆ pstrUsageYTilt

    +
    @@ -12444,11 +13936,13 @@ Variables
    -

    Definition at line 814 of file hidusagestr.h.

    +

    Definition at line 814 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAzimuth

    +
    @@ -12458,11 +13952,13 @@ Variables
    -

    Definition at line 815 of file hidusagestr.h.

    +

    Definition at line 815 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAltitude

    +
    @@ -12472,11 +13968,13 @@ Variables
    -

    Definition at line 816 of file hidusagestr.h.

    +

    Definition at line 816 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTwist

    +
    @@ -12486,11 +13984,13 @@ Variables
    -

    Definition at line 817 of file hidusagestr.h.

    +

    Definition at line 817 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTipSwitch

    +
    @@ -12500,11 +14000,13 @@ Variables
    -

    Definition at line 818 of file hidusagestr.h.

    +

    Definition at line 818 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSecondaryTipSwitch

    +
    @@ -12514,11 +14016,13 @@ Variables
    -

    Definition at line 819 of file hidusagestr.h.

    +

    Definition at line 819 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBarrelSwitch

    +
    @@ -12528,11 +14032,13 @@ Variables
    -

    Definition at line 820 of file hidusagestr.h.

    +

    Definition at line 820 of file hidusagestr.h.

    - + +

    ◆ pstrUsageEraser

    +
    @@ -12542,11 +14048,13 @@ Variables
    -

    Definition at line 821 of file hidusagestr.h.

    +

    Definition at line 821 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTabletPick

    +
    @@ -12556,11 +14064,13 @@ Variables
    -

    Definition at line 822 of file hidusagestr.h.

    +

    Definition at line 822 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAlphanumericDisplay

    +
    @@ -12570,11 +14080,13 @@ Variables
    -

    Definition at line 825 of file hidusagestr.h.

    +

    Definition at line 825 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBitmappedDisplay

    +
    @@ -12584,11 +14096,13 @@ Variables
    -

    Definition at line 826 of file hidusagestr.h.

    +

    Definition at line 826 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDisplayAttributesReport

    +
    @@ -12598,11 +14112,13 @@ Variables
    -

    Definition at line 827 of file hidusagestr.h.

    +

    Definition at line 827 of file hidusagestr.h.

    - + +

    ◆ pstrUsageASCIICharacterSet

    +
    @@ -12612,11 +14128,13 @@ Variables
    -

    Definition at line 828 of file hidusagestr.h.

    +

    Definition at line 828 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDataReadBack

    +
    @@ -12626,11 +14144,13 @@ Variables
    -

    Definition at line 829 of file hidusagestr.h.

    +

    Definition at line 829 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFontReadBack

    +
    @@ -12640,11 +14160,13 @@ Variables
    -

    Definition at line 830 of file hidusagestr.h.

    +

    Definition at line 830 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDisplayControlReport

    +
    @@ -12654,11 +14176,13 @@ Variables
    -

    Definition at line 831 of file hidusagestr.h.

    +

    Definition at line 831 of file hidusagestr.h.

    - + +

    ◆ pstrUsageClearDisplay

    +
    @@ -12668,11 +14192,13 @@ Variables
    -

    Definition at line 832 of file hidusagestr.h.

    +

    Definition at line 832 of file hidusagestr.h.

    - + +

    ◆ pstrUsageScreenSaverDelay

    +
    @@ -12682,11 +14208,13 @@ Variables
    -

    Definition at line 834 of file hidusagestr.h.

    +

    Definition at line 834 of file hidusagestr.h.

    - + +

    ◆ pstrUsageScreenSaverEnable

    +
    @@ -12696,11 +14224,13 @@ Variables
    -

    Definition at line 835 of file hidusagestr.h.

    +

    Definition at line 835 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVerticalScroll

    +
    @@ -12710,11 +14240,13 @@ Variables
    -

    Definition at line 836 of file hidusagestr.h.

    +

    Definition at line 836 of file hidusagestr.h.

    - + +

    ◆ pstrUsageHorizontalScroll

    +
    @@ -12724,11 +14256,13 @@ Variables
    -

    Definition at line 837 of file hidusagestr.h.

    +

    Definition at line 837 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharacterReport

    +
    @@ -12738,11 +14272,13 @@ Variables
    -

    Definition at line 838 of file hidusagestr.h.

    +

    Definition at line 838 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDisplayData

    +
    @@ -12752,11 +14288,13 @@ Variables
    -

    Definition at line 839 of file hidusagestr.h.

    +

    Definition at line 839 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDisplayStatus

    +
    @@ -12766,11 +14304,13 @@ Variables
    -

    Definition at line 840 of file hidusagestr.h.

    +

    Definition at line 840 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStatusNotReady

    +
    @@ -12780,11 +14320,13 @@ Variables
    -

    Definition at line 841 of file hidusagestr.h.

    +

    Definition at line 841 of file hidusagestr.h.

    - + +

    ◆ pstrUsageStatusReady

    +
    @@ -12794,11 +14336,13 @@ Variables
    -

    Definition at line 842 of file hidusagestr.h.

    +

    Definition at line 842 of file hidusagestr.h.

    - + +

    ◆ pstrUsageErrorNotALoadableCharacter

    +
    @@ -12808,11 +14352,13 @@ Variables
    -

    Definition at line 843 of file hidusagestr.h.

    +

    Definition at line 843 of file hidusagestr.h.

    - + +

    ◆ pstrUsageErrorFotDataCanNotBeRead

    +
    @@ -12822,11 +14368,13 @@ Variables
    -

    Definition at line 844 of file hidusagestr.h.

    +

    Definition at line 844 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCursorPositionReport

    +
    @@ -12836,11 +14384,13 @@ Variables
    -

    Definition at line 845 of file hidusagestr.h.

    +

    Definition at line 845 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRow

    +
    @@ -12850,11 +14400,13 @@ Variables
    -

    Definition at line 846 of file hidusagestr.h.

    +

    Definition at line 846 of file hidusagestr.h.

    - + +

    ◆ pstrUsageColumn

    +
    @@ -12864,11 +14416,13 @@ Variables
    -

    Definition at line 847 of file hidusagestr.h.

    +

    Definition at line 847 of file hidusagestr.h.

    - + +

    ◆ pstrUsageRows

    +
    @@ -12878,11 +14432,13 @@ Variables
    -

    Definition at line 848 of file hidusagestr.h.

    +

    Definition at line 848 of file hidusagestr.h.

    - + +

    ◆ pstrUsageColumns

    +
    @@ -12892,11 +14448,13 @@ Variables
    -

    Definition at line 849 of file hidusagestr.h.

    +

    Definition at line 849 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCursorPixelPosition

    +
    @@ -12906,11 +14464,13 @@ Variables
    -

    Definition at line 850 of file hidusagestr.h.

    +

    Definition at line 850 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCursorMode

    +
    @@ -12920,11 +14480,13 @@ Variables
    -

    Definition at line 851 of file hidusagestr.h.

    +

    Definition at line 851 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCursorEnable

    +
    @@ -12934,11 +14496,13 @@ Variables
    -

    Definition at line 852 of file hidusagestr.h.

    +

    Definition at line 852 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCursorBlink

    +
    @@ -12948,11 +14512,13 @@ Variables
    -

    Definition at line 853 of file hidusagestr.h.

    +

    Definition at line 853 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFontReport

    +
    @@ -12962,11 +14528,13 @@ Variables
    -

    Definition at line 854 of file hidusagestr.h.

    +

    Definition at line 854 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFontData

    +
    @@ -12976,11 +14544,13 @@ Variables
    -

    Definition at line 855 of file hidusagestr.h.

    +

    Definition at line 855 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharacterWidth

    +
    @@ -12990,11 +14560,13 @@ Variables
    -

    Definition at line 856 of file hidusagestr.h.

    +

    Definition at line 856 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharacterHeight

    +
    @@ -13004,11 +14576,13 @@ Variables
    -

    Definition at line 857 of file hidusagestr.h.

    +

    Definition at line 857 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharacterSpacingHorizontal

    +
    @@ -13018,11 +14592,13 @@ Variables
    -

    Definition at line 858 of file hidusagestr.h.

    +

    Definition at line 858 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharacterSpacingVertical

    +
    @@ -13032,11 +14608,13 @@ Variables
    -

    Definition at line 859 of file hidusagestr.h.

    +

    Definition at line 859 of file hidusagestr.h.

    - + +

    ◆ pstrUsageUnicodeCharset

    +
    @@ -13046,11 +14624,13 @@ Variables
    -

    Definition at line 860 of file hidusagestr.h.

    +

    Definition at line 860 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFont7Segment

    +
    @@ -13060,11 +14640,13 @@ Variables
    -

    Definition at line 861 of file hidusagestr.h.

    +

    Definition at line 861 of file hidusagestr.h.

    - + +

    ◆ pstrUsage7SegmentDirectMap

    +
    @@ -13074,11 +14656,13 @@ Variables
    -

    Definition at line 862 of file hidusagestr.h.

    +

    Definition at line 862 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFont14Segment

    +
    @@ -13088,11 +14672,13 @@ Variables
    -

    Definition at line 863 of file hidusagestr.h.

    +

    Definition at line 863 of file hidusagestr.h.

    - + +

    ◆ pstrUsage14SegmentDirectMap

    +
    @@ -13102,11 +14688,13 @@ Variables
    -

    Definition at line 864 of file hidusagestr.h.

    +

    Definition at line 864 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDisplayBrightness

    +
    @@ -13116,11 +14704,13 @@ Variables
    -

    Definition at line 865 of file hidusagestr.h.

    +

    Definition at line 865 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDisplayContrast

    +
    @@ -13130,11 +14720,13 @@ Variables
    -

    Definition at line 866 of file hidusagestr.h.

    +

    Definition at line 866 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharacterAttribute

    +
    @@ -13144,11 +14736,13 @@ Variables
    -

    Definition at line 867 of file hidusagestr.h.

    +

    Definition at line 867 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAttributeReadback

    +
    @@ -13158,11 +14752,13 @@ Variables
    -

    Definition at line 868 of file hidusagestr.h.

    +

    Definition at line 868 of file hidusagestr.h.

    - + +

    ◆ pstrUsageAttributeData

    +
    @@ -13172,11 +14768,13 @@ Variables
    -

    Definition at line 869 of file hidusagestr.h.

    +

    Definition at line 869 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharAttributeEnhance

    +
    @@ -13186,11 +14784,13 @@ Variables
    -

    Definition at line 870 of file hidusagestr.h.

    +

    Definition at line 870 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharAttributeUnderline

    +
    @@ -13200,11 +14800,13 @@ Variables
    -

    Definition at line 871 of file hidusagestr.h.

    +

    Definition at line 871 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCharAttributeBlink

    +
    @@ -13214,11 +14816,13 @@ Variables
    -

    Definition at line 872 of file hidusagestr.h.

    +

    Definition at line 872 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBitmapSizeX

    +
    @@ -13228,11 +14832,13 @@ Variables
    -

    Definition at line 873 of file hidusagestr.h.

    +

    Definition at line 873 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBitmapSizeY

    +
    @@ -13242,11 +14848,13 @@ Variables
    -

    Definition at line 874 of file hidusagestr.h.

    +

    Definition at line 874 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBitDepthFormat

    +
    @@ -13256,11 +14864,13 @@ Variables
    -

    Definition at line 875 of file hidusagestr.h.

    +

    Definition at line 875 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDisplayOrientation

    +
    @@ -13270,11 +14880,13 @@ Variables
    -

    Definition at line 876 of file hidusagestr.h.

    +

    Definition at line 876 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePaletteReport

    +
    @@ -13284,11 +14896,13 @@ Variables
    -

    Definition at line 877 of file hidusagestr.h.

    +

    Definition at line 877 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePaletteDataSize

    +
    @@ -13298,11 +14912,13 @@ Variables
    -

    Definition at line 878 of file hidusagestr.h.

    +

    Definition at line 878 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePaletteDataOffset

    +
    @@ -13312,11 +14928,13 @@ Variables
    -

    Definition at line 879 of file hidusagestr.h.

    +

    Definition at line 879 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePaletteData

    +
    @@ -13326,11 +14944,13 @@ Variables
    -

    Definition at line 880 of file hidusagestr.h.

    +

    Definition at line 880 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBlitReport

    +
    @@ -13340,11 +14960,13 @@ Variables
    -

    Definition at line 881 of file hidusagestr.h.

    +

    Definition at line 881 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBlitRectangleX1

    +
    @@ -13354,11 +14976,13 @@ Variables
    -

    Definition at line 882 of file hidusagestr.h.

    +

    Definition at line 882 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBlitRectangleY1

    +
    @@ -13368,11 +14992,13 @@ Variables
    -

    Definition at line 883 of file hidusagestr.h.

    +

    Definition at line 883 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBlitRectangleX2

    +
    @@ -13382,11 +15008,13 @@ Variables
    -

    Definition at line 884 of file hidusagestr.h.

    +

    Definition at line 884 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBlitRectangleY2

    +
    @@ -13396,11 +15024,13 @@ Variables
    -

    Definition at line 885 of file hidusagestr.h.

    +

    Definition at line 885 of file hidusagestr.h.

    - + +

    ◆ pstrUsageBlitData

    +
    @@ -13410,11 +15040,13 @@ Variables
    -

    Definition at line 886 of file hidusagestr.h.

    +

    Definition at line 886 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftButton

    +
    @@ -13424,11 +15056,13 @@ Variables
    -

    Definition at line 887 of file hidusagestr.h.

    +

    Definition at line 887 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftButtonID

    +
    @@ -13438,11 +15072,13 @@ Variables
    -

    Definition at line 888 of file hidusagestr.h.

    +

    Definition at line 888 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftButtonSide

    +
    @@ -13452,11 +15088,13 @@ Variables
    -

    Definition at line 889 of file hidusagestr.h.

    +

    Definition at line 889 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftButtonOffset1

    +
    @@ -13466,11 +15104,13 @@ Variables
    -

    Definition at line 890 of file hidusagestr.h.

    +

    Definition at line 890 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftButtonOffset2

    +
    @@ -13480,11 +15120,13 @@ Variables
    -

    Definition at line 891 of file hidusagestr.h.

    +

    Definition at line 891 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftButtonReport

    +
    @@ -13494,11 +15136,13 @@ Variables
    -

    Definition at line 892 of file hidusagestr.h.

    +

    Definition at line 892 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMedicalUltrasound

    +
    @@ -13508,11 +15152,13 @@ Variables
    -

    Definition at line 895 of file hidusagestr.h.

    +

    Definition at line 895 of file hidusagestr.h.

    - + +

    ◆ pstrUsageVCRAcquisition

    +
    @@ -13522,11 +15168,13 @@ Variables
    -

    Definition at line 896 of file hidusagestr.h.

    +

    Definition at line 896 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFreezeThaw

    +
    @@ -13536,11 +15184,13 @@ Variables
    -

    Definition at line 897 of file hidusagestr.h.

    +

    Definition at line 897 of file hidusagestr.h.

    - + +

    ◆ pstrUsageClipStore

    +
    @@ -13550,11 +15200,13 @@ Variables
    -

    Definition at line 898 of file hidusagestr.h.

    +

    Definition at line 898 of file hidusagestr.h.

    - + +

    ◆ pstrUsageUpdate

    +
    @@ -13564,11 +15216,13 @@ Variables
    -

    Definition at line 899 of file hidusagestr.h.

    +

    Definition at line 899 of file hidusagestr.h.

    - + +

    ◆ pstrUsageNext

    +
    @@ -13578,11 +15232,13 @@ Variables
    -

    Definition at line 900 of file hidusagestr.h.

    +

    Definition at line 900 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSave

    +
    @@ -13592,11 +15248,13 @@ Variables
    -

    Definition at line 901 of file hidusagestr.h.

    +

    Definition at line 901 of file hidusagestr.h.

    - + +

    ◆ pstrUsagePrint

    +
    @@ -13606,11 +15264,13 @@ Variables
    -

    Definition at line 902 of file hidusagestr.h.

    +

    Definition at line 902 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMicrophoneEnable

    +
    @@ -13620,11 +15280,13 @@ Variables
    -

    Definition at line 903 of file hidusagestr.h.

    +

    Definition at line 903 of file hidusagestr.h.

    - + +

    ◆ pstrUsageCine

    +
    @@ -13634,11 +15296,13 @@ Variables
    -

    Definition at line 904 of file hidusagestr.h.

    +

    Definition at line 904 of file hidusagestr.h.

    - + +

    ◆ pstrUsageTransmitPower

    +
    @@ -13648,11 +15312,13 @@ Variables
    -

    Definition at line 905 of file hidusagestr.h.

    +

    Definition at line 905 of file hidusagestr.h.

    - + +

    ◆ pstrUsageFocus

    +
    @@ -13662,11 +15328,13 @@ Variables
    -

    Definition at line 907 of file hidusagestr.h.

    +

    Definition at line 907 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDepth

    +
    @@ -13676,11 +15344,13 @@ Variables
    -

    Definition at line 908 of file hidusagestr.h.

    +

    Definition at line 908 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftStepPrimary

    +
    @@ -13690,11 +15360,13 @@ Variables
    -

    Definition at line 909 of file hidusagestr.h.

    +

    Definition at line 909 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftStepSecondary

    +
    @@ -13704,11 +15376,13 @@ Variables
    -

    Definition at line 910 of file hidusagestr.h.

    +

    Definition at line 910 of file hidusagestr.h.

    - + +

    ◆ pstrUsageDepthGainCompensation

    +
    @@ -13718,11 +15392,13 @@ Variables
    -

    Definition at line 911 of file hidusagestr.h.

    +

    Definition at line 911 of file hidusagestr.h.

    - + +

    ◆ pstrUsageZoomSelect

    +
    @@ -13732,11 +15408,13 @@ Variables
    -

    Definition at line 912 of file hidusagestr.h.

    +

    Definition at line 912 of file hidusagestr.h.

    - + +

    ◆ pstrUsageZoomAdjust

    +
    @@ -13746,11 +15424,13 @@ Variables
    -

    Definition at line 913 of file hidusagestr.h.

    +

    Definition at line 913 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpectralDopplerModeSelect

    +
    @@ -13760,11 +15440,13 @@ Variables
    -

    Definition at line 914 of file hidusagestr.h.

    +

    Definition at line 914 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSpectralDopplerModeAdjust

    +
    @@ -13774,11 +15456,13 @@ Variables
    -

    Definition at line 915 of file hidusagestr.h.

    +

    Definition at line 915 of file hidusagestr.h.

    - + +

    ◆ pstrUsageColorDopplerModeSelect

    +
    @@ -13788,11 +15472,13 @@ Variables
    -

    Definition at line 916 of file hidusagestr.h.

    +

    Definition at line 916 of file hidusagestr.h.

    - + +

    ◆ pstrUsageColorDopplerModeAdjust

    +
    @@ -13802,11 +15488,13 @@ Variables
    -

    Definition at line 917 of file hidusagestr.h.

    +

    Definition at line 917 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMotionModeSelect

    +
    @@ -13816,11 +15504,13 @@ Variables
    -

    Definition at line 918 of file hidusagestr.h.

    +

    Definition at line 918 of file hidusagestr.h.

    - + +

    ◆ pstrUsageMotionModeAdjust

    +
    @@ -13830,11 +15520,13 @@ Variables
    -

    Definition at line 919 of file hidusagestr.h.

    +

    Definition at line 919 of file hidusagestr.h.

    - + +

    ◆ pstrUsage2DModeSelect

    +
    @@ -13844,11 +15536,13 @@ Variables
    -

    Definition at line 920 of file hidusagestr.h.

    +

    Definition at line 920 of file hidusagestr.h.

    - + +

    ◆ pstrUsage2DModeAdjust

    +
    @@ -13858,11 +15552,13 @@ Variables
    -

    Definition at line 921 of file hidusagestr.h.

    +

    Definition at line 921 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftControlSelect

    +
    @@ -13872,11 +15568,13 @@ Variables
    -

    Definition at line 922 of file hidusagestr.h.

    +

    Definition at line 922 of file hidusagestr.h.

    - + +

    ◆ pstrUsageSoftControlAdjust

    +
    @@ -13886,7 +15584,7 @@ Variables
    -

    Definition at line 923 of file hidusagestr.h.

    +

    Definition at line 923 of file hidusagestr.h.

    @@ -13895,7 +15593,7 @@ Variables diff --git a/hidusagestr_8h__dep__incl.map b/hidusagestr_8h__dep__incl.map index cdc03afe..ad554ce8 100644 --- a/hidusagestr_8h__dep__incl.map +++ b/hidusagestr_8h__dep__incl.map @@ -1,18 +1,18 @@ - - + + - - - - - - - + + + + + + + - + diff --git a/hidusagestr_8h__dep__incl.md5 b/hidusagestr_8h__dep__incl.md5 index 62d46b1e..f1a640ac 100644 --- a/hidusagestr_8h__dep__incl.md5 +++ b/hidusagestr_8h__dep__incl.md5 @@ -1 +1 @@ -44208c2c5892f1cc422f061692d78636 \ No newline at end of file +12434f462e22c3ae791de99a0f4323aa \ No newline at end of file diff --git a/hidusagestr_8h__dep__incl.png b/hidusagestr_8h__dep__incl.png index 66ee9765a2f37d6c594a3adb655df88d50e376e6..2103f28cf2d1ab0e7d88c23889f477bf96bfdccf 100644 GIT binary patch literal 80536 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 literal 80318 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 Z)!XWv?J-?3HOIh@rkbwmhig`k{|`t*K;r-a diff --git a/hidusagestr_8h__incl.md5 b/hidusagestr_8h__incl.md5 index bc04b8cf..3d407f20 100644 --- a/hidusagestr_8h__incl.md5 +++ b/hidusagestr_8h__incl.md5 @@ -1 +1 @@ -794eccf037bd4feb00fd840fe0fc37b3 \ No newline at end of file +74eae8cd2429afa36b202f9e3b7f9c92 \ No newline at end of file diff --git a/hidusagestr_8h__incl.png b/hidusagestr_8h__incl.png index bd977374a3fdfddc0d7c1dcf3a2b1b9c722e154e..55ba5a59371023075ff450e04c7f56587c8f25b7 100644 GIT binary patch literal 3243 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 diff --git a/hidusagestr_8h_source.html b/hidusagestr_8h_source.html index e902695f..7d3ff278 100644 --- a/hidusagestr_8h_source.html +++ b/hidusagestr_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidusagestr.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + + - + - - + + + +
     

    Macro Definition Documentation

    - + +

    ◆ __HIDUSAGETITLEARRAYS_H__

    +
    @@ -121,7 +103,7 @@ Macros
    -

    Definition at line 18 of file hidusagetitlearrays.cpp.

    +

    Definition at line 18 of file hidusagetitlearrays.cpp.

    @@ -130,7 +112,7 @@ Macros diff --git a/hidusagetitlearrays_8cpp__incl.md5 b/hidusagetitlearrays_8cpp__incl.md5 index 4e28641f..85cded89 100644 --- a/hidusagetitlearrays_8cpp__incl.md5 +++ b/hidusagetitlearrays_8cpp__incl.md5 @@ -1 +1 @@ -24f4b9fff6ebcb53f983ea5749309c1d \ No newline at end of file +bf6795292f5f5a0d124868b867d6bd79 \ No newline at end of file diff --git a/hidusagetitlearrays_8cpp__incl.png b/hidusagetitlearrays_8cpp__incl.png index 3387f6a8527fd4a06fdc2b316b03f05216a87ae2..d4775eb26d19bb01d67c95edb4ff54fb4e00e5b7 100644 GIT binary patch literal 6866 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 diff --git a/hidusagetitlearrays_8cpp_source.html b/hidusagetitlearrays_8cpp_source.html index e7ea4bad..7540b58a 100644 --- a/hidusagetitlearrays_8cpp_source.html +++ b/hidusagetitlearrays_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: hidusagetitlearrays.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + + - + - - + + + +
    @@ -206,7 +185,7 @@ This inheritance list is sorted roughly, but not completely, alphabetically: diff --git a/index.html b/index.html index ef981635..eec60744 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: USB Host Library Rev.2.0 @@ -11,9 +12,6 @@ - @@ -32,34 +30,22 @@
    - + - + + + +
    Some information can also be found at: http://blog.tkjelectronics.dk/.

    The shield can be purchased at the main site: http://www.circuitsathome.com/products-page/arduino-shields or from TKJ Electronics: http://shop.tkjelectronics.dk/product_info.php?products_id=43.

    -USB Host Shield +USB Host Shield

    For more information about the hardware see the Hardware Manual.

    Developed By

      -
    • Oleg Mazurov, Circuits@Home - mazur.nosp@m.ov@c.nosp@m.ircui.nosp@m.tsat.nosp@m.home..nosp@m.com
    • -
    • Alexei Glushchenko, Circuits@Home - alex-.nosp@m.gl@m.nosp@m.ail.r.nosp@m.u
    • -
    • Yuuichi Akagawa - @YuuichiAkagawa
        +
      • Yuuichi Akagawa -
        • Developer of the MIDI library
      • @@ -175,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

        Documentation for the library can be found at the following link: http://felis.github.com/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:

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

        Boards

        +
        {C++}
        #define ENABLE_UHS_DEBUGGING 1

        Boards

        Currently the following boards are supported by the library:

        • All official Arduino AVR boards (Uno, Duemilanove, Mega, Mega 2560, Mega ADK, Leonardo etc.)
        • @@ -200,6 +186,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
        • Currently the NUCLEO-F446RE is supported featuring the STM32F446. Take a look at the following example code: https://github.com/Lauszus/Nucleo_F446RE_USBHost.
        +
      • ESP8266 is supported using the ESP8266 Arduino core
          +
        • Note it uses pin 15 and 5 for SS and INT respectively
        • +
        • Also please be aware that:
            +
          • GPIO16 is NOT usable, as it will be used for some other purposes. For example, reset the SoC itself from sleep mode.
          • +
          • 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.
          • +
          +
        • +
        +
      • +
      • ESP32 is supported using the arduino-esp32
          +
        • GPIO5 : SS, GPIO17 : INT, GPIO18 : SCK, GPIO19 : MISO, GPIO23 : MOSI
        • +
        +

      The following boards need to be activated manually in settings.h:

        @@ -298,9 +297,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

        Wii library

        The Wii 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.

        First you have to pair with the controller, this is done automatically by the library if you create the instance like so:

        -
        1 {C++}
        2 WII Wii(&Btd, PAIR);

        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.

        +
        {C++}
        WII Wii(&Btd, PAIR);

        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.

        After that you can simply create the instance like so:

        -
        1 {C++}
        2 WII Wii(&Btd);

        Then just press any button on the Wiimote and it will then connect to the dongle.

        +
        {C++}
        WII Wii(&Btd);

        Then just press any button on the Wiimote and it will then connect to the dongle.

        Take a look at the example for more information: Wii.ino.

        Also take a look at the blog post:

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

          MIDI Library

          The library support MIDI devices. You can convert USB MIDI keyboard to legacy serial MIDI.

          For information see the following page: http://yuuichiakagawa.github.io/USBH_MIDI/.

          Interface modifications

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

          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!

          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.

          After that you need modify the following entry in UsbCore.h:

          -
          1 {C++}
          2 typedef MAX3421e<P10, P9> MAX3421E;

          For instance if you have rerouted SS to pin 7 it should read:

          -
          1 {C++}
          2 typedef MAX3421e<P7, P9> MAX3421E;

          See the "Interface modifications" section in the hardware manual for more information.

          +
          {C++}
          typedef MAX3421e<P10, P9> MAX3421E;

          For instance if you have rerouted SS to pin 7 it should read:

          +
          {C++}
          typedef MAX3421e<P7, P9> MAX3421E;

          See the "Interface modifications" section in the hardware manual for more information.

          FAQ

          When I plug my device into the USB connector nothing happens?

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

          When I connecting my PS3 controller I get a output like this:

          -
          1 Dualshock 3 Controller Enabled
          2 
          3 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
          4 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
          5 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
          6 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
          7 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
            +
            Dualshock 3 Controller Enabled
            LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
            LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
            LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
            LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
            LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
            • This means that your dongle does not support 2.0+EDR, so you will need another dongle. Please see the following list for tested working dongles.
            @@ -367,7 +366,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/inherit_graph_0.md5 b/inherit_graph_0.md5 index 579c5f1b..bd8903f1 100644 --- a/inherit_graph_0.md5 +++ b/inherit_graph_0.md5 @@ -1 +1 @@ -51aec80c6698220ab54f75d7e2a76022 \ No newline at end of file +e87ef1920ae3987d3f53b1c3f1b6da38 \ No newline at end of file diff --git a/inherit_graph_0.png b/inherit_graph_0.png index b35f15753f9cdbf86fc82be1df09122b9b1fa689..0920847bca3c9eae049cdb2dbf2d3e66abbcd003 100644 GIT binary patch delta 2359 zcmV-73CQ-d62TIXBYyw^b5ch_0Itp)=>Px-`$fXEieEu;9=I+kSnX@}* z&iv+_vo}geB28KYaioFhIC`#rtkwW)KpUVoggDiJHo!PlzkhzXHb89yajJos(5Ig| zb&94>pB~z*>skZ8HPEV6D{9fAg(Am>fR7$MqKz9jDonbfHQ-kRd-v|8t5>hu#Mltf z;MlNXgK?{`S_8f{P^eHLM;SH*bmY>FS_8490d0V>q*yK1n+CK2def8UiX{zb1B@lb zYO&rl;2MN@8-K2HUAc0F7B5~*?b@}YGG)rBow9cF2s<~oH&tQzIE6A2lp{wD>eQ(d)vH%e8Ru3(=HdA9<7RiVWXY&x$&ysRetk-u zII-F8HZL$>PAOBSWZt!F*V3jjV=`sR zM37UfR(~y}J<>{`2smrjESf!gHqDqZ!}dOl7A;~${QC8adiLx|MT-`t1q&9i5q|sj zjrn)(+)0oDLky*Sv@nKNfXyBzDwmoKN&r%%(zj~|ut`SWMyhp}9|c+oa?*REXz z#e;6&zRl0<*s&vh{rXkmoj-p*J$(3(+rEGQPJfLWHKI|YM)ACQ_wG#z5+vZ9*OVz! zlyPnq819Z8J18b5hRgl?_j#jWgFJci#2kisoj-qGnUgU`<9{WSCQah8*|KHhO#maT zRH+i-oelD`9?;*qb?eM`!n;9d4H`6{;lqa;qWoR)Zx}1d^b7tSV{P(u|LM~wkvw^F zF@JREP?01_67l~1dvlyrrjRHnr1H!*+(@Jli4r9e3l}cr_NGmniV`JC2#Hb(->X-z zc)T=PArV07bF1Xeom<_L*ALK=#~gZ6mw;)xe8UVkXNm=hjfLU_qM>!5bI? z%Eh8IY0}Vy2@`ntZ{EDw+!;VL?8XiqI+$&^!7+uSwL*moW;>2$sd%y?9gg0L6@M#I z`t<2dzQ1(?Bm;6xo;;au-n{AfSo8z+a6DNFZO}_pRFt*Z^S#{Ags%r%w{9hA#Gb~< zHKi|KzR;~(w-kQ3I&ddI;jD)ua`&2klF|03EBwyJ zjT@6hDfaQK{6ByGFThoaMlBUFajZ?Ah3G+^nWRJ?%X+$DF%XoSQHosj!6)93d))_Ye@Qp94W3?v4VL* zQ4mKINcuT^#Se~QDCxwB6Ljs`HI7t`-ET5^xWSQ+h}Ve_WlBHQ)&+;&=~)>vWFQ1W zLxv3DNZc5R2tIrE>~!G30Y*uq9arcCQ7bl7XjE_I``tYZ3C=%`J%596vh?WD!>B4( z=({So?AWo?w{Ks5M?~&k*P~dmVs!4@IrABiU#e6o0?J~}ekl+H zL}Uiv4^a~eb{!^*lnbbA*|G#Q0)kix=mEY^bi{7Qzb0_>qF@1oCitILKhuzpC=Y#3 z)U8`L!Z%H%V624sg@2|i&=3C>SpoRJkrMnh7@t>!#iq@eF{84%Qm0PM5jsHO@#Du~ zuZQ*BvEksx;3y7)d>i1gW5?*hg9p4LbLGlKM(NU}3n7n&1qHgnmqGdkI~s&tiJhD( zRVv3^8H^6OEab+l=orMLAp__Lqk%sKq=K(Adh}@a8Qq=-^nXVB0>}=2gMf_i$$$z7 zpg@>+_wL;}IPq#c2p-_JpaA&?4I0D&gEf5u**I?R+__^bKqus1)2287b#LCqV>RY4T5~9)5GWw=jz)4fqr%C)+HJGE6)W?=gE_YQ4kBadi8389|C6? z(H$lM!$s~Z^nX}}psH1?ax`77S~ZTY72yF?kX(kN4u2KNTf7r;gUChVz1;}!KVrlP zHd@0c#Sx519dj{cAz6#u;K-39-9*{ikqgX{B?}ki|Dd1k+qW}fS(&j>@Q$Gc34RzE z+#2}gxX00twK;n9DDB?8n@^ia*2DUI$ioH%`1mHNM1O@M%>ybzep8VSw2()%!1Z4s zi4H;@Cqgc^@7Iw>oVa`Uu8^*VkO^N^A>r%- ziPVMlc^XARV z#i`$D3x8rg3|Wy}|GEK2@{*xr1`Zq;+Vs!Y@kvXQT?4*-K)XoYqBY=M1KI$+>q>LR zf(En!#)49{NbefZ2IyT^nllzO;2MPBjaOHo$PS drFjF_z<IS5TB>dj=f;R-h1z2#|HKa_Fk}~qF7N; z^bdOjyJGKHuwccmhy}%7P*G8_cg>gI@a5Rt?!LEoxA&fZWFWVjNiw^cOn#Y}y%-^h z3>gh1k_M6_(sRvYjRsf)#sG~WB&r6C0Vb;Y&BKiW8XHJd4S&Q2KmF08M>Kx?c>43_ zPjHi|8x4f5ftZ*W8a8Yg)u>TJlVL-^%aB;npk_Lwmp&-n>aGR;-{dUAj=EN|p3RSvz;`9Iao!o~~cNPU+L9r@D3P($Jwp zDMgAD+;`QgRopgc&>$*Oq=+{D#EBEMd-rZ?-n=q*}FVX?<3&UQNl8CF42VxN(D4u3Sl-JAZeks#U9M{l<(LL%n`SRtX9zA+clO|2Hac-4u+qTh}GiL(LY15{q^5x4@)22-+RjO10 zzT3Re0dvZbAp`f_v}qG<-@cvRzkg5l>eXX86)RQ@$iYo~>v8DNAwu+OrJOl)667>! z(7?(L`+we71e`yAJ}p?VfacDfYkQ&P%a^kv{{H<-{rmT)(xpq&(xpq;2!HGPH<|U0MP;nk~Gnv`P2ic$Oa?b+BzjvPr6 zz1WpdelGmxnl)?km{8V3o^0%wV<6lo`1y0@%whi*^NW;xK|uII$B!Rp1AoK|b?VfK z>&kb5|73Nf<9q3j9XqnIVV5D0IC=6U8)c}w?&Zsubo=>-xOkhv1uDy?T|_ty`xJ zm&Xu)HGz2#l;%t5$UB(j_)b>2i>Cby!v?>w(RM zKu8q?Rxe(>pq@Q@`Z7gd5PuMh0^`6j3Bpc6*|>2dNuQ7-#kFhKa-U!n#1RFOehy#p zgJT#FCj;jFO6vD|CXW6&orzs<-xw>mG&#=O4$OBAhJ!`t?&)?SBfreg6EJpEqgJ zBtm)j?j22@JedX$9?b8E$ldFDlqpk&@c#fskYAxf1p>-q&XJNY2#ClGz8|6{6zn=o z7AY4{<;s-_XaoeY63_$vg3%GX9T6msUKA{#-vs~D>SrqXi1N_pM1A`7A$-$B3dTy9 zUvRnt?eK4r6@dR6E`PyagYkJqSZvxHIdW*5D^sRS9H9dgo;`aO@_Ja`9UBgA431(y zC}IOVefl&#dGdsJWPt(&NR?i_dJ*zySWuuFd>N!)u%kiPmDtG{GiG$mmBHwc%R+9< zijICv8Zv;6FdFz%Kq~k;6DLk&pV94kKyRckfb8h62*?PZ41cJA01AY8_wC!4gA=dD zgWv&f3kr~b#E20bFj&(kkd5Q^!Gj030(3(DHA|K(oF-B32K>~;ix(46zf`GGVXX(A zs|fO)P7l={$~9sG1o|~@+?ZtOuRRwqU8qnYMnNpxh7B7Ceh8dpM0c133>Uet;A0tr zYS*sK(R7_Ub$>Xz)`a^|L2?<6I{Z~6Z}CpZ4I&qb_jV(^|G07E*l3kciX#}2I_9Ee zAz6#uApTqFm5>X}ojW%drVp(Niqu?Eb3ljV=GPpJH$#IXPA8T{!)G0b} z-~gXC;jD-C`H+VV2=IxRq!Kj>HxH-@iK8MNXd#bifq(12KoT8!DB;npk_KFZ5PbYMWHjKH2Ji*OiEIdnOnO`?11BMdXEYF>2JmMFr&Lo6GL-QRHtj|O z(b9ko0i*RGBiCraNdv|JowQ4$}i*dw>@h P00000NkvXXu0mjfc)@i3 diff --git a/inherit_graph_1.md5 b/inherit_graph_1.md5 index 4b69cca0..592e9a2f 100644 --- a/inherit_graph_1.md5 +++ b/inherit_graph_1.md5 @@ -1 +1 @@ -f7077192a6c9c75c0fa28e435f701915 \ No newline at end of file +b017c0b10fef5a6bee6477623e5880f6 \ No newline at end of file diff --git a/inherit_graph_1.png b/inherit_graph_1.png index 53c21c8211bb1519de5abf04d110d7df0f3caa91..c0a8e9084f012e0ab1afdcdd753ca76125d83428 100644 GIT binary patch literal 11647 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 diff --git a/inherit_graph_10.md5 b/inherit_graph_10.md5 index a5b48127..1742c117 100644 --- a/inherit_graph_10.md5 +++ b/inherit_graph_10.md5 @@ -1 +1 @@ -73bbaef19201f2ba28611d49756a3e81 \ No newline at end of file +2e90305d9cdc8803e4c818090bf3bb7f \ No newline at end of file diff --git a/inherit_graph_10.png b/inherit_graph_10.png index 454eadc10de6b75ec1bd24130443d449a9892ed4..0980cdfde680a3d8ade82a2f7c56884254b15ecd 100644 GIT binary patch delta 2086 zcmV+>2-)|m5V8=EBYyw^b5ch_0Itp)=>Px+>`6pHRCodHTW5$AO%ScqGv};`;Z)2y z3uaMKQBg6W{xS<@446R0fSASXnH3WV3Py}5=A7=#APOc#%oy5wr9IBe}h**VV6j&p5?GM*ejVB&Yk=Jz(bl%L4`o1_|N;1Ahbq1Oo(vfj=II|5N-` zI(zmk&7VI%u-VjoBPMvWR}>7bA=Up{Kos1Y@7+SJh=s-w=Th6pj^Lx zoxXheLUroY3G7O-{_52$di?k?)vjIJrT6I3Bf4?p234t2g%T1HT>V}eViFN<-MS@< zdh+B+>d>JBb?)4mZr{F5l`2&tI0AC?=uz6UXAi~4$IAzk96o$FHEh_Bo<4mlIsn3= zMT-ca%730cy8r~^n>A}jD^{!!oz(u>zkfd+Ja{mu8d&q{)vLue>_Y$y0P?|u2aYjc zzka3Bqes)ig$rrlzI~29RF*AUCX0Za96;^av!_ev`Sa)0vSmwJvu2H}FSQ12h)I(s zIn>~vwr$&rKc-HdN@dHIrS03dJ9Io(@av;pIDc)#uaWkqRLhMUH&zS)_5J&Ihc4P% zv}hr1g9Z&!JPAiX=d+3zK{0Toot-b=eeBpVhaUQQM>*O;Rd_*EuU@@^c5mIfRprm0 z-_iH-aXwr&d_9WQpSFqBy$9c)LDFTve-9EyWR6ninr#EOon1O68=a zB=IkAu0XY(-4XOqf6~Uc8{ZdGiL< z#qKOss#MUvXdBrh!~mw!rAs?Zty{N_7=KX2V5Tlzy3m_9Z-@aSI@`8wqjKfSQPrwd zrH|Tyhp!&{lph|H@mD|yOwa|>7#V;;K5?wuH&^FH4qqO z0swG=Kq*$N7~zwWG;iJ<;fHvaQN4QgL=~a*@ZrOj^78D$Zced!@T`^xAfoIN~p(ah5(7=HM zC1gVZyn=TtUA%bF72d5c2~hxNf;@cqQ0!C>mT)G=v%K!3h+<;o@PUd~y|U_e3J&yXR5kl70tF3^!9M=Y%^ zTeiqTW3i!wh@eR*l0nzg+dZP>-I#ePN>=Z0m zkZRVfDbb@$nKE8Y%ebh4fPcGdq=J}eAP{g)!Xd%ZD*e_t_W%M!m2cm^>1M|h6NVr( zMhgUo;olV|baFJI3a$fQbMD+Z2WJ8MM--Smd9p+iL_)iOA7H_A=guuz$;db8 zl&w>zPU_I1Lza$CAMJWb_n1H_q-@~`(mnflU7kLDx>v(dASIpAY$dMxzgH-V@ zSA2n`Hf-47`YMhTGM4{dL;5(!m+`zqWxl-QU1QL|p**7WQGXj5KYqL`edK!y#l%!G zZ;_Oj0ic+d=pm^-Q%WDPdmZ8h2-*OjrIK4Cp9VPmE}T*-&JYx5AOGuAIipZ~*tKidQ2M4l4SN7T1z>H1T}{W~ zMj{Q*&AfVSJYfD?d~E!f_N};%hO|E=GXpOkFhKC)H6I_2F+lL)qI#LqPbg%OKQR7Q Qr2qf`07*qoM6N<$fV!Z delta 2079 zcmV+)2;ld!5UUW7BYy|-NklMjS zdtjHTM}Y@&<;q3NmMx=v`SLkt<2o8HUAjcuw{LeSnM!nc;N81-v}w~Odh+CnYeKGw zpfz^x+^LJ^86_S_O--fBl`99GjVmGq)iRAy?*RjZs9)mnCTM^Vo}Z##%K#zjmpHr$ zdXmNPUjL=_`hWFnTDWi_UA}yoK7Ra2)vH&h@#Du+*|KFtY1gh@bmq(%>jk7Qb?Vfi z_U+pfQX0sQA3tc!m@$?P3Pp+(p=QmRQOlMs9qnF~&6_t%SKq#UT`E_uToKl+J7QvD zs9d>n)VXtKdFpokgsrPruhQJPb18fF?7G={f`y+vd4H0M6)Q#!8#W}^3zQo-ZqS!6 zU#LNY27z56>#ttD5_Vs|etnl7Qv91YZ&HmKHK=^~@~-|!8qy^q+`fHV7WLGrQ`D(b zC+ga@E8V$shpJVpMsNh=*s)`@ckf<`jg6HLQkan=M^e+KP3h^=r=kNOEMB~r0IIxs z^9n%let)Z0t!UM%RicyDKL-vRphJfa1yuuUUb}X!*oJ)w(kTG);lqcHcfNl8N@K^4 zrA3Pt(f*Sg}GDVgCI20@Pl;dbxC-KYvbb+qR{3>(;sY(rUnlm@;LGLk<2( zOiUDiOrJiTDpssWJ9g}F=tNw>ua9=&v=P5X+JBqUEH`i7TrmI?UqU%_(cY#_8)+Ld zWQgKPIQrkdeXDp86az=v+4=I_$B!R(=%Jr?l%vh7!V98$_wF6Ed)u~cs%X)oj=q;K zU#dcd3aNSX<~iE;?AfDAmoBYfPmfP4+`oTcaYR$suV0rY-k~aI&YX(Dq*W9zno3AW zP=BRLl~RKS4YJzPDlA>PRB?1s99`snyFN!;Rj*z>#SvGUmn>N#b-PZea!N{y_?I_V zpjwLWqXE$XkpN*gOBQE<*|KE|-MV$l6Qud`=cn%7yUR`Hix)4baN)v1b+J3+;^Kn# z`E6v6$SrDoe7wWd`t|FH0YwaE>ej6ry?=T0h8QrSgA2Dxl`2uqnl+`4;|1Xw^U;Dx zk~?>9Id-seb3yjS!$;rutBTpZtLx&C(`*xj3%f5lYC=&pH69h_`GGz## zP|~_}YlI)-T}F)>H4;^X(j!NX$O6Isg$oy?9?DL*eIGu2pvjXbi~9Tb@9D&e6MxjW zabxPxp@U@tpu}-7Yt}4Ta4aY|4)1Ky!B{b09D!%go~0HoTF~IZgC%4`0lb2DE8&(l zFuYq|;!yx+f;@WkNbG1e_(&gL;0-uFd-Ui*!-fshD!!i1EgXR<5FrkWL5Wg0=D;H$ zS+i!f)G=v%K)wnTC?M^ToU@j}fPaFvpDkN9A+r}RUZkT(k6Kz=w{De%#$rPU5kZqs zC_Q-afDrAPG-*Qn_U#k0*sfhWx_0fF5M@M?HEY%g(Y1{FEIfPmOl-ps_$>&W>GbK- z!Wn)i;&=_icSJylM3#V^0d{Yfd-v`UuB!D8wD;*U2pkAx?b@|<6Ac_V(0`F7U5KDRBsND6uKbg9i^1h${0C3G1Ife-@B{6a#pOFd%x7iry&0hYy!X1Utox7pJ;)>q_*fP@zJk zrsX}~K)~HKQb9~K5C}LY;eU`|X_X!|&OLwtQRUmWZ@Ss>#DpOTjeddPF#KGj*IS5ZJI$G+wpQmpiV23f|rU?@!NUq$mV@Gia!fR4e5+Uqr0e>iTs>m6Gq;dcP za&fyblehGknM(>+vSdj~HSKy{W#sqzJk>gyh$4*YF#vc-X%{S5Afy$#hz8&-f%!W~ ztp-A$K7C|Y0xaM)hz1xZ=2ELxEeYNFdq<2IA@>NYSFhGh5k0Y)aO5Cu#fAe2aBqX7 zHC>1_qu3#lq>o6IW`E3>p_t7ozIaiLT*bRs?cTlHvW@hSJz#y1vUTawMIAnT*wWGI zqg@Z_9up{qlr0=Vx@Ui1muJqLsgOSEI-VTj6|;0Tdh}?;AXU7}6<=VfjT<+*zKSD- zynF84Iq72(DDU$QmHG0HcfErK4&}d_MK5`UCwBP#PP(bi~H1N){ z1n0cYt*yp%F7)i#)6-)A{{7`9&r>0tJHQ9*BsVSd;7lA*f~r-mT9u|vn-;V$ura-^ zmF;%Z6$p02e}Ag{fBx&KQKLrvDYy8x>-!$T_Xv!E4B-I-gbc9^e}51L2!DSKGQOPx-HAzH4RCodHTX&2NUlcyOR&UW;5F~o^ zh!#YN5)oa9E30X-zJ05B;_fd2o^Lv= zTer>>y?Z*|fyBf_s#vk2;|c;i-?5ih8Ie2Sfgh2ux?7Y7zPo*j$X*`!5eciiMFk~% z?q2`D*NYb~Xn)R}IdtaC8T$C~BUP?knZ}G6LnTX=)J`}-9655tdLd`doK(Gfb!yeB z6=ltu)v8A!IbFV;SFKt_=gys@>C>lErc9Z9n^L`uc`shPm`wLkCJoNT5oUDu2<13m0@A`}Xalty{NJTwI)9 zckbMw;lqbhg9Z)g!Gj0ZT;1q0oxgqiMx#cJqPcVD(vBTFOm&*vZ``;+b?VfiwQJW> zy?XViSFc|5;ll@N*|H@~oH#K}=9KK9_*KtWiZ!MwjWlY11YyR;(Cz>(Y;=b=M~Z1s3}`t)f)9V&kQ{K*nU z9NSE#+ck+3>iCx~T{5qldqM!pp@I*kFqX4t&wm=F*8T3?yDT25&raZ@VcN8591|16 zPo6wsx4O&#FgQsqynXw2&YU?jzkK=9G%0Xx+O*-qg$uJp8X4pajY?`26xJb(Ut&XXq($HvBT{rdG8MhcN=#kFhK=4{!rX}?aLI`RAW?^(jU z?tg)#A4{iip>Ex}+`D>twZp9FH3}jwKzkq&vp5L`SRpf&~jWckbLeM(NU}dC#6b zR$HS+jd<$RsVpg#`}XZ?)hAW>tKe_gut7J;cQc(P6Ab(lCr;?b9X@=R-RgpV7z;qX zc=4hF39yzdSz--6bLLF$(xr=f5j?C(lYb^GoJ7IOo;^G7+__WxO6uTz`SS7R&6^qE z!;tZw0ku$}LM*&O`!;Uen7eoH&hTzYRa~J$1)ecu1}|T}T#XMN>m;Xi&-;D4t$ z=YRR~g|cMHLgKy2rWmIV;02Hj88T2Px>m1Vt)vpfGGoS!)Ujhn0{Jr{UQ0)h9wpgO z60m94u3a=_$Pg{JYuAp%(6sCR{reI9lz5tV#c;G=ty;A-e_y$Bh49(?z<~owVkOFu zfJpK2@!Bqtf%4|f8*~o@WD+oqdVd-*Vg!j%5%f%$FoDjWKTi@Rl`MiUfjfXSw`kFV z%9JTX64|VGyLRnLg9i^LF#@aZPYWpqU&5A7^w_au0du%^?HWy)GDSBxpz(Lb)vH&P z09LD3jY842V#NvqDA)vC63+EBar^dd)jV|QP!cXc0|pFGV8FT`K76QcJ%4)iAn|mP zysqE9#nWvk1xX9mba4`qs74a<72NXW%Uf+VYSd7|D&d(V5)nXllHI#^D~P5IfEp=M zqzJ)KpFe+2w{G2{EnBt_#xR#~7MtEGRjQa*Q+!V`_?RS)ZBA?(EF23;Dk>~nwu}Hg zqK8{u!Y@ep0SSpBNgI0MRDV&bR4MgF?8?oXH`S}|-@i|%PoE|sqcmyKB;By)&6}&i zNq8k8jnuPePuoTU41bZ-phk@K7}>jbFF^-974u)Ya;0gq?$@thSHpov8+rEZnJMbA z5K#dJ1f#=T5M|7TF(lPk{li-D&k>;#KD@tZ(IU>3E0^XdPtChf6Fa0iz9XnR@DIVph#dt9?f9?$nhYD-~-6nIB7`4)2`#kkJo$+LTTQYA5}D;;{;>) z0CGNv8}H5yC_i|924~U}PBA*N99%fDeO**JGcYM7Rkf z8p?0*PR$|JC4c4lVf(y`T!g$AE4m_YHySUuly zgnzIS3_7i3+qP|KHFUtZQR(>syAY)n9{5oTJeKW&A85tk2hI8TR z@O=DXf9KAfO}lqb=Q|)@UKLN={Urup4E!s-=cw2L@4skA1XyHgR^?-%-RYwSMD{Br;R002ovPDHLkV1i$lGpPUo delta 2162 zcmV-&2#xpq5dIL5BYy}*NklkY@5F3rV_V)a*1U%(Ou_buQ_mm&S5{Tlh$NBI5_J8f$G-k{g`uX#xf0Or| zMkSCXOBR|pZysgKmd&<dq}$yc=zrdEnmKz?%ur{u!#WAHyrEM ztusaMo`xlmkdQ#-%a?cDL4fBwa(R^zDFILU5vf*poAQ+JPEHZY?q; z?*DPUeEE`Q&3~FjXU?3VPoF+f#flYa)TmKZym)bCTEBih9XWEu>X1EqcB)#nDz#|Q zf-+~$Y}KQX)L6dED^{$abLY;{v}w~QLxv2#O(|Z+x)&~7NT*JnqSvoqQ{~E)sdekt z)TBw16km&*3B%&~moHydMIJnOP&eDIT|0`8kEaS1Du2+03m0@9`}Xalty{NJTwI)9 zckbMwp+kpKy?XWN;lqd4THTCgn7@DjP9sK)pxLu$(~ccGOm(W zojP@>M~@!#@#9Bo-n=T<|KHsV&%k}HmXR&aW7eh8))HiP2 zSnCE17=OSmTeh^dzkU0b#rs)|#j1BRmSNtsX%iPIQiQv7>0%qhwB!E%{d<1%=8bQa ztMZQ@KUloik@v}yC;a*IXIq;nUibRt%NJX{7=z05(4j-NdOSRP_AHP- zZKl%gp2P`t{!5oGnXcv@AE4z>m5)JTEN9Q2HGhLz_j~v5v3R6DJ1HLxQ>RYln3x!T z`t&Kg9m`ArgOk+4+qZA$j2ScXt5>f~lPa!Nt5#gFU_q8>!xDP6ef8?qoIihl{`T#g z#oNDse>EWSUY2ykbLY_Y-}voty`C2q#%h_T(f3PmN#a~*P%lP{_x=gOPE&~ zNPqgV#`G=Ju3ejZ_Ux%uWy+M{v17-wq(hc;$9R_LXtB$iIL?_fr_NEbWJ%t$XOGp^ zpg{wkGGz)&O6A_Ydt3F175=F5H*DCTLh==+(_(@t|HO$CD!9Xk53}2`Fg}b0O1*gT zqAC)~TC`}9HT8@cGq_{Nj_O75uttpwxK6tDX4H+_oB^78>;lhQv zbm`KJ=z($i_U+4p4RoDY6O0cE$5IKL-kW5Kabf^20HsTpjzSr0)v8qrDgi9hr%zAq+qWlxKSScRboA&^5`mH^ zn|AHmMS}(n(sG+NZAc7FS@-YXkLahs)ASX?QN9{AYH0qxa^(u$zki<&95|pLR-z1v z5^3eimD(x$mbKcdRja0eRl+k#BqAu;iFWVatx7a)P^h6o zg$fZ2^~H-9bnDhF+OlN}VGeT%X0eT1sZu4=HQD!MD<6x*vCRo>1BGKliA9AaOO_B6 zkLclcEWsBf_<#gNk)#d1aDS>OQKE!;BcyWk=1ujg2M-<)K33r?<-~~-RbWkuNagXhYARKQ~1^79uLZ zfM9f33!;pKobB@oEKdR;S;E(W6IeKEy0CGNn z8{~wOh(sX;kr-sooPRl7v}jS5XsBaK#9%QhmI$ZM$oY#GFV?c#KZ)ghShJ1(kMgmx zNs}h2A^}iP{#Ves&J$jONWn=qoG ze2aH#4yi6N&wmfw>s{m`#lbP;sP7X~GFXUgD(mw2t$I)$<)^ z_zNq6pi_&sZQGVwQwPi&m7X6Ug($7?lpm#v$F@D?M{BY2gXVm^^7JU}O8`IJ4n_f< zkB=FhJ9iGo@71R<3CNpQlF!N3FRFZ(AA>grz7<|MY9!$Oi+0qg+F_#sVc&trtBOzw oc*>7Z#k$#+r+hb3icp?^0R6Xa?C9Iv^#A|>07*qoM6N<$g2?_vegFUf diff --git a/inherit_graph_12.md5 b/inherit_graph_12.md5 index c3e39686..314ef65c 100644 --- a/inherit_graph_12.md5 +++ b/inherit_graph_12.md5 @@ -1 +1 @@ -3ed57b3e36f0a7a657eed42fddb5202d \ No newline at end of file +ed02cfddadc4837deab27d8a488e0b8a \ No newline at end of file diff --git a/inherit_graph_12.png b/inherit_graph_12.png index e1d7399b64d287013dfe450ccb48abec759796a7..7bed235d4dc70e299c8f8583aab9b9da57dc61c3 100644 GIT binary patch delta 2621 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 Qr~m)}07*qoM6N<$f*0fRH2?qr diff --git a/inherit_graph_13.md5 b/inherit_graph_13.md5 index de950995..61ea85b7 100644 --- a/inherit_graph_13.md5 +++ b/inherit_graph_13.md5 @@ -1 +1 @@ -a582106e55052f1107fabe28f27c7d10 \ No newline at end of file +2d6b3e67436f8489e4525334563aaebd \ No newline at end of file diff --git a/inherit_graph_13.png b/inherit_graph_13.png index 8e1a41f43432ebfce124424bff99747e4e5c5cad..ce2643c768ef8a2d7aba965c267be0a49e2c5ad1 100644 GIT binary patch literal 5523 zcmX|FbzD<#`yNcXLq@lNfD(cTjP8<+?D1{PEo9x$9idb?#V$ry3Nb%%lJSfI>@C)d&EETHpm8kzLq+ue@Dq*BEPmM~(;4qg*cvsk@!D| zyFc{5Hzal_wywUk2|6+HKN&aUfB!uQjSgW3zV~cv+WFPsskLm^lft!!0oe-o)<>&N z29wVQoy~bnzsUGG?ZTAodis0Xqces^`a_2v&W;KAtVGva^1+;%afOz85aK`yz+R?_nH5ceRNZChKgXe6=evaG|2@Eze}hPmAI&zjOSa zW=r(W1@5V zQ-W$Tr#Fc08uTWlU`8B~q7qQ5!JLoC38~nBZ%$v{$!3-_pIrU_Bg`l%05<0#yi{j23A&jHUpVd?oF(gJWBG0>v z$z$V#zp2pbpN%{ztIr2v#HQAM<7E$m!`2k7Tdo&Lx%1td*3#qsM|Td7)ixzvM>@wp zJ}d2iBBAJO&IeJ|I=?DSPJW%8P5SNsLLd?%1=2ES5Ic&JzWS1*}dr#s%ku$u&hehh&zeCOJ1EDaI}6u zxQ+`;rHjS2nW~NXa!p&ja##}_-3aki2lZ~0e;+uVa!fX9cMhVI+2lOY)dyo$-L$QR zF3(SYdCoDrmD8LwkRiH~6>iMEk|#X1+Di3rm4&B1daU+*^w^vIqpaZ<83pRgJsO>X z_Zz0|Lrhma~J&!;0KvP-B?7$%ne;$hXApjwyo07HDC ziaH|+5qAIzUk<&mB@jipvM)M-E5x3urF%U}d>O|thVncGaDtZKU*ZK>ccg-^Ad}_K zAEiYzwjY4el9Y<9i~8twrKGV6OR47Mvo)FcQp1Tqs|E}l_a@)vG)!HR2I@j|uFk7N zZf{<|sIu8a@E83#*<^gZb}Cyc-KM`3|FVx}GcG%PwcelgiQ3DPMiA!xuyGOpE{d7~ z|F~}SX`x%w#RvyiE4GWJCGqi$W{2SCjmDkE4k8X{HLj`N(@u~Il`lSQJ9n^o2D!p^ zTaT9L`2}})KmYbZ3CW$G#ZTgT8Exn_j(v%ysze3+gY`BLUySy1ul@O0@W2&F+@gp8 z*+7tc)AJEA{&Rk2t-Dh-g;8A9!Gkh8!tR9%I|K^QgF9i9Hi19gtJ?|pW_p4p>op*#6!AKWTbTucx*^)Mwq_<6v>P(z*q&(rvQ6K#{-9$iWI> zbRTH%Fn~Bp1QJqre6enMGn1n}dN5%VxLZ7&YGV3a%{7J?-+553?gr=C)|0iZA7rk+ zc3s@QfPHSOL=A?AR%OsAWGAy|nX66&FGbho-*3E6wx8s>u-_ewklh^;(I%6Q_@apq zRdU+;A@a>vphRi``s^9kvC132-I;M5dwS65J6h2s7VPIp`xtvT2q+%qP(-mmiE^G+ z5C;)ZIAJAT!%w^hitHLgaD07YeRIE4|xMfU3F_i;RCBTOlx&^Z#An^r0k z;aNX!dV`E+KXkAUkcNu%b?dO}Zm>P^%1@GgH6?02SwCs>Ign-$b3{}1QwKa99|@|^ zx>Mg4h{hw@oLYVvC=dURRsMYw#o{rvamCZuzwqXl``f&)x40&sCbJKyL7|9)L$*Jb zUQ{&9TP&oa(m;d3(&dvRfpdDt1#^DH@(}^vm;GYg_ll6Cdo1pDm9@(lH!(OiMbxfw|%_tphDBZuDnu zM3XaZ$ojMMUdoP2c?Ks1`+V3REuVfK+!@o0(ZyDs)|`N3dvU4VzQ>w3Etgob^Z=WJ z@KiOwP@$Ao9W+<|s$IAo6hMK?Jp1j+O_YRSR0etFZ(INK~%H4bL&sn7HcW8JP;^C8z zSMOdr2%pDY$8%5m*FuH@P$3?pW%r*Gm%D3voOZ>8$X52ws(a0C@0DR%}f1lG|*zW=Thm+NPLv|0q`NZw=h|r`L0{%WLP)xPzF_NT|NGR)FY5j7ja`Dwj&JbTNm;HO;OsRb-lJPPB+JEYO-G7~Cc&!;Z+!c{O zasU@1Rrs5092b6OuiFO6JE{Yb@yn&5r4LXRn-#*@>vE8O)I%4X9;(q+fkCCC`Ew!M z%xzO`I37YuuM%=;C?X;b=_Yfem+T9lD=(eR`cNfvYZkVbrCP<*e1`Ib+rD3-a>?qXdJ3CXq;wJ2`)9nhm*225wEwjx0C0%2)Qy_i!qJlfL^g0<{V63dm|idZJasbiJ0 z4pkV-3ShVs&z^t6W~}pKGeW#>h=+=+y6!raUtGOFA^fVWFlpH+>?FdOF>6}}n8~Il z$Q}^|@cM(7$*x9F?cBjY=sr_dqw|vm>14nN^DtQSR+R2sxCa*X-RpT9d5T?`@59gmOvE=IY0Z;kao8%osU>)TB)aqKCB4Uf15yP<~ zVxgsm@&b0NRDGl=#BnS7=lONIG*hzP@+u4l(wcDu^GoDRKRDw{#b(H#(5-TTZOJ(> zllG3nTmF%E>3aC3j`|-BA`EqDnV&61r-fHL`;@$@<^wF>@ap5G7zopkW`K!Q6H5OH z7fph!TL}C14fN&ChumK05Os#Egg@Fq&T@je@abQ(y6F5;(4|yjqW0`Mgs0>_Hl&F3 z4@YAhxojvnHNU|uzEs9Do(M?kc<1|;3=SyW_9&~|e|TFRju+I|Y^!lVtT zW=dBWicy>9AG9TAMEuGKks{K?9-b?p!9Sf@l5bNs3cOdMlnafKKi}Xe45YF_Asuo5OS&|-(@va!R&L?ubZx|{Xv4sx z*W;2W+mcEMAMDY)Z;0wtW?4Ri0G2@pPZ+B)gWl-EK< zp*M5F4@w9Fl{{sS1UZ;o2LcFiCghKzafj$1+}k(u)uwzfnszp#({O{0NA5Ec6xN1J{MchiL;p1$p~_Nz4w{3DaKbf|I_12+WwRiDjIP#+ zZ;;CgT=#_LC{XY;u_1=Qlo(BAO6eRk)Sdz$SD?P9%&wUEh@IR4Z9@VAAetQP6j7qg zS~IvGLfdX-rQN2DT;`i<|D&KnWAZ#k838+#i!$8RZLPt__)=92jr6#iLvtFHpfJqZ{Y1RT<$Q3Ey8a3O%aGew?HEhiFRnWirD0x`@7;b4*Us8Z1m#d3GOgH&|J_k-nj z2#NQWBTbJCKZ(>LPM}W&&QLI#eY!1Jj&`^p4R1x1yLH&kz7i3$6JdztTi2R;=UW`g zNvSN6>m;DaZAfW;89$!i`v-yrLcUN1f_99^9=t+9uqrb*k;D>8KW2Ha)Uq@Sf|4j5 zF;ug}j{>+L4_IrYd5H?$08-wZ-dbY#jx3#%DlBgBgZF%3jQeB(v0*a8TNw zr5zZ>j!bC3BXSE<7htCO@mNsC{?$5zki{9^b?k7FBf}+CW6?R1TKD~F)BZvT!gH=U zk3q@YQ1v5&Lbd*8GCuu4#4^nRQPM7WGgW<5Yrdd5s^bn&i~%vxB%;3{A!8@Jo`Ryu zAm#2infFqGThmt_NQwq^_? zK2hi4p##l!{dI%`{FYMrGZO~?XFLajJAps;bzp_^0`9EOXVfTH>8J=8WKfC+bZp)i zak|gPk}P?(AHs1t-^#)8A|y=kqfvQZ?e)QfKLm0rZAVHBdK-bI1@5lCDUy$!d2QN8 zd`%Y|a(T@1KSR&$KQK;qSz;2*n1af<(_?fb=*1(qr-XCW#SHQE)HuY!9LBI@_)78p z64H&#&Mz^c+u$E-s);pZab(1W#*!(B1fci4L)Z{?USDYWwWXx)i++>ejEz?eL>p|& z3!UTl!J?d0=EM+%+||T09#zeeuV3< zsj6vm`X)&lZ7_YVo`NmqeUl=&M9ME+YYD=2dE*V48?e=$-ZkI^)1c1U&XH%G;Uc;_ z6zWMk0?AG(jATpQHzD8@{p+Hwe0_2!ClG<%>r{VWK?sX!IizXPzD2;4~Q<>2$E4|mA_VvLmh4#rq0N$eH39VZU?r*`>vN%#No4A0cA zRi}oA9opOVA?^>`3g2INFIg(30H6X}`wZ}uJ7Mz*g<#R*ak1jcm#I>bHl(|Fz}tJ| z28T9m3O;4RthK>^u1#N1fVxN+%jn4u%&dnbuU0up{LY7;eG!`_`v2YkdSFaP*ac&K zCTTCP%Yt+MFH$&gL%FqX9T$rKjv&kU{(7kwLp4hHU%SPGq(h{nJD09Sr34j8Szu8>MY=K82vY{N?f{O5N(e*n@pfhS;vJHU<`7;&tm-_b$Zp^Qb{F`=tp z-iiVcspwZ+-wo|A(mQVK_WwCz8Jasq?9bGRoXqA0O}fAxeAM?uJFJOJMF|6Mw%oY<`YDi0|*43Wwvle-zt3Euv) zHzaqjWgL4Q8FkMGto`l4I9Z^U{MGV)IA3Y*d)>VG2Vb)HrS8Oh^^4ISs7S0*=P^ar zF9$kaf)4$3fg3r26XN1++t|Qf6aXURG@K`lC@v`^gB(PLTx}Kcx<0iLzYih~y}R7l z+x}J-Aa`@1#B4c!m{HRCEO72c`jU+GqFhoG0vghoEO%G`)w{g+$+vpcm{Citn8f8< zPPIn)7g0#8F&55WCBdWeG8hO( zY%>0PXjCvI>qc*S<-R&g+W%|Q$*AVsRE6D~uH5aav8A_4;Bp*y%_7C^= zC^xOX)0|bIeP(z7X-;fb4rdb~zB=38amai@gFjD#2s<+i#C%Ru0{BP0PF79Lm$QA~ zVMbRHD7Fx>twj_J$Gf6iQAmm zq-DW{qbI5Cg>~Ji25-Z+(ngIBW1c^6jVq1?0&OK0LaVNi`oPZ~i~eIS;&-)E_A^aJ zYn(-@HAF_;X}-DP$o-}UH&J8$@!Es#OZU3Dbwtp5W|oo0Vxa=0u$@#!i~522tW~P? z)n>t57o%s1F}hg402wBKA&*PMU#(|I^AqKBaeKbNnSjfY=T_RV9xpMr<1;P1hfTz{ zm?i4`w1}0EO`7ik1j%)Cb38N>y6o>-)>6AOR-|iKy;Ydq2tAupqE>%J%8Wd^P?@+o z6lL!co$a``;e)WJ(%3~2QBhiTy{6!tC6)P;H;@~$Csl{pzllT3io5b?tg{u2%ZzTE z6qd=f4*S4Am90#X=D8~QC`~S&kCi+W+sPk7w;nf!sumh*x$zK%J2H-F6sX|5Hhh4g= zHr|-zW{Nt$i;2+Jx!$dNE=qf5bGeotC@~K!c*6S)jdY$yS^TLuw4%{Yofc0Zb+h7$ z!gy7VVX}9LdJ`*LSMjkZUBt_9*{e;?x`Q?%+7A@ZLl0w*=qWxxrrfFq43|usxN}2C z`D>?apO6VfF9k)qGDS+FawC&sn4Bj{%=}nA`}|pS3rZ4t@*%PsgPc+xU(Qd@G7i#U zLHqv}BWLLF9~cE-KgzAV73dN7FwN^wNik4%`am`I}2qmFkiw_*T))FgZ!2+&GCb$2{*e8aBD+1zIc_CdLwjz%UpM0+1EzVE zPFrz;X!MyLy~L!{-dZ|ev#F_-_(H7HFbQVo1E;0a zw(ciOE`xq{F}QB}`gp9xV%-?%Lf1N1j+Z~UNJTUT>~51mPxM-7_j~qhCat7B_4V%N z0vAq^2YxMo9-~6x`Yq%cv_pzBuLaLpLl2@Ro@4xNmHKvB1Gi~eb$Q>a*|?M0T?Na@ z!bY+47bXx&&igg_^uYO=n4^6m#D);8F;65CZ1Z%e$~MY%W)+f$@AT#}rtiIubWh;U z#6UvZ3FYXRqp9w+Wj=vEq)~S`|6||f>4b%Du3h+_2H0+6DP|2P`{?u1^@=CbkJL(> zz-_I%*=JR(qE6NO^DRF;=dMf_3bnzv9>2Ef%sl6Gug|)#=UZN-3U_F^+Z}`bQ|1C@ zv?r#ZbwM=R?H0@Ij~8B-pET_?e%q^nx239fULSGD`zQKLJB(oE^t_FxZQWLZg&eLz zgq53#m^b#C_S0@%cJm1~pHr0$ZgtW=H_S{`i^&Z=imRnvTWnC3MQ4_tCAme(nz5p$ z&t`pf!7T8jH?XX`HX`teE&5t&m}4O^Wo-IZ+`VOyWm$G>ru`1T8R*BhBUGg@gn>;LVT`#miY zWXZp*N9k&JJRo6GXYpG2NL9mGb93*F%$`@Y8}q9Tf?qASXEQofX>XzeZI=l7cu1F= zxzWboNQVHZ;8iwZf@nQ{N?QY7ys{`S7OPx^`KvhJV;MKo6To~Cc{Fqn0b3?W+D{lw zQ1mmj6^j!d2{1J=b^AEvRz0HXVq?Qk!LU@)B@cgN9zXk_m(4h-yTg-<(l%4jCi*4b zcc?FWCe9H44aoPKkqUIhdISqjD&=TDZ|VXkJm^J{)dRTC=K`OnmQdv4vvA5=$PT}Y zrN<{_D)tWJTc~b0BA(!>r(G+2g&w9w=_0(=<38vXr%DVExG&RF);`8-_FR6X?ZU~j z=o~TReP!9%)f@UTD2YLAP#baM?$DI^Ov|6DtO#334BmjFp&Bbicj>m7y&$QTDG34gAoSro^!B>)RleOiZV zTO~LyYUu7FyQBum3yfOQO`eAttì+ErGP%`HYU@BbgGS&yl4>N+u6{J||l9U(qmY<5Np`{j*o6aNVKl$e&Zd%PBnRr78kOXV-2uBbaPiQ>==O;F{3VP8r?#pQzNCnJiq=GT&ksdk{ zkcFQ9GSPqkInDe@<9gdR!FfJ80ex4LmUheqq~s3@hs-bMA+b&5J6y1!&~=))$$FFz z_e@+ZTots-&ep*=PVOcg>R92$$QybegXKgLn)UWTH_5Ch)O9kcLkG161Hkr0q1da?#wBB01iS&=uJxU%s9^+v)(($e84 z)vw)nnjhc_un--(02Fi=KsHnb#XZNFJy(M+fA zu-!MV{!u{~au%wZ>bq6o9sbycTP#2;??@EEKM!)$3lh~1nF%R9&Ks`{677?84tp5H zu-2BTMbqIdC?Ky@JQEaVWav z)umQzLq0|uGM^G^D7aP4NTG;_Qpm36=jm&D+qs=D`6|km1g3zX)og!HXTvs8%W~iw z3C>>Xj5(xS9(AEWOFzQ*Km{&@6`iLt4wu>AtMrh4uBOHfQ8$~!xhM5udm>~Frio?g z_qFcM=Ow`PCPyAJy~JkX>IJ%nR4|-)$s%q5h(GPqosHwlL_1)_O-fBTJ2o`$g&XOO zN+ztwZ^VP|GK$gW5g4~Dj#K>Q$JR|Ils1!OJr{k{50d5M{6s1B3vDt;r~Bk5kba~U z#BxaC3lAT7|3y#*_GzApB59UhYZaHA*X9$JvhXQSc9*YI%8$2>$3@60mPO;DdsiV- z-0cNn33y-ZG$nPf`?7e|S^Du9*qxR6W_Y&XKjH4ZVyWlJ>N*-ykHp3PZyhkjvK1&Ttl;eU_hKO9$^lT=X!sqH;Bq zN6kUKevngwt8Mw=(?u16V9Mqrn0d1lShcd0QT8npK$|0fflu~{I2ocRreyV%G=q~W z)qCwoEs8^?X1En$ipwd;*gMc*=le6Ihyp-T#->Hd5%QQnx%jiA! zg-*8Q!UU+nLM5LxdWTV(0{q-ry3GCYDVlooD_wX7cUR4!@#9-DWyZ?a50@$ZW3||2 z#FLBkwe02JkGvuV15cL<>?6$Lzsx&o*_tWK2Ox6Rlw&K1-VuQcM8#j%847ZF&p(YC zCeM8t*?ejtuBDV{HT_ zq4RMbB4+jiOXh_Lj&y(+Vk0cDpOT#d&%PR!M$b`=rn{l{z34i)4{SqaNZDTrl$KO{!ODpqW(A;2+f z0tQO*=-5db$5wJ*3&=|YrTtxUt>|5_feiFGK@e@Ere(g^(Fx&8qWCWW=A|yd$PG=T zJi}CoqVs7!1cUMNDg{%z$I{UH1XZPh##RscIQrTDqk92@%@BC(^^uR3R&uD@7LED3|b6gY{ kZTod=mn4Dczc<{l_CR-CG_h{WF|-w+uA-w{s%Rbke|0H_Pyhe` diff --git a/inherit_graph_14.md5 b/inherit_graph_14.md5 index c4d032d9..8d64f76d 100644 --- a/inherit_graph_14.md5 +++ b/inherit_graph_14.md5 @@ -1 +1 @@ -a94f31d2234932f36ce87864433fbf93 \ No newline at end of file +1c695f0e8910c9bf3254eaf9920c1e34 \ No newline at end of file diff --git a/inherit_graph_14.png b/inherit_graph_14.png index 1d0a3c5fca2b27102a9869210c181d2a51162ceb..bd5de35624ad53c4239d602f0df18db2538bcd1a 100644 GIT binary patch delta 2690 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 delta 2668 zcmV-y3X}Ec72Oq(BYz5{Nkl~TXU@?2_3J&D?1j}pOx3{t{rhR}-n~BJ`B-ejv0=jo)3m=< z12I+u<;s=wE1QqS_RD2Etp;M51}v~+*@jthL(_l-c4&ICT(L|87TB?D!>qWWX&`LC ze*OA2jUGLk8hQ(CAy}PcrfB*ip zbLUR__U)T9{$DqiEn7y57A^94?12LZXwaZR^x?w?r~mWk&)RqK;zg$~t~J5}Y;17Z zvSsPWkt5WsSu<+Uq6J;Mc8!V`FHV;(U5Yb0J9_jeon$z1Lf3Qo@@1+}p#lLUojP@* zeEISbz}=)t6X!nw{2u^Ng+fu`4K&}gXU}NdxN#oCbLY;bS+i!*!Gi~#eyjm~Y15{4 z`r=w6EWk#A9Kb$&_%QY9(}xBQ97u-_9isB(%hQt(0wsUgi;SN>eIh)|AGzf*;|muq z)ISAK^M}>OI(P5hO|XzS=pf9Ak2m>~B@nOoz3%H5FJ92kpFf?h+O=!bh9@qZlbTb6o$9M1E5uWdlg6%2zac{H< zudTXC>eqjGjn&;1w0-5u73Dv7?wk+bg9i_I*REaKk9M_c)i`zP)SMzk3a(nUD$Bo| zI(F;UEl!*`F;AX6nKNX_z{!#&n3^;!-O ziy`5R88fPEe~JmC<(f>eZDEz{Y=Jf>Oi^@XD1d^;+DzE_~m#%(xgc&7Q~Th=+L2h z@5z%Vb#t<2&8llzx^yW&eE3ku%-4Vc16ZuNxeO|cn^!Ep%H;+&Krns!be&5=AjW?_ zfzF>luK+U7#^DpMsbix?jpFw0+v{4ACQZsWZ{B2pAD}b$SE*8kap338o5$h-^uAy^ z%a$!07b;YUCG26yhxL^%U0U@ko?7)Mo=fN1x^=4_JQzPvw{G1S2kFk8J1kb4J9qBP zzy)Z=j2X(?yLWGvFi-nJ`TA$TUbBB@jVcyk4Meck0MO~vryZ6H7cOWYlxe_<1%uwa zd81=SLFj|kgf)x`FAmX-8#h$xunZC&sg;AwAOO2!#fsX-7pyN1DP)sGkO5jZl`2(= z4Y1Jjcyvo-C&JO7B_EXz^+uO62l7s)HtvJ3FZgkaF%~8SyJ0L z0IOE5(l!ppoH=v!o_O)%sR6+NfNi`Xt|OBZz@9&UK3J8cK%jdi;SU4Y^3H}C(qHIz z>eQ($;hgFgUQog={mAPZ3|XK@02_0gb$Cn?;3Q?}424%fO53+@r#yM`kbr?? z(@DVR%!!7$YUf%G58)mGIN==x37woVG%$xD#J3Vsk+^T#xN##rdGdtBd(r02n|&%1 zxF-}@%-sHdA(Nry%a^M@C7e?|h%46lF)kKRV|+0HB)}&DwBFXBK?8q{vylLcg(V4N z%yc9N)@g?#C*pHMa`^SxuU@^jMylEO+1w8c78*V#V{M0#Cn-7 zx_$e$Ccj8z(T~G~Bum0J{YYG_yb>#ucn__P0Kn$pHf-2X6MFGlRJU$jXI}3{C~~@! zM)AT5SX6~T?lD}W0)sIl2a;_GoAiSRq*8ZWYRfEZRq z;!Z7h!SYI6M&fRqDuK92g0lZ*$q9Azbm`I&yb4HSK0RFG*&0s>8rBpl&(?b>nAo;@{o ze)Q;(#@I-<+=NQTsZ*!43yGt62IUv4qluV_u@M)dq9Q=k^w%hN#(*`mMK$)QN;lv#zy5!ys&3j&@bVEeH|>`8SKj#ds*%@Q5YX#4OOb;S2XK4$#}TZ=GpT9dQG}8Sv9U za*J{nstNw+>C>kymYVVFkDwDbkb=qL&5Of>N|2MO2`mA1lhz3(f9wKo9-lyjB-SLd z{&=7hHwBZ$n^&y8`&N&3WY6_r{)>xXa$>raDO2jl-_*!|kbC(fj3F%g*A!M@|7&6G z{QrLq;Klwx2M&h;$!$y^3+$M%3$aKBR51cksPDxDx<8!#(XNVwQy4p!)j+s3V1XSj zP1<>4lm;xYW7Kw7a$&-yfq*f#yz>yQXV`hH2L71_q%7%oZXb({m*=J6@0ZzjS`EZB z4alE5g!f>)DIN;m-ktW^Y9O|2z{g_8_61q_tp=b03v7#nIH>^(>^Qltc2O4C76Wlo a1OEez(tQWv5dZQ30000Px&(@8`@RA>e5T1zN(Q562j#3Phf$t#3X zN)bsINimS}8ek$rWMm=+Cb-u?GLce`3eb*i zZf;_5a8S$k>3(EnBt}L?bZgWdtJBj{%+1Z|1bvlpaBzT?l@-I~={(0FH9I@&X!`W8 z-EPOw(2(I8b)I7=^`9~YI3^n}z!Bh>AYd}&G9a7G(GB(X_TuK|M#m>cPfriR!@~{7 z9L%w?F$4t#p?|)<-obMD`||RF>FH_g@9$$^V8Epuj{z>nYJ7Yg+uPfCetyTeGyDiHQkxcXuNvC&!Y!Cqi62hYVMpRT3A|fJCSXhY1$46GVQ(Z!yM!JZofQyNVL0(=S)7#e8 z1_G4_x!*pEZy_TuFE5>>GcqzzU0sd0w>L~pO|gZPm6c&}aS=5&H7F=3KxSs9(;VuM zw`^=|fPbp>y}dnDR8(MTX$c)29k{>0$I;OdCMPFxetypMQ^86y7Z(={$dr^6w6?bD z^nRDY&2uOqlhNwu>gr0dr>Lk11PoDSWhJt+v$49ms*GzJ{r&w24i09qg+QbLtfiTm z8Rj(v3{h-sEDP!j3kzD&AN9F;PE%8pY0ODYO@DPVFfK06Wria`iXRT5IP&rF;pi&A z$H&L)I4KOdk(88#`T2P@>&I+5SL5xV^+Cnr1c)E$3+_omTpTI*3eJ3B0{ zsdfFd?cM^5n&}8pFx5Wq@9#{*`ue)E5UNvdZ*NgjQesiNu~>O|Id*qWn9RlgsT`b#--t9xZKcZ826>Ru)Q2OIe!$qimFxmZlZ|R-bB}zP>(GRaGG| zF%jgQR7g^0_xemd9;5y-Ll^&61pAB{};@pP!!|>r^X{GngcAf+Qye zHQQ3#X0u6hd0`}LFH@l^H;y^b~^?J26V@$i5y+6 zKg#6b7)(3|hl68)fPu(mLN@qDBkJz%#?{r8hEI&Ht}X-z2kXil%#o21`1$#vy1LrI za`}FGdcx%7B!6~ychT3^=TeV_fXT8N9UaBy<|ZB=A2pAabM3;y0+yGTEsbYvYz&>9 zoyf?@u%z#f5|hXw2Wo0+(9qCe>dW2T9RdOZ;NxTd(^QB)JUlo>-pR=cva_>MSy?In z7EQp>(GkMK!{O`eEA!oLFo_&9Ct6!uQCnM!{QP`GM}J2nC@2WS!^66t?eFg+Ffb5< zgM$bQ3qwdq2y%0Caesf0{{DVYT|$vYwulxN7ZDK=fvl`7$!=3q6SL~xeEM{Upk06l$V#|<>dtv6BE)vii(ObH#dihiVEc971RNNkGQO$D^^aQDgV33}%r-37MQ$ zJ{K1kvOjrwc_3hjN=r+To}P}Sr6pOeZuIu{!r$Lt$}I#UC15qtF^8gtfFX*EjFgi4 z?Ch*s^;>;rkyBS!XP9#m5)zyojEahKxx?;PUd)No8$q4RLXCPCRAD+uPi=(9lp#L~U(tNqJ3a>$`1p4=h@y zB}B##i`Mnkii?Y}y}d0ZXwta3xsmc(RaKS#2Vdke zTYpv^9UY)YP3!CH5-T+|6@`U`Qkwvy-6%0JQLX-^KGixsJv}HZD??073@AFOkffcF z3DNC?lElnUw-HK~+ih`s73%Bj1+i`s#N9`De}8w|rqY18g9+j!2;!!oWLs+6Y&JnG zFZ6V6%p%9iOi>=8?VUBz@gy@dleJm=2y!^IgFHV!Gk4z827d&c=H_NkkHaJOneA2{ z@$Nqx<=_}h00+ka9G5wV4u*e$=xW9lX~3bviYm;%a;cY;lmxoe(<3jce)I&K2mTin nqaff3*#I354hP2o0Rzz|VK+(ae-XCe00000NkvXXu0mjfpm^=f diff --git a/inherit_graph_16.md5 b/inherit_graph_16.md5 index fffed17c..2bfc37b7 100644 --- a/inherit_graph_16.md5 +++ b/inherit_graph_16.md5 @@ -1 +1 @@ -6dfa0651c3cd070f61a646406016af8a \ No newline at end of file +564cd4776df44fada8a3277544d21210 \ No newline at end of file diff --git a/inherit_graph_16.png b/inherit_graph_16.png index 77355919a56fdbe4d429ce2e9fcf6469f9876a9b..4e77a34302ca22c3d11e2f8a5d25cd1324f02dbd 100644 GIT binary patch delta 2072 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 jolN@Q9C$|pUywbARlEJAjdsQIf8fG!FVdpV3RU delta 12303 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 Om!h1iY=yK*;Qs+PZSm9q diff --git a/inherit_graph_18.md5 b/inherit_graph_18.md5 index 509a7c53..da409493 100644 --- a/inherit_graph_18.md5 +++ b/inherit_graph_18.md5 @@ -1 +1 @@ -a92c38bccf0475ef95cebbb56709577d \ No newline at end of file +78e1471dd12f57596e4d7059b2b7fe2b \ No newline at end of file diff --git a/inherit_graph_18.png b/inherit_graph_18.png index db205ef5e66ba6dbe2c48e5f54d1d6312b1e2c1c..dd8d61e47de6c4e1126b23dd2f53610f8dea240f 100644 GIT binary patch delta 3647 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 RVebF{002ovPDHLkV1jETAesOG literal 3670 zcmV-c4yo~pP)Dk?pJ1gz~_F zz=3}_5QHSmgusCU4g?`7U{I(I90)=Z=0M;;0S7vy>&K2AE8A_io&5FJU+Jol4;*M{ z4s`6;QNH@>E174Wc@ocAAtYaa{j~|mz4zXmKn$6{fkx)Q>#x5q7hQCb{PD*h#X{m4 zvClsH_++>T4m3Om7Fb|`s?Qi~lB%o;6@df)a3Batm!womcQ%^l5pMLtObm`JX`t<1|JMOq+)U<#9 z{&Lu1he_A2U8AyeV)pFWa_Xt4%35o!B}W`_M7mn;y6Y~v|Ni^sr=NZ@7ddpMpSKK7 zMaTaZl;y{{=bkIyefM2vH-iQZk|mZ{!s^P<^5Tmx%5AsZChxrSjx4_T;?ko>4>|t$ z<7NK&=eIr{ee_WoJ$iIvtQA&R!JfNk&z@2FjW^yX3oW#e?7#p1^2HZl$fcKF8r6|l zV~sTgM^L9uo#e+Kf0V(42Pf*|nTw)>U=9+8D_SCr+%oYz zWpEOmrZQ#u!NS9WGkyB>ip$5UmZ9ak>#j3lXK^_C=%bB)*IaXr3CgTlvy8fzUw&Ec zzWeUz9r2#te*10NdFP#lh0(*vkt5}aC!VnE)TvYDiYu;=88c>ByY}td%a}1^WW^O% zv^z+g!TE~??ya}pit^9{+;PVpvduQz$mGeBP53ywgGVe(&p!LC;qY_&?YGMtZ@dxF zNWZk*V1o@3cu|9jD(~B&!h*M%K@N}{|-9@aNdhk3PbIdVLneDT7 z|M};io$e-Xuf6t4lvm5>>mGji;RH@PqpP6PRm$m# z<#b{ss`Ze`>1vrM)78+ez4qEsSs9!NIU`Y)AFHpvy3+}s(Zhd5MYQOGIwn|Lm~C z4sMS<_VC&0t~-;v`s%BrJPGLFovE-T${BCJ{q}RZSUDABt5fa3>4KQRQvr3IJ9l=6 z9CApaJTIdQw$ZH%WEyQmU3QYD2xnFswp7%%haP%Jbb@E0B+A&C*ga4I;y~Gh4?ZaE z+O>-pS52#MiVBe&dE}9zFVa*HkE|TCRq?|QKlDX*M=e3k0LtJPVvRqw@}n#*H{EoT zuqz&X@WBa+P*tCK<{8<1^UV|G=?tqh&s+;^vBegJySeX=9ZeSl>DRBHFS0u);iz(x zCQXvZ9(ycN7tf$BuCvZM@uE3O*Tp7*g6prpUY>sX=>##az4n@^Pl>{U47wyQfJwRR zvddP*W?TK}qmN8aO(Vff)UdLE-pd3*AMV||x3xt`86QEzra_NJb<`Eno~c)_Ub59z zTiFn0aLUq>#>?UdYV0@Pe3L+BQlR&jp=IL4iKbpP9du+mB^$@0rDZ|~mMVUu82 z0gUB0anIBfX=<}!VAm!=btaCCY8o9#2SCH_<`ZBDoLWJ zrIuPM$`{c)bLLE=KWdPZU?IXu0U#vU96bA>haQ^KN(95+PjZ|II8yrd?VH=iSF*EX zd}jePKtICgft?Y@2SDBT-+yoR)~1_o>QUzGuB&ze{!g0(LUh$JeKbQiOwdVY)m2w@ zx+PbXDf~aX3ndiOb6udcH*e9rpc;sGq;RV~?fBp5>s2f&oJZh|JxID|? zM2%}q)WQ$CE<+1^BaoG6jsv?ht9_me9(^CR36-e102LFPLl>ZmAt+yR$tBGTS5f(I z0jgS$9zEp!_usFEQd4=Q(pOXSIYZV}$=toTe8-I&CnueBk_k!NRh&1%#TQ>}x;Zuj zTQq=+5(6CLJuYbIt+;{X7vpnIpk5GJZMD^+3l}GbBkn~Qt~-pmJaIV#Z1uy24HM3G zID09BV+{*_%JKtyDgGQjjjB=WRJAAT@CFahIdOj#tukNBdIg)=8* zsJ`%j*Ijp&ci(;2Y*gIRy2F`@i+zYnoCnbO%P+s=p_H#n?K*C5s#{8>ZJpfp<+wff z+|%hwktQiOul{+53PK+`Y0dSk!sg=Y8tPVjET2|qgSkTWfU9DR(@s0h+=!?odg$iV zFg9G(m5tVIx82t1w>MF{GB^=(Mgn!q)5X0SKm4=CaeZ13->l~{w4f%UCeaqYsS)qg z5#iKf5>c0>Zc(W_wYAgp3d60px<#j`v>XLM7e@!UtaS%>x~SQh{wGV_qE2^2r_Pwf zJn(I@?s@7~I~pjXBESH`4Vx;C>RVz0TJff^o8aY%?;!P}m)+x&Pd>5JZq&gnm81+# zz33_Grz|ZPxi|sTzLTYwUb?8;xn4hQ+B8#}*csSenhQ7(#Usi=a%%pJtebbM-o(H3 z(o1sr<(F6O7MC;X4uC6@m)x9yw+)X=HLnX}=i%U5t_HYM@v7Am@@R>VgJ85o;qWx- zE+T2Sw6B|6_ZBN89BAQ&Z4_vvXK9poQuaAotdNv_fGoVcfJP3Oe4J6bEvM~xMKI=x zCpzbxb1ZPrNwz{#@XoPPT07N_M0<3J6M99J0_I&`Rf z{`u#bsA{iSj1*oyo;Q6yg^^6qC&7#9;7ZQM)Q+^kRNr|T$Cq>G{Kf}h#>-oJ`hWFq zH5YU80vd6VVs~W)2zu`ok*`CB46&CQrxD$qkcnC#FL1K#I0Pf&j%GrmS`y&LVI7B^ z2w@R`gN?$4dz|O@dG2_`G=56-Tp`gFfr2auKH3>~IVaoD!G+*K2a&lR$^>9~+*WhP zaF0V%yj$`1Eg`KhuxdafUaR;)SQfnmJL*Zd<4{pu$`Oi&gE)0PM)@*{yuit_`>O@;#pHW(P!;Wu%(8{ zJB^ICJUB%Gn28QrNG8v_)sQ<$Jys~4NEV91SwflBI%~|lz)6qa)Nwcv#LHIe&gREW z-#J&(sAf|QsT-uK5oadxkoa^P@~C{oOK~{asL+r$NzuzfZ9@M}1E=VyGafFx>@ssH zqwX+?YK6SO$#`E)9fxl$?!5EPcvnqM6K93T5Y>u_kNU;;8+@M=2ja#!yaaH&LpvYK zAz&Wz0x&&JYr3~dA;A}pprk=}{)CX=8pY@(WE%suRwxRb^!+t;9D*OyhPLmsDR-g= zPC4Zi`!bWjO&{eP?~5o0cmg0mv?0Pb4n+Z&aopCBZj(Zy0eTkxQsxEm=`kKH)#WR` zzsPG(xCduFgxlZ*00@)7qvfNE&?)<;3Lj6<9js#e+Xb5BFj9kmPa z_agkZP~WgZ;sYAvFOjeD0Msq7SI6t|;b)yb6Z|-E;6PE&SaixCZ8h$1TQ-7`QZ0hLAAXv!L2Ilrzcrr;t8< z`bhWg-R+Mw_?MEF24|jmW+s3A*MlvM-XeM$BEYfeAwzxOKoJL8Wq@O~hpHv;v05MX zD4*K_i+MD+6rSYK*qZCYPSTp+UZA~h9LU>A8rCMM8}~v-ZJq-`NZR}q2n;CVKoF85 z4u$$Q&w(H$ZGH*_1{86i>S1D*kH4t1P#-wZS~-yQ_eK6$Ds~b+z{zuO`i9{iIM7HO z;Qyov@k#v&ggs(~3%HRUJUmO_Kpi+RvSKHxL#LsOz=4M1KoF9KdY$26nu7yDNScGI oq0ffmKoF9KdY$26nu7y>1G5%7kt;xms{jB107*qoM6N<$g2m7|DF6Tf diff --git a/inherit_graph_19.md5 b/inherit_graph_19.md5 index 58aac6cf..da7653a0 100644 --- a/inherit_graph_19.md5 +++ b/inherit_graph_19.md5 @@ -1 +1 @@ -8a9d6ad9dcac0e1f24d9388b79f919a2 \ No newline at end of file +ad12c61bc74928fe7806a9212cc53d96 \ No newline at end of file diff --git a/inherit_graph_19.png b/inherit_graph_19.png index 7431237c0515084e9e5af7c8359715f0e2654a13..17a45a15351012303ddeec05657b517758bf74f5 100644 GIT binary patch delta 1661 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 AnE(I) diff --git a/inherit_graph_20.md5 b/inherit_graph_20.md5 index baccdb90..5e38afe0 100644 --- a/inherit_graph_20.md5 +++ b/inherit_graph_20.md5 @@ -1 +1 @@ -ef590edf2e26fe3da8529463a5c11b67 \ No newline at end of file +780f0b86057a92fa3ed17db998c38ed1 \ No newline at end of file diff --git a/inherit_graph_20.png b/inherit_graph_20.png index dc0db5f66ab96630019cda9b962c848b4a76b13c..486eee5c82843966dfdf049460f46f004dbf5add 100644 GIT binary patch literal 11664 zcmYkCby!r<+QkKlL8Ju)LAtx8Vd(De?vTz=x_gG&(q0&+7VHAbxU&$#LJdK=l>Bfdpd zKyCPF`xadhT}jk1`S@5DXXhC*a;ASgG;%m{h}y(fwaYg;RL0eI-LmRE;<<@~3G`N&+H{EquJlT()wp=JOfqAkc8#?#v1O4eI)PWLEhycw z18Juy3nE=>Y~!i&%J2E{cE7z4M33@>)Uy{&`_Eizn_Zf`bY zf+CxdJ?HRvT#B_Sjm171?+6YAB4G_}^~Y1>tU~UGBMG=C66m!i?jJ8_4R(guM%iN_ z!pPg!W7&SmN2we(LxW6hwrkh|mvEg+)WJV9tSO z-x)+Pe6~Fp!hmK}uU~7cMIwkB!hk%@px->FTBglmiwCN*nxw4qzP7KjU*RqYIPi%Yhx%z z%#Gn_+6Z~{O0n9eY8y`DN|Rx15dFv~J2olLD+h8KOkx0=TdK&n-XHU-G&q@c2E_PW zj7vD_*4gW^JQm5NQSOq=dmlGQY}7fd>MtRi^hAEMdHBohelRmE6qv9r_HdX+>eC57vo@m#H&Z11OA22HVvbJPMmryQ;OxS!@Nqi(DD~8_PKb(*9vyuzzzyI?5Soct< zkY(>E!FRpnyt82Q6Z?TjN#&Zbhb~?MHXr2q(VfJ_r>0?g(qP6S(=#~#jEbJQEEhyh2dmx*(gcS! z-dy>iyrWa6cRZ}@MW9cCE8QckNX^DwjZ!eSx>hZ`+KV2`b3RcT4vODi(Cw zt$+LBv6;h_wy`-LH|!2@$jHM?)OOMK8uR^`1u;z1veLv5uTFBm5j!1i)Q#+<_wtkD( zlMKv8@-X9}3iTM`adJ|b4l8e5YL@z^H{b;@y z#kE3R$fG7~1I}ySPSWxB33q|61vp0-WruCNF4#m|&B9VAb^d6!z$Jvfc z{w*SP-W}n%c{lzljl+g=q0qp&C&5)fW9e-#p?i9l^B3p}q!P}CKF7Q0bXobN>9|pb zXL~Gie1$sCz!ByX5@Fd_URXOEIW~4dnTnlw1%b~>D7U+mmPHVa2tglu4|Ipqwck7I zAw-;4Vl+uzX32Wy`X1}>m9LyiEZEI1lNpM9DW=lL#%*ZAUbTu^uEvBlk?xDr8Kd{=Eu-F!?nI>S=3Z${wysvC=WovbN zxul^V?CXUeqUuSA<$a*eJ3~lsPEa+WuiXO;O3lqngZ~I(SC7X2X!X5Ml_2s}9hv+V zc#5E>Gah)Mx*d3U>A zGpirJE@WB7)N&DL7y)WKKEnys~YfB&Y=F{Hykm|pJI(30Ja!4|} zcp0isl`V`YwFNTCIJuonAEMA1aro+)Tryd7Bb(&~ZcYD21Q@ViMi$DB2hTrSM{x!R ztH3G0g$c%3ht1x!+UN>Hu)73SU-C!yVCL~E`J!m7A-if(9!=)F$BBF?tUV416Mso9 zHZ0FSIU)I*yM1Ia@8UC~GoGKW+cL%9TCr6S&cedM^qX{`;<0vRH6MyJC*aAY@V)2U z=5hW7f0fZ5BxHfTK(TP0EgT@qM(Lo7)=YiedT-B!P{9>Cj5xb;|LY~x(F+m z^nizrF8?Q8#M_L;ybXbfk$$&Wf!>3;D-xAv=y7K_ErKpjrAU4w6J~H}AMZPXCy&Fb zJZ-qp1gRlMA(W>ew~U%lXeNs$C&`i1UPUrbiIbeVoC@fU;XDYYvf4Pi|ums`D0{UHllA6vKmg zfLikAfGwgah*=s$hJA5yo=YdUmbmN0@-}hh->d8sX-3DeQ3-Eexa)4e{_Q<7$MBjb_^j~R1Tmj!-X{A5)?Z- za;dOiv|A`449BfWudE6Ad)T4+zoS2y`ZnfK-FWrc4SNND*el1@|+;loold?>E1&*_Jw9vQ5_%N~jj3e8mhjOjH zzw_%7GCW?Ic4PKQO<^V(Mt#V#NnThqLflHOlR4z5ZKHJKociYW_3=q90W)t(I~*)z zSb}Lyl3lJv$q74{WcThYotb3We)5RDPtHw!>bKkScrZ9yuaUiWQ?`V{jiTBm$PW;p zM%m?_lsK>-IBmJwo>E&Ckmc%ZlFBRTc9MSu%p7>bE&RZyJG5XRjngccoghaCDuv|2 zR!t2b*d9%YcXcmw&d&zf8QKOXmFdjZIxnS#(yW&2`5ur>GX}#pQhbk#!nFReBvmG1 z3dhQJohtaGNxj1h8MB(inXgg2h8D_|=)ex21sIPc)43~diC%=0#=eN;29tb}I1Ilp zPg<0avA>&>N5AaPk7#9@4)>K3`C$u0_D(woDNLrThr(V&^v22u1}%EfP*$6H77_dM zRaem>2T$ER+Gt`8-C~{}Cyq+1{qh{nZYaeUloHU(MAqPuQ^A&~+g-6M@+2fNEE;O8 zGnsgAdwa9D^;&<;Du>OSKCwiCP)%jXedq?25PxoZ zS?1Pwubfn|7?Ailv=6BbA?=y`-oqDrGFKRusTTt$3yD_v96uTz=q<7C!y?4pV0Hpp zJ~ifnfTac$-%TW3^|Se~_Ik=`JmqlJ`MUeU35!}nG&$GDYVDdgVsEg@Y?T2okvdh! z)c>Z<<1Y^{G;=R~C_>3ebZ!&Wnw%$tmnKB~%|_ zGx)uO^!CdGxp$zAE1F}RcKZVjQ{rG74N(k5Fhe*Oq&r-$(ChNyo|29A3i@3I*CQfa zHmg+=N5}l3=!5L)cNLLw=?Kyh?OoCkU^*O+N3(XUs3(3pXkf~H>yD7yVJIaiM$ROH7w27c6B{@D)?h#cD47cTN>wo^0HDR zBW0@`*HbNXCEp{A@xpeeyGPJXB0pbD;)YXdSD60VZ zL#Z2_9%g%rVUvZ9jj~(Dwn*?#Yz#!gxSIQH_DJM^vexDoBUS(v2d7fa#gR``7{$vy zKbgpy?_?6Qnt4%nCK0RRU>HdkO@bdI=&p~K#R^^bHwL7fI%}Xo(O<2LgCNKo2CsNB zj+>q9Df%ynNnN>xi-%Lyl121%=W}v(#E4fxfctDEk*$CexU&r3n>{hn5=s$EAVbQ! zsed?=pNVv!eSH8J1uUB4Obx&X|3O!b7vxFD6r9?hP8-&9k7D2K8D7ztOBXbkIq@0I zB$ORYs=;h?(guqWOQDa|jKpn;Z>tWC=RH@X?x^e}8%)?Thq7C+Qk2C}$b=Fl`o0+K zP&C+ipW;06C{|oO7bPF%SyfbOSPE$ZYYhXQafobr&K4Hvux9cTiAw88%6*g5YSR1+47coX^mQ2ewDHXrTLMfjj$I<55W`@ z^ot9>=3H_0I%&Bcs27={3BJDmh`Ln-K>G9HzO&gH7%@K!axlI3JDHuyq)^#0ZuGpV3UY-odthtB~B|hJGnd1S?uOH}@&QKKwH3L~vg9 zz3z9tLY4_eCA2P-OWWbc0uTX9XD|vIAZA_kd*pYT@E`9k+1!^tha{thPpy7=K1y^L z&lP*&Ago+VjsduoYVI4kIXl?t=EJG*Rvu|w4xG!4u2qA>%jN>NTUbn5_L>0*D9xLH zH+$1IV+8f_M}Z05%UG?kN!HV%nI!PCyn&BqV`V+`@8d;r7*f=#v(M18gE)wmnQZn% z6&iPkyVZ|-H5FQlD_%%^^z17CnpHCg!jC>SpSpsFCk7O zh=eY&ww_w2*{a2{zGjb0`+EblNZXrC40Z*Uxq0Gp9D~UYu?orcmoQMP!~s}t-<$Q2 z9tYPbJhmQohZVlXSo|b0-DZ!<@7gs#EcC=8P>zf*_ov7WI;T@dJKXOxTGE;5v3qhNBrf4ZE4h){}hh zQ%n=?-GIU03Q`EP=$NLO;AF(N&hIkeM;m96i3pYdlmED zcfqR2^Y54YBQBNzz*>G(DN$!=@WeInshqDQlWEfaWg2GLgzg4R)KU0(Z&`-0@NCo~u~;ea zBnnw5QxblAU;H6qr2Vq~Sxe7jJ?KdVfi9ABw$enx>WijUGYCUhvoi$ky2ClE$?a&L zQ1IzybE4c5OOpeOQueeQh2YZ|1fw=CGQ)1JBIg#ccg;5IZk7_je4CCHNLp>}rhx3K zW(~fy7)^A=l8C$|$Cru*Of<=IBAtdbI=#k#%<^wEt_Z9ITKd2w2AwxZdBpE_*wzQI zhdJ#7?||Ef9+WpR{^4@npRyc4e}^E5?l66E;c~)v3@ZzQEQRVgw5YMG&wlbeUsnN0 zTasn0Wkj-m>SY)j`%HuLZn$~)D3;vD_3D>v_D!4e2Jt@RiH#l(tBEe5Y!F({T%}33 zLxeh?@10A-ZFXh!nRq1gN$Y(%I^S$DVk)ZV2B}a<_FqK_h$RTv z7;%U(!En(xCzkaOV}_QclJb{t8A?P$&zQ*apuWPg6_CAT+54-QG>fdqi6rmDE=Fnc z{g4Rn-?n&#<)oI%&8MgEJij@D+6czFtxz$fuz1IC7 zB|`wj-4Ca7&5eHWz+0nThkxxys+j@M3n(8Jp9UXWJqtRs*WYej3cZK!pue(`!e^(r zT=7IlnDM<#BR-c|gLXtj6w0|>ka*0A&e3ooFDNeXxGO~`G)G+6_%ohI@eGinG{8D* z8(TUQ>D$MBdf>nNlUL}nH&F=i)}16Bdlr{);qawH8kNHL4_ObV@Ht^%2#64kk61T? z{3c|{bqN-F7b^hv>4Vmt`okmVKg7~UEg(6V?4Xk6vwhwWJ)hPvNU^`l*?|X>MHgm{ zCroemyX{S&%or@Uw}Pb805*+f<7TF}+`@a$uJ(nm?)hdjYXQ-u&88GuGvXVQuHxVClU|*qh zGC>$7zX%jPay##UJi*rJ=&V)~&34Cm@z@o|>8p@3l zZHzLTAa{O@k-rry&ZBgmv~S8uN)vJQJ%mFOIgfGKm1TX~rb;xJ`kqhPcB)lISn%Nn z1FFYY>fP&KjeXr6&2n%Q3rf8mv5@i+$NLnOWKt?T0N$Mf;1tvbA1GbA;Owe-zo06y z>Jrg<;4YHg3=M6WP93UpcIe~}H9971VF4`tLeHhJ4>>z5&$iPFD(qR!UE}@Cf+$oPfghsA^-nz%q zgYD-jX@O@R)z&G;dj2Rpf+qM-VY&AFa30fef85l~?$lWYxb$RE*(M66;_Nm9{#W&kAXLpJ7gs`yV}Bd zdzqT^D+M0F_c_ZX=pn0HMH$?`O)c`@Ier~7&M1>@8>yG12xl>N;LlwDSqU{-R>a9m$+lq8i91t-Vo%&jZZUzCNHS?*Mg zgvjUAkKJ1K+7WE=K0{>ujfl8Mnn)q^_GTEJ{m8K+VxylbE1?1^1r-X6D$HD;h}hP> z+{Zo?@%5jMJgyNPA5ASQ(sb(6&iStT9kY@=5z~l7lqaVG@`w9chg&r^^9o?8p{ofd z;$O$4;H5~bnW9NZ7CteFP`&Nv*-dvQM->f=NpK5y{3yt8hkbk8bn;ePSDvsYFwdvl zZYN3HNDzy!b0lj3IU-q(Q~+xYKjIy24l54!c^XkZ=vK(>M$j2EG_EILlh7|vi!j)Q z`4W$6K$D*;cD`;EV#B;U4%rI|Y5p58oE;gmt<7&!Zp33`EP?rvncx(vJ`RGgJmj!{ zWXF9lj-+(VFwe0<|7d{a>ZkY{6h+Vvz*Vd5-Fm<=mbv+)9wpogMw~BS!B2M^>&wRl z>MnO?W%0$4Fq#W6LLF`3@~|hY{C{F&W!{HBFS))oI-3yxTgI9&vYOKkhr>hk8GC$1 zDk}_5QwjYO#M39ES_YKLxd)=gv_}UTanJNmS4$J2yKKT4o~<25@5)Or=2W;!g_t{W zBO@Z*Mk1(GF}G7d3>tGL_v#=_UUs-?nm@X%1e%kyhQk?ODQ3R<&b5&0s4y5liaFVO z-@I0jI4y4=w7Eho{f<*nD5j|E&hKI)0S9NhtMO+qv^QbcdQG2TF$}!|&8q8ET?bXu z7)?`9yO#OeehPzO0#&IMUPVi_QV@d1eb7{U%QfV^<-*19_O;)edEpvRztU&D1-9!a zA*7?<(HkJmEcaS^OC5EkKDSJ)HLGP|Kf&h*HruAEJU(*064&4;qTzl=D}qpqj=P)J z)r*>4S4ME{BViPi6`veih_k{3eDB~&@5iv|l8%xB&vSy!9;xMxGg$;UsKT~zyCZw^ z!_`R}UXykg*~%I_f+aNngo50o7#0G)2sJ!wvtM3>#Ow+r3Ga@eY+p~Q;1+Jles5kA z^A0st8?Q}Q;9$2qb>TnGnf)a09W^zN$LLe<+)#k=(}GkvOQN2&!C5m9A{-w>9(E@i zm{g}I_cYc)5Nfh>FJXO%NZOVgN0|pht07Qbtjble|9!N}uPK8@q4 z7b%|{8A!H~F588RXz2cRJ0pb#ZWIGb3M3jx4DUq_J3cJhp5(QvICo0_q=OwN1^S%~ z%19sWXUm6diPnIIX&T{fpTzCWr&S!@2aBo<-~*)0x)2ldR)8s*;b(7vt@%NT~B+Y;4XMgze8QgeR#SGW6tr z2|STglbOniQv+QnFkA<$GjI_seFH>c-&2P&G^9}BYHjE3EY^nDo*$|N3SpC}m4+B8 zG&&g@)HM(a?q}ITX>#Duh7JqHxc?&Qn=a}RULnO-Afp9+v-5r zN?=H%-wZ9KPfSUv3ledX)MlcA6~lp30>G<4@s^nA+W2g z`ZX|j36H;!*qAzZ`3`?^-u#AuYkuX+QPD}`!nfZBh)N&|{X5uRoe{e2U|cCq$SR_P(ZbztRU zsuYT8ZM`zPRX*M5s$&+cF+(2Ua_{-K=IVT)z>E}}^juSEHUDd-)eI@Vsa*Rm;pOfM z>@C98gTs(U_=Tu&ZO~OqJwj!_bzi^f=d@Pk5VQF?E&abySSekTFk6fa_`;>x>%lv3 zAH1Iap?13T8r>E+H{UUdWoN&@LCY?Vwj0v+y2?TY1Nu#aapNL+Jz|>Gc(6W()bfAHWIHXjE`K;07HTTBSZuDRBe=$2zZDDU-lFEMuy9 z@*PmM!Y6*l1&*a=&mvj+n@f$t{=$^%>O??_#{pcR@#F7b2EX#lYxJviq;;)-2IAws z=lGT{Yr%J2FI??lPuPERblTK}^9>ET^^Ng0oJkxj*a-;ef;@Zb>2LOS|j%M-? zV@MDvjdh24Lw@A+5GuCi2WTiF^Alcq%#>=GA1%}v{lvbI(uaGA zOW4l-G;jdOvKgIK)+<@Ddbf!ONHJ0NY4?w~t?j@#@?*ricgkRW9 z`b$1QlEsa{;UAdV$jGuT{wuCJDZ>p%Tm%q~6jrmVFYJzE*}^Q-&H(Ch6Ib(m?H3p? zm&Td$2KyIIH)R`uCOvweP8VzKs#X_ijZk^0cjvVL%z=zg#|;D;oFD%7rWrtPyVE^) zQuN~hvcQ^>lH%qE6=`vPA{>YcM&=F~XmmXoT50h<+Wn1&)$e2}C;tw< zvpzC6jMM#<1{Hbk?&ixGot=wGh3k=ToK~vky7Rodt9}U>A!73NVk!y)sRl@2+|Sc~ z^k~4v5%}$9ddm-uAu~0P0Z|t<+3gS_$Xp5b7Q4$IMG_dwcc-Vkdy92H8@A$Pwj2TT zW^6xOtklWa=mgzcZENEyDFKde<4nM3OfW~|oPD}KtdavNAeTt1_LjT~0CQ4^9TYwQ z*$fOF<0ScES>SoTbEdo&ztRWvCkrBDKNVhC6=j&K|I}xg{phg<;|$pMRG_by%Hz5Z zs%$$S;dP2?qmW4otsPvu05bulm1i==|yaLAhZ7;6S|#K0uLj4;B&ZQ2-)1f zgq+sKe2C|$vV0~E=PE^Lhq(ef)A%6&U*#P;hxJa-tLom5@?^%9ssJl zk>|Q4`T*c8C7-NOzVpcS2a*s1V`3CY>;=Gj$d_N}^;DUTM&H}224LOH`+UQ6TwOh! zuNnq607IKY>ut}H*FjlsB{&WQ*J|ATCg1?pSX?K62$V|HYAT5WHqN?XvlvM@nALTT ziWM*&mC2Thr$m4iD;5;6uGVHw5%6t9C)+J=y|YH@B!YYEw_%RQVjSpsz3kqStmx&{ zXm|r)>BW2jgcf z+a3c3T)ts><325t=O9Df`;XS3Y}bPsecNhz9&ciUzI|ZTpjSNs(KvMFwe{VcU=S!` zhsW!}(zz3bOA^0SL}&qY{51@VDiz>)(xI@VF8CDZJsDDOw7|74qGFhmqbYl_D*$jD zt{N4f6Gb%2Wl%<~J^`T0hw2v&xybQ`Q!37KZRA0`iEjsLlCN9OP`sHyqmtj8aQhN5 zu*{7m@<%pYYxl!g{t(E$mmlAJFcr~EY!`SF%aVEy0F}UM5-oiv`9B_cD(GQ>Ixk)R zQpQosTIu5P?0h5TH!xm}Mk6w?V9+8NDa zx;31*5Blg%1uSW&Cb0Fzgh;Imc?Q7Fd#nooqaG^IOuV99tES+qt zdeh9`2)P{@wdHV766MhzJY&DI*^!v?sNyi`(--oz_5#GRv-#=nfN?OJfjl59DMt(l z31FY!R`!0xItw)Y>zoTO4`mjvuCg4IsP{f;(U=e}ab*hsMke94O?m=6!gWEBU~aof zY{#>$e(+fACnjut9C_x0ZypTtoz(EU7%$zaWO$~4baG7l@hP?uzvWNpS)@&Y2vQj$_vMsIfeI24xi)E+G#alcjy%HK z_rwrwS)J-RfHh0<4TK^DBf}2IxV*m-Yska)DMvp5Flpe{-jo**aom0{hdKfFb|vSx zU-}ea1M|CADh5(#znl-TjJ$zlBt8E|Bns_6*2T;*gC+8*93RLPi+GDqO@`LKQIM=3 zS3L5Fkt$EVOpnIQSv5=XFn{2zb}5&_F13(+|#^wIK* zJTC=`SNk4c!(L&U=y`W!@JnFhxI$|!BHtO|93LDsHAasnaAQcqhtMW66U%CZ2fNKv z)vL|Twxd6tKQ1gKmnVw=E@^inj34A`-a@$u0A^vF zQ8uJ;W1mBqQgLP2!H}D8d&^YMKt>NKseF>2Jxa13gR#ylxG-^b(>Up}sz+&yiz4bL z=p81krJbd(r&epsii=OcTRNwVPk+l1TD4^7fFvZ6-*$q4(fC^u-@Xwhm-pjjXi8*< zYzXn+U_3F{bqdslV%z@w`O)a%{>Gdv%HlG_ z`98sJB%M2s>l&WxwbduKl_2NEbjJu)1zfHfhQaF$pR<01;ZLG2etYOb7Zsr-?Kg@L zL}g|@XKj(mEG{G9SUeEiK4LSULV4OX&4)SB57c$@!1zlVMy@Le9BrNYJ(1TjZlDi+ z?yPaV?YQKY$<2E{&VUmpXQhypuisWzNS5HM1+ube?>JDzh=b7EBi%RcREo9Xm9Z(N zVEwe%l;GkJVPqkR%_P|w%ATEaCNwWjHTFfo*v9@r`q$q(3kJmgisPi_KRIJ6BIH{< zPdtv*ANuO`aEijuTo8dJ+(T6t_*@x`A|@IWj|zj(eBijB-()AHW7v~@H;Z|yA&Pi) zKR)LB-|vfVSHH~JA>@nt{!cr-WGI9k|M>lj{d!6On)+nUO7`Dd{Q;4M;xB^sPgeEu c!ak$*Zw*H{J(c_dBG#{@#Na1YMlA;91s-2Dme?(S~E-5r8kaCf&rAh^4`yPr=nBwS{wrj$aRvx% zvCCSl9b`H1G?3wblHgp@zkh+ZJIIhyCGG+FdwKtk{3kRk_wO75VvquD%+;h7mcNkT zMpf4vv*X_A=fv8EiLD5M!>Pit&&8Pr54RC0Qje1p+kwIx3x+Xl>%Q;ay|bEMG9Tc* zuE#j`9=2odIViN*l=ulfGVS0`7VCyq?D~-Rc2jianp-V{FfsjaZk!ZLzflUWBVym? z29xFO|GTUHFh2~7%x-h$f6pLxgrJ<^^q)5RcVZw}P9T1G=#MXd zp9YN@l6!=N+Af`r3H=khRq7}a@B7Pj2dve4=PK{ZMPHFhg~r}qhV5Oi;n(Kl%C=Fq zc`ZYH4jV$tDXk$ACWFAwnvLaL$K`cM)9!=OLD15T{`{Hyb8!{5Vq+mT()R-My)oh+${E6 zB90S+a4^R0j{9pssgLHkaO1Qpt4Y zBS~LyJtY4$SuGm;R4U!lUam0=`K;U7?s|rDG*^)!ipaa+2Q^w&)oDTOee>Vvz5&W{ z;3FXwsP@e|H3p&}{*+){_Me(H20^9jbtVhkXr{+=6(;kQ+9unBQJJvAIf4P-8M)7z zw?{3jI!xqvFGavQ3W^~m}%mn60C*L{7fPTWvx*CyQ@CRxJ;zJoS?IZYSI zn)C)D2%@@JSp00+_>Q=<*$e%3GY~V7bb4wkaCD+5)9d-PsYs*2A{dV3@gP5Dr`_lE z$>8bzZrK(CWq8f!`82*$I0R)&=M$SnqSiJEs$&fCS0oX5bQ15I$>3HHxc%Zg*Zqp) z7-fo<0Y1AGjefTGU0Q#@hiKj_i8_Z}DTMJe-Q`B>AZTsEBbS5R5d0O0*i-NO)qU-* z=d-r4!W12gR@ZZzquDZQH6%Rdeo8i7pU1+~{VZF6P1&(V6D)g>*T z$KBd=co}!5O9Dx=p{;?4U59eFND}_FddvAg^%k>IBRxUe6m2d~#~#NOO|2C6@3gst z$XQe}O3SoYz|EkPPL|NAYQGBi z4+M$H7}V44n+8UT#}LzNkh$k42|dJqvRD7iZZi5Q25C4JcMzDuySBhkhIQ>%l>cg6 z*?L4fDW`rq-R5fRc(-VpflR>uNei+s1eGJ2m1&5Jgwrl3mUPJb`HszT{|{T4Y88&} zeui!5=cT(^0jQrM z&2TXgiTj6=1hsn%fr%${@L=I+QQTE2&wB~2zALw&ry+_ip#)tXj9wjx;e2}vMIa$5 zi9qN)^B;sX6@;Y+TshT2VUrPdb&*>)hFUjY{%UVzuU=49B z2Cv49sJ4~JnXCsj<9)q1ro(gIvj4+xc5t_q^7zBTQ=#EdG=%gBg!GL+EHeHB7)IiF zOH-C*qDq(l{0X>;0xMiSHnE<8R$53E%Ow6|eq=5C0c?n}G^u*E3sQ)OA1+Jg{%I_x zuqTLgdfH#UtIC}sRg{$(x^%6OpOv+pcQ%_J36HHlODIy4LZ$|r$v)gMN>{a=aWl=D zf7HOl-;Lr}`?RBI)D2BSxJ2`vDjYS@pTx^ouGQuA2!+yCdM%GFu8LCW93RfC;6X7? zGy(_DE8NVFUZWn(db*0saD+Sii%l?tcB=&UJ?iu_I9V@>(g_T|PJc?wsON_?l8cw$ zG3nE_0cnT9tqI`@y+oI8V&nUM))(yCLem`|OTJ_5WyX=V8Y3wUI?ldkr zwu1dQFZKUq^RJVv@|YN+tf2eUq^H&3=ke1Vq<&WBSanKp-|&Z{$n>Z1>O!KOLNPY?n z`9@Gej{a`nP1ZDeJM0ZY3^MwJX26;$NJFe*`RC&z_tvJqu|OC$T7t$etoQ)JiNwC)(&8Vq(Bn$rUvL;M z0lJ%8ZHy9G?4Z~vw)+8jDdNQ8dfKA{Xaff@gjZ(djPTM!_F@1|7k%#rUVzeDO9un0 z&+o*~X{-dqunP2A8R*zdM(co*0hRbhS7 zIcyoIzC!VwcRp7ZqYE#|SPeCN5EQsdtv+wRj^_8|3U(`HNoO`@v>rj;GYUIF^fUTY zF4QLS?6V!kA;MB*rG?r~W7BrZ4u&aW3=G_0-Y^z?MuW9e6Y*Pyluf=$!$y<)lqu|K zycwt)fQp;KxP*yFEW>0d@X@i$_;>Qw$iYfWU9)L7bFquqPjRiyyVHU^cnUg56~l0I z1=^)x<_|`%Y0RO0q~aw`$8+?0_j<_4$&RpfWI*c#GX5BAA37JcH46?lX7FR<7=|!I#;WwI$l(ET|%88{^%=N@iFGX2gNJjCWkVL})R9SVkS-Z0)Hp1(!;R~4m;OO%&(Dj@N%c_MagC13L{XHrHvHFZAA^n??|F!;? zT(GX*``$9!-Z5QVa_w{w{^IbZ?CHlW6PHyF?I3CN5B^S+N~iGQeyIMVqhI&tbyLzL z6ZR0p-rk<2+S;cVyoHZbZC2BlyrnXhDD#j{VJ8Z`OK%j=(V!C*8pvrNeP3#xbdjC> zSEU`pw11?TIxjjUU&RZMy1==Ao>^u)YON({1KNAGK0ewcgu;Q)$0*fF;@t$t#}{w z18@DO@@a2X$sFk>P~t1#I8QnDpUTj^5y@Gpz?KS)qpx9;@HyDV?cV|oiwbAYMhzp5}vPh z%=<9xL?e@Fs*xHCur>(JZ5ZvfmUC9OtO``KRhlWZUt&M`pU)vfT3hgks($U!ES&`p z0tLg_&d5HOm6si>)y{b|n7k{$=_ITr9l#Z!NV_Pgo!7nOS_4o%ulR~cq5hnx^OB^Ki zazv|Y6efCXg3P3`l{|OUeb$kA$R{OE&!;5mww;f{Ude_-f5O5QIINeb2qHLHh=nQ? za?1-&=c`g4gftsxqD1qWVekt-k>(J{;09#8%&OLnSvPs>6;m27wPbk~41^GVo3==U zs;gh?s)45nm#iX)F!Gm#!t%F+FBv95Nisq(^nUL4C&`%1Hw{<8e`?5Bta~3@4QC<<81;8wfrQeatQEou`IwB$7PtP#xynUI+8OTiauRls?&S2 z+Qwl8C6&UUFIgAfa@I=RS|gzr$f|%IiU&cI7>-v{lo@nMqS$#mD*z|PsWUzeGbe>Db&5iaQ%dcmj>1o$x!O|>ttERxymBU{y zx}tcgKmW@QS}k{X2F>!mN32%s2gDwJscJWHt>h+sN1VaHAok~2_hLCSCEMzMG3;ABSVArmrS5qEDh`m zX^D4K5D^;VDjk$yg-*>GZ&!T7=cxQV>w7gEDPkEsr;1Kf3xANK6xYF~!2}p{;H*Ri z%+qLdZ@{PL`~r-*hLLTQiVOfDFp&LuFLT$N=e73$Kg)Ky+=OcJzHHlNEtN!T%+UE@ za1AJbd=nJj%YICZeZa>wwtaft8K_b!jeiZ_-P|ikkgHYn8$%qrhQ* zQAspsL}HFDVl@6gTmDlB@SLY!6MQb%-yD3VQezHfGdb5I2{`7pe7#Ypa|9i{YXb++ zpkR@zc`TF}fx4SbbnF^kZ1k8c)*3U9m5W8;t5@QRd>EfdXR~b2a~n)&H8+Un+WYi) z%YZf2(}&7$m8!j2;IKQg_gCQTF9%T`+x{>s0e8LBzK)*jsxv-a{RW@9*sn`)&WG(A zy*ym*0m>7%w@`RO^7;PUc0PgRR91bV-aNtmtY!bCKHCXQ%<&PDns^h2zCxpcng8V? z0PC;uFVz(j3!aH7{Gsdn+EA)k9Q}ghw0c#?%N|3_d4W0obN2lN@yhx7tc^b{jYW0G zG%hHfBTy=PTQnMDBV{auBZKF>U9r+pOYLgS^L!E9|F-uPa}})pGkL?!6clLa-R|~#JqhK$E zDyPGEm*Jz%mhw@3Srh+EJ^=cVmRZh}{8t3%JoTcPY5{|RaO@(JvGgC#*!1i-5zfbR zX#hVkmK5qlb8Y4e2nsgX4CI?ES7+%Xl=^{8y|^owxx$NCIX~JEJJ*oxUG^Cwe5W*<^FOg&Snr+dw^K8zzDKk(@BE&skuoFhLZ9 z+Zn)Sr}yEI7%*g=0L_4QlR3qd41?6Z5$oI)o~L%avY{i`Nc-eyn<$$X&<~vPbm41R=8anoL_bOLk++PgzTS3 zfIDL?ecxZ3UOT_3U(adUhNWQ*2%$shBk=uoSZ<;m zhyz0uwH51g3{c!$@4Ix%N+!B=xBVOw0HJP`Z_Q93`jUQ6(CdG2eyNec#|_A8WbPWP>0RlARW##NE!IIW^{l& zU`Ne5%dL4mB<_u6P~%f9Z3W@#&>T*xsr&p|#>%En@4q>m{yO#${-qM_>U({&y=(?M z8yZb-0F%d!+2wK`_INs*v<;trimp#f|K>XLaiyOCE}a_b@7Z7!BEVmryC$MLfUa;&)t6Z3LoaBg+wZ(oJL3Y&`7TAG?^Qwk=&D@2DNr5PdIm`fMLq?-PC z9BeetFJO?PI0}jItg&8ZXK_AKLJ&*X3JL*FAbc6UNXf?*!nz4yG93IAinO`L?Xa6^ zXu3L~doeUsY;UNa#1)0vgbvm(XRT+h=cZ%Q*^@gsKTFGrez;<~2Y1|j3yaq#ZgHm) zdZv554JNQ*Owo2pdpxNd*Sal`1#VUcwpq%pM<54YWj_Fwk7gWt9D5we1_?UyFOC_; z^|jaM#rzh>`L>%j9ODu;yp3zx`PApYJt!WQNT)s(@$qoeRFw4VXase(*SAoVJP}Po zfG#C=SM)k*}m)m zAYuD@B0Po|C`TyElV4i)W%|{`D6z>nv4L;>KL(nkG3BQ_B9mpVQE62r)NkM3j-@B( z;@({5)J=zfR|7Q4fK9){jwB1%`QRMZ0Dgs#XRH5NUtchG5#b)IH<*s0^?(dSxF6zm zJF8k~HBwk*XrEhXu&Cucs~k^HAx9#{cn|Wr+c;RL$qzJ637Iz9_NJogUN@2;f zeC$|$jtq|Cgs0o%-?=QZq;9^Q3_spenyS}Bj=Esc*Id`Vg&uB?W)tLgy8bW~MPcf| znvro{l#=7~P+>EK1O87|Tbt_);J-+kZw$wM78E@9&#%CsELaCr6V9w_DOn*n)Q)&= z+18h#GS3cKzv3@`5h}m2@5+fYIC?G=41g7U^L=M4&cYb9LZd^y67$?%+k_N=(y28H z>%qph*qctttWJxXHbdycFJM5D({^2T=GsF)XW4vddE+}i+IbIBu=fqb{6Sr>UR*-x zvY;>c5zBn3-h7*q{=l^N3uklyFxfdrP%;8Jz()9zZ3FJ!Lqx8rLnOW{FOU1#Q|QC+ z);;F#PFj_MdZ~}*=H@~YHrzOT6kbJUPW^>YET_;tF9KH z`klV9*8o@o<39ibPrnPsIU`lf#zUpR<*7FGkdcy7uV%s0R1c|I&AM@E)^^U7b2Z)K zxIFu*OR&T)t%Iau_C~tE}5u_!RdT5sUz#;5PvPBtnyNUaR`ikPu z`9j72I*LHW!=g-TUC#>31oTrpYHX@+s^xz8zPaOS*K`HRPY_n{)2B~QQjWCM@!64E{!huHu3Ovfz!LEeQ zyhZzx^__!?2orP28G}`=UX{Zk)I>Z)bVALI$3RRlFO?{j>fvXseqXR;@t_kbHBvAW zCsqZcabOddQFvO+I+EZt3UxaTvHK2sSVUSNg2;*)zz4e2dVyAe#VTb7og`AdV&7RU zU-=J}>$MQ59gP)eAtSVp$02c!T}e3A;_;;g)9J8_UZ#DR zS1V9JNNOobU4Ib_k3}^Kd1vAAr#a;1Ttk;gUDf{urdYl_f6?y0{1`ooAyk-m!1F5nbuwz2kqmwEN;x9NBGYpU!iKgUqFeZO8@fz0`)rsS)X1V){VyGCkh#xOy)JS~&d2~=!leAh4TxF>2c$Mg@^M?zJvg{R`P{+OGrCz2gO-fO?3KZM` z<`qfq6Fg!T`ex;2#2s2|C;?1L--fH;Q?^Gm`;YTd!8tX!AkHTLPNcPL` zV`dhw^LfV<(P@t04_M-SU1<&xlKvCPe4+(RX*DW@H`P@YHO1H5Jrbw%x__Xn2LK1K z+qtIydXfE60#is*15pAPlq-$a#aZ*sW6#U&X)%}fo#z2wUa7XLt*nm%B=g@CSx$b` z!YxD8Q9uf2uP;@q^8ZJbJ(S4_fl*BsDl57mAR>w$iUWZ&`%ug+md5ZE zF;^^2As?Fw+U4X|z2zH!9nayr)qHI6f^nqa`EYdupyBIRbuR47a)T`@_46(NLO-Jz zfmS}rMW{qZ)!!*#LypKp!}*AHy_8**kvIy_>R^;*xG$SNekryxbT}vE&s>~K0xbF4 zsVU~s_cxBI$~cqk`HLl54Rg|1vdS!zF_hX2U)F{;XSRlCLPCSr8sqKHD$_KO14IyP zj|nYsK;KWRP5%zQEkQ+WVLT<0h^N~}$2ep4(A$4i-@d#xZ}kh3FZ)^+r?GT|DbiPpR2lhC4G%GbjJFKWq&w zvim+>MF~}!RRd&Fp?(pcjn;kXcv76BVVN>`or8Tj@-~kwHWL^(RQuk@>pzhRrcU7? z#Zv+HJ?*3UCiLvzaI{x@Ln7yLuNDSk+dbDm3RW z`J@$Tl4gXk{a-`@rsI1_-`N6Czg^u^?C;uUT^l3!U3Yah{!~9;HM`y*25?EO-I)RV zpC0MjK+|Zx*3S0B6QJ1xE_PPMuSE)M(v@Rxvw9iun>YilmRVT-G(bV4FleHZL*P&T zGQStwH1TQ{)5>Z@q`M{g@AHj2tucB$&K5@6u!YyvN@DXNi9PDOnE$ijE1Z7<=lOl91|6XB$MqX6U$CHDqZM2WNmX3uUwd+hG zO0`VRYetc*rF$KmnqCe;`wqUv7^w?z(Z7@& zixQYk3&usVnpOxn_uXD?{Qfo<-xAN{naUynRM@sDxvs_T26(3I^CVGNtBY^BLh6gj z6OX!@^%KZC@tx#Ya!^SMh;Xj-4LNA=O+APNcIVd}XBl~g1npQes}fHRi3$mCIF?Xf zp;utR3DoDyd3H}Xg~9Se2e4pb5sz3N;6@xnvWw)5pqW|j7m#(5-JrDIkaaRWbA&^J zi>wyuNZ{mlOe|NgQGtQ+(x>7m#|qtReetbQ%e<{eI^Vb0><|_l<|2>S+$mK8gVc0A6XA$j9d7yh#M+mF(&{vctb=jDj$@<@+$x4O{TE-f=G!^VF`z$wP3@>#x!jb( zuGyH_pvypGiHn=q@QhlpfZV`x+8B83U2{{-NeYBRI8uS$RxrCV0vi_kS9xA&sYDum zZs#K-*DCJjZrX8NLq$bt&2RMPuER_J>Frtw2E}v(64&%^*Y0`oZU|V)E7$H6ByM;? z=mOFJ;BdsOJ<~Ys7upCVj}BGa#6Yh)fccjy!SYW<0|p)fLsa?S=!<|6P#|){d{wM} zDU-iIKXqg3*T0orL`(p#kPJ8$kL5p^FP;Gy+B6_(0MlT%H=1VhaIyI>6!H<(RVcGk zyKUs;yWKn@v(;9A*xoq*JFCntpizBC4P(CID0u<+VGOXy7IIv>SU~WlFvk+c8}cmo zf!$_h0WhLNgn(Cq(az!p%d^e!hA6Sn9l;9-0P55}*@8i>x*J$xBGh~PU`8`I#(jpJ zg`1^ehzBF|0K)O@tVlLv)N%Z)>D2VJEO6zW7>|F%4ah|#Uwp6BD^sZ$Mdg1X9jMgp z(m6_rivu|ujx7KGNC}K~Q#%9jPus{;P78!zxu zM(*0wHl0%eFTNxS`7EuH*kn3Re7=(X4&+H>hT|z^0aWwSqaF>kvx(adrOClBfJ(0? zuyd_jKS?)|12_%XYyVG{2>^*)gwI~v8Q&pp#rlFWg^dApX96()B7ni=rtD}vO4jBPK0dfVyqvJMV}*0W?U(D;o%21cKUyfg;p%+Sz9Xwg~VyGT@_s^J8_UuVV1#bXk>EMFPXWd%j%V&`w)m)GT5K zPw=`g1*ud}f-u47Y^BBF^)HW^3OR8{0CG|@0HQb@5|2_rq^dI+!!V#Y0Vrz<=SzSe zNMVJJTr83iNcr6A2qEG!U?CODXERt2Xfx?`e{e^?6#BqH7YLL^SBH6V^MBP)X26A0 zzkSd$Dw4$Z7ZD((q@?_50W8jwS}u#m825t&wuvG5kenygeeE}9Sx9#Row2jP6~HF1 zlGIrg1>Jq)!pP`oxMR*czv610;$(nm2(R!O{Fz_2@7p3EMN~o|$(-Y@)d z#bdKEC+aUBnMvVZclb>YD~pvUZU@nRGbN3_O3?q8(Yg{TX4H~e2j0XorC$S+HK-n> zuHzv0$<0s!Ei6!z^)#}mvU1eSCrKe+P;#3B8#2-a`*xJq7oOqj7LhjkTbbm^D}Blm+>y}r)uSiGI*tXcR`AYU50BMgU2EUA1TFUJ*{j9gzbbTVmZOsIyiES$8qgTnZfEGo5>agBRzY6lk)s4 z^C-i*Tjl56L7;ywX$HOGB?GHF5jOdN3>`T+WR7s1d!ZbA@fgekA)sw-xI`A>W z=do-BGFn9fErMm$cu$ZZDH9aNeay|>9#TAG{Ua9nM0G?tJJAcF?wumKy?vpAW@gd} zV0+YBn#mD_nk=%H6~TZ#yAZuL2os}0e1C1lW`o9eD!(XL?${}0$PwC)5 z&xEAIU?59~K&P7h@$kSFCGA4LsKP*`m;RsX;)H&>KL`KD!mQlV*bEf$<0`S)PMv@~ z=zmiXxzYNUDtNcnSC#Gsi0lg1g5(peah?4RFQfj+TR`K)SRBkK`Af@PH j&Hkp1X&^5_7w@MIt5I`dx)eYl`h%pXoJggR-uM3pEJtx{ diff --git a/inherit_graph_21.md5 b/inherit_graph_21.md5 index a632eab3..366d3a37 100644 --- a/inherit_graph_21.md5 +++ b/inherit_graph_21.md5 @@ -1 +1 @@ -9fcef69ec3dac621831c24e0ffbd1fb5 \ No newline at end of file +052d9abf2542a495d1b6b680591d3ac4 \ No newline at end of file diff --git a/inherit_graph_21.png b/inherit_graph_21.png index 7ab27927ec444c5b95284add52946e4f19fd399d..0ed5f8f507483ab69d186f13b3a14f3ee645c3cc 100644 GIT binary patch delta 1974 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 diff --git a/inherit_graph_22.md5 b/inherit_graph_22.md5 index c20f7c22..86740bfe 100644 --- a/inherit_graph_22.md5 +++ b/inherit_graph_22.md5 @@ -1 +1 @@ -4432d09c85865cbd8036d4bb3bcf1793 \ No newline at end of file +a06694846e55175ba4dc3a2489193ed8 \ No newline at end of file diff --git a/inherit_graph_22.png b/inherit_graph_22.png index abf9cb7830047a24a3daa4c646b66ae314c64cc7..199556a1a4c387dc177501581e2be1e6b205c46b 100644 GIT binary patch delta 1345 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 delta 2131 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 JPDHLkV1lFT5QhK& diff --git a/inherit_graph_24.md5 b/inherit_graph_24.md5 index 8d30401d..99d88ee9 100644 --- a/inherit_graph_24.md5 +++ b/inherit_graph_24.md5 @@ -1 +1 @@ -57ff073c312452737b67ddf1c2920573 \ No newline at end of file +dd061fb6416e37491a61f0d696398647 \ No newline at end of file diff --git a/inherit_graph_24.png b/inherit_graph_24.png index 93580f61b58d7bcf021e63b2ce850ca40b99f379..6951b3e29a865126de3fb0b9dfd3cd565762cc2a 100644 GIT binary patch delta 1464 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 IM6N<$f^*@xssI20 diff --git a/inherit_graph_25.md5 b/inherit_graph_25.md5 index bedabd8f..d7ec8270 100644 --- a/inherit_graph_25.md5 +++ b/inherit_graph_25.md5 @@ -1 +1 @@ -eef6363741eec1182f17bcaefc72a3a4 \ No newline at end of file +11f69995d0cad2317810d40826b473db \ No newline at end of file diff --git a/inherit_graph_25.png b/inherit_graph_25.png index e3f4d8a90f779da4eb75cb609f8267fba070ae91..c100549bec4a4998d1d63aea04e5b91524e14d1a 100644 GIT binary patch delta 1366 zcmV-c1*!Vo3g`-uBYyw^b5ch_0Itp)=>Px)B1uF+RA>e5Sy?D`Uld=)5Q-$q6fedH zl4ML7BU6TCc%aM)FO+ye$yAaOPbi89B^e$>BBV&7gv?1w=9&H9YyUf^bMAGyuIsyf zUuV^E)?R1rwf6m;wSQ-wLyJ%WN&Ywj+J8Kwl#n4H0k5G#kbi)efY%TL8cM4xn|E<> z5n5YYWzEv~2M9z)MnZOWwkU!e)f^oi!O+l<$VnQgj==QvG_0(w$OVwAc+O*RaFA1_ z^A8XR4i5fswp_)3=p`A|j(`Nb+96dgpai^fIH}!B0$%NqDi=`U!&SNI|9h2}mqTuD zE;u_o^V3#WSAU_Wrw0-e62Qd71bTaW`Dz$n)@bK^e zYzsp}L&3nnKonb*fm$lQy}ca{4i5PI2s$qC>goyt1AhZyYikR-ySu^I*q9yYh&RI1 z(-U@gciB8_W82!=0KeHG==b;c(ACui?(Xg|Iy%b79v>fv$;nB6EL6_V&smI%iwn5B zyAvG`4-enUv%bC#-rn9UMpjl9I668)ad9!k#Kgec+nX@0YC3+M6bfx4@oS~f^rcRL zA`=r6%zuyeti;^hoaE)@k@xp^X6x_oCl(eKqBs;JVrFJW8XFs#eQIio<)wg${3+5S67#R4}@23}K^WYBI z-`|Iqmlr-XQs4aiJlNRS@HSNywQxKp$G0<%U+e1X7)eVP<9qe0_Z( zIyzd;S7^X3jvSA4rK~hHHG!d_p~yWkF%jI{+(b6vKsHZ)em>w!q`kd8L_|a|$_x(= z2Y)|5KjAc$b+uJIf|`?)1N!>e?B#^K~6j>l{CN0ESl0OqEMd+{QrBY#4vhWY&#$IIq9J3AwkW>`-AgZl9BFwxP` zA+(v`?O!Rs&hh^K{_HMCMMXhDK>=$ou~Yd>tgWqCd-s{o?CdP-e6Rw4Q)KhFy1I&< zE4bt0aPGuB>Eu~NpIOJcX zz>i$qd&Jz_9AE>1?=3$T*{z}~)o|@37jJ24iC~*aAG8FihAxypw6(PveUz1zk;lhJ zHie@a&W}C^2;D`bp`n3qOVJUjhJW)Bo@;As3D-^v?VL_Q|5l#M%S)1!ltgG}MsTjB zr6r+V4d4EifZB{y3OUkc=`lHu18kgND#&nP8e2uQ$ds1PLJCEzuLfQHik Y2lfzLDt^aOtpET307*qoM6N<$g7VOy761SM delta 1355 zcmV-R1+@C;3f&5jBYy=XNklRab0`l_mz{A6X zAGW-_486U*kbj(<3|3ZF(AU?;Uo$W;09RL6NK8y*XS}evxe1+}oxF{)u`zghdO~Dm zBse=e^ZNe&e%8*)%HnlgLj)Q~O*4E(r_wTT^wFN#tKCC2+ zh=>3)Gc%EIT{^O4d`CwI?CtIG@ey>K;Q9GEgoK2^#(%~J^z`(ArKKf1&=4Pludgp` zZ*Q}42L}hx-rf$lXNREQ+}uEScQ<%@dyC4kiHQlAnwsKc2^%LTC(Os`=_y=aUyF|0 z+uL`=SzTQPKR-X_BRe}A+}zxtq@)Dm?$iOiM6#gpvLe#I)d>v^CB?b#(z!iaMb)VVUFZ?yk;+>5;-NE`KgyaB%QVyN_O!#=#Y`ySodIkB_`- zq`qIjeu0yd6R*>?Aq&T2aGGsAzcw^9sLThKeoajc(_dX(!Ox#RAs`?C;^N{|Y=sJ3 z;>htxSK3NTOADBrn~Tg-Qc}Rn%S)sacBF9%3JL%}B3)cuAUZmlQD#(B6a)qa3Ww?3 zmVYhd5!Bq=Trf2?h0@Z}S0{v7j)#ef3A>?%g$1BX|5aO|5&=Wr*H-rT_W}2uga?*Ip~VER*VOoQ zjt>e7Voy0XHWmsC3t4%ImC9S<=;+AGySHp+W@cFBgBkdlB8~Iq%NNmm1y@{BQWB#Y zTu~nt?bq)+B4I6!6q1>l3Aj6lLMt4$bg}*P^aP`$qtMpY24BB^MHMf&ye%v&;D7%9 z9_HrefK~)hS69c%InLm(xsv+)o|q`=Wl*~o?w|tU$g|NhE9|}3=It#eUz7%le@b+HiV-Z&W^qZ z2wg>_si}!COVJRihO-f#>+9lHjNn*%dwW8w8ovBx z&b0VZM>Q%1yDq?M5&y3>`ThGhp_xwbtc$1v{!^%iX4yX@4h{~0huk7tIVtzV{&jx} z@OpZ}3h)Z>dO|=?VU>*66Yy%Q8tI3Pp62)0hoxJ|>`xTwji_WiZvLmGr9?^Xl)jD# zgolT-KTo8?4e+Bts#N-)kAO N002ovPDHLkV1jZvjo1JH diff --git a/inherit_graph_26.md5 b/inherit_graph_26.md5 index 53883b5b..1c5c6b8c 100644 --- a/inherit_graph_26.md5 +++ b/inherit_graph_26.md5 @@ -1 +1 @@ -e08467138944e1fc15704ad9d90d125d \ No newline at end of file +876429b494d9aa2827ca081f519cdeb9 \ No newline at end of file diff --git a/inherit_graph_26.png b/inherit_graph_26.png index ce949cac558bc20e55205e5652e59b4321947046..216c9cc9cb0e026e316c0c3a660ee571d072b9d0 100644 GIT binary patch delta 1896 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 LNkvXXu0mjfP&2w) diff --git a/inherit_graph_27.md5 b/inherit_graph_27.md5 index 706dd303..1110dd41 100644 --- a/inherit_graph_27.md5 +++ b/inherit_graph_27.md5 @@ -1 +1 @@ -bcd0f59f08ac86a597efcc4e350e7f3c \ No newline at end of file +dc4acb24ba9a1179dee83f6f86946736 \ No newline at end of file diff --git a/inherit_graph_27.png b/inherit_graph_27.png index 1f6bbb693448b9b9f52759f8e2c204e29f6f2bde..75ac4e7df134e1509f480b0dd3a263aaa34b04dd 100644 GIT binary patch delta 2222 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 literal 3951 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 JPDHLkV1gZ~rnvwB diff --git a/inherit_graph_29.md5 b/inherit_graph_29.md5 index d35c033e..aeae5c6b 100644 --- a/inherit_graph_29.md5 +++ b/inherit_graph_29.md5 @@ -1 +1 @@ -9d1d3dd2508a0988eee00e0bb2b34cf9 \ No newline at end of file +2f8ddc1d7b97f5798076115b69497f07 \ No newline at end of file diff --git a/inherit_graph_29.png b/inherit_graph_29.png index 91f3e336ed96750ec8bd2793b4a64d441e9a4c88..041e9bc342d5171c33fc5b7066a3255e883da073 100644 GIT binary patch delta 2301 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 delta 1840 zcmV-02haG)4!#bMBYy`4Nkl+ibG?-n#?4 zcjnBQnX{*UcS7P=8o4c2HBc5GtCG2L{ndbLpcwZA*Fdg;Vt-r%F)m($r+kkeKckEGrUBPLQB!?r2fGFeO;1tdat#zU z)rWSlUyu;ma(|-Vzkkz`B}*La4I4J3Awz~xT3VWe9*M#G_wQ-*=FN2V>Q$;!rw)xA zIg&s%y?RBp zYuBd4#6-Gt=MD`WI+S+q+!<64c;{NQXi-o;F#P!OgMWq%8%8Hjp42CdbM)v@>ej6r zJ$(33_t>*%4;2>|Yv2C$?b|oHdGn?^l${>)ecWc-o4{+_Zre!#`=T`EKY#wbgKxrw z3EZz=KL^d%VBx}roRN{?HTCAr8)!~&ZS3G%2%N;@fJP_XAzI}W8 z@Zkg1t5=WCoH=8$78Dfd8?z{tcI?ZrnJXzjf;tiNZByAyuwky&B%4b9kXc zBs_WY#M%p;BS((Vj2SZ=Gz>0ZzD&)UHKXIlkAD+xNFc|@k00sUwQH1|oJ>oXE~Qqj zTB$5krc9wPU%u!bojZ5dbKACUOKsY;A&l?dy=(0sNJgaftgI~R-n~05UcA^^6L!bb zWZ_28^y$-C(iJaXzMMtb+_Y&^mQ<(PPnC|R$kEh_U+43Ls;q#OFdyxwzV%hCW0((i+)HCkbu_Hfw_Kd%N{i+e(vu971bk4zK95`?w zH*VaRw{6?z73sRUkFQFJAURh(JuWVe>VMX)s}8ek*Dig+yN?|^Mn8Z4)DP;0FOP?( zfB*hnJrDaKf~HQLsu6;XYSyf&-Y+RkJ$v`=-85jp0IflG50`YSz+uy-O*DS|c$LA| z*V?sfsamya8m;r@&C}Xu_)r(c$rMnC!_e*9x2dG0M58f~j95Q;@?^q(Vkom+*niJ* zqd0T&+_`fds0~HCOP4ORY}qmzHENWyojZ4q;^X5fAt8Z=4!rAieA2mlLc_wL;ziC$W;U;#=lO{@f^ym?_Y}r!1DnCD;5MhW4 z7|F9?4Q_Mcso+DCB2ALow7+7-3c|e=6mJ?3oPZ34-iC&{mYSNXk#*?MA(9kprmQDw zBWey%CmQM!YNlx~Uc4|}x_a{Zh>eOi@*0)IVt@L&}c zUXIj;&&-)KE%B>Xt*Vg$!iW(gNRScj+qX~CB@Bgk9CN!qX3Q7@z_1$#20U=!01X;6 z$l4RBMQRrTgh-8}*RNk&bEbpW1F3B~#4R$?YkGRRnWo&_T!r-j6)<@J{{5+b{rW*= zv^I!T$FpXI3lc;gExdS2>VIHKYbA;ti)KIq`cf-c(yZ>`2@-GyWNh8KHA@uf9#SK* zi~$m)cIoc`(CF2x7vH~sU+3@@NJfB!oSYnsH&-@e@p zt*4|K7EiUt=u28*2=1$4UZ5@uFi>RWizg5bC=O16CQ-@~VGec}2#y29CMnu6X9mG! zG<=~v0~yG>5JW08ZTq0GB9Ds~I?|hAk(W=?)u(tj37mG&>;ugA?%mr?3cK&`?=aX9 zHzWA?YQbdmwI&=|rGFR*-~b5g@ZrOLe{eX$hr0%Mcyi0(cX^*aeXLgnzf6@i;TeJz znc_Upa>su)5Gch(48>KJL;c^*aSasX7IzI4;|B5z5++TW6yu`*cf`Xjy}#xaL4dco zdUsppX#khNxIC5{bgx6>fFr!9E+JMl;QsqbtXRUI99}8TA1R|tkB$ah14T#gA)o3R eC}dSdhw%?udfPYHX#s2i0000BYyw^b5ch_0Itp)=>Px+)Ja4^RCodHS!alpJrJHdPi$DQf(6Bf z*hLh(qW)09-m!oRHn3n96%<7gyMoxU{IH>7SFqjLv7z|Gii!nnh+VP7dFJ~P^Ojro zyWQK5+snXilF6h^CNod+rYI(I4ku3fuy)}=|PfsBj{YTdeZ=*j|~B2>yTbCm|1QRJ%aj&8BeD5BF-u99*_ zk*l^ly2WM+G=HOOPW1ctZ<;V+0u?M+kmk>yA859G`Eq*v_%Y3xF@s8#Dkb%A-@c_a zYu3<}D_7{?vRr zD^{$a1%C?`(6wvVJoCVYPnj}B>X8RMc<_LlG-*ORckZNS&6?5R!Gr1Z=g+b*C`Qw% zQ>W;_fdiD5mL@+aX56@Ova!#fKi6V(@ZdqSvAAYoE=bX*{rmCb2mSi>OX|@V=)#2y zaxJsvbRP1c%a`SRsy*sx)qe$a6I`0+B2>eZ_g<^^MfK_i7h?Ay1GYSpSm_wU~~ z(^J4Cr|ds@+nsA1*HD&-Mdo92BCN{>f5((9$7XL zk$*dT_N?&vR4BH7j|?kVvA0k?dh{^-u3fvTp+kpC`TF(i(#MMzFHF6i;XAq1^T`+X z^y$-OF1Cz6KWEMy#a_YBR%6DDQALUrQ9pnFlsYyRb?n$N$zvYHix*cTMvPE=XiVEG zRjR19YuB1`ScW}{VlQQ?jvP6n^5)H}ZhzgnCA>3d&ZzwP^Q%{{UKtr=YS*rr>Bc9UcP+k7fX-XQ)r9q*|R74-!@S0)vK2lp{rM~ipztG&zCQs;Um+hPakU9 zv?*=au))K(3%m&;hm*ldv8xiE=R<Bt)}h(Ut}Nr+5INeReAVys)YPQn!%7=Phm zY3$gs#D|UQ)TtxQzI^#2eA_FbV(;F)G;rX+NL@!=7c-{NBO(66btBFpJODSaRZHxf zHEWiL-M)QWi~$%Tj2bm+B!&}Kr+IDLww29*t1Ml*v}SwKWy_XHtkq0l0J!Badi3ZK z&7C_pP{pT?^oC+1_@s&q!X?(RXn)Zn=`&BBJfWaX z%9wc~zOq|2$~G1MW;mn>aP{-;GGZsl-VD1Qc^HfhM#G+Rb(^nWzY+|?Pk-0g?~H6sTY@s}R3+AO8oY03PB^@Zb^5 ziBGi59XNpZLP3`{MT04{JbNNlwQ5yeG%0Y^r%#_u85#Cmg56rRYUSZaDkKC`z#!qu zfbiiZ&Ye3ap2Id&co0}Uu4#V4>Bg-9-X;>^^dX+xrzetpcGLk6F@MmMFk<%)&j^B7 z88vE@Tv73XF)PG}hw$^$v}w}uv?42ZM5aMg%1pfMF3ci9zB}aYN=$&lAe1x z-YM`-0N{krwYa}S!FTT5k@$%=;AuiQ(brFe9(?A7QLvS3k(g72kB1K*2Kp&htQeIj zQ6j+C46Nxd27Dj<+2U`qWo^ zVZ`_sG{qP@?Ay1m04dxi!icYUgdZ#$aT&_5Teq%&Cp;ACIF7b>tAMib1F!<(-oJl8 z0g%Rv@K(WYI`CV#aACwDVBi3te1#5`L+l5(K>v8d(FD*KHh-Q5vRW>)6kZ6AgdAoC zpH;40S@c)2VntfLdUa;a{u4h1amQ|fmqcu+k8O*@C66$}ID>Ff`HmgcDT&L#Nzw@( zzV6+-NBo8%4_EeKie`!W(>ZQJzFS;IT*F5+lhHD`JpeH~%9;k?W%2Bv9TfNQksXtC zeI`}|&L|SA?|&RInlp+Vu}z7cq%(@d>N`h_=8PgoY*S(Wuc(2?tDL`Fw}KcokP+|{F?Q&hCxHf>Q6#}8 s#(N3QDB`WrBMG|acyqE9?+$#{6w^xc600000Ne4wvM6N<$f(jW4;Q#;t delta 2057 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 delta 1906 zcmV-&2aWjs4uB7kBYy`+Nkl|)1``C;$9>pI`Ow};bm-_6bCc_L@vpn<<&3xE0Td$@o9K24uKoqqoO zY47s!Kdgb0B}>w}b?Yc!zI+x*9O3l*`SY}E*Dec_kNkNJJbU(xHf`EOZ{ECd2;=ZX z&9P_C9^LeRJ)nWi%uMRgp@XX=4o`ID@`;|-fNw-kn-fGpV(YSHr^f21CZ5tgsc8qS`yh*XKvDBEp+b)PK2iXM#dCVAFf|?$xOAd;9inTC--2fiGILNEBA3N);MBc(51}^P-;8uyyNJ zf^1mF{^0#TYGUjGhYgULno7%;FSp18I%??k>(`?xfO*fHIpdh~^XJdf|Lxm1>fgUV zjTtjW4)D;SLkR|+KYzX)SRCfC0KQ_FflCW~)qgOP0=B<@|1SIu8Z=OoCQY*NZrQR$ zv6o5zty{OGj}53eRaRfVe6jGdQHAgL@#8`tKYqMw)25Au2ME`&s$ju_2A#cIVI4Ef zn>SC@s#VJ%#l*y@jT<)_xV`c9>sMKujVE1+iHWLi-MXqkfdcCC<;w>9p+kpM@#4h| z9Dnn2q%m-NW7)E0s%X)oiVvQp>(Qe}s(ktKYV6pt7J48gBO^m(XX!? zM-Q^smcV=V?5SA@FA`3lJ}se;4PnsH=-seU2UYJb$IVHsYbLIs*KWs1m%J>(X`6O>tscJ10p zNP>|NE)gn@9z9BY8fn(7St94PYu5;>i|FaorxqISzh1q1S!iYivV(`cm`02kVeT^8hYug7ckkXAIDZ-l zpX|jFo|`spYU$Gm_KMK{`0-<^Sh1oehx8jZPsAmikdPpE9VFSmf4?ZQT)A?FU~k{P zrBbCz5tQ!+@G5=kv*WRk!#&EOn!0!IE{PJ1QmIlUNu12QNNjMYnIF8$3IwG~m!=gf zR?xI*)9A^QC$6lZBjGVWe8mv<3V(=>j&>cV@6B+$qYj%VLejo{`_g~`10*Rx;?k#2 zAIk=+SFbMK0Am#@RLIf?1gBbi5HiLOA3ivEaC*@P;JZwCYSyetvuDqi=hdrMG-u8n z8Z~MZ#l^)DLKk4rph1MhBBy}F1Q{vc(UOGO$0IQ_XQH|vVKOQzO1x3;Nq_g@H$6RF zqEh9`mCfXk+F|oVtd4sGCktM9;=~E@OtVx7voIb~Zad&!%i`=1-VCT(wJKe`dX@Bv z)%;hkT#-KDCr_RfBfWqBUU!S9&zw0^JQ^iRH~{6)!Gi}SYYlcjL=u!c$;rvCLlFKE zJ%Wumu9N&r466|%BO@h|8Gku)Byncx2qmZ!QIByJD_=_BNdVMO2!j|CA0IEYu3fu| z$4#9&RgxEk*&|1eP*PHocomo$H*PFzAW1+71K<#?UAtDs)~i=fX!wKBdGFpm$D?I1 z7+o5OAn*ePJhW%C=pmN#aX7{ z&!0aRT$dPZ48=8=;+F%8zl%xAj#PfgkRgh_&LR$Hvx@6KN%e~qDWW($DK@Hw2kUb3 zA!P?=fr`JmDUJwAmnvXJDFB(=p0j7qDz_4Y529rqlu{^{a#CVo0?5Y&zO2ppfMU;6 z4I4I8S|6500w94(41Y&Km{TJLST|tTj~_qO_3PIa3}vqw?E@b^d?@uA6zK+-3$+-B zSM}-BCpVTqPQxDfic##5A;}WRh+$1^auOQwb-GTSIzbIV3LYp8$6Tnz?DbeslmAal z|FwtQh!NI1F*kzvV?)<~Z^Y1b=b4ed5j|sy&;{|07`pB}Gi%Z}qGwDIx**wRr}(Pi zgLgC#=smB)6Y&-V??8Rx%n s(WiS?1HKWxYnz}Y^Nkp^s=Uki8%M>@54zQ1a{vGU07*qoM6N<$g6TN4`2YX_ diff --git a/inherit_graph_32.md5 b/inherit_graph_32.md5 index e6597b6a..4684ba88 100644 --- a/inherit_graph_32.md5 +++ b/inherit_graph_32.md5 @@ -1 +1 @@ -54b6d5467876bba7ace9526132001d2c \ No newline at end of file +20b223d7447fd9d1f92c856d06deb34c \ No newline at end of file diff --git a/inherit_graph_32.png b/inherit_graph_32.png index 75c37351e2cf784e32a46c88ddcea04751187d2d..d7a0971ff556990d73420e2446dcd8c82c2a4a84 100644 GIT binary patch delta 2209 zcmV;S2wwMx5{(j&BYyw^b5ch_0Itp)=>Px-$4Nv%RCodHT6M@(OAw#$*o$dIu>3@i{I1DQsov4B{>fX@ISW)?8ui+`EvjbH;lgMpY?Ai-bq z$&)8()~s3n&8BWF5S9fRH*QQ_x^(g35#aeAK72@;>7?K z0iI9y*tl_{E}FZsKv)*2T)A@4@d2JMXfM-fED!|?81O~GsD`CC3mEWuvy7BF@yT|?@t8_7PLRI%J1I2qjBTL(bTC^DSuU}R91Up3tE_!_lY@o}RFH5&kqejudfdi%d z?b|ou4Ov>=t5>fmZQ8W5u$L}fqT01<)1pO-+(Z!0F$)wZ;Mxxz9zT9e6DCXu=(~RX zdRo1DHGk#Kojc%}Zut1|qs$w+heI!3ybwNLzka2JganF@kEeb6_ED}}x#S)W?^urw z+wC-0(YfuK>1ru%2qJ^a!J{|o2{kv61 z0ieO#XQ#1a$5QX!y{T*0uC!yv4hgl$q3i^YggkP@h!NDhd2;~->L7TfEnBt-Z-3Me zA3iKz6g&?cI6&#rr4wCoA2etXJ$?FAUX0hTUkgY(cI=2@6c-mqojP^$0pI4$n+4=m zt5&6(H*bo!2N)3^hYuev`KbRVl5X>M(m@pAAAlZUyK&_7A&BWB}=-@%>8l1az2P^-@ZM;CF8>cGEPAnG#bkqn91-Cjpu?i!MSwp31aE@3zE7V%vLO07#sf$IH9{$N;7B2V0J<}0 z&d{1QYosd{Ys{E2v~}xN%9}SY6)93gvv9rZdAsSL8Nut>b3WaUyB9r5l`3To!3*~6 z*)!_dvnSysp-!DTlIDE*^2N~}U{In&2_IWoOp{QEnCFA+nl)>R$H8JBJ9bPwp|I;SxL-NasNS3PQwx!Gj0oZMOqe%hF@8d&LJ8xG;X#u3Z8q-48Dmzz45a zsZu4vQ3nXSeB^W36=TPZ9eOZwnzvUSg7MXDUiHxZF-N2}IL0}9_N=T2cJ-0aMa%GV zk0|)y&f#(3Nov%nA<3*=2_&fq&w68m#l(UKBb?_U`3*(Lv9Rd4_UzezBj;W@a^#?D z)vC!5ya)&}Lxv0yj|JU8$&)9Syc6C6yHoVX5zU7W9|&(g0MxBpHwou5fPdi80Wxfi z?4JeQzki?LQLsZssKuEk$p2+>nzvUSgmH);uX^a=)22KylbpymM8zZru_d3=pN|K}UUoSEELa6o+0JtAF^6(MLAg8DNUT zqwr>MD^B1QhZ4n`50x=vM#T%Eu3WjISy=a`O`9qPuHuc9)pqKC)G5VheZr4JqT*ag zG0+s}mx{fL$mU(7^mm%KlMd(4pBFy7F|g$N7ZRff#)2no#`(C+ozn_y&Q7}UX@TM+ z9)Iz!b&eK_|A+|a7l5+Ff-iuhhX&546hP@l016+kxOEHpoR0<+A3g_t&bf}&&S`)c zpT9X%oC8|zUJ4ild-dv7lMM(Se}}@=#fKSJ{#D@fS1!_ZcpKi$DL%(iJ9qAkG<(A@ zkroIAzKG_0p5pu;==9*h0~#=30QKwFPmW#wfJh@E2^NUxQA-l!M`cLq(xv4{Br41e z(}-E%f9d%mW*x&QsunQdi>i4Ib0-TJ@Htt>Jd3IYLgswJAnFam=Yej+fBiOry00000NkvXXu0mjf;W#`{ delta 2228 zcmV;l2ut^k5{D9yBYz0aNkl4Mqm?&+?ouKuQ~x@Y4Q z6B#lVh=B#-V<6LrG!_sG81NY&#LNN)d@(b<5p2L`Fc32fB!2`-zIX2)jUGLke*gX* z_{h|a1(IxmUcGuzy?XWh#@jsKxpU`e!-frholM18ARG%EK75$=?b~N#Ve@>t$EHo2 zbkW?61;VmG<;sLeZ`Lty;Bwo5LeMMJP@sToKXiEVNJyag_;}jCe?R5Ql}qm7@Q(G^usxriK-sco z3E(MTzPxUt?c29g@#4kl(xppQo7Vys@5`4j(jA6AcI=pxfBpI;_Z~fZ_<6e4ty|N| zl`E-t@7|6ge*XMP0B#@wB;cJUO&aS_mo8ms`G4}|bocIEKfrF@yqVgyYey+kq>#RN zA>O@vN0~BZvc@K*5KITn2VOL1&YZeR_3PKCB}4$qTZ%W8{LJjU%xI3=Iad*(&o>fZ}mZ8 z(to5$v}n;H@h;7qHz#~`!9-!KPy|qEkA{%cvu97MD?o*Xn=@w)HE7U)K79BfAj2J3 z$BrFk0T9L-Hf%^QUc8X82<7?m<@1{tQiwBW&QRB`U8T>cQKKaM6)jqnaP8T%$C9fH zZu551LGuW_BQ?2m=Z@7JN{^>cpNh>_t$$i2-ty?tqXL|!O`B5T!i6bImMj8f9hsbT zS+HP%ymWXe^XJcR$xdn^V&Fr*_4)H>32RUW-USnF*|Mdj8~!@@mtsCv!xl=+dawuPdM?xMsa^y&A(V~R_0(B6)($=k8g*WO)jvNs$3V)sl z4<4j+>C%a=xDOsYn4Ud*CNIXDH*W-_ojP^GFp7(dqt2Z>`+;xEmMsGEs#UAfty{Om z+XIXUk0VBmkbE@oFOqKacG5u<;U9n=V7qzqCaqt;UOX~h8jzD7TK0++D`?%ibrLO> zEn6lzI)I4_9usK<$VnHh(~ccGBoN)vkw^w5@h4*7Lq5`~RV$OR1SS=F^=dJAwrtr1 ztk^_goCZ6K!P{HTi>^DUs(|S9OD5bfEu9`J8+~Be*oRtvuA1T+O^UZ zi#2xaSlYI28|BTLmx>fAqFK1!^}OA5(2U^qd~-hCj=L8Q4Z#cc{P}aj$9|k7 z)TvWP(wwhfzdG6j3`&$J;b$w0X%Y$%^L&t9vt~{4I9TlC$B&CA^wkMo3gjDRVN`gq za0#9Zr1KyE1tH?lf1yM2w)+BA%hF@8dwulikz5$Rd-rYulkSHX3gCm+t5m5H;ive$dQApRjVdL@FF0@ z3>`XDJQj2VB~PAQ@=kaQ>`u`iM>HQlek8p408sbt-6fpM0RDkT2gtB7(i;std+^`^ z!J{B_A=Khb6BPI|InCRv4#GIZk5@hP@afa1)08PwL}!FggmUN{30<@dPj?pTM+^+O zA-^`K3U3&sfB(soC#4(bKvL)YOX>^~so%J9L+YHAEA|A6cUg*$3FMkJYnD9Y9h_Ra zbg7hiW1u+fDc-rN+qZ8E4+ez^ifN#)?C)jMYDU#^@&-?F=x*;Zb-qxD_Yx zibILw&4pEck33Jv4AWr2tAd0#NvP#jRV&=X^Av`0zRCbIx_Fb`CpYd_Ip+m+bn^Sy_rFQMw6>0W{Um`6K3VadG`8>t>ztHL7!-q6*;6Uo%zrP&2`~{IlL=r3z z(W90m$dAg9(xpqwkw{dS8>SJnz<<*7Ma(*eeo<5{V89nu^BU$(7BJv*vW|HcRSSg7 z`S5Yxkg-4{EPy{lRH;(M#>(dT@XuYG=o>N?h?E8JeVso7*x1G4$i~)c8jJ=0f(2}z z?=Q$SB8&yZ0tS2r2r;vO0bk5aZv-3g84SeC0{;Lo0)+Mr05aVG0000uwf diff --git a/inherit_graph_33.md5 b/inherit_graph_33.md5 index 222a2769..c4a275a0 100644 --- a/inherit_graph_33.md5 +++ b/inherit_graph_33.md5 @@ -1 +1 @@ -6acd344a4b68803c92a718bdc202c2c9 \ No newline at end of file +c1b13f941f198e6a55ec43bb4af37768 \ No newline at end of file diff --git a/inherit_graph_33.png b/inherit_graph_33.png index 09a14ca428deb6082b1a33b4f2ddb0344b358454..6d211fc680d40a7074f1e101d8dd68d119841a93 100644 GIT binary patch delta 1900 zcmV-y2b1{p4*Cv|BYyw^b5ch_0Itp)=>Px+G)Y83RCodHTW4rhOAwwEH3ln0W3N~u zvHL?&ELeY7u!|BUiTWcTief=5pn|^?6+|(yi(ORg4FVCA#0W})vBW~6L}SB}Xhiqz zH_ttsd+z4mliW*Q-n~0;?%AE4-PxI)otfQ}LRXO5gNq*TLaIZ zKc};2&uWG6@&tD;+mzDK|IQLkXWgeSe}AD^?KNQT7KXPMn~;ygVj@ zQ9;1~EI!7D@^RK(w{9K1c=3YU)Q?hPOiYYIY2S7pS^^hH%mXrg`0#-mG-yEe>({4; z4LOBnsFF)MWbf=|fPk z9dIt~(SM_d9p$?G?b|oP18Cj4HDzUGv9d>v8bz&IwIb&c_Vnq~)Vz6f8asBZ#RH2J z=tolY|M>BvHKx6gnwrYq2O9u)D^sRSp?&-I*-0ub7Z(@Pz<~p4=FFK)gL-muGWG7= z+v?+sH;8`x_`#3Wp_+xD8Nt-4Q@s`j3pH)pG=FPqj~+dudiCn@&Q{3rg?}LXd9G zjFZ;p0dnE+_XQp}Ull1h)61PI;^N|jjOk1+8RZ(7Eu7>dWhHQ-*HPX?f2h9^;2f`hykbqDiC(1jqQVXnRL$6-F2#*R0@B#@5 z3Dm!Tf6g1QyJyUpK}bfQJbA)9r=XyqO570JArD+Ok~oAJc!P@6zFV zkqqm=KEAG9;oR`<*|Vo25BMEaBS38X{rfk6sJMOmHXS>5%wvMsF#ymgD1R(0tXA@d zykOO;RUH3i7$78ufcy9F^HB?#HoOG@J6H!W68l`Bd<94{vB36x1zx3Dvu29K>y17D z$fW4(~0*pO$T-A)S)k5 zzUZ15hZDlcks~>og7G1F1An}F^@@`@B!vKkB`hvnw-dT_=|Yz-U83*bzmv=zNahh1 z$;62h`Az~054dsT278rv@7`H72sh}5=kn#tG=2JXYSE$v4H+_osv@g3;NOB9-p)RO z)PrgSm*J$Z9eDTX4hM*(ad7GhM9e>A>0FP5txd&qD4Zzof`~ zLaau_4;Y3??c_b6r+1WyRB@0)Tf?HX2V+P9G zKBlkJK~Qr7x7MgKX@B&AWWF6bbnqA+;X?-qJMG%F(={=!Wy_X?r@G))R^9l4^45*1 z!v#GY=$IH>?bd)Xg4(@4H8MM61T~`O+RelmLG50j8kwCjf@K;}bM0nQ>FEGxU<09} z0sC#JQz|bbz$FWAz6^wx2JneHF)>jqR0J**v@Hf1E*dcZnjS7I?MqIR82Zvqn6w!q m2$O~OC8jX~U)l+iwtoP-yzNT4fBJj?00007v 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 AivR!s diff --git a/inherit_graph_35.md5 b/inherit_graph_35.md5 index c77a06af..c50a028b 100644 --- a/inherit_graph_35.md5 +++ b/inherit_graph_35.md5 @@ -1 +1 @@ -f7e2a84e74cd774df0f4dd319eb64818 \ No newline at end of file +256b72fbab6b57cf4773aaef76053091 \ No newline at end of file diff --git a/inherit_graph_35.png b/inherit_graph_35.png index bcf6f392ba8225949965724b8420d4165d37300e..052e0319925da04adcc3b5f3ae5785df8ce56a19 100644 GIT binary patch delta 1412 zcmV-~1$+8~3ziFzBYyw^b5ch_0Itp)=>Px)P)S5VRA>e5T3aY)Uld>NcMa3H^Xdg5mq>0eQ{#bL^1w8vJV+?wK~h9WE+Ha{av5@YkjN$EK81*c-1mR4UEleC z=X{s*|MOJdo5;&cOWqJWNeZDGVxj zstnQD*(qyER}~DTrKQ37`MJWVf~P7VB!$KdNTg~^nfL^WRB?_pMo6S;Oquuum5EAx z>c5EM;$k>GJ%8mC*4EY#6B7fUKY!+QmzS4NQBeU{vRPSKL1<_wgolTNlamvNk#7tR z4njac0NC5xGxd)jKj8ZMnu9nyJHwYRU)aGZ|0fNtcxqEq6D%z)fuW%xJNEYWAS5IN zzJ2?~Zu8;cf%OLl2G|t|?d|OaA0Hps+}u>40xOS*h<^xJUS8(L>gwuXeSMwT*VEI3 z$;nA(D=RAto}ZsNoVo_CH#Rn=4x*hg{7NM+^oH=OmAp!{?cw1;s;a7ZI7$LBH#a92 z7Z+rFe4Ln?nv#=~6CTFb*OwF)7V>nvySwE5`}Yh#GBU!Ay?y(ZG&VMJeQeM=k?8B| zllJy@o`3%7>4}`3o$++oad2=T!^6Woy(%mZq@t6Wno8)yR~Xfbrz(5AxHWHXZs6$X zh+XgQ?f^YlUV3_ZASES*Q_&k_{gRRru&}TI^hk9Q7#IkjK7E4P+FB0w{rh(oGQ7OJ z01w<9D2O{gK8EP%XuzF?q6*6fUvm=D{8CRvkAK_R+G5A(=qL#b3nMh9GV?SR5*iymm65r*IpNZzsHlh}CnqyKdM4VDi84>cvAn!I;^^qeU>h47#NFMUY;SL~ zenUe8`S9Tbq2Yn`lb#=f{rt_;|Rwx`O)pdiK0&7ywElVDfQu zbAN;8=4J>E4rVb`7B{D-r=g{#1!`()H1ZLQlLiI`Y|guP@8H+3U*O{60y{f9Ktm6U z*^iHp3N|&tDohqpXeImO8c1q(cDB;xF!SS$WAefSWo2ars8>Q}W+qHbOt5xhVj@dG zIDUVB4>L0}U~6m3t0HhrUZ}?bh5?k@+kad5`ST}WSaEfA1y4^;c_^=~36?kUKXkN4 zs=Bob3JT!x@DTd@`#BhT*w?RLS($}OZ*Ol{TwG)a_Av(c_4R?Vv9U^05!2Sz1{oO{ zI0dS!t6^ixiLTPC!=h--jA1{zF8tPzwe;;ykasan6dOHdx!jB(6GD307(~5-Y z5szYIWCXZtP{gnd^wN_s7QZx62}>%WUHXldSXx>V8yg#zOlVP0l9G}LB}xcoeM~CC zL`CnBm3w%_1eBhhPAJLTd`y1yrGJ3XZO@Vyjn8bYxVSim$<56rW@cujwY8NcN_AMy zsG5eVM5R!WzJydY>+*(Z@*;Fg5}KU2jLZXQp@Vhj>gpE-O^nHQc6PEZym|A6Yl~qypnZl7ofZEY z{*J#2E|IE($0?C2k*Wg*bYN2QR2`72GW#baB8B*w7gC!k@`CRl+Kn&RZ7e2l>Y!eTi_u5 SD=D4;0000%c-=u;Fv$&e&6giKM0NXWeZd+oaCf6qPcz5mO-U;n<&s&mfXYyb8- z?(eL<*4mpEp#q|)l>u$FS`&>i21HUd;0PkABB>f+Km#UqWq)lR9v(tjSsA>)zsnAZ z{ZAN(i;IKw^mN{cVEM1CtUzC19}gsUK4)Ngc^Ufq`vrpnPn94B1_mTe@hOLa%*;%< zxw#RH3OrSS5EUvjAd;#wWy&Xrq$=k~WrRqo%9JUeAU9DdpZYJNy1E*!uC6$Rxw$zc zBqTskP!OlPyMMcb`uciUTwDY*Gc$;cjD+auXmE6NFE59O zhX)Sgd{4T0FJ0vlG_W*FjfTmtDul#}E+_0omEv>}S5dzOw$<*cf{v zp~J(&;OpxPdwY8VDzNg1iHU)YjSX(BwY3#?c6OM3Eq^U7`2G7gvz4Ep4<8>N98OUK z-#0xytq7u?F+8P`7W#wm)Jj^VwC&;HK^hwyc{oY}F*Y_Px3{-sW@d&M8XA(z%S#@{ z&(DukR8;VEM@L7*&CQMBCnqPlF>7mU($Ueu^|3+gM53*&O=w-s)69AvO zZ%-yBCVzN(c~~AuPA4NHgV2vJ7*&g>e)f5BX+Aza!uk0*dpB5 z4Swe)OY>Jf6+Lc$f1h1bQ&S`=DvHpU%FNSPNPlR2BnAcsgvL=)TU$$(mX>5+O{%J@ zNLpGN)1zmi9f^GAsW?_#TudAs92jhOcbB-kyOV>11J-YEZzrCfo`i-6)|d8FWmq;r z$xY*)T31&G0RaK*N={CO`}=!nYincQn}z|PBmyQMS65f)>gs~9urL-=C2@0pejd8J zyMLj%xmhJ2!8oa-qr>Ld*x10_+#EPNI|H6!(9pwT_S@T=z@{o#!DJ;0wPb&M2a;M) zQ1I#NF!SRN$K-_<%I4-KP_Kl%ygZnlon`HmloXbLaQx-v1r`<-z{<*sS4H5Mv`~)& z3&qn-F}=OLkei!}Q=qA-3AVSl;q2^;#pKo1RTvx` zWMi^7Rj{&imG%D!sj;!KkeHarNX4Tv6j}+e6CO-xD8GLFVo%A9#!2}3^C#!osDH=9 z3nYw&IygBwfx^NF{#KVD*78)xra|oKsh-%gp$n7$K*#h z1%xhpmb_?uX75T$N@AFzq9S5sWPe0@dU{x*RD|V>Drm?{RDy!^E2JuTFK>t@FG80j zp~;EM$UJ}=I#_pZZEX>{;b7Kih#<6-;wxciVckw|0@0+e-&ILRRf<>Bvm9;18NLtz@+G@ z8X#3}_W$wYhX!8vcbUY0QR8MqRs^KtX*=%0@fc1N#SDaohJs{=D2>#@x>i~tw!hDS z7*oH`p}>Mjs(_O3D@0Pi&!NDANUDI6?<@WRWjy8=3oc$X00000NkvXXu0mjf(}9+B diff --git a/inherit_graph_36.md5 b/inherit_graph_36.md5 index 7a434844..ab3b7736 100644 --- a/inherit_graph_36.md5 +++ b/inherit_graph_36.md5 @@ -1 +1 @@ -55ec7b6aa2dea95417ad9a8ab44b92af \ No newline at end of file +f76f83094d52aa1d5ede4851276abb5d \ No newline at end of file diff --git a/inherit_graph_36.png b/inherit_graph_36.png index 253bd671d2fb5ac7b96fbd02297642e4a8c89209..837d3c433e219b942973de4fb500259bd11f90bb 100644 GIT binary patch delta 1672 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 O0000Px*G)Y83RA>e5Sy@O`T@+rXsSOG_(40wB zibW$ty+qVQMWK;~Lk~gFi(&XsmN*ntG+?Bl6ckN@Xp%UDfns8$hES1WXpxOH&_vl_ zTC26z&)J-N&b>GFs^|av&w}mQd+oK?-uK&UI!7-g0-G#BV1JY)yV{!y0yg*-8iEbJ z4Zej4Sh%&1aqs5lW;k);gpqBJJwzZiH5HaGU+$pA6n36Hdj^*;Uv?0(2c99ocs_sr z+@!>0`Ilp6gURxpO4-a|LBIxoSYYj+QXBmK;WR8#Hu%E=YyXtG zOt}49{*TnbgMSC%?c29%Nnl_gY}&L57A;z&c%MFff}ETj;8HdqAOO~`T?^~iuZJm9 zrYISG=jzp~uypBCm^g8wViy$^L1}3zeEj$kR;^kE>(;G6Z9+)uWN^8T04ba-! zs^$(IIt06R?SdIIX27;>+vEaPtXKgB1qDim^JdlW{fDkXXL6+h?o%`t>Wkdi6@4Jv}|Z9-*fzSFXU;ty>j~fRgdy z!-rwqxN)G>$8>1;{{6ejOHxu&fG$MVFI>0~2!9-iiHQOBM5cZF_DR^H3j%KJc}zxG z4x5`dZy~kA+`oT6CM6{aKR7rTS&v59+1cWetaJD7-B?~; zj(>Ey+O$0N*4)|IiQ(bl_~_9inPab+J$p9(`t{2s%lmHJxKZh1ZzXV%-u8vZXV)zE z&Ye5r(b}9^3lb4Cn=!VeJGz)3VLEDSDQ zya>ydEfY)9;`+^-H{sHyOOT(R@6@OWAb;rS=n%_pX=wr8W9rnYaO%`4r}7l0;Kq#` zFn#)T=<4c{9KrdeudmOkygR11w>K0P7Q)@Tcjfne`0&AHq2NxBac)S#XTZ6=fBzmD z8XCk^c|&&NZ{NO2vgHKX*48F%^ytyBbLUPu6IndO#>UFJ%F0Th*a}TeO+c0g9DlMX zZo`~8b08}#OOoo#moI_WBqt{W_l?A1Dl;<^LPA0yIyxE}8yk%xF2}sLp3a>+2fn_( zz@e193-<2a3!_GP4xQ&3^rv*u=ffr>Bsk1+wXuEsc9jPrBO}GK*z&nC;1pVblCA(Z zdGciV{Q0xe5fl^z6zYJ&h|`Z&xqrF2aR2^&iQ8O>rKhK>wZ;zT7S1;sQK-_oVl+I* zAIG@Fy>Q`zG)nABX0V+R0iWWjfLKvcq0UK_4-^*{i#0K`y1E+p2WgGLJ#yp-?AfzN z>V3B0w6rwfvXzMe;Y;Fo2CABb$DYJq#>B~e{`~opxH;5NH70zDx$@M@QhzRxi>Evx z`t$PgM27$H#jISpQo<%%|C%*xfI}Kzy2qqX0NfvJ!ZntfM!obu0vtbnJWiM}K@uUo zJYiyDB2xS`iprRir#|6Q2*QYn2ua$UI9U&Yf)v-)dirLLW5$d@iqDeJr%juN6snNC z2I-`=``V?8l8BtzAHUO^N21@@5@CSP6zeU~^_#+bYJ&uiksRA2(3u72$(E?M0T|| o5d>`TEi?ohd>ecV5wLLU-)P$=^3Zb`1ONa407*qoM6N<$f?gv>jQ{`u delta 1638 zcmV-s2ATQ#4E79=BYy@xNkl!R#I76*?jZN$63yM-b?DM zp6{zOu&128|p!((pch{7752Y@yQ9QtH^TBTbw*ktR=`Og(z^Ff#Va z`Sa&#^ytylwQES{I}{Za zrRDka=aib7N|~9NipP&1KeT=B+&O&$_*17&(U2iS=zr0pM}C+g)0#463RP58n7)l0 zH&Rws7WL`Vhvv_puNyFS>{!~dV~3G}zT)Cy(+*W>jBF@9VfEpwrk&))@s-og`fWWa zDT(v*^L^xY?b^k$v9T;x%9k%+=9rime*5;VkIc}aLwVJzRX)6D&z^C=e*IMb;>C-m zFEKHZ_kZl!W7?>!U%#FQ4H{&4-MV$-3l}b!HY##ixw?6IG z{D1J_Lze42KY8**`*3Oo3>d(_e*N;3#k^CePBpr4S_NEw`SPXmuy)IGZ{513C)(;W zgF;lG%NlPNYc|Wz&CR9Z!-s20OG~5ApFh*?-MiI5#Ql(fO$efW`}U;+2M*AfF=Nz{ zEWdv3+BG_O@E~p9zCEB(2|)DV!2`AI8-F)$5a#IFvnTD`xig@=xGB1N^(yu5-J9^e z3PBq2<>$|z0p&w6@onbNp+j{0_HBK?4<9}RO%y`uarQMU_y8Q`{rmTH<;oR3s+bVR z`0LlN8f+0D@7}$urES}`v}n;HU6WWm&6+h!$DKWUmc+MGNl6Kbr4d|~_-z_EaDO1J zS+hoi>g(6931b#6Tu7)p32tij>eZBxkU-O>O{44AuRBG8wlTMz_U_$F?b@{?xKcS? zl%1VTZQ6tnUHBU8s|-@dV$;*peR`2?ELgC>#DV1GWVI|6}ax*yVIvn zpNx*qoja4bIubWRm6er-Z&kK!+kZy)@84IyjZ6$*YJ(ACi~TFExGEzGqe0*C4gZlz|Z3hYcI1fg7$yvN7e0&()`0R$_r}ynnqQeH7pyY z^Ga5u@^)FQK`v`7_Y}q$1b<+0D<hG`sWH;vIdkTiz-=ZEQISmw7;ya(`lf&% zVqTvvi3fc1=1rC$+o;7`O2mR0S&aB^zf8xH0g!S!v?-^9@7=p++TzL>xw=JmS@2%G zc)^efL=smR27t`1vGkt+zp;z{Q{;nz-zq*oY~T2YD)7K}abrF3Jzwx$M8L(VJ9t!20YA%cooT&UfPe?S ki+13F?}6_k0xnMd4_(_S^4xIDF#rGn07*qoM6N<$f}zz*FaQ7m diff --git a/inherit_graph_38.md5 b/inherit_graph_38.md5 index b26c4c93..b8150433 100644 --- a/inherit_graph_38.md5 +++ b/inherit_graph_38.md5 @@ -1 +1 @@ -daebd42513f4d8a3f7b812e8f0d04140 \ No newline at end of file +95ea602f20956fa5ed9512caf3205a08 \ No newline at end of file diff --git a/inherit_graph_38.png b/inherit_graph_38.png index fa76d453efd43c3863641d68206396b7b4489396..565de2e79950f7053c77151567c76d0fe30400de 100644 GIT binary patch delta 2197 zcmV;G2x|A05ug!}BYyw^b5ch_0Itp)=>Px-T1iAfRCodHTW4rhOAwyKDE5NAH|&Dg z#e#w$c2VpK{!moJ-W!4<3W~iqY+&yVQLL!g6C3u1z4u=B%{RV1?&jW`+?X5R%gqj) zoZZzni~W z$B!SUsZ*!MX1jhEX<+8enUp6_9&1NFq2b=Wd$fN2dP~T4!b1bEU%!^KefRF2&xU*u zK})P#w@x?RJxnwZ6B9!fD^~Qo8y`gQE9IDBuK{NWVSmKIZO|D)aC!=RDQ5^_f5gFU zFkrG6+~dEb#($3=PtTt}_a4cdIWx6v+0sf(-oAZHQ>IKIl&6_8Wuk@+8&c!OjVWKg zeDd7cvuA0=iWS}*5fKqoq(~8J(V~UiF>vS39hyFUI^p*+X3Xfx;&aJ>0RyO8w{Das zO&Xdzcdj>PHgf0AO(RB(pphd-(#MY<%^|NneE4wMwSQ|Doj-rxQ~D_4%L zU%xIgSFc{BMT-{60qaACVIa%BdGn^oJbLtqX3Uu3bBHhm@NeC^C2~K0{2=rC^5qN7 znKOrW?|we(C0mTNa=Fgumd`2_Xt5+{eX7%dT@*B5r-?sSvI)@J*R*Z_?P@g`1 zRM)Ouy*?U0fBsaAaEg)1;+q|=_todmpG}suv0ruyAAWp{=;&zK!?kPIVv9zH1QGmM zcz?~BHN|ruKYlECcqNd+q)nSPQRmK`O_tT>)rx1cp;`QdbXKlhDQK`}%^LDI4_=_P zZQGXkpr}WW9s#EYssX7GUO+%9HeOGD>C&ZCw{Bg!c<~}NXwZNV3NvKLAYo|Uym_>I z`Em(!cmU{wd8${hPFb>Kp?>}P$v!bQd4KX`YSX3-wQk*-a^=b;VRX!xF&GjWH*Opi zEn1XHl`2K~^XC`j(qoCaha^Y90+1tU2uCbOJ^*E5!37Hzq{@{mQ|;QdB{V=`_3G85 zYSpS)Yya@!1C1IrN_g+zzb8f#s!^i`HEGhsk_)zjyaVBB;>3w^II*8&Z=+VNT7OZ= zk|hbRT}=YK>$M;xZQs6K=1G?>orrz?`qeu;Fc4nAW0a#kd-hP%rcLS1n>Qkhy&xx9 zym&D^cDPMxBC`}SEffjUSqHNh~Eu;LmrWQb;4_ntj_5)OIe#*KcHK)n{Mzd(Tk zlEb`s@xq!Tp&cL-&;UjNLbBYULkG#3^jvU|E?v4%WMm|9h!Qr#x#$JXf`42J`x`oR zDDB_BUq6;CSenZ%dztYQwHt4dGmUe1-udlb@Jp%OYGdabJ7QbfPesq)mye~Ar0j+@b4cS zKH!#C-1u?2p=i#Soe`Yeswb?xk(pwt0)>3PL;*Nu?&vq$P$T zj>13?AIFXzE8Y#6tXZ>C^XAP3A@1M5FOT6qc<^9R5Rxc(?6hgqL;5?qxmeOimFtplH$YmwuO=y`$3tAc{#)>4kt3s9;!G2Ra_A$HUP!RqqI49 zl5wsKq+G@R@H|&5ij7vrI2*leCMzWEzmg+_WPhb@k|foDGlV2nZ}OSk8A9?o zt0Y~iGlV2nZ}OSk8A9?ot0Y}%z^XyNI7!l9ca#5B4d9=%2O=Ltz?VXNG;$Pv8bHa4 zv(?{Z%pFGHg@nm)?G&j2_ut}EpKm*PYQotbxvqfhJ!DuN3$ovDo XzT2L;UJmWQ00000NkvXXu0mjfe7hW) delta 2186 zcmV;52zB?M5tR{;BYy~7Nkl%Xcum!QjKtT{&6k9<-Q4zZf zK@kPT?!p2KyAZ`h#lEw!3%k2x|MMH!&)pYy@ARF2@7)f3e!H`?^LA$^_dBB$135_P z5{QdV=@M}J|0w~d2u>430!|T}A~;2GI`B&ZF~6EWTeoiAqJNPiN7DE2-+hN%KLR9> zAwve5J9jRnOP9{tjbCUub?OwYS+m9>a-GPKz^hlUXxXx5bno6hzYY0$1WmDS-8$WL z?+B4VTwEMgs8Au`Zu~q#Kq`lfcnLT~i1;H8ZG%n`LX%U(Q#nP5_#+N&gF%zU(5C;S z8b5wKJ$v@dn}3oyb7pGMqJ@>1ym|A6rc9Ya$BrGNOqnuKg9Z(#QKLqbH*a2F~HYu8Trdjk>F2#ZHR zNdm#e#Kg#R=gu9fSFav*@7`TR_4Vsl>2Ke@UEWZFO`A4R*|KHn+O=y!bLGkvTC`}9 z9I!rQCxv1mJJpyeV|J12Lb^pFh)_Idf>&u3Z7gLAzte z4pE?Q-+#Ul)_M5wVQ(!jUc8_|g9cHOsZfB*ho|DSB&>!S%= zHsWifiAu0ttXMI{mTJ*0Sg=5)PoG|K?WztOIH1_7)RQMqEShrV%Bj(#M+rUUkeTC2U>(@2Pdhg%A zU$GLa`Sa%sp1qms)vK39vwHPv`3=5sv+#jBhYlT5>=nJCK7IPAu3fu&eKdaj_@UUt zDOPF=Z+70keXBlw`edS{js3Dw_~8>m#Ky+T9Ps3M7LO1}!)w&2A(s2-(Ia`o zDu3ZAOxU<_BX#Q3$wXOgUaeR*E1HE*OlRfFmEsL>NfwCD-Me?GO`A5v2Sq)4^a#ot zUJafK;ROIs#mei^FI~En>eQ)27cN|&`t|D*LLqMP;0@-@n@7u+FPAWf3GhDPQ>|Jx z%914u_3PKqyUCqAc`~(b-I`jpYDKwn<$sbeI%dom?{~(H8%ITo6rqwOOH#gk`NVU1 zgMZKnOOAlwM~NHVRjO2pYSpSGp#cJ`TemJ%tyeZ`L)!V7Th6MFsnweZAV5Y84aUQGAz-(|Q-AZTXInneQ#4wT#mw8)Y08GyYlO`STGh7B7=M~)n^*8V%4 zuz3V_-&DSQd3m7G*gQ54z@m>IKYuQkP^eHLNeW>N$Pvz;KX0uYUI0(()Ts%yCr_TF zy?ggsG{HJZFf~9ik+9+!GGvHGTkoDddlC+L!-fq3lR&)|tUrJL{F1{wfBxL!k=PDA z6TAVG0Dxq%RjL4$ zAmDd%=FCa3OaKlC%ArA5EV>`;%?UAGzI@pl#y5b11q*sO)3bRLfCfRSb|B50sZQ7Lf?Ab$Gw{GKF|^5UL*2Z*AEKZJ@;i zMZ-M>+%P;1pm_1(5`XI8szGCZvBg~m_#g)Xz^dUD0myd{4v}*JP?{on#2rOKaQgIV z*+1q$Dd8m{v#ep zV#SJz58K-oN@DB>Wg_@;h*KO+WSlKjaRREiB2cUVijzlabM7SLTp38Yiv3|eS1XE@ zR>n9SDK;GMchEp-%U(cnBB^TDtf^ShROQN*MLr7`F0^Rl>%><+`dt|Ojv~bOG|1!j>$u1tkbb27`SMPjIpi0eGP#{XYRN-;C|PYeBNA0oT+fAk2lD zpP2KIKa?s}%0z{w{a12?u&mTENm28{omf6=zoX-00000 MNkvXXt^-0~f+@2VE&u=k diff --git a/inherit_graph_39.md5 b/inherit_graph_39.md5 index 6e6e3f9c..b52b04ad 100644 --- a/inherit_graph_39.md5 +++ b/inherit_graph_39.md5 @@ -1 +1 @@ -25ae5399eb47f5f6dd9f3853ce45bf75 \ No newline at end of file +90e1ae10b96a2d460ec3f9e356a37d58 \ No newline at end of file diff --git a/inherit_graph_39.png b/inherit_graph_39.png index f79c33e2d16e7f33c09537fd5031b95bce8363bc..40884097d1b18ea64a7ba3ee73125e6f96c6a248 100644 GIT binary patch delta 1727 zcmV;w20;124bBaaBYyw^b5ch_0Itp)=>Px*h)G02RCodHTWLsCUlc!zMwuoVwwsiR zf!c-@idm4fiWQ&cSK#>yMu(E<^r82aAQF96F zc7G?{`@ebfW*o<<|IF|%+}>TzJ@4Fe?)jZ_-PUwftz8h;`|Ni|nfBt+639X>Gy}g~TUAtyMWOm$B z1A~KuY^%3#-&zT1<*^FI)vH&PrulSJ4fOQ%P*6~ip>$RrYe;1ddYlGK!+M;_923|y ztYdoeI4aYy9)D*t#{{;SJUO=f57nVVhv?(SkLr?fpff(7*D%NII$@Sr-U zZ^XsL(dNyY$sP}^dGO!?UAlCMjvqg+XTkl#!a`cQbSW)avcz!SXz5LxNs}gNhdr+C5|4$#@87>qetv#jU%h%oD^{$a+<)9$R>;qvKS`C>mFzrUa5_Vx9p8#ivy zv}x1$sSsO2MsZ*zl;^Jb9 zF?5FFQGZ!kDg6EYt=8EZkOxV0c6M4!-@0{6NHkH$?%cVKVg2*t+6(ym>*lqF6- zU4Ld+#8@Z;wWg+q_UzfiF&4^ow2XuYF6+`m`27++I5dFYjvYH_@7}$v(3>}J65{{& z@89{U$o2B&OJ4Wn$rGxms33%k%*;%lK6B;_g@=a|zQ_T($B!Sc#$|+;s;Vjq3=E{( zw{J5&-j$b^$F$AO&1@{ha>$pGl0s=|X@49t+S=Nvyu6&wojb?tAp6OaCu!TZZFKbL zQAIT8pL!p57K%rW8YQGBaFv@EGLaFjt*v_Y!X6ac<1rKz%S26FxNt!{efm^@PeDO} z0L01|E@TX4Ic!1km@#8i*=2kcIXO8(dMdAZ{ra_#UM>K8GJz9o*RB=o*RSU}X@3ab zj}}&C@+MMKQ^no8clq4|0|N}Z5>15kQUMqStfR_rykga=Rm@AGgxJ1)JGUME=bu3F zv17;hRN`a;s-zMbl7@5ST)_ibZE0yK;gcwmpt*DB()H`t?TP`Ef!wI@u8S8hsveD` zZQZ(c?6q6BZY3H2EO-HOk#s4gq<^G@cwU7t9|}J7>-uu9q)g zCLbRkWhu+5c1GB6$#rLhGPrcPOqe(hZrZeo;ZP=V1cR(zy?WU1k)FeueRg&>)z#Ip zfncb|j~^TIlF1ck`}h$B(297Qm6gS@ed5H46cQ3b5&=|WzJLFo!-65R5q}Q;chpA6 z=wB>{qLnzVJQ4e}MZ!NxC}h+K4Gkp;oupi;;7L$8t~ZVp(8=tU7B61RMukyeG=-m@ z2fT0DvSrlN)WlvZvulD3phx0{J3Znm_5ogy?aGxadNwZUdz4}EGZmm#TLF{WvS!U1 zlGiNGU>7Y~#98a%!-q-6QGc2@ZywE)E)buMgDDBu{!C|92k=ll)+z zCNO$=WVWmyvfIbKQpQM?=F_K7LT1)#U*Ev}xuK!KkOoOpOG}H8NPnYWHtfE=XXy002ovPDHLkV1mXAc2)oY delta 1714 zcmV;j22J_S4Z#hNBYy^nNkl)Y$KzrjHE>rOe3+PumzNMS`fub zp}s_cNFlUAABrf_qM|@VZKI8X@RNm5gb7)hl?qX6mPPxnwo#qtH*xR(zWeTbzNfGL zzQ-Ln-LuS@J7?yc-^{tsf)o?k6lfM`4-T{y+3WdZ0o$)3 zYH4YqEnBwG&!0cdLw36dTA)|2UQ|#}KqE$saL~>Pifd|W=**cj4or5VXIkLLj~{gE z)G4Z~t8-G&>BMRrXV0G1s`j&oTA;nXo%;9hZ>gQriM8aiJN?cAwqyOyWu7T)JJvHh z`5l+-Sif_bXMYO2OrAWO{)cPFjve&o%^Q8nfB^$&>C&Y%apFXJ|NcE~+qO*~Ggp$5 zk|--Hi`>b;ocj8DI(qad?cKZAEJE6Q_UxhQ)2GvvDN`)Rtva7ReM*>Tq;ccMQF?kh zMMOjxyZx^2lM@SrBjpYW36b*n@ncF!NukxNSBpV#Cx6yTNl6LaxpPNv|N8Yycsi5O z)YL==4<2-B;CuJ(IczQ~#_H;78Z%~$KJ@zaYdUb?0Db-XRrC%H4yKD2FH&S=q&#&- zf2`ow9V78I2fy|hyE?6p9XnR--@o61uc)XL zUh!qzX@8!p4&F%W`Sa%v! zeZ~eOld-8@zI>^^fB){#r!~L}{algRX0G_!+S)|_3l}b!S=xMZVy!mxv}x1m^XJd> z;>8QAVUPN}kuhV&3_5Y*gvi~#eLIaFJ(^--Vt?fHRaI3{Lqh}2o;{mBefmUw`}UQm zDWT(a|AKO|M6f z9?8514<69z)29jHV%f4~GF(_#NKsKy^yJAC0(1`=G)Rxj2rp%2Wz?@TM3-WxY=h_evOq2I!V3n?uvO+v=qyMK4-dk`)KXjwX}QpZcVkW zKh0;jt56&o8mjmtNa4jRPGr=rTer;Ol{+YQC!;ec=0r`EmX@l<#zqA>{QXn`VmXE@ zj-jH5D=6;Mr;n~X$5*v#)hfj&Rpzv|wkkg53b4lsoSHv>zFNF^v5c`JWIaY$<$vT& zEn2il-M)QW-u>;{H-TM76UC=g0fqtVDEv)c&6zVtWHCypoSYn~d-~5mf#Ur9eA$)Q znSd%bqCk>2Th13UkkuYLc8u^z6iHA*LIRbSm%CL1C{qT_Nms615eLCh_wV1g zl*P%FWc%mNos+PDc)Mc73W@DQhYqFi@Ni-T(4G0})hh`LmcqK(`QKLSrhlM+F&&21 z;<)xi>@yO>KQR;vY77}Ngcv$WyHepKA(r8K;|YO}vs;=xd9pYaPJz=jd1e_neKTjy zr0dtO%c>PE*!CL-8u;~fO|9b?%i7wC%`Zu zH#$065=iKTES+-zK@TKjSOa+S^771LeA6}u>aHYDW*Pr?8wnGCu+S42vp$?Ho4ee$ zaj)bUsq?&j`&Mygt+&k;+@G&qyJpFQr0M3(n~IUfJk9I2yW}b0Vt*{QJ0KAWiYvk$ z(i<8$a3G;*gjng0kTjuK5$@3VjQY39ub}vE8zYe9+l~z+ZyMHOJJw)~K&sk~4J2V2nVjy3C64tA$NH+XA@PyCSC(i&Pw+<812r7Qi1iEMLCd@*8syZpA%+3ATn_ zTEPBqlwKOlZ`hrn*eh=|w-t430o$=|&Evm=wqyO*cWyQR4N`IR>gYcLr2qf`07*qo IM6N<$f^w`_@Bjb+ diff --git a/inherit_graph_4.md5 b/inherit_graph_4.md5 index 5ae8e04b..dc5cf354 100644 --- a/inherit_graph_4.md5 +++ b/inherit_graph_4.md5 @@ -1 +1 @@ -4193fad5772fedc8d910b8c1ddf17cbb \ No newline at end of file +5f24c4892acdd5ed6cf619217d69f89a \ No newline at end of file diff --git a/inherit_graph_4.png b/inherit_graph_4.png index 2b696ad2708fada6ab4ab5de31e3d8869f2d92aa..5a530ce700de5e8bd3a6310120af15ae2f6566d7 100644 GIT binary patch delta 3164 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 W7yKHla_#^C002ovP6b4+LSTZZAUHVy diff --git a/inherit_graph_40.md5 b/inherit_graph_40.md5 index 3d62232c..29effac8 100644 --- a/inherit_graph_40.md5 +++ b/inherit_graph_40.md5 @@ -1 +1 @@ -330c80adbe895db33b729dd4a21d5c07 \ No newline at end of file +a2e205aba737df71362dab0f52e96f66 \ No newline at end of file diff --git a/inherit_graph_40.png b/inherit_graph_40.png index 7c291402e46d25c3ad4a16567c60470b747e6061..4d47b7b10d2da9766d196a60bed855a2f868c4c8 100644 GIT binary patch delta 2828 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 V>AbS=dnEt>002ovPDHLkV1nSOWJmx2 diff --git a/inherit_graph_41.md5 b/inherit_graph_41.md5 index 6a1c02f0..f541790e 100644 --- a/inherit_graph_41.md5 +++ b/inherit_graph_41.md5 @@ -1 +1 @@ -b029d8ee61ea5fde878355c78ea5d173 \ No newline at end of file +834e9d2b8735fbbf887c02bda2072df6 \ No newline at end of file diff --git a/inherit_graph_41.png b/inherit_graph_41.png index 481db667325458e0e19030fdb41668ee82d4a12e..e6d5a40c199cb1ef5e8583a2f2cf5acf4c6d567c 100644 GIT binary patch delta 1521 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 delta 3792 zcmV;>4lnVM9*-W7BYzIoNkl5!~G^5JC*M0EHE9g?k}E z3JX#sBqRh$a4TGcyA|&4R=7+5?|b$4(la-++begw+|8@no1UK6_FA6yb#n?*KtX{n zOo8rQcFV+ zpwq2^QKLqM%iYqGr;mZpKmT0*{`+sa=9+8LpNjW_0{>|W9CFAZ^2sNkv>8L2P2e%M z+;U5wES?1gIt2wzI_ad$aTGd1CRvKiu0(-i6Lh87F2;$#>sh zLHV9zjyWv<-h1zrciwqN_Sj>O1YYb*x%R1J`0(NK_19mQs+)1f8D-N=HUZ{PWMtrI%i6eOr6&wM+SViC12EMb19^YnBrBJ+&3N_10Sj+Ir~Ty}M8^^E2g?Q(AU4(#`EBV56bJWzb?%C$}6vI^E~gVB^?$D9veQmG*+y7xwbf+g$dT5yufF<9&OP^B`G4)V--LlP5qI8sr_3|YJoW?$)9hPs zy;ajtDz#6gEJh}e_W6DA!3VPb`s>>w^o`zf%PoloBshCSPLmEy$ z{dD{G)KgE{r$7GqL$=?3d)aTl{baV;W;0s%?AcRJJn=*uCx-~|=bwMtTu?W2!bZOF z#v6^6eoe3mX!rg1-?uUi{gd__sDHp5B!B7ra_>4or>98*<%APXa0@TIu;o4X+;djv zr=NbBz|jeJn{2X4BCnR0O6^l;uU@^}Ip>^{sDAY5(N0f(r`*f(hYlU;cG+c@1Ww+| zT5GN4bn!c#oCFH_I+2!l!womMDW;er@jZOe&FJ(nuqcZzE^X@-Eqeq37l$P=$o%EER&T45`U_zu4*C>II#3Bw%8&U{k7L#Gj^Chf$C`= zZiN^F7pex}0&sxik3ZhHT3B|%gbCKqFt1YDbATOo*g-D5@IvX@+UrJ5QCV{*=L`E$vuTWNFD@+)&t)BdH*IjoR zn_FXzHB2Vd6DUzDtc(G}+K{8ijvZ^P5+sNKTMq$TJlEjC`nTF@D@oT`P5bBs=p6uk zK~_hkQH~WhTQQAni%5qKkcRo@n}1LE#e#BxlD>rAQVk#a3{r=K>3mw(fSQ!NAr zxb)IX%W}&tCx;$-sL6i&?6XgZVre$WUVH6jI>Y6cUvA0}#JcFBi!v8%Z2QQpw9gNv z{HLFOvJKXz0~IpZuqd9fCw95&kk5DBbyrhTIW?;R771Yh=tPX=h$D`W1s7aUw%&Sc zK_2%2r}5)fam^O*1s7akN`I=ysrE@5EO<_G4i^+(HU{qidJQn^th3rP{Rb`va3Erg zc=E|7<+j^yvkiUOWtW-qjDE%8*Y2R5PC&Iffu1r>iIAuR`A`)!rzeI({>#$|!a}E< za*D~f$d5W`x5_H3I2Ex%l+1KY`xMO53DOnD%Er$;^NjV8V8b-%VSnJ%J#TV-j81Uu zvBz2!x8Hud)d~G$;fpW6a4HIw&`GO8X#tQbidcS@PEacF|3vJ#K}RQ0&hP&E>o2FG zk9*{iN8Fe(V@i6Ep5Uevpx2;xsCbxe&fe9EW;z6Tx?!Ad;soByFTd<`<2rOKprv&J ztPjX|KmPb*X~U|5Cx5Ddhz?LNk5&V)c20a9x3Ncpo{+)wpwaE;wG-xJ(!`9X3pdQR zv?|{wYsYd4FWzCYg!^GK{ph2Q+SHqsvDjjZ38rBWSiRuJh(jNK_@U2km#0P=n+}H< z#1GC80^`S2K7Rc8FuRmSbf&N1!NJmIX}AC!GOZ_+DrjJ$Zc1?o6CErMMaL^>usGN) z3nfc#F4uo-*Sqbun_w@#=bn44PFOgsU&CNaY}VJ&==OcR<(|_`H=Q6_VFE^ZW88=z zOgP4X0}ni~lW_B$JQ`AbmT|9)HaI8d+&V?E)dRF+svzpM<-A8f`SI1V3i z)S=X)2k^u32q!u2xZ~`U&1$2OdH6Cov`}PcnPrwXRbzB`_~D1mV8THO4nGz!mL+eH zfD5WPEW?Hk6Ql_I9ncV|!26ogm0y4T^`;A@^J{uX-U^{woxqnxMns<133O`J@!1W3 z>WQ0KXGgW4Zd?^ShfQ8j`hRHqe!7lw?~^7?a=J0fp*S@fm~76oRY4Cj>m&MN9-tSX zKdLfZk(R6jd@9vIo}Zv@6RF>M$cWg3(>7uMy-`nfK4n(b$o3J%knQsTZUhGcuo8tQ ze_okd^VK;ds@#?>u8t?+S1(jE?rPg2{K1DnfkQ4w z&q)WGRSNp@^&$UaLBaol?tsl6*}WR4T1N-U(f3Mi#^QK7wCb~N#ki3JYeXO%n;f^$hHzyiY5gPrIy0f9Jc_>Kb%2%SnXL0|8^ z_nsq2PB&7bZj^X6FFK97b$N<@SfCk!axrbj;DqC7b~;ZnZhsk0paiNp5D!~2aYoe! z!ub;jcR%LW5O^;a&_{cOPo$kWVbB+T4fRx;ojj}?B_5vu4z0WIzB~MsnQlg)TuhrW zIDS9`>p@SPWZnnjzcu^WGMfO;A@ccYr=4c8MTjCePc%HYP0*YVgu?-K-+lL)*iuU% zoF_iPS_FJy9e)9E?C42v7h60|`iX7a2Yq4p$9abAk9Ex3zt#0`@%{vyrGY3d8-+AYqEtVfoJewc8x(6R92VHQO;fx~Kua-c$m^Nc@eBZEMp$jSZ5bhMv zw>+nzFVj)awzJbwEoZdT(SdNj3xpfs@kDtAxX?j3gMYvE=JCR3OwboWWO)H(oQ7}` zbeKxej6k`VHe+!7*r1ojN!g|+Kn{Zg(FEKc^Imt4+u_f&oYpLzpizNvwde$oKmNGG zDW#FG=A_}W4;OCqMqI8=5EJyJc5J(Nlcq868VX@`YaD*o=R{sJ0_9@bjKN6^B=w^4 zW=?ON8Gju#{3G?X@vkkf6Eq_bE%PR81mVR^7GawTw8_j6k@MV94z# zZpf?z?B$6uzD!Ke7amO%WA6N7PSmr_0_})8a5391(0_9?Y^I~v3y%7Jn zF940Xi_YbLuNPn%FLx8p*U@gzG}CF8I7B}XOEgT`;>=aSbb3-cJ)xZjVU@aB>0Uss z;t&ncjuP7GO*U(4JB}5j6wy z#G#f8n?NMNoQ4HRFLc)xh1zZ>M^G_VB@G-DVw#A7$I6uj-2B1=3x|O_q=6`0qGgFn z%>zupSbiwqh*+V#cEbFaHe+y@SGa8+eSg9>+bjK_37cqSARJ*2-t3tsEb=TN$Mr&N z&==v>{J)(%=*U1h`cTen%4HV+e}iIz^I~wA*H(p=iydktp~A~8jjXpl>cY>^k#N;j zS9N4_E!|ejD8?;KrJ{44ngYcp=+x6&3@(NO#U_ZMQi0Q{DNt;JPCdQF;9@9{t8Ex_ zyR3kM0-cEhdH;r{4JW{JTh4senTS%1rE5`ue^JRV4Q-rdX@ugvpg?D*KpRfb*#}&V zub@Dh0>vgsQ>1wBaug^wL6@8IV!&w%6q_JTk>b6}QQ&`JQ(6RqK@)}m0000Px<{YgYYRCodHTXl$5T@xQ$FI!0rOOySoeHeDj-+d%5}SU7ua`-S-SUd(W9Or+z0U z?%i05i8N^hGy+kIK}$1oXj*27gd>lNteiu=F0#2t)${ zah+`*J9dmFPoC^#>%2xlBjAHT&6+i-bLY;sQkTZMfB!zMUAxvMq%#@;jes`-`}gms zGiT1Y3SAn@kXW;3jgiz(jethL2Z8F{1b_6wiWFR0SR)V&0pH+7u~qEPoF-ev17;DijyQsBJI?zTbGh1O)6!lPoE|P zWX6vlFM0HrJ9lpC(xr>7?#h)bDNdX?)Vz6flYisJ4S$+7YZje7dzR9qNkiqzm7^9d zT2R`wX-%0Rb41^dA3rwh0H0jBa#6Kv)#Pawgh=@HlRbNO>eZ_k0nZvWYEZ?B6>Y67 zS+a!U#fwL+Teqh3=g-rkMT@9q%a&B8Oc|TpfB^%jW58?9U{2U0pjE3@ z(Ykf(=*^oqRJCeVX{SVq5>jUTdHM3C>`Scqr%#_`FJN9-vt|{M9Xoc=_U+pZad~FQ zkb%&SUogTZ93T_6#`^j5C;j;GLw@`A?UPWwk$=Y%v~=lG!X!U_{OI}_-vG~;F@tX2 zycuA~c9B=FUeUB^)9Ay84}^`19}e-rfdgf8fe*TJ;z@7`_lwr$%c8v(B&un}<(FrTtz%gRPG1cS_R`SRrwnl;7=d{(SjK}Cxer2_{J z7=KNLe4-zW*@@-n&!43p4goFzCvDxjm9U{exF~>G+qP}#>({R~QDAiM-aX-c`}U3M z*RM~52M?w~g$hyEu3ag9{P@(QNfR13Zk(;2Uj_$q)22=4+T6KwM=k&y{D%)8n$?2f zH+uAFshcHB7CGEFT;I+I(6#EzA*ffYV)DB<&_R;9^VY~sX;)y|zeg~ykVVojm=0N7-}XRWTDJ$q*3 zdu7-nP`qJnMQ`7}RjjoXZ+ep-1b@HOsZ%S~v}PS7ur{n+Ow zyiq-6V0J*OK>JyVHy=Th;YJLX5+q1KdGqECx0y)ShvtEHf*F17+BMJmD1V2Rf|+C` z@c3|2tXQ$E?7(S0)YPn5Gup6WgWw;eBG!>FA-aD3x=p-i&z@q|f(dN}O~sc5#g1*? z+OQV-_3LM=>&(D%2(@3F@}cr^Lls748B7uQLsr6uYTC4^mG#SMn0kiU2R{ZrMUEUf zh&8Bho3Ptq62c_HI9LnWWPdMTzAPpLHb01OGJ5prk)+|rVfQ4!1e}k6DCX`9Dq>7CK4@M zwv4)W?@pUHZ?=izB1o7pp~=Je;dq0v81QS@Tr~R#GRMV>7n`4q!M}l{4JW*G>C$FD z5hb2Hc|th!R)RnDD}MxED__2Rf|Jx$hwIm!Vj9LRjXFw zAMM?{SNud+4`arRk;?&iV!Xyh7iyTeG!Q@mVJ)9Oe@QCf{C_Y|5Ff$I$2xiPq~cpv z&7C{fXgcIGA|H#jsABWZ)dolL6q|6uhmVyiRVq_v{`~op2Ub=eizAJSFC0_ONC4jv zBSxsJSFai@-=~+41z`?mDfqd3IZ54!@PjXEtfkQzUrI7Q;K!DPI(6z4?0$u{aT3PL zroY12y?iXR&wuWN>4!P%`{n;rJ{E4Q{{8!lsey=4L((t_Z3c56<}^&g zsG#3w3L;406;98TDH9n!4EztL3>FXXUm{B>QltJIWj5l(@>{gy?WxK z!9hlN7NK_dSV(&XJc7*8Yb>liTt1VRTo4}2IlK>qzk={F%vA&^aA6?y>_xbUIBF|q zt~LA)Q-2!%3VfTPLx<8o|NJ9iY5a=>0vJIL1%eJnXq_X1v|zyk!ohN0PNDF_1q7TB zNP_u_Jpoe{?-y~HFiyM|!58vuyo*3bF@L^&gER3=6 z4JqZtix*ey_$q!utgNP>*Z9FR=ICV#q7Q`aS(}(<5qN$Sktv9J{32RjEg+6BsiqTFc;f(L?$gz@tGuKzRmFTc|hGZ%cA%V@7ppFV-cibh}xT5;hEPc>}V&cLFqL#8HV?;S z!#uGU?(mCUXd6UAgKDbizzA9jCLIDDFn=YjUvF6ZgOo586y-damM}-6lQ2&&6VvDuCKL`z5JK45 zh`a@n4<&<5iOuOn__WK9@M#pn;ZaG5BElrcFBIYM7cN{llt{Fe{q+ZnzvhTm0Du0b z#_^dH{I`D-{oBU-yRfytp8j3E>V7l=F&qJXuwwWE>*@U&1oXlBGq~$sV>kl(V8!qS z*31ps5OUX~5zq*PMgU)GAl&XGm&U^9JyG?=xwA8!*9gQk1n}Pz{K0^0TCNww zE(y)h2xtT%jetvIMY;uDK_j3Ma5f>J50(oO&Cm#hkAOZ{;bW*<&2cVW!`ecqp4cK5scy*=-Hr@wO^d~avoys6L5%!}CzQ%s~uBcKro zDFSgq+L~@mBcKrw1oXzz3qd0g4G8Fs6%C;3CN%POXsczl6wvqsib^7#aTC--2O-N@n0vZ8#1P&ZHKwGwK2`CKE zScb&fwQG%}erg0X0v-s|s8PeUBtT=iN@=D>KqC+-1oXy=6kJ+ZBj67Ky|Mh^q@^?h zkwQRktVqG7g?}{y{t)mCUihm{GLI8B){g~p5-LoZ*xbd?z~Vg#i~ zk%Id5>qi|scBDdu3c1R8F`qqqM&rkiw-qNzl0@36SFau=O`257&YU?z2*^yFI8pNG zFHfF4)U|6@TisQwR#Duzaj8X%7AF7Z&6_lP_G~(L?tdJmO`Dd=moHB(TehTh>C%}p ze&&e2pFDYD)&V}bbLXb&)vL?XEC`bD>L*8z9MrpaZvvh*Yu2Pnl`7dP9kN|eatd(8_1m=o3rX!YvVw0`}1di(Y* zRjXD_+9_GGq?8$dUcGuH>k{w$^XJd97BH`D*|Leq&Ye4H$BrF_xI8mv%t&a*D;QxD z_K}IQ#`^W^m)v>b-fRE<{RAM9HhvhxvSrH%lYjj5=~KYZ_y&09%$aoS)-4}Hwu`)e z{hFpvpH3e?ek3eZ{IH1!4H_hi3w+Skt5<2xoH=G?^w+(6cRF$6gvmo<_wL=aXU`s! zw|)C|SqKjvJdlNmjez--D_2eynjz?Cjw@EIptEPsn&SjUD_5?hV#SKl!Gi~lrh-1v z4}Zq&#PZ9RFH#Si00)4Rwr$%+SWqAw6u_)qyLR;L+c%piFuH&LzVN<(|4t1WG@zkF zhf?9fg{fP&ZWKR$d}`XXDNUF#!B)>JgAKWP^Ja6-ckkYn0{|QU(W6IZH9z=`9XnR) zX3d&aHa9j`g$fmH@AcB9OY**eC&u2maergFeEBjJELf1vpFc1C0Y6+R8S4d4V1~OW ztecP!zHYY?pX&J9-OBQv?$f7_s#2v&fPAi8xzzmm^8@%+22W0H+O)~a@|9-LWW2m7 zZSoAP@OeQApBJ@aO=ilVKh}<_XwjmI7m&&4(^z%x+*$G;K73FaGGtIAM~*bhk$>RL zs`&I%yfIC_pE;sGUXW%TB))$ADsAy1xADC)=x5rrXIL6)~s0pgxIP=Qh4uhAjfc3)WWj z?%g}ZT1)YwH~D_>OOqyzVoht-L4N}8hPA87t6aIV;ti$v&@y>QfX~`Uc&NkL$ySa` z&z?O6mmfcV1eAF(*xFE-qm!bnu|l%DqoI)k1qz7i!xQ#wee~$j#EXM?p}NYz?0{Br zo?^WC2$~EhVpJ(Xf&`Q=U%sd|6Y2WUJkU-sqpx4T?phz^&{8mytOOo!PJapu3$wC) zr+HIT^XAQIU^22sx3VP-A2h0m3j9i7hm8Wi z6%-6VU<|*QwT+mxh96n0RxPSnv7*$+8o-8f^V73r$wK%U1niCX0DpJp;>C+JdGciO zFEPKUQjBdZ_&sobt&}QNDr+`M=?)z_h|P>fV0#0&Ns}fKHb5|96N#2DUrs%G^a%Jg z1qVUGgbB^+7(X0u5MBoS8a5ZrKK#sa$&w}FhoTMmH*mD!gqJB(1}tCn^yyQ=rneIO zq2D3+TKV(m7Yy3AZGUSvfkOnF%Q}CvFa!zsJRs{LjtD8O>TUbXSAwD&16dQaj21*ScJXkTnieHw@&&|i; zmm_8DtSgRIDULQNtB=J_yYQ_(m;sjI!@&;&`SB6le5_NaPJbyrW!1cS^Ngm0J|pt6 zSc@t)?*iK3D4t>yPWbS#Qm0OB$}Cv0K=Q!K>SJ-FQSpIe${7jZJ8IM@b?w?UgXQ^j z^RXbz!7K$omk%eY8xel+MU8i9bjF90j1Ty+C878`SJ?du@5V_OE1UibV|Vkh&_25l zrXS|4@0I_je19yQSOW$O5K{vYp@;}3f)R1Dnpn^x&`8e6A=<;om!Y6irAkrNs#V25 z2t|7cho3xoGN36$y-?;x9IPSuqzFk{sdVYm0byyBBlm?q4EHDO08t5V0}*5JK;8a5*w5_i3n8zkYr3(cmB>Jd02}d@Q8h z0v>+m=r$JC9sxd+o17mW%sJc#!e2r780IPh6gV&tdUhimL>#phGuIk^hbawz1-{Mj z;ln9;@_*zKmhRG}iv%_NZVCh)jL;~6>9>fD()At znJ`Y=i($-=!J&Zn$C^g2G;nXn)`8pfO&;3!yI#ynUJ0j)i!M`;`xiCseDdikLx5S} zEJL0hQs)qDd9QFggb78KCx1q`9ekJ=2n%B@d_qcji4r9gJHCo9 zh?Uh8bQ?c-#vI*DLG*#JJ!=!wECSDqA~FS0k1wL-Y5^g2gvHaRPp=HK7v)Y<5Ihh} zB#f8uyZ+DMzkH`BW-jNlHa@Mqg-?3xI z6n{)zK8O_`atdwXdgsugLq;=V>cLFqO{O^VDY6_K5i{Qqax(={#+q2h;ATo1b)8Qy zQ!osIJPDIPx*?@2^KRA>e5TUl(3Q4~I1EVaZ|`%?SX z1Q8(;K}19lJRq@zh)@p_nx=Lhc;Ueou?4ZWw$zp&VoN+A6qOLPRaIgSvB!3t?{IJa znfYf7Q|(OipJe*q<=lJEJ>R|OeE%=vScE)@W)Eb?N3(UFZGXQ!;DHnaC&2^B11SbP z5CbMA`rCNv(j{8Ca;1N>S1$t(BqStIc6N5aN&(@nq@;un95@i5=r#Ob4?KMMkPaR^ z=(aiZ%=0XNB2%WEuG4|pJztNX)S+yf~*Kb5PN2U5AZ zKfJ|b0;Cr&UVqT^>C@@kw{PL?Dgv#0_wLbx1q*bBUAuPC{Q2_();)UkD9xQam%e=Y zLQ9q`aiz@<9z38~vu4qqJ9i?m=GV|t0Vy>#mCl_z7qKzHCV2byEp6JgiN1gT9!#aw z+MhgmLVNb?(fNAy>P4$pucl?omf871l_yM?K=td_r+>7)1g^JkXR#Nt?=_HZgspFZVJ zpFUaDf`S6I33Gn^`jub3dS(0k3(ucF_iwWGmoH!Pj~_p5-C6kf@uODHpFhtjDJiyV z?b@|0V1MwV#>(4axwuU|i(eW5;bVq&73MpghC ze+yFAu3b4UE{>~Kt;*ZBZDR>ZoRN{CbvbQ}UrtVrE`Iy=ZQU@OZDi=sp}c0z8m$7< zo;`bVwQAM4X3d&BYSbux|NcE2kQOgq%ysM5)qnN+_U+4Z!*pDS4jp*m!iDPGq@*N9 z-8dBrI6!EtSFfJhlb)WgsO+mte=P+INZzdw%~H%>SD`0-=z)Tt9MU%uReG=BVe#w`N?O`0^} z-Me?|IFu!;1hTemJG zND}K6z#BJi*s*Zrg$oxfNC4W%@ZrN*61-Lc()#u5O&3dk(78;wmE^4eJ$v?yC3kXi zaxzQaVM+X4t5z*t!wiPA{Xu&7?j5&m*;3~`d-kkR^?72h&Ye4}&Y3f3eEPzvgnt65 zREUE!8G_Xy;W|Y&O>zUAO|}e%1i?57o7AymN82Yifco_5W9y9@H@0O7ugb1WLz^~j zOp%}$A0JPWgYc*?a^(tr`0&BUUVq!6H*@Aps$RXiGR(=7CliQ_ zzeo-u^hv0r0Rsm3cSlq&b&%wg27l1byu3VW-n_Yj0BfBrO>PJBB1yi`=l%Ql?S|w; z(&^KuZ5@seCZOp?;Cu;n)Vg(Rx_0dvNeH52$BvQY5|Z$%4u@`y8a0$&=jZ2}p>+NF zbz4RO`a5^-r0v_c(~1=<6kvenCa^D*jc#MYX$!vVa7O>u!6`DQYuK=1B!BUr%*G{Y z>uDV^VgyO9B4IFOKHlPMJHEO@B(am^AQBRx`VyLG(xgf1$luF^d~DvlnS}X~5Dk(9 zPeMSbPMtbRjq$|%kVA(K5e@^iVv>eQ+FPSm4E4-!H{ zTefVW9XoaqZfBW^f4ux#c7KQQU`t?CNaSE#g9i_0IZ-U{PnvM$6TDq!&YU@#fRPuV zho78K?Uz%}En2it2G^iL1DzKghTSSF_rWOFLJ|%4b@H%ih1+q*_;GI(WOfl&3|1w+3!DTX=x1m z{OLaS0RryouV24bhnPB&wuBC4YNpLR-@JLl5}r)e=ZW_!fCA@+D*)-# zsZ)#u?<5z_@u1DH(Fj3Z$U_p7gg@StzQ{5Re7@+(a0aTeG$y zraMVMP(_yxVt}n zh=}DuP!W51&=-BMV?)KBXcQ}`hz)!QViy#9NfbMZ9ozi#&F?PfoO|x|#>C{_a0ZgI zvpc&xXTIH??`%i{i%=l39D%IFSoSXP?f(b_AjQE-2tW!zihqL$#DR-RULPMmd`NTV z%%Pt@e|nn&{U1l5e*OBibm`KNSwfDxix)4_?%lgX41IpTn>+w1x;Pc9RRB`4hCjN=;{v2t zuU^r_i4*C^kAEN0y;T9M?%cUUbLY<05q9j@p`Rn(c@G~xOtWUqqHo{6(ZYob2}$28 zj~+duDO0Ao2Re@`1WY$%d%w`b3u(XL&))U{5X zI?;+1D`@fJ#nx3&eZ`9W5TN@Mr(E0P{sadmTuKK@H za0~7fq29O^cUJweT&q?sK7RbT%kJyfuPm#H<)heDAC2<-`E&mA<%>1FckiD1gfYK= z|ITmTys>TG!poO0y;W9!{rWZk`t{4|&cf%st!Pl=}*Sg-l zdvo{h-G5#01%1$C(23ZHQ3F%*^DZq$EF!%n&s43sT#*Z8;$!fyu@B$BrGjeEITRsZu2# zJa{mF{P>X#NDCG$;FOdUov&NBZY(=Y`!#RgoPX!do2S7|PEKa%Ca5sL0zzH2YSq-A zsZ*zFKm5we%j3?SJ8OXI)~(BvCQWjI1Wc#Ebx94^1)~R1|D`WekaQpUcE?c%N zA3Ju8@or6JyY2P73hH&4$eRU4GZBa1O96Jd{0J2JzD!Mo}Z{Do^ zyuTJLTEyw;={$e_d^dbdG&VO;9F=K|y4>-SO&6d(Y;8g`kYuBzdO)U9A$1=yQByR=i#fuj#xs$6`ug;QpSQ0;1u3TB? zFr5)>FGwFgeBg!+8|s*+PoFlXt|!K7)vA@+oH}*N)fSBs38X?H4$foQvfNiABmux+vfsB71*RCG-=Yr6bW{TiHRgRNS}ue z9U=*``UN6Ts#Gbpy>Q_Iefspt<*(Ow7*3u%nJQGMpbT@&m@xz*;}yw4gf=0Wp^MilH?10K6voJzL2a)I(hP>)e-n`0-A0F z!Iz_s8aHlCmoHx?IfCfOkt2i~emQ$GJ z>J2pj255c)|04P5*C(2~@NXSW@8339MP_yN@84f<(anoX($>{FaNt0aTz^HvV8~qF z?%lhW5E|OFX%lVRwvDhmi%h)d zWq#Qm`hzWjRUwgsarNobhks>7v3x&i!rixTpPgpr%$b^ikr!ZxANd=Kw#%yL1`Qf0 zgR4=ahK`E{!|t4{aOlvXJbn6f?T4HM3XCzq{@S%`$6%5WP==_DYlM3ocLHdKam1HRqJExuwlboS2y802la&)0r`lhE?v6# z4w!%sHs6+@GFBoG{Oe1sAQ8!rfH*{oPK>k#AjJp}k=zJCiW(H17-{Px*TS-JgRA>e5TU$sKZxA1ESq6Ct#k32i zMkFO@gyf|MDa%Siu#}?0Kqcrw#Hffe6znA*M5v5PyMSnPc_|+XxUaUoT#~fU>eO%W3m|4kJ)oTWh7=>L~m8@gvmL)maIe6UIlt zUaYM$Mlo*-MTKWxjfns!!2bRFZ7Q?M7@Jb&`vzqznNjDk=&Z8yh7w{2sJ+?b=y~>Gtj0aQ^&x*t~i3 ztaWMqo3*leQeX%$LqkLG4nhlkbxluC1M9a%?9Z1kUw>?|T%Y65{#v5<7yf4e?Udbd zbaXVjxw+xu#f!1HxLB^d-p9uW=_taWpdcjBR2{jwxtNuerQX{bT)K1#mn>O=ixw@y zq@*MfdHM1s($1H8KR-V_d-g0+K!itN;kIqtkmva)K0Y34a|loC-_4sh#mDsYbk*$l z@887^ZGQyp?d_HEjT<*GARqvrJb8l5&&b3qA6&2y$y?a$2gUTC;-olZ=;V}ct&oenWiP_oN0{Xjm?~t+vj~qFI z$;rvG{_Weh=(;HRZbt(({U4sO#+P)Klkho`8mw zloXMxs;UCEOPLRROrJP$0-im429!zS3mz90k<4+KDL^({TBpIf(X0UeDw`tQRc>MUWR+YUE|KAetRyyRWrcXzikc{#2@`90(5%Gbuft^=68V?T-alD|Q0DOIYfzIH+ z_LT}QeEaqd?%usC#|HzHnwlyBV}CnTjA6@`EdmPj_~W3qbJO}485s#}ZEf)8%^NwI z%FD}j{o&2PfxmL)3Q+w5syT4x%o(7%BO8Po5=cu+1Md0)0|Uh;tzBKk&M+(sl%0ZP zDXQMn87$q>ojZ4=V6I!Y4haM#utcV%rA3NrNlA&i#?e4q{8^Sjkw#+Gs()2Tfkw&@ zDaOp>;?MRrY}g>38wFdsGpY~FMy-DYFviBlB4shIT)7gt8K5kiQT$m(Ap%fza@WO$ zJ|-pxJ32aqO~B`sxei-hE6ry6N43Sb^+EBjE zhPcaPkhz1hB<_s3b5e-gWqGD`(kk^b7Fe+>J?nRd|6%;scltd_*~YbW5G`E03Vb5 zqYxiMTC((yGEd94JLbAY*=SRSYZf;oMw4N{=sCvUy7-~!<#UDz7k^Zf^dm6mz%(>8 z=vy~Ax)Cs>E7R3(GF*;;35?63o7;sZFmoGUm$mEG7`?yVaM_Z%&?*A_=SzBI1q`>5 z85tRR^5(pO5#U(swe4>F@?)SaQy3ri&^}QkEtOVO<)WOqwz{iV2qEc cAsYVy*_@V~l)1xV01E&B07*qoM6N<$f)tic+5i9m delta 1688 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 SCO6ao0000;CH literal 3861 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 a{sF-{X*iBHhtB{2002ovPDHLkU;%;~e`HGl delta 2821 zcmV+g3;Ohq7K|2+fJw5cBUhp?u8i)q(O5)b0Eqb zh!f=z^Z=RznghZCtxS3&Xbyyk16r9v#7I4i=73fvy$3W0LVv`8aOXJp?%ku|!-v!F z-@lzrx~@5(Ilvr<6DJOh8a0Xv6ewWhhlgi6d-g1C*s#Gyq$`>OngbCW*t&Hq9X)z9 z0`b3+hi6h0n>KAyMg7zq&>XOEAa&~0mRdy7!!t!R>5}Gv=71XxXk~K4ElsOA;D-ZR znfx$EH)#&I;eUWuCO6#Dw3-8cIN&n@;ir#B)0i=1sAkQYRIy@3Tic2iD=1#Pc+|dq zd%<71a)oBjoJqHD-=;!^3Q^s&>VFJB+^~&s*Jb7|z)~p#7D^^T!c;|x$ z56pIJ0kWMweY&79zl94I(wQ@7=@C%2&z?QBd-rZtm1m|*nW#jG z5>%r`4I4hPm5_L*rAwF6g$oxv=CE_;PQoGpmwzr@qLL*`(&x{gsbj~Elq***>eZ_k zHEh_>ywk!)L&_0?!0*kQH#A_t0IFB7p2yhU5RV=`qB(Qs5Wd|7vmyA!ix-PfF}8x^ z$B)zI&6{N|n2+`M^XE^>oH;YCUAvanty`zMm`^Ct!-o&0zJ2?4n^G=Xw1}!zt44qR z{C}Zt-MWdvSg>G$DAbQ1Kcr8fcbhNrQ3%x8{ z?6YOd7MUx&j}s80B9w&JwE{v$SXEfh=!D3uF_28)mEe(J;c@G41y&4+8h@-fXBiCneldVYF&%)v6VhD_4#XHTi?0MT@$cpTDs} za%S@P0@c>Ndv}SK5ogz_Q->;5szkMG*A~~TXz&DcMvNFCsHab#5<)4&jO2u@S+f#;RzMi1LORF}XJ*WcJ&KjgRz^6e z3>J*-j2SZ|tOV}^!R5=B!4UCQYOlitnfp zCo6ze#-?@x-mMe@-U$b0C==rO)2B}pJdii|{{1^8Ns`1{lLs!CcYAaS0^xRzfnE+9pA~Vc86cDkyqA(h=H6K5I^cVpL!Sw0V3;xB67qW0n96ydxB{SBt zWlQl=NJan<4o#dmQOfv(gC;CHk^vmwns~Q`n>TOTLNJ6NzJC-$joq$YJNcjyeYb7f zCKl8AaigMzC0(^@m4pmV;lh9baCip<^KKz@`N!=V1IYwo60A8gl!zp(fOo;rs3-z$ zpo1p@z$oE^X(S=|TuHtRA(W|a-@ekv?H{}gnM5d!$_QJ>*t>TxRj5$GL=`Sv*ygEV zEQ%K|PW}7$w|^y)%nmLK_CVNWXGM;40j#zYkS#$Q02|19W`UPL8X7UO%8m)4;}6_# zx^(FX!iy{*?nfvAOY8x1`QIWLiR5@0Dp!TN(3Y31Y98?Y*Yr!*^WBS zSuoHD_d)?7@l4ocus%qIBh`p72Im|c`qg5P_eXq+_*vcgAPtVq2g{%UF*m|N0ODz+ zPY)b8AXZM%1bU)BLPS^|SW9f?(W6J3Rula(M-{7E$4i+qrOk>W)Zsc{Uz z7jcsIL<*X{iIFj5MuQKq=GaJea!6+|a}7>H7=Il88Jx{CSXd?vQscaE^T$aCgWa&f z_X8%4zk*5|t1&o}WU!kzCQqJhaExqrMS5D%IG-#SlMV&U8>wxMwQYD*tf_I-pFDXY zIE=}mudEgCXDf+j0XOefeXP$=t}z&yfN$f*jWZw%KGR70AF|`jra3KNsc{hShL`j+ z%74M6#zE%|e5J-QKmHIv(&^ZDtW*Z%jw=f`TINu`QsbOymA!y8ez4#xH6DfmSokI& zoIzUAfi~Oy6>zA#cI}#k2Fm+5=@AOSBk&yqvBEi<{}pxI$RoLtGiOelmy4~73q~e5 zmmt)}H3in?JQv3F+Hkf;MipKkNepMIJb#q)L(&707cSf9S3{zoVm8vuuGUkC0$^NWc!1|t)kO>lsZt$?#N_CQQRNR=tN7s9SSx?d6F zOHVd7b3iLoY?h9m+h4^2txSKFxPJ6x zV>1VQCLoX=*PuC|IpE0w^)aur#lthmaO(8}bRWx9jrfOigPW%AA!jny1*&4GUa XN(^i`@+T{S00000NkvXXu0mjf53){^ diff --git a/inherit_graph_48.md5 b/inherit_graph_48.md5 index 10babc4f..00ea3338 100644 --- a/inherit_graph_48.md5 +++ b/inherit_graph_48.md5 @@ -1 +1 @@ -36b8ffb823d725e2c783a2b7a8202aae \ No newline at end of file +822ee13931924f1680478d3ababf923a \ No newline at end of file diff --git a/inherit_graph_48.png b/inherit_graph_48.png index 024b00ad18b1947ad789a7ffd435af30f9cb3c50..dc89d2e6c77d89e778bf41194364fc6da0a5d8fd 100644 GIT binary patch delta 3120 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 TF``eO00000NkvXXu0mjfsbc`p diff --git a/inherit_graph_49.md5 b/inherit_graph_49.md5 index 449e6996..6771b49d 100644 --- a/inherit_graph_49.md5 +++ b/inherit_graph_49.md5 @@ -1 +1 @@ -868b020ace8c41333293b31d6f4ba3db \ No newline at end of file +c95b84852e0a546d8620f51aa9de2e00 \ No newline at end of file diff --git a/inherit_graph_49.png b/inherit_graph_49.png index 3f4ec196cfadc7fb6d203d80d453004a9107bf2e..91724f2499dc70684da44d8c776aa5ef202ea9ef 100644 GIT binary patch delta 2614 zcmV-63d!}<6xkGzBYyw^b5ch_0Itp)=>Px<6G=otRCodHS_O<0O%tudJ-E9C4ek&$ zxVr^+3lf48AOwftgkZrfK=2R<7CcCR;O_3O{nx9c=bzo3z1{C__l~>kO6IP&rlzI3 zy6RQUgeWF5WHb;>H4rPBuFEXTXh1Yz4BQw(wAO$z@MyigW`A+Uz>N(=YYoJ4U)`xw zr)bu!S?+A}+i2jQ*FcdXMQGHhQ7-fJ@ZgUgJ)+HaZn>KCIP4nMq;Gfq(w{G1C&e@$jJh;1n`E4{1l{H`tJSy*=nY&L77z6jIA|nu$ zHDC-pD({||yMIp&cug{WK4}veH*Or&s8NF|R;*~_60KOVg5t)FOYPgY7ygwiSEK}a z`}S=rT(~gRu3cN6OOPOe++V(YIbFJR$?60A0tE_C>(;F)Uc7h~-&^C_wQIC^@nV`e zb0)=(9ot20;J|@|M5IumLUiujIYJUWb?Q`+L22pBmwzvoeCEuVseJkJa#>6t4S)K0 z{P;1=m@&h#r|j9Y6Xpo|`0=Bx0VUg{Nt246>ej7G88c?Ip2a6bOP4OCg9i`Ny?gfv z&v)w7No2JU*7xk$GyRj|#EC1yiho6wD_5pEb?V3-96EG}wr}5V-FI(j9fQAe?l%bwI zd&)d;|HX?JGTqS zuW#SJNpHV?{UVGFUEn{Qz_xAMs9?c@bnDhFOQvDNhBSKgXmJ$1d-oROYu>y$O_?&q znt#=rHEZbn`SY?atPRGzcI{d!TC}KDQUedVxqtt@Ja^*62`Ljp9@mc_Kcu#tEn7DF z{{1`QVBr~DIIwv3^XJbN5BGom{3%YYfB*iJCQTaZ(W3|D$dQ94Oqd`J?aiAvG8Xip zpV#BPe*Kz;4I3uT68(moctS43o(*3Yx_|I|{m7IllbSz&zK2+|X3Z3PZ{hdp(?{`U zxyW3-dR4~a!y)`8O`0gk*=hay^&-Pw%FcFd@7=psWLd!;_pv7SJi_OVSA2jhnN+D# zDULSQZ#2%FIiuKnsSO)8xbVIG@TU(pHklu9tha8|;lqa&M=tg9xYgLjc(BUNmys$<8F!e;}PIYD=z5hF&Z3Kc3yTmNB0 zRtXa(RD3uzOa31}eq5e)pDRaD(eKThH(lhPK7Fdvr%$igaR^`U|D8K`T;#Z(E&Z~C zbm52gqiff$s%Fia9wGtp;QpL4c$1O@8GlgtrAn0&Pq%2%qA>R#mOj3I{VHA)(a26) zw{Eqd9-GGq|% zylmMri3Ik0_BLQCpeSOx!>EynircIj)3<2IPQKE!| zXh0PFu2Q86l`dUc1_v}i4ujXy?u0c1y4VRi)OigK4Xa| z1i~Q~@!|d6!hlURyF4&A=46RtUM^aBp}Iic=pCA3k(hFNV|` zj5VJ=eVUNWZP~JgR;^kkUJqW4;S%M|n^*9zPRwo7b!;MW*PmVhPXqtr(0MaJbboT; z!UgL9AsS@Kl7$v5SRjd_;~+NXhYug*SL)QMZQTDib*_Pfs;P75&Q{|2{{4HxL7X;i znnZ3b6W0F$F>qx1pFVx^m;+8Kj19y%jZ&seNmvZ7-@kv07eQhKZ;pf$RJLqcnlx#W zwDAXuK=ut!iloIKnmBQyggCpbJ%9PK^FwPhh9r2L@Q_m<2;nJGq;TvO9utQO-WwMP z)u(pt+KG-(l|U3krK3@!MlOBeAY<*VTD6jcfSZVhNZK^vn+@m_$tEfqPE@X3Iq~#P z_k8gHLlB+d#Tm;vLRa8 z2~mKPDAKqbhmMm%yNI+oL8ZBK=Tg?JSv~G)1}a&AJUBGLAb5O42*3;{LRAg>?k!IM zf9TMmV(6TNI(6}%cmXkRlz;u8aFhjc0uf@yj2R>KTwqHOupzLg-I##~5e`vv)`Us-o3jdn!ex*-~%E>un18Ek$(od(br(@i!=7Ya+65FPMK1t|?BOO{MZRVW8Bjym)cHOLgHX6WYh+>|b&C_9(+y6Ln~yOz5i*T_&{4 z={9ttiND7eUGhdNu74jZt{|zlZQCj~5-p+_qNrTCa>0HrOU9{8h?{-; z_Ej8NMb@7(q1B;V!&{jUVhlSJzub}eF*KEZFIKFWx^d%%)r+?>Aq3dDD2Ak#tgnW* zGGPcFWF=dKgaqEwjcwfzt$`OTc$)}J?k!9{fBsxN7jF*nA%6(1yBK{B`3qnf%4L8k zP9Yt81dj+Wj<=A$Ja=R$lxyGerWGY&+L}w`KX&@j;X4G4@nQ=_ffHClxvePkioyNdp=*GvCWg7#J zDLWlQ*XcFM4EBqa7^-ix>>z0XpCGt@y@;Va3>+WUv}n;HNYgOg8Vv+T1Na2N=?hDb z7d^ol-t=lT5IGt!7(8B-Mh@S z(ZFA=fx30;Qpb)RUFPWF!OxsIL+jVCcM&odMgxDl24J`A)~)lHriTaD5*s&e)J^l( zXyC8cK-aEa>EXkN9`p3@;2si&VKflJ8ZZVP!kcHN?q37O!2RpUNQAHkjDd&n=9#Jc z*MQd~)BmmiN`H(UJCw#?Q{1?5sa?Bv!oPg^GR>ShlWyI*MTH9& zrrNb@%Y6wFB#{1P%a+l_ix;giz%Njs0JUn>isHqKXYsu?u3o)Lixw@S88c>3?AWng z#0Cr)KuAOi6)Hq$&z>bD(Nm^O5t)%AN7CodpDp>!nSV1=`SRuEXEFUW0vY4cqenD- z`gF&UvS-gum?P-JhYzxblP6D7(xgd6Pbh(9%$U)-7oQLeA zSl`p9PxU3mi4%wN(>dD%zj&L@D;=!Tl3l}bUOkvlqU9@-aUg2N5bcsrqEGdT6zI}Vj znKLK#?c0~?*ROBY+@ai~M~@N~iQk(yZ$$Y}Zhs(j|NecNJ$p9&`SZs^9Q-?X?g$?W zU$9_-C4)l&9tyD_x0;n8SUrK zpYm+z0&{@DZr!?-3KlF#H*emwWEwVXNTWuL5=YUiS1&QX=FOYa2Zn$Dd& zCx7e0+F;CU)~unTMT^QBAqXCHbMM|gx$pS#-@g+MZ?|a!f(=~iGrM+xV9-W?4|5%$M&8*dqkEM?9q=kvF8y!Z@l6IWXYsTl}d56v98fL zefqRw@1^*ifD7N-MId9avB~^+W4#Td4jnqAIC7~MFJ8FFaO6>J(88NLcdkmFJb$@* z{P?kp4EP+mtb1_}8@!7Q8>wPrRUJBX5I!5Q%n7;!4Ie&SRj5!w+WH?hWR);sLdAze zv*howW5?uP_qlQe75(10al=La$&)84efso@9f$Ds{@=cR+eMBYjEu_;(uMEqqDz-9 zs%Fia9wI^U;DMYncqn)YcqmQz^MB_jRuTaccq7Qeo2N^c&YMW2@Jp2{C7y2K!iC`; zKRjc6`SOL}H4%;Mv}MZ{3+f^Iz-!wf3uM8A9HNjniXT6|KoM{KPJDJ?;=y$Ubds_2 z_@GJj101qbh71|RJ15O8lq4~o+m4<0;lSuY-`HyCR^b?Ou$ncKX1Gp$^?QoJ6#8h<{a$eTB>;9Z@V z+otQ-MB)xi4MJo9{>7p5W`K}8fBw96fDjF`WXVGF=g*f!5&gdC{rmUQojP@DM=_mi z;Gk;i)Txu;Z(P57_l|H7r%s(Jkz31z_is=P9GU*dj~_kefRhSi12ImclqpjZ7K7if zU%$kQATfeBN5TmzTYt7JO`JGU+V}^GK=ut!ilikFnlNF4ggCpbJ^8ZpeYF`w5Z_PDDc_ zZJO}S2K0$!6BP|7Dp#(YczUNke>}htL??K0#_}HG`}XZ4z<(sbQh09Ai4!NpW222V z;A20`xpU{v0XsF^>qJ4p;3!dXQsyx}Dl6y%!2{VphC#;MxN&2FDDY_B2%C*e9EK8= z1aF5!g##B}3eOmbY=~BNLKNU6%EIM1bet60MWoFMD$SWQhq7kP>d~hesAK{1;Lt<{ z!Q&%B0A@H5s()(OcW-$D_(O&a5ku!B)M<$S#0!dnqwEKTqb!IMh!8V+^k}K)0$YNB z4S_xF#tb}&aEO|-CWLB08T@cS1`Zr3wcZvjT4<3-`TO?mTX`l*UnrF!s^DPh$P&my z104f(YhYaaPbZZP8Z;nyIpAJRh<+P3Y_Rl%@QoVspnpMwNJ9eXs#~{il4$yaFMtn- z6p=-UB8W85oh}JNHz>QpvyU4$&gY{M-C*cWsKDoqPMvI!E);>80l)kUOCXn!te|BA!6 zM;XqVsDDEPWkP>r=rW;QPPb9I)5I^sM3=nLitERUD@dwMn>LD#M2jefC@NR3T=GnY zh@x|L28uDRCF4{kL}#BqeH2Glk>w~OWB4i)S_8T@yp;(d#;`;2%N-e;p{eY9v0}y4 z_3PKIQM{E2A;8W>F(kEQ{WZLm3BzzBE7>9>B!BRhZfvXHR|79t@HP>c+*_D@_UxH> zF5VpCL*Q$;7~O~b1+Wa|GC&lkkd8fqM}!y0TS$MN`~OfV*S_UVD@wx1!6J+F=d$|6 zqJBYKo{49BBUE{CsDnv~6DKD2 zcz-^Jgwf*-;onTC)w|d0qjJ7MHSoxuxc*invY+EVJ`zpyznt8)5*pV*NisuYsb-cj zQ3J-nW8$vIpfwuPx)pGibPRA>e5T5Tv^Zy3KAMqcM-q#-Y5 zY^i-1A0)I7(%O>OLh(UjHr7@?m=;niA#EZ_Xy4ciB_EIvYqgaRQZ;LVsY!R4GfUol^ueWo4x{Tb)ZF@aD}M@b&f8SkVdj`T2QhZEe*MQYV@S?Ck6i zM(gYAnhSiU5IXO8nJ3A|H7gr=zUS1A;eSKGCUD~W7fd2aR z3+~;!2VcH?fya*@Lu_m;3=a>(ojZ46aBxui$^QU%WMl+ZS6Ast1qB80{Q2`Mf2!WL z=^{^l^5h8t`uX!`Ff~0rqrAL4^3)eEUO-Pzk7y2ixPNQcu7RbcrN}!wI5;?fy}doK zv$H$Prm-R2KY#uJuDiInh+I|#{>H`z({R#J3AZF($b*4y&V!06XD~>kHCQ>x!&Gh^4^CJAJW{IAEN=?-`}V3H8C+U zxQ~>S6sWGQCK)`0lamw5vuBlxii*I(!UEjg-2u}`M@I)O8`5oVZie*qbil*IG=erT z-G3OOM~@!C@$oSrkVxD!AucXXZyGXWOMA^|K>hvw>2!IRY1@YJ@o^|EEyesn9*7=* zUYeDa1v~|4$lKf7gR`@<$h&pxmRL~Gd-dt!YhXY?fT-u>0E55D;*I78e)ANDz2ZcLcDlt&IvM0vr($AtiQUp3#6>TU$d} zSsB#S)KD(Nyo7nHv9S@b%3`a6ReNP+1%iWvDc@p_#4lPH_5$I!uC9)z=-HU-@P7c# z(~XIVAzKJ4KKs?HSK=WGw(-u37Hn>AiY)Av5lCJL$vcJaL=?E}K)Xy`w92DC2ZNQA zlrSqRE5>smyMFyTyLt1bM%Cos4jB(?78n@Fcz?>?zI{v8zNx8+agSyEU>JWXV4j|y zWG6W}nelL>?HSVLg@<9~#wzaW>VL`}Jb1vCmX=75_r{DLDvi6ky6E`{2?;dEpZxrM zs@7v;V5nc0sIUnhvh3&2pNv;r0$Jb-cWj+_3J|8$Hu2t(07bBou+`$< z8ATakpifs=UtV4o+c1HreaHRb0SNT&-8&W;87WL<-wgq(NMkQV2Zm5kP=Amx)wyHg z!Al@VM@L~O-mzLs(RsSuJEhb#c(^|#EQt6P#iIl&Dk?N&jGY*rLyg@4>SIyk4Y?Ag zWZA$Ro|~HsPoF*oY@w7SMLqPg8$++|?(V*<`i1rIc>@Cj7uJ)b@UQStIUD`2$f$rS zd{Qc)3InP)hvEkWm822C&rO8-NXJ95ZQ;$YK6#bT5x}=Y#7L^`Gr?|FMM*IP)PHAG u49dR^>4dz}5BR^?Qvp@@#8p5Q2J|o0wbt%Z@RiH}0000n%Atgfz#+r=G8m6Vjg$jHbYSyydV5rohwF69xtb zAS^5lA|fJSdU_h3K79(`zI{{u(Tudk0chdrF0o*rOhtcp%gPk-UhpFdz~YARUPqI#S5SSGrQ=O=<&I^x$ySwTX^;A z6?ArXLQG5yw6?Ya1(M12_xCgJ4G9Thb8UXK2K40QgoUq;j*iBCBqSt2Wo0Fk!9%#X zxL|qqs#0EF9vB!HfUT`9U>fP_>SD{9bnENu;q~j+fQN@^1Z`lt(L|x4q3l})0*ORD z6MrHjBh{uMO}3QRvp$9|gO963kaA0=g%*@iN>%oi4Zj z^XE^#4dZyqcibNy07n%S6(k@afSZcGYXVe~#-57~458=GpL0{e9SaX$9Di9_T5?1F zj@4QfU8hUEQxl=KYjWH zA3l5lY@wtiNj>zo8$++|?d`p-`i=GQd0)SNy|JDch5v+yirMJ@MMefx;**jAl^9U9 zITSx2$fOzp{7k5h1Rm<;2p0Px=-AP12RCodHTm`HaM-U#|C3t}11a}Ei z9EyhE?(RW?1&SxQ6eqYl1P=)Tf(3VXcc;b6cD`xvy8r$1?)^OIdu1p2`}XEmzn$5U zJsL?dks*VCK_EgP5II83(oE7IU=R=ljKUg0FbG5-1dPH)pnuIWQ#A+}g*7r@5Qsns zM0L*f;K745VZsC_+dLZt3SbZA8mm^VvWn)fLBJsJoe?Nowye()y)3NHT83#5FbIST1dPIli)}EI zFbKFqz$mOcoPSI$gFv`Iz$k3E*akBRgMd2({3e~;HUGQTkRd~;eEIV9^UptfG@Czv zK1GWbjhZxRBK&jb&dHV0)vH%2SFT)CsZu3r7c*u|c|UL7JUV^)wA}~z*|TS-1`Qfe z^ytxTzQ4ksfBs3mdiA0X9Xe3ftXXOC;>C3GcHzPWTC`{pjT||W zCQh74w{G3C-|2;@QKQnhapP#jh!OPk=~MlcUB=oICQL}9M~|il4<6Wjw9TA3Ga-3^ zzo5H!?@E7mC9P1iW=$$ps+4ffo;^!*=FAb?3KlG=)%v^m?AbG!H?oLt-@c`sIdf8< zK7A-{+JCfCA<#JK(xs#B-Mf4B>0}HTFo6E};}4siI(2F)R;-x(ET-FWLfUuqhfmtE z=AAot(v2H82=i>wqJ_waHJ%%coiea_^JdzyV~5oRMUEU(@963TSUc8_@dGb*8>eWSlt$#M#w{NFy+qPMc@;7D5lvJQV0V-Fn zoCiPHhcL0Q0Q%IaQ(kk}vSkZl5uh_?&JctTLeQ*PGs=)519j=rg{oDnMgSQEaQE%o zM{(oEmEZH{&qVzy07K(H5z6Txp?f z{eMtt!GZ;nV#nN_KkMI4ELpOIjvqfxP*nWTe(BPsls9i)+OubmjP>Nn6PX|WI{W$b z>66sKf3SwhlP8N(+RT3n5dM7m@=2c%m|C@J(fRY|DMyYR_F-p@1N@xhynFY~*`?3t zS+i!*#fukZEs-KclJOvP-MV!nUoRcQzyaA)YhONm_&_*}aJapH|6UFXYp-ztq3!R#|8DO;_7?`GNRcA6a^*@n zupqy{6$VF_twVkuL42Kqf4$?u3+W+Ms((~! z>eQ)T)oRzSt=PH>zf-49iWlfnhXqZ>;zbFct&BoFot7_OE_GPRbhghjZ-&%mMV0pr z8#Yud$cnAJvc|v*K1fu81PQ$QV9TS}%6aiKX3VHqfW7!SgHK__!lknm3xs09P|ce+ z7d|Vr%3v+dq^Hl4j(?O*g`25O5wX1$IZS^nKDJOm!j_7yXP?;_)(%nQI8)#7QP#d zoifnBe}7fHcyW(@Sus_tSg{lzs2=?N`}fQKSmRkQSy>gZ#eV9<3M}>a?tk4Y?4d)4 zDz>J26)AV^+Ew=S^XJcA@BA^!lqsXwQ}lWrCKlGsiGhN#pqt%7KTxDp>@u*IQ@ z6)RGS5+w+qULh{h3E;qG0U;*bv}u#XntUSa)k0MsKYqL@4%|ElL4Pm=_x{nNM;=WP zC)cf8*XCiqRt%2V67D?|46eRTh@0cZi)XVSsI6PKmS@EMO`A3q;XquAIGioCyn~Ah zMMX^Iq@RBJiSW~D?AWp7#0@Sq+~;74PkvgqY?(*%K;wk8?{G)qav~;l5?fbsm36*b zjP*8feXm`+Cal-5Uw_lajT^T7;zi$e@bZ4vg}k^zJcXb*g_zgW-L z(sxtX!i5VHyF7AYZr!?-`t|Ea?b@{?cAG^g^`w$@8X-{x>pOe)Y-0CTEKe{ChQ)%C zAZCUV1VczVA@YY58j6udy=gtYJ2YbdRicnoQ7ZZX#TIdS5I zt#H5&2ivr1(OnNn+5%$?1<~R(jm>wPA@Ue0(;3LkD6DJO}Y}wLh|Dk3& zo#bF*Shh5ZGk>nmt|VqIR$FLZb4_etLl--QuX5Z7NPk*oYFh!RhgtZJCHcVk{AYU=8 z6Jw_g_=;gY2GJgT#jtFRWe?f4*J}P-Is!VG@| zcbbz<;u`y_6B@o}<{~sLwYo@i18~H7e0Ip);D4{b{z`}!ti>R04_{taPQ-X{SM)d* zE*o4x{GjkXdi0RHIRyA$OSnoJJa{l6$q`!O%%Q|Vh=ueYgg6kfwG_8n_NexPU1o&*;Zg!Q&<+g5T8A-T(LG1lkowv6>6na5ds zxw5hL8~Fs}FF0!-Vwi>bakk&>kb&ztjdL(AG5X+3ZN=GKNnf*7R4G!VP#llh-M@VK zQt`c-xO}+kNR}*_;w-VU+&xr;OU$#ie}725=g*(tzDBS+^HXrTLr#|%&ESf20wL7b zI{LiyGOjv6zT7qN*+MF~O>n6!7t)tY%!;Y1R;`LAUc|AMVxbYfm6K36=P;7JuBV z`MSZ_DFa{Y5@T#&&iDCp%?8=Vl_0JPv1hug?8_xad-fD$UA{sYy!S=^T;fQm%plo> zqzSB^DY1aNOmAhz?B!rfZx;=4loVZ zuiWfAWDYJStSsFBkSwd~!NaH`l7C|yPZO@Hkg0cG^Muhb(ha_l%aSFF{eh3wcbI00 zape%wl>wAASVcvghHD>Rgji|Nph3P~{V#bC=G?h+2er2U0!KIdj`$mgPk1HdQy^#m zC55TNe(Qy}`3Ck|&*A^jzriu$?qZlEog(h?&CCq~5eosMun}v&%xr&f1b>Xe{@?;& zmLIVYFbW&7_RGxn2S>nf(kU!HRQSQMHOn^$1dRax(EzS>oaAL;@nN+7FHoEf%(Fqj zAn@%Gz$dNvKUFx%>%$3W1@mkWFbISn1iUP4_?eoSi9x_1;6%VEtP>IQY!C>?2pEM8 t$D3oOW)N^9U=-Ggh

            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 diff --git a/inherit_graph_51.md5 b/inherit_graph_51.md5 index 39b032ef..d209cc2c 100644 --- a/inherit_graph_51.md5 +++ b/inherit_graph_51.md5 @@ -1 +1 @@ -f7bc24c0b02011f24f977e7adc86dd70 \ No newline at end of file +5f5043246b0fce4c7727867e1d5927bd \ No newline at end of file diff --git a/inherit_graph_51.png b/inherit_graph_51.png index bde5017ccea4d6fedf0de2d12d7899363303088a..691b75df2bf0af32163fcbb1b0c7ed386a992a29 100644 GIT binary patch delta 1724 zcmV;t21EJF4a*IXBYyw^b5ch_0Itp)=>Px*g-Jv~RA>e5T3JX{T@+rLWoTIzR2G$G zkT#+=KobQG5Iuxanu-;KLC`}4PL%WzHX`&;kQGHUHW4HkG+I;?G+}BEkr|Y!jW!SK zU*F* zGnRTx!tD{ZX@Aounmczc&6qL6W!u4n2dR7a?v$36=0a~hsI9G~y?gi4_U+qSlg)m0 zbv5nYz1tiI1qD$|ObpGNH;;x58)nkI?d;sSlV;AGNmHjz^_E44_W8sE_V3?Mj~+d; z9Hh9om@ZztXrZ?zyng+f4j(?;n&i?)S-fl4F2XlMfPeqx%NHsvETnPc#?gff7hKkQ zGpMMjpr)oKZ?^hmk54?HJtukd<_(31hpT6}@B8@iqXONhPapRw+OlN}g@lBdbd+_e zsj2k*`E%uGOnm?ToqqlLMWLag2I)Va2M!#t%r`VN5YEuEXHU!A`}glDEG&!y1ASt< zRer2orWUZSO*Lk zKueY^q0gT`>)ieO_tonL4<1bY`}e1f8#k)4n14*Y?D$OqSy@?>laoV@jg55o?p?L$ zmoH!Hv74KlDIg$#Furl)20eK2z++A@-V-1p2RwcHR7vaBt)o}3UJ*jd+qZ8iA|irP zQc_f@0J-(;9!guZXc6`5)k~G|v0}vv8Z~N^?ysz@q$f|FX#RmQV0~g@qJ}Gk z+ka!nj?un-`;6mw{q&mxx^?TOmiF-BLz*~oBE5U}j$lnj%gxPI%bGrYIwd6~QAtUO zG3D_IZ$e)9_U#)TI&_Gj1X%9RpFe5s+O-6)`|#ldrKhLUxpU{}&!0aUp3a;(Ln~LV zbm5C!1JB6J%%tGpU_Bc=W7@Q7bpHH#f`5|0AGrt~0B<{c_N)sJZw5Y5K=0nY>C>lA z7Wr^r%%Pzo>d~WzzR;jSg9tI)h@()%h!G>q{SzikP){)l9y(Q3RWy0>WX%Hrcg>nL z6dfI{zr~9e(~u!U2r(OdoaNT7TlzTwXPP~GwhLF}5_lo@8x0{7mEE&v&(u@KkAEL; z@<-u-^&M?KNy3qlks4Oq4+B@7GiMHc{rZ)D|NgCE0G0&HL;{^Zf4(XRu^Lv3k`)bJ z(pHICT3SjdVW&))LVf%8)qN*Vp45^O1IQ^aFIPSQ3i15(>C>u^<;#~_z=Ku8x&b!I zT(rxVFDngRg`Dx?#S3#E&TQldU4QKDKO)qn$wxT+jo5|O*5LT@<17^eOIgTbi7W@> z4I4JFBtMoqo<#vHFTnDtTUiO%JbLtKmNJ!Z-n^;u(^O4f<;*@Ab*>5tdUBH zr4V2No>#A4%@Xrj%41!B`}S>JkM}!rZ$9Sw& zrrWk{V@YZ(B^pb-X9+WW_3Bkq-i{qRSV9g<{m$YsoSdAjF9QV(A3mHHE?me`z33Y8 z4i*d6y@mo{6!?jku;dAr?|dp5>C&ZsJH-D%5dK>VKK{8kivr}Lq1Sfzh0eHR z2;ln`zTmpI0Nfzli8apHe+W1^z<*fVN^%rn3yc4VjspCLwXGya0k*LCkN6LqHExW& SOSw}30000$K|3TS6TuzwX`E1;bbXy@&No%et8 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 MNe4wvM6N<$f-;k*F#rGn diff --git a/inherit_graph_53.map b/inherit_graph_53.map index ab6ea70f..122a9062 100644 --- a/inherit_graph_53.map +++ b/inherit_graph_53.map @@ -1,31 +1,31 @@ - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + diff --git a/inherit_graph_53.md5 b/inherit_graph_53.md5 index 8c1d19fe..4c972020 100644 --- a/inherit_graph_53.md5 +++ b/inherit_graph_53.md5 @@ -1 +1 @@ -0cd34fa27b58d27900666b268dd46d78 \ No newline at end of file +7af968ee3ec134a0cd7ab7a9244bb308 \ No newline at end of file diff --git a/inherit_graph_53.png b/inherit_graph_53.png index 3fbea854e075e66129e2ed0d43a8ad011125a7b3..895f9f573232cde7ce8a7b6698ab81bbb8191068 100644 GIT binary patch literal 113327 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

            DH8s1FjBK^D|P0h9dU+e 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�x|=5wA; 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/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

            mwBM_VU)bF27cr*NKi#``g%KlQ;ToHnuR$Iee>a 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 delta 1261 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 Hu0mjfxs6T8 diff --git a/inherit_graph_8.md5 b/inherit_graph_8.md5 index 965aae12..0ce77b62 100644 --- a/inherit_graph_8.md5 +++ b/inherit_graph_8.md5 @@ -1 +1 @@ -0a701d048ad85913258c715a9e91f594 \ No newline at end of file +05a71bfa37068ca7f9596497dc318829 \ No newline at end of file diff --git a/inherit_graph_8.png b/inherit_graph_8.png index cc71fa161f61c75fea024c09e3567b148de879d8..6cfc23ed2e4d6ae29b05f14d2c1eec4cef712149 100644 GIT binary patch delta 1170 zcmV;D1a14638e{;BYyw^b5ch_0Itp)=>Px(Ur9tkRA>e5T1zN>T@+u}Ti%a6Ln(PC z1|H>+*My=FBNWMJSO``c@M-Q7L=-b>#- ze|>fTXVtlP@3q(7=j`A9?e#nRc6E#!Xr@P?*G6B`zW+r)1Ajzff(D2Nh=hPtwUg?w zv9SSNU0t%<>grxzUNA5)U^FkIEpv5s1(TDLMuFDkI6Xau+1Xi>Q!-+RK5AlOLSMAH z@7~^C=;-J$IWHrIn2h?1oEjj~VrzhCfJg{PRkKM|iu+0%CK!0KX?Cfml@9!6LMA-}u4u<;r zdZ?_dgqWBZxV^mWxD7BD zpbZTT!NS4a$6$L1vb8~Y>&%l!xTwGjy%O0dXf`KeEXMTQu)O3D+ zPTK|ZhNq{e2-mYnI8+o=GsMNk1v)!Bp|PLs$h2A;vCklMeLAk|zf>QrSOx7Mt zWEZ8dt*wpm7cA!B;K29_GQO&8YHCUhkFv`jSX}(~2v%HN%;x9kMT}l{4dZ-$eHnjw zV|?3)xW&aq#*-=IFKvu(Ay!&i%ATH{MEg&L?_?KOQ(=|>q91^-9^)&@IJFsq^naVi zWtQ%Bb93{bZ}S}>s<(_GO)(F|$HyDGeywb8Z~rUzQk_(PZN~r8z#1SD@ERZ*AQA#n zRbz+*h*_1vQ>e8X9tF&q5g>RvEh{TC7jG5*h=>SCPEIyC7ahLUm~8nwo!Z|aelqa5T6gh$A%01E&B07*qoM6N<$f*GwWO8@`> delta 1156 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 WYW;L zG`4KnVv51lCl*LcOQTAaDurE5h(`#k6*T(Z0s#Z?Bsi`00_Q+#nCO$ zlPpGe`!B7RFMnUs+_`hRXPHSOk#vCf}APt&JQr>t4Cnr6Lz`}U14U4ObnA3uJi1`Qfe=FFKL{m-5~ zQ(NT9m5b`ssY5w)=5+M`uJYo=3uX7X*DXl#FJHb))v8saGG)rRyW^^-i$}P6^{T$q zBS(%<$BrGTOP4Nm?b4Sbh;ie_IaFbvwr$(0Jtj|{Ocg3rpnuJqH#>CVuHfsVT_kP9*GPNQZ_AAv zH)a6<%OR9Q7ws)tw9vMJ0|&A!!qNZw^=p=wzycg?7vt-*4<0<|&_jRSx^*3GUX`9b zdvdQ{y~1{H+_;eo6)NQDd;a`6=g*&?XU?4IXy3782bU;Of-#<%pHY}HWeSTIVA+}4 zB!3{~vSrKa`rp5Q&jNN9Kx&_ON3Kz$22Y$gQR~0^vvA=;u2-)fi?`xdty($M#p81A z+O-*DLKZAopmm2*gi2~^s@hjJms=|};m`nY08aq7n<f`0HZpX z&(NVmt#E?5!K)!8B9uU{b?erui?AmzR6XLPNs}DU2v@;8`uFdzw!qx%vU250LdY|r zbkLwd8rJMO@s<+?f}l(R08ZeRk|j$Levzbk^X70rbo1s-b+yo4zI-|D+qX|&5P!x$ zb?TJXBaIVnpX^u~J9ez9zkBzN4jnqAF}_{9cGeI8CBnh9Y161;#flo=!Eq1Gk1i5qPj)KbQ!bT>1AuJ(0b?@Gt z1`i%=R1&&6w{RRoeg6EJvS-guAb(!*2zUgTEk$N210pEhanE*m?25^UjMU3K*SUG}xo6xu;;lVKuDnib9>eQ($6MyA!9059# zWoS$l_RU@#L3SPsP*?~TZiy(das&(}JD-KLTH{u)UY!Np$|t}ng!yaCmR)M;*bBno z)du24wE4}OH{7RBAC`=V7cX9{>$mGiQyx8fw1Xo&e*9RU0S;kA!m+lAH#JQWuaP)H z!X5!<*GL83%o+#<G+%#&`C=zB*9XfPSw+{EZV#NxA+com((|;!`Rg{cDQ#k

            _L!k)&E4HM~@z!!}jafk6N~D>Diy29msN!TE-&aOyW_(-cq@8Wj%=u z+v#dduVZEVuz%?a1pB~$s{Aki>nR*U{jHL4*6_D3ESOhp76^b4o4tIi9RR_%uQs-Y z1we?+UcS}#B#Sse3B+F(z(Jdrgm?s;s6|TAyao!||9%VLQ-FK}(bG`(Y?E*x;cg7- z8O{R1e~Zs>uiRt7A)&!TFKG6;1p*-W`~^q5yZ{K%S{cgcdjA3CivWYOU}hr#0000< KMNUMnLSTYNHvilJ diff --git a/inherits.html b/inherits.html index a73fa4f1..4552d2a5 100644 --- a/inherits.html +++ b/inherits.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Class Hierarchy @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

    - + - - + + + +
    - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + @@ -412,7 +390,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/jquery.js b/jquery.js index 1f4d0b47..2771c749 100644 --- a/jquery.js +++ b/jquery.js @@ -1,3 +1,31 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ /*! * jQuery JavaScript Library v1.7.1 * http://jquery.com/ @@ -53,7 +81,7 @@ (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/ @@ -65,4 +93,23 @@ Released under MIT license. https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt */ -(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.topI||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.leftF){H|=p.left}if(M.left+L>F||M.right",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.topI||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.leftF){H|=p.left}if(M.left+L>F||M.right1){return}h.preventDefault();var j=h.originalEvent.changedTouches[0],g=document.createEvent("MouseEvents");g.initMouseEvent(i,true,true,window,1,j.screenX,j.screenY,j.clientX,j.clientY,false,false,false,false,0,null);h.target.dispatchEvent(g)}d._touchStart=function(h){var g=this;if(a||!g._mouseCapture(h.originalEvent.changedTouches[0])){return}a=true;g._touchMoved=false;e(h,"mouseover");e(h,"mousemove");e(h,"mousedown")};d._touchMove=function(g){if(!a){return}this._touchMoved=true;e(g,"mousemove")};d._touchEnd=function(g){if(!a){return}e(g,"mouseup");e(g,"mouseout");if(!this._touchMoved){e(g,"click")}a=false};d._mouseInit=function(){var g=this;g.element.bind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});f.call(g)};d._mouseDestroy=function(){var g=this;g.element.unbind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});c.call(g)}})(jQuery);/*! + * SmartMenus jQuery Plugin - v1.0.0 - January 27, 2016 + * http://www.smartmenus.org/ + * + * Copyright Vasil Dinkov, Vadikom Web Ltd. + * http://vadikom.com + * + * Licensed MIT + */ +(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('
    ').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a(" +
    + + +
    +
    +
    WiiCameraReadme
    +
    +
    +

    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.

    +

    This library is large, if you run into memory problems when uploading to the Arduino, disable serial debugging.

    +

    To enable the IR camera code, simply set ENABLE_WII_IR_CAMERA to 1 in settings.h.

    +

    This library implements the following settings:

    +
      +
    • Report sensitivity mode: 00 00 00 00 00 00 90 00 41 40 00 Suggested by inio (high sensitivity)
    • +
    • Data Format: Extended mode (0x03). Full mode is not working yet. The output reports 0x3e and 0x3f need tampering with
        +
      • In this mode the camera outputs x and y coordinates and a size dimension for the 4 brightest points.
      • +
      +
    • +
    +

    Again, read through http://wiibrew.org/wiki/Wiimote#IR_Camera to get an understanding of the camera and its settings.

    +
    + + + + diff --git a/menu.js b/menu.js new file mode 100644 index 00000000..89aaf575 --- /dev/null +++ b/menu.js @@ -0,0 +1,50 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 00000000..c758126b --- /dev/null +++ b/menudata.js @@ -0,0 +1,196 @@ +/* +@ @licstart The following is the entire license notice for the +JavaScript code in this file. + +Copyright (C) 1997-2017 by Dimitri van Heesch + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +@licend The above is the entire license notice +for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__"}, +{text:"a",url:"functions_a.html#index_a"}, +{text:"b",url:"functions_b.html#index_b"}, +{text:"c",url:"functions_c.html#index_c"}, +{text:"d",url:"functions_d.html#index_d"}, +{text:"e",url:"functions_e.html#index_e"}, +{text:"f",url:"functions_f.html#index_f"}, +{text:"g",url:"functions_g.html#index_g"}, +{text:"h",url:"functions_h.html#index_h"}, +{text:"i",url:"functions_i.html#index_i"}, +{text:"k",url:"functions_k.html#index_k"}, +{text:"l",url:"functions_l.html#index_l"}, +{text:"m",url:"functions_m.html#index_m"}, +{text:"n",url:"functions_n.html#index_n"}, +{text:"o",url:"functions_o.html#index_o"}, +{text:"p",url:"functions_p.html#index_p"}, +{text:"q",url:"functions_q.html#index_q"}, +{text:"r",url:"functions_r.html#index_r"}, +{text:"s",url:"functions_s.html#index_s"}, +{text:"t",url:"functions_t.html#index_t"}, +{text:"u",url:"functions_u.html#index_u"}, +{text:"v",url:"functions_v.html#index_v"}, +{text:"w",url:"functions_w.html#index_w"}, +{text:"x",url:"functions_x.html#index_x"}, +{text:"y",url:"functions_y.html#index_y"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"b",url:"functions_func_b.html#index_b"}, +{text:"c",url:"functions_func_c.html#index_c"}, +{text:"d",url:"functions_func_d.html#index_d"}, +{text:"e",url:"functions_func_e.html#index_e"}, +{text:"f",url:"functions_func_f.html#index_f"}, +{text:"g",url:"functions_func_g.html#index_g"}, +{text:"h",url:"functions_func_h.html#index_h"}, +{text:"i",url:"functions_func_i.html#index_i"}, +{text:"k",url:"functions_func_k.html#index_k"}, +{text:"l",url:"functions_func_l.html#index_l"}, +{text:"m",url:"functions_func_m.html#index_m"}, +{text:"n",url:"functions_func_n.html#index_n"}, +{text:"o",url:"functions_func_o.html#index_o"}, +{text:"p",url:"functions_func_p.html#index_p"}, +{text:"r",url:"functions_func_r.html#index_r"}, +{text:"s",url:"functions_func_s.html#index_s"}, +{text:"t",url:"functions_func_t.html#index_t"}, +{text:"u",url:"functions_func_u.html#index_u"}, +{text:"v",url:"functions_func_v.html#index_v"}, +{text:"w",url:"functions_func_w.html#index_w"}, +{text:"x",url:"functions_func_x.html#index_x"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"_",url:"functions_vars.html#index__"}, +{text:"a",url:"functions_vars_a.html#index_a"}, +{text:"b",url:"functions_vars_b.html#index_b"}, +{text:"c",url:"functions_vars_c.html#index_c"}, +{text:"d",url:"functions_vars_d.html#index_d"}, +{text:"e",url:"functions_vars_e.html#index_e"}, +{text:"f",url:"functions_vars_f.html#index_f"}, +{text:"g",url:"functions_vars_g.html#index_g"}, +{text:"h",url:"functions_vars_h.html#index_h"}, +{text:"i",url:"functions_vars_i.html#index_i"}, +{text:"k",url:"functions_vars_k.html#index_k"}, +{text:"l",url:"functions_vars_l.html#index_l"}, +{text:"m",url:"functions_vars_m.html#index_m"}, +{text:"n",url:"functions_vars_n.html#index_n"}, +{text:"o",url:"functions_vars_o.html#index_o"}, +{text:"p",url:"functions_vars_p.html#index_p"}, +{text:"q",url:"functions_vars_q.html#index_q"}, +{text:"r",url:"functions_vars_r.html#index_r"}, +{text:"s",url:"functions_vars_s.html#index_s"}, +{text:"t",url:"functions_vars_t.html#index_t"}, +{text:"u",url:"functions_vars_u.html#index_u"}, +{text:"v",url:"functions_vars_v.html#index_v"}, +{text:"w",url:"functions_vars_w.html#index_w"}, +{text:"x",url:"functions_vars_x.html#index_x"}, +{text:"y",url:"functions_vars_y.html#index_y"}]}, +{text:"Typedefs",url:"functions_type.html"}, +{text:"Enumerations",url:"functions_enum.html"}, +{text:"Enumerator",url:"functions_eval.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"_",url:"globals.html#index__"}, +{text:"a",url:"globals_a.html#index_a"}, +{text:"b",url:"globals_b.html#index_b"}, +{text:"c",url:"globals_c.html#index_c"}, +{text:"d",url:"globals_d.html#index_d"}, +{text:"e",url:"globals_e.html#index_e"}, +{text:"f",url:"globals_f.html#index_f"}, +{text:"g",url:"globals_g.html#index_g"}, +{text:"h",url:"globals_h.html#index_h"}, +{text:"i",url:"globals_i.html#index_i"}, +{text:"j",url:"globals_j.html#index_j"}, +{text:"k",url:"globals_k.html#index_k"}, +{text:"l",url:"globals_l.html#index_l"}, +{text:"m",url:"globals_m.html#index_m"}, +{text:"n",url:"globals_n.html#index_n"}, +{text:"o",url:"globals_o.html#index_o"}, +{text:"p",url:"globals_p.html#index_p"}, +{text:"r",url:"globals_r.html#index_r"}, +{text:"s",url:"globals_s.html#index_s"}, +{text:"t",url:"globals_t.html#index_t"}, +{text:"u",url:"globals_u.html#index_u"}, +{text:"v",url:"globals_v.html#index_v"}, +{text:"w",url:"globals_w.html#index_w"}, +{text:"x",url:"globals_x.html#index_x"}, +{text:"y",url:"globals_y.html#index_y"}, +{text:"z",url:"globals_z.html#index_z"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Variables",url:"globals_vars.html",children:[ +{text:"p",url:"globals_vars.html#index_p"}, +{text:"r",url:"globals_vars_r.html#index_r"}, +{text:"u",url:"globals_vars_u.html#index_u"}, +{text:"w",url:"globals_vars_w.html#index_w"}, +{text:"x",url:"globals_vars_x.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html",children:[ +{text:"a",url:"globals_eval.html#index_a"}, +{text:"b",url:"globals_eval.html#index_b"}, +{text:"c",url:"globals_eval.html#index_c"}, +{text:"d",url:"globals_eval.html#index_d"}, +{text:"f",url:"globals_eval.html#index_f"}, +{text:"g",url:"globals_eval.html#index_g"}, +{text:"h",url:"globals_eval.html#index_h"}, +{text:"k",url:"globals_eval.html#index_k"}, +{text:"l",url:"globals_eval.html#index_l"}, +{text:"m",url:"globals_eval.html#index_m"}, +{text:"n",url:"globals_eval.html#index_n"}, +{text:"o",url:"globals_eval.html#index_o"}, +{text:"p",url:"globals_eval.html#index_p"}, +{text:"r",url:"globals_eval.html#index_r"}, +{text:"s",url:"globals_eval.html#index_s"}, +{text:"t",url:"globals_eval.html#index_t"}, +{text:"u",url:"globals_eval.html#index_u"}, +{text:"v",url:"globals_eval.html#index_v"}, +{text:"w",url:"globals_eval.html#index_w"}, +{text:"x",url:"globals_eval.html#index_x"}, +{text:"y",url:"globals_eval.html#index_y"}, +{text:"z",url:"globals_eval.html#index_z"}]}, +{text:"Macros",url:"globals_defs.html",children:[ +{text:"_",url:"globals_defs.html#index__"}, +{text:"a",url:"globals_defs_a.html#index_a"}, +{text:"b",url:"globals_defs_b.html#index_b"}, +{text:"c",url:"globals_defs_c.html#index_c"}, +{text:"d",url:"globals_defs_d.html#index_d"}, +{text:"e",url:"globals_defs_e.html#index_e"}, +{text:"f",url:"globals_defs_f.html#index_f"}, +{text:"g",url:"globals_defs_g.html#index_g"}, +{text:"h",url:"globals_defs_h.html#index_h"}, +{text:"i",url:"globals_defs_i.html#index_i"}, +{text:"j",url:"globals_defs_j.html#index_j"}, +{text:"k",url:"globals_defs_k.html#index_k"}, +{text:"l",url:"globals_defs_l.html#index_l"}, +{text:"m",url:"globals_defs_m.html#index_m"}, +{text:"n",url:"globals_defs_n.html#index_n"}, +{text:"o",url:"globals_defs_o.html#index_o"}, +{text:"p",url:"globals_defs_p.html#index_p"}, +{text:"r",url:"globals_defs_r.html#index_r"}, +{text:"s",url:"globals_defs_s.html#index_s"}, +{text:"t",url:"globals_defs_t.html#index_t"}, +{text:"u",url:"globals_defs_u.html#index_u"}, +{text:"v",url:"globals_defs_v.html#index_v"}, +{text:"w",url:"globals_defs_w.html#index_w"}, +{text:"x",url:"globals_defs_x.html#index_x"}]}]}]}]} diff --git a/message_8cpp.html b/message_8cpp.html index 8a9c0e1f..745def40 100644 --- a/message_8cpp.html +++ b/message_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: message.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
     

    Function Documentation

    - + +

    ◆ E_Notifyc()

    +
    @@ -148,11 +130,13 @@ Variables
    -

    Definition at line 24 of file message.cpp.

    +

    Definition at line 31 of file message.cpp.

    - + +

    ◆ E_Notify() [1/3]

    +
    @@ -176,11 +160,13 @@ Variables
    -

    Definition at line 34 of file message.cpp.

    +

    Definition at line 41 of file message.cpp.

    - + +

    ◆ E_NotifyStr()

    +
    @@ -204,11 +190,13 @@ Variables
    -

    Definition at line 42 of file message.cpp.

    +

    Definition at line 49 of file message.cpp.

    - + +

    ◆ E_Notify() [2/3]

    +
    @@ -232,11 +220,13 @@ Variables
    -

    Definition at line 50 of file message.cpp.

    +

    Definition at line 57 of file message.cpp.

    - + +

    ◆ E_Notify() [3/3]

    +
    @@ -260,12 +250,14 @@ Variables
    -

    Definition at line 60 of file message.cpp.

    +

    Definition at line 67 of file message.cpp.

    Variable Documentation

    - + +

    ◆ UsbDEBUGlvl

    +
    @@ -275,7 +267,7 @@ Variables
    -

    Definition at line 22 of file message.cpp.

    +

    Definition at line 29 of file message.cpp.

    @@ -284,7 +276,7 @@ Variables diff --git a/message_8cpp__incl.md5 b/message_8cpp__incl.md5 index eaddf38a..5577f8dd 100644 --- a/message_8cpp__incl.md5 +++ b/message_8cpp__incl.md5 @@ -1 +1 @@ -cf24426f0f48ee21386b9f704dde4bb5 \ No newline at end of file +8dfd0a2f9c402eac5b70227f63e9b2d4 \ No newline at end of file diff --git a/message_8cpp__incl.png b/message_8cpp__incl.png index 133047b154324be211b2c726dfd59a26a8bb4e0d..0b8de39901432824d32af8fc900a4b8853263355 100644 GIT binary patch literal 3452 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 Sps?R5fR>uBYOS(e%zpqIuCHPM literal 3462 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 - + + USB Host Shield 2.0: message.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    message.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 "Usb.h"
    19 // 0x80 is the default (i.e. trace) to turn off set this global to something lower.
    20 // this allows for 126 other debugging levels.
    21 // TO-DO: Allow assignment to a different serial port by software
    22 int UsbDEBUGlvl = 0x80;
    23 
    24 void E_Notifyc(char c, int lvl) {
    25  if(UsbDEBUGlvl < lvl) return;
    26 #if defined(ARDUINO) && ARDUINO >=100
    27  USB_HOST_SERIAL.print(c);
    28 #else
    29  USB_HOST_SERIAL.print(c, BYTE);
    30 #endif
    31  //USB_HOST_SERIAL.flush();
    32 }
    33 
    34 void E_Notify(char const * msg, int lvl) {
    35  if(UsbDEBUGlvl < lvl) return;
    36  if(!msg) return;
    37  char c;
    38 
    39  while((c = pgm_read_byte(msg++))) E_Notifyc(c, lvl);
    40 }
    41 
    42 void E_NotifyStr(char const * msg, int lvl) {
    43  if(UsbDEBUGlvl < lvl) return;
    44  if(!msg) return;
    45  char c;
    46 
    47  while((c = *msg++)) E_Notifyc(c, lvl);
    48 }
    49 
    50 void E_Notify(uint8_t b, int lvl) {
    51  if(UsbDEBUGlvl < lvl) return;
    52 #if defined(ARDUINO) && ARDUINO >=100
    53  USB_HOST_SERIAL.print(b);
    54 #else
    55  USB_HOST_SERIAL.print(b, DEC);
    56 #endif
    57  //USB_HOST_SERIAL.flush();
    58 }
    59 
    60 void E_Notify(double d, int lvl) {
    61  if(UsbDEBUGlvl < lvl) return;
    62  USB_HOST_SERIAL.print(d);
    63  //USB_HOST_SERIAL.flush();
    64 }
    65 
    66 #ifdef DEBUG_USB_HOST
    67 
    68 void NotifyFailGetDevDescr(void) {
    69  Notify(PSTR("\r\ngetDevDescr "), 0x80);
    70 }
    71 
    72 void NotifyFailSetDevTblEntry(void) {
    73  Notify(PSTR("\r\nsetDevTblEn "), 0x80);
    74 }
    75 
    76 void NotifyFailGetConfDescr(void) {
    77  Notify(PSTR("\r\ngetConf "), 0x80);
    78 }
    79 
    80 void NotifyFailSetConfDescr(void) {
    81  Notify(PSTR("\r\nsetConf "), 0x80);
    82 }
    83 
    84 void NotifyFailGetDevDescr(uint8_t reason) {
    86  NotifyFail(reason);
    87 }
    88 
    89 void NotifyFailSetDevTblEntry(uint8_t reason) {
    91  NotifyFail(reason);
    92 
    93 }
    94 
    95 void NotifyFailGetConfDescr(uint8_t reason) {
    97  NotifyFail(reason);
    98 }
    99 
    100 void NotifyFailSetConfDescr(uint8_t reason) {
    102  NotifyFail(reason);
    103 }
    104 
    105 void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID) {
    106  Notify(PSTR("\r\nUnknown Device Connected - VID: "), 0x80);
    107  D_PrintHex<uint16_t > (VID, 0x80);
    108  Notify(PSTR(" PID: "), 0x80);
    109  D_PrintHex<uint16_t > (PID, 0x80);
    110 }
    111 
    112 void NotifyFail(uint8_t rcode) {
    113  D_PrintHex<uint8_t > (rcode, 0x80);
    114  Notify(PSTR("\r\n"), 0x80);
    115 }
    116 #endif
    void E_NotifyStr(char const *msg, int lvl)
    Definition: message.cpp:42
    -
    #define NotifyFail(...)
    Definition: message.h:55
    +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 #include "Usb.h"
    26 // 0x80 is the default (i.e. trace) to turn off set this global to something lower.
    27 // this allows for 126 other debugging levels.
    28 // TO-DO: Allow assignment to a different serial port by software
    29 int UsbDEBUGlvl = 0x80;
    30 
    31 void E_Notifyc(char c, int lvl) {
    32  if(UsbDEBUGlvl < lvl) return;
    33 #if defined(ARDUINO) && ARDUINO >=100
    34  USB_HOST_SERIAL.print(c);
    35 #else
    36  USB_HOST_SERIAL.print(c, BYTE);
    37 #endif
    38  //USB_HOST_SERIAL.flush();
    39 }
    40 
    41 void E_Notify(char const * msg, int lvl) {
    42  if(UsbDEBUGlvl < lvl) return;
    43  if(!msg) return;
    44  char c;
    45 
    46  while((c = pgm_read_byte(msg++))) E_Notifyc(c, lvl);
    47 }
    48 
    49 void E_NotifyStr(char const * msg, int lvl) {
    50  if(UsbDEBUGlvl < lvl) return;
    51  if(!msg) return;
    52  char c;
    53 
    54  while((c = *msg++)) E_Notifyc(c, lvl);
    55 }
    56 
    57 void E_Notify(uint8_t b, int lvl) {
    58  if(UsbDEBUGlvl < lvl) return;
    59 #if defined(ARDUINO) && ARDUINO >=100
    60  USB_HOST_SERIAL.print(b);
    61 #else
    62  USB_HOST_SERIAL.print(b, DEC);
    63 #endif
    64  //USB_HOST_SERIAL.flush();
    65 }
    66 
    67 void E_Notify(double d, int lvl) {
    68  if(UsbDEBUGlvl < lvl) return;
    69  USB_HOST_SERIAL.print(d);
    70  //USB_HOST_SERIAL.flush();
    71 }
    72 
    73 #ifdef DEBUG_USB_HOST
    74 
    75 void NotifyFailGetDevDescr(void) {
    76  Notify(PSTR("\r\ngetDevDescr "), 0x80);
    77 }
    78 
    79 void NotifyFailSetDevTblEntry(void) {
    80  Notify(PSTR("\r\nsetDevTblEn "), 0x80);
    81 }
    82 
    83 void NotifyFailGetConfDescr(void) {
    84  Notify(PSTR("\r\ngetConf "), 0x80);
    85 }
    86 
    87 void NotifyFailSetConfDescr(void) {
    88  Notify(PSTR("\r\nsetConf "), 0x80);
    89 }
    90 
    91 void NotifyFailGetDevDescr(uint8_t reason) {
    93  NotifyFail(reason);
    94 }
    95 
    96 void NotifyFailSetDevTblEntry(uint8_t reason) {
    98  NotifyFail(reason);
    99 
    100 }
    101 
    102 void NotifyFailGetConfDescr(uint8_t reason) {
    104  NotifyFail(reason);
    105 }
    106 
    107 void NotifyFailSetConfDescr(uint8_t reason) {
    109  NotifyFail(reason);
    110 }
    111 
    112 void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID) {
    113  Notify(PSTR("\r\nUnknown Device Connected - VID: "), 0x80);
    114  D_PrintHex<uint16_t > (VID, 0x80);
    115  Notify(PSTR(" PID: "), 0x80);
    116  D_PrintHex<uint16_t > (PID, 0x80);
    117 }
    118 
    119 void NotifyFail(uint8_t rcode) {
    120  D_PrintHex<uint8_t > (rcode, 0x80);
    121  Notify(PSTR("\r\n"), 0x80);
    122 }
    123 #endif
    void E_NotifyStr(char const *msg, int lvl)
    Definition: message.cpp:49
    +
    #define NotifyFail(...)
    Definition: message.h:62
    -
    #define pgm_read_byte(addr)
    -
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    -
    void E_Notifyc(char c, int lvl)
    Definition: message.cpp:24
    -
    #define Notify(...)
    Definition: message.h:44
    -
    #define USB_HOST_SERIAL
    Definition: settings.h:34
    -
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    -
    #define NotifyFailUnknownDevice(...)
    Definition: message.h:54
    -
    #define PSTR(str)
    -
    void E_Notify(char const *msg, int lvl)
    Definition: message.cpp:34
    -
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    -
    int UsbDEBUGlvl
    Definition: message.cpp:22
    -
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    +
    #define pgm_read_byte(addr)
    +
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:57
    +
    void E_Notifyc(char c, int lvl)
    Definition: message.cpp:31
    +
    #define Notify(...)
    Definition: message.h:51
    +
    #define USB_HOST_SERIAL
    Definition: settings.h:49
    +
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:59
    +
    #define NotifyFailUnknownDevice(...)
    Definition: message.h:61
    +
    #define PSTR(str)
    +
    void E_Notify(char const *msg, int lvl)
    Definition: message.cpp:41
    +
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:60
    +
    int UsbDEBUGlvl
    Definition: message.cpp:29
    +
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:58
    diff --git a/message_8h.html b/message_8h.html index ddf40998..4d508b58 100644 --- a/message_8h.html +++ b/message_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: message.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Macro Definition Documentation

    - + +

    ◆ Notify

    +
    @@ -161,11 +143,13 @@ Variables
    -

    Definition at line 44 of file message.h.

    +

    Definition at line 51 of file message.h.

    - + +

    ◆ NotifyStr

    +
    @@ -179,11 +163,13 @@ Variables
    -

    Definition at line 45 of file message.h.

    +

    Definition at line 52 of file message.h.

    - + +

    ◆ Notifyc

    +
    @@ -197,11 +183,13 @@ Variables
    -

    Definition at line 46 of file message.h.

    +

    Definition at line 53 of file message.h.

    - + +

    ◆ NotifyFailGetDevDescr [1/2]

    +
    @@ -215,11 +203,13 @@ Variables
    -

    Definition at line 50 of file message.h.

    +

    Definition at line 57 of file message.h.

    - + +

    ◆ NotifyFailSetDevTblEntry [1/2]

    +
    @@ -233,11 +223,13 @@ Variables
    -

    Definition at line 51 of file message.h.

    +

    Definition at line 58 of file message.h.

    - + +

    ◆ NotifyFailGetConfDescr [1/2]

    +
    @@ -251,11 +243,13 @@ Variables
    -

    Definition at line 52 of file message.h.

    +

    Definition at line 59 of file message.h.

    - + +

    ◆ NotifyFailGetDevDescr [2/2]

    +
    @@ -269,11 +263,13 @@ Variables
    -

    Definition at line 50 of file message.h.

    +

    Definition at line 57 of file message.h.

    - + +

    ◆ NotifyFailSetDevTblEntry [2/2]

    +
    @@ -287,11 +283,13 @@ Variables
    -

    Definition at line 51 of file message.h.

    +

    Definition at line 58 of file message.h.

    - + +

    ◆ NotifyFailGetConfDescr [2/2]

    +
    @@ -305,11 +303,13 @@ Variables
    -

    Definition at line 52 of file message.h.

    +

    Definition at line 59 of file message.h.

    - + +

    ◆ NotifyFailSetConfDescr

    +
    @@ -323,11 +323,13 @@ Variables
    -

    Definition at line 53 of file message.h.

    +

    Definition at line 60 of file message.h.

    - + +

    ◆ NotifyFailUnknownDevice

    +
    @@ -341,11 +343,13 @@ Variables
    -

    Definition at line 54 of file message.h.

    +

    Definition at line 61 of file message.h.

    - + +

    ◆ NotifyFail

    +
    @@ -359,12 +363,14 @@ Variables
    -

    Definition at line 55 of file message.h.

    +

    Definition at line 62 of file message.h.

    Function Documentation

    - + +

    ◆ E_Notify() [1/2]

    +
    @@ -388,11 +394,13 @@ Variables
    -

    Definition at line 34 of file message.cpp.

    +

    Definition at line 41 of file message.cpp.

    - + +

    ◆ E_Notify() [2/2]

    +
    @@ -416,11 +424,13 @@ Variables
    -

    Definition at line 50 of file message.cpp.

    +

    Definition at line 57 of file message.cpp.

    - + +

    ◆ E_NotifyStr()

    +
    @@ -444,11 +454,13 @@ Variables
    -

    Definition at line 42 of file message.cpp.

    +

    Definition at line 49 of file message.cpp.

    - + +

    ◆ E_Notifyc()

    +
    @@ -472,11 +484,13 @@ Variables
    -

    Definition at line 24 of file message.cpp.

    +

    Definition at line 31 of file message.cpp.

    - + +

    ◆ ErrorMessage() [1/2]

    +
    @@ -508,11 +522,13 @@ template<class ERROR_TYPE >
    -

    Definition at line 59 of file message.h.

    +

    Definition at line 66 of file message.h.

    - + +

    ◆ ErrorMessage() [2/2]

    +
    @@ -538,12 +554,14 @@ template<class ERROR_TYPE >
    -

    Definition at line 69 of file message.h.

    +

    Definition at line 76 of file message.h.

    Variable Documentation

    - + +

    ◆ UsbDEBUGlvl

    +
    @@ -553,7 +571,7 @@ template<class ERROR_TYPE >
    -

    Definition at line 22 of file message.cpp.

    +

    Definition at line 29 of file message.cpp.

    @@ -562,7 +580,7 @@ template<class ERROR_TYPE >
    diff --git a/message_8h_source.html b/message_8h_source.html index 51bcfd64..215499b1 100644 --- a/message_8h_source.html +++ b/message_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: message.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
    message.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(_usb_h_) || defined(__MESSAGE_H__)
    18 #error "Never include message.h directly; include Usb.h instead"
    19 #else
    20 #define __MESSAGE_H__
    21 
    22 extern int UsbDEBUGlvl;
    23 
    24 void E_Notify(char const * msg, int lvl);
    25 void E_Notify(uint8_t b, int lvl);
    26 void E_NotifyStr(char const * msg, int lvl);
    27 void E_Notifyc(char c, int lvl);
    28 
    29 #ifdef DEBUG_USB_HOST
    30 #define Notify E_Notify
    31 #define NotifyStr E_NotifyStr
    32 #define Notifyc E_Notifyc
    33 void NotifyFailGetDevDescr(uint8_t reason);
    34 void NotifyFailSetDevTblEntry(uint8_t reason);
    35 void NotifyFailGetConfDescr(uint8_t reason);
    36 void NotifyFailSetConfDescr(uint8_t reason);
    37 void NotifyFailGetDevDescr(void);
    38 void NotifyFailSetDevTblEntry(void);
    39 void NotifyFailGetConfDescr(void);
    40 void NotifyFailSetConfDescr(void);
    41 void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID);
    42 void NotifyFail(uint8_t rcode);
    43 #else
    44 #define Notify(...) ((void)0)
    45 #define NotifyStr(...) ((void)0)
    46 #define Notifyc(...) ((void)0)
    47 #define NotifyFailGetDevDescr(...) ((void)0)
    48 #define NotifyFailSetDevTblEntry(...) ((void)0)
    49 #define NotifyFailGetConfDescr(...) ((void)0)
    50 #define NotifyFailGetDevDescr(...) ((void)0)
    51 #define NotifyFailSetDevTblEntry(...) ((void)0)
    52 #define NotifyFailGetConfDescr(...) ((void)0)
    53 #define NotifyFailSetConfDescr(...) ((void)0)
    54 #define NotifyFailUnknownDevice(...) ((void)0)
    55 #define NotifyFail(...) ((void)0)
    56 #endif
    57 
    58 template <class ERROR_TYPE>
    59 void ErrorMessage(uint8_t level, char const * msg, ERROR_TYPE rcode = 0) {
    60 #ifdef DEBUG_USB_HOST
    61  Notify(msg, level);
    62  Notify(PSTR(": "), level);
    63  D_PrintHex<ERROR_TYPE > (rcode, level);
    64  Notify(PSTR("\r\n"), level);
    65 #endif
    66 }
    67 
    68 template <class ERROR_TYPE>
    69 void ErrorMessage(char const * msg, ERROR_TYPE rcode = 0) {
    70 #ifdef DEBUG_USB_HOST
    71  Notify(msg, 0x80);
    72  Notify(PSTR(": "), 0x80);
    73  D_PrintHex<ERROR_TYPE > (rcode, 0x80);
    74  Notify(PSTR("\r\n"), 0x80);
    75 #endif
    76 }
    77 
    78 #endif // __MESSAGE_H__
    void E_Notify(char const *msg, int lvl)
    Definition: message.cpp:34
    -
    #define NotifyFail(...)
    Definition: message.h:55
    -
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    -
    void E_NotifyStr(char const *msg, int lvl)
    Definition: message.cpp:42
    -
    #define Notify(...)
    Definition: message.h:44
    -
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    -
    #define NotifyFailUnknownDevice(...)
    Definition: message.h:54
    -
    void E_Notifyc(char c, int lvl)
    Definition: message.cpp:24
    -
    #define PSTR(str)
    -
    int UsbDEBUGlvl
    Definition: message.cpp:22
    -
    void ErrorMessage(uint8_t level, char const *msg, ERROR_TYPE rcode=0)
    Definition: message.h:59
    -
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    -
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    +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(__MESSAGE_H__)
    25 #error "Never include message.h directly; include Usb.h instead"
    26 #else
    27 #define __MESSAGE_H__
    28 
    29 extern int UsbDEBUGlvl;
    30 
    31 void E_Notify(char const * msg, int lvl);
    32 void E_Notify(uint8_t b, int lvl);
    33 void E_NotifyStr(char const * msg, int lvl);
    34 void E_Notifyc(char c, int lvl);
    35 
    36 #ifdef DEBUG_USB_HOST
    37 #define Notify E_Notify
    38 #define NotifyStr E_NotifyStr
    39 #define Notifyc E_Notifyc
    40 void NotifyFailGetDevDescr(uint8_t reason);
    41 void NotifyFailSetDevTblEntry(uint8_t reason);
    42 void NotifyFailGetConfDescr(uint8_t reason);
    43 void NotifyFailSetConfDescr(uint8_t reason);
    44 void NotifyFailGetDevDescr(void);
    45 void NotifyFailSetDevTblEntry(void);
    46 void NotifyFailGetConfDescr(void);
    47 void NotifyFailSetConfDescr(void);
    48 void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID);
    49 void NotifyFail(uint8_t rcode);
    50 #else
    51 #define Notify(...) ((void)0)
    52 #define NotifyStr(...) ((void)0)
    53 #define Notifyc(...) ((void)0)
    54 #define NotifyFailGetDevDescr(...) ((void)0)
    55 #define NotifyFailSetDevTblEntry(...) ((void)0)
    56 #define NotifyFailGetConfDescr(...) ((void)0)
    57 #define NotifyFailGetDevDescr(...) ((void)0)
    58 #define NotifyFailSetDevTblEntry(...) ((void)0)
    59 #define NotifyFailGetConfDescr(...) ((void)0)
    60 #define NotifyFailSetConfDescr(...) ((void)0)
    61 #define NotifyFailUnknownDevice(...) ((void)0)
    62 #define NotifyFail(...) ((void)0)
    63 #endif
    64 
    65 template <class ERROR_TYPE>
    66 void ErrorMessage(uint8_t level, char const * msg, ERROR_TYPE rcode = 0) {
    67 #ifdef DEBUG_USB_HOST
    68  Notify(msg, level);
    69  Notify(PSTR(": "), level);
    70  D_PrintHex<ERROR_TYPE > (rcode, level);
    71  Notify(PSTR("\r\n"), level);
    72 #endif
    73 }
    74 
    75 template <class ERROR_TYPE>
    76 void ErrorMessage(char const * msg __attribute__((unused)), ERROR_TYPE rcode __attribute__((unused)) = 0) {
    77 #ifdef DEBUG_USB_HOST
    78  Notify(msg, 0x80);
    79  Notify(PSTR(": "), 0x80);
    80  D_PrintHex<ERROR_TYPE > (rcode, 0x80);
    81  Notify(PSTR("\r\n"), 0x80);
    82 #endif
    83 }
    84 
    85 #endif // __MESSAGE_H__
    void E_Notify(char const *msg, int lvl)
    Definition: message.cpp:41
    +
    #define NotifyFail(...)
    Definition: message.h:62
    +
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:57
    +
    void E_NotifyStr(char const *msg, int lvl)
    Definition: message.cpp:49
    +
    #define Notify(...)
    Definition: message.h:51
    +
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:59
    +
    #define NotifyFailUnknownDevice(...)
    Definition: message.h:61
    +
    void E_Notifyc(char c, int lvl)
    Definition: message.cpp:31
    +
    #define PSTR(str)
    +
    int UsbDEBUGlvl
    Definition: message.cpp:29
    +
    void ErrorMessage(uint8_t level, char const *msg, ERROR_TYPE rcode=0)
    Definition: message.h:66
    +
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:60
    +
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:58
    diff --git a/pages.html b/pages.html index d134310c..9a73081d 100644 --- a/pages.html +++ b/pages.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Related Pages @@ -11,9 +12,6 @@ - @@ -32,34 +30,22 @@
    - + - + + + +
    Here is a list of all related documentation pages:
    @@ -90,7 +76,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/parsetools_8cpp.html b/parsetools_8cpp.html index a84fa644..906bea83 100644 --- a/parsetools_8cpp.html +++ b/parsetools_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: parsetools.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
    diff --git a/parsetools_8cpp__incl.md5 b/parsetools_8cpp__incl.md5 index 6b33ed81..6156c826 100644 --- a/parsetools_8cpp__incl.md5 +++ b/parsetools_8cpp__incl.md5 @@ -1 +1 @@ -f52981a37509b50aa32fe60062bf932d \ No newline at end of file +a3293fd6ab335a9b25f5cff9388a7952 \ No newline at end of file diff --git a/parsetools_8cpp__incl.png b/parsetools_8cpp__incl.png index 9b9c69fc5106587448fbae1042139a9064003729..30f8e858222fa3a9274127a7557accffce3cd33e 100644 GIT binary patch literal 3531 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 M&@t7n*K&yaA7#e7^#A|> literal 3537 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 E2kSuBBme*a diff --git a/parsetools_8cpp_source.html b/parsetools_8cpp_source.html index dcb22d32..3ba385ef 100644 --- a/parsetools_8cpp_source.html +++ b/parsetools_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: parsetools.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    parsetools.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 "Usb.h"
    18 
    19 bool MultiByteValueParser::Parse(uint8_t **pp, uint16_t *pcntdn) {
    20  if(!pBuf) {
    21  Notify(PSTR("Buffer pointer is NULL!\r\n"), 0x80);
    22  return false;
    23  }
    24  for(; countDown && (*pcntdn); countDown--, (*pcntdn)--, (*pp)++)
    25  pBuf[valueSize - countDown] = (**pp);
    26 
    27  if(countDown)
    28  return false;
    29 
    30  countDown = valueSize;
    31  return true;
    32 }
    33 
    34 bool PTPListParser::Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me) {
    35  switch(nStage) {
    36  case 0:
    37  pBuf->valueSize = lenSize;
    38  theParser.Initialize(pBuf);
    39  nStage = 1;
    40 
    41  case 1:
    42  if(!theParser.Parse(pp, pcntdn))
    43  return false;
    44 
    45  arLen = 0;
    46  arLen = (pBuf->valueSize >= 4) ? *((uint32_t*)pBuf->pValue) : (uint32_t)(*((uint16_t*)pBuf->pValue));
    47  arLenCntdn = arLen;
    48  nStage = 2;
    49 
    50  case 2:
    51  pBuf->valueSize = valSize;
    52  theParser.Initialize(pBuf);
    53  nStage = 3;
    54 
    55  case 3:
    56  for(; arLenCntdn; arLenCntdn--) {
    57  if(!theParser.Parse(pp, pcntdn))
    58  return false;
    59 
    60  if(pf)
    61  pf(pBuf, (arLen - arLenCntdn), me);
    62  }
    63 
    64  nStage = 0;
    65  }
    66  return true;
    67 }
    void(* PTP_ARRAY_EL_FUNC)(const MultiValueBuffer *const p, uint32_t count, const void *me)
    Definition: parsetools.h:81
    +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 #include "Usb.h"
    25 
    26 bool MultiByteValueParser::Parse(uint8_t **pp, uint16_t *pcntdn) {
    27  if(!pBuf) {
    28  Notify(PSTR("Buffer pointer is NULL!\r\n"), 0x80);
    29  return false;
    30  }
    31  for(; countDown && (*pcntdn); countDown--, (*pcntdn)--, (*pp)++)
    32  pBuf[valueSize - countDown] = (**pp);
    33 
    34  if(countDown)
    35  return false;
    36 
    37  countDown = valueSize;
    38  return true;
    39 }
    40 
    41 bool PTPListParser::Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me) {
    42  switch(nStage) {
    43  case 0:
    44  pBuf->valueSize = lenSize;
    45  theParser.Initialize(pBuf);
    46  nStage = 1;
    47 
    48  case 1:
    49  if(!theParser.Parse(pp, pcntdn))
    50  return false;
    51 
    52  arLen = 0;
    53  arLen = (pBuf->valueSize >= 4) ? *((uint32_t*)pBuf->pValue) : (uint32_t)(*((uint16_t*)pBuf->pValue));
    54  arLenCntdn = arLen;
    55  nStage = 2;
    56 
    57  case 2:
    58  pBuf->valueSize = valSize;
    59  theParser.Initialize(pBuf);
    60  nStage = 3;
    61 
    62  case 3:
    63  for(; arLenCntdn; arLenCntdn--) {
    64  if(!theParser.Parse(pp, pcntdn))
    65  return false;
    66 
    67  if(pf)
    68  pf(pBuf, (arLen - arLenCntdn), me);
    69  }
    70 
    71  nStage = 0;
    72  }
    73  return true;
    74 }
    void(* PTP_ARRAY_EL_FUNC)(const MultiValueBuffer *const p, uint32_t count, const void *me)
    Definition: parsetools.h:88
    -
    #define Notify(...)
    Definition: message.h:44
    -
    bool Parse(uint8_t **pp, uint16_t *pcntdn)
    Definition: parsetools.cpp:19
    -
    #define PSTR(str)
    -
    bool Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me=NULL)
    Definition: parsetools.cpp:34
    +
    #define Notify(...)
    Definition: message.h:51
    +
    bool Parse(uint8_t **pp, uint16_t *pcntdn)
    Definition: parsetools.cpp:26
    +
    #define PSTR(str)
    +
    uint8_t valueSize
    Definition: parsetools.h:31
    +
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:49
    +
    bool Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me=NULL)
    Definition: parsetools.cpp:41
    +
    diff --git a/parsetools_8h.html b/parsetools_8h.html index 7ddc7cee..853802a7 100644 --- a/parsetools_8h.html +++ b/parsetools_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: parsetools.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Typedef Documentation

    - + +

    ◆ PTP_ARRAY_EL_FUNC

    +
    @@ -123,7 +105,7 @@ Typedefs
    -

    Definition at line 81 of file parsetools.h.

    +

    Definition at line 88 of file parsetools.h.

    @@ -132,7 +114,7 @@ Typedefs diff --git a/parsetools_8h_source.html b/parsetools_8h_source.html index bcfd67c9..e6449cc2 100644 --- a/parsetools_8h_source.html +++ b/parsetools_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: parsetools.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    parsetools.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(_usb_h_) || defined(__PARSETOOLS_H__)
    19 #error "Never include parsetools.h directly; include Usb.h instead"
    20 #else
    21 #define __PARSETOOLS_H__
    22 
    24  uint8_t valueSize;
    25  void *pValue;
    26 } __attribute__((packed));
    27 
    29  uint8_t * pBuf;
    30  uint8_t countDown;
    31  uint8_t valueSize;
    32 
    33 public:
    34 
    35  MultiByteValueParser() : pBuf(NULL), countDown(0), valueSize(0) {
    36  };
    37 
    38  const uint8_t* GetBuffer() {
    39  return pBuf;
    40  };
    41 
    42  void Initialize(MultiValueBuffer * const pbuf) {
    43  pBuf = (uint8_t*)pbuf->pValue;
    44  countDown = valueSize = pbuf->valueSize;
    45  };
    46 
    47  bool Parse(uint8_t **pp, uint16_t *pcntdn);
    48 };
    49 
    50 class ByteSkipper {
    51  uint8_t *pBuf;
    52  uint8_t nStage;
    53  uint16_t countDown;
    54 
    55 public:
    56 
    57  ByteSkipper() : pBuf(NULL), nStage(0), countDown(0) {
    58  };
    59 
    61  pBuf = (uint8_t*)pbuf->pValue;
    62  countDown = 0;
    63  };
    64 
    65  bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip) {
    66  switch(nStage) {
    67  case 0:
    68  countDown = bytes_to_skip;
    69  nStage++;
    70  case 1:
    71  for(; countDown && (*pcntdn); countDown--, (*pp)++, (*pcntdn)--);
    72 
    73  if(!countDown)
    74  nStage = 0;
    75  };
    76  return (!countDown);
    77  };
    78 };
    79 
    80 // Pointer to a callback function triggered for each element of PTP array when used with PTPArrayParser
    81 typedef void (*PTP_ARRAY_EL_FUNC)(const MultiValueBuffer * const p, uint32_t count, const void *me);
    82 
    84 public:
    85 
    86  enum ParseMode {
    87  modeArray, modeRange/*, modeEnum*/
    88  };
    89 
    90 private:
    91  uint8_t nStage;
    92  uint8_t enStage;
    93 
    94  uint32_t arLen;
    95  uint32_t arLenCntdn;
    96 
    97  uint8_t lenSize; // size of the array length field in bytes
    98  uint8_t valSize; // size of the array element in bytes
    99 
    100  MultiValueBuffer *pBuf;
    101 
    102  // The only parser for both size and array element parsing
    103  MultiByteValueParser theParser;
    104 
    105  uint8_t /*ParseMode*/ prsMode;
    106 
    107 public:
    108 
    110  nStage(0),
    111  enStage(0),
    112  arLen(0),
    113  arLenCntdn(0),
    114  lenSize(0),
    115  valSize(0),
    116  pBuf(NULL),
    117  prsMode(modeArray) {
    118  };
    119 
    120  void Initialize(const uint8_t len_size, const uint8_t val_size, MultiValueBuffer * const p, const uint8_t mode = modeArray) {
    121  pBuf = p;
    122  lenSize = len_size;
    123  valSize = val_size;
    124  prsMode = mode;
    125 
    126  if(prsMode == modeRange) {
    127  arLenCntdn = arLen = 3;
    128  nStage = 2;
    129  } else {
    130  arLenCntdn = arLen = 0;
    131  nStage = 0;
    132  }
    133  enStage = 0;
    134  theParser.Initialize(p);
    135  };
    136 
    137  bool Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me = NULL);
    138 };
    139 
    140 #endif // __PARSETOOLS_H__
    void(* PTP_ARRAY_EL_FUNC)(const MultiValueBuffer *const p, uint32_t count, const void *me)
    Definition: parsetools.h:81
    - -
    const uint8_t * GetBuffer()
    Definition: parsetools.h:38
    - - - -
    bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip)
    Definition: parsetools.h:65
    -
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:60
    - -
    void Initialize(const uint8_t len_size, const uint8_t val_size, MultiValueBuffer *const p, const uint8_t mode=modeArray)
    Definition: parsetools.h:120
    - -
    uint8_t valueSize
    Definition: parsetools.h:24
    -
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:42
    - - - +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(__PARSETOOLS_H__)
    26 #error "Never include parsetools.h directly; include Usb.h instead"
    27 #else
    28 #define __PARSETOOLS_H__
    29 
    31  uint8_t valueSize;
    32  void *pValue;
    33 } __attribute__((packed));
    34 
    36  uint8_t * pBuf;
    37  uint8_t countDown;
    38  uint8_t valueSize;
    39 
    40 public:
    41 
    42  MultiByteValueParser() : pBuf(NULL), countDown(0), valueSize(0) {
    43  };
    44 
    45  const uint8_t* GetBuffer() {
    46  return pBuf;
    47  };
    48 
    49  void Initialize(MultiValueBuffer * const pbuf) {
    50  pBuf = (uint8_t*)pbuf->pValue;
    51  countDown = valueSize = pbuf->valueSize;
    52  };
    53 
    54  bool Parse(uint8_t **pp, uint16_t *pcntdn);
    55 };
    56 
    57 class ByteSkipper {
    58  uint8_t *pBuf;
    59  uint8_t nStage;
    60  uint16_t countDown;
    61 
    62 public:
    63 
    64  ByteSkipper() : pBuf(NULL), nStage(0), countDown(0) {
    65  };
    66 
    68  pBuf = (uint8_t*)pbuf->pValue;
    69  countDown = 0;
    70  };
    71 
    72  bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip) {
    73  switch(nStage) {
    74  case 0:
    75  countDown = bytes_to_skip;
    76  nStage++;
    77  case 1:
    78  for(; countDown && (*pcntdn); countDown--, (*pp)++, (*pcntdn)--);
    79 
    80  if(!countDown)
    81  nStage = 0;
    82  };
    83  return (!countDown);
    84  };
    85 };
    86 
    87 // Pointer to a callback function triggered for each element of PTP array when used with PTPArrayParser
    88 typedef void (*PTP_ARRAY_EL_FUNC)(const MultiValueBuffer * const p, uint32_t count, const void *me);
    89 
    91 public:
    92 
    93  enum ParseMode {
    94  modeArray, modeRange/*, modeEnum*/
    95  };
    96 
    97 private:
    98  uint8_t nStage;
    99  uint8_t enStage;
    100 
    101  uint32_t arLen;
    102  uint32_t arLenCntdn;
    103 
    104  uint8_t lenSize; // size of the array length field in bytes
    105  uint8_t valSize; // size of the array element in bytes
    106 
    107  MultiValueBuffer *pBuf;
    108 
    109  // The only parser for both size and array element parsing
    110  MultiByteValueParser theParser;
    111 
    112  uint8_t /*ParseMode*/ prsMode;
    113 
    114 public:
    115 
    117  nStage(0),
    118  enStage(0),
    119  arLen(0),
    120  arLenCntdn(0),
    121  lenSize(0),
    122  valSize(0),
    123  pBuf(NULL),
    124  prsMode(modeArray) {
    125  };
    126 
    127  void Initialize(const uint8_t len_size, const uint8_t val_size, MultiValueBuffer * const p, const uint8_t mode = modeArray) {
    128  pBuf = p;
    129  lenSize = len_size;
    130  valSize = val_size;
    131  prsMode = mode;
    132 
    133  if(prsMode == modeRange) {
    134  arLenCntdn = arLen = 3;
    135  nStage = 2;
    136  } else {
    137  arLenCntdn = arLen = 0;
    138  nStage = 0;
    139  }
    140  enStage = 0;
    141  theParser.Initialize(p);
    142  };
    143 
    144  bool Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me = NULL);
    145 };
    146 
    147 #endif // __PARSETOOLS_H__
    void(* PTP_ARRAY_EL_FUNC)(const MultiValueBuffer *const p, uint32_t count, const void *me)
    Definition: parsetools.h:88
    + + +
    const uint8_t * GetBuffer()
    Definition: parsetools.h:45
    + + + +
    bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip)
    Definition: parsetools.h:72
    +
    void Initialize(MultiValueBuffer *pbuf)
    Definition: parsetools.h:67
    + +
    bool Parse(uint8_t **pp, uint16_t *pcntdn)
    Definition: parsetools.cpp:26
    +
    void Initialize(const uint8_t len_size, const uint8_t val_size, MultiValueBuffer *const p, const uint8_t mode=modeArray)
    Definition: parsetools.h:127
    + + +
    uint8_t valueSize
    Definition: parsetools.h:31
    +
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:49
    + + +
    bool Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me=NULL)
    Definition: parsetools.cpp:41
    +
    diff --git a/printhex_8h.html b/printhex_8h.html index 964e9576..ba336088 100644 --- a/printhex_8h.html +++ b/printhex_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: printhex.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Function Documentation

    - + +

    ◆ E_Notifyc()

    +
    @@ -143,11 +125,13 @@ Functions
    -

    Definition at line 24 of file message.cpp.

    +

    Definition at line 31 of file message.cpp.

    - + +

    ◆ PrintHex()

    +
    @@ -173,11 +157,13 @@ template<class T >
    -

    Definition at line 26 of file printhex.h.

    +

    Definition at line 33 of file printhex.h.

    - + +

    ◆ PrintBin()

    +
    @@ -203,11 +189,13 @@ template<class T >
    -

    Definition at line 37 of file printhex.h.

    +

    Definition at line 44 of file printhex.h.

    - + +

    ◆ SerialPrintHex()

    +
    @@ -223,11 +211,13 @@ template<class T >
    -

    Definition at line 46 of file printhex.h.

    +

    Definition at line 53 of file printhex.h.

    - + +

    ◆ PrintHex2()

    +
    @@ -253,11 +243,13 @@ template<class T >
    -

    Definition at line 57 of file printhex.h.

    +

    Definition at line 64 of file printhex.h.

    - + +

    ◆ D_PrintHex()

    +
    @@ -283,11 +275,13 @@ template<class T >
    -

    Definition at line 69 of file printhex.h.

    +

    Definition at line 76 of file printhex.h.

    - + +

    ◆ D_PrintBin()

    +
    @@ -313,7 +307,7 @@ template<class T >
    -

    Definition at line 76 of file printhex.h.

    +

    Definition at line 83 of file printhex.h.

    @@ -322,7 +316,7 @@ template<class T >
    diff --git a/printhex_8h_source.html b/printhex_8h_source.html index 3db230c4..6e5ed92b 100644 --- a/printhex_8h_source.html +++ b/printhex_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: printhex.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
    printhex.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(_usb_h_) || defined(__PRINTHEX_H__)
    19 #error "Never include printhex.h directly; include Usb.h instead"
    20 #else
    21 #define __PRINTHEX_H__
    22 
    23 void E_Notifyc(char c, int lvl);
    24 
    25 template <class T>
    26 void PrintHex(T val, int lvl) {
    27  int num_nibbles = sizeof (T) * 2;
    28 
    29  do {
    30  char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
    31  if(v > 57) v += 7;
    32  E_Notifyc(v, lvl);
    33  } while(--num_nibbles);
    34 }
    35 
    36 template <class T>
    37 void PrintBin(T val, int lvl) {
    38  for(T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1)
    39  if(val & mask)
    40  E_Notifyc('1', lvl);
    41  else
    42  E_Notifyc('0', lvl);
    43 }
    44 
    45 template <class T>
    46 void SerialPrintHex(T val) {
    47  int num_nibbles = sizeof (T) * 2;
    48 
    49  do {
    50  char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
    51  if(v > 57) v += 7;
    52  USB_HOST_SERIAL.print(v);
    53  } while(--num_nibbles);
    54 }
    55 
    56 template <class T>
    57 void PrintHex2(Print *prn, T val) {
    58  T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2));
    59 
    60  while(mask > 1) {
    61  if(val < mask)
    62  prn->print("0");
    63 
    64  mask >>= 4;
    65  }
    66  prn->print((T)val, HEX);
    67 }
    68 
    69 template <class T> void D_PrintHex(T val, int lvl) {
    70 #ifdef DEBUG_USB_HOST
    71  PrintHex<T > (val, lvl);
    72 #endif
    73 }
    74 
    75 template <class T>
    76 void D_PrintBin(T val, int lvl) {
    77 #ifdef DEBUG_USB_HOST
    78  PrintBin<T > (val, lvl);
    79 #endif
    80 }
    81 
    82 
    83 
    84 #endif // __PRINTHEX_H__
    void SerialPrintHex(T val)
    Definition: printhex.h:46
    -
    void PrintBin(T val, int lvl)
    Definition: printhex.h:37
    -
    #define USB_HOST_SERIAL
    Definition: settings.h:34
    -
    void D_PrintBin(T val, int lvl)
    Definition: printhex.h:76
    -
    void E_Notifyc(char c, int lvl)
    Definition: message.cpp:24
    - -
    void PrintHex(T val, int lvl)
    Definition: printhex.h:26
    -
    void PrintHex2(Print *prn, T val)
    Definition: printhex.h:57
    -
    void D_PrintHex(T val, int lvl)
    Definition: printhex.h:69
    +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(__PRINTHEX_H__)
    26 #error "Never include printhex.h directly; include Usb.h instead"
    27 #else
    28 #define __PRINTHEX_H__
    29 
    30 void E_Notifyc(char c, int lvl);
    31 
    32 template <class T>
    33 void PrintHex(T val, int lvl) {
    34  int num_nibbles = sizeof (T) * 2;
    35 
    36  do {
    37  char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
    38  if(v > 57) v += 7;
    39  E_Notifyc(v, lvl);
    40  } while(--num_nibbles);
    41 }
    42 
    43 template <class T>
    44 void PrintBin(T val, int lvl) {
    45  for(T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1)
    46  if(val & mask)
    47  E_Notifyc('1', lvl);
    48  else
    49  E_Notifyc('0', lvl);
    50 }
    51 
    52 template <class T>
    53 void SerialPrintHex(T val) {
    54  int num_nibbles = sizeof (T) * 2;
    55 
    56  do {
    57  char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
    58  if(v > 57) v += 7;
    59  USB_HOST_SERIAL.print(v);
    60  } while(--num_nibbles);
    61 }
    62 
    63 template <class T>
    64 void PrintHex2(Print *prn, T val) {
    65  T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2));
    66 
    67  while(mask > 1) {
    68  if(val < mask)
    69  prn->print("0");
    70 
    71  mask >>= 4;
    72  }
    73  prn->print((T)val, HEX);
    74 }
    75 
    76 template <class T> void D_PrintHex(T val __attribute__((unused)), int lvl __attribute__((unused))) {
    77 #ifdef DEBUG_USB_HOST
    78  PrintHex<T > (val, lvl);
    79 #endif
    80 }
    81 
    82 template <class T>
    83 void D_PrintBin(T val, int lvl) {
    84 #ifdef DEBUG_USB_HOST
    85  PrintBin<T > (val, lvl);
    86 #endif
    87 }
    88 
    89 
    90 
    91 #endif // __PRINTHEX_H__
    void SerialPrintHex(T val)
    Definition: printhex.h:53
    +
    void PrintBin(T val, int lvl)
    Definition: printhex.h:44
    +
    #define USB_HOST_SERIAL
    Definition: settings.h:49
    +
    void D_PrintBin(T val, int lvl)
    Definition: printhex.h:83
    +
    void E_Notifyc(char c, int lvl)
    Definition: message.cpp:31
    + +
    void PrintHex(T val, int lvl)
    Definition: printhex.h:33
    +
    void PrintHex2(Print *prn, T val)
    Definition: printhex.h:64
    +
    void D_PrintHex(T val, int lvl)
    Definition: printhex.h:76
    diff --git a/search/all_0.html b/search/all_0.html index d54e0bd8..5125b940 100644 --- a/search/all_0.html +++ b/search/all_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_1.html b/search/all_1.html index 8cc6a1de..b8ff8711 100644 --- a/search/all_1.html +++ b/search/all_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_10.html b/search/all_10.html index c25484f2..50bc449e 100644 --- a/search/all_10.html +++ b/search/all_10.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_10.js b/search/all_10.js index b3f4d9ec..786b5bc8 100644 --- a/search/all_10.js +++ b/search/all_10.js @@ -7,7 +7,7 @@ var searchData= ['pairwithwiimote',['pairWithWiimote',['../class_b_t_d.html#a6b66a27c0fd359e3129f53451352b55c',1,'BTD']]], ['parse',['Parse',['../class_config_desc_parser.html#a3722ad1dbbfcd4ecf5cbf9caf08cd517',1,'ConfigDescParser::Parse()'],['../class_hex_dumper.html#acaff9c9e5b97bbfe3596c7b7a2e2a78d',1,'HexDumper::Parse()'],['../class_mouse_report_parser.html#aed02196a692f8b633fbbebc76eefd4a1',1,'MouseReportParser::Parse()'],['../class_keyboard_report_parser.html#a122bfa9d4baa9f85010aea8245c2295c',1,'KeyboardReportParser::Parse()'],['../class_report_desc_parser_base.html#a7ecd266cbbbc18460ab8823651225e6b',1,'ReportDescParserBase::Parse()'],['../class_universal_report_parser.html#a77f459e6751a2ca360574e91a89f92b9',1,'UniversalReportParser::Parse()'],['../class_multi_byte_value_parser.html#a9d380bf3ab3fee2c8797883504bcd827',1,'MultiByteValueParser::Parse()'],['../class_p_t_p_list_parser.html#a15ebdbc2ca861bc6e6d051273cf3b66e',1,'PTPListParser::Parse()'],['../class_p_s4_parser.html#a6498fdeb767364e84ce09ef208980622',1,'PS4Parser::Parse()'],['../class_sink_parser.html#ac6cf61bb48d61cb7db178c62c5f86fd0',1,'SinkParser::Parse()'],['../class_u_s_b_read_parser.html#afdb9cea2a2fe18d26f4ec595b86a7f7c',1,'USBReadParser::Parse()'],['../class_h_i_d_report_parser.html#af6c4b832fad296860bae406730e792da',1,'HIDReportParser::Parse()']]], ['parsebthiddata',['ParseBTHIDData',['../class_b_t_h_i_d.html#a4de4a1efd32000a0cf5a884456e52c7d',1,'BTHID::ParseBTHIDData()'],['../class_p_s4_b_t.html#a0d92689d0c24e62ddc7a1b3c4c658512',1,'PS4BT::ParseBTHIDData()']]], - ['parseconfigdescr',['parseConfigDescr',['../class_u_s_b_h___m_i_d_i.html#a92359b023ab411c86af8efb7283c0e9f',1,'USBH_MIDI']]], + ['parseconfigdescr',['parseConfigDescr',['../class_u_s_b_h___m_i_d_i.html#aabe63c64fbcee52e7c724d489cd19394',1,'USBH_MIDI']]], ['parsehiddata',['ParseHIDData',['../class_h_i_d_composite.html#ac01dac60c82bd850509696252cd9b651',1,'HIDComposite::ParseHIDData()'],['../class_h_i_d_universal.html#a5d6e27f817d6d2c67692783a02872939',1,'HIDUniversal::ParseHIDData()'],['../class_p_s4_u_s_b.html#a8222cea2ec47bff310d6e5fbada9e695',1,'PS4USB::ParseHIDData()'],['../class_p_s_buzz.html#a73e7a2f4b5537a692d699dc7c57ca6d6',1,'PSBuzz::ParseHIDData()']]], ['parseitem',['ParseItem',['../class_report_desc_parser_base.html#ac1d6c015d9a2527bb2044e9a96fcaaf9',1,'ReportDescParserBase::ParseItem()'],['../class_report_desc_parser2.html#a84242b62a5d202b5d2d6fe26809bc0e2',1,'ReportDescParser2::ParseItem()']]], ['parsemode',['ParseMode',['../class_p_t_p_list_parser.html#a7919acc78eb409e0679d8ec69a43e6da',1,'PTPListParser']]], @@ -35,7 +35,7 @@ var searchData= ['pgm_5fread_5fword',['pgm_read_word',['../version__helper_8h.html#a910fb5f01313d339d3b835d45e1e5ad0',1,'version_helper.h']]], ['pgm_5fread_5fword_5ffar',['pgm_read_word_far',['../version__helper_8h.html#a3aaf70e2e58f5749ccbcd36032b1d1b3',1,'version_helper.h']]], ['pgm_5fread_5fword_5fnear',['pgm_read_word_near',['../version__helper_8h.html#a515a845ea5139d8cf1c7f09ad6dad243',1,'version_helper.h']]], - ['pid',['PID',['../class_h_i_d_composite.html#a1402689fc7e633723fca2b6b175c2a18',1,'HIDComposite::PID()'],['../class_h_i_d_universal.html#abc609e49d66fa6260e7cdcd2c4ff0a5a',1,'HIDUniversal::PID()'],['../class_u_s_b_h___m_i_d_i.html#aaf7ec77f0d8cefff1316ae049747e2a7',1,'USBH_MIDI::pid()']]], + ['pid',['pid',['../class_u_s_b_h___m_i_d_i.html#aaf7ec77f0d8cefff1316ae049747e2a7',1,'USBH_MIDI::pid()'],['../class_h_i_d_composite.html#a1402689fc7e633723fca2b6b175c2a18',1,'HIDComposite::PID()'],['../class_h_i_d_universal.html#abc609e49d66fa6260e7cdcd2c4ff0a5a',1,'HIDUniversal::PID()']]], ['pitch',['Pitch',['../controller_enums_8h.html#a7c7824a10a9ffa8fea85602fcf4d84e6ae3a34b760fa4a6854f28852e91d8bb47',1,'controllerEnums.h']]], ['pitchgyroscale',['pitchGyroScale',['../class_w_i_i.html#aea6ce6f3222df3e547e9957673c7a07a',1,'WII']]], ['pitchgyrospeed',['pitchGyroSpeed',['../class_w_i_i.html#aa47478ccdfe009dabb7c21232e07bfd5',1,'WII']]], @@ -54,7 +54,7 @@ var searchData= ['printbytevalue',['PrintByteValue',['../class_report_desc_parser_base.html#a1af970b456e54342e15a88ffd98ca6cc',1,'ReportDescParserBase']]], ['printconsumerpageusage',['PrintConsumerPageUsage',['../class_report_desc_parser_base.html#a9af1dc144bab9e9864394594be67d2eb',1,'ReportDescParserBase']]], ['printdigitizerpageusage',['PrintDigitizerPageUsage',['../class_report_desc_parser_base.html#aa62d11cfe404ee51ffd26f13c33800a1',1,'ReportDescParserBase']]], - ['printendpointdescriptor',['PrintEndpointDescriptor',['../class_a_d_k.html#ac4bd3303b99921289c3f59e2df219e50',1,'ADK::PrintEndpointDescriptor()'],['../class_b_t_d.html#aa5976eead215a58553aee683d42405a0',1,'BTD::PrintEndpointDescriptor()'],['../class_a_c_m.html#aa05a65487f5e02bab40ccba1018ee5b6',1,'ACM::PrintEndpointDescriptor()'],['../class_bulk_only.html#ac8a1d7b2ef82d9f6da44928c78039964',1,'BulkOnly::PrintEndpointDescriptor()'],['../class_u_s_b_h_i_d.html#a046f84af88dab2e9063db0bf36308cd4',1,'USBHID::PrintEndpointDescriptor()']]], + ['printendpointdescriptor',['PrintEndpointDescriptor',['../class_a_d_k.html#ac4bd3303b99921289c3f59e2df219e50',1,'ADK::PrintEndpointDescriptor()'],['../class_b_t_d.html#aa5976eead215a58553aee683d42405a0',1,'BTD::PrintEndpointDescriptor()'],['../class_a_c_m.html#aa05a65487f5e02bab40ccba1018ee5b6',1,'ACM::PrintEndpointDescriptor()'],['../class_bulk_only.html#ac8a1d7b2ef82d9f6da44928c78039964',1,'BulkOnly::PrintEndpointDescriptor()'],['../class_u_s_b_h_i_d.html#a046f84af88dab2e9063db0bf36308cd4',1,'USBHID::PrintEndpointDescriptor()'],['../class_x_b_o_x_o_n_e.html#a2eea30f2ce47380fc414d4fc4231335b',1,'XBOXONE::PrintEndpointDescriptor()']]], ['printf_5fp',['printf_P',['../version__helper_8h.html#ab9261eba134bf3ec83f80bd34e6c2faf',1,'version_helper.h']]], ['printgamecontrolspageusage',['PrintGameControlsPageUsage',['../class_report_desc_parser_base.html#a4e026cfeda7bfe9e07cf247cbcc4a122',1,'ReportDescParserBase']]], ['printgenericdesktoppageusage',['PrintGenericDesktopPageUsage',['../class_report_desc_parser_base.html#a3eff46688f9edbee3a58c43bbf104763',1,'ReportDescParserBase']]], @@ -109,6 +109,7 @@ var searchData= ['ps3usb_2eh',['PS3USB.h',['../_p_s3_u_s_b_8h.html',1,'']]], ['ps4_5fbuttons',['PS4_BUTTONS',['../_p_s4_parser_8h.html#a7e95303156f31f965a09cc2d3877b524',1,'PS4Parser.h']]], ['ps4_5fpid',['PS4_PID',['../_p_s4_u_s_b_8h.html#a776f4d4694166dbe732e585ebb8c816e',1,'PS4USB.h']]], + ['ps4_5fpid_5fslim',['PS4_PID_SLIM',['../_p_s4_u_s_b_8h.html#a7b76473e5da043c7b3ce1eefebe77dbc',1,'PS4USB.h']]], ['ps4_5fvid',['PS4_VID',['../_p_s4_u_s_b_8h.html#ac878fc36cc22549eb8a7ab6371197877',1,'PS4USB.h']]], ['ps4bt',['PS4BT',['../class_p_s4_b_t.html',1,'PS4BT'],['../class_p_s4_b_t.html#a616d5167f795b14c5955910807b5024b',1,'PS4BT::PS4BT()']]], ['ps4bt_2eh',['PS4BT.h',['../_p_s4_b_t_8h.html',1,'']]], diff --git a/search/all_11.html b/search/all_11.html index 3615c281..b35c8bf0 100644 --- a/search/all_11.html +++ b/search/all_11.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_11.js b/search/all_11.js index c9f0ea5b..404dda09 100644 --- a/search/all_11.js +++ b/search/all_11.js @@ -1,4 +1,4 @@ var searchData= [ - ['qnextpolltime',['qNextPollTime',['../class_b_t_d.html#a52d6c7895f6bb01729d01ce28a2f3079',1,'BTD::qNextPollTime()'],['../class_a_c_m.html#a6701d70ae4734e8a81971d9fb8b085f2',1,'ACM::qNextPollTime()'],['../class_bulk_only.html#a2d422ee0745cd7c04afff905278c4233',1,'BulkOnly::qNextPollTime()']]] + ['qnextpolltime',['qNextPollTime',['../class_b_t_d.html#a52d6c7895f6bb01729d01ce28a2f3079',1,'BTD::qNextPollTime()'],['../class_a_c_m.html#a6701d70ae4734e8a81971d9fb8b085f2',1,'ACM::qNextPollTime()'],['../class_bulk_only.html#a2d422ee0745cd7c04afff905278c4233',1,'BulkOnly::qNextPollTime()'],['../class_x_b_o_x_o_n_e.html#a4d0702c6fc0327535d909975670e9284',1,'XBOXONE::qNextPollTime()']]] ]; diff --git a/search/all_12.html b/search/all_12.html index abd082a5..fd265245 100644 --- a/search/all_12.html +++ b/search/all_12.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_12.js b/search/all_12.js index 21c8a866..42508296 100644 --- a/search/all_12.js +++ b/search/all_12.js @@ -1,20 +1,21 @@ var searchData= [ ['r',['r',['../struct_p_s4_output.html#a76a85e749899e2e6cb135a6ec6acabb3',1,'PS4Output::r()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fda1784b1a3d7cbd43c45ff82c72d05e4ae',1,'R(): controllerEnums.h']]], - ['r1',['R1',['../struct_inquiry_response.html#a72abbdbd399647227ea05cb1cec32b2d',1,'InquiryResponse::R1()'],['../union_p_s4_buttons.html#aba0cb76ee82bd0ebe9872aa7bcbffac6',1,'PS4Buttons::r1()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdaf8d87ff07efe24755164f550526f4dac',1,'R1(): controllerEnums.h']]], - ['r2',['R2',['../struct_inquiry_response.html#aa635575deb7f984d27142ee2071af5b3',1,'InquiryResponse::R2()'],['../union_p_s4_buttons.html#a416642ff357b1313825fe94e0491b60e',1,'PS4Buttons::r2()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fda629d7b403cea5f826352f3aefb9a6d6a',1,'R2(): controllerEnums.h']]], + ['r1',['r1',['../union_p_s4_buttons.html#aba0cb76ee82bd0ebe9872aa7bcbffac6',1,'PS4Buttons::r1()'],['../struct_inquiry_response.html#a72abbdbd399647227ea05cb1cec32b2d',1,'InquiryResponse::R1()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdaf8d87ff07efe24755164f550526f4dac',1,'R1(): controllerEnums.h']]], + ['r2',['r2',['../union_p_s4_buttons.html#a416642ff357b1313825fe94e0491b60e',1,'PS4Buttons::r2()'],['../struct_inquiry_response.html#aa635575deb7f984d27142ee2071af5b3',1,'InquiryResponse::R2()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fda629d7b403cea5f826352f3aefb9a6d6a',1,'R2(): controllerEnums.h']]], ['r3',['r3',['../union_p_s4_buttons.html#a09805f3bcc362c410d7897792599d61d',1,'PS4Buttons::r3()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdaad0b4725f69a34fed2c914517bcd9baa',1,'R3(): controllerEnums.h']]], ['rcpuctl',['rCPUCTL',['../max3421e_8h.html#a53da9de92c56d0cdac2a09ca10e94455',1,'max3421e.h']]], ['rcvdata',['RcvData',['../class_a_d_k.html#a66b9943dfa89f783a8cdeb655e6fe9b1',1,'ADK::RcvData()'],['../class_a_c_m.html#a7f455b7a649522c29f2e63d668b0ccca',1,'ACM::RcvData()'],['../class_f_t_d_i.html#aa367ae72fbfda931cae8ec751e9dc434',1,'FTDI::RcvData()'],['../class_u_s_b_h___m_i_d_i.html#a1f522c0aca86795e1bfb7575e1759338',1,'USBH_MIDI::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)'],['../class_u_s_b_h___m_i_d_i.html#afa51b7a718728cdc4f25f9abec25be52',1,'USBH_MIDI::RcvData(uint8_t *outBuf)']]], - ['read',['Read',['../class_bulk_only.html#a470a8f0ffd6694d9dfc834da5efa627a',1,'BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf)'],['../class_bulk_only.html#a52f54376dcd7f5baf17718105e8f085d',1,'BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs)'],['../class_s_p_p.html#aae8dc037e845480f582afea57b858b95',1,'SPP::read()']]], + ['read',['read',['../class_s_p_p.html#aae8dc037e845480f582afea57b858b95',1,'SPP::read()'],['../class_bulk_only.html#a470a8f0ffd6694d9dfc834da5efa627a',1,'BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf)'],['../class_bulk_only.html#a52f54376dcd7f5baf17718105e8f085d',1,'BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs)']]], ['read_5fregister',['read_register',['../class_x_r21_b1411.html#adfcc22eba1ec95fe62af960682b8ecbc',1,'XR21B1411']]], ['readme_2emd',['README.md',['../_r_e_a_d_m_e_8md.html',1,'']]], - ['readpollinterval',['readPollInterval',['../class_b_t_d.html#a2a9ecb996243e070e70972370e45e4fd',1,'BTD']]], + ['readpollinterval',['readPollInterval',['../class_b_t_d.html#a2a9ecb996243e070e70972370e45e4fd',1,'BTD::readPollInterval()'],['../class_x_b_o_x_o_n_e.html#ae606811be2389140b19421aad2cb040f',1,'XBOXONE::readPollInterval()']]], ['readptr',['readPtr',['../class_u_s_b_h___m_i_d_i.html#aad25eeebfe8741afa7a242ec398c846e',1,'USBH_MIDI']]], ['ready',['ready',['../class_a_d_k.html#a135db75b9e8cdd59b89f46c44dd83dd4',1,'ADK::ready()'],['../class_a_c_m.html#ae9a10861da80510a54942a511ce9009e',1,'ACM::ready()']]], ['recipient',['recipient',['../struct_s_e_t_u_p___p_k_t.html#a690a55f65b2ce4e69c426b92004a1cc6',1,'SETUP_PKT']]], ['recvbuf',['recvBuf',['../class_u_s_b_h___m_i_d_i.html#aa84131af42cd34c3d62763a7b3f07d2f',1,'USBH_MIDI']]], - ['recvdata',['RecvData',['../class_u_s_b_h___m_i_d_i.html#adb10f3867c2171603faa37af3e9fd210',1,'USBH_MIDI::RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)'],['../class_u_s_b_h___m_i_d_i.html#a4cd869ca837db908f283d2f41f3eb608',1,'USBH_MIDI::RecvData(uint8_t *outBuf)']]], + ['recvdata',['RecvData',['../class_u_s_b_h___m_i_d_i.html#adb10f3867c2171603faa37af3e9fd210',1,'USBH_MIDI::RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)'],['../class_u_s_b_h___m_i_d_i.html#aea89f48a206501ecf09b7d962e1fa688',1,'USBH_MIDI::RecvData(uint8_t *outBuf, bool isRaw=false)']]], + ['recvrawdata',['RecvRawData',['../class_u_s_b_h___m_i_d_i.html#af9f74895deb356da3d1915d9eac24aca',1,'USBH_MIDI']]], ['red',['red',['../union_p_s_b_u_z_z_buttons.html#a7bc184a6500e943f8b8f13a003e9a929',1,'PSBUZZButtons::red()'],['../controller_enums_8h.html#aac6fa7b0395b95cc528deaad0ce884a2ad3163c1fcda01965b692ec2c3122b743',1,'Red(): controllerEnums.h'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdaf80f9a890089d211842d59625e561f88',1,'RED(): controllerEnums.h']]], ['registerbluetoothservice',['registerBluetoothService',['../class_b_t_d.html#ad00d299e64c1a939e4a781ef39f75684',1,'BTD']]], ['registerdeviceclass',['RegisterDeviceClass',['../class_u_s_b.html#a3f66bf622590413ef2e1864f93a3e0d2',1,'USB']]], @@ -35,7 +36,7 @@ var searchData= ['res',['Res',['../struct_inquiry_response.html#a9f642c5fccc1c87cf6b444a138b6aa4b',1,'InquiryResponse']]], ['reserved',['Reserved',['../struct_inquiry_response.html#abb4a48d4fc326ad932fb41c82fe289f3',1,'InquiryResponse::Reserved()'],['../struct_hub_descriptor.html#a0c3292fe67fdbdab6ceac8b198ef44bf',1,'HubDescriptor::Reserved()']]], ['reserved4',['Reserved4',['../struct_inquiry_response.html#ae5c315ca0c47104b17d5bde7c4d485a6',1,'InquiryResponse']]], - ['reset',['reset',['../class_m_a_x3421e.html#a15b78912dd4b1c96b6ad141117dcb7ee',1,'MAX3421e::reset()'],['../class_bluetooth_service.html#aa7c81841d4e898e9dc91533da6d7ab64',1,'BluetoothService::Reset()'],['../class_b_t_h_i_d.html#af4c58b81414a037910dd6fb78f97b96e',1,'BTHID::Reset()'],['../class_p_s3_b_t.html#a576d72cdf12af58ae59c8f2a02f99c0f',1,'PS3BT::Reset()'],['../class_p_s4_parser.html#a24640b2362b0f6f51785fbd3dd4f13f9',1,'PS4Parser::Reset()'],['../class_p_s_buzz.html#a5bb4f2ee80ca9d10d87031b57bd09268',1,'PSBuzz::Reset()'],['../class_s_p_p.html#ae2c661bd46cd2d74bd29c4c771cd2ef0',1,'SPP::Reset()'],['../class_w_i_i.html#a769ee2f9a0088da097438bc3cc677f7c',1,'WII::Reset()']]], + ['reset',['Reset',['../class_bluetooth_service.html#aa7c81841d4e898e9dc91533da6d7ab64',1,'BluetoothService::Reset()'],['../class_b_t_h_i_d.html#af4c58b81414a037910dd6fb78f97b96e',1,'BTHID::Reset()'],['../class_p_s3_b_t.html#a576d72cdf12af58ae59c8f2a02f99c0f',1,'PS3BT::Reset()'],['../class_p_s4_parser.html#a24640b2362b0f6f51785fbd3dd4f13f9',1,'PS4Parser::Reset()'],['../class_p_s_buzz.html#a5bb4f2ee80ca9d10d87031b57bd09268',1,'PSBuzz::Reset()'],['../class_s_p_p.html#ae2c661bd46cd2d74bd29c4c771cd2ef0',1,'SPP::Reset()'],['../class_w_i_i.html#a769ee2f9a0088da097438bc3cc677f7c',1,'WII::Reset()'],['../class_m_a_x3421e.html#a15b78912dd4b1c96b6ad141117dcb7ee',1,'MAX3421e::reset()']]], ['reset_5fdownstream_5fdata_5fpipe',['RESET_DOWNSTREAM_DATA_PIPE',['../cdcprolific_8h.html#a810fdf3da740b4c9e309cefb29f4eb3a',1,'cdcprolific.h']]], ['reset_5fupstream_5fdata_5fpipe',['RESET_UPSTREAM_DATA_PIPE',['../cdcprolific_8h.html#aea64b328d877a5eead187856dd28f847',1,'cdcprolific.h']]], ['resetbthid',['ResetBTHID',['../class_b_t_h_i_d.html#acc22bf5baaa096fe09b72c812c1134f0',1,'BTHID::ResetBTHID()'],['../class_p_s4_b_t.html#a4b1c9e15ccdc7ab24f7fb42fc9b5d827',1,'PS4BT::ResetBTHID()']]], diff --git a/search/all_13.html b/search/all_13.html index 88fa6531..04f66e2f 100644 --- a/search/all_13.html +++ b/search/all_13.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_13.js b/search/all_13.js index 1c253ed4..bf86e378 100644 --- a/search/all_13.js +++ b/search/all_13.js @@ -89,10 +89,11 @@ var searchData= ['selectinterface',['SelectInterface',['../class_h_i_d_composite.html#ada07ab100cb0760ef5641e254cab731d',1,'HIDComposite']]], ['send',['send',['../class_s_p_p.html#ab6c20e303965056403ae5aef1d228858',1,'SPP']]], ['sendbreak',['SendBreak',['../class_a_c_m.html#a2a618cbff52737740e76977db557ddff',1,'ACM']]], - ['senddata',['SendData',['../class_u_s_b_h___m_i_d_i.html#a060bae88a7b5bf358119458362929ffa',1,'USBH_MIDI']]], - ['sendlcdpins',['SENDlcdPins',['../max___l_c_d_8cpp.html#a8b1b918f6a2c50b113737fe4a8e493ed',1,'max_LCD.cpp']]], + ['senddata',['SendData',['../class_u_s_b_h___m_i_d_i.html#a65fd836d11336cce737ec1bdb1d5d4f3',1,'USBH_MIDI']]], + ['sendlcdpins',['SENDlcdPins',['../max___l_c_d_8cpp.html#ab9142420ababc8fe568edee4796183ba',1,'max_LCD.cpp']]], ['sendoutputreport',['sendOutputReport',['../class_p_s4_b_t.html#ad3bb50902905677726bd62d5f394b062',1,'PS4BT::sendOutputReport()'],['../class_p_s4_parser.html#a8788530b0c213dedfcf56b78e8ca4879',1,'PS4Parser::sendOutputReport()'],['../class_p_s4_u_s_b.html#a75dc09d15f149e1a1b96b8d2ccbbff89',1,'PS4USB::sendOutputReport()']]], - ['sendsysex',['SendSysEx',['../class_u_s_b_h___m_i_d_i.html#a2ae1ef447bebf00d6f63af5eed4fa859',1,'USBH_MIDI']]], + ['sendrawdata',['SendRawData',['../class_u_s_b_h___m_i_d_i.html#a3005d70999cbf2339c55bcdd6fc77bff',1,'USBH_MIDI']]], + ['sendsysex',['SendSysEx',['../class_u_s_b_h___m_i_d_i.html#aa5506d9556605493d25492ab1f2fe2a8',1,'USBH_MIDI']]], ['sensekeyspecific',['SenseKeySpecific',['../struct_request_sense_responce.html#a61d034714befc2fa0fb7dcea30942324',1,'RequestSenseResponce']]], ['sensorenum',['SensorEnum',['../controller_enums_8h.html#a00d5030559c481763282483889597d51',1,'controllerEnums.h']]], ['serial_5fstate',['SERIAL_STATE',['../cdcacm_8h.html#a8e278dbd137d5d873d24e1647be9d4e6',1,'cdcacm.h']]], @@ -140,11 +141,12 @@ var searchData= ['setprotocolmode',['setProtocolMode',['../class_b_t_h_i_d.html#afceaafc89581441da40b141170b98595',1,'BTHID']]], ['setreport',['SetReport',['../class_u_s_b_h_i_d.html#a66e217a1d1237239514ce6149e46cc56',1,'USBHID']]], ['setreportparser',['SetReportParser',['../class_b_t_h_i_d.html#a0e903f0b5040f3561e5de6c4431027b1',1,'BTHID::SetReportParser()'],['../class_h_i_d_boot.html#a3e44d340fab7e9eedb357ef61e1c19a5',1,'HIDBoot::SetReportParser()'],['../class_h_i_d_composite.html#a94136774d685b89c5a149c4e4df78087',1,'HIDComposite::SetReportParser()'],['../class_h_i_d_universal.html#afbd599879e9c3cdea382e87afd6ab29a',1,'HIDUniversal::SetReportParser()'],['../class_u_s_b_h_i_d.html#a17a732bbb37d8f21181d02d515f40499',1,'USBHID::SetReportParser()']]], - ['setrumbleoff',['setRumbleOff',['../class_p_s3_b_t.html#a5c87e7db5311a5d56f78c994b5545e4e',1,'PS3BT::setRumbleOff()'],['../class_p_s3_u_s_b.html#aaa1e66d7397be6364d4f76749cbaad5a',1,'PS3USB::setRumbleOff()'],['../class_p_s4_parser.html#acc9b3be8fb673e8e1f637c56d72f1180',1,'PS4Parser::setRumbleOff()'],['../class_w_i_i.html#a2c5c32841b020b248f757cb793acb936',1,'WII::setRumbleOff()'],['../class_x_b_o_x_o_l_d.html#a8014cc70e141362e09beeedb49428746',1,'XBOXOLD::setRumbleOff()'],['../class_x_b_o_x_r_e_c_v.html#a2931e13960cde2c20adbcaf34cee84c5',1,'XBOXRECV::setRumbleOff()'],['../class_x_b_o_x_u_s_b.html#a5d9ac92da5086409ad864484bdf95871',1,'XBOXUSB::setRumbleOff()']]], - ['setrumbleon',['setRumbleOn',['../class_p_s3_b_t.html#a7a3e593911490538c061e9ccb4273f87',1,'PS3BT::setRumbleOn(RumbleEnum mode)'],['../class_p_s3_b_t.html#ae309556e995afc10b13dfbe4e6c32798',1,'PS3BT::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)'],['../class_p_s3_u_s_b.html#a77f44b6007cc735c47bdeaf672c7e464',1,'PS3USB::setRumbleOn(RumbleEnum mode)'],['../class_p_s3_u_s_b.html#a0c2015b53aa60081aa28299800509f80',1,'PS3USB::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)'],['../class_p_s4_parser.html#a44628a8521ef9c19d773347156962cab',1,'PS4Parser::setRumbleOn(RumbleEnum mode)'],['../class_p_s4_parser.html#a8299bdbb9d790e6b2e98e942e9bd154e',1,'PS4Parser::setRumbleOn(uint8_t bigRumble, uint8_t smallRumble)'],['../class_w_i_i.html#a0d9c869bd3677c4488a586c38558a137',1,'WII::setRumbleOn()'],['../class_x_b_o_x_o_l_d.html#ab69673ea316c30268a5eedc893bea3a9',1,'XBOXOLD::setRumbleOn()'],['../class_x_b_o_x_r_e_c_v.html#addf7c0dcfbdb025f2283dcd118b5ab76',1,'XBOXRECV::setRumbleOn()'],['../class_x_b_o_x_u_s_b.html#ae70ae50ed8188a2bf8c25d0ee17f54d9',1,'XBOXUSB::setRumbleOn()']]], + ['setrumbleoff',['setRumbleOff',['../class_p_s3_b_t.html#a5c87e7db5311a5d56f78c994b5545e4e',1,'PS3BT::setRumbleOff()'],['../class_p_s3_u_s_b.html#aaa1e66d7397be6364d4f76749cbaad5a',1,'PS3USB::setRumbleOff()'],['../class_p_s4_parser.html#acc9b3be8fb673e8e1f637c56d72f1180',1,'PS4Parser::setRumbleOff()'],['../class_w_i_i.html#a2c5c32841b020b248f757cb793acb936',1,'WII::setRumbleOff()'],['../class_x_b_o_x_o_l_d.html#a8014cc70e141362e09beeedb49428746',1,'XBOXOLD::setRumbleOff()'],['../class_x_b_o_x_o_n_e.html#a506e8add57ffac652a28e8c5b7e72e85',1,'XBOXONE::setRumbleOff()'],['../class_x_b_o_x_r_e_c_v.html#a2931e13960cde2c20adbcaf34cee84c5',1,'XBOXRECV::setRumbleOff()'],['../class_x_b_o_x_u_s_b.html#a5d9ac92da5086409ad864484bdf95871',1,'XBOXUSB::setRumbleOff()']]], + ['setrumbleon',['setRumbleOn',['../class_p_s3_b_t.html#a7a3e593911490538c061e9ccb4273f87',1,'PS3BT::setRumbleOn(RumbleEnum mode)'],['../class_p_s3_b_t.html#ae309556e995afc10b13dfbe4e6c32798',1,'PS3BT::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)'],['../class_p_s3_u_s_b.html#a77f44b6007cc735c47bdeaf672c7e464',1,'PS3USB::setRumbleOn(RumbleEnum mode)'],['../class_p_s3_u_s_b.html#a0c2015b53aa60081aa28299800509f80',1,'PS3USB::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)'],['../class_p_s4_parser.html#a44628a8521ef9c19d773347156962cab',1,'PS4Parser::setRumbleOn(RumbleEnum mode)'],['../class_p_s4_parser.html#a8299bdbb9d790e6b2e98e942e9bd154e',1,'PS4Parser::setRumbleOn(uint8_t bigRumble, uint8_t smallRumble)'],['../class_w_i_i.html#a0d9c869bd3677c4488a586c38558a137',1,'WII::setRumbleOn()'],['../class_x_b_o_x_o_l_d.html#ab69673ea316c30268a5eedc893bea3a9',1,'XBOXOLD::setRumbleOn()'],['../class_x_b_o_x_o_n_e.html#a6586343cacf8705c7a3c2d4f479f2261',1,'XBOXONE::setRumbleOn()'],['../class_x_b_o_x_r_e_c_v.html#addf7c0dcfbdb025f2283dcd118b5ab76',1,'XBOXRECV::setRumbleOn()'],['../class_x_b_o_x_u_s_b.html#ae70ae50ed8188a2bf8c25d0ee17f54d9',1,'XBOXUSB::setRumbleOn()']]], ['setrumbletoggle',['setRumbleToggle',['../class_w_i_i.html#a841396b533cccccb05db37d35f6fef9c',1,'WII']]], ['settings_2eh',['settings.h',['../settings_8h.html',1,'']]], ['setup_5fpkt',['SETUP_PKT',['../struct_s_e_t_u_p___p_k_t.html',1,'']]], + ['setupdevicespecific',['setupDeviceSpecific',['../class_u_s_b_h___m_i_d_i.html#aa9f6790ed10bec5fc5a9ebfc43dacfeb',1,'USBH_MIDI']]], ['setusagepage',['SetUsagePage',['../class_report_desc_parser_base.html#a42fbc8fbccaf67eab88bd98b8d3bdd3f',1,'ReportDescParserBase']]], ['setusbtaskstate',['setUsbTaskState',['../class_u_s_b.html#a8ff697d334dc611720419374acd1e5fb',1,'USB']]], ['share',['share',['../union_p_s4_buttons.html#adf2ff3e6e4050070a68e90a83be81e92',1,'PS4Buttons::share()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fda3754861e8c074fb088a2ed4f64786268',1,'SHARE(): controllerEnums.h']]], diff --git a/search/all_14.html b/search/all_14.html index 518db1da..285f34bd 100644 --- a/search/all_14.html +++ b/search/all_14.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_15.html b/search/all_15.html index 1331c0d7..0ed74e01 100644 --- a/search/all_15.html +++ b/search/all_15.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_15.js b/search/all_15.js index 7cc4652e..2300a549 100644 --- a/search/all_15.js +++ b/search/all_15.js @@ -18,7 +18,7 @@ var searchData= ['usagepagefunctions',['usagePageFunctions',['../class_report_desc_parser_base.html#af91679187bb24d185979b3ec045c215b',1,'ReportDescParserBase']]], ['usagepagetitles0',['usagePageTitles0',['../class_report_desc_parser_base.html#a7f723a8b7bddd061aee7f0af06aeae08',1,'ReportDescParserBase']]], ['usagepagetitles1',['usagePageTitles1',['../class_report_desc_parser_base.html#ae6dadd42986663f261aac948d24911a6',1,'ReportDescParserBase']]], - ['usb',['USB',['../class_u_s_b.html',1,'USB'],['../class_u_s_b.html#a8ff8cd03496bdcb0ca26f18878ad299d',1,'USB::USB()'],['../struct_p_s4_status.html#a3e7fc4ece250c83c7753e3f557f6d710',1,'PS4Status::usb()']]], + ['usb',['USB',['../class_u_s_b.html',1,'USB'],['../struct_p_s4_status.html#a3e7fc4ece250c83c7753e3f557f6d710',1,'PS4Status::usb()'],['../class_u_s_b.html#a8ff8cd03496bdcb0ca26f18878ad299d',1,'USB::USB()']]], ['usb_2ecpp',['Usb.cpp',['../_usb_8cpp.html',1,'']]], ['usb_2eh',['Usb.h',['../_usb_8h.html',1,'']]], ['usb_5fattached_5fsubstate_5fget_5fdevice_5fdescriptor_5fsize',['USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE',['../_usb_core_8h.html#a23ebcbb956f600e06435b28ae0c855d4',1,'UsbCore.h']]], @@ -117,6 +117,7 @@ var searchData= ['usb_5fsetup_5ftype_5fclass',['USB_SETUP_TYPE_CLASS',['../usb__ch9_8h.html#acf3fd30992e9fe01f1bac9aaa7fea61b',1,'usb_ch9.h']]], ['usb_5fsetup_5ftype_5fstandard',['USB_SETUP_TYPE_STANDARD',['../usb__ch9_8h.html#a3b51a35acaa76cafbb987c07186a7868',1,'usb_ch9.h']]], ['usb_5fsetup_5ftype_5fvendor',['USB_SETUP_TYPE_VENDOR',['../usb__ch9_8h.html#a876bdd74d8bfb072121b9643556271ba',1,'usb_ch9.h']]], + ['usb_5fspi',['USB_SPI',['../settings_8h.html#a00c696e002848a253c812ca2f4509f04',1,'settings.h']]], ['usb_5fstate_5faddressing',['USB_STATE_ADDRESSING',['../_usb_core_8h.html#a474a95baaeb99abd17538c2a1364bf96',1,'UsbCore.h']]], ['usb_5fstate_5fconfiguring',['USB_STATE_CONFIGURING',['../_usb_core_8h.html#aac8c844e6a20f42298d70e4438a029e5',1,'UsbCore.h']]], ['usb_5fstate_5fdetached',['USB_STATE_DETACHED',['../_usb_core_8h.html#ae7fd7c5bb6dc87f44724dde2ad57df87',1,'UsbCore.h']]], diff --git a/search/all_16.html b/search/all_16.html index bec9d5dd..696f0252 100644 --- a/search/all_16.html +++ b/search/all_16.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_16.js b/search/all_16.js index 0f9cb0de..a6f27cc1 100644 --- a/search/all_16.js +++ b/search/all_16.js @@ -18,7 +18,7 @@ var searchData= ['version',['Version',['../struct_inquiry_response.html#a86832a5def98c1e21447497177a8cc3a',1,'InquiryResponse']]], ['version_5fhelper_2eh',['version_helper.h',['../version__helper_8h.html',1,'']]], ['vfprintf_5fp',['vfprintf_P',['../version__helper_8h.html#a1c1f6f95b0f654f7c8280065feccf5cf',1,'version_helper.h']]], - ['vid',['vid',['../class_u_s_b_h___m_i_d_i.html#aa578074365d77bb3e41063a18625dfe3',1,'USBH_MIDI::vid()'],['../class_h_i_d_composite.html#acf516cb6242d1659c9bc77fe475c973e',1,'HIDComposite::VID()'],['../class_h_i_d_universal.html#a7f2123d1f20327600bb9e49a1ef5b0c7',1,'HIDUniversal::VID()']]], + ['vid',['VID',['../class_h_i_d_composite.html#acf516cb6242d1659c9bc77fe475c973e',1,'HIDComposite::VID()'],['../class_h_i_d_universal.html#a7f2123d1f20327600bb9e49a1ef5b0c7',1,'HIDUniversal::VID()'],['../class_u_s_b_h___m_i_d_i.html#aa578074365d77bb3e41063a18625dfe3',1,'USBH_MIDI::vid()']]], ['vidpidok',['VIDPIDOK',['../class_a_d_k.html#a9ad9aa3153c4cd1e083251bf42ab536f',1,'ADK::VIDPIDOK()'],['../class_b_t_d.html#ae0808ebf7578fc022b8f05c8779d3102',1,'BTD::VIDPIDOK()'],['../class_x_r21_b1411.html#a20c357d629c6cbb4f5f98211b5555906',1,'XR21B1411::VIDPIDOK()'],['../class_f_t_d_i.html#a534da68bb1ff411b30281fe52e8fec10',1,'FTDI::VIDPIDOK()'],['../class_p_s3_u_s_b.html#a2dd246a86a9d8a0453199a09b495e608',1,'PS3USB::VIDPIDOK()'],['../class_p_s4_u_s_b.html#a991ca2571cbd072749dd754df26faa5a',1,'PS4USB::VIDPIDOK()'],['../class_p_s_buzz.html#ae94840ce88d873664d1f1d8e46928acb',1,'PSBuzz::VIDPIDOK()'],['../class_u_s_b_device_config.html#af920743379d8c133dda4335d11601141',1,'USBDeviceConfig::VIDPIDOK()'],['../class_x_b_o_x_o_l_d.html#a6db4a09978cacebb93d1b4ea5ad676f2',1,'XBOXOLD::VIDPIDOK()'],['../class_x_b_o_x_o_n_e.html#a53082e8413a3e7046b7e96fa3183b0eb',1,'XBOXONE::VIDPIDOK()'],['../class_x_b_o_x_r_e_c_v.html#a119cff07be751ce16d7854fab6dc898c',1,'XBOXRECV::VIDPIDOK()'],['../class_x_b_o_x_u_s_b.html#aad0847615d298e8f65909f467216ca14',1,'XBOXUSB::VIDPIDOK()']]], ['vrtitles0',['vrTitles0',['../class_report_desc_parser_base.html#a42d34a0a49f987c9dcfdd4fb8d42bf0d',1,'ReportDescParserBase']]], ['vrtitles1',['vrTitles1',['../class_report_desc_parser_base.html#a41af57cb0fb0bbed7277bcd04a9e9fe9',1,'ReportDescParserBase']]], diff --git a/search/all_17.html b/search/all_17.html index 6d010fdd..f1e14b63 100644 --- a/search/all_17.html +++ b/search/all_17.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_17.js b/search/all_17.js index 4accb90b..e490cc8a 100644 --- a/search/all_17.js +++ b/search/all_17.js @@ -1,7 +1,7 @@ var searchData= [ - ['wiicamerareadme',['WiiCameraReadme',['../md__Users_Lauszus_Github_USB_Host_Shield_2_0_WiiCameraReadme.html',1,'']]], - ['watingforconnection',['watingForConnection',['../class_b_t_d.html#aa7735da01865bab01b569ee836173737',1,'BTD']]], + ['wiicamerareadme',['WiiCameraReadme',['../md___users_lauszus__github__u_s_b__host__shield_2_0__wii_camera_readme.html',1,'']]], + ['waitingforconnection',['waitingForConnection',['../class_b_t_d.html#a93a522edb2974185c7567b8f83860424',1,'BTD']]], ['wdescriptorlength',['wDescriptorLength',['../struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html#a0b160c43f6a6132c0debabd6ef171950',1,'USB_HID_DESCRIPTOR::wDescriptorLength()'],['../struct_h_i_d___c_l_a_s_s___d_e_s_c_r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e.html#a98251c1867caf1651f6e926952189201',1,'HID_CLASS_DESCRIPTOR_LEN_AND_TYPE::wDescriptorLength()']]], ['white',['WHITE',['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fda283fc479650da98250635b9c3c0e7e50',1,'WHITE(): controllerEnums.h'],['../controller_enums_8h.html#aac6fa7b0395b95cc528deaad0ce884a2ab548046646b36c12aa6ba841de500094',1,'White(): controllerEnums.h']]], ['wi_5fprotocol_5fbt',['WI_PROTOCOL_BT',['../_b_t_d_8h.html#a05903a9351c5ced6b8be27b2869e62af',1,'BTD.h']]], @@ -32,7 +32,7 @@ var searchData= ['windex',['wIndex',['../struct_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n.html#aae0d299b4d6e5ee396ace3f1b4cc7352',1,'CLASS_NOTIFICATION::wIndex()'],['../struct_s_e_t_u_p___p_k_t.html#a299d9f88d294369ea88b48b5026f4c7e',1,'SETUP_PKT::wIndex()']]], ['wlength',['wLength',['../struct_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n.html#a7933669f6b6379d7ee0605f50422cbe2',1,'CLASS_NOTIFICATION::wLength()'],['../struct_s_e_t_u_p___p_k_t.html#a1ec9b19c0ed1e66e399ad9cf3c4a6537',1,'SETUP_PKT::wLength()']]], ['wmaxpacketsize',['wMaxPacketSize',['../struct_u_s_b___e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r.html#af34105fa6bd0029d9c6b73d85f7853c6',1,'USB_ENDPOINT_DESCRIPTOR']]], - ['write',['Write',['../class_bulk_only.html#a45d327ddf87e01607c3a5b1849936053',1,'BulkOnly::Write()'],['../class_max___l_c_d.html#a43e5618993b77b81773af3a88cdf4c96',1,'Max_LCD::write()'],['../class_s_p_p.html#a6fb231316ca9b1028322d2d2188b27b0',1,'SPP::write(uint8_t data)'],['../class_s_p_p.html#a8bb421b7d948c3ffefc23aef95813192',1,'SPP::write(const uint8_t *data, size_t size)']]], + ['write',['write',['../class_max___l_c_d.html#a43e5618993b77b81773af3a88cdf4c96',1,'Max_LCD::write()'],['../class_s_p_p.html#a6fb231316ca9b1028322d2d2188b27b0',1,'SPP::write(uint8_t data)'],['../class_s_p_p.html#a8bb421b7d948c3ffefc23aef95813192',1,'SPP::write(const uint8_t *data, size_t size)'],['../class_bulk_only.html#a45d327ddf87e01607c3a5b1849936053',1,'BulkOnly::Write()']]], ['write_5fregister',['write_register',['../class_x_r21_b1411.html#acdc8c732d517b2748d3d6643ae5642ee',1,'XR21B1411']]], ['writeok',['WriteOk',['../class_bulk_only.html#af763ffffdd131949322d583fb4cd2737',1,'BulkOnly']]], ['writeprotected',['WriteProtected',['../class_bulk_only.html#a85d034c7da25090c36c9bdeb85338009',1,'BulkOnly']]], diff --git a/search/all_18.html b/search/all_18.html index ebae42c7..2a009025 100644 --- a/search/all_18.html +++ b/search/all_18.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_18.js b/search/all_18.js index ed6fe72f..f0362917 100644 --- a/search/all_18.js +++ b/search/all_18.js @@ -4,26 +4,48 @@ var searchData= ['xbox',['XBOX',['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdad4689acdcdf0e61373d52de14ff07eae',1,'controllerEnums.h']]], ['xbox360connected',['Xbox360Connected',['../class_x_b_o_x_r_e_c_v.html#ac07faada38e159f1e7831d90863ebe3a',1,'XBOXRECV::Xbox360Connected()'],['../class_x_b_o_x_u_s_b.html#a1c779ae5483a2f73426650242a37d868',1,'XBOXUSB::Xbox360Connected()']]], ['xbox_5fbuttons',['XBOX_BUTTONS',['../xbox_enums_8h.html#a35901eab017bd1df5d2361634309adbd',1,'xboxEnums.h']]], - ['xbox_5fcontrol_5fpipe',['XBOX_CONTROL_PIPE',['../_x_b_o_x_o_l_d_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXONE.h'],['../_x_b_o_x_r_e_c_v_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXUSB.h']]], - ['xbox_5finput_5fpipe',['XBOX_INPUT_PIPE',['../_x_b_o_x_o_l_d_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXONE.h'],['../_x_b_o_x_u_s_b_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXUSB.h']]], + ['xbox_5fcontrol_5fpipe',['XBOX_CONTROL_PIPE',['../_x_b_o_x_o_l_d_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXOLD.h'],['../_x_b_o_x_r_e_c_v_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXUSB.h']]], + ['xbox_5finput_5fpipe',['XBOX_INPUT_PIPE',['../_x_b_o_x_o_l_d_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXOLD.h'],['../_x_b_o_x_u_s_b_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXUSB.h']]], ['xbox_5finput_5fpipe_5f1',['XBOX_INPUT_PIPE_1',['../_x_b_o_x_r_e_c_v_8h.html#a2824b25aa9a384c29f27a4e1bb443799',1,'XBOXRECV.h']]], ['xbox_5finput_5fpipe_5f2',['XBOX_INPUT_PIPE_2',['../_x_b_o_x_r_e_c_v_8h.html#aab6feb681a78b190190bcc081868a485',1,'XBOXRECV.h']]], ['xbox_5finput_5fpipe_5f3',['XBOX_INPUT_PIPE_3',['../_x_b_o_x_r_e_c_v_8h.html#a86a3e5765d02bc043d5d1f674a7ffb0f',1,'XBOXRECV.h']]], ['xbox_5finput_5fpipe_5f4',['XBOX_INPUT_PIPE_4',['../_x_b_o_x_r_e_c_v_8h.html#a5acfdaefe74aba1632c71acb79c49671',1,'XBOXRECV.h']]], ['xbox_5fleds',['XBOX_LEDS',['../xbox_enums_8h.html#a0aa7965573ba74b8eecaa43f0543026e',1,'xboxEnums.h']]], - ['xbox_5fmax_5fendpoints',['XBOX_MAX_ENDPOINTS',['../_x_b_o_x_o_l_d_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXONE.h'],['../_x_b_o_x_r_e_c_v_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXUSB.h']]], + ['xbox_5fmax_5fendpoints',['XBOX_MAX_ENDPOINTS',['../_x_b_o_x_o_l_d_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXOLD.h'],['../_x_b_o_x_r_e_c_v_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXUSB.h']]], ['xbox_5fold_5fpid1',['XBOX_OLD_PID1',['../_x_b_o_x_o_l_d_8h.html#a8495cfaf2039ba2399a3c6f3e107c90c',1,'XBOXOLD.h']]], ['xbox_5fold_5fpid2',['XBOX_OLD_PID2',['../_x_b_o_x_o_l_d_8h.html#a9c98134e7ea99b12f7e4724af5b9799c',1,'XBOXOLD.h']]], ['xbox_5fold_5fpid3',['XBOX_OLD_PID3',['../_x_b_o_x_o_l_d_8h.html#a3856d8cf87b39551ed2278691ad891b8',1,'XBOXOLD.h']]], ['xbox_5fold_5fpid4',['XBOX_OLD_PID4',['../_x_b_o_x_o_l_d_8h.html#a3bf8a81e24b9c3df304fdafb06bbeb4e',1,'XBOXOLD.h']]], - ['xbox_5fone_5fpid',['XBOX_ONE_PID',['../_x_b_o_x_o_n_e_8h.html#a2b8eadd23fe690a1f2ecd2421e58682e',1,'XBOXONE.h']]], - ['xbox_5foutput_5fpipe',['XBOX_OUTPUT_PIPE',['../_x_b_o_x_o_l_d_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXONE.h'],['../_x_b_o_x_u_s_b_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXUSB.h']]], + ['xbox_5fone_5fcontrol_5fpipe',['XBOX_ONE_CONTROL_PIPE',['../_x_b_o_x_o_n_e_8h.html#a916c0ffc31c703da27b5f5cbdabea361',1,'XBOXONE.h']]], + ['xbox_5fone_5fep_5fmaxpktsize',['XBOX_ONE_EP_MAXPKTSIZE',['../_x_b_o_x_o_n_e_8h.html#aee7388a903006047acac4b071a28bd9d',1,'XBOXONE.h']]], + ['xbox_5fone_5finput_5fpipe',['XBOX_ONE_INPUT_PIPE',['../_x_b_o_x_o_n_e_8h.html#a996610ea223dd4c7756ad3af2efa821b',1,'XBOXONE.h']]], + ['xbox_5fone_5fmax_5fendpoints',['XBOX_ONE_MAX_ENDPOINTS',['../_x_b_o_x_o_n_e_8h.html#a8e9bf59d8bc051ff3fa38e2b327ade6e',1,'XBOXONE.h']]], + ['xbox_5fone_5foutput_5fpipe',['XBOX_ONE_OUTPUT_PIPE',['../_x_b_o_x_o_n_e_8h.html#a1a9da90da4584db2de7c84f45bdafc89',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid1',['XBOX_ONE_PID1',['../_x_b_o_x_o_n_e_8h.html#a10b005f24d84af7d10268faabea14c1e',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid10',['XBOX_ONE_PID10',['../_x_b_o_x_o_n_e_8h.html#ad7aedc27b8dfa49a7af8fce89432df0a',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid11',['XBOX_ONE_PID11',['../_x_b_o_x_o_n_e_8h.html#a3692a20fd79bcdfdcdec36b4acae8a76',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid12',['XBOX_ONE_PID12',['../_x_b_o_x_o_n_e_8h.html#a185f8aba65c0c20a1917efa6383d7ab0',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid2',['XBOX_ONE_PID2',['../_x_b_o_x_o_n_e_8h.html#abba090da8fd2707cb996899e798d1bd4',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid3',['XBOX_ONE_PID3',['../_x_b_o_x_o_n_e_8h.html#a6cc79a26eb1b03c3ca320f8adcd1d1bd',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid4',['XBOX_ONE_PID4',['../_x_b_o_x_o_n_e_8h.html#a148021ecf4a60cb1f25d59bb698fa7df',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid5',['XBOX_ONE_PID5',['../_x_b_o_x_o_n_e_8h.html#ae5883d7d1d2cdbbb5604865d67601696',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid6',['XBOX_ONE_PID6',['../_x_b_o_x_o_n_e_8h.html#aede8fa4d1fe42ddc8c48f0bb2bfeee0c',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid7',['XBOX_ONE_PID7',['../_x_b_o_x_o_n_e_8h.html#ad6a957e104a5e50381681e16229c3ced',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid8',['XBOX_ONE_PID8',['../_x_b_o_x_o_n_e_8h.html#ac3ac9e12165117b895d17af5f40ea5dd',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid9',['XBOX_ONE_PID9',['../_x_b_o_x_o_n_e_8h.html#abb2d1e64c4771836476e8aa1ffe46431',1,'XBOXONE.h']]], + ['xbox_5foutput_5fpipe',['XBOX_OUTPUT_PIPE',['../_x_b_o_x_o_l_d_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXOLD.h'],['../_x_b_o_x_u_s_b_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXUSB.h']]], ['xbox_5foutput_5fpipe_5f1',['XBOX_OUTPUT_PIPE_1',['../_x_b_o_x_r_e_c_v_8h.html#a962be1e740bce25cf37e111bd88be9bf',1,'XBOXRECV.h']]], ['xbox_5foutput_5fpipe_5f2',['XBOX_OUTPUT_PIPE_2',['../_x_b_o_x_r_e_c_v_8h.html#a8ba688a4bdb47869d7ee3f49b6d07b7c',1,'XBOXRECV.h']]], ['xbox_5foutput_5fpipe_5f3',['XBOX_OUTPUT_PIPE_3',['../_x_b_o_x_r_e_c_v_8h.html#afce4154cabb3a0d2c7eeb39b1c15d353',1,'XBOXRECV.h']]], ['xbox_5foutput_5fpipe_5f4',['XBOX_OUTPUT_PIPE_4',['../_x_b_o_x_r_e_c_v_8h.html#a7a74e0ea052831dbbb4a0973fffc8179',1,'XBOXRECV.h']]], - ['xbox_5freport_5fbuffer_5fsize',['XBOX_REPORT_BUFFER_SIZE',['../_x_b_o_x_o_n_e_8h.html#aaa3e91675875fbf14a37369f9513874a',1,'XBOX_REPORT_BUFFER_SIZE(): XBOXONE.h'],['../_x_b_o_x_u_s_b_8h.html#aaa3e91675875fbf14a37369f9513874a',1,'XBOX_REPORT_BUFFER_SIZE(): XBOXUSB.h']]], - ['xbox_5fvid',['XBOX_VID',['../_x_b_o_x_o_l_d_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXONE.h'],['../_x_b_o_x_r_e_c_v_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXUSB.h']]], + ['xbox_5freport_5fbuffer_5fsize',['XBOX_REPORT_BUFFER_SIZE',['../_x_b_o_x_u_s_b_8h.html#aaa3e91675875fbf14a37369f9513874a',1,'XBOXUSB.h']]], + ['xbox_5fvid',['XBOX_VID',['../_x_b_o_x_o_l_d_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXOLD.h'],['../_x_b_o_x_r_e_c_v_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXUSB.h']]], + ['xbox_5fvid1',['XBOX_VID1',['../_x_b_o_x_o_n_e_8h.html#a72296ecd70897c4fcfe4c614bbf2051b',1,'XBOXONE.h']]], + ['xbox_5fvid2',['XBOX_VID2',['../_x_b_o_x_o_n_e_8h.html#a85fb8c87d82f5c49fdb951d41247563f',1,'XBOXONE.h']]], + ['xbox_5fvid3',['XBOX_VID3',['../_x_b_o_x_o_n_e_8h.html#aac92aad3632dc9632d04d90342904b18',1,'XBOXONE.h']]], + ['xbox_5fvid4',['XBOX_VID4',['../_x_b_o_x_o_n_e_8h.html#a17464f5e0fb6afc082555ccb61c29668',1,'XBOXONE.h']]], + ['xbox_5fvid5',['XBOX_VID5',['../_x_b_o_x_o_n_e_8h.html#ade0eb2e0dd4f0c3fe45c82121f31d44d',1,'XBOXONE.h']]], + ['xbox_5fvid6',['XBOX_VID6',['../_x_b_o_x_o_n_e_8h.html#a02fcf09e41a7a1a28fd1bdb28dc098ed',1,'XBOXONE.h']]], ['xbox_5fwired_5fpid',['XBOX_WIRED_PID',['../_x_b_o_x_u_s_b_8h.html#af2ec224ac142016119c418de89470f1f',1,'XBOXUSB.h']]], ['xbox_5fwireless_5fpid',['XBOX_WIRELESS_PID',['../_x_b_o_x_u_s_b_8h.html#a10c2a7a8da78e76d7020c2c347f0a687',1,'XBOXUSB.h']]], ['xbox_5fwireless_5freceiver_5fpid',['XBOX_WIRELESS_RECEIVER_PID',['../_x_b_o_x_r_e_c_v_8h.html#a1a97ce2829a30b96ea6640d387d245a9',1,'XBOX_WIRELESS_RECEIVER_PID(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a1a97ce2829a30b96ea6640d387d245a9',1,'XBOX_WIRELESS_RECEIVER_PID(): XBOXUSB.h']]], @@ -60,7 +82,7 @@ var searchData= ['xr_5freg_5fcustomised_5fint',['XR_REG_CUSTOMISED_INT',['../cdc___x_r21_b1411_8h.html#ad8f26622feeb072c9caa5c5f95f3b6ed',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus',['XR_REG_ERROR_STATUS',['../cdc___x_r21_b1411_8h.html#af50fcb0d47dfcb8dae3020b98b90f5b1',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus_5fbreak',['XR_REG_ERROR_STATUS_BREAK',['../cdc___x_r21_b1411_8h.html#af2eb9c3a6ad7f95fc439139f8c430d74',1,'cdc_XR21B1411.h']]], - ['xr_5freg_5ferror_5fstatus_5fbreak_5fstatus',['XR_REG_ERROR_STATUS_BREAK_STATUS',['../cdc___x_r21_b1411_8h.html#a00ee098551f16993fb6e55c500203e70',1,'cdc_XR21B1411.h']]], + ['xr_5freg_5ferror_5fstatus_5fbreaking',['XR_REG_ERROR_STATUS_BREAKING',['../cdc___x_r21_b1411_8h.html#af7c8d263bd77298510c4e361b52f6fb6',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus_5ferror',['XR_REG_ERROR_STATUS_ERROR',['../cdc___x_r21_b1411_8h.html#aa62ce08310e0d1e091d826bae6a091a0',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus_5fframe',['XR_REG_ERROR_STATUS_FRAME',['../cdc___x_r21_b1411_8h.html#a6d68869ec17604caec0a490cd4e84191',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus_5fmask',['XR_REG_ERROR_STATUS_MASK',['../cdc___x_r21_b1411_8h.html#ae8dbffb7f958e6a5c0c0727dcebe8851',1,'cdc_XR21B1411.h']]], diff --git a/search/all_19.html b/search/all_19.html index 6c3ecee0..4e5b9451 100644 --- a/search/all_19.html +++ b/search/all_19.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_19.js b/search/all_19.js index 383316e2..99687a3e 100644 --- a/search/all_19.js +++ b/search/all_19.js @@ -3,5 +3,5 @@ var searchData= ['y',['y',['../structtouchpad_x_y.html#ac4ceb26c0ebba1c5a2691a1ecdb7dbae',1,'touchpadXY::y()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fda5596231eabd6cf29050967d5ac83ad84',1,'Y(): controllerEnums.h']]], ['yawgyroscale',['yawGyroScale',['../class_w_i_i.html#a0694969a30092b9b1dcb26120c7cff73',1,'WII']]], ['yawgyrospeed',['yawGyroSpeed',['../class_w_i_i.html#a4c373f956eddf2dd3a66d4a000459b85',1,'WII']]], - ['yellow',['yellow',['../union_p_s_b_u_z_z_buttons.html#a57f1a1aee6fd182d91c562140777f396',1,'PSBUZZButtons::yellow()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdae735a848bf82163a19236ead1c3ef2d2',1,'YELLOW(): controllerEnums.h'],['../controller_enums_8h.html#aac6fa7b0395b95cc528deaad0ce884a2abf28513245738599d13e3ce36bd16c82',1,'Yellow(): controllerEnums.h']]] + ['yellow',['yellow',['../union_p_s_b_u_z_z_buttons.html#a57f1a1aee6fd182d91c562140777f396',1,'PSBUZZButtons::yellow()'],['../controller_enums_8h.html#aac6fa7b0395b95cc528deaad0ce884a2abf28513245738599d13e3ce36bd16c82',1,'Yellow(): controllerEnums.h'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdae735a848bf82163a19236ead1c3ef2d2',1,'YELLOW(): controllerEnums.h']]] ]; diff --git a/search/all_1a.html b/search/all_1a.html index 2038d564..984ffe17 100644 --- a/search/all_1a.html +++ b/search/all_1a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_2.html b/search/all_2.html index d15ac65f..2f17735e 100644 --- a/search/all_2.html +++ b/search/all_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_2.js b/search/all_2.js index be2a263d..8e438340 100644 --- a/search/all_2.js +++ b/search/all_2.js @@ -16,7 +16,7 @@ var searchData= ['bcdusb',['bcdUSB',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#a621148cd71148fb15e136010480a34ac',1,'USB_DEVICE_DESCRIPTOR']]], ['bcharformat',['bCharFormat',['../struct_l_i_n_e___c_o_d_i_n_g.html#ae2c35eef8f7e35b5f2a3464225477d3c',1,'LINE_CODING']]], ['bconfigurationvalue',['bConfigurationValue',['../struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r.html#a568d08f2ae98670a707489645a67746b',1,'USB_CONFIGURATION_DESCRIPTOR']]], - ['bconfnum',['bConfNum',['../class_a_d_k.html#ae8fcc6a6fccab61116cea10dd1f17738',1,'ADK::bConfNum()'],['../class_b_t_d.html#a10c34527ae90e95791ac48ac7d1154a2',1,'BTD::bConfNum()'],['../class_a_c_m.html#af1a17c2d77625599da12b26cb0c90d39',1,'ACM::bConfNum()'],['../class_bulk_only.html#ab54f472ec9cd39abdb9f90867943d162',1,'BulkOnly::bConfNum()'],['../class_u_s_b_h___m_i_d_i.html#a441bf3b7bcd3ad8ca4e18f68fd03404c',1,'USBH_MIDI::bConfNum()']]], + ['bconfnum',['bConfNum',['../class_a_d_k.html#ae8fcc6a6fccab61116cea10dd1f17738',1,'ADK::bConfNum()'],['../class_b_t_d.html#a10c34527ae90e95791ac48ac7d1154a2',1,'BTD::bConfNum()'],['../class_a_c_m.html#af1a17c2d77625599da12b26cb0c90d39',1,'ACM::bConfNum()'],['../class_bulk_only.html#ab54f472ec9cd39abdb9f90867943d162',1,'BulkOnly::bConfNum()'],['../class_u_s_b_h___m_i_d_i.html#a441bf3b7bcd3ad8ca4e18f68fd03404c',1,'USBH_MIDI::bConfNum()'],['../class_x_b_o_x_o_n_e.html#ac6c75dcd5dfd5a9685a049f9bb8cb93f',1,'XBOXONE::bConfNum()']]], ['bcontroliface',['bControlIface',['../class_a_c_m.html#a5512d9e8c8c59371f16018fe8ce46b19',1,'ACM']]], ['bcountrycode',['bCountryCode',['../struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html#a340e5f812dbf7fe8caa13a1541a51f42',1,'USB_HID_DESCRIPTOR']]], ['bcswstatus',['bCSWStatus',['../struct_command_status_wrapper.html#a7170ed5bc0e2bbe04758e687beef4487',1,'CommandStatusWrapper']]], @@ -31,6 +31,8 @@ var searchData= ['bdeviceprotocol',['bDeviceProtocol',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#af205ea8c5729e0ddbf4dcbdf1636fe57',1,'USB_DEVICE_DESCRIPTOR']]], ['bdevicesubclass',['bDeviceSubClass',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#af01535d145805f4bfae66e21f1fc652d',1,'USB_DEVICE_DESCRIPTOR']]], ['begin',['begin',['../class_max___l_c_d.html#ac8ea275f8e9e27fb98ed21100f10fab7',1,'Max_LCD']]], + ['belkin_5ff8t065bf_5fpid',['BELKIN_F8T065BF_PID',['../_b_t_d_8h.html#ad142141f4e7685e31dce306128eaad5f',1,'BTD.h']]], + ['belkin_5ff8t065bf_5fvid',['BELKIN_F8T065BF_VID',['../_b_t_d_8h.html#a576e49b56b3cfb9d70b22bac8fe6796f',1,'BTD.h']]], ['bendpointaddress',['bEndpointAddress',['../struct_u_s_b___e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r.html#a23fbb539d72d10a6cb12efedf7d3457c',1,'USB_ENDPOINT_DESCRIPTOR']]], ['bfieldreplaceableunitcode',['bFieldReplaceableUnitCode',['../struct_request_sense_responce.html#ada14013a7a12b33b5d1ed747a48d5fe0',1,'RequestSenseResponce']]], ['bfunctionlength',['bFunctionLength',['../struct_c_a_l_l___m_g_m_n_t___f_u_n_c___d_e_s_c_r.html#ae5ab7e23e6f5268f042b1cec3986867a',1,'CALL_MGMNT_FUNC_DESCR::bFunctionLength()'],['../struct_a_c_m___f_u_n_c___d_e_s_c_r.html#a46c41dcbc0f3fdc37c0cd411b6b3213e',1,'ACM_FUNC_DESCR::bFunctionLength()'],['../struct_t_e_l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r.html#afac33a06771f8b063a8330849cb19386',1,'TEL_RINGER_FUNC_DESCR::bFunctionLength()']]], @@ -280,7 +282,7 @@ var searchData= ['bnumconfigurations',['bNumConfigurations',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#ab1b8db3992e0dceb2ba86f3bab1e5bca',1,'USB_DEVICE_DESCRIPTOR']]], ['bnumdescriptors',['bNumDescriptors',['../struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html#a05f827473d2eb4e67d1f99bc317b1eba',1,'USB_HID_DESCRIPTOR']]], ['bnumendpoints',['bNumEndpoints',['../struct_u_s_b___i_n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r.html#a3268bc05bb0147e19f97e50e702fc141',1,'USB_INTERFACE_DESCRIPTOR']]], - ['bnumep',['bNumEP',['../class_a_d_k.html#adf969d306da15baecd5c59bbb568053e',1,'ADK::bNumEP()'],['../class_b_t_d.html#a893dd35932821cddda7e482a1904af66',1,'BTD::bNumEP()'],['../class_a_c_m.html#a058b4d4a088a002fcde4fb2b75e33f93',1,'ACM::bNumEP()'],['../class_bulk_only.html#a6cb56ebd0307845321340919e2b35952',1,'BulkOnly::bNumEP()'],['../class_u_s_b_h___m_i_d_i.html#ab8b2dd096df7159ce8a09a19812307ca',1,'USBH_MIDI::bNumEP()']]], + ['bnumep',['bNumEP',['../class_a_d_k.html#adf969d306da15baecd5c59bbb568053e',1,'ADK::bNumEP()'],['../class_b_t_d.html#a893dd35932821cddda7e482a1904af66',1,'BTD::bNumEP()'],['../class_a_c_m.html#a058b4d4a088a002fcde4fb2b75e33f93',1,'ACM::bNumEP()'],['../class_bulk_only.html#a6cb56ebd0307845321340919e2b35952',1,'BulkOnly::bNumEP()'],['../class_u_s_b_h___m_i_d_i.html#ab8b2dd096df7159ce8a09a19812307ca',1,'USBH_MIDI::bNumEP()'],['../class_x_b_o_x_o_n_e.html#a958f262ed66dd5bf0ad7dfd54a369659',1,'XBOXONE::bNumEP()']]], ['bnuminterfaces',['bNumInterfaces',['../struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r.html#abd647927a872ac856c9f5aaf624bb99f',1,'USB_CONFIGURATION_DESCRIPTOR']]], ['bnumringerpatterns',['bNumRingerPatterns',['../struct_t_e_l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r.html#aca65dc577a0dbc13972da9ab26e25918',1,'TEL_RINGER_FUNC_DESCR']]], ['botleft',['BotLeft',['../_wii_8h.html#a1f2e8277faa24c51a9c99f3fbac8d80ba591404ff43c722c0641186be037b181d',1,'Wii.h']]], @@ -325,6 +327,7 @@ var searchData= ['bthid_2ecpp',['BTHID.cpp',['../_b_t_h_i_d_8cpp.html',1,'']]], ['bthid_2eh',['BTHID.h',['../_b_t_h_i_d_8h.html',1,'']]], ['btn',['btn',['../struct_p_s4_data.html#a60c0217c1879e1b16ae5d19a8c8695a3',1,'PS4Data::btn()'],['../union_p_s_b_u_z_z_buttons.html#a92ce392e7a31f155fbdf0fa0c8a5c83e',1,'PSBUZZButtons::btn()']]], + ['btransfertypemask',['bTransferTypeMask',['../class_u_s_b_h___m_i_d_i.html#a16cc26804628e2ea32513b4cce1aa7c3',1,'USBH_MIDI']]], ['btype',['bType',['../struct_hid_item_prefix.html#a16874c73fdb809e4c46407ca83684927',1,'HidItemPrefix']]], ['bulk_5fmaxpktsize',['BULK_MAXPKTSIZE',['../_b_t_d_8h.html#a32d591ef5742a99963130616ef146787',1,'BTD.h']]], ['bulkonly',['BulkOnly',['../class_bulk_only.html',1,'BulkOnly'],['../class_bulk_only.html#a530fb250b0a0c92b48bc57e2957ace25',1,'BulkOnly::BulkOnly()']]], diff --git a/search/all_3.html b/search/all_3.html index 9f526c67..a3e6f7db 100644 --- a/search/all_3.html +++ b/search/all_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_3.js b/search/all_3.js index 5972a1fe..5eaca65a 100644 --- a/search/all_3.js +++ b/search/all_3.js @@ -68,7 +68,7 @@ var searchData= ['cdcprolific_2ecpp',['cdcprolific.cpp',['../cdcprolific_8cpp.html',1,'']]], ['cdcprolific_2eh',['cdcprolific.h',['../cdcprolific_8h.html',1,'']]], ['charging',['Charging',['../_p_s3_enums_8h.html#add5c7a32e8138b44244caf07232161aea5a86ae1482947377a116685c168d1773',1,'PS3Enums.h']]], - ['check_5fpid',['CHECK_PID',['../cdcprolific_8h.html#acbcf4352865e074958a6ed3a5ba3f1cd',1,'cdcprolific.h']]], + ['check_5fpid',['CHECK_PID',['../cdcprolific_8h.html#af1a8fea671253f8bb7f124ad159f415a',1,'cdcprolific.h']]], ['checkhcihandle',['checkHciHandle',['../class_bluetooth_service.html#a2a3674a4bb5d409840995eabe07049bd',1,'BluetoothService']]], ['circle',['circle',['../union_p_s4_buttons.html#a95340b24c0846c778d2d8d0c983f4cdb',1,'PS4Buttons::circle()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdaa79c827759ea48f0735386c4b1188911',1,'CIRCLE(): controllerEnums.h']]], ['class_5fnotification',['CLASS_NOTIFICATION',['../struct_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n.html',1,'']]], @@ -115,7 +115,7 @@ var searchData= ['control_5fscid',['control_scid',['../class_b_t_h_i_d.html#acf6933a4988ed9f48c6e08cc7c9b906c',1,'BTHID']]], ['controllerenums_2eh',['controllerEnums.h',['../controller_enums_8h.html',1,'']]], ['counter',['counter',['../structtouchpad_x_y.html#ae52c34f2e6e66933e06b2f3448badcf0',1,'touchpadXY']]], - ['countsysexdatasize',['countSysExDataSize',['../class_u_s_b_h___m_i_d_i.html#afbb9e1d8440fb282c129ae26bff8d575',1,'USBH_MIDI']]], + ['countsysexdatasize',['countSysExDataSize',['../class_u_s_b_h___m_i_d_i.html#ab3b9ea78a331449802e4ce5a5a9c7f18',1,'USBH_MIDI']]], ['cp_5fmask_5fcompare_5fall',['CP_MASK_COMPARE_ALL',['../confdescparser_8h.html#ad6da11ef61b1efe75758448abeb4cbe7',1,'confdescparser.h']]], ['cp_5fmask_5fcompare_5fclass',['CP_MASK_COMPARE_CLASS',['../confdescparser_8h.html#a97d95efc3446be55adbb1801c356c55c',1,'confdescparser.h']]], ['cp_5fmask_5fcompare_5fprotocol',['CP_MASK_COMPARE_PROTOCOL',['../confdescparser_8h.html#a1e4d3b53bdd61abb61f20d5973e194d7',1,'confdescparser.h']]], diff --git a/search/all_4.html b/search/all_4.html index 7b814aa9..6452295d 100644 --- a/search/all_4.html +++ b/search/all_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_5.html b/search/all_5.html index d8de5560..e59e1d53 100644 --- a/search/all_5.html +++ b/search/all_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_5.js b/search/all_5.js index 2cc159dd..f137ca3f 100644 --- a/search/all_5.js +++ b/search/all_5.js @@ -7,7 +7,7 @@ var searchData= ['enable_5fuhs_5fdebugging',['ENABLE_UHS_DEBUGGING',['../settings_8h.html#a678b7105847680b596d1b4f9c0b5841c',1,'settings.h']]], ['enable_5fwii_5fir_5fcamera',['ENABLE_WII_IR_CAMERA',['../settings_8h.html#a251a8e974ddd0680dbcefaa3a4ae9ae8',1,'settings.h']]], ['encserv',['ENCSERV',['../struct_inquiry_response.html#a6b4df8c5346c15186c9f200997bfb287',1,'InquiryResponse']]], - ['endpointxtract',['EndpointXtract',['../class_a_d_k.html#aac2fac5410faea0e439b4f7e688b3d75',1,'ADK::EndpointXtract()'],['../class_b_t_d.html#a23928cd0e5711a2433aec763cfa55773',1,'BTD::EndpointXtract()'],['../class_a_c_m.html#af5b411a7ccc82bd77a7c5cfba6cd9a86',1,'ACM::EndpointXtract()'],['../class_f_t_d_i.html#a3e3f771b9f2a99fcedf7ed665b597109',1,'FTDI::EndpointXtract()'],['../class_usb_config_xtracter.html#a7717ea27bb756568e0deb544d8331370',1,'UsbConfigXtracter::EndpointXtract()'],['../class_h_i_d_boot.html#a04475d2cd6d8ae19d4e4149714fa4bef',1,'HIDBoot::EndpointXtract()'],['../class_h_i_d_composite.html#abdae8ebd9c5cc676c91829e41e3984a2',1,'HIDComposite::EndpointXtract()'],['../class_h_i_d_universal.html#ab9b13f27eca16e0accc14fff9bd318e2',1,'HIDUniversal::EndpointXtract()'],['../class_bulk_only.html#a13d33906543d5d6b44620f430dc729ff',1,'BulkOnly::EndpointXtract()']]], + ['endpointxtract',['EndpointXtract',['../class_a_d_k.html#aac2fac5410faea0e439b4f7e688b3d75',1,'ADK::EndpointXtract()'],['../class_b_t_d.html#a23928cd0e5711a2433aec763cfa55773',1,'BTD::EndpointXtract()'],['../class_a_c_m.html#af5b411a7ccc82bd77a7c5cfba6cd9a86',1,'ACM::EndpointXtract()'],['../class_f_t_d_i.html#a3e3f771b9f2a99fcedf7ed665b597109',1,'FTDI::EndpointXtract()'],['../class_usb_config_xtracter.html#a7717ea27bb756568e0deb544d8331370',1,'UsbConfigXtracter::EndpointXtract()'],['../class_h_i_d_boot.html#a04475d2cd6d8ae19d4e4149714fa4bef',1,'HIDBoot::EndpointXtract()'],['../class_h_i_d_composite.html#abdae8ebd9c5cc676c91829e41e3984a2',1,'HIDComposite::EndpointXtract()'],['../class_h_i_d_universal.html#ab9b13f27eca16e0accc14fff9bd318e2',1,'HIDUniversal::EndpointXtract()'],['../class_bulk_only.html#a13d33906543d5d6b44620f430dc729ff',1,'BulkOnly::EndpointXtract()'],['../class_x_b_o_x_o_n_e.html#a499cc378b8ae7d8fd63baa1b4dab97b5',1,'XBOXONE::EndpointXtract()']]], ['enerrorbuffertoosmall',['enErrorBufferTooSmall',['../class_report_desc_parser_base.html#a7d76bc2c7b1e93537bd0321c568dc47caf987a827c15a079e71ad438be18366d4',1,'ReportDescParserBase']]], ['enerrorincomplete',['enErrorIncomplete',['../class_report_desc_parser_base.html#a7d76bc2c7b1e93537bd0321c568dc47ca36c789b01edcb0e3bd8fc74ad6450975',1,'ReportDescParserBase']]], ['enerrorsuccess',['enErrorSuccess',['../class_report_desc_parser_base.html#a7d76bc2c7b1e93537bd0321c568dc47cab24601408ad7a26379df557dab8f073a',1,'ReportDescParserBase']]], @@ -15,7 +15,7 @@ var searchData= ['enhanced_5ffeatures',['enhanced_features',['../class_x_r21_b1411.html#a2f75b9dab539f642a9d6484faf5df767',1,'XR21B1411::enhanced_features()'],['../class_a_c_m.html#a2b7125159dc81b1a896ff23cefc71938',1,'ACM::enhanced_features()']]], ['enhanced_5fstatus',['enhanced_status',['../class_a_c_m.html#a4032d44491e27670c64b23f72f2a810a',1,'ACM']]], ['ep_5fdescr_5flen',['EP_DESCR_LEN',['../usb__ch9_8h.html#a83547c94285cfb215336a3c44aeea1b9',1,'usb_ch9.h']]], - ['ep_5fmaxpktsize',['EP_MAXPKTSIZE',['../_p_s3_u_s_b_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): PS3USB.h'],['../_x_b_o_x_o_l_d_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXONE.h'],['../_x_b_o_x_r_e_c_v_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXUSB.h']]], + ['ep_5fmaxpktsize',['EP_MAXPKTSIZE',['../_p_s3_u_s_b_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): PS3USB.h'],['../_x_b_o_x_o_l_d_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXOLD.h'],['../_x_b_o_x_r_e_c_v_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXUSB.h']]], ['epaddr',['epAddr',['../struct_ep_info.html#a9f92be74c75c037b39e2cae1eb49b89b',1,'EpInfo']]], ['epattribs',['epAttribs',['../struct_ep_info.html#a1dea928517c961235eef7b0876e69f10',1,'EpInfo']]], ['epcount',['epcount',['../struct_usb_device.html#a828814f5231b866ac665a24ec5edaa3a',1,'UsbDevice']]], @@ -23,7 +23,7 @@ var searchData= ['epdatainindexvsp',['epDataInIndexVSP',['../class_u_s_b_h___m_i_d_i.html#ac8b7d0994df1a059ccf6be62dd84cc9e',1,'USBH_MIDI']]], ['epdataoutindex',['epDataOutIndex',['../class_a_d_k.html#acfc5a7e45f15bba7ff8cd42552796624',1,'ADK::epDataOutIndex()'],['../class_a_c_m.html#a0dc940bc4f1bed7525bb768e37e6cb61',1,'ACM::epDataOutIndex()'],['../class_bulk_only.html#a8d527bdc285870f3571481a4fd982721',1,'BulkOnly::epDataOutIndex()'],['../class_u_s_b_h___m_i_d_i.html#a2a2e35a5ce5ffc8605837de2587db740',1,'USBH_MIDI::epDataOutIndex()']]], ['epdataoutindexvsp',['epDataOutIndexVSP',['../class_u_s_b_h___m_i_d_i.html#a42685ed17f731d3c8e3062d1e1b52f78',1,'USBH_MIDI']]], - ['epinfo',['EpInfo',['../struct_ep_info.html',1,'EpInfo'],['../struct_usb_device.html#a410d39fb7758157f57794335e990ed02',1,'UsbDevice::epinfo()'],['../class_a_d_k.html#a6ffc693d731ddeb9499c11e893fc467d',1,'ADK::epInfo()'],['../class_b_t_d.html#a91d92fee94e5a4cbca472bb3fd883e3e',1,'BTD::epInfo()'],['../class_a_c_m.html#a60fb6a365b78fb80a4a9842e364cf1a3',1,'ACM::epInfo()'],['../class_h_i_d_composite.html#a4101c34c5079bd827953368450140a9a',1,'HIDComposite::epInfo()'],['../class_h_i_d_universal.html#ad26d2e63130abac2059154bf5afbf152',1,'HIDUniversal::epInfo()'],['../class_bulk_only.html#aee2247fd0a251e4da36e8c09bbe6917f',1,'BulkOnly::epInfo()'],['../class_p_s3_u_s_b.html#a394dbb0a59b587210e5958f08dac48f1',1,'PS3USB::epInfo()'],['../class_u_s_b_h___m_i_d_i.html#ac947c1e0feea5cc9387c35bbd9bde961',1,'USBH_MIDI::epInfo()'],['../class_x_b_o_x_o_l_d.html#a06a318db8037f25a8d9bb62785dbacb9',1,'XBOXOLD::epInfo()'],['../class_x_b_o_x_o_n_e.html#a1d2fe54c2e3d0471aa4fa2a12bae6931',1,'XBOXONE::epInfo()'],['../class_x_b_o_x_r_e_c_v.html#af97c8d0efc945fa4ba1d120c8a5a9cbb',1,'XBOXRECV::epInfo()'],['../class_x_b_o_x_u_s_b.html#abef4a852d877d8136f198431ce54550f',1,'XBOXUSB::epInfo()']]], + ['epinfo',['EpInfo',['../struct_ep_info.html',1,'EpInfo'],['../struct_usb_device.html#a410d39fb7758157f57794335e990ed02',1,'UsbDevice::epinfo()'],['../class_a_d_k.html#a6ffc693d731ddeb9499c11e893fc467d',1,'ADK::epInfo()'],['../class_b_t_d.html#a91d92fee94e5a4cbca472bb3fd883e3e',1,'BTD::epInfo()'],['../class_a_c_m.html#a60fb6a365b78fb80a4a9842e364cf1a3',1,'ACM::epInfo()'],['../class_h_i_d_composite.html#a4101c34c5079bd827953368450140a9a',1,'HIDComposite::epInfo()'],['../class_h_i_d_universal.html#ad26d2e63130abac2059154bf5afbf152',1,'HIDUniversal::epInfo()'],['../class_bulk_only.html#aee2247fd0a251e4da36e8c09bbe6917f',1,'BulkOnly::epInfo()'],['../class_p_s3_u_s_b.html#a394dbb0a59b587210e5958f08dac48f1',1,'PS3USB::epInfo()'],['../class_u_s_b_h___m_i_d_i.html#ac947c1e0feea5cc9387c35bbd9bde961',1,'USBH_MIDI::epInfo()'],['../class_x_b_o_x_o_l_d.html#a06a318db8037f25a8d9bb62785dbacb9',1,'XBOXOLD::epInfo()'],['../class_x_b_o_x_o_n_e.html#a2915fc1f1f3a9c5333bfd643defa0621',1,'XBOXONE::epInfo()'],['../class_x_b_o_x_r_e_c_v.html#af97c8d0efc945fa4ba1d120c8a5a9cbb',1,'XBOXRECV::epInfo()'],['../class_x_b_o_x_u_s_b.html#abef4a852d877d8136f198431ce54550f',1,'XBOXUSB::epInfo()']]], ['epinterruptinindex',['epInterruptInIndex',['../class_a_c_m.html#a9b32207fdf256e5f8553ba4048b64307',1,'ACM::epInterruptInIndex()'],['../class_bulk_only.html#a03cd96b415990821bdce43b4004c85e4',1,'BulkOnly::epInterruptInIndex()'],['../class_u_s_b_h_i_d.html#a722462978813b2154698516b729e834d',1,'USBHID::epInterruptInIndex()']]], ['epinterruptoutindex',['epInterruptOutIndex',['../class_u_s_b_h_i_d.html#af9ae556d2a7a03309db403e45eab96e8',1,'USBHID']]], ['epmul',['epMUL',['../hidboot_8h.html#abbd1564d789b53fcf08fa5c4d9b0121d',1,'hidboot.h']]], @@ -53,5 +53,6 @@ var searchData= ['evtbuff',['evtBuff',['../struct_hub_event.html#a5a8016b368bc8ac993abae3f97b8306f',1,'HubEvent']]], ['ext_5fram',['EXT_RAM',['../settings_8h.html#afdb33d1e651e2cdd5574d3f9336fdb30',1,'settings.h']]], ['extendaddress',['extendAddress',['../_s_p_p_8h.html#af31032289d962bc2408debecc2823b8c',1,'SPP.h']]], - ['external_5fmask',['EXTERNAL_MASK',['../cdcprolific_8h.html#a18bdc379296992f91a263a8aa869cf24',1,'cdcprolific.h']]] + ['external_5fmask',['EXTERNAL_MASK',['../cdcprolific_8h.html#a18bdc379296992f91a263a8aa869cf24',1,'cdcprolific.h']]], + ['extractsysexdata',['extractSysExData',['../class_u_s_b_h___m_i_d_i.html#ab85f9e0da16ffe3ee9809aa27023c94c',1,'USBH_MIDI']]] ]; diff --git a/search/all_6.html b/search/all_6.html index 9ba0cc2b..f75a754e 100644 --- a/search/all_6.html +++ b/search/all_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_7.html b/search/all_7.html index 9384ec9b..88acd946 100644 --- a/search/all_7.html +++ b/search/all_7.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_8.html b/search/all_8.html index 37566c5d..b74d5fd8 100644 --- a/search/all_8.html +++ b/search/all_8.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_9.html b/search/all_9.html index c8c51023..95e88dd2 100644 --- a/search/all_9.html +++ b/search/all_9.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_9.js b/search/all_9.js index db4fd6ea..f4898788 100644 --- a/search/all_9.js +++ b/search/all_9.js @@ -2,8 +2,8 @@ var searchData= [ ['iconfiguration',['iConfiguration',['../struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r.html#a488103d763db8744459d2c94995458b0',1,'USB_CONFIGURATION_DESCRIPTOR']]], ['identifier',['identifier',['../class_bluetooth_service.html#ad643db609c7e2e3fae8904dbc7991262',1,'BluetoothService']]], - ['idproduct',['idProduct',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#adaec05748124a104c3d49008433719ba',1,'USB_DEVICE_DESCRIPTOR']]], - ['idvendor',['idVendor',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#ae3c7088fe6f7b521132d8f2b95f958bc',1,'USB_DEVICE_DESCRIPTOR']]], + ['idproduct',['idProduct',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#adaec05748124a104c3d49008433719ba',1,'USB_DEVICE_DESCRIPTOR::idProduct()'],['../class_u_s_b_h___m_i_d_i.html#ac7b56c71f8424ec0175f390264776bdd',1,'USBH_MIDI::idProduct()']]], + ['idvendor',['idVendor',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#ae3c7088fe6f7b521132d8f2b95f958bc',1,'USB_DEVICE_DESCRIPTOR::idVendor()'],['../class_u_s_b_h___m_i_d_i.html#aa7d217e3479a9116f8f2ce90c1177317',1,'USBH_MIDI::idVendor()']]], ['iinterface',['iInterface',['../struct_u_s_b___i_n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r.html#a391ad3184a29ddbe1e02ff1feca8f64a',1,'USB_INTERFACE_DESCRIPTOR']]], ['imanufacturer',['iManufacturer',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#ad16528e2a4018962f8d7d97036386eac',1,'USB_DEVICE_DESCRIPTOR']]], ['incominghiddevice',['incomingHIDDevice',['../class_b_t_d.html#a685d6371fb0c950ff6bad4510a8cc85a',1,'BTD']]], @@ -25,7 +25,7 @@ var searchData= ['iserialnumber',['iSerialNumber',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#ac9d321b21797ac7a6190ae9a2ffa1e3e',1,'USB_DEVICE_DESCRIPTOR']]], ['isircameraenabled',['isIRCameraEnabled',['../class_w_i_i.html#a0a444d7e348026e062751cf723877e8f',1,'WII']]], ['ismidifound',['isMidiFound',['../class_u_s_b_h___m_i_d_i.html#a59bedc39ad72d9a11ce040fda96e92ed',1,'USBH_MIDI']]], - ['isready',['isReady',['../class_a_d_k.html#a1dee02856625dfcac4b0cdd4e8672cef',1,'ADK::isReady()'],['../class_b_t_d.html#a1b2440748bdaaeb552a05b0f0902f5d8',1,'BTD::isReady()'],['../class_a_c_m.html#a7161082e88359738596dd12a706ee286',1,'ACM::isReady()'],['../class_h_i_d_boot.html#a9972f402f3141b2d71c0e59602675f68',1,'HIDBoot::isReady()'],['../class_h_i_d_composite.html#a3d12bc7e852944029b1314a95b84d6ce',1,'HIDComposite::isReady()'],['../class_h_i_d_universal.html#aa4be95e8f5164393ea4766f68c5b0ea8',1,'HIDUniversal::isReady()'],['../class_p_s3_u_s_b.html#a02a5b0244665d5a790d1020e51c94479',1,'PS3USB::isReady()'],['../class_x_b_o_x_o_l_d.html#af4d77a5108f2e6812ba00be1b0374829',1,'XBOXOLD::isReady()'],['../class_x_b_o_x_o_n_e.html#a23112f12ed914d1b0128675b1f59aace',1,'XBOXONE::isReady()'],['../class_x_b_o_x_r_e_c_v.html#a570568108edafee8d060aad8fe40db57',1,'XBOXRECV::isReady()'],['../class_x_b_o_x_u_s_b.html#ac2507bfe85896b7fcc772894a7a9f272',1,'XBOXUSB::isReady()']]], + ['isready',['isReady',['../class_a_d_k.html#a1dee02856625dfcac4b0cdd4e8672cef',1,'ADK::isReady()'],['../class_b_t_d.html#a1b2440748bdaaeb552a05b0f0902f5d8',1,'BTD::isReady()'],['../class_a_c_m.html#a7161082e88359738596dd12a706ee286',1,'ACM::isReady()'],['../class_f_t_d_i.html#a0e392f0f49843fa9ab0701950628b47b',1,'FTDI::isReady()'],['../class_h_i_d_boot.html#a9972f402f3141b2d71c0e59602675f68',1,'HIDBoot::isReady()'],['../class_h_i_d_composite.html#a3d12bc7e852944029b1314a95b84d6ce',1,'HIDComposite::isReady()'],['../class_h_i_d_universal.html#aa4be95e8f5164393ea4766f68c5b0ea8',1,'HIDUniversal::isReady()'],['../class_p_s3_u_s_b.html#a02a5b0244665d5a790d1020e51c94479',1,'PS3USB::isReady()'],['../class_x_b_o_x_o_l_d.html#af4d77a5108f2e6812ba00be1b0374829',1,'XBOXOLD::isReady()'],['../class_x_b_o_x_o_n_e.html#a23112f12ed914d1b0128675b1f59aace',1,'XBOXONE::isReady()'],['../class_x_b_o_x_r_e_c_v.html#a570568108edafee8d060aad8fe40db57',1,'XBOXRECV::isReady()'],['../class_x_b_o_x_u_s_b.html#ac2507bfe85896b7fcc772894a7a9f272',1,'XBOXUSB::isReady()']]], ['istouching',['isTouching',['../class_p_s4_parser.html#a6770a72c17062c2e00fb3602435fcade',1,'PS4Parser']]], ['itemparsestate',['itemParseState',['../class_report_desc_parser_base.html#adfc790524e25a7ad715b1e9adff54a25',1,'ReportDescParserBase']]], ['itemprefix',['itemPrefix',['../class_report_desc_parser_base.html#a70693c641100c952022ec5c160de1a8d',1,'ReportDescParserBase']]], diff --git a/search/all_a.html b/search/all_a.html index 4cb31f0c..3148a8e5 100644 --- a/search/all_a.html +++ b/search/all_a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_b.html b/search/all_b.html index d34a612e..f2a3c8d0 100644 --- a/search/all_b.html +++ b/search/all_b.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_c.html b/search/all_c.html index c1ae2cae..63768107 100644 --- a/search/all_c.html +++ b/search/all_c.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_c.js b/search/all_c.js index 3a04ba86..0568b6d7 100644 --- a/search/all_c.js +++ b/search/all_c.js @@ -121,6 +121,7 @@ var searchData= ['linked',['Linked',['../struct_inquiry_response.html#ac0ee71a9c07b0c1fd9ff09461a81fa0e',1,'InquiryResponse']]], ['lockmedia',['LockMedia',['../class_bulk_only.html#ae7561d686d0b1374b5f9937d6ec8a035',1,'BulkOnly']]], ['logpwrswitchmode',['LogPwrSwitchMode',['../struct_hub_descriptor.html#a68084f6fd86bff9598573ac845be6fe3',1,'HubDescriptor']]], + ['lookupmsgsize',['lookupMsgSize',['../class_u_s_b_h___m_i_d_i.html#a8218ae22033b7d2120df75cfe696070e',1,'USBH_MIDI']]], ['low',['Low',['../_p_s3_enums_8h.html#add5c7a32e8138b44244caf07232161aea7a352a3dd2accc1dd65a4538c3754ee8',1,'PS3Enums.h']]], ['lowspeed',['lowspeed',['../struct_usb_device.html#a86a815577ad7883437d3ca72b32b8e8a',1,'UsbDevice']]], ['lshost',['LSHOST',['../max3421e_8h.html#aa05ee2be883f4b96948e18b0d55ab5c2',1,'max3421e.h']]], diff --git a/search/all_d.html b/search/all_d.html index 712223c6..cc52c79f 100644 --- a/search/all_d.html +++ b/search/all_d.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_d.js b/search/all_d.js index d4991a57..981a4de9 100644 --- a/search/all_d.js +++ b/search/all_d.js @@ -78,9 +78,11 @@ var searchData= ['memrchr_5fp',['memrchr_P',['../version__helper_8h.html#a243235b923ff7a3411ed43653abc727a',1,'version_helper.h']]], ['message_2ecpp',['message.cpp',['../message_8cpp.html',1,'']]], ['message_2eh',['message.h',['../message_8h.html',1,'']]], + ['mfk_5fcastuint8t',['MFK_CASTUINT8T',['../settings_8h.html#ab5a06671af5c2f1154fb653956959838',1,'settings.h']]], ['mic',['mic',['../struct_p_s4_status.html#a1d752bdc67f08a09fbb8feb6a0db5568',1,'PS4Status']]], ['midi_5fevent_5fpacket_5fsize',['MIDI_EVENT_PACKET_SIZE',['../usbh__midi_8h.html#a0cb5d0be715a42f36440b29eaa728c58',1,'usbh_midi.h']]], ['midi_5fmax_5fendpoints',['MIDI_MAX_ENDPOINTS',['../usbh__midi_8h.html#a209d19007c615d3f300a5d3717776a45',1,'usbh_midi.h']]], + ['midi_5fmax_5fsysex_5fsize',['MIDI_MAX_SYSEX_SIZE',['../usbh__midi_8h.html#ac62d581ae088d3699a4f39672ac2ff51',1,'usbh_midi.h']]], ['minus',['MINUS',['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdaf613d73b4e7b570ffd967df4a13c4225',1,'controllerEnums.h']]], ['misc',['Misc',['../struct_c_d_b12.html#af59803ec81c006b7bdefc03d80579d07',1,'CDB12::Misc()'],['../struct_c_d_b___l_b_a32__16.html#a50e5250b635b8782b1a82f4f137feefb',1,'CDB_LBA32_16::Misc()'],['../struct_c_d_b___l_b_a64__16.html#a5f3b9efa508e9e3d79a70414ea5c74ff',1,'CDB_LBA64_16::Misc()']]], ['misc2',['Misc2',['../struct_c_d_b10.html#a26b2c33b7867c33d19e77c6d873d7924',1,'CDB10::Misc2()'],['../struct_c_d_b___l_b_a32__16.html#a3809ba2a5399bd407b50b04b8c83cb9f',1,'CDB_LBA32_16::Misc2()'],['../struct_c_d_b___l_b_a64__16.html#a9a71353cc6ecb838dfd560a3c985e4a6',1,'CDB_LBA64_16::Misc2()']]], diff --git a/search/all_e.html b/search/all_e.html index d553ffa2..85b39bd4 100644 --- a/search/all_e.html +++ b/search/all_e.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_f.html b/search/all_f.html index c77391a0..89fa15a6 100644 --- a/search/all_f.html +++ b/search/all_f.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/all_f.js b/search/all_f.js index 5d17846b..2c6335ff 100644 --- a/search/all_f.js +++ b/search/all_f.js @@ -18,7 +18,7 @@ var searchData= ['onrightbuttondown',['OnRightButtonDown',['../class_mouse_report_parser.html#a6884349e6b2de0cbfedf3e1a77c23870',1,'MouseReportParser']]], ['onrightbuttonup',['OnRightButtonUp',['../class_mouse_report_parser.html#a1bdfee565073cd8b77cbeb9e184c174f',1,'MouseReportParser']]], ['opcode',['Opcode',['../struct_b_a_s_i_c_c_d_b.html#a64d8bea0216a84b8ba8c8f411ceae2c3',1,'BASICCDB::Opcode()'],['../struct_c_d_b6.html#af2b06ea02758f3096f48da306371a7d8',1,'CDB6::Opcode()'],['../struct_c_d_b10.html#af18bbff0fec1a1d31c741c542f2e92d6',1,'CDB10::Opcode()'],['../struct_c_d_b12.html#a75c7fb542c6c0ad6ba4a0e95a49ba1e1',1,'CDB12::Opcode()'],['../struct_c_d_b___l_b_a32__16.html#abc471d94f83905561d961f4f90629521',1,'CDB_LBA32_16::Opcode()'],['../struct_c_d_b___l_b_a64__16.html#a20868e9b945a51e146af8a31cad92977',1,'CDB_LBA64_16::Opcode()']]], - ['operator_20bool',['operator bool',['../class_s_p_p.html#ac90f0765c478bd624cee3b8d493d8432',1,'SPP']]], + ['operator_20bool',['operator bool',['../class_s_p_p.html#ac90f0765c478bd624cee3b8d493d8432',1,'SPP::operator bool()'],['../class_u_s_b_h___m_i_d_i.html#aeac79d834709ecc079551df2e16a7ffe',1,'USBH_MIDI::operator bool()']]], ['options',['options',['../union_p_s4_buttons.html#a27f1b87f473ace3a4465ae999858357b',1,'PS4Buttons::options()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fda1b20f1b4adb6ff9778b284fb46f6f99d',1,'OPTIONS(): controllerEnums.h']]], ['orange',['orange',['../union_p_s_b_u_z_z_buttons.html#a6acaf988a2a5433c539e09dd722398ab',1,'PSBUZZButtons::orange()'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdace9ee4c1a6b777940c7f3a766a9a88d4',1,'ORANGE(): controllerEnums.h']]], ['otg_5ffeature_5fa_5falt_5fhnp_5fsupport',['OTG_FEATURE_A_ALT_HNP_SUPPORT',['../usb__ch9_8h.html#a4c05deae742762f3110366a7bb8bffc2',1,'usb_ch9.h']]], diff --git a/search/classes_0.html b/search/classes_0.html index 025587a7..e935fdf7 100644 --- a/search/classes_0.html +++ b/search/classes_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_1.html b/search/classes_1.html index 86dc4ffe..3df6e80a 100644 --- a/search/classes_1.html +++ b/search/classes_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_10.html b/search/classes_10.html index f306d99d..0477a266 100644 --- a/search/classes_10.html +++ b/search/classes_10.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_2.html b/search/classes_2.html index 014caf80..028694ff 100644 --- a/search/classes_2.html +++ b/search/classes_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_3.html b/search/classes_3.html index 2e972011..2b1abe38 100644 --- a/search/classes_3.html +++ b/search/classes_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_4.html b/search/classes_4.html index 776fee37..87352149 100644 --- a/search/classes_4.html +++ b/search/classes_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_5.html b/search/classes_5.html index 69bbcc8b..ba8b1c69 100644 --- a/search/classes_5.html +++ b/search/classes_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_6.html b/search/classes_6.html index 2db08a01..f5850938 100644 --- a/search/classes_6.html +++ b/search/classes_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_7.html b/search/classes_7.html index fd67346e..6418529c 100644 --- a/search/classes_7.html +++ b/search/classes_7.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_8.html b/search/classes_8.html index 369fe529..87af6f60 100644 --- a/search/classes_8.html +++ b/search/classes_8.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_9.html b/search/classes_9.html index 188dbb38..f830ae04 100644 --- a/search/classes_9.html +++ b/search/classes_9.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_a.html b/search/classes_a.html index e7610d35..0fd3b7ac 100644 --- a/search/classes_a.html +++ b/search/classes_a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_b.html b/search/classes_b.html index 4fc0a3f6..886abdfc 100644 --- a/search/classes_b.html +++ b/search/classes_b.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_c.html b/search/classes_c.html index d2a582ec..52ec2676 100644 --- a/search/classes_c.html +++ b/search/classes_c.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_d.html b/search/classes_d.html index 0fa42149..652508df 100644 --- a/search/classes_d.html +++ b/search/classes_d.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_e.html b/search/classes_e.html index 238ea09c..7d4e9a56 100644 --- a/search/classes_e.html +++ b/search/classes_e.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/classes_f.html b/search/classes_f.html index 94d95003..fa6ed25e 100644 --- a/search/classes_f.html +++ b/search/classes_f.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_0.html b/search/defines_0.html index 17cfaa2c..3bffafa9 100644 --- a/search/defines_0.html +++ b/search/defines_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_1.html b/search/defines_1.html index 5c0025e2..ca5bb94e 100644 --- a/search/defines_1.html +++ b/search/defines_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_10.html b/search/defines_10.html index 26f83fac..92fda5b1 100644 --- a/search/defines_10.html +++ b/search/defines_10.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_10.js b/search/defines_10.js index dc97156a..d2f8cc99 100644 --- a/search/defines_10.js +++ b/search/defines_10.js @@ -35,6 +35,7 @@ var searchData= ['ps3move_5fpid',['PS3MOVE_PID',['../_b_t_d_8h.html#afc242b8a1b867f79c49ad78e3a47b37f',1,'PS3MOVE_PID(): BTD.h'],['../_p_s3_u_s_b_8h.html#afc242b8a1b867f79c49ad78e3a47b37f',1,'PS3MOVE_PID(): PS3USB.h']]], ['ps3navigation_5fpid',['PS3NAVIGATION_PID',['../_b_t_d_8h.html#a54903b410722a45f8246653cd4d00632',1,'PS3NAVIGATION_PID(): BTD.h'],['../_p_s3_u_s_b_8h.html#a54903b410722a45f8246653cd4d00632',1,'PS3NAVIGATION_PID(): PS3USB.h']]], ['ps4_5fpid',['PS4_PID',['../_p_s4_u_s_b_8h.html#a776f4d4694166dbe732e585ebb8c816e',1,'PS4USB.h']]], + ['ps4_5fpid_5fslim',['PS4_PID_SLIM',['../_p_s4_u_s_b_8h.html#a7b76473e5da043c7b3ce1eefebe77dbc',1,'PS4USB.h']]], ['ps4_5fvid',['PS4_VID',['../_p_s4_u_s_b_8h.html#ac878fc36cc22549eb8a7ab6371197877',1,'PS4USB.h']]], ['psbuzz_5fpid',['PSBUZZ_PID',['../_p_s_buzz_8h.html#a0dd7a843e3d17c9404bdfa2723b3e1d5',1,'PSBuzz.h']]], ['psbuzz_5fvid',['PSBUZZ_VID',['../_p_s_buzz_8h.html#aa550e9c001056b0ee39428704cde0e5d',1,'PSBuzz.h']]], diff --git a/search/defines_11.html b/search/defines_11.html index 82a22517..54ac8637 100644 --- a/search/defines_11.html +++ b/search/defines_11.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_12.html b/search/defines_12.html index 86e4f322..5681fe26 100644 --- a/search/defines_12.html +++ b/search/defines_12.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_12.js b/search/defines_12.js index 4a89bfb5..e90e499a 100644 --- a/search/defines_12.js +++ b/search/defines_12.js @@ -79,7 +79,7 @@ var searchData= ['sdp_5fservice_5fsearch_5fattribute_5fresponse_5fpdu',['SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU',['../_s_p_p_8h.html#a42a6f00a3828a932bae1509c813b5c98',1,'SPP.h']]], ['se0',['SE0',['../max3421e_8h.html#a3cb02fdd2d36f8a755c4b1946a0b0063',1,'max3421e.h']]], ['se1',['SE1',['../max3421e_8h.html#a5c3d7b0a5b0933cfc0183cd36ea91f16',1,'max3421e.h']]], - ['sendlcdpins',['SENDlcdPins',['../max___l_c_d_8cpp.html#a8b1b918f6a2c50b113737fe4a8e493ed',1,'max_LCD.cpp']]], + ['sendlcdpins',['SENDlcdPins',['../max___l_c_d_8cpp.html#ab9142420ababc8fe568edee4796183ba',1,'max_LCD.cpp']]], ['serial_5fstate',['SERIAL_STATE',['../cdcacm_8h.html#a8e278dbd137d5d873d24e1647be9d4e6',1,'cdcacm.h']]], ['serialport_5fuuid',['SERIALPORT_UUID',['../_s_p_p_8h.html#a677a1fc4883355f7fad87551cc003c1b',1,'SPP.h']]], ['set_5fdcr0',['SET_DCR0',['../cdcprolific_8h.html#a0301d2726a35e10b2e05965cca3a4d3d',1,'cdcprolific.h']]], diff --git a/search/defines_13.html b/search/defines_13.html index 3663f338..bde0e3f4 100644 --- a/search/defines_13.html +++ b/search/defines_13.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_14.html b/search/defines_14.html index 4d32ebc8..e495581e 100644 --- a/search/defines_14.html +++ b/search/defines_14.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_14.js b/search/defines_14.js index ad9c448a..f1993e58 100644 --- a/search/defines_14.js +++ b/search/defines_14.js @@ -98,6 +98,7 @@ var searchData= ['usb_5fsetup_5ftype_5fclass',['USB_SETUP_TYPE_CLASS',['../usb__ch9_8h.html#acf3fd30992e9fe01f1bac9aaa7fea61b',1,'usb_ch9.h']]], ['usb_5fsetup_5ftype_5fstandard',['USB_SETUP_TYPE_STANDARD',['../usb__ch9_8h.html#a3b51a35acaa76cafbb987c07186a7868',1,'usb_ch9.h']]], ['usb_5fsetup_5ftype_5fvendor',['USB_SETUP_TYPE_VENDOR',['../usb__ch9_8h.html#a876bdd74d8bfb072121b9643556271ba',1,'usb_ch9.h']]], + ['usb_5fspi',['USB_SPI',['../settings_8h.html#a00c696e002848a253c812ca2f4509f04',1,'settings.h']]], ['usb_5fstate_5faddressing',['USB_STATE_ADDRESSING',['../_usb_core_8h.html#a474a95baaeb99abd17538c2a1364bf96',1,'UsbCore.h']]], ['usb_5fstate_5fconfiguring',['USB_STATE_CONFIGURING',['../_usb_core_8h.html#aac8c844e6a20f42298d70e4438a029e5',1,'UsbCore.h']]], ['usb_5fstate_5fdetached',['USB_STATE_DETACHED',['../_usb_core_8h.html#ae7fd7c5bb6dc87f44724dde2ad57df87',1,'UsbCore.h']]], diff --git a/search/defines_15.html b/search/defines_15.html index 5cc5b5a3..08482afa 100644 --- a/search/defines_15.html +++ b/search/defines_15.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_16.html b/search/defines_16.html index 7cfe8dda..6f7c2b3f 100644 --- a/search/defines_16.html +++ b/search/defines_16.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_17.html b/search/defines_17.html index 98dc84c6..e43115d6 100644 --- a/search/defines_17.html +++ b/search/defines_17.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_17.js b/search/defines_17.js index e59295c6..11c32048 100644 --- a/search/defines_17.js +++ b/search/defines_17.js @@ -1,24 +1,46 @@ var searchData= [ - ['xbox_5fcontrol_5fpipe',['XBOX_CONTROL_PIPE',['../_x_b_o_x_o_l_d_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXONE.h'],['../_x_b_o_x_r_e_c_v_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXUSB.h']]], - ['xbox_5finput_5fpipe',['XBOX_INPUT_PIPE',['../_x_b_o_x_o_l_d_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXONE.h'],['../_x_b_o_x_u_s_b_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXUSB.h']]], + ['xbox_5fcontrol_5fpipe',['XBOX_CONTROL_PIPE',['../_x_b_o_x_o_l_d_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXOLD.h'],['../_x_b_o_x_r_e_c_v_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a8f4ee68cc0f05690f5f26104c7d9e490',1,'XBOX_CONTROL_PIPE(): XBOXUSB.h']]], + ['xbox_5finput_5fpipe',['XBOX_INPUT_PIPE',['../_x_b_o_x_o_l_d_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXOLD.h'],['../_x_b_o_x_u_s_b_8h.html#a4fd9ad9bf7a7d5767940c2ec224ef5e8',1,'XBOX_INPUT_PIPE(): XBOXUSB.h']]], ['xbox_5finput_5fpipe_5f1',['XBOX_INPUT_PIPE_1',['../_x_b_o_x_r_e_c_v_8h.html#a2824b25aa9a384c29f27a4e1bb443799',1,'XBOXRECV.h']]], ['xbox_5finput_5fpipe_5f2',['XBOX_INPUT_PIPE_2',['../_x_b_o_x_r_e_c_v_8h.html#aab6feb681a78b190190bcc081868a485',1,'XBOXRECV.h']]], ['xbox_5finput_5fpipe_5f3',['XBOX_INPUT_PIPE_3',['../_x_b_o_x_r_e_c_v_8h.html#a86a3e5765d02bc043d5d1f674a7ffb0f',1,'XBOXRECV.h']]], ['xbox_5finput_5fpipe_5f4',['XBOX_INPUT_PIPE_4',['../_x_b_o_x_r_e_c_v_8h.html#a5acfdaefe74aba1632c71acb79c49671',1,'XBOXRECV.h']]], - ['xbox_5fmax_5fendpoints',['XBOX_MAX_ENDPOINTS',['../_x_b_o_x_o_l_d_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXONE.h'],['../_x_b_o_x_r_e_c_v_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXUSB.h']]], + ['xbox_5fmax_5fendpoints',['XBOX_MAX_ENDPOINTS',['../_x_b_o_x_o_l_d_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXOLD.h'],['../_x_b_o_x_r_e_c_v_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#af35f872fc33e690571eb99de648e8e96',1,'XBOX_MAX_ENDPOINTS(): XBOXUSB.h']]], ['xbox_5fold_5fpid1',['XBOX_OLD_PID1',['../_x_b_o_x_o_l_d_8h.html#a8495cfaf2039ba2399a3c6f3e107c90c',1,'XBOXOLD.h']]], ['xbox_5fold_5fpid2',['XBOX_OLD_PID2',['../_x_b_o_x_o_l_d_8h.html#a9c98134e7ea99b12f7e4724af5b9799c',1,'XBOXOLD.h']]], ['xbox_5fold_5fpid3',['XBOX_OLD_PID3',['../_x_b_o_x_o_l_d_8h.html#a3856d8cf87b39551ed2278691ad891b8',1,'XBOXOLD.h']]], ['xbox_5fold_5fpid4',['XBOX_OLD_PID4',['../_x_b_o_x_o_l_d_8h.html#a3bf8a81e24b9c3df304fdafb06bbeb4e',1,'XBOXOLD.h']]], - ['xbox_5fone_5fpid',['XBOX_ONE_PID',['../_x_b_o_x_o_n_e_8h.html#a2b8eadd23fe690a1f2ecd2421e58682e',1,'XBOXONE.h']]], - ['xbox_5foutput_5fpipe',['XBOX_OUTPUT_PIPE',['../_x_b_o_x_o_l_d_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXONE.h'],['../_x_b_o_x_u_s_b_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXUSB.h']]], + ['xbox_5fone_5fcontrol_5fpipe',['XBOX_ONE_CONTROL_PIPE',['../_x_b_o_x_o_n_e_8h.html#a916c0ffc31c703da27b5f5cbdabea361',1,'XBOXONE.h']]], + ['xbox_5fone_5fep_5fmaxpktsize',['XBOX_ONE_EP_MAXPKTSIZE',['../_x_b_o_x_o_n_e_8h.html#aee7388a903006047acac4b071a28bd9d',1,'XBOXONE.h']]], + ['xbox_5fone_5finput_5fpipe',['XBOX_ONE_INPUT_PIPE',['../_x_b_o_x_o_n_e_8h.html#a996610ea223dd4c7756ad3af2efa821b',1,'XBOXONE.h']]], + ['xbox_5fone_5fmax_5fendpoints',['XBOX_ONE_MAX_ENDPOINTS',['../_x_b_o_x_o_n_e_8h.html#a8e9bf59d8bc051ff3fa38e2b327ade6e',1,'XBOXONE.h']]], + ['xbox_5fone_5foutput_5fpipe',['XBOX_ONE_OUTPUT_PIPE',['../_x_b_o_x_o_n_e_8h.html#a1a9da90da4584db2de7c84f45bdafc89',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid1',['XBOX_ONE_PID1',['../_x_b_o_x_o_n_e_8h.html#a10b005f24d84af7d10268faabea14c1e',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid10',['XBOX_ONE_PID10',['../_x_b_o_x_o_n_e_8h.html#ad7aedc27b8dfa49a7af8fce89432df0a',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid11',['XBOX_ONE_PID11',['../_x_b_o_x_o_n_e_8h.html#a3692a20fd79bcdfdcdec36b4acae8a76',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid12',['XBOX_ONE_PID12',['../_x_b_o_x_o_n_e_8h.html#a185f8aba65c0c20a1917efa6383d7ab0',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid2',['XBOX_ONE_PID2',['../_x_b_o_x_o_n_e_8h.html#abba090da8fd2707cb996899e798d1bd4',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid3',['XBOX_ONE_PID3',['../_x_b_o_x_o_n_e_8h.html#a6cc79a26eb1b03c3ca320f8adcd1d1bd',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid4',['XBOX_ONE_PID4',['../_x_b_o_x_o_n_e_8h.html#a148021ecf4a60cb1f25d59bb698fa7df',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid5',['XBOX_ONE_PID5',['../_x_b_o_x_o_n_e_8h.html#ae5883d7d1d2cdbbb5604865d67601696',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid6',['XBOX_ONE_PID6',['../_x_b_o_x_o_n_e_8h.html#aede8fa4d1fe42ddc8c48f0bb2bfeee0c',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid7',['XBOX_ONE_PID7',['../_x_b_o_x_o_n_e_8h.html#ad6a957e104a5e50381681e16229c3ced',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid8',['XBOX_ONE_PID8',['../_x_b_o_x_o_n_e_8h.html#ac3ac9e12165117b895d17af5f40ea5dd',1,'XBOXONE.h']]], + ['xbox_5fone_5fpid9',['XBOX_ONE_PID9',['../_x_b_o_x_o_n_e_8h.html#abb2d1e64c4771836476e8aa1ffe46431',1,'XBOXONE.h']]], + ['xbox_5foutput_5fpipe',['XBOX_OUTPUT_PIPE',['../_x_b_o_x_o_l_d_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXOLD.h'],['../_x_b_o_x_u_s_b_8h.html#a92d2d844a70224a10c100c0a877aacfe',1,'XBOX_OUTPUT_PIPE(): XBOXUSB.h']]], ['xbox_5foutput_5fpipe_5f1',['XBOX_OUTPUT_PIPE_1',['../_x_b_o_x_r_e_c_v_8h.html#a962be1e740bce25cf37e111bd88be9bf',1,'XBOXRECV.h']]], ['xbox_5foutput_5fpipe_5f2',['XBOX_OUTPUT_PIPE_2',['../_x_b_o_x_r_e_c_v_8h.html#a8ba688a4bdb47869d7ee3f49b6d07b7c',1,'XBOXRECV.h']]], ['xbox_5foutput_5fpipe_5f3',['XBOX_OUTPUT_PIPE_3',['../_x_b_o_x_r_e_c_v_8h.html#afce4154cabb3a0d2c7eeb39b1c15d353',1,'XBOXRECV.h']]], ['xbox_5foutput_5fpipe_5f4',['XBOX_OUTPUT_PIPE_4',['../_x_b_o_x_r_e_c_v_8h.html#a7a74e0ea052831dbbb4a0973fffc8179',1,'XBOXRECV.h']]], - ['xbox_5freport_5fbuffer_5fsize',['XBOX_REPORT_BUFFER_SIZE',['../_x_b_o_x_o_n_e_8h.html#aaa3e91675875fbf14a37369f9513874a',1,'XBOX_REPORT_BUFFER_SIZE(): XBOXONE.h'],['../_x_b_o_x_u_s_b_8h.html#aaa3e91675875fbf14a37369f9513874a',1,'XBOX_REPORT_BUFFER_SIZE(): XBOXUSB.h']]], - ['xbox_5fvid',['XBOX_VID',['../_x_b_o_x_o_l_d_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXONE.h'],['../_x_b_o_x_r_e_c_v_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXUSB.h']]], + ['xbox_5freport_5fbuffer_5fsize',['XBOX_REPORT_BUFFER_SIZE',['../_x_b_o_x_u_s_b_8h.html#aaa3e91675875fbf14a37369f9513874a',1,'XBOXUSB.h']]], + ['xbox_5fvid',['XBOX_VID',['../_x_b_o_x_o_l_d_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXOLD.h'],['../_x_b_o_x_r_e_c_v_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a8e7834e5604c4fb588cceab9258d0568',1,'XBOX_VID(): XBOXUSB.h']]], + ['xbox_5fvid1',['XBOX_VID1',['../_x_b_o_x_o_n_e_8h.html#a72296ecd70897c4fcfe4c614bbf2051b',1,'XBOXONE.h']]], + ['xbox_5fvid2',['XBOX_VID2',['../_x_b_o_x_o_n_e_8h.html#a85fb8c87d82f5c49fdb951d41247563f',1,'XBOXONE.h']]], + ['xbox_5fvid3',['XBOX_VID3',['../_x_b_o_x_o_n_e_8h.html#aac92aad3632dc9632d04d90342904b18',1,'XBOXONE.h']]], + ['xbox_5fvid4',['XBOX_VID4',['../_x_b_o_x_o_n_e_8h.html#a17464f5e0fb6afc082555ccb61c29668',1,'XBOXONE.h']]], + ['xbox_5fvid5',['XBOX_VID5',['../_x_b_o_x_o_n_e_8h.html#ade0eb2e0dd4f0c3fe45c82121f31d44d',1,'XBOXONE.h']]], + ['xbox_5fvid6',['XBOX_VID6',['../_x_b_o_x_o_n_e_8h.html#a02fcf09e41a7a1a28fd1bdb28dc098ed',1,'XBOXONE.h']]], ['xbox_5fwired_5fpid',['XBOX_WIRED_PID',['../_x_b_o_x_u_s_b_8h.html#af2ec224ac142016119c418de89470f1f',1,'XBOXUSB.h']]], ['xbox_5fwireless_5fpid',['XBOX_WIRELESS_PID',['../_x_b_o_x_u_s_b_8h.html#a10c2a7a8da78e76d7020c2c347f0a687',1,'XBOXUSB.h']]], ['xbox_5fwireless_5freceiver_5fpid',['XBOX_WIRELESS_RECEIVER_PID',['../_x_b_o_x_r_e_c_v_8h.html#a1a97ce2829a30b96ea6640d387d245a9',1,'XBOX_WIRELESS_RECEIVER_PID(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#a1a97ce2829a30b96ea6640d387d245a9',1,'XBOX_WIRELESS_RECEIVER_PID(): XBOXUSB.h']]], @@ -37,7 +59,7 @@ var searchData= ['xr_5freg_5fcustomised_5fint',['XR_REG_CUSTOMISED_INT',['../cdc___x_r21_b1411_8h.html#ad8f26622feeb072c9caa5c5f95f3b6ed',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus',['XR_REG_ERROR_STATUS',['../cdc___x_r21_b1411_8h.html#af50fcb0d47dfcb8dae3020b98b90f5b1',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus_5fbreak',['XR_REG_ERROR_STATUS_BREAK',['../cdc___x_r21_b1411_8h.html#af2eb9c3a6ad7f95fc439139f8c430d74',1,'cdc_XR21B1411.h']]], - ['xr_5freg_5ferror_5fstatus_5fbreak_5fstatus',['XR_REG_ERROR_STATUS_BREAK_STATUS',['../cdc___x_r21_b1411_8h.html#a00ee098551f16993fb6e55c500203e70',1,'cdc_XR21B1411.h']]], + ['xr_5freg_5ferror_5fstatus_5fbreaking',['XR_REG_ERROR_STATUS_BREAKING',['../cdc___x_r21_b1411_8h.html#af7c8d263bd77298510c4e361b52f6fb6',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus_5ferror',['XR_REG_ERROR_STATUS_ERROR',['../cdc___x_r21_b1411_8h.html#aa62ce08310e0d1e091d826bae6a091a0',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus_5fframe',['XR_REG_ERROR_STATUS_FRAME',['../cdc___x_r21_b1411_8h.html#a6d68869ec17604caec0a490cd4e84191',1,'cdc_XR21B1411.h']]], ['xr_5freg_5ferror_5fstatus_5fmask',['XR_REG_ERROR_STATUS_MASK',['../cdc___x_r21_b1411_8h.html#ae8dbffb7f958e6a5c0c0727dcebe8851',1,'cdc_XR21B1411.h']]], diff --git a/search/defines_2.html b/search/defines_2.html index a206bfcf..7cc1a74c 100644 --- a/search/defines_2.html +++ b/search/defines_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_2.js b/search/defines_2.js index 4234e36f..c84a05a4 100644 --- a/search/defines_2.js +++ b/search/defines_2.js @@ -1,5 +1,7 @@ var searchData= [ + ['belkin_5ff8t065bf_5fpid',['BELKIN_F8T065BF_PID',['../_b_t_d_8h.html#ad142141f4e7685e31dce306128eaad5f',1,'BTD.h']]], + ['belkin_5ff8t065bf_5fvid',['BELKIN_F8T065BF_VID',['../_b_t_d_8h.html#a576e49b56b3cfb9d70b22bac8fe6796f',1,'BTD.h']]], ['bgrab0',['BGRAB0',['../macros_8h.html#a773ca2920fd4808c94e6645a7a8d63d1',1,'macros.h']]], ['bgrab1',['BGRAB1',['../macros_8h.html#a483a8ceb644d44744abff34f61cc5442',1,'macros.h']]], ['bgrab2',['BGRAB2',['../macros_8h.html#a49c9ebd69fbb93bd97f9051f592390c6',1,'macros.h']]], diff --git a/search/defines_3.html b/search/defines_3.html index 3826e1f0..3d0ac123 100644 --- a/search/defines_3.html +++ b/search/defines_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_3.js b/search/defines_3.js index f94787bc..2d98b293 100644 --- a/search/defines_3.js +++ b/search/defines_3.js @@ -44,7 +44,7 @@ var searchData= ['cdc_5fsubclass_5fobex',['CDC_SUBCLASS_OBEX',['../cdcacm_8h.html#ab1094071380f381e0b8b88d240aedd03',1,'cdcacm.h']]], ['cdc_5fsubclass_5ftcm',['CDC_SUBCLASS_TCM',['../cdcacm_8h.html#a8e66107828e9b10a8b37823cb4436209',1,'cdcacm.h']]], ['cdc_5fsubclass_5fwireless_5fhandset',['CDC_SUBCLASS_WIRELESS_HANDSET',['../cdcacm_8h.html#ad331bb2702e65696ca33c2d933ab2d73',1,'cdcacm.h']]], - ['check_5fpid',['CHECK_PID',['../cdcprolific_8h.html#acbcf4352865e074958a6ed3a5ba3f1cd',1,'cdcprolific.h']]], + ['check_5fpid',['CHECK_PID',['../cdcprolific_8h.html#af1a8fea671253f8bb7f124ad159f415a',1,'cdcprolific.h']]], ['clr_5fe',['CLR_E',['../max___l_c_d_8cpp.html#a2382451f16ea0f18bf54dba5c7cfb471',1,'max_LCD.cpp']]], ['clr_5frs',['CLR_RS',['../max___l_c_d_8cpp.html#af60058c58ef619d81e5779d74324041e',1,'max_LCD.cpp']]], ['conf_5fdescr_5flen',['CONF_DESCR_LEN',['../usb__ch9_8h.html#a7256578391c91b980eec63daa6e87b6b',1,'usb_ch9.h']]], diff --git a/search/defines_4.html b/search/defines_4.html index c6864f75..201f927f 100644 --- a/search/defines_4.html +++ b/search/defines_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_5.html b/search/defines_5.html index eff65510..92d51a58 100644 --- a/search/defines_5.html +++ b/search/defines_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_5.js b/search/defines_5.js index 3e54d514..af1bda11 100644 --- a/search/defines_5.js +++ b/search/defines_5.js @@ -4,7 +4,7 @@ var searchData= ['enable_5fuhs_5fdebugging',['ENABLE_UHS_DEBUGGING',['../settings_8h.html#a678b7105847680b596d1b4f9c0b5841c',1,'settings.h']]], ['enable_5fwii_5fir_5fcamera',['ENABLE_WII_IR_CAMERA',['../settings_8h.html#a251a8e974ddd0680dbcefaa3a4ae9ae8',1,'settings.h']]], ['ep_5fdescr_5flen',['EP_DESCR_LEN',['../usb__ch9_8h.html#a83547c94285cfb215336a3c44aeea1b9',1,'usb_ch9.h']]], - ['ep_5fmaxpktsize',['EP_MAXPKTSIZE',['../_p_s3_u_s_b_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): PS3USB.h'],['../_x_b_o_x_o_l_d_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXOLD.h'],['../_x_b_o_x_o_n_e_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXONE.h'],['../_x_b_o_x_r_e_c_v_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXUSB.h']]], + ['ep_5fmaxpktsize',['EP_MAXPKTSIZE',['../_p_s3_u_s_b_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): PS3USB.h'],['../_x_b_o_x_o_l_d_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXOLD.h'],['../_x_b_o_x_r_e_c_v_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXRECV.h'],['../_x_b_o_x_u_s_b_8h.html#abcb805b13bfd36145e252b0633bbcfc0',1,'EP_MAXPKTSIZE(): XBOXUSB.h']]], ['epmul',['epMUL',['../hidboot_8h.html#abbd1564d789b53fcf08fa5c4d9b0121d',1,'hidboot.h']]], ['ev_5fauthentication_5fcomplete',['EV_AUTHENTICATION_COMPLETE',['../_b_t_d_8h.html#a68b8f78a0e0da80434afb1e6d40eacf4',1,'BTD.h']]], ['ev_5fchange_5fconnection_5flink',['EV_CHANGE_CONNECTION_LINK',['../_b_t_d_8h.html#a3e107e9d07793ca5cfaeea8b2181d4a4',1,'BTD.h']]], diff --git a/search/defines_6.html b/search/defines_6.html index 5782e691..fa5d74ce 100644 --- a/search/defines_6.html +++ b/search/defines_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_7.html b/search/defines_7.html index 5911e543..99054085 100644 --- a/search/defines_7.html +++ b/search/defines_7.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_8.html b/search/defines_8.html index 943c11ef..9098e183 100644 --- a/search/defines_8.html +++ b/search/defines_8.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_9.html b/search/defines_9.html index f68b51b1..bdebe602 100644 --- a/search/defines_9.html +++ b/search/defines_9.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_a.html b/search/defines_a.html index 8236596b..d6b491aa 100644 --- a/search/defines_a.html +++ b/search/defines_a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_b.html b/search/defines_b.html index 06064aaa..48f6b2b3 100644 --- a/search/defines_b.html +++ b/search/defines_b.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_c.html b/search/defines_c.html index 29bd2b34..920a9478 100644 --- a/search/defines_c.html +++ b/search/defines_c.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_d.html b/search/defines_d.html index 977da068..74d8e3d8 100644 --- a/search/defines_d.html +++ b/search/defines_d.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_d.js b/search/defines_d.js index 0824c577..2fe2ec04 100644 --- a/search/defines_d.js +++ b/search/defines_d.js @@ -57,8 +57,10 @@ var searchData= ['memcpy_5fp',['memcpy_P',['../version__helper_8h.html#ae0444ad0cb3250a5778a573dd10f41be',1,'version_helper.h']]], ['memmem_5fp',['memmem_P',['../version__helper_8h.html#afe1e08150140cc176a8d0a5b11081dd0',1,'version_helper.h']]], ['memrchr_5fp',['memrchr_P',['../version__helper_8h.html#a243235b923ff7a3411ed43653abc727a',1,'version_helper.h']]], + ['mfk_5fcastuint8t',['MFK_CASTUINT8T',['../settings_8h.html#ab5a06671af5c2f1154fb653956959838',1,'settings.h']]], ['midi_5fevent_5fpacket_5fsize',['MIDI_EVENT_PACKET_SIZE',['../usbh__midi_8h.html#a0cb5d0be715a42f36440b29eaa728c58',1,'usbh_midi.h']]], ['midi_5fmax_5fendpoints',['MIDI_MAX_ENDPOINTS',['../usbh__midi_8h.html#a209d19007c615d3f300a5d3717776a45',1,'usbh_midi.h']]], + ['midi_5fmax_5fsysex_5fsize',['MIDI_MAX_SYSEX_SIZE',['../usbh__midi_8h.html#ac62d581ae088d3699a4f39672ac2ff51',1,'usbh_midi.h']]], ['mode_5ffs_5fhost',['MODE_FS_HOST',['../max3421e_8h.html#a456c3175b4836ed1d2b276faeba55121',1,'max3421e.h']]], ['mode_5fls_5fhost',['MODE_LS_HOST',['../max3421e_8h.html#ab3da1b5bd1f43ba9f9da604841ba8802',1,'max3421e.h']]], ['mouse_5fparser_5fid',['MOUSE_PARSER_ID',['../_b_t_h_i_d_8h.html#a0b48c93189cf128c1ef13ce86b4fa6be',1,'BTHID.h']]], diff --git a/search/defines_e.html b/search/defines_e.html index bdf8b214..95660283 100644 --- a/search/defines_e.html +++ b/search/defines_e.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/defines_f.html b/search/defines_f.html index 81793366..bd9eb521 100644 --- a/search/defines_f.html +++ b/search/defines_f.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_0.html b/search/enums_0.html index aba8d799..9efcd1b7 100644 --- a/search/enums_0.html +++ b/search/enums_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_1.html b/search/enums_1.html index a8d38430..0edd7796 100644 --- a/search/enums_1.html +++ b/search/enums_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_2.html b/search/enums_2.html index ef7d6329..2b851b64 100644 --- a/search/enums_2.html +++ b/search/enums_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_3.html b/search/enums_3.html index 57bac2ef..b29d31c2 100644 --- a/search/enums_3.html +++ b/search/enums_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_4.html b/search/enums_4.html index f35d7a79..ad9ec5e9 100644 --- a/search/enums_4.html +++ b/search/enums_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_5.html b/search/enums_5.html index b579463d..3b863957 100644 --- a/search/enums_5.html +++ b/search/enums_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_6.html b/search/enums_6.html index b21542b1..acd7a542 100644 --- a/search/enums_6.html +++ b/search/enums_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_7.html b/search/enums_7.html index 75f8f8c3..ee24b455 100644 --- a/search/enums_7.html +++ b/search/enums_7.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_8.html b/search/enums_8.html index 037ed278..c6b4d24a 100644 --- a/search/enums_8.html +++ b/search/enums_8.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_9.html b/search/enums_9.html index c5aa5173..c7438683 100644 --- a/search/enums_9.html +++ b/search/enums_9.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enums_a.html b/search/enums_a.html index 50f130ae..58694efd 100644 --- a/search/enums_a.html +++ b/search/enums_a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_0.html b/search/enumvalues_0.html index 83192d35..03fdfad9 100644 --- a/search/enumvalues_0.html +++ b/search/enumvalues_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_1.html b/search/enumvalues_1.html index 0715ef5a..abeea564 100644 --- a/search/enumvalues_1.html +++ b/search/enumvalues_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_10.html b/search/enumvalues_10.html index 62cedc47..f6a557e8 100644 --- a/search/enumvalues_10.html +++ b/search/enumvalues_10.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_11.html b/search/enumvalues_11.html index 23dd373b..12dad5fc 100644 --- a/search/enumvalues_11.html +++ b/search/enumvalues_11.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_12.html b/search/enumvalues_12.html index 6090caf0..e0464c68 100644 --- a/search/enumvalues_12.html +++ b/search/enumvalues_12.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_13.html b/search/enumvalues_13.html index d50ecfb3..38f0e6c2 100644 --- a/search/enumvalues_13.html +++ b/search/enumvalues_13.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_14.html b/search/enumvalues_14.html index 48dc6a50..5e1a6eec 100644 --- a/search/enumvalues_14.html +++ b/search/enumvalues_14.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_15.html b/search/enumvalues_15.html index 609e097a..a92e5199 100644 --- a/search/enumvalues_15.html +++ b/search/enumvalues_15.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_15.js b/search/enumvalues_15.js index 69656740..6fb1ddf4 100644 --- a/search/enumvalues_15.js +++ b/search/enumvalues_15.js @@ -1,5 +1,5 @@ var searchData= [ ['y',['Y',['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fda5596231eabd6cf29050967d5ac83ad84',1,'controllerEnums.h']]], - ['yellow',['YELLOW',['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdae735a848bf82163a19236ead1c3ef2d2',1,'YELLOW(): controllerEnums.h'],['../controller_enums_8h.html#aac6fa7b0395b95cc528deaad0ce884a2abf28513245738599d13e3ce36bd16c82',1,'Yellow(): controllerEnums.h']]] + ['yellow',['Yellow',['../controller_enums_8h.html#aac6fa7b0395b95cc528deaad0ce884a2abf28513245738599d13e3ce36bd16c82',1,'Yellow(): controllerEnums.h'],['../controller_enums_8h.html#a94f7389d205c78830a5441370d7870fdae735a848bf82163a19236ead1c3ef2d2',1,'YELLOW(): controllerEnums.h']]] ]; diff --git a/search/enumvalues_16.html b/search/enumvalues_16.html index 0274f9c6..915a85be 100644 --- a/search/enumvalues_16.html +++ b/search/enumvalues_16.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_2.html b/search/enumvalues_2.html index 0f9b5e9f..90289986 100644 --- a/search/enumvalues_2.html +++ b/search/enumvalues_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_3.html b/search/enumvalues_3.html index 9ebb3562..b152efcb 100644 --- a/search/enumvalues_3.html +++ b/search/enumvalues_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_4.html b/search/enumvalues_4.html index daa496de..3f50abb8 100644 --- a/search/enumvalues_4.html +++ b/search/enumvalues_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_5.html b/search/enumvalues_5.html index bd377935..b6f20f29 100644 --- a/search/enumvalues_5.html +++ b/search/enumvalues_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_6.html b/search/enumvalues_6.html index 656e4788..93be1295 100644 --- a/search/enumvalues_6.html +++ b/search/enumvalues_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_7.html b/search/enumvalues_7.html index 2c3a1c9d..9fefbd65 100644 --- a/search/enumvalues_7.html +++ b/search/enumvalues_7.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_8.html b/search/enumvalues_8.html index 983dccb5..03f17f86 100644 --- a/search/enumvalues_8.html +++ b/search/enumvalues_8.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_9.html b/search/enumvalues_9.html index a8b553fc..e60fe272 100644 --- a/search/enumvalues_9.html +++ b/search/enumvalues_9.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_a.html b/search/enumvalues_a.html index 5d9b2d68..1ec3a2a8 100644 --- a/search/enumvalues_a.html +++ b/search/enumvalues_a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_b.html b/search/enumvalues_b.html index e947a47a..bfc2bf3f 100644 --- a/search/enumvalues_b.html +++ b/search/enumvalues_b.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_c.html b/search/enumvalues_c.html index 5da87761..36070b87 100644 --- a/search/enumvalues_c.html +++ b/search/enumvalues_c.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_d.html b/search/enumvalues_d.html index 679c7cec..e15d8c99 100644 --- a/search/enumvalues_d.html +++ b/search/enumvalues_d.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_e.html b/search/enumvalues_e.html index 6e27e153..1b3e388b 100644 --- a/search/enumvalues_e.html +++ b/search/enumvalues_e.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/enumvalues_f.html b/search/enumvalues_f.html index 86a4cd91..eb1f3db3 100644 --- a/search/enumvalues_f.html +++ b/search/enumvalues_f.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_0.html b/search/files_0.html index 0b637cf9..49606c82 100644 --- a/search/files_0.html +++ b/search/files_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_1.html b/search/files_1.html index 1094e74a..c8871748 100644 --- a/search/files_1.html +++ b/search/files_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_2.html b/search/files_2.html index a08dbd36..99bdf21c 100644 --- a/search/files_2.html +++ b/search/files_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_3.html b/search/files_3.html index 647fc8d0..f8e543a8 100644 --- a/search/files_3.html +++ b/search/files_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_4.html b/search/files_4.html index 186557a6..2ebb46c7 100644 --- a/search/files_4.html +++ b/search/files_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_5.html b/search/files_5.html index 671abd34..268b7eb5 100644 --- a/search/files_5.html +++ b/search/files_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_6.html b/search/files_6.html index 73aff188..98fc6666 100644 --- a/search/files_6.html +++ b/search/files_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_7.html b/search/files_7.html index 364f4202..49507ded 100644 --- a/search/files_7.html +++ b/search/files_7.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_8.html b/search/files_8.html index f9f7943f..12c6630b 100644 --- a/search/files_8.html +++ b/search/files_8.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_9.html b/search/files_9.html index 306f0002..cabcae2f 100644 --- a/search/files_9.html +++ b/search/files_9.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_a.html b/search/files_a.html index 2f6ff8fe..f7402215 100644 --- a/search/files_a.html +++ b/search/files_a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/files_b.html b/search/files_b.html index 3e51d90e..7be10030 100644 --- a/search/files_b.html +++ b/search/files_b.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_0.html b/search/functions_0.html index 6bc52b61..0539c8ce 100644 --- a/search/functions_0.html +++ b/search/functions_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_1.html b/search/functions_1.html index 648831fd..4878b3d1 100644 --- a/search/functions_1.html +++ b/search/functions_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_10.html b/search/functions_10.html index 8bc4de4a..6f6fbae2 100644 --- a/search/functions_10.html +++ b/search/functions_10.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_10.js b/search/functions_10.js index 54eff75b..b79125d4 100644 --- a/search/functions_10.js +++ b/search/functions_10.js @@ -7,9 +7,10 @@ var searchData= ['selectinterface',['SelectInterface',['../class_h_i_d_composite.html#ada07ab100cb0760ef5641e254cab731d',1,'HIDComposite']]], ['send',['send',['../class_s_p_p.html#ab6c20e303965056403ae5aef1d228858',1,'SPP']]], ['sendbreak',['SendBreak',['../class_a_c_m.html#a2a618cbff52737740e76977db557ddff',1,'ACM']]], - ['senddata',['SendData',['../class_u_s_b_h___m_i_d_i.html#a060bae88a7b5bf358119458362929ffa',1,'USBH_MIDI']]], + ['senddata',['SendData',['../class_u_s_b_h___m_i_d_i.html#a65fd836d11336cce737ec1bdb1d5d4f3',1,'USBH_MIDI']]], ['sendoutputreport',['sendOutputReport',['../class_p_s4_b_t.html#ad3bb50902905677726bd62d5f394b062',1,'PS4BT::sendOutputReport()'],['../class_p_s4_parser.html#a8788530b0c213dedfcf56b78e8ca4879',1,'PS4Parser::sendOutputReport()'],['../class_p_s4_u_s_b.html#a75dc09d15f149e1a1b96b8d2ccbbff89',1,'PS4USB::sendOutputReport()']]], - ['sendsysex',['SendSysEx',['../class_u_s_b_h___m_i_d_i.html#a2ae1ef447bebf00d6f63af5eed4fa859',1,'USBH_MIDI']]], + ['sendrawdata',['SendRawData',['../class_u_s_b_h___m_i_d_i.html#a3005d70999cbf2339c55bcdd6fc77bff',1,'USBH_MIDI']]], + ['sendsysex',['SendSysEx',['../class_u_s_b_h___m_i_d_i.html#aa5506d9556605493d25492ab1f2fe2a8',1,'USBH_MIDI']]], ['serialprinthex',['SerialPrintHex',['../printhex_8h.html#a7ac5c085b9fdf94266b7c273695efa87',1,'printhex.h']]], ['setaddr',['setAddr',['../class_u_s_b.html#a3aea534daed66b5606fa798df7ad3c47',1,'USB']]], ['setalloff',['setAllOff',['../class_p_s3_b_t.html#a6ee74242b0c1644496ff04b457f39cd2',1,'PS3BT::setAllOff()'],['../class_p_s3_u_s_b.html#ac7adc7365bb45d15c37e22f26f012498',1,'PS3USB::setAllOff()'],['../class_p_s4_parser.html#adf2b7f2888fb7ebc9c58595a85568d65',1,'PS4Parser::setAllOff()'],['../class_w_i_i.html#a6e97bfcfb134b63d7190ba1bc326e1d3',1,'WII::setAllOff()'],['../class_x_b_o_x_r_e_c_v.html#ad045d22c1e2f0657f72786539f418751',1,'XBOXRECV::setAllOff()'],['../class_x_b_o_x_u_s_b.html#a6200dc185ecb6e0d3ffdb2a9ecf49c40',1,'XBOXUSB::setAllOff()']]], @@ -47,9 +48,10 @@ var searchData= ['setprotocolmode',['setProtocolMode',['../class_b_t_h_i_d.html#afceaafc89581441da40b141170b98595',1,'BTHID']]], ['setreport',['SetReport',['../class_u_s_b_h_i_d.html#a66e217a1d1237239514ce6149e46cc56',1,'USBHID']]], ['setreportparser',['SetReportParser',['../class_b_t_h_i_d.html#a0e903f0b5040f3561e5de6c4431027b1',1,'BTHID::SetReportParser()'],['../class_h_i_d_boot.html#a3e44d340fab7e9eedb357ef61e1c19a5',1,'HIDBoot::SetReportParser()'],['../class_h_i_d_composite.html#a94136774d685b89c5a149c4e4df78087',1,'HIDComposite::SetReportParser()'],['../class_h_i_d_universal.html#afbd599879e9c3cdea382e87afd6ab29a',1,'HIDUniversal::SetReportParser()'],['../class_u_s_b_h_i_d.html#a17a732bbb37d8f21181d02d515f40499',1,'USBHID::SetReportParser()']]], - ['setrumbleoff',['setRumbleOff',['../class_p_s3_b_t.html#a5c87e7db5311a5d56f78c994b5545e4e',1,'PS3BT::setRumbleOff()'],['../class_p_s3_u_s_b.html#aaa1e66d7397be6364d4f76749cbaad5a',1,'PS3USB::setRumbleOff()'],['../class_p_s4_parser.html#acc9b3be8fb673e8e1f637c56d72f1180',1,'PS4Parser::setRumbleOff()'],['../class_w_i_i.html#a2c5c32841b020b248f757cb793acb936',1,'WII::setRumbleOff()'],['../class_x_b_o_x_o_l_d.html#a8014cc70e141362e09beeedb49428746',1,'XBOXOLD::setRumbleOff()'],['../class_x_b_o_x_r_e_c_v.html#a2931e13960cde2c20adbcaf34cee84c5',1,'XBOXRECV::setRumbleOff()'],['../class_x_b_o_x_u_s_b.html#a5d9ac92da5086409ad864484bdf95871',1,'XBOXUSB::setRumbleOff()']]], - ['setrumbleon',['setRumbleOn',['../class_p_s3_b_t.html#a7a3e593911490538c061e9ccb4273f87',1,'PS3BT::setRumbleOn(RumbleEnum mode)'],['../class_p_s3_b_t.html#ae309556e995afc10b13dfbe4e6c32798',1,'PS3BT::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)'],['../class_p_s3_u_s_b.html#a77f44b6007cc735c47bdeaf672c7e464',1,'PS3USB::setRumbleOn(RumbleEnum mode)'],['../class_p_s3_u_s_b.html#a0c2015b53aa60081aa28299800509f80',1,'PS3USB::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)'],['../class_p_s4_parser.html#a44628a8521ef9c19d773347156962cab',1,'PS4Parser::setRumbleOn(RumbleEnum mode)'],['../class_p_s4_parser.html#a8299bdbb9d790e6b2e98e942e9bd154e',1,'PS4Parser::setRumbleOn(uint8_t bigRumble, uint8_t smallRumble)'],['../class_w_i_i.html#a0d9c869bd3677c4488a586c38558a137',1,'WII::setRumbleOn()'],['../class_x_b_o_x_o_l_d.html#ab69673ea316c30268a5eedc893bea3a9',1,'XBOXOLD::setRumbleOn()'],['../class_x_b_o_x_r_e_c_v.html#addf7c0dcfbdb025f2283dcd118b5ab76',1,'XBOXRECV::setRumbleOn()'],['../class_x_b_o_x_u_s_b.html#ae70ae50ed8188a2bf8c25d0ee17f54d9',1,'XBOXUSB::setRumbleOn()']]], + ['setrumbleoff',['setRumbleOff',['../class_p_s3_b_t.html#a5c87e7db5311a5d56f78c994b5545e4e',1,'PS3BT::setRumbleOff()'],['../class_p_s3_u_s_b.html#aaa1e66d7397be6364d4f76749cbaad5a',1,'PS3USB::setRumbleOff()'],['../class_p_s4_parser.html#acc9b3be8fb673e8e1f637c56d72f1180',1,'PS4Parser::setRumbleOff()'],['../class_w_i_i.html#a2c5c32841b020b248f757cb793acb936',1,'WII::setRumbleOff()'],['../class_x_b_o_x_o_l_d.html#a8014cc70e141362e09beeedb49428746',1,'XBOXOLD::setRumbleOff()'],['../class_x_b_o_x_o_n_e.html#a506e8add57ffac652a28e8c5b7e72e85',1,'XBOXONE::setRumbleOff()'],['../class_x_b_o_x_r_e_c_v.html#a2931e13960cde2c20adbcaf34cee84c5',1,'XBOXRECV::setRumbleOff()'],['../class_x_b_o_x_u_s_b.html#a5d9ac92da5086409ad864484bdf95871',1,'XBOXUSB::setRumbleOff()']]], + ['setrumbleon',['setRumbleOn',['../class_p_s3_b_t.html#a7a3e593911490538c061e9ccb4273f87',1,'PS3BT::setRumbleOn(RumbleEnum mode)'],['../class_p_s3_b_t.html#ae309556e995afc10b13dfbe4e6c32798',1,'PS3BT::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)'],['../class_p_s3_u_s_b.html#a77f44b6007cc735c47bdeaf672c7e464',1,'PS3USB::setRumbleOn(RumbleEnum mode)'],['../class_p_s3_u_s_b.html#a0c2015b53aa60081aa28299800509f80',1,'PS3USB::setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)'],['../class_p_s4_parser.html#a44628a8521ef9c19d773347156962cab',1,'PS4Parser::setRumbleOn(RumbleEnum mode)'],['../class_p_s4_parser.html#a8299bdbb9d790e6b2e98e942e9bd154e',1,'PS4Parser::setRumbleOn(uint8_t bigRumble, uint8_t smallRumble)'],['../class_w_i_i.html#a0d9c869bd3677c4488a586c38558a137',1,'WII::setRumbleOn()'],['../class_x_b_o_x_o_l_d.html#ab69673ea316c30268a5eedc893bea3a9',1,'XBOXOLD::setRumbleOn()'],['../class_x_b_o_x_o_n_e.html#a6586343cacf8705c7a3c2d4f479f2261',1,'XBOXONE::setRumbleOn()'],['../class_x_b_o_x_r_e_c_v.html#addf7c0dcfbdb025f2283dcd118b5ab76',1,'XBOXRECV::setRumbleOn()'],['../class_x_b_o_x_u_s_b.html#ae70ae50ed8188a2bf8c25d0ee17f54d9',1,'XBOXUSB::setRumbleOn()']]], ['setrumbletoggle',['setRumbleToggle',['../class_w_i_i.html#a841396b533cccccb05db37d35f6fef9c',1,'WII']]], + ['setupdevicespecific',['setupDeviceSpecific',['../class_u_s_b_h___m_i_d_i.html#aa9f6790ed10bec5fc5a9ebfc43dacfeb',1,'USBH_MIDI']]], ['setusagepage',['SetUsagePage',['../class_report_desc_parser_base.html#a42fbc8fbccaf67eab88bd98b8d3bdd3f',1,'ReportDescParserBase']]], ['setusbtaskstate',['setUsbTaskState',['../class_u_s_b.html#a8ff697d334dc611720419374acd1e5fb',1,'USB']]], ['sinkparser',['SinkParser',['../class_sink_parser.html#a68caa440ba95a184eb104535f3fffd17',1,'SinkParser']]], diff --git a/search/functions_11.html b/search/functions_11.html index e1e427c1..dd88d8b7 100644 --- a/search/functions_11.html +++ b/search/functions_11.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_12.html b/search/functions_12.html index 8dac9d29..7093d19f 100644 --- a/search/functions_12.html +++ b/search/functions_12.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_13.html b/search/functions_13.html index 54220112..051a1eb8 100644 --- a/search/functions_13.html +++ b/search/functions_13.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_14.html b/search/functions_14.html index cb681fe9..d5fdbda4 100644 --- a/search/functions_14.html +++ b/search/functions_14.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_14.js b/search/functions_14.js index 54c8ec9b..88b446c5 100644 --- a/search/functions_14.js +++ b/search/functions_14.js @@ -2,7 +2,7 @@ var searchData= [ ['wide',['wide',['../class_a_c_m.html#ab171c6eefd542e7d4a7ce555d2f2f389',1,'ACM']]], ['wii',['WII',['../class_w_i_i.html#a6597cb0e240a8ccb4ebdb236daef712e',1,'WII']]], - ['write',['Write',['../class_bulk_only.html#a45d327ddf87e01607c3a5b1849936053',1,'BulkOnly::Write()'],['../class_max___l_c_d.html#a43e5618993b77b81773af3a88cdf4c96',1,'Max_LCD::write()'],['../class_s_p_p.html#a6fb231316ca9b1028322d2d2188b27b0',1,'SPP::write(uint8_t data)'],['../class_s_p_p.html#a8bb421b7d948c3ffefc23aef95813192',1,'SPP::write(const uint8_t *data, size_t size)']]], + ['write',['write',['../class_max___l_c_d.html#a43e5618993b77b81773af3a88cdf4c96',1,'Max_LCD::write()'],['../class_s_p_p.html#a6fb231316ca9b1028322d2d2188b27b0',1,'SPP::write(uint8_t data)'],['../class_s_p_p.html#a8bb421b7d948c3ffefc23aef95813192',1,'SPP::write(const uint8_t *data, size_t size)'],['../class_bulk_only.html#a45d327ddf87e01607c3a5b1849936053',1,'BulkOnly::Write()']]], ['write_5fregister',['write_register',['../class_x_r21_b1411.html#acdc8c732d517b2748d3d6643ae5642ee',1,'XR21B1411']]], ['writeprotected',['WriteProtected',['../class_bulk_only.html#a85d034c7da25090c36c9bdeb85338009',1,'BulkOnly']]] ]; diff --git a/search/functions_15.html b/search/functions_15.html index f3ae6926..546d13e6 100644 --- a/search/functions_15.html +++ b/search/functions_15.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_2.html b/search/functions_2.html index c93d0894..67d2a392 100644 --- a/search/functions_2.html +++ b/search/functions_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_2.js b/search/functions_2.js index bdff977e..34c3641f 100644 --- a/search/functions_2.js +++ b/search/functions_2.js @@ -14,7 +14,7 @@ var searchData= ['configuredevice',['ConfigureDevice',['../class_a_d_k.html#a14f24ca8246c5b6126a5aa72cf6ee120',1,'ADK::ConfigureDevice()'],['../class_b_t_d.html#a4f1808a49e9aca397ba829fac16dc5c3',1,'BTD::ConfigureDevice()'],['../class_bulk_only.html#aa8fe167a7af12dce9964fa5a430c53ea',1,'BulkOnly::ConfigureDevice()'],['../class_u_s_b_device_config.html#aef77a1e62f78c04a1aad53e8795ec89e',1,'USBDeviceConfig::ConfigureDevice()'],['../class_x_b_o_x_r_e_c_v.html#a3dd42b9a1351f172fc6e39df2fe99398',1,'XBOXRECV::ConfigureDevice()']]], ['configuring',['Configuring',['../class_u_s_b.html#af4008dfc1c2d15c23cf8a7815cc17765',1,'USB']]], ['connected',['connected',['../class_p_s4_b_t.html#a08a857b8533e59f6eb872e4c8f727405',1,'PS4BT::connected()'],['../class_p_s4_u_s_b.html#a3dd2b4e19516fb76d9442937102ea97f',1,'PS4USB::connected()'],['../class_p_s_buzz.html#a7c791bf7745baae8359d3dcb1d5b86d3',1,'PSBuzz::connected()']]], - ['countsysexdatasize',['countSysExDataSize',['../class_u_s_b_h___m_i_d_i.html#afbb9e1d8440fb282c129ae26bff8d575',1,'USBH_MIDI']]], + ['countsysexdatasize',['countSysExDataSize',['../class_u_s_b_h___m_i_d_i.html#ab3b9ea78a331449802e4ce5a5a9c7f18',1,'USBH_MIDI']]], ['createchar',['createChar',['../class_max___l_c_d.html#a9941a61f5fca781a38f250489245d5e7',1,'Max_LCD']]], ['ctrldata',['ctrlData',['../class_u_s_b.html#a102dab8571035757dd63ed3751993836',1,'USB']]], ['ctrlreq',['ctrlReq',['../class_u_s_b.html#a636695a5c3d35cd6b9e31c54edfacd7c',1,'USB']]], diff --git a/search/functions_3.html b/search/functions_3.html index caa48ea2..1f0eedb3 100644 --- a/search/functions_3.html +++ b/search/functions_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_4.html b/search/functions_4.html index a9c64adf..c5bf87a4 100644 --- a/search/functions_4.html +++ b/search/functions_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_4.js b/search/functions_4.js index d5ca5a7d..0d3f453d 100644 --- a/search/functions_4.js +++ b/search/functions_4.js @@ -3,8 +3,9 @@ var searchData= ['e_5fnotify',['E_Notify',['../message_8cpp.html#a9453192fd38607a494776eb3fb483630',1,'E_Notify(char const *msg, int lvl): message.cpp'],['../message_8cpp.html#a56f28162c49c25d9825f83ce2566535d',1,'E_Notify(uint8_t b, int lvl): message.cpp'],['../message_8cpp.html#a12f95210f9e5d917c23709a3d21c9115',1,'E_Notify(double d, int lvl): message.cpp'],['../message_8h.html#a9453192fd38607a494776eb3fb483630',1,'E_Notify(char const *msg, int lvl): message.cpp'],['../message_8h.html#a56f28162c49c25d9825f83ce2566535d',1,'E_Notify(uint8_t b, int lvl): message.cpp']]], ['e_5fnotifyc',['E_Notifyc',['../message_8cpp.html#ab0e5c13883e60a998bb19346a9474066',1,'E_Notifyc(char c, int lvl): message.cpp'],['../message_8h.html#ab0e5c13883e60a998bb19346a9474066',1,'E_Notifyc(char c, int lvl): message.cpp'],['../printhex_8h.html#ab0e5c13883e60a998bb19346a9474066',1,'E_Notifyc(char c, int lvl): message.cpp']]], ['e_5fnotifystr',['E_NotifyStr',['../message_8cpp.html#a519befe6a36026b8ea81aec9d6a3e532',1,'E_NotifyStr(char const *msg, int lvl): message.cpp'],['../message_8h.html#a519befe6a36026b8ea81aec9d6a3e532',1,'E_NotifyStr(char const *msg, int lvl): message.cpp']]], - ['endpointxtract',['EndpointXtract',['../class_a_d_k.html#aac2fac5410faea0e439b4f7e688b3d75',1,'ADK::EndpointXtract()'],['../class_b_t_d.html#a23928cd0e5711a2433aec763cfa55773',1,'BTD::EndpointXtract()'],['../class_a_c_m.html#af5b411a7ccc82bd77a7c5cfba6cd9a86',1,'ACM::EndpointXtract()'],['../class_f_t_d_i.html#a3e3f771b9f2a99fcedf7ed665b597109',1,'FTDI::EndpointXtract()'],['../class_usb_config_xtracter.html#a7717ea27bb756568e0deb544d8331370',1,'UsbConfigXtracter::EndpointXtract()'],['../class_h_i_d_boot.html#a04475d2cd6d8ae19d4e4149714fa4bef',1,'HIDBoot::EndpointXtract()'],['../class_h_i_d_composite.html#abdae8ebd9c5cc676c91829e41e3984a2',1,'HIDComposite::EndpointXtract()'],['../class_h_i_d_universal.html#ab9b13f27eca16e0accc14fff9bd318e2',1,'HIDUniversal::EndpointXtract()'],['../class_bulk_only.html#a13d33906543d5d6b44620f430dc729ff',1,'BulkOnly::EndpointXtract()']]], + ['endpointxtract',['EndpointXtract',['../class_a_d_k.html#aac2fac5410faea0e439b4f7e688b3d75',1,'ADK::EndpointXtract()'],['../class_b_t_d.html#a23928cd0e5711a2433aec763cfa55773',1,'BTD::EndpointXtract()'],['../class_a_c_m.html#af5b411a7ccc82bd77a7c5cfba6cd9a86',1,'ACM::EndpointXtract()'],['../class_f_t_d_i.html#a3e3f771b9f2a99fcedf7ed665b597109',1,'FTDI::EndpointXtract()'],['../class_usb_config_xtracter.html#a7717ea27bb756568e0deb544d8331370',1,'UsbConfigXtracter::EndpointXtract()'],['../class_h_i_d_boot.html#a04475d2cd6d8ae19d4e4149714fa4bef',1,'HIDBoot::EndpointXtract()'],['../class_h_i_d_composite.html#abdae8ebd9c5cc676c91829e41e3984a2',1,'HIDComposite::EndpointXtract()'],['../class_h_i_d_universal.html#ab9b13f27eca16e0accc14fff9bd318e2',1,'HIDUniversal::EndpointXtract()'],['../class_bulk_only.html#a13d33906543d5d6b44620f430dc729ff',1,'BulkOnly::EndpointXtract()'],['../class_x_b_o_x_o_n_e.html#a499cc378b8ae7d8fd63baa1b4dab97b5',1,'XBOXONE::EndpointXtract()']]], ['enhanced_5ffeatures',['enhanced_features',['../class_x_r21_b1411.html#a2f75b9dab539f642a9d6484faf5df767',1,'XR21B1411::enhanced_features()'],['../class_a_c_m.html#a2b7125159dc81b1a896ff23cefc71938',1,'ACM::enhanced_features()']]], ['enhanced_5fstatus',['enhanced_status',['../class_a_c_m.html#a4032d44491e27670c64b23f72f2a810a',1,'ACM']]], - ['errormessage',['ErrorMessage',['../message_8h.html#a59dd0ba2acd4a416786f45d1e0b0916a',1,'ErrorMessage(uint8_t level, char const *msg, ERROR_TYPE rcode=0): message.h'],['../message_8h.html#a52358bfe833f47f63e7de398847aa2e7',1,'ErrorMessage(char const *msg, ERROR_TYPE rcode=0): message.h']]] + ['errormessage',['ErrorMessage',['../message_8h.html#a59dd0ba2acd4a416786f45d1e0b0916a',1,'ErrorMessage(uint8_t level, char const *msg, ERROR_TYPE rcode=0): message.h'],['../message_8h.html#a52358bfe833f47f63e7de398847aa2e7',1,'ErrorMessage(char const *msg, ERROR_TYPE rcode=0): message.h']]], + ['extractsysexdata',['extractSysExData',['../class_u_s_b_h___m_i_d_i.html#ab85f9e0da16ffe3ee9809aa27023c94c',1,'USBH_MIDI']]] ]; diff --git a/search/functions_5.html b/search/functions_5.html index 9d135fa0..a34446ce 100644 --- a/search/functions_5.html +++ b/search/functions_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_6.html b/search/functions_6.html index 5fca897b..6fd4b1f3 100644 --- a/search/functions_6.html +++ b/search/functions_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_7.html b/search/functions_7.html index 02631a34..6e09abf1 100644 --- a/search/functions_7.html +++ b/search/functions_7.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_8.html b/search/functions_8.html index ff370959..d59ea971 100644 --- a/search/functions_8.html +++ b/search/functions_8.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_8.js b/search/functions_8.js index fe6d74ce..075eaf61 100644 --- a/search/functions_8.js +++ b/search/functions_8.js @@ -1,11 +1,13 @@ var searchData= [ + ['idproduct',['idProduct',['../class_u_s_b_h___m_i_d_i.html#ac7b56c71f8424ec0175f390264776bdd',1,'USBH_MIDI']]], + ['idvendor',['idVendor',['../class_u_s_b_h___m_i_d_i.html#aa7d217e3479a9116f8f2ce90c1177317',1,'USBH_MIDI']]], ['init',['Init',['../class_a_d_k.html#a8c5c2e212c748966ccd863499d202063',1,'ADK::Init()'],['../class_b_t_d.html#a48608619d8253972dd132edbb3001c5f',1,'BTD::Init()'],['../class_x_r21_b1411.html#adbaf541661c1938fa33a9cedd9e9a4ba',1,'XR21B1411::Init()'],['../class_a_c_m.html#ad3210651d58c77d3ded4b4b83a9476b7',1,'ACM::Init()'],['../class_f_t_d_i.html#a2d40115414dadfee8c284e0f5d397621',1,'FTDI::Init()'],['../class_p_l2303.html#a23c849fb504c1fe6f46c84d04c0a47cf',1,'PL2303::Init()'],['../class_h_i_d_boot.html#aa30d7cf292378153f41d8a13380c6119',1,'HIDBoot::Init()'],['../class_h_i_d_composite.html#ac5d02f2915f83817f2121acdefc7f573',1,'HIDComposite::Init()'],['../class_h_i_d_universal.html#a384b0e219f763e2d6407636bfd4ccea7',1,'HIDUniversal::Init()'],['../class_bulk_only.html#a51870da9badc037166b86da60bcda6ea',1,'BulkOnly::Init()'],['../class_p_s3_u_s_b.html#a0083545cb99fb8786e60281fe7a9050d',1,'PS3USB::Init()'],['../class_u_s_b_device_config.html#a3706cf6b18785aff823171e280bab738',1,'USBDeviceConfig::Init()'],['../class_u_s_b_h___m_i_d_i.html#a9c8d149a823d2b8d1c3579f0f445cf19',1,'USBH_MIDI::Init()'],['../class_m_a_x3421e.html#a2866487c20c832731fd4fb478acb0195',1,'MAX3421e::Init()'],['../class_m_a_x3421e.html#a332ce159a413244be9b95b8e08888bb8',1,'MAX3421e::Init(int mseconds)'],['../class_u_s_b_hub.html#ab2b2e257556e3d59f9258dd84d6f636e',1,'USBHub::Init()'],['../class_x_b_o_x_o_l_d.html#a7260253c704b147e6dfd762e13222434',1,'XBOXOLD::Init()'],['../class_x_b_o_x_o_n_e.html#aeb2d90a3d77fc252a12f5ed54c3f370e',1,'XBOXONE::Init()'],['../class_x_b_o_x_r_e_c_v.html#a07de216bf16a83501d74463c00bf1fc8',1,'XBOXRECV::Init()'],['../class_x_b_o_x_u_s_b.html#a9d2ad06354787bc252058bb28015b56e',1,'XBOXUSB::Init()'],['../class_max___l_c_d.html#a3205e9a432c808422867c1398d665247',1,'Max_LCD::init()'],['../class_s_pi.html#a52c803966a9437caf57d00c267121373',1,'SPi::init()']]], ['initialize',['Initialize',['../class_hex_dumper.html#accd2712258f54a8072eae3d2ad8cceba',1,'HexDumper::Initialize()'],['../class_multi_byte_value_parser.html#a9bd52b4e180d68dbb8f97c059250f4c3',1,'MultiByteValueParser::Initialize()'],['../class_byte_skipper.html#a274a09686d5535e11961d2ccf38ffa08',1,'ByteSkipper::Initialize()'],['../class_p_t_p_list_parser.html#a18f6c785d1ddb51d7e158810644079b7',1,'PTPListParser::Initialize()'],['../class_sink_parser.html#a3c2ac73b459e326e955c26d658733f9f',1,'SinkParser::Initialize()']]], ['inthandler',['IntHandler',['../class_m_a_x3421e.html#af88faea04dd27cf354cf0643cc7acef2',1,'MAX3421e']]], ['intransfer',['inTransfer',['../class_u_s_b.html#aead4d2040c641d55176854b236804088',1,'USB']]], ['irinitialize',['IRinitialize',['../class_w_i_i.html#a3505abbc01c71d134ce301dfb7c0c5b5',1,'WII']]], ['isircameraenabled',['isIRCameraEnabled',['../class_w_i_i.html#a0a444d7e348026e062751cf723877e8f',1,'WII']]], - ['isready',['isReady',['../class_a_d_k.html#a1dee02856625dfcac4b0cdd4e8672cef',1,'ADK::isReady()'],['../class_b_t_d.html#a1b2440748bdaaeb552a05b0f0902f5d8',1,'BTD::isReady()'],['../class_a_c_m.html#a7161082e88359738596dd12a706ee286',1,'ACM::isReady()'],['../class_h_i_d_boot.html#a9972f402f3141b2d71c0e59602675f68',1,'HIDBoot::isReady()'],['../class_h_i_d_composite.html#a3d12bc7e852944029b1314a95b84d6ce',1,'HIDComposite::isReady()'],['../class_h_i_d_universal.html#aa4be95e8f5164393ea4766f68c5b0ea8',1,'HIDUniversal::isReady()'],['../class_p_s3_u_s_b.html#a02a5b0244665d5a790d1020e51c94479',1,'PS3USB::isReady()'],['../class_x_b_o_x_o_l_d.html#af4d77a5108f2e6812ba00be1b0374829',1,'XBOXOLD::isReady()'],['../class_x_b_o_x_o_n_e.html#a23112f12ed914d1b0128675b1f59aace',1,'XBOXONE::isReady()'],['../class_x_b_o_x_r_e_c_v.html#a570568108edafee8d060aad8fe40db57',1,'XBOXRECV::isReady()'],['../class_x_b_o_x_u_s_b.html#ac2507bfe85896b7fcc772894a7a9f272',1,'XBOXUSB::isReady()']]], + ['isready',['isReady',['../class_a_d_k.html#a1dee02856625dfcac4b0cdd4e8672cef',1,'ADK::isReady()'],['../class_b_t_d.html#a1b2440748bdaaeb552a05b0f0902f5d8',1,'BTD::isReady()'],['../class_a_c_m.html#a7161082e88359738596dd12a706ee286',1,'ACM::isReady()'],['../class_f_t_d_i.html#a0e392f0f49843fa9ab0701950628b47b',1,'FTDI::isReady()'],['../class_h_i_d_boot.html#a9972f402f3141b2d71c0e59602675f68',1,'HIDBoot::isReady()'],['../class_h_i_d_composite.html#a3d12bc7e852944029b1314a95b84d6ce',1,'HIDComposite::isReady()'],['../class_h_i_d_universal.html#aa4be95e8f5164393ea4766f68c5b0ea8',1,'HIDUniversal::isReady()'],['../class_p_s3_u_s_b.html#a02a5b0244665d5a790d1020e51c94479',1,'PS3USB::isReady()'],['../class_x_b_o_x_o_l_d.html#af4d77a5108f2e6812ba00be1b0374829',1,'XBOXOLD::isReady()'],['../class_x_b_o_x_o_n_e.html#a23112f12ed914d1b0128675b1f59aace',1,'XBOXONE::isReady()'],['../class_x_b_o_x_r_e_c_v.html#a570568108edafee8d060aad8fe40db57',1,'XBOXRECV::isReady()'],['../class_x_b_o_x_u_s_b.html#ac2507bfe85896b7fcc772894a7a9f272',1,'XBOXUSB::isReady()']]], ['istouching',['isTouching',['../class_p_s4_parser.html#a6770a72c17062c2e00fb3602435fcade',1,'PS4Parser']]] ]; diff --git a/search/functions_9.html b/search/functions_9.html index 1d345831..5ccec429 100644 --- a/search/functions_9.html +++ b/search/functions_9.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_a.html b/search/functions_a.html index 8eb5e562..3958eb7b 100644 --- a/search/functions_a.html +++ b/search/functions_a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_a.js b/search/functions_a.js index b022de1d..e25e6734 100644 --- a/search/functions_a.js +++ b/search/functions_a.js @@ -10,5 +10,6 @@ var searchData= ['l2cap_5finformation_5fresponse',['l2cap_information_response',['../class_b_t_d.html#a91f61915c503fe7b861c88f5b3e6733c',1,'BTD']]], ['lefttoright',['leftToRight',['../class_max___l_c_d.html#a2814b0a44a6ef3773df74981ab24d382',1,'Max_LCD']]], ['lockmedia',['LockMedia',['../class_bulk_only.html#ae7561d686d0b1374b5f9937d6ec8a035',1,'BulkOnly']]], + ['lookupmsgsize',['lookupMsgSize',['../class_u_s_b_h___m_i_d_i.html#a8218ae22033b7d2120df75cfe696070e',1,'USBH_MIDI']]], ['lunisgood',['LUNIsGood',['../class_bulk_only.html#aa6d74267dc98daeb0552fa234739ab08',1,'BulkOnly']]] ]; diff --git a/search/functions_b.html b/search/functions_b.html index fa9cff56..b99b702d 100644 --- a/search/functions_b.html +++ b/search/functions_b.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_c.html b/search/functions_c.html index fce7a6b1..3a33d874 100644 --- a/search/functions_c.html +++ b/search/functions_c.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_d.html b/search/functions_d.html index 82b2b0cf..31b75b88 100644 --- a/search/functions_d.html +++ b/search/functions_d.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_d.js b/search/functions_d.js index 13cd115d..aaba009f 100644 --- a/search/functions_d.js +++ b/search/functions_d.js @@ -15,6 +15,6 @@ var searchData= ['onrelease',['OnRelease',['../class_f_t_d_i_async_oper.html#a3993597b080c11c8d1d18dd8017a8f82',1,'FTDIAsyncOper']]], ['onrightbuttondown',['OnRightButtonDown',['../class_mouse_report_parser.html#a6884349e6b2de0cbfedf3e1a77c23870',1,'MouseReportParser']]], ['onrightbuttonup',['OnRightButtonUp',['../class_mouse_report_parser.html#a1bdfee565073cd8b77cbeb9e184c174f',1,'MouseReportParser']]], - ['operator_20bool',['operator bool',['../class_s_p_p.html#ac90f0765c478bd624cee3b8d493d8432',1,'SPP']]], + ['operator_20bool',['operator bool',['../class_s_p_p.html#ac90f0765c478bd624cee3b8d493d8432',1,'SPP::operator bool()'],['../class_u_s_b_h___m_i_d_i.html#aeac79d834709ecc079551df2e16a7ffe',1,'USBH_MIDI::operator bool()']]], ['outtransfer',['outTransfer',['../class_u_s_b.html#affbc018973a588995457d535b0ac7ee7',1,'USB']]] ]; diff --git a/search/functions_e.html b/search/functions_e.html index 557ae9a4..cddb9bb5 100644 --- a/search/functions_e.html +++ b/search/functions_e.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_e.js b/search/functions_e.js index 8467ab4f..97ba8cd1 100644 --- a/search/functions_e.js +++ b/search/functions_e.js @@ -5,7 +5,7 @@ var searchData= ['pairwithwiimote',['pairWithWiimote',['../class_b_t_d.html#a6b66a27c0fd359e3129f53451352b55c',1,'BTD']]], ['parse',['Parse',['../class_config_desc_parser.html#a3722ad1dbbfcd4ecf5cbf9caf08cd517',1,'ConfigDescParser::Parse()'],['../class_hex_dumper.html#acaff9c9e5b97bbfe3596c7b7a2e2a78d',1,'HexDumper::Parse()'],['../class_mouse_report_parser.html#aed02196a692f8b633fbbebc76eefd4a1',1,'MouseReportParser::Parse()'],['../class_keyboard_report_parser.html#a122bfa9d4baa9f85010aea8245c2295c',1,'KeyboardReportParser::Parse()'],['../class_report_desc_parser_base.html#a7ecd266cbbbc18460ab8823651225e6b',1,'ReportDescParserBase::Parse()'],['../class_universal_report_parser.html#a77f459e6751a2ca360574e91a89f92b9',1,'UniversalReportParser::Parse()'],['../class_multi_byte_value_parser.html#a9d380bf3ab3fee2c8797883504bcd827',1,'MultiByteValueParser::Parse()'],['../class_p_t_p_list_parser.html#a15ebdbc2ca861bc6e6d051273cf3b66e',1,'PTPListParser::Parse()'],['../class_p_s4_parser.html#a6498fdeb767364e84ce09ef208980622',1,'PS4Parser::Parse()'],['../class_sink_parser.html#ac6cf61bb48d61cb7db178c62c5f86fd0',1,'SinkParser::Parse()'],['../class_u_s_b_read_parser.html#afdb9cea2a2fe18d26f4ec595b86a7f7c',1,'USBReadParser::Parse()'],['../class_h_i_d_report_parser.html#af6c4b832fad296860bae406730e792da',1,'HIDReportParser::Parse()']]], ['parsebthiddata',['ParseBTHIDData',['../class_b_t_h_i_d.html#a4de4a1efd32000a0cf5a884456e52c7d',1,'BTHID::ParseBTHIDData()'],['../class_p_s4_b_t.html#a0d92689d0c24e62ddc7a1b3c4c658512',1,'PS4BT::ParseBTHIDData()']]], - ['parseconfigdescr',['parseConfigDescr',['../class_u_s_b_h___m_i_d_i.html#a92359b023ab411c86af8efb7283c0e9f',1,'USBH_MIDI']]], + ['parseconfigdescr',['parseConfigDescr',['../class_u_s_b_h___m_i_d_i.html#aabe63c64fbcee52e7c724d489cd19394',1,'USBH_MIDI']]], ['parsehiddata',['ParseHIDData',['../class_h_i_d_composite.html#ac01dac60c82bd850509696252cd9b651',1,'HIDComposite::ParseHIDData()'],['../class_h_i_d_universal.html#a5d6e27f817d6d2c67692783a02872939',1,'HIDUniversal::ParseHIDData()'],['../class_p_s4_u_s_b.html#a8222cea2ec47bff310d6e5fbada9e695',1,'PS4USB::ParseHIDData()'],['../class_p_s_buzz.html#a73e7a2f4b5537a692d699dc7c57ca6d6',1,'PSBuzz::ParseHIDData()']]], ['parseitem',['ParseItem',['../class_report_desc_parser_base.html#ac1d6c015d9a2527bb2044e9a96fcaaf9',1,'ReportDescParserBase::ParseItem()'],['../class_report_desc_parser2.html#a84242b62a5d202b5d2d6fe26809bc0e2',1,'ReportDescParser2::ParseItem()']]], ['peek',['peek',['../class_s_p_p.html#a3149d75ba4646ba5b5428c465e983144',1,'SPP']]], @@ -17,7 +17,7 @@ var searchData= ['printbytevalue',['PrintByteValue',['../class_report_desc_parser_base.html#a1af970b456e54342e15a88ffd98ca6cc',1,'ReportDescParserBase']]], ['printconsumerpageusage',['PrintConsumerPageUsage',['../class_report_desc_parser_base.html#a9af1dc144bab9e9864394594be67d2eb',1,'ReportDescParserBase']]], ['printdigitizerpageusage',['PrintDigitizerPageUsage',['../class_report_desc_parser_base.html#aa62d11cfe404ee51ffd26f13c33800a1',1,'ReportDescParserBase']]], - ['printendpointdescriptor',['PrintEndpointDescriptor',['../class_a_d_k.html#ac4bd3303b99921289c3f59e2df219e50',1,'ADK::PrintEndpointDescriptor()'],['../class_b_t_d.html#aa5976eead215a58553aee683d42405a0',1,'BTD::PrintEndpointDescriptor()'],['../class_a_c_m.html#aa05a65487f5e02bab40ccba1018ee5b6',1,'ACM::PrintEndpointDescriptor()'],['../class_bulk_only.html#ac8a1d7b2ef82d9f6da44928c78039964',1,'BulkOnly::PrintEndpointDescriptor()'],['../class_u_s_b_h_i_d.html#a046f84af88dab2e9063db0bf36308cd4',1,'USBHID::PrintEndpointDescriptor()']]], + ['printendpointdescriptor',['PrintEndpointDescriptor',['../class_a_d_k.html#ac4bd3303b99921289c3f59e2df219e50',1,'ADK::PrintEndpointDescriptor()'],['../class_b_t_d.html#aa5976eead215a58553aee683d42405a0',1,'BTD::PrintEndpointDescriptor()'],['../class_a_c_m.html#aa05a65487f5e02bab40ccba1018ee5b6',1,'ACM::PrintEndpointDescriptor()'],['../class_bulk_only.html#ac8a1d7b2ef82d9f6da44928c78039964',1,'BulkOnly::PrintEndpointDescriptor()'],['../class_u_s_b_h_i_d.html#a046f84af88dab2e9063db0bf36308cd4',1,'USBHID::PrintEndpointDescriptor()'],['../class_x_b_o_x_o_n_e.html#a2eea30f2ce47380fc414d4fc4231335b',1,'XBOXONE::PrintEndpointDescriptor()']]], ['printgamecontrolspageusage',['PrintGameControlsPageUsage',['../class_report_desc_parser_base.html#a4e026cfeda7bfe9e07cf247cbcc4a122',1,'ReportDescParserBase']]], ['printgenericdesktoppageusage',['PrintGenericDesktopPageUsage',['../class_report_desc_parser_base.html#a3eff46688f9edbee3a58c43bbf104763',1,'ReportDescParserBase']]], ['printgenericdevicecontrolspageusage',['PrintGenericDeviceControlsPageUsage',['../class_report_desc_parser_base.html#a1b5cb93a83e2212319fe30f1a1636478',1,'ReportDescParserBase']]], diff --git a/search/functions_f.html b/search/functions_f.html index b27fb7d1..49672926 100644 --- a/search/functions_f.html +++ b/search/functions_f.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/functions_f.js b/search/functions_f.js index 2a81af12..4b55dfb0 100644 --- a/search/functions_f.js +++ b/search/functions_f.js @@ -1,10 +1,11 @@ var searchData= [ ['rcvdata',['RcvData',['../class_a_d_k.html#a66b9943dfa89f783a8cdeb655e6fe9b1',1,'ADK::RcvData()'],['../class_a_c_m.html#a7f455b7a649522c29f2e63d668b0ccca',1,'ACM::RcvData()'],['../class_f_t_d_i.html#aa367ae72fbfda931cae8ec751e9dc434',1,'FTDI::RcvData()'],['../class_u_s_b_h___m_i_d_i.html#a1f522c0aca86795e1bfb7575e1759338',1,'USBH_MIDI::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)'],['../class_u_s_b_h___m_i_d_i.html#afa51b7a718728cdc4f25f9abec25be52',1,'USBH_MIDI::RcvData(uint8_t *outBuf)']]], - ['read',['Read',['../class_bulk_only.html#a470a8f0ffd6694d9dfc834da5efa627a',1,'BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf)'],['../class_bulk_only.html#a52f54376dcd7f5baf17718105e8f085d',1,'BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs)'],['../class_s_p_p.html#aae8dc037e845480f582afea57b858b95',1,'SPP::read()']]], + ['read',['read',['../class_s_p_p.html#aae8dc037e845480f582afea57b858b95',1,'SPP::read()'],['../class_bulk_only.html#a470a8f0ffd6694d9dfc834da5efa627a',1,'BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf)'],['../class_bulk_only.html#a52f54376dcd7f5baf17718105e8f085d',1,'BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs)']]], ['read_5fregister',['read_register',['../class_x_r21_b1411.html#adfcc22eba1ec95fe62af960682b8ecbc',1,'XR21B1411']]], - ['readpollinterval',['readPollInterval',['../class_b_t_d.html#a2a9ecb996243e070e70972370e45e4fd',1,'BTD']]], - ['recvdata',['RecvData',['../class_u_s_b_h___m_i_d_i.html#adb10f3867c2171603faa37af3e9fd210',1,'USBH_MIDI::RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)'],['../class_u_s_b_h___m_i_d_i.html#a4cd869ca837db908f283d2f41f3eb608',1,'USBH_MIDI::RecvData(uint8_t *outBuf)']]], + ['readpollinterval',['readPollInterval',['../class_b_t_d.html#a2a9ecb996243e070e70972370e45e4fd',1,'BTD::readPollInterval()'],['../class_x_b_o_x_o_n_e.html#ae606811be2389140b19421aad2cb040f',1,'XBOXONE::readPollInterval()']]], + ['recvdata',['RecvData',['../class_u_s_b_h___m_i_d_i.html#adb10f3867c2171603faa37af3e9fd210',1,'USBH_MIDI::RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)'],['../class_u_s_b_h___m_i_d_i.html#aea89f48a206501ecf09b7d962e1fa688',1,'USBH_MIDI::RecvData(uint8_t *outBuf, bool isRaw=false)']]], + ['recvrawdata',['RecvRawData',['../class_u_s_b_h___m_i_d_i.html#af9f74895deb356da3d1915d9eac24aca',1,'USBH_MIDI']]], ['registerbluetoothservice',['registerBluetoothService',['../class_b_t_d.html#ad00d299e64c1a939e4a781ef39f75684',1,'BTD']]], ['registerdeviceclass',['RegisterDeviceClass',['../class_u_s_b.html#a3f66bf622590413ef2e1864f93a3e0d2',1,'USB']]], ['regrd',['regRd',['../class_m_a_x3421e.html#a508fe70d1983cdaa71cce85ea9c75ec1',1,'MAX3421e']]], @@ -13,7 +14,7 @@ var searchData= ['releasedevice',['ReleaseDevice',['../class_u_s_b.html#ac681c6c98e1641f705bc14d670a2663a',1,'USB']]], ['reportdescparser2',['ReportDescParser2',['../class_report_desc_parser2.html#a6ee7a47ffbc5c2905506c10039fcfaff',1,'ReportDescParser2']]], ['reportdescparserbase',['ReportDescParserBase',['../class_report_desc_parser_base.html#a607a81ff9d8f282298533a1dbf10f8e1',1,'ReportDescParserBase']]], - ['reset',['reset',['../class_m_a_x3421e.html#a15b78912dd4b1c96b6ad141117dcb7ee',1,'MAX3421e::reset()'],['../class_bluetooth_service.html#aa7c81841d4e898e9dc91533da6d7ab64',1,'BluetoothService::Reset()'],['../class_b_t_h_i_d.html#af4c58b81414a037910dd6fb78f97b96e',1,'BTHID::Reset()'],['../class_p_s3_b_t.html#a576d72cdf12af58ae59c8f2a02f99c0f',1,'PS3BT::Reset()'],['../class_p_s4_parser.html#a24640b2362b0f6f51785fbd3dd4f13f9',1,'PS4Parser::Reset()'],['../class_p_s_buzz.html#a5bb4f2ee80ca9d10d87031b57bd09268',1,'PSBuzz::Reset()'],['../class_s_p_p.html#ae2c661bd46cd2d74bd29c4c771cd2ef0',1,'SPP::Reset()'],['../class_w_i_i.html#a769ee2f9a0088da097438bc3cc677f7c',1,'WII::Reset()']]], + ['reset',['Reset',['../class_bluetooth_service.html#aa7c81841d4e898e9dc91533da6d7ab64',1,'BluetoothService::Reset()'],['../class_b_t_h_i_d.html#af4c58b81414a037910dd6fb78f97b96e',1,'BTHID::Reset()'],['../class_p_s3_b_t.html#a576d72cdf12af58ae59c8f2a02f99c0f',1,'PS3BT::Reset()'],['../class_p_s4_parser.html#a24640b2362b0f6f51785fbd3dd4f13f9',1,'PS4Parser::Reset()'],['../class_p_s_buzz.html#a5bb4f2ee80ca9d10d87031b57bd09268',1,'PSBuzz::Reset()'],['../class_s_p_p.html#ae2c661bd46cd2d74bd29c4c771cd2ef0',1,'SPP::Reset()'],['../class_w_i_i.html#a769ee2f9a0088da097438bc3cc677f7c',1,'WII::Reset()'],['../class_m_a_x3421e.html#a15b78912dd4b1c96b6ad141117dcb7ee',1,'MAX3421e::reset()']]], ['resetbthid',['ResetBTHID',['../class_b_t_h_i_d.html#acc22bf5baaa096fe09b72c812c1134f0',1,'BTHID::ResetBTHID()'],['../class_p_s4_b_t.html#a4b1c9e15ccdc7ab24f7fb42fc9b5d827',1,'PS4BT::ResetBTHID()']]], ['resethubport',['ResetHubPort',['../class_u_s_b_device_config.html#a12bb63558ded5bb6661bb173b07ff391',1,'USBDeviceConfig::ResetHubPort()'],['../class_u_s_b_hub.html#ae7e4c1e231ce7cb56bae1688c0e95e58',1,'USBHub::ResetHubPort()']]], ['resethubpremask',['ResetHubPreMask',['../class_u_s_b.html#a5b4de045ea7fefe0fab967ddf44c39b1',1,'USB']]], diff --git a/search/pages_0.html b/search/pages_0.html index 0db7267b..d7528582 100644 --- a/search/pages_0.html +++ b/search/pages_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/pages_1.html b/search/pages_1.html index 2c67a8ef..924fb482 100644 --- a/search/pages_1.html +++ b/search/pages_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/pages_1.js b/search/pages_1.js index ccf30468..88fb4726 100644 --- a/search/pages_1.js +++ b/search/pages_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['wiicamerareadme',['WiiCameraReadme',['../md__Users_Lauszus_Github_USB_Host_Shield_2_0_WiiCameraReadme.html',1,'']]] + ['wiicamerareadme',['WiiCameraReadme',['../md___users_lauszus__github__u_s_b__host__shield_2_0__wii_camera_readme.html',1,'']]] ]; diff --git a/search/search.css b/search/search.css index 4d7612ff..3cf9df94 100644 --- a/search/search.css +++ b/search/search.css @@ -6,14 +6,12 @@ #MSearchBox { white-space : nowrap; - position: absolute; float: none; - display: inline; margin-top: 8px; right: 0px; width: 170px; + height: 24px; z-index: 102; - background-color: white; } #MSearchBox .left @@ -48,12 +46,13 @@ height:19px; background:url('search_m.png') repeat-x; border:none; - width:111px; + width:115px; margin-left:20px; padding-left:4px; color: #909090; outline: none; font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; } #FSearchBox #MSearchField { @@ -64,7 +63,7 @@ display:block; position:absolute; right:10px; - top:0px; + top:8px; width:20px; height:19px; background:url('search_r.png') no-repeat; @@ -102,7 +101,7 @@ left: 0; top: 0; border: 1px solid #90A5CE; background-color: #F9FAFC; - z-index: 1; + z-index: 10001; padding-top: 4px; padding-bottom: 4px; -moz-border-radius: 4px; @@ -165,6 +164,7 @@ iframe#MSearchResults { left: 0; top: 0; border: 1px solid #000; background-color: #EEF1F7; + z-index:10000; } /* ----------------------------------- */ diff --git a/search/search.js b/search/search.js index dedce3bf..a554ab9c 100644 --- a/search/search.js +++ b/search/search.js @@ -1,3 +1,26 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ function convertToId(search) { var result = ''; @@ -788,4 +811,4 @@ function init_search() } searchBox.OnSelectItem(0); } - +/* @license-end */ diff --git a/search/typedefs_0.html b/search/typedefs_0.html index fb07195c..2a284a94 100644 --- a/search/typedefs_0.html +++ b/search/typedefs_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/typedefs_1.html b/search/typedefs_1.html index 6edac96b..7af807db 100644 --- a/search/typedefs_1.html +++ b/search/typedefs_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/typedefs_2.html b/search/typedefs_2.html index cc5cc404..745d076c 100644 --- a/search/typedefs_2.html +++ b/search/typedefs_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/typedefs_3.html b/search/typedefs_3.html index 3fdb8f26..def60a5b 100644 --- a/search/typedefs_3.html +++ b/search/typedefs_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/typedefs_4.html b/search/typedefs_4.html index fb508194..ef733ad2 100644 --- a/search/typedefs_4.html +++ b/search/typedefs_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/typedefs_5.html b/search/typedefs_5.html index 0ad02a6c..94db6d21 100644 --- a/search/typedefs_5.html +++ b/search/typedefs_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/typedefs_6.html b/search/typedefs_6.html index 10007d2c..bda8ea1c 100644 --- a/search/typedefs_6.html +++ b/search/typedefs_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_0.html b/search/variables_0.html index 3835278f..51f7bd6b 100644 --- a/search/variables_0.html +++ b/search/variables_0.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_1.html b/search/variables_1.html index 3c65cf26..f46154d8 100644 --- a/search/variables_1.html +++ b/search/variables_1.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_10.html b/search/variables_10.html index 52b5fe87..b62b717e 100644 --- a/search/variables_10.html +++ b/search/variables_10.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_10.js b/search/variables_10.js index c9f0ea5b..404dda09 100644 --- a/search/variables_10.js +++ b/search/variables_10.js @@ -1,4 +1,4 @@ var searchData= [ - ['qnextpolltime',['qNextPollTime',['../class_b_t_d.html#a52d6c7895f6bb01729d01ce28a2f3079',1,'BTD::qNextPollTime()'],['../class_a_c_m.html#a6701d70ae4734e8a81971d9fb8b085f2',1,'ACM::qNextPollTime()'],['../class_bulk_only.html#a2d422ee0745cd7c04afff905278c4233',1,'BulkOnly::qNextPollTime()']]] + ['qnextpolltime',['qNextPollTime',['../class_b_t_d.html#a52d6c7895f6bb01729d01ce28a2f3079',1,'BTD::qNextPollTime()'],['../class_a_c_m.html#a6701d70ae4734e8a81971d9fb8b085f2',1,'ACM::qNextPollTime()'],['../class_bulk_only.html#a2d422ee0745cd7c04afff905278c4233',1,'BulkOnly::qNextPollTime()'],['../class_x_b_o_x_o_n_e.html#a4d0702c6fc0327535d909975670e9284',1,'XBOXONE::qNextPollTime()']]] ]; diff --git a/search/variables_11.html b/search/variables_11.html index 476f36e0..2ce8561a 100644 --- a/search/variables_11.html +++ b/search/variables_11.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_11.js b/search/variables_11.js index b5b6d0c8..82fcf137 100644 --- a/search/variables_11.js +++ b/search/variables_11.js @@ -1,8 +1,8 @@ var searchData= [ ['r',['r',['../struct_p_s4_output.html#a76a85e749899e2e6cb135a6ec6acabb3',1,'PS4Output']]], - ['r1',['R1',['../struct_inquiry_response.html#a72abbdbd399647227ea05cb1cec32b2d',1,'InquiryResponse::R1()'],['../union_p_s4_buttons.html#aba0cb76ee82bd0ebe9872aa7bcbffac6',1,'PS4Buttons::r1()']]], - ['r2',['R2',['../struct_inquiry_response.html#aa635575deb7f984d27142ee2071af5b3',1,'InquiryResponse::R2()'],['../union_p_s4_buttons.html#a416642ff357b1313825fe94e0491b60e',1,'PS4Buttons::r2()']]], + ['r1',['r1',['../union_p_s4_buttons.html#aba0cb76ee82bd0ebe9872aa7bcbffac6',1,'PS4Buttons::r1()'],['../struct_inquiry_response.html#a72abbdbd399647227ea05cb1cec32b2d',1,'InquiryResponse::R1()']]], + ['r2',['r2',['../union_p_s4_buttons.html#a416642ff357b1313825fe94e0491b60e',1,'PS4Buttons::r2()'],['../struct_inquiry_response.html#aa635575deb7f984d27142ee2071af5b3',1,'InquiryResponse::R2()']]], ['r3',['r3',['../union_p_s4_buttons.html#a09805f3bcc362c410d7897792599d61d',1,'PS4Buttons']]], ['readptr',['readPtr',['../class_u_s_b_h___m_i_d_i.html#aad25eeebfe8741afa7a242ec398c846e',1,'USBH_MIDI']]], ['ready',['ready',['../class_a_d_k.html#a135db75b9e8cdd59b89f46c44dd83dd4',1,'ADK::ready()'],['../class_a_c_m.html#ae9a10861da80510a54942a511ce9009e',1,'ACM::ready()']]], diff --git a/search/variables_12.html b/search/variables_12.html index ff143dcb..bba5857f 100644 --- a/search/variables_12.html +++ b/search/variables_12.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_13.html b/search/variables_13.html index f62f946f..c92cbcc3 100644 --- a/search/variables_13.html +++ b/search/variables_13.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_14.html b/search/variables_14.html index edd9b916..2c462043 100644 --- a/search/variables_14.html +++ b/search/variables_14.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_15.html b/search/variables_15.html index 6ee4d58a..c86a5fd6 100644 --- a/search/variables_15.html +++ b/search/variables_15.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_15.js b/search/variables_15.js index 2dfee6cd..04701734 100644 --- a/search/variables_15.js +++ b/search/variables_15.js @@ -6,7 +6,7 @@ var searchData= ['varbuffer',['varBuffer',['../class_report_desc_parser_base.html#a82cde32720eba596e5864fe7d541ea13',1,'ReportDescParserBase']]], ['vendorid',['VendorID',['../struct_inquiry_response.html#acc610ff84bef225f8826585725ad9802',1,'InquiryResponse']]], ['version',['Version',['../struct_inquiry_response.html#a86832a5def98c1e21447497177a8cc3a',1,'InquiryResponse']]], - ['vid',['vid',['../class_u_s_b_h___m_i_d_i.html#aa578074365d77bb3e41063a18625dfe3',1,'USBH_MIDI::vid()'],['../class_h_i_d_composite.html#acf516cb6242d1659c9bc77fe475c973e',1,'HIDComposite::VID()'],['../class_h_i_d_universal.html#a7f2123d1f20327600bb9e49a1ef5b0c7',1,'HIDUniversal::VID()']]], + ['vid',['VID',['../class_h_i_d_composite.html#acf516cb6242d1659c9bc77fe475c973e',1,'HIDComposite::VID()'],['../class_h_i_d_universal.html#a7f2123d1f20327600bb9e49a1ef5b0c7',1,'HIDUniversal::VID()'],['../class_u_s_b_h___m_i_d_i.html#aa578074365d77bb3e41063a18625dfe3',1,'USBH_MIDI::vid()']]], ['vrtitles0',['vrTitles0',['../class_report_desc_parser_base.html#a42d34a0a49f987c9dcfdd4fb8d42bf0d',1,'ReportDescParserBase']]], ['vrtitles1',['vrTitles1',['../class_report_desc_parser_base.html#a41af57cb0fb0bbed7277bcd04a9e9fe9',1,'ReportDescParserBase']]], ['vs',['VS',['../struct_inquiry_response.html#a9a6c47a45be5bd1ce230c9fac3cc9bbd',1,'InquiryResponse']]] diff --git a/search/variables_16.html b/search/variables_16.html index 0f264c90..f6bc6a05 100644 --- a/search/variables_16.html +++ b/search/variables_16.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_16.js b/search/variables_16.js index 28ac20b0..68e9cbd7 100644 --- a/search/variables_16.js +++ b/search/variables_16.js @@ -1,6 +1,6 @@ var searchData= [ - ['watingforconnection',['watingForConnection',['../class_b_t_d.html#aa7735da01865bab01b569ee836173737',1,'BTD']]], + ['waitingforconnection',['waitingForConnection',['../class_b_t_d.html#a93a522edb2974185c7567b8f83860424',1,'BTD']]], ['wdescriptorlength',['wDescriptorLength',['../struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html#a0b160c43f6a6132c0debabd6ef171950',1,'USB_HID_DESCRIPTOR::wDescriptorLength()'],['../struct_h_i_d___c_l_a_s_s___d_e_s_c_r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e.html#a98251c1867caf1651f6e926952189201',1,'HID_CLASS_DESCRIPTOR_LEN_AND_TYPE::wDescriptorLength()']]], ['wide',['wide',['../structtty__features.html#af97f813b49e81e0f89435a07525b3321',1,'tty_features']]], ['widebus16bit',['WideBus16Bit',['../struct_inquiry_response.html#a39a63fd0fd92c50370af9aefe93c13cf',1,'InquiryResponse']]], diff --git a/search/variables_17.html b/search/variables_17.html index 0d82cea8..6a71407b 100644 --- a/search/variables_17.html +++ b/search/variables_17.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_18.html b/search/variables_18.html index 971df6f4..9f6ccdde 100644 --- a/search/variables_18.html +++ b/search/variables_18.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_2.html b/search/variables_2.html index 7b43e0ac..15275b7a 100644 --- a/search/variables_2.html +++ b/search/variables_2.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_2.js b/search/variables_2.js index dd299f04..203636c5 100644 --- a/search/variables_2.js +++ b/search/variables_2.js @@ -12,7 +12,7 @@ var searchData= ['bcdusb',['bcdUSB',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#a621148cd71148fb15e136010480a34ac',1,'USB_DEVICE_DESCRIPTOR']]], ['bcharformat',['bCharFormat',['../struct_l_i_n_e___c_o_d_i_n_g.html#ae2c35eef8f7e35b5f2a3464225477d3c',1,'LINE_CODING']]], ['bconfigurationvalue',['bConfigurationValue',['../struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r.html#a568d08f2ae98670a707489645a67746b',1,'USB_CONFIGURATION_DESCRIPTOR']]], - ['bconfnum',['bConfNum',['../class_a_d_k.html#ae8fcc6a6fccab61116cea10dd1f17738',1,'ADK::bConfNum()'],['../class_b_t_d.html#a10c34527ae90e95791ac48ac7d1154a2',1,'BTD::bConfNum()'],['../class_a_c_m.html#af1a17c2d77625599da12b26cb0c90d39',1,'ACM::bConfNum()'],['../class_bulk_only.html#ab54f472ec9cd39abdb9f90867943d162',1,'BulkOnly::bConfNum()'],['../class_u_s_b_h___m_i_d_i.html#a441bf3b7bcd3ad8ca4e18f68fd03404c',1,'USBH_MIDI::bConfNum()']]], + ['bconfnum',['bConfNum',['../class_a_d_k.html#ae8fcc6a6fccab61116cea10dd1f17738',1,'ADK::bConfNum()'],['../class_b_t_d.html#a10c34527ae90e95791ac48ac7d1154a2',1,'BTD::bConfNum()'],['../class_a_c_m.html#af1a17c2d77625599da12b26cb0c90d39',1,'ACM::bConfNum()'],['../class_bulk_only.html#ab54f472ec9cd39abdb9f90867943d162',1,'BulkOnly::bConfNum()'],['../class_u_s_b_h___m_i_d_i.html#a441bf3b7bcd3ad8ca4e18f68fd03404c',1,'USBH_MIDI::bConfNum()'],['../class_x_b_o_x_o_n_e.html#ac6c75dcd5dfd5a9685a049f9bb8cb93f',1,'XBOXONE::bConfNum()']]], ['bcontroliface',['bControlIface',['../class_a_c_m.html#a5512d9e8c8c59371f16018fe8ce46b19',1,'ACM']]], ['bcountrycode',['bCountryCode',['../struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html#a340e5f812dbf7fe8caa13a1541a51f42',1,'USB_HID_DESCRIPTOR']]], ['bcswstatus',['bCSWStatus',['../struct_command_status_wrapper.html#a7170ed5bc0e2bbe04758e687beef4487',1,'CommandStatusWrapper']]], @@ -99,7 +99,7 @@ var searchData= ['bnumconfigurations',['bNumConfigurations',['../struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html#ab1b8db3992e0dceb2ba86f3bab1e5bca',1,'USB_DEVICE_DESCRIPTOR']]], ['bnumdescriptors',['bNumDescriptors',['../struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html#a05f827473d2eb4e67d1f99bc317b1eba',1,'USB_HID_DESCRIPTOR']]], ['bnumendpoints',['bNumEndpoints',['../struct_u_s_b___i_n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r.html#a3268bc05bb0147e19f97e50e702fc141',1,'USB_INTERFACE_DESCRIPTOR']]], - ['bnumep',['bNumEP',['../class_a_d_k.html#adf969d306da15baecd5c59bbb568053e',1,'ADK::bNumEP()'],['../class_b_t_d.html#a893dd35932821cddda7e482a1904af66',1,'BTD::bNumEP()'],['../class_a_c_m.html#a058b4d4a088a002fcde4fb2b75e33f93',1,'ACM::bNumEP()'],['../class_bulk_only.html#a6cb56ebd0307845321340919e2b35952',1,'BulkOnly::bNumEP()'],['../class_u_s_b_h___m_i_d_i.html#ab8b2dd096df7159ce8a09a19812307ca',1,'USBH_MIDI::bNumEP()']]], + ['bnumep',['bNumEP',['../class_a_d_k.html#adf969d306da15baecd5c59bbb568053e',1,'ADK::bNumEP()'],['../class_b_t_d.html#a893dd35932821cddda7e482a1904af66',1,'BTD::bNumEP()'],['../class_a_c_m.html#a058b4d4a088a002fcde4fb2b75e33f93',1,'ACM::bNumEP()'],['../class_bulk_only.html#a6cb56ebd0307845321340919e2b35952',1,'BulkOnly::bNumEP()'],['../class_u_s_b_h___m_i_d_i.html#ab8b2dd096df7159ce8a09a19812307ca',1,'USBH_MIDI::bNumEP()'],['../class_x_b_o_x_o_n_e.html#a958f262ed66dd5bf0ad7dfd54a369659',1,'XBOXONE::bNumEP()']]], ['bnuminterfaces',['bNumInterfaces',['../struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r.html#abd647927a872ac856c9f5aaf624bb99f',1,'USB_CONFIGURATION_DESCRIPTOR']]], ['bnumringerpatterns',['bNumRingerPatterns',['../struct_t_e_l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r.html#aca65dc577a0dbc13972da9ab26e25918',1,'TEL_RINGER_FUNC_DESCR']]], ['bparitytype',['bParityType',['../struct_l_i_n_e___c_o_d_i_n_g.html#ad14985344c9e31a210999dfa0b4ccc42',1,'LINE_CODING']]], @@ -121,5 +121,6 @@ var searchData= ['btdpin',['btdPin',['../class_b_t_d.html#a215cb939c01ed3ff56db37841224546c',1,'BTD']]], ['bthelun',['bTheLUN',['../class_bulk_only.html#a24c051d401f5f1a9ce65c1bc25ab02dd',1,'BulkOnly']]], ['btn',['btn',['../struct_p_s4_data.html#a60c0217c1879e1b16ae5d19a8c8695a3',1,'PS4Data::btn()'],['../union_p_s_b_u_z_z_buttons.html#a92ce392e7a31f155fbdf0fa0c8a5c83e',1,'PSBUZZButtons::btn()']]], + ['btransfertypemask',['bTransferTypeMask',['../class_u_s_b_h___m_i_d_i.html#a16cc26804628e2ea32513b4cce1aa7c3',1,'USBH_MIDI']]], ['btype',['bType',['../struct_hid_item_prefix.html#a16874c73fdb809e4c46407ca83684927',1,'HidItemPrefix']]] ]; diff --git a/search/variables_3.html b/search/variables_3.html index ea0392df..fbc36712 100644 --- a/search/variables_3.html +++ b/search/variables_3.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_4.html b/search/variables_4.html index 1ed95cb6..8067e67f 100644 --- a/search/variables_4.html +++ b/search/variables_4.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_5.html b/search/variables_5.html index ecc883b5..7e95e946 100644 --- a/search/variables_5.html +++ b/search/variables_5.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_5.js b/search/variables_5.js index f04f1218..6b17486c 100644 --- a/search/variables_5.js +++ b/search/variables_5.js @@ -9,7 +9,7 @@ var searchData= ['epdatainindexvsp',['epDataInIndexVSP',['../class_u_s_b_h___m_i_d_i.html#ac8b7d0994df1a059ccf6be62dd84cc9e',1,'USBH_MIDI']]], ['epdataoutindex',['epDataOutIndex',['../class_a_d_k.html#acfc5a7e45f15bba7ff8cd42552796624',1,'ADK::epDataOutIndex()'],['../class_a_c_m.html#a0dc940bc4f1bed7525bb768e37e6cb61',1,'ACM::epDataOutIndex()'],['../class_bulk_only.html#a8d527bdc285870f3571481a4fd982721',1,'BulkOnly::epDataOutIndex()'],['../class_u_s_b_h___m_i_d_i.html#a2a2e35a5ce5ffc8605837de2587db740',1,'USBH_MIDI::epDataOutIndex()']]], ['epdataoutindexvsp',['epDataOutIndexVSP',['../class_u_s_b_h___m_i_d_i.html#a42685ed17f731d3c8e3062d1e1b52f78',1,'USBH_MIDI']]], - ['epinfo',['epinfo',['../struct_usb_device.html#a410d39fb7758157f57794335e990ed02',1,'UsbDevice::epinfo()'],['../class_a_d_k.html#a6ffc693d731ddeb9499c11e893fc467d',1,'ADK::epInfo()'],['../class_b_t_d.html#a91d92fee94e5a4cbca472bb3fd883e3e',1,'BTD::epInfo()'],['../class_a_c_m.html#a60fb6a365b78fb80a4a9842e364cf1a3',1,'ACM::epInfo()'],['../class_h_i_d_composite.html#a4101c34c5079bd827953368450140a9a',1,'HIDComposite::epInfo()'],['../class_h_i_d_universal.html#ad26d2e63130abac2059154bf5afbf152',1,'HIDUniversal::epInfo()'],['../class_bulk_only.html#aee2247fd0a251e4da36e8c09bbe6917f',1,'BulkOnly::epInfo()'],['../class_p_s3_u_s_b.html#a394dbb0a59b587210e5958f08dac48f1',1,'PS3USB::epInfo()'],['../class_u_s_b_h___m_i_d_i.html#ac947c1e0feea5cc9387c35bbd9bde961',1,'USBH_MIDI::epInfo()'],['../class_x_b_o_x_o_l_d.html#a06a318db8037f25a8d9bb62785dbacb9',1,'XBOXOLD::epInfo()'],['../class_x_b_o_x_o_n_e.html#a1d2fe54c2e3d0471aa4fa2a12bae6931',1,'XBOXONE::epInfo()'],['../class_x_b_o_x_r_e_c_v.html#af97c8d0efc945fa4ba1d120c8a5a9cbb',1,'XBOXRECV::epInfo()'],['../class_x_b_o_x_u_s_b.html#abef4a852d877d8136f198431ce54550f',1,'XBOXUSB::epInfo()']]], + ['epinfo',['epinfo',['../struct_usb_device.html#a410d39fb7758157f57794335e990ed02',1,'UsbDevice::epinfo()'],['../class_a_d_k.html#a6ffc693d731ddeb9499c11e893fc467d',1,'ADK::epInfo()'],['../class_b_t_d.html#a91d92fee94e5a4cbca472bb3fd883e3e',1,'BTD::epInfo()'],['../class_a_c_m.html#a60fb6a365b78fb80a4a9842e364cf1a3',1,'ACM::epInfo()'],['../class_h_i_d_composite.html#a4101c34c5079bd827953368450140a9a',1,'HIDComposite::epInfo()'],['../class_h_i_d_universal.html#ad26d2e63130abac2059154bf5afbf152',1,'HIDUniversal::epInfo()'],['../class_bulk_only.html#aee2247fd0a251e4da36e8c09bbe6917f',1,'BulkOnly::epInfo()'],['../class_p_s3_u_s_b.html#a394dbb0a59b587210e5958f08dac48f1',1,'PS3USB::epInfo()'],['../class_u_s_b_h___m_i_d_i.html#ac947c1e0feea5cc9387c35bbd9bde961',1,'USBH_MIDI::epInfo()'],['../class_x_b_o_x_o_l_d.html#a06a318db8037f25a8d9bb62785dbacb9',1,'XBOXOLD::epInfo()'],['../class_x_b_o_x_o_n_e.html#a2915fc1f1f3a9c5333bfd643defa0621',1,'XBOXONE::epInfo()'],['../class_x_b_o_x_r_e_c_v.html#af97c8d0efc945fa4ba1d120c8a5a9cbb',1,'XBOXRECV::epInfo()'],['../class_x_b_o_x_u_s_b.html#abef4a852d877d8136f198431ce54550f',1,'XBOXUSB::epInfo()']]], ['epinterruptinindex',['epInterruptInIndex',['../class_a_c_m.html#a9b32207fdf256e5f8553ba4048b64307',1,'ACM::epInterruptInIndex()'],['../class_bulk_only.html#a03cd96b415990821bdce43b4004c85e4',1,'BulkOnly::epInterruptInIndex()'],['../class_u_s_b_h_i_d.html#a722462978813b2154698516b729e834d',1,'USBHID::epInterruptInIndex()']]], ['epinterruptoutindex',['epInterruptOutIndex',['../class_u_s_b_h_i_d.html#af9ae556d2a7a03309db403e45eab96e8',1,'USBHID']]], ['evtbuff',['evtBuff',['../struct_hub_event.html#a5a8016b368bc8ac993abae3f97b8306f',1,'HubEvent']]] diff --git a/search/variables_6.html b/search/variables_6.html index 0c1a66ba..3d398e62 100644 --- a/search/variables_6.html +++ b/search/variables_6.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_7.html b/search/variables_7.html index e0da2ef5..7b791460 100644 --- a/search/variables_7.html +++ b/search/variables_7.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_8.html b/search/variables_8.html index 0c3d1df3..8ebc5f6b 100644 --- a/search/variables_8.html +++ b/search/variables_8.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_9.html b/search/variables_9.html index e14a1071..12136613 100644 --- a/search/variables_9.html +++ b/search/variables_9.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_a.html b/search/variables_a.html index 4e38be7c..24819a37 100644 --- a/search/variables_a.html +++ b/search/variables_a.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_b.html b/search/variables_b.html index c98ef41d..b306931e 100644 --- a/search/variables_b.html +++ b/search/variables_b.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_c.html b/search/variables_c.html index d5f44496..75709df8 100644 --- a/search/variables_c.html +++ b/search/variables_c.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_d.html b/search/variables_d.html index a57e383b..34c80a48 100644 --- a/search/variables_d.html +++ b/search/variables_d.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_e.html b/search/variables_e.html index d1502e0e..4a1c8a61 100644 --- a/search/variables_e.html +++ b/search/variables_e.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_f.html b/search/variables_f.html index f777e719..cc86fb59 100644 --- a/search/variables_f.html +++ b/search/variables_f.html @@ -1,7 +1,7 @@ - + @@ -11,15 +11,19 @@
    Loading...
    Searching...
    No Matches
    diff --git a/search/variables_f.js b/search/variables_f.js index b82bb76f..c5e65e30 100644 --- a/search/variables_f.js +++ b/search/variables_f.js @@ -7,7 +7,7 @@ var searchData= ['peripheralqualifier',['PeripheralQualifier',['../struct_inquiry_response.html#a8e8f2cb6b5a0d1ed2c300155bf2b3faa',1,'InquiryResponse']]], ['pfunconinit',['pFuncOnInit',['../class_bluetooth_service.html#a321393d44ce59213fa1c7498c247d5ff',1,'BluetoothService']]], ['pfusage',['pfUsage',['../class_report_desc_parser_base.html#a22006cbf92a3d4008695e53d7f6e2452',1,'ReportDescParserBase']]], - ['pid',['PID',['../class_h_i_d_composite.html#a1402689fc7e633723fca2b6b175c2a18',1,'HIDComposite::PID()'],['../class_h_i_d_universal.html#abc609e49d66fa6260e7cdcd2c4ff0a5a',1,'HIDUniversal::PID()'],['../class_u_s_b_h___m_i_d_i.html#aaf7ec77f0d8cefff1316ae049747e2a7',1,'USBH_MIDI::pid()']]], + ['pid',['pid',['../class_u_s_b_h___m_i_d_i.html#aaf7ec77f0d8cefff1316ae049747e2a7',1,'USBH_MIDI::pid()'],['../class_h_i_d_composite.html#a1402689fc7e633723fca2b6b175c2a18',1,'HIDComposite::PID()'],['../class_h_i_d_universal.html#abc609e49d66fa6260e7cdcd2c4ff0a5a',1,'HIDUniversal::PID()']]], ['pitchgyroscale',['pitchGyroScale',['../class_w_i_i.html#aea6ce6f3222df3e547e9957673c7a07a',1,'WII']]], ['pitchgyrospeed',['pitchGyroSpeed',['../class_w_i_i.html#aa47478ccdfe009dabb7c21232e07bfd5',1,'WII']]], ['portindicatorssupported',['PortIndicatorsSupported',['../struct_hub_descriptor.html#a6478c259c7397e89d50b42f6f3d4f4e4',1,'HubDescriptor']]], diff --git a/settings_8h.html b/settings_8h.html index c7237cc1..9dfa3ac5 100644 --- a/settings_8h.html +++ b/settings_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: settings.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
    + + @@ -132,9 +114,29 @@ Macros + +

    Macros

    #define USB_SPI   SPI
     
    #define ENABLE_UHS_DEBUGGING   0
     
    #define USB_HOST_SERIAL   Serial
     
    #define USING_SPI4TEENSY3   0
     
    #define MFK_CASTUINT8T
     

    Macro Definition Documentation

    - + +

    ◆ USB_SPI

    + +
    +
    + + + + +
    #define USB_SPI   SPI
    +
    + +

    Definition at line 33 of file settings.h.

    + +
    +
    + +

    ◆ ENABLE_UHS_DEBUGGING

    +
    @@ -144,11 +146,13 @@ Macros
    -

    Definition at line 27 of file settings.h.

    +

    Definition at line 42 of file settings.h.

    - + +

    ◆ USB_HOST_SERIAL

    +
    @@ -158,11 +162,13 @@ Macros
    -

    Definition at line 34 of file settings.h.

    +

    Definition at line 49 of file settings.h.

    - + +

    ◆ USE_UHS_MEGA_ADK

    +
    @@ -172,11 +178,13 @@ Macros
    -

    Definition at line 42 of file settings.h.

    +

    Definition at line 57 of file settings.h.

    - + +

    ◆ USE_UHS_BLACK_WIDDOW

    +
    @@ -186,11 +194,13 @@ Macros
    -

    Definition at line 45 of file settings.h.

    +

    Definition at line 60 of file settings.h.

    - + +

    ◆ USE_XMEM_SPI_LOCK

    +
    @@ -200,11 +210,13 @@ Macros
    -

    Definition at line 48 of file settings.h.

    +

    Definition at line 63 of file settings.h.

    - + +

    ◆ ENABLE_WII_IR_CAMERA

    +
    @@ -214,11 +226,13 @@ Macros
    -

    Definition at line 55 of file settings.h.

    +

    Definition at line 70 of file settings.h.

    - + +

    ◆ MASS_MAX_SUPPORTED_LUN

    +
    @@ -228,11 +242,13 @@ Macros
    -

    Definition at line 64 of file settings.h.

    +

    Definition at line 79 of file settings.h.

    - + +

    ◆ USE_SPI4TEENSY3

    +
    @@ -242,11 +258,13 @@ Macros
    -

    Definition at line 71 of file settings.h.

    +

    Definition at line 86 of file settings.h.

    - + +

    ◆ XMEM_ACQUIRE_SPI

    +
    @@ -259,11 +277,13 @@ Macros
    -

    Definition at line 121 of file settings.h.

    +

    Definition at line 136 of file settings.h.

    - + +

    ◆ XMEM_RELEASE_SPI

    +
    @@ -276,11 +296,13 @@ Macros
    -

    Definition at line 122 of file settings.h.

    +

    Definition at line 137 of file settings.h.

    - + +

    ◆ EXT_RAM

    +
    @@ -290,11 +312,13 @@ Macros
    -

    Definition at line 129 of file settings.h.

    +

    Definition at line 144 of file settings.h.

    - + +

    ◆ USING_SPI4TEENSY3

    +
    @@ -304,7 +328,23 @@ Macros
    -

    Definition at line 135 of file settings.h.

    +

    Definition at line 150 of file settings.h.

    + +
    +
    + +

    ◆ MFK_CASTUINT8T

    + +
    +
    + + + + +
    #define MFK_CASTUINT8T
    +
    + +

    Definition at line 196 of file settings.h.

    @@ -313,7 +353,7 @@ Macros diff --git a/settings_8h__incl.md5 b/settings_8h__incl.md5 index 18ee50f6..8973b498 100644 --- a/settings_8h__incl.md5 +++ b/settings_8h__incl.md5 @@ -1 +1 @@ -6b501fa892d974b429099bd7e24cac0c \ No newline at end of file +815da4cea450a9894cad50cdd34ddeef \ No newline at end of file diff --git a/settings_8h__incl.png b/settings_8h__incl.png index 8774d57ed7a5cfa54933e3888fc26ee298eb5d86..f2ef10d1f8c6c2b0668faa7afd59203f306f1446 100644 GIT binary patch literal 11318 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 Y++y^ztH3Ni5CjIvORGp#OPGfKA1jKEI{*Lx literal 11572 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 - + + USB Host Shield 2.0: settings.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    settings.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 #ifndef USB_HOST_SHIELD_SETTINGS_H
    19 #define USB_HOST_SHIELD_SETTINGS_H
    20 #include "macros.h"
    21 
    23 // DEBUGGING
    25 
    26 /* Set this to 1 to activate serial debugging */
    27 #define ENABLE_UHS_DEBUGGING 0
    28 
    29 /* This can be used to select which serial port to use for debugging if
    30  * multiple serial ports are available.
    31  * For example Serial3.
    32  */
    33 #ifndef USB_HOST_SERIAL
    34 #define USB_HOST_SERIAL Serial
    35 #endif
    36 
    38 // Manual board activation
    40 
    41 /* Set this to 1 if you are using an Arduino Mega ADK board with MAX3421e built-in */
    42 #define USE_UHS_MEGA_ADK 0 // If you are using Arduino 1.5.5 or newer there is no need to do this manually
    43 
    44 /* Set this to 1 if you are using a Black Widdow */
    45 #define USE_UHS_BLACK_WIDDOW 0
    46 
    47 /* Set this to a one to use the xmem2 lock. This is needed for multitasking and threading */
    48 #define USE_XMEM_SPI_LOCK 0
    49 
    51 // Wii IR camera
    53 
    54 /* Set this to 1 to activate code for the Wii IR camera */
    55 #define ENABLE_WII_IR_CAMERA 0
    56 
    58 // MASS STORAGE
    60 // <<<<<<<<<<<<<<<< IMPORTANT >>>>>>>>>>>>>>>
    61 // Set this to 1 to support single LUN devices, and save RAM. -- I.E. thumb drives.
    62 // Each LUN needs ~13 bytes to be able to track the state of each unit.
    63 #ifndef MASS_MAX_SUPPORTED_LUN
    64 #define MASS_MAX_SUPPORTED_LUN 8
    65 #endif
    66 
    68 // Set to 1 to use the faster spi4teensy3 driver.
    70 #ifndef USE_SPI4TEENSY3
    71 #define USE_SPI4TEENSY3 1
    72 #endif
    73 
    74 // disabled on the Teensy LC as it is incompatible for now
    75 #if defined(__MKL26Z64__)
    76 #undef USE_SPI4TEENSY3
    77 #define USE_SPI4TEENSY3 0
    78 #endif
    79 
    81 // AUTOMATIC Settings
    83 
    84 // No user serviceable parts below this line.
    85 // DO NOT change anything below here unless you are a developer!
    86 
    87 #include "version_helper.h"
    88 
    89 #if defined(__GNUC__) && defined(__AVR__)
    90 #ifndef GCC_VERSION
    91 #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
    92 #endif
    93 #if GCC_VERSION < 40602 // Test for GCC < 4.6.2
    94 #ifdef PROGMEM
    95 #undef PROGMEM
    96 #define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4
    97 #ifdef PSTR
    98 #undef PSTR
    99 #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) // Copied from pgmspace.h in avr-libc source
    100 #endif
    101 #endif
    102 #endif
    103 #endif
    104 
    105 #if !defined(DEBUG_USB_HOST) && ENABLE_UHS_DEBUGGING
    106 #define DEBUG_USB_HOST
    107 #endif
    108 
    109 #if !defined(WIICAMERA) && ENABLE_WII_IR_CAMERA
    110 #define WIICAMERA
    111 #endif
    112 
    113 // To use some other locking (e.g. freertos),
    114 // define XMEM_ACQUIRE_SPI and XMEM_RELEASE_SPI to point to your lock and unlock.
    115 // NOTE: NO argument is passed. You have to do this within your routine for
    116 // whatever you are using to lock and unlock.
    117 #if !defined(XMEM_ACQUIRE_SPI)
    118 #if USE_XMEM_SPI_LOCK || defined(USE_MULTIPLE_APP_API)
    119 #include <xmem.h>
    120 #else
    121 #define XMEM_ACQUIRE_SPI() (void(0))
    122 #define XMEM_RELEASE_SPI() (void(0))
    123 #endif
    124 #endif
    125 
    126 #if !defined(EXT_RAM) && defined(EXT_RAM_STACK) || defined(EXT_RAM_HEAP)
    127 #include <xmem.h>
    128 #else
    129 #define EXT_RAM 0
    130 #endif
    131 
    132 #if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__))
    133 #define USING_SPI4TEENSY3 USE_SPI4TEENSY3
    134 #else
    135 #define USING_SPI4TEENSY3 0
    136 #endif
    137 
    138 #if ((defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)) || defined(__ARDUINO_X86__) || ARDUINO >= 10600) && !USING_SPI4TEENSY3
    139 #include <SPI.h> // Use the Arduino SPI library for the Arduino Due, Intel Galileo 1 & 2, Intel Edison or if the SPI library with transaction is available
    140 #endif
    141 #ifdef RBL_NRF51822
    142 #include <nrf_gpio.h>
    143 #include <SPI_Master.h>
    144 #define SPI SPI_Master
    145 #endif
    146 #if defined(__PIC32MX__) || defined(__PIC32MZ__)
    147 #include <../../../../hardware/pic32/libraries/SPI/SPI.h> // Hack to use the SPI library
    148 #endif
    149 
    150 #ifdef STM32F4
    151 #include "stm32f4xx_hal.h"
    152 extern SPI_HandleTypeDef SPI_Handle; // Needed to be declared in your main.cpp
    153 #endif
    154 
    155 // Fix defines on Arduino Due
    156 #ifdef ARDUINO_SAM_DUE
    157 #ifdef tokSETUP
    158 #undef tokSETUP
    159 #endif
    160 #ifdef tokIN
    161 #undef tokIN
    162 #endif
    163 #ifdef tokOUT
    164 #undef tokOUT
    165 #endif
    166 #ifdef tokINHS
    167 #undef tokINHS
    168 #endif
    169 #ifdef tokOUTHS
    170 #undef tokOUTHS
    171 #endif
    172 #endif
    173 
    174 #endif /* SETTINGS_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 #ifndef USB_HOST_SHIELD_SETTINGS_H
    26 #define USB_HOST_SHIELD_SETTINGS_H
    27 #include "macros.h"
    28 
    30 // SPI Configuration
    32 #ifndef USB_SPI
    33 #define USB_SPI SPI
    34 //#define USB_SPI SPI1
    35 #endif
    36 
    38 // DEBUGGING
    40 
    41 /* Set this to 1 to activate serial debugging */
    42 #define ENABLE_UHS_DEBUGGING 0
    43 
    44 /* This can be used to select which serial port to use for debugging if
    45  * multiple serial ports are available.
    46  * For example Serial3.
    47  */
    48 #ifndef USB_HOST_SERIAL
    49 #define USB_HOST_SERIAL Serial
    50 #endif
    51 
    53 // Manual board activation
    55 
    56 /* Set this to 1 if you are using an Arduino Mega ADK board with MAX3421e built-in */
    57 #define USE_UHS_MEGA_ADK 0 // If you are using Arduino 1.5.5 or newer there is no need to do this manually
    58 
    59 /* Set this to 1 if you are using a Black Widdow */
    60 #define USE_UHS_BLACK_WIDDOW 0
    61 
    62 /* Set this to a one to use the xmem2 lock. This is needed for multitasking and threading */
    63 #define USE_XMEM_SPI_LOCK 0
    64 
    66 // Wii IR camera
    68 
    69 /* Set this to 1 to activate code for the Wii IR camera */
    70 #define ENABLE_WII_IR_CAMERA 0
    71 
    73 // MASS STORAGE
    75 // <<<<<<<<<<<<<<<< IMPORTANT >>>>>>>>>>>>>>>
    76 // Set this to 1 to support single LUN devices, and save RAM. -- I.E. thumb drives.
    77 // Each LUN needs ~13 bytes to be able to track the state of each unit.
    78 #ifndef MASS_MAX_SUPPORTED_LUN
    79 #define MASS_MAX_SUPPORTED_LUN 8
    80 #endif
    81 
    83 // Set to 1 to use the faster spi4teensy3 driver.
    85 #ifndef USE_SPI4TEENSY3
    86 #define USE_SPI4TEENSY3 1
    87 #endif
    88 
    89 // Disabled on the Teensy LC, as it is incompatible for now
    90 #if defined(__MKL26Z64__)
    91 #undef USE_SPI4TEENSY3
    92 #define USE_SPI4TEENSY3 0
    93 #endif
    94 
    96 // AUTOMATIC Settings
    98 
    99 // No user serviceable parts below this line.
    100 // DO NOT change anything below here unless you are a developer!
    101 
    102 #include "version_helper.h"
    103 
    104 #if defined(__GNUC__) && defined(__AVR__)
    105 #ifndef GCC_VERSION
    106 #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
    107 #endif
    108 #if GCC_VERSION < 40602 // Test for GCC < 4.6.2
    109 #ifdef PROGMEM
    110 #undef PROGMEM
    111 #define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4
    112 #ifdef PSTR
    113 #undef PSTR
    114 #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) // Copied from pgmspace.h in avr-libc source
    115 #endif
    116 #endif
    117 #endif
    118 #endif
    119 
    120 #if !defined(DEBUG_USB_HOST) && ENABLE_UHS_DEBUGGING
    121 #define DEBUG_USB_HOST
    122 #endif
    123 
    124 #if !defined(WIICAMERA) && ENABLE_WII_IR_CAMERA
    125 #define WIICAMERA
    126 #endif
    127 
    128 // To use some other locking (e.g. freertos),
    129 // define XMEM_ACQUIRE_SPI and XMEM_RELEASE_SPI to point to your lock and unlock.
    130 // NOTE: NO argument is passed. You have to do this within your routine for
    131 // whatever you are using to lock and unlock.
    132 #if !defined(XMEM_ACQUIRE_SPI)
    133 #if USE_XMEM_SPI_LOCK || defined(USE_MULTIPLE_APP_API)
    134 #include <xmem.h>
    135 #else
    136 #define XMEM_ACQUIRE_SPI() (void(0))
    137 #define XMEM_RELEASE_SPI() (void(0))
    138 #endif
    139 #endif
    140 
    141 #if !defined(EXT_RAM) && defined(EXT_RAM_STACK) || defined(EXT_RAM_HEAP)
    142 #include <xmem.h>
    143 #else
    144 #define EXT_RAM 0
    145 #endif
    146 
    147 #if defined(CORE_TEENSY) && defined(KINETISK)
    148 #define USING_SPI4TEENSY3 USE_SPI4TEENSY3
    149 #else
    150 #define USING_SPI4TEENSY3 0
    151 #endif
    152 
    153 #if ((defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)) || defined(__ARDUINO_X86__) || ARDUINO >= 10600) && !USING_SPI4TEENSY3
    154 #include <SPI.h> // Use the Arduino SPI library for the Arduino Due, Intel Galileo 1 & 2, Intel Edison or if the SPI library with transaction is available
    155 #endif
    156 #ifdef RBL_NRF51822
    157 #include <nrf_gpio.h>
    158 #include <SPI_Master.h>
    159 #define SPI SPI_Master
    160 #define MFK_CASTUINT8T (uint8_t) // RBLs return type for sizeof needs casting to uint8_t
    161 #endif
    162 #if defined(__PIC32MX__) || defined(__PIC32MZ__)
    163 #include <../../../../hardware/pic32/libraries/SPI/SPI.h> // Hack to use the SPI library
    164 #endif
    165 
    166 #if defined(ESP8266) || defined(ESP32)
    167 #define MFK_CASTUINT8T (uint8_t) // ESP return type for sizeof needs casting to uint8_t
    168 #endif
    169 
    170 #ifdef STM32F4
    171 #include "stm32f4xx_hal.h"
    172 extern SPI_HandleTypeDef SPI_Handle; // Needed to be declared in your main.cpp
    173 #endif
    174 
    175 // Fix defines on Arduino Due
    176 #ifdef ARDUINO_SAM_DUE
    177 #ifdef tokSETUP
    178 #undef tokSETUP
    179 #endif
    180 #ifdef tokIN
    181 #undef tokIN
    182 #endif
    183 #ifdef tokOUT
    184 #undef tokOUT
    185 #endif
    186 #ifdef tokINHS
    187 #undef tokINHS
    188 #endif
    189 #ifdef tokOUTHS
    190 #undef tokOUTHS
    191 #endif
    192 #endif
    193 
    194 // Set defaults
    195 #ifndef MFK_CASTUINT8T
    196 #define MFK_CASTUINT8T
    197 #endif
    198 
    199 // Workaround issue: https://github.com/esp8266/Arduino/issues/2078
    200 #ifdef ESP8266
    201 #undef PROGMEM
    202 #define PROGMEM
    203 #undef PSTR
    204 #define PSTR(s) (s)
    205 #undef pgm_read_byte
    206 #define pgm_read_byte(addr) (*reinterpret_cast<const uint8_t*>(addr))
    207 #undef pgm_read_word
    208 #define pgm_read_word(addr) (*reinterpret_cast<const uint16_t*>(addr))
    209 #endif
    210 
    211 #ifdef ARDUINO_ESP8266_WIFIO
    212 #error "This board is currently not supported"
    213 #endif
    214 
    215 #endif /* SETTINGS_H */
    diff --git a/sink__parser_8h.html b/sink__parser_8h.html index 77e661af..eb6fbaae 100644 --- a/sink__parser_8h.html +++ b/sink__parser_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: sink_parser.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Variable Documentation

    - + +

    ◆ UsbDEBUGlvl

    +
    @@ -117,7 +99,7 @@ Variables
    -

    Definition at line 22 of file message.cpp.

    +

    Definition at line 29 of file message.cpp.

    @@ -126,7 +108,7 @@ Variables diff --git a/sink__parser_8h_source.html b/sink__parser_8h_source.html index 09e782e8..e85b2c9a 100644 --- a/sink__parser_8h_source.html +++ b/sink__parser_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: sink_parser.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    sink_parser.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(_usb_h_) || defined(__SINK_PARSER_H__)
    18 #error "Never include hexdump.h directly; include Usb.h instead"
    19 #else
    20 #define __SINK_PARSER_H__
    21 
    22 extern int UsbDEBUGlvl;
    23 
    24 // This parser does absolutely nothing with the data, just swallows it.
    25 
    26 template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    27 class SinkParser : public BASE_CLASS {
    28 public:
    29 
    31  };
    32 
    33  void Initialize() {
    34  };
    35 
    36  void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset) {
    37  };
    38 };
    39 
    40 
    41 #endif // __HEXDUMP_H__
    - -
    void Initialize()
    Definition: sink_parser.h:33
    -
    int UsbDEBUGlvl
    Definition: message.cpp:22
    -
    void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)
    Definition: sink_parser.h:36
    +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(__SINK_PARSER_H__)
    26 #error "Never include hexdump.h directly; include Usb.h instead"
    27 #else
    28 #define __SINK_PARSER_H__
    29 
    30 extern int UsbDEBUGlvl;
    31 
    32 // This parser does absolutely nothing with the data, just swallows it.
    33 
    34 template <class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    35 class SinkParser : public BASE_CLASS {
    36 public:
    37 
    39  };
    40 
    41  void Initialize() {
    42  };
    43 
    44  void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset) {
    45  };
    46 };
    47 
    48 
    49 #endif // __HEXDUMP_H__
    + +
    void Initialize()
    Definition: sink_parser.h:41
    +
    int UsbDEBUGlvl
    Definition: message.cpp:29
    +
    void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)
    Definition: sink_parser.h:44
    diff --git a/struct_a_c_m___f_u_n_c___d_e_s_c_r-members.html b/struct_a_c_m___f_u_n_c___d_e_s_c_r-members.html index 87d6f9e4..e7e7b44c 100644 --- a/struct_a_c_m___f_u_n_c___d_e_s_c_r-members.html +++ b/struct_a_c_m___f_u_n_c___d_e_s_c_r-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 94 of file cdcacm.h.

    +

    Definition at line 94 of file cdcacm.h.

    Member Data Documentation

    - + +

    ◆ bFunctionLength

    +
    @@ -119,11 +99,13 @@ Public Attributes
    -

    Definition at line 95 of file cdcacm.h.

    +

    Definition at line 95 of file cdcacm.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -133,11 +115,13 @@ Public Attributes
    -

    Definition at line 96 of file cdcacm.h.

    +

    Definition at line 96 of file cdcacm.h.

    - + +

    ◆ bDescriptorSubtype

    +
    @@ -147,11 +131,13 @@ Public Attributes
    -

    Definition at line 97 of file cdcacm.h.

    +

    Definition at line 97 of file cdcacm.h.

    - + +

    ◆ bmCapabilities

    +
    @@ -161,7 +147,7 @@ Public Attributes
    -

    Definition at line 98 of file cdcacm.h.

    +

    Definition at line 98 of file cdcacm.h.

    @@ -173,7 +159,7 @@ Public Attributes diff --git a/struct_b_a_s_i_c_c_d_b-members.html b/struct_b_a_s_i_c_c_d_b-members.html index 560423b0..751238e0 100644 --- a/struct_b_a_s_i_c_c_d_b-members.html +++ b/struct_b_a_s_i_c_c_d_b-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 185 of file masstorage.h.

    +

    Definition at line 192 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ Opcode

    +
    @@ -119,11 +99,13 @@ Public Attributes
    -

    Definition at line 186 of file masstorage.h.

    +

    Definition at line 193 of file masstorage.h.

    - + +

    ◆ unused

    +
    @@ -133,11 +115,13 @@ Public Attributes
    -

    Definition at line 188 of file masstorage.h.

    +

    Definition at line 195 of file masstorage.h.

    - + +

    ◆ LUN

    +
    @@ -147,11 +131,13 @@ Public Attributes
    -

    Definition at line 189 of file masstorage.h.

    +

    Definition at line 196 of file masstorage.h.

    - + +

    ◆ info

    +
    @@ -161,7 +147,7 @@ Public Attributes
    -

    Definition at line 191 of file masstorage.h.

    +

    Definition at line 198 of file masstorage.h.

    @@ -173,7 +159,7 @@ Public Attributes diff --git a/struct_c_a_l_l___m_g_m_n_t___f_u_n_c___d_e_s_c_r-members.html b/struct_c_a_l_l___m_g_m_n_t___f_u_n_c___d_e_s_c_r-members.html index 69bb5977..66812d68 100644 --- a/struct_c_a_l_l___m_g_m_n_t___f_u_n_c___d_e_s_c_r-members.html +++ b/struct_c_a_l_l___m_g_m_n_t___f_u_n_c___d_e_s_c_r-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 86 of file cdcacm.h.

    +

    Definition at line 86 of file cdcacm.h.

    Member Data Documentation

    - + +

    ◆ bFunctionLength

    +
    @@ -121,11 +101,13 @@ Public Attributes
    -

    Definition at line 87 of file cdcacm.h.

    +

    Definition at line 87 of file cdcacm.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -135,11 +117,13 @@ Public Attributes
    -

    Definition at line 88 of file cdcacm.h.

    +

    Definition at line 88 of file cdcacm.h.

    - + +

    ◆ bDescriptorSubtype

    +
    @@ -149,11 +133,13 @@ Public Attributes
    -

    Definition at line 89 of file cdcacm.h.

    +

    Definition at line 89 of file cdcacm.h.

    - + +

    ◆ bmCapabilities

    +
    @@ -163,11 +149,13 @@ Public Attributes
    -

    Definition at line 90 of file cdcacm.h.

    +

    Definition at line 90 of file cdcacm.h.

    - + +

    ◆ bDataInterface

    +
    @@ -177,7 +165,7 @@ Public Attributes
    -

    Definition at line 91 of file cdcacm.h.

    +

    Definition at line 91 of file cdcacm.h.

    @@ -189,7 +177,7 @@ Public Attributes diff --git a/struct_c_d_b10-members.html b/struct_c_d_b10-members.html index 0daad2eb..12499ef9 100644 --- a/struct_c_d_b10-members.html +++ b/struct_c_d_b10-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 222 of file masstorage.h.

    +

    Definition at line 229 of file masstorage.h.

    Constructor & Destructor Documentation

    - + +

    ◆ CDB10() [1/2]

    +
    @@ -163,11 +143,13 @@ Public Attributes
    -

    Definition at line 241 of file masstorage.h.

    +

    Definition at line 248 of file masstorage.h.

    - + +

    ◆ CDB10() [2/2]

    +
    @@ -211,12 +193,14 @@ Public Attributes
    -

    Definition at line 247 of file masstorage.h.

    +

    Definition at line 254 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ Opcode

    +
    @@ -226,11 +210,13 @@ Public Attributes
    -

    Definition at line 223 of file masstorage.h.

    +

    Definition at line 230 of file masstorage.h.

    - + +

    ◆ Service_Action

    +
    @@ -240,11 +226,13 @@ Public Attributes
    -

    Definition at line 225 of file masstorage.h.

    +

    Definition at line 232 of file masstorage.h.

    - + +

    ◆ LUN

    +
    @@ -254,11 +242,13 @@ Public Attributes
    -

    Definition at line 226 of file masstorage.h.

    +

    Definition at line 233 of file masstorage.h.

    - + +

    ◆ LBA_L_M_MB

    +
    @@ -268,11 +258,13 @@ Public Attributes
    -

    Definition at line 228 of file masstorage.h.

    +

    Definition at line 235 of file masstorage.h.

    - + +

    ◆ LBA_L_M_LB

    +
    @@ -282,11 +274,13 @@ Public Attributes
    -

    Definition at line 229 of file masstorage.h.

    +

    Definition at line 236 of file masstorage.h.

    - + +

    ◆ LBA_L_L_MB

    +
    @@ -296,11 +290,13 @@ Public Attributes
    -

    Definition at line 230 of file masstorage.h.

    +

    Definition at line 237 of file masstorage.h.

    - + +

    ◆ LBA_L_L_LB

    +
    @@ -310,11 +306,13 @@ Public Attributes
    -

    Definition at line 231 of file masstorage.h.

    +

    Definition at line 238 of file masstorage.h.

    - + +

    ◆ Misc2

    +
    @@ -324,11 +322,13 @@ Public Attributes
    -

    Definition at line 233 of file masstorage.h.

    +

    Definition at line 240 of file masstorage.h.

    - + +

    ◆ ALC_MB

    +
    @@ -338,11 +338,13 @@ Public Attributes
    -

    Definition at line 235 of file masstorage.h.

    +

    Definition at line 242 of file masstorage.h.

    - + +

    ◆ ALC_LB

    +
    @@ -352,11 +354,13 @@ Public Attributes
    -

    Definition at line 236 of file masstorage.h.

    +

    Definition at line 243 of file masstorage.h.

    - + +

    ◆ Control

    +
    @@ -366,7 +370,7 @@ Public Attributes
    -

    Definition at line 238 of file masstorage.h.

    +

    Definition at line 245 of file masstorage.h.

    @@ -378,7 +382,7 @@ Public Attributes diff --git a/struct_c_d_b12-members.html b/struct_c_d_b12-members.html index 062d2c9a..cac91bd9 100644 --- a/struct_c_d_b12-members.html +++ b/struct_c_d_b12-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 256 of file masstorage.h.

    +

    Definition at line 263 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ Opcode

    +
    @@ -131,11 +111,13 @@ Public Attributes
    -

    Definition at line 257 of file masstorage.h.

    +

    Definition at line 264 of file masstorage.h.

    - + +

    ◆ Service_Action

    +
    @@ -145,11 +127,13 @@ Public Attributes
    -

    Definition at line 259 of file masstorage.h.

    +

    Definition at line 266 of file masstorage.h.

    - + +

    ◆ Misc

    +
    @@ -159,11 +143,13 @@ Public Attributes
    -

    Definition at line 260 of file masstorage.h.

    +

    Definition at line 267 of file masstorage.h.

    - + +

    ◆ LBA_L_M_LB

    +
    @@ -173,11 +159,13 @@ Public Attributes
    -

    Definition at line 262 of file masstorage.h.

    +

    Definition at line 269 of file masstorage.h.

    - + +

    ◆ LBA_L_L_MB

    +
    @@ -187,11 +175,13 @@ Public Attributes
    -

    Definition at line 263 of file masstorage.h.

    +

    Definition at line 270 of file masstorage.h.

    - + +

    ◆ LBA_L_L_LB

    +
    @@ -201,11 +191,13 @@ Public Attributes
    -

    Definition at line 264 of file masstorage.h.

    +

    Definition at line 271 of file masstorage.h.

    - + +

    ◆ ALC_M_LB

    +
    @@ -215,11 +207,13 @@ Public Attributes
    -

    Definition at line 266 of file masstorage.h.

    +

    Definition at line 273 of file masstorage.h.

    - + +

    ◆ ALC_L_MB

    +
    @@ -229,11 +223,13 @@ Public Attributes
    -

    Definition at line 267 of file masstorage.h.

    +

    Definition at line 274 of file masstorage.h.

    - + +

    ◆ ALC_L_LB

    +
    @@ -243,11 +239,13 @@ Public Attributes
    -

    Definition at line 268 of file masstorage.h.

    +

    Definition at line 275 of file masstorage.h.

    - + +

    ◆ Control

    +
    @@ -257,7 +255,7 @@ Public Attributes
    -

    Definition at line 269 of file masstorage.h.

    +

    Definition at line 276 of file masstorage.h.

    @@ -269,7 +267,7 @@ Public Attributes diff --git a/struct_c_d_b6-members.html b/struct_c_d_b6-members.html index 0c0f3baf..629204ba 100644 --- a/struct_c_d_b6-members.html +++ b/struct_c_d_b6-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 196 of file masstorage.h.

    +

    Definition at line 203 of file masstorage.h.

    Constructor & Destructor Documentation

    - + +

    ◆ CDB6() [1/2]

    +
    @@ -173,11 +153,13 @@ Public Attributes
    -

    Definition at line 209 of file masstorage.h.

    +

    Definition at line 216 of file masstorage.h.

    - + +

    ◆ CDB6() [2/2]

    +
    @@ -221,12 +203,14 @@ Public Attributes
    -

    Definition at line 214 of file masstorage.h.

    +

    Definition at line 221 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ Opcode

    +
    @@ -236,11 +220,13 @@ Public Attributes
    -

    Definition at line 197 of file masstorage.h.

    +

    Definition at line 204 of file masstorage.h.

    - + +

    ◆ LBAMSB

    +
    @@ -250,11 +236,13 @@ Public Attributes
    -

    Definition at line 199 of file masstorage.h.

    +

    Definition at line 206 of file masstorage.h.

    - + +

    ◆ LUN

    +
    @@ -264,11 +252,13 @@ Public Attributes
    -

    Definition at line 200 of file masstorage.h.

    +

    Definition at line 207 of file masstorage.h.

    - + +

    ◆ LBAHB

    +
    @@ -278,11 +268,13 @@ Public Attributes
    -

    Definition at line 202 of file masstorage.h.

    +

    Definition at line 209 of file masstorage.h.

    - + +

    ◆ LBALB

    +
    @@ -292,11 +284,13 @@ Public Attributes
    -

    Definition at line 203 of file masstorage.h.

    +

    Definition at line 210 of file masstorage.h.

    - + +

    ◆ AllocationLength

    +
    @@ -306,11 +300,13 @@ Public Attributes
    -

    Definition at line 204 of file masstorage.h.

    +

    Definition at line 211 of file masstorage.h.

    - + +

    ◆ Control

    +
    @@ -320,7 +316,7 @@ Public Attributes
    -

    Definition at line 205 of file masstorage.h.

    +

    Definition at line 212 of file masstorage.h.

    @@ -332,7 +328,7 @@ Public Attributes diff --git a/struct_c_d_b___l_b_a32__16-members.html b/struct_c_d_b___l_b_a32__16-members.html index 2c2d21d6..3a3c0dfa 100644 --- a/struct_c_d_b___l_b_a32__16-members.html +++ b/struct_c_d_b___l_b_a32__16-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 274 of file masstorage.h.

    +

    Definition at line 281 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ Opcode

    +
    @@ -145,11 +125,13 @@ Public Attributes
    -

    Definition at line 275 of file masstorage.h.

    +

    Definition at line 282 of file masstorage.h.

    - + +

    ◆ Service_Action

    +
    @@ -159,11 +141,13 @@ Public Attributes
    -

    Definition at line 277 of file masstorage.h.

    +

    Definition at line 284 of file masstorage.h.

    - + +

    ◆ Misc

    +
    @@ -173,11 +157,13 @@ Public Attributes
    -

    Definition at line 278 of file masstorage.h.

    +

    Definition at line 285 of file masstorage.h.

    - + +

    ◆ LBA_L_M_MB

    +
    @@ -187,11 +173,13 @@ Public Attributes
    -

    Definition at line 280 of file masstorage.h.

    +

    Definition at line 287 of file masstorage.h.

    - + +

    ◆ LBA_L_M_LB

    +
    @@ -201,11 +189,13 @@ Public Attributes
    -

    Definition at line 281 of file masstorage.h.

    +

    Definition at line 288 of file masstorage.h.

    - + +

    ◆ LBA_L_L_MB

    +
    @@ -215,11 +205,13 @@ Public Attributes
    -

    Definition at line 282 of file masstorage.h.

    +

    Definition at line 289 of file masstorage.h.

    - + +

    ◆ LBA_L_L_LB

    +
    @@ -229,11 +221,13 @@ Public Attributes
    -

    Definition at line 283 of file masstorage.h.

    +

    Definition at line 290 of file masstorage.h.

    - + +

    ◆ A_M_M_MB

    +
    @@ -243,11 +237,13 @@ Public Attributes
    -

    Definition at line 285 of file masstorage.h.

    +

    Definition at line 292 of file masstorage.h.

    - + +

    ◆ A_M_M_LB

    +
    @@ -257,11 +253,13 @@ Public Attributes
    -

    Definition at line 286 of file masstorage.h.

    +

    Definition at line 293 of file masstorage.h.

    - + +

    ◆ A_M_L_MB

    +
    @@ -271,11 +269,13 @@ Public Attributes
    -

    Definition at line 287 of file masstorage.h.

    +

    Definition at line 294 of file masstorage.h.

    - + +

    ◆ A_M_L_LB

    +
    @@ -285,11 +285,13 @@ Public Attributes
    -

    Definition at line 288 of file masstorage.h.

    +

    Definition at line 295 of file masstorage.h.

    - + +

    ◆ ALC_M_MB

    +
    @@ -299,11 +301,13 @@ Public Attributes
    -

    Definition at line 290 of file masstorage.h.

    +

    Definition at line 297 of file masstorage.h.

    - + +

    ◆ ALC_M_LB

    +
    @@ -313,11 +317,13 @@ Public Attributes
    -

    Definition at line 291 of file masstorage.h.

    +

    Definition at line 298 of file masstorage.h.

    - + +

    ◆ ALC_L_MB

    +
    @@ -327,11 +333,13 @@ Public Attributes
    -

    Definition at line 292 of file masstorage.h.

    +

    Definition at line 299 of file masstorage.h.

    - + +

    ◆ ALC_L_LB

    +
    @@ -341,11 +349,13 @@ Public Attributes
    -

    Definition at line 293 of file masstorage.h.

    +

    Definition at line 300 of file masstorage.h.

    - + +

    ◆ Misc2

    +
    @@ -355,11 +365,13 @@ Public Attributes
    -

    Definition at line 295 of file masstorage.h.

    +

    Definition at line 302 of file masstorage.h.

    - + +

    ◆ Control

    +
    @@ -369,7 +381,7 @@ Public Attributes
    -

    Definition at line 296 of file masstorage.h.

    +

    Definition at line 303 of file masstorage.h.

    @@ -381,7 +393,7 @@ Public Attributes diff --git a/struct_c_d_b___l_b_a64__16-members.html b/struct_c_d_b___l_b_a64__16-members.html index 8bce7513..729d39a4 100644 --- a/struct_c_d_b___l_b_a64__16-members.html +++ b/struct_c_d_b___l_b_a64__16-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 299 of file masstorage.h.

    +

    Definition at line 306 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ Opcode

    +
    @@ -143,11 +123,13 @@ Public Attributes
    -

    Definition at line 300 of file masstorage.h.

    +

    Definition at line 307 of file masstorage.h.

    - + +

    ◆ Misc

    +
    @@ -157,11 +139,13 @@ Public Attributes
    -

    Definition at line 301 of file masstorage.h.

    +

    Definition at line 308 of file masstorage.h.

    - + +

    ◆ LBA_M_M_MB

    +
    @@ -171,11 +155,13 @@ Public Attributes
    -

    Definition at line 303 of file masstorage.h.

    +

    Definition at line 310 of file masstorage.h.

    - + +

    ◆ LBA_M_M_LB

    +
    @@ -185,11 +171,13 @@ Public Attributes
    -

    Definition at line 304 of file masstorage.h.

    +

    Definition at line 311 of file masstorage.h.

    - + +

    ◆ LBA_M_L_MB

    +
    @@ -199,11 +187,13 @@ Public Attributes
    -

    Definition at line 305 of file masstorage.h.

    +

    Definition at line 312 of file masstorage.h.

    - + +

    ◆ LBA_M_L_LB

    +
    @@ -213,11 +203,13 @@ Public Attributes
    -

    Definition at line 306 of file masstorage.h.

    +

    Definition at line 313 of file masstorage.h.

    - + +

    ◆ LBA_L_M_MB

    +
    @@ -227,11 +219,13 @@ Public Attributes
    -

    Definition at line 308 of file masstorage.h.

    +

    Definition at line 315 of file masstorage.h.

    - + +

    ◆ LBA_L_M_LB

    +
    @@ -241,11 +235,13 @@ Public Attributes
    -

    Definition at line 309 of file masstorage.h.

    +

    Definition at line 316 of file masstorage.h.

    - + +

    ◆ LBA_L_L_MB

    +
    @@ -255,11 +251,13 @@ Public Attributes
    -

    Definition at line 310 of file masstorage.h.

    +

    Definition at line 317 of file masstorage.h.

    - + +

    ◆ LBA_L_L_LB

    +
    @@ -269,11 +267,13 @@ Public Attributes
    -

    Definition at line 311 of file masstorage.h.

    +

    Definition at line 318 of file masstorage.h.

    - + +

    ◆ ALC_M_MB

    +
    @@ -283,11 +283,13 @@ Public Attributes
    -

    Definition at line 313 of file masstorage.h.

    +

    Definition at line 320 of file masstorage.h.

    - + +

    ◆ ALC_M_LB

    +
    @@ -297,11 +299,13 @@ Public Attributes
    -

    Definition at line 314 of file masstorage.h.

    +

    Definition at line 321 of file masstorage.h.

    - + +

    ◆ ALC_L_MB

    +
    @@ -311,11 +315,13 @@ Public Attributes
    -

    Definition at line 315 of file masstorage.h.

    +

    Definition at line 322 of file masstorage.h.

    - + +

    ◆ ALC_L_LB

    +
    @@ -325,11 +331,13 @@ Public Attributes
    -

    Definition at line 316 of file masstorage.h.

    +

    Definition at line 323 of file masstorage.h.

    - + +

    ◆ Misc2

    +
    @@ -339,11 +347,13 @@ Public Attributes
    -

    Definition at line 318 of file masstorage.h.

    +

    Definition at line 325 of file masstorage.h.

    - + +

    ◆ Control

    +
    @@ -353,7 +363,7 @@ Public Attributes
    -

    Definition at line 319 of file masstorage.h.

    +

    Definition at line 326 of file masstorage.h.

    @@ -365,7 +375,7 @@ Public Attributes diff --git a/struct_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n-members.html b/struct_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n-members.html index 5bef2b0e..36d9b3f0 100644 --- a/struct_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n-members.html +++ b/struct_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 117 of file cdcacm.h.

    +

    Definition at line 117 of file cdcacm.h.

    Member Data Documentation

    - + +

    ◆ bmRequestType

    +
    @@ -123,11 +103,13 @@ Public Attributes
    -

    Definition at line 118 of file cdcacm.h.

    +

    Definition at line 118 of file cdcacm.h.

    - + +

    ◆ bNotification

    +
    @@ -137,11 +119,13 @@ Public Attributes
    -

    Definition at line 119 of file cdcacm.h.

    +

    Definition at line 119 of file cdcacm.h.

    - + +

    ◆ wValue

    +
    @@ -151,11 +135,13 @@ Public Attributes
    -

    Definition at line 120 of file cdcacm.h.

    +

    Definition at line 120 of file cdcacm.h.

    - + +

    ◆ wIndex

    +
    @@ -165,11 +151,13 @@ Public Attributes
    -

    Definition at line 121 of file cdcacm.h.

    +

    Definition at line 121 of file cdcacm.h.

    - + +

    ◆ wLength

    +
    @@ -179,11 +167,13 @@ Public Attributes
    -

    Definition at line 122 of file cdcacm.h.

    +

    Definition at line 122 of file cdcacm.h.

    - + +

    ◆ bmState

    +
    @@ -193,7 +183,7 @@ Public Attributes
    -

    Definition at line 123 of file cdcacm.h.

    +

    Definition at line 123 of file cdcacm.h.

    @@ -205,7 +195,7 @@ Public Attributes diff --git a/struct_capacity-members.html b/struct_capacity-members.html index ed2227dd..856be512 100644 --- a/struct_capacity-members.html +++ b/struct_capacity-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 179 of file masstorage.h.

    +

    Definition at line 186 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ data

    +
    @@ -113,7 +93,7 @@ Public Attributes
    -

    Definition at line 180 of file masstorage.h.

    +

    Definition at line 187 of file masstorage.h.

    @@ -125,7 +105,7 @@ Public Attributes diff --git a/struct_command_block_wrapper-members.html b/struct_command_block_wrapper-members.html index b6213acf..b5b26b06 100644 --- a/struct_command_block_wrapper-members.html +++ b/struct_command_block_wrapper-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 385 of file masstorage.h.

    +

    Definition at line 392 of file masstorage.h.

    Constructor & Destructor Documentation

    - + +

    ◆ CommandBlockWrapper() [1/4]

    +
    @@ -180,11 +160,13 @@ Public Attributes
    -

    Definition at line 402 of file masstorage.h.

    +

    Definition at line 409 of file masstorage.h.

    - + +

    ◆ CommandBlockWrapper() [2/4]

    +
    @@ -240,11 +222,13 @@ Public Attributes
    -

    Definition at line 409 of file masstorage.h.

    +

    Definition at line 416 of file masstorage.h.

    - + +

    ◆ CommandBlockWrapper() [3/4]

    +
    @@ -288,11 +272,13 @@ Public Attributes
    -

    Definition at line 422 of file masstorage.h.

    +

    Definition at line 429 of file masstorage.h.

    - + +

    ◆ CommandBlockWrapper() [4/4]

    +
    @@ -336,12 +322,14 @@ Public Attributes
    -

    Definition at line 429 of file masstorage.h.

    +

    Definition at line 436 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ bmCBWLUN

    +
    @@ -351,11 +339,13 @@ Public Attributes
    -

    Definition at line 388 of file masstorage.h.

    +

    Definition at line 395 of file masstorage.h.

    - + +

    ◆ bmReserved1

    +
    @@ -365,11 +355,13 @@ Public Attributes
    -

    Definition at line 389 of file masstorage.h.

    +

    Definition at line 396 of file masstorage.h.

    - + +

    ◆ @25

    +
    @@ -381,7 +373,9 @@ Public Attributes - + +

    ◆ bmCBWCBLength

    +
    @@ -391,11 +385,13 @@ Public Attributes
    -

    Definition at line 393 of file masstorage.h.

    +

    Definition at line 400 of file masstorage.h.

    - + +

    ◆ bmReserved2

    +
    @@ -405,11 +401,13 @@ Public Attributes
    -

    Definition at line 394 of file masstorage.h.

    +

    Definition at line 401 of file masstorage.h.

    - + +

    ◆ @27

    +
    @@ -421,7 +419,9 @@ Public Attributes - + +

    ◆ CBWCB

    +
    @@ -431,7 +431,7 @@ Public Attributes
    -

    Definition at line 397 of file masstorage.h.

    +

    Definition at line 404 of file masstorage.h.

    @@ -443,7 +443,7 @@ Public Attributes diff --git a/struct_command_block_wrapper__coll__graph.md5 b/struct_command_block_wrapper__coll__graph.md5 index 4ac6fd00..fb60e9cc 100644 --- a/struct_command_block_wrapper__coll__graph.md5 +++ b/struct_command_block_wrapper__coll__graph.md5 @@ -1 +1 @@ -001476afe02cd749eb9e1c79a3e71cf0 \ No newline at end of file +6d90b23dcd5b35e5632bdbee25cd3da9 \ No newline at end of file diff --git a/struct_command_block_wrapper__coll__graph.png b/struct_command_block_wrapper__coll__graph.png index a6cc179cbf4e64815b094e89affe024c6d786760..e9120cc201369b73a37ac12f8d2289933e60caf6 100644 GIT binary patch literal 6780 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 B8gu{v literal 6739 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Ν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 B8gu{v literal 6739 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ΝUuv3~zgS6kzoIwSOg|+(d|u5GsTpBPQ6ejP}$*vR)VECFta2O{ltbXkN72ob=l4@2A@wj!D0+c}Q0 z@`Vr|OcmKv)aE7Nb3fKF=|~w7s(AOp^cCbCNADkD)!e0Ei^;izr$AL!jx=IoL4t>j zird}Ho2a~AvhWW!E?{lda06xm#g#%-NbHU3bYXY39Y~Ka;B#aX!DygRw49>)mBQCN zcc}Cg=*hE)$Bl=yaCKMfxIv+02j++9eq5E0wydQZelkWX8SA_#faq8E*OTK1)k+t zehUj1StpBeiwr}=Thi_FP*aIyJaG)?%20gUX3Ox%0C~aCyuAc6Z<7=(nCCogC(E%} z`a-_RFLyb}8EW9;JLLCcw&6K0@;JBlpN6izTrQWV1F!&r<5S`EOLgUapX}F?gWjra zqDr&C8fM}Ew`}elQXbj$JzvF%j<8g2&P6G3$UbYAe_&f)mb&J)(zvq7X8&6dy9@wP z8W#+2?>P8@vykL>PW0A@ct8Z&EVB$)j01- - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 370 of file masstorage.h.

    +

    Definition at line 377 of file masstorage.h.

    Constructor & Destructor Documentation

    - + +

    ◆ CommandBlockWrapperBase() [1/2]

    +
    @@ -146,11 +126,13 @@ Public Attributes
    -

    Definition at line 377 of file masstorage.h.

    +

    Definition at line 384 of file masstorage.h.

    - + +

    ◆ CommandBlockWrapperBase() [2/2]

    +
    @@ -188,12 +170,14 @@ Public Attributes
    -

    Definition at line 380 of file masstorage.h.

    +

    Definition at line 387 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ dCBWSignature

    +
    @@ -203,11 +187,13 @@ Public Attributes
    -

    Definition at line 371 of file masstorage.h.

    +

    Definition at line 378 of file masstorage.h.

    - + +

    ◆ dCBWTag

    +
    @@ -217,11 +203,13 @@ Public Attributes
    -

    Definition at line 372 of file masstorage.h.

    +

    Definition at line 379 of file masstorage.h.

    - + +

    ◆ dCBWDataTransferLength

    +
    @@ -231,11 +219,13 @@ Public Attributes
    -

    Definition at line 373 of file masstorage.h.

    +

    Definition at line 380 of file masstorage.h.

    - + +

    ◆ bmCBWFlags

    +
    @@ -245,7 +235,7 @@ Public Attributes
    -

    Definition at line 374 of file masstorage.h.

    +

    Definition at line 381 of file masstorage.h.

    @@ -257,7 +247,7 @@ Public Attributes diff --git a/struct_command_block_wrapper_base__inherit__graph.md5 b/struct_command_block_wrapper_base__inherit__graph.md5 index 84b6b492..62af27aa 100644 --- a/struct_command_block_wrapper_base__inherit__graph.md5 +++ b/struct_command_block_wrapper_base__inherit__graph.md5 @@ -1 +1 @@ -661b00c525b61c0779a28cb69f358c68 \ No newline at end of file +260f0d6a8b792d32c45f8b276a0aa1d0 \ No newline at end of file diff --git a/struct_command_block_wrapper_base__inherit__graph.png b/struct_command_block_wrapper_base__inherit__graph.png index e3a9983dc1f89f87e24b7951420de45cc08b052c..f8121b8dcbb4be58d25ffebe72da48616c93bf1d 100644 GIT binary patch literal 6684 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 G(EkCCJ``pE literal 6696 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 aZj~u~)K76HnFnrw2=uj$?p0|zMEnmaQydcj diff --git a/struct_command_status_wrapper-members.html b/struct_command_status_wrapper-members.html index 61b0abe3..33dc7a13 100644 --- a/struct_command_status_wrapper-members.html +++ b/struct_command_status_wrapper-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 436 of file masstorage.h.

    +

    Definition at line 443 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ dCSWSignature

    +
    @@ -119,11 +99,13 @@ Public Attributes
    -

    Definition at line 437 of file masstorage.h.

    +

    Definition at line 444 of file masstorage.h.

    - + +

    ◆ dCSWTag

    +
    @@ -133,11 +115,13 @@ Public Attributes
    -

    Definition at line 438 of file masstorage.h.

    +

    Definition at line 445 of file masstorage.h.

    - + +

    ◆ dCSWDataResidue

    +
    @@ -147,11 +131,13 @@ Public Attributes
    -

    Definition at line 439 of file masstorage.h.

    +

    Definition at line 446 of file masstorage.h.

    - + +

    ◆ bCSWStatus

    +
    @@ -161,7 +147,7 @@ Public Attributes
    -

    Definition at line 440 of file masstorage.h.

    +

    Definition at line 447 of file masstorage.h.

    @@ -173,7 +159,7 @@ Public Attributes diff --git a/struct_ep_info-members.html b/struct_ep_info-members.html index de93050f..cc9734ac 100644 --- a/struct_ep_info-members.html +++ b/struct_ep_info-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 32 of file address.h.

    +

    Definition at line 39 of file address.h.

    Member Data Documentation

    - + +

    ◆ epAddr

    +
    @@ -129,11 +109,13 @@ Public Attributes
    -

    Definition at line 33 of file address.h.

    +

    Definition at line 40 of file address.h.

    - + +

    ◆ maxPktSize

    +
    @@ -143,11 +125,13 @@ Public Attributes
    -

    Definition at line 34 of file address.h.

    +

    Definition at line 41 of file address.h.

    - + +

    ◆ epAttribs

    +
    @@ -157,11 +141,13 @@ Public Attributes
    -

    Definition at line 37 of file address.h.

    +

    Definition at line 44 of file address.h.

    - + +

    ◆ bmSndToggle

    +
    @@ -171,11 +157,13 @@ Public Attributes
    -

    Definition at line 40 of file address.h.

    +

    Definition at line 47 of file address.h.

    - + +

    ◆ bmRcvToggle

    +
    @@ -185,11 +173,13 @@ Public Attributes
    -

    Definition at line 41 of file address.h.

    +

    Definition at line 48 of file address.h.

    - + +

    ◆ bmNakPower

    +
    @@ -199,11 +189,13 @@ Public Attributes
    -

    Definition at line 42 of file address.h.

    +

    Definition at line 49 of file address.h.

    - + +

    ◆ @1

    +
    @@ -223,7 +215,7 @@ Public Attributes diff --git a/struct_h_i_d___c_l_a_s_s___d_e_s_c_r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e-members.html b/struct_h_i_d___c_l_a_s_s___d_e_s_c_r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e-members.html index 53b1bd5d..2420ea1b 100644 --- a/struct_h_i_d___c_l_a_s_s___d_e_s_c_r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e-members.html +++ b/struct_h_i_d___c_l_a_s_s___d_e_s_c_r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e-members.html @@ -3,7 +3,8 @@ - + +USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 161 of file usb_ch9.h.

    +

    Definition at line 168 of file usb_ch9.h.

    Member Data Documentation

    - + +

    ◆ bDescrType

    +
    @@ -115,11 +95,13 @@ Public Attributes
    -

    Definition at line 162 of file usb_ch9.h.

    +

    Definition at line 169 of file usb_ch9.h.

    - + +

    ◆ wDescriptorLength

    +
    @@ -129,7 +111,7 @@ Public Attributes
    -

    Definition at line 163 of file usb_ch9.h.

    +

    Definition at line 170 of file usb_ch9.h.

    @@ -141,7 +123,7 @@ Public Attributes diff --git a/struct_hid_item_prefix-members.html b/struct_hid_item_prefix-members.html index 8b7ec1bb..2fa38893 100644 --- a/struct_hid_item_prefix-members.html +++ b/struct_hid_item_prefix-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 119 of file usbhid.h.

    +

    Definition at line 119 of file usbhid.h.

    Member Data Documentation

    - + +

    ◆ bSize

    +
    @@ -117,11 +97,13 @@ Public Attributes
    -

    Definition at line 120 of file usbhid.h.

    +

    Definition at line 120 of file usbhid.h.

    - + +

    ◆ bType

    +
    @@ -131,11 +113,13 @@ Public Attributes
    -

    Definition at line 121 of file usbhid.h.

    +

    Definition at line 121 of file usbhid.h.

    - + +

    ◆ bTag

    +
    @@ -145,7 +129,7 @@ Public Attributes
    -

    Definition at line 122 of file usbhid.h.

    +

    Definition at line 122 of file usbhid.h.

    @@ -157,7 +141,7 @@ Public Attributes diff --git a/struct_hub_descriptor-members.html b/struct_hub_descriptor-members.html index d7aca265..59af6d7b 100644 --- a/struct_hub_descriptor-members.html +++ b/struct_hub_descriptor-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 133 of file usbhub.h.

    +

    Definition at line 133 of file usbhub.h.

    Member Data Documentation

    - + +

    ◆ bDescLength

    +
    @@ -136,11 +116,13 @@ Public Attributes
    -

    Definition at line 134 of file usbhub.h.

    +

    Definition at line 134 of file usbhub.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -150,11 +132,13 @@ Public Attributes
    -

    Definition at line 135 of file usbhub.h.

    +

    Definition at line 135 of file usbhub.h.

    - + +

    ◆ bNbrPorts

    +
    @@ -164,11 +148,13 @@ Public Attributes
    -

    Definition at line 136 of file usbhub.h.

    +

    Definition at line 136 of file usbhub.h.

    - + +

    ◆ LogPwrSwitchMode

    +
    @@ -178,11 +164,13 @@ Public Attributes
    -

    Definition at line 139 of file usbhub.h.

    +

    Definition at line 139 of file usbhub.h.

    - + +

    ◆ CompoundDevice

    +
    @@ -192,11 +180,13 @@ Public Attributes
    -

    Definition at line 140 of file usbhub.h.

    +

    Definition at line 140 of file usbhub.h.

    - + +

    ◆ OverCurrentProtectMode

    +
    @@ -206,11 +196,13 @@ Public Attributes
    -

    Definition at line 141 of file usbhub.h.

    +

    Definition at line 141 of file usbhub.h.

    - + +

    ◆ TTThinkTime

    +
    @@ -220,11 +212,13 @@ Public Attributes
    -

    Definition at line 142 of file usbhub.h.

    +

    Definition at line 142 of file usbhub.h.

    - + +

    ◆ PortIndicatorsSupported

    +
    @@ -234,11 +228,13 @@ Public Attributes
    -

    Definition at line 143 of file usbhub.h.

    +

    Definition at line 143 of file usbhub.h.

    - + +

    ◆ Reserved

    +
    @@ -248,11 +244,13 @@ Public Attributes
    -

    Definition at line 144 of file usbhub.h.

    +

    Definition at line 144 of file usbhub.h.

    - + +

    ◆ @39

    +
    @@ -264,7 +262,9 @@ Public Attributes - + +

    ◆ bPwrOn2PwrGood

    +
    @@ -274,11 +274,13 @@ Public Attributes
    -

    Definition at line 147 of file usbhub.h.

    +

    Definition at line 147 of file usbhub.h.

    - + +

    ◆ bHubContrCurrent

    +
    @@ -288,7 +290,7 @@ Public Attributes
    -

    Definition at line 148 of file usbhub.h.

    +

    Definition at line 148 of file usbhub.h.

    @@ -300,7 +302,7 @@ Public Attributes diff --git a/struct_hub_event-members.html b/struct_hub_event-members.html index c4a00eb7..52697a51 100644 --- a/struct_hub_event-members.html +++ b/struct_hub_event-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 151 of file usbhub.h.

    +

    Definition at line 151 of file usbhub.h.

    Member Data Documentation

    - + +

    ◆ bmStatus

    +
    @@ -125,11 +105,13 @@ Public Attributes
    -

    Definition at line 156 of file usbhub.h.

    +

    Definition at line 156 of file usbhub.h.

    - + +

    ◆ bmChange

    +
    @@ -139,11 +121,13 @@ Public Attributes
    -

    Definition at line 157 of file usbhub.h.

    +

    Definition at line 157 of file usbhub.h.

    - + +

    ◆ bmEvent

    +
    @@ -153,11 +137,13 @@ Public Attributes
    -

    Definition at line 159 of file usbhub.h.

    +

    Definition at line 159 of file usbhub.h.

    - + +

    ◆ evtBuff

    +
    @@ -167,11 +153,13 @@ Public Attributes
    -

    Definition at line 160 of file usbhub.h.

    +

    Definition at line 160 of file usbhub.h.

    - + +

    ◆ @41

    +
    @@ -191,7 +179,7 @@ Public Attributes diff --git a/struct_inquiry_response-members.html b/struct_inquiry_response-members.html index 2b274c25..1dd79e69 100644 --- a/struct_inquiry_response-members.html +++ b/struct_inquiry_response-members.html @@ -3,7 +3,8 @@ - + +USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 322 of file masstorage.h.

    +

    Definition at line 329 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ DeviceType

    +
    @@ -183,11 +163,13 @@ Public Attributes
    -

    Definition at line 323 of file masstorage.h.

    +

    Definition at line 330 of file masstorage.h.

    - + +

    ◆ PeripheralQualifier

    +
    @@ -197,11 +179,13 @@ Public Attributes
    -

    Definition at line 324 of file masstorage.h.

    +

    Definition at line 331 of file masstorage.h.

    - + +

    ◆ Reserved

    +
    @@ -211,11 +195,13 @@ Public Attributes
    -

    Definition at line 326 of file masstorage.h.

    +

    Definition at line 333 of file masstorage.h.

    - + +

    ◆ Removable

    +
    @@ -225,11 +211,13 @@ Public Attributes
    -

    Definition at line 327 of file masstorage.h.

    +

    Definition at line 334 of file masstorage.h.

    - + +

    ◆ Version

    +
    @@ -239,11 +227,13 @@ Public Attributes
    -

    Definition at line 329 of file masstorage.h.

    +

    Definition at line 336 of file masstorage.h.

    - + +

    ◆ ResponseDataFormat

    +
    @@ -253,11 +243,13 @@ Public Attributes
    -

    Definition at line 331 of file masstorage.h.

    +

    Definition at line 338 of file masstorage.h.

    - + +

    ◆ HISUP

    +
    @@ -267,11 +259,13 @@ Public Attributes
    -

    Definition at line 332 of file masstorage.h.

    +

    Definition at line 339 of file masstorage.h.

    - + +

    ◆ NormACA

    +
    @@ -281,11 +275,13 @@ Public Attributes
    -

    Definition at line 333 of file masstorage.h.

    +

    Definition at line 340 of file masstorage.h.

    - + +

    ◆ TrmTsk

    +
    @@ -295,11 +291,13 @@ Public Attributes
    -

    Definition at line 334 of file masstorage.h.

    +

    Definition at line 341 of file masstorage.h.

    - + +

    ◆ AERC

    +
    @@ -309,11 +307,13 @@ Public Attributes
    -

    Definition at line 335 of file masstorage.h.

    +

    Definition at line 342 of file masstorage.h.

    - + +

    ◆ AdditionalLength

    +
    @@ -323,11 +323,13 @@ Public Attributes
    -

    Definition at line 337 of file masstorage.h.

    +

    Definition at line 344 of file masstorage.h.

    - + +

    ◆ PROTECT

    +
    @@ -337,11 +339,13 @@ Public Attributes
    -

    Definition at line 340 of file masstorage.h.

    +

    Definition at line 347 of file masstorage.h.

    - + +

    ◆ Res

    +
    @@ -351,11 +355,13 @@ Public Attributes
    -

    Definition at line 341 of file masstorage.h.

    +

    Definition at line 348 of file masstorage.h.

    - + +

    ◆ ThreePC

    +
    @@ -365,11 +371,13 @@ Public Attributes
    -

    Definition at line 342 of file masstorage.h.

    +

    Definition at line 349 of file masstorage.h.

    - + +

    ◆ TPGS

    +
    @@ -379,11 +387,13 @@ Public Attributes
    -

    Definition at line 343 of file masstorage.h.

    +

    Definition at line 350 of file masstorage.h.

    - + +

    ◆ ACC

    +
    @@ -393,11 +403,13 @@ Public Attributes
    -

    Definition at line 344 of file masstorage.h.

    +

    Definition at line 351 of file masstorage.h.

    - + +

    ◆ SCCS

    +
    @@ -407,11 +419,13 @@ Public Attributes
    -

    Definition at line 345 of file masstorage.h.

    +

    Definition at line 352 of file masstorage.h.

    - + +

    ◆ ADDR16

    +
    @@ -421,11 +435,13 @@ Public Attributes
    -

    Definition at line 347 of file masstorage.h.

    +

    Definition at line 354 of file masstorage.h.

    - + +

    ◆ R1

    +
    @@ -435,11 +451,13 @@ Public Attributes
    -

    Definition at line 348 of file masstorage.h.

    +

    Definition at line 355 of file masstorage.h.

    - + +

    ◆ R2

    +
    @@ -449,11 +467,13 @@ Public Attributes
    -

    Definition at line 349 of file masstorage.h.

    +

    Definition at line 356 of file masstorage.h.

    - + +

    ◆ MCHNGR

    +
    @@ -463,11 +483,13 @@ Public Attributes
    -

    Definition at line 350 of file masstorage.h.

    +

    Definition at line 357 of file masstorage.h.

    - + +

    ◆ MULTIP

    +
    @@ -477,11 +499,13 @@ Public Attributes
    -

    Definition at line 351 of file masstorage.h.

    +

    Definition at line 358 of file masstorage.h.

    - + +

    ◆ VS

    +
    @@ -491,11 +515,13 @@ Public Attributes
    -

    Definition at line 352 of file masstorage.h.

    +

    Definition at line 359 of file masstorage.h.

    - + +

    ◆ ENCSERV

    +
    @@ -505,11 +531,13 @@ Public Attributes
    -

    Definition at line 353 of file masstorage.h.

    +

    Definition at line 360 of file masstorage.h.

    - + +

    ◆ BQUE

    +
    @@ -519,11 +547,13 @@ Public Attributes
    -

    Definition at line 354 of file masstorage.h.

    +

    Definition at line 361 of file masstorage.h.

    - + +

    ◆ SoftReset

    +
    @@ -533,11 +563,13 @@ Public Attributes
    -

    Definition at line 356 of file masstorage.h.

    +

    Definition at line 363 of file masstorage.h.

    - + +

    ◆ CmdQue

    +
    @@ -547,11 +579,13 @@ Public Attributes
    -

    Definition at line 357 of file masstorage.h.

    +

    Definition at line 364 of file masstorage.h.

    - + +

    ◆ Reserved4

    +
    @@ -561,11 +595,13 @@ Public Attributes
    -

    Definition at line 358 of file masstorage.h.

    +

    Definition at line 365 of file masstorage.h.

    - + +

    ◆ Linked

    +
    @@ -575,11 +611,13 @@ Public Attributes
    -

    Definition at line 359 of file masstorage.h.

    +

    Definition at line 366 of file masstorage.h.

    - + +

    ◆ Sync

    +
    @@ -589,11 +627,13 @@ Public Attributes
    -

    Definition at line 360 of file masstorage.h.

    +

    Definition at line 367 of file masstorage.h.

    - + +

    ◆ WideBus16Bit

    +
    @@ -603,11 +643,13 @@ Public Attributes
    -

    Definition at line 361 of file masstorage.h.

    +

    Definition at line 368 of file masstorage.h.

    - + +

    ◆ WideBus32Bit

    +
    @@ -617,11 +659,13 @@ Public Attributes
    -

    Definition at line 362 of file masstorage.h.

    +

    Definition at line 369 of file masstorage.h.

    - + +

    ◆ RelAddr

    +
    @@ -631,11 +675,13 @@ Public Attributes
    -

    Definition at line 363 of file masstorage.h.

    +

    Definition at line 370 of file masstorage.h.

    - + +

    ◆ VendorID

    +
    @@ -645,11 +691,13 @@ Public Attributes
    -

    Definition at line 365 of file masstorage.h.

    +

    Definition at line 372 of file masstorage.h.

    - + +

    ◆ ProductID

    +
    @@ -659,11 +707,13 @@ Public Attributes
    -

    Definition at line 366 of file masstorage.h.

    +

    Definition at line 373 of file masstorage.h.

    - + +

    ◆ RevisionID

    +
    @@ -673,7 +723,7 @@ Public Attributes
    -

    Definition at line 367 of file masstorage.h.

    +

    Definition at line 374 of file masstorage.h.

    @@ -685,7 +735,7 @@ Public Attributes diff --git a/struct_k_b_d_i_n_f_o-members.html b/struct_k_b_d_i_n_f_o-members.html index 4a35e910..fbddf3c7 100644 --- a/struct_k_b_d_i_n_f_o-members.html +++ b/struct_k_b_d_i_n_f_o-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 96 of file hidboot.h.

    +

    Definition at line 96 of file hidboot.h.

    Member Data Documentation

    - + +

    ◆ bmLeftCtrl

    +
    @@ -134,11 +114,13 @@ Public Attributes
    -

    Definition at line 99 of file hidboot.h.

    +

    Definition at line 99 of file hidboot.h.

    - + +

    ◆ bmLeftShift

    +
    @@ -148,11 +130,13 @@ Public Attributes
    -

    Definition at line 100 of file hidboot.h.

    +

    Definition at line 100 of file hidboot.h.

    - + +

    ◆ bmLeftAlt

    +
    @@ -162,11 +146,13 @@ Public Attributes
    -

    Definition at line 101 of file hidboot.h.

    +

    Definition at line 101 of file hidboot.h.

    - + +

    ◆ bmLeftGUI

    +
    @@ -176,11 +162,13 @@ Public Attributes
    -

    Definition at line 102 of file hidboot.h.

    +

    Definition at line 102 of file hidboot.h.

    - + +

    ◆ bmRightCtrl

    +
    @@ -190,11 +178,13 @@ Public Attributes
    -

    Definition at line 103 of file hidboot.h.

    +

    Definition at line 103 of file hidboot.h.

    - + +

    ◆ bmRightShift

    +
    @@ -204,11 +194,13 @@ Public Attributes
    -

    Definition at line 104 of file hidboot.h.

    +

    Definition at line 104 of file hidboot.h.

    - + +

    ◆ bmRightAlt

    +
    @@ -218,11 +210,13 @@ Public Attributes
    -

    Definition at line 105 of file hidboot.h.

    +

    Definition at line 105 of file hidboot.h.

    - + +

    ◆ bmRightGUI

    +
    @@ -232,11 +226,13 @@ Public Attributes
    -

    Definition at line 106 of file hidboot.h.

    +

    Definition at line 106 of file hidboot.h.

    - + +

    ◆ @16

    +
    @@ -248,7 +244,9 @@ Public Attributes - + +

    ◆ bReserved

    +
    @@ -258,11 +256,13 @@ Public Attributes
    -

    Definition at line 108 of file hidboot.h.

    +

    Definition at line 108 of file hidboot.h.

    - + +

    ◆ Keys

    +
    @@ -272,7 +272,7 @@ Public Attributes
    -

    Definition at line 109 of file hidboot.h.

    +

    Definition at line 109 of file hidboot.h.

    @@ -284,7 +284,7 @@ Public Attributes diff --git a/struct_k_b_d_l_e_d_s-members.html b/struct_k_b_d_l_e_d_s-members.html index 1707fb36..cb91650d 100644 --- a/struct_k_b_d_l_e_d_s-members.html +++ b/struct_k_b_d_l_e_d_s-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 112 of file hidboot.h.

    +

    Definition at line 112 of file hidboot.h.

    Member Data Documentation

    - + +

    ◆ bmNumLock

    +
    @@ -123,11 +103,13 @@ Public Attributes
    -

    Definition at line 113 of file hidboot.h.

    +

    Definition at line 113 of file hidboot.h.

    - + +

    ◆ bmCapsLock

    +
    @@ -137,11 +119,13 @@ Public Attributes
    -

    Definition at line 114 of file hidboot.h.

    +

    Definition at line 114 of file hidboot.h.

    - + +

    ◆ bmScrollLock

    +
    @@ -151,11 +135,13 @@ Public Attributes
    -

    Definition at line 115 of file hidboot.h.

    +

    Definition at line 115 of file hidboot.h.

    - + +

    ◆ bmCompose

    +
    @@ -165,11 +151,13 @@ Public Attributes
    -

    Definition at line 116 of file hidboot.h.

    +

    Definition at line 116 of file hidboot.h.

    - + +

    ◆ bmKana

    +
    @@ -179,11 +167,13 @@ Public Attributes
    -

    Definition at line 117 of file hidboot.h.

    +

    Definition at line 117 of file hidboot.h.

    - + +

    ◆ bmReserved

    +
    @@ -193,7 +183,7 @@ Public Attributes
    -

    Definition at line 118 of file hidboot.h.

    +

    Definition at line 118 of file hidboot.h.

    @@ -205,7 +195,7 @@ Public Attributes diff --git a/struct_l_i_n_e___c_o_d_i_n_g-members.html b/struct_l_i_n_e___c_o_d_i_n_g-members.html index 7dafe26a..a938f9b3 100644 --- a/struct_l_i_n_e___c_o_d_i_n_g-members.html +++ b/struct_l_i_n_e___c_o_d_i_n_g-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 110 of file cdcacm.h.

    +

    Definition at line 110 of file cdcacm.h.

    Member Data Documentation

    - + +

    ◆ dwDTERate

    +
    @@ -119,11 +99,13 @@ Public Attributes
    -

    Definition at line 111 of file cdcacm.h.

    +

    Definition at line 111 of file cdcacm.h.

    - + +

    ◆ bCharFormat

    +
    @@ -133,11 +115,13 @@ Public Attributes
    -

    Definition at line 112 of file cdcacm.h.

    +

    Definition at line 112 of file cdcacm.h.

    - + +

    ◆ bParityType

    +
    @@ -147,11 +131,13 @@ Public Attributes
    -

    Definition at line 113 of file cdcacm.h.

    +

    Definition at line 113 of file cdcacm.h.

    - + +

    ◆ bDataBits

    +
    @@ -161,7 +147,7 @@ Public Attributes
    -

    Definition at line 114 of file cdcacm.h.

    +

    Definition at line 114 of file cdcacm.h.

    @@ -173,7 +159,7 @@ Public Attributes diff --git a/struct_m_o_d_i_f_i_e_r_k_e_y_s-members.html b/struct_m_o_d_i_f_i_e_r_k_e_y_s-members.html index 93ea9a8c..d7de6074 100644 --- a/struct_m_o_d_i_f_i_e_r_k_e_y_s-members.html +++ b/struct_m_o_d_i_f_i_e_r_k_e_y_s-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 85 of file hidboot.h.

    +

    Definition at line 85 of file hidboot.h.

    Member Data Documentation

    - + +

    ◆ bmLeftCtrl

    +
    @@ -127,11 +107,13 @@ Public Attributes
    -

    Definition at line 86 of file hidboot.h.

    +

    Definition at line 86 of file hidboot.h.

    - + +

    ◆ bmLeftShift

    +
    @@ -141,11 +123,13 @@ Public Attributes
    -

    Definition at line 87 of file hidboot.h.

    +

    Definition at line 87 of file hidboot.h.

    - + +

    ◆ bmLeftAlt

    +
    @@ -155,11 +139,13 @@ Public Attributes
    -

    Definition at line 88 of file hidboot.h.

    +

    Definition at line 88 of file hidboot.h.

    - + +

    ◆ bmLeftGUI

    +
    @@ -169,11 +155,13 @@ Public Attributes
    -

    Definition at line 89 of file hidboot.h.

    +

    Definition at line 89 of file hidboot.h.

    - + +

    ◆ bmRightCtrl

    +
    @@ -183,11 +171,13 @@ Public Attributes
    -

    Definition at line 90 of file hidboot.h.

    +

    Definition at line 90 of file hidboot.h.

    - + +

    ◆ bmRightShift

    +
    @@ -197,11 +187,13 @@ Public Attributes
    -

    Definition at line 91 of file hidboot.h.

    +

    Definition at line 91 of file hidboot.h.

    - + +

    ◆ bmRightAlt

    +
    @@ -211,11 +203,13 @@ Public Attributes
    -

    Definition at line 92 of file hidboot.h.

    +

    Definition at line 92 of file hidboot.h.

    - + +

    ◆ bmRightGUI

    +
    @@ -225,7 +219,7 @@ Public Attributes
    -

    Definition at line 93 of file hidboot.h.

    +

    Definition at line 93 of file hidboot.h.

    @@ -237,7 +231,7 @@ Public Attributes diff --git a/struct_m_o_u_s_e_i_n_f_o-members.html b/struct_m_o_u_s_e_i_n_f_o-members.html index 7cc47fe9..268ce954 100644 --- a/struct_m_o_u_s_e_i_n_f_o-members.html +++ b/struct_m_o_u_s_e_i_n_f_o-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 39 of file hidboot.h.

    +

    Definition at line 39 of file hidboot.h.

    Member Data Documentation

    - + +

    ◆ bmLeftButton

    +
    @@ -126,11 +106,13 @@ Public Attributes
    -

    Definition at line 42 of file hidboot.h.

    +

    Definition at line 42 of file hidboot.h.

    - + +

    ◆ bmRightButton

    +
    @@ -140,11 +122,13 @@ Public Attributes
    -

    Definition at line 43 of file hidboot.h.

    +

    Definition at line 43 of file hidboot.h.

    - + +

    ◆ bmMiddleButton

    +
    @@ -154,11 +138,13 @@ Public Attributes
    -

    Definition at line 44 of file hidboot.h.

    +

    Definition at line 44 of file hidboot.h.

    - + +

    ◆ bmDummy

    +
    @@ -168,11 +154,13 @@ Public Attributes
    -

    Definition at line 45 of file hidboot.h.

    +

    Definition at line 45 of file hidboot.h.

    - + +

    ◆ @13

    +
    @@ -184,7 +172,9 @@ Public Attributes - + +

    ◆ dX

    +
    @@ -194,11 +184,13 @@ Public Attributes
    -

    Definition at line 47 of file hidboot.h.

    +

    Definition at line 47 of file hidboot.h.

    - + +

    ◆ dY

    +
    @@ -208,7 +200,7 @@ Public Attributes
    -

    Definition at line 48 of file hidboot.h.

    +

    Definition at line 48 of file hidboot.h.

    @@ -220,7 +212,7 @@ Public Attributes diff --git a/struct_main_item_i_o_feature-members.html b/struct_main_item_i_o_feature-members.html index 8108492c..4e7f2c0e 100644 --- a/struct_main_item_i_o_feature-members.html +++ b/struct_main_item_i_o_feature-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 125 of file usbhid.h.

    +

    Definition at line 125 of file usbhid.h.

    Member Data Documentation

    - + +

    ◆ bmIsConstantOrData

    +
    @@ -127,11 +107,13 @@ Public Attributes
    -

    Definition at line 126 of file usbhid.h.

    +

    Definition at line 126 of file usbhid.h.

    - + +

    ◆ bmIsArrayOrVariable

    +
    @@ -141,11 +123,13 @@ Public Attributes
    -

    Definition at line 127 of file usbhid.h.

    +

    Definition at line 127 of file usbhid.h.

    - + +

    ◆ bmIsRelativeOrAbsolute

    +
    @@ -155,11 +139,13 @@ Public Attributes
    -

    Definition at line 128 of file usbhid.h.

    +

    Definition at line 128 of file usbhid.h.

    - + +

    ◆ bmIsWrapOrNoWrap

    +
    @@ -169,11 +155,13 @@ Public Attributes
    -

    Definition at line 129 of file usbhid.h.

    +

    Definition at line 129 of file usbhid.h.

    - + +

    ◆ bmIsNonLonearOrLinear

    +
    @@ -183,11 +171,13 @@ Public Attributes
    -

    Definition at line 130 of file usbhid.h.

    +

    Definition at line 130 of file usbhid.h.

    - + +

    ◆ bmIsNoPreferedOrPrefered

    +
    @@ -197,11 +187,13 @@ Public Attributes
    -

    Definition at line 131 of file usbhid.h.

    +

    Definition at line 131 of file usbhid.h.

    - + +

    ◆ bmIsNullOrNoNull

    +
    @@ -211,11 +203,13 @@ Public Attributes
    -

    Definition at line 132 of file usbhid.h.

    +

    Definition at line 132 of file usbhid.h.

    - + +

    ◆ bmIsVolatileOrNonVolatile

    +
    @@ -225,7 +219,7 @@ Public Attributes
    -

    Definition at line 133 of file usbhid.h.

    +

    Definition at line 133 of file usbhid.h.

    @@ -237,7 +231,7 @@ Public Attributes diff --git a/struct_multi_value_buffer-members.html b/struct_multi_value_buffer-members.html index 4ac32cd4..b27f87f9 100644 --- a/struct_multi_value_buffer-members.html +++ b/struct_multi_value_buffer-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 23 of file parsetools.h.

    +

    Definition at line 30 of file parsetools.h.

    Member Data Documentation

    - + +

    ◆ valueSize

    +
    @@ -115,11 +95,13 @@ Public Attributes
    -

    Definition at line 24 of file parsetools.h.

    +

    Definition at line 31 of file parsetools.h.

    - + +

    ◆ pValue

    +
    @@ -129,7 +111,7 @@ Public Attributes
    -

    Definition at line 25 of file parsetools.h.

    +

    Definition at line 32 of file parsetools.h.

    @@ -141,7 +123,7 @@ Public Attributes diff --git a/struct_p_s4_data-members.html b/struct_p_s4_data-members.html index cf9ff973..00dca17c 100644 --- a/struct_p_s4_data-members.html +++ b/struct_p_s4_data-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 92 of file PS4Parser.h.

    +

    Definition at line 92 of file PS4Parser.h.

    Member Data Documentation

    - + +

    ◆ hatValue

    +
    @@ -149,11 +129,13 @@ Public Attributes
    -

    Definition at line 94 of file PS4Parser.h.

    +

    Definition at line 94 of file PS4Parser.h.

    - + +

    ◆ btn

    +
    @@ -163,11 +145,13 @@ Public Attributes
    -

    Definition at line 95 of file PS4Parser.h.

    +

    Definition at line 95 of file PS4Parser.h.

    - + +

    ◆ trigger

    +
    @@ -177,11 +161,13 @@ Public Attributes
    -

    Definition at line 96 of file PS4Parser.h.

    +

    Definition at line 96 of file PS4Parser.h.

    - + +

    ◆ dummy

    +
    @@ -191,11 +177,13 @@ Public Attributes
    -

    Definition at line 99 of file PS4Parser.h.

    +

    Definition at line 99 of file PS4Parser.h.

    - + +

    ◆ gyroY

    +
    @@ -205,11 +193,13 @@ Public Attributes
    -

    Definition at line 100 of file PS4Parser.h.

    +

    Definition at line 100 of file PS4Parser.h.

    - + +

    ◆ gyroZ

    +
    @@ -219,11 +209,13 @@ Public Attributes
    -

    Definition at line 100 of file PS4Parser.h.

    +

    Definition at line 100 of file PS4Parser.h.

    - + +

    ◆ gyroX

    +
    @@ -233,11 +225,13 @@ Public Attributes
    -

    Definition at line 100 of file PS4Parser.h.

    +

    Definition at line 100 of file PS4Parser.h.

    - + +

    ◆ accX

    +
    @@ -247,11 +241,13 @@ Public Attributes
    -

    Definition at line 101 of file PS4Parser.h.

    +

    Definition at line 101 of file PS4Parser.h.

    - + +

    ◆ accZ

    +
    @@ -261,11 +257,13 @@ Public Attributes
    -

    Definition at line 101 of file PS4Parser.h.

    +

    Definition at line 101 of file PS4Parser.h.

    - + +

    ◆ accY

    +
    @@ -275,11 +273,13 @@ Public Attributes
    -

    Definition at line 101 of file PS4Parser.h.

    +

    Definition at line 101 of file PS4Parser.h.

    - + +

    ◆ dummy2

    +
    @@ -289,11 +289,13 @@ Public Attributes
    -

    Definition at line 103 of file PS4Parser.h.

    +

    Definition at line 103 of file PS4Parser.h.

    - + +

    ◆ status

    +
    @@ -303,11 +305,13 @@ Public Attributes
    -

    Definition at line 104 of file PS4Parser.h.

    +

    Definition at line 104 of file PS4Parser.h.

    - + +

    ◆ dummy3

    +
    @@ -317,11 +321,13 @@ Public Attributes
    -

    Definition at line 105 of file PS4Parser.h.

    +

    Definition at line 105 of file PS4Parser.h.

    - + +

    ◆ xy

    +
    @@ -331,7 +337,7 @@ Public Attributes
    -

    Definition at line 108 of file PS4Parser.h.

    +

    Definition at line 108 of file PS4Parser.h.

    @@ -343,7 +349,7 @@ Public Attributes diff --git a/struct_p_s4_data__coll__graph.png b/struct_p_s4_data__coll__graph.png index e6364653af403b5cb4c565c6bd31d78df3def836..a5971f9e2ad98e15c49ab1c9c260f34490d4451e 100644 GIT binary patch literal 10290 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 literal 10084 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 - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@

    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 116 of file PS4Parser.h.

    +

    Definition at line 116 of file PS4Parser.h.

    Member Data Documentation

    - + +

    ◆ bigRumble

    +
    @@ -127,11 +107,13 @@ Public Attributes
    -

    Definition at line 117 of file PS4Parser.h.

    +

    Definition at line 117 of file PS4Parser.h.

    - + +

    ◆ smallRumble

    +
    @@ -141,11 +123,13 @@ Public Attributes
    -

    Definition at line 117 of file PS4Parser.h.

    +

    Definition at line 117 of file PS4Parser.h.

    - + +

    ◆ r

    +
    @@ -155,11 +139,13 @@ Public Attributes
    -

    Definition at line 118 of file PS4Parser.h.

    +

    Definition at line 118 of file PS4Parser.h.

    - + +

    ◆ g

    +
    @@ -169,11 +155,13 @@ Public Attributes
    -

    Definition at line 118 of file PS4Parser.h.

    +

    Definition at line 118 of file PS4Parser.h.

    - + +

    ◆ b

    +
    @@ -183,11 +171,13 @@ Public Attributes
    -

    Definition at line 118 of file PS4Parser.h.

    +

    Definition at line 118 of file PS4Parser.h.

    - + +

    ◆ flashOn

    +
    @@ -197,11 +187,13 @@ Public Attributes
    -

    Definition at line 119 of file PS4Parser.h.

    +

    Definition at line 119 of file PS4Parser.h.

    - + +

    ◆ flashOff

    +
    @@ -211,11 +203,13 @@ Public Attributes
    -

    Definition at line 119 of file PS4Parser.h.

    +

    Definition at line 119 of file PS4Parser.h.

    - + +

    ◆ reportChanged

    +
    @@ -225,7 +219,7 @@ Public Attributes
    -

    Definition at line 120 of file PS4Parser.h.

    +

    Definition at line 120 of file PS4Parser.h.

    @@ -237,7 +231,7 @@ Public Attributes diff --git a/struct_p_s4_status-members.html b/struct_p_s4_status-members.html index 0e1b1830..71692bef 100644 --- a/struct_p_s4_status-members.html +++ b/struct_p_s4_status-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 84 of file PS4Parser.h.

    +

    Definition at line 84 of file PS4Parser.h.

    Member Data Documentation

    - + +

    ◆ battery

    +
    @@ -121,11 +101,13 @@ Public Attributes
    -

    Definition at line 85 of file PS4Parser.h.

    +

    Definition at line 85 of file PS4Parser.h.

    - + +

    ◆ usb

    +
    @@ -135,11 +117,13 @@ Public Attributes
    -

    Definition at line 86 of file PS4Parser.h.

    +

    Definition at line 86 of file PS4Parser.h.

    - + +

    ◆ audio

    +
    @@ -149,11 +133,13 @@ Public Attributes
    -

    Definition at line 87 of file PS4Parser.h.

    +

    Definition at line 87 of file PS4Parser.h.

    - + +

    ◆ mic

    +
    @@ -163,11 +149,13 @@ Public Attributes
    -

    Definition at line 88 of file PS4Parser.h.

    +

    Definition at line 88 of file PS4Parser.h.

    - + +

    ◆ unknown

    +
    @@ -177,7 +165,7 @@ Public Attributes
    -

    Definition at line 89 of file PS4Parser.h.

    +

    Definition at line 89 of file PS4Parser.h.

    @@ -189,7 +177,7 @@ Public Attributes diff --git a/struct_request_sense_responce-members.html b/struct_request_sense_responce-members.html index bd23f735..dcb05e15 100644 --- a/struct_request_sense_responce-members.html +++ b/struct_request_sense_responce-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 443 of file masstorage.h.

    +

    Definition at line 450 of file masstorage.h.

    Member Data Documentation

    - + +

    ◆ bResponseCode

    +
    @@ -139,11 +119,13 @@ Public Attributes
    -

    Definition at line 444 of file masstorage.h.

    +

    Definition at line 451 of file masstorage.h.

    - + +

    ◆ bSegmentNumber

    +
    @@ -153,11 +135,13 @@ Public Attributes
    -

    Definition at line 445 of file masstorage.h.

    +

    Definition at line 452 of file masstorage.h.

    - + +

    ◆ bmSenseKey

    +
    @@ -167,11 +151,13 @@ Public Attributes
    -

    Definition at line 447 of file masstorage.h.

    +

    Definition at line 454 of file masstorage.h.

    - + +

    ◆ bmReserved

    +
    @@ -181,11 +167,13 @@ Public Attributes
    -

    Definition at line 448 of file masstorage.h.

    +

    Definition at line 455 of file masstorage.h.

    - + +

    ◆ bmILI

    +
    @@ -195,11 +183,13 @@ Public Attributes
    -

    Definition at line 449 of file masstorage.h.

    +

    Definition at line 456 of file masstorage.h.

    - + +

    ◆ bmEOM

    +
    @@ -209,11 +199,13 @@ Public Attributes
    -

    Definition at line 450 of file masstorage.h.

    +

    Definition at line 457 of file masstorage.h.

    - + +

    ◆ bmFileMark

    +
    @@ -223,11 +215,13 @@ Public Attributes
    -

    Definition at line 451 of file masstorage.h.

    +

    Definition at line 458 of file masstorage.h.

    - + +

    ◆ Information

    +
    @@ -237,11 +231,13 @@ Public Attributes
    -

    Definition at line 453 of file masstorage.h.

    +

    Definition at line 460 of file masstorage.h.

    - + +

    ◆ bAdditionalLength

    +
    @@ -251,11 +247,13 @@ Public Attributes
    -

    Definition at line 454 of file masstorage.h.

    +

    Definition at line 461 of file masstorage.h.

    - + +

    ◆ CmdSpecificInformation

    +
    @@ -265,11 +263,13 @@ Public Attributes
    -

    Definition at line 455 of file masstorage.h.

    +

    Definition at line 462 of file masstorage.h.

    - + +

    ◆ bAdditionalSenseCode

    +
    @@ -279,11 +279,13 @@ Public Attributes
    -

    Definition at line 456 of file masstorage.h.

    +

    Definition at line 463 of file masstorage.h.

    - + +

    ◆ bAdditionalSenseQualifier

    +
    @@ -293,11 +295,13 @@ Public Attributes
    -

    Definition at line 457 of file masstorage.h.

    +

    Definition at line 464 of file masstorage.h.

    - + +

    ◆ bFieldReplaceableUnitCode

    +
    @@ -307,11 +311,13 @@ Public Attributes
    -

    Definition at line 458 of file masstorage.h.

    +

    Definition at line 465 of file masstorage.h.

    - + +

    ◆ SenseKeySpecific

    +
    @@ -321,7 +327,7 @@ Public Attributes
    -

    Definition at line 459 of file masstorage.h.

    +

    Definition at line 466 of file masstorage.h.

    @@ -333,7 +339,7 @@ Public Attributes diff --git a/struct_s_e_t_u_p___p_k_t-members.html b/struct_s_e_t_u_p___p_k_t-members.html index 4f1d228b..db5999e2 100644 --- a/struct_s_e_t_u_p___p_k_t-members.html +++ b/struct_s_e_t_u_p___p_k_t-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 163 of file UsbCore.h.

    +

    Definition at line 174 of file UsbCore.h.

    Member Data Documentation

    - + +

    ◆ bmRequestType

    +
    @@ -143,11 +123,13 @@ Public Attributes
    -

    Definition at line 166 of file UsbCore.h.

    +

    Definition at line 177 of file UsbCore.h.

    - + +

    ◆ recipient

    +
    @@ -157,11 +139,13 @@ Public Attributes
    -

    Definition at line 169 of file UsbCore.h.

    +

    Definition at line 180 of file UsbCore.h.

    - + +

    ◆ type

    +
    @@ -171,11 +155,13 @@ Public Attributes
    -

    Definition at line 170 of file UsbCore.h.

    +

    Definition at line 181 of file UsbCore.h.

    - + +

    ◆ direction

    +
    @@ -185,11 +171,13 @@ Public Attributes
    -

    Definition at line 171 of file UsbCore.h.

    +

    Definition at line 182 of file UsbCore.h.

    - + +

    ◆ ReqType_u

    +
    @@ -201,7 +189,9 @@ Public Attributes - + +

    ◆ bRequest

    +
    @@ -211,11 +201,13 @@ Public Attributes
    -

    Definition at line 174 of file UsbCore.h.

    +

    Definition at line 185 of file UsbCore.h.

    - + +

    ◆ wValue

    +
    @@ -225,11 +217,13 @@ Public Attributes
    -

    Definition at line 177 of file UsbCore.h.

    +

    Definition at line 188 of file UsbCore.h.

    - + +

    ◆ wValueLo

    +
    @@ -239,11 +233,13 @@ Public Attributes
    -

    Definition at line 180 of file UsbCore.h.

    +

    Definition at line 191 of file UsbCore.h.

    - + +

    ◆ wValueHi

    +
    @@ -253,11 +249,13 @@ Public Attributes
    -

    Definition at line 181 of file UsbCore.h.

    +

    Definition at line 192 of file UsbCore.h.

    - + +

    ◆ wVal_u

    +
    @@ -269,7 +267,9 @@ Public Attributes - + +

    ◆ wIndex

    +
    @@ -279,11 +279,13 @@ Public Attributes
    -

    Definition at line 184 of file UsbCore.h.

    +

    Definition at line 195 of file UsbCore.h.

    - + +

    ◆ wLength

    +
    @@ -293,7 +295,7 @@ Public Attributes
    -

    Definition at line 185 of file UsbCore.h.

    +

    Definition at line 196 of file UsbCore.h.

    @@ -305,7 +307,7 @@ Public Attributes diff --git a/struct_t_e_l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r-members.html b/struct_t_e_l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r-members.html index 6dda9fa1..291e9a2a 100644 --- a/struct_t_e_l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r-members.html +++ b/struct_t_e_l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 102 of file cdcacm.h.

    +

    Definition at line 102 of file cdcacm.h.

    Member Data Documentation

    - + +

    ◆ bFunctionLength

    +
    @@ -121,11 +101,13 @@ Public Attributes
    -

    Definition at line 103 of file cdcacm.h.

    +

    Definition at line 103 of file cdcacm.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -135,11 +117,13 @@ Public Attributes
    -

    Definition at line 104 of file cdcacm.h.

    +

    Definition at line 104 of file cdcacm.h.

    - + +

    ◆ bDescriptorSubtype

    +
    @@ -149,11 +133,13 @@ Public Attributes
    -

    Definition at line 105 of file cdcacm.h.

    +

    Definition at line 105 of file cdcacm.h.

    - + +

    ◆ bRingerVolSteps

    +
    @@ -163,11 +149,13 @@ Public Attributes
    -

    Definition at line 106 of file cdcacm.h.

    +

    Definition at line 106 of file cdcacm.h.

    - + +

    ◆ bNumRingerPatterns

    +
    @@ -177,7 +165,7 @@ Public Attributes
    -

    Definition at line 107 of file cdcacm.h.

    +

    Definition at line 107 of file cdcacm.h.

    @@ -189,7 +177,7 @@ Public Attributes diff --git a/struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r-members.html b/struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r-members.html index 59ba9816..c2cb54e3 100644 --- a/struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r-members.html +++ b/struct_u_s_b___c_o_n_f_i_g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 116 of file usb_ch9.h.

    +

    Definition at line 123 of file usb_ch9.h.

    Member Data Documentation

    - + +

    ◆ bLength

    +
    @@ -127,11 +107,13 @@ Public Attributes
    -

    Definition at line 117 of file usb_ch9.h.

    +

    Definition at line 124 of file usb_ch9.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -141,11 +123,13 @@ Public Attributes
    -

    Definition at line 118 of file usb_ch9.h.

    +

    Definition at line 125 of file usb_ch9.h.

    - + +

    ◆ wTotalLength

    +
    @@ -155,11 +139,13 @@ Public Attributes
    -

    Definition at line 119 of file usb_ch9.h.

    +

    Definition at line 126 of file usb_ch9.h.

    - + +

    ◆ bNumInterfaces

    +
    @@ -169,11 +155,13 @@ Public Attributes
    -

    Definition at line 120 of file usb_ch9.h.

    +

    Definition at line 127 of file usb_ch9.h.

    - + +

    ◆ bConfigurationValue

    +
    @@ -183,11 +171,13 @@ Public Attributes
    -

    Definition at line 121 of file usb_ch9.h.

    +

    Definition at line 128 of file usb_ch9.h.

    - + +

    ◆ iConfiguration

    +
    @@ -197,11 +187,13 @@ Public Attributes
    -

    Definition at line 122 of file usb_ch9.h.

    +

    Definition at line 129 of file usb_ch9.h.

    - + +

    ◆ bmAttributes

    +
    @@ -211,11 +203,13 @@ Public Attributes
    -

    Definition at line 123 of file usb_ch9.h.

    +

    Definition at line 130 of file usb_ch9.h.

    - + +

    ◆ bMaxPower

    +
    @@ -225,7 +219,7 @@ Public Attributes
    -

    Definition at line 124 of file usb_ch9.h.

    +

    Definition at line 131 of file usb_ch9.h.

    @@ -237,7 +231,7 @@ Public Attributes diff --git a/struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r-members.html b/struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r-members.html index 95ee88f8..63c28fe1 100644 --- a/struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r-members.html +++ b/struct_u_s_b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 98 of file usb_ch9.h.

    +

    Definition at line 105 of file usb_ch9.h.

    Member Data Documentation

    - + +

    ◆ bLength

    +
    @@ -139,11 +119,13 @@ Public Attributes
    -

    Definition at line 99 of file usb_ch9.h.

    +

    Definition at line 106 of file usb_ch9.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -153,11 +135,13 @@ Public Attributes
    -

    Definition at line 100 of file usb_ch9.h.

    +

    Definition at line 107 of file usb_ch9.h.

    - + +

    ◆ bcdUSB

    +
    @@ -167,11 +151,13 @@ Public Attributes
    -

    Definition at line 101 of file usb_ch9.h.

    +

    Definition at line 108 of file usb_ch9.h.

    - + +

    ◆ bDeviceClass

    +
    @@ -181,11 +167,13 @@ Public Attributes
    -

    Definition at line 102 of file usb_ch9.h.

    +

    Definition at line 109 of file usb_ch9.h.

    - + +

    ◆ bDeviceSubClass

    +
    @@ -195,11 +183,13 @@ Public Attributes
    -

    Definition at line 103 of file usb_ch9.h.

    +

    Definition at line 110 of file usb_ch9.h.

    - + +

    ◆ bDeviceProtocol

    +
    @@ -209,11 +199,13 @@ Public Attributes
    -

    Definition at line 104 of file usb_ch9.h.

    +

    Definition at line 111 of file usb_ch9.h.

    - + +

    ◆ bMaxPacketSize0

    +
    @@ -223,11 +215,13 @@ Public Attributes
    -

    Definition at line 105 of file usb_ch9.h.

    +

    Definition at line 112 of file usb_ch9.h.

    - + +

    ◆ idVendor

    +
    @@ -237,11 +231,13 @@ Public Attributes
    -

    Definition at line 106 of file usb_ch9.h.

    +

    Definition at line 113 of file usb_ch9.h.

    - + +

    ◆ idProduct

    +
    @@ -251,11 +247,13 @@ Public Attributes
    -

    Definition at line 107 of file usb_ch9.h.

    +

    Definition at line 114 of file usb_ch9.h.

    - + +

    ◆ bcdDevice

    +
    @@ -265,11 +263,13 @@ Public Attributes
    -

    Definition at line 108 of file usb_ch9.h.

    +

    Definition at line 115 of file usb_ch9.h.

    - + +

    ◆ iManufacturer

    +
    @@ -279,11 +279,13 @@ Public Attributes
    -

    Definition at line 109 of file usb_ch9.h.

    +

    Definition at line 116 of file usb_ch9.h.

    - + +

    ◆ iProduct

    +
    @@ -293,11 +295,13 @@ Public Attributes
    -

    Definition at line 110 of file usb_ch9.h.

    +

    Definition at line 117 of file usb_ch9.h.

    - + +

    ◆ iSerialNumber

    +
    @@ -307,11 +311,13 @@ Public Attributes
    -

    Definition at line 111 of file usb_ch9.h.

    +

    Definition at line 118 of file usb_ch9.h.

    - + +

    ◆ bNumConfigurations

    +
    @@ -321,7 +327,7 @@ Public Attributes
    -

    Definition at line 112 of file usb_ch9.h.

    +

    Definition at line 119 of file usb_ch9.h.

    @@ -333,7 +339,7 @@ Public Attributes diff --git a/struct_u_s_b___e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r-members.html b/struct_u_s_b___e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r-members.html index b7fce74f..12dad84b 100644 --- a/struct_u_s_b___e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r-members.html +++ b/struct_u_s_b___e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 141 of file usb_ch9.h.

    +

    Definition at line 148 of file usb_ch9.h.

    Member Data Documentation

    - + +

    ◆ bLength

    +
    @@ -123,11 +103,13 @@ Public Attributes
    -

    Definition at line 142 of file usb_ch9.h.

    +

    Definition at line 149 of file usb_ch9.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -137,11 +119,13 @@ Public Attributes
    -

    Definition at line 143 of file usb_ch9.h.

    +

    Definition at line 150 of file usb_ch9.h.

    - + +

    ◆ bEndpointAddress

    +
    @@ -151,11 +135,13 @@ Public Attributes
    -

    Definition at line 144 of file usb_ch9.h.

    +

    Definition at line 151 of file usb_ch9.h.

    - + +

    ◆ bmAttributes

    +
    @@ -165,11 +151,13 @@ Public Attributes
    -

    Definition at line 145 of file usb_ch9.h.

    +

    Definition at line 152 of file usb_ch9.h.

    - + +

    ◆ wMaxPacketSize

    +
    @@ -179,11 +167,13 @@ Public Attributes
    -

    Definition at line 146 of file usb_ch9.h.

    +

    Definition at line 153 of file usb_ch9.h.

    - + +

    ◆ bInterval

    +
    @@ -193,7 +183,7 @@ Public Attributes
    -

    Definition at line 147 of file usb_ch9.h.

    +

    Definition at line 154 of file usb_ch9.h.

    @@ -205,7 +195,7 @@ Public Attributes diff --git a/struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r-members.html b/struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r-members.html index cdd9ca60..951f6328 100644 --- a/struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r-members.html +++ b/struct_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 151 of file usb_ch9.h.

    +

    Definition at line 158 of file usb_ch9.h.

    Member Data Documentation

    - + +

    ◆ bLength

    +
    @@ -125,11 +105,13 @@ Public Attributes
    -

    Definition at line 152 of file usb_ch9.h.

    +

    Definition at line 159 of file usb_ch9.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -139,11 +121,13 @@ Public Attributes
    -

    Definition at line 153 of file usb_ch9.h.

    +

    Definition at line 160 of file usb_ch9.h.

    - + +

    ◆ bcdHID

    +
    @@ -153,11 +137,13 @@ Public Attributes
    -

    Definition at line 154 of file usb_ch9.h.

    +

    Definition at line 161 of file usb_ch9.h.

    - + +

    ◆ bCountryCode

    +
    @@ -167,11 +153,13 @@ Public Attributes
    -

    Definition at line 155 of file usb_ch9.h.

    +

    Definition at line 162 of file usb_ch9.h.

    - + +

    ◆ bNumDescriptors

    +
    @@ -181,11 +169,13 @@ Public Attributes
    -

    Definition at line 156 of file usb_ch9.h.

    +

    Definition at line 163 of file usb_ch9.h.

    - + +

    ◆ bDescrType

    +
    @@ -195,11 +185,13 @@ Public Attributes
    -

    Definition at line 157 of file usb_ch9.h.

    +

    Definition at line 164 of file usb_ch9.h.

    - + +

    ◆ wDescriptorLength

    +
    @@ -209,7 +201,7 @@ Public Attributes
    -

    Definition at line 158 of file usb_ch9.h.

    +

    Definition at line 165 of file usb_ch9.h.

    @@ -221,7 +213,7 @@ Public Attributes diff --git a/struct_u_s_b___i_n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r-members.html b/struct_u_s_b___i_n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r-members.html index 334d9cae..25f1e624 100644 --- a/struct_u_s_b___i_n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r-members.html +++ b/struct_u_s_b___i_n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 128 of file usb_ch9.h.

    +

    Definition at line 135 of file usb_ch9.h.

    Member Data Documentation

    - + +

    ◆ bLength

    +
    @@ -129,11 +109,13 @@ Public Attributes
    -

    Definition at line 129 of file usb_ch9.h.

    +

    Definition at line 136 of file usb_ch9.h.

    - + +

    ◆ bDescriptorType

    +
    @@ -143,11 +125,13 @@ Public Attributes
    -

    Definition at line 130 of file usb_ch9.h.

    +

    Definition at line 137 of file usb_ch9.h.

    - + +

    ◆ bInterfaceNumber

    +
    @@ -157,11 +141,13 @@ Public Attributes
    -

    Definition at line 131 of file usb_ch9.h.

    +

    Definition at line 138 of file usb_ch9.h.

    - + +

    ◆ bAlternateSetting

    +
    @@ -171,11 +157,13 @@ Public Attributes
    -

    Definition at line 132 of file usb_ch9.h.

    +

    Definition at line 139 of file usb_ch9.h.

    - + +

    ◆ bNumEndpoints

    +
    @@ -185,11 +173,13 @@ Public Attributes
    -

    Definition at line 133 of file usb_ch9.h.

    +

    Definition at line 140 of file usb_ch9.h.

    - + +

    ◆ bInterfaceClass

    +
    @@ -199,11 +189,13 @@ Public Attributes
    -

    Definition at line 134 of file usb_ch9.h.

    +

    Definition at line 141 of file usb_ch9.h.

    - + +

    ◆ bInterfaceSubClass

    +
    @@ -213,11 +205,13 @@ Public Attributes
    -

    Definition at line 135 of file usb_ch9.h.

    +

    Definition at line 142 of file usb_ch9.h.

    - + +

    ◆ bInterfaceProtocol

    +
    @@ -227,11 +221,13 @@ Public Attributes
    -

    Definition at line 136 of file usb_ch9.h.

    +

    Definition at line 143 of file usb_ch9.h.

    - + +

    ◆ iInterface

    +
    @@ -241,7 +237,7 @@ Public Attributes
    -

    Definition at line 137 of file usb_ch9.h.

    +

    Definition at line 144 of file usb_ch9.h.

    @@ -253,7 +249,7 @@ Public Attributes diff --git a/struct_usb_device-members.html b/struct_usb_device-members.html index 701a10b5..33acd6bc 100644 --- a/struct_usb_device-members.html +++ b/struct_usb_device-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 75 of file address.h.

    +

    Definition at line 82 of file address.h.

    Member Data Documentation

    - + +

    ◆ epinfo

    +
    @@ -128,11 +108,13 @@ Public Attributes
    -

    Definition at line 76 of file address.h.

    +

    Definition at line 83 of file address.h.

    - + +

    ◆ address

    +
    @@ -142,11 +124,13 @@ Public Attributes
    -

    Definition at line 77 of file address.h.

    +

    Definition at line 84 of file address.h.

    - + +

    ◆ epcount

    +
    @@ -156,11 +140,13 @@ Public Attributes
    -

    Definition at line 78 of file address.h.

    +

    Definition at line 85 of file address.h.

    - + +

    ◆ lowspeed

    +
    @@ -170,7 +156,7 @@ Public Attributes
    -

    Definition at line 79 of file address.h.

    +

    Definition at line 86 of file address.h.

    @@ -182,7 +168,7 @@ Public Attributes diff --git a/struct_usb_device__coll__graph.png b/struct_usb_device__coll__graph.png index 69f3c0c580e3c7e4b2c427045d07285a5623f923..fd96658c47a4523d863c05d6973a4fc04cddbb32 100644 GIT binary patch literal 8545 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 diff --git a/struct_usb_device_address-members.html b/struct_usb_device_address-members.html index 3f257fb2..2723120c 100644 --- a/struct_usb_device_address-members.html +++ b/struct_usb_device_address-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 57 of file address.h.

    +

    Definition at line 64 of file address.h.

    Member Data Documentation

    - + +

    ◆ bmAddress

    +
    @@ -127,11 +107,13 @@ Public Attributes
    -

    Definition at line 62 of file address.h.

    +

    Definition at line 69 of file address.h.

    - + +

    ◆ bmParent

    +
    @@ -141,11 +123,13 @@ Public Attributes
    -

    Definition at line 63 of file address.h.

    +

    Definition at line 70 of file address.h.

    - + +

    ◆ bmHub

    +
    @@ -155,11 +139,13 @@ Public Attributes
    -

    Definition at line 64 of file address.h.

    +

    Definition at line 71 of file address.h.

    - + +

    ◆ bmReserved

    +
    @@ -169,11 +155,13 @@ Public Attributes
    -

    Definition at line 65 of file address.h.

    +

    Definition at line 72 of file address.h.

    - + +

    ◆ devAddress

    +
    @@ -183,11 +171,13 @@ Public Attributes
    -

    Definition at line 67 of file address.h.

    +

    Definition at line 74 of file address.h.

    - + +

    ◆ @5

    +
    @@ -207,7 +197,7 @@ Public Attributes diff --git a/structtouchpad_x_y-members.html b/structtouchpad_x_y-members.html index 151d9062..84e85e5d 100644 --- a/structtouchpad_x_y-members.html +++ b/structtouchpad_x_y-members.html @@ -3,7 +3,8 @@ - + +USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 74 of file PS4Parser.h.

    +

    Definition at line 74 of file PS4Parser.h.

    Member Data Documentation

    - + +

    ◆ dummy

    +
    @@ -124,11 +104,13 @@ Public Attributes
    -

    Definition at line 75 of file PS4Parser.h.

    +

    Definition at line 75 of file PS4Parser.h.

    - + +

    ◆ counter

    +
    @@ -138,11 +120,13 @@ Public Attributes
    -

    Definition at line 77 of file PS4Parser.h.

    +

    Definition at line 77 of file PS4Parser.h.

    - + +

    ◆ touching

    +
    @@ -152,11 +136,13 @@ Public Attributes
    -

    Definition at line 78 of file PS4Parser.h.

    +

    Definition at line 78 of file PS4Parser.h.

    - + +

    ◆ x

    +
    @@ -166,11 +152,13 @@ Public Attributes
    -

    Definition at line 79 of file PS4Parser.h.

    +

    Definition at line 79 of file PS4Parser.h.

    - + +

    ◆ y

    +
    @@ -180,11 +168,13 @@ Public Attributes
    -

    Definition at line 80 of file PS4Parser.h.

    +

    Definition at line 80 of file PS4Parser.h.

    - + +

    ◆ finger

    +
    @@ -204,7 +194,7 @@ Public Attributes diff --git a/structtty__features-members.html b/structtty__features-members.html index 6d198531..e7a0ff22 100644 --- a/structtty__features-members.html +++ b/structtty__features-members.html @@ -3,7 +3,8 @@ - + +USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    This structure is used to report the extended capabilities of the connected device. It is also used to report the current status. Regular CDC-ACM reports all as false.

    -

    Definition at line 143 of file cdcacm.h.

    +

    Definition at line 143 of file cdcacm.h.

    Member Data Documentation

    - + +

    ◆ tty

    +
    @@ -132,11 +112,13 @@ Public Attributes
    -

    Definition at line 146 of file cdcacm.h.

    +

    Definition at line 146 of file cdcacm.h.

    - + +

    ◆ enhanced

    +
    @@ -146,11 +128,13 @@ Public Attributes
    -

    Definition at line 149 of file cdcacm.h.

    +

    Definition at line 149 of file cdcacm.h.

    - + +

    ◆ wide

    +
    @@ -160,11 +144,13 @@ Public Attributes
    -

    Definition at line 152 of file cdcacm.h.

    +

    Definition at line 152 of file cdcacm.h.

    - + +

    ◆ autoflow_RTS

    +
    @@ -174,11 +160,13 @@ Public Attributes
    -

    Definition at line 153 of file cdcacm.h.

    +

    Definition at line 153 of file cdcacm.h.

    - + +

    ◆ autoflow_DSR

    +
    @@ -188,11 +176,13 @@ Public Attributes
    -

    Definition at line 154 of file cdcacm.h.

    +

    Definition at line 154 of file cdcacm.h.

    - + +

    ◆ autoflow_XON

    +
    @@ -202,11 +192,13 @@ Public Attributes
    -

    Definition at line 155 of file cdcacm.h.

    +

    Definition at line 155 of file cdcacm.h.

    - + +

    ◆ half_duplex

    +
    @@ -216,11 +208,13 @@ Public Attributes
    -

    Definition at line 156 of file cdcacm.h.

    +

    Definition at line 156 of file cdcacm.h.

    - + +

    ◆ @9

    +
    @@ -240,7 +234,7 @@ Public Attributes diff --git a/tabs.css b/tabs.css index 9cf578f2..a28614b8 100644 --- a/tabs.css +++ b/tabs.css @@ -1,60 +1 @@ -.tabs, .tabs2, .tabs3 { - background-image: url('tab_b.png'); - width: 100%; - z-index: 101; - font-size: 13px; - font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; -} - -.tabs2 { - font-size: 10px; -} -.tabs3 { - font-size: 9px; -} - -.tablist { - margin: 0; - padding: 0; - display: table; -} - -.tablist li { - float: left; - display: table-cell; - background-image: url('tab_b.png'); - line-height: 36px; - list-style: none; -} - -.tablist a { - display: block; - padding: 0 20px; - font-weight: bold; - background-image:url('tab_s.png'); - background-repeat:no-repeat; - background-position:right; - color: #283A5D; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; - outline: none; -} - -.tabs3 .tablist a { - padding: 0 10px; -} - -.tablist a:hover { - background-image: url('tab_h.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); - text-decoration: none; -} - -.tablist li.current a { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); -} +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#doc-content{overflow:auto;display:block;padding:0;margin:0;-webkit-overflow-scrolling:touch}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/union_p_s4_buttons-members.html b/union_p_s4_buttons-members.html index 996295eb..b36010c8 100644 --- a/union_p_s4_buttons-members.html +++ b/union_p_s4_buttons-members.html @@ -3,7 +3,8 @@ - + +USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    -

    Definition at line 50 of file PS4Parser.h.

    +

    Definition at line 50 of file PS4Parser.h.

    Member Data Documentation

    - + +

    ◆ dpad

    +
    @@ -148,11 +128,13 @@ Public Attributes
    -

    Definition at line 52 of file PS4Parser.h.

    +

    Definition at line 52 of file PS4Parser.h.

    - + +

    ◆ square

    +
    @@ -162,11 +144,13 @@ Public Attributes
    -

    Definition at line 53 of file PS4Parser.h.

    +

    Definition at line 53 of file PS4Parser.h.

    - + +

    ◆ cross

    +
    @@ -176,11 +160,13 @@ Public Attributes
    -

    Definition at line 54 of file PS4Parser.h.

    +

    Definition at line 54 of file PS4Parser.h.

    - + +

    ◆ circle

    +
    @@ -190,11 +176,13 @@ Public Attributes
    -

    Definition at line 55 of file PS4Parser.h.

    +

    Definition at line 55 of file PS4Parser.h.

    - + +

    ◆ triangle

    +
    @@ -204,11 +192,13 @@ Public Attributes
    -

    Definition at line 56 of file PS4Parser.h.

    +

    Definition at line 56 of file PS4Parser.h.

    - + +

    ◆ l1

    +
    @@ -218,11 +208,13 @@ Public Attributes
    -

    Definition at line 58 of file PS4Parser.h.

    +

    Definition at line 58 of file PS4Parser.h.

    - + +

    ◆ r1

    +
    @@ -232,11 +224,13 @@ Public Attributes
    -

    Definition at line 59 of file PS4Parser.h.

    +

    Definition at line 59 of file PS4Parser.h.

    - + +

    ◆ l2

    +
    @@ -246,11 +240,13 @@ Public Attributes
    -

    Definition at line 60 of file PS4Parser.h.

    +

    Definition at line 60 of file PS4Parser.h.

    - + +

    ◆ r2

    +
    @@ -260,11 +256,13 @@ Public Attributes
    -

    Definition at line 61 of file PS4Parser.h.

    +

    Definition at line 61 of file PS4Parser.h.

    - + +

    ◆ share

    +
    @@ -274,11 +272,13 @@ Public Attributes
    -

    Definition at line 62 of file PS4Parser.h.

    +

    Definition at line 62 of file PS4Parser.h.

    - + +

    ◆ options

    +
    @@ -288,11 +288,13 @@ Public Attributes
    -

    Definition at line 63 of file PS4Parser.h.

    +

    Definition at line 63 of file PS4Parser.h.

    - + +

    ◆ l3

    +
    @@ -302,11 +304,13 @@ Public Attributes
    -

    Definition at line 64 of file PS4Parser.h.

    +

    Definition at line 64 of file PS4Parser.h.

    - + +

    ◆ r3

    +
    @@ -316,11 +320,13 @@ Public Attributes
    -

    Definition at line 65 of file PS4Parser.h.

    +

    Definition at line 65 of file PS4Parser.h.

    - + +

    ◆ ps

    +
    @@ -330,11 +336,13 @@ Public Attributes
    -

    Definition at line 67 of file PS4Parser.h.

    +

    Definition at line 67 of file PS4Parser.h.

    - + +

    ◆ touchpad

    +
    @@ -344,11 +352,13 @@ Public Attributes
    -

    Definition at line 68 of file PS4Parser.h.

    +

    Definition at line 68 of file PS4Parser.h.

    - + +

    ◆ reportCounter

    +
    @@ -358,11 +368,13 @@ Public Attributes
    -

    Definition at line 69 of file PS4Parser.h.

    +

    Definition at line 69 of file PS4Parser.h.

    - + +

    ◆ @29

    +
    @@ -374,7 +386,9 @@ Public Attributes - + +

    ◆ val

    +
    @@ -384,7 +398,7 @@ Public Attributes
    -

    Definition at line 71 of file PS4Parser.h.

    +

    Definition at line 71 of file PS4Parser.h.

    @@ -396,7 +410,7 @@ Public Attributes diff --git a/union_p_s_b_u_z_z_buttons-members.html b/union_p_s_b_u_z_z_buttons-members.html index eb301e6c..4be22b46 100644 --- a/union_p_s_b_u_z_z_buttons-members.html +++ b/union_p_s_b_u_z_z_buttons-members.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: Member List @@ -11,9 +12,6 @@ - @@ -32,42 +30,22 @@
    - + - - + + + + - + - - + + + +

    Detailed Description

    Struct used to easily read the different buttons on the controllers

    -

    Definition at line 28 of file PSBuzz.h.

    +

    Definition at line 28 of file PSBuzz.h.

    Member Data Documentation

    - + +

    ◆ red

    +
    @@ -127,11 +107,13 @@ Public Attributes
    -

    Definition at line 30 of file PSBuzz.h.

    +

    Definition at line 30 of file PSBuzz.h.

    - + +

    ◆ yellow

    +
    @@ -141,11 +123,13 @@ Public Attributes
    -

    Definition at line 31 of file PSBuzz.h.

    +

    Definition at line 31 of file PSBuzz.h.

    - + +

    ◆ green

    +
    @@ -155,11 +139,13 @@ Public Attributes
    -

    Definition at line 32 of file PSBuzz.h.

    +

    Definition at line 32 of file PSBuzz.h.

    - + +

    ◆ orange

    +
    @@ -169,11 +155,13 @@ Public Attributes
    -

    Definition at line 33 of file PSBuzz.h.

    +

    Definition at line 33 of file PSBuzz.h.

    - + +

    ◆ blue

    +
    @@ -183,11 +171,13 @@ Public Attributes
    -

    Definition at line 34 of file PSBuzz.h.

    +

    Definition at line 34 of file PSBuzz.h.

    - + +

    ◆ btn

    +
    @@ -199,7 +189,9 @@ Public Attributes - + +

    ◆ val

    +
    @@ -209,7 +201,7 @@ Public Attributes
    -

    Definition at line 36 of file PSBuzz.h.

    +

    Definition at line 36 of file PSBuzz.h.

    @@ -221,7 +213,7 @@ Public Attributes diff --git a/usb__ch9_8h.html b/usb__ch9_8h.html index 5576dabc..8bb29335 100644 --- a/usb__ch9_8h.html +++ b/usb__ch9_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usb_ch9.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Macro Definition Documentation

    - + +

    ◆ DEV_DESCR_LEN

    +
    @@ -221,11 +203,13 @@ Macros
    -

    Definition at line 26 of file usb_ch9.h.

    +

    Definition at line 33 of file usb_ch9.h.

    - + +

    ◆ CONF_DESCR_LEN

    +
    @@ -235,11 +219,13 @@ Macros
    -

    Definition at line 27 of file usb_ch9.h.

    +

    Definition at line 34 of file usb_ch9.h.

    - + +

    ◆ INTR_DESCR_LEN

    +
    @@ -249,11 +235,13 @@ Macros
    -

    Definition at line 28 of file usb_ch9.h.

    +

    Definition at line 35 of file usb_ch9.h.

    - + +

    ◆ EP_DESCR_LEN

    +
    @@ -263,11 +251,13 @@ Macros
    -

    Definition at line 29 of file usb_ch9.h.

    +

    Definition at line 36 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_GET_STATUS

    +
    @@ -277,11 +267,13 @@ Macros
    -

    Definition at line 33 of file usb_ch9.h.

    +

    Definition at line 40 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_CLEAR_FEATURE

    +
    @@ -291,11 +283,13 @@ Macros
    -

    Definition at line 34 of file usb_ch9.h.

    +

    Definition at line 41 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_SET_FEATURE

    +
    @@ -305,11 +299,13 @@ Macros
    -

    Definition at line 35 of file usb_ch9.h.

    +

    Definition at line 42 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_SET_ADDRESS

    +
    @@ -319,11 +315,13 @@ Macros
    -

    Definition at line 36 of file usb_ch9.h.

    +

    Definition at line 43 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_GET_DESCRIPTOR

    +
    @@ -333,11 +331,13 @@ Macros
    -

    Definition at line 37 of file usb_ch9.h.

    +

    Definition at line 44 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_SET_DESCRIPTOR

    +
    @@ -347,11 +347,13 @@ Macros
    -

    Definition at line 38 of file usb_ch9.h.

    +

    Definition at line 45 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_GET_CONFIGURATION

    +
    @@ -361,11 +363,13 @@ Macros
    -

    Definition at line 39 of file usb_ch9.h.

    +

    Definition at line 46 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_SET_CONFIGURATION

    +
    @@ -375,11 +379,13 @@ Macros
    -

    Definition at line 40 of file usb_ch9.h.

    +

    Definition at line 47 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_GET_INTERFACE

    +
    @@ -389,11 +395,13 @@ Macros
    -

    Definition at line 41 of file usb_ch9.h.

    +

    Definition at line 48 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_SET_INTERFACE

    +
    @@ -403,11 +411,13 @@ Macros
    -

    Definition at line 42 of file usb_ch9.h.

    +

    Definition at line 49 of file usb_ch9.h.

    - + +

    ◆ USB_REQUEST_SYNCH_FRAME

    +
    @@ -417,11 +427,13 @@ Macros
    -

    Definition at line 43 of file usb_ch9.h.

    +

    Definition at line 50 of file usb_ch9.h.

    - + +

    ◆ USB_FEATURE_ENDPOINT_HALT

    +
    @@ -431,11 +443,13 @@ Macros
    -

    Definition at line 45 of file usb_ch9.h.

    +

    Definition at line 52 of file usb_ch9.h.

    - + +

    ◆ USB_FEATURE_DEVICE_REMOTE_WAKEUP [1/2]

    +
    @@ -445,11 +459,13 @@ Macros
    -

    Definition at line 92 of file usb_ch9.h.

    +

    Definition at line 99 of file usb_ch9.h.

    - + +

    ◆ USB_FEATURE_TEST_MODE [1/2]

    +
    @@ -459,11 +475,13 @@ Macros
    -

    Definition at line 93 of file usb_ch9.h.

    +

    Definition at line 100 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_HOST_TO_DEVICE

    +
    @@ -473,11 +491,13 @@ Macros
    -

    Definition at line 51 of file usb_ch9.h.

    +

    Definition at line 58 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_DEVICE_TO_HOST

    +
    @@ -487,11 +507,13 @@ Macros
    -

    Definition at line 52 of file usb_ch9.h.

    +

    Definition at line 59 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_TYPE_STANDARD

    +
    @@ -501,11 +523,13 @@ Macros
    -

    Definition at line 53 of file usb_ch9.h.

    +

    Definition at line 60 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_TYPE_CLASS

    +
    @@ -515,11 +539,13 @@ Macros
    -

    Definition at line 54 of file usb_ch9.h.

    +

    Definition at line 61 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_TYPE_VENDOR

    +
    @@ -529,11 +555,13 @@ Macros
    -

    Definition at line 55 of file usb_ch9.h.

    +

    Definition at line 62 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_RECIPIENT_DEVICE

    +
    @@ -543,11 +571,13 @@ Macros
    -

    Definition at line 56 of file usb_ch9.h.

    +

    Definition at line 63 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_RECIPIENT_INTERFACE

    +
    @@ -557,11 +587,13 @@ Macros
    -

    Definition at line 57 of file usb_ch9.h.

    +

    Definition at line 64 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_RECIPIENT_ENDPOINT

    +
    @@ -571,11 +603,13 @@ Macros
    -

    Definition at line 58 of file usb_ch9.h.

    +

    Definition at line 65 of file usb_ch9.h.

    - + +

    ◆ USB_SETUP_RECIPIENT_OTHER

    +
    @@ -585,11 +619,13 @@ Macros
    -

    Definition at line 59 of file usb_ch9.h.

    +

    Definition at line 66 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_DEVICE

    +
    @@ -599,11 +635,13 @@ Macros
    -

    Definition at line 63 of file usb_ch9.h.

    +

    Definition at line 70 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_CONFIGURATION

    +
    @@ -613,11 +651,13 @@ Macros
    -

    Definition at line 64 of file usb_ch9.h.

    +

    Definition at line 71 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_STRING

    +
    @@ -627,11 +667,13 @@ Macros
    -

    Definition at line 65 of file usb_ch9.h.

    +

    Definition at line 72 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_INTERFACE

    +
    @@ -641,11 +683,13 @@ Macros
    -

    Definition at line 66 of file usb_ch9.h.

    +

    Definition at line 73 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_ENDPOINT

    +
    @@ -655,11 +699,13 @@ Macros
    -

    Definition at line 67 of file usb_ch9.h.

    +

    Definition at line 74 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_DEVICE_QUALIFIER

    +
    @@ -669,11 +715,13 @@ Macros
    -

    Definition at line 68 of file usb_ch9.h.

    +

    Definition at line 75 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_OTHER_SPEED

    +
    @@ -683,11 +731,13 @@ Macros
    -

    Definition at line 69 of file usb_ch9.h.

    +

    Definition at line 76 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_INTERFACE_POWER

    +
    @@ -697,11 +747,13 @@ Macros
    -

    Definition at line 70 of file usb_ch9.h.

    +

    Definition at line 77 of file usb_ch9.h.

    - + +

    ◆ USB_DESCRIPTOR_OTG

    +
    @@ -711,11 +763,13 @@ Macros
    -

    Definition at line 71 of file usb_ch9.h.

    +

    Definition at line 78 of file usb_ch9.h.

    - + +

    ◆ HID_DESCRIPTOR_HID

    +
    @@ -725,11 +779,13 @@ Macros
    -

    Definition at line 73 of file usb_ch9.h.

    +

    Definition at line 80 of file usb_ch9.h.

    - + +

    ◆ OTG_FEATURE_B_HNP_ENABLE

    +
    @@ -739,11 +795,13 @@ Macros
    -

    Definition at line 78 of file usb_ch9.h.

    +

    Definition at line 85 of file usb_ch9.h.

    - + +

    ◆ OTG_FEATURE_A_HNP_SUPPORT

    +
    @@ -753,11 +811,13 @@ Macros
    -

    Definition at line 79 of file usb_ch9.h.

    +

    Definition at line 86 of file usb_ch9.h.

    - + +

    ◆ OTG_FEATURE_A_ALT_HNP_SUPPORT

    +
    @@ -767,11 +827,13 @@ Macros
    -

    Definition at line 80 of file usb_ch9.h.

    +

    Definition at line 87 of file usb_ch9.h.

    - + +

    ◆ USB_TRANSFER_TYPE_CONTROL

    +
    @@ -781,11 +843,13 @@ Macros
    -

    Definition at line 83 of file usb_ch9.h.

    +

    Definition at line 90 of file usb_ch9.h.

    - + +

    ◆ USB_TRANSFER_TYPE_ISOCHRONOUS

    +
    @@ -795,11 +859,13 @@ Macros
    -

    Definition at line 84 of file usb_ch9.h.

    +

    Definition at line 91 of file usb_ch9.h.

    - + +

    ◆ USB_TRANSFER_TYPE_BULK

    +
    @@ -809,11 +875,13 @@ Macros
    -

    Definition at line 85 of file usb_ch9.h.

    +

    Definition at line 92 of file usb_ch9.h.

    - + +

    ◆ USB_TRANSFER_TYPE_INTERRUPT

    +
    @@ -823,11 +891,13 @@ Macros
    -

    Definition at line 86 of file usb_ch9.h.

    +

    Definition at line 93 of file usb_ch9.h.

    - + +

    ◆ bmUSB_TRANSFER_TYPE

    +
    @@ -837,11 +907,13 @@ Macros
    -

    Definition at line 87 of file usb_ch9.h.

    +

    Definition at line 94 of file usb_ch9.h.

    - + +

    ◆ USB_FEATURE_ENDPOINT_STALL

    +
    @@ -851,11 +923,13 @@ Macros
    -

    Definition at line 91 of file usb_ch9.h.

    +

    Definition at line 98 of file usb_ch9.h.

    - + +

    ◆ USB_FEATURE_DEVICE_REMOTE_WAKEUP [2/2]

    +
    @@ -865,11 +939,13 @@ Macros
    -

    Definition at line 92 of file usb_ch9.h.

    +

    Definition at line 99 of file usb_ch9.h.

    - + +

    ◆ USB_FEATURE_TEST_MODE [2/2]

    +
    @@ -879,7 +955,7 @@ Macros
    -

    Definition at line 93 of file usb_ch9.h.

    +

    Definition at line 100 of file usb_ch9.h.

    @@ -888,7 +964,7 @@ Macros diff --git a/usb__ch9_8h_source.html b/usb__ch9_8h_source.html index 483dd4f3..fb5505e6 100644 --- a/usb__ch9_8h_source.html +++ b/usb__ch9_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usb_ch9.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    usb_ch9.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(_usb_h_) || defined(_ch9_h_)
    19 #error "Never include usb_ch9.h directly; include Usb.h instead"
    20 #else
    21 
    22 /* USB chapter 9 structures */
    23 #define _ch9_h_
    24 
    25 /* Misc.USB constants */
    26 #define DEV_DESCR_LEN 18 //device descriptor length
    27 #define CONF_DESCR_LEN 9 //configuration descriptor length
    28 #define INTR_DESCR_LEN 9 //interface descriptor length
    29 #define EP_DESCR_LEN 7 //endpoint descriptor length
    30 
    31 /* Standard Device Requests */
    32 
    33 #define USB_REQUEST_GET_STATUS 0 // Standard Device Request - GET STATUS
    34 #define USB_REQUEST_CLEAR_FEATURE 1 // Standard Device Request - CLEAR FEATURE
    35 #define USB_REQUEST_SET_FEATURE 3 // Standard Device Request - SET FEATURE
    36 #define USB_REQUEST_SET_ADDRESS 5 // Standard Device Request - SET ADDRESS
    37 #define USB_REQUEST_GET_DESCRIPTOR 6 // Standard Device Request - GET DESCRIPTOR
    38 #define USB_REQUEST_SET_DESCRIPTOR 7 // Standard Device Request - SET DESCRIPTOR
    39 #define USB_REQUEST_GET_CONFIGURATION 8 // Standard Device Request - GET CONFIGURATION
    40 #define USB_REQUEST_SET_CONFIGURATION 9 // Standard Device Request - SET CONFIGURATION
    41 #define USB_REQUEST_GET_INTERFACE 10 // Standard Device Request - GET INTERFACE
    42 #define USB_REQUEST_SET_INTERFACE 11 // Standard Device Request - SET INTERFACE
    43 #define USB_REQUEST_SYNCH_FRAME 12 // Standard Device Request - SYNCH FRAME
    44 
    45 #define USB_FEATURE_ENDPOINT_HALT 0 // CLEAR/SET FEATURE - Endpoint Halt
    46 #define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // CLEAR/SET FEATURE - Device remote wake-up
    47 #define USB_FEATURE_TEST_MODE 2 // CLEAR/SET FEATURE - Test mode
    48 
    49 /* Setup Data Constants */
    50 
    51 #define USB_SETUP_HOST_TO_DEVICE 0x00 // Device Request bmRequestType transfer direction - host to device transfer
    52 #define USB_SETUP_DEVICE_TO_HOST 0x80 // Device Request bmRequestType transfer direction - device to host transfer
    53 #define USB_SETUP_TYPE_STANDARD 0x00 // Device Request bmRequestType type - standard
    54 #define USB_SETUP_TYPE_CLASS 0x20 // Device Request bmRequestType type - class
    55 #define USB_SETUP_TYPE_VENDOR 0x40 // Device Request bmRequestType type - vendor
    56 #define USB_SETUP_RECIPIENT_DEVICE 0x00 // Device Request bmRequestType recipient - device
    57 #define USB_SETUP_RECIPIENT_INTERFACE 0x01 // Device Request bmRequestType recipient - interface
    58 #define USB_SETUP_RECIPIENT_ENDPOINT 0x02 // Device Request bmRequestType recipient - endpoint
    59 #define USB_SETUP_RECIPIENT_OTHER 0x03 // Device Request bmRequestType recipient - other
    60 
    61 /* USB descriptors */
    62 
    63 #define USB_DESCRIPTOR_DEVICE 0x01 // bDescriptorType for a Device Descriptor.
    64 #define USB_DESCRIPTOR_CONFIGURATION 0x02 // bDescriptorType for a Configuration Descriptor.
    65 #define USB_DESCRIPTOR_STRING 0x03 // bDescriptorType for a String Descriptor.
    66 #define USB_DESCRIPTOR_INTERFACE 0x04 // bDescriptorType for an Interface Descriptor.
    67 #define USB_DESCRIPTOR_ENDPOINT 0x05 // bDescriptorType for an Endpoint Descriptor.
    68 #define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06 // bDescriptorType for a Device Qualifier.
    69 #define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration.
    70 #define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power.
    71 #define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor.
    72 
    73 #define HID_DESCRIPTOR_HID 0x21
    74 
    75 
    76 
    77 /* OTG SET FEATURE Constants */
    78 #define OTG_FEATURE_B_HNP_ENABLE 3 // SET FEATURE OTG - Enable B device to perform HNP
    79 #define OTG_FEATURE_A_HNP_SUPPORT 4 // SET FEATURE OTG - A device supports HNP
    80 #define OTG_FEATURE_A_ALT_HNP_SUPPORT 5 // SET FEATURE OTG - Another port on the A device supports HNP
    81 
    82 /* USB Endpoint Transfer Types */
    83 #define USB_TRANSFER_TYPE_CONTROL 0x00 // Endpoint is a control endpoint.
    84 #define USB_TRANSFER_TYPE_ISOCHRONOUS 0x01 // Endpoint is an isochronous endpoint.
    85 #define USB_TRANSFER_TYPE_BULK 0x02 // Endpoint is a bulk endpoint.
    86 #define USB_TRANSFER_TYPE_INTERRUPT 0x03 // Endpoint is an interrupt endpoint.
    87 #define bmUSB_TRANSFER_TYPE 0x03 // bit mask to separate transfer type from ISO attributes
    88 
    89 
    90 /* Standard Feature Selectors for CLEAR_FEATURE Requests */
    91 #define USB_FEATURE_ENDPOINT_STALL 0 // Endpoint recipient
    92 #define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // Device recipient
    93 #define USB_FEATURE_TEST_MODE 2 // Device recipient
    94 
    95 /* descriptor data structures */
    96 
    97 /* Device descriptor structure */
    98 typedef struct {
    99  uint8_t bLength; // Length of this descriptor.
    100  uint8_t bDescriptorType; // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE).
    101  uint16_t bcdUSB; // USB Spec Release Number (BCD).
    102  uint8_t bDeviceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
    103  uint8_t bDeviceSubClass; // Subclass code (assigned by the USB-IF).
    104  uint8_t bDeviceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
    105  uint8_t bMaxPacketSize0; // Maximum packet size for endpoint 0.
    106  uint16_t idVendor; // Vendor ID (assigned by the USB-IF).
    107  uint16_t idProduct; // Product ID (assigned by the manufacturer).
    108  uint16_t bcdDevice; // Device release number (BCD).
    109  uint8_t iManufacturer; // Index of String Descriptor describing the manufacturer.
    110  uint8_t iProduct; // Index of String Descriptor describing the product.
    111  uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number.
    112  uint8_t bNumConfigurations; // Number of possible configurations.
    113 } __attribute__((packed)) USB_DEVICE_DESCRIPTOR;
    114 
    115 /* Configuration descriptor structure */
    116 typedef struct {
    117  uint8_t bLength; // Length of this descriptor.
    118  uint8_t bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION).
    119  uint16_t wTotalLength; // Total length of all descriptors for this configuration.
    120  uint8_t bNumInterfaces; // Number of interfaces in this configuration.
    121  uint8_t bConfigurationValue; // Value of this configuration (1 based).
    122  uint8_t iConfiguration; // Index of String Descriptor describing the configuration.
    123  uint8_t bmAttributes; // Configuration characteristics.
    124  uint8_t bMaxPower; // Maximum power consumed by this configuration.
    125 } __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR;
    126 
    127 /* Interface descriptor structure */
    128 typedef struct {
    129  uint8_t bLength; // Length of this descriptor.
    130  uint8_t bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE).
    131  uint8_t bInterfaceNumber; // Number of this interface (0 based).
    132  uint8_t bAlternateSetting; // Value of this alternate interface setting.
    133  uint8_t bNumEndpoints; // Number of endpoints in this interface.
    134  uint8_t bInterfaceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
    135  uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF).
    136  uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
    137  uint8_t iInterface; // Index of String Descriptor describing the interface.
    138 } __attribute__((packed)) USB_INTERFACE_DESCRIPTOR;
    139 
    140 /* Endpoint descriptor structure */
    141 typedef struct {
    142  uint8_t bLength; // Length of this descriptor.
    143  uint8_t bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT).
    144  uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN).
    145  uint8_t bmAttributes; // Endpoint transfer type.
    146  uint16_t wMaxPacketSize; // Maximum packet size.
    147  uint8_t bInterval; // Polling interval in frames.
    148 } __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR;
    149 
    150 /* HID descriptor */
    151 typedef struct {
    152  uint8_t bLength;
    154  uint16_t bcdHID; // HID class specification release
    155  uint8_t bCountryCode;
    156  uint8_t bNumDescriptors; // Number of additional class specific descriptors
    157  uint8_t bDescrType; // Type of class descriptor
    158  uint16_t wDescriptorLength; // Total size of the Report descriptor
    159 } __attribute__((packed)) USB_HID_DESCRIPTOR;
    160 
    161 typedef struct {
    162  uint8_t bDescrType; // Type of class descriptor
    163  uint16_t wDescriptorLength; // Total size of the Report descriptor
    164 } __attribute__((packed)) HID_CLASS_DESCRIPTOR_LEN_AND_TYPE;
    165 
    166 #endif // _ch9_h_
    -
    uint8_t iSerialNumber
    Definition: usb_ch9.h:111
    - - -
    uint16_t bcdDevice
    Definition: usb_ch9.h:108
    - - - - -
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:105
    - - - -
    uint8_t bLength
    Definition: usb_ch9.h:152
    - - - - - - - - - -
    uint8_t bDeviceSubClass
    Definition: usb_ch9.h:103
    -
    uint16_t wDescriptorLength
    Definition: usb_ch9.h:158
    - -
    uint8_t bCountryCode
    Definition: usb_ch9.h:155
    -
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    -
    uint8_t iManufacturer
    Definition: usb_ch9.h:109
    - -
    uint8_t bNumDescriptors
    Definition: usb_ch9.h:156
    -
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:144
    -
    uint8_t bDescriptorType
    Definition: usb_ch9.h:153
    -
    uint8_t bDeviceClass
    Definition: usb_ch9.h:102
    - - - - -
    uint16_t idProduct
    Definition: usb_ch9.h:107
    - - -
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:112
    - - -
    uint8_t bDescriptorType
    Definition: usb_ch9.h:100
    -
    uint8_t bInterfaceSubClass
    Definition: usb_ch9.h:135
    -
    uint8_t bDeviceProtocol
    Definition: usb_ch9.h:104
    -
    uint16_t bcdHID
    Definition: usb_ch9.h:154
    -
    uint8_t bInterfaceProtocol
    Definition: usb_ch9.h:136
    -
    uint8_t bDescrType
    Definition: usb_ch9.h:157
    - - +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(_ch9_h_)
    26 #error "Never include usb_ch9.h directly; include Usb.h instead"
    27 #else
    28 
    29 /* USB chapter 9 structures */
    30 #define _ch9_h_
    31 
    32 /* Misc.USB constants */
    33 #define DEV_DESCR_LEN 18 //device descriptor length
    34 #define CONF_DESCR_LEN 9 //configuration descriptor length
    35 #define INTR_DESCR_LEN 9 //interface descriptor length
    36 #define EP_DESCR_LEN 7 //endpoint descriptor length
    37 
    38 /* Standard Device Requests */
    39 
    40 #define USB_REQUEST_GET_STATUS 0 // Standard Device Request - GET STATUS
    41 #define USB_REQUEST_CLEAR_FEATURE 1 // Standard Device Request - CLEAR FEATURE
    42 #define USB_REQUEST_SET_FEATURE 3 // Standard Device Request - SET FEATURE
    43 #define USB_REQUEST_SET_ADDRESS 5 // Standard Device Request - SET ADDRESS
    44 #define USB_REQUEST_GET_DESCRIPTOR 6 // Standard Device Request - GET DESCRIPTOR
    45 #define USB_REQUEST_SET_DESCRIPTOR 7 // Standard Device Request - SET DESCRIPTOR
    46 #define USB_REQUEST_GET_CONFIGURATION 8 // Standard Device Request - GET CONFIGURATION
    47 #define USB_REQUEST_SET_CONFIGURATION 9 // Standard Device Request - SET CONFIGURATION
    48 #define USB_REQUEST_GET_INTERFACE 10 // Standard Device Request - GET INTERFACE
    49 #define USB_REQUEST_SET_INTERFACE 11 // Standard Device Request - SET INTERFACE
    50 #define USB_REQUEST_SYNCH_FRAME 12 // Standard Device Request - SYNCH FRAME
    51 
    52 #define USB_FEATURE_ENDPOINT_HALT 0 // CLEAR/SET FEATURE - Endpoint Halt
    53 #define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // CLEAR/SET FEATURE - Device remote wake-up
    54 #define USB_FEATURE_TEST_MODE 2 // CLEAR/SET FEATURE - Test mode
    55 
    56 /* Setup Data Constants */
    57 
    58 #define USB_SETUP_HOST_TO_DEVICE 0x00 // Device Request bmRequestType transfer direction - host to device transfer
    59 #define USB_SETUP_DEVICE_TO_HOST 0x80 // Device Request bmRequestType transfer direction - device to host transfer
    60 #define USB_SETUP_TYPE_STANDARD 0x00 // Device Request bmRequestType type - standard
    61 #define USB_SETUP_TYPE_CLASS 0x20 // Device Request bmRequestType type - class
    62 #define USB_SETUP_TYPE_VENDOR 0x40 // Device Request bmRequestType type - vendor
    63 #define USB_SETUP_RECIPIENT_DEVICE 0x00 // Device Request bmRequestType recipient - device
    64 #define USB_SETUP_RECIPIENT_INTERFACE 0x01 // Device Request bmRequestType recipient - interface
    65 #define USB_SETUP_RECIPIENT_ENDPOINT 0x02 // Device Request bmRequestType recipient - endpoint
    66 #define USB_SETUP_RECIPIENT_OTHER 0x03 // Device Request bmRequestType recipient - other
    67 
    68 /* USB descriptors */
    69 
    70 #define USB_DESCRIPTOR_DEVICE 0x01 // bDescriptorType for a Device Descriptor.
    71 #define USB_DESCRIPTOR_CONFIGURATION 0x02 // bDescriptorType for a Configuration Descriptor.
    72 #define USB_DESCRIPTOR_STRING 0x03 // bDescriptorType for a String Descriptor.
    73 #define USB_DESCRIPTOR_INTERFACE 0x04 // bDescriptorType for an Interface Descriptor.
    74 #define USB_DESCRIPTOR_ENDPOINT 0x05 // bDescriptorType for an Endpoint Descriptor.
    75 #define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06 // bDescriptorType for a Device Qualifier.
    76 #define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration.
    77 #define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power.
    78 #define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor.
    79 
    80 #define HID_DESCRIPTOR_HID 0x21
    81 
    82 
    83 
    84 /* OTG SET FEATURE Constants */
    85 #define OTG_FEATURE_B_HNP_ENABLE 3 // SET FEATURE OTG - Enable B device to perform HNP
    86 #define OTG_FEATURE_A_HNP_SUPPORT 4 // SET FEATURE OTG - A device supports HNP
    87 #define OTG_FEATURE_A_ALT_HNP_SUPPORT 5 // SET FEATURE OTG - Another port on the A device supports HNP
    88 
    89 /* USB Endpoint Transfer Types */
    90 #define USB_TRANSFER_TYPE_CONTROL 0x00 // Endpoint is a control endpoint.
    91 #define USB_TRANSFER_TYPE_ISOCHRONOUS 0x01 // Endpoint is an isochronous endpoint.
    92 #define USB_TRANSFER_TYPE_BULK 0x02 // Endpoint is a bulk endpoint.
    93 #define USB_TRANSFER_TYPE_INTERRUPT 0x03 // Endpoint is an interrupt endpoint.
    94 #define bmUSB_TRANSFER_TYPE 0x03 // bit mask to separate transfer type from ISO attributes
    95 
    96 
    97 /* Standard Feature Selectors for CLEAR_FEATURE Requests */
    98 #define USB_FEATURE_ENDPOINT_STALL 0 // Endpoint recipient
    99 #define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // Device recipient
    100 #define USB_FEATURE_TEST_MODE 2 // Device recipient
    101 
    102 /* descriptor data structures */
    103 
    104 /* Device descriptor structure */
    105 typedef struct {
    106  uint8_t bLength; // Length of this descriptor.
    107  uint8_t bDescriptorType; // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE).
    108  uint16_t bcdUSB; // USB Spec Release Number (BCD).
    109  uint8_t bDeviceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
    110  uint8_t bDeviceSubClass; // Subclass code (assigned by the USB-IF).
    111  uint8_t bDeviceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
    112  uint8_t bMaxPacketSize0; // Maximum packet size for endpoint 0.
    113  uint16_t idVendor; // Vendor ID (assigned by the USB-IF).
    114  uint16_t idProduct; // Product ID (assigned by the manufacturer).
    115  uint16_t bcdDevice; // Device release number (BCD).
    116  uint8_t iManufacturer; // Index of String Descriptor describing the manufacturer.
    117  uint8_t iProduct; // Index of String Descriptor describing the product.
    118  uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number.
    119  uint8_t bNumConfigurations; // Number of possible configurations.
    120 } __attribute__((packed)) USB_DEVICE_DESCRIPTOR;
    121 
    122 /* Configuration descriptor structure */
    123 typedef struct {
    124  uint8_t bLength; // Length of this descriptor.
    125  uint8_t bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION).
    126  uint16_t wTotalLength; // Total length of all descriptors for this configuration.
    127  uint8_t bNumInterfaces; // Number of interfaces in this configuration.
    128  uint8_t bConfigurationValue; // Value of this configuration (1 based).
    129  uint8_t iConfiguration; // Index of String Descriptor describing the configuration.
    130  uint8_t bmAttributes; // Configuration characteristics.
    131  uint8_t bMaxPower; // Maximum power consumed by this configuration.
    132 } __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR;
    133 
    134 /* Interface descriptor structure */
    135 typedef struct {
    136  uint8_t bLength; // Length of this descriptor.
    137  uint8_t bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE).
    138  uint8_t bInterfaceNumber; // Number of this interface (0 based).
    139  uint8_t bAlternateSetting; // Value of this alternate interface setting.
    140  uint8_t bNumEndpoints; // Number of endpoints in this interface.
    141  uint8_t bInterfaceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
    142  uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF).
    143  uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
    144  uint8_t iInterface; // Index of String Descriptor describing the interface.
    145 } __attribute__((packed)) USB_INTERFACE_DESCRIPTOR;
    146 
    147 /* Endpoint descriptor structure */
    148 typedef struct {
    149  uint8_t bLength; // Length of this descriptor.
    150  uint8_t bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT).
    151  uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN).
    152  uint8_t bmAttributes; // Endpoint transfer type.
    153  uint16_t wMaxPacketSize; // Maximum packet size.
    154  uint8_t bInterval; // Polling interval in frames.
    155 } __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR;
    156 
    157 /* HID descriptor */
    158 typedef struct {
    159  uint8_t bLength;
    161  uint16_t bcdHID; // HID class specification release
    162  uint8_t bCountryCode;
    163  uint8_t bNumDescriptors; // Number of additional class specific descriptors
    164  uint8_t bDescrType; // Type of class descriptor
    165  uint16_t wDescriptorLength; // Total size of the Report descriptor
    166 } __attribute__((packed)) USB_HID_DESCRIPTOR;
    167 
    168 typedef struct {
    169  uint8_t bDescrType; // Type of class descriptor
    170  uint16_t wDescriptorLength; // Total size of the Report descriptor
    171 } __attribute__((packed)) HID_CLASS_DESCRIPTOR_LEN_AND_TYPE;
    172 
    173 #endif // _ch9_h_
    +
    uint8_t iSerialNumber
    Definition: usb_ch9.h:118
    + + +
    uint16_t bcdDevice
    Definition: usb_ch9.h:115
    + + + + +
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:112
    + + + +
    uint8_t bLength
    Definition: usb_ch9.h:159
    + + + + + + + + + +
    uint8_t bDeviceSubClass
    Definition: usb_ch9.h:110
    +
    uint16_t wDescriptorLength
    Definition: usb_ch9.h:165
    + +
    uint8_t bCountryCode
    Definition: usb_ch9.h:162
    +
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:153
    +
    uint8_t iManufacturer
    Definition: usb_ch9.h:116
    + +
    uint8_t bNumDescriptors
    Definition: usb_ch9.h:163
    +
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:151
    +
    uint8_t bDescriptorType
    Definition: usb_ch9.h:160
    +
    uint8_t bDeviceClass
    Definition: usb_ch9.h:109
    + + + + +
    uint16_t idProduct
    Definition: usb_ch9.h:114
    + + +
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:119
    + + +
    uint8_t bDescriptorType
    Definition: usb_ch9.h:107
    +
    uint8_t bInterfaceSubClass
    Definition: usb_ch9.h:142
    +
    uint8_t bDeviceProtocol
    Definition: usb_ch9.h:111
    +
    uint16_t bcdHID
    Definition: usb_ch9.h:161
    +
    uint8_t bInterfaceProtocol
    Definition: usb_ch9.h:143
    +
    uint8_t bDescrType
    Definition: usb_ch9.h:164
    + +
    diff --git a/usbh__midi_8cpp.html b/usbh__midi_8cpp.html index 89132932..d1f7ae5f 100644 --- a/usbh__midi_8cpp.html +++ b/usbh__midi_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbh_midi.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/usbh__midi_8cpp__incl.md5 b/usbh__midi_8cpp__incl.md5 index 6ddfc77d..65155a0e 100644 --- a/usbh__midi_8cpp__incl.md5 +++ b/usbh__midi_8cpp__incl.md5 @@ -1 +1 @@ -cf6b83d7ef453c74c82055514ca06b47 \ No newline at end of file +70cb9efaeaec1fbcbedbdc63920456c9 \ No newline at end of file diff --git a/usbh__midi_8cpp__incl.png b/usbh__midi_8cpp__incl.png index 672967f021382d1ecd29b5c5184924b6418e0773..f22ee6bb75c5a2244cce0a5ffa39ae11c7c948c1 100644 GIT binary patch literal 5279 zcmdUz^;cBi*T)BtZij9}K)Qzpr9paR7#L|87#O9bYv=}1K{_Or8jw%~DFG3N?glA= zp;PLa&+}h=e>nTBd-gi(-n-7;>-9eGIAcR?N-`EQ002O#tD|9xn|*MjiG&Cjdx4*E z5rF4qs;vg79%TCq0MJ?JYCL)7hljNyb*Iy040(fEAzRU-(8g!cCDA6Ktp}7y$3A#N zLlG%R8yR0>#s$@(rFv2ixS>x|i};97817k)D%VNm;`$i(t7N`F2T;W3`G|Y%V$=1r zY~a9~-BavLRT%6m}VO8dzRi8Zv3v^_$ z7`Iyj%}v`a>85QrL+I(~hLhP9bKXrf{AAf0DI%6}TbwshlQTN2cbO2B18+M#V6U|L zKFOh$W8;-s%XWszmOTc0zkfzBRbx}868vvVuWS-()sUfTg6A4S;T>3jnlMYa1k$57 zdX1Zi$^JhjVcVXk;2po{zsasn8FJ7;TpxND(iLRFEM#6Sjoe)8dv|hswg08mXK!9N zKlm)O93DK#kK3afn&;{1Nul`Fdk50lb>C(z4#>Z?+MUph$x-x8_Vn_y;8^Rnl_qCi z?2X@Rk0NI*e-c4N$F@7W)^>OMbk;y-qQ=IiX(sgcGKK|&)RA!+AI8Y)35$r7ynTDW zc|9ElOP8Rj@EZt_o6TYZ^WK~O6l09L%D@GrL1v9k?U@hf>i>{NyM z5HB_9mID-;@hXo$uG-S)9l2Hz9L^Vf*v;5TWss+oxz}=R7_gSAy|tMiTH3S}l70Jc zM+_guqm@|D%MqB^fY00ZZ@c2;bjk*(u=vHvC`-~Y-r!KYJAqNG6!+2D0?4!789GkR zP%x=P1xM($2aAjgT@|!8JU%`?gH6VDvUsAxT&e(UYU(`y)gy6ey4C^Fj>4mmu9tG? zp-}KU;F5VYpV8OFI+piqq^9jwPpstt->8oL?)um${dUf+jdu3$Y=e+NmUNuEvg@R9 zkJF!?q}P{6j@uIzjE;_uwP8|07w$euw+_qN8XD*`x9?aGtDBKg3#dB-kwJeJxl>ms znO<+(fgf-(qK#N+_C^|5{RomLAj|w9YGv280#7 z?{3be#QouSw>JVHP&x)O0EfnW9{rWd!@RV&@coM*0)ZGWH{pTnask%0Ayt-%HYfZ%5m%THs3S$!OnK;vrTfz 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 M)il(oRh($ literal 5264 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 diff --git a/usbh__midi_8cpp_source.html b/usbh__midi_8cpp_source.html index dca6d080..5af81072 100644 --- a/usbh__midi_8cpp_source.html +++ b/usbh__midi_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbh_midi.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    usbh_midi.cpp
    -Go to the documentation of this file.
    1 /*
    2  *******************************************************************************
    3  * USB-MIDI class driver for USB Host Shield 2.0 Library
    4  * Copyright (c) 2012-2016 Yuuichi Akagawa
    5  *
    6  * Idea from LPK25 USB-MIDI to Serial MIDI converter
    7  * by Collin Cunningham - makezine.com, narbotic.com
    8  *
    9  * for use with USB Host Shield 2.0 from Circuitsathome.com
    10  * https://github.com/felis/USB_Host_Shield_2.0
    11  *******************************************************************************
    12  * This program is free software; you can redistribute it and/or modify
    13  * it under the terms of the GNU General Public License as published by
    14  * the Free Software Foundation; either version 2 of the License, or
    15  * (at your option) any later version.
    16  *
    17  * This program is distributed in the hope that it will be useful,
    18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    20  * GNU General Public License for more details.
    21  *
    22  * You should have received a copy of the GNU General Public License
    23  * along with this program. If not, see <http://www.gnu.org/licenses/>
    24  *******************************************************************************
    25  */
    26 
    27 #include "usbh_midi.h"
    29 // MIDI MESAGES
    30 // midi.org/techspecs/
    32 // STATUS BYTES
    33 // 0x8n == noteOff
    34 // 0x9n == noteOn
    35 // 0xAn == afterTouch
    36 // 0xBn == controlChange
    37 // n == Channel(0x0-0xf)
    39 //DATA BYTE 1
    40 // note# == (0-127)
    41 // or
    42 // control# == (0-119)
    44 // DATA BYTE 2
    45 // velocity == (0-127)
    46 // or
    47 // controlVal == (0-127)
    49 // USB-MIDI Event Packets
    50 // usb.org - Universal Serial Bus Device Class Definition for MIDI Devices 1.0
    52 //+-------------+-------------+-------------+-------------+
    53 //| Byte 0 | Byte 1 | Byte 2 | Byte 3 |
    54 //+------+------+-------------+-------------+-------------+
    55 //|Cable | Code | | | |
    56 //|Number|Index | MIDI_0 | MIDI_1 | MIDI_2 |
    57 //| |Number| | | |
    58 //|(4bit)|(4bit)| (8bit) | (8bit) | (8bit) |
    59 //+------+------+-------------+-------------+-------------+
    60 // CN == 0x0-0xf
    61 //+-----+-----------+-------------------------------------------------------------------
    62 //| CIN |MIDI_x size|Description
    63 //+-----+-----------+-------------------------------------------------------------------
    64 //| 0x0 | 1, 2 or 3 |Miscellaneous function codes. Reserved for future extensions.
    65 //| 0x1 | 1, 2 or 3 |Cable events. Reserved for future expansion.
    66 //| 0x2 | 2 |Two-byte System Common messages like MTC, SongSelect, etc.
    67 //| 0x3 | 3 |Three-byte System Common messages like SPP, etc.
    68 //| 0x4 | 3 |SysEx starts or continues
    69 //| 0x5 | 1 |Single-byte System Common Message or SysEx ends with following single byte.
    70 //| 0x6 | 2 |SysEx ends with following two bytes.
    71 //| 0x7 | 3 |SysEx ends with following three bytes.
    72 //| 0x8 | 3 |Note-off
    73 //| 0x9 | 3 |Note-on
    74 //| 0xA | 3 |Poly-KeyPress
    75 //| 0xB | 3 |Control Change
    76 //| 0xC | 2 |Program Change
    77 //| 0xD | 2 |Channel Pressure
    78 //| 0xE | 3 |PitchBend Change
    79 //| 0xF | 1 |Single Byte
    80 //+-----+-----------+-------------------------------------------------------------------
    81 
    82 const uint8_t USBH_MIDI::epDataInIndex = 1;
    83 const uint8_t USBH_MIDI::epDataOutIndex = 2;
    84 const uint8_t USBH_MIDI::epDataInIndexVSP = 3;
    85 const uint8_t USBH_MIDI::epDataOutIndexVSP = 4;
    86 
    88 pUsb(p),
    89 bAddress(0),
    90 bNumEP(1),
    91 bPollEnable(false),
    92 isMidiFound(false),
    93 readPtr(0) {
    94  // initialize endpoint data structures
    95  for(uint8_t i=0; i<MIDI_MAX_ENDPOINTS; i++) {
    96  epInfo[i].epAddr = 0;
    97  epInfo[i].maxPktSize = (i) ? 0 : 8;
    98  epInfo[i].epAttribs = 0;
    99 // epInfo[i].bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
    100  epInfo[i].bmNakPower = (i) ? USB_NAK_NOWAIT : 4;
    101 
    102  }
    103  // register in USB subsystem
    104  if (pUsb) {
    105  pUsb->RegisterDeviceClass(this);
    106  }
    107 }
    108 
    109 /* Connection initialization of an MIDI Device */
    110 uint8_t USBH_MIDI::Init(uint8_t parent, uint8_t port, bool lowspeed)
    111 {
    112  uint8_t buf[DESC_BUFF_SIZE];
    113  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    114  uint8_t rcode;
    115  UsbDevice *p = NULL;
    116  EpInfo *oldep_ptr = NULL;
    117  uint8_t num_of_conf; // number of configurations
    118 
    119  // get memory address of USB device address pool
    120  AddressPool &addrPool = pUsb->GetAddressPool();
    121 #ifdef DEBUG_USB_HOST
    122  USBTRACE("\rMIDI Init\r\n");
    123 #endif
    124  // check if address has already been assigned to an instance
    125  if (bAddress) {
    127  }
    128  // Get pointer to pseudo device with address 0 assigned
    129  p = addrPool.GetUsbDevicePtr(bAddress);
    130  if (!p) {
    132  }
    133  if (!p->epinfo) {
    135  }
    136 
    137  // Save old pointer to EP_RECORD of address 0
    138  oldep_ptr = p->epinfo;
    139 
    140  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    141  p->epinfo = epInfo;
    142  p->lowspeed = lowspeed;
    143 
    144  // Get device descriptor
    145  rcode = pUsb->getDevDescr( 0, 0, sizeof(USB_DEVICE_DESCRIPTOR), (uint8_t*)buf );
    146  vid = udd->idVendor;
    147  pid = udd->idProduct;
    148  // Restore p->epinfo
    149  p->epinfo = oldep_ptr;
    150 
    151  if( rcode ){
    152  goto FailGetDevDescr;
    153  }
    154 
    155  // Allocate new address according to device class
    156  bAddress = addrPool.AllocAddress(parent, false, port);
    157  if (!bAddress) {
    159  }
    160 
    161  // Extract Max Packet Size from device descriptor
    163 
    164  // Assign new address to the device
    165  rcode = pUsb->setAddr( 0, 0, bAddress );
    166  if (rcode) {
    167  p->lowspeed = false;
    168  addrPool.FreeAddress(bAddress);
    169  bAddress = 0;
    170  return rcode;
    171  }//if (rcode...
    172 #ifdef DEBUG_USB_HOST
    173  USBTRACE2("Addr:", bAddress);
    174 #endif
    175  p->lowspeed = false;
    176 
    177  //get pointer to assigned address record
    178  p = addrPool.GetUsbDevicePtr(bAddress);
    179  if (!p) {
    181  }
    182  p->lowspeed = lowspeed;
    183 
    184  num_of_conf = udd->bNumConfigurations;
    185 
    186  // Assign epInfo to epinfo pointer
    187  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    188  if (rcode) {
    189 #ifdef DEBUG_USB_HOST
    190  USBTRACE("setEpInfoEntry failed");
    191 #endif
    192  goto FailSetDevTblEntry;
    193  }
    194 #ifdef DEBUG_USB_HOST
    195  USBTRACE2("NC:", num_of_conf);
    196 #endif
    197  for (uint8_t i=0; i<num_of_conf; i++) {
    199  if (bNumEP > 1)
    200  break;
    201  } // for
    202 #ifdef DEBUG_USB_HOST
    203  USBTRACE2("NumEP:", bNumEP);
    204 #endif
    205  if( bConfNum == 0 ){ //Device not found.
    206  goto FailGetConfDescr;
    207  }
    208 
    209  if( !isMidiFound ){ //MIDI Device not found. Try first Bulk transfer device
    214  }
    215 
    216  // Assign epInfo to epinfo pointer
    218 #ifdef DEBUG_USB_HOST
    219  USBTRACE2("Conf:", bConfNum);
    220 #endif
    221  // Set Configuration Value
    222  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    223  if (rcode) {
    224  goto FailSetConfDescr;
    225  }
    226 #ifdef DEBUG_USB_HOST
    227  USBTRACE("Init done.");
    228 #endif
    229  bPollEnable = true;
    230  return 0;
    231 FailGetDevDescr:
    232 FailSetDevTblEntry:
    233 FailGetConfDescr:
    234 FailSetConfDescr:
    235  Release();
    236  return rcode;
    237 }
    238 
    239 /* get and parse config descriptor */
    240 void USBH_MIDI::parseConfigDescr( byte addr, byte conf )
    241 {
    242  uint8_t buf[ DESC_BUFF_SIZE ];
    243  uint8_t* buf_ptr = buf;
    244  byte rcode;
    245  byte descr_length;
    246  byte descr_type;
    247  unsigned int total_length;
    248  USB_ENDPOINT_DESCRIPTOR *epDesc;
    249  boolean isMidi = false;
    250 
    251  // get configuration descriptor (get descriptor size only)
    252  rcode = pUsb->getConfDescr( addr, 0, 4, conf, buf );
    253  if( rcode ){
    254  return;
    255  }
    256  total_length = buf[2] | ((int)buf[3] << 8);
    257  if( total_length > DESC_BUFF_SIZE ) { //check if total length is larger than buffer
    258  total_length = DESC_BUFF_SIZE;
    259  }
    260 
    261  // get configuration descriptor (all)
    262  rcode = pUsb->getConfDescr( addr, 0, total_length, conf, buf ); //get the whole descriptor
    263  if( rcode ){
    264  return;
    265  }
    266 
    267  //parsing descriptors
    268  while( buf_ptr < buf + total_length ) {
    269  descr_length = *( buf_ptr );
    270  descr_type = *( buf_ptr + 1 );
    271  switch( descr_type ) {
    273  bConfNum = buf_ptr[5];
    274  break;
    276  if( buf_ptr[5] == USB_CLASS_AUDIO && buf_ptr[6] == USB_SUBCLASS_MIDISTREAMING ) { //p[5]; bInterfaceClass = 1(Audio), p[6]; bInterfaceSubClass = 3(MIDI Streaming)
    277  isMidiFound = true; //MIDI device found.
    278  isMidi = true;
    279  }else{
    280 #ifdef DEBUG_USB_HOST
    281  USBTRACE("No MIDI Device\n");
    282 #endif
    283  isMidi = false;
    284  }
    285  break;
    287  epDesc = (USB_ENDPOINT_DESCRIPTOR *)buf_ptr;
    288  if ((epDesc->bmAttributes & 0x02) == 2) {//bulk
    289  uint8_t index;
    290  if( isMidi )
    291  index = ((epDesc->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    292  else
    293  index = ((epDesc->bEndpointAddress & 0x80) == 0x80) ? epDataInIndexVSP : epDataOutIndexVSP;
    294  epInfo[index].epAddr = (epDesc->bEndpointAddress & 0x0F);
    295  epInfo[index].maxPktSize = (uint8_t)epDesc->wMaxPacketSize;
    296  bNumEP ++;
    297 #ifdef DEBUG_USB_HOST
    298  PrintEndpointDescriptor(epDesc);
    299 #endif
    300  }
    301  break;
    302  default:
    303  break;
    304  }//switch( descr_type
    305  buf_ptr += descr_length; //advance buffer pointer
    306  }//while( buf_ptr <=...
    307 }
    308 
    309 /* Performs a cleanup after failed Init() attempt */
    311 {
    313  bNumEP = 1; //must have to be reset to 1
    314  bAddress = 0;
    315  bPollEnable = false;
    316  readPtr = 0;
    317  return 0;
    318 }
    319 
    320 /* Receive data from MIDI device */
    321 uint8_t USBH_MIDI::RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    322 {
    323  *bytes_rcvd = (uint16_t)epInfo[epDataInIndex].maxPktSize;
    324  uint8_t r = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    325 
    326  if( *bytes_rcvd < (MIDI_EVENT_PACKET_SIZE-4)){
    327  dataptr[*bytes_rcvd] = '\0';
    328  dataptr[(*bytes_rcvd)+1] = '\0';
    329  }
    330  return r;
    331 }
    332 
    333 /* Receive data from MIDI device */
    334 uint8_t USBH_MIDI::RecvData(uint8_t *outBuf)
    335 {
    336  byte rcode = 0; //return code
    337  uint16_t rcvd;
    338 
    339  if( bPollEnable == false ) return false;
    340 
    341  //Checking unprocessed message in buffer.
    342  if( readPtr != 0 && readPtr < MIDI_EVENT_PACKET_SIZE ){
    343  if(recvBuf[readPtr] == 0 && recvBuf[readPtr+1] == 0) {
    344  //no unprocessed message left in the buffer.
    345  }else{
    346  goto RecvData_return_from_buffer;
    347  }
    348  }
    349 
    350  readPtr = 0;
    351  rcode = RecvData( &rcvd, recvBuf);
    352  if( rcode != 0 ) {
    353  return 0;
    354  }
    355 
    356  //if all data is zero, no valid data received.
    357  if( recvBuf[0] == 0 && recvBuf[1] == 0 && recvBuf[2] == 0 && recvBuf[3] == 0 ) {
    358  return 0;
    359  }
    360 
    361 RecvData_return_from_buffer:
    362  readPtr++;
    363  outBuf[0] = recvBuf[readPtr];
    364  readPtr++;
    365  outBuf[1] = recvBuf[readPtr];
    366  readPtr++;
    367  outBuf[2] = recvBuf[readPtr];
    368  readPtr++;
    369  return lookupMsgSize(outBuf[0]);
    370 }
    371 
    372 /* Send data to MIDI device */
    373 uint8_t USBH_MIDI::SendData(uint8_t *dataptr, byte nCable)
    374 {
    375  byte buf[4];
    376  byte msg;
    377 
    378  msg = dataptr[0];
    379  // SysEx long message ?
    380  if( msg == 0xf0 )
    381  {
    382  return SendSysEx(dataptr, countSysExDataSize(dataptr), nCable);
    383  }
    384 
    385  buf[0] = (nCable << 4) | (msg >> 4);
    386  if( msg < 0xf0 ) msg = msg & 0xf0;
    387 
    388 
    389  //Building USB-MIDI Event Packets
    390  buf[1] = dataptr[0];
    391  buf[2] = dataptr[1];
    392  buf[3] = dataptr[2];
    393 
    394  switch(lookupMsgSize(msg)) {
    395  //3 bytes message
    396  case 3 :
    397  if(msg == 0xf2) {//system common message(SPP)
    398  buf[0] = (nCable << 4) | 3;
    399  }
    400  break;
    401 
    402  //2 bytes message
    403  case 2 :
    404  if(msg == 0xf1 || msg == 0xf3) {//system common message(MTC/SongSelect)
    405  buf[0] = (nCable << 4) | 2;
    406  }
    407  buf[3] = 0;
    408  break;
    409 
    410  //1 bytes message
    411  case 1 :
    412  default :
    413  buf[2] = 0;
    414  buf[3] = 0;
    415  break;
    416  }
    417  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, 4, buf);
    418 }
    419 
    420 #ifdef DEBUG_USB_HOST
    421 void USBH_MIDI::PrintEndpointDescriptor( const USB_ENDPOINT_DESCRIPTOR* ep_ptr )
    422 {
    423  Notify(PSTR("Endpoint descriptor:"), 0x80);
    424  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    425  PrintHex<uint8_t>(ep_ptr->bLength, 0x80);
    426  Notify(PSTR("\r\nType:\t\t"), 0x80);
    427  PrintHex<uint8_t>(ep_ptr->bDescriptorType, 0x80);
    428  Notify(PSTR("\r\nAddress:\t"), 0x80);
    429  PrintHex<uint8_t>(ep_ptr->bEndpointAddress, 0x80);
    430  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    431  PrintHex<uint8_t>(ep_ptr->bmAttributes, 0x80);
    432  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    433  PrintHex<uint16_t>(ep_ptr->wMaxPacketSize, 0x80);
    434  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    435  PrintHex<uint8_t>(ep_ptr->bInterval, 0x80);
    436  Notify(PSTR("\r\n"), 0x80);
    437 }
    438 #endif
    439 
    440 /* look up a MIDI message size from spec */
    441 /*Return */
    442 /* 0 : undefined message */
    443 /* 0<: Vaild message size(1-3) */
    444 uint8_t USBH_MIDI::lookupMsgSize(uint8_t midiMsg)
    445 {
    446  uint8_t msgSize = 0;
    447 
    448  if( midiMsg < 0xf0 ) midiMsg &= 0xf0;
    449  switch(midiMsg) {
    450  //3 bytes messages
    451  case 0xf2 : //system common message(SPP)
    452  case 0x80 : //Note off
    453  case 0x90 : //Note on
    454  case 0xa0 : //Poly KeyPress
    455  case 0xb0 : //Control Change
    456  case 0xe0 : //PitchBend Change
    457  msgSize = 3;
    458  break;
    459 
    460  //2 bytes messages
    461  case 0xf1 : //system common message(MTC)
    462  case 0xf3 : //system common message(SongSelect)
    463  case 0xc0 : //Program Change
    464  case 0xd0 : //Channel Pressure
    465  msgSize = 2;
    466  break;
    467 
    468  //1 bytes messages
    469  case 0xf8 : //system realtime message
    470  case 0xf9 : //system realtime message
    471  case 0xfa : //system realtime message
    472  case 0xfb : //system realtime message
    473  case 0xfc : //system realtime message
    474  case 0xfe : //system realtime message
    475  case 0xff : //system realtime message
    476  msgSize = 1;
    477  break;
    478 
    479  //undefine messages
    480  default :
    481  break;
    482  }
    483  return msgSize;
    484 }
    485 
    486 /* SysEx data size counter */
    487 unsigned int USBH_MIDI::countSysExDataSize(uint8_t *dataptr)
    488 {
    489  unsigned int c = 1;
    490 
    491  if( *dataptr != 0xf0 ){ //not SysEx
    492  return 0;
    493  }
    494 
    495  //Search terminator(0xf7)
    496  while(*dataptr != 0xf7)
    497  {
    498  dataptr++;
    499  c++;
    500 
    501  //Limiter (upto 256 bytes)
    502  if(c > 256){
    503  c = 0;
    504  break;
    505  }
    506  }
    507  return c;
    508 }
    509 
    510 /* Send SysEx message to MIDI device */
    511 uint8_t USBH_MIDI::SendSysEx(uint8_t *dataptr, unsigned int datasize, byte nCable)
    512 {
    513  byte buf[4];
    514  uint8_t rc;
    515  unsigned int n = datasize;
    516 
    517  while(n > 0) {
    518  //Byte 0
    519  buf[0] = (nCable << 4) | 0x4; //x4 SysEx starts or continues
    520 
    521  switch ( n ) {
    522  case 1 :
    523  buf[0] = (nCable << 4) | 0x5; //x5 SysEx ends with following single byte.
    524  buf[1] = *(dataptr++);
    525  buf[2] = 0x00;
    526  buf[3] = 0x00;
    527  n = n - 1;
    528  break;
    529  case 2 :
    530  buf[0] = (nCable << 4) | 0x6; //x6 SysEx ends with following two bytes.
    531  buf[1] = *(dataptr++);
    532  buf[2] = *(dataptr++);
    533  buf[3] = 0x00;
    534  n = n - 2;
    535  break;
    536  case 3 :
    537  buf[0] = (nCable << 4) | 0x7; //x7 SysEx ends with following three bytes.
    538  default :
    539  buf[1] = *(dataptr++);
    540  buf[2] = *(dataptr++);
    541  buf[3] = *(dataptr++);
    542  n = n - 3;
    543  break;
    544  }
    545  rc = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, 4, buf);
    546  if(rc != 0)
    547  break;
    548  }
    549  return(rc);
    550 }
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:771
    - -
    static const uint8_t epDataInIndexVSP
    Definition: usbh_midi.h:45
    -
    EpInfo * epinfo
    Definition: address.h:76
    -
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +Go to the documentation of this file.
    1 /*
    2  *******************************************************************************
    3  * USB-MIDI class driver for USB Host Shield 2.0 Library
    4  * Copyright (c) 2012-2018 Yuuichi Akagawa
    5  *
    6  * Idea from LPK25 USB-MIDI to Serial MIDI converter
    7  * by Collin Cunningham - makezine.com, narbotic.com
    8  *
    9  * for use with USB Host Shield 2.0 from Circuitsathome.com
    10  * https://github.com/felis/USB_Host_Shield_2.0
    11  *******************************************************************************
    12  * This program is free software; you can redistribute it and/or modify
    13  * it under the terms of the GNU General Public License as published by
    14  * the Free Software Foundation; either version 2 of the License, or
    15  * (at your option) any later version.
    16  *
    17  * This program is distributed in the hope that it will be useful,
    18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    20  * GNU General Public License for more details.
    21  *
    22  * You should have received a copy of the GNU General Public License
    23  * along with this program. If not, see <http://www.gnu.org/licenses/>
    24  *******************************************************************************
    25  */
    26 
    27 #include "usbh_midi.h"
    29 // MIDI MESAGES
    30 // midi.org/techspecs/
    32 // STATUS BYTES
    33 // 0x8n == noteOff
    34 // 0x9n == noteOn
    35 // 0xAn == afterTouch
    36 // 0xBn == controlChange
    37 // n == Channel(0x0-0xf)
    39 //DATA BYTE 1
    40 // note# == (0-127)
    41 // or
    42 // control# == (0-119)
    44 // DATA BYTE 2
    45 // velocity == (0-127)
    46 // or
    47 // controlVal == (0-127)
    49 // USB-MIDI Event Packets
    50 // usb.org - Universal Serial Bus Device Class Definition for MIDI Devices 1.0
    52 //+-------------+-------------+-------------+-------------+
    53 //| Byte 0 | Byte 1 | Byte 2 | Byte 3 |
    54 //+------+------+-------------+-------------+-------------+
    55 //|Cable | Code | | | |
    56 //|Number|Index | MIDI_0 | MIDI_1 | MIDI_2 |
    57 //| |Number| | | |
    58 //|(4bit)|(4bit)| (8bit) | (8bit) | (8bit) |
    59 //+------+------+-------------+-------------+-------------+
    60 // CN == 0x0-0xf
    61 //+-----+-----------+-------------------------------------------------------------------
    62 //| CIN |MIDI_x size|Description
    63 //+-----+-----------+-------------------------------------------------------------------
    64 //| 0x0 | 1, 2 or 3 |Miscellaneous function codes. Reserved for future extensions.
    65 //| 0x1 | 1, 2 or 3 |Cable events. Reserved for future expansion.
    66 //| 0x2 | 2 |Two-byte System Common messages like MTC, SongSelect, etc.
    67 //| 0x3 | 3 |Three-byte System Common messages like SPP, etc.
    68 //| 0x4 | 3 |SysEx starts or continues
    69 //| 0x5 | 1 |Single-byte System Common Message or SysEx ends with following single byte.
    70 //| 0x6 | 2 |SysEx ends with following two bytes.
    71 //| 0x7 | 3 |SysEx ends with following three bytes.
    72 //| 0x8 | 3 |Note-off
    73 //| 0x9 | 3 |Note-on
    74 //| 0xA | 3 |Poly-KeyPress
    75 //| 0xB | 3 |Control Change
    76 //| 0xC | 2 |Program Change
    77 //| 0xD | 2 |Channel Pressure
    78 //| 0xE | 3 |PitchBend Change
    79 //| 0xF | 1 |Single Byte
    80 //+-----+-----------+-------------------------------------------------------------------
    81 
    82 const uint8_t USBH_MIDI::epDataInIndex = 1;
    83 const uint8_t USBH_MIDI::epDataOutIndex = 2;
    84 const uint8_t USBH_MIDI::epDataInIndexVSP = 3;
    85 const uint8_t USBH_MIDI::epDataOutIndexVSP = 4;
    86 
    88 pUsb(p),
    89 bAddress(0),
    90 bNumEP(1),
    91 bPollEnable(false),
    92 isMidiFound(false),
    93 readPtr(0) {
    94  // initialize endpoint data structures
    95  for(uint8_t i=0; i<MIDI_MAX_ENDPOINTS; i++) {
    96  epInfo[i].epAddr = 0;
    97  epInfo[i].maxPktSize = (i) ? 0 : 8;
    99 
    100  }
    101  // register in USB subsystem
    102  if (pUsb) {
    103  pUsb->RegisterDeviceClass(this);
    104  }
    105 }
    106 
    107 /* Connection initialization of an MIDI Device */
    108 uint8_t USBH_MIDI::Init(uint8_t parent, uint8_t port, bool lowspeed)
    109 {
    110  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    111  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    112  uint8_t rcode;
    113  UsbDevice *p = NULL;
    114  EpInfo *oldep_ptr = NULL;
    115  uint8_t num_of_conf; // number of configurations
    116 
    117  USBTRACE("\rMIDI Init\r\n");
    118 
    119  //for reconnect
    120  for(uint8_t i=epDataInIndex; i<=epDataOutIndex; i++) {
    121  epInfo[i].epAddr = (i==epDataInIndex) ? 0x81 : 0x01;
    122  epInfo[i].maxPktSize = 0;
    123  epInfo[i].bmSndToggle = 0;
    124  epInfo[i].bmRcvToggle = 0;
    125  }
    126 
    127  // get memory address of USB device address pool
    128  AddressPool &addrPool = pUsb->GetAddressPool();
    129 
    130  // check if address has already been assigned to an instance
    131  if (bAddress) {
    133  }
    134  // Get pointer to pseudo device with address 0 assigned
    135  p = addrPool.GetUsbDevicePtr(bAddress);
    136  if (!p) {
    138  }
    139  if (!p->epinfo) {
    141  }
    142 
    143  // Save old pointer to EP_RECORD of address 0
    144  oldep_ptr = p->epinfo;
    145 
    146  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    147  p->epinfo = epInfo;
    148  p->lowspeed = lowspeed;
    149 
    150  // Get device descriptor
    151  rcode = pUsb->getDevDescr( 0, 0, sizeof(USB_DEVICE_DESCRIPTOR), (uint8_t*)buf );
    152  vid = udd->idVendor;
    153  pid = udd->idProduct;
    154  // Restore p->epinfo
    155  p->epinfo = oldep_ptr;
    156 
    157  if( rcode ){
    158  goto FailGetDevDescr;
    159  }
    160 
    161  // Allocate new address according to device class
    162  bAddress = addrPool.AllocAddress(parent, false, port);
    163  if (!bAddress) {
    165  }
    166 
    167  // Extract Max Packet Size from device descriptor
    168  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    169 
    170  // Assign new address to the device
    171  rcode = pUsb->setAddr( 0, 0, bAddress );
    172  if (rcode) {
    173  p->lowspeed = false;
    174  addrPool.FreeAddress(bAddress);
    175  bAddress = 0;
    176  return rcode;
    177  }//if (rcode...
    178  USBTRACE2("Addr:", bAddress);
    179 
    180  p->lowspeed = false;
    181 
    182  //get pointer to assigned address record
    183  p = addrPool.GetUsbDevicePtr(bAddress);
    184  if (!p) {
    186  }
    187  p->lowspeed = lowspeed;
    188 
    189  num_of_conf = udd->bNumConfigurations;
    190 
    191  // Assign epInfo to epinfo pointer
    192  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    193  if (rcode) {
    194  USBTRACE("setEpInfoEntry failed");
    195  goto FailSetDevTblEntry;
    196  }
    197 
    198  USBTRACE("VID:"), D_PrintHex(vid, 0x80);
    199  USBTRACE(" PID:"), D_PrintHex(pid, 0x80);
    200  USBTRACE2(" #Conf:", num_of_conf);
    201 
    202  //Setup for well known vendor/device specific configuration
    205 
    206  isMidiFound = false;
    207  for (uint8_t i=0; i<num_of_conf; i++) {
    208  rcode = parseConfigDescr(bAddress, i);
    209  if( rcode )
    210  goto FailGetConfDescr;
    211  if (bNumEP > 1)
    212  break;
    213  } // for
    214 
    215  USBTRACE2("\r\nNumEP:", bNumEP);
    216 
    217  if( bNumEP < 2 ){ //Device not found.
    218  rcode = 0xff;
    219  goto FailGetConfDescr;
    220  }
    221 
    222  if( !isMidiFound ){ //MIDI Device not found. Try last Bulk transfer device
    223  USBTRACE("MIDI not found. Attempts bulk device\r\n");
    228  }
    229 
    230  // Assign epInfo to epinfo pointer
    231  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
    232  USBTRACE2("Conf:", bConfNum);
    233  USBTRACE2("EPin :", (uint8_t)(epInfo[epDataInIndex].epAddr + 0x80));
    234  USBTRACE2("EPout:", epInfo[epDataOutIndex].epAddr);
    235 
    236  // Set Configuration Value
    237  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    238  if (rcode) {
    239  goto FailSetConfDescr;
    240  }
    241  bPollEnable = true;
    242  USBTRACE("Init done.\r\n");
    243  return 0;
    244 FailGetDevDescr:
    245 FailSetDevTblEntry:
    246 FailGetConfDescr:
    247 FailSetConfDescr:
    248  Release();
    249  return rcode;
    250 }
    251 
    252 /* get and parse config descriptor */
    253 uint8_t USBH_MIDI::parseConfigDescr( uint8_t addr, uint8_t conf )
    254 {
    255  uint8_t buf[ DESC_BUFF_SIZE ];
    256  uint8_t* buf_ptr = buf;
    257  uint8_t rcode;
    258  uint8_t descr_length;
    259  uint8_t descr_type;
    260  uint16_t total_length;
    261  USB_ENDPOINT_DESCRIPTOR *epDesc;
    262  bool isMidi = false;
    263 
    264  // get configuration descriptor (get descriptor size only)
    265  rcode = pUsb->getConfDescr( addr, 0, 4, conf, buf );
    266  if( rcode ){
    267  return rcode;
    268  }
    269  total_length = buf[2] | ((int)buf[3] << 8);
    270  if( total_length > DESC_BUFF_SIZE ) { //check if total length is larger than buffer
    271  total_length = DESC_BUFF_SIZE;
    272  }
    273 
    274  // get configuration descriptor (all)
    275  rcode = pUsb->getConfDescr( addr, 0, total_length, conf, buf ); //get the whole descriptor
    276  if( rcode ){
    277  return rcode;
    278  }
    279 
    280  //parsing descriptors
    281  while( buf_ptr < buf + total_length ) {
    282  descr_length = *( buf_ptr );
    283  descr_type = *( buf_ptr + 1 );
    284  switch( descr_type ) {
    286  bConfNum = buf_ptr[5];
    287  break;
    289  USBTRACE("\r\nConf:"), D_PrintHex(bConfNum, 0x80);
    290  USBTRACE(" Int:"), D_PrintHex(buf_ptr[2], 0x80);
    291  USBTRACE(" Alt:"), D_PrintHex(buf_ptr[3], 0x80);
    292  USBTRACE(" EPs:"), D_PrintHex(buf_ptr[4], 0x80);
    293  USBTRACE(" IntCl:"), D_PrintHex(buf_ptr[5], 0x80);
    294  USBTRACE(" IntSubCl:"), D_PrintHex(buf_ptr[6], 0x80);
    295  USBTRACE("\r\n");
    296 
    297  if( buf_ptr[5] == USB_CLASS_AUDIO && buf_ptr[6] == USB_SUBCLASS_MIDISTREAMING ) { //p[5]; bInterfaceClass = 1(Audio), p[6]; bInterfaceSubClass = 3(MIDI Streaming)
    298  isMidiFound = true; //MIDI device found.
    299  isMidi = true;
    300  USBTRACE("MIDI Device\r\n");
    301  }else{
    302  isMidi = false;
    303  USBTRACE("No MIDI Device\r\n");
    304  }
    305  break;
    307  epDesc = (USB_ENDPOINT_DESCRIPTOR *)buf_ptr;
    308  USBTRACE("-EPAddr:"), D_PrintHex(epDesc->bEndpointAddress, 0x80);
    309  USBTRACE(" bmAttr:"), D_PrintHex(epDesc->bmAttributes, 0x80);
    310  USBTRACE2(" MaxPktSz:", (uint8_t)epDesc->wMaxPacketSize);
    311  if ((epDesc->bmAttributes & bTransferTypeMask) == USB_TRANSFER_TYPE_BULK) {//bulk
    312  uint8_t index;
    313  if( isMidi )
    314  index = ((epDesc->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    315  else
    316  index = ((epDesc->bEndpointAddress & 0x80) == 0x80) ? epDataInIndexVSP : epDataOutIndexVSP;
    317  epInfo[index].epAddr = (epDesc->bEndpointAddress & 0x0F);
    318  epInfo[index].maxPktSize = (uint8_t)epDesc->wMaxPacketSize;
    319  bNumEP ++;
    320 #ifdef DEBUG_USB_HOST
    321  PrintEndpointDescriptor(epDesc);
    322 #endif
    323  }
    324  break;
    325  default:
    326  break;
    327  }//switch( descr_type
    328  buf_ptr += descr_length; //advance buffer pointer
    329  }//while( buf_ptr <=...
    330  return 0;
    331 }
    332 
    333 /* Performs a cleanup after failed Init() attempt */
    335 {
    337  bNumEP = 1; //must have to be reset to 1
    338  bAddress = 0;
    339  bPollEnable = false;
    340  readPtr = 0;
    341  return 0;
    342 }
    343 
    344 /* Setup for well known vendor/device specific configuration */
    346 {
    347  // Novation
    348  if( vid == 0x1235 ) {
    349  // LaunchPad's endpoint attirbute is interrupt (0x20:S, 0x36:Mini, 0x51:Pro, 0x69:MK2, 0x7b:Launchkey25 MK2)
    350  if(pid == 0x20 || pid == 0x36 || pid == 0x51 || pid == 0x69 || pid == 0x7b ) {
    351  bTransferTypeMask = 2;
    352  }
    353  }
    354 }
    355 
    356 /* Receive data from MIDI device */
    357 uint8_t USBH_MIDI::RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    358 {
    359  *bytes_rcvd = (uint16_t)epInfo[epDataInIndex].maxPktSize;
    360  uint8_t r = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    361 
    362  if( *bytes_rcvd < (MIDI_EVENT_PACKET_SIZE-4)){
    363  dataptr[*bytes_rcvd] = '\0';
    364  dataptr[(*bytes_rcvd)+1] = '\0';
    365  }
    366  return r;
    367 }
    368 
    369 /* Receive data from MIDI device */
    370 uint8_t USBH_MIDI::RecvData(uint8_t *outBuf, bool isRaw)
    371 {
    372  uint8_t rcode = 0; //return code
    373  uint16_t rcvd;
    374 
    375  if( bPollEnable == false ) return 0;
    376 
    377  //Checking unprocessed message in buffer.
    378  if( readPtr != 0 && readPtr < MIDI_EVENT_PACKET_SIZE ){
    379  if(recvBuf[readPtr] == 0 && recvBuf[readPtr+1] == 0) {
    380  //no unprocessed message left in the buffer.
    381  }else{
    382  goto RecvData_return_from_buffer;
    383  }
    384  }
    385 
    386  readPtr = 0;
    387  rcode = RecvData( &rcvd, recvBuf);
    388  if( rcode != 0 ) {
    389  return 0;
    390  }
    391 
    392  //if all data is zero, no valid data received.
    393  if( recvBuf[0] == 0 && recvBuf[1] == 0 && recvBuf[2] == 0 && recvBuf[3] == 0 ) {
    394  return 0;
    395  }
    396 
    397 RecvData_return_from_buffer:
    398  uint8_t m;
    399  uint8_t cin = recvBuf[readPtr];
    400  if( isRaw == true ) {
    401  *(outBuf++) = cin;
    402  }
    403  readPtr++;
    404  *(outBuf++) = m = recvBuf[readPtr++];
    405  *(outBuf++) = recvBuf[readPtr++];
    406  *(outBuf++) = recvBuf[readPtr++];
    407  return lookupMsgSize(m, cin);
    408 }
    409 
    410 /* Receive raw data from MIDI device */
    411 uint8_t USBH_MIDI::RecvRawData(uint8_t *outBuf)
    412 {
    413  return RecvData(outBuf, true);
    414 }
    415 
    416 /* Send data to MIDI device */
    417 uint8_t USBH_MIDI::SendData(uint8_t *dataptr, uint8_t nCable)
    418 {
    419  uint8_t buf[4];
    420  uint8_t msg;
    421 
    422  msg = dataptr[0];
    423  // SysEx long message ?
    424  if( msg == 0xf0 )
    425  {
    426  return SendSysEx(dataptr, countSysExDataSize(dataptr), nCable);
    427  }
    428 
    429  buf[0] = (nCable << 4) | (msg >> 4);
    430  if( msg < 0xf0 ) msg = msg & 0xf0;
    431 
    432 
    433  //Building USB-MIDI Event Packets
    434  buf[1] = dataptr[0];
    435  buf[2] = dataptr[1];
    436  buf[3] = dataptr[2];
    437 
    438  switch(lookupMsgSize(msg)) {
    439  //3 bytes message
    440  case 3 :
    441  if(msg == 0xf2) {//system common message(SPP)
    442  buf[0] = (nCable << 4) | 3;
    443  }
    444  break;
    445 
    446  //2 bytes message
    447  case 2 :
    448  if(msg == 0xf1 || msg == 0xf3) {//system common message(MTC/SongSelect)
    449  buf[0] = (nCable << 4) | 2;
    450  }
    451  buf[3] = 0;
    452  break;
    453 
    454  //1 byte message
    455  case 1 :
    456  default :
    457  buf[2] = 0;
    458  buf[3] = 0;
    459  break;
    460  }
    461  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, 4, buf);
    462 }
    463 
    464 #ifdef DEBUG_USB_HOST
    465 void USBH_MIDI::PrintEndpointDescriptor( const USB_ENDPOINT_DESCRIPTOR* ep_ptr )
    466 {
    467  USBTRACE("Endpoint descriptor:\r\n");
    468  USBTRACE2(" Length:\t", ep_ptr->bLength);
    469  USBTRACE2(" Type:\t\t", ep_ptr->bDescriptorType);
    470  USBTRACE2(" Address:\t", ep_ptr->bEndpointAddress);
    471  USBTRACE2(" Attributes:\t", ep_ptr->bmAttributes);
    472  USBTRACE2(" MaxPktSize:\t", ep_ptr->wMaxPacketSize);
    473  USBTRACE2(" Poll Intrv:\t", ep_ptr->bInterval);
    474 }
    475 #endif
    476 
    477 /* look up a MIDI message size from spec */
    478 /*Return */
    479 /* 0 : undefined message */
    480 /* 0<: Vaild message size(1-3) */
    481 uint8_t USBH_MIDI::lookupMsgSize(uint8_t midiMsg, uint8_t cin)
    482 {
    483  uint8_t msgSize = 0;
    484 
    485  //SysEx message?
    486  cin = cin & 0x0f;
    487  if( (cin & 0xc) == 4 ) {
    488  if( cin == 4 || cin == 7 ) return 3;
    489  if( cin == 6 ) return 2;
    490  if( cin == 5 ) return 1;
    491  }
    492 
    493  if( midiMsg < 0xf0 ) midiMsg &= 0xf0;
    494  switch(midiMsg) {
    495  //3 bytes messages
    496  case 0xf2 : //system common message(SPP)
    497  case 0x80 : //Note off
    498  case 0x90 : //Note on
    499  case 0xa0 : //Poly KeyPress
    500  case 0xb0 : //Control Change
    501  case 0xe0 : //PitchBend Change
    502  msgSize = 3;
    503  break;
    504 
    505  //2 bytes messages
    506  case 0xf1 : //system common message(MTC)
    507  case 0xf3 : //system common message(SongSelect)
    508  case 0xc0 : //Program Change
    509  case 0xd0 : //Channel Pressure
    510  msgSize = 2;
    511  break;
    512 
    513  //1 byte messages
    514  case 0xf8 : //system realtime message
    515  case 0xf9 : //system realtime message
    516  case 0xfa : //system realtime message
    517  case 0xfb : //system realtime message
    518  case 0xfc : //system realtime message
    519  case 0xfe : //system realtime message
    520  case 0xff : //system realtime message
    521  msgSize = 1;
    522  break;
    523 
    524  //undefine messages
    525  default :
    526  break;
    527  }
    528  return msgSize;
    529 }
    530 
    531 /* SysEx data size counter */
    532 uint16_t USBH_MIDI::countSysExDataSize(uint8_t *dataptr)
    533 {
    534  uint16_t c = 1;
    535 
    536  if( *dataptr != 0xf0 ){ //not SysEx
    537  return 0;
    538  }
    539 
    540  //Search terminator(0xf7)
    541  while(*dataptr != 0xf7)
    542  {
    543  dataptr++;
    544  c++;
    545 
    546  //Limiter (default: 256 bytes)
    547  if(c > MIDI_MAX_SYSEX_SIZE){
    548  c = 0;
    549  break;
    550  }
    551  }
    552  return c;
    553 }
    554 
    555 /* Send SysEx message to MIDI device */
    556 uint8_t USBH_MIDI::SendSysEx(uint8_t *dataptr, uint16_t datasize, uint8_t nCable)
    557 {
    558  uint8_t buf[MIDI_EVENT_PACKET_SIZE];
    559  uint8_t rc = 0;
    560  uint16_t n = datasize;
    561  uint16_t pktSize = (n*10/3+7)/10*4; //Calculate total USB MIDI packet size
    562  uint8_t wptr = 0;
    563  uint8_t maxpkt = epInfo[epDataInIndex].maxPktSize;
    564 
    565  if( maxpkt > MIDI_EVENT_PACKET_SIZE ) maxpkt = MIDI_EVENT_PACKET_SIZE;
    566 
    567  USBTRACE("SendSysEx:\r\t");
    568  USBTRACE2(" Length:\t", datasize);
    569  USBTRACE2(" Total pktSize:\t", pktSize);
    570 
    571  while(n > 0) {
    572  //Byte 0
    573  buf[wptr] = (nCable << 4) | 0x4; //x4 SysEx starts or continues
    574 
    575  switch ( n ) {
    576  case 1 :
    577  buf[wptr++] = (nCable << 4) | 0x5; //x5 SysEx ends with following single byte.
    578  buf[wptr++] = *(dataptr++);
    579  buf[wptr++] = 0x00;
    580  buf[wptr++] = 0x00;
    581  n = n - 1;
    582  break;
    583  case 2 :
    584  buf[wptr++] = (nCable << 4) | 0x6; //x6 SysEx ends with following two bytes.
    585  buf[wptr++] = *(dataptr++);
    586  buf[wptr++] = *(dataptr++);
    587  buf[wptr++] = 0x00;
    588  n = n - 2;
    589  break;
    590  case 3 :
    591  buf[wptr] = (nCable << 4) | 0x7; //x7 SysEx ends with following three bytes.
    592  default :
    593  wptr++;
    594  buf[wptr++] = *(dataptr++);
    595  buf[wptr++] = *(dataptr++);
    596  buf[wptr++] = *(dataptr++);
    597  n = n - 3;
    598  break;
    599  }
    600 
    601  if( wptr >= maxpkt || n == 0 ){ //Reach a maxPktSize or data end.
    602  USBTRACE2(" wptr:\t", wptr);
    603  if( (rc = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, wptr, buf)) != 0 ){
    604  break;
    605  }
    606  wptr = 0; //rewind data pointer
    607  }
    608  }
    609  return(rc);
    610 }
    611 
    612 /* Send raw data to MIDI device */
    613 uint8_t USBH_MIDI::SendRawData(uint16_t bytes_send, uint8_t *dataptr)
    614 {
    615  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, bytes_send, dataptr);
    616 
    617 }
    618 
    619 uint8_t USBH_MIDI::extractSysExData(uint8_t *p, uint8_t *buf)
    620 {
    621  uint8_t rc = 0;
    622  uint8_t cin = *(p) & 0x0f;
    623 
    624  //SysEx message?
    625  if( (cin & 0xc) != 4 ) return rc;
    626 
    627  switch(cin) {
    628  case 4:
    629  case 7:
    630  *buf++ = *(p+1);
    631  *buf++ = *(p+2);
    632  *buf++ = *(p+3);
    633  rc = 3;
    634  break;
    635  case 6:
    636  *buf++ = *(p+1);
    637  *buf++ = *(p+2);
    638  rc = 2;
    639  break;
    640  case 5:
    641  *buf++ = *(p+1);
    642  rc = 1;
    643  break;
    644  default:
    645  break;
    646  }
    647  return(rc);
    648 }
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:784
    +
    uint8_t bmRcvToggle
    Definition: address.h:48
    + +
    uint8_t SendSysEx(uint8_t *dataptr, uint16_t datasize, uint8_t nCable=0)
    Definition: usbh_midi.cpp:556
    +
    static const uint8_t epDataInIndexVSP
    Definition: usbh_midi.h:44
    +
    EpInfo * epinfo
    Definition: address.h:83
    +
    bool lowspeed
    Definition: address.h:86
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:94
    +
    uint8_t bTransferTypeMask
    Definition: usbh_midi.h:55
    uint8_t readPtr
    Definition: usbh_midi.h:60
    -
    uint8_t bmNakPower
    Definition: address.h:42
    - -
    uint8_t RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: usbh_midi.cpp:321
    - - - - -
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:105
    -
    uint16_t vid
    Definition: usbh_midi.h:68
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:810
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbh_midi.cpp:110
    -
    #define USB_DESCRIPTOR_ENDPOINT
    Definition: usb_ch9.h:67
    -
    #define USB_SUBCLASS_MIDISTREAMING
    Definition: usbh_midi.h:32
    -
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    -
    USB * pUsb
    Definition: usbh_midi.h:49
    -
    void parseConfigDescr(byte addr, byte conf)
    Definition: usbh_midi.cpp:240
    +
    uint8_t bmNakPower
    Definition: address.h:49
    + +
    uint8_t RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: usbh_midi.cpp:357
    + + + +
    uint16_t vid
    Definition: usbh_midi.h:54
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:823
    +
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbh_midi.cpp:108
    +
    #define USB_DESCRIPTOR_ENDPOINT
    Definition: usb_ch9.h:74
    +
    #define USB_SUBCLASS_MIDISTREAMING
    Definition: usbh_midi.h:33
    +
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:71
    +
    USB * pUsb
    Definition: usbh_midi.h:48
    +
    uint8_t SendRawData(uint16_t bytes_send, uint8_t *dataptr)
    Definition: usbh_midi.cpp:613
    +
    uint16_t countSysExDataSize(uint8_t *dataptr)
    Definition: usbh_midi.cpp:532
    virtual void FreeAddress(uint8_t addr)=0
    -
    uint8_t epAttribs
    Definition: address.h:37
    -
    static const uint8_t epDataOutIndexVSP
    Definition: usbh_midi.h:46
    -
    #define USB_DESCRIPTOR_CONFIGURATION
    Definition: usb_ch9.h:64
    +
    static const uint8_t epDataOutIndexVSP
    Definition: usbh_midi.h:45
    +
    #define USB_DESCRIPTOR_CONFIGURATION
    Definition: usb_ch9.h:71
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
    -
    #define Notify(...)
    Definition: message.h:44
    - -
    #define USBTRACE2(s, r)
    Definition: macros.h:77
    -
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:801
    -
    uint8_t epAddr
    Definition: address.h:33
    -
    uint8_t bNumEP
    Definition: usbh_midi.h:52
    -
    uint8_t bAddress
    Definition: usbh_midi.h:50
    -
    Definition: address.h:32
    -
    uint16_t pid
    Definition: usbh_midi.h:68
    -
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:293
    -
    virtual uint8_t Release()
    Definition: usbh_midi.cpp:310
    -
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    -
    #define USB_CLASS_AUDIO
    Definition: UsbCore.h:57
    -
    bool isMidiFound
    Definition: usbh_midi.h:55
    -
    unsigned int countSysExDataSize(uint8_t *dataptr)
    Definition: usbh_midi.cpp:487
    -
    bool bPollEnable
    Definition: usbh_midi.h:53
    +
    void setupDeviceSpecific()
    Definition: usbh_midi.cpp:345
    + +
    #define USBTRACE2(s, r)
    Definition: macros.h:84
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:814
    +
    uint8_t epAddr
    Definition: address.h:40
    +
    uint8_t bNumEP
    Definition: usbh_midi.h:51
    +
    #define USB_NAK_MAX_POWER
    Definition: address.h:34
    +
    uint8_t bAddress
    Definition: usbh_midi.h:49
    +
    Definition: address.h:39
    +
    uint16_t pid
    Definition: usbh_midi.h:54
    +
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:300
    +
    virtual uint8_t Release()
    Definition: usbh_midi.cpp:334
    +
    uint8_t RecvRawData(uint8_t *outBuf)
    Definition: usbh_midi.cpp:411
    +
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:153
    +
    #define bmUSB_TRANSFER_TYPE
    Definition: usb_ch9.h:94
    +
    #define USB_CLASS_AUDIO
    Definition: UsbCore.h:68
    +
    bool isMidiFound
    Definition: usbh_midi.h:53
    +
    bool bPollEnable
    Definition: usbh_midi.h:52
    USBH_MIDI(USB *p)
    Definition: usbh_midi.cpp:87
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    -
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:144
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    -
    #define PSTR(str)
    - -
    static const uint8_t epDataInIndex
    Definition: usbh_midi.h:43
    -
    #define MIDI_EVENT_PACKET_SIZE
    Definition: usbh_midi.h:34
    -
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    -
    uint8_t SendData(uint8_t *dataptr, byte nCable=0)
    Definition: usbh_midi.cpp:373
    +
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:151
    +
    uint8_t bmSndToggle
    Definition: address.h:47
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:96
    + +
    static const uint8_t epDataInIndex
    Definition: usbh_midi.h:42
    +
    #define MIDI_EVENT_PACKET_SIZE
    Definition: usbh_midi.h:35
    +
    uint8_t lookupMsgSize(uint8_t midiMsg, uint8_t cin=0)
    Definition: usbh_midi.cpp:481
    +
    #define USB_NAK_NOWAIT
    Definition: address.h:36
    uint8_t recvBuf[MIDI_EVENT_PACKET_SIZE]
    Definition: usbh_midi.h:59
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    -
    uint16_t idProduct
    Definition: usb_ch9.h:107
    -
    uint8_t bConfNum
    Definition: usbh_midi.h:51
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:93
    +
    #define MIDI_MAX_SYSEX_SIZE
    Definition: usbh_midi.h:36
    +
    uint8_t bConfNum
    Definition: usbh_midi.h:50
    EpInfo epInfo[MIDI_MAX_ENDPOINTS]
    Definition: usbh_midi.h:57
    -
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:206
    -
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:112
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    -
    static const uint8_t epDataOutIndex
    Definition: usbh_midi.h:44
    -
    #define MIDI_MAX_ENDPOINTS
    Definition: usbh_midi.h:31
    -
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    -
    Definition: UsbCore.h:197
    -
    #define DESC_BUFF_SIZE
    Definition: usbh_midi.h:33
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    -
    #define USBTRACE(s)
    Definition: macros.h:75
    -
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:766
    -
    uint8_t SendSysEx(uint8_t *dataptr, unsigned int datasize, byte nCable=0)
    Definition: usbh_midi.cpp:511
    -
    #define USB_DESCRIPTOR_INTERFACE
    Definition: usb_ch9.h:66
    - +
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:213
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:91
    +
    uint8_t extractSysExData(uint8_t *p, uint8_t *buf)
    Definition: usbh_midi.cpp:619
    +
    uint8_t SendData(uint8_t *dataptr, uint8_t nCable=0)
    Definition: usbh_midi.cpp:417
    +
    static const uint8_t epDataOutIndex
    Definition: usbh_midi.h:43
    +
    #define MIDI_MAX_ENDPOINTS
    Definition: usbh_midi.h:32
    +
    uint8_t maxPktSize
    Definition: address.h:41
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:224
    +
    uint8_t parseConfigDescr(uint8_t addr, uint8_t conf)
    Definition: usbh_midi.cpp:253
    +
    Definition: UsbCore.h:208
    +
    #define USB_TRANSFER_TYPE_BULK
    Definition: usb_ch9.h:92
    +
    #define DESC_BUFF_SIZE
    Definition: usbh_midi.h:34
    +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:228
    +
    void D_PrintHex(T val, int lvl)
    Definition: printhex.h:76
    +
    #define USBTRACE(s)
    Definition: macros.h:82
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:779
    +
    #define USB_DESCRIPTOR_INTERFACE
    Definition: usb_ch9.h:73
    +
    diff --git a/usbh__midi_8h.html b/usbh__midi_8h.html index e8a026c0..ba61cbfd 100644 --- a/usbh__midi_8h.html +++ b/usbh__midi_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbh_midi.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
      #define MIDI_EVENT_PACKET_SIZE   64   +#define MIDI_MAX_SYSEX_SIZE   256 + 

    Macro Definition Documentation

    - + +

    ◆ MIDI_MAX_ENDPOINTS

    +
    @@ -140,11 +124,13 @@ Macros
    -

    Definition at line 31 of file usbh_midi.h.

    +

    Definition at line 32 of file usbh_midi.h.

    - + +

    ◆ USB_SUBCLASS_MIDISTREAMING

    +
    @@ -154,11 +140,13 @@ Macros
    -

    Definition at line 32 of file usbh_midi.h.

    +

    Definition at line 33 of file usbh_midi.h.

    - + +

    ◆ DESC_BUFF_SIZE

    +
    @@ -168,11 +156,13 @@ Macros
    -

    Definition at line 33 of file usbh_midi.h.

    +

    Definition at line 34 of file usbh_midi.h.

    - + +

    ◆ MIDI_EVENT_PACKET_SIZE

    +
    @@ -182,7 +172,23 @@ Macros
    -

    Definition at line 34 of file usbh_midi.h.

    +

    Definition at line 35 of file usbh_midi.h.

    + +
    +
    + +

    ◆ MIDI_MAX_SYSEX_SIZE

    + +
    +
    + + + + +
    #define MIDI_MAX_SYSEX_SIZE   256
    +
    + +

    Definition at line 36 of file usbh_midi.h.

    @@ -191,7 +197,7 @@ Macros diff --git a/usbh__midi_8h__dep__incl.md5 b/usbh__midi_8h__dep__incl.md5 index 01b93705..62ce47bb 100644 --- a/usbh__midi_8h__dep__incl.md5 +++ b/usbh__midi_8h__dep__incl.md5 @@ -1 +1 @@ -18f93b1f2050edc3fe7a66994353dd64 \ No newline at end of file +f5ec6a50010cd002e2eafb0d5a54ad6a \ No newline at end of file diff --git a/usbh__midi_8h__dep__incl.png b/usbh__midi_8h__dep__incl.png index de24bf5e72c8d1090cd0a40304f5f061e6fb54b7..25f1fe167acce3b043669f634ac150b184649f52 100644 GIT binary patch literal 3725 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 aT=+M%o-Er7k1qr7OOTSBx@?IIJm^2OR6e@^ literal 3798 zcmdUy=Q|r-*vDfuF>1F}v5Od0dla#i(w``$R*@J{Tdj%_dz7NuQbml8D56%SiXezq ziM`dVQG4%bpFHoLf8n{W>+BcjI_Emy`};Z1?!$~&n7~W`0D#5#u7L%$4WSkv1|YQ# z!eEZKzvq-bMP?8HLv3w)HI)sxE3in=mv zAKaJy0&07uT0%* zTw2P={|WA&9i9ibpr>mmxDgCDOdW@G%vmZA?;fwz0F|l)_!+@AEI1?Oxe;F?iYeRT z!GpA1Wv{l0!9uBF-3q(9=hT2B^ayQsFyKblEAi6$`kc<^Jo?rS!C9}2f~T20i;9Y( zA*Q(oB`{1t2a%)d<$mPxv{7berb1~Yld}I`3JN&t!8M5rD65t$t&CyeD#}kOjS2og zBimasnqdbLk$wof1S?U zs%vd3Bmu9{{GXob%JQ3%NgynFM>0b%vkp4by!1Es zpn^jWETSbNla4-H6)$sWR0#xYhA9Pa&tM8r%RH0SE+BHQa;pCh4Zy|4MG^u@T%Q+m z-COMXf+T~_j%TAvpKi}Y$Z=l1N?MX5Q4g||rlC_PhoBAq(_j3^!zpZ4tl{El%42=B z0@^+K)z2&r$nviALCK!bx20_R$3I_729cG=`pYYuP0XOX^l^!FvBxvv88tOEpUmGI zN@sX)BnhI6dV2l~`*(5d_OR6Jj@vC#2STq@vh%;jpj8XW%oj3}lJiY!fy@0bg!Lb< z4t{LH$~>y?ha!j@G-9Hn{qBX4hUZ6{@3))J)Ax7Wsa@P3v3uEa_h-@P6}AsYSte({ zcyJN+do{kmiL~k=8`s%{^0(laj+oX&7Tz2ZDU};_Us&Fy^D`Ap&695L#_d-g5z*9Qj& zL)r0<2V$pKIuA@xdYM*x{$UjXaQOzYG_Z2Y*a)IM(fr@vi&g5oC;=`_iCj^Jw41_Aw9B4(H^|$I-#ew(QYbGs+_-XZ!ha} z^Dv#8l@z$%zRdw^=oR)NywT-&CFvUobWQ>N`D-$czJw z2}V&e-9VpgxDn~oLeUdVs6fZ<`Nd+k^|4Ae2`0QzDz_|_LZL)2S!I<5b+&C>=DYo3 z7S?)B%1!2B)Z^hRp^9vXtUB9+Wp(uFE6`m1I*a~2AvvSV35Dg%X+@r~j~c2nET3(D zoyAtWd>`yg<3$~5T^tO33E8yMelj=TKCwPocT>Y2eYH$NL@$R_)bg?3nZ)#P>u1(Y zegZzO z0AgzFtKTdQr*BxZ^41?++vo|9in9WtG?j#39B&ab9CSDlTh9gZ<5Qg>S- z{%p--1(k8a%S|}smc|P`Z&<8BJuWqt(6Hdb8>}a5fDcQYA1e+b3*oQ1a5!#@& zvC2Y=VoSM<=kcocdY3MNEUT=0AFOGOC-QB&JUK|R_J{Sl#a%TBCOr8)*nz$sI}`ae zZw)Jj(S|MW+|U)M1P(;kMoNQ2*Gfxb=j;h(A3pMbXlkmEwhRiAT^n5LToWsz_4v!> zwXs0b=!lXTUNo~9WWD5xLrZJ2c^f~|H8x&#K9yKDb9M%|IFzC9TYfeu0I7(%Ri5Zg zUV7lArncfSg}*>fma9^yB^hBuS-x$eF2Hci=Y#P$&0EqcWp;m~vdrIVbR^`GE$3kr<3CGv&T_40N3xF!}@)%m54MZ-%H(it28;y=R z!J@Hp?Ig4!C-!uu@HpAe=gMgoO02!M_4A`|MiB|5zum$%UgqD+7j5BOoED^($no|> z*&(83covj#V|8e}9GSXpJJC13u)t|zd|G&tyPl=_`HjwzXw}4o_)n#FPMzq+sDH+9 z4~9nurZE0%YDZP0%129Yev@pU+&ViLS|R%m<81XKSdR9}?5&jxKW@X)PPXbw?;y$Rftzh3I!?sP6ka)-J>Q2 z^?qYp&sTKr!RBAR?aTwGj?DORRYlwA-;D^eY<_&r0gB!QVbfM+q7vspu^ zU8)DC0Ow$wkYRt|=vct;!@n0l#lX5Dgs$!a$tHC|H94>`pyX7TE|nvLaOE|G(Hz6x3;yCet=>R& znNpYU>6Tx89l+Y?CL9DUdd5j2k)DkE8U$_4wrC5tRex|opC*Xtex)Y;bs+}SC#uUUp2O}LX+aR1903+#)@c9GM;V*}ANbfEx*Bvq@oK%zixdL03!$1l{zeH%Ab zz^cA{!a!)-TM>f0*%Bo&;76-71fgWdsQ5s@IGt)ah8Y56nssWjg9%0+aOlPq<>&M5 z=CyI;&rof&un53zT>h|PA^JFH696!BC$cZ<<{#s5(z%-9D&Lc53E`^z(9rvolLM1n zt;hxswET+?6u+ijVAAF9f%o3XEbUCx5OiuCvI#qF%zTVsMAxo25(y#a$j55^!t!@ST1IgS+jqq4o8@$o z1S&<0vy0>pX@(yu6-4YA>+^;4EHL!2Gbzyj>0Bn~oqnSOvF7wW(}f@W8HgLY5lRpS z#@MPv{f&6<&=`W8+%lA?x#Cpp4P(|J8yQHbx^!pX$~V+#XMNML}UR=Ag{1J<-IlV$>j;uy0bE&9S z(awPsr5NwAAq5$*Eyk}PHOZz;Beq^c*fiTwoUP($THP<{pinM_sy|nLlu6(Mof&rR zVkzpB&o{_wRNUsxX?lmm3nSWspKeZy>0w2y1BpCVloI_U)+QJ%PbG~o_TDIC z@ZFtMT9X)_1m!F1&Ot#+b$+vsl-9!%=QO69ZVt~sO-Y0Qf->#M%J}(b;{*dRP>NiK=z(Df}PljcO9Gc)iqP*6}X!*w)`$@Muo-01-1j2H&9kqf1d zu{MmNcz}PCf`U;4t_d{_q};VZxgn;6uKaUh?j`~k=@t*Soi|L|g>=*LzSF#Y?Z%q0 zC$V(z4Mmt8U_14b6ETwE#E|HscCLCmqgT5y7gy4{??A@IIcc@=f~4G7?b8IGyBIi7 z`E_wNTQPg_>G1ajkq2IJn`-JGGFGqC?A=>%*HQo)ti$H`lIE+RAQ%0MnFf>$7xO_0 zkCej8rSNoyk7`V#^`SQq={c!lKM@ZXc4w;ZyN*jBO6q7T-Di*$XubPFq3eTL+iYNN z`n6?uqBa~`;FZ3o$L6S-mlu>wgJZ})8+ad!-`R1q`u045#93rnfho4B&&%*ccIF{6 zd}mPm3zU+Nt72sR{{2Nw*ZSl?t7wX;oTLjnI}ppw&v&(zVv844(Pb4<9qpHgh(aLI z^9`u%%{$`ak_Jq_J`qYZRLS8xQ9n^Hj6=Y zY^>PdkinQv;`#)qWMiVzW(_qh6OVd*z+T?Mf<5xKm{^2Wl^fiq-aogmPtU5xOIYRA zNsPLtx3}~$X)fafwS~;HKK$jy>Ce==c3%(~a`!!E6=>h`EFp`n;eq-TC>Ix((HuB? zrVc~W%hc1|nbh;sJp(>@j~s(6)iQ;@mzOTRDUvazfBppWss<|*O1Vu+ZH?qIQVZ?o zy34QCC$^kqMKl2U5|17sn|A-fw>Zg1|*3h|;|2R)SQ#UQ3 zW)T3hRFUB={G|4YBnzEQn7;=Cy*iR-OR_ z0*o=Jw6lG<_fD7rAZ<^P$+spw--hDF$R1%kWBCrj`99i&fhhU1ts2K}+d*jX64Guz zTRVO-C%&6&lc$=J6v4Wnf^9s4ZzGVWA}|->=L|{i}uI zc!5b|Ww`K!&EYqdfXkq{up#OpQ5GT9zUlUBNs>&^r_!A?yc`^wl2+gF44k(WNVXK^ ze%nYS*9yO~e+;va1aw~wlxtP_!cDdP31Gr&V@SCFrqmnvnX1_N##i|`&u4@Q6*>(A z@`=zT-9@^l$qZ@OcePPDbYX=}>;2v3!tFV^1OyP~#nujut4kfx;hb!ks*~Lr6Km^_ zxQX?uyG#+wKjQQ0*>4Obh-yzF!cp7Jq11O&OGP>ed8orRH={-4=5`vjU`WnMB&XRa zY0hs?(9iPt?BaB9N(S)B{5`MW!KVkP*0r>e+(+E~&jKJAMZKjC_dsObn=93Agi}xQ zH8z$Yh?IF#sc6%ev;0N3l2^d*RE?2(D^FY3lH~4|sA3`_3e;X7^0$czaaA(J@yfn$ zpyX<7f`$RCilfE)@1r%f;)T7J+M@{RkQ4s~TQJ83XYxJ;7|JDX!3L%;SD@lzH3&!m zva>(^J!I3y$Uyws(9&$qbk%gnThgh7BXu3ru%+O)mE2gol=YljvM#Ry#GI%0uXI3q ziXHU3+~QK-pde!xh81TiLRL8sb{s9ouWk;iy{Wc({%|?r>azW&H({&W?BmTG<|> zC4FHE4yP4Bdf@Y7uRBS;$6qGv!=?X#Qm(wamBv)<)-RjNkJ6I=TB>NAoK|o0$rhQ* zc^{a#f3U16?4PQ*axQ(Ent?`_98K71Na%;X4y+RUq7j+b(?keO&WN59%&g+`KIi8` z##vPoOXA;l__!(4MugLtM6z7#k#mmVJ8@ZzY54UTGK+cy`NiT=B}TV!L#)zJj-hX& z<2s6-zTfX~7wh1Pe)5DDa#309;n^8lVpGqir8&AF7{?=%|f#^<%Snm9E*RSHxS&59+=f z;ghHtLrPVklQmVY6I}Xj*6MG+m&X$?BjsnstHkNJjeOI32d{L0|Gv^l*)7rpa$L6z zdoeCC+r{t6MIdaIs=RU=jPs@xLxX_BjTd)&0Gt1IDh=QkjlVMr+kxSnk8N!~)w8bBs8)6lu1bwSnT)Xgf#bvkxRlW|9M$T83z=IM87sNsz)8>-FT_h zoB05h=(5j&m^fz|fhLai8`GeuxK_qMyt&R@KIX|l@6SUs6@;lo{4J9_!?`*?96#Tv zz!+@GWv=M4JepTb(*rtG-R_3s6Nyg|=@KY-^q1$_?O3vY zV!-fIdsTo61fP}n zN`-M3cZI3E{+kws*HFIL{F$#O;yZ+g#wi(k8u1}rWnITj#T5r?Mao56(Bdf~biBlk zTYu82Zl72bI5|2Fz2}77R8+*Z&{Fz-nbJ6C-%3bZF^c2E$Y5hW167y{6*oS&ju+cJ zavoH=D*ZH3u{CT=1HGZ7qLNuK_VhoD8aA}nabxH+Q(K&Xvh;O*CIjGTM{rU~N@q^K z5yg{Q5c3%|ElbX7Z>q9ygNcbrCPt$$kr3DG?OAcJTjN+TXdz7*)Z1OzbWMRHO!!vF zawqe6Z)wh2G~-v2{f0`~j_Vk46~wZM&0b4MOl&m}(DpO%1#=xnt!z& zWnbic=orDWc5fxxr|>T6QsJN3g@L==G!ZA_^wQT2E9T(nzK5fZZxTUCl(I9KgXS;) zu<5UOF82X89{<~~fJhvMxTuQVl#{D!Poy>`WM|W>Ss&$|9i`?rG5u9rnyLOSaT))1 x<7aPjG)-3PcB2m*d&+Y@O6JJl58C_dIrdaN!f+v>f&5!jz_s)>i(&TY{{fqlogV-I literal 2905 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 svKTqCkOiXN - + + USB Host Shield 2.0: usbh_midi.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    usbh_midi.h
    -Go to the documentation of this file.
    1 /*
    2  *******************************************************************************
    3  * USB-MIDI class driver for USB Host Shield 2.0 Library
    4  * Copyright (c) 2012-2016 Yuuichi Akagawa
    5  *
    6  * Idea from LPK25 USB-MIDI to Serial MIDI converter
    7  * by Collin Cunningham - makezine.com, narbotic.com
    8  *
    9  * for use with USB Host Shield 2.0 from Circuitsathome.com
    10  * https://github.com/felis/USB_Host_Shield_2.0
    11  *******************************************************************************
    12  * This program is free software; you can redistribute it and/or modify
    13  * it under the terms of the GNU General Public License as published by
    14  * the Free Software Foundation; either version 2 of the License, or
    15  * (at your option) any later version.
    16  *
    17  * This program is distributed in the hope that it will be useful,
    18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    20  * GNU General Public License for more details.
    21  *
    22  * You should have received a copy of the GNU General Public License
    23  * along with this program. If not, see <http://www.gnu.org/licenses/>
    24  *******************************************************************************
    25  */
    26 
    27 #if !defined(_USBH_MIDI_H_)
    28 #define _USBH_MIDI_H_
    29 #include "Usb.h"
    30 
    31 #define MIDI_MAX_ENDPOINTS 5 //endpoint 0, bulk_IN(MIDI), bulk_OUT(MIDI), bulk_IN(VSP), bulk_OUT(VSP)
    32 #define USB_SUBCLASS_MIDISTREAMING 3
    33 #define DESC_BUFF_SIZE 256
    34 #define MIDI_EVENT_PACKET_SIZE 64
    35 class USBH_MIDI;
    36 
    37 class USBH_MIDI : public USBDeviceConfig
    38 {
    39 private:
    40  uint8_t lookupMsgSize(uint8_t midiMsg);
    41 
    42 protected:
    43  static const uint8_t epDataInIndex; // DataIn endpoint index(MIDI)
    44  static const uint8_t epDataOutIndex; // DataOUT endpoint index(MIDI)
    45  static const uint8_t epDataInIndexVSP; // DataIn endpoint index(Vendor Specific Protocl)
    46  static const uint8_t epDataOutIndexVSP; // DataOUT endpoint index(Vendor Specific Protocl)
    47 
    48  /* mandatory members */
    50  uint8_t bAddress;
    51  uint8_t bConfNum; // configuration number
    52  uint8_t bNumEP; // total number of EP in the configuration
    54 
    56  /* Endpoint data structure */
    58  /* MIDI Event packet buffer */
    60  uint8_t readPtr;
    61 
    62  void parseConfigDescr(byte addr, byte conf);
    63  unsigned int countSysExDataSize(uint8_t *dataptr);
    64 #ifdef DEBUG_USB_HOST
    65  void PrintEndpointDescriptor( const USB_ENDPOINT_DESCRIPTOR* ep_ptr );
    66 #endif
    67 public:
    68  uint16_t pid, vid;
    69  USBH_MIDI(USB *p);
    70  // Methods for recieving and sending data
    71  uint8_t RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr);
    72  uint8_t RecvData(uint8_t *outBuf);
    73  uint8_t SendData(uint8_t *dataptr, byte nCable=0);
    74  uint8_t SendSysEx(uint8_t *dataptr, unsigned int datasize, byte nCable=0);
    75  // backward compatibility functions
    76  inline uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr){ return RecvData(bytes_rcvd, dataptr); };
    77  inline uint8_t RcvData(uint8_t *outBuf){ return RecvData(outBuf); };
    78 
    79  // USBDeviceConfig implementation
    80  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    81  virtual uint8_t Release();
    82  virtual uint8_t GetAddress() { return bAddress; };
    83 };
    84 
    85 #endif //_USBH_MIDI_H_
    static const uint8_t epDataInIndexVSP
    Definition: usbh_midi.h:45
    +Go to the documentation of this file.
    1 /*
    2  *******************************************************************************
    3  * USB-MIDI class driver for USB Host Shield 2.0 Library
    4  * Copyright (c) 2012-2018 Yuuichi Akagawa
    5  *
    6  * Idea from LPK25 USB-MIDI to Serial MIDI converter
    7  * by Collin Cunningham - makezine.com, narbotic.com
    8  *
    9  * for use with USB Host Shield 2.0 from Circuitsathome.com
    10  * https://github.com/felis/USB_Host_Shield_2.0
    11  *******************************************************************************
    12  * This program is free software; you can redistribute it and/or modify
    13  * it under the terms of the GNU General Public License as published by
    14  * the Free Software Foundation; either version 2 of the License, or
    15  * (at your option) any later version.
    16  *
    17  * This program is distributed in the hope that it will be useful,
    18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    20  * GNU General Public License for more details.
    21  *
    22  * You should have received a copy of the GNU General Public License
    23  * along with this program. If not, see <http://www.gnu.org/licenses/>
    24  *******************************************************************************
    25  */
    26 
    27 #if !defined(_USBH_MIDI_H_)
    28 #define _USBH_MIDI_H_
    29 //#define DEBUG_USB_HOST
    30 #include "Usb.h"
    31 
    32 #define MIDI_MAX_ENDPOINTS 5 //endpoint 0, bulk_IN(MIDI), bulk_OUT(MIDI), bulk_IN(VSP), bulk_OUT(VSP)
    33 #define USB_SUBCLASS_MIDISTREAMING 3
    34 #define DESC_BUFF_SIZE 256
    35 #define MIDI_EVENT_PACKET_SIZE 64
    36 #define MIDI_MAX_SYSEX_SIZE 256
    37 class USBH_MIDI;
    38 
    39 class USBH_MIDI : public USBDeviceConfig
    40 {
    41 protected:
    42  static const uint8_t epDataInIndex; // DataIn endpoint index(MIDI)
    43  static const uint8_t epDataOutIndex; // DataOUT endpoint index(MIDI)
    44  static const uint8_t epDataInIndexVSP; // DataIn endpoint index(Vendor Specific Protocl)
    45  static const uint8_t epDataOutIndexVSP; // DataOUT endpoint index(Vendor Specific Protocl)
    46 
    47  /* mandatory members */
    49  uint8_t bAddress;
    50  uint8_t bConfNum; // configuration number
    51  uint8_t bNumEP; // total number of EP in the configuration
    54  uint16_t pid, vid; // ProductID, VendorID
    56  /* Endpoint data structure */
    58  /* MIDI Event packet buffer */
    60  uint8_t readPtr;
    61 
    62  uint8_t parseConfigDescr(uint8_t addr, uint8_t conf);
    63  uint16_t countSysExDataSize(uint8_t *dataptr);
    64  void setupDeviceSpecific();
    65 #ifdef DEBUG_USB_HOST
    66  void PrintEndpointDescriptor( const USB_ENDPOINT_DESCRIPTOR* ep_ptr );
    67 #endif
    68 public:
    69  USBH_MIDI(USB *p);
    70  // Misc functions
    71  operator bool() { return (pUsb->getUsbTaskState()==USB_STATE_RUNNING); }
    72  uint16_t idVendor() { return vid; }
    73  uint16_t idProduct() { return pid; }
    74  // Methods for recieving and sending data
    75  uint8_t RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr);
    76  uint8_t RecvData(uint8_t *outBuf, bool isRaw=false);
    77  uint8_t RecvRawData(uint8_t *outBuf);
    78  uint8_t SendData(uint8_t *dataptr, uint8_t nCable=0);
    79  uint8_t lookupMsgSize(uint8_t midiMsg, uint8_t cin=0);
    80  uint8_t SendSysEx(uint8_t *dataptr, uint16_t datasize, uint8_t nCable=0);
    81  uint8_t extractSysExData(uint8_t *p, uint8_t *buf);
    82  uint8_t SendRawData(uint16_t bytes_send, uint8_t *dataptr);
    83  // backward compatibility functions
    84  inline uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) { return RecvData(bytes_rcvd, dataptr); };
    85  inline uint8_t RcvData(uint8_t *outBuf) { return RecvData(outBuf); };
    86 
    87  // USBDeviceConfig implementation
    88  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    89  virtual uint8_t Release();
    90  virtual uint8_t GetAddress() { return bAddress; };
    91 };
    92 #endif //_USBH_MIDI_H_
    uint8_t SendSysEx(uint8_t *dataptr, uint16_t datasize, uint8_t nCable=0)
    Definition: usbh_midi.cpp:556
    +
    static const uint8_t epDataInIndexVSP
    Definition: usbh_midi.h:44
    +
    uint8_t bTransferTypeMask
    Definition: usbh_midi.h:55
    uint8_t readPtr
    Definition: usbh_midi.h:60
    -
    uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: usbh_midi.h:76
    - -
    uint8_t RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: usbh_midi.cpp:321
    - -
    uint16_t vid
    Definition: usbh_midi.h:68
    -
    virtual uint8_t GetAddress()
    Definition: usbh_midi.h:82
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbh_midi.cpp:110
    - +
    uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: usbh_midi.h:84
    + +
    uint8_t RecvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: usbh_midi.cpp:357
    + +
    uint16_t vid
    Definition: usbh_midi.h:54
    +
    virtual uint8_t GetAddress()
    Definition: usbh_midi.h:90
    +
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbh_midi.cpp:108
    + -
    USB * pUsb
    Definition: usbh_midi.h:49
    -
    void parseConfigDescr(byte addr, byte conf)
    Definition: usbh_midi.cpp:240
    -
    static const uint8_t epDataOutIndexVSP
    Definition: usbh_midi.h:46
    -
    uint8_t bNumEP
    Definition: usbh_midi.h:52
    -
    uint8_t bAddress
    Definition: usbh_midi.h:50
    -
    Definition: address.h:32
    -
    uint16_t pid
    Definition: usbh_midi.h:68
    -
    virtual uint8_t Release()
    Definition: usbh_midi.cpp:310
    -
    bool isMidiFound
    Definition: usbh_midi.h:55
    -
    unsigned int countSysExDataSize(uint8_t *dataptr)
    Definition: usbh_midi.cpp:487
    -
    bool bPollEnable
    Definition: usbh_midi.h:53
    +
    USB * pUsb
    Definition: usbh_midi.h:48
    +
    uint8_t SendRawData(uint16_t bytes_send, uint8_t *dataptr)
    Definition: usbh_midi.cpp:613
    +
    uint16_t countSysExDataSize(uint8_t *dataptr)
    Definition: usbh_midi.cpp:532
    +
    static const uint8_t epDataOutIndexVSP
    Definition: usbh_midi.h:45
    +
    void setupDeviceSpecific()
    Definition: usbh_midi.cpp:345
    +
    #define USB_STATE_RUNNING
    Definition: UsbCore.h:129
    +
    uint8_t bNumEP
    Definition: usbh_midi.h:51
    +
    uint8_t bAddress
    Definition: usbh_midi.h:49
    +
    Definition: address.h:39
    +
    uint16_t pid
    Definition: usbh_midi.h:54
    +
    virtual uint8_t Release()
    Definition: usbh_midi.cpp:334
    +
    uint8_t RecvRawData(uint8_t *outBuf)
    Definition: usbh_midi.cpp:411
    +
    bool isMidiFound
    Definition: usbh_midi.h:53
    +
    bool bPollEnable
    Definition: usbh_midi.h:52
    USBH_MIDI(USB *p)
    Definition: usbh_midi.cpp:87
    -
    static const uint8_t epDataInIndex
    Definition: usbh_midi.h:43
    -
    #define MIDI_EVENT_PACKET_SIZE
    Definition: usbh_midi.h:34
    -
    uint8_t SendData(uint8_t *dataptr, byte nCable=0)
    Definition: usbh_midi.cpp:373
    +
    uint16_t idProduct()
    Definition: usbh_midi.h:73
    +
    static const uint8_t epDataInIndex
    Definition: usbh_midi.h:42
    +
    #define MIDI_EVENT_PACKET_SIZE
    Definition: usbh_midi.h:35
    +
    uint8_t lookupMsgSize(uint8_t midiMsg, uint8_t cin=0)
    Definition: usbh_midi.cpp:481
    uint8_t recvBuf[MIDI_EVENT_PACKET_SIZE]
    Definition: usbh_midi.h:59
    -
    uint8_t bConfNum
    Definition: usbh_midi.h:51
    +
    uint8_t getUsbTaskState(void)
    Definition: Usb.cpp:43
    +
    uint8_t bConfNum
    Definition: usbh_midi.h:50
    EpInfo epInfo[MIDI_MAX_ENDPOINTS]
    Definition: usbh_midi.h:57
    -
    uint8_t RcvData(uint8_t *outBuf)
    Definition: usbh_midi.h:77
    -
    static const uint8_t epDataOutIndex
    Definition: usbh_midi.h:44
    -
    #define MIDI_MAX_ENDPOINTS
    Definition: usbh_midi.h:31
    -
    Definition: UsbCore.h:197
    -
    uint8_t SendSysEx(uint8_t *dataptr, unsigned int datasize, byte nCable=0)
    Definition: usbh_midi.cpp:511
    +
    uint16_t idVendor()
    Definition: usbh_midi.h:72
    +
    uint8_t RcvData(uint8_t *outBuf)
    Definition: usbh_midi.h:85
    +
    uint8_t extractSysExData(uint8_t *p, uint8_t *buf)
    Definition: usbh_midi.cpp:619
    +
    uint8_t SendData(uint8_t *dataptr, uint8_t nCable=0)
    Definition: usbh_midi.cpp:417
    +
    static const uint8_t epDataOutIndex
    Definition: usbh_midi.h:43
    +
    #define MIDI_MAX_ENDPOINTS
    Definition: usbh_midi.h:32
    +
    uint8_t parseConfigDescr(uint8_t addr, uint8_t conf)
    Definition: usbh_midi.cpp:253
    +
    Definition: UsbCore.h:208
    diff --git a/usbhid_8cpp.html b/usbhid_8cpp.html index bb15a794..4a931770 100644 --- a/usbhid_8cpp.html +++ b/usbhid_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhid.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    diff --git a/usbhid_8cpp__incl.md5 b/usbhid_8cpp__incl.md5 index dce4b596..2d07327c 100644 --- a/usbhid_8cpp__incl.md5 +++ b/usbhid_8cpp__incl.md5 @@ -1 +1 @@ -cb0939c5d3af83b28c75aafcf262109b \ No newline at end of file +88b391b4223f85557dbb3c537e743b14 \ No newline at end of file diff --git a/usbhid_8cpp__incl.png b/usbhid_8cpp__incl.png index b536c9b7c7c8dd9cc230a48c39898e47c003ab40..90a95206f4d7dd683a77acc08bfabd35d0b4e0fd 100644 GIT binary patch literal 9436 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 bC6EM>F(}eZuHOi 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 diff --git a/usbhid_8cpp_source.html b/usbhid_8cpp_source.html index d40fa83c..d880e4c0 100644 --- a/usbhid_8cpp_source.html +++ b/usbhid_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhid.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    USB * pUsb
    Definition: usbhid.h:145
    #define HID_REQUEST_SET_PROTOCOL
    Definition: usbhid.h:74
    uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)
    Definition: usbhid.cpp:34
    - - - + + +
    uint8_t GetProtocol(uint8_t iface, uint8_t *dataptr)
    Definition: usbhid.cpp:70
    -
    #define USB_REQUEST_GET_DESCRIPTOR
    Definition: usb_ch9.h:37
    -
    uint8_t bLength
    Definition: usb_ch9.h:152
    +
    #define USB_REQUEST_GET_DESCRIPTOR
    Definition: usb_ch9.h:44
    +
    uint8_t bLength
    Definition: usb_ch9.h:159
    #define bmREQ_HID_OUT
    Definition: usbhid.h:63
    #define bmREQ_HID_REPORT
    Definition: usbhid.h:65
    void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)
    Definition: usbhid.cpp:90
    uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhid.cpp:54
    -
    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
    +
    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:133
    uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)
    Definition: usbhid.cpp:62
    -
    #define Notify(...)
    Definition: message.h:44
    - - +
    #define Notify(...)
    Definition: message.h:51
    + +
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: usbhid.cpp:74
    -
    uint16_t wDescriptorLength
    Definition: usb_ch9.h:158
    +
    uint16_t wDescriptorLength
    Definition: usb_ch9.h:165
    uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)
    Definition: usbhid.cpp:58
    -
    uint8_t bCountryCode
    Definition: usb_ch9.h:155
    +
    uint8_t bCountryCode
    Definition: usb_ch9.h:162
    uint8_t bAddress
    Definition: usbhid.h:146
    -
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    -
    uint8_t bNumDescriptors
    Definition: usb_ch9.h:156
    -
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:144
    - -
    uint8_t bDescriptorType
    Definition: usb_ch9.h:153
    -
    #define PSTR(str)
    - +
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:153
    +
    uint8_t bNumDescriptors
    Definition: usb_ch9.h:163
    +
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:151
    + +
    uint8_t bDescriptorType
    Definition: usb_ch9.h:160
    +
    #define PSTR(str)
    +
    uint8_t SetProtocol(uint8_t iface, uint8_t protocol)
    Definition: usbhid.cpp:66
    #define HID_REQUEST_GET_IDLE
    Definition: usbhid.h:70
    @@ -129,15 +109,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #define HID_DESCRIPTOR_REPORT
    Definition: usbhid.h:78
    #define HID_REQUEST_SET_REPORT
    Definition: usbhid.h:72
    #define HID_REQUEST_GET_REPORT
    Definition: usbhid.h:69
    -
    uint16_t bcdHID
    Definition: usb_ch9.h:154
    -
    uint8_t bDescrType
    Definition: usb_ch9.h:157
    +
    uint16_t bcdHID
    Definition: usb_ch9.h:161
    +
    uint8_t bDescrType
    Definition: usb_ch9.h:164
    #define HID_REQUEST_GET_PROTOCOL
    Definition: usbhid.h:71
    diff --git a/usbhid_8h.html b/usbhid_8h.html index ad48bade..5a7ea2cc 100644 --- a/usbhid_8h.html +++ b/usbhid_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhid.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    - - - - - - - + + + + + + + - + @@ -296,7 +276,9 @@ Macros  

    Macro Definition Documentation

    - + +

    ◆ MAX_REPORT_PARSERS

    +
    @@ -306,11 +288,13 @@ Macros
    -

    Definition at line 23 of file usbhid.h.

    +

    Definition at line 23 of file usbhid.h.

    - + +

    ◆ HID_MAX_HID_CLASS_DESCRIPTORS

    +
    @@ -320,11 +304,13 @@ Macros
    -

    Definition at line 24 of file usbhid.h.

    +

    Definition at line 24 of file usbhid.h.

    - + +

    ◆ DATA_SIZE_MASK

    +
    @@ -334,11 +320,13 @@ Macros
    -

    Definition at line 26 of file usbhid.h.

    +

    Definition at line 26 of file usbhid.h.

    - + +

    ◆ TYPE_MASK

    +
    @@ -348,11 +336,13 @@ Macros
    -

    Definition at line 27 of file usbhid.h.

    +

    Definition at line 27 of file usbhid.h.

    - + +

    ◆ TAG_MASK

    +
    @@ -362,11 +352,13 @@ Macros
    -

    Definition at line 28 of file usbhid.h.

    +

    Definition at line 28 of file usbhid.h.

    - + +

    ◆ DATA_SIZE_0

    +
    @@ -376,11 +368,13 @@ Macros
    -

    Definition at line 30 of file usbhid.h.

    +

    Definition at line 30 of file usbhid.h.

    - + +

    ◆ DATA_SIZE_1

    +
    @@ -390,11 +384,13 @@ Macros
    -

    Definition at line 31 of file usbhid.h.

    +

    Definition at line 31 of file usbhid.h.

    - + +

    ◆ DATA_SIZE_2

    +
    @@ -404,11 +400,13 @@ Macros
    -

    Definition at line 32 of file usbhid.h.

    +

    Definition at line 32 of file usbhid.h.

    - + +

    ◆ DATA_SIZE_4

    +
    @@ -418,11 +416,13 @@ Macros
    -

    Definition at line 33 of file usbhid.h.

    +

    Definition at line 33 of file usbhid.h.

    - + +

    ◆ TYPE_MAIN

    +
    @@ -432,11 +432,13 @@ Macros
    -

    Definition at line 35 of file usbhid.h.

    +

    Definition at line 35 of file usbhid.h.

    - + +

    ◆ TYPE_GLOBAL

    +
    @@ -446,11 +448,13 @@ Macros
    -

    Definition at line 36 of file usbhid.h.

    +

    Definition at line 36 of file usbhid.h.

    - + +

    ◆ TYPE_LOCAL

    +
    @@ -460,11 +464,13 @@ Macros
    -

    Definition at line 37 of file usbhid.h.

    +

    Definition at line 37 of file usbhid.h.

    - + +

    ◆ TAG_MAIN_INPUT

    +
    @@ -474,11 +480,13 @@ Macros
    -

    Definition at line 39 of file usbhid.h.

    +

    Definition at line 39 of file usbhid.h.

    - + +

    ◆ TAG_MAIN_OUTPUT

    +
    @@ -488,11 +496,13 @@ Macros
    -

    Definition at line 40 of file usbhid.h.

    +

    Definition at line 40 of file usbhid.h.

    - + +

    ◆ TAG_MAIN_COLLECTION

    +
    @@ -502,11 +512,13 @@ Macros
    -

    Definition at line 41 of file usbhid.h.

    +

    Definition at line 41 of file usbhid.h.

    - + +

    ◆ TAG_MAIN_FEATURE

    +
    @@ -516,11 +528,13 @@ Macros
    -

    Definition at line 42 of file usbhid.h.

    +

    Definition at line 42 of file usbhid.h.

    - + +

    ◆ TAG_MAIN_ENDCOLLECTION

    +
    @@ -530,11 +544,13 @@ Macros
    -

    Definition at line 43 of file usbhid.h.

    +

    Definition at line 43 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_USAGEPAGE

    +
    @@ -544,11 +560,13 @@ Macros
    -

    Definition at line 45 of file usbhid.h.

    +

    Definition at line 45 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_LOGICALMIN

    +
    @@ -558,11 +576,13 @@ Macros
    -

    Definition at line 46 of file usbhid.h.

    +

    Definition at line 46 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_LOGICALMAX

    +
    @@ -572,11 +592,13 @@ Macros
    -

    Definition at line 47 of file usbhid.h.

    +

    Definition at line 47 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_PHYSMIN

    +
    @@ -586,11 +608,13 @@ Macros
    -

    Definition at line 48 of file usbhid.h.

    +

    Definition at line 48 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_PHYSMAX

    +
    @@ -600,11 +624,13 @@ Macros
    -

    Definition at line 49 of file usbhid.h.

    +

    Definition at line 49 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_UNITEXP

    +
    @@ -614,11 +640,13 @@ Macros
    -

    Definition at line 50 of file usbhid.h.

    +

    Definition at line 50 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_UNIT

    +
    @@ -628,11 +656,13 @@ Macros
    -

    Definition at line 51 of file usbhid.h.

    +

    Definition at line 51 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_REPORTSIZE

    +
    @@ -642,11 +672,13 @@ Macros
    -

    Definition at line 52 of file usbhid.h.

    +

    Definition at line 52 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_REPORTID

    +
    @@ -656,11 +688,13 @@ Macros
    -

    Definition at line 53 of file usbhid.h.

    +

    Definition at line 53 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_REPORTCOUNT

    +
    @@ -670,11 +704,13 @@ Macros
    -

    Definition at line 54 of file usbhid.h.

    +

    Definition at line 54 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_PUSH

    +
    @@ -684,11 +720,13 @@ Macros
    -

    Definition at line 55 of file usbhid.h.

    +

    Definition at line 55 of file usbhid.h.

    - + +

    ◆ TAG_GLOBAL_POP

    +
    @@ -698,11 +736,13 @@ Macros
    -

    Definition at line 56 of file usbhid.h.

    +

    Definition at line 56 of file usbhid.h.

    - + +

    ◆ TAG_LOCAL_USAGE

    +
    @@ -712,11 +752,13 @@ Macros
    -

    Definition at line 58 of file usbhid.h.

    +

    Definition at line 58 of file usbhid.h.

    - + +

    ◆ TAG_LOCAL_USAGEMIN

    +
    @@ -726,11 +768,13 @@ Macros
    -

    Definition at line 59 of file usbhid.h.

    +

    Definition at line 59 of file usbhid.h.

    - + +

    ◆ TAG_LOCAL_USAGEMAX

    +
    @@ -740,11 +784,13 @@ Macros
    -

    Definition at line 60 of file usbhid.h.

    +

    Definition at line 60 of file usbhid.h.

    - + +

    ◆ bmREQ_HID_OUT

    +
    @@ -754,11 +800,13 @@ Macros
    -

    Definition at line 63 of file usbhid.h.

    +

    Definition at line 63 of file usbhid.h.

    - + +

    ◆ bmREQ_HID_IN

    +
    @@ -768,11 +816,13 @@ Macros
    -

    Definition at line 64 of file usbhid.h.

    +

    Definition at line 64 of file usbhid.h.

    - + +

    ◆ bmREQ_HID_REPORT

    +
    @@ -782,11 +832,13 @@ Macros
    -

    Definition at line 65 of file usbhid.h.

    +

    Definition at line 65 of file usbhid.h.

    - + +

    ◆ HID_REQUEST_GET_REPORT

    +
    @@ -796,11 +848,13 @@ Macros
    -

    Definition at line 69 of file usbhid.h.

    +

    Definition at line 69 of file usbhid.h.

    - + +

    ◆ HID_REQUEST_GET_IDLE

    +
    @@ -810,11 +864,13 @@ Macros
    -

    Definition at line 70 of file usbhid.h.

    +

    Definition at line 70 of file usbhid.h.

    - + +

    ◆ HID_REQUEST_GET_PROTOCOL

    +
    @@ -824,11 +880,13 @@ Macros
    -

    Definition at line 71 of file usbhid.h.

    +

    Definition at line 71 of file usbhid.h.

    - + +

    ◆ HID_REQUEST_SET_REPORT

    +
    @@ -838,11 +896,13 @@ Macros
    -

    Definition at line 72 of file usbhid.h.

    +

    Definition at line 72 of file usbhid.h.

    - + +

    ◆ HID_REQUEST_SET_IDLE

    +
    @@ -852,11 +912,13 @@ Macros
    -

    Definition at line 73 of file usbhid.h.

    +

    Definition at line 73 of file usbhid.h.

    - + +

    ◆ HID_REQUEST_SET_PROTOCOL

    +
    @@ -866,11 +928,13 @@ Macros
    -

    Definition at line 74 of file usbhid.h.

    +

    Definition at line 74 of file usbhid.h.

    - + +

    ◆ HID_DESCRIPTOR_HID

    +
    @@ -880,11 +944,13 @@ Macros
    -

    Definition at line 77 of file usbhid.h.

    +

    Definition at line 77 of file usbhid.h.

    - + +

    ◆ HID_DESCRIPTOR_REPORT

    +
    @@ -894,11 +960,13 @@ Macros
    -

    Definition at line 78 of file usbhid.h.

    +

    Definition at line 78 of file usbhid.h.

    - + +

    ◆ HID_DESRIPTOR_PHY

    +
    @@ -908,11 +976,13 @@ Macros
    -

    Definition at line 79 of file usbhid.h.

    +

    Definition at line 79 of file usbhid.h.

    - + +

    ◆ USB_HID_BOOT_PROTOCOL

    +
    @@ -922,11 +992,13 @@ Macros
    -

    Definition at line 82 of file usbhid.h.

    +

    Definition at line 82 of file usbhid.h.

    - + +

    ◆ HID_RPT_PROTOCOL

    +
    @@ -936,11 +1008,13 @@ Macros
    -

    Definition at line 83 of file usbhid.h.

    +

    Definition at line 83 of file usbhid.h.

    - + +

    ◆ HID_INTF

    +
    @@ -950,11 +1024,13 @@ Macros
    -

    Definition at line 86 of file usbhid.h.

    +

    Definition at line 86 of file usbhid.h.

    - + +

    ◆ HID_BOOT_INTF_SUBCLASS

    +
    @@ -964,11 +1040,13 @@ Macros
    -

    Definition at line 89 of file usbhid.h.

    +

    Definition at line 89 of file usbhid.h.

    - + +

    ◆ USB_HID_PROTOCOL_NONE

    +
    @@ -978,11 +1056,13 @@ Macros
    -

    Definition at line 92 of file usbhid.h.

    +

    Definition at line 92 of file usbhid.h.

    - + +

    ◆ USB_HID_PROTOCOL_KEYBOARD

    +
    @@ -992,11 +1072,13 @@ Macros
    -

    Definition at line 93 of file usbhid.h.

    +

    Definition at line 93 of file usbhid.h.

    - + +

    ◆ USB_HID_PROTOCOL_MOUSE

    +
    @@ -1006,11 +1088,13 @@ Macros
    -

    Definition at line 94 of file usbhid.h.

    +

    Definition at line 94 of file usbhid.h.

    - + +

    ◆ HID_ITEM_TYPE_MAIN

    +
    @@ -1020,11 +1104,13 @@ Macros
    -

    Definition at line 96 of file usbhid.h.

    +

    Definition at line 96 of file usbhid.h.

    - + +

    ◆ HID_ITEM_TYPE_GLOBAL

    +
    @@ -1034,11 +1120,13 @@ Macros
    -

    Definition at line 97 of file usbhid.h.

    +

    Definition at line 97 of file usbhid.h.

    - + +

    ◆ HID_ITEM_TYPE_LOCAL

    +
    @@ -1048,11 +1136,13 @@ Macros
    -

    Definition at line 98 of file usbhid.h.

    +

    Definition at line 98 of file usbhid.h.

    - + +

    ◆ HID_ITEM_TYPE_RESERVED

    +
    @@ -1062,11 +1152,13 @@ Macros
    -

    Definition at line 99 of file usbhid.h.

    +

    Definition at line 99 of file usbhid.h.

    - + +

    ◆ HID_LONG_ITEM_PREFIX

    +
    @@ -1076,11 +1168,13 @@ Macros
    -

    Definition at line 101 of file usbhid.h.

    +

    Definition at line 101 of file usbhid.h.

    - + +

    ◆ bmHID_MAIN_ITEM_TAG

    +
    @@ -1090,11 +1184,13 @@ Macros
    -

    Definition at line 103 of file usbhid.h.

    +

    Definition at line 103 of file usbhid.h.

    - + +

    ◆ bmHID_MAIN_ITEM_INPUT

    +
    @@ -1104,11 +1200,13 @@ Macros
    -

    Definition at line 105 of file usbhid.h.

    +

    Definition at line 105 of file usbhid.h.

    - + +

    ◆ bmHID_MAIN_ITEM_OUTPUT

    +
    @@ -1118,11 +1216,13 @@ Macros
    -

    Definition at line 106 of file usbhid.h.

    +

    Definition at line 106 of file usbhid.h.

    - + +

    ◆ bmHID_MAIN_ITEM_FEATURE

    +
    @@ -1132,11 +1232,13 @@ Macros
    -

    Definition at line 107 of file usbhid.h.

    +

    Definition at line 107 of file usbhid.h.

    - + +

    ◆ bmHID_MAIN_ITEM_COLLECTION

    +
    @@ -1146,11 +1248,13 @@ Macros
    -

    Definition at line 108 of file usbhid.h.

    +

    Definition at line 108 of file usbhid.h.

    - + +

    ◆ bmHID_MAIN_ITEM_END_COLLECTION

    +
    @@ -1160,11 +1264,13 @@ Macros
    -

    Definition at line 109 of file usbhid.h.

    +

    Definition at line 109 of file usbhid.h.

    - + +

    ◆ HID_MAIN_ITEM_COLLECTION_PHYSICAL

    +
    @@ -1174,11 +1280,13 @@ Macros
    -

    Definition at line 111 of file usbhid.h.

    +

    Definition at line 111 of file usbhid.h.

    - + +

    ◆ HID_MAIN_ITEM_COLLECTION_APPLICATION

    +
    @@ -1188,11 +1296,13 @@ Macros
    -

    Definition at line 112 of file usbhid.h.

    +

    Definition at line 112 of file usbhid.h.

    - + +

    ◆ HID_MAIN_ITEM_COLLECTION_LOGICAL

    +
    @@ -1202,11 +1312,13 @@ Macros
    -

    Definition at line 113 of file usbhid.h.

    +

    Definition at line 113 of file usbhid.h.

    - + +

    ◆ HID_MAIN_ITEM_COLLECTION_REPORT

    +
    @@ -1216,11 +1328,13 @@ Macros
    -

    Definition at line 114 of file usbhid.h.

    +

    Definition at line 114 of file usbhid.h.

    - + +

    ◆ HID_MAIN_ITEM_COLLECTION_NAMED_ARRAY

    +
    @@ -1230,11 +1344,13 @@ Macros
    -

    Definition at line 115 of file usbhid.h.

    +

    Definition at line 115 of file usbhid.h.

    - + +

    ◆ HID_MAIN_ITEM_COLLECTION_USAGE_SWITCH

    +
    @@ -1244,11 +1360,13 @@ Macros
    -

    Definition at line 116 of file usbhid.h.

    +

    Definition at line 116 of file usbhid.h.

    - + +

    ◆ HID_MAIN_ITEM_COLLECTION_USAGE_MODIFIER

    +
    @@ -1258,7 +1376,7 @@ Macros
    -

    Definition at line 117 of file usbhid.h.

    +

    Definition at line 117 of file usbhid.h.

    @@ -1267,7 +1385,7 @@ Macros diff --git a/usbhid_8h__dep__incl.map b/usbhid_8h__dep__incl.map index 0bf4f6d6..aad59078 100644 --- a/usbhid_8h__dep__incl.map +++ b/usbhid_8h__dep__incl.map @@ -1,16 +1,16 @@ - - - - - - - + + + + + + + - + diff --git a/usbhid_8h__dep__incl.md5 b/usbhid_8h__dep__incl.md5 index 2d38b0b5..947669f3 100644 --- a/usbhid_8h__dep__incl.md5 +++ b/usbhid_8h__dep__incl.md5 @@ -1 +1 @@ -8f73ae6a8cebb1d7009cf73c1970aa45 \ No newline at end of file +876b5629de44a53591bfdad73eed5881 \ No newline at end of file diff --git a/usbhid_8h__dep__incl.png b/usbhid_8h__dep__incl.png index cda8c4b0c5bb6fa0ddf18058aa929163bc1e2457..85ea4297caccdbf8978defb9b5ea443986b0f4c4 100644 GIT binary patch literal 71707 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 literal 71198 zcmaf5by$;Y|Ca^{CrCF4sFX0N(XFJ4(mA@jI~@&zG>D+&DCw>ZR9d=WNRAMZ4u22l zocA2x^ZxO>u6bQ^dTr0X&-eb`pSlUb8#uGW|7hV|K*?3vxGRL^GVKwJan|48tB|4m-}hm{OzCKFUg^icqcc95b(9=!a5m+OWPa$l zAU2vSjRm%yfTszZ-T&?LpH5<%nP^P1<*r2kPw~vMI^Jj*T0`76688NL#JhVL1LtCB z1RgB%%C7VN^By=)r1u+Qj1cIk8bRk;*U#|p*+-2%4V2XZ8$@b6X|8>y`s+fcnTn~R;tV@zHpsIQq zz#4^WvCRR8TjOhO=euCNI=jf`E5=_ZuXI|xoIkjiYL@W_ULCw0INF)zEE~oA?X!a~ zIG8%wfAu}p`kw-@Jnh5QEZ4VIh@(sYUc~74J@^#3Pb=k$Md=d$P4{_uKFK7 z;416Ov%@u@{)xt9gbMBQe>ZHd6h2Uygpe`wf7Jo_t6991wRQ1yoxR>17SnsUUOmq) zgo33l44FX2Qd?^7pwa)_ zq}&ci> zjTGLh6z+?oyw5-ZcwKiJ*E4|knMT5;xpeC6(nT>Gmw#+m4?#xE*ZR}fiVJh1vgSD6 z`avCWk;7EZk&u@*Epa_hLZ_i9NU;J}7|8rYyQl&z1iTh_A+wCm| zGR!@u%_%8m3k;e)5|d7@j@un|>mBTIZ!y>@#88=lto^#8EINWP3gn|H)^bBh__YrZ z*Ecp@mP7;rd=-fT)l9*Ni{~E*c^W#lYev-y)Za?*{5m~YFPxD_|Nh}Wf`Bn6cJFR> z-oGd39oFDOw9w>dbI1860hhVbinf{LE8RjB%|0$E@#_r zF26V6pU>r$jW>pA%Y>f~(K$&O9oH`gG^fpb?ro)*-&AV#In>u&z@d?J5{W3S0p4A7 z(n@I2ubNDcT_w%fq4iL+`gp-N6DUK**RRjl)rh5Eg^{Zjs%6iK{W@)7B}DZ<0!CrT z>HrEE&AR&)Ww%T5A;~e%zgGYEuJR=K)Wz=Er(ntc+ZF$@q~%p}r9;mIbNbj121PZ> zp8ha$?dJ>RzdSRr9~4=C3k-|}fw%sGlQ-GT1)yQ!L=@nBg;;mmph(c!r(1yqBwCB*IHKJniN_m;@i7qIor^vQ691 zcbmym#(Uz+^y)Kt+tM6YzQqWp>i;OB7Ti{F-ABfc^}KT@`ezW`)5ZK)d4DEvGW_4O zU22z9yV@d&{0U71*<4#|zuh837P==^Zvc<6{~=?*NiDf>UAjW75l_Vn&fPIjsA?$gA-s}*@#1pNG9!*&w4kw_4?R&< zoj2?;+T@N_I*02weqAbwp%PHdcvM`&5KT9iS8G38_qEB5;=9h(fY4$?OR3A?<~RE0 zft7ekhXvm~tb=b!jv4za>*?x}*`~iNGRZk7^e7#ABF*&bUQo1xh6Y9Vq+I*B3wtbz z7k}?~Y8EEKOrqcyg1^7`=W_wpAm8c_%99Q4BCaVfnX6qmCO~@;?PYqY1>}fH|nUAX;ee1TPxt$K0Vbd06QD0q~g2{(J zn%lzJhLuJeU1>Rv?ht|v3jg`AF$!Qaua(#Bz5OrP7mUeTX+5gRf#5RS4yVFSlZuhf z-S1OYo>VNSvwfZIVdJpUUgHu-FIvYh8{t;H+ZVE!4XO3$WAt}}H}180vYvkchq|kl zYQ_%CHEMjFZn;-K-O|`bUaPA&=@>ikV^yyNVZ8czb+kh zx7i5-SuqoVF>&}e9*vj;P3@%kW^;WF46@DhF*c}s}xNy0xlz;LmS63t}|ig9=*?%arTu?Pf`RO z=C-iYr>j$SoGpsUtkMQ^TF2mq^f1YR3;{v^vzq$T+J~cG$LyRYYu(Wv2P2BrJ8$_0 zGH`P)m0!{RVf4r zD&9dZ0Yb`h7hseJJH4&#k{a!{PU{~O;wiw_a%apv_$j&y_ZqcdMUof&_DCLqZ5!aR@cT;jWmR^wCJ4zrWWLtE`gB6YMqG>MM_? z+afs(^Lc;wpQ#vr4Y`@$6qL*V_qWf@#Rmplz$@F2ObY!dWT|YI%9z3Q+Q2N!q^hD2 zln@n7Y0#zNNG?m4p7H+cSK2{2LNX<-D*B zuxSseYbVaF8LvluWcF(*tY4Ggyh%5Wqc(GBza(nDeBs)GftPl9G&}UjVGeQg2JxJc zj!xu!+$rgKuY?M1nnJALtQXJc_{5*s&*5CW6_#~&)^++wL?aN=vRbKW+Jhl6*^3*ILH_W-$pE-pk^ zCYbI;%$F@k4E2tfcqg$(<&#m?Q2dQAzi|O`N<{AwgzukjyJo7vGIxWhs-Q@pNxq#j zqZF>lDBfsFJQNYSl7Bx^ZQn~KhSIo23V@B^cIDVYd|rHZd@w$L1J8jb8203SfhsLE zHWhCVwg%h+qRo7_RhSJXxzal%@HS9lNNqixfNYI=&UR!|ZQVcb+kCBo*Rr(7+tZ2F z3COyK?Q++L6a#V2FNk`gk2LYMKMAfN9&^TL$LfADa=mJvr(NOP{aGSqaN0&T!9lee zvC;WO$9iYe$kraUql^%?Lv*U1v{|P0xJ|V62sAo-5gMLUo8h@coC| zTCous`<%Xs##Zmo&FJhP0LFBEO4b(Cp8L5y&0`iz1`~lj5O~s;QdV|%LvCdg?snL- z&Pc1sQ8^Z=i>|R5M>v)g|1&+mVP6;V84-lwUq$rec&e%Cu%U8l`XQki)SI@}_Ka5Sg!Wj9r)|Qsz3lqZY8E&e@%blS0 znL<@PGbA- z5`sH_j1Su2I(HXpmSwQtfp%dMr+{k{H$ENZsTgyUHGnh0mW{+>jEFkx*}BH+7-?bY zGy+tg+rw60&&u)!r4siHn0D}Lzy86rrRxA9a#2`F-!0`9Ed>k=ly`KX-d=A60!w4} z-SyV^)*yW^+s8vk-F4EyQl~F1dmb_v_$h(5|LkytN<1-}wEqG{shD9~F2dY7)6bP7 z_DSMBFya{TK$svm%K>*;%bmfBeYo7}qX0j_c#1Yud>Yo!$wjZIq5zjj2rFJ#m3 zxj2GatG#g>N)77nHrU1#Ks!Ea0EwK9Df^2f1Wni1 z_eSk;0ncg+v|sPEdO9AjgLAoxGVz5GJ@0le7Js$w$&uA92go2gN%3x54(FDaw~?wB zHbtJ3GQV#3BB;WB_i)={fKZIl|7WfA(mr1X$hIgSCLCNzRy#u}(Mh5bE_AQzt0hdvZL7kICp^FKGR>z8p;ZjMK?}VpI+5 z*n(U41^10s$yd=lK8PqXqYUuST<@IM%6;~Uo4t;&`pPbk+si^4)+YIgA*bkc-@VHm zk)0ax?$VEfflI;lvuS*N`d7rX6GB=B?jfhsLkeRjUii3x#t>iql%Q86YJe*GE>~+$ zZ1ck1DEpsR=c5B`sbV%|NrD`Anll7!?aJ~5MLWMunc`&vyXkgV^3;m?mJo~eR5lHC zus>aS?v%N~SZB4&xe_7W|GA*AV+yTAq4>(zX}(D{(O{4&WP=O zdSb2cpV`1<3FvH}r}IW4|E05q5!g*tB4b+=?e@E(;|a;?qL`N&)wMm0-`!UCBS54} zB}>DYd6alQxT6L4fG)=8H?gIL3_Wq{Q8fL6U1fgulVC1gz<%aoerhP^eSND~M#cug z?hxEvZE9n4xjAY^-w4+)FS?-k&h`MfbFM~Yd|OTJ&BSA*+u6e5Q>wHg;22E&;s3pp zkXTc`HW5S@C-!6T<|`R1DuJ!7n|&qcSR+eC`MWOVComH-UgrMG{dmin6Yx1wk6uT? zQ1bM1{#ufHTe(?m=RmmZ&+Y#)XdQ-f24 zmFb|U6DkoyFZqk_C}IulYzFZe`SL13OU;UfhVGr2FKO0GKHP$FBNJ8k?;SejHCL5eBH64`E*(`eW* zDm>LIk7#xb;s09Fu&zM6o9S^FlFCs;HinLrr`YGnPODS5M{m%q8k~C2<%4SyLG?&m zWZ0TSgSY==>8Rmu=}wsT&%MBSfp|%YL8hE!kgS;1esrO@0(rx|RIbT2D~N)-0P@(ofJveh1l7DFhmyQ>Ud`2a|a>e486Gf90-TRHt!mT{184IuXn zUo7FBH~VyZ(>rz8$8lm}LjkdEV8C_AU~A55e9ik7tw%l?Q+MzC03)AGeAmPA-dB{9 zR)Ai>kx9tw_t1eMmR6`{b$nvZrO$e8SQZa4&+f6@%Q#fG@6W&osLGyvE)2fgP>vpi z!+PLKRGh2V!N8NXQT27|4^$Jvyp=4Gd1$e^)`faj&eru-G+Lnd<8qY zJze5XAuUoU^)7Dcl*k+T>~O--`20{pL6qkGzgPG-JfKTYpQ%BV{|k40qQ*p|;_I~` zn%HDvfHbOl_n{ES;5}!E12r)NXV-V%^=zz3GXY{Bqtt|ryX-kJ^(p(91KZQe#F}z< zF)Q#U_<|pHx5V>mWNH%ND;lPCMp>NwMDiS|rt;Y9_fvCO!lc1oPW4$E+iVtn%Dl@* z+gOxo0aKMZYl@PPsVujzPdOfh_tBSL_iiVFk3n-?6?9;zELW(qZ_9pK_FBN>x(h1&h@Q^ZVLo9_vfG(${-OmCH_geR?B=;h z;Uo@TCk-xFko;pn;hkbexj9$)fLzZG(ciF(;5jb@z`X)yOdHq^6VUY)>Gp+n6JL+sw^ZBXUuOG5foHX{3{(VYK(*(8^?!yX~Gv5f3#e^G_z>)87!((4nOn zyRIM@<}PHcDywsVIz*R;4Nk-Ws2|>_$oQ;{aH-IzN%wMy*W+r3hu^ge zwEENvsZ07t78Bn7K4bf~eqF4*tCe)^Y{s_zQFjC~{xjJ^`GW&|E|{*iWsTLyRFh0I zv&#;QLul@MhA115S>s1pAt2)kQB$5 zDB?g^2x6)jE!RSgB0fzMR*{pB$EUL45|rNd;Gvl}d& zoWkkB;NCY>(CXRY*2Q1qO77EZ-y`|;nEQYE9#V9eZVRY5PE9`oy-$D+F*U&fm6S8> z!k*wASqy$dlzr|-L<#MBeuFc)sJ8$4ab^P#f{@vS?+%4&OD&NMMtQ>)3v-JJcj&{= zRiZ$Bygq`CU2aQ|B@F#cYdt-R*rAcZYYA)JqSXI9WnyO<i#x*GJ;!W|nb?oH;$FU&^@y`tl1vggc!XPezK{gQBw zyB{$nETJ&?W7T$EQ#&twzL@#j&)sG5A_H&T#e>^`C1wamnBZsLe{#Q$WWtLh;fBo=`8FwU{X?yv8UVjuhnl;Fs)wp!U#1pT~CymR4PTk5ylV*)EqjQDsqFwgCNb-|dM#GDqP;{aWL9{={%+%-eXAHZXO3 zu{l>PJP!|tagZ#QZ5B^CaWQd0xru-^w_L0!8`=I|EP$WEyL z8Yhnk9m%GlLZHwP92LcfNF$J=PN~je`W8cR973c4h)=I2v`DkN+$iu;zz11R!Ip#k zlbiAA+U0I66Wn*ElLn%*=n`K~jm^q@ItFjE7&00`yD2+03GXyl--zZqKa~b{St7vr z^Zhy+xR$OwAdPpZ+@va~6>zf5ny$=4ZNk$GSmoA?RzptdM{Ai${Zmz7 z?s|T}GxE3V&t%#qKDOZDnAzSOrEHv1ntOZYIFJ#$yMREE>{|>o@uJ+y4%3vTQHs;Z zp25!53`*~bip6b`SakEzj-Ix(WnoyJ8V~-`H0r(IUjQig0Z^?M;VE_Gzw5cdHl!Vw zMA>=^H+u;A4TJXkBDqmy+4}f=4GhsyeB|6vkQv0y>W!w@&9{!sYReICVkk}1ILe8n zd#dJ`OiWNnD&9{Z>{iR6BazSXXDEYA6Y+!9)Ws>LT|GOM!~&kHC&nV9eFOE@N#}e5 zQ1pC*vk`zSFFG1OceT#l3iQf7y*fS~@>b5BLc=cSD;CEE;|3=Zj5Qs?r8PP;aQBJP z%y7LeerJYT;*VzL+$S?9&dSqWM?L18L($vG8%w=1f6#eAV}(|_(F#{aSGR~9O?6s) zN^o%ZaCj;Huq)iNFaj1TK+*?_Y&5#<+?67Xh3hu>*`ugrl71n_Lqv19bDpN}IdVk0 z2-r40yAyVPcenjd*1$#vSfr{O)<(Z=&%t>dQh27uI7$5vENThUc1=u1I;~bZ&OYSX zek^)8I)hCAG)~2OrEBA=6hi{XXrUsD<*nu-m7*nN(N9BGr+hYlhDGU_#O{yA1{{je zDX^Q(b1i(IT_m-B<{^5rSg^|Sr#5~nZ_D>aGJ*nCJ*%UI=6W(7HDME2XW4V+_s{a% zKBDYE=rD9A%S|Ekz_Zcm#J*}>cr3@*EK)p@3*Jo))t-0h<6LW8m#8iO>`{AAsKZ%J z;_ju;(?~5lCfm~KPIHV!;n+(Do+1#&qZ<~g&|k%Hoo^Zt)i2?OsYHr|gY*Dy&cwuu z+HUium7#d>8Ys~mYIO{DfKUg8drFn^yIfb_l0+s{XAUB$z>-({@7AI?;|9~IxU`Fw1c@;$za--fe%*$#;zBSi z5wKuy-?xCG+AJ)rPnIIAQq{k#Ba3RhP2ucR7QtjdGz6Mk;nvrt=~a4V&bia{GEo>J z7FeY~thXArPOiw|IYXTt`G;B|r>q(lUJZnc@_D6oZCIk4@?o& z>ajF$rqrraM6pwgd_PJB5d^RzhNp9GL4(`No3dD7%WXu@*kQb64G&q_`yz-je7T@q zJpCZ6v!9zAaMB<5DQ@vhJ6T5Pff)lMniTO^rN3YSl~OC(oNx9wpiu6KS5#?+^(?@6);|8IP<4C&h+Y<3@>+$6#osC0j%*}-543=e!GfoJFh>Q zp9=_r#8yMUH-6n*Ei>*yMb{_nYw{t-8n>s-pkFqupr1g>J$ij!!4{`KI?V4tsiYh8 zC-~`E4^F>i+mZmhIrm-un;SpJ`1CVOq^lrnGqh&k9vH;P@yfBdI zs3zEuFZ+GoG=4WCO$bx`vAvc1t_W3F$3#DVVTRbB0|`)0>(Il%>gk}!95U^LCA1`qzn z=(^qnnJ_Ryz`RCngMf1aF(W6d4FM)PrSz)?b-?&3F(&T*6u{f>wsi*)vn-SiRubR{ zqFR$rudMCAIOWu*y9tkjcslIBOx zqz~?-1^%OkZ}-2+d9NI8Zx%{=bZrzDk_b^6dcmqO?|nn7x!a#Um^wjcJT$rXk=C;f*)rmhpD!NOYkit3&YqY80Zs2p1SE_@+CrBeB_e$Ha+Hv3Y8z4 zhJTi)7-*m;1CRB7hp1+09Y;In6Eo&zXcfH{FV)8}#Zl*y(bGh*kkU8RGSR3NVCBwhRV``Ka*uf~i8!KQi^G_}V`CdQXezgTi_+)9QQ% zpLvaFwl|CqpjsgjQ(Un$0!1TLKg`!h@-2mJ|8M}q8X2#?O97de^UON?%+)?NvqP~1 zgGvk%`d{i|`-!LBjE1h|7Y+@}cU{jmea+wKvGa3CjOjVzI6K1nLcio0w2h4elf zK_N9x2Xi2n0yTqgT+Xn_P+tMKGpsq{1MMz*tEd1Y>nqFB=kl1JQ5(ip)mG1t!Vn@g zVax2=myC+!SdX zEQOb=uH7{J46!k$&Bwl-1Ahv+ymVimx#Mhib@7I8f?qlN=?a#yklj=V;66CKs#Q^( z+?=d;Wa_VRTx6N#DOOkyEoFlfV)mtX_(YhGbu-I0iA-8F2zN(C_~@z-)N2e$oELj< zyc^+>y1Y6+u5}n9@z5lqF)^%SzY}7-Qh|T`Jn*C&y|&-mD^glD>mVxb$W;W&YV`_D z0D^UqBHt3O5*vh0w?alzRUsNV&93X^um%l6{Zj54hc2c0U3^_b1c833JD>l#$43@} zOSg}_U+j&)_^R=9(#!FaP83AtYb1}$QT~x(cnKKq1xgJyznRN-ID!W<>*e9bT~L)N zNW|(%$Sp!Xw;(oB;|rGpmx1Tahc|^>wR^AwwFj^d4%W(?Fv>(|^?R2;5^+*vQ!AL7 za*yWss^L(-3X?)>_hC-^4G>IRq7c(%Nlo^*0XcH7rgN@O3NWU75XY)apUMjrW@6| zWr(zFeD~%#Q4nGw8)PyFg_&w2ZAS-pw&>S}Hrl!F(mTJS@F?x^%M|>Wt6U$KoZ?U! zqV~u`?V~Wn>5xK%yf7GD3k6Y(u9oav&y(Dz*Wtgh*W>R0%wZ`SY^QWm?T)bd*EoF8 z$|7TW8KP_v2|k(RXAOYFE0-EI!6)5M1?NlNinw7e>U;D9M%BIHve#pGjbPtr2syTN zo9i(30M^jE2>0+T5G7V$y0-^p$U|(%wS2x|_noY-unBG-_0^cPMgRF8Feiq9;FWcO za;o6k#lfvdi{}dgTQ#aH?Dyq5dyJ02Lw+_u(1@JF&d_%!axKgC=&n5PmbF?#|P?ZMEOaa?SG8cAr!%Ep;)XKY+;VFqu?44Ut|Jo1}iMR+Zn1M>NdAPRuz<#_Ax5i)Mskht|x)aVdB^A8>DciHn1pS!` z{h+e>^b#oQ=ud*x!IYX}#z3*zNMQWB}R*DujARay+N+a8kE`VmC)Ev?{}Jx-8`WlpzurxKT-nK$1xhQv({Pk$oeUV9~)pLcj^rf_P` z)A?2mV?5x59Sb?5>LYIVBa~=pn99CV+#t+;KWTWf>jZ7(X!6ts8eVRQZkuV_-YVBW z;Q?#1j&^ThK^1L30^ULmL?I9fdjR9{3-U#$RW|d(Es|Z{-f#|C>u1hUVd@DhGjCCb z=)e29tEx}!$hKmT?#?w6Cks^vsheJS0m$e5yU>z=%QM_y43nN_LD}KwN-D-a+-M0Mi^cW?X#XO5uk=@?1%1i!ekR?WJYsLbmn9`oZpHoIPUoJd*JR%HP7|(c%OCj1YhJ3B~ZFSs( zVxBY@wfU8iL0i~}@{}Jkx@##UOaTcw#mCFD;&!LcN4RyC3Wz+-U8+c>Q|iH`T8=R= zz6EH+eTqj5N>R5kx^0f_7UOO+aPUF@i5mHWn^!iwfyZ?HwbitAds zFCZgJevT{+@Ml(u{$vEr&EUACS zM<|#xWn1BI4dj~5DM!BvwTldnH_PnU{X#{b4*tN!!0WrMA9#Cj4e%M$yKgOy*BQi$ zQK)KwmUL)1QB0UW^n+L(c(FLMiu43pZ9fEMd>GeW{9aC1+t2I~S3gAn-84qZM#bib zHrG1L=Y^0QXz$;<-oB-(NE3`T;A|CWia!Z@FbhjZkrZziLbub4kh;K)$jkHA5;K(u zJu>*E$_u~Fajf#sEwwQaqnpkA+`2V0u@{F>m8BlL^n-3AP0ck3Lz9QShIGv4Xkk8? zl{Qa3(>@xnykTRC2yVG1@(!2r9AQBt)-X#FT#%ZH5;7`2!*-JX`E&Gbnj!=B3cQ6x z+%3q}*W+7ab8&zsqwS2ZQYFDt6F$$qR>w>r)ha$|xDar@iHlB>QFC4AiAS^o$#0QC zpC7rQXNstW8pjGM*O%OZxXMgn;qxVY>Tsc)dbg`vG-KmBCZx1@eRL`J$Hjx?oZVX9 z#Klkcrn9)A7z9rapmC^;G5`BpL_lBIgaV=KnOwN(-z>o_{D$;QzKqIJR6pTE6Eu|s z$RB0Op!LF}lP$-Ve?rJXALTh((?Kx&j-K2sWQxDq63^M<0`?SJ%#k^?HpbI@qS@2e z@`=V0%*M|fY{^rF>TjXP9MHdxWTB%<``vp0m*C{PR2KE4qD=j+@idPF4AzmV0`H?~ z_4$y!08dAbv8RD=Y~q0ni-K3ZZ(fd|B&sq}6SY?t4g5%Zl3kEflN^@| zF3|@3xJ8%its9B_Hs@TaJh$tE!2^dqJk9%YY7n{FSfEwffL2MWU@JWMPpe?ES30kx z+}t;TmO)!G`B7mfVIbMz{iq3ElhU*awfCD-RUZg#(8r@SUf1as3xl+>DHHDMF*QIn zjZQc3n}C3{JppzwsMBlAwqn{p+!;Gun9P8o@L4Slqz!l{G3^4jf)GkU-|Z1`)C`f3 zB`jYlomI+mLUa$?VQAyd?tF8o$S=RSoE=lA#iAGI!16{|UQOsF4a5qynSuDrTYgx% zj>x~7IeBro;;3(|TqSt66uPO_B8}+mN?nhkbOgDWW$PTsSa!(6*#>K@qx&O>GY#~a zaSgF2goD{gcEZLeSO$q+eNx{CC?*C9~z?ri|1x8-#0F2|BFd5D!$KVRq^AkdiYXEuhc zPlvsslo?FEul71c*-{l8( z-C%TrlpTQoBzR(s;sQNm`BinWWFclfO73AKAE3pj` zYp1ilV8F#6sV957497XERSNEmv}@|%%Gdux3RN$+b?>= zD@Y{$v~2yspO`x8tViKgRc4nN%F05*%j_VRYbzrgkfK~ebbeilih9~K?@%s~K z@!^66gc#XR5qZYf+iarD5f?}4JySQ{nr8H&qMAJT;u_fmeo?ag1Lpuxr&cW}KBEX! z%?_ns!J#UEFVAGvS9*|jr3xS?dJ8y@lw;pYo;}T8j zplryeCd@PxZpYJ!Ad!XC;yw}4g<+4c<6LPJ+%%JSZFe$p0Eyu1tFr}Pqs9}#n*CG* zkL1%$^;^7KX__sT%aC0lOP5|{YB}9tv}&>Fe=gidJ6Aa33{Muv6vMiWjEn_eXQtkS z=5}}BkX}?Fq+71>j&sU~X;IeIEPKqC(fOlZufo-)R&~b?X%;1D+){Q(HLh5mrd{ve z7L8jae=RK_Z3H>fgloTj>bJjdlEPzvRv+>k4nKJd!k0H!0IZa zZa^x!&EZwJ%8LZ)v`+5+iLzM(!LdewD_jg7WO{*JG+y&;j?Fs%B69>{9GlmvIq8(! z^W71LF%5#W5-o+qD7e?X;z$b*LOAtXpDot)Bci~|n5JJN@g&Zp{R~eU&0hlpx@6?8 z8dCDtX-?zuLjBHC`~8MebE+1`db-(y731spJxCI7;`AYr(soDQk6_h6Q}bD255f_fegsd7&=pJ8riSvnk--$(~W z&j$pr)UL%WNxu`;AQNt|pBFD+%c6)T9x1si8Uty9!JTO!MX~k;Pnm|x#^>0<$dls( zYoRJ|aWh2^>>m5NjjHlyY8hR2MUu9k&lmFys)ol#{lrUQWDF4Q(^-rG1Pga2&z%`T zmW6GAIoJl5Gz8S@hmBsn{W&i4ZWF|k5DN6sH{*93$^Ypi zm7sVRxfC|#Je2a%Yp$)lm|IxzJ5 z2S*WBSDy33%{RPE#i3HiyQ0Y26y}t~=STQY1%rXA^oyYvR`o19$I1<&Zt( zr#WA_xfYD#X+6HSu9{>rHs!!_G|;h!A$s=%0fJYoqZ3OF9@Y1pKNyr>8w&6UJ3SqW zcjA+`NwGEA5eF!2d25F|4GTuqOPFWq;Q;J5*0{x(iSvqr+n40 z*=K8M0Yq{DC(ASCV;3b!q{O^M-89>sGsi6@CS|#yNxh(p%Sj!u(nUmhTWOlDV?#CM zC2PMInmWvA>K5G;8&pJ=h~|sjeNTMQ_mj^YlKk;v{1fh|;Z2|AaJ>~Fx#jOzg-f_M*6v$w`(E;pQd%}DyyFK!432}=;i$tge;82pC&{I?g)_MAM znk-JjCxNy`;~Q-2;>Tq9{I{^$jt0x6Mn-TxIj;QDjiE9}Fi%dFm#+4SDDxhV&S%5YK)yKxTDVgTBiU zQNztarXkiK(}J2uMa>P?9c*OfeIN_W;DY>fZb}~=&Wr|X)~wsEJ<;H6dtkOcRmbyH zS+;U@N39Mo*zB>;==(^-TmuO0#cUoSFaRvU-LTr~A(FYACr?XPLOypavrU=ZK*e!+ z6*jG={AxPK?n~5j5K%41NLu3No;O|q=qb4qd-}8d0#Pj$?PpMLSHMfnewbk9Sym#C zsr~Xtc{q;RlA3*RW}#~i;(#vICKUHJB?l}vlvW3)wgM^hB~g|QAYt0kwQ9m~YWWIm zf^lk@2??WhU1EG5-z4}HZ)z4YV=@DsCG+qR=U)=WXMA9zXS;LD!krCBgq!2@nSed~ z$m(q;TS5TWRQY2ORp^@-!<3|v$tJto+LgvHark-&!Cbva2KNTrNkL{lz?TcY*X{CQ zhNI(?G9rC{1#8j*2sF52K7{f}7eJ4@>llJL3RCjZ*;0$ z6%?Oli_BTL(j$`G2s)osMLhc;Qp$i-N-m~}hmgy{V#v^DtzU=X)VRBgkdvCX=b;T* zU%FxIOkYVU3E{2&v`=;a`7MA{N`Q0_Gzw;}2e1|_A7Pr{)>~ZgZE5bVZBhBb(b0^<40Px6^-gusHEzJDLW#u(rgbDcCKaz1xx*}vn8iu5&G zH^xcf9HP*-V4))8jP9gq;1@sJm@o4JPYqLirU82r(i27lQ1wm~f>~j3te9{vmygTA z=cm=W9NnH;?0tvoWVsG9?JB52OhRZSnR_<{L(nH78F*>!#$Fw+=lpeQKK&YxRg1mJ z{L>pHxxFM0*7TE3)@fc{2Xfl1 z=s~!zT$XgvyRzqBcro2d#D5OsMUeRI_5yr;Qs1dly4;n!yEyC7uskMmvo7w<=t}l^0e)ZOTA6$0#Sdq<%8i?Z!Xu|laU_d_*Hw85 z{7yoFO-oJfUsVAy9Vu&j5kQgf@}+X3z#+h(ij1owq1V;=~5t{r2-kQg!Y=7)QZC|lo#6DsAT0qpjgxhApFBdSRd zy$R7VD@zqM*Lnk9Zu47-eZnI#pvdTNFZu}rgeJv4WjXg44rZ&q{PDH!^a-%n?Kq#`L{cM-*1TEQJoXu%c{({*M2+pV5^F!UqjcnM^*Y0mWW zY+%=*yIG@~6c0^@3*R^F6orB)@#<|1vd!ag!^X@bS9`0RtF)&9c~l8+kGx@rHGE~m zZI2=D9T`3(TeLpW_WQ*>k8E@9Ye^%z(*52a7J4uOo9bOP6nS!#r=W0~MvUgaM@LOdG4!;GRTi`XOk$9)0)={`PQ*(QPFzZ{s}tdajeOH=bB^)| zn0hEq&~s;i`DpmA4xE28jgJLio9F1e7dwvXf`vJdmLs*?jySo(E8jiU>ItEwf#y9m zcg93DXDQ*YZw_=Y23j}$&e zl$nFf&yIFB{07!n+$sA+G}@9l0?|x)lBVqd4e6 z&-*8f5ZjDYLz+DduW0es-zW1r zoQGpMBsC$Qi8B$RO#t-{4U%mkROmTx5W-`a(sCaA(cXdE1>C&1+bas_NHJ1VYM z^_X08o{Qo(k)iTxrJ83HeFxBr>d|9oH%u+th3giw1gxh-SJobiF5rsib#_WRqIB~n^4c92P)Cclfxa-?;} z9(DsI$fRq6A2@{fww<5l`EH9V8g?&~D)e6HW7**;pct#7A$h`q`s2*~#v-9O#Mws; z=5|1aj#`kbGKX4%4#;2d2zxw}x}O*Qp7o%1k{$96$jMtY$C<#b)gUU;SFsOo}AG9-rkES8FI7}+XM;*BfHTEODM??DgL61~%c&eo*1FG?C6n57wBdz)Pcr0Cz^f zL`+Ny%h0~xXKfx}o=O3WTO#@O;InJd*(R|A2&J<^m6@8bt4vy$s?DB!&rEe=v`QGw z*WjPH$*!5aTn{O?se0&Mq{|xA2a=->quOihCwzpSuySR*93Aql?L6qp zhHS}uVnB@ZRMB|3E8Jpxs_N7e zH7>Ry;eV!G&+n`0x`&#HO$-1T}*;$L?>H z!=L5jB5@wcYKfYExpN*27LaWuR}>7zyH&^N-#l@KL@nG()qG~c4zfDg@efE%epIQ+ zCn^s&2a=r>;5o@iQq;O_MXQCNLrlgM$BbqlI-)~p5e|Oq_wo8<=tKZfc|Bv$YMpG} zyIAV6uRqa~gMNFyip|20YPs9|&o&E>veqVulUXFUqIn0aFd8YF)q*aM&{iZ8UY4R> z@0r4vM?m~NmY~PMmL{GLc00WUd zFn?b&WYY>U;WKod7#^D5dORwtN*hZLOtDVo{S$(+G76~34LcLD(skN3(sZ8;pn0_h z*30!J|M&y7+X0R%jn=0E07ig;lXHdh(MHpPL0)ZH4_ao$W5c!9+Eo1(mp7&N!*NE* zHhr3x2lUi>36hAt&}zS6NQRN zH%#&e@K{4Yd%?f8Tla1Yemnp9O!c`VXe~Z5VRl07^S$FR0ui8iJnu!l+7EKvl#AiN zl)3__Go}zZ9G2Icg>NjtyaD*lt=^ySb%ik{Rv7cPxUtPOn^GxcnB6WK#*}NvvsUu> zQ^`MQ_?r-GB4DL5Xks-VHd>dF<4$Do%=~n0uvM9=(Bz^cVF=3zHL-{hzS{Ftmz{yA znmrFIG|jF1m%0B2CVxMgIN3^@T_L9ft%UoUG$kT|dxgJ$XF|YPx-`i~71SU8ER(PV z9eCd^QCpVdah~WI_Bq!DYzCDRlB=<0@w+>y1~q=mmjI>{LT%H=3uS5sUm&NqRWaIX zHl30$YUcP1QVKbeF+`kuTWx>wckeU|I3+6V18{iMg@54?goOd&+ctKl^L2bL-F9!u z)%qyvyEdkJy;&@TYq7afk(_RD(A!fl7W0!s53HgUL8jSL#;__c@QsZP^9+nQjc4$* z2yOe91R5{32+166YB)&&(`0%KJ*OGcPy&N>-`8h)B1*2>4!|Wcw()Y?w91`IpYcvm z(=a%tShKb`G19fEk9IS<2(Zv|O30CPTp!J?pET)a|Du^0t}w*!@Bbs3t3o~kS!qhw zeLhm#t86_j9a!&g8YxKDv5-8HFS`h4gSGqDKq)s)lIR-)49%^ve(FPjf9Iu>ZI)? zY@}oKAIFFRWd#d!xm@QMa1LVka@lrJ8!Vr@K3#~BCD#Ho_I-&cb*V5O@U-XOSQgdA zbrV3ftk+~~8QfvBmmi~3gEcBf{%Br!3yQ?&8V|pEd8uqCUs#U?ENl9A_`LO!tAQba z?$cpxaQgmkXKC+#Ux;fYc|o3la3e`Eg;@kDxf(a}(qpwjjA2!)8^Rm#FI!b6skWF4 zk&47&>Vjh&Qk6`)!XLrSb~85?_uY&uPdwb{jCXFIW+EG{CMd(v;j}X>1l;m^gZ3I+ zhHc7&8Y80swBVl0M1YK%ya3HGjK=|JOmdIlisRmEsxkck)6f6$dXHiPcRQR=9USp^ z)r@HiH*z}^kFAc>L95!gw5bLZ-_D{r#v>#|m@KK=l&j;CJA2|4PIf4F05fKLVCryP zz^-n-Lh}n9VTZsyrwYa!pg;3X;D0_dGP-)RLwjA=d+`)AtCYo!NW9DNO;;VO?$7XS zz(poL=)<<93`7eo0mlJj6EE0;0{qoMZT7~|@6^-(?DJ)X4Aj7J}@B@Zrg-`n%ypr zWPlQ3{{A4pYOE)?jLhDt_!V4^ip0}5{=QXz$4#dHUw6fS>4B~?@cc2bh}{aaa|Y# ztyG41E{X%3kw4E%+^+^~W&^PeZO!`-@=2c@#JO^GSBGG zYe#W2KETKFNb9XMvQmTLfa;+`x$)-@NV&=IaGt1KnW{V;nDlt1$xuA3n+%X8tB?Pi zsLnF@pRSpvQfEJPwg|i@)c!w4j{h_qYo+|$6k8$l{m=KkfaiaP|M{BfNl_l@7m&%o z(kpAnfs}*0?k;x5@?!+?mV*6m0H6|UQHI0M^bUZVw6~kA8(kig*?f=}A-6LS^*^!f zPib5n2Akccu;c7E$y6eN?HCMofS%R76@otsfVxZ8EbD0PN zxEy|in}BoCYHniu0nOfOtqx%U7J0|aE`ShZ0vI}_EWfwg7ASe|XS$ZBS67WG`dr4# z9IKzFZ#)e=otO$aLT~5PbgloP#b%mpH^3_s`N zQ}ALN6D@V&1I?|6h3Tt&iy{bwAD6OHLy3JB2YM~dIsk8V>n^~gVgZEp*;ZZwF>*j= zG6rDiETe^9+-3@7v6}?vpvfyVd!0tsuA_zTp5uX^^z*SUV90(lTs@W>0LIREK8n%l z%~*Tv{?hSOsR+bglTUYpLXCtgtzX8SU!LwcvBtBkAJzsKNtwO6A?eehoY5OG~K)r1p0gQoV#zaJ**~l@woy}w9&xB&J-zfy+VCo zO*QJxwqC#{a0G%jZln@ViyhvrkB>kSgF@^JK${}y4W9x2*G>{!%w4U1FTCUHGqe>u zPfgdGgHb}z$Zd)0EUkc*x{JVh_H<9JlXn2uyB|kIw|qrwjj&E%Be9mb|eEfLmqurKNrHyR9^aoe+9$%XOsH(P(q4(XW@!6Q>p+ z;s=(JD(X-C#Z z!?fSKkW#*0&;kaIX{q;>y?5<#g$(|8`~@P$9izc~rFzBeJD=`&NHWv$_qDTo2f`)( ziT^sURyw|IZHHzVKyp-|QlhT1Osa^*fBA=8!E8%2sMGywFO@u+yT`fuK{n^=@^Xa9 z_3iMu(5n~q^5oV%wDWb%TD0g05HRk-^GzPEr2E^OTILCx+ z#2a4Covl)L3EVE3X5+%42B~G^=>7cKvb9j4Lf5y3kj2qudBsu; zorVH7j0wo;nqDlAn@0?ciip<^tKuJ#SQ2A?y1k!rI-D*jble|LRJC1iTROKNk*a;T zp^LsCQIsgZ$n6=7Rs^+#HI`sN`RCoAXy+n@+c*=@Lu$gOdbVm2tBOYN+;yq0##X9!GL{6VS`ly3W`9eg^)gO1)XB4&_y{ZzGxfJ_>{zRf zj%>3aHeqMU*K$tT##^;G?8>Nh#tQ_-L$b>&j5_U}f4_Vya#?rZm-$gxnx5zaVh9`j zT+e%Ea)IVYvV%!j1Y`$HW0|h&=5N`XTnHPSezQ(zi4QVPgn6E|FZ_5VTRo=-W^+u( z_I@9xHEo*vovRBU3AQ}n=SI3xY$#0WkJ5Mr!C#UWJiIvIQ{FK(LKLchh|nv{CtWfQ zJ(}IEk$6qjWRzY-BJC%S*CC;kWI@A>&V;rM%{m_7z>?@|)j?Z=oi7i^5WR5(WGICw z-MmA+`)}gs14$~YZ-92bC_R+OV-qEgWS-x2FnGiW#tiIlIwzYo$RaTp=}Eq_H*EOw{;o?%IN^3u&vKfUw(&h;spPb$6uDf$sapS* zZ13s+h&zsgox#6?Q6LUg&VyWeyXXCju)raI%M*f1d@4~#wi=8O+;%-JTZxJ3N*UJe z6!z-{D1iXV2mg$7(AN#Aj>yyv=LKzTp6PIz^nP23`e_!A>nX`rC`$Af{P=Q(em;e~ zHXg=9fMH{Ajg`st2pTj#d_i9q1NH}6rPC3p{m1#zLk z$ePSKF`6&CSh3z26iJcgX(cA0m-CkJ(r_@^`S|I%&S(gOT3w0Q%OI-})jpLUw?>|C zsP2~nA8#nBsU0w~^Jzj5o`U%<$P}i>qMVX- zLYV1*^u>Tuj!$g+UUI334Xq!d_iCuw$4&3m6Yg(U6KK(MJahjdGwTw1HI(dLz7B5E z+noug&N}F0^P#qsb$1nk+j-f_+yT&^j?knDYIJJfm|AV#vmrsD!tgBZwnsgdZddxs zuI8!>9TAzEmmSV&UtCJz*LP>1K>1ajFD*A+7j#fQl}>nQN7L-CW(edTJXejI3yyfz zl57Al5=>W!RZCKccIlsgJ}q=lzI`;f5c4(?Vw%5`bKmbarp){9jJaVh7W%OLzG@iFY`Wv)n+x$HHl@?fQKC z=aO%pc+tjeiPBmzwvH1{ZXS@k|H^=|>Cf`M{jtz3M*T7WkCfN7$HoANULDYRcD46A zNW2ZjB<{_ZjB&|CjFd2h!^uaux6=b?jC)|i^DSxWw-=@d;JZ`T&SQz(sW+?(E}NZ~ z!*q<%bGE*ZnvO%1$ti#ZC-l9cu71bFi&G2cLMFMx!z9FG&x}sLi_r1qqa4FK8QSacfA|$Ejse@rL<`E z&bnv6fvVnRGWy#Vd$bWuHU0YL)s+ha&&wB)4TOLd*N!Vf*O<%nzE*}x^qn7b zEazdI=}?Vq9C1-T@0}>F7T1r10SiR zqWMpZ{#q?U(*;`P6DsdH59iUWsbSwK_$8aXFhh0=-d<@4I$5M0NQIkXonGzshM{V% z!kruR4VL|DAUMEAuII7Alz{|Ux7WBLVTyY3UjIbG+!B*+W#FQ78~s6pZiyhH^(hI; z;4(xPZ);cSG4vMe=-g%dJea#qT%wEj1o+4H=p$vEvl#4$$9ysUY!k>WNW3>B$Z7yx zIQt3ry&>1hXEIe@5;niIm}?8YBaC=ovk6t5_bb)iv;??_=o~p`#vfI6*tu|f3 zGTWx(-o&&!_!DwC#6CWh5_uxtZYjdSn?r(8oImP+{wA}ZB~x!J$f&sQ5#K;sg2RTG$o)gt>mvC0x3FGrg|J<2rM~`` zo?4g)rZd*4MnqEV<6^gP-amYAGl@aYVfG-ut%OpA8tb+lis5wYL$tqb=r!m}hgugl zDt}N#ep+r3$^1LZl)Owyj|oRU(3MYD?4RG(+C`#c6uMTaI6J{VX zT2hU~UOFO|8FI*GIt{^oz*FhNbE3jZ=BfMMg9~tMeb?KXF1?_YIc}0Sw1f&nS@wd& zLh?5!qB*EdhK+R0F??Cti~JLfc$P+=xZ%E9M;cAZNo5tK{y8^wm|B$nYEA=6YL z`IEc;lx=UjLY7xLi_|dnWlzgA61Put_N5%jL>k31)@iahZRR8CRELI63Y^34i&U~r zji4Ik;%`l{`b^MA<~O|Eb`f2~_5CN}*y{p_kkwuF!&p)MPW7f>)SZMB1Wr+ck>@ zcjm{A{X?hSl$Ns@Qf%LJ<_R}z8p7{Rx4|Ry{E9zjE)Fn(-!ZR~9C_vB;U=cDpSZyJ zP=tq0iYZ);VnW4hPQhugkPmLI)V^Wq&SY%(Vh_kv&<&tZ7@3;y#Gu>$Y=F;nnl;zb zzK{(4kr!ipDJ*wRJ0-BYfZfBMc`QF4^4lQtK=!$t5ZyTly*$je<_0ARTq}Z1I(3L< zD_*8){)*Jfo_kuya6^;veU7#<$~8mWeI_+PR^W(fn*-LsDzEZB;b2*b#qiZ_fA`8b z?Z^k!Rv?3g2h}GXhFjvU% zNZ{joZeUysK*vrvbtr-Kc2{CDMK&!cm`}++RRY!=JXiuyAVR+CO!{*X94O(gl=N(F z#G>ckXYJ6{RwNc$w5^^qmU>w*YmYsKd(N%S6K;xOO{xj6m$ z+Hv^XE|h@q%*jhBriWG~6VVnwOECc|0A1Z#{(g$0^}A&Xt7njJOA=qhKST=732Axicg9ysGs!4iTKdI%O?DrET-QR}0d|1f4$jT1`A$N2Y zU}gG%kI85_ohv>&&t!YLrTtWKTMO&SrKFD00 ziH|B_)r7lJ%*Ub?u)#IQ58noWQCG^9{>Vq8z=(NSvVaya$Oq zz%7sbp)r-08z|3BGo$I&7lXP2-l13rD}p*ej-Ubc!}I-M=hacRoS)E~#lBXa4O39x zoIGd>Y_!WA{+$;p29Vy{szHC3pWkTzJ18vw@1UT(5&V7-wi$!^9yV*5RDz_flp-5} zxasc9n1Y?qx`Qn^S@!*|A6s()^IbW zJL0pWRV89rTL^qlz}GpB;e9l0t3Gbnl943FP9=)qFL{P4B{m?m#mv}j*A4F`I_zch zZTq{vKQ_Gcz-N8xawf9oPGXG|H4&2d91j4&SoSa9x}vJc^PA%AN*Pd)oaWk*CLVG3 z;ejEID;WpkgSg}choj;0TON`y9$I!61O}Qx=>V5}ea`&0m+Wn?2dV&W3fkuNIw0ppy)3P{ok_Yw`-xBvPB2IO1ji@?o~1%=?QWE;*4oCg=STJ z2I8cEgN4J2Nbr!@ix+DgWS2 z=KBiyc=lK}nXRJ!M=z?Y^>er@y3jA0ADY9BTa7q1$jL=70tq*Vzl|oiZ&91NOR}`V zwAXn=&LIllHgXkt20dS;_X!&0=ickZ%4qxW1~g&_-;W}_IPaJOvKHWsVWzAb;0Wo{2ZU&D3UCkqK=nwW|!T& z05jkV4mCh6YXIv7XV5Z6yp2eHdv^c^dah;S!Q%p#UHxwfY5U~BLk~Z1!%>qpZQJKw zXO)4;Mg$xViwrdlAzI|Jae__xkN}k4s@(kg^0D2hv^fwJ-0gkss zIc>nmj06eXd3V%?jZUM~DBHs*Qb+w8pM=yE;n%s(z@0$XKwG3SUCkyMz+ zIx8IzaMe9}QC#E%zUr3C6AMFKseVjfe7ar%f7=iL7xZwYW!m!$F;1QQb~MhwJJF8D zF`HX_5{nwVk(bJ`O z$oAU%lRKuR25LjB@!pB!%%S){C$mjF;mhJjw5lJ}#m^N+9cx>XXq9 zTkxiuFSyNbry+?@>TG+RuZ{C;8Kjuf5r(LrEB`y81Yqr4L*jK1djbPtrW@R*z`Mf8 z0ZIPcH3Jx=%*y&7ZI8d)i1X^O?ESitDl{4#CTO;E-I~-BaE*h?IN*4X&>36Zh_=Ya zihxiU{8FCR{;$a813u|>4ER{tl(XwG8WD zF#L%2#xhRRM$+Qrh8&S14MIN(@)1D5;JIvi_!r&}@S5SHSGMF5+ed&MxBm&4kuEHj)qh737I7VRd@I zdWl^Ziabp*?fOjR#6}qxf}^-k5yRH|Dh1CyNCwA*k3UFRcYU__OWADKjGAkAbjl)( zzWj9Hn7o@`Com3SHHk&8Wj2(=Oyj~^2u@S@B0;m*sRl(9rjSj>bBkT(ygMwvc8eDA70&Pv_FL4#( zD#TZS6AYL4$wTQtZ)4(V8xQUw$6E#?abcjVWy^} z0}jD=NAM8Av-*pU3JWhkdLv;zX|$i{>=QBYFFl)$Iph*8RVO+&@gP zk&6b(Znb?2@q=w zvl1=AD^-SR?ao(8+~AbY{quacSNVBLkg}VL_rEQ~;#dZjgFD^AV^7qrRjAPegF4+x z{w>q#A39Pt%1=oZcW2wiqGQjlPCI`&eXc!c|4*c}K%f;>7}7eul)x;>5LkI6a*4-@1+8uwo-a5!FmbmMN) zXF?anW~u+t>+%Ac@84q5EB`(2SB`-3X?foTjH@|F{d6C!3as`rD;!lj{xh?7R`g5Z z2#;I$#fY8y&yd|;8SbcPS@{2~3;JI>%YUIQ5*FBL-XE!&)bQKRn@zRf|7P6ngyI2jil#!EUXw!4GuJ?QbI( zmpj^5>9t#?;7_g1G#agNv}45_0S`Kh<$?_dWSOI8VK!$vRX&5eW}1}&&EJcH+56!- z0cxdEWeM=YUToIes)=rN0RfuIx4(0@wrv*@J;D%oXVNcDwO9KSRaa%tz*-*G^^n>7 zFNbifG9P3ALyKFpUs5oygGlT;7}x)G$t-N4^+~v)MT>shBR;i8>7Mr;-E>(QdRA@Y0n?b)bK-xR}9Z9fGLcJnn?#e zt>)gya3q~+A)Q)M+TK`b3Se~lw?ap$t4w7 z_OoAwmpwVmzHWqb1K8P7Kr74e>9$O_vxb(|+_u7r_vCJ6>BYvfsl=AkD#c8->P0sg zvh!@VSe^N-$3KopvjdEs4qa0?EoS>qT@!vZ95K+*FhnOi_ZVBR5ZN;Pd}zJd-PJrn z_^a_~Uo-u35nHqTqGJsJObrE}&IvsQF3(fYeyjdv_n%P|T5AK+eh$IGxH#4Mqsmao z?4eDOfVJmjU%9SOclnPipN31DHIJa@KN}WMV(p6Oy5<>RB5z6L3wU&h^5(Aqq0QPPHyGu;d6*76}9_~*X7IYe~ zAXgefHjG5ozkfF@nHSAi5B_z$CDfN^%reN#ngM3`MiMdO?VJKc36!!)DS#An5jy*1 z!RNMbvvO;+k~C32v6<#t?{ef+|$E!AhEjn4`7(jVu9Xc>$uehD!Al!?9d7Li_Rii#Cd+E@vTHsG|@fbFLQTsQSA1 zi%p5K;yhHZ(t72{;%Jtro5|>qOH}_hU+DFTP4+B3xrh8~m5xAzLI2NlREon)V0>EU zusb}oe5D!J$ZS~m^JBB{{1fc-o=WWtWD<5EQqlM95{0p0#D#0~>xw1!eSc+BO|KCft`qc$QWi^f zLeR6F00XHw3g7j(v%#|S+Y@BXQ;O?7Z07ZXuCHZTMjT~CakJwiqGP^a2hr&U0&%%o zyGMKR@#RsOfJ!`7Vy{5j)@2Bp)wZ;(Wi=< zK=VGtdGWu&^Ee177^)Ke5!lLrc2?=r=Y+3-GDC%scNQJCN*!E2<{apEhJLpdsyio1 zY^?;uBqby)tNAN}ZU)DoX8URBcXQkQZ-Zcl+md#+dL>mFEL@Qcsf(8D&Fft{4?Mf% z-qwD4bM3!e?=EG%Sgk3az0S9X*S55bqm*Kc27bO(>zh7clWUJEtt|rzm){3OA=~WJe(auTQKTW|Nv4v`EWMdfhv-l*t(djP3Q6ywKIl)M4NK zapHQ`MPLgaljyY}d;JQsYE_3K+;s4&piS0@1YFM2!?n9g`<22TT#%b3j!;Kk%hRRD zlDei+f=Cz1W>8nq`>VOdn!0Q9qHLeIqoumkmdoJ>vV^hY>$GN5v~vd7bgnZM28~Fi z#Lt;|?${mHQUsr~w0ypA!~7bWCiz7J7tP1mWMb$2bkWG(Eq>7Q_v_73W-h7@A)mrW zq!h#DB@hR9q&>I}BLEKrjyL_~7@&;Ol>2YpcD=3pGRdm8KJBwG`@=MG${qZyR!^ff56!(ulgoBg0-u=nY1{J*sF@ zwaC3m<7kcSqFVP$f0`jZpHU1|DN=|r=S{{h$_%0Oye`pff;ZrK4PS0^k10I#eZC2s zJfrIyc50@f%gjlI5c18dm}a?K^z{JQ;pazBT@Jg=bl#XSrax~dF&iwCIeYN9^e7Kf zpYE?prQ<8-_PcY%Ob;~FuXB_VxltR<4G;LJBS!@Sg>nnn^#(LkXv!+Vo>noXye>l+r|WJ)kkrxIFiyg&t7 z$?5Q(gm35#1|m}n@Hp@)k{H*>dO}~}7;jq)ReCoLrjkof*YLwruhqF}~Yb_h{S>D6vkKxde9e_clk>zA<)cLk(JN61XUU}3^CRRNXs zZAZ`TzWXBpPK||)Eh)yIc`;p5goPDVv%akgaZ|II;Lag%)gmhK42(=orGtM%Oy);L zpMdaP_+E`>+=te(vJ46NLwyW#a`Hd|)jv7nuS zDZE44@P@|Y@mvbDBjoZ|n@+IMO?(XPXBQd=0X!7~dFq@+V5Ltqcd|(>7w9Rpt2?kW z;@v%5c+I(XTAWHb9OooNT?8$#PiFG&_w%FgH>E=QZxtE>Ie44|4D63y`sdGP0$7)r z!OWMQ2f1bS{k%!_3bbmK1gW*ruEQg%5lpbmj;5nvc~8yiw$DLyu|Bq|;M&j1G>-c% zcK4~r@NWWztz zS40K0Eg-DL<;1!ozHN#Hqm)s03(Jm(x{mJtIKR5xNEj3u8;XKO-kz@@{^&n7&z_4a z*Hq5xR|B){je#W;f#pqVGfkwr;d88TjE8Lso~2c1&UTqHvQ<2H9R{>hB?PL`s2#>W z_;6m~FrpJo9gFFl*bEZ##RJvw0Q&Qt^B`e`=$eZ&N>nAKEE?8pKCa@`p7lqe;epUL zy7N&nyf>>*b*#+t`+=ST*To0yPw|+3=H+(wy2lAp83j)erEi^-W^T&I2VZOlY{G#L7B6a`F($UzZkl4MxMk* z&6`E6mjQ^tG_0or8(O8;C30-mSRKZXs*dIvfTSzZRI2PY1Hl#YAhNySReTF!yXc_T z8Z8p(LIMHUE_Xyla?nXdpT4nXCCj=7l^> zD3G`H*~*7$dPj9p*-WNIqQGvUZ=Tn=U0|2`zH%v7Xo&Tr-WWdU1*2}cUp<7w>=U7H zI(^;G)|IvtT58x>Y)a>Fu(VL$LNNo?^r`78(n^SwN_l*aYJD?q|$$|3djzl}|Lkxc>Uj z4O6I9Y8@4(r)da{0pA-Gl)#`V2PlM3b>+*>$A(hbiW>dW*-JEeVTGRXbI-a`YN+>) zPnM1$$)m1;!s>8n=VPgLq}H!`PvX;eAJS8s_0jCYyTnk(6b3Vb?4xA`{{=^Jm^TCc z*ot4lJ9U;pwZz#DGFE|X(BlQwPYfE9u~^kdehq>)Z^$WEiy5>QbvdjxcqrDonsa3m zmDqRe7OQc$@vMu%dY+=?*FvfYA8@whDZDV9v+XZ$R{*oQtxaW_ot%=8xAnn_#hgru z{mweJ>q77KkLy%Z!H>{s3AcD6+N%+gU(cW%zu_fRr1VWAT5;>8%gjD$&mRdcp(T>U znWhQH0sgF=-ho}f&t~T6Gb_IH>oak&&`TJ>ARnZF;>7@tQyS2InXij(o^J`w0jb3T zzU9pkw79IwM+R7zr@7{4h37(qBRY7rMqk{YcWC}xHh!RpV_nF{i{KnN42`0TtT@hS#7HgBTHWt z7m>$M0{xKSs;#nCQe}Oim%f&+9FUxcrUv}{FTQ}RiFtq30 z&0-D6_H?EPfBbu)Zu?wOA!kXjaFK$u%2I8AFXG`Vx=?Dyg3r^1n!a6U)xBIv@Go;~ zRuaF#%nhGMCS_PdJX>OQ-!uw)xOcx^!L0D;fqo(+g&;Hp_`10tb@LVxcyOe^Ml{SO zQ;r6^0_Bn(^pRdBm$5Xc1=Y!Hi9paV#`rD5Ecf&7C5O!iDYoGNc|)GIxk_z`fQwti zq4WN=DTb!D;^Uu`^2N&4oAwwWE30D7%1V`D<}MZ+6y!rvF~$$F35!VgPgj{3a(DLD zyzgra3V!Ffe=4JYaz`wetorNi4Z4|<%A z^Jz-Xb+mi>VsxKWBfEEX0q7qv@8NG)+|yJf_%}%Y`n~Ju0~6Cuk&dTdT7A{;(-i}S zY2W|=7>~a4lj&SP8#u1*q}JnTE3^vn=4Z1BS{UM+ax}(fqdXTVj)kH`xB1@aO8#f^ z)seMUMHL{G9nVqkzhd6Dw+BGMLeAUa_r1pGw-1-QE5SBC5|$R45RGPsVw1fUUC}G& zt)8)E6+G2MngaU{k)e~k2n&k{f=9p^WPsiU8+n)O#w82}jd26nEc)oIyjl&pG<_`n(rV zsOC{Qtu$7|QbM4{BaPv^^0X>oy9Y46dOJUKmGwOVucl^Z4q+(gM-8kbB-S7fGx@Qs zHLkx~C}b~bmQ)cVX~e9|OXY&Xy&cl=!$*l~Hnoh#514O828nHxp`u7ZB%FAhx$#_%%w#7IcxSAeW|u6zmXr0TEwWt=-7JgFa8k-axV zf`$nPEb66(z(*;{7VA%>JYz`Q1-(~WVH!N)+vPN4)>sXGDvFiaJ9(Xas_I-<+FneU zaBv6Zqb=tU0FTe1gU`WE3bvg1g!5|Ty|R4CR|PfaJN$MJ4yCsUItiy9 zrO(W;>B`6UGwWayKh*~yHqVIS8PsmpBE3P-FsaZ`iHR_ByVz#1IG8+K{`A&n&Ze_H zv5`W*#&S|G;o-DZ?BP7b$zwdDqtxjzk91|d?Vg)(lK=0RFVnWk$vEH20c%E*H}{L7jA@54E%Dp5?wTFCD{U9FJhybB|sxhNt$!TS?ndN?goDjJM2uXtsS7WN*N zYyD2EB}MvHPG8SC|5Z|I0>no?&AUl^ z%im$L$Ekou#ZMR(+|!On>nXp{qO}J*ZYs#?ec)(p&Cj=N$U|HkCk3eEQ;mj?x6j*9 zpL#=1z~-;qY`=Su65gEZ1Ol8o-@~god+kx(Z|1TzVo4A2Z1ED9;m{cKowgGS70(#v z;Z3;(3{G+3w8-s%RRT2S>zNqWfE_rwj8S{s*@M2+lbKVa=|xd0`ujT;%W9glrK@*0 zOQw9YZ&9^kyLVNTgH0}tKmI{mAI%8g9g_%7HybA(TrHd%-ZWu|UrHau41!7GO*%K( z>XFx=!$W<4O~=?7@lpB=g-m3Qy&n%Q4$)sBlPKBwnXcluOz-AJPPOYO!%O1PFx@e= zil@BccLe|ChS1`(PEB$m&(~N z20j5>ae&n(T;84bJ2KJ6Ni_BW>LnS}a4v5eyzY}Pt)h|TxKeuP6UN^^~W8KR$tgw7n8yqb1Y;OJ+lBMgy_xF)d+j^ zTv_t;=_~;f3l|FPQdk$u*r3`hdCaI%vaXIILSTPGOrl+sdhu5uNWfp9zWh0_Vik66 zn*A*0)qnbj`L)7f>Ti!PPo;t!D@YxbGq%?L$QC^x&&+IJfDtv&qyi`kf&afghK8u) z5`$Vz>?Z?>cppz{=jr}M=1;KY`kuE0$~20*L-A~X7sXPh^9S$q?zQMkYcq607^{?u z>Z6xHC@4{UK3=932|;{~z?RtZ5L92aAPPxkU})9g5US*J0Um5Yjf#E;&q8@TOPim{ zs_w>ry9moLx@8qOhr%8u{UYq=oLI*Qi^tEe3?!0}#Ts3+xtNdpbV0$OV+EmSiu{|i z7)FkU>o>58blGIb&kov3Zq&fLC9XODcPL)7>gN1MSf)vwNS7jL6UB5DjM}4$OJ|^E z(~CMJqt#K3`*;viQ+@HxG_{lp{(ov9S-f&{5-HgvdU~G+OEXtf<{WOCem47a&)r1D zFC^@;>4>*yzPVWZefe73TWIVL2U9`?+63aSQ}Vr0D5q9=@*Ebc`R}Cv_Ugwsia4QB zpt`3=R1MdS=ffGb!xTyoeYV%7#)P^c8WafG49nKb89ewOk@16gAS(-Tb;8!p z%jREJIXC$CN#T56pNpA)amjR6P9c5)&yhF6v)FQT6@9K76Vo;--FAd)am_B(?%F0g zdWJs!cIQvwcMreq2uSaJ^Oo`2olgEn>HQn}q#7+3nG7bT=D+k?YuY>4>eK6Nu<5@c z8Z*`9WPTLM-0UE;FxkLPi~7HlXgg=+bv>=vBNnM!>yNJ)kfej78xHG_d=_G(($@5jG_w~pHs`GP7-gft-~v%5A?gG7IZsb;RVz6h-ndG z(b#D(%nJm-PJ84-se%%HO^<~?ueiAe~I2WLX$C=LmviMcC z%A1CSG?K*oW)5ss$GEwQp%8A_8?t5qxr!_wlmQ$VH>Da4N``Y!DSxjPbYF{6g;qEs4s;U3yc+s;OfmTnO=%l((@Ht$!m91SGNc(>-i)zb&shckS*e;;r&jDR6Kk* zjL5Ek4cB2srm}F%R->@@z$A;V-mk-Q0Y0rWZjCS%WcP!66+jx~XfArwtMwt&{7yL==Vb4{ho-))QhJ@8E*e%GOU}e0m++S; z?ps5&-Xf|HzvMPuMhV(BnqxTN88ZGtfDiNqYDE2n7dO1F@`(&1*$$BA={|n_+Q{Po zXSqdSK=|ypG-3FzWr!NZzxC8Z8)zOUJNV$x8=m-qDbndw8L}mCP@r2(CR3X>U?ZY zeT&dRxkZ(9NVVybISJBiJo!XUC;Z1RM?uFDRc{Y{86vER|Y&$mCRfc zc8+r@`#1sAe0-$A!#yZ}1fX(CGlkxj?}DIf3*SD`r+BM!#O8FoJebypFdqj)bP=H2|?=Z)dLV3P^{u&BWIAcu`l>(TDzA1xK~|2sSXJBm=KmvtrL*Z zS?7&J7GjW_PWp7GF!6K%48VL%ZXY_sFAgucq!H^UOb&}!X}do8xAp9;xl85E>86wr zlWfdOSQo@jvp2YV1ZLP%-xgb)x?XH>lAw`Izd@p+V14sgBghtt5BWjtm*Mj$I-1d; zh++}?WdHYHLT3f)~s7w^r;gw=_j+j5Yguz}9w zJw&Z^jslq$OYFl3Sp?RGB{qFjI95rRvQIzTC7kCYxCD#o{E#7+XhcC9pq*rG4MW;JCXVbv2{OzmE?!72p zEg9nA8qQe$qo5SHAHXZ&yT@@_`Lg>yI}=z6Zp|_CaszKi>2+7*`@NmXjy~!cp?T$U zl{B6-lG$q6t(UO8a4gw(7aqDTf;IYFE2wZ)600r8-k2!KF$?^3tlRhT(6T!TU7v>< zO7kIV2OD>Dya{g$_OoS2?f!DjrEf$Q&J_y?ut!k0*5B_x(SR*HF!z)>pHB zO}BfI9O_+MZ=Bs$DCYOS^n*}VI_2A8;`@u(Qt~IhL4T=Si-zI)H>PQCluP}a z$cO^!hTXVC@NmMXW1@*KCG zt`}z-*CW99U3t`)URllRH!MNf*7#@hhLw?ZwnldM>9Y{anb8-~C(zWLT$bmx*r|G6 zxXFF^o)4EUX3*s?*Zs*;^zPVu)sI1CIR2lD3qC5kgaH<+d(q92S;pbS5oZE(2W=KI zOi`G(WkYhK6uW6Drre=$5o(}?*CK|{?s@(`$GF{OSR8N zi-fyJUB)rRxRVVG1*sV1G^aS~d|7U9E83iEPFOIvrTUxlx5|ZA1tI8*D_@4gwP1%` z8(7~>J`xdZr2wjRujIi(giux(1!t&&AiI&bN6_~1e)(iAjHsSAL+4GE5^ku%lRs!; zUN0=rVvyL6a>nAM+}z(h@U8v!%PbpBSz&Ik`!g(D?LbNHz=#E#Kz+fid;5l|5jcyN z7d-g#zW=p2f(tpB=l}fcE7M8Op26Q=GG1%Jy@=M;Ca!N(DGqF6X_%C(W?w55J16zK zlKK6y^AR6ta^1~)a_gwh4{jHS$?D|ZjzE{0e~n3-8DsZHxX&Ss@9WO1s_L6h*bQ36 z&#jt`fj(a=Xsy&iHwX&)45lIfVC+K?O!bB`i*I+%Lpe5uk z>#D3hc5UXqWt~y{V7zeX1(~biaq(6{5y4o%7p}j$W1O*S1oJJ%m|!MO<%laMfJ8FT z+U=h52tB^%Y3JW@ zhn@Od*0bKHU)b)YkJk^x8HTA-9qL+>Xv z5QWtz-So2;u9bs&!HO^mAM!lJSN+vuiYK{x6X6~0G+aeW_Tfa1MDjF@w%H9TSMtZX z24PLNtGcx-hy;!Z!gY@^+XdP&A^SZv0gZ|~r}=6d_s2SOML9-0%kXNlc&_D7Bj;q* z`Tc`YF#ocfozqG`*?Qk>rl^3PfZ8Kg?#?p;rmBoV1-~#IAk7umH2?e;8^yx$s%cgl zDS)?(JlH>Hbur_0A^ilVAPrr6VL7H;?(I}|K8r)&+{6!@=03X4^Ycc+zva_BzhpHU zV$*Nv`|xLv3Hn5UJnUl1)ux2sWIp#r$s7bF&yXHacLRkPlc+8z!@lm{Y4fMK|-*)4XE`wg3WS)Cl;FS4R}7%Q$!)hhHq zF8*fAG`%poNNkVX9;(?>i}~ss3&17T{a{{g++Ku)QxA!!*TO~TkGj&3m!rxan`N{K z6fr9Och3=eIWM+ceYYiA#zS8QJQN$@+(-+O2nets;?vn?)PKxFv^zC-u{fv4{cv+i zuqNl<+>gDl2zgERsJvv~!@gHD-mW$-=o8RQ(gAvj3QGIS`KuyQ{xKlC;JgAx(PerP z2C+7uQv9pG!3cb#=wJ5nX?q_opoZ$qn}uxvF9Fz zKdCrVo_2k^>~+OK@#P;X-$$Hx2mCarpkbSFn&mG8i4AJ{=-B3^Ac|+zH10iT`+j-- zLWuJsLLz-s<344UOSiJ{;lkj}0xQcmPPea+IIAOeDlsK~WP= ztQ5BzA4#ea&XN)(9|Xpirc%mz-x@fxPf#MYnf+IB850$jyj*ylcJrL5>Unudg~H2q zTO|AP)Xi)TV@XU*^CCb&)mn2OVfg2?Si1&X9%j9w`qlHKX&E3~h&Xc6s1WbF!_emA zc9$6$X0KATZ^r#P`SLtPzIH@*koWC}&4DVO3$^2_83GkWW!eM9t!@tlp}Z8GNg_EC zzHJQ-8?4ECEV8qOYa9fDLcSV=8nXscX(PCSsrt{5Se9{o3Gb14+3kfD5nSZo#`BwP z-Y2J&dbNQwzKw`=E!U}XT^rRl_oBb%pTE_ucftm8S=DW#>M=zL3RIX%Q?-JAsW?kc z$(k>5%Tx>|AqM_sEAOf-|OncF{BS^6wx-DA85~x_mUD`QQx;B;gIf7v(f!ch5Ts8|Tv*&J8`Kl2o{Ui}v zMQ_Am!Y2pF^b1cO{rBm?cTrDdb+;g)7zt~u#A!d+qeu&>D7*?o4)GxW6N(?mY$)9t z{ZkmkAro({C>i~j7b*%|fP#45$qoLX)rxip_9hP#S?t)t{k&fbbAVx=scNwbhQdrr zU$px>jfoZI3uM)#-+AH1%Wc}0;W$RV*A|TEi|2#1ElBVkb%|fba5JjLEp6HWZ%uf% z@hR&Yw_Vqzx*36)6NENQZW&vI{29aE0KtNYkFvM7B5VW45{ol zS>o(YrW4|*2p0GC9UbR8%K{eExbzgIu%Q4ERdr?e^=>=q4#|6%wMytP6h6H{#fIDv zvE>GIV|9%rS5}xxGwRfDq@FA`KLP5yX z(|+(BbUPIyL8oqc;K7DeRZ1Zq6zS4!4b_-c%!&}!{zjU39gDz_TyJA_Jr;y6LYsKX zVvVH7?ddAX^z~GW`FPpuBc}zMn!gL@*=T-*RcpT7faPI*L3%UP>U(qf_|~XL-@0ji zuYp#@AODitc&3sj?-jlsISANRY-xPuruuL?OlCPT}GLI@}d5^nTAvvM9-s%(b>j|te`RbrX^3xo~(OE z!n_8wwR=?qqDxK% z`0J?8&O}yyBeb;i%k~%nH`ZC8Fu4?ZXY!X$U#`BP{Fp66YN;AocF!nZ96TpzDK9@s z1s|^g=!_49=6_~69}CbS>|S(N>J^OsINKa%inxA@8JizZ^Z4Kj)7>_Q!px|Q#>b+) zITWX?{le+UGYVJ8t!j9Zu6vvp%IW=$xzcpY0YA-Svs0PsJS5s3}O4XA_>U#*>+m}!Z{Y~b) zDgv{2Uj=z=jW9U`j^CXx2a%EALa71WWt2KV2#RriF-yhcJc`Q2aT!^y4AmyO9R*@Z z?X^=7_a-<~MNmbm&iwVX~q6d?zCC-*| zwm&8R{d9P|i37*Cg2ZYsjUIw-0LC5}_eHGPm+kTYL7YORdF*35%+mkV^F33kH!zuE zs8|Pwm)pHM>a!`X$q1!s(-ZYek;hb&^EoDE_dIV-uW?}$l|_R`KJhvqsL$%JXtcDS zR!<-eM{zs8FKk$D?o;n3e2EB$y54~f0Zi^=`+IG{vk~Q>!4=W1o(3)Z0P?-knxS8? z*KimHYL|zeAM?Ip^`4LM>d$O#V9`1&Cg^E##UjW{NfnozX5nOQQ z>jWh;t~sg6Hyg-@#~n`?46!stNWQg%E{ZI2_6W|$ZBuX5<{Q?v+hvBD$br6>qidA| zLr*t%qpoWwWD=N5g^Rf=iaSApcc4cohZqLdv$KE=)&*Q=!&Ek$$} z#Zix8!}0(mq~LCf&SZIV}mIdHV5Q0>bn$n@Zxy60l0ZjFW39 z8M=weQtc4wH1x~?Nk^4XDC;T>uLAiAsM;nSDW%1#ysA16E8o9}xG8+~FA^h!Ycw7O z`XJ|qG-uWq9iZ?cJG+;rM3|OQ=L!#3sT5IaQN3_61G0*<((uZWRbQV+Nzx=*sIbgm zdnFzAm-p-GR?i(S7>8bVn~(a?2W`e z?^4%4R9E1eROPhO<4lph^k(fX4V;Y5>#w)DQyKgb)c3#@@wjj+d+>mpNcfWKWRy!V zAIa_nU#Zr-%ZJI%a-W~pY>c?8B5~y<>?>?4jZG@$UF30R~K^=DQlGs}4L!mC;49u&=ALTTv+Xyus8ugB-?c)ya=*^^tob{F&S#JDH?&4MI4-+wdQJQPE#3n{Ybnpi97(hS}KS?2^Kg6#RH%p$l0j2x6}IkmX<`werdcu6AtuYs2^V$>L4V4 zM*n3C0UluNB!YH#mv=QS<_d9UkoW0(uaDKXKfpE^A10O(hAS=5Ba=0wbsI84dnUM^qg75^gPq)W&fBOev2zr{|%ZaYHJY?!8jpw2+;*(4u#f)v z8SESaOIbSXo%_^+Vf^mGx~x4V3oS^^3+`oSMSZ{!xVIgu?6|3iSB z6!wVBbrt>sNZX`4ho!a5Kb8{3u7|*MTa>2S2f=M=%&bQ9;lyIhPho$mcIzQWr-lPax%xB9qv5?mVj{og6wt{EsU!u~lQGXtPGOcP^ZQCMq19N0 zdKsORZIyrPv~=qWZ}x9k;9iy6`P^(?Er`H_$S5>FqHRk?yUKDdHNx_&^N|2vXX20h zQ_sr;0^;N$o2bYx66D)SP* zFA&l812&h9mN<$ndU`UpHUwJ!AhG0q$B=x(_xU3Nh0=Jq4XnWMD5A9|)DWrIHb){S zh+a{04R_$pe+uwf-HH;s4t_d>=Ja{pT6$(F4A-NkXtA|jT^n6^_NClkh?xg3M}3D2 zf%jAX(k}_`VZJJ$wXJI9-g=K3{W?DGWjt4ZU%cP|LRA`izoA!++Zm~i+)OzMRHYv$ zUC@K0&MLCoIhu65kkiV!2v4tZvUgqjaP9kH8LfoLO1q8f)lm@<6+nQhz2@91I-ljz zz1dwqUdlb{G<^v*bu%eD3<&dh3t31N@QNekw9LQVOc0z-bE%IPl{Ai{Rd{#o6hBOu zwHq9)P_30^@Zbw${BIo==yd+po+Ho9ka^Y0wMc7Mtur_vsjC_-)~W)9{OgOtrg$U> zx-6E)b=3fFA<%*Ux++mxIEVU=AzCxO88Q0+DfK-bJj!R&xf{Lc{ZCjCS`xJm5UXJ< zeFA0p6)G5h`(-z(x*rRn7$jaR=?B&@4nDUR9-NwZvTEfyp)vOMI4*oUbBh1L4Qj?&5uzZwo`hBYX5Ydj|;#DstkA}r{GbMW+K ztF?jZ1sRub%#3MB%W1N(<7(N$a;8|9N20IO5ASwao%3iP1j}a2sXOe(N9+PCt{8_~ zUtB0ysX`r`6B~GsF^tflJFbRm&1ZSPCO#!=-Y1FJaXY(eWP_tcZ%WZCOVQ)qRsfhyjv23%DjM zJddkHq2Z{HK^@$H^RdZ-7~igi@a}6QuVuV<5urG_m~EWnp=tG#2T7lqh!|F(1L0c5 ziaFo1bu0q8vh2@JIRm+l+gr4>m(iyRKM!_Wbf?sezuVs|PH859Obb3i0#{C&-S^Al zFe^&Koe3-rSP^@P{CJN&RWTHHfhg~ri(>ld3ZgaNAI_=@{6K%|T+N0fqEQ`-nc`+= zmzTz5S#rg>pa<2AB;}WByV){ZXgD}oBT>EB%kx~h?+J;PUQD|Kh=fUBo3{E&!$1*i zBhvo#F6+gjBiA*UB9!kI7qwfjQEVJ)05aH>*_;?rugGbcy0ta))8}Q@%Jo0T88BSd zxm{iVOPkp($oP5MI0wrDN5o6GXsO?&q{O@pf^5~W82s(64tG1*J9-Yd$ z4FMa?ij{MhUG}oVyREPYCKdn=Iv0XI zF8^mIYvUi>cZ-bg)=f+5tXy_)A}bWI@LBNlo}O19B%eDu%Ymqey`z>t1-1IqPoD;_ z!G*?VWK^Cjx%yj%Oc}sz-!HbmopX&a2ME0<_r-M&c$qVOFz;169B57V8#|^KvGsBR zIqdE_xG|*tPosFGu;9jMmSl7h&%4!Jsioc}=REws$qSkWsIOzmU|+LRe;8hGPrasF zO|jg*{fv+LjE(r zb#10y|5 zSUJ?g=qA8;y_Jk2o>#)F!08U`0MOerXi%(eXY)>YKZSOtccs;>0{sxpA~Hk;DLyK1 z`er+Nk~KuO(<<*7nR&*aL_US@Lm*tLCGqDADzX}0kB@g`tQ+YCPtThRxbM>dwo!xy zPhZmsC^AzFnX>Iki3%OJ@5_$mt<~O^oXfRPEW}mP^WqX3iv-Ug6td$mo+RmOEZD_1 z4oeQL0c4depAsQ6EGd-(ab|pl1)}_I(+dinx zCwsnv+ePmrtg@K8o9PaEP>p+AG&m(K$Ew@5HXrdSdfsz0pKeeFe%9Gfyvsl&>-2EfK>@p?pk72-nsq}h zjjiOeFB>OuqYgEGWe7$)YlgNgV^A&6Ad72!&i_GlG)H->Z(ES2CibiW zemY!^JPA(ZvQnKbSN^O!QlLxSb1-n>2@dl9JGo^?6{$7Z&erD=g6OotT2Q%OcB} z!5qm>c2SA>%E)pWWKz9Megu}E2{Q_UB)E8o>cy$t%F6V7obG(AWsKVOjS(fOmUoxO z%4!D2jMkX!m)Y+we#Lb3qE6#7{Qk&0 zA<+ANIecr}8yW@X{~uG#j9RZDQXm=0Ziva$T)f`)ArqKCi~OD~BKpoa?b%oSstZ*_ zrnctx+#>di6+GM_03PZ5?6%DhYb8mWcs5^nWc5oITJ?9+V87i;4(j|#FVm-GQ@&7X znCmnMH1E|oeu_EE$}$PI7}P=S^IGNfj7>oHTO<`*weDRQQEH)1tG>ZEO*mEt);j6b z;Kje{5a|deVS7L>54dwpM|p71w$8>uG`jo;npO%4X#j(&EVnip=@$;NmLslm!{TQaN_cTAgzMZv7W&^oxkPi;7(WK*F|Mr_pZ5)g-7xsM_NbAVq2$lU&6V(h5 zE~Qi>a{?;khBda5>lrc!*~c}wzZo?ur5+x6lgmu%d|y&TA|-m2TG>yX9@LN_1vu9a zWe8RzTGcCqJX7cHTc+g~K$a8ki~_B*g16zvK0a+teENpN+na5joy@k$!%x<#F(3vF z3m_{0U2nTo@UFeFzWHqI{Q@#`jMGq5HET{A*a)48XY#14CoKPdLG2MgJ58~TOx z6ej39zfG#6M$?L)pW?>9Ebo)mW1e>}Ua8k2f;`*IFl`7&Z(%3(PpK!0XYg)a(y`eY zJV`k@)#GI*)oMFJu9bU#EwI7~EVwff3s3J6B))mIY(%N|ajw4iT9x=@rX&HG7!$D% z&}Px0S#~qq&;2ZK;B?W8g;M9Fc(GSNUurp&z$Kd)LDhZp4P)-ZM(iG#o!b<2U397D z&9rlQu=5{~L^1*Vulfw-v|ZIJd_tA28uS&aG2Kw9v!w1LY_MYE7&x=(jHBV;Ra+Ge zUd^tr0yEhwockl*K(75-7=)J$+rTcqSjzWqq1X*LdH$`ivV zb*-BN(Yq1lb?!1gMZGfj!%0sCj{#%6gobJoHX*Ez5BNS1a(dqrlT7?*lt;9kn2-+c z)eIi@qTzW(cTuRuvB_ciZS;YwL!(z>gq_eSg-AF`j6d;B}cAuRuBI|zvax4 z8mNnJlG9N6v_zGeDyTX&QC!{uk>yA3gsQNklrSv3!e?sFX-`F6M?>Eb@^XHTqPIod z6+VY-4Hem^w-aD1R#aHVbVR&V65;@xl|ivv_CQ-36;@PX$hyNym@6VI<&~I7w$`Dn zG#-F;+Kh`;@q-&En$_DcTAFF`oZ&M?M-1;g8)u%X?ar6W=@y6`;fm<&r)s+c(2ON4 zDndvcLkCog8A#fvj?%Ph3ybjtqE%*;XRd*feeFKGPNpi5AQK9-8V|8V+lvRNk+)mX zDzrnDAAS@Lf%OncBSTJ69fV5-qy+uR)reK#XQ4{jn8fh--Dd*96v73T!Xs(^1h&a| zq6WYEbz6H`X>Dg3M>3B#n+YG);#W!) zt-qDm*;Fpwo#Y<)z6q76p;?xl7o>xjG|FbgaYS&@kxPsA)iI>~pjMC-<5X&v)v@aF z5pq2PB%_6)+;IF%;Jm&Jqg``(pS z6cN4HZ-98J#!$Yfbw)WF1Eaq+M9YqBl)mo^qVVPO$ zW7G5OiRmuBHrr&kQokPF-o&QHIeC?gF((#nSiR-z#-r6#V|FD4rAc;nBZl>7X|Oo^ z-YC+h9mkMBjGIjw!na$@<#HquR=}n@nz5pw3OMcEh3$lwUJn z{aQjXtu8+r@%0Q%>wLKz2HkhevzHW64%~+w?<6ts4T&8hE|2(ggSf!D|715&&fHeV z&(-8y>MYk8jZVlNE#ef0qMVhmpFW0`3 zOQuFG_Xri9s<%P4k(#PBeBs~|&%Ri)b=!dmLS+*c5-8v*o*8qm+ge51)bGrBClrZ1 zT7F<#p+b-S)r z8uwPUIMj?)M2O2|NXdp~I19dnFozqr<%kVPjtrBmxhe1kf!^E_RP#Y7#}sJ>x$oAA z99LVW^8tRr>EFT4SgjOGcO+ONa_~wTa%l@aGBeVH&G(OYicWuQnD-mYu9jTFqN3w} z2)PzcHYU@Ip^tcvErZknXqByfO7IEIym7C4A%l@x+_=D>7*K)p6*q^d>sEsW%06X@ zjSR685d2@h`EsG4PyB}TVmvb>jjz2ru4+r%YmH%qD zKp&~AMjplTgkIVjr_}s9U@ZoSB&-XAz(e3&pEih@uHH;KeOS+Zm3Wk2z~h`+C?^Lt zW_ltr(0wm}+P+czPcGnczB|z3!;uxpfcT?m_p{Nsy%@=@x1l#BkKck0X#KmL;(PYW5be-^VC}!;((aw*>?UG9|8d8Yc@iAQ(fz@Q0FaQe_5PhET6dRDZyx0wu9A{y zQQ-{HJDIe`)5lQ+O-s}wIs?7~KB$y@qWL0V-LLpt^W714gfbI~v+VEHt^jzr_8SyG z;V{f4_`Yx#6u`>`2+b6u8u`1ZvAF@;PdG~AQya3)QEjD-L}q=>f%kt$lGrPOYOGY~ z?_OF#y8BSoz3X^DDt9zW>Q|)@p>#fKBcSC63+ID53HxF_j@2628 zTAdBI3e6hRe|y!PCu==Dmr2SgtAIdWv~cGKt~yVimsIF#6$qyj-?7U6cbdUa({Df6&JQw+k5#g)b#dj@#1Tk9U!*7M9yQ`mU_K0fsS7 zUHZC;eonJ`p~=zgUs4m-d-0%OL9GhBha49mXDXyIB`u*mthq8l&t2+pzJ_+sGnI|} z2}JN{a#SUA^WzqHsQ1yY%$f39&#@pOH}TddEqnn&NnalK^TI~7lx%rER!3M}lUa0z z^7{J4*2{|@i7KIO4C#)3kB8Gmv5mX&*XwPCr$S)!PPRF}4hnk~aW>8aw2(Q@HZrDpm;>WZArN;|)3iV;mEg&A%H z(CP4rQfzgzLJX2=lng|f#KPHk?+RrS-Z_wc2|~t^MkWSJ`vmGVbu$pyI$d6-JZ^@yof0P987XU-*y0w7RU~VmCR##bPfcQ%Vr_DjiNtl zUj$O7Z%od~ylWB@)=vD49?A*FvcHigmNIu>rwK#ghYXkEN;|oL%_X_Hp&KzMn1YTT zUfPIkZ7wmHEk2qWW$0tO)XZ59M^uaqKXWcWkVzS|9MOQuQwdZ57%Uzk=H_u z)PDi)hJ24kV0*+P^m~vtBh}dp1Z#o4Yce%`@0&b;cm`X7Wn|0w>bxOvGcB+SKAgwi z-k*)Df^--hHw^$+s_ud0rb_Q(V(u@6)h5Hm;mqwCKBRoEpO%1sti@G8M=GFg_CN&1 zWWv?)O2tvzmEHviZ!B7D!g{G~kF)W32abyx8vptCTL3^$BhjX2{(H95ohd3vFCKQD zindL!B4o3ird#R&ylRxw;A{q<6chGVIy##7ic7FzHOnCRZl`}081-d%$=#>GC4H z!p|&kTt`-IuwDA<1{{wa-APQm9`24iR9D))RL9f#0brzBJ?&CsHm;`cbrA=w)zzE7 z+~4@-uuVs@3+UQxj`P{@i1n7!*K^ZU5}wecb?86)!& zY(1z)ybz=nV;_t7s1-8D(r0X>1-X)XAKsx}Wc4ZAVSbuegVd<1nZdg1b`pOdkd3Z7#Sd^3Fh} z*VKiv?NEtkO}_Ufh%5U9Y|wLW4{F9aeEeDgQj~e)cME%S1-$U~DuBac-Mc(5+duVk z{Eycg79DFZK)(%Ku4bgqf~RZ~nJF+}{*0z@m8|uI6l^$j+#R*-0gGbjESL4%>M!L6 zvympJ!5`Eh7`A=F)6F&Mgn{v~DdqI?U_Q38Zh0BE!c!qJ2$g6Bq}COK*GF6OL*Hjv zl8$?uCkPul7&Y;?VZ~c{so6={EY%^n8GHt+Alrt6>YLfzFR*P`#N%>QniK}UBudt= zb3s&KA-!@waJaTImh^?+aK5`dyd_8sg029=xiV;}X6$83k8d0~i-G4q>*8FX-%+kJ zpA>PZT*opbfC~cIFv?XQek`8nq?j?v0#6B>(cEh9yNB353lPuyO|&2me;h>WLVZ9S zY2CY$=lbade8Ijob#^1=1blw_pMx^!D(Y%7`Uj|i71_@*>c1x@KvQ)=sF>-Ac1PI_ z(v~&H>NuHI_hG|IIpD%_pKJRW>r*!sOn>P(y5c#!$h$yu7FqJ*kIo}KWoZh0{{ojQ z17wmx0ZL{!lh+dXX;St_bGHSYgn~n&E|Z&!hAFLUaAD+?b!9CeRP{CwJ38kDeHu5t zAhenTJxR>WtnyadeSvNHeNQ>wbBQJc<5F?C+@=;hj%>h<~|#TlsapkGgu?a|&brlcK8& zgL=6NBHt&PdQ1^{2=$^%OTm|S!hUC{uuJ|UDIDoFS*)0cs9eSrIlKXSZ}+-g}U2jjU|X! zI4^lDJNc_#-;c`h*}A32Z6I&P545d$9{TSKgkmVg;j$f4k9Y)oE#HviauAd|3gcqy zmLn#@iP%FvPXu|6?Pe3R!DZ(ioqyCh4m){Eu4F%Jg2>KC4n_3?RG7dLZ+07IBZwS6 z=j3|W*&--`!N`9R*j4DGRBlZQWtz<}YQjWc3)$ahzss~HhpoD{e@HfGfPnip;j-15 z6jrkn4&m+*ppggBCPwkJU&597F! zF1DJty#k`%4iezISzd>#nKoP9qgzG3+K(}Rg5c|e^J5XbeTWzM=@-k^;Z?wPz(cx5 z`p!j{_von00{WsU*Kw1V1P2L+H#o+Q7syt``)AqW;lKIOoG+`amtHkE|GvuFS_i?> zxZmY;JKlvD=*FWP-@2&Xf(5!szstiv`&YYW(A^Q51(QRPB(K@gv(gl!yxlFu2U*iu zkz3hN>W6Z44cJL<+z!p6{gqhF_8G7wXDG*oY2&P0!cs>?SJ&DGoeiU$3m z6aM6;-p0(aBsst}s0)=6u-_%`Z+CHEA7Z`>C@r1Bg&uU74E>Z!sKd&q{Oh9A0#*htG7t(%=XtOYpcVz4a#k9ofZ$Tld^PbZ$B|M z_3&fPI4P?AHXb^3ZP<$?aG$o2WgY05tc^h9{t#rHF{SbMMS%l)afV1_r2T$$n@HE@ zhr^z3PgGv#U$HJ_f2W;kM_e=h5!gmZbdOp@@YIbKyA&!ImP5qWn5N4Tb$G!|3va}| z&%ffKX}+`I)+dY6d`j`vyGu6&*8{3 zt%aZJQ@An_I}!I!I#o9)W{<~%%gl?*^F@h}A_OH=qsy_L5O#Q32I~_x(g4^c;HNKLmKhy`8lG5}PPAK9uS*)WaifqQoF4|2#E#1<%ITj4qQ!%v z6GJgNOmtYO<}c!i*p1-S!Dk!9IO9gDkP=k(hbp-SJGN*X?_7pa*1VI%K7-e7{wk%O ze*v#Y2(FB|^i{N;E9^e~yUnjFIRr$X|B6-QG5osh+2h6VpDXV_DxvFu^h(n!6Ue82 zU?qo+!YYo<9M^%gJ{UV>&yTjQd+YpkFe|jKvfcZFn?IG|)>S`l_jP>SbTeG~*xOE8 zevD~qNQK4l8R(?WewXV1t<0$_H-VM%z{TRyAwjCqrWlNc&8+jBgc)FiO)!hUkX(?d zXJ(VAHFX6$lQ!y0J~;iE-6koB{tz7?NyhE}~T!3b_qzTV9_xE!72 z_43L}L)p;g1@!*Xv6}}81?J?9p{DPaFJrL90-OjV9fpLZ3{ASlVq;Z(Bhus8@#;@x z;~$(bGH5L=y#~aT5B;CiQ24AMEIdI6^E2=lz8}dKe8=6J(>o~1p#$1Tw7cMyA zX-VdSrpq!CeSWT%W(P!(6*AqiVSk6O|HL)&jEVZXgnxyX^K?L ziOXBb#4YK-{N^V*1a-)P)ti#Yto}%rSGBmrwrUP7zj#p6aNn*W$5wshmHA1RrMrVH zOj5Nhzwc7`<^BuP0;@Q$165bEFA>U)5r;{cm=9}upm6yvE2F-Yym5>}&_1~i{zkUM z>nnFJ!%+u9{j7e8#)}XhNCK7x8LnZXcgVkJRe`e?`?^1fi8*b2x9AV4gRFS3x($O- z5Ek2?vjz#78GR22k+=$235#ql+3xR2lF4q7ncSc-hTUc##)Wg%pndf7yV#|7J6L0E zYTYtDfk;@`;||Q%XeHBNXl3egN;hspit9d{$x6Q%t}~y-)1lBRFEwZ9AjH>FJ1X7e z>$&Yt6^otyVq!h{p*vB%`;*FLQ?H9TJQVx1x98NQ+xzG1BC z4o3-+%KakJ)>HS<>%DRRtG4=8EfOAtg!4BAUYwfSv>c>|X0~l04q?Fqse|gD*rCT; zGr{zMjTnBQA(t6fXJp?RODnMxe~T7Qb}7F|Q^Pffbx+t&LCRO1TzO&;UFp$OwH+5% z)paL-p3Ltf=rs_@W5!vU^e?yC^X5y?oxAJ)ni7jb8b2Okq+=_8RmTP;*}^E#ib)=y zM>_P%wUkJ2akl5mKS(T9ume|Jypgs?ofqp{7}7s+%6!;YaERAOODzodky@`%Lpkq> zYv{;pH9=1O<&**`$hmdYDx)Z8t=UF1#iG$nT<+@pC7oT)0`2RTO!>FwOs|Rc%6x=~ zd(I!v0sTaCP%JR9j<&$NHr?^;)p$2wwJ6yKCZwKLWW@9ItI3cK0Z^vDo}Xz-4g8lzR5Iftq5 zhZ095%CPsHg*ol$j|bf7XWj~HP>VaQaUO&-;*O409uT=&Yszbg?A6;ovJkimnXQb^ zFk|V9gE>nOFg>Is#rFpb1d|$5|HSF&FdyYNKM77&tFx5dVA)tOO;G8VM0RZi@3SZv z?ybRLH-Ec`Z55$@joC~8*)ssciqVl@sVxn9{Au%gQ>)ha+eMI9_(edwP-Dmh5e>cD z1|_U|;yG#v%WIuC1yzVkBB|Uv_UllV*XZ%zQ*Y^Atv{3r{>9OGZ52Ev@G91?24aSM z>9UnnS56+dwHl>_XqBt{Cygb5G*gdQTAWA`CA6?4F4f+VFehfgbo01DVF6swRm>R5 zKix)e#YPmNqB~DDV>~hg{(oCd3S!GHc_!)AGBn0dkR+gD?I`L~cA(XMD&wiy?C zvmMa8?St24&8f$34v0q71G`(p4WhhY`zJtzcNy8}Nb8oYFD3l>%YAq&5}TSm%Q%wz zq#5qRTHKcjYYi*%|J8Wtr)#0c5B?poaoAx#pEr}@o)5O+=I($(fk1d*9+6%ukt}7L z@n%etfN_Tzzpwn~Xp;)^ep)kPaITZKX{*FOy)i`%+Qxp1TRfF6&4|^l8ff%a8<{nA zqx7!|sasV6Rt=4cNDK>h2hDU%R(aN9kc{f($?DIUDq#Wnb1i#r?;F(7plS?9_&$Xl zpPxSu2g3@+_@Njct+sb9=hWks`mu{Y&3ptG|K|*2y{j~wG{_eDUK85g8$2(SJ;hzS zHh>R@kxvmIDSPxgab68U)c}&SPJq<($8J~ zA7!DCvlkTbT2ZUPPy$)&dnGOC3$;IKx2){rCybAl7}!}iD6xab_>P4zTpR-i5vK@e z1ZxzpXcM!{%d<6^-t90p>iE#?C)RE;ZJ<;7zQEpcy)DGQWr1Co@#D=BXLkAFavc=F`;ngJ%666 z*~Zdtqi%hUgP;DDx(iJ&+BW zg>OZ`5JgPbAK?<}jv2xDdeRw%*o&&S!+Z;Kp7m;Om>#QpGBV#P)Y5fNDc6Z`3kR8w zWnxm=7){L8G|xWq%Z_ilpY1wK(32_j?Ikw8!kZn2Er?@G8=)y@qft_X#FrC3q#&Q% zFLc_na~I7B%2+0l@c5bq^!u<+$Xmes2};;cXZ(u7$UghN4?G=Pz6-*UIr1Z-yZktj znLo|jwcgs}*N5y2tU^He9PewZ{7s#~V^M#ug~24f&!r}I@A zLJtnA!6n*`%;l$_r5Xi{6jguRMja8YvYxnevaVrrzMrNlaX2P>E|mt!Z+iSo#}e#B z)rTcS+|r}lKm2&OSt>I0>gku3;9@!_)oA!fr}K5M0)gRI@$#*W_J>hs8Cm9osS-%O zz3ma3JoiFMxn7(E+q8$l2}6zB>?+k;Vudw=Rt#$AS(sKF-Oghxm)PZer$&bj{k{(* z?KSMF`5CLUGUt~_vL z{<}qx9)w{`jW6x2{u1ic;pI>EisSVQ7CDUd@94K(xuS{2toQ7H>OT|5vV1={i+@3y zg{M^#KOEF+kl+BOIbx74#Rdy4?bQX;`srA0TBDnM&nikLqL}Ir}qfZvF7`49+Go z_&=?kWmJ`2+pY!aMj9ze5f&jO-AaRkbT`u7-6GN*0urJ$i|+15x|Hs2fjxPje8=bh z#{RMWp$u7L-SeJ#&MS^fqLre`V9;4wh!{hWu}_zYvIP3bQzDC8@~lklZsXPVgEqcW zoZ%k_!J(^47~9X|iK;1dcSY%2%H9pfAsu4MGR4{|_>|HmuC;`o0q;MyDzY$c=nb1@ zL!n7q;Ud2BguT}l^xRyz6Zb;H?}d9EH+6ZQt!WDfwmDp|HsRZ!=Q@Fp!<5MiSbx09 z_9|QWjCQTL#Ironcng=X48{C>$nCJ9Alp_JY-{6BR{m(W{C3U9#jq@Y{mF+hHNi(ZFbwj3fuEoHh;!km zBmKOsM_G@|YBj_bf@^0d&@P}y* z-C=|v1p^qQghW*}J;LZuX;0A-yvsDZvU=>~O)8M$&zU&eZSihJe>iR)P)B-gP$d$eTE?!`9N31B zsLdc*B03Pc#AP6$`WbHxm)Ib&?x71x&hKoL*HshUp=DIkn0uiee>4aNzH z-@{vKp~}j53@=PSBHFr!G*$e8Pl7sv#6=6r0%sgNE;p6whqES71C(F3X(oEs$kxLS zU6wF=$2Qn-{NYP!q9pcgbE*#hI$*9Jb@yHw>>C`Fp6PX>`-yEp(uE~_Mpdd^f7}~a z3TlI|KLn&S+_o5udkrmA+8ABl@btS5zWYGHP^t`ku>8qq`f11sI}Y!^cR6LUo8uYy zwI>GqB9LckirXwzUJ@ip962NQ8}y z;i+cnQTlf}&GHGBt9Uj%k%Xlc_F~&6cvARz%or5mv=rQdRHr)p+WcUh^w4${pLpNt z;8olSr+)s#8joN}wDO2!itA{8;i_mxV>9a8s2i3$@UP!7pi9(7W$MFhvXy;LM>C=Q zleiRrrlCK;+`mK7MBZwmAn9xldrPgJskyD{>=!V5n9X;i39@K!2j#(YlJYnV3sgX= zMA05#sI#zQ%~0??ApB+cIqCfxf-iNHoBGTm%UhUaLD-2$Sje=nEd`V`817EKud~-< zb_HMpqC!Mi)R5Q6tx$KYBnsTsF2!&X2F6h2Qsel39bhB}u*ljnBaSsoAz8DWzS{bL znkqs6wv$@jVWK_|E4ZY2z&FL!Tn{PAdewIu=g4O>Vq1*CmcrySO=;8;-Q!Gj&p>nf zYZ#nx+#*FF-JU$4kdYW4(Dx`e7RpwI3-fBuyQ7d`M8oD(-z(Q$>0mRe-2bUYP`o}M z5NgKNkAP9<^n}Xs6_O9L`XhT}^f!I{4^S{zcp0C-BrELXuoQ)81Z_(vl2b!-RhtT& zS%Zy-D&7>VJ#s$-m1AXEz7vwdtF66Ym&{{G1HRS^CrM&p^YEUfy|F>k8K}& zVuV>&289cMerbJN{;U++><0O*aFngyh>g@{8Y>)g9@e~ zbB!<0V}1}%tg|SE(CE{XH2+$!_lfqKM*$~6OD(RE;F-ju8w~qT0m=e5J+26-!V~hh zQ?Fj*3iT1XMX}{LMzF>_TgOL_Zfla*Ms-K%eOSPJ@?`zEfR;TQdrAniWG@D5NjU81 z*FpVg3R7PgGuFVJRqg@vi-)QznZg!%Ng}&?rO9J*=9vu(JtzE+bbN0EFe+|C*g8Gd zx%#zCiPspl-!SI#eo{p_C^C{AWK-P^SSD9Xd|q70CikU0Hw~e5L9${c_H{((>J~CO&r|(;H~MoYP(||KOPPFnb=@NDz+NcG+U`x zCmRZ%asiq|RPSdd&+D`APgpaqArU+Wic4HeWf-Uw45foqKBaflm%$U7LC$S8ex+fQ zNjZQ+IyCYDeJe)B1ZBfugA{ISSi2gnt?r>8yZPR*@mfHj?bGxt;L@x(r|FErYxTKp zDP(Nrk`5h`b)9aoa`Dnh2*r<~hEo#4Z~)GUa_;dISjtTF>yHv14}ab=QUs_7L1|$r zf1r2!@>2*Sk1a$Y6JhP9_%LF?=(!;V2%#Z8R9+-Fm#jtW{UML>4o1xowzV3)8-@vj zxgC}WMGTlWxqvHX9^gt6SoXG7~2HDZAI=eP8AbO)Isj|*GLZY=Vk<& z9#Nv+LbT~&bmeE=C3+x2Pu$oJYfVWgB*2H!#jLoeMaY2R@v9k*MjwB;_^v?mAkfq{R!rv4&cmipbt4$Z8_R+f=v8Fs_dg+Z@2o=wi4 z7JiBkYE=;?SKM2Kp-!bH#Gy_l#ru5;%#$}_f=DqUV-&*z)On|piD59W-;9{!426CB z;$!-G>)dZ0;TpwAT@s_DR>td9>ta61ncW0ZCy_y@K*|30gcm-aRmP7E`w988J>WlN zYEBj^+jstzi`EHm&a%x2C858!uvn)F2Y4%!qqH%%#;Dan`k(UWCiYoHzx`x$@@1B_ zLlePzLJCzS)I8@~bE<(34wpjmOI@$9Z^WKMW{mIcq-N~-EWW?Rn8CjO!|2koDmD`w z*pfHNVCvSH#}aYsMmG}xgYAUSP7`AF_%8Kcw6b703aX#5x_0PmeHiEL4UKKjdP)(z zArWD8*+_EmPk=n7ZDG6M zIP*r4kPoKx>6oWk)1b4S!lq-${@E!c***-($3d-?&%uwX?_9O&3$y)*Y}uLxbQ|?p z2zP`X{mD#O@mYVXy|2?HrEo}&k#E{7bPA8%X{5PHF zY{k>FUp_w-gcCD(LE$H?mEMks1~;^=+P^8`u3Y;v=n{q>83eJ7=gEKaL6X!ou})i0 zyWlaz4=vVZR$yOoY?>)9y<-U$f2g@=aHsEyv+4)!0`AwjRE}MCiEP&>2ww#8YJf3a5V3G5a3f)Wg7Da$&!wOB=}? z2Gor62R|QuH`yWOy?v`+HnRgQ?$q~klhrk-;En%uQlnZ}t&CvvETtjcF_kSqORae` zO?9qsXDUO6&TT+8t)8~TR&l*wfGYmQl?8ske4m8?-={B*RM^*UFMMUKqLkbO^lD9$ zn1j9+NH}ZN#GsrO)!-As$h3>|5MK)4<8P3$upp@=g}Q}5n3Wz4v^c<&it-y2-E-P} zOiP|>zT~FqlQsQf(*BHU;N1DZvp-rq5zj;I4g(Lh_f}VV{gJEcp~}u>POI~r!6Op} zO_bpLrvQMe{9~bS=hWtcH|}BKQfGz9LG=&*{)2hy3AK>`lxx#!w`0GtD^kuj>S}B= znIHbiO-t>yl*IWh31eQtkHgF`Uw9x-%C{J_0c{r7Febp*y2P$RTF)@!omn9 zVywpoowxbZQylO4#Np0jCSOlwgV9aQAt+yJ+{&ry0p8s3Qq3zAqMz30<8yFtlBzzH|!cYc*VWJ{r zW;(JRmqd@gU=eH{+YfTnwWsy#=odTJeKZj`Kd=^K<4oPCIH1YxB*lJ5f2$w$sKUy{ zOy@kXnHE3I^5~D~K{at77qlN3zp#9>@KV1Q47els#)>qXG5z?)mumAgM@UM+;O4z| zwi|DF4V-XVbjQoBJX4{=Yk?j1mp2QQrdQwV&9M#`VCC$2(#wS26Ei$jb4a23F3Ke8>^hEYzP4qh-D?DMOE40$UvXF139G*>PHv z4Ma4GP%N=0vaQ+v`07UekV?oWc0MWmvAxKpg^1 z6Xg9z4iKZpC&bP@5W9(&uEHUt$0 z4iqK(zx|bQ0gF3@yZC|QfBDP<7!~-ZCAM)f-T&K%e1D==a|X$3YNmqph^|LCIEufN zs_S3M$P_5$+Z6%!>zlGNj5-qc&8%-4RaTpnPdjF6BSy!@{A(kgDVZ9-Nu>eF0TA)t zu%>q&_2$7&jp5&xYaO@!)>Lz(2$rkFo%9KzLf}@$@d{RTHbrf$p^(uNBwNG4qhNV1Vgt^|uluh18${v)_djMUAy_ z9R$La;diyUqR*s-UGF1Ah0CQmM`q@L=p>lwb`W=N)Zz#KbF@j$*Q~$ysC#2XI!7`_jELi_mTzCYL#{So zrR8j8_BVpsh0z>oBM?#*$V9Mm=_sLF^=#$F;W0v)h6p`{52oowZ9m&d=+eV%CM>pS6!iS~rp6JTjxi z2LJt^-+{kyX|Ze#rWn=AdhjPqI|-Nijy+oopf?PS%axUT9IbPXHk+==QL-(6e%~(eY_W79r^;6gUe_8arD?q9edmjJk6e?eU;WcO zYW;%T#yr9V-%5gJiU*ky-J)u@eV6C+6SYDU4 zh)8P1Z25Y|ruI88+t0eLaDLAY0O?Kg?pD!~!1$^}4Albg5?+60XE#;Q0$BrwgS&Lz zWpb(AWrq-*#txag1W$-oZH>~buF;=cY6yw1co?UY`b+s#6}R>CWTM(5)9Vd z*6mmJ$a2ZDYaz&CL0BmNY=@8oswqtP$Itn~43Q1TgU;NO<0BB!J?y^^1Q9KYEEEe` zxztbgdPN7h^_>oB<*ei9!eY7BXBN8{yH#z{=9L5KvQ?%X^V8}``It>LT{>+$FmaeyC-8>oaccf&g_u}f1O(tzu>&wv&g*6 zhT?vv@s6!DoGY)?vP>e*k5>+M;KnlZ4EDYvztOD|v*Y~2F)O$CX_0J&=h)?(IkHMx z(39n6!JT2CIbZNvCzKlr1pXZlP4;96GtVS{lM7?nr)IZM9lJIU6G=_Gdk2hui&nbrm4|}{;7}FMPA94Mq&~gJGg5o5g2FfG;(MC!k3Vjp{P%lH8 z_o?H8XV$Wp#cUX3IScL5M}fH!I13y#xT?v(pgSD9LqfZBqGea+CN zj2ML~>?e;h^}T9?WJtlGi`>VGSm)V_cW=*J1-k1rUpGY%I|eQ)bE>B_cN|wxA*4#it=~;}C9Wyk_mW+(7b49>roh`e*s~sh%2E zW5$$oace1Lq}agbEb+%ipl(>@+wi7VVp)~XFZUdR*H#XHhG|Ik#pfm8h0h7DFP`&``W=y*6SeHdj>nRLkv?F}ZKM9*(=7<6ju;(@dZ=M%xpo zhUa?^k3eB%y8(O4&td_8j{FnmgR|Mi_sUbpcu4Idm=%GB3?Bb+dOt6$G0V`T7853X=SC&PhK;-9AW>MKpv~y-5K-Q6qj!)h|l%A$~Wg~LWv|? zs_U<|$XCD`>kYv!mKHAbnv+4b{c8f4BJIpNOF-dEn(#T3r3(8&lIS;4s+MfnzkBxq z3^}ZxjxL+)5$v(<;H$xU+K!HnM8vR^hTH>IEZF>fqB4u=cv$nQZS--lnx2}O!4s6h zQ+ocuUk^fWy7Jg4@c(Ka28-^tQ>;?&yyR@_dk-Ipt3<7{wN+<$zN!5h z3Ah+ca~Imo^_SuQS^#VR>;fd&jv1}>*8v#>w>hzk#+E)!ngzLe`7w3#_^xZf0gK?z z^C{qC^L=Lgl4nTFs9HIp;#lbt>ECZaaRT>Klv%PvdL;76{Aw_HWnYmNVn2f{$UXBR z;d5yh=(gAI1){2I(JD^Bvz8~u1=FV)a2vx;e3VcvD=j4BMV+l9^4~VUyACA{Gpb!Lcmw8i>N9uaWHSGZYU8MW`hMj+XTTS=dCQ}e#y`) zczYOHpwl$w^me)=v(8}Z1)1k{x+Qtnv_uO=)wo5vs{C3$W678pAAJ9(So16=(c`Xxt=Tg1~LV z3zW6E2Fqu7_Um)Oi++4XoL^o;6m zT#-w1AUV!InQVUQ*X6cRccfVsJkQ;^Hy5JkwFTCnL*d69ndHi6@>yN7Ks*f5=x9aQ zt^?1~E_d5A#J(Y#Eei9WMS>I%(ro=bT9jHiM>fc*57hn68ZYuZqIuH0o3RiDl zyZz3M4VRqUyq4ja$_G_dCHQo&t6WVi$8EAIgMb396d7MxCZfjJ93eZqcoBsI&&aHKE04ir!fc3ftx`ZFH7Nq0EZ^af0|#AiFHuzc85IxCuQ! zp`ZyI_?M1Qp!6*vZ=nr=cKIZbH&=l%M_!^PPcs!_99N?+lEwq9plguu^ zHBo3>o65(#@;s-)EKi1ry11cI3?!n?M@o|;i~Mz5{rei%tU&>bYVq7+n|NR5h{#t0 zd)U@|qG+Coe)?D zEA62ciX|ttu?z$Zm;x^0i$+Plf9`Sr8Ygg=sUeH$`i57QWJ*KJcrvD}bm5_a14UY9 zW!8(C&xyMEOKPajY#vPko!6gO3S!At)JIy}Mfp#*zDq)xucN3;W>_t6f31HL;qS@D z{7uU#df_O)Hg_%`b^~Q*jF!^=bT-_OOC1gx7#_r79=+O%sv#y_*<*r)V!EB&-i~6o zT{tho;@B87Ugu0OJ8FEg!6hS|@}lN^q0f`KTj?(m^Y5;K>lM0JUC{5o6B$K{!T6j; zHjJe`6iDM=--^reS0od41;M6J*pwp+!nzfKl2_V)R*jThWvE3PH34Or(X+6e_`7ASEbQs^V zM~OVAsQId;sc0lF+G;eJO0%Ra87UB`>%|Xe3+WWz{rYO9!_vQ0`M;(l*afVR#8iD{ zYdJCl!ygAD*am#{aSA&->=F!kcO;<_fSR2{8t;AQ9}D+q;H;>G-@9%Mqsnq6s~sgY^>YStmOeKfz7(E$o+A9)-f0pN!<*V! zNMmvcj`yZxqba)|;*Z}?fMCxS4epGJ;Yg(V_-wX&K(&^zy}LmBssCcr^GEV;UF zueQAsI4wQ|}d z*c7Ze!KhSfNI_^QHqmqHvRcf?0`qDm|DrxIv0$MMWPqjprfiAX5D=9Wf_HJ=L@*5- z4hWv_r}#i^2>IFhrS2#;8YU(=tLjXH_O-YVe;)b&)hPk#_g$WyYuxR+&VkBr1RT$O zu$D9Ik)Q^uIv-iYW>)XXYjGh8AK0X%E^sYomf23;0|!LM1FQU<&t4mu<`ymE2S3=r z+%zw?)BzbB@c*?p{Q0ogPq1FYbJEj)(8Ixd1xdn%lyG}oBw8$_zEh9;E)3`EgHnIg ztKZYl#}qYJ+xgh0KXH3Ek+UtR!B~B!U1}(Ox8CF!B#Zrfm;9sueSMJH5vV7ghk#uj z$8Jd|cf4qTkkhDnh}NIcW-aMdX7}!eS{)~Mw}!F(2rVd6Wt+t3>I>$6<9LA@_q(#Y zm6!&@W*;j%K=_$@q%^hNIvMFOWr?k;>Uo+3e+HJ za?nf#eF^g3llF;TDWN)Xjq)I{3$2o)&+s>XDb&z8;M-?aP>Hw7O-0m zPaC-4A6w~T=2}S^g8NPPz`)Ht3dw*?iGf&bJQ^qz^>-1`%FyCPu@Lbj4|KmW9@L~Y zGYdAFDv@sEXULJdn=18OoiXPHSDrD$!=K?f@5ADL*Ji8(y8A}w=Wo7gaHAP1%0faC z^Y^JN0h|NT)Cr@JNRuN%K3^QVGNaLKSGzvQx>Op^$h;jZE$z$Bh$iu(+OLIZ#3#`J zsmATX>j(MW#1sn`YR8?*&NfWk8-DcJxGU;49JKl6!}%;*MmUkB0j`9U)@C%2a<~DI zj8mPRo!w2h971jfCA>?RSj2xV zr9U=fELm7=#ry5$iR1Q5=PLdYho$Jr7+A|$&e#g`m>)vTZ+)E?F6Er|WMZ(XnCv+g zBtjUOn3QvYFj!BUl({qfJ#2e>24& z_-g*qbg2Z>nlnb7ED<483xH3f0wwms-v5g3X-2KT-b0zLv@Av=2g=V6+7}lVlb}OJ z3HTB5!0Odq>&T0$p6dF$4FC!E8I~|S=YLLb5w?C{P>L3+b3$)lJ{<0)jdprRv?d;r z17Mg^#oB2AXr$Q7Li3|^^JsP1Xa@Qu3qB9nDdN!|d!a`J#7O~{>1l_6vYCTmP8BN`=I67bUpW5kmP@~(d$BQr;#bb4KBC5 z+2Ub}vRrnOWoC*}^!f&GfAVY^oOh1~_hMr7Y1)Y2brI8lOaf9;wMO~( z0)&a2T#NwWe&S>|)1sXzexW;zkyoB&YIylE+fi2X>}`$|^3m0{cjU|PcR-2@-qq(( zkCb5i>sIjBLxgbezjjdf8x!tng<2RjIYl;UvCQK{%${zqQ$}ndl-%S?o22RjxGeQ zRZ|F&Z;~|?l!_o-<9>1p!h4&Szz-O``k=hf{0QYTm&)`9fA6CQLBr$wGeS;4s_}Tj731^G}0J3 zj6}*I_@Z2xRe#v2m9^jCPS*pjds5`|tp6>S{^%aDdZ7q2j=;Z6Mc zO5`mtl5=o7F=`L;*;`BGDdG^2lQRzqTo zBLce70yWd|=MmxIaR7>wh&Wal7X3>f5)&U!OZD=@eLX5%bAB#-?V7U6RJ&emdrhNi zY_0sCUzGBrWl~?fzUKgab!jzPMI`qaMtj~wqZysToR*ZdYPj0VGg_qee%hq#c!0SN zxlp|#nl9ail0s5KPA(p>0OUdDBX;Bk$LMmGfoxxnVzzz<&gj>-E>02gk&zTb{O76T z`HFP9a$+CucPy+KSkRQ%G+yT*CrZz3xqZ8)+uC%fMUBq8airVRnh0t<^EVm$z-&T@ z|Bs4AN)~Fw=LGrsh51CkUJgH6>I?!kj)hclCrqDA0o>6*+en<1;j9S>DgjgM`J(sY zdVN{q7cPm+H>#g6Kk>U)GHTbqpum01Wfgl*X#q+IH}V4YJybM!Jo0IQq`Z8Bingmb z@M0({*ipS($OhgG)Y>)Q|wmDWQC{5 z%og|{x|c|X?SL5&2RtzI&;^ah-2+%$_mfE|1XU)HMYz&>k?d!F|EKyy!YKQpdA#^Q zj+Scce&$Zxzn8kN0#?X*LP*tuTi+sMZh`^@8=E5ZR5(L4oR}lvW?e(g5|;D?#tR^F z9yTOJe((l9DHyW`+~}lJsc{e{wNg22b)4MVHHtz_L(>EB4B9iMC|cf~ABcpxnF*33 zu{3o-PJ8a^0{xT3=h6Q$7hzfW3f^qW+Z_*ZA-b2pu4~Yp=XwcYA$s-Pi%0yy1H1}J zF=3^@l%|L(g$`;8mK=lR@5JZd7CXu}KCmevbA^T|zuV;h{J&O7@FANSjcmOCJ2?0sR;t8 zP(x~K?V&hF04o%NQ3gor>r%i^nU;{22H_dbasC2;w+{OYT1<@>`n;}l)wX3|Bit9a z6X@#d>Jz-X97^5y=!PgvHBOfryb@>vu#jorSKAYX=2Q&5&uglBtIWo7L&=W4FWSiM zSk?wo=m3bo7eJ$8vhH3HgSkf?!FLowIxfJ$@fH+pWprL}&GWduT<88|Pq`%8jk@7A zd7O&#Oz8^+fWm^a?MhNa#1D5>lhb}p1}N8(IRGw|V?Xl*IgbEF_969d63~*=05p!e zYR)dqVy^l%t!#2^d3`#81^`}y-_@{N&Al+;A^(M1eX6nE5D46D615JSlx|Fp*HwD} zBop1oR3|gYy-u<(d-R9W1)|skfG^H?zE4Y7SQKbFjEIkxo5;HtF3U`ACjnrG#^~ti zO0+an=`pYKo`ng)D%VJ8@V`Y5rDSs)J}1DzRAEw_!elf;m$JbE;l|90AQ!Z1+U}^6 zn`})61QrRfvUWtp;OFa{i#<(qFyl{PoB%UHeEE9@!43|sOi3TunZ%zd7noM%5u7RJ z%JitwGB8M=oC5SzHz;?yV`7r56(V>E_rA;;8Yy%WLBg$nUcBJod9|50nj!q~x+n_Y zD9Ph-#1V4S?bSC(;-PWk3)`%UbU|;gK|{!j(j6cmgcW_pT;Oo=9#l)je8QZu-Xb1` zADZ5G0%~^%5b?V~JtZezG-PVUod9~MZBmn(iCyN3;?Ai~lB3&{HR~a5VS%#fHB9qh~M1o!(MIE_vX9Mh~nth3gf$6WvJ;&wPASisfZ^KQ%Og^il4>?Try4oZ=UK%w(!LvxlXH?Z) z=k~s5ddN=}X{8l&?}L3De2XUc;*BQ@W<7r{N5s(dT4$^MQZvk_V+Z|(`U|aL^B`BD zcgK2US#Gk9=bv3m_VZPWwWFvYy^U(6`hl|NgK50>9p>+>+^wpAAn+DG?ORcw_CT&| zvRcG-bLkh|s+Y7~y*^s)D~z#6Bftk#C24y|aaWDm+htZr7vDXjVQ}l7pYrOiOX`uI zWj#o|Pssz79%HF%^lCoRI~*n|vx&>qnR#vyaayPrt;(X0X?FRsjV;#f+;5n__MDsS z@%vmSkDWm}y?x{MbI~BQ(nZ;ANFDl^K7&c4m&=kb;*PBe%11ld^V_WTAAtMR;r^y* z==yxWYJF1^=k7eG#6G{+(IMFkeT5bN{MIhiE~VPz`rE5*r`p@jl=$YF_!093u)WQgb==7IePvPD_F zaB4cbSx3)~;xPwOt)gn-u}p}o!#t1U)>KggbT%K9B2Z7}vS#uI>MTdEEeI4Wmz|Z3 zavI6~0q{|=O}|!|Im6XOWtw<7K8K|QDX3|mzt+3%)KRZ<+%~RTIpWgEyH-cIi_y<5 z8F6y2bUD=LZNXg%af&dqvRf@565y?gy!=+k3e})Ozt;{Yd-J@DCcG`%n4Q{$dIztE zjAmv!H}zQ(B`5I1XCPTl(mxr%&7iKb3G$jM2SoQBxe zVa_7*A36pb%d^N zf#I^=$8pqNNXYM|um&rpakDmc0doyqQ*j;d2k#%t{azeoz-tnR3|WoSa{{* z2ujE~(Lglqt!Ntr*JqH|P&-}4MYikq6iE{#{P)avYj=`N(o5(0@i}tb7HXD1^4dX) zFooYgJ|P@~O+bIlxdM1lueSluY@?c&r}HB|^}D-co|j2ZQKs*D-hXV#n%8{SBKJwa zQw){mBvos;hJ7)p)l|gHdz<|m5B^61=xAx+QM#yOqehb>ae|XhzE(i;gz%Zm<@Ms7 z)p^|DpDuc=r!Wn2Hhbt5`rUv{X1%|7;wHlIY~vz3S3JC-a@d`>j-D$EW!|RpbjJy8) zOf#754B*_TD!vCZVvzBflJl7T;@POcx7+aN_ms%tNPz~1ebkGo3VgpQ)pMp*fO&nQ zuWkOCTbQ}`G-vEoM8jXZoq%rRp#&+xPXJh|;`p{TS!|8CIT8Fp&IJTr?fNA03^{1U zntLEx!e>{+R^U%0vKkly0jpn&VyBE=cm8wdaYNFG=Nu5|HDF+OMAaeCBaA?Ze^XWb z)MGJ7#&`y1+i6SH#}Nl`rp@eM-DTcM^Jpu+e%L7<_iT1G^*HGk^Ie#LWm=YjD;~!N zw}b|gTT|+>{_AC%_%Zv^Gqz7$rZ5$iUq^x&h>Plvq`QzPsf%d52%Yl{fP8I&%fPveq0W?nev-@npa zjh0?P--hE8Z@$P!Mn-mW1JYVd<1}$E``A*YYKWtvoWSMPUxF74DOc#0&VgpGR-k>< zm&y~q@NG^Z@`+w!BYS~X-9+WH3$Os6g5$tw@SU+H@kj#x928`h3ZOZ>6Wa8rv-Dho zvwXSu^(}+OMHaz@IPwgv7`dOBv$5PTEE4(^g)F&Cx?L~*AmcT~TXQ8|VRL$3Vdgyp z0|QHG5=aP2mqM!N=ZY2fA^5=7_!hyc^jkqwbWt!Kk7pT*s#}>dFgw$%Mox?;uM_)8 zMQ^PM*SU}@=#A@{W=Z2?mg`ckZ4-a&HObTqm4@tRKECa_`xme4vo_j-o`r<%YR5jMH{~iseupK3--a5z)WE4db6ox6mTY^4HC6bm0m6BO! z{e6l2hwuwF+`#%-3s-4c2enrWdmhz*z1woKcyPaE>?W3T}&duc^x3pwo3$ZV{E}t+@>)5p4dok^3e(e)ef7*MggxaiJq-kbO^esmK>IN`` zC_4*d+|0P^RfDD9QBeN0qKZfgp}vMbO4Md}Am*HdY zndOETr5Yy3G9ZS~tWYP*!a$(~J#g83Zu?VgcB?aV%)QZTEt#hnY4IPEiQf~fSlASh zkTEFmVbpj-PC`<$RCYP7s2kdcPpY7W`sPGL3$b}Zn5@ouf3HBF9D|mQF04`D_QGJ+ z;dWe6zQU7iopEK^f8t^S(coVH7;J4kEJwznohlUqh&zZs0(#j)ukEk3yZMTFGpZ*) z@&zQuCNSiNt-_!woP~Itu1AK~k%}o}!RAkU8|f_<4wzLBMx~i6APlKRISyu){Fz;G zWZrV$pnm!zh^vDchdfreT`t1vMuPG~JehiL{7aRs%AMyD2-wm_#25!0iGE1k%m z&ad4g(_mtlKYNM6&M9TXj^e6E6rW z>j+5x9Mv4Q{%Mw%W?bj+ok^3!RN4TNJ(96(wZ-vq!Fg)T&U@w{`$<( z%sz8IVxzJ`LjvLeyfMKRf=6=o3tiFa4^R0DmZQy{gfsD4%~hu!TAlpLpTF3wQR+G$ zP5w&U6a>a$@QiYEzVJBzag$@zij?+$b`eTxAygxvN-Z^_w@n(HhT}Wk__Oiwps4b6 zxF;#9nIiD_moYS==j}y;AOtjZ+YBrL{6c`PE)5i_CH3S#9alV4UjylJXI`U8MIaTa zupC}sj*I82p6ZX7BVdAx4fQd5p3aa+EHx9vH_2Yrm^dSy4wz9c{X$!0ivILEP&&EP zgT$Gc^n0meklekVvcCp*>@#Ojdv%yN@tk`k*(;vkcn<#h2HdR=6B}dg*ESIq6_!~8 zxj8L!Ydniw#V_^Wxv9;9P_B%pVF{*0V|LvJwS-U4Y6Evu^k1oVqZs`tmVExu+Fje_ zN1(_Xm9lA&bX9c?Dp?fLgf*{L^tMjTZKyv~Ox(1y65*-^S9_QKhknDd8L0GQ_9_d@ zGauB}SmCz;ZeE6gBqF^jO<}5LT&*a>S+Q@zfNTL5Dv`f-PkKF5`I36 z8b_Bp*%kYyh?C-#ti)cC{72jBJk(ZenppS5oD~ApsBoR~mG4 zd5G5@#CzJ=fTy(3k}CEs;>wf7;P3?wf%>Rh_u!BbFok z1As%fxb^^jRWidG>6aBBit!TpMcN13rSQ*2sOmm3NlBY*b%CTN0xJ5Hf5~txTG&9X zZJR|xTHa{GKZ9W(z&?2@K?Kk53yf zB-B*^n$A1;tFX)AFH;@`2^>n@#E(W+k~2!PzheSL6e&2_W5mDy<9z#{KlyH8XEf8g zopEsg83^(_`WQhR5o6hJ;2Ej9asNV~TL`u*hM-~vv=!NGBdmaFOuV(&HX z0B*XDDJzg27?^P9hen7`F1A69nv?xSokx!zW%)f(N6m+Aum{hk2e!Xhz`mxYNEuzM z1vp!H>OF~2CDbw=rybLwq!D!_Qu^y?kNcfB2U|i~I&5ouc62JvVP1ERE1uo5;2&2# zmZ~qIB8zB`jBa@7KOtQI%(lOOda6L-mI900-753fsQ>+|zipvl{)<-#Qup nJ_rOrHpO92tJwdKZ@MLS?KT+|fOWrl0RBjd%ZU|<==%L1UEd4g diff --git a/usbhid_8h__incl.md5 b/usbhid_8h__incl.md5 index ba8adb10..14c96477 100644 --- a/usbhid_8h__incl.md5 +++ b/usbhid_8h__incl.md5 @@ -1 +1 @@ -4e9e1ed0acf270d1a001d814d2a4228b \ No newline at end of file +ac548c483673afe5ff5ba629fee3d877 \ No newline at end of file diff --git a/usbhid_8h__incl.png b/usbhid_8h__incl.png index 1284896edd60aea89fc3dc816aee597d5521510b..dbb2348349659b3f76e5543b03473bcaf2582463 100644 GIT binary patch literal 7330 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 literal 7801 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 HbI|_)F|!(_ diff --git a/usbhid_8h_source.html b/usbhid_8h_source.html index d8dd60ef..5043c3b3 100644 --- a/usbhid_8h_source.html +++ b/usbhid_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhid.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    usbhid.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(__USBHID_H__)
    18 #define __USBHID_H__
    19 
    20 #include "Usb.h"
    21 #include "hidusagestr.h"
    22 
    23 #define MAX_REPORT_PARSERS 2
    24 #define HID_MAX_HID_CLASS_DESCRIPTORS 5
    25 
    26 #define DATA_SIZE_MASK 0x03
    27 #define TYPE_MASK 0x0C
    28 #define TAG_MASK 0xF0
    29 
    30 #define DATA_SIZE_0 0x00
    31 #define DATA_SIZE_1 0x01
    32 #define DATA_SIZE_2 0x02
    33 #define DATA_SIZE_4 0x03
    34 
    35 #define TYPE_MAIN 0x00
    36 #define TYPE_GLOBAL 0x04
    37 #define TYPE_LOCAL 0x08
    38 
    39 #define TAG_MAIN_INPUT 0x80
    40 #define TAG_MAIN_OUTPUT 0x90
    41 #define TAG_MAIN_COLLECTION 0xA0
    42 #define TAG_MAIN_FEATURE 0xB0
    43 #define TAG_MAIN_ENDCOLLECTION 0xC0
    44 
    45 #define TAG_GLOBAL_USAGEPAGE 0x00
    46 #define TAG_GLOBAL_LOGICALMIN 0x10
    47 #define TAG_GLOBAL_LOGICALMAX 0x20
    48 #define TAG_GLOBAL_PHYSMIN 0x30
    49 #define TAG_GLOBAL_PHYSMAX 0x40
    50 #define TAG_GLOBAL_UNITEXP 0x50
    51 #define TAG_GLOBAL_UNIT 0x60
    52 #define TAG_GLOBAL_REPORTSIZE 0x70
    53 #define TAG_GLOBAL_REPORTID 0x80
    54 #define TAG_GLOBAL_REPORTCOUNT 0x90
    55 #define TAG_GLOBAL_PUSH 0xA0
    56 #define TAG_GLOBAL_POP 0xB0
    57 
    58 #define TAG_LOCAL_USAGE 0x00
    59 #define TAG_LOCAL_USAGEMIN 0x10
    60 #define TAG_LOCAL_USAGEMAX 0x20
    61 
    62 /* HID requests */
    63 #define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    64 #define bmREQ_HID_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    65 #define bmREQ_HID_REPORT USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_INTERFACE
    66 
    67 /* HID constants. Not part of chapter 9 */
    68 /* Class-Specific Requests */
    69 #define HID_REQUEST_GET_REPORT 0x01
    70 #define HID_REQUEST_GET_IDLE 0x02
    71 #define HID_REQUEST_GET_PROTOCOL 0x03
    72 #define HID_REQUEST_SET_REPORT 0x09
    73 #define HID_REQUEST_SET_IDLE 0x0A
    74 #define HID_REQUEST_SET_PROTOCOL 0x0B
    75 
    76 /* Class Descriptor Types */
    77 #define HID_DESCRIPTOR_HID 0x21
    78 #define HID_DESCRIPTOR_REPORT 0x22
    79 #define HID_DESRIPTOR_PHY 0x23
    80 
    81 /* Protocol Selection */
    82 #define USB_HID_BOOT_PROTOCOL 0x00
    83 #define HID_RPT_PROTOCOL 0x01
    84 
    85 /* HID Interface Class Code */
    86 #define HID_INTF 0x03
    87 
    88 /* HID Interface Class SubClass Codes */
    89 #define HID_BOOT_INTF_SUBCLASS 0x01
    90 
    91 /* HID Interface Class Protocol Codes */
    92 #define USB_HID_PROTOCOL_NONE 0x00
    93 #define USB_HID_PROTOCOL_KEYBOARD 0x01
    94 #define USB_HID_PROTOCOL_MOUSE 0x02
    95 
    96 #define HID_ITEM_TYPE_MAIN 0
    97 #define HID_ITEM_TYPE_GLOBAL 1
    98 #define HID_ITEM_TYPE_LOCAL 2
    99 #define HID_ITEM_TYPE_RESERVED 3
    100 
    101 #define HID_LONG_ITEM_PREFIX 0xfe // Long item prefix value
    102 
    103 #define bmHID_MAIN_ITEM_TAG 0xfc // Main item tag mask
    104 
    105 #define bmHID_MAIN_ITEM_INPUT 0x80 // Main item Input tag value
    106 #define bmHID_MAIN_ITEM_OUTPUT 0x90 // Main item Output tag value
    107 #define bmHID_MAIN_ITEM_FEATURE 0xb0 // Main item Feature tag value
    108 #define bmHID_MAIN_ITEM_COLLECTION 0xa0 // Main item Collection tag value
    109 #define bmHID_MAIN_ITEM_END_COLLECTION 0xce // Main item End Collection tag value
    110 
    111 #define HID_MAIN_ITEM_COLLECTION_PHYSICAL 0
    112 #define HID_MAIN_ITEM_COLLECTION_APPLICATION 1
    113 #define HID_MAIN_ITEM_COLLECTION_LOGICAL 2
    114 #define HID_MAIN_ITEM_COLLECTION_REPORT 3
    115 #define HID_MAIN_ITEM_COLLECTION_NAMED_ARRAY 4
    116 #define HID_MAIN_ITEM_COLLECTION_USAGE_SWITCH 5
    117 #define HID_MAIN_ITEM_COLLECTION_USAGE_MODIFIER 6
    118 
    120  uint8_t bSize : 2;
    121  uint8_t bType : 2;
    122  uint8_t bTag : 4;
    123 };
    124 
    126  uint8_t bmIsConstantOrData : 1;
    127  uint8_t bmIsArrayOrVariable : 1;
    128  uint8_t bmIsRelativeOrAbsolute : 1;
    129  uint8_t bmIsWrapOrNoWrap : 1;
    130  uint8_t bmIsNonLonearOrLinear : 1;
    131  uint8_t bmIsNoPreferedOrPrefered : 1;
    132  uint8_t bmIsNullOrNoNull : 1;
    133  uint8_t bmIsVolatileOrNonVolatile : 1;
    134 };
    135 
    136 class USBHID;
    137 
    139 public:
    140  virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) = 0;
    141 };
    142 
    143 class USBHID : public USBDeviceConfig, public UsbConfigXtracter {
    144 protected:
    145  USB *pUsb; // USB class instance pointer
    146  uint8_t bAddress; // address
    147 
    148 protected:
    149  static const uint8_t epInterruptInIndex = 1; // InterruptIN endpoint index
    150  static const uint8_t epInterruptOutIndex = 2; // InterruptOUT endpoint index
    151 
    152  static const uint8_t maxHidInterfaces = 3;
    153  static const uint8_t maxEpPerInterface = 2;
    154  static const uint8_t totalEndpoints = (maxHidInterfaces * maxEpPerInterface + 1);
    155 
    156  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
    157  void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc);
    158 
    159  virtual HIDReportParser* GetReportParser(uint8_t id) {
    160  return NULL;
    161  };
    162 
    163 public:
    164 
    165  USBHID(USB *pusb) : pUsb(pusb) {
    166  };
    167 
    168  const USB* GetUsb() {
    169  return pUsb;
    170  };
    171 
    172  virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {
    173  return false;
    174  };
    175 
    176  uint8_t SetProtocol(uint8_t iface, uint8_t protocol);
    177  uint8_t GetProtocol(uint8_t iface, uint8_t* dataptr);
    178  uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t* dataptr);
    179  uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration);
    180 
    181  uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser = NULL);
    182 
    183  uint8_t GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
    184  uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
    185  uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
    186 };
    187 
    188 #endif // __USBHID_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 #if !defined(__USBHID_H__)
    18 #define __USBHID_H__
    19 
    20 #include "Usb.h"
    21 #include "hidusagestr.h"
    22 
    23 #define MAX_REPORT_PARSERS 2
    24 #define HID_MAX_HID_CLASS_DESCRIPTORS 5
    25 
    26 #define DATA_SIZE_MASK 0x03
    27 #define TYPE_MASK 0x0C
    28 #define TAG_MASK 0xF0
    29 
    30 #define DATA_SIZE_0 0x00
    31 #define DATA_SIZE_1 0x01
    32 #define DATA_SIZE_2 0x02
    33 #define DATA_SIZE_4 0x03
    34 
    35 #define TYPE_MAIN 0x00
    36 #define TYPE_GLOBAL 0x04
    37 #define TYPE_LOCAL 0x08
    38 
    39 #define TAG_MAIN_INPUT 0x80
    40 #define TAG_MAIN_OUTPUT 0x90
    41 #define TAG_MAIN_COLLECTION 0xA0
    42 #define TAG_MAIN_FEATURE 0xB0
    43 #define TAG_MAIN_ENDCOLLECTION 0xC0
    44 
    45 #define TAG_GLOBAL_USAGEPAGE 0x00
    46 #define TAG_GLOBAL_LOGICALMIN 0x10
    47 #define TAG_GLOBAL_LOGICALMAX 0x20
    48 #define TAG_GLOBAL_PHYSMIN 0x30
    49 #define TAG_GLOBAL_PHYSMAX 0x40
    50 #define TAG_GLOBAL_UNITEXP 0x50
    51 #define TAG_GLOBAL_UNIT 0x60
    52 #define TAG_GLOBAL_REPORTSIZE 0x70
    53 #define TAG_GLOBAL_REPORTID 0x80
    54 #define TAG_GLOBAL_REPORTCOUNT 0x90
    55 #define TAG_GLOBAL_PUSH 0xA0
    56 #define TAG_GLOBAL_POP 0xB0
    57 
    58 #define TAG_LOCAL_USAGE 0x00
    59 #define TAG_LOCAL_USAGEMIN 0x10
    60 #define TAG_LOCAL_USAGEMAX 0x20
    61 
    62 /* HID requests */
    63 #define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    64 #define bmREQ_HID_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    65 #define bmREQ_HID_REPORT USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_INTERFACE
    66 
    67 /* HID constants. Not part of chapter 9 */
    68 /* Class-Specific Requests */
    69 #define HID_REQUEST_GET_REPORT 0x01
    70 #define HID_REQUEST_GET_IDLE 0x02
    71 #define HID_REQUEST_GET_PROTOCOL 0x03
    72 #define HID_REQUEST_SET_REPORT 0x09
    73 #define HID_REQUEST_SET_IDLE 0x0A
    74 #define HID_REQUEST_SET_PROTOCOL 0x0B
    75 
    76 /* Class Descriptor Types */
    77 #define HID_DESCRIPTOR_HID 0x21
    78 #define HID_DESCRIPTOR_REPORT 0x22
    79 #define HID_DESRIPTOR_PHY 0x23
    80 
    81 /* Protocol Selection */
    82 #define USB_HID_BOOT_PROTOCOL 0x00
    83 #define HID_RPT_PROTOCOL 0x01
    84 
    85 /* HID Interface Class Code */
    86 #define HID_INTF 0x03
    87 
    88 /* HID Interface Class SubClass Codes */
    89 #define HID_BOOT_INTF_SUBCLASS 0x01
    90 
    91 /* HID Interface Class Protocol Codes */
    92 #define USB_HID_PROTOCOL_NONE 0x00
    93 #define USB_HID_PROTOCOL_KEYBOARD 0x01
    94 #define USB_HID_PROTOCOL_MOUSE 0x02
    95 
    96 #define HID_ITEM_TYPE_MAIN 0
    97 #define HID_ITEM_TYPE_GLOBAL 1
    98 #define HID_ITEM_TYPE_LOCAL 2
    99 #define HID_ITEM_TYPE_RESERVED 3
    100 
    101 #define HID_LONG_ITEM_PREFIX 0xfe // Long item prefix value
    102 
    103 #define bmHID_MAIN_ITEM_TAG 0xfc // Main item tag mask
    104 
    105 #define bmHID_MAIN_ITEM_INPUT 0x80 // Main item Input tag value
    106 #define bmHID_MAIN_ITEM_OUTPUT 0x90 // Main item Output tag value
    107 #define bmHID_MAIN_ITEM_FEATURE 0xb0 // Main item Feature tag value
    108 #define bmHID_MAIN_ITEM_COLLECTION 0xa0 // Main item Collection tag value
    109 #define bmHID_MAIN_ITEM_END_COLLECTION 0xce // Main item End Collection tag value
    110 
    111 #define HID_MAIN_ITEM_COLLECTION_PHYSICAL 0
    112 #define HID_MAIN_ITEM_COLLECTION_APPLICATION 1
    113 #define HID_MAIN_ITEM_COLLECTION_LOGICAL 2
    114 #define HID_MAIN_ITEM_COLLECTION_REPORT 3
    115 #define HID_MAIN_ITEM_COLLECTION_NAMED_ARRAY 4
    116 #define HID_MAIN_ITEM_COLLECTION_USAGE_SWITCH 5
    117 #define HID_MAIN_ITEM_COLLECTION_USAGE_MODIFIER 6
    118 
    120  uint8_t bSize : 2;
    121  uint8_t bType : 2;
    122  uint8_t bTag : 4;
    123 };
    124 
    126  uint8_t bmIsConstantOrData : 1;
    127  uint8_t bmIsArrayOrVariable : 1;
    129  uint8_t bmIsWrapOrNoWrap : 1;
    132  uint8_t bmIsNullOrNoNull : 1;
    134 };
    135 
    136 class USBHID;
    137 
    139 public:
    140  virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) = 0;
    141 };
    142 
    143 class USBHID : public USBDeviceConfig, public UsbConfigXtracter {
    144 protected:
    145  USB *pUsb; // USB class instance pointer
    146  uint8_t bAddress; // address
    147 
    148 protected:
    149  static const uint8_t epInterruptInIndex = 1; // InterruptIN endpoint index
    150  static const uint8_t epInterruptOutIndex = 2; // InterruptOUT endpoint index
    151 
    152  static const uint8_t maxHidInterfaces = 3;
    153  static const uint8_t maxEpPerInterface = 2;
    154  static const uint8_t totalEndpoints = (maxHidInterfaces * maxEpPerInterface + 1);
    155 
    157  void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc);
    158 
    159  virtual HIDReportParser* GetReportParser(uint8_t id __attribute__((unused))) {
    160  return NULL;
    161  };
    162 
    163 public:
    164 
    165  USBHID(USB *pusb) : pUsb(pusb) {
    166  };
    167 
    168  const USB* GetUsb() {
    169  return pUsb;
    170  };
    171 
    172  virtual bool SetReportParser(uint8_t id __attribute__((unused)), HIDReportParser *prs __attribute__((unused))) {
    173  return false;
    174  };
    175 
    176  uint8_t SetProtocol(uint8_t iface, uint8_t protocol);
    177  uint8_t GetProtocol(uint8_t iface, uint8_t* dataptr);
    178  uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t* dataptr);
    179  uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration);
    180 
    181  uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser = NULL);
    182 
    183  uint8_t GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
    184  uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
    185  uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
    186 };
    187 
    188 #endif // __USBHID_H__
    Definition: usbhid.h:143
    USB * pUsb
    Definition: usbhid.h:145
    - - +
    uint8_t GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    +
    uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)
    Definition: usbhid.cpp:34
    + +
    uint8_t bmIsConstantOrData
    Definition: usbhid.h:126
    +
    uint8_t GetProtocol(uint8_t iface, uint8_t *dataptr)
    Definition: usbhid.cpp:70
    + +
    uint8_t bmIsArrayOrVariable
    Definition: usbhid.h:127
    +
    void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)
    Definition: usbhid.cpp:90
    +
    uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhid.cpp:54
    uint8_t bTag
    Definition: usbhid.h:122
    uint8_t bType
    Definition: usbhid.h:121
    - +
    uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)
    Definition: usbhid.cpp:62
    +
    uint8_t bSize
    Definition: usbhid.h:120
    +
    uint8_t bmIsWrapOrNoWrap
    Definition: usbhid.h:129
    const USB * GetUsb()
    Definition: usbhid.h:168
    +
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: usbhid.cpp:74
    +
    uint8_t bmIsVolatileOrNonVolatile
    Definition: usbhid.h:133
    +
    uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)
    Definition: usbhid.cpp:58
    +
    static const uint8_t epInterruptOutIndex
    Definition: usbhid.h:150
    uint8_t bAddress
    Definition: usbhid.h:146
    +
    static const uint8_t maxEpPerInterface
    Definition: usbhid.h:153
    +
    uint8_t bmIsNullOrNoNull
    Definition: usbhid.h:132
    USBHID(USB *pusb)
    Definition: usbhid.h:165
    - - -
    #define totalEndpoints(p)
    Definition: hidboot.h:33
    +
    static const uint8_t epInterruptInIndex
    Definition: usbhid.h:149
    +
    static const uint8_t maxHidInterfaces
    Definition: usbhid.h:152
    + + +
    uint8_t SetProtocol(uint8_t iface, uint8_t protocol)
    Definition: usbhid.cpp:66
    +
    static const uint8_t totalEndpoints
    Definition: usbhid.h:154
    +
    uint8_t bmIsNonLonearOrLinear
    Definition: usbhid.h:130
    +
    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
    -
    Definition: UsbCore.h:197
    +
    Definition: UsbCore.h:208
    +
    uint8_t bmIsNoPreferedOrPrefered
    Definition: usbhid.h:131
    virtual bool SetReportParser(uint8_t id, HIDReportParser *prs)
    Definition: usbhid.h:172
    +
    uint8_t bmIsRelativeOrAbsolute
    Definition: usbhid.h:128
    +
    virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
    virtual HIDReportParser * GetReportParser(uint8_t id)
    Definition: usbhid.h:159
    diff --git a/usbhost_8h.html b/usbhost_8h.html index 59aba258..c5801162 100644 --- a/usbhost_8h.html +++ b/usbhost_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhost.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Enumeration Type Documentation

    - + +

    ◆ VBUS_t

    +
    @@ -121,13 +103,11 @@ Enumerations
    - - + +
    Enumerator
    vbus_on  -
    vbus_off  -
    Enumerator
    vbus_on 
    vbus_off 
    -

    Definition at line 104 of file usbhost.h.

    +

    Definition at line 127 of file usbhost.h.

    @@ -136,7 +116,7 @@ Enumerations diff --git a/usbhost_8h_source.html b/usbhost_8h_source.html index a7da24e9..02bed629 100644 --- a/usbhost_8h_source.html +++ b/usbhost_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhost.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    usbhost.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 /* MAX3421E-based USB Host Library header file */
    18 
    19 
    20 #if !defined(_usb_h_) || defined(_USBHOST_H_)
    21 #error "Never include usbhost.h directly; include Usb.h instead"
    22 #else
    23 #define _USBHOST_H_
    24 
    25 #if USING_SPI4TEENSY3
    26 #include <spi4teensy3.h>
    27 #include <sys/types.h>
    28 #endif
    29 
    30 /* SPI initialization */
    31 template< typename SPI_CLK, typename SPI_MOSI, typename SPI_MISO, typename SPI_SS > class SPi {
    32 public:
    33 #if USING_SPI4TEENSY3
    34  static void init() {
    35  // spi4teensy3 inits everything for us, except /SS
    36  // CLK, MOSI and MISO are hard coded for now.
    37  // spi4teensy3::init(0,0,0); // full speed, cpol 0, cpha 0
    38  spi4teensy3::init(); // full speed, cpol 0, cpha 0
    39  SPI_SS::SetDirWrite();
    40  SPI_SS::Set();
    41  }
    42 #elif SPI_HAS_TRANSACTION
    43  static void init() {
    44  SPI.begin(); // The SPI library with transaction will take care of setting up the pins - settings is set in beginTransaction()
    45  SPI_SS::SetDirWrite();
    46  SPI_SS::Set();
    47  }
    48 #elif defined(STM32F4)
    49 #warning "You need to initialize the SPI interface manually when using the STM32F4 platform"
    50  static void init() {
    51  // Should be initialized by the user manually for now
    52  }
    53 #elif !defined(SPDR)
    54  static void init() {
    55  SPI_SS::SetDirWrite();
    56  SPI_SS::Set();
    57  SPI.begin();
    58 #if defined(__MIPSEL__)
    59  SPI.setClockDivider(1);
    60 #elif defined(__ARDUINO_X86__)
    61  #ifdef SPI_CLOCK_1M // Hack used to check if setClockSpeed is available
    62  SPI.setClockSpeed(12000000); // The MAX3421E can handle up to 26MHz, but in practice this was the maximum that I could reliably use
    63  #else
    64  SPI.setClockDivider(SPI_CLOCK_DIV2); // This will set the SPI frequency to 8MHz - it could be higher, but it is not supported in the old API
    65  #endif
    66 #elif !defined(RBL_NRF51822)
    67  SPI.setClockDivider(4); // Set speed to 84MHz/4=21MHz - the MAX3421E can handle up to 26MHz
    68 #endif
    69  }
    70 #else
    71  static void init() {
    72  //uint8_t tmp;
    73  SPI_CLK::SetDirWrite();
    74  SPI_MOSI::SetDirWrite();
    75  SPI_MISO::SetDirRead();
    76  SPI_SS::SetDirWrite();
    77  /* mode 00 (CPOL=0, CPHA=0) master, fclk/2. Mode 11 (CPOL=11, CPHA=11) is also supported by MAX3421E */
    78  SPCR = 0x50;
    79  SPSR = 0x01; // 0x01
    80 
    81  //tmp = SPSR;
    82  //tmp = SPDR;
    83  }
    84 #endif
    85 };
    86 
    87 /* SPI pin definitions. see avrpins.h */
    88 #if defined(__AVR_ATmega1280__) || (__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
    89 typedef SPi< Pb1, Pb2, Pb3, Pb0 > spi;
    90 #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
    91 typedef SPi< Pb5, Pb3, Pb4, Pb2 > spi;
    92 #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
    93 typedef SPi< Pb7, Pb5, Pb6, Pb4 > spi;
    94 #elif (defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MKL26Z64__))) || defined(__ARDUINO_X86__) || defined(__MIPSEL__) || defined(STM32F4)
    95 typedef SPi< P13, P11, P12, P10 > spi;
    96 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    97 typedef SPi< P76, P75, P74, P10 > spi;
    98 #elif defined(RBL_NRF51822)
    99 typedef SPi< P16, P18, P17, P10 > spi;
    100 #else
    101 #error "No SPI entry in usbhost.h"
    102 #endif
    103 
    104 typedef enum {
    105  vbus_on = 0,
    107 } VBUS_t;
    108 
    109 template< typename SPI_SS, typename INTR > class MAX3421e /* : public spi */ {
    110  static uint8_t vbusState;
    111 
    112 public:
    113  MAX3421e();
    114  void regWr(uint8_t reg, uint8_t data);
    115  uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p);
    116  void gpioWr(uint8_t data);
    117  uint8_t regRd(uint8_t reg);
    118  uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p);
    119  uint8_t gpioRd();
    120  uint16_t reset();
    121  int8_t Init();
    122  int8_t Init(int mseconds);
    123 
    124  void vbusPower(VBUS_t state) {
    125  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | state));
    126  }
    127 
    128  uint8_t getVbusState(void) {
    129  return vbusState;
    130  };
    131  void busprobe();
    132  uint8_t GpxHandler();
    133  uint8_t IntHandler();
    134  uint8_t Task();
    135 };
    136 
    137 template< typename SPI_SS, typename INTR >
    139 
    140 /* constructor */
    141 template< typename SPI_SS, typename INTR >
    143  // Leaving ADK hardware setup in here, for now. This really belongs with the other parts.
    144 #ifdef BOARD_MEGA_ADK
    145  // For Mega ADK, which has a Max3421e on-board, set MAX_RESET to output mode, and then set it to HIGH
    146  P55::SetDirWrite();
    147  P55::Set();
    148 #endif
    149 };
    150 
    151 /* write single byte into MAX3421 register */
    152 template< typename SPI_SS, typename INTR >
    153 void MAX3421e< SPI_SS, INTR >::regWr(uint8_t reg, uint8_t data) {
    155 #if SPI_HAS_TRANSACTION
    156  SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    157 #endif
    158  SPI_SS::Clear();
    159 
    160 #if USING_SPI4TEENSY3
    161  uint8_t c[2];
    162  c[0] = reg | 0x02;
    163  c[1] = data;
    164  spi4teensy3::send(c, 2);
    165 #elif SPI_HAS_TRANSACTION
    166  uint8_t c[2];
    167  c[0] = reg | 0x02;
    168  c[1] = data;
    169  SPI.transfer(c, 2);
    170 #elif defined(STM32F4)
    171  uint8_t c[2];
    172  c[0] = reg | 0x02;
    173  c[1] = data;
    174  HAL_SPI_Transmit(&SPI_Handle, c, 2, HAL_MAX_DELAY);
    175 #elif !defined(SPDR)
    176  SPI.transfer(reg | 0x02);
    177  SPI.transfer(data);
    178 #else
    179  SPDR = (reg | 0x02);
    180  while(!(SPSR & (1 << SPIF)));
    181  SPDR = data;
    182  while(!(SPSR & (1 << SPIF)));
    183 #endif
    184 
    185  SPI_SS::Set();
    186 #if SPI_HAS_TRANSACTION
    187  SPI.endTransaction();
    188 #endif
    190  return;
    191 };
    192 /* multiple-byte write */
    193 
    194 /* returns a pointer to memory position after last written */
    195 template< typename SPI_SS, typename INTR >
    196 uint8_t* MAX3421e< SPI_SS, INTR >::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
    198 #if SPI_HAS_TRANSACTION
    199  SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    200 #endif
    201  SPI_SS::Clear();
    202 
    203 #if USING_SPI4TEENSY3
    204  spi4teensy3::send(reg | 0x02);
    205  spi4teensy3::send(data_p, nbytes);
    206  data_p += nbytes;
    207 #elif SPI_HAS_TRANSACTION
    208  SPI.transfer(reg | 0x02);
    209  SPI.transfer(data_p, nbytes);
    210  data_p += nbytes;
    211 #elif defined(__ARDUINO_X86__)
    212  SPI.transfer(reg | 0x02);
    213  SPI.transferBuffer(data_p, NULL, nbytes);
    214  data_p += nbytes;
    215 #elif defined(STM32F4)
    216  uint8_t data = reg | 0x02;
    217  HAL_SPI_Transmit(&SPI_Handle, &data, 1, HAL_MAX_DELAY);
    218  HAL_SPI_Transmit(&SPI_Handle, data_p, nbytes, HAL_MAX_DELAY);
    219  data_p += nbytes;
    220 #elif !defined(SPDR)
    221  SPI.transfer(reg | 0x02);
    222  while(nbytes) {
    223  SPI.transfer(*data_p);
    224  nbytes--;
    225  data_p++; // advance data pointer
    226  }
    227 #else
    228  SPDR = (reg | 0x02); //set WR bit and send register number
    229  while(nbytes) {
    230  while(!(SPSR & (1 << SPIF))); //check if previous byte was sent
    231  SPDR = (*data_p); // send next data byte
    232  nbytes--;
    233  data_p++; // advance data pointer
    234  }
    235  while(!(SPSR & (1 << SPIF)));
    236 #endif
    237 
    238  SPI_SS::Set();
    239 #if SPI_HAS_TRANSACTION
    240  SPI.endTransaction();
    241 #endif
    243  return ( data_p);
    244 }
    245 /* GPIO write */
    246 /*GPIO byte is split between 2 registers, so two writes are needed to write one byte */
    247 
    248 /* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */
    249 template< typename SPI_SS, typename INTR >
    251  regWr(rIOPINS1, data);
    252  data >>= 4;
    253  regWr(rIOPINS2, data);
    254  return;
    255 }
    256 
    257 /* single host register read */
    258 template< typename SPI_SS, typename INTR >
    259 uint8_t MAX3421e< SPI_SS, INTR >::regRd(uint8_t reg) {
    261 #if SPI_HAS_TRANSACTION
    262  SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    263 #endif
    264  SPI_SS::Clear();
    265 
    266 #if USING_SPI4TEENSY3
    267  spi4teensy3::send(reg);
    268  uint8_t rv = spi4teensy3::receive();
    269  SPI_SS::Set();
    270 #elif defined(STM32F4)
    271  HAL_SPI_Transmit(&SPI_Handle, &reg, 1, HAL_MAX_DELAY);
    272  uint8_t rv = 0;
    273  HAL_SPI_Receive(&SPI_Handle, &rv, 1, HAL_MAX_DELAY);
    274  SPI_SS::Set();
    275 #elif !defined(SPDR) || SPI_HAS_TRANSACTION
    276  SPI.transfer(reg);
    277  uint8_t rv = SPI.transfer(0); // Send empty byte
    278  SPI_SS::Set();
    279 #else
    280  SPDR = reg;
    281  while(!(SPSR & (1 << SPIF)));
    282  SPDR = 0; // Send empty byte
    283  while(!(SPSR & (1 << SPIF)));
    284  SPI_SS::Set();
    285  uint8_t rv = SPDR;
    286 #endif
    287 
    288 #if SPI_HAS_TRANSACTION
    289  SPI.endTransaction();
    290 #endif
    292  return (rv);
    293 }
    294 /* multiple-byte register read */
    295 
    296 /* returns a pointer to a memory position after last read */
    297 template< typename SPI_SS, typename INTR >
    298 uint8_t* MAX3421e< SPI_SS, INTR >::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
    300 #if SPI_HAS_TRANSACTION
    301  SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    302 #endif
    303  SPI_SS::Clear();
    304 
    305 #if USING_SPI4TEENSY3
    306  spi4teensy3::send(reg);
    307  spi4teensy3::receive(data_p, nbytes);
    308  data_p += nbytes;
    309 #elif SPI_HAS_TRANSACTION
    310  SPI.transfer(reg);
    311  memset(data_p, 0, nbytes); // Make sure we send out empty bytes
    312  SPI.transfer(data_p, nbytes);
    313  data_p += nbytes;
    314 #elif defined(__ARDUINO_X86__)
    315  SPI.transfer(reg);
    316  SPI.transferBuffer(NULL, data_p, nbytes);
    317  data_p += nbytes;
    318 #elif defined(STM32F4)
    319  HAL_SPI_Transmit(&SPI_Handle, &reg, 1, HAL_MAX_DELAY);
    320  memset(data_p, 0, nbytes); // Make sure we send out empty bytes
    321  HAL_SPI_Receive(&SPI_Handle, data_p, nbytes, HAL_MAX_DELAY);
    322  data_p += nbytes;
    323 #elif !defined(SPDR)
    324  SPI.transfer(reg);
    325  while(nbytes) {
    326  *data_p++ = SPI.transfer(0);
    327  nbytes--;
    328  }
    329 #else
    330  SPDR = reg;
    331  while(!(SPSR & (1 << SPIF))); //wait
    332  while(nbytes) {
    333  SPDR = 0; // Send empty byte
    334  nbytes--;
    335  while(!(SPSR & (1 << SPIF)));
    336 #if 0
    337  {
    338  *data_p = SPDR;
    339  printf("%2.2x ", *data_p);
    340  }
    341  data_p++;
    342  }
    343  printf("\r\n");
    344 #else
    345  *data_p++ = SPDR;
    346  }
    347 #endif
    348 #endif
    349 
    350  SPI_SS::Set();
    351 #if SPI_HAS_TRANSACTION
    352  SPI.endTransaction();
    353 #endif
    355  return ( data_p);
    356 }
    357 /* GPIO read. See gpioWr for explanation */
    358 
    359 /* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */
    360 template< typename SPI_SS, typename INTR >
    362  uint8_t gpin = 0;
    363  gpin = regRd(rIOPINS2); //pins 4-7
    364  gpin &= 0xf0; //clean lower nibble
    365  gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation.
    366  return ( gpin);
    367 }
    368 
    369 /* reset MAX3421E. Returns number of cycles it took for PLL to stabilize after reset
    370  or zero if PLL haven't stabilized in 65535 cycles */
    371 template< typename SPI_SS, typename INTR >
    373  uint16_t i = 0;
    374  regWr(rUSBCTL, bmCHIPRES);
    375  regWr(rUSBCTL, 0x00);
    376  while(++i) {
    377  if((regRd(rUSBIRQ) & bmOSCOKIRQ)) {
    378  break;
    379  }
    380  }
    381  return ( i);
    382 }
    383 
    384 /* initialize MAX3421E. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not */
    385 template< typename SPI_SS, typename INTR >
    388  // Moved here.
    389  // you really should not init hardware in the constructor when it involves locks.
    390  // Also avoids the vbus flicker issue confusing some devices.
    391  /* pin and peripheral setup */
    392  SPI_SS::SetDirWrite();
    393  SPI_SS::Set();
    394  spi::init();
    395  INTR::SetDirRead();
    397  /* MAX3421E - full-duplex SPI, level interrupt */
    398  // GPX pin on. Moved here, otherwise we flicker the vbus.
    399  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL));
    400 
    401  if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
    402  return ( -1);
    403  }
    404 
    405  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
    406 
    407  regWr(rHIEN, bmCONDETIE | bmFRAMEIE); //connection detection
    408 
    409  /* check if device is connected */
    410  regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
    411  while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
    412 
    413  busprobe(); //check if anything is connected
    414 
    415  regWr(rHIRQ, bmCONDETIRQ); //clear connection detect interrupt
    416  regWr(rCPUCTL, 0x01); //enable interrupt pin
    417 
    418  return ( 0);
    419 }
    420 
    421 /* initialize MAX3421E. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not */
    422 template< typename SPI_SS, typename INTR >
    423 int8_t MAX3421e< SPI_SS, INTR >::Init(int mseconds) {
    425  // Moved here.
    426  // you really should not init hardware in the constructor when it involves locks.
    427  // Also avoids the vbus flicker issue confusing some devices.
    428  /* pin and peripheral setup */
    429  SPI_SS::SetDirWrite();
    430  SPI_SS::Set();
    431  spi::init();
    432  INTR::SetDirRead();
    434  /* MAX3421E - full-duplex SPI, level interrupt, vbus off */
    435  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | GPX_VBDET));
    436 
    437  if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
    438  return ( -1);
    439  }
    440 
    441  // Delay a minimum of 1 second to ensure any capacitors are drained.
    442  // 1 second is required to make sure we do not smoke a Microdrive!
    443  if(mseconds < 1000) mseconds = 1000;
    444  delay(mseconds);
    445 
    446  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
    447 
    448  regWr(rHIEN, bmCONDETIE | bmFRAMEIE); //connection detection
    449 
    450  /* check if device is connected */
    451  regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
    452  while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
    453 
    454  busprobe(); //check if anything is connected
    455 
    456  regWr(rHIRQ, bmCONDETIRQ); //clear connection detect interrupt
    457  regWr(rCPUCTL, 0x01); //enable interrupt pin
    458 
    459  // GPX pin on. This is done here so that busprobe will fail if we have a switch connected.
    460  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL));
    461 
    462  return ( 0);
    463 }
    464 
    465 /* probe bus to determine device presence and speed and switch host to this speed */
    466 template< typename SPI_SS, typename INTR >
    468  uint8_t bus_sample;
    469  bus_sample = regRd(rHRSL); //Get J,K status
    470  bus_sample &= (bmJSTATUS | bmKSTATUS); //zero the rest of the byte
    471  switch(bus_sample) { //start full-speed or low-speed host
    472  case( bmJSTATUS):
    473  if((regRd(rMODE) & bmLOWSPEED) == 0) {
    474  regWr(rMODE, MODE_FS_HOST); //start full-speed host
    475  vbusState = FSHOST;
    476  } else {
    477  regWr(rMODE, MODE_LS_HOST); //start low-speed host
    478  vbusState = LSHOST;
    479  }
    480  break;
    481  case( bmKSTATUS):
    482  if((regRd(rMODE) & bmLOWSPEED) == 0) {
    483  regWr(rMODE, MODE_LS_HOST); //start low-speed host
    484  vbusState = LSHOST;
    485  } else {
    486  regWr(rMODE, MODE_FS_HOST); //start full-speed host
    487  vbusState = FSHOST;
    488  }
    489  break;
    490  case( bmSE1): //illegal state
    491  vbusState = SE1;
    492  break;
    493  case( bmSE0): //disconnected state
    494  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST | bmSEPIRQ);
    495  vbusState = SE0;
    496  break;
    497  }//end switch( bus_sample )
    498 }
    499 
    500 /* MAX3421 state change task and interrupt handler */
    501 template< typename SPI_SS, typename INTR >
    503  uint8_t rcode = 0;
    504  uint8_t pinvalue;
    505  //USB_HOST_SERIAL.print("Vbus state: ");
    506  //USB_HOST_SERIAL.println( vbusState, HEX );
    507  pinvalue = INTR::IsSet(); //Read();
    508  //pinvalue = digitalRead( MAX_INT );
    509  if(pinvalue == 0) {
    510  rcode = IntHandler();
    511  }
    512  // pinvalue = digitalRead( MAX_GPX );
    513  // if( pinvalue == LOW ) {
    514  // GpxHandler();
    515  // }
    516  // usbSM(); //USB state machine
    517  return ( rcode);
    518 }
    519 
    520 template< typename SPI_SS, typename INTR >
    522  uint8_t HIRQ;
    523  uint8_t HIRQ_sendback = 0x00;
    524  HIRQ = regRd(rHIRQ); //determine interrupt source
    525  //if( HIRQ & bmFRAMEIRQ ) { //->1ms SOF interrupt handler
    526  // HIRQ_sendback |= bmFRAMEIRQ;
    527  //}//end FRAMEIRQ handling
    528  if(HIRQ & bmCONDETIRQ) {
    529  busprobe();
    530  HIRQ_sendback |= bmCONDETIRQ;
    531  }
    532  /* End HIRQ interrupts handling, clear serviced IRQs */
    533  regWr(rHIRQ, HIRQ_sendback);
    534  return ( HIRQ_sendback);
    535 }
    536 //template< typename SPI_SS, typename INTR >
    537 //uint8_t MAX3421e< SPI_SS, INTR >::GpxHandler()
    538 //{
    539 // uint8_t GPINIRQ = regRd( rGPINIRQ ); //read GPIN IRQ register
    546 // return( GPINIRQ );
    547 //}
    548 
    549 #endif // _USBHOST_H_
    #define GPX_VBDET
    Definition: max3421e.h:75
    -
    #define rIOPINS1
    Definition: max3421e.h:81
    -
    void busprobe()
    Definition: usbhost.h:467
    -
    #define rHIEN
    Definition: max3421e.h:148
    -
    #define FSHOST
    Definition: max3421e.h:30
    -
    #define rHCTL
    Definition: max3421e.h:174
    -
    #define bmCONDETIRQ
    Definition: max3421e.h:144
    -
    #define bmCONDETIE
    Definition: max3421e.h:156
    -
    #define bmSE1
    Definition: max3421e.h:204
    -
    #define bmCHIPRES
    Definition: max3421e.h:57
    -
    uint8_t getVbusState(void)
    Definition: usbhost.h:128
    - -
    #define rCPUCTL
    Definition: max3421e.h:60
    -
    #define bmJSTATUS
    Definition: max3421e.h:202
    -
    uint16_t reset()
    Definition: usbhost.h:372
    - -
    #define MODE_LS_HOST
    Definition: max3421e.h:225
    -
    #define bmINTLEVEL
    Definition: max3421e.h:69
    -
    void gpioWr(uint8_t data)
    Definition: usbhost.h:250
    -
    uint8_t Task()
    Definition: usbhost.h:502
    -
    #define rUSBCTL
    Definition: max3421e.h:55
    -
    #define bmSE0
    Definition: max3421e.h:203
    -
    #define bmHOST
    Definition: max3421e.h:163
    -
    #define bmSEPIRQ
    Definition: max3421e.h:167
    -
    uint8_t gpioRd()
    Definition: usbhost.h:361
    -
    int8_t Init()
    Definition: usbhost.h:386
    -
    #define LSHOST
    Definition: max3421e.h:31
    -
    #define rMODE
    Definition: max3421e.h:160
    -
    #define MODE_FS_HOST
    Definition: max3421e.h:224
    -
    void vbusPower(VBUS_t state)
    Definition: usbhost.h:124
    -
    #define bmKSTATUS
    Definition: max3421e.h:201
    -
    #define rHRSL
    Definition: max3421e.h:196
    -
    uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:298
    -
    #define XMEM_ACQUIRE_SPI()
    Definition: settings.h:121
    -
    #define bmLOWSPEED
    Definition: max3421e.h:164
    -
    uint8_t * bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:196
    -
    Definition: usbhost.h:31
    -
    #define rHIRQ
    Definition: max3421e.h:137
    -
    #define rUSBIRQ
    Definition: max3421e.h:43
    -
    #define XMEM_RELEASE_SPI()
    Definition: settings.h:122
    -
    #define bmFDUPSPI
    Definition: max3421e.h:68
    -
    #define rPINCTL
    Definition: max3421e.h:66
    -
    VBUS_t
    Definition: usbhost.h:104
    -
    void regWr(uint8_t reg, uint8_t data)
    Definition: usbhost.h:153
    -
    #define bmFRAMEIE
    Definition: max3421e.h:157
    -
    uint8_t IntHandler()
    Definition: usbhost.h:521
    -
    #define bmOSCOKIRQ
    Definition: max3421e.h:47
    -
    uint8_t regRd(uint8_t reg)
    Definition: usbhost.h:259
    -
    MAX3421e()
    Definition: usbhost.h:142
    - -
    #define SE0
    Definition: max3421e.h:28
    -
    #define rIOPINS2
    Definition: max3421e.h:93
    -
    #define bmDMPULLDN
    Definition: max3421e.h:169
    -
    #define SE1
    Definition: max3421e.h:29
    -
    #define bmSAMPLEBUS
    Definition: max3421e.h:178
    -
    static void init()
    Definition: usbhost.h:54
    -
    #define bmDPPULLDN
    Definition: max3421e.h:170
    +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 /* MAX3421E-based USB Host Library header file */
    25 
    26 
    27 #if !defined(_usb_h_) || defined(_USBHOST_H_)
    28 #error "Never include usbhost.h directly; include Usb.h instead"
    29 #else
    30 #define _USBHOST_H_
    31 
    32 #if USING_SPI4TEENSY3
    33 #include <spi4teensy3.h>
    34 #include <sys/types.h>
    35 #endif
    36 
    37 /* SPI initialization */
    38 template< typename SPI_CLK, typename SPI_MOSI, typename SPI_MISO, typename SPI_SS > class SPi {
    39 public:
    40 #if USING_SPI4TEENSY3
    41  static void init() {
    42  // spi4teensy3 inits everything for us, except /SS
    43  // CLK, MOSI and MISO are hard coded for now.
    44  // spi4teensy3::init(0,0,0); // full speed, cpol 0, cpha 0
    45  spi4teensy3::init(); // full speed, cpol 0, cpha 0
    46  SPI_SS::SetDirWrite();
    47  SPI_SS::Set();
    48  }
    49 #elif defined(SPI_HAS_TRANSACTION)
    50  static void init() {
    51  USB_SPI.begin(); // The SPI library with transaction will take care of setting up the pins - settings is set in beginTransaction()
    52  SPI_SS::SetDirWrite();
    53  SPI_SS::Set();
    54  }
    55 #elif defined(STM32F4)
    56 #warning "You need to initialize the SPI interface manually when using the STM32F4 platform"
    57  static void init() {
    58  // Should be initialized by the user manually for now
    59  }
    60 #elif !defined(SPDR)
    61  static void init() {
    62  SPI_SS::SetDirWrite();
    63  SPI_SS::Set();
    64  USB_SPI.begin();
    65 #if defined(__MIPSEL__)
    66  USB_SPI.setClockDivider(1);
    67 #elif defined(__ARDUINO_X86__)
    68  #ifdef SPI_CLOCK_1M // Hack used to check if setClockSpeed is available
    69  USB_SPI.setClockSpeed(12000000); // The MAX3421E can handle up to 26MHz, but in practice this was the maximum that I could reliably use
    70  #else
    71  USB_SPI.setClockDivider(SPI_CLOCK_DIV2); // This will set the SPI frequency to 8MHz - it could be higher, but it is not supported in the old API
    72  #endif
    73 #elif !defined(RBL_NRF51822)
    74  USB_SPI.setClockDivider(4); // Set speed to 84MHz/4=21MHz - the MAX3421E can handle up to 26MHz
    75 #endif
    76  }
    77 #else
    78  static void init() {
    79  //uint8_t tmp;
    80  SPI_CLK::SetDirWrite();
    81  SPI_MOSI::SetDirWrite();
    82  SPI_MISO::SetDirRead();
    83  SPI_SS::SetDirWrite();
    84  /* mode 00 (CPOL=0, CPHA=0) master, fclk/2. Mode 11 (CPOL=11, CPHA=11) is also supported by MAX3421E */
    85  SPCR = 0x50;
    86  SPSR = 0x01; // 0x01
    87 
    88  //tmp = SPSR;
    89  //tmp = SPDR;
    90  }
    91 #endif
    92 };
    93 
    94 /* SPI pin definitions. see avrpins.h */
    95 #if defined(PIN_SPI_SCK) && defined(PIN_SPI_MOSI) && defined(PIN_SPI_MISO) && defined(PIN_SPI_SS)
    96 // Use pin defines: https://github.com/arduino/Arduino/pull/4814
    97 // Based on: https://www.mikeash.com/pyblog/friday-qa-2015-03-20-preprocessor-abuse-and-optional-parentheses.html
    98 #define NOTHING_EXTRACT
    99 #define EXTRACT(...) EXTRACT __VA_ARGS__
    100 #define PASTE(x, ...) x ## __VA_ARGS__
    101 #define EVALUATING_PASTE(x, ...) PASTE(x, __VA_ARGS__)
    102 #define UNPAREN(x) EVALUATING_PASTE(NOTHING_, EXTRACT x)
    103 #define APPEND_PIN(pin) P ## pin // Appends the pin to 'P', e.g. 1 becomes P1
    104 #define MAKE_PIN(x) EVALUATING_PASTE(APPEND_, PIN(UNPAREN(x)))
    106 #undef MAKE_PIN
    107 #elif defined(__AVR_ATmega1280__) || (__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
    108 typedef SPi< Pb1, Pb2, Pb3, Pb0 > spi;
    109 #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
    110 typedef SPi< Pb5, Pb3, Pb4, Pb2 > spi;
    111 #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
    112 typedef SPi< Pb7, Pb5, Pb6, Pb4 > spi;
    113 #elif (defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__MKL26Z64__))) || defined(__ARDUINO_ARC__) || defined(__ARDUINO_X86__) || defined(__MIPSEL__) || defined(STM32F4)
    114 typedef SPi< P13, P11, P12, P10 > spi;
    115 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    116 typedef SPi< P76, P75, P74, P10 > spi;
    117 #elif defined(RBL_NRF51822)
    118 typedef SPi< P16, P18, P17, P10 > spi;
    119 #elif defined(ESP8266)
    120 typedef SPi< P14, P13, P12, P15 > spi;
    121 #elif defined(ESP32)
    122 typedef SPi< P18, P23, P19, P5 > spi;
    123 #else
    124 #error "No SPI entry in usbhost.h"
    125 #endif
    126 
    127 typedef enum {
    128  vbus_on = 0,
    130 } VBUS_t;
    131 
    132 template< typename SPI_SS, typename INTR > class MAX3421e /* : public spi */ {
    133  static uint8_t vbusState;
    134 
    135 public:
    136  MAX3421e();
    137  void regWr(uint8_t reg, uint8_t data);
    138  uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p);
    139  void gpioWr(uint8_t data);
    140  uint8_t regRd(uint8_t reg);
    141  uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p);
    142  uint8_t gpioRd();
    143  uint16_t reset();
    144  int8_t Init();
    145  int8_t Init(int mseconds);
    146 
    147  void vbusPower(VBUS_t state) {
    148  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | state));
    149  }
    150 
    151  uint8_t getVbusState(void) {
    152  return vbusState;
    153  };
    154  void busprobe();
    155  uint8_t GpxHandler();
    156  uint8_t IntHandler();
    157  uint8_t Task();
    158 };
    159 
    160 template< typename SPI_SS, typename INTR >
    162 
    163 /* constructor */
    164 template< typename SPI_SS, typename INTR >
    166  // Leaving ADK hardware setup in here, for now. This really belongs with the other parts.
    167 #ifdef BOARD_MEGA_ADK
    168  // For Mega ADK, which has a Max3421e on-board, set MAX_RESET to output mode, and then set it to HIGH
    169  P55::SetDirWrite();
    170  P55::Set();
    171 #endif
    172 };
    173 
    174 /* write single byte into MAX3421 register */
    175 template< typename SPI_SS, typename INTR >
    176 void MAX3421e< SPI_SS, INTR >::regWr(uint8_t reg, uint8_t data) {
    178 #if defined(SPI_HAS_TRANSACTION)
    179  USB_SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    180 #endif
    181  SPI_SS::Clear();
    182 
    183 #if USING_SPI4TEENSY3
    184  uint8_t c[2];
    185  c[0] = reg | 0x02;
    186  c[1] = data;
    187  spi4teensy3::send(c, 2);
    188 #elif defined(SPI_HAS_TRANSACTION) && !defined(ESP8266) && !defined(ESP32)
    189  uint8_t c[2];
    190  c[0] = reg | 0x02;
    191  c[1] = data;
    192  USB_SPI.transfer(c, 2);
    193 #elif defined(STM32F4)
    194  uint8_t c[2];
    195  c[0] = reg | 0x02;
    196  c[1] = data;
    197  HAL_SPI_Transmit(&SPI_Handle, c, 2, HAL_MAX_DELAY);
    198 #elif !defined(SPDR) // ESP8266, ESP32
    199  USB_SPI.transfer(reg | 0x02);
    200  USB_SPI.transfer(data);
    201 #else
    202  SPDR = (reg | 0x02);
    203  while(!(SPSR & (1 << SPIF)));
    204  SPDR = data;
    205  while(!(SPSR & (1 << SPIF)));
    206 #endif
    207 
    208  SPI_SS::Set();
    209 #if defined(SPI_HAS_TRANSACTION)
    210  USB_SPI.endTransaction();
    211 #endif
    213  return;
    214 };
    215 /* multiple-byte write */
    216 
    217 /* returns a pointer to memory position after last written */
    218 template< typename SPI_SS, typename INTR >
    219 uint8_t* MAX3421e< SPI_SS, INTR >::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
    221 #if defined(SPI_HAS_TRANSACTION)
    222  USB_SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    223 #endif
    224  SPI_SS::Clear();
    225 
    226 #if USING_SPI4TEENSY3
    227  spi4teensy3::send(reg | 0x02);
    228  spi4teensy3::send(data_p, nbytes);
    229  data_p += nbytes;
    230 #elif defined(SPI_HAS_TRANSACTION) && !defined(ESP8266) && !defined(ESP32)
    231  USB_SPI.transfer(reg | 0x02);
    232  USB_SPI.transfer(data_p, nbytes);
    233  data_p += nbytes;
    234 #elif defined(__ARDUINO_X86__)
    235  USB_SPI.transfer(reg | 0x02);
    236  USB_SPI.transferBuffer(data_p, NULL, nbytes);
    237  data_p += nbytes;
    238 #elif defined(STM32F4)
    239  uint8_t data = reg | 0x02;
    240  HAL_SPI_Transmit(&SPI_Handle, &data, 1, HAL_MAX_DELAY);
    241  HAL_SPI_Transmit(&SPI_Handle, data_p, nbytes, HAL_MAX_DELAY);
    242  data_p += nbytes;
    243 #elif !defined(SPDR) // ESP8266, ESP32
    244  USB_SPI.transfer(reg | 0x02);
    245  while(nbytes) {
    246  USB_SPI.transfer(*data_p);
    247  nbytes--;
    248  data_p++; // advance data pointer
    249  }
    250 #else
    251  SPDR = (reg | 0x02); //set WR bit and send register number
    252  while(nbytes) {
    253  while(!(SPSR & (1 << SPIF))); //check if previous byte was sent
    254  SPDR = (*data_p); // send next data byte
    255  nbytes--;
    256  data_p++; // advance data pointer
    257  }
    258  while(!(SPSR & (1 << SPIF)));
    259 #endif
    260 
    261  SPI_SS::Set();
    262 #if defined(SPI_HAS_TRANSACTION)
    263  USB_SPI.endTransaction();
    264 #endif
    266  return ( data_p);
    267 }
    268 /* GPIO write */
    269 /*GPIO byte is split between 2 registers, so two writes are needed to write one byte */
    270 
    271 /* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */
    272 template< typename SPI_SS, typename INTR >
    274  regWr(rIOPINS1, data);
    275  data >>= 4;
    276  regWr(rIOPINS2, data);
    277  return;
    278 }
    279 
    280 /* single host register read */
    281 template< typename SPI_SS, typename INTR >
    282 uint8_t MAX3421e< SPI_SS, INTR >::regRd(uint8_t reg) {
    284 #if defined(SPI_HAS_TRANSACTION)
    285  USB_SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    286 #endif
    287  SPI_SS::Clear();
    288 
    289 #if USING_SPI4TEENSY3
    290  spi4teensy3::send(reg);
    291  uint8_t rv = spi4teensy3::receive();
    292  SPI_SS::Set();
    293 #elif defined(STM32F4)
    294  HAL_SPI_Transmit(&SPI_Handle, &reg, 1, HAL_MAX_DELAY);
    295  uint8_t rv = 0;
    296  HAL_SPI_Receive(&SPI_Handle, &rv, 1, HAL_MAX_DELAY);
    297  SPI_SS::Set();
    298 #elif !defined(SPDR) || defined(SPI_HAS_TRANSACTION)
    299  USB_SPI.transfer(reg);
    300  uint8_t rv = USB_SPI.transfer(0); // Send empty byte
    301  SPI_SS::Set();
    302 #else
    303  SPDR = reg;
    304  while(!(SPSR & (1 << SPIF)));
    305  SPDR = 0; // Send empty byte
    306  while(!(SPSR & (1 << SPIF)));
    307  SPI_SS::Set();
    308  uint8_t rv = SPDR;
    309 #endif
    310 
    311 #if defined(SPI_HAS_TRANSACTION)
    312  USB_SPI.endTransaction();
    313 #endif
    315  return (rv);
    316 }
    317 /* multiple-byte register read */
    318 
    319 /* returns a pointer to a memory position after last read */
    320 template< typename SPI_SS, typename INTR >
    321 uint8_t* MAX3421e< SPI_SS, INTR >::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
    323 #if defined(SPI_HAS_TRANSACTION)
    324  USB_SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    325 #endif
    326  SPI_SS::Clear();
    327 
    328 #if USING_SPI4TEENSY3
    329  spi4teensy3::send(reg);
    330  spi4teensy3::receive(data_p, nbytes);
    331  data_p += nbytes;
    332 #elif defined(SPI_HAS_TRANSACTION) && !defined(ESP8266) && !defined(ESP32)
    333  USB_SPI.transfer(reg);
    334  memset(data_p, 0, nbytes); // Make sure we send out empty bytes
    335  USB_SPI.transfer(data_p, nbytes);
    336  data_p += nbytes;
    337 #elif defined(__ARDUINO_X86__)
    338  USB_SPI.transfer(reg);
    339  USB_SPI.transferBuffer(NULL, data_p, nbytes);
    340  data_p += nbytes;
    341 #elif defined(STM32F4)
    342  HAL_SPI_Transmit(&SPI_Handle, &reg, 1, HAL_MAX_DELAY);
    343  memset(data_p, 0, nbytes); // Make sure we send out empty bytes
    344  HAL_SPI_Receive(&SPI_Handle, data_p, nbytes, HAL_MAX_DELAY);
    345  data_p += nbytes;
    346 #elif !defined(SPDR) // ESP8266, ESP32
    347  USB_SPI.transfer(reg);
    348  while(nbytes) {
    349  *data_p++ = USB_SPI.transfer(0);
    350  nbytes--;
    351  }
    352 #else
    353  SPDR = reg;
    354  while(!(SPSR & (1 << SPIF))); //wait
    355  while(nbytes) {
    356  SPDR = 0; // Send empty byte
    357  nbytes--;
    358  while(!(SPSR & (1 << SPIF)));
    359 #if 0
    360  {
    361  *data_p = SPDR;
    362  printf("%2.2x ", *data_p);
    363  }
    364  data_p++;
    365  }
    366  printf("\r\n");
    367 #else
    368  *data_p++ = SPDR;
    369  }
    370 #endif
    371 #endif
    372 
    373  SPI_SS::Set();
    374 #if defined(SPI_HAS_TRANSACTION)
    375  USB_SPI.endTransaction();
    376 #endif
    378  return ( data_p);
    379 }
    380 /* GPIO read. See gpioWr for explanation */
    381 
    382 /* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */
    383 template< typename SPI_SS, typename INTR >
    385  uint8_t gpin = 0;
    386  gpin = regRd(rIOPINS2); //pins 4-7
    387  gpin &= 0xf0; //clean lower nibble
    388  gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation.
    389  return ( gpin);
    390 }
    391 
    392 /* reset MAX3421E. Returns number of cycles it took for PLL to stabilize after reset
    393  or zero if PLL haven't stabilized in 65535 cycles */
    394 template< typename SPI_SS, typename INTR >
    396  uint16_t i = 0;
    397  regWr(rUSBCTL, bmCHIPRES);
    398  regWr(rUSBCTL, 0x00);
    399  while(++i) {
    400  if((regRd(rUSBIRQ) & bmOSCOKIRQ)) {
    401  break;
    402  }
    403  }
    404  return ( i);
    405 }
    406 
    407 /* initialize MAX3421E. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not */
    408 template< typename SPI_SS, typename INTR >
    411  // Moved here.
    412  // you really should not init hardware in the constructor when it involves locks.
    413  // Also avoids the vbus flicker issue confusing some devices.
    414  /* pin and peripheral setup */
    415  SPI_SS::SetDirWrite();
    416  SPI_SS::Set();
    417  spi::init();
    418  INTR::SetDirRead();
    420  /* MAX3421E - full-duplex SPI, level interrupt */
    421  // GPX pin on. Moved here, otherwise we flicker the vbus.
    422  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL));
    423 
    424  if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
    425  return ( -1);
    426  }
    427 
    428  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
    429 
    430  regWr(rHIEN, bmCONDETIE | bmFRAMEIE); //connection detection
    431 
    432  /* check if device is connected */
    433  regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
    434  while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
    435 
    436  busprobe(); //check if anything is connected
    437 
    438  regWr(rHIRQ, bmCONDETIRQ); //clear connection detect interrupt
    439  regWr(rCPUCTL, 0x01); //enable interrupt pin
    440 
    441  return ( 0);
    442 }
    443 
    444 /* initialize MAX3421E. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not */
    445 template< typename SPI_SS, typename INTR >
    446 int8_t MAX3421e< SPI_SS, INTR >::Init(int mseconds) {
    448  // Moved here.
    449  // you really should not init hardware in the constructor when it involves locks.
    450  // Also avoids the vbus flicker issue confusing some devices.
    451  /* pin and peripheral setup */
    452  SPI_SS::SetDirWrite();
    453  SPI_SS::Set();
    454  spi::init();
    455  INTR::SetDirRead();
    457  /* MAX3421E - full-duplex SPI, level interrupt, vbus off */
    458  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | GPX_VBDET));
    459 
    460  if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
    461  return ( -1);
    462  }
    463 
    464  // Delay a minimum of 1 second to ensure any capacitors are drained.
    465  // 1 second is required to make sure we do not smoke a Microdrive!
    466  if(mseconds < 1000) mseconds = 1000;
    467  delay(mseconds);
    468 
    469  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
    470 
    471  regWr(rHIEN, bmCONDETIE | bmFRAMEIE); //connection detection
    472 
    473  /* check if device is connected */
    474  regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
    475  while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
    476 
    477  busprobe(); //check if anything is connected
    478 
    479  regWr(rHIRQ, bmCONDETIRQ); //clear connection detect interrupt
    480  regWr(rCPUCTL, 0x01); //enable interrupt pin
    481 
    482  // GPX pin on. This is done here so that busprobe will fail if we have a switch connected.
    483  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL));
    484 
    485  return ( 0);
    486 }
    487 
    488 /* probe bus to determine device presence and speed and switch host to this speed */
    489 template< typename SPI_SS, typename INTR >
    491  uint8_t bus_sample;
    492  bus_sample = regRd(rHRSL); //Get J,K status
    493  bus_sample &= (bmJSTATUS | bmKSTATUS); //zero the rest of the byte
    494  switch(bus_sample) { //start full-speed or low-speed host
    495  case( bmJSTATUS):
    496  if((regRd(rMODE) & bmLOWSPEED) == 0) {
    497  regWr(rMODE, MODE_FS_HOST); //start full-speed host
    498  vbusState = FSHOST;
    499  } else {
    500  regWr(rMODE, MODE_LS_HOST); //start low-speed host
    501  vbusState = LSHOST;
    502  }
    503  break;
    504  case( bmKSTATUS):
    505  if((regRd(rMODE) & bmLOWSPEED) == 0) {
    506  regWr(rMODE, MODE_LS_HOST); //start low-speed host
    507  vbusState = LSHOST;
    508  } else {
    509  regWr(rMODE, MODE_FS_HOST); //start full-speed host
    510  vbusState = FSHOST;
    511  }
    512  break;
    513  case( bmSE1): //illegal state
    514  vbusState = SE1;
    515  break;
    516  case( bmSE0): //disconnected state
    517  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST | bmSEPIRQ);
    518  vbusState = SE0;
    519  break;
    520  }//end switch( bus_sample )
    521 }
    522 
    523 /* MAX3421 state change task and interrupt handler */
    524 template< typename SPI_SS, typename INTR >
    526  uint8_t rcode = 0;
    527  uint8_t pinvalue;
    528  //USB_HOST_SERIAL.print("Vbus state: ");
    529  //USB_HOST_SERIAL.println( vbusState, HEX );
    530  pinvalue = INTR::IsSet(); //Read();
    531  //pinvalue = digitalRead( MAX_INT );
    532  if(pinvalue == 0) {
    533  rcode = IntHandler();
    534  }
    535  // pinvalue = digitalRead( MAX_GPX );
    536  // if( pinvalue == LOW ) {
    537  // GpxHandler();
    538  // }
    539  // usbSM(); //USB state machine
    540  return ( rcode);
    541 }
    542 
    543 template< typename SPI_SS, typename INTR >
    545  uint8_t HIRQ;
    546  uint8_t HIRQ_sendback = 0x00;
    547  HIRQ = regRd(rHIRQ); //determine interrupt source
    548  //if( HIRQ & bmFRAMEIRQ ) { //->1ms SOF interrupt handler
    549  // HIRQ_sendback |= bmFRAMEIRQ;
    550  //}//end FRAMEIRQ handling
    551  if(HIRQ & bmCONDETIRQ) {
    552  busprobe();
    553  HIRQ_sendback |= bmCONDETIRQ;
    554  }
    555  /* End HIRQ interrupts handling, clear serviced IRQs */
    556  regWr(rHIRQ, HIRQ_sendback);
    557  return ( HIRQ_sendback);
    558 }
    559 //template< typename SPI_SS, typename INTR >
    560 //uint8_t MAX3421e< SPI_SS, INTR >::GpxHandler()
    561 //{
    562 // uint8_t GPINIRQ = regRd( rGPINIRQ ); //read GPIN IRQ register
    569 // return( GPINIRQ );
    570 //}
    571 
    572 #endif // _USBHOST_H_
    #define GPX_VBDET
    Definition: max3421e.h:82
    +
    #define rIOPINS1
    Definition: max3421e.h:88
    +
    void busprobe()
    Definition: usbhost.h:490
    +
    #define rHIEN
    Definition: max3421e.h:155
    +
    #define FSHOST
    Definition: max3421e.h:37
    +
    #define rHCTL
    Definition: max3421e.h:181
    +
    #define bmCONDETIRQ
    Definition: max3421e.h:151
    +
    #define bmCONDETIE
    Definition: max3421e.h:163
    +
    #define bmSE1
    Definition: max3421e.h:211
    +
    #define bmCHIPRES
    Definition: max3421e.h:64
    +
    uint8_t getVbusState(void)
    Definition: usbhost.h:151
    + +
    #define rCPUCTL
    Definition: max3421e.h:67
    +
    #define bmJSTATUS
    Definition: max3421e.h:209
    +
    uint16_t reset()
    Definition: usbhost.h:395
    + +
    #define MODE_LS_HOST
    Definition: max3421e.h:232
    +
    #define bmINTLEVEL
    Definition: max3421e.h:76
    +
    void gpioWr(uint8_t data)
    Definition: usbhost.h:273
    +
    uint8_t Task()
    Definition: usbhost.h:525
    +
    #define rUSBCTL
    Definition: max3421e.h:62
    +
    #define bmSE0
    Definition: max3421e.h:210
    +
    #define bmHOST
    Definition: max3421e.h:170
    +
    #define bmSEPIRQ
    Definition: max3421e.h:174
    +
    uint8_t gpioRd()
    Definition: usbhost.h:384
    +
    int8_t Init()
    Definition: usbhost.h:409
    +
    uint8_t GpxHandler()
    +
    #define LSHOST
    Definition: max3421e.h:38
    +
    #define rMODE
    Definition: max3421e.h:167
    +
    #define MODE_FS_HOST
    Definition: max3421e.h:231
    +
    void vbusPower(VBUS_t state)
    Definition: usbhost.h:147
    +
    #define bmKSTATUS
    Definition: max3421e.h:208
    +
    #define rHRSL
    Definition: max3421e.h:203
    +
    uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:321
    +
    #define XMEM_ACQUIRE_SPI()
    Definition: settings.h:136
    +
    #define bmLOWSPEED
    Definition: max3421e.h:171
    +
    uint8_t * bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:219
    +
    Definition: usbhost.h:38
    +
    #define rHIRQ
    Definition: max3421e.h:144
    +
    #define rUSBIRQ
    Definition: max3421e.h:50
    +
    #define XMEM_RELEASE_SPI()
    Definition: settings.h:137
    +
    #define bmFDUPSPI
    Definition: max3421e.h:75
    +
    #define rPINCTL
    Definition: max3421e.h:73
    +
    VBUS_t
    Definition: usbhost.h:127
    +
    void regWr(uint8_t reg, uint8_t data)
    Definition: usbhost.h:176
    +
    #define bmFRAMEIE
    Definition: max3421e.h:164
    +
    uint8_t IntHandler()
    Definition: usbhost.h:544
    +
    #define bmOSCOKIRQ
    Definition: max3421e.h:54
    +
    uint8_t regRd(uint8_t reg)
    Definition: usbhost.h:282
    +
    MAX3421e()
    Definition: usbhost.h:165
    + +
    #define USB_SPI
    Definition: settings.h:33
    +
    #define SE0
    Definition: max3421e.h:35
    +
    #define rIOPINS2
    Definition: max3421e.h:100
    +
    #define bmDMPULLDN
    Definition: max3421e.h:176
    +
    #define SE1
    Definition: max3421e.h:36
    +
    #define bmSAMPLEBUS
    Definition: max3421e.h:185
    +
    static void init()
    Definition: usbhost.h:61
    +
    #define bmDPPULLDN
    Definition: max3421e.h:177
    diff --git a/usbhub_8cpp.html b/usbhub_8cpp.html index 897d9c34..526db1a9 100644 --- a/usbhub_8cpp.html +++ b/usbhub_8cpp.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhub.cpp File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Function Documentation

    - + +

    ◆ PrintHubPortStatus()

    +
    @@ -147,7 +129,7 @@ Functions
    -

    Definition at line 378 of file usbhub.cpp.

    +

    Definition at line 378 of file usbhub.cpp.

    @@ -156,7 +138,7 @@ Functions diff --git a/usbhub_8cpp__incl.md5 b/usbhub_8cpp__incl.md5 index 10f8250c..6fd9e76b 100644 --- a/usbhub_8cpp__incl.md5 +++ b/usbhub_8cpp__incl.md5 @@ -1 +1 @@ -d30f3e0393f05796b3f85b9b895576e7 \ No newline at end of file +a8323666a6dae66b3b7a941f9b7efaa9 \ No newline at end of file diff --git a/usbhub_8cpp__incl.png b/usbhub_8cpp__incl.png index 0f61626cf9e68fc312beaaa30a8c9051d1a64529..a2faa176c7f0d97aa30e665e96934a0b164c03ee 100644 GIT binary patch literal 4430 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 F{vY{hmm~lH diff --git a/usbhub_8cpp_source.html b/usbhub_8cpp_source.html index 2383667a..a5d85bff 100644 --- a/usbhub_8cpp_source.html +++ b/usbhub_8cpp_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhub.cpp Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    usbhub.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 "usbhub.h"
    18 
    19 bool USBHub::bResetInitiated = false;
    20 
    22 pUsb(p),
    23 bAddress(0),
    24 bNbrPorts(0),
    25 //bInitState(0),
    26 qNextPollTime(0),
    27 bPollEnable(false) {
    28  epInfo[0].epAddr = 0;
    29  epInfo[0].maxPktSize = 8;
    30  epInfo[0].bmSndToggle = 0;
    31  epInfo[0].bmRcvToggle = 0;
    32  epInfo[0].bmNakPower = USB_NAK_MAX_POWER;
    33 
    34  epInfo[1].epAddr = 1;
    35  epInfo[1].maxPktSize = 8; //kludge
    36  epInfo[1].bmSndToggle = 0;
    37  epInfo[1].bmRcvToggle = 0;
    38  epInfo[1].bmNakPower = USB_NAK_NOWAIT;
    39 
    40  if(pUsb)
    41  pUsb->RegisterDeviceClass(this);
    42 }
    43 
    44 uint8_t USBHub::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    45  uint8_t buf[32];
    46  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    47  HubDescriptor* hd = reinterpret_cast<HubDescriptor*>(buf);
    48  USB_CONFIGURATION_DESCRIPTOR * ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR*>(buf);
    49  uint8_t rcode;
    50  UsbDevice *p = NULL;
    51  EpInfo *oldep_ptr = NULL;
    52  uint8_t len = 0;
    53  uint16_t cd_len = 0;
    54 
    55  //USBTRACE("\r\nHub Init Start ");
    56  //D_PrintHex<uint8_t > (bInitState, 0x80);
    57 
    58  AddressPool &addrPool = pUsb->GetAddressPool();
    59 
    60  //switch (bInitState) {
    61  // case 0:
    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)
    73 
    74  // Save old pointer to EP_RECORD of address 0
    75  oldep_ptr = p->epinfo;
    76 
    77  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    78  p->epinfo = epInfo;
    79 
    80  p->lowspeed = lowspeed;
    81 
    82  // Get device descriptor
    83  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    84 
    85  p->lowspeed = false;
    86 
    87  if(!rcode)
    88  len = (buf[0] > 32) ? 32 : buf[0];
    89 
    90  if(rcode) {
    91  // Restore p->epinfo
    92  p->epinfo = oldep_ptr;
    93  return rcode;
    94  }
    95 
    96  // Extract device class from device descriptor
    97  // If device class is not a hub return
    98  if(udd->bDeviceClass != 0x09)
    100 
    101  // Allocate new address according to device class
    102  bAddress = addrPool.AllocAddress(parent, (udd->bDeviceClass == 0x09) ? true : false, port);
    103 
    104  if(!bAddress)
    106 
    107  // Extract Max Packet Size from the device descriptor
    108  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    109 
    110  // Assign new address to the device
    111  rcode = pUsb->setAddr(0, 0, bAddress);
    112 
    113  if(rcode) {
    114  // Restore p->epinfo
    115  p->epinfo = oldep_ptr;
    116  addrPool.FreeAddress(bAddress);
    117  bAddress = 0;
    118  return rcode;
    119  }
    120 
    121  //USBTRACE2("\r\nHub address: ", bAddress );
    122 
    123  // Restore p->epinfo
    124  p->epinfo = oldep_ptr;
    125 
    126  if(len)
    127  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    128 
    129  if(rcode)
    130  goto FailGetDevDescr;
    131 
    132  // Assign epInfo to epinfo pointer
    133  rcode = pUsb->setEpInfoEntry(bAddress, 2, epInfo);
    134 
    135  if(rcode)
    136  goto FailSetDevTblEntry;
    137 
    138  // bInitState = 1;
    139 
    140  // case 1:
    141  // Get hub descriptor
    142  rcode = GetHubDescriptor(0, 8, buf);
    143 
    144  if(rcode)
    145  goto FailGetHubDescr;
    146 
    147  // Save number of ports for future use
    148  bNbrPorts = hd->bNbrPorts;
    149 
    150  // bInitState = 2;
    151 
    152  // case 2:
    153  // Read configuration Descriptor in Order To Obtain Proper Configuration Value
    154  rcode = pUsb->getConfDescr(bAddress, 0, 8, 0, buf);
    155 
    156  if(!rcode) {
    157  cd_len = ucd->wTotalLength;
    158  rcode = pUsb->getConfDescr(bAddress, 0, cd_len, 0, buf);
    159  }
    160  if(rcode)
    161  goto FailGetConfDescr;
    162 
    163  // The following code is of no practical use in real life applications.
    164  // It only intended for the usb protocol sniffer to properly parse hub-class requests.
    165  {
    166  uint8_t buf2[24];
    167 
    168  rcode = pUsb->getConfDescr(bAddress, 0, buf[0], 0, buf2);
    169 
    170  if(rcode)
    171  goto FailGetConfDescr;
    172  }
    173 
    174  // Set Configuration Value
    175  rcode = pUsb->setConf(bAddress, 0, buf[5]);
    176 
    177  if(rcode)
    178  goto FailSetConfDescr;
    179 
    180  // bInitState = 3;
    181 
    182  // case 3:
    183  // Power on all ports
    184  for(uint8_t j = 1; j <= bNbrPorts; j++)
    185  SetPortFeature(HUB_FEATURE_PORT_POWER, j, 0); //HubPortPowerOn(j);
    186 
    187  pUsb->SetHubPreMask();
    188  bPollEnable = true;
    189  // bInitState = 0;
    190  //}
    191  //bInitState = 0;
    192  //USBTRACE("...OK\r\n");
    193  return 0;
    194 
    195  // Oleg, No debugging?? -- xxxajk
    196 FailGetDevDescr:
    197  goto Fail;
    198 
    199 FailSetDevTblEntry:
    200  goto Fail;
    201 
    202 FailGetHubDescr:
    203  goto Fail;
    204 
    205 FailGetConfDescr:
    206  goto Fail;
    207 
    208 FailSetConfDescr:
    209  goto Fail;
    210 
    211 Fail:
    212  USBTRACE("...FAIL\r\n");
    213  return rcode;
    214 }
    215 
    216 uint8_t USBHub::Release() {
    217  pUsb->GetAddressPool().FreeAddress(bAddress);
    218 
    219  if(bAddress == 0x41)
    220  pUsb->SetHubPreMask();
    221 
    222  bAddress = 0;
    223  bNbrPorts = 0;
    224  qNextPollTime = 0;
    225  bPollEnable = false;
    226  return 0;
    227 }
    228 
    229 uint8_t USBHub::Poll() {
    230  uint8_t rcode = 0;
    231 
    232  if(!bPollEnable)
    233  return 0;
    234 
    235  if(((long)(millis() - qNextPollTime) >= 0L)) {
    236  rcode = CheckHubStatus();
    237  qNextPollTime = millis() + 100;
    238  }
    239  return rcode;
    240 }
    241 
    242 uint8_t USBHub::CheckHubStatus() {
    243  uint8_t rcode;
    244  uint8_t buf[8];
    245  uint16_t read = 1;
    246 
    247  rcode = pUsb->inTransfer(bAddress, 1, &read, buf);
    248 
    249  if(rcode)
    250  return rcode;
    251 
    252  //if (buf[0] & 0x01) // Hub Status Change
    253  //{
    254  // pUsb->PrintHubStatus(addr);
    255  // rcode = GetHubStatus(1, 0, 1, 4, buf);
    256  // if (rcode)
    257  // {
    258  // USB_HOST_SERIAL.print("GetHubStatus Error");
    259  // USB_HOST_SERIAL.println(rcode, HEX);
    260  // return rcode;
    261  // }
    262  //}
    263  for(uint8_t port = 1, mask = 0x02; port < 8; mask <<= 1, port++) {
    264  if(buf[0] & mask) {
    265  HubEvent evt;
    266  evt.bmEvent = 0;
    267 
    268  rcode = GetPortStatus(port, 4, evt.evtBuff);
    269 
    270  if(rcode)
    271  continue;
    272 
    273  rcode = PortStatusChange(port, evt);
    274 
    275  if(rcode == HUB_ERROR_PORT_HAS_BEEN_RESET)
    276  return 0;
    277 
    278  if(rcode)
    279  return rcode;
    280  }
    281  } // for
    282 
    283  for(uint8_t port = 1; port <= bNbrPorts; port++) {
    284  HubEvent evt;
    285  evt.bmEvent = 0;
    286 
    287  rcode = GetPortStatus(port, 4, evt.evtBuff);
    288 
    289  if(rcode)
    290  continue;
    291 
    293  continue;
    294 
    295  // Emulate connection event for the port
    297 
    298  rcode = PortStatusChange(port, evt);
    299 
    300  if(rcode == HUB_ERROR_PORT_HAS_BEEN_RESET)
    301  return 0;
    302 
    303  if(rcode)
    304  return rcode;
    305  } // for
    306  return 0;
    307 }
    308 
    309 void USBHub::ResetHubPort(uint8_t port) {
    310  HubEvent evt;
    311  evt.bmEvent = 0;
    312  uint8_t rcode;
    313 
    317 
    318 
    319  for(int i = 0; i < 3; i++) {
    320  rcode = GetPortStatus(port, 4, evt.evtBuff);
    321  if(rcode) break; // Some kind of error, bail.
    323  break;
    324  }
    325  delay(100); // simulate polling.
    326  }
    329  delay(20);
    330 }
    331 
    332 uint8_t USBHub::PortStatusChange(uint8_t port, HubEvent &evt) {
    333  switch(evt.bmEvent) {
    334  // Device connected event
    337  if(bResetInitiated)
    338  return 0;
    339 
    343  bResetInitiated = true;
    345 
    346  // Device disconnected event
    350  bResetInitiated = false;
    351 
    353  a.devAddress = 0;
    354  a.bmHub = 0;
    355  a.bmParent = bAddress;
    356  a.bmAddress = port;
    357  pUsb->ReleaseDevice(a.devAddress);
    358  return 0;
    359 
    360  // Reset complete event
    365 
    366  delay(20);
    367 
    368  a.devAddress = bAddress;
    369 
    371  bResetInitiated = false;
    372  break;
    373 
    374  } // switch (evt.bmEvent)
    375  return 0;
    376 }
    377 
    378 void PrintHubPortStatus(USBHub *hubptr, uint8_t addr, uint8_t port, bool print_changes) {
    379  uint8_t rcode = 0;
    380  HubEvent evt;
    381 
    382  rcode = hubptr->GetPortStatus(port, 4, evt.evtBuff);
    383 
    384  if(rcode) {
    385  USB_HOST_SERIAL.println("ERROR!");
    386  return;
    387  }
    388  USB_HOST_SERIAL.print("\r\nPort ");
    389  USB_HOST_SERIAL.println(port, DEC);
    390 
    391  USB_HOST_SERIAL.println("Status");
    392  USB_HOST_SERIAL.print("CONNECTION:\t");
    394  USB_HOST_SERIAL.print("ENABLE:\t\t");
    395  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_ENABLE) > 0, DEC);
    396  USB_HOST_SERIAL.print("SUSPEND:\t");
    397  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_SUSPEND) > 0, DEC);
    398  USB_HOST_SERIAL.print("OVER_CURRENT:\t");
    400  USB_HOST_SERIAL.print("RESET:\t\t");
    401  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_RESET) > 0, DEC);
    402  USB_HOST_SERIAL.print("POWER:\t\t");
    403  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_POWER) > 0, DEC);
    404  USB_HOST_SERIAL.print("LOW_SPEED:\t");
    406  USB_HOST_SERIAL.print("HIGH_SPEED:\t");
    408  USB_HOST_SERIAL.print("TEST:\t\t");
    409  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_TEST) > 0, DEC);
    410  USB_HOST_SERIAL.print("INDICATOR:\t");
    412 
    413  if(!print_changes)
    414  return;
    415 
    416  USB_HOST_SERIAL.println("\r\nChange");
    417  USB_HOST_SERIAL.print("CONNECTION:\t");
    419  USB_HOST_SERIAL.print("ENABLE:\t\t");
    420  USB_HOST_SERIAL.println((evt.bmChange & bmHUB_PORT_STATUS_C_PORT_ENABLE) > 0, DEC);
    421  USB_HOST_SERIAL.print("SUSPEND:\t");
    423  USB_HOST_SERIAL.print("OVER_CURRENT:\t");
    425  USB_HOST_SERIAL.print("RESET:\t\t");
    426  USB_HOST_SERIAL.println((evt.bmChange & bmHUB_PORT_STATUS_C_PORT_RESET) > 0, DEC);
    427 }
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:771
    -
    uint8_t bmRcvToggle
    Definition: address.h:41
    +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 "usbhub.h"
    18 
    19 bool USBHub::bResetInitiated = false;
    20 
    22 pUsb(p),
    23 bAddress(0),
    24 bNbrPorts(0),
    25 //bInitState(0),
    26 qNextPollTime(0),
    27 bPollEnable(false) {
    28  epInfo[0].epAddr = 0;
    29  epInfo[0].maxPktSize = 8;
    30  epInfo[0].bmSndToggle = 0;
    31  epInfo[0].bmRcvToggle = 0;
    32  epInfo[0].bmNakPower = USB_NAK_MAX_POWER;
    33 
    34  epInfo[1].epAddr = 1;
    35  epInfo[1].maxPktSize = 8; //kludge
    36  epInfo[1].bmSndToggle = 0;
    37  epInfo[1].bmRcvToggle = 0;
    38  epInfo[1].bmNakPower = USB_NAK_NOWAIT;
    39 
    40  if(pUsb)
    41  pUsb->RegisterDeviceClass(this);
    42 }
    43 
    44 uint8_t USBHub::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    45  uint8_t buf[32];
    46  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    47  HubDescriptor* hd = reinterpret_cast<HubDescriptor*>(buf);
    48  USB_CONFIGURATION_DESCRIPTOR * ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR*>(buf);
    49  uint8_t rcode;
    50  UsbDevice *p = NULL;
    51  EpInfo *oldep_ptr = NULL;
    52  uint8_t len = 0;
    53  uint16_t cd_len = 0;
    54 
    55  //USBTRACE("\r\nHub Init Start ");
    56  //D_PrintHex<uint8_t > (bInitState, 0x80);
    57 
    58  AddressPool &addrPool = pUsb->GetAddressPool();
    59 
    60  //switch (bInitState) {
    61  // case 0:
    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)
    73 
    74  // Save old pointer to EP_RECORD of address 0
    75  oldep_ptr = p->epinfo;
    76 
    77  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    78  p->epinfo = epInfo;
    79 
    80  p->lowspeed = lowspeed;
    81 
    82  // Get device descriptor
    83  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    84 
    85  p->lowspeed = false;
    86 
    87  if(!rcode)
    88  len = (buf[0] > 32) ? 32 : buf[0];
    89 
    90  if(rcode) {
    91  // Restore p->epinfo
    92  p->epinfo = oldep_ptr;
    93  return rcode;
    94  }
    95 
    96  // Extract device class from device descriptor
    97  // If device class is not a hub return
    98  if(udd->bDeviceClass != 0x09)
    100 
    101  // Allocate new address according to device class
    102  bAddress = addrPool.AllocAddress(parent, (udd->bDeviceClass == 0x09) ? true : false, port);
    103 
    104  if(!bAddress)
    106 
    107  // Extract Max Packet Size from the device descriptor
    108  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    109 
    110  // Assign new address to the device
    111  rcode = pUsb->setAddr(0, 0, bAddress);
    112 
    113  if(rcode) {
    114  // Restore p->epinfo
    115  p->epinfo = oldep_ptr;
    116  addrPool.FreeAddress(bAddress);
    117  bAddress = 0;
    118  return rcode;
    119  }
    120 
    121  //USBTRACE2("\r\nHub address: ", bAddress );
    122 
    123  // Restore p->epinfo
    124  p->epinfo = oldep_ptr;
    125 
    126  if(len)
    127  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    128 
    129  if(rcode)
    130  goto FailGetDevDescr;
    131 
    132  // Assign epInfo to epinfo pointer
    133  rcode = pUsb->setEpInfoEntry(bAddress, 2, epInfo);
    134 
    135  if(rcode)
    136  goto FailSetDevTblEntry;
    137 
    138  // bInitState = 1;
    139 
    140  // case 1:
    141  // Get hub descriptor
    142  rcode = GetHubDescriptor(0, 8, buf);
    143 
    144  if(rcode)
    145  goto FailGetHubDescr;
    146 
    147  // Save number of ports for future use
    148  bNbrPorts = hd->bNbrPorts;
    149 
    150  // bInitState = 2;
    151 
    152  // case 2:
    153  // Read configuration Descriptor in Order To Obtain Proper Configuration Value
    154  rcode = pUsb->getConfDescr(bAddress, 0, 8, 0, buf);
    155 
    156  if(!rcode) {
    157  cd_len = ucd->wTotalLength;
    158  rcode = pUsb->getConfDescr(bAddress, 0, cd_len, 0, buf);
    159  }
    160  if(rcode)
    161  goto FailGetConfDescr;
    162 
    163  // The following code is of no practical use in real life applications.
    164  // It only intended for the usb protocol sniffer to properly parse hub-class requests.
    165  {
    166  uint8_t buf2[24];
    167 
    168  rcode = pUsb->getConfDescr(bAddress, 0, buf[0], 0, buf2);
    169 
    170  if(rcode)
    171  goto FailGetConfDescr;
    172  }
    173 
    174  // Set Configuration Value
    175  rcode = pUsb->setConf(bAddress, 0, buf[5]);
    176 
    177  if(rcode)
    178  goto FailSetConfDescr;
    179 
    180  // bInitState = 3;
    181 
    182  // case 3:
    183  // Power on all ports
    184  for(uint8_t j = 1; j <= bNbrPorts; j++)
    185  SetPortFeature(HUB_FEATURE_PORT_POWER, j, 0); //HubPortPowerOn(j);
    186 
    187  pUsb->SetHubPreMask();
    188  bPollEnable = true;
    189  // bInitState = 0;
    190  //}
    191  //bInitState = 0;
    192  //USBTRACE("...OK\r\n");
    193  return 0;
    194 
    195  // Oleg, No debugging?? -- xxxajk
    196 FailGetDevDescr:
    197  goto Fail;
    198 
    199 FailSetDevTblEntry:
    200  goto Fail;
    201 
    202 FailGetHubDescr:
    203  goto Fail;
    204 
    205 FailGetConfDescr:
    206  goto Fail;
    207 
    208 FailSetConfDescr:
    209  goto Fail;
    210 
    211 Fail:
    212  USBTRACE("...FAIL\r\n");
    213  return rcode;
    214 }
    215 
    216 uint8_t USBHub::Release() {
    217  pUsb->GetAddressPool().FreeAddress(bAddress);
    218 
    219  if(bAddress == 0x41)
    220  pUsb->SetHubPreMask();
    221 
    222  bAddress = 0;
    223  bNbrPorts = 0;
    224  qNextPollTime = 0;
    225  bPollEnable = false;
    226  return 0;
    227 }
    228 
    229 uint8_t USBHub::Poll() {
    230  uint8_t rcode = 0;
    231 
    232  if(!bPollEnable)
    233  return 0;
    234 
    235  if(((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L)) {
    236  rcode = CheckHubStatus();
    237  qNextPollTime = (uint32_t)millis() + 100;
    238  }
    239  return rcode;
    240 }
    241 
    242 uint8_t USBHub::CheckHubStatus() {
    243  uint8_t rcode;
    244  uint8_t buf[8];
    245  uint16_t read = 1;
    246 
    247  rcode = pUsb->inTransfer(bAddress, 1, &read, buf);
    248 
    249  if(rcode)
    250  return rcode;
    251 
    252  //if (buf[0] & 0x01) // Hub Status Change
    253  //{
    254  // pUsb->PrintHubStatus(addr);
    255  // rcode = GetHubStatus(1, 0, 1, 4, buf);
    256  // if (rcode)
    257  // {
    258  // USB_HOST_SERIAL.print("GetHubStatus Error");
    259  // USB_HOST_SERIAL.println(rcode, HEX);
    260  // return rcode;
    261  // }
    262  //}
    263  for(uint8_t port = 1, mask = 0x02; port < 8; mask <<= 1, port++) {
    264  if(buf[0] & mask) {
    265  HubEvent evt;
    266  evt.bmEvent = 0;
    267 
    268  rcode = GetPortStatus(port, 4, evt.evtBuff);
    269 
    270  if(rcode)
    271  continue;
    272 
    273  rcode = PortStatusChange(port, evt);
    274 
    275  if(rcode == HUB_ERROR_PORT_HAS_BEEN_RESET)
    276  return 0;
    277 
    278  if(rcode)
    279  return rcode;
    280  }
    281  } // for
    282 
    283  for(uint8_t port = 1; port <= bNbrPorts; port++) {
    284  HubEvent evt;
    285  evt.bmEvent = 0;
    286 
    287  rcode = GetPortStatus(port, 4, evt.evtBuff);
    288 
    289  if(rcode)
    290  continue;
    291 
    293  continue;
    294 
    295  // Emulate connection event for the port
    297 
    298  rcode = PortStatusChange(port, evt);
    299 
    300  if(rcode == HUB_ERROR_PORT_HAS_BEEN_RESET)
    301  return 0;
    302 
    303  if(rcode)
    304  return rcode;
    305  } // for
    306  return 0;
    307 }
    308 
    309 void USBHub::ResetHubPort(uint8_t port) {
    310  HubEvent evt;
    311  evt.bmEvent = 0;
    312  uint8_t rcode;
    313 
    317 
    318 
    319  for(int i = 0; i < 3; i++) {
    320  rcode = GetPortStatus(port, 4, evt.evtBuff);
    321  if(rcode) break; // Some kind of error, bail.
    323  break;
    324  }
    325  delay(100); // simulate polling.
    326  }
    329  delay(20);
    330 }
    331 
    332 uint8_t USBHub::PortStatusChange(uint8_t port, HubEvent &evt) {
    333  switch(evt.bmEvent) {
    334  // Device connected event
    337  if(bResetInitiated)
    338  return 0;
    339 
    343  bResetInitiated = true;
    345 
    346  // Device disconnected event
    350  bResetInitiated = false;
    351 
    353  a.devAddress = 0;
    354  a.bmHub = 0;
    355  a.bmParent = bAddress;
    356  a.bmAddress = port;
    357  pUsb->ReleaseDevice(a.devAddress);
    358  return 0;
    359 
    360  // Reset complete event
    365 
    366  delay(20);
    367 
    368  a.devAddress = bAddress;
    369 
    371  bResetInitiated = false;
    372  break;
    373 
    374  } // switch (evt.bmEvent)
    375  return 0;
    376 }
    377 
    378 void PrintHubPortStatus(USBHub *hubptr, uint8_t addr __attribute__((unused)), uint8_t port, bool print_changes) {
    379  uint8_t rcode = 0;
    380  HubEvent evt;
    381 
    382  rcode = hubptr->GetPortStatus(port, 4, evt.evtBuff);
    383 
    384  if(rcode) {
    385  USB_HOST_SERIAL.println("ERROR!");
    386  return;
    387  }
    388  USB_HOST_SERIAL.print("\r\nPort ");
    389  USB_HOST_SERIAL.println(port, DEC);
    390 
    391  USB_HOST_SERIAL.println("Status");
    392  USB_HOST_SERIAL.print("CONNECTION:\t");
    394  USB_HOST_SERIAL.print("ENABLE:\t\t");
    395  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_ENABLE) > 0, DEC);
    396  USB_HOST_SERIAL.print("SUSPEND:\t");
    397  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_SUSPEND) > 0, DEC);
    398  USB_HOST_SERIAL.print("OVER_CURRENT:\t");
    400  USB_HOST_SERIAL.print("RESET:\t\t");
    401  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_RESET) > 0, DEC);
    402  USB_HOST_SERIAL.print("POWER:\t\t");
    403  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_POWER) > 0, DEC);
    404  USB_HOST_SERIAL.print("LOW_SPEED:\t");
    406  USB_HOST_SERIAL.print("HIGH_SPEED:\t");
    408  USB_HOST_SERIAL.print("TEST:\t\t");
    409  USB_HOST_SERIAL.println((evt.bmStatus & bmHUB_PORT_STATUS_PORT_TEST) > 0, DEC);
    410  USB_HOST_SERIAL.print("INDICATOR:\t");
    412 
    413  if(!print_changes)
    414  return;
    415 
    416  USB_HOST_SERIAL.println("\r\nChange");
    417  USB_HOST_SERIAL.print("CONNECTION:\t");
    419  USB_HOST_SERIAL.print("ENABLE:\t\t");
    420  USB_HOST_SERIAL.println((evt.bmChange & bmHUB_PORT_STATUS_C_PORT_ENABLE) > 0, DEC);
    421  USB_HOST_SERIAL.print("SUSPEND:\t");
    423  USB_HOST_SERIAL.print("OVER_CURRENT:\t");
    425  USB_HOST_SERIAL.print("RESET:\t\t");
    426  USB_HOST_SERIAL.println((evt.bmChange & bmHUB_PORT_STATUS_C_PORT_RESET) > 0, DEC);
    427 }
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:784
    +
    uint8_t bmRcvToggle
    Definition: address.h:48
    #define bmHUB_PORT_STATE_CHECK_DISABLED
    Definition: usbhub.h:119
    - +
    #define bmHUB_PORT_EVENT_LS_RESET_COMPLETE
    Definition: usbhub.h:130
    #define bmHUB_PORT_STATUS_PORT_CONNECTION
    Definition: usbhub.h:76
    #define bmHUB_PORT_STATUS_C_PORT_SUSPEND
    Definition: usbhub.h:90
    -
    EpInfo * epinfo
    Definition: address.h:76
    -
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    -
    uint8_t bmNakPower
    Definition: address.h:42
    +
    EpInfo * epinfo
    Definition: address.h:83
    +
    bool lowspeed
    Definition: address.h:86
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:94
    +
    uint8_t bmNakPower
    Definition: address.h:49
    uint16_t bmChange
    Definition: usbhub.h:157
    - - + +
    #define HUB_ERROR_PORT_HAS_BEEN_RESET
    Definition: usbhub.h:113
    #define HUB_FEATURE_PORT_POWER
    Definition: usbhub.h:52
    -
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:105
    +
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:112
    #define bmHUB_PORT_STATUS_PORT_LOW_SPEED
    Definition: usbhub.h:82
    #define bmHUB_PORT_STATUS_PORT_SUSPEND
    Definition: usbhub.h:78
    #define HUB_FEATURE_C_PORT_RESET
    Definition: usbhub.h:58
    #define bmHUB_PORT_STATUS_PORT_OVER_CURRENT
    Definition: usbhub.h:79
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:810
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:823
    void ResetHubPort(uint8_t port)
    Definition: usbhub.cpp:309
    -
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    +
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:71
    virtual void FreeAddress(uint8_t addr)=0
    #define bmHUB_PORT_STATUS_C_PORT_ENABLE
    Definition: usbhub.h:89
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
    uint8_t bNbrPorts
    Definition: usbhub.h:136
    -
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:801
    -
    #define USB_HOST_SERIAL
    Definition: settings.h:34
    - -
    uint8_t epAddr
    Definition: address.h:33
    -
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:814
    +
    #define USB_HOST_SERIAL
    Definition: settings.h:49
    + +
    uint8_t epAddr
    Definition: address.h:40
    +
    #define USB_NAK_MAX_POWER
    Definition: address.h:34
    #define bmHUB_PORT_STATE_DISABLED
    Definition: usbhub.h:122
    -
    void SetHubPreMask()
    Definition: UsbCore.h:205
    +
    void SetHubPreMask()
    Definition: UsbCore.h:216
    uint8_t GetHubDescriptor(uint8_t index, uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhub.h:221
    #define bmHUB_PORT_STATUS_PORT_POWER
    Definition: usbhub.h:81
    -
    Definition: address.h:32
    +
    Definition: address.h:39
    #define bmHUB_PORT_STATUS_PORT_HIGH_SPEED
    Definition: usbhub.h:83
    uint8_t ClearPortFeature(uint8_t fid, uint8_t port, uint8_t sel=0)
    Definition: usbhub.h:216
    #define bmHUB_PORT_STATUS_C_PORT_OVER_CURRENT
    Definition: usbhub.h:91
    uint32_t bmEvent
    Definition: usbhub.h:159
    - +
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    -
    uint8_t bmSndToggle
    Definition: address.h:40
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    +
    uint8_t bmSndToggle
    Definition: address.h:47
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:96
    #define bmHUB_PORT_STATUS_C_PORT_RESET
    Definition: usbhub.h:92
    -
    uint8_t bDeviceClass
    Definition: usb_ch9.h:102
    +
    uint8_t bDeviceClass
    Definition: usb_ch9.h:109
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbhub.cpp:44
    Definition: usbhub.h:164
    uint16_t bmStatus
    Definition: usbhub.h:156
    #define HUB_FEATURE_C_PORT_CONNECTION
    Definition: usbhub.h:54
    void PrintHubPortStatus(USBHub *hubptr, uint8_t addr, uint8_t port, bool print_changes)
    Definition: usbhub.cpp:378
    -
    uint8_t devAddress
    Definition: address.h:67
    -
    uint8_t bmAddress
    Definition: address.h:62
    -
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    +
    uint8_t devAddress
    Definition: address.h:74
    +
    uint8_t bmAddress
    Definition: address.h:69
    +
    #define USB_NAK_NOWAIT
    Definition: address.h:36
    #define bmHUB_PORT_STATUS_PORT_RESET
    Definition: usbhub.h:80
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    -
    uint8_t bmParent
    Definition: address.h:63
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:93
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:88
    +
    uint8_t bmParent
    Definition: address.h:70
    uint8_t GetPortStatus(uint8_t port, uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhub.h:231
    #define bmHUB_PORT_EVENT_CONNECT
    Definition: usbhub.h:125
    -
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:206
    +
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval=0)
    Definition: Usb.cpp:213
    uint8_t Release()
    Definition: usbhub.cpp:216
    #define HUB_FEATURE_PORT_RESET
    Definition: usbhub.h:51
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:91
    #define bmHUB_PORT_STATUS_PORT_ENABLE
    Definition: usbhub.h:77
    -
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    -
    uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: Usb.cpp:653
    -
    Definition: UsbCore.h:197
    +
    uint8_t maxPktSize
    Definition: address.h:41
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:224
    +
    uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: Usb.cpp:666
    +
    Definition: UsbCore.h:208
    uint8_t evtBuff[4]
    Definition: usbhub.h:160
    #define bmHUB_PORT_STATUS_PORT_INDICATOR
    Definition: usbhub.h:85
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    - +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:228
    +
    #define bmHUB_PORT_STATUS_PORT_TEST
    Definition: usbhub.h:84
    #define bmHUB_PORT_EVENT_LS_CONNECT
    Definition: usbhub.h:129
    #define bmHUB_PORT_STATUS_C_PORT_CONNECTION
    Definition: usbhub.h:88
    #define bmHUB_PORT_EVENT_RESET_COMPLETE
    Definition: usbhub.h:127
    uint8_t SetPortFeature(uint8_t fid, uint8_t port, uint8_t sel=0)
    Definition: usbhub.h:246
    #define HUB_FEATURE_C_PORT_ENABLE
    Definition: usbhub.h:55
    -
    #define USBTRACE(s)
    Definition: macros.h:75
    -
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:766
    -
    uint8_t bmHub
    Definition: address.h:64
    +
    #define USBTRACE(s)
    Definition: macros.h:82
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:779
    +
    uint8_t bmHub
    Definition: address.h:71
    uint8_t Poll()
    Definition: usbhub.cpp:229
    USBHub(USB *p)
    Definition: usbhub.cpp:21
    -
    uint8_t ReleaseDevice(uint8_t addr)
    Definition: Usb.cpp:751
    +
    uint8_t ReleaseDevice(uint8_t addr)
    Definition: Usb.cpp:764
    #define bmHUB_PORT_EVENT_DISCONNECT
    Definition: usbhub.h:126
    - +
    diff --git a/usbhub_8h.html b/usbhub_8h.html index 1dd534f3..7a4f1d46 100644 --- a/usbhub_8h.html +++ b/usbhub_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhub.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
     

    Macro Definition Documentation

    - + +

    ◆ USB_DESCRIPTOR_HUB

    +
    @@ -298,11 +280,13 @@ Functions
    -

    Definition at line 22 of file usbhub.h.

    +

    Definition at line 22 of file usbhub.h.

    - + +

    ◆ bmREQ_CLEAR_HUB_FEATURE

    +
    @@ -312,11 +296,13 @@ Functions
    -

    Definition at line 25 of file usbhub.h.

    +

    Definition at line 25 of file usbhub.h.

    - + +

    ◆ bmREQ_CLEAR_PORT_FEATURE

    +
    @@ -326,11 +312,13 @@ Functions
    -

    Definition at line 26 of file usbhub.h.

    +

    Definition at line 26 of file usbhub.h.

    - + +

    ◆ bmREQ_CLEAR_TT_BUFFER

    +
    @@ -340,11 +328,13 @@ Functions
    -

    Definition at line 27 of file usbhub.h.

    +

    Definition at line 27 of file usbhub.h.

    - + +

    ◆ bmREQ_GET_HUB_DESCRIPTOR

    +
    @@ -354,11 +344,13 @@ Functions
    -

    Definition at line 28 of file usbhub.h.

    +

    Definition at line 28 of file usbhub.h.

    - + +

    ◆ bmREQ_GET_HUB_STATUS

    +
    @@ -368,11 +360,13 @@ Functions
    -

    Definition at line 29 of file usbhub.h.

    +

    Definition at line 29 of file usbhub.h.

    - + +

    ◆ bmREQ_GET_PORT_STATUS

    +
    @@ -382,11 +376,13 @@ Functions
    -

    Definition at line 30 of file usbhub.h.

    +

    Definition at line 30 of file usbhub.h.

    - + +

    ◆ bmREQ_RESET_TT

    +
    @@ -396,11 +392,13 @@ Functions
    -

    Definition at line 31 of file usbhub.h.

    +

    Definition at line 31 of file usbhub.h.

    - + +

    ◆ bmREQ_SET_HUB_DESCRIPTOR

    +
    @@ -410,11 +408,13 @@ Functions
    -

    Definition at line 32 of file usbhub.h.

    +

    Definition at line 32 of file usbhub.h.

    - + +

    ◆ bmREQ_SET_HUB_FEATURE

    +
    @@ -424,11 +424,13 @@ Functions
    -

    Definition at line 33 of file usbhub.h.

    +

    Definition at line 33 of file usbhub.h.

    - + +

    ◆ bmREQ_SET_PORT_FEATURE

    +
    @@ -438,11 +440,13 @@ Functions
    -

    Definition at line 34 of file usbhub.h.

    +

    Definition at line 34 of file usbhub.h.

    - + +

    ◆ bmREQ_GET_TT_STATE

    +
    @@ -452,11 +456,13 @@ Functions
    -

    Definition at line 35 of file usbhub.h.

    +

    Definition at line 35 of file usbhub.h.

    - + +

    ◆ bmREQ_STOP_TT

    +
    @@ -466,11 +472,13 @@ Functions
    -

    Definition at line 36 of file usbhub.h.

    +

    Definition at line 36 of file usbhub.h.

    - + +

    ◆ HUB_REQUEST_CLEAR_TT_BUFFER

    +
    @@ -480,11 +488,13 @@ Functions
    -

    Definition at line 39 of file usbhub.h.

    +

    Definition at line 39 of file usbhub.h.

    - + +

    ◆ HUB_REQUEST_RESET_TT

    +
    @@ -494,11 +504,13 @@ Functions
    -

    Definition at line 40 of file usbhub.h.

    +

    Definition at line 40 of file usbhub.h.

    - + +

    ◆ HUB_REQUEST_GET_TT_STATE

    +
    @@ -508,11 +520,13 @@ Functions
    -

    Definition at line 41 of file usbhub.h.

    +

    Definition at line 41 of file usbhub.h.

    - + +

    ◆ HUB_REQUEST_STOP_TT

    +
    @@ -522,11 +536,13 @@ Functions
    -

    Definition at line 42 of file usbhub.h.

    +

    Definition at line 42 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_C_HUB_LOCAL_POWER

    +
    @@ -536,11 +552,13 @@ Functions
    -

    Definition at line 45 of file usbhub.h.

    +

    Definition at line 45 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_C_HUB_OVER_CURRENT

    +
    @@ -550,11 +568,13 @@ Functions
    -

    Definition at line 46 of file usbhub.h.

    +

    Definition at line 46 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_CONNECTION

    +
    @@ -564,11 +584,13 @@ Functions
    -

    Definition at line 47 of file usbhub.h.

    +

    Definition at line 47 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_ENABLE

    +
    @@ -578,11 +600,13 @@ Functions
    -

    Definition at line 48 of file usbhub.h.

    +

    Definition at line 48 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_SUSPEND

    +
    @@ -592,11 +616,13 @@ Functions
    -

    Definition at line 49 of file usbhub.h.

    +

    Definition at line 49 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_OVER_CURRENT

    +
    @@ -606,11 +632,13 @@ Functions
    -

    Definition at line 50 of file usbhub.h.

    +

    Definition at line 50 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_RESET

    +
    @@ -620,11 +648,13 @@ Functions
    -

    Definition at line 51 of file usbhub.h.

    +

    Definition at line 51 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_POWER

    +
    @@ -634,11 +664,13 @@ Functions
    -

    Definition at line 52 of file usbhub.h.

    +

    Definition at line 52 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_LOW_SPEED

    +
    @@ -648,11 +680,13 @@ Functions
    -

    Definition at line 53 of file usbhub.h.

    +

    Definition at line 53 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_C_PORT_CONNECTION

    +
    @@ -662,11 +696,13 @@ Functions
    -

    Definition at line 54 of file usbhub.h.

    +

    Definition at line 54 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_C_PORT_ENABLE

    +
    @@ -676,11 +712,13 @@ Functions
    -

    Definition at line 55 of file usbhub.h.

    +

    Definition at line 55 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_C_PORT_SUSPEND

    +
    @@ -690,11 +728,13 @@ Functions
    -

    Definition at line 56 of file usbhub.h.

    +

    Definition at line 56 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_C_PORT_OVER_CURRENT

    +
    @@ -704,11 +744,13 @@ Functions
    -

    Definition at line 57 of file usbhub.h.

    +

    Definition at line 57 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_C_PORT_RESET

    +
    @@ -718,11 +760,13 @@ Functions
    -

    Definition at line 58 of file usbhub.h.

    +

    Definition at line 58 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_TEST

    +
    @@ -732,11 +776,13 @@ Functions
    -

    Definition at line 59 of file usbhub.h.

    +

    Definition at line 59 of file usbhub.h.

    - + +

    ◆ HUB_FEATURE_PORT_INDICATOR

    +
    @@ -746,11 +792,13 @@ Functions
    -

    Definition at line 60 of file usbhub.h.

    +

    Definition at line 60 of file usbhub.h.

    - + +

    ◆ HUB_PORT_TEST_MODE_J

    +
    @@ -760,11 +808,13 @@ Functions
    -

    Definition at line 63 of file usbhub.h.

    +

    Definition at line 63 of file usbhub.h.

    - + +

    ◆ HUB_PORT_TEST_MODE_K

    +
    @@ -774,11 +824,13 @@ Functions
    -

    Definition at line 64 of file usbhub.h.

    +

    Definition at line 64 of file usbhub.h.

    - + +

    ◆ HUB_PORT_TEST_MODE_SE0_NAK

    +
    @@ -788,11 +840,13 @@ Functions
    -

    Definition at line 65 of file usbhub.h.

    +

    Definition at line 65 of file usbhub.h.

    - + +

    ◆ HUB_PORT_TEST_MODE_PACKET

    +
    @@ -802,11 +856,13 @@ Functions
    -

    Definition at line 66 of file usbhub.h.

    +

    Definition at line 66 of file usbhub.h.

    - + +

    ◆ HUB_PORT_TEST_MODE_FORCE_ENABLE

    +
    @@ -816,11 +872,13 @@ Functions
    -

    Definition at line 67 of file usbhub.h.

    +

    Definition at line 67 of file usbhub.h.

    - + +

    ◆ HUB_PORT_INDICATOR_AUTO

    +
    @@ -830,11 +888,13 @@ Functions
    -

    Definition at line 70 of file usbhub.h.

    +

    Definition at line 70 of file usbhub.h.

    - + +

    ◆ HUB_PORT_INDICATOR_AMBER

    +
    @@ -844,11 +904,13 @@ Functions
    -

    Definition at line 71 of file usbhub.h.

    +

    Definition at line 71 of file usbhub.h.

    - + +

    ◆ HUB_PORT_INDICATOR_GREEN

    +
    @@ -858,11 +920,13 @@ Functions
    -

    Definition at line 72 of file usbhub.h.

    +

    Definition at line 72 of file usbhub.h.

    - + +

    ◆ HUB_PORT_INDICATOR_OFF

    +
    @@ -872,11 +936,13 @@ Functions
    -

    Definition at line 73 of file usbhub.h.

    +

    Definition at line 73 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_CONNECTION

    +
    @@ -886,11 +952,13 @@ Functions
    -

    Definition at line 76 of file usbhub.h.

    +

    Definition at line 76 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_ENABLE

    +
    @@ -900,11 +968,13 @@ Functions
    -

    Definition at line 77 of file usbhub.h.

    +

    Definition at line 77 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_SUSPEND

    +
    @@ -914,11 +984,13 @@ Functions
    -

    Definition at line 78 of file usbhub.h.

    +

    Definition at line 78 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_OVER_CURRENT

    +
    @@ -928,11 +1000,13 @@ Functions
    -

    Definition at line 79 of file usbhub.h.

    +

    Definition at line 79 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_RESET

    +
    @@ -942,11 +1016,13 @@ Functions
    -

    Definition at line 80 of file usbhub.h.

    +

    Definition at line 80 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_POWER

    +
    @@ -956,11 +1032,13 @@ Functions
    -

    Definition at line 81 of file usbhub.h.

    +

    Definition at line 81 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_LOW_SPEED

    +
    @@ -970,11 +1048,13 @@ Functions
    -

    Definition at line 82 of file usbhub.h.

    +

    Definition at line 82 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_HIGH_SPEED

    +
    @@ -984,11 +1064,13 @@ Functions
    -

    Definition at line 83 of file usbhub.h.

    +

    Definition at line 83 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_TEST

    +
    @@ -998,11 +1080,13 @@ Functions
    -

    Definition at line 84 of file usbhub.h.

    +

    Definition at line 84 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_PORT_INDICATOR

    +
    @@ -1012,11 +1096,13 @@ Functions
    -

    Definition at line 85 of file usbhub.h.

    +

    Definition at line 85 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_C_PORT_CONNECTION

    +
    @@ -1026,11 +1112,13 @@ Functions
    -

    Definition at line 88 of file usbhub.h.

    +

    Definition at line 88 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_C_PORT_ENABLE

    +
    @@ -1040,11 +1128,13 @@ Functions
    -

    Definition at line 89 of file usbhub.h.

    +

    Definition at line 89 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_C_PORT_SUSPEND

    +
    @@ -1054,11 +1144,13 @@ Functions
    -

    Definition at line 90 of file usbhub.h.

    +

    Definition at line 90 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_C_PORT_OVER_CURRENT

    +
    @@ -1068,11 +1160,13 @@ Functions
    -

    Definition at line 91 of file usbhub.h.

    +

    Definition at line 91 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_C_PORT_RESET

    +
    @@ -1082,11 +1176,13 @@ Functions
    -

    Definition at line 92 of file usbhub.h.

    +

    Definition at line 92 of file usbhub.h.

    - + +

    ◆ bmHUB_STATUS_LOCAL_POWER_SOURCE

    +
    @@ -1096,11 +1192,13 @@ Functions
    -

    Definition at line 95 of file usbhub.h.

    +

    Definition at line 95 of file usbhub.h.

    - + +

    ◆ bmHUB_STATUS_OVER_CURRENT

    +
    @@ -1110,11 +1208,13 @@ Functions
    -

    Definition at line 96 of file usbhub.h.

    +

    Definition at line 96 of file usbhub.h.

    - + +

    ◆ bmHUB_STATUS_C_LOCAL_POWER_SOURCE

    +
    @@ -1124,11 +1224,13 @@ Functions
    -

    Definition at line 99 of file usbhub.h.

    +

    Definition at line 99 of file usbhub.h.

    - + +

    ◆ bmHUB_STATUS_C_OVER_CURRENT

    +
    @@ -1138,11 +1240,13 @@ Functions
    -

    Definition at line 100 of file usbhub.h.

    +

    Definition at line 100 of file usbhub.h.

    - + +

    ◆ USB_STATE_HUB_PORT_CONFIGURING

    +
    @@ -1152,11 +1256,13 @@ Functions
    -

    Definition at line 104 of file usbhub.h.

    +

    Definition at line 104 of file usbhub.h.

    - + +

    ◆ USB_STATE_HUB_PORT_POWERED_OFF

    +
    @@ -1166,11 +1272,13 @@ Functions
    -

    Definition at line 105 of file usbhub.h.

    +

    Definition at line 105 of file usbhub.h.

    - + +

    ◆ USB_STATE_HUB_PORT_WAIT_FOR_POWER_GOOD

    +
    @@ -1180,11 +1288,13 @@ Functions
    -

    Definition at line 106 of file usbhub.h.

    +

    Definition at line 106 of file usbhub.h.

    - + +

    ◆ USB_STATE_HUB_PORT_DISCONNECTED

    +
    @@ -1194,11 +1304,13 @@ Functions
    -

    Definition at line 107 of file usbhub.h.

    +

    Definition at line 107 of file usbhub.h.

    - + +

    ◆ USB_STATE_HUB_PORT_DISABLED

    +
    @@ -1208,11 +1320,13 @@ Functions
    -

    Definition at line 108 of file usbhub.h.

    +

    Definition at line 108 of file usbhub.h.

    - + +

    ◆ USB_STATE_HUB_PORT_RESETTING

    +
    @@ -1222,11 +1336,13 @@ Functions
    -

    Definition at line 109 of file usbhub.h.

    +

    Definition at line 109 of file usbhub.h.

    - + +

    ◆ USB_STATE_HUB_PORT_ENABLED

    +
    @@ -1236,11 +1352,13 @@ Functions
    -

    Definition at line 110 of file usbhub.h.

    +

    Definition at line 110 of file usbhub.h.

    - + +

    ◆ HUB_ERROR_PORT_HAS_BEEN_RESET

    +
    @@ -1250,11 +1368,13 @@ Functions
    -

    Definition at line 113 of file usbhub.h.

    +

    Definition at line 113 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATUS_ALL_MAIN

    +
    @@ -1264,11 +1384,13 @@ Functions
    -

    Definition at line 116 of file usbhub.h.

    +

    Definition at line 116 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATE_CHECK_DISABLED

    +
    @@ -1278,11 +1400,13 @@ Functions
    -

    Definition at line 119 of file usbhub.h.

    +

    Definition at line 119 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_STATE_DISABLED

    +
    @@ -1292,11 +1416,13 @@ Functions
    -

    Definition at line 122 of file usbhub.h.

    +

    Definition at line 122 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_EVENT_CONNECT

    +
    @@ -1306,11 +1432,13 @@ Functions
    -

    Definition at line 125 of file usbhub.h.

    +

    Definition at line 125 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_EVENT_DISCONNECT

    +
    @@ -1320,11 +1448,13 @@ Functions
    -

    Definition at line 126 of file usbhub.h.

    +

    Definition at line 126 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_EVENT_RESET_COMPLETE

    +
    @@ -1334,11 +1464,13 @@ Functions
    -

    Definition at line 127 of file usbhub.h.

    +

    Definition at line 127 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_EVENT_LS_CONNECT

    +
    @@ -1348,11 +1480,13 @@ Functions
    -

    Definition at line 129 of file usbhub.h.

    +

    Definition at line 129 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_EVENT_LS_RESET_COMPLETE

    +
    @@ -1362,11 +1496,13 @@ Functions
    -

    Definition at line 130 of file usbhub.h.

    +

    Definition at line 130 of file usbhub.h.

    - + +

    ◆ bmHUB_PORT_EVENT_LS_PORT_ENABLED

    +
    @@ -1376,12 +1512,14 @@ Functions
    -

    Definition at line 131 of file usbhub.h.

    +

    Definition at line 131 of file usbhub.h.

    Function Documentation

    - + +

    ◆ PrintHubPortStatus()

    +
    @@ -1424,7 +1562,7 @@ Functions diff --git a/usbhub_8h__dep__incl.md5 b/usbhub_8h__dep__incl.md5 index f8e4934f..2a0ab857 100644 --- a/usbhub_8h__dep__incl.md5 +++ b/usbhub_8h__dep__incl.md5 @@ -1 +1 @@ -600ba6d376b8fce703e559892c09ebf2 \ No newline at end of file +012c31d1c58937812de7c26d123497db \ No newline at end of file diff --git a/usbhub_8h__dep__incl.png b/usbhub_8h__dep__incl.png index b2b290ca435eda33a4713cf189f9199eea1c1714..921dd1dfbcaed5e7312b383ab0afa4c2853dfecd 100644 GIT binary patch literal 3269 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 F{{l>-Ej$1K literal 3302 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 diff --git a/usbhub_8h__incl.md5 b/usbhub_8h__incl.md5 index 2966a465..322c5e47 100644 --- a/usbhub_8h__incl.md5 +++ b/usbhub_8h__incl.md5 @@ -1 +1 @@ -dd1f2b59c87dcda8d5477cdc57930370 \ No newline at end of file +3f1c8341825566abbe941b0f1facccff \ No newline at end of file diff --git a/usbhub_8h__incl.png b/usbhub_8h__incl.png index b289ee9cc5ba6f0a76efefdd9e6b4c9a100529b3..20f26f7d99b3484d7cdfc62c58b1d94b3816f1dc 100644 GIT binary patch literal 2662 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 literal 2556 zcmbW3X*3jU8^=d>k+O^@8I)}-53(jZV{b-=n9K;tZWueIP)Ly>OvIRZq!{~d?8aJz zWM?cxC|f+%2+zFdJm)>{=l8>P-Cyo=-T(WX>-zn#7q?+1TpWTN004l?%oGBrpLX;> zv$4?gi1bN50Knd12GO?(W7xol`#|ps^+c8w3f5r9;CC!O7^jnxNKQTy`Y(XiG4W=H z37wI(ow$og@oSy0CGQI~PMBTn{Mw0&Z+=GHuQ4a>_y5Xi2=)EhxPm^wANclYd|GRC zKgI{@9E1*P9PH1`DYSQ;BZ)rK)6e51nY%GFFx%xyg2^1EkaJ2#F8a!G!}*qt*Tlps zK9aClPOp&yT0`Vn%O$a-pGKLM)GGJEf~KZyx4|6r0NnrlIlsA<_e*_mhO^ZDz|ztr zIJ-L8-nZ;tbG6~#Ms!=Mlx0l4mp*T91>vvxDR*!hah_vnV(>O*Lz&NwO}Y}T8;-dFMRIhTB`d`}XnYL(a00kEj!~Lnny_JZ5dpr*a;uV3NK zuSnMUa2p#wX!ebixC{bMzuuzYR`XOAGi{rXjh8*D|~0! zYGnXVa_fJa_haO;_o#jf-mzWX%B+ae-5L(Qp3RIl%@yaB9nkzetn)-D_D5MSiO z@C)cgBoguE$EQ@OomkStz16gw9N6CK=r9HFWdN@kt{tTvxXeiqY~s3h^=dRB-UKV` zUozADDD=Hd&bOAxvz-0)Nkbzeqx98}@e^YxRH>M8BGD)TI8=D2=un8gAEGA=tTIcL zv`PT}c?csqG=`+5r09>AIj-2#AGr8_K}lIzT2{7i?S_>|a5UA-_*TbXDBQWK`P^gC%OH zN=kNT_p5@e4e8A|^S71+fNyoau$+VZ^jwO!ghg7Mrh#0}8+nIZ82;wv1b(_?sGx0- zRa6K~jN_G{DvxXUEo?%hG>>oG%rKu zVK?O~QL&?>o9g9yys!TcMtF>5`|n^Rc#^^Po~2J^Q=%Y4=7IdE7fj+WZQmBnn~RHD zRe$}j*#Eo4^x(ck?b4g?U%x8t-&~9IYZVZ%`=bvmBjfDnY`j)^-^IH;6f1jgbBq@h zFhAjlb9a;fkfly|*rkGTV(slap7yR+M;<*j{S zgluiCo+V%P%v~?f*92}7B2U|Aqt49O*wj>}>MV(Qd4yQkc03J1M&!kDS-6)S+cgQe zv&2f%%35XCZ)WUd^MuNw0PQ1D4$tm@6+$bdY3fCCJ$V{}z7HRs_o7am;FUdsjg4h{ zTCvL>L3JT$~ zEk;}_@ULqVp|;6y)}p7IX3to?tGBla($_2EGi5os5E)|Ba%aZtgAxqfl>HqPV2sm& zg?gUVw(0S)S`B)7%yzJ_Guzuc#<{q7-aMx4-<|=%`(ynN=yuY;uaS^{4um6fH0hh#w1lZQO?bn z46cor)tl)au19Z&A$~eGg;gYvr-+%bxwZTA?|vV829!sEyBNWAY%gTLV}0L+0wzPo!kI56O*t5h#7BO{@mhjE^n?TrOQta;#m zRs=?+pO!i_R-O@5m${#-b$ny)JpgQ)4xwN)0_|`?1C$a{Y4LH>4*8BR= zA86u)z9=^g>r^4~MoCMn#IZFeQe{I$A>hkqXD0-jI9>NirU2Qp9+TV-(hQLU=|p6d z@3pU<{1}$nG~+1J1xmGjpRAIaBN#lQ8rAT4$Fq89Da&XqUA1``3;<%bXHn1Bek5TAB z!Ot)aecULzq4k6V5lBO9oN)jzZWl9#rgghtK5geZ6i`1^+hxRY{}xc!6_sm!F0@rW nA8MiN#LR5BU}lGrXg?84OBN(LA!0G8fDR1o3 diff --git a/usbhub_8h_source.html b/usbhub_8h_source.html index b0f02ed8..6cbf6cf5 100644 --- a/usbhub_8h_source.html +++ b/usbhub_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: usbhub.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    usbhub.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(__USBHUB_H__)
    18 #define __USBHUB_H__
    19 
    20 #include "Usb.h"
    21 
    22 #define USB_DESCRIPTOR_HUB 0x09 // Hub descriptor type
    23 
    24 // Hub Requests
    25 #define bmREQ_CLEAR_HUB_FEATURE USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    26 #define bmREQ_CLEAR_PORT_FEATURE USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    27 #define bmREQ_CLEAR_TT_BUFFER USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    28 #define bmREQ_GET_HUB_DESCRIPTOR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    29 #define bmREQ_GET_HUB_STATUS USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    30 #define bmREQ_GET_PORT_STATUS USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    31 #define bmREQ_RESET_TT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    32 #define bmREQ_SET_HUB_DESCRIPTOR USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    33 #define bmREQ_SET_HUB_FEATURE USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    34 #define bmREQ_SET_PORT_FEATURE USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    35 #define bmREQ_GET_TT_STATE USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    36 #define bmREQ_STOP_TT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    37 
    38 // Hub Class Requests
    39 #define HUB_REQUEST_CLEAR_TT_BUFFER 8
    40 #define HUB_REQUEST_RESET_TT 9
    41 #define HUB_REQUEST_GET_TT_STATE 10
    42 #define HUB_REQUEST_STOP_TT 11
    43 
    44 // Hub Features
    45 #define HUB_FEATURE_C_HUB_LOCAL_POWER 0
    46 #define HUB_FEATURE_C_HUB_OVER_CURRENT 1
    47 #define HUB_FEATURE_PORT_CONNECTION 0
    48 #define HUB_FEATURE_PORT_ENABLE 1
    49 #define HUB_FEATURE_PORT_SUSPEND 2
    50 #define HUB_FEATURE_PORT_OVER_CURRENT 3
    51 #define HUB_FEATURE_PORT_RESET 4
    52 #define HUB_FEATURE_PORT_POWER 8
    53 #define HUB_FEATURE_PORT_LOW_SPEED 9
    54 #define HUB_FEATURE_C_PORT_CONNECTION 16
    55 #define HUB_FEATURE_C_PORT_ENABLE 17
    56 #define HUB_FEATURE_C_PORT_SUSPEND 18
    57 #define HUB_FEATURE_C_PORT_OVER_CURRENT 19
    58 #define HUB_FEATURE_C_PORT_RESET 20
    59 #define HUB_FEATURE_PORT_TEST 21
    60 #define HUB_FEATURE_PORT_INDICATOR 22
    61 
    62 // Hub Port Test Modes
    63 #define HUB_PORT_TEST_MODE_J 1
    64 #define HUB_PORT_TEST_MODE_K 2
    65 #define HUB_PORT_TEST_MODE_SE0_NAK 3
    66 #define HUB_PORT_TEST_MODE_PACKET 4
    67 #define HUB_PORT_TEST_MODE_FORCE_ENABLE 5
    68 
    69 // Hub Port Indicator Color
    70 #define HUB_PORT_INDICATOR_AUTO 0
    71 #define HUB_PORT_INDICATOR_AMBER 1
    72 #define HUB_PORT_INDICATOR_GREEN 2
    73 #define HUB_PORT_INDICATOR_OFF 3
    74 
    75 // Hub Port Status Bitmasks
    76 #define bmHUB_PORT_STATUS_PORT_CONNECTION 0x0001
    77 #define bmHUB_PORT_STATUS_PORT_ENABLE 0x0002
    78 #define bmHUB_PORT_STATUS_PORT_SUSPEND 0x0004
    79 #define bmHUB_PORT_STATUS_PORT_OVER_CURRENT 0x0008
    80 #define bmHUB_PORT_STATUS_PORT_RESET 0x0010
    81 #define bmHUB_PORT_STATUS_PORT_POWER 0x0100
    82 #define bmHUB_PORT_STATUS_PORT_LOW_SPEED 0x0200
    83 #define bmHUB_PORT_STATUS_PORT_HIGH_SPEED 0x0400
    84 #define bmHUB_PORT_STATUS_PORT_TEST 0x0800
    85 #define bmHUB_PORT_STATUS_PORT_INDICATOR 0x1000
    86 
    87 // Hub Port Status Change Bitmasks (used one byte instead of two)
    88 #define bmHUB_PORT_STATUS_C_PORT_CONNECTION 0x0001
    89 #define bmHUB_PORT_STATUS_C_PORT_ENABLE 0x0002
    90 #define bmHUB_PORT_STATUS_C_PORT_SUSPEND 0x0004
    91 #define bmHUB_PORT_STATUS_C_PORT_OVER_CURRENT 0x0008
    92 #define bmHUB_PORT_STATUS_C_PORT_RESET 0x0010
    93 
    94 // Hub Status Bitmasks (used one byte instead of two)
    95 #define bmHUB_STATUS_LOCAL_POWER_SOURCE 0x01
    96 #define bmHUB_STATUS_OVER_CURRENT 0x12
    97 
    98 // Hub Status Change Bitmasks (used one byte instead of two)
    99 #define bmHUB_STATUS_C_LOCAL_POWER_SOURCE 0x01
    100 #define bmHUB_STATUS_C_OVER_CURRENT 0x12
    101 
    102 
    103 // Hub Port Configuring Substates
    104 #define USB_STATE_HUB_PORT_CONFIGURING 0xb0
    105 #define USB_STATE_HUB_PORT_POWERED_OFF 0xb1
    106 #define USB_STATE_HUB_PORT_WAIT_FOR_POWER_GOOD 0xb2
    107 #define USB_STATE_HUB_PORT_DISCONNECTED 0xb3
    108 #define USB_STATE_HUB_PORT_DISABLED 0xb4
    109 #define USB_STATE_HUB_PORT_RESETTING 0xb5
    110 #define USB_STATE_HUB_PORT_ENABLED 0xb6
    111 
    112 // Additional Error Codes
    113 #define HUB_ERROR_PORT_HAS_BEEN_RESET 0xb1
    114 
    115 // The bit mask to check for all necessary state bits
    116 #define bmHUB_PORT_STATUS_ALL_MAIN ((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION | bmHUB_PORT_STATUS_C_PORT_ENABLE | bmHUB_PORT_STATUS_C_PORT_SUSPEND | bmHUB_PORT_STATUS_C_PORT_RESET) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_SUSPEND)
    117 
    118 // Bit mask to check for DISABLED state in HubEvent::bmStatus field
    119 #define bmHUB_PORT_STATE_CHECK_DISABLED (0x0000 | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_SUSPEND)
    120 
    121 // Hub Port States
    122 #define bmHUB_PORT_STATE_DISABLED (0x0000 | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION)
    123 
    124 // Hub Port Events
    125 #define bmHUB_PORT_EVENT_CONNECT (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION)
    126 #define bmHUB_PORT_EVENT_DISCONNECT (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER)
    127 #define bmHUB_PORT_EVENT_RESET_COMPLETE (((0UL | bmHUB_PORT_STATUS_C_PORT_RESET) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION)
    128 
    129 #define bmHUB_PORT_EVENT_LS_CONNECT (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_LOW_SPEED)
    130 #define bmHUB_PORT_EVENT_LS_RESET_COMPLETE (((0UL | bmHUB_PORT_STATUS_C_PORT_RESET) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_LOW_SPEED)
    131 #define bmHUB_PORT_EVENT_LS_PORT_ENABLED (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION | bmHUB_PORT_STATUS_C_PORT_ENABLE) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_LOW_SPEED)
    132 
    134  uint8_t bDescLength; // descriptor length
    135  uint8_t bDescriptorType; // descriptor type
    136  uint8_t bNbrPorts; // number of ports a hub equiped with
    137 
    138  struct {
    139  uint16_t LogPwrSwitchMode : 2;
    140  uint16_t CompoundDevice : 1;
    142  uint16_t TTThinkTime : 2;
    144  uint16_t Reserved : 8;
    145  } __attribute__((packed));
    146 
    147  uint8_t bPwrOn2PwrGood;
    149 } __attribute__((packed));
    150 
    151 struct HubEvent {
    152 
    153  union {
    154 
    155  struct {
    156  uint16_t bmStatus; // port status bits
    157  uint16_t bmChange; // port status change bits
    158  } __attribute__((packed));
    159  uint32_t bmEvent;
    160  uint8_t evtBuff[4];
    161  };
    162 } __attribute__((packed));
    163 
    165  static bool bResetInitiated; // True when reset is triggered
    166 
    167  USB *pUsb; // USB class instance pointer
    168 
    169  EpInfo epInfo[2]; // interrupt endpoint info structure
    170 
    171  uint8_t bAddress; // address
    172  uint8_t bNbrPorts; // number of ports
    173  // uint8_t bInitState; // initialization state variable
    174  uint32_t qNextPollTime; // next poll time
    175  bool bPollEnable; // poll enable flag
    176 
    177  uint8_t CheckHubStatus();
    178  uint8_t PortStatusChange(uint8_t port, HubEvent &evt);
    179 
    180 public:
    181  USBHub(USB *p);
    182 
    183  uint8_t ClearHubFeature(uint8_t fid);
    184  uint8_t ClearPortFeature(uint8_t fid, uint8_t port, uint8_t sel = 0);
    185  uint8_t GetHubDescriptor(uint8_t index, uint16_t nbytes, uint8_t *dataptr);
    186  uint8_t GetHubStatus(uint16_t nbytes, uint8_t* dataptr);
    187  uint8_t GetPortStatus(uint8_t port, uint16_t nbytes, uint8_t* dataptr);
    188  uint8_t SetHubDescriptor(uint8_t port, uint16_t nbytes, uint8_t* dataptr);
    189  uint8_t SetHubFeature(uint8_t fid);
    190  uint8_t SetPortFeature(uint8_t fid, uint8_t port, uint8_t sel = 0);
    191 
    192  void PrintHubStatus();
    193 
    194  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    195  uint8_t Release();
    196  uint8_t Poll();
    197  void ResetHubPort(uint8_t port);
    198 
    199  virtual uint8_t GetAddress() {
    200  return bAddress;
    201  };
    202 
    203  virtual bool DEVCLASSOK(uint8_t klass) {
    204  return (klass == 0x09);
    205  }
    206 
    207 };
    208 
    209 // Clear Hub Feature
    210 
    211 inline uint8_t USBHub::ClearHubFeature(uint8_t fid) {
    212  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CLEAR_HUB_FEATURE, USB_REQUEST_CLEAR_FEATURE, fid, 0, 0, 0, 0, NULL, NULL));
    213 }
    214 // Clear Port Feature
    215 
    216 inline uint8_t USBHub::ClearPortFeature(uint8_t fid, uint8_t port, uint8_t sel) {
    217  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CLEAR_PORT_FEATURE, USB_REQUEST_CLEAR_FEATURE, fid, 0, ((0x0000 | port) | (sel << 8)), 0, 0, NULL, NULL));
    218 }
    219 // Get Hub Descriptor
    220 
    221 inline uint8_t USBHub::GetHubDescriptor(uint8_t index, uint16_t nbytes, uint8_t *dataptr) {
    222  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_GET_HUB_DESCRIPTOR, USB_REQUEST_GET_DESCRIPTOR, index, 0x29, 0, nbytes, nbytes, dataptr, NULL));
    223 }
    224 // Get Hub Status
    225 
    226 inline uint8_t USBHub::GetHubStatus(uint16_t nbytes, uint8_t* dataptr) {
    227  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_GET_HUB_STATUS, USB_REQUEST_GET_STATUS, 0, 0, 0x0000, nbytes, nbytes, dataptr, NULL));
    228 }
    229 // Get Port Status
    230 
    231 inline uint8_t USBHub::GetPortStatus(uint8_t port, uint16_t nbytes, uint8_t* dataptr) {
    232  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_GET_PORT_STATUS, USB_REQUEST_GET_STATUS, 0, 0, port, nbytes, nbytes, dataptr, NULL));
    233 }
    234 // Set Hub Descriptor
    235 
    236 inline uint8_t USBHub::SetHubDescriptor(uint8_t port, uint16_t nbytes, uint8_t* dataptr) {
    237  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_SET_HUB_DESCRIPTOR, USB_REQUEST_SET_DESCRIPTOR, 0, 0, port, nbytes, nbytes, dataptr, NULL));
    238 }
    239 // Set Hub Feature
    240 
    241 inline uint8_t USBHub::SetHubFeature(uint8_t fid) {
    242  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_SET_HUB_FEATURE, USB_REQUEST_SET_FEATURE, fid, 0, 0, 0, 0, NULL, NULL));
    243 }
    244 // Set Port Feature
    245 
    246 inline uint8_t USBHub::SetPortFeature(uint8_t fid, uint8_t port, uint8_t sel) {
    247  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_SET_PORT_FEATURE, USB_REQUEST_SET_FEATURE, fid, 0, (((0x0000 | sel) << 8) | port), 0, 0, NULL, NULL));
    248 }
    249 
    250 void PrintHubPortStatus(USB *usbptr, uint8_t addr, uint8_t port, bool print_changes = false);
    251 
    252 #endif // __USBHUB_H__
    #define USB_REQUEST_SET_DESCRIPTOR
    Definition: usb_ch9.h:38
    +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(__USBHUB_H__)
    18 #define __USBHUB_H__
    19 
    20 #include "Usb.h"
    21 
    22 #define USB_DESCRIPTOR_HUB 0x09 // Hub descriptor type
    23 
    24 // Hub Requests
    25 #define bmREQ_CLEAR_HUB_FEATURE USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    26 #define bmREQ_CLEAR_PORT_FEATURE USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    27 #define bmREQ_CLEAR_TT_BUFFER USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    28 #define bmREQ_GET_HUB_DESCRIPTOR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    29 #define bmREQ_GET_HUB_STATUS USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    30 #define bmREQ_GET_PORT_STATUS USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    31 #define bmREQ_RESET_TT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    32 #define bmREQ_SET_HUB_DESCRIPTOR USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    33 #define bmREQ_SET_HUB_FEATURE USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
    34 #define bmREQ_SET_PORT_FEATURE USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    35 #define bmREQ_GET_TT_STATE USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    36 #define bmREQ_STOP_TT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_OTHER
    37 
    38 // Hub Class Requests
    39 #define HUB_REQUEST_CLEAR_TT_BUFFER 8
    40 #define HUB_REQUEST_RESET_TT 9
    41 #define HUB_REQUEST_GET_TT_STATE 10
    42 #define HUB_REQUEST_STOP_TT 11
    43 
    44 // Hub Features
    45 #define HUB_FEATURE_C_HUB_LOCAL_POWER 0
    46 #define HUB_FEATURE_C_HUB_OVER_CURRENT 1
    47 #define HUB_FEATURE_PORT_CONNECTION 0
    48 #define HUB_FEATURE_PORT_ENABLE 1
    49 #define HUB_FEATURE_PORT_SUSPEND 2
    50 #define HUB_FEATURE_PORT_OVER_CURRENT 3
    51 #define HUB_FEATURE_PORT_RESET 4
    52 #define HUB_FEATURE_PORT_POWER 8
    53 #define HUB_FEATURE_PORT_LOW_SPEED 9
    54 #define HUB_FEATURE_C_PORT_CONNECTION 16
    55 #define HUB_FEATURE_C_PORT_ENABLE 17
    56 #define HUB_FEATURE_C_PORT_SUSPEND 18
    57 #define HUB_FEATURE_C_PORT_OVER_CURRENT 19
    58 #define HUB_FEATURE_C_PORT_RESET 20
    59 #define HUB_FEATURE_PORT_TEST 21
    60 #define HUB_FEATURE_PORT_INDICATOR 22
    61 
    62 // Hub Port Test Modes
    63 #define HUB_PORT_TEST_MODE_J 1
    64 #define HUB_PORT_TEST_MODE_K 2
    65 #define HUB_PORT_TEST_MODE_SE0_NAK 3
    66 #define HUB_PORT_TEST_MODE_PACKET 4
    67 #define HUB_PORT_TEST_MODE_FORCE_ENABLE 5
    68 
    69 // Hub Port Indicator Color
    70 #define HUB_PORT_INDICATOR_AUTO 0
    71 #define HUB_PORT_INDICATOR_AMBER 1
    72 #define HUB_PORT_INDICATOR_GREEN 2
    73 #define HUB_PORT_INDICATOR_OFF 3
    74 
    75 // Hub Port Status Bitmasks
    76 #define bmHUB_PORT_STATUS_PORT_CONNECTION 0x0001
    77 #define bmHUB_PORT_STATUS_PORT_ENABLE 0x0002
    78 #define bmHUB_PORT_STATUS_PORT_SUSPEND 0x0004
    79 #define bmHUB_PORT_STATUS_PORT_OVER_CURRENT 0x0008
    80 #define bmHUB_PORT_STATUS_PORT_RESET 0x0010
    81 #define bmHUB_PORT_STATUS_PORT_POWER 0x0100
    82 #define bmHUB_PORT_STATUS_PORT_LOW_SPEED 0x0200
    83 #define bmHUB_PORT_STATUS_PORT_HIGH_SPEED 0x0400
    84 #define bmHUB_PORT_STATUS_PORT_TEST 0x0800
    85 #define bmHUB_PORT_STATUS_PORT_INDICATOR 0x1000
    86 
    87 // Hub Port Status Change Bitmasks (used one byte instead of two)
    88 #define bmHUB_PORT_STATUS_C_PORT_CONNECTION 0x0001
    89 #define bmHUB_PORT_STATUS_C_PORT_ENABLE 0x0002
    90 #define bmHUB_PORT_STATUS_C_PORT_SUSPEND 0x0004
    91 #define bmHUB_PORT_STATUS_C_PORT_OVER_CURRENT 0x0008
    92 #define bmHUB_PORT_STATUS_C_PORT_RESET 0x0010
    93 
    94 // Hub Status Bitmasks (used one byte instead of two)
    95 #define bmHUB_STATUS_LOCAL_POWER_SOURCE 0x01
    96 #define bmHUB_STATUS_OVER_CURRENT 0x12
    97 
    98 // Hub Status Change Bitmasks (used one byte instead of two)
    99 #define bmHUB_STATUS_C_LOCAL_POWER_SOURCE 0x01
    100 #define bmHUB_STATUS_C_OVER_CURRENT 0x12
    101 
    102 
    103 // Hub Port Configuring Substates
    104 #define USB_STATE_HUB_PORT_CONFIGURING 0xb0
    105 #define USB_STATE_HUB_PORT_POWERED_OFF 0xb1
    106 #define USB_STATE_HUB_PORT_WAIT_FOR_POWER_GOOD 0xb2
    107 #define USB_STATE_HUB_PORT_DISCONNECTED 0xb3
    108 #define USB_STATE_HUB_PORT_DISABLED 0xb4
    109 #define USB_STATE_HUB_PORT_RESETTING 0xb5
    110 #define USB_STATE_HUB_PORT_ENABLED 0xb6
    111 
    112 // Additional Error Codes
    113 #define HUB_ERROR_PORT_HAS_BEEN_RESET 0xb1
    114 
    115 // The bit mask to check for all necessary state bits
    116 #define bmHUB_PORT_STATUS_ALL_MAIN ((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION | bmHUB_PORT_STATUS_C_PORT_ENABLE | bmHUB_PORT_STATUS_C_PORT_SUSPEND | bmHUB_PORT_STATUS_C_PORT_RESET) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_SUSPEND)
    117 
    118 // Bit mask to check for DISABLED state in HubEvent::bmStatus field
    119 #define bmHUB_PORT_STATE_CHECK_DISABLED (0x0000 | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_SUSPEND)
    120 
    121 // Hub Port States
    122 #define bmHUB_PORT_STATE_DISABLED (0x0000 | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION)
    123 
    124 // Hub Port Events
    125 #define bmHUB_PORT_EVENT_CONNECT (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION)
    126 #define bmHUB_PORT_EVENT_DISCONNECT (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER)
    127 #define bmHUB_PORT_EVENT_RESET_COMPLETE (((0UL | bmHUB_PORT_STATUS_C_PORT_RESET) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION)
    128 
    129 #define bmHUB_PORT_EVENT_LS_CONNECT (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_LOW_SPEED)
    130 #define bmHUB_PORT_EVENT_LS_RESET_COMPLETE (((0UL | bmHUB_PORT_STATUS_C_PORT_RESET) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_LOW_SPEED)
    131 #define bmHUB_PORT_EVENT_LS_PORT_ENABLED (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION | bmHUB_PORT_STATUS_C_PORT_ENABLE) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_ENABLE | bmHUB_PORT_STATUS_PORT_CONNECTION | bmHUB_PORT_STATUS_PORT_LOW_SPEED)
    132 
    134  uint8_t bDescLength; // descriptor length
    135  uint8_t bDescriptorType; // descriptor type
    136  uint8_t bNbrPorts; // number of ports a hub equiped with
    137 
    138  struct {
    139  uint16_t LogPwrSwitchMode : 2;
    140  uint16_t CompoundDevice : 1;
    142  uint16_t TTThinkTime : 2;
    144  uint16_t Reserved : 8;
    145  } __attribute__((packed));
    146 
    147  uint8_t bPwrOn2PwrGood;
    149 } __attribute__((packed));
    150 
    151 struct HubEvent {
    152 
    153  union {
    154 
    155  struct {
    156  uint16_t bmStatus; // port status bits
    157  uint16_t bmChange; // port status change bits
    158  } __attribute__((packed));
    159  uint32_t bmEvent;
    160  uint8_t evtBuff[4];
    161  };
    162 } __attribute__((packed));
    163 
    165  static bool bResetInitiated; // True when reset is triggered
    166 
    167  USB *pUsb; // USB class instance pointer
    168 
    169  EpInfo epInfo[2]; // interrupt endpoint info structure
    170 
    171  uint8_t bAddress; // address
    172  uint8_t bNbrPorts; // number of ports
    173  // uint8_t bInitState; // initialization state variable
    174  uint32_t qNextPollTime; // next poll time
    175  bool bPollEnable; // poll enable flag
    176 
    177  uint8_t CheckHubStatus();
    178  uint8_t PortStatusChange(uint8_t port, HubEvent &evt);
    179 
    180 public:
    181  USBHub(USB *p);
    182 
    183  uint8_t ClearHubFeature(uint8_t fid);
    184  uint8_t ClearPortFeature(uint8_t fid, uint8_t port, uint8_t sel = 0);
    185  uint8_t GetHubDescriptor(uint8_t index, uint16_t nbytes, uint8_t *dataptr);
    186  uint8_t GetHubStatus(uint16_t nbytes, uint8_t* dataptr);
    187  uint8_t GetPortStatus(uint8_t port, uint16_t nbytes, uint8_t* dataptr);
    188  uint8_t SetHubDescriptor(uint8_t port, uint16_t nbytes, uint8_t* dataptr);
    189  uint8_t SetHubFeature(uint8_t fid);
    190  uint8_t SetPortFeature(uint8_t fid, uint8_t port, uint8_t sel = 0);
    191 
    192  void PrintHubStatus();
    193 
    194  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    195  uint8_t Release();
    196  uint8_t Poll();
    197  void ResetHubPort(uint8_t port);
    198 
    199  virtual uint8_t GetAddress() {
    200  return bAddress;
    201  };
    202 
    203  virtual bool DEVCLASSOK(uint8_t klass) {
    204  return (klass == 0x09);
    205  }
    206 
    207 };
    208 
    209 // Clear Hub Feature
    210 
    211 inline uint8_t USBHub::ClearHubFeature(uint8_t fid) {
    212  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CLEAR_HUB_FEATURE, USB_REQUEST_CLEAR_FEATURE, fid, 0, 0, 0, 0, NULL, NULL));
    213 }
    214 // Clear Port Feature
    215 
    216 inline uint8_t USBHub::ClearPortFeature(uint8_t fid, uint8_t port, uint8_t sel) {
    217  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CLEAR_PORT_FEATURE, USB_REQUEST_CLEAR_FEATURE, fid, 0, ((0x0000 | port) | (sel << 8)), 0, 0, NULL, NULL));
    218 }
    219 // Get Hub Descriptor
    220 
    221 inline uint8_t USBHub::GetHubDescriptor(uint8_t index, uint16_t nbytes, uint8_t *dataptr) {
    222  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_GET_HUB_DESCRIPTOR, USB_REQUEST_GET_DESCRIPTOR, index, 0x29, 0, nbytes, nbytes, dataptr, NULL));
    223 }
    224 // Get Hub Status
    225 
    226 inline uint8_t USBHub::GetHubStatus(uint16_t nbytes, uint8_t* dataptr) {
    227  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_GET_HUB_STATUS, USB_REQUEST_GET_STATUS, 0, 0, 0x0000, nbytes, nbytes, dataptr, NULL));
    228 }
    229 // Get Port Status
    230 
    231 inline uint8_t USBHub::GetPortStatus(uint8_t port, uint16_t nbytes, uint8_t* dataptr) {
    232  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_GET_PORT_STATUS, USB_REQUEST_GET_STATUS, 0, 0, port, nbytes, nbytes, dataptr, NULL));
    233 }
    234 // Set Hub Descriptor
    235 
    236 inline uint8_t USBHub::SetHubDescriptor(uint8_t port, uint16_t nbytes, uint8_t* dataptr) {
    237  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_SET_HUB_DESCRIPTOR, USB_REQUEST_SET_DESCRIPTOR, 0, 0, port, nbytes, nbytes, dataptr, NULL));
    238 }
    239 // Set Hub Feature
    240 
    241 inline uint8_t USBHub::SetHubFeature(uint8_t fid) {
    242  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_SET_HUB_FEATURE, USB_REQUEST_SET_FEATURE, fid, 0, 0, 0, 0, NULL, NULL));
    243 }
    244 // Set Port Feature
    245 
    246 inline uint8_t USBHub::SetPortFeature(uint8_t fid, uint8_t port, uint8_t sel) {
    247  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_SET_PORT_FEATURE, USB_REQUEST_SET_FEATURE, fid, 0, (((0x0000 | sel) << 8) | port), 0, 0, NULL, NULL));
    248 }
    249 
    250 void PrintHubPortStatus(USB *usbptr, uint8_t addr, uint8_t port, bool print_changes = false);
    251 
    252 #endif // __USBHUB_H__
    #define USB_REQUEST_SET_DESCRIPTOR
    Definition: usb_ch9.h:45
    uint16_t bmChange
    Definition: usbhub.h:157
    uint8_t bDescLength
    Definition: usbhub.h:134
    uint8_t bPwrOn2PwrGood
    Definition: usbhub.h:147
    uint8_t SetHubDescriptor(uint8_t port, uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhub.h:236
    -
    #define USB_REQUEST_CLEAR_FEATURE
    Definition: usb_ch9.h:34
    -
    #define USB_REQUEST_GET_DESCRIPTOR
    Definition: usb_ch9.h:37
    +
    #define USB_REQUEST_CLEAR_FEATURE
    Definition: usb_ch9.h:41
    +
    #define USB_REQUEST_GET_DESCRIPTOR
    Definition: usb_ch9.h:44
    virtual bool DEVCLASSOK(uint8_t klass)
    Definition: usbhub.h:203
    +
    void ResetHubPort(uint8_t port)
    Definition: usbhub.cpp:309
    uint16_t OverCurrentProtectMode
    Definition: usbhub.h:141
    - +
    #define bmREQ_GET_HUB_DESCRIPTOR
    Definition: usbhub.h:28
    uint8_t GetHubStatus(uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhub.h:226
    #define bmREQ_GET_HUB_STATUS
    Definition: usbhub.h:29
    +
    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:133
    uint8_t bNbrPorts
    Definition: usbhub.h:136
    uint8_t ClearHubFeature(uint8_t fid)
    Definition: usbhub.h:211
    void PrintHubPortStatus(USB *usbptr, uint8_t addr, uint8_t port, bool print_changes=false)
    uint8_t GetHubDescriptor(uint8_t index, uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhub.h:221
    -
    Definition: address.h:32
    -
    #define USB_REQUEST_GET_STATUS
    Definition: usb_ch9.h:33
    +
    Definition: address.h:39
    +
    #define USB_REQUEST_GET_STATUS
    Definition: usb_ch9.h:40
    uint8_t ClearPortFeature(uint8_t fid, uint8_t port, uint8_t sel=0)
    Definition: usbhub.h:216
    -
    #define USB_REQUEST_SET_FEATURE
    Definition: usb_ch9.h:35
    +
    #define USB_REQUEST_SET_FEATURE
    Definition: usb_ch9.h:42
    #define bmREQ_CLEAR_PORT_FEATURE
    Definition: usbhub.h:26
    virtual uint8_t GetAddress()
    Definition: usbhub.h:199
    uint32_t bmEvent
    Definition: usbhub.h:159
    uint8_t bDescriptorType
    Definition: usbhub.h:135
    uint16_t PortIndicatorsSupported
    Definition: usbhub.h:143
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbhub.cpp:44
    Definition: usbhub.h:164
    uint16_t bmStatus
    Definition: usbhub.h:156
    #define bmREQ_SET_HUB_DESCRIPTOR
    Definition: usbhub.h:32
    @@ -129,18 +112,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint16_t Reserved
    Definition: usbhub.h:144
    uint8_t GetPortStatus(uint8_t port, uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhub.h:231
    uint16_t TTThinkTime
    Definition: usbhub.h:142
    -
    Definition: UsbCore.h:197
    +
    uint8_t Release()
    Definition: usbhub.cpp:216
    +
    Definition: UsbCore.h:208
    +
    uint8_t evtBuff[4]
    Definition: usbhub.h:160
    uint16_t CompoundDevice
    Definition: usbhub.h:140
    uint16_t LogPwrSwitchMode
    Definition: usbhub.h:139
    #define bmREQ_CLEAR_HUB_FEATURE
    Definition: usbhub.h:25
    +
    void PrintHubStatus()
    #define bmREQ_GET_PORT_STATUS
    Definition: usbhub.h:30
    uint8_t SetPortFeature(uint8_t fid, uint8_t port, uint8_t sel=0)
    Definition: usbhub.h:246
    +
    uint8_t Poll()
    Definition: usbhub.cpp:229
    +
    USBHub(USB *p)
    Definition: usbhub.cpp:21
    diff --git a/version__helper_8h.html b/version__helper_8h.html index e90713d3..c6f5d88e 100644 --- a/version__helper_8h.html +++ b/version__helper_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: version_helper.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    + +
    This graph shows which files directly or indirectly include this file:
    @@ -214,7 +196,9 @@ Macros  

    Macro Definition Documentation

    - + +

    ◆ __PGMSPACE_H_

    +
    @@ -224,11 +208,13 @@ Macros
    -

    Definition at line 36 of file version_helper.h.

    +

    Definition at line 43 of file version_helper.h.

    - + +

    ◆ PGM_P

    +
    @@ -238,11 +224,13 @@ Macros
    -

    Definition at line 44 of file version_helper.h.

    +

    Definition at line 51 of file version_helper.h.

    - + +

    ◆ PSTR

    +
    @@ -256,11 +244,13 @@ Macros
    -

    Definition at line 47 of file version_helper.h.

    +

    Definition at line 54 of file version_helper.h.

    - + +

    ◆ F

    +
    @@ -274,11 +264,13 @@ Macros
    -

    Definition at line 50 of file version_helper.h.

    +

    Definition at line 57 of file version_helper.h.

    - + +

    ◆ _SFR_BYTE

    +
    @@ -292,11 +284,13 @@ Macros
    -

    Definition at line 53 of file version_helper.h.

    +

    Definition at line 60 of file version_helper.h.

    - + +

    ◆ memchr_P

    +
    @@ -326,11 +320,13 @@ Macros
    -

    Definition at line 57 of file version_helper.h.

    +

    Definition at line 64 of file version_helper.h.

    - + +

    ◆ memcmp_P

    +
    @@ -360,11 +356,13 @@ Macros
    -

    Definition at line 60 of file version_helper.h.

    +

    Definition at line 67 of file version_helper.h.

    - + +

    ◆ memcpy_P

    +
    @@ -394,11 +392,13 @@ Macros
    -

    Definition at line 63 of file version_helper.h.

    +

    Definition at line 70 of file version_helper.h.

    - + +

    ◆ memmem_P

    +
    @@ -434,11 +434,13 @@ Macros
    -

    Definition at line 66 of file version_helper.h.

    +

    Definition at line 73 of file version_helper.h.

    - + +

    ◆ memrchr_P

    +
    @@ -468,11 +470,13 @@ Macros
    -

    Definition at line 69 of file version_helper.h.

    +

    Definition at line 76 of file version_helper.h.

    - + +

    ◆ strcat_P

    +
    @@ -496,11 +500,13 @@ Macros
    -

    Definition at line 72 of file version_helper.h.

    +

    Definition at line 79 of file version_helper.h.

    - + +

    ◆ strchr_P

    +
    @@ -524,11 +530,13 @@ Macros
    -

    Definition at line 75 of file version_helper.h.

    +

    Definition at line 82 of file version_helper.h.

    - + +

    ◆ strchrnul_P

    +
    @@ -552,11 +560,13 @@ Macros
    -

    Definition at line 78 of file version_helper.h.

    +

    Definition at line 85 of file version_helper.h.

    - + +

    ◆ strcmp_P

    +
    @@ -580,11 +590,13 @@ Macros
    -

    Definition at line 81 of file version_helper.h.

    +

    Definition at line 88 of file version_helper.h.

    - + +

    ◆ strcpy_P

    +
    @@ -608,11 +620,13 @@ Macros
    -

    Definition at line 84 of file version_helper.h.

    +

    Definition at line 91 of file version_helper.h.

    - + +

    ◆ strcasecmp_P

    +
    @@ -636,11 +650,13 @@ Macros
    -

    Definition at line 87 of file version_helper.h.

    +

    Definition at line 94 of file version_helper.h.

    - + +

    ◆ strcasestr_P

    +
    @@ -664,11 +680,13 @@ Macros
    -

    Definition at line 90 of file version_helper.h.

    +

    Definition at line 97 of file version_helper.h.

    - + +

    ◆ strlcat_P

    +
    @@ -698,11 +716,13 @@ Macros
    -

    Definition at line 93 of file version_helper.h.

    +

    Definition at line 100 of file version_helper.h.

    - + +

    ◆ strlcpy_P

    +
    @@ -732,11 +752,13 @@ Macros
    -

    Definition at line 96 of file version_helper.h.

    +

    Definition at line 103 of file version_helper.h.

    - + +

    ◆ strlen_P

    +
    @@ -750,11 +772,13 @@ Macros
    -

    Definition at line 99 of file version_helper.h.

    +

    Definition at line 106 of file version_helper.h.

    - + +

    ◆ strnlen_P

    +
    @@ -778,11 +802,13 @@ Macros
    -

    Definition at line 102 of file version_helper.h.

    +

    Definition at line 109 of file version_helper.h.

    - + +

    ◆ strncmp_P

    +
    @@ -812,11 +838,13 @@ Macros
    -

    Definition at line 105 of file version_helper.h.

    +

    Definition at line 112 of file version_helper.h.

    - + +

    ◆ strncasecmp_P

    +
    @@ -846,11 +874,13 @@ Macros
    -

    Definition at line 108 of file version_helper.h.

    +

    Definition at line 115 of file version_helper.h.

    - + +

    ◆ strncat_P

    +
    @@ -880,11 +910,13 @@ Macros
    -

    Definition at line 111 of file version_helper.h.

    +

    Definition at line 118 of file version_helper.h.

    - + +

    ◆ strncpy_P

    +
    @@ -914,11 +946,13 @@ Macros
    -

    Definition at line 114 of file version_helper.h.

    +

    Definition at line 121 of file version_helper.h.

    - + +

    ◆ strpbrk_P

    +
    @@ -942,11 +976,13 @@ Macros
    -

    Definition at line 117 of file version_helper.h.

    +

    Definition at line 124 of file version_helper.h.

    - + +

    ◆ strrchr_P

    +
    @@ -970,11 +1006,13 @@ Macros
    -

    Definition at line 120 of file version_helper.h.

    +

    Definition at line 127 of file version_helper.h.

    - + +

    ◆ strsep_P

    +
    @@ -998,11 +1036,13 @@ Macros
    -

    Definition at line 123 of file version_helper.h.

    +

    Definition at line 130 of file version_helper.h.

    - + +

    ◆ strspn_P

    +
    @@ -1026,11 +1066,13 @@ Macros
    -

    Definition at line 126 of file version_helper.h.

    +

    Definition at line 133 of file version_helper.h.

    - + +

    ◆ strstr_P

    +
    @@ -1054,11 +1096,13 @@ Macros
    -

    Definition at line 129 of file version_helper.h.

    +

    Definition at line 136 of file version_helper.h.

    - + +

    ◆ sprintf_P

    +
    @@ -1082,11 +1126,13 @@ Macros
    -

    Definition at line 132 of file version_helper.h.

    +

    Definition at line 139 of file version_helper.h.

    - + +

    ◆ vfprintf_P

    +
    @@ -1110,11 +1156,13 @@ Macros
    -

    Definition at line 135 of file version_helper.h.

    +

    Definition at line 142 of file version_helper.h.

    - + +

    ◆ printf_P

    +
    @@ -1128,11 +1176,13 @@ Macros
    -

    Definition at line 138 of file version_helper.h.

    +

    Definition at line 145 of file version_helper.h.

    - + +

    ◆ snprintf_P

    +
    @@ -1162,11 +1212,13 @@ Macros
    -

    Definition at line 141 of file version_helper.h.

    +

    Definition at line 148 of file version_helper.h.

    - + +

    ◆ vsprintf_P

    +
    @@ -1190,11 +1242,13 @@ Macros
    -

    Definition at line 144 of file version_helper.h.

    +

    Definition at line 151 of file version_helper.h.

    - + +

    ◆ vsnprintf_P

    +
    @@ -1224,11 +1278,13 @@ Macros
    -

    Definition at line 147 of file version_helper.h.

    +

    Definition at line 154 of file version_helper.h.

    - + +

    ◆ fprintf_P

    +
    @@ -1252,11 +1308,13 @@ Macros
    -

    Definition at line 150 of file version_helper.h.

    +

    Definition at line 157 of file version_helper.h.

    - + +

    ◆ pgm_read_byte

    +
    @@ -1270,11 +1328,13 @@ Macros
    -

    Definition at line 154 of file version_helper.h.

    +

    Definition at line 161 of file version_helper.h.

    - + +

    ◆ pgm_read_word

    +
    @@ -1288,11 +1348,13 @@ Macros
    -

    Definition at line 157 of file version_helper.h.

    +

    Definition at line 164 of file version_helper.h.

    - + +

    ◆ pgm_read_dword

    +
    @@ -1306,11 +1368,13 @@ Macros
    -

    Definition at line 160 of file version_helper.h.

    +

    Definition at line 167 of file version_helper.h.

    - + +

    ◆ pgm_read_float

    +
    @@ -1324,11 +1388,13 @@ Macros
    -

    Definition at line 163 of file version_helper.h.

    +

    Definition at line 170 of file version_helper.h.

    - + +

    ◆ pgm_read_byte_near

    +
    @@ -1342,11 +1408,13 @@ Macros
    -

    Definition at line 167 of file version_helper.h.

    +

    Definition at line 174 of file version_helper.h.

    - + +

    ◆ pgm_read_word_near

    +
    @@ -1360,11 +1428,13 @@ Macros
    -

    Definition at line 170 of file version_helper.h.

    +

    Definition at line 177 of file version_helper.h.

    - + +

    ◆ pgm_read_dword_near

    +
    @@ -1378,11 +1448,13 @@ Macros
    -

    Definition at line 173 of file version_helper.h.

    +

    Definition at line 180 of file version_helper.h.

    - + +

    ◆ pgm_read_float_near

    +
    @@ -1396,11 +1468,13 @@ Macros
    -

    Definition at line 176 of file version_helper.h.

    +

    Definition at line 183 of file version_helper.h.

    - + +

    ◆ pgm_read_byte_far

    +
    @@ -1414,11 +1488,13 @@ Macros
    -

    Definition at line 179 of file version_helper.h.

    +

    Definition at line 186 of file version_helper.h.

    - + +

    ◆ pgm_read_word_far

    +
    @@ -1432,11 +1508,13 @@ Macros
    -

    Definition at line 182 of file version_helper.h.

    +

    Definition at line 189 of file version_helper.h.

    - + +

    ◆ pgm_read_dword_far

    +
    @@ -1450,11 +1528,13 @@ Macros
    -

    Definition at line 185 of file version_helper.h.

    +

    Definition at line 192 of file version_helper.h.

    - + +

    ◆ pgm_read_float_far

    +
    @@ -1468,11 +1548,13 @@ Macros
    -

    Definition at line 188 of file version_helper.h.

    +

    Definition at line 195 of file version_helper.h.

    - + +

    ◆ pgm_read_pointer

    +
    @@ -1482,7 +1564,7 @@ Macros
    -

    Definition at line 192 of file version_helper.h.

    +

    Definition at line 199 of file version_helper.h.

    @@ -1491,7 +1573,7 @@ Macros diff --git a/version__helper_8h__dep__incl.md5 b/version__helper_8h__dep__incl.md5 index f62c3636..4ea8a20e 100644 --- a/version__helper_8h__dep__incl.md5 +++ b/version__helper_8h__dep__incl.md5 @@ -1 +1 @@ -7ffd9ab4c1f44f6844779ea69abf203a \ No newline at end of file +389c8fcd3904e10d4462f8ce6cca758f \ No newline at end of file diff --git a/version__helper_8h__dep__incl.png b/version__helper_8h__dep__incl.png index e5506bb545b516e5b4b471aafc5bc6408e5c39a1..62dc871b71bfa62f35b7dfb05c8c9cd4764b5dd4 100644 GIT binary patch literal 3894 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 JPDHLkV1il+Ir{(r diff --git a/version__helper_8h_source.html b/version__helper_8h_source.html index c715d7ca..89fd3306 100644 --- a/version__helper_8h_source.html +++ b/version__helper_8h_source.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: version_helper.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@
    - + - - + + + +
    version_helper.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 /*
    19  * Universal Arduino(tm) "IDE" fixups.
    20  * Includes fixes for versions as low as 0023, used by Digilent.
    21  */
    22 
    23 #if defined(ARDUINO) && ARDUINO >=100
    24 #include <Arduino.h>
    25 #else
    26 #include <WProgram.h>
    27 #include <pins_arduino.h>
    28 #ifdef __AVR__
    29 #include <avr/pgmspace.h>
    30 #include <avr/io.h>
    31 #else
    32 #endif
    33 #endif
    34 
    35 #ifndef __PGMSPACE_H_
    36 #define __PGMSPACE_H_ 1
    37 
    38 #include <inttypes.h>
    39 
    40 #ifndef PROGMEM
    41 #define PROGMEM
    42 #endif
    43 #ifndef PGM_P
    44 #define PGM_P const char *
    45 #endif
    46 #ifndef PSTR
    47 #define PSTR(str) (str)
    48 #endif
    49 #ifndef F
    50 #define F(str) (str)
    51 #endif
    52 #ifndef _SFR_BYTE
    53 #define _SFR_BYTE(n) (n)
    54 #endif
    55 
    56 #ifndef memchr_P
    57 #define memchr_P(str, c, len) memchr((str), (c), (len))
    58 #endif
    59 #ifndef memcmp_P
    60 #define memcmp_P(a, b, n) memcmp((a), (b), (n))
    61 #endif
    62 #ifndef memcpy_P
    63 #define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
    64 #endif
    65 #ifndef memmem_P
    66 #define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen))
    67 #endif
    68 #ifndef memrchr_P
    69 #define memrchr_P(str, val, len) memrchr((str), (val), (len))
    70 #endif
    71 #ifndef strcat_P
    72 #define strcat_P(dest, src) strcat((dest), (src))
    73 #endif
    74 #ifndef strchr_P
    75 #define strchr_P(str, c) strchr((str), (c))
    76 #endif
    77 #ifndef strchrnul_P
    78 #define strchrnul_P(str, c) strchrnul((str), (c))
    79 #endif
    80 #ifndef strcmp_P
    81 #define strcmp_P(a, b) strcmp((a), (b))
    82 #endif
    83 #ifndef strcpy_P
    84 #define strcpy_P(dest, src) strcpy((dest), (src))
    85 #endif
    86 #ifndef strcasecmp_P
    87 #define strcasecmp_P(a, b) strcasecmp((a), (b))
    88 #endif
    89 #ifndef strcasestr_P
    90 #define strcasestr_P(a, b) strcasestr((a), (b))
    91 #endif
    92 #ifndef strlcat_P
    93 #define strlcat_P(dest, src, len) strlcat((dest), (src), (len))
    94 #endif
    95 #ifndef strlcpy_P
    96 #define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len))
    97 #endif
    98 #ifndef strlen_P
    99 #define strlen_P(s) strlen((const char *)(s))
    100 #endif
    101 #ifndef strnlen_P
    102 #define strnlen_P(str, len) strnlen((str), (len))
    103 #endif
    104 #ifndef strncmp_P
    105 #define strncmp_P(a, b, n) strncmp((a), (b), (n))
    106 #endif
    107 #ifndef strncasecmp_P
    108 #define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n))
    109 #endif
    110 #ifndef strncat_P
    111 #define strncat_P(a, b, n) strncat((a), (b), (n))
    112 #endif
    113 #ifndef strncpy_P
    114 #define strncpy_P(a, b, n) strncmp((a), (b), (n))
    115 #endif
    116 #ifndef strpbrk_P
    117 #define strpbrk_P(str, chrs) strpbrk((str), (chrs))
    118 #endif
    119 #ifndef strrchr_P
    120 #define strrchr_P(str, c) strrchr((str), (c))
    121 #endif
    122 #ifndef strsep_P
    123 #define strsep_P(strp, delim) strsep((strp), (delim))
    124 #endif
    125 #ifndef strspn_P
    126 #define strspn_P(str, chrs) strspn((str), (chrs))
    127 #endif
    128 #ifndef strstr_P
    129 #define strstr_P(a, b) strstr((a), (b))
    130 #endif
    131 #ifndef sprintf_P
    132 #define sprintf_P(s, ...) sprintf((s), __VA_ARGS__)
    133 #endif
    134 #ifndef vfprintf_P
    135 #define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__)
    136 #endif
    137 #ifndef printf_P
    138 #define printf_P(...) printf(__VA_ARGS__)
    139 #endif
    140 #ifndef snprintf_P
    141 #define snprintf_P(s, n, ...) ((s), (n), __VA_ARGS__)
    142 #endif
    143 #ifndef vsprintf_P
    144 #define vsprintf_P(s, ...) ((s),__VA_ARGS__)
    145 #endif
    146 #ifndef vsnprintf_P
    147 #define vsnprintf_P(s, n, ...) ((s), (n),__VA_ARGS__)
    148 #endif
    149 #ifndef fprintf_P
    150 #define fprintf_P(s, ...) ((s), __VA_ARGS__)
    151 #endif
    152 
    153 #ifndef pgm_read_byte
    154 #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
    155 #endif
    156 #ifndef pgm_read_word
    157 #define pgm_read_word(addr) (*(const unsigned short *)(addr))
    158 #endif
    159 #ifndef pgm_read_dword
    160 #define pgm_read_dword(addr) (*(const unsigned long *)(addr))
    161 #endif
    162 #ifndef pgm_read_float
    163 #define pgm_read_float(addr) (*(const float *)(addr))
    164 #endif
    165 
    166 #ifndef pgm_read_byte_near
    167 #define pgm_read_byte_near(addr) pgm_read_byte(addr)
    168 #endif
    169 #ifndef pgm_read_word_near
    170 #define pgm_read_word_near(addr) pgm_read_word(addr)
    171 #endif
    172 #ifndef pgm_read_dword_near
    173 #define pgm_read_dword_near(addr) pgm_read_dword(addr)
    174 #endif
    175 #ifndef pgm_read_float_near
    176 #define pgm_read_float_near(addr) pgm_read_float(addr)
    177 #endif
    178 #ifndef pgm_read_byte_far
    179 #define pgm_read_byte_far(addr) pgm_read_byte(addr)
    180 #endif
    181 #ifndef pgm_read_word_far
    182 #define pgm_read_word_far(addr) pgm_read_word(addr)
    183 #endif
    184 #ifndef pgm_read_dword_far
    185 #define pgm_read_dword_far(addr) pgm_read_dword(addr)
    186 #endif
    187 #ifndef pgm_read_float_far
    188 #define pgm_read_float_far(addr) pgm_read_float(addr)
    189 #endif
    190 
    191 #ifndef pgm_read_pointer
    192 #define pgm_read_pointer
    193 #endif
    194 #endif
    +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 /*
    26  * Universal Arduino(tm) "IDE" fixups.
    27  * Includes fixes for versions as low as 0023, used by Digilent.
    28  */
    29 
    30 #if defined(ARDUINO) && ARDUINO >=100
    31 #include <Arduino.h>
    32 #else
    33 #include <WProgram.h>
    34 #include <pins_arduino.h>
    35 #ifdef __AVR__
    36 #include <avr/pgmspace.h>
    37 #include <avr/io.h>
    38 #else
    39 #endif
    40 #endif
    41 
    42 #ifndef __PGMSPACE_H_
    43 #define __PGMSPACE_H_ 1
    44 
    45 #include <inttypes.h>
    46 
    47 #ifndef PROGMEM
    48 #define PROGMEM
    49 #endif
    50 #ifndef PGM_P
    51 #define PGM_P const char *
    52 #endif
    53 #ifndef PSTR
    54 #define PSTR(str) (str)
    55 #endif
    56 #ifndef F
    57 #define F(str) (str)
    58 #endif
    59 #ifndef _SFR_BYTE
    60 #define _SFR_BYTE(n) (n)
    61 #endif
    62 
    63 #ifndef memchr_P
    64 #define memchr_P(str, c, len) memchr((str), (c), (len))
    65 #endif
    66 #ifndef memcmp_P
    67 #define memcmp_P(a, b, n) memcmp((a), (b), (n))
    68 #endif
    69 #ifndef memcpy_P
    70 #define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
    71 #endif
    72 #ifndef memmem_P
    73 #define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen))
    74 #endif
    75 #ifndef memrchr_P
    76 #define memrchr_P(str, val, len) memrchr((str), (val), (len))
    77 #endif
    78 #ifndef strcat_P
    79 #define strcat_P(dest, src) strcat((dest), (src))
    80 #endif
    81 #ifndef strchr_P
    82 #define strchr_P(str, c) strchr((str), (c))
    83 #endif
    84 #ifndef strchrnul_P
    85 #define strchrnul_P(str, c) strchrnul((str), (c))
    86 #endif
    87 #ifndef strcmp_P
    88 #define strcmp_P(a, b) strcmp((a), (b))
    89 #endif
    90 #ifndef strcpy_P
    91 #define strcpy_P(dest, src) strcpy((dest), (src))
    92 #endif
    93 #ifndef strcasecmp_P
    94 #define strcasecmp_P(a, b) strcasecmp((a), (b))
    95 #endif
    96 #ifndef strcasestr_P
    97 #define strcasestr_P(a, b) strcasestr((a), (b))
    98 #endif
    99 #ifndef strlcat_P
    100 #define strlcat_P(dest, src, len) strlcat((dest), (src), (len))
    101 #endif
    102 #ifndef strlcpy_P
    103 #define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len))
    104 #endif
    105 #ifndef strlen_P
    106 #define strlen_P(s) strlen((const char *)(s))
    107 #endif
    108 #ifndef strnlen_P
    109 #define strnlen_P(str, len) strnlen((str), (len))
    110 #endif
    111 #ifndef strncmp_P
    112 #define strncmp_P(a, b, n) strncmp((a), (b), (n))
    113 #endif
    114 #ifndef strncasecmp_P
    115 #define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n))
    116 #endif
    117 #ifndef strncat_P
    118 #define strncat_P(a, b, n) strncat((a), (b), (n))
    119 #endif
    120 #ifndef strncpy_P
    121 #define strncpy_P(a, b, n) strncmp((a), (b), (n))
    122 #endif
    123 #ifndef strpbrk_P
    124 #define strpbrk_P(str, chrs) strpbrk((str), (chrs))
    125 #endif
    126 #ifndef strrchr_P
    127 #define strrchr_P(str, c) strrchr((str), (c))
    128 #endif
    129 #ifndef strsep_P
    130 #define strsep_P(strp, delim) strsep((strp), (delim))
    131 #endif
    132 #ifndef strspn_P
    133 #define strspn_P(str, chrs) strspn((str), (chrs))
    134 #endif
    135 #ifndef strstr_P
    136 #define strstr_P(a, b) strstr((a), (b))
    137 #endif
    138 #ifndef sprintf_P
    139 #define sprintf_P(s, ...) sprintf((s), __VA_ARGS__)
    140 #endif
    141 #ifndef vfprintf_P
    142 #define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__)
    143 #endif
    144 #ifndef printf_P
    145 #define printf_P(...) printf(__VA_ARGS__)
    146 #endif
    147 #ifndef snprintf_P
    148 #define snprintf_P(s, n, ...) ((s), (n), __VA_ARGS__)
    149 #endif
    150 #ifndef vsprintf_P
    151 #define vsprintf_P(s, ...) ((s),__VA_ARGS__)
    152 #endif
    153 #ifndef vsnprintf_P
    154 #define vsnprintf_P(s, n, ...) ((s), (n),__VA_ARGS__)
    155 #endif
    156 #ifndef fprintf_P
    157 #define fprintf_P(s, ...) ((s), __VA_ARGS__)
    158 #endif
    159 
    160 #ifndef pgm_read_byte
    161 #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
    162 #endif
    163 #ifndef pgm_read_word
    164 #define pgm_read_word(addr) (*(const unsigned short *)(addr))
    165 #endif
    166 #ifndef pgm_read_dword
    167 #define pgm_read_dword(addr) (*(const unsigned long *)(addr))
    168 #endif
    169 #ifndef pgm_read_float
    170 #define pgm_read_float(addr) (*(const float *)(addr))
    171 #endif
    172 
    173 #ifndef pgm_read_byte_near
    174 #define pgm_read_byte_near(addr) pgm_read_byte(addr)
    175 #endif
    176 #ifndef pgm_read_word_near
    177 #define pgm_read_word_near(addr) pgm_read_word(addr)
    178 #endif
    179 #ifndef pgm_read_dword_near
    180 #define pgm_read_dword_near(addr) pgm_read_dword(addr)
    181 #endif
    182 #ifndef pgm_read_float_near
    183 #define pgm_read_float_near(addr) pgm_read_float(addr)
    184 #endif
    185 #ifndef pgm_read_byte_far
    186 #define pgm_read_byte_far(addr) pgm_read_byte(addr)
    187 #endif
    188 #ifndef pgm_read_word_far
    189 #define pgm_read_word_far(addr) pgm_read_word(addr)
    190 #endif
    191 #ifndef pgm_read_dword_far
    192 #define pgm_read_dword_far(addr) pgm_read_dword(addr)
    193 #endif
    194 #ifndef pgm_read_float_far
    195 #define pgm_read_float_far(addr) pgm_read_float(addr)
    196 #endif
    197 
    198 #ifndef pgm_read_pointer
    199 #define pgm_read_pointer
    200 #endif
    201 #endif
    diff --git a/xbox_enums_8h.html b/xbox_enums_8h.html index 2e24e585..270ecc03 100644 --- a/xbox_enums_8h.html +++ b/xbox_enums_8h.html @@ -3,7 +3,8 @@ - + + USB Host Shield 2.0: xboxEnums.h File Reference @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@ - + - - + + + +
    - + @@ -135,7 +115,9 @@ Variables  

    Enumeration Type Documentation

    - + +

    ◆ LEDModeEnum

    +
    @@ -146,22 +128,20 @@ Variables

    Enum used to set special LED modes supported by the Xbox controller.

    - - - - + + + +
    Enumerator
    ROTATING  -
    FASTBLINK  -
    SLOWBLINK  -
    ALTERNATING  -
    Enumerator
    ROTATING 
    FASTBLINK 
    SLOWBLINK 
    ALTERNATING 
    -

    Definition at line 24 of file xboxEnums.h.

    +

    Definition at line 24 of file xboxEnums.h.

    Variable Documentation

    - + +

    ◆ XBOX_LEDS

    +
    @@ -172,11 +152,13 @@ Variables
    Initial value:
    = {
    0x00,
    0x02,
    0x03,
    0x04,
    0x05,
    0x01,
    }

    Used to set the LEDs on the controllers

    -

    Definition at line 32 of file xboxEnums.h.

    +

    Definition at line 32 of file xboxEnums.h.

    - + +

    ◆ XBOX_BUTTONS

    +
    @@ -187,7 +169,7 @@ Variables
    Initial value:
    = {
    0x0100,
    0x0800,
    0x0200,
    0x0400,
    0x2000,
    0x1000,
    0x4000,
    0x8000,
    0, 0,
    0x0001,
    0x0002,
    0x0020,
    0x0010,
    0x0040,
    0x0080,
    0x0004,
    0x0008,
    }

    Buttons on the controllers

    -

    Definition at line 41 of file xboxEnums.h.

    +

    Definition at line 41 of file xboxEnums.h.

    @@ -196,7 +178,7 @@ Variables diff --git a/xbox_enums_8h__dep__incl.map b/xbox_enums_8h__dep__incl.map index b55e74f3..4f8a4331 100644 --- a/xbox_enums_8h__dep__incl.map +++ b/xbox_enums_8h__dep__incl.map @@ -1,5 +1,5 @@ - + diff --git a/xbox_enums_8h__dep__incl.md5 b/xbox_enums_8h__dep__incl.md5 index 60b9cb6d..c1d05981 100644 --- a/xbox_enums_8h__dep__incl.md5 +++ b/xbox_enums_8h__dep__incl.md5 @@ -1 +1 @@ -37fbd5fbccd0c87996af0449ab2a7de6 \ No newline at end of file +e0dccedacb0e10099ba4ce5a1a80df5c \ No newline at end of file diff --git a/xbox_enums_8h__dep__incl.png b/xbox_enums_8h__dep__incl.png index df456f3fb08ef56858082bf1822ad257c440d392..4a1766523c88da3e2ca63991050a303fdecd6b6e 100644 GIT binary patch literal 14756 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 - + + USB Host Shield 2.0: xboxEnums.h Source File @@ -11,9 +12,6 @@ - @@ -32,40 +30,22 @@

    - + - - + + + +