From 4f510c531624a2adfb654d52921536582430df47 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Tue, 7 Apr 2015 16:07:33 +0200 Subject: [PATCH] Updated documentation --- Doxyfile | 266 +- _b_t_d_8cpp.html | 13 +- _b_t_d_8cpp__incl.map | 4 +- _b_t_d_8cpp__incl.md5 | 2 +- _b_t_d_8cpp__incl.png | Bin 3959 -> 13610 bytes _b_t_d_8cpp_source.html | 2280 ++++++++-------- _b_t_d_8h.html | 410 ++- _b_t_d_8h__dep__incl.md5 | 2 +- _b_t_d_8h__incl.map | 4 +- _b_t_d_8h__incl.md5 | 2 +- _b_t_d_8h__incl.png | Bin 2292 -> 11357 bytes _b_t_d_8h_source.html | 899 +++--- _b_t_h_i_d_8cpp.html | 13 +- _b_t_h_i_d_8cpp__incl.map | 10 +- _b_t_h_i_d_8cpp__incl.md5 | 2 +- _b_t_h_i_d_8cpp__incl.png | Bin 18120 -> 19163 bytes _b_t_h_i_d_8cpp_source.html | 868 +++--- _b_t_h_i_d_8h.html | 13 +- _b_t_h_i_d_8h__dep__incl.md5 | 2 +- _b_t_h_i_d_8h__incl.map | 8 +- _b_t_h_i_d_8h__incl.md5 | 2 +- _b_t_h_i_d_8h__incl.png | Bin 15893 -> 16933 bytes _b_t_h_i_d_8h_source.html | 189 +- _p_s3_b_t_8cpp.html | 13 +- _p_s3_b_t_8cpp__incl.map | 12 +- _p_s3_b_t_8cpp__incl.md5 | 2 +- _p_s3_b_t_8cpp__incl.png | Bin 12327 -> 21164 bytes _p_s3_b_t_8cpp_source.html | 1374 +++++----- _p_s3_b_t_8h.html | 13 +- _p_s3_b_t_8h__dep__incl.md5 | 2 +- _p_s3_b_t_8h__incl.map | 10 +- _p_s3_b_t_8h__incl.md5 | 2 +- _p_s3_b_t_8h__incl.png | Bin 9875 -> 18651 bytes _p_s3_b_t_8h_source.html | 240 +- _p_s3_enums_8h.html | 11 +- _p_s3_enums_8h__dep__incl.md5 | 2 +- _p_s3_enums_8h__incl.md5 | 2 +- _p_s3_enums_8h_source.html | 11 +- _p_s3_u_s_b_8cpp.html | 13 +- _p_s3_u_s_b_8cpp__incl.map | 10 +- _p_s3_u_s_b_8cpp__incl.md5 | 2 +- _p_s3_u_s_b_8cpp__incl.png | Bin 11597 -> 20696 bytes _p_s3_u_s_b_8cpp_source.html | 190 +- _p_s3_u_s_b_8h.html | 112 +- _p_s3_u_s_b_8h__dep__incl.md5 | 2 +- _p_s3_u_s_b_8h__incl.map | 8 +- _p_s3_u_s_b_8h__incl.md5 | 2 +- _p_s3_u_s_b_8h__incl.png | Bin 8970 -> 17914 bytes _p_s3_u_s_b_8h_source.html | 281 +- _p_s4_b_t_8h.html | 13 +- _p_s4_b_t_8h__incl.map | 16 +- _p_s4_b_t_8h__incl.md5 | 2 +- _p_s4_b_t_8h__incl.png | Bin 29428 -> 29380 bytes _p_s4_b_t_8h_source.html | 151 +- _p_s4_parser_8cpp.html | 11 +- _p_s4_parser_8cpp__incl.md5 | 2 +- _p_s4_parser_8cpp_source.html | 23 +- _p_s4_parser_8h.html | 11 +- _p_s4_parser_8h__dep__incl.md5 | 2 +- _p_s4_parser_8h__incl.md5 | 2 +- _p_s4_parser_8h_source.html | 35 +- _p_s4_u_s_b_8h.html | 11 +- _p_s4_u_s_b_8h__incl.md5 | 2 +- _p_s4_u_s_b_8h_source.html | 25 +- _p_s_buzz_8cpp.html | 11 +- _p_s_buzz_8cpp__incl.md5 | 2 +- _p_s_buzz_8cpp_source.html | 26 +- _p_s_buzz_8h.html | 11 +- _p_s_buzz_8h__dep__incl.md5 | 2 +- _p_s_buzz_8h__incl.md5 | 2 +- _p_s_buzz_8h_source.html | 25 +- _r_e_a_d_m_e_8md.html | 11 +- _r_e_a_d_m_e_8md_source.html | 605 ++-- _s_p_p_8cpp.html | 13 +- _s_p_p_8cpp__incl.map | 4 +- _s_p_p_8cpp__incl.md5 | 2 +- _s_p_p_8cpp__incl.png | Bin 5320 -> 15375 bytes _s_p_p_8cpp_source.html | 1665 ++++++------ _s_p_p_8h.html | 13 +- _s_p_p_8h__dep__incl.md5 | 2 +- _s_p_p_8h__incl.map | 4 +- _s_p_p_8h__incl.md5 | 2 +- _s_p_p_8h__incl.png | Bin 3633 -> 13206 bytes _s_p_p_8h_source.html | 225 +- _usb_8cpp.html | 11 +- _usb_8cpp__incl.md5 | 2 +- _usb_8cpp_source.html | 436 +-- _usb_8h.html | 13 +- _usb_8h__dep__incl.map | 98 +- _usb_8h__dep__incl.md5 | 2 +- _usb_8h__dep__incl.png | Bin 149810 -> 160812 bytes _usb_8h_source.html | 11 +- _usb_core_8h.html | 133 +- _usb_core_8h_source.html | 595 ++-- _wii_8cpp.html | 13 +- _wii_8cpp__incl.map | 6 +- _wii_8cpp__incl.md5 | 2 +- _wii_8cpp__incl.png | Bin 9602 -> 18091 bytes _wii_8cpp_source.html | 2421 +++++++++-------- _wii_8h.html | 13 +- _wii_8h__dep__incl.md5 | 2 +- _wii_8h__incl.map | 6 +- _wii_8h__incl.md5 | 2 +- _wii_8h__incl.png | Bin 7600 -> 15996 bytes _wii_8h_source.html | 603 ++-- _wii_camera_readme_8md.html | 11 +- _wii_camera_readme_8md_source.html | 27 +- _x_b_o_x_o_l_d_8cpp.html | 13 +- _x_b_o_x_o_l_d_8cpp__incl.map | 8 +- _x_b_o_x_o_l_d_8cpp__incl.md5 | 2 +- _x_b_o_x_o_l_d_8cpp__incl.png | Bin 9475 -> 18252 bytes _x_b_o_x_o_l_d_8cpp_source.html | 109 +- _x_b_o_x_o_l_d_8h.html | 86 +- _x_b_o_x_o_l_d_8h__dep__incl.md5 | 2 +- _x_b_o_x_o_l_d_8h__incl.map | 6 +- _x_b_o_x_o_l_d_8h__incl.md5 | 2 +- _x_b_o_x_o_l_d_8h__incl.png | Bin 6737 -> 15230 bytes _x_b_o_x_o_l_d_8h_source.html | 238 +- _x_b_o_x_o_n_e_8cpp.html | 111 + _x_b_o_x_o_n_e_8cpp__incl.map | 6 + _x_b_o_x_o_n_e_8cpp__incl.md5 | 1 + _x_b_o_x_o_n_e_8cpp__incl.png | Bin 0 -> 11989 bytes _x_b_o_x_o_n_e_8cpp_source.html | 544 ++++ _x_b_o_x_o_n_e_8h.html | 260 ++ _x_b_o_x_o_n_e_8h__dep__incl.map | 3 + _x_b_o_x_o_n_e_8h__dep__incl.md5 | 1 + _x_b_o_x_o_n_e_8h__dep__incl.png | Bin 0 -> 4333 bytes _x_b_o_x_o_n_e_8h__incl.map | 5 + _x_b_o_x_o_n_e_8h__incl.md5 | 1 + _x_b_o_x_o_n_e_8h__incl.png | Bin 0 -> 9070 bytes _x_b_o_x_o_n_e_8h_source.html | 233 ++ _x_b_o_x_r_e_c_v_8cpp.html | 11 +- _x_b_o_x_r_e_c_v_8cpp__incl.md5 | 2 +- _x_b_o_x_r_e_c_v_8cpp_source.html | 172 +- _x_b_o_x_r_e_c_v_8h.html | 57 +- _x_b_o_x_r_e_c_v_8h__dep__incl.md5 | 2 +- _x_b_o_x_r_e_c_v_8h__incl.md5 | 2 +- _x_b_o_x_r_e_c_v_8h_source.html | 272 +- _x_b_o_x_u_s_b_8cpp.html | 13 +- _x_b_o_x_u_s_b_8cpp__incl.map | 10 +- _x_b_o_x_u_s_b_8cpp__incl.md5 | 2 +- _x_b_o_x_u_s_b_8cpp__incl.png | Bin 12214 -> 21255 bytes _x_b_o_x_u_s_b_8cpp_source.html | 133 +- _x_b_o_x_u_s_b_8h.html | 112 +- _x_b_o_x_u_s_b_8h__dep__incl.md5 | 2 +- _x_b_o_x_u_s_b_8h__incl.map | 8 +- _x_b_o_x_u_s_b_8h__incl.md5 | 2 +- _x_b_o_x_u_s_b_8h__incl.png | Bin 9269 -> 18016 bytes _x_b_o_x_u_s_b_8h_source.html | 284 +- address_8h.html | 19 +- address_8h_source.html | 51 +- adk_8cpp.html | 11 +- adk_8cpp__incl.md5 | 2 +- adk_8cpp_source.html | 76 +- adk_8h.html | 11 +- adk_8h__dep__incl.md5 | 2 +- adk_8h__incl.md5 | 2 +- adk_8h_source.html | 37 +- annotated.html | 48 +- arrowdown.png | Bin 0 -> 246 bytes arrowright.png | Bin 0 -> 229 bytes avrpins_8h.html | 11 +- avrpins_8h_source.html | 668 +++-- cdc___x_r21_b1411_8cpp.html | 111 + cdc___x_r21_b1411_8cpp__incl.map | 5 + cdc___x_r21_b1411_8cpp__incl.md5 | 1 + cdc___x_r21_b1411_8cpp__incl.png | Bin 0 -> 8564 bytes cdc___x_r21_b1411_8cpp_source.html | 374 +++ cdc___x_r21_b1411_8h.html | 1027 +++++++ cdc___x_r21_b1411_8h__dep__incl.map | 3 + cdc___x_r21_b1411_8h__dep__incl.md5 | 1 + cdc___x_r21_b1411_8h__dep__incl.png | Bin 0 -> 4928 bytes cdc___x_r21_b1411_8h__incl.map | 4 + cdc___x_r21_b1411_8h__incl.md5 | 1 + cdc___x_r21_b1411_8h__incl.png | Bin 0 -> 5528 bytes cdc___x_r21_b1411_8h_source.html | 406 +++ cdcacm_8cpp.html | 11 +- cdcacm_8cpp__incl.md5 | 2 +- cdcacm_8cpp_source.html | 676 +++-- cdcacm_8h.html | 17 +- cdcacm_8h__dep__incl.map | 8 +- cdcacm_8h__dep__incl.md5 | 2 +- cdcacm_8h__dep__incl.png | Bin 8945 -> 13622 bytes cdcacm_8h__incl.md5 | 2 +- cdcacm_8h_source.html | 347 ++- cdcftdi_8cpp.html | 11 +- cdcftdi_8cpp__incl.md5 | 2 +- cdcftdi_8cpp_source.html | 617 +++-- cdcftdi_8h.html | 13 +- cdcftdi_8h__dep__incl.md5 | 2 +- cdcftdi_8h__incl.md5 | 2 +- cdcftdi_8h_source.html | 235 +- cdcprolific_8cpp.html | 11 +- cdcprolific_8cpp__incl.md5 | 2 +- cdcprolific_8cpp_source.html | 79 +- cdcprolific_8h.html | 75 +- cdcprolific_8h__dep__incl.md5 | 2 +- cdcprolific_8h__incl.md5 | 2 +- cdcprolific_8h_source.html | 230 +- class_a_c_m-members.html | 75 +- class_a_c_m.html | 371 ++- class_a_c_m__coll__graph.map | 1 + class_a_c_m__coll__graph.md5 | 2 +- class_a_c_m__coll__graph.png | Bin 20499 -> 24008 bytes class_a_c_m__inherit__graph.map | 3 +- class_a_c_m__inherit__graph.md5 | 2 +- class_a_c_m__inherit__graph.png | Bin 10169 -> 12723 bytes class_a_d_k-members.html | 46 +- class_a_d_k.html | 37 +- class_a_d_k__coll__graph.md5 | 2 +- class_a_d_k__inherit__graph.md5 | 2 +- class_address_pool-members.html | 11 +- class_address_pool.html | 11 +- class_address_pool__inherit__graph.md5 | 2 +- class_address_pool_impl-members.html | 11 +- class_address_pool_impl.html | 15 +- class_address_pool_impl__coll__graph.md5 | 2 +- class_address_pool_impl__inherit__graph.md5 | 2 +- class_b_t_d-members.html | 132 +- class_b_t_d.html | 193 +- class_b_t_d__coll__graph.md5 | 2 +- class_b_t_d__inherit__graph.md5 | 2 +- class_b_t_h_i_d-members.html | 39 +- class_b_t_h_i_d.html | 324 +-- class_b_t_h_i_d__coll__graph.map | 4 +- class_b_t_h_i_d__coll__graph.md5 | 2 +- class_b_t_h_i_d__coll__graph.png | Bin 22759 -> 22478 bytes class_b_t_h_i_d__inherit__graph.md5 | 2 +- class_bluetooth_service-members.html | 28 +- class_bluetooth_service.html | 328 ++- class_bluetooth_service__coll__graph.map | 8 + class_bluetooth_service__coll__graph.md5 | 1 + class_bluetooth_service__coll__graph.png | Bin 0 -> 20220 bytes class_bluetooth_service__inherit__graph.md5 | 2 +- class_bulk_only-members.html | 76 +- class_bulk_only.html | 47 +- class_bulk_only__coll__graph.md5 | 2 +- class_bulk_only__inherit__graph.md5 | 2 +- class_byte_skipper-members.html | 11 +- class_byte_skipper.html | 11 +- class_c_d_c_async_oper-members.html | 13 +- class_c_d_c_async_oper.html | 23 +- class_config_desc_parser-members.html | 11 +- class_config_desc_parser.html | 21 +- class_config_desc_parser__coll__graph.md5 | 2 +- class_config_desc_parser__inherit__graph.md5 | 2 +- class_f_t_d_i-members.html | 42 +- class_f_t_d_i.html | 93 +- class_f_t_d_i__coll__graph.md5 | 2 +- class_f_t_d_i__inherit__graph.md5 | 2 +- class_f_t_d_i_async_oper-members.html | 14 +- class_f_t_d_i_async_oper.html | 51 +- class_h_i_d-members.html | 68 +- class_h_i_d.html | 33 +- class_h_i_d__coll__graph.md5 | 2 +- class_h_i_d__inherit__graph.md5 | 2 +- class_h_i_d_boot-members.html | 43 +- class_h_i_d_boot.html | 134 +- class_h_i_d_boot__coll__graph.md5 | 2 +- class_h_i_d_boot__inherit__graph.md5 | 2 +- class_h_i_d_report_parser-members.html | 11 +- class_h_i_d_report_parser.html | 11 +- class_h_i_d_report_parser__inherit__graph.md5 | 2 +- class_h_i_d_universal-members.html | 81 +- class_h_i_d_universal.html | 65 +- class_h_i_d_universal__coll__graph.md5 | 2 +- class_h_i_d_universal__inherit__graph.md5 | 2 +- class_hex_dumper-members.html | 13 +- class_hex_dumper.html | 25 +- class_hex_dumper__coll__graph.md5 | 2 +- class_hex_dumper__inherit__graph.md5 | 2 +- class_keyboard_report_parser-members.html | 17 +- class_keyboard_report_parser.html | 73 +- class_keyboard_report_parser__coll__graph.md5 | 2 +- ...keyboard_report_parser__inherit__graph.md5 | 2 +- class_m_a_x3421e-members.html | 11 +- class_m_a_x3421e.html | 43 +- class_m_a_x3421e__inherit__graph.md5 | 2 +- class_max___l_c_d-members.html | 13 +- class_max___l_c_d.html | 19 +- class_max___l_c_d__coll__graph.md5 | 2 +- class_max___l_c_d__inherit__graph.md5 | 2 +- class_mouse_report_parser-members.html | 11 +- class_mouse_report_parser.html | 13 +- class_mouse_report_parser__coll__graph.md5 | 2 +- class_mouse_report_parser__inherit__graph.md5 | 2 +- class_multi_byte_value_parser-members.html | 11 +- class_multi_byte_value_parser.html | 11 +- class_p_l2303-members.html | 77 +- class_p_l2303.html | 59 +- class_p_l2303__coll__graph.map | 3 +- class_p_l2303__coll__graph.md5 | 2 +- class_p_l2303__coll__graph.png | Bin 23422 -> 26973 bytes class_p_l2303__inherit__graph.md5 | 2 +- class_p_s3_b_t-members.html | 33 +- class_p_s3_b_t.html | 309 ++- class_p_s3_b_t__coll__graph.map | 8 +- class_p_s3_b_t__coll__graph.md5 | 2 +- class_p_s3_b_t__coll__graph.png | Bin 3995 -> 22820 bytes class_p_s3_b_t__inherit__graph.md5 | 2 +- class_p_s3_u_s_b-members.html | 90 +- class_p_s3_u_s_b.html | 57 +- class_p_s3_u_s_b__coll__graph.md5 | 2 +- class_p_s3_u_s_b__inherit__graph.md5 | 2 +- class_p_s4_b_t-members.html | 43 +- class_p_s4_b_t.html | 98 +- class_p_s4_b_t__coll__graph.map | 6 +- class_p_s4_b_t__coll__graph.md5 | 2 +- class_p_s4_b_t__coll__graph.png | Bin 26878 -> 27019 bytes class_p_s4_b_t__inherit__graph.md5 | 2 +- class_p_s4_parser-members.html | 11 +- class_p_s4_parser.html | 11 +- class_p_s4_parser__inherit__graph.md5 | 2 +- class_p_s4_u_s_b-members.html | 135 +- class_p_s4_u_s_b.html | 82 +- class_p_s4_u_s_b__coll__graph.md5 | 2 +- class_p_s4_u_s_b__inherit__graph.md5 | 2 +- class_p_s_buzz-members.html | 101 +- class_p_s_buzz.html | 45 +- class_p_s_buzz__coll__graph.md5 | 2 +- class_p_s_buzz__inherit__graph.md5 | 2 +- class_p_t_p_list_parser-members.html | 11 +- class_p_t_p_list_parser.html | 15 +- class_report_desc_parser-members.html | 19 +- class_report_desc_parser.html | 31 +- class_report_desc_parser2-members.html | 19 +- class_report_desc_parser2.html | 35 +- class_report_desc_parser2__coll__graph.md5 | 2 +- class_report_desc_parser2__inherit__graph.md5 | 2 +- class_report_desc_parser__coll__graph.md5 | 2 +- class_report_desc_parser__inherit__graph.md5 | 2 +- class_report_desc_parser_base-members.html | 19 +- class_report_desc_parser_base.html | 81 +- ...s_report_desc_parser_base__coll__graph.md5 | 2 +- ...eport_desc_parser_base__inherit__graph.md5 | 2 +- class_s_p_p-members.html | 50 +- class_s_p_p.html | 399 +-- class_s_p_p__coll__graph.map | 8 +- class_s_p_p__coll__graph.md5 | 2 +- class_s_p_p__coll__graph.png | Bin 6292 -> 24243 bytes class_s_p_p__inherit__graph.md5 | 2 +- class_s_pi-members.html | 11 +- class_s_pi.html | 13 +- class_sink_parser-members.html | 11 +- class_sink_parser.html | 15 +- class_sink_parser__coll__graph.md5 | 2 +- class_sink_parser__inherit__graph.md5 | 2 +- class_u_s_b-members.html | 15 +- class_u_s_b.html | 57 +- class_u_s_b__coll__graph.md5 | 2 +- class_u_s_b__inherit__graph.md5 | 2 +- class_u_s_b_device_config-members.html | 26 +- class_u_s_b_device_config.html | 89 +- class_u_s_b_device_config__inherit__graph.map | 32 +- class_u_s_b_device_config__inherit__graph.md5 | 2 +- class_u_s_b_device_config__inherit__graph.png | Bin 43523 -> 49975 bytes class_u_s_b_hub-members.html | 42 +- class_u_s_b_hub.html | 29 +- class_u_s_b_hub__coll__graph.md5 | 2 +- class_u_s_b_hub__inherit__graph.md5 | 2 +- class_u_s_b_read_parser-members.html | 11 +- class_u_s_b_read_parser.html | 13 +- class_u_s_b_read_parser__inherit__graph.md5 | 2 +- class_universal_report_parser-members.html | 11 +- class_universal_report_parser.html | 15 +- ...s_universal_report_parser__coll__graph.md5 | 2 +- ...niversal_report_parser__inherit__graph.md5 | 2 +- class_usb_config_xtracter-members.html | 13 +- class_usb_config_xtracter.html | 27 +- class_usb_config_xtracter__inherit__graph.map | 21 +- class_usb_config_xtracter__inherit__graph.md5 | 2 +- class_usb_config_xtracter__inherit__graph.png | Bin 28670 -> 31343 bytes class_w_i_i-members.html | 31 +- class_w_i_i.html | 429 +-- class_w_i_i__coll__graph.map | 8 +- class_w_i_i__coll__graph.md5 | 2 +- class_w_i_i__coll__graph.png | Bin 3461 -> 22282 bytes class_w_i_i__inherit__graph.md5 | 2 +- class_x_b_o_x_o_l_d-members.html | 46 +- class_x_b_o_x_o_l_d.html | 53 +- class_x_b_o_x_o_l_d__coll__graph.md5 | 2 +- class_x_b_o_x_o_l_d__inherit__graph.md5 | 2 +- class_x_b_o_x_o_n_e-members.html | 121 + class_x_b_o_x_o_n_e.html | 610 +++++ class_x_b_o_x_o_n_e__coll__graph.map | 6 + class_x_b_o_x_o_n_e__coll__graph.md5 | 1 + class_x_b_o_x_o_n_e__coll__graph.png | Bin 0 -> 12240 bytes class_x_b_o_x_o_n_e__inherit__graph.map | 3 + class_x_b_o_x_o_n_e__inherit__graph.md5 | 1 + class_x_b_o_x_o_n_e__inherit__graph.png | Bin 0 -> 4595 bytes class_x_b_o_x_r_e_c_v-members.html | 64 +- class_x_b_o_x_r_e_c_v.html | 61 +- class_x_b_o_x_r_e_c_v__coll__graph.md5 | 2 +- class_x_b_o_x_r_e_c_v__inherit__graph.md5 | 2 +- class_x_b_o_x_u_s_b-members.html | 58 +- class_x_b_o_x_u_s_b.html | 57 +- class_x_b_o_x_u_s_b__coll__graph.md5 | 2 +- class_x_b_o_x_u_s_b__inherit__graph.md5 | 2 +- class_x_r21_b1411-members.html | 151 + class_x_r21_b1411.html | 569 ++++ class_x_r21_b1411__coll__graph.map | 10 + class_x_r21_b1411__coll__graph.md5 | 1 + class_x_r21_b1411__coll__graph.png | Bin 0 -> 27070 bytes class_x_r21_b1411__inherit__graph.map | 5 + class_x_r21_b1411__inherit__graph.md5 | 1 + class_x_r21_b1411__inherit__graph.png | Bin 0 -> 10243 bytes classes.html | 87 +- confdescparser_8h.html | 19 +- confdescparser_8h_source.html | 400 ++- controller_enums_8h.html | 13 +- controller_enums_8h__dep__incl.map | 16 +- controller_enums_8h__dep__incl.md5 | 2 +- controller_enums_8h__dep__incl.png | Bin 49216 -> 54541 bytes controller_enums_8h_source.html | 11 +- dir_397a095372f04465e811d0ee219bbf8f.html | 21 +- dir_e5fbe6d2783ccd4c93c7856d92d7be6e.html | 11 +- doc.png | Bin 0 -> 746 bytes doxygen.css | 19 +- files.html | 138 +- folderclosed.png | Bin 0 -> 616 bytes folderopen.png | Bin 0 -> 597 bytes functions.html | 149 +- functions_a.html | 290 ++ functions_b.html | 22 +- functions_c.html | 23 +- functions_d.html | 29 +- functions_e.html | 33 +- functions_enum.html | 11 +- functions_eval.html | 17 +- functions_f.html | 18 +- functions_func.html | 34 +- functions_func_b.html | 14 +- functions_func_c.html | 20 +- functions_func_d.html | 26 +- functions_func_e.html | 20 +- functions_func_f.html | 13 +- functions_func_g.html | 15 +- functions_func_h.html | 19 +- functions_func_i.html | 15 +- functions_func_k.html | 11 +- functions_func_l.html | 11 +- functions_func_m.html | 11 +- functions_func_n.html | 11 +- functions_func_o.html | 27 +- functions_func_p.html | 12 +- functions_func_r.html | 25 +- functions_func_s.html | 16 +- functions_func_t.html | 11 +- functions_func_u.html | 11 +- functions_func_v.html | 31 +- functions_func_w.html | 21 +- functions_func_x.html | 17 +- functions_g.html | 20 +- functions_h.html | 25 +- functions_i.html | 21 +- functions_k.html | 16 +- functions_l.html | 17 +- functions_m.html | 14 +- functions_n.html | 14 +- functions_o.html | 30 +- functions_p.html | 23 +- functions_q.html | 14 +- functions_r.html | 32 +- functions_s.html | 17 +- functions_t.html | 17 +- functions_type.html | 13 +- functions_u.html | 16 +- functions_v.html | 34 +- functions_vars.html | 111 +- functions_vars_a.html | 241 ++ functions_vars_b.html | 19 +- functions_vars_c.html | 14 +- functions_vars_d.html | 14 +- functions_vars_e.html | 18 +- functions_vars_f.html | 16 +- functions_vars_g.html | 14 +- functions_vars_h.html | 21 +- functions_vars_i.html | 17 +- functions_vars_k.html | 16 +- functions_vars_l.html | 17 +- functions_vars_m.html | 14 +- functions_vars_n.html | 14 +- functions_vars_o.html | 14 +- functions_vars_p.html | 22 +- functions_vars_q.html | 14 +- functions_vars_r.html | 18 +- functions_vars_s.html | 14 +- functions_vars_t.html | 17 +- functions_vars_u.html | 14 +- functions_vars_v.html | 14 +- functions_vars_w.html | 19 +- functions_vars_x.html | 17 +- functions_vars_y.html | 14 +- functions_w.html | 25 +- functions_x.html | 23 +- functions_y.html | 14 +- globals.html | 17 +- globals_a.html | 11 +- globals_b.html | 28 +- globals_c.html | 11 +- globals_d.html | 11 +- globals_defs.html | 17 +- globals_defs_a.html | 11 +- globals_defs_b.html | 28 +- globals_defs_c.html | 11 +- globals_defs_d.html | 11 +- globals_defs_e.html | 24 +- globals_defs_f.html | 17 +- globals_defs_g.html | 11 +- globals_defs_h.html | 18 +- globals_defs_i.html | 11 +- globals_defs_j.html | 16 +- globals_defs_k.html | 11 +- globals_defs_l.html | 11 +- globals_defs_m.html | 26 +- globals_defs_n.html | 11 +- globals_defs_o.html | 11 +- globals_defs_p.html | 71 +- globals_defs_r.html | 11 +- globals_defs_s.html | 77 +- globals_defs_t.html | 11 +- globals_defs_u.html | 14 +- globals_defs_v.html | 20 +- globals_defs_w.html | 11 +- globals_defs_x.html | 201 +- globals_e.html | 22 +- globals_enum.html | 11 +- globals_eval.html | 17 +- globals_f.html | 17 +- globals_func.html | 11 +- globals_g.html | 11 +- globals_h.html | 18 +- globals_i.html | 11 +- globals_j.html | 16 +- globals_k.html | 11 +- globals_l.html | 11 +- globals_m.html | 26 +- globals_n.html | 11 +- globals_o.html | 11 +- globals_p.html | 94 +- globals_r.html | 11 +- globals_s.html | 77 +- globals_t.html | 11 +- globals_type.html | 42 +- globals_u.html | 20 +- globals_v.html | 20 +- globals_vars.html | 11 +- globals_vars_r.html | 11 +- globals_vars_u.html | 11 +- globals_vars_w.html | 11 +- globals_vars_x.html | 11 +- globals_w.html | 11 +- globals_x.html | 203 +- globals_y.html | 17 +- globals_z.html | 11 +- graph_legend.html | 79 +- hexdump_8h.html | 11 +- hexdump_8h_source.html | 22 +- hid_8cpp.html | 11 +- hid_8cpp__incl.md5 | 2 +- hid_8cpp_source.html | 68 +- hid_8h.html | 37 +- hid_8h__dep__incl.map | 40 +- hid_8h__dep__incl.md5 | 2 +- hid_8h__dep__incl.png | Bin 33484 -> 64796 bytes hid_8h__incl.md5 | 2 +- hid_8h_source.html | 74 +- hidboot_8cpp.html | 11 +- hidboot_8cpp__incl.md5 | 2 +- hidboot_8cpp_source.html | 165 +- hidboot_8h.html | 11 +- hidboot_8h__dep__incl.md5 | 2 +- hidboot_8h__incl.md5 | 2 +- hidboot_8h_source.html | 947 ++++--- hidescriptorparser_8cpp.html | 11 +- hidescriptorparser_8cpp__incl.md5 | 2 +- hidescriptorparser_8cpp_source.html | 837 +++--- hidescriptorparser_8h.html | 11 +- hidescriptorparser_8h__dep__incl.md5 | 2 +- hidescriptorparser_8h__incl.md5 | 2 +- hidescriptorparser_8h_source.html | 194 +- hiduniversal_8cpp.html | 11 +- hiduniversal_8cpp__incl.md5 | 2 +- hiduniversal_8cpp_source.html | 75 +- hiduniversal_8h.html | 11 +- hiduniversal_8h__dep__incl.md5 | 2 +- hiduniversal_8h__incl.md5 | 2 +- hiduniversal_8h_source.html | 47 +- hidusagestr_8h.html | 13 +- hidusagestr_8h__dep__incl.map | 44 +- hidusagestr_8h__dep__incl.md5 | 2 +- hidusagestr_8h__dep__incl.png | Bin 40922 -> 73250 bytes hidusagestr_8h__incl.md5 | 2 +- hidusagestr_8h_source.html | 45 +- hidusagetitlearrays_8cpp.html | 11 +- hidusagetitlearrays_8cpp__incl.md5 | 2 +- hidusagetitlearrays_8cpp_source.html | 2063 +++++++------- hierarchy.html | 200 +- index.html | 86 +- inherit_graph_45.map | 2 +- inherit_graph_45.md5 | 2 +- inherit_graph_45.png | Bin 3861 -> 1703 bytes inherit_graph_46.map | 2 +- inherit_graph_46.md5 | 2 +- inherit_graph_46.png | Bin 2828 -> 3861 bytes inherit_graph_47.map | 2 +- inherit_graph_47.md5 | 2 +- inherit_graph_47.png | Bin 3133 -> 2828 bytes inherit_graph_48.map | 2 +- inherit_graph_48.md5 | 2 +- inherit_graph_48.png | Bin 2644 -> 3133 bytes inherit_graph_49.map | 2 +- inherit_graph_49.md5 | 2 +- inherit_graph_49.png | Bin 3090 -> 2644 bytes inherit_graph_50.map | 2 +- inherit_graph_50.md5 | 2 +- inherit_graph_50.png | Bin 1739 -> 3090 bytes inherit_graph_51.map | 2 +- inherit_graph_51.md5 | 2 +- inherit_graph_51.png | Bin 2455 -> 1739 bytes inherit_graph_52.map | 26 +- inherit_graph_52.md5 | 2 +- inherit_graph_52.png | Bin 88623 -> 2455 bytes inherit_graph_53.map | 32 +- inherit_graph_53.md5 | 2 +- inherit_graph_53.png | Bin 19421 -> 100227 bytes inherit_graph_54.map | 7 + inherit_graph_54.md5 | 1 + inherit_graph_54.png | Bin 0 -> 19421 bytes inherits.html | 35 +- jquery.js | 53 +- macros_8h.html | 45 +- macros_8h__dep__incl.md5 | 2 +- macros_8h_source.html | 13 +- masstorage_8cpp.html | 11 +- masstorage_8cpp__incl.md5 | 2 +- masstorage_8cpp_source.html | 236 +- masstorage_8h.html | 11 +- masstorage_8h__dep__incl.md5 | 2 +- masstorage_8h__incl.md5 | 2 +- masstorage_8h_source.html | 181 +- max3421e_8h.html | 311 +-- max3421e_8h_source.html | 414 ++- max___l_c_d_8cpp.html | 11 +- max___l_c_d_8cpp__incl.md5 | 2 +- max___l_c_d_8cpp_source.html | 15 +- max___l_c_d_8h.html | 11 +- max___l_c_d_8h__dep__incl.md5 | 2 +- max___l_c_d_8h__incl.md5 | 2 +- max___l_c_d_8h_source.html | 19 +- ..._host__shield_2_80__wii_camera_readme.html | 11 +- message_8cpp.html | 11 +- message_8cpp__incl.md5 | 2 +- message_8cpp_source.html | 29 +- message_8h.html | 11 +- message_8h_source.html | 20 +- pages.html | 11 +- parsetools_8cpp.html | 11 +- parsetools_8cpp__incl.md5 | 2 +- parsetools_8cpp_source.html | 18 +- parsetools_8h.html | 19 +- parsetools_8h_source.html | 17 +- printhex_8h.html | 11 +- printhex_8h_source.html | 11 +- search/all_0.html | 2 +- search/all_0.js | 5 +- search/all_1.html | 2 +- search/all_1.js | 12 +- search/all_10.html | 2 +- search/all_10.js | 36 +- search/all_11.html | 2 +- search/all_12.html | 2 +- search/all_12.js | 15 +- search/all_13.html | 2 +- search/all_13.js | 23 + search/all_14.html | 2 +- search/all_14.js | 2 + search/all_15.html | 2 +- search/all_15.js | 5 +- search/all_16.html | 2 +- search/all_16.js | 8 +- search/all_17.html | 2 +- search/all_17.js | 8 +- search/all_18.html | 2 +- search/all_18.js | 73 +- search/all_19.html | 2 +- search/all_19.js | 2 +- search/all_1a.html | 2 +- search/all_2.html | 2 +- search/all_2.js | 16 +- search/all_3.html | 2 +- search/all_3.js | 7 +- search/all_4.html | 2 +- search/all_4.js | 5 +- search/all_5.html | 2 +- search/all_5.js | 16 +- search/all_6.html | 2 +- search/all_6.js | 6 +- search/all_7.html | 2 +- search/all_7.js | 8 +- search/all_8.html | 2 +- search/all_8.js | 9 +- search/all_9.html | 2 +- search/all_9.js | 5 +- search/all_a.html | 2 +- search/all_a.js | 3 +- search/all_b.html | 2 +- search/all_b.js | 2 +- search/all_c.html | 2 +- search/all_c.js | 1 + search/all_d.html | 2 +- search/all_d.js | 5 + search/all_e.html | 2 +- search/all_f.html | 2 +- search/all_f.js | 3 +- search/classes_0.html | 2 +- search/classes_1.html | 2 +- search/classes_10.html | 2 +- search/classes_10.js | 4 +- search/classes_2.html | 2 +- search/classes_3.html | 2 +- search/classes_4.html | 2 +- search/classes_5.html | 2 +- search/classes_6.html | 2 +- search/classes_7.html | 2 +- search/classes_8.html | 2 +- search/classes_9.html | 2 +- search/classes_a.html | 2 +- search/classes_b.html | 2 +- search/classes_c.html | 2 +- search/classes_d.html | 2 +- search/classes_d.js | 3 +- search/classes_e.html | 2 +- search/classes_f.html | 2 +- search/defines_0.html | 2 +- search/defines_0.js | 4 +- search/defines_1.html | 2 +- search/defines_10.html | 2 +- search/defines_10.js | 18 +- search/defines_11.html | 2 +- search/defines_12.html | 2 +- search/defines_12.js | 22 + search/defines_13.html | 2 +- search/defines_14.html | 2 +- search/defines_14.js | 1 - search/defines_15.html | 2 +- search/defines_15.js | 5 +- search/defines_16.html | 2 +- search/defines_17.html | 2 +- search/defines_17.js | 70 +- search/defines_2.html | 2 +- search/defines_2.js | 8 +- search/defines_3.html | 2 +- search/defines_4.html | 2 +- search/defines_5.html | 2 +- search/defines_5.js | 3 +- search/defines_6.html | 2 +- search/defines_6.js | 2 + search/defines_7.html | 2 +- search/defines_8.html | 2 +- search/defines_8.js | 4 +- search/defines_9.html | 2 +- search/defines_a.html | 2 +- search/defines_a.js | 3 +- search/defines_b.html | 2 +- search/defines_c.html | 2 +- search/defines_d.html | 2 +- search/defines_d.js | 5 + search/defines_e.html | 2 +- search/defines_f.html | 2 +- search/enums_0.html | 2 +- search/enums_1.html | 2 +- search/enums_2.html | 2 +- search/enums_3.html | 2 +- search/enums_4.html | 2 +- search/enums_5.html | 2 +- search/enums_6.html | 2 +- search/enums_7.html | 2 +- search/enums_8.html | 2 +- search/enums_9.html | 2 +- search/enums_a.html | 2 +- search/enumvalues_0.html | 2 +- search/enumvalues_1.html | 2 +- search/enumvalues_10.html | 2 +- search/enumvalues_11.html | 2 +- search/enumvalues_12.html | 2 +- search/enumvalues_13.html | 2 +- search/enumvalues_14.html | 2 +- search/enumvalues_15.html | 2 +- search/enumvalues_15.js | 2 +- search/enumvalues_16.html | 2 +- search/enumvalues_2.html | 2 +- search/enumvalues_3.html | 2 +- search/enumvalues_4.html | 2 +- search/enumvalues_4.js | 6 +- search/enumvalues_5.html | 2 +- search/enumvalues_6.html | 2 +- search/enumvalues_7.html | 2 +- search/enumvalues_8.html | 2 +- search/enumvalues_9.html | 2 +- search/enumvalues_a.html | 2 +- search/enumvalues_b.html | 2 +- search/enumvalues_c.html | 2 +- search/enumvalues_d.html | 2 +- search/enumvalues_e.html | 2 +- search/enumvalues_f.html | 2 +- search/files_0.html | 2 +- search/files_1.html | 2 +- search/files_2.html | 2 +- search/files_2.js | 2 + search/files_3.html | 2 +- search/files_4.html | 2 +- search/files_5.html | 2 +- search/files_6.html | 2 +- search/files_7.html | 2 +- search/files_8.html | 2 +- search/files_9.html | 2 +- search/files_9.js | 4 +- search/files_a.html | 2 +- search/files_a.js | 10 +- search/files_b.html | 26 + search/files_b.js | 12 + search/functions_0.html | 2 +- search/functions_0.js | 9 +- search/functions_1.html | 2 +- search/functions_1.js | 1 + search/functions_10.html | 2 +- search/functions_10.js | 1 + search/functions_11.html | 2 +- search/functions_12.html | 2 +- search/functions_13.html | 2 +- search/functions_13.js | 2 +- search/functions_14.html | 2 +- search/functions_14.js | 6 +- search/functions_15.html | 2 +- search/functions_15.js | 4 +- search/functions_2.html | 2 +- search/functions_2.js | 5 +- search/functions_3.html | 2 +- search/functions_3.js | 5 +- search/functions_4.html | 2 +- search/functions_4.js | 4 +- search/functions_5.html | 2 +- search/functions_5.js | 2 +- search/functions_6.html | 2 +- search/functions_6.js | 8 +- search/functions_7.html | 2 +- search/functions_7.js | 3 +- search/functions_8.html | 2 +- search/functions_8.js | 4 +- search/functions_9.html | 2 +- search/functions_a.html | 2 +- search/functions_b.html | 2 +- search/functions_c.html | 2 +- search/functions_d.html | 2 +- search/functions_d.js | 3 +- search/functions_e.html | 2 +- search/functions_e.js | 2 +- search/functions_f.html | 2 +- search/functions_f.js | 9 +- search/pages_0.html | 2 +- search/search.js | 100 +- search/searchdata.js | 42 + search/typedefs_0.html | 2 +- search/typedefs_1.html | 2 +- search/typedefs_2.html | 2 +- search/typedefs_3.html | 2 +- search/typedefs_4.html | 2 +- search/typedefs_4.js | 11 +- search/typedefs_5.html | 2 +- search/typedefs_6.html | 2 +- search/typedefs_6.js | 4 +- search/variables_0.html | 2 +- search/variables_0.js | 30 +- search/variables_1.html | 2 +- search/variables_1.js | 154 +- search/variables_10.html | 2 +- search/variables_10.js | 25 +- search/variables_11.html | 2 +- search/variables_11.js | 40 +- search/variables_12.html | 2 +- search/variables_12.js | 35 +- search/variables_13.html | 2 +- search/variables_13.js | 27 +- search/variables_14.html | 2 +- search/variables_14.js | 17 +- search/variables_15.html | 2 +- search/variables_15.js | 29 +- search/variables_16.html | 2 +- search/variables_16.js | 28 +- search/variables_17.html | 2 +- search/variables_17.js | 13 +- search/variables_18.html | 26 + search/variables_18.js | 7 + search/variables_2.html | 2 +- search/variables_2.js | 151 +- search/variables_3.html | 2 +- search/variables_3.js | 50 +- search/variables_4.html | 2 +- search/variables_4.js | 31 +- search/variables_5.html | 2 +- search/variables_5.js | 14 +- search/variables_6.html | 2 +- search/variables_6.js | 25 +- search/variables_7.html | 2 +- search/variables_7.js | 27 +- search/variables_8.html | 2 +- search/variables_8.js | 21 +- search/variables_9.html | 2 +- search/variables_9.js | 20 +- search/variables_a.html | 2 +- search/variables_a.js | 25 +- search/variables_b.html | 2 +- search/variables_b.js | 39 +- search/variables_c.html | 2 +- search/variables_c.js | 19 +- search/variables_d.html | 2 +- search/variables_d.js | 6 +- search/variables_e.html | 2 +- search/variables_e.js | 886 +----- search/variables_f.html | 2 +- search/variables_f.js | 884 +++++- settings_8h.html | 23 +- settings_8h__incl.map | 1 + settings_8h__incl.md5 | 2 +- settings_8h__incl.png | Bin 5944 -> 11572 bytes settings_8h_source.html | 125 +- sink__parser_8h.html | 11 +- sink__parser_8h_source.html | 11 +- splitbar.png | Bin 0 -> 314 bytes ...t_a_c_m___f_u_n_c___d_e_s_c_r-members.html | 11 +- struct_a_c_m___f_u_n_c___d_e_s_c_r.html | 11 +- struct_b_a_s_i_c_c_d_b-members.html | 11 +- struct_b_a_s_i_c_c_d_b.html | 11 +- ...g_m_n_t___f_u_n_c___d_e_s_c_r-members.html | 11 +- ...l_l___m_g_m_n_t___f_u_n_c___d_e_s_c_r.html | 11 +- struct_c_d_b10-members.html | 11 +- struct_c_d_b10.html | 11 +- struct_c_d_b12-members.html | 11 +- struct_c_d_b12.html | 11 +- struct_c_d_b6-members.html | 11 +- struct_c_d_b6.html | 11 +- struct_c_d_b___l_b_a32__16-members.html | 11 +- struct_c_d_b___l_b_a32__16.html | 11 +- struct_c_d_b___l_b_a64__16-members.html | 11 +- struct_c_d_b___l_b_a64__16.html | 11 +- ...s_s___n_o_t_i_f_i_c_a_t_i_o_n-members.html | 11 +- ...t_c_l_a_s_s___n_o_t_i_f_i_c_a_t_i_o_n.html | 11 +- struct_capacity-members.html | 11 +- struct_capacity.html | 11 +- struct_command_block_wrapper-members.html | 11 +- struct_command_block_wrapper.html | 43 +- struct_command_block_wrapper__coll__graph.md5 | 2 +- ..._command_block_wrapper__inherit__graph.md5 | 2 +- ...ct_command_block_wrapper_base-members.html | 11 +- struct_command_block_wrapper_base.html | 11 +- ...and_block_wrapper_base__inherit__graph.md5 | 2 +- struct_command_status_wrapper-members.html | 11 +- struct_command_status_wrapper.html | 11 +- struct_ep_info-members.html | 11 +- struct_ep_info.html | 11 +- ...o_r___l_e_n___a_n_d___t_y_p_e-members.html | 11 +- ...r_i_p_t_o_r___l_e_n___a_n_d___t_y_p_e.html | 11 +- struct_hid_item_prefix-members.html | 11 +- struct_hid_item_prefix.html | 11 +- struct_hub_descriptor-members.html | 11 +- struct_hub_descriptor.html | 43 +- struct_hub_event-members.html | 11 +- struct_hub_event.html | 41 +- struct_inquiry_response-members.html | 11 +- struct_inquiry_response.html | 11 +- struct_k_b_d_i_n_f_o-members.html | 11 +- struct_k_b_d_i_n_f_o.html | 51 +- struct_k_b_d_l_e_d_s-members.html | 11 +- struct_k_b_d_l_e_d_s.html | 11 +- struct_l_i_n_e___c_o_d_i_n_g-members.html | 11 +- struct_l_i_n_e___c_o_d_i_n_g.html | 11 +- struct_m_o_d_i_f_i_e_r_k_e_y_s-members.html | 11 +- struct_m_o_d_i_f_i_e_r_k_e_y_s.html | 11 +- struct_m_o_u_s_e_i_n_f_o-members.html | 11 +- struct_m_o_u_s_e_i_n_f_o.html | 35 +- struct_main_item_i_o_feature-members.html | 11 +- struct_main_item_i_o_feature.html | 11 +- struct_multi_value_buffer-members.html | 11 +- struct_multi_value_buffer.html | 11 +- struct_p_s4_data-members.html | 11 +- struct_p_s4_data.html | 11 +- struct_p_s4_data__coll__graph.md5 | 2 +- struct_p_s4_output-members.html | 11 +- struct_p_s4_output.html | 11 +- struct_p_s4_status-members.html | 11 +- struct_p_s4_status.html | 11 +- struct_request_sense_responce-members.html | 11 +- struct_request_sense_responce.html | 11 +- struct_s_e_t_u_p___p_k_t-members.html | 15 +- struct_s_e_t_u_p___p_k_t.html | 89 +- ...n_g_e_r___f_u_n_c___d_e_s_c_r-members.html | 11 +- ...l___r_i_n_g_e_r___f_u_n_c___d_e_s_c_r.html | 11 +- ...t_i_o_n___d_e_s_c_r_i_p_t_o_r-members.html | 11 +- ...g_u_r_a_t_i_o_n___d_e_s_c_r_i_p_t_o_r.html | 11 +- ...v_i_c_e___d_e_s_c_r_i_p_t_o_r-members.html | 11 +- ...b___d_e_v_i_c_e___d_e_s_c_r_i_p_t_o_r.html | 11 +- ...o_i_n_t___d_e_s_c_r_i_p_t_o_r-members.html | 11 +- ...e_n_d_p_o_i_n_t___d_e_s_c_r_i_p_t_o_r.html | 11 +- ...__h_i_d___d_e_s_c_r_i_p_t_o_r-members.html | 11 +- ...t_u_s_b___h_i_d___d_e_s_c_r_i_p_t_o_r.html | 11 +- ...f_a_c_e___d_e_s_c_r_i_p_t_o_r-members.html | 11 +- ...n_t_e_r_f_a_c_e___d_e_s_c_r_i_p_t_o_r.html | 11 +- struct_usb_device-members.html | 11 +- struct_usb_device.html | 11 +- struct_usb_device__coll__graph.md5 | 2 +- struct_usb_device_address-members.html | 11 +- struct_usb_device_address.html | 11 +- structtouchpad_x_y-members.html | 13 +- structtouchpad_x_y.html | 35 +- structtty__features-members.html | 109 + structtty__features.html | 246 ++ union_p_s4_buttons-members.html | 11 +- union_p_s4_buttons.html | 83 +- union_p_s_b_u_z_z_buttons-members.html | 13 +- union_p_s_b_u_z_z_buttons.html | 39 +- usb__ch9_8h.html | 11 +- usb__ch9_8h_source.html | 31 +- usbhost_8h.html | 13 +- usbhost_8h_source.html | 1016 +++---- usbhub_8cpp.html | 11 +- usbhub_8cpp__incl.md5 | 2 +- usbhub_8cpp_source.html | 53 +- usbhub_8h.html | 39 +- usbhub_8h__dep__incl.md5 | 2 +- usbhub_8h__incl.md5 | 2 +- usbhub_8h_source.html | 105 +- version__helper_8h.html | 1645 +++++++++++ version__helper_8h__dep__incl.map | 3 + version__helper_8h__dep__incl.md5 | 1 + version__helper_8h__dep__incl.png | Bin 0 -> 3860 bytes version__helper_8h__incl.map | 2 + version__helper_8h__incl.md5 | 1 + version__helper_8h__incl.png | Bin 0 -> 6395 bytes version__helper_8h_source.html | 332 +++ xbox_enums_8h.html | 13 +- xbox_enums_8h__dep__incl.map | 10 +- xbox_enums_8h__dep__incl.md5 | 2 +- xbox_enums_8h__dep__incl.png | Bin 12455 -> 16125 bytes xbox_enums_8h__incl.md5 | 2 +- xbox_enums_8h_source.html | 11 +- 1046 files changed, 30259 insertions(+), 19797 deletions(-) create mode 100644 _x_b_o_x_o_n_e_8cpp.html create mode 100644 _x_b_o_x_o_n_e_8cpp__incl.map create mode 100644 _x_b_o_x_o_n_e_8cpp__incl.md5 create mode 100644 _x_b_o_x_o_n_e_8cpp__incl.png create mode 100644 _x_b_o_x_o_n_e_8cpp_source.html create mode 100644 _x_b_o_x_o_n_e_8h.html create mode 100644 _x_b_o_x_o_n_e_8h__dep__incl.map create mode 100644 _x_b_o_x_o_n_e_8h__dep__incl.md5 create mode 100644 _x_b_o_x_o_n_e_8h__dep__incl.png create mode 100644 _x_b_o_x_o_n_e_8h__incl.map create mode 100644 _x_b_o_x_o_n_e_8h__incl.md5 create mode 100644 _x_b_o_x_o_n_e_8h__incl.png create mode 100644 _x_b_o_x_o_n_e_8h_source.html create mode 100644 arrowdown.png create mode 100644 arrowright.png create mode 100644 cdc___x_r21_b1411_8cpp.html create mode 100644 cdc___x_r21_b1411_8cpp__incl.map create mode 100644 cdc___x_r21_b1411_8cpp__incl.md5 create mode 100644 cdc___x_r21_b1411_8cpp__incl.png create mode 100644 cdc___x_r21_b1411_8cpp_source.html create mode 100644 cdc___x_r21_b1411_8h.html create mode 100644 cdc___x_r21_b1411_8h__dep__incl.map create mode 100644 cdc___x_r21_b1411_8h__dep__incl.md5 create mode 100644 cdc___x_r21_b1411_8h__dep__incl.png create mode 100644 cdc___x_r21_b1411_8h__incl.map create mode 100644 cdc___x_r21_b1411_8h__incl.md5 create mode 100644 cdc___x_r21_b1411_8h__incl.png create mode 100644 cdc___x_r21_b1411_8h_source.html create mode 100644 class_bluetooth_service__coll__graph.map create mode 100644 class_bluetooth_service__coll__graph.md5 create mode 100644 class_bluetooth_service__coll__graph.png create mode 100644 class_x_b_o_x_o_n_e-members.html create mode 100644 class_x_b_o_x_o_n_e.html create mode 100644 class_x_b_o_x_o_n_e__coll__graph.map create mode 100644 class_x_b_o_x_o_n_e__coll__graph.md5 create mode 100644 class_x_b_o_x_o_n_e__coll__graph.png create mode 100644 class_x_b_o_x_o_n_e__inherit__graph.map create mode 100644 class_x_b_o_x_o_n_e__inherit__graph.md5 create mode 100644 class_x_b_o_x_o_n_e__inherit__graph.png create mode 100644 class_x_r21_b1411-members.html create mode 100644 class_x_r21_b1411.html create mode 100644 class_x_r21_b1411__coll__graph.map create mode 100644 class_x_r21_b1411__coll__graph.md5 create mode 100644 class_x_r21_b1411__coll__graph.png create mode 100644 class_x_r21_b1411__inherit__graph.map create mode 100644 class_x_r21_b1411__inherit__graph.md5 create mode 100644 class_x_r21_b1411__inherit__graph.png create mode 100644 doc.png create mode 100644 folderclosed.png create mode 100644 folderopen.png create mode 100644 functions_a.html create mode 100644 functions_vars_a.html create mode 100644 inherit_graph_54.map create mode 100644 inherit_graph_54.md5 create mode 100644 inherit_graph_54.png create mode 100644 search/files_b.html create mode 100644 search/files_b.js create mode 100644 search/searchdata.js create mode 100644 search/variables_18.html create mode 100644 search/variables_18.js create mode 100644 splitbar.png create mode 100644 structtty__features-members.html create mode 100644 structtty__features.html create mode 100644 version__helper_8h.html create mode 100644 version__helper_8h__dep__incl.map create mode 100644 version__helper_8h__dep__incl.md5 create mode 100644 version__helper_8h__dep__incl.png create mode 100644 version__helper_8h__incl.map create mode 100644 version__helper_8h__incl.md5 create mode 100644 version__helper_8h__incl.png create mode 100644 version__helper_8h_source.html diff --git a/Doxyfile b/Doxyfile index a71d68dc..7b9f483c 100644 --- a/Doxyfile +++ b/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.8.7 +# Doxyfile 1.8.9.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -46,10 +46,10 @@ PROJECT_NUMBER = PROJECT_BRIEF = -# With the PROJECT_LOGO tag one can specify an logo or icon that is included in -# the documentation. The maximum height of the logo should not exceed 55 pixels -# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo -# to the output directory. +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. PROJECT_LOGO = @@ -60,7 +60,7 @@ PROJECT_LOGO = OUTPUT_DIRECTORY = -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where @@ -93,14 +93,14 @@ ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the @@ -145,7 +145,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. @@ -215,9 +215,9 @@ MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a -# new page for each member. If set to NO, the documentation of a member will be -# part of the file/class/namespace that contains it. +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO @@ -286,7 +286,7 @@ OPTIMIZE_OUTPUT_VHDL = NO # instance to make doxygen treat .inc files as Fortran files (default is PHP), # and .f files as C (default is Fortran), use: inc=Fortran f=C. # -# Note For files without extension you can use no_extension as a placeholder. +# Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. @@ -305,8 +305,8 @@ MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES @@ -346,7 +346,7 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first +# tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. @@ -411,7 +411,7 @@ LOOKUP_CACHE_SIZE = 0 # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. @@ -421,35 +421,35 @@ LOOKUP_CACHE_SIZE = 0 EXTRACT_ALL = YES -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local methods, +# This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO only methods in the interface are +# included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. @@ -474,21 +474,21 @@ HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set -# to NO these classes will be included in the various overviews. This option has -# no effect if EXTRACT_ALL is enabled. +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO these declarations will be +# (class|struct|union) declarations. If set to NO, these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO these +# documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. @@ -502,7 +502,7 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES upper-case letters are also +# names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. @@ -511,12 +511,19 @@ INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the +# their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -544,14 +551,14 @@ INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. +# name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that +# name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. @@ -596,27 +603,25 @@ SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = NO -# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the -# todo list. This list is created by putting \todo commands in the -# documentation. +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES -# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the -# test list. This list is created by putting \test commands in the -# documentation. +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. @@ -641,8 +646,8 @@ ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES the list -# will mention the files that were used to generate the documentation. +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES @@ -690,8 +695,7 @@ LAYOUT_FILE = # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. Do not use file names with spaces, bibtex cannot handle them. See -# also \cite for info how to create references. +# search path. See also \cite for info how to create references. CITE_BIB_FILES = @@ -707,7 +711,7 @@ CITE_BIB_FILES = QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. @@ -715,7 +719,7 @@ QUIET = NO WARNINGS = YES -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. @@ -732,8 +736,8 @@ WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO doxygen will only warn about wrong or incomplete parameter -# documentation, but not about the absence of documentation. +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = NO @@ -914,7 +918,7 @@ INPUT_FILTER = FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for +# INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. @@ -974,7 +978,7 @@ REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. @@ -1021,7 +1025,7 @@ USE_HTAGS = NO VERBATIM_HEADERS = YES -# If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # cost of reduced performance. This can be particularly helpful with template # rich C++ code for which doxygen's built-in parser lacks the necessary type @@ -1070,7 +1074,7 @@ IGNORE_PREFIX = # Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES @@ -1132,13 +1136,15 @@ HTML_FOOTER = HTML_STYLESHEET = -# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- -# defined cascading style sheet that is included after the standard style sheets +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefor more robust against future updates. -# Doxygen will copy the style sheet file to the output directory. For an example -# see the documentation. +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = imageStyle.css @@ -1154,7 +1160,7 @@ HTML_EXTRA_STYLESHEET = imageStyle.css HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to +# will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 @@ -1282,28 +1288,28 @@ GENERATE_HTMLHELP = NO CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = -# The GENERATE_CHI flag controls if a separate .chi index file is generated ( -# YES) or that it should be included in the master .chm file ( NO). +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = -# The BINARY_TOC flag controls whether a binary table of contents is generated ( -# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1417,7 +1423,7 @@ DISABLE_INDEX = NO # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has @@ -1445,7 +1451,7 @@ ENUM_VALUES_PER_LINE = 4 TREEVIEW_WIDTH = 250 -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1474,7 +1480,7 @@ FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. @@ -1560,7 +1566,7 @@ SERVER_BASED_SEARCH = NO # external search engine pointed to by the SEARCHENGINE_URL option to obtain the # search results. # -# Doxygen ships with an example indexer ( doxyindexer) and search engine +# Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library # Xapian (see: http://xapian.org/). # @@ -1573,7 +1579,7 @@ EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will return the search results when EXTERNAL_SEARCH is enabled. # -# Doxygen ships with an example indexer ( doxyindexer) and search engine +# Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library # Xapian (see: http://xapian.org/). See the section "External Indexing and # Searching" for details. @@ -1611,7 +1617,7 @@ EXTRA_SEARCH_MAPPINGS = # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output. +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO @@ -1642,7 +1648,7 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1676,23 +1682,36 @@ EXTRA_PACKAGES = # # Note: Only use a user-defined header if you know what you are doing! The # following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will -# replace them by respectively the title of the page, the current date and time, -# only the current date, the version number of doxygen, the project name (see -# PROJECT_NAME), or the project number (see PROJECT_NUMBER). +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty +# string, for the replacement values of the other commands the user is referred +# to HTML_HEADER. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the # generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. +# chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. # # Note: Only use a user-defined footer if you know what you are doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_STYLESHEET = + # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output # directory. Note that the files will be copied as-is; there are no commands or @@ -1710,8 +1729,8 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES to get a +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate +# the PDF file directly from the LaTeX files. Set this option to YES, to get a # higher quality PDF documentation. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1756,7 +1775,7 @@ LATEX_BIB_STYLE = plain # Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The # RTF output is optimized for Word 97 and may not look too pretty with other RTF # readers/editors. # The default value is: NO. @@ -1771,7 +1790,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1808,11 +1827,21 @@ RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code +# with syntax highlighting in the RTF output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_SOURCE_CODE = NO + #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for # classes and files. # The default value is: NO. @@ -1856,7 +1885,7 @@ MAN_LINKS = NO # Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that # captures the structure of the code including all documentation. # The default value is: NO. @@ -1870,7 +1899,7 @@ GENERATE_XML = NO XML_OUTPUT = xml -# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to # the XML output. Note that enabling this will significantly increase the size # of the XML output. @@ -1883,7 +1912,7 @@ XML_PROGRAMLISTING = YES # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- -# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files # that can be used to generate PDF. # The default value is: NO. @@ -1897,14 +1926,23 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO + #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen -# Definitions (see http://autogen.sf.net) file that captures the structure of -# the code including all documentation. Note that this feature is still -# experimental and incomplete at the moment. +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sf.net) file that captures the +# structure of the code including all documentation. Note that this feature is +# still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO @@ -1913,7 +1951,7 @@ GENERATE_AUTOGEN_DEF = NO # Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module # file that captures the structure of the code including all documentation. # # Note that this feature is still experimental and incomplete at the moment. @@ -1921,7 +1959,7 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI # output from the Perl module output. # The default value is: NO. @@ -1929,9 +1967,9 @@ GENERATE_PERLMOD = NO PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely # formatted so it can be parsed by a human reader. This is useful if you want to -# understand what is going on. On the other hand, if this tag is set to NO the +# understand what is going on. On the other hand, if this tag is set to NO, the # size of the Perl module output will be much smaller and Perl will parse it # just the same. # The default value is: YES. @@ -1951,14 +1989,14 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all # C-preprocessor directives found in the sources and include files. # The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names -# in the source code. If set to NO only conditional compilation will be +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. # The default value is: NO. @@ -1974,7 +2012,7 @@ MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES -# If the SEARCH_INCLUDES tag is set to YES the includes files in the +# If the SEARCH_INCLUDES tag is set to YES, the include files in the # INCLUDE_PATH will be searched if a #include is found. # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. @@ -2054,20 +2092,21 @@ TAGFILES = GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES all external class will be listed in the -# class index. If set to NO only the inherited external classes will be listed. +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. # The default value is: NO. ALLEXTERNALS = NO -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in -# the modules index. If set to NO, only the current project's groups will be +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. EXTERNAL_GROUPS = YES -# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in # the related pages index. If set to NO, only the current project's pages will # be listed. # The default value is: YES. @@ -2084,7 +2123,7 @@ PERL_PATH = /usr/bin/perl # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram # (in HTML and LaTeX) for classes with base or super classes. Setting the tag to # NO turns the diagrams off. Note that this option also works with HAVE_DOT # disabled, but it is recommended to install and use dot, since it yields more @@ -2109,7 +2148,7 @@ MSCGEN_PATH = DIA_PATH = -# If set to YES, the inheritance and collaboration graphs will hide inheritance +# If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. @@ -2134,7 +2173,7 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font n the dot files that doxygen +# When you want a differently looking font in the dot files that doxygen # generates you can specify the font name using DOT_FONTNAME. You need to make # sure dot is able to find the font, which can be done by putting it in a # standard location or by setting the DOTFONTPATH environment variable or by @@ -2182,7 +2221,7 @@ COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. # The default value is: NO. @@ -2315,6 +2354,19 @@ MSCFILE_DIRS = DIAFILE_DIRS = +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes # larger than this value, doxygen will truncate the graph, which is visualized @@ -2351,7 +2403,7 @@ MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support # this, this feature is disabled by default. @@ -2368,7 +2420,7 @@ DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot # files that are used to generate the various graphs. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. diff --git a/_b_t_d_8cpp.html b/_b_t_d_8cpp.html index a4e00199..3a0d54f7 100644 --- a/_b_t_d_8cpp.html +++ b/_b_t_d_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -95,7 +96,7 @@ Include dependency graph for BTD.cpp:
- +

Go to the source code of this file.

@@ -104,7 +105,7 @@ Include dependency graph for BTD.cpp: diff --git a/_b_t_d_8cpp__incl.map b/_b_t_d_8cpp__incl.map index 542b27a5..15f4db02 100644 --- a/_b_t_d_8cpp__incl.map +++ b/_b_t_d_8cpp__incl.map @@ -1,4 +1,6 @@ - + + + diff --git a/_b_t_d_8cpp__incl.md5 b/_b_t_d_8cpp__incl.md5 index 93f257b8..b95131f9 100644 --- a/_b_t_d_8cpp__incl.md5 +++ b/_b_t_d_8cpp__incl.md5 @@ -1 +1 @@ -c765cc95de530749422030983e73bab2 \ No newline at end of file +a80eb4feea84cb3fbac6fb00fc2a6647 \ No newline at end of file diff --git a/_b_t_d_8cpp__incl.png b/_b_t_d_8cpp__incl.png index 59f0d439e5ce8de1b527867ac1351b12b353fbfd..55198ee98fb3acbe47eb959e7831e8f609b5594b 100644 GIT binary patch literal 13610 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 XoiSz?;J1z+r~zQ@Ct6J!PBH%lo=c9x diff --git a/_b_t_d_8cpp_source.html b/_b_t_d_8cpp_source.html index 52556a9f..72ff9ce9 100644 --- a/_b_t_d_8cpp_source.html +++ b/_b_t_d_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -148,12 +149,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
57 
58  AddressPool &addrPool = pUsb->GetAddressPool(); // Get memory address of USB device address pool
59 #ifdef EXTRADEBUG
-
60  Notify(PSTR("\r\nBTD ConfigureDevice"), 0x80);
+
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);
+
65  Notify(PSTR("\r\nAddress in use"), 0x80);
66 #endif
68  }
@@ -161,14 +162,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
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);
+
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);
+
80  Notify(PSTR("\r\nepinfo is null"), 0x80);
81 #endif
83  }
@@ -187,7 +188,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
96 
97  if(!bAddress) {
98 #ifdef DEBUG_USB_HOST
-
99  Notify(PSTR("\r\nOut of address space"), 0x80);
+
99  Notify(PSTR("\r\nOut of address space"), 0x80);
100 #endif
102  }
@@ -217,13 +218,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
126 
127  AddressPool &addrPool = pUsb->GetAddressPool();
128 #ifdef EXTRADEBUG
-
129  Notify(PSTR("\r\nBTD Init"), 0x80);
+
129  Notify(PSTR("\r\nBTD Init"), 0x80);
130 #endif
131  UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
132 
133  if(!p) {
134 #ifdef DEBUG_USB_HOST
-
135  Notify(PSTR("\r\nAddress not found"), 0x80);
+
135  Notify(PSTR("\r\nAddress not found"), 0x80);
136 #endif
138  }
@@ -233,14 +234,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
142  rcode = pUsb->setAddr(0, 0, bAddress); // Assign new address to the device
143  if(rcode) {
144 #ifdef DEBUG_USB_HOST
-
145  Notify(PSTR("\r\nsetAddr: "), 0x80);
+
145  Notify(PSTR("\r\nsetAddr: "), 0x80);
146  D_PrintHex<uint8_t > (rcode, 0x80);
147 #endif
148  p->lowspeed = false;
149  goto Fail;
150  }
151 #ifdef EXTRADEBUG
-
152  Notify(PSTR("\r\nAddr: "), 0x80);
+
152  Notify(PSTR("\r\nAddr: "), 0x80);
153  D_PrintHex<uint8_t > (bAddress, 0x80);
154 #endif
155 
@@ -249,7 +250,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
158  p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
159  if(!p) {
160 #ifdef DEBUG_USB_HOST
-
161  Notify(PSTR("\r\nAddress not found"), 0x80);
+
161  Notify(PSTR("\r\nAddress not found"), 0x80);
162 #endif
164  }
@@ -269,16 +270,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
178 #ifdef DEBUG_USB_HOST
179  if(PID == PS3_PID || PID == PS3NAVIGATION_PID) {
180  if(PID == PS3_PID)
-
181  Notify(PSTR("\r\nDualshock 3 Controller Connected"), 0x80);
+
181  Notify(PSTR("\r\nDualshock 3 Controller Connected"), 0x80);
182  else // It must be a navigation controller
-
183  Notify(PSTR("\r\nNavigation Controller Connected"), 0x80);
+
183  Notify(PSTR("\r\nNavigation Controller Connected"), 0x80);
184  } else // It must be a Motion controller
-
185  Notify(PSTR("\r\nMotion Controller Connected"), 0x80);
+
185  Notify(PSTR("\r\nMotion Controller Connected"), 0x80);
186 #endif
187 
188  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) {
189 #ifdef DEBUG_USB_HOST
-
190  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);
+
190  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);
191 #endif
192  } else {
193  if(PID == PS3_PID || PID == PS3NAVIGATION_PID)
@@ -286,10 +287,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
195  else
196  setMoveBdaddr(my_bdaddr); // Set internal Bluetooth address
197 #ifdef DEBUG_USB_HOST
-
198  Notify(PSTR("\r\nBluetooth Address was set to: "), 0x80);
+
198  Notify(PSTR("\r\nBluetooth Address was set to: "), 0x80);
199  for(int8_t i = 5; i > 0; i--) {
200  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
-
201  Notify(PSTR(":"), 0x80);
+
201  Notify(PSTR(":"), 0x80);
202  }
203  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
204 #endif
@@ -337,7 +338,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
246  bPollEnable = true;
247 
248 #ifdef DEBUG_USB_HOST
-
249  Notify(PSTR("\r\nBluetooth Dongle Initialized"), 0x80);
+
249  Notify(PSTR("\r\nBluetooth Dongle Initialized"), 0x80);
250 #endif
251  }
252  return 0; // Successful configuration
@@ -369,7 +370,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
279 Fail:
280 #ifdef DEBUG_USB_HOST
-
281  Notify(PSTR("\r\nBTD Init Failed, error code: "), 0x80);
+
281  Notify(PSTR("\r\nBTD Init Failed, error code: "), 0x80);
282  NotifyFail(rcode);
283 #endif
284  Release();
@@ -386,7 +387,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
295  }
296  for(i = 0; i < BTD_NUM_SERVICES; i++) {
297  if(btService[i])
-
298  btService[i]->Reset(); // Reset all Bluetooth services
+
298  btService[i]->Reset(); // Reset all Bluetooth services
299  }
300 
301  connectToWii = false;
@@ -436,18 +437,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
345 
347 #ifdef EXTRADEBUG
-
348  Notify(PSTR("\r\nEndpoint descriptor:"), 0x80);
-
349  Notify(PSTR("\r\nLength:\t\t"), 0x80);
+
348  Notify(PSTR("\r\nEndpoint descriptor:"), 0x80);
+
349  Notify(PSTR("\r\nLength:\t\t"), 0x80);
350  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
-
351  Notify(PSTR("\r\nType:\t\t"), 0x80);
+
351  Notify(PSTR("\r\nType:\t\t"), 0x80);
352  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
-
353  Notify(PSTR("\r\nAddress:\t"), 0x80);
+
353  Notify(PSTR("\r\nAddress:\t"), 0x80);
354  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
-
355  Notify(PSTR("\r\nAttributes:\t"), 0x80);
+
355  Notify(PSTR("\r\nAttributes:\t"), 0x80);
356  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
-
357  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
+
357  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
358  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
-
359  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
+
359  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
360  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
361 #endif
362 }
@@ -471,1177 +472,1188 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
380  return 0;
381 }
382 
-
383 void BTD::HCI_event_task() {
-
384  uint16_t length = BULK_MAXPKTSIZE; // Request more than 16 bytes anyway, the inTransfer routine will take care of this
-
385  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_EVENT_PIPE ].epAddr, &length, hcibuf); // Input on endpoint 1
-
386 
-
387  if(!rcode || rcode == hrNAK) { // Check for errors
-
388  switch(hcibuf[0]) { // Switch on event type
-
389  case EV_COMMAND_COMPLETE:
-
390  if(!hcibuf[5]) { // Check if command succeeded
-
391  hci_set_flag(HCI_FLAG_CMD_COMPLETE); // Set command complete flag
-
392  if((hcibuf[3] == 0x01) && (hcibuf[4] == 0x10)) { // Parameters from read local version information
-
393  hci_version = hcibuf[6]; // Used to check if it supports 2.0+EDR - see http://www.bluetooth.org/Technical/AssignedNumbers/hci.htm
- -
395  } else if((hcibuf[3] == 0x09) && (hcibuf[4] == 0x10)) { // Parameters from read local bluetooth address
-
396  for(uint8_t i = 0; i < 6; i++)
-
397  my_bdaddr[i] = hcibuf[6 + i];
- -
399  }
-
400  }
-
401  break;
-
402 
-
403  case EV_COMMAND_STATUS:
-
404  if(hcibuf[2]) { // Show status on serial if not OK
-
405 #ifdef DEBUG_USB_HOST
-
406  Notify(PSTR("\r\nHCI Command Failed: "), 0x80);
-
407  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
-
408 #endif
-
409  }
-
410  break;
-
411 
-
412  case EV_INQUIRY_COMPLETE:
-
413  if(inquiry_counter >= 5 && (pairWithWii || pairWithHIDDevice)) {
-
414  inquiry_counter = 0;
-
415 #ifdef DEBUG_USB_HOST
-
416  if(pairWithWii)
-
417  Notify(PSTR("\r\nCouldn't find Wiimote"), 0x80);
-
418  else
-
419  Notify(PSTR("\r\nCouldn't find HID device"), 0x80);
-
420 #endif
-
421  connectToWii = false;
-
422  pairWithWii = false;
-
423  connectToHIDDevice = false;
-
424  pairWithHIDDevice = false;
-
425  hci_state = HCI_SCANNING_STATE;
-
426  }
-
427  inquiry_counter++;
-
428  break;
-
429 
-
430  case EV_INQUIRY_RESULT:
-
431  if(hcibuf[2]) { // Check that there is more than zero responses
-
432 #ifdef EXTRADEBUG
-
433  Notify(PSTR("\r\nNumber of responses: "), 0x80);
-
434  Notify(hcibuf[2], 0x80);
-
435 #endif
-
436  for(uint8_t i = 0; i < hcibuf[2]; i++) {
-
437  uint8_t offset = 8 * hcibuf[2] + 3 * i;
-
438 
-
439  for(uint8_t j = 0; j < 3; j++)
-
440  classOfDevice[j] = hcibuf[j + 4 + offset];
-
441 
-
442  if(pairWithWii && classOfDevice[2] == 0x00 && (classOfDevice[1] & 0x05) && (classOfDevice[0] & 0x0C)) { // See http://wiibrew.org/wiki/Wiimote#SDP_information
-
443  if(classOfDevice[0] & 0x08) // Check if it's the new Wiimote with motion plus inside that was detected
-
444  motionPlusInside = true;
-
445  else
-
446  motionPlusInside = false;
+ +
384  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
+
385  if(btService[i])
+
386  btService[i]->disconnect();
+
387 };
+
388 
+
389 void BTD::HCI_event_task() {
+
390  uint16_t length = BULK_MAXPKTSIZE; // Request more than 16 bytes anyway, the inTransfer routine will take care of this
+
391  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_EVENT_PIPE ].epAddr, &length, hcibuf); // Input on endpoint 1
+
392 
+
393  if(!rcode || rcode == hrNAK) { // Check for errors
+
394  switch(hcibuf[0]) { // Switch on event type
+
395  case EV_COMMAND_COMPLETE:
+
396  if(!hcibuf[5]) { // Check if command succeeded
+
397  hci_set_flag(HCI_FLAG_CMD_COMPLETE); // Set command complete flag
+
398  if((hcibuf[3] == 0x01) && (hcibuf[4] == 0x10)) { // Parameters from read local version information
+
399  hci_version = hcibuf[6]; // Used to check if it supports 2.0+EDR - see http://www.bluetooth.org/Technical/AssignedNumbers/hci.htm
+ +
401  } else if((hcibuf[3] == 0x09) && (hcibuf[4] == 0x10)) { // Parameters from read local bluetooth address
+
402  for(uint8_t i = 0; i < 6; i++)
+
403  my_bdaddr[i] = hcibuf[6 + i];
+ +
405  }
+
406  }
+
407  break;
+
408 
+
409  case EV_COMMAND_STATUS:
+
410  if(hcibuf[2]) { // Show status on serial if not OK
+
411 #ifdef DEBUG_USB_HOST
+
412  Notify(PSTR("\r\nHCI Command Failed: "), 0x80);
+
413  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
+
414 #endif
+
415  }
+
416  break;
+
417 
+
418  case EV_INQUIRY_COMPLETE:
+
419  if(inquiry_counter >= 5 && (pairWithWii || pairWithHIDDevice)) {
+
420  inquiry_counter = 0;
+
421 #ifdef DEBUG_USB_HOST
+
422  if(pairWithWii)
+
423  Notify(PSTR("\r\nCouldn't find Wiimote"), 0x80);
+
424  else
+
425  Notify(PSTR("\r\nCouldn't find HID device"), 0x80);
+
426 #endif
+
427  connectToWii = false;
+
428  pairWithWii = false;
+
429  connectToHIDDevice = false;
+
430  pairWithHIDDevice = false;
+
431  hci_state = HCI_SCANNING_STATE;
+
432  }
+
433  inquiry_counter++;
+
434  break;
+
435 
+
436  case EV_INQUIRY_RESULT:
+
437  if(hcibuf[2]) { // Check that there is more than zero responses
+
438 #ifdef EXTRADEBUG
+
439  Notify(PSTR("\r\nNumber of responses: "), 0x80);
+
440  Notify(hcibuf[2], 0x80);
+
441 #endif
+
442  for(uint8_t i = 0; i < hcibuf[2]; i++) {
+
443  uint8_t offset = 8 * hcibuf[2] + 3 * i;
+
444 
+
445  for(uint8_t j = 0; j < 3; j++)
+
446  classOfDevice[j] = hcibuf[j + 4 + offset];
447 
-
448  for(uint8_t j = 0; j < 6; j++)
-
449  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
-
450 
- -
452  break;
-
453  } 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
-
454 #ifdef DEBUG_USB_HOST
-
455  if(classOfDevice[0] & 0x80)
-
456  Notify(PSTR("\r\nMouse found"), 0x80);
-
457  if(classOfDevice[0] & 0x40)
-
458  Notify(PSTR("\r\nKeyboard found"), 0x80);
-
459  if(classOfDevice[0] & 0x08)
-
460  Notify(PSTR("\r\nGamepad found"), 0x80);
-
461 #endif
-
462 
-
463  for(uint8_t j = 0; j < 6; j++)
-
464  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
-
465 
- -
467  }
-
468 #ifdef EXTRADEBUG
-
469  else {
-
470  Notify(PSTR("\r\nClass of device: "), 0x80);
-
471  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
-
472  Notify(PSTR(" "), 0x80);
-
473  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
-
474  Notify(PSTR(" "), 0x80);
-
475  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
-
476  }
-
477 #endif
-
478  }
-
479  }
-
480  break;
-
481 
-
482  case EV_CONNECT_COMPLETE:
- -
484  if(!hcibuf[2]) { // Check if connected OK
-
485 #ifdef EXTRADEBUG
-
486  Notify(PSTR("\r\nConnection established"), 0x80);
-
487 #endif
-
488  hci_handle = hcibuf[3] | ((hcibuf[4] & 0x0F) << 8); // Store the handle for the ACL connection
-
489  hci_set_flag(HCI_FLAG_CONNECT_COMPLETE); // Set connection complete flag
-
490  } else {
-
491  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
492 #ifdef DEBUG_USB_HOST
-
493  Notify(PSTR("\r\nConnection Failed: "), 0x80);
-
494  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
-
495 #endif
-
496  }
-
497  break;
-
498 
- -
500  if(!hcibuf[2]) { // Check if disconnected OK
-
501  hci_set_flag(HCI_FLAG_DISCONNECT_COMPLETE); // Set disconnect command complete flag
-
502  hci_clear_flag(HCI_FLAG_CONNECT_COMPLETE); // Clear connection complete flag
+
448  if(pairWithWii && classOfDevice[2] == 0x00 && (classOfDevice[1] & 0x05) && (classOfDevice[0] & 0x0C)) { // See http://wiibrew.org/wiki/Wiimote#SDP_information
+
449  if(classOfDevice[0] & 0x08) // Check if it's the new Wiimote with motion plus inside that was detected
+
450  motionPlusInside = true;
+
451  else
+
452  motionPlusInside = false;
+
453 
+
454  for(uint8_t j = 0; j < 6; j++)
+
455  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
+
456 
+ +
458  break;
+
459  } 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
+
460 #ifdef DEBUG_USB_HOST
+
461  if(classOfDevice[0] & 0x80)
+
462  Notify(PSTR("\r\nMouse found"), 0x80);
+
463  if(classOfDevice[0] & 0x40)
+
464  Notify(PSTR("\r\nKeyboard found"), 0x80);
+
465  if(classOfDevice[0] & 0x08)
+
466  Notify(PSTR("\r\nGamepad found"), 0x80);
+
467 #endif
+
468 
+
469  for(uint8_t j = 0; j < 6; j++)
+
470  disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
+
471 
+ +
473  break;
+
474  }
+
475 #ifdef EXTRADEBUG
+
476  else {
+
477  Notify(PSTR("\r\nClass of device: "), 0x80);
+
478  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
+
479  Notify(PSTR(" "), 0x80);
+
480  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
+
481  Notify(PSTR(" "), 0x80);
+
482  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
+
483  }
+
484 #endif
+
485  }
+
486  }
+
487  break;
+
488 
+
489  case EV_CONNECT_COMPLETE:
+ +
491  if(!hcibuf[2]) { // Check if connected OK
+
492 #ifdef EXTRADEBUG
+
493  Notify(PSTR("\r\nConnection established"), 0x80);
+
494 #endif
+
495  hci_handle = hcibuf[3] | ((hcibuf[4] & 0x0F) << 8); // Store the handle for the ACL connection
+
496  hci_set_flag(HCI_FLAG_CONNECT_COMPLETE); // Set connection complete flag
+
497  } else {
+
498  hci_state = HCI_CHECK_DEVICE_SERVICE;
+
499 #ifdef DEBUG_USB_HOST
+
500  Notify(PSTR("\r\nConnection Failed: "), 0x80);
+
501  D_PrintHex<uint8_t > (hcibuf[2], 0x80);
+
502 #endif
503  }
504  break;
505 
- -
507  if(!hcibuf[2]) { // Check if reading is OK
-
508  for(uint8_t i = 0; i < min(sizeof (remote_name), sizeof (hcibuf) - 9); i++) {
-
509  remote_name[i] = hcibuf[9 + i];
-
510  if(remote_name[i] == '\0') // End of string
-
511  break;
-
512  }
- -
514  }
-
515  break;
-
516 
-
517  case EV_INCOMING_CONNECT:
-
518  for(uint8_t i = 0; i < 6; i++)
-
519  disc_bdaddr[i] = hcibuf[i + 2];
-
520 
-
521  for(uint8_t i = 0; i < 3; i++)
-
522  classOfDevice[i] = hcibuf[i + 8];
-
523 
-
524  if((classOfDevice[1] & 0x05) && (classOfDevice[0] & 0xC8)) { // Check if it is a mouse, keyboard or a gamepad
-
525 #ifdef DEBUG_USB_HOST
-
526  if(classOfDevice[0] & 0x80)
-
527  Notify(PSTR("\r\nMouse is connecting"), 0x80);
-
528  if(classOfDevice[0] & 0x40)
-
529  Notify(PSTR("\r\nKeyboard is connecting"), 0x80);
-
530  if(classOfDevice[0] & 0x08)
-
531  Notify(PSTR("\r\nGamepad is connecting"), 0x80);
-
532 #endif
-
533  incomingHIDDevice = true;
-
534  }
-
535 
-
536 #ifdef EXTRADEBUG
-
537  Notify(PSTR("\r\nClass of device: "), 0x80);
-
538  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
-
539  Notify(PSTR(" "), 0x80);
-
540  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
-
541  Notify(PSTR(" "), 0x80);
-
542  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
-
543 #endif
- -
545  break;
-
546 
-
547  case EV_PIN_CODE_REQUEST:
-
548  if(pairWithWii) {
-
549 #ifdef DEBUG_USB_HOST
-
550  Notify(PSTR("\r\nPairing with wiimote"), 0x80);
+ +
507  if(!hcibuf[2]) { // Check if disconnected OK
+
508  hci_set_flag(HCI_FLAG_DISCONNECT_COMPLETE); // Set disconnect command complete flag
+
509  hci_clear_flag(HCI_FLAG_CONNECT_COMPLETE); // Clear connection complete flag
+
510  }
+
511  break;
+
512 
+ +
514  if(!hcibuf[2]) { // Check if reading is OK
+
515  for(uint8_t i = 0; i < min(sizeof (remote_name), sizeof (hcibuf) - 9); i++) {
+
516  remote_name[i] = hcibuf[9 + i];
+
517  if(remote_name[i] == '\0') // End of string
+
518  break;
+
519  }
+
520  // TODO: Altid sæt '\0' i remote name!
+ +
522  }
+
523  break;
+
524 
+
525  case EV_INCOMING_CONNECT:
+
526  for(uint8_t i = 0; i < 6; i++)
+
527  disc_bdaddr[i] = hcibuf[i + 2];
+
528 
+
529  for(uint8_t i = 0; i < 3; i++)
+
530  classOfDevice[i] = hcibuf[i + 8];
+
531 
+
532  if((classOfDevice[1] & 0x05) && (classOfDevice[0] & 0xC8)) { // Check if it is a mouse, keyboard or a gamepad
+
533 #ifdef DEBUG_USB_HOST
+
534  if(classOfDevice[0] & 0x80)
+
535  Notify(PSTR("\r\nMouse is connecting"), 0x80);
+
536  if(classOfDevice[0] & 0x40)
+
537  Notify(PSTR("\r\nKeyboard is connecting"), 0x80);
+
538  if(classOfDevice[0] & 0x08)
+
539  Notify(PSTR("\r\nGamepad is connecting"), 0x80);
+
540 #endif
+
541  incomingHIDDevice = true;
+
542  }
+
543 
+
544 #ifdef EXTRADEBUG
+
545  Notify(PSTR("\r\nClass of device: "), 0x80);
+
546  D_PrintHex<uint8_t > (classOfDevice[2], 0x80);
+
547  Notify(PSTR(" "), 0x80);
+
548  D_PrintHex<uint8_t > (classOfDevice[1], 0x80);
+
549  Notify(PSTR(" "), 0x80);
+
550  D_PrintHex<uint8_t > (classOfDevice[0], 0x80);
551 #endif
- -
553  } else if(btdPin != NULL) {
-
554 #ifdef DEBUG_USB_HOST
-
555  Notify(PSTR("\r\nBluetooth pin is set too: "), 0x80);
-
556  NotifyStr(btdPin, 0x80);
-
557 #endif
- -
559  } else {
-
560 #ifdef DEBUG_USB_HOST
-
561  Notify(PSTR("\r\nNo pin was set"), 0x80);
-
562 #endif
- -
564  }
-
565  break;
-
566 
-
567  case EV_LINK_KEY_REQUEST:
+ +
553  break;
+
554 
+
555  case EV_PIN_CODE_REQUEST:
+
556  if(pairWithWii) {
+
557 #ifdef DEBUG_USB_HOST
+
558  Notify(PSTR("\r\nPairing with wiimote"), 0x80);
+
559 #endif
+ +
561  } else if(btdPin != NULL) {
+
562 #ifdef DEBUG_USB_HOST
+
563  Notify(PSTR("\r\nBluetooth pin is set too: "), 0x80);
+
564  NotifyStr(btdPin, 0x80);
+
565 #endif
+ +
567  } else {
568 #ifdef DEBUG_USB_HOST
-
569  Notify(PSTR("\r\nReceived Key Request"), 0x80);
+
569  Notify(PSTR("\r\nNo pin was set"), 0x80);
570 #endif
- -
572  break;
-
573 
- -
575  if(pairWithWii && !connectToWii) {
+ +
572  }
+
573  break;
+
574 
+
575  case EV_LINK_KEY_REQUEST:
576 #ifdef DEBUG_USB_HOST
-
577  Notify(PSTR("\r\nPairing successful with Wiimote"), 0x80);
+
577  Notify(PSTR("\r\nReceived Key Request"), 0x80);
578 #endif
-
579  connectToWii = true; // Used to indicate to the Wii service, that it should connect to this device
-
580  } else if(pairWithHIDDevice && !connectToHIDDevice) {
-
581 #ifdef DEBUG_USB_HOST
-
582  Notify(PSTR("\r\nPairing successful with HID device"), 0x80);
-
583 #endif
-
584  connectToHIDDevice = true; // Used to indicate to the BTHID service, that it should connect to this device
-
585  }
-
586  break;
-
587  /* We will just ignore the following events */
-
588  case EV_NUM_COMPLETE_PKT:
-
589  case EV_ROLE_CHANGED:
- -
591  case EV_LOOPBACK_COMMAND:
- - -
594  case EV_MAX_SLOTS_CHANGE:
- - - - -
599  break;
-
600 #ifdef EXTRADEBUG
-
601  default:
-
602  if(hcibuf[0] != 0x00) {
-
603  Notify(PSTR("\r\nUnmanaged HCI Event: "), 0x80);
-
604  D_PrintHex<uint8_t > (hcibuf[0], 0x80);
-
605  }
-
606  break;
-
607 #endif
-
608  } // Switch
-
609  }
-
610 #ifdef EXTRADEBUG
-
611  else {
-
612  Notify(PSTR("\r\nHCI event error: "), 0x80);
-
613  D_PrintHex<uint8_t > (rcode, 0x80);
-
614  }
+ +
580  break;
+
581 
+ +
583  if(pairWithWii && !connectToWii) {
+
584 #ifdef DEBUG_USB_HOST
+
585  Notify(PSTR("\r\nPairing successful with Wiimote"), 0x80);
+
586 #endif
+
587  connectToWii = true; // Used to indicate to the Wii service, that it should connect to this device
+
588  } else if(pairWithHIDDevice && !connectToHIDDevice) {
+
589 #ifdef DEBUG_USB_HOST
+
590  Notify(PSTR("\r\nPairing successful with HID device"), 0x80);
+
591 #endif
+
592  connectToHIDDevice = true; // Used to indicate to the BTHID service, that it should connect to this device
+
593  }
+
594  break;
+
595  /* We will just ignore the following events */
+
596  case EV_NUM_COMPLETE_PKT:
+
597  case EV_ROLE_CHANGED:
+ +
599  case EV_LOOPBACK_COMMAND:
+ + +
602  case EV_MAX_SLOTS_CHANGE:
+ + + + +
607  break;
+
608 #ifdef EXTRADEBUG
+
609  default:
+
610  if(hcibuf[0] != 0x00) {
+
611  Notify(PSTR("\r\nUnmanaged HCI Event: "), 0x80);
+
612  D_PrintHex<uint8_t > (hcibuf[0], 0x80);
+
613  }
+
614  break;
615 #endif
-
616 }
-
617 
-
618 /* Poll Bluetooth and print result */
-
619 void BTD::HCI_task() {
-
620  switch(hci_state) {
-
621  case HCI_INIT_STATE:
-
622  hci_counter++;
-
623  if(hci_counter > hci_num_reset_loops) { // wait until we have looped x times to clear any old events
-
624  hci_reset();
-
625  hci_state = HCI_RESET_STATE;
-
626  hci_counter = 0;
-
627  }
-
628  break;
-
629 
-
630  case HCI_RESET_STATE:
-
631  hci_counter++;
- -
633  hci_counter = 0;
-
634 #ifdef DEBUG_USB_HOST
-
635  Notify(PSTR("\r\nHCI Reset complete"), 0x80);
-
636 #endif
-
637  hci_state = HCI_CLASS_STATE;
- -
639  } else if(hci_counter > hci_num_reset_loops) {
-
640  hci_num_reset_loops *= 10;
-
641  if(hci_num_reset_loops > 2000)
-
642  hci_num_reset_loops = 2000;
-
643 #ifdef DEBUG_USB_HOST
-
644  Notify(PSTR("\r\nNo response to HCI Reset"), 0x80);
-
645 #endif
-
646  hci_state = HCI_INIT_STATE;
-
647  hci_counter = 0;
-
648  }
-
649  break;
-
650 
-
651  case HCI_CLASS_STATE:
- -
653 #ifdef DEBUG_USB_HOST
-
654  Notify(PSTR("\r\nWrite class of device"), 0x80);
-
655 #endif
-
656  hci_state = HCI_BDADDR_STATE;
-
657  hci_read_bdaddr();
-
658  }
-
659  break;
-
660 
-
661  case HCI_BDADDR_STATE:
- -
663 #ifdef DEBUG_USB_HOST
-
664  Notify(PSTR("\r\nLocal Bluetooth Address: "), 0x80);
-
665  for(int8_t i = 5; i > 0; i--) {
-
666  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
-
667  Notify(PSTR(":"), 0x80);
-
668  }
-
669  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
-
670 #endif
- -
672  hci_state = HCI_LOCAL_VERSION_STATE;
-
673  }
-
674  break;
-
675 
-
676  case HCI_LOCAL_VERSION_STATE: // The local version is used by the PS3BT class
- -
678  if(btdName != NULL) {
- -
680  hci_state = HCI_SET_NAME_STATE;
-
681  } else
-
682  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
683  }
-
684  break;
-
685 
-
686  case HCI_SET_NAME_STATE:
- -
688 #ifdef DEBUG_USB_HOST
-
689  Notify(PSTR("\r\nThe name is set to: "), 0x80);
-
690  NotifyStr(btdName, 0x80);
-
691 #endif
-
692  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
693  }
-
694  break;
-
695 
- -
697  if(pairWithHIDDevice || pairWithWii) { // Check if it should try to connect to a Wiimote
-
698 #ifdef DEBUG_USB_HOST
-
699  if(pairWithWii)
-
700  Notify(PSTR("\r\nStarting inquiry\r\nPress 1 & 2 on the Wiimote\r\nOr press sync if you are using a Wii U Pro Controller"), 0x80);
-
701  else
-
702  Notify(PSTR("\r\nPlease enable discovery of your device"), 0x80);
-
703 #endif
-
704  hci_inquiry();
-
705  hci_state = HCI_INQUIRY_STATE;
-
706  } else
-
707  hci_state = HCI_SCANNING_STATE; // Don't try to connect to a Wiimote
-
708  break;
-
709 
-
710  case HCI_INQUIRY_STATE:
- -
712  hci_inquiry_cancel(); // Stop inquiry
-
713 #ifdef DEBUG_USB_HOST
-
714  if(pairWithWii)
-
715  Notify(PSTR("\r\nWiimote found"), 0x80);
-
716  else
-
717  Notify(PSTR("\r\nHID device found"), 0x80);
-
718 
-
719  Notify(PSTR("\r\nNow just create the instance like so:"), 0x80);
-
720  if(pairWithWii)
-
721  Notify(PSTR("\r\nWII Wii(&Btd);"), 0x80);
-
722  else
-
723  Notify(PSTR("\r\nBTHID bthid(&Btd);"), 0x80);
-
724 
-
725  Notify(PSTR("\r\nAnd then press any button on the "), 0x80);
-
726  if(pairWithWii)
-
727  Notify(PSTR("Wiimote"), 0x80);
-
728  else
-
729  Notify(PSTR("device"), 0x80);
-
730 #endif
-
731  if(motionPlusInside) {
-
732  hci_remote_name(); // We need to know the name to distinguish between a Wiimote and a Wii U Pro Controller
-
733  hci_state = HCI_REMOTE_NAME_STATE;
-
734  } else
-
735  hci_state = HCI_CONNECT_DEVICE_STATE;
-
736  }
-
737  break;
-
738 
- - -
741 #ifdef DEBUG_USB_HOST
-
742  if(pairWithWii)
-
743  Notify(PSTR("\r\nConnecting to Wiimote"), 0x80);
-
744  else
-
745  Notify(PSTR("\r\nConnecting to HID device"), 0x80);
-
746 #endif
-
747  hci_connect();
-
748  hci_state = HCI_CONNECTED_DEVICE_STATE;
-
749  }
-
750  break;
-
751 
- - - -
755 #ifdef DEBUG_USB_HOST
-
756  if(pairWithWii)
-
757  Notify(PSTR("\r\nConnected to Wiimote"), 0x80);
-
758  else
-
759  Notify(PSTR("\r\nConnected to HID device"), 0x80);
-
760 #endif
-
761  hci_authentication_request(); // This will start the pairing with the Wiimote
-
762  hci_state = HCI_SCANNING_STATE;
-
763  } else {
-
764 #ifdef DEBUG_USB_HOST
-
765  Notify(PSTR("\r\nTrying to connect one more time..."), 0x80);
-
766 #endif
-
767  hci_connect(); // Try to connect one more time
-
768  }
-
769  }
-
770  break;
-
771 
-
772  case HCI_SCANNING_STATE:
- -
774 #ifdef DEBUG_USB_HOST
-
775  Notify(PSTR("\r\nWait For Incoming Connection Request"), 0x80);
-
776 #endif
- -
778  watingForConnection = true;
-
779  hci_state = HCI_CONNECT_IN_STATE;
-
780  }
-
781  break;
-
782 
- - -
785  watingForConnection = false;
-
786 #ifdef DEBUG_USB_HOST
-
787  Notify(PSTR("\r\nIncoming Connection Request"), 0x80);
-
788 #endif
-
789  hci_remote_name();
-
790  hci_state = HCI_REMOTE_NAME_STATE;
- -
792  hci_state = HCI_DISCONNECT_STATE;
-
793  break;
-
794 
- - -
797 #ifdef DEBUG_USB_HOST
-
798  Notify(PSTR("\r\nRemote Name: "), 0x80);
-
799  for(uint8_t i = 0; i < strlen(remote_name); i++)
-
800  Notifyc(remote_name[i], 0x80);
-
801 #endif
-
802  if(strncmp((const char*)remote_name, "Nintendo", 8) == 0) {
-
803  incomingWii = true;
-
804 #ifdef DEBUG_USB_HOST
-
805  Notify(PSTR("\r\nWiimote is connecting"), 0x80);
-
806 #endif
-
807  if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-TR", 22) == 0) {
-
808 #ifdef DEBUG_USB_HOST
-
809  Notify(PSTR(" with Motion Plus Inside"), 0x80);
-
810 #endif
-
811  motionPlusInside = true;
-
812  } else if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-UC", 22) == 0) {
-
813 #ifdef DEBUG_USB_HOST
-
814  Notify(PSTR(" - Wii U Pro Controller"), 0x80);
-
815 #endif
-
816  motionPlusInside = true;
-
817  wiiUProController = true;
-
818  } else {
-
819  motionPlusInside = false;
-
820  wiiUProController = false;
-
821  }
-
822  }
-
823  if(classOfDevice[2] == 0 && classOfDevice[1] == 0x25 && classOfDevice[0] == 0x08 && strncmp((const char*)remote_name, "Wireless Controller", 19) == 0) {
-
824 #ifdef DEBUG_USB_HOST
-
825  Notify(PSTR("\r\nPS4 controller is connecting"), 0x80);
-
826 #endif
-
827  incomingPS4 = true;
-
828  }
- -
830  hci_state = HCI_CONNECT_DEVICE_STATE;
-
831  else {
- -
833  hci_state = HCI_CONNECTED_STATE;
-
834  }
-
835  }
-
836  break;
-
837 
-
838  case HCI_CONNECTED_STATE:
- -
840 #ifdef DEBUG_USB_HOST
-
841  Notify(PSTR("\r\nConnected to Device: "), 0x80);
-
842  for(int8_t i = 5; i > 0; i--) {
-
843  D_PrintHex<uint8_t > (disc_bdaddr[i], 0x80);
-
844  Notify(PSTR(":"), 0x80);
-
845  }
-
846  D_PrintHex<uint8_t > (disc_bdaddr[0], 0x80);
-
847 #endif
-
848  if(incomingPS4)
-
849  connectToHIDDevice = true; // We should always connect to the PS4 controller
-
850 
-
851  // Clear these flags for a new connection
-
852  l2capConnectionClaimed = false;
-
853  sdpConnectionClaimed = false;
-
854  rfcommConnectionClaimed = false;
-
855 
-
856  hci_event_flag = 0;
-
857  hci_state = HCI_DONE_STATE;
-
858  }
-
859  break;
-
860 
-
861  case HCI_DONE_STATE:
-
862  hci_counter++;
-
863  if(hci_counter > 1000) { // Wait until we have looped 1000 times to make sure that the L2CAP connection has been started
-
864  hci_counter = 0;
-
865  hci_state = HCI_SCANNING_STATE;
+
616  } // Switch
+
617  }
+
618 #ifdef EXTRADEBUG
+
619  else {
+
620  Notify(PSTR("\r\nHCI event error: "), 0x80);
+
621  D_PrintHex<uint8_t > (rcode, 0x80);
+
622  }
+
623 #endif
+
624 }
+
625 
+
626 /* Poll Bluetooth and print result */
+
627 void BTD::HCI_task() {
+
628  switch(hci_state) {
+
629  case HCI_INIT_STATE:
+
630  hci_counter++;
+
631  if(hci_counter > hci_num_reset_loops) { // wait until we have looped x times to clear any old events
+
632  hci_reset();
+
633  hci_state = HCI_RESET_STATE;
+
634  hci_counter = 0;
+
635  }
+
636  break;
+
637 
+
638  case HCI_RESET_STATE:
+
639  hci_counter++;
+ +
641  hci_counter = 0;
+
642 #ifdef DEBUG_USB_HOST
+
643  Notify(PSTR("\r\nHCI Reset complete"), 0x80);
+
644 #endif
+
645  hci_state = HCI_CLASS_STATE;
+ +
647  } else if(hci_counter > hci_num_reset_loops) {
+
648  hci_num_reset_loops *= 10;
+
649  if(hci_num_reset_loops > 2000)
+
650  hci_num_reset_loops = 2000;
+
651 #ifdef DEBUG_USB_HOST
+
652  Notify(PSTR("\r\nNo response to HCI Reset"), 0x80);
+
653 #endif
+
654  hci_state = HCI_INIT_STATE;
+
655  hci_counter = 0;
+
656  }
+
657  break;
+
658 
+
659  case HCI_CLASS_STATE:
+ +
661 #ifdef DEBUG_USB_HOST
+
662  Notify(PSTR("\r\nWrite class of device"), 0x80);
+
663 #endif
+
664  hci_state = HCI_BDADDR_STATE;
+
665  hci_read_bdaddr();
+
666  }
+
667  break;
+
668 
+
669  case HCI_BDADDR_STATE:
+ +
671 #ifdef DEBUG_USB_HOST
+
672  Notify(PSTR("\r\nLocal Bluetooth Address: "), 0x80);
+
673  for(int8_t i = 5; i > 0; i--) {
+
674  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
+
675  Notify(PSTR(":"), 0x80);
+
676  }
+
677  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
+
678 #endif
+ +
680  hci_state = HCI_LOCAL_VERSION_STATE;
+
681  }
+
682  break;
+
683 
+
684  case HCI_LOCAL_VERSION_STATE: // The local version is used by the PS3BT class
+ +
686  if(btdName != NULL) {
+ +
688  hci_state = HCI_SET_NAME_STATE;
+
689  } else
+
690  hci_state = HCI_CHECK_DEVICE_SERVICE;
+
691  }
+
692  break;
+
693 
+
694  case HCI_SET_NAME_STATE:
+ +
696 #ifdef DEBUG_USB_HOST
+
697  Notify(PSTR("\r\nThe name is set to: "), 0x80);
+
698  NotifyStr(btdName, 0x80);
+
699 #endif
+
700  hci_state = HCI_CHECK_DEVICE_SERVICE;
+
701  }
+
702  break;
+
703 
+ +
705  if(pairWithHIDDevice || pairWithWii) { // Check if it should try to connect to a Wiimote
+
706 #ifdef DEBUG_USB_HOST
+
707  if(pairWithWii)
+
708  Notify(PSTR("\r\nStarting inquiry\r\nPress 1 & 2 on the Wiimote\r\nOr press sync if you are using a Wii U Pro Controller"), 0x80);
+
709  else
+
710  Notify(PSTR("\r\nPlease enable discovery of your device"), 0x80);
+
711 #endif
+
712  hci_inquiry();
+
713  hci_state = HCI_INQUIRY_STATE;
+
714  } else
+
715  hci_state = HCI_SCANNING_STATE; // Don't try to connect to a Wiimote
+
716  break;
+
717 
+
718  case HCI_INQUIRY_STATE:
+ +
720  hci_inquiry_cancel(); // Stop inquiry
+
721 #ifdef DEBUG_USB_HOST
+
722  if(pairWithWii)
+
723  Notify(PSTR("\r\nWiimote found"), 0x80);
+
724  else
+
725  Notify(PSTR("\r\nHID device found"), 0x80);
+
726 
+
727  Notify(PSTR("\r\nNow just create the instance like so:"), 0x80);
+
728  if(pairWithWii)
+
729  Notify(PSTR("\r\nWII Wii(&Btd);"), 0x80);
+
730  else
+
731  Notify(PSTR("\r\nBTHID bthid(&Btd);"), 0x80);
+
732 
+
733  Notify(PSTR("\r\nAnd then press any button on the "), 0x80);
+
734  if(pairWithWii)
+
735  Notify(PSTR("Wiimote"), 0x80);
+
736  else
+
737  Notify(PSTR("device"), 0x80);
+
738 #endif
+
739  if(motionPlusInside) {
+
740  hci_remote_name(); // We need to know the name to distinguish between a Wiimote and a Wii U Pro Controller
+
741  hci_state = HCI_REMOTE_NAME_STATE;
+
742  } else
+
743  hci_state = HCI_CONNECT_DEVICE_STATE;
+
744  }
+
745  break;
+
746 
+ + +
749 #ifdef DEBUG_USB_HOST
+
750  if(pairWithWii)
+
751  Notify(PSTR("\r\nConnecting to Wiimote"), 0x80);
+
752  else
+
753  Notify(PSTR("\r\nConnecting to HID device"), 0x80);
+
754 #endif
+
755  hci_connect();
+
756  hci_state = HCI_CONNECTED_DEVICE_STATE;
+
757  }
+
758  break;
+
759 
+ + + +
763 #ifdef DEBUG_USB_HOST
+
764  if(pairWithWii)
+
765  Notify(PSTR("\r\nConnected to Wiimote"), 0x80);
+
766  else
+
767  Notify(PSTR("\r\nConnected to HID device"), 0x80);
+
768 #endif
+
769  hci_authentication_request(); // This will start the pairing with the Wiimote
+
770  hci_state = HCI_SCANNING_STATE;
+
771  } else {
+
772 #ifdef DEBUG_USB_HOST
+
773  Notify(PSTR("\r\nTrying to connect one more time..."), 0x80);
+
774 #endif
+
775  hci_connect(); // Try to connect one more time
+
776  }
+
777  }
+
778  break;
+
779 
+
780  case HCI_SCANNING_STATE:
+ +
782 #ifdef DEBUG_USB_HOST
+
783  Notify(PSTR("\r\nWait For Incoming Connection Request"), 0x80);
+
784 #endif
+ +
786  watingForConnection = true;
+
787  hci_state = HCI_CONNECT_IN_STATE;
+
788  }
+
789  break;
+
790 
+ + +
793  watingForConnection = false;
+
794 #ifdef DEBUG_USB_HOST
+
795  Notify(PSTR("\r\nIncoming Connection Request"), 0x80);
+
796 #endif
+
797  hci_remote_name();
+
798  hci_state = HCI_REMOTE_NAME_STATE;
+ +
800  hci_state = HCI_DISCONNECT_STATE;
+
801  break;
+
802 
+ + +
805 #ifdef DEBUG_USB_HOST
+
806  Notify(PSTR("\r\nRemote Name: "), 0x80);
+
807  for(uint8_t i = 0; i < strlen(remote_name); i++)
+
808  Notifyc(remote_name[i], 0x80);
+
809 #endif
+
810  if(strncmp((const char*)remote_name, "Nintendo", 8) == 0) {
+
811  incomingWii = true;
+
812 #ifdef DEBUG_USB_HOST
+
813  Notify(PSTR("\r\nWiimote is connecting"), 0x80);
+
814 #endif
+
815  if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-TR", 22) == 0) {
+
816 #ifdef DEBUG_USB_HOST
+
817  Notify(PSTR(" with Motion Plus Inside"), 0x80);
+
818 #endif
+
819  motionPlusInside = true;
+
820  } else if(strncmp((const char*)remote_name, "Nintendo RVL-CNT-01-UC", 22) == 0) {
+
821 #ifdef DEBUG_USB_HOST
+
822  Notify(PSTR(" - Wii U Pro Controller"), 0x80);
+
823 #endif
+
824  motionPlusInside = true;
+
825  wiiUProController = true;
+
826  } else {
+
827  motionPlusInside = false;
+
828  wiiUProController = false;
+
829  }
+
830  }
+
831  if(classOfDevice[2] == 0 && classOfDevice[1] == 0x25 && classOfDevice[0] == 0x08 && strncmp((const char*)remote_name, "Wireless Controller", 19) == 0) {
+
832 #ifdef DEBUG_USB_HOST
+
833  Notify(PSTR("\r\nPS4 controller is connecting"), 0x80);
+
834 #endif
+
835  incomingPS4 = true;
+
836  }
+ +
838  hci_state = HCI_CONNECT_DEVICE_STATE;
+
839  else {
+ +
841  hci_state = HCI_CONNECTED_STATE;
+
842  }
+
843  }
+
844  break;
+
845 
+
846  case HCI_CONNECTED_STATE:
+ +
848 #ifdef DEBUG_USB_HOST
+
849  Notify(PSTR("\r\nConnected to Device: "), 0x80);
+
850  for(int8_t i = 5; i > 0; i--) {
+
851  D_PrintHex<uint8_t > (disc_bdaddr[i], 0x80);
+
852  Notify(PSTR(":"), 0x80);
+
853  }
+
854  D_PrintHex<uint8_t > (disc_bdaddr[0], 0x80);
+
855 #endif
+
856  if(incomingPS4)
+
857  connectToHIDDevice = true; // We should always connect to the PS4 controller
+
858 
+
859  // Clear these flags for a new connection
+
860  l2capConnectionClaimed = false;
+
861  sdpConnectionClaimed = false;
+
862  rfcommConnectionClaimed = false;
+
863 
+
864  hci_event_flag = 0;
+
865  hci_state = HCI_DONE_STATE;
866  }
867  break;
868 
- - -
871 #ifdef DEBUG_USB_HOST
-
872  Notify(PSTR("\r\nHCI Disconnected from Device"), 0x80);
-
873 #endif
-
874  hci_event_flag = 0; // Clear all flags
-
875 
-
876  // Reset all buffers
-
877  memset(hcibuf, 0, BULK_MAXPKTSIZE);
-
878  memset(l2capinbuf, 0, BULK_MAXPKTSIZE);
-
879 
- - -
882  incomingPS4 = false;
+
869  case HCI_DONE_STATE:
+
870  hci_counter++;
+
871  if(hci_counter > 1000) { // Wait until we have looped 1000 times to make sure that the L2CAP connection has been started
+
872  hci_counter = 0;
+
873  hci_state = HCI_SCANNING_STATE;
+
874  }
+
875  break;
+
876 
+ + +
879 #ifdef DEBUG_USB_HOST
+
880  Notify(PSTR("\r\nHCI Disconnected from Device"), 0x80);
+
881 #endif
+
882  hci_event_flag = 0; // Clear all flags
883 
-
884  hci_state = HCI_SCANNING_STATE;
-
885  }
-
886  break;
-
887  default:
-
888  break;
-
889  }
-
890 }
+
884  // Reset all buffers
+
885  memset(hcibuf, 0, BULK_MAXPKTSIZE);
+
886  memset(l2capinbuf, 0, BULK_MAXPKTSIZE);
+
887 
+ + +
890  incomingPS4 = false;
891 
-
892 void BTD::ACL_event_task() {
-
893  uint16_t length = BULK_MAXPKTSIZE;
-
894  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_DATAIN_PIPE ].epAddr, &length, l2capinbuf); // Input on endpoint 2
-
895 
-
896  if(!rcode) { // Check for errors
-
897  if(length > 0) { // Check if any data was read
-
898  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
-
899  if(btService[i])
-
900  btService[i]->ACLData(l2capinbuf);
-
901  }
-
902  }
-
903  }
-
904 #ifdef EXTRADEBUG
-
905  else if(rcode != hrNAK) {
-
906  Notify(PSTR("\r\nACL data in error: "), 0x80);
-
907  D_PrintHex<uint8_t > (rcode, 0x80);
-
908  }
-
909 #endif
-
910  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
-
911  if(btService[i])
-
912  btService[i]->Run();
-
913 }
-
914 
-
915 /************************************************************/
-
916 /* HCI Commands */
-
917 
-
918 /************************************************************/
-
919 void BTD::HCI_Command(uint8_t* data, uint16_t nbytes) {
- -
921  pUsb->ctrlReq(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bmREQ_HCI_OUT, 0x00, 0x00, 0x00, 0x00, nbytes, nbytes, data, NULL);
-
922 }
-
923 
- -
925  hci_event_flag = 0; // Clear all the flags
-
926  hcibuf[0] = 0x03; // HCI OCF = 3
-
927  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
928  hcibuf[2] = 0x00;
-
929 
-
930  HCI_Command(hcibuf, 3);
-
931 }
-
932 
- - -
935  hcibuf[0] = 0x1A; // HCI OCF = 1A
-
936  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
937  hcibuf[2] = 0x01; // parameter length = 1
-
938  if(btdName != NULL)
-
939  hcibuf[3] = 0x03; // Inquiry Scan enabled. Page Scan enabled.
-
940  else
-
941  hcibuf[3] = 0x02; // Inquiry Scan disabled. Page Scan enabled.
-
942 
-
943  HCI_Command(hcibuf, 4);
-
944 }
-
945 
- -
947  hcibuf[0] = 0x1A; // HCI OCF = 1A
-
948  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
949  hcibuf[2] = 0x01; // parameter length = 1
-
950  hcibuf[3] = 0x00; // Inquiry Scan disabled. Page Scan disabled.
-
951 
-
952  HCI_Command(hcibuf, 4);
-
953 }
-
954 
- - -
957  hcibuf[0] = 0x09; // HCI OCF = 9
-
958  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
-
959  hcibuf[2] = 0x00;
-
960 
-
961  HCI_Command(hcibuf, 3);
-
962 }
-
963 
- - -
966  hcibuf[0] = 0x01; // HCI OCF = 1
-
967  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
-
968  hcibuf[2] = 0x00;
-
969 
-
970  HCI_Command(hcibuf, 3);
-
971 }
-
972 
- - -
975  hcibuf[0] = 0x09; // HCI OCF = 9
-
976  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
977  hcibuf[2] = 0x07; // parameter length 7
-
978  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
979  hcibuf[4] = disc_bdaddr[1];
-
980  hcibuf[5] = disc_bdaddr[2];
-
981  hcibuf[6] = disc_bdaddr[3];
-
982  hcibuf[7] = disc_bdaddr[4];
-
983  hcibuf[8] = disc_bdaddr[5];
-
984  hcibuf[9] = 0x00; // Switch role to master
-
985 
-
986  HCI_Command(hcibuf, 10);
-
987 }
-
988 
- - -
991  hcibuf[0] = 0x19; // HCI OCF = 19
-
992  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
993  hcibuf[2] = 0x0A; // parameter length = 10
-
994  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
995  hcibuf[4] = disc_bdaddr[1];
-
996  hcibuf[5] = disc_bdaddr[2];
-
997  hcibuf[6] = disc_bdaddr[3];
-
998  hcibuf[7] = disc_bdaddr[4];
-
999  hcibuf[8] = disc_bdaddr[5];
-
1000  hcibuf[9] = 0x01; // Page Scan Repetition Mode
-
1001  hcibuf[10] = 0x00; // Reserved
-
1002  hcibuf[11] = 0x00; // Clock offset - low byte
-
1003  hcibuf[12] = 0x00; // Clock offset - high byte
-
1004 
-
1005  HCI_Command(hcibuf, 13);
-
1006 }
-
1007 
-
1008 void BTD::hci_set_local_name(const char* name) {
-
1009  hcibuf[0] = 0x13; // HCI OCF = 13
-
1010  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
1011  hcibuf[2] = strlen(name) + 1; // parameter length = the length of the string + end byte
-
1012  uint8_t i;
-
1013  for(i = 0; i < strlen(name); i++)
-
1014  hcibuf[i + 3] = name[i];
-
1015  hcibuf[i + 3] = 0x00; // End of string
-
1016 
-
1017  HCI_Command(hcibuf, 4 + strlen(name));
-
1018 }
-
1019 
- - -
1022  hcibuf[0] = 0x01;
-
1023  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1024  hcibuf[2] = 0x05; // Parameter Total Length = 5
-
1025  hcibuf[3] = 0x33; // LAP: Genera/Unlimited Inquiry Access Code (GIAC = 0x9E8B33) - see https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
-
1026  hcibuf[4] = 0x8B;
-
1027  hcibuf[5] = 0x9E;
-
1028  hcibuf[6] = 0x30; // Inquiry time = 61.44 sec (maximum)
-
1029  hcibuf[7] = 0x0A; // 10 number of responses
-
1030 
-
1031  HCI_Command(hcibuf, 8);
-
1032 }
-
1033 
- -
1035  hcibuf[0] = 0x02;
-
1036  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1037  hcibuf[2] = 0x00; // Parameter Total Length = 0
+
892  hci_state = HCI_SCANNING_STATE;
+
893  }
+
894  break;
+
895  default:
+
896  break;
+
897  }
+
898 }
+
899 
+
900 void BTD::ACL_event_task() {
+
901  uint16_t length = BULK_MAXPKTSIZE;
+
902  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ BTD_DATAIN_PIPE ].epAddr, &length, l2capinbuf); // Input on endpoint 2
+
903 
+
904  if(!rcode) { // Check for errors
+
905  if(length > 0) { // Check if any data was read
+
906  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
+
907  if(btService[i])
+
908  btService[i]->ACLData(l2capinbuf);
+
909  }
+
910  }
+
911  }
+
912 #ifdef EXTRADEBUG
+
913  else if(rcode != hrNAK) {
+
914  Notify(PSTR("\r\nACL data in error: "), 0x80);
+
915  D_PrintHex<uint8_t > (rcode, 0x80);
+
916  }
+
917 #endif
+
918  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
+
919  if(btService[i])
+
920  btService[i]->Run();
+
921 }
+
922 
+
923 /************************************************************/
+
924 /* HCI Commands */
+
925 
+
926 /************************************************************/
+
927 void BTD::HCI_Command(uint8_t* data, uint16_t nbytes) {
+ +
929  pUsb->ctrlReq(bAddress, epInfo[ BTD_CONTROL_PIPE ].epAddr, bmREQ_HCI_OUT, 0x00, 0x00, 0x00, 0x00, nbytes, nbytes, data, NULL);
+
930 }
+
931 
+ +
933  hci_event_flag = 0; // Clear all the flags
+
934  hcibuf[0] = 0x03; // HCI OCF = 3
+
935  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
+
936  hcibuf[2] = 0x00;
+
937 
+
938  HCI_Command(hcibuf, 3);
+
939 }
+
940 
+ + +
943  hcibuf[0] = 0x1A; // HCI OCF = 1A
+
944  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
+
945  hcibuf[2] = 0x01; // parameter length = 1
+
946  if(btdName != NULL)
+
947  hcibuf[3] = 0x03; // Inquiry Scan enabled. Page Scan enabled.
+
948  else
+
949  hcibuf[3] = 0x02; // Inquiry Scan disabled. Page Scan enabled.
+
950 
+
951  HCI_Command(hcibuf, 4);
+
952 }
+
953 
+ +
955  hcibuf[0] = 0x1A; // HCI OCF = 1A
+
956  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
+
957  hcibuf[2] = 0x01; // parameter length = 1
+
958  hcibuf[3] = 0x00; // Inquiry Scan disabled. Page Scan disabled.
+
959 
+
960  HCI_Command(hcibuf, 4);
+
961 }
+
962 
+ + +
965  hcibuf[0] = 0x09; // HCI OCF = 9
+
966  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
+
967  hcibuf[2] = 0x00;
+
968 
+
969  HCI_Command(hcibuf, 3);
+
970 }
+
971 
+ + +
974  hcibuf[0] = 0x01; // HCI OCF = 1
+
975  hcibuf[1] = 0x04 << 2; // HCI OGF = 4
+
976  hcibuf[2] = 0x00;
+
977 
+
978  HCI_Command(hcibuf, 3);
+
979 }
+
980 
+ + +
983  hcibuf[0] = 0x09; // HCI OCF = 9
+
984  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
985  hcibuf[2] = 0x07; // parameter length 7
+
986  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
+
987  hcibuf[4] = disc_bdaddr[1];
+
988  hcibuf[5] = disc_bdaddr[2];
+
989  hcibuf[6] = disc_bdaddr[3];
+
990  hcibuf[7] = disc_bdaddr[4];
+
991  hcibuf[8] = disc_bdaddr[5];
+
992  hcibuf[9] = 0x00; // Switch role to master
+
993 
+
994  HCI_Command(hcibuf, 10);
+
995 }
+
996 
+ + +
999  hcibuf[0] = 0x19; // HCI OCF = 19
+
1000  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1001  hcibuf[2] = 0x0A; // parameter length = 10
+
1002  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
+
1003  hcibuf[4] = disc_bdaddr[1];
+
1004  hcibuf[5] = disc_bdaddr[2];
+
1005  hcibuf[6] = disc_bdaddr[3];
+
1006  hcibuf[7] = disc_bdaddr[4];
+
1007  hcibuf[8] = disc_bdaddr[5];
+
1008  hcibuf[9] = 0x01; // Page Scan Repetition Mode
+
1009  hcibuf[10] = 0x00; // Reserved
+
1010  hcibuf[11] = 0x00; // Clock offset - low byte
+
1011  hcibuf[12] = 0x00; // Clock offset - high byte
+
1012 
+
1013  HCI_Command(hcibuf, 13);
+
1014 }
+
1015 
+
1016 void BTD::hci_set_local_name(const char* name) {
+
1017  hcibuf[0] = 0x13; // HCI OCF = 13
+
1018  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
+
1019  hcibuf[2] = strlen(name) + 1; // parameter length = the length of the string + end byte
+
1020  uint8_t i;
+
1021  for(i = 0; i < strlen(name); i++)
+
1022  hcibuf[i + 3] = name[i];
+
1023  hcibuf[i + 3] = 0x00; // End of string
+
1024 
+
1025  HCI_Command(hcibuf, 4 + strlen(name));
+
1026 }
+
1027 
+ + +
1030  hcibuf[0] = 0x01;
+
1031  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1032  hcibuf[2] = 0x05; // Parameter Total Length = 5
+
1033  hcibuf[3] = 0x33; // LAP: Genera/Unlimited Inquiry Access Code (GIAC = 0x9E8B33) - see https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm
+
1034  hcibuf[4] = 0x8B;
+
1035  hcibuf[5] = 0x9E;
+
1036  hcibuf[6] = 0x30; // Inquiry time = 61.44 sec (maximum)
+
1037  hcibuf[7] = 0x0A; // 10 number of responses
1038 
-
1039  HCI_Command(hcibuf, 3);
+
1039  HCI_Command(hcibuf, 8);
1040 }
1041 
- -
1043  hci_connect(disc_bdaddr); // Use last discovered device
-
1044 }
-
1045 
-
1046 void BTD::hci_connect(uint8_t *bdaddr) {
- -
1048  hcibuf[0] = 0x05;
-
1049  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1050  hcibuf[2] = 0x0D; // parameter Total Length = 13
-
1051  hcibuf[3] = bdaddr[0]; // 6 octet bdaddr (LSB)
-
1052  hcibuf[4] = bdaddr[1];
-
1053  hcibuf[5] = bdaddr[2];
-
1054  hcibuf[6] = bdaddr[3];
-
1055  hcibuf[7] = bdaddr[4];
-
1056  hcibuf[8] = bdaddr[5];
-
1057  hcibuf[9] = 0x18; // DM1 or DH1 may be used
-
1058  hcibuf[10] = 0xCC; // DM3, DH3, DM5, DH5 may be used
-
1059  hcibuf[11] = 0x01; // Page repetition mode R1
-
1060  hcibuf[12] = 0x00; // Reserved
-
1061  hcibuf[13] = 0x00; // Clock offset
-
1062  hcibuf[14] = 0x00; // Invalid clock offset
-
1063  hcibuf[15] = 0x00; // Do not allow role switch
-
1064 
-
1065  HCI_Command(hcibuf, 16);
-
1066 }
-
1067 
- -
1069  hcibuf[0] = 0x0D; // HCI OCF = 0D
-
1070  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1071  hcibuf[2] = 0x17; // parameter length 23
-
1072  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
1073  hcibuf[4] = disc_bdaddr[1];
-
1074  hcibuf[5] = disc_bdaddr[2];
-
1075  hcibuf[6] = disc_bdaddr[3];
-
1076  hcibuf[7] = disc_bdaddr[4];
-
1077  hcibuf[8] = disc_bdaddr[5];
-
1078  if(pairWithWii) {
-
1079  hcibuf[9] = 6; // Pin length is the length of the Bluetooth address
-
1080  if(wiiUProController) {
-
1081 #ifdef DEBUG_USB_HOST
-
1082  Notify(PSTR("\r\nParing with Wii U Pro Controller"), 0x80);
-
1083 #endif
-
1084  for(uint8_t i = 0; i < 6; i++)
-
1085  hcibuf[10 + i] = my_bdaddr[i]; // The pin is the Bluetooth dongles Bluetooth address backwards
-
1086  } else {
-
1087  for(uint8_t i = 0; i < 6; i++)
-
1088  hcibuf[10 + i] = disc_bdaddr[i]; // The pin is the Wiimote's Bluetooth address backwards
-
1089  }
-
1090  for(uint8_t i = 16; i < 26; i++)
-
1091  hcibuf[i] = 0x00; // The rest should be 0
-
1092  } else {
-
1093  hcibuf[9] = strlen(btdPin); // Length of pin
-
1094  uint8_t i;
-
1095  for(i = 0; i < strlen(btdPin); i++) // The maximum size of the pin is 16
-
1096  hcibuf[i + 10] = btdPin[i];
-
1097  for(; i < 16; i++)
-
1098  hcibuf[i + 10] = 0x00; // The rest should be 0
-
1099  }
-
1100 
-
1101  HCI_Command(hcibuf, 26);
-
1102 }
-
1103 
- -
1105  hcibuf[0] = 0x0E; // HCI OCF = 0E
-
1106  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1107  hcibuf[2] = 0x06; // parameter length 6
-
1108  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
1109  hcibuf[4] = disc_bdaddr[1];
-
1110  hcibuf[5] = disc_bdaddr[2];
-
1111  hcibuf[6] = disc_bdaddr[3];
-
1112  hcibuf[7] = disc_bdaddr[4];
-
1113  hcibuf[8] = disc_bdaddr[5];
-
1114 
-
1115  HCI_Command(hcibuf, 9);
-
1116 }
-
1117 
- -
1119  hcibuf[0] = 0x0C; // HCI OCF = 0C
-
1120  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1121  hcibuf[2] = 0x06; // parameter length 6
-
1122  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
-
1123  hcibuf[4] = disc_bdaddr[1];
-
1124  hcibuf[5] = disc_bdaddr[2];
-
1125  hcibuf[6] = disc_bdaddr[3];
-
1126  hcibuf[7] = disc_bdaddr[4];
-
1127  hcibuf[8] = disc_bdaddr[5];
-
1128 
-
1129  HCI_Command(hcibuf, 9);
-
1130 }
-
1131 
- -
1133  hcibuf[0] = 0x11; // HCI OCF = 11
-
1134  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1135  hcibuf[2] = 0x02; // parameter length = 2
-
1136  hcibuf[3] = (uint8_t)(hci_handle & 0xFF); //connection handle - low byte
-
1137  hcibuf[4] = (uint8_t)((hci_handle >> 8) & 0x0F); //connection handle - high byte
-
1138 
-
1139  HCI_Command(hcibuf, 5);
-
1140 }
-
1141 
-
1142 void BTD::hci_disconnect(uint16_t handle) { // This is called by the different services
- -
1144  hcibuf[0] = 0x06; // HCI OCF = 6
-
1145  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
-
1146  hcibuf[2] = 0x03; // parameter length = 3
-
1147  hcibuf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte
-
1148  hcibuf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte
-
1149  hcibuf[5] = 0x13; // reason
-
1150 
-
1151  HCI_Command(hcibuf, 6);
-
1152 }
-
1153 
-
1154 void BTD::hci_write_class_of_device() { // See http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
-
1155  hcibuf[0] = 0x24; // HCI OCF = 24
-
1156  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
-
1157  hcibuf[2] = 0x03; // parameter length = 3
-
1158  hcibuf[3] = 0x04; // Robot
-
1159  hcibuf[4] = 0x08; // Toy
-
1160  hcibuf[5] = 0x00;
+ +
1043  hcibuf[0] = 0x02;
+
1044  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1045  hcibuf[2] = 0x00; // Parameter Total Length = 0
+
1046 
+
1047  HCI_Command(hcibuf, 3);
+
1048 }
+
1049 
+ +
1051  hci_connect(disc_bdaddr); // Use last discovered device
+
1052 }
+
1053 
+
1054 void BTD::hci_connect(uint8_t *bdaddr) {
+ +
1056  hcibuf[0] = 0x05;
+
1057  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1058  hcibuf[2] = 0x0D; // parameter Total Length = 13
+
1059  hcibuf[3] = bdaddr[0]; // 6 octet bdaddr (LSB)
+
1060  hcibuf[4] = bdaddr[1];
+
1061  hcibuf[5] = bdaddr[2];
+
1062  hcibuf[6] = bdaddr[3];
+
1063  hcibuf[7] = bdaddr[4];
+
1064  hcibuf[8] = bdaddr[5];
+
1065  hcibuf[9] = 0x18; // DM1 or DH1 may be used
+
1066  hcibuf[10] = 0xCC; // DM3, DH3, DM5, DH5 may be used
+
1067  hcibuf[11] = 0x01; // Page repetition mode R1
+
1068  hcibuf[12] = 0x00; // Reserved
+
1069  hcibuf[13] = 0x00; // Clock offset
+
1070  hcibuf[14] = 0x00; // Invalid clock offset
+
1071  hcibuf[15] = 0x00; // Do not allow role switch
+
1072 
+
1073  HCI_Command(hcibuf, 16);
+
1074 }
+
1075 
+ +
1077  hcibuf[0] = 0x0D; // HCI OCF = 0D
+
1078  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1079  hcibuf[2] = 0x17; // parameter length 23
+
1080  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
+
1081  hcibuf[4] = disc_bdaddr[1];
+
1082  hcibuf[5] = disc_bdaddr[2];
+
1083  hcibuf[6] = disc_bdaddr[3];
+
1084  hcibuf[7] = disc_bdaddr[4];
+
1085  hcibuf[8] = disc_bdaddr[5];
+
1086  if(pairWithWii) {
+
1087  hcibuf[9] = 6; // Pin length is the length of the Bluetooth address
+
1088  if(wiiUProController) {
+
1089 #ifdef DEBUG_USB_HOST
+
1090  Notify(PSTR("\r\nParing with Wii U Pro Controller"), 0x80);
+
1091 #endif
+
1092  for(uint8_t i = 0; i < 6; i++)
+
1093  hcibuf[10 + i] = my_bdaddr[i]; // The pin is the Bluetooth dongles Bluetooth address backwards
+
1094  } else {
+
1095  for(uint8_t i = 0; i < 6; i++)
+
1096  hcibuf[10 + i] = disc_bdaddr[i]; // The pin is the Wiimote's Bluetooth address backwards
+
1097  }
+
1098  for(uint8_t i = 16; i < 26; i++)
+
1099  hcibuf[i] = 0x00; // The rest should be 0
+
1100  } else {
+
1101  hcibuf[9] = strlen(btdPin); // Length of pin
+
1102  uint8_t i;
+
1103  for(i = 0; i < strlen(btdPin); i++) // The maximum size of the pin is 16
+
1104  hcibuf[i + 10] = btdPin[i];
+
1105  for(; i < 16; i++)
+
1106  hcibuf[i + 10] = 0x00; // The rest should be 0
+
1107  }
+
1108 
+
1109  HCI_Command(hcibuf, 26);
+
1110 }
+
1111 
+ +
1113  hcibuf[0] = 0x0E; // HCI OCF = 0E
+
1114  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1115  hcibuf[2] = 0x06; // parameter length 6
+
1116  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
+
1117  hcibuf[4] = disc_bdaddr[1];
+
1118  hcibuf[5] = disc_bdaddr[2];
+
1119  hcibuf[6] = disc_bdaddr[3];
+
1120  hcibuf[7] = disc_bdaddr[4];
+
1121  hcibuf[8] = disc_bdaddr[5];
+
1122 
+
1123  HCI_Command(hcibuf, 9);
+
1124 }
+
1125 
+ +
1127  hcibuf[0] = 0x0C; // HCI OCF = 0C
+
1128  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1129  hcibuf[2] = 0x06; // parameter length 6
+
1130  hcibuf[3] = disc_bdaddr[0]; // 6 octet bdaddr
+
1131  hcibuf[4] = disc_bdaddr[1];
+
1132  hcibuf[5] = disc_bdaddr[2];
+
1133  hcibuf[6] = disc_bdaddr[3];
+
1134  hcibuf[7] = disc_bdaddr[4];
+
1135  hcibuf[8] = disc_bdaddr[5];
+
1136 
+
1137  HCI_Command(hcibuf, 9);
+
1138 }
+
1139 
+ +
1141  hcibuf[0] = 0x11; // HCI OCF = 11
+
1142  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1143  hcibuf[2] = 0x02; // parameter length = 2
+
1144  hcibuf[3] = (uint8_t)(hci_handle & 0xFF); //connection handle - low byte
+
1145  hcibuf[4] = (uint8_t)((hci_handle >> 8) & 0x0F); //connection handle - high byte
+
1146 
+
1147  HCI_Command(hcibuf, 5);
+
1148 }
+
1149 
+
1150 void BTD::hci_disconnect(uint16_t handle) { // This is called by the different services
+ +
1152  hcibuf[0] = 0x06; // HCI OCF = 6
+
1153  hcibuf[1] = 0x01 << 2; // HCI OGF = 1
+
1154  hcibuf[2] = 0x03; // parameter length = 3
+
1155  hcibuf[3] = (uint8_t)(handle & 0xFF); //connection handle - low byte
+
1156  hcibuf[4] = (uint8_t)((handle >> 8) & 0x0F); //connection handle - high byte
+
1157  hcibuf[5] = 0x13; // reason
+
1158 
+
1159  HCI_Command(hcibuf, 6);
+
1160 }
1161 
-
1162  HCI_Command(hcibuf, 6);
-
1163 }
-
1164 /*******************************************************************
-
1165  * *
-
1166  * HCI ACL Data Packet *
-
1167  * *
-
1168  * buf[0] buf[1] buf[2] buf[3]
-
1169  * 0 4 8 11 12 16 24 31 MSB
-
1170  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1171  * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet
-
1172  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1173  *
-
1174  * buf[4] buf[5] buf[6] buf[7]
-
1175  * 0 8 16 31 MSB
-
1176  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1177  * | Length | Channel ID | Basic L2CAP header
-
1178  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1179  *
-
1180  * buf[8] buf[9] buf[10] buf[11]
-
1181  * 0 8 16 31 MSB
-
1182  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
-
1183  * | Code | Identifier | Length | Control frame (C-frame)
-
1184  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format)
-
1185  */
-
1186 /************************************************************/
-
1187 /* L2CAP Commands */
-
1188 
-
1189 /************************************************************/
-
1190 void BTD::L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow, uint8_t channelHigh) {
-
1191  uint8_t buf[8 + nbytes];
-
1192  buf[0] = (uint8_t)(handle & 0xff); // HCI handle with PB,BC flag
-
1193  buf[1] = (uint8_t)(((handle >> 8) & 0x0f) | 0x20);
-
1194  buf[2] = (uint8_t)((4 + nbytes) & 0xff); // HCI ACL total data length
-
1195  buf[3] = (uint8_t)((4 + nbytes) >> 8);
-
1196  buf[4] = (uint8_t)(nbytes & 0xff); // L2CAP header: Length
-
1197  buf[5] = (uint8_t)(nbytes >> 8);
-
1198  buf[6] = channelLow;
-
1199  buf[7] = channelHigh;
-
1200 
-
1201  for(uint16_t i = 0; i < nbytes; i++) // L2CAP C-frame
-
1202  buf[8 + i] = data[i];
-
1203 
-
1204  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ BTD_DATAOUT_PIPE ].epAddr, (8 + nbytes), buf);
-
1205  if(rcode) {
-
1206  delay(100); // This small delay prevents it from overflowing if it fails
-
1207 #ifdef DEBUG_USB_HOST
-
1208  Notify(PSTR("\r\nError sending L2CAP message: 0x"), 0x80);
-
1209  D_PrintHex<uint8_t > (rcode, 0x80);
-
1210  Notify(PSTR(" - Channel ID: "), 0x80);
-
1211  D_PrintHex<uint8_t > (channelHigh, 0x80);
-
1212  Notify(PSTR(" "), 0x80);
-
1213  D_PrintHex<uint8_t > (channelLow, 0x80);
-
1214 #endif
-
1215  }
-
1216 }
-
1217 
-
1218 void BTD::l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm) {
-
1219  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_REQUEST; // Code
-
1220  l2capoutbuf[1] = rxid; // Identifier
-
1221  l2capoutbuf[2] = 0x04; // Length
-
1222  l2capoutbuf[3] = 0x00;
-
1223  l2capoutbuf[4] = (uint8_t)(psm & 0xff); // PSM
-
1224  l2capoutbuf[5] = (uint8_t)(psm >> 8);
-
1225  l2capoutbuf[6] = scid[0]; // Source CID
-
1226  l2capoutbuf[7] = scid[1];
-
1227 
-
1228  L2CAP_Command(handle, l2capoutbuf, 8);
-
1229 }
-
1230 
-
1231 void BTD::l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result) {
-
1232  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code
-
1233  l2capoutbuf[1] = rxid; // Identifier
-
1234  l2capoutbuf[2] = 0x08; // Length
-
1235  l2capoutbuf[3] = 0x00;
-
1236  l2capoutbuf[4] = dcid[0]; // Destination CID
-
1237  l2capoutbuf[5] = dcid[1];
-
1238  l2capoutbuf[6] = scid[0]; // Source CID
-
1239  l2capoutbuf[7] = scid[1];
-
1240  l2capoutbuf[8] = result; // Result: Pending or Success
-
1241  l2capoutbuf[9] = 0x00;
-
1242  l2capoutbuf[10] = 0x00; // No further information
-
1243  l2capoutbuf[11] = 0x00;
-
1244 
-
1245  L2CAP_Command(handle, l2capoutbuf, 12);
-
1246 }
-
1247 
-
1248 void BTD::l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid) {
-
1249  l2capoutbuf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code
-
1250  l2capoutbuf[1] = rxid; // Identifier
-
1251  l2capoutbuf[2] = 0x08; // Length
-
1252  l2capoutbuf[3] = 0x00;
-
1253  l2capoutbuf[4] = dcid[0]; // Destination CID
-
1254  l2capoutbuf[5] = dcid[1];
-
1255  l2capoutbuf[6] = 0x00; // Flags
-
1256  l2capoutbuf[7] = 0x00;
-
1257  l2capoutbuf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) - Hint
-
1258  l2capoutbuf[9] = 0x02; // Config Opt: length
-
1259  l2capoutbuf[10] = 0xFF; // MTU
-
1260  l2capoutbuf[11] = 0xFF;
-
1261 
-
1262  L2CAP_Command(handle, l2capoutbuf, 12);
-
1263 }
-
1264 
-
1265 void BTD::l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid) {
-
1266  l2capoutbuf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code
-
1267  l2capoutbuf[1] = rxid; // Identifier
-
1268  l2capoutbuf[2] = 0x0A; // Length
-
1269  l2capoutbuf[3] = 0x00;
-
1270  l2capoutbuf[4] = scid[0]; // Source CID
-
1271  l2capoutbuf[5] = scid[1];
-
1272  l2capoutbuf[6] = 0x00; // Flag
-
1273  l2capoutbuf[7] = 0x00;
-
1274  l2capoutbuf[8] = 0x00; // Result
-
1275  l2capoutbuf[9] = 0x00;
-
1276  l2capoutbuf[10] = 0x01; // Config
-
1277  l2capoutbuf[11] = 0x02;
-
1278  l2capoutbuf[12] = 0xA0;
-
1279  l2capoutbuf[13] = 0x02;
-
1280 
-
1281  L2CAP_Command(handle, l2capoutbuf, 14);
-
1282 }
-
1283 
-
1284 void BTD::l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
-
1285  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code
-
1286  l2capoutbuf[1] = rxid; // Identifier
-
1287  l2capoutbuf[2] = 0x04; // Length
-
1288  l2capoutbuf[3] = 0x00;
-
1289  l2capoutbuf[4] = dcid[0];
-
1290  l2capoutbuf[5] = dcid[1];
-
1291  l2capoutbuf[6] = scid[0];
-
1292  l2capoutbuf[7] = scid[1];
-
1293 
-
1294  L2CAP_Command(handle, l2capoutbuf, 8);
-
1295 }
-
1296 
-
1297 void BTD::l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
-
1298  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code
-
1299  l2capoutbuf[1] = rxid; // Identifier
-
1300  l2capoutbuf[2] = 0x04; // Length
-
1301  l2capoutbuf[3] = 0x00;
-
1302  l2capoutbuf[4] = dcid[0];
-
1303  l2capoutbuf[5] = dcid[1];
-
1304  l2capoutbuf[6] = scid[0];
-
1305  l2capoutbuf[7] = scid[1];
-
1306 
-
1307  L2CAP_Command(handle, l2capoutbuf, 8);
-
1308 }
-
1309 
-
1310 void BTD::l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh) {
-
1311  l2capoutbuf[0] = L2CAP_CMD_INFORMATION_RESPONSE; // Code
-
1312  l2capoutbuf[1] = rxid; // Identifier
-
1313  l2capoutbuf[2] = 0x08; // Length
-
1314  l2capoutbuf[3] = 0x00;
-
1315  l2capoutbuf[4] = infoTypeLow;
-
1316  l2capoutbuf[5] = infoTypeHigh;
-
1317  l2capoutbuf[6] = 0x00; // Result = success
-
1318  l2capoutbuf[7] = 0x00; // Result = success
-
1319  l2capoutbuf[8] = 0x00;
-
1320  l2capoutbuf[9] = 0x00;
-
1321  l2capoutbuf[10] = 0x00;
-
1322  l2capoutbuf[11] = 0x00;
-
1323 
-
1324  L2CAP_Command(handle, l2capoutbuf, 12);
-
1325 }
-
1326 
-
1327 /* PS3 Commands - only set Bluetooth address is implemented in this library */
-
1328 void BTD::setBdaddr(uint8_t* bdaddr) {
-
1329  /* Set the internal Bluetooth address */
-
1330  uint8_t buf[8];
-
1331  buf[0] = 0x01;
-
1332  buf[1] = 0x00;
-
1333 
-
1334  for(uint8_t i = 0; i < 6; i++)
-
1335  buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
-
1336 
-
1337  // 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
-
1338  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
-
1339 }
-
1340 
-
1341 void BTD::setMoveBdaddr(uint8_t* bdaddr) {
-
1342  /* Set the internal Bluetooth address */
-
1343  uint8_t buf[11];
-
1344  buf[0] = 0x05;
-
1345  buf[7] = 0x10;
-
1346  buf[8] = 0x01;
-
1347  buf[9] = 0x02;
-
1348  buf[10] = 0x12;
-
1349 
-
1350  for(uint8_t i = 0; i < 6; i++)
-
1351  buf[i + 1] = bdaddr[i];
-
1352 
-
1353  // 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
-
1354  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
-
1355 }
-
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:557
-
uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
Definition: Usb.cpp:766
-
bool incomingWii
Definition: BTD.h:507
+
1162 void BTD::hci_write_class_of_device() { // See http://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html
+
1163  hcibuf[0] = 0x24; // HCI OCF = 24
+
1164  hcibuf[1] = 0x03 << 2; // HCI OGF = 3
+
1165  hcibuf[2] = 0x03; // parameter length = 3
+
1166  hcibuf[3] = 0x04; // Robot
+
1167  hcibuf[4] = 0x08; // Toy
+
1168  hcibuf[5] = 0x00;
+
1169 
+
1170  HCI_Command(hcibuf, 6);
+
1171 }
+
1172 /*******************************************************************
+
1173  * *
+
1174  * HCI ACL Data Packet *
+
1175  * *
+
1176  * buf[0] buf[1] buf[2] buf[3]
+
1177  * 0 4 8 11 12 16 24 31 MSB
+
1178  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
+
1179  * | HCI Handle |PB |BC | Data Total Length | HCI ACL Data Packet
+
1180  * .-+-+-+-+-+-+-+-|-+-+-+-|-+-|-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
+
1181  *
+
1182  * buf[4] buf[5] buf[6] buf[7]
+
1183  * 0 8 16 31 MSB
+
1184  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
+
1185  * | Length | Channel ID | Basic L2CAP header
+
1186  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
+
1187  *
+
1188  * buf[8] buf[9] buf[10] buf[11]
+
1189  * 0 8 16 31 MSB
+
1190  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-.
+
1191  * | Code | Identifier | Length | Control frame (C-frame)
+
1192  * .-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-. (signaling packet format)
+
1193  */
+
1194 /************************************************************/
+
1195 /* L2CAP Commands */
+
1196 
+
1197 /************************************************************/
+
1198 void BTD::L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow, uint8_t channelHigh) {
+
1199  uint8_t buf[8 + nbytes];
+
1200  buf[0] = (uint8_t)(handle & 0xff); // HCI handle with PB,BC flag
+
1201  buf[1] = (uint8_t)(((handle >> 8) & 0x0f) | 0x20);
+
1202  buf[2] = (uint8_t)((4 + nbytes) & 0xff); // HCI ACL total data length
+
1203  buf[3] = (uint8_t)((4 + nbytes) >> 8);
+
1204  buf[4] = (uint8_t)(nbytes & 0xff); // L2CAP header: Length
+
1205  buf[5] = (uint8_t)(nbytes >> 8);
+
1206  buf[6] = channelLow;
+
1207  buf[7] = channelHigh;
+
1208 
+
1209  for(uint16_t i = 0; i < nbytes; i++) // L2CAP C-frame
+
1210  buf[8 + i] = data[i];
+
1211 
+
1212  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ BTD_DATAOUT_PIPE ].epAddr, (8 + nbytes), buf);
+
1213  if(rcode) {
+
1214  delay(100); // This small delay prevents it from overflowing if it fails
+
1215 #ifdef DEBUG_USB_HOST
+
1216  Notify(PSTR("\r\nError sending L2CAP message: 0x"), 0x80);
+
1217  D_PrintHex<uint8_t > (rcode, 0x80);
+
1218  Notify(PSTR(" - Channel ID: "), 0x80);
+
1219  D_PrintHex<uint8_t > (channelHigh, 0x80);
+
1220  Notify(PSTR(" "), 0x80);
+
1221  D_PrintHex<uint8_t > (channelLow, 0x80);
+
1222 #endif
+
1223  }
+
1224 }
+
1225 
+
1226 void BTD::l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm) {
+
1227  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_REQUEST; // Code
+
1228  l2capoutbuf[1] = rxid; // Identifier
+
1229  l2capoutbuf[2] = 0x04; // Length
+
1230  l2capoutbuf[3] = 0x00;
+
1231  l2capoutbuf[4] = (uint8_t)(psm & 0xff); // PSM
+
1232  l2capoutbuf[5] = (uint8_t)(psm >> 8);
+
1233  l2capoutbuf[6] = scid[0]; // Source CID
+
1234  l2capoutbuf[7] = scid[1];
+
1235 
+
1236  L2CAP_Command(handle, l2capoutbuf, 8);
+
1237 }
+
1238 
+
1239 void BTD::l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result) {
+
1240  l2capoutbuf[0] = L2CAP_CMD_CONNECTION_RESPONSE; // Code
+
1241  l2capoutbuf[1] = rxid; // Identifier
+
1242  l2capoutbuf[2] = 0x08; // Length
+
1243  l2capoutbuf[3] = 0x00;
+
1244  l2capoutbuf[4] = dcid[0]; // Destination CID
+
1245  l2capoutbuf[5] = dcid[1];
+
1246  l2capoutbuf[6] = scid[0]; // Source CID
+
1247  l2capoutbuf[7] = scid[1];
+
1248  l2capoutbuf[8] = result; // Result: Pending or Success
+
1249  l2capoutbuf[9] = 0x00;
+
1250  l2capoutbuf[10] = 0x00; // No further information
+
1251  l2capoutbuf[11] = 0x00;
+
1252 
+
1253  L2CAP_Command(handle, l2capoutbuf, 12);
+
1254 }
+
1255 
+
1256 void BTD::l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid) {
+
1257  l2capoutbuf[0] = L2CAP_CMD_CONFIG_REQUEST; // Code
+
1258  l2capoutbuf[1] = rxid; // Identifier
+
1259  l2capoutbuf[2] = 0x08; // Length
+
1260  l2capoutbuf[3] = 0x00;
+
1261  l2capoutbuf[4] = dcid[0]; // Destination CID
+
1262  l2capoutbuf[5] = dcid[1];
+
1263  l2capoutbuf[6] = 0x00; // Flags
+
1264  l2capoutbuf[7] = 0x00;
+
1265  l2capoutbuf[8] = 0x01; // Config Opt: type = MTU (Maximum Transmission Unit) - Hint
+
1266  l2capoutbuf[9] = 0x02; // Config Opt: length
+
1267  l2capoutbuf[10] = 0xFF; // MTU
+
1268  l2capoutbuf[11] = 0xFF;
+
1269 
+
1270  L2CAP_Command(handle, l2capoutbuf, 12);
+
1271 }
+
1272 
+
1273 void BTD::l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid) {
+
1274  l2capoutbuf[0] = L2CAP_CMD_CONFIG_RESPONSE; // Code
+
1275  l2capoutbuf[1] = rxid; // Identifier
+
1276  l2capoutbuf[2] = 0x0A; // Length
+
1277  l2capoutbuf[3] = 0x00;
+
1278  l2capoutbuf[4] = scid[0]; // Source CID
+
1279  l2capoutbuf[5] = scid[1];
+
1280  l2capoutbuf[6] = 0x00; // Flag
+
1281  l2capoutbuf[7] = 0x00;
+
1282  l2capoutbuf[8] = 0x00; // Result
+
1283  l2capoutbuf[9] = 0x00;
+
1284  l2capoutbuf[10] = 0x01; // Config
+
1285  l2capoutbuf[11] = 0x02;
+
1286  l2capoutbuf[12] = 0xA0;
+
1287  l2capoutbuf[13] = 0x02;
+
1288 
+
1289  L2CAP_Command(handle, l2capoutbuf, 14);
+
1290 }
+
1291 
+
1292 void BTD::l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
+
1293  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_REQUEST; // Code
+
1294  l2capoutbuf[1] = rxid; // Identifier
+
1295  l2capoutbuf[2] = 0x04; // Length
+
1296  l2capoutbuf[3] = 0x00;
+
1297  l2capoutbuf[4] = dcid[0];
+
1298  l2capoutbuf[5] = dcid[1];
+
1299  l2capoutbuf[6] = scid[0];
+
1300  l2capoutbuf[7] = scid[1];
+
1301 
+
1302  L2CAP_Command(handle, l2capoutbuf, 8);
+
1303 }
+
1304 
+
1305 void BTD::l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid) {
+
1306  l2capoutbuf[0] = L2CAP_CMD_DISCONNECT_RESPONSE; // Code
+
1307  l2capoutbuf[1] = rxid; // Identifier
+
1308  l2capoutbuf[2] = 0x04; // Length
+
1309  l2capoutbuf[3] = 0x00;
+
1310  l2capoutbuf[4] = dcid[0];
+
1311  l2capoutbuf[5] = dcid[1];
+
1312  l2capoutbuf[6] = scid[0];
+
1313  l2capoutbuf[7] = scid[1];
+
1314 
+
1315  L2CAP_Command(handle, l2capoutbuf, 8);
+
1316 }
+
1317 
+
1318 void BTD::l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh) {
+
1319  l2capoutbuf[0] = L2CAP_CMD_INFORMATION_RESPONSE; // Code
+
1320  l2capoutbuf[1] = rxid; // Identifier
+
1321  l2capoutbuf[2] = 0x08; // Length
+
1322  l2capoutbuf[3] = 0x00;
+
1323  l2capoutbuf[4] = infoTypeLow;
+
1324  l2capoutbuf[5] = infoTypeHigh;
+
1325  l2capoutbuf[6] = 0x00; // Result = success
+
1326  l2capoutbuf[7] = 0x00; // Result = success
+
1327  l2capoutbuf[8] = 0x00;
+
1328  l2capoutbuf[9] = 0x00;
+
1329  l2capoutbuf[10] = 0x00;
+
1330  l2capoutbuf[11] = 0x00;
+
1331 
+
1332  L2CAP_Command(handle, l2capoutbuf, 12);
+
1333 }
+
1334 
+
1335 /* PS3 Commands - only set Bluetooth address is implemented in this library */
+
1336 void BTD::setBdaddr(uint8_t* bdaddr) {
+
1337  /* Set the internal Bluetooth address */
+
1338  uint8_t buf[8];
+
1339  buf[0] = 0x01;
+
1340  buf[1] = 0x00;
+
1341 
+
1342  for(uint8_t i = 0; i < 6; i++)
+
1343  buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
+
1344 
+
1345  // 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
+
1346  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
+
1347 }
+
1348 
+
1349 void BTD::setMoveBdaddr(uint8_t* bdaddr) {
+
1350  /* Set the internal Bluetooth address */
+
1351  uint8_t buf[11];
+
1352  buf[0] = 0x05;
+
1353  buf[7] = 0x10;
+
1354  buf[8] = 0x01;
+
1355  buf[9] = 0x02;
+
1356  buf[10] = 0x12;
+
1357 
+
1358  for(uint8_t i = 0; i < 6; i++)
+
1359  buf[i + 1] = bdaddr[i];
+
1360 
+
1361  // 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
+
1362  pUsb->ctrlReq(bAddress, epInfo[BTD_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
+
1363 }
+
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:769
+
bool incomingWii
Definition: BTD.h:471
-
void hci_connect()
Definition: BTD.cpp:1042
-
uint8_t bNumEP
Definition: BTD.h:546
+
void hci_connect()
Definition: BTD.cpp:1050
+
uint8_t bNumEP
Definition: BTD.h:510
EpInfo * epinfo
Definition: address.h:76
-
const char * btdName
Definition: BTD.h:480
-
void hci_reset()
Definition: BTD.cpp:924
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1231
-
#define HCI_SCANNING_STATE
Definition: BTD.h:54
+
const char * btdName
Definition: BTD.h:444
+
void hci_reset()
Definition: BTD.cpp:932
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1239
+
#define HCI_SCANNING_STATE
Definition: BTD.h:52
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:81
-
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1218
-
#define EV_COMMAND_STATUS
Definition: BTD.h:98
-
#define EV_REMOTE_NAME_COMPLETE
Definition: BTD.h:85
+
#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:1226
+
#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:475
-
#define bmREQ_HCI_OUT
Definition: BTD.h:36
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1284
+
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:1292
-
bool rfcommConnectionClaimed
Definition: BTD.h:477
-
uint8_t hci_version
Definition: BTD.h:497
+
bool rfcommConnectionClaimed
Definition: BTD.h:441
+
uint8_t hci_version
Definition: BTD.h:461
-
#define EV_INQUIRY_COMPLETE
Definition: BTD.h:79
-
void hci_inquiry()
Definition: BTD.cpp:1020
-
static const uint8_t BTD_EVENT_PIPE
Definition: BTD.h:553
-
#define PS3MOVE_PID
Definition: BTD.h:27
+
#define EV_INQUIRY_COMPLETE
Definition: BTD.h:77
+
void hci_inquiry()
Definition: BTD.cpp:1028
+
static const uint8_t BTD_EVENT_PIPE
Definition: BTD.h:517
+
#define PS3MOVE_PID
Definition: BTD.h:28
-
bool pairWithWii
Definition: BTD.h:509
+
bool pairWithWii
Definition: BTD.h:473
uint8_t bMaxPacketSize0
Definition: usb_ch9.h:105
-
void hci_write_scan_disable()
Definition: BTD.cpp:946
+
#define HID_REQUEST_SET_REPORT
Definition: hid.h:72
+
void hci_write_scan_disable()
Definition: BTD.cpp:954
#define NotifyFail(...)
Definition: message.h:55
-
#define HCI_SET_NAME_STATE
Definition: BTD.h:47
-
virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: BTD.cpp:314
-
#define EV_LINK_KEY_REQUEST
Definition: BTD.h:91
-
#define HCI_DONE_STATE
Definition: BTD.h:59
-
#define BTD_NUM_SERVICES
Definition: BTD.h:190
-
#define EV_DATA_BUFFER_OVERFLOW
Definition: BTD.h:93
-
#define HCI_DISCONNECT_STATE
Definition: BTD.h:60
-
#define HCI_FLAG_CONNECT_COMPLETE
Definition: BTD.h:64
-
#define EV_PIN_CODE_REQUEST
Definition: BTD.h:90
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:805
-
const char * btdPin
Definition: BTD.h:482
-
bool motionPlusInside
Definition: BTD.h:511
-
#define EV_AUTHENTICATION_COMPLETE
Definition: BTD.h:84
-
void hci_remote_name()
Definition: BTD.cpp:989
-
#define HCI_FLAG_CONNECT_EVENT
Definition: BTD.h:71
-
#define HCI_FLAG_DISCONNECT_COMPLETE
Definition: BTD.h:65
-
#define HCI_REMOTE_NAME_STATE
Definition: BTD.h:56
-
#define USB_ERROR_FailGetDevDescr
Definition: UsbCore.h:87
-
#define HCI_FLAG_CMD_COMPLETE
Definition: BTD.h:63
-
#define PS3_VID
Definition: BTD.h:24
+
#define HCI_SET_NAME_STATE
Definition: BTD.h:45
+
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: BTD.cpp:314
+
#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:808
+
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:997
+
#define bmREQ_HID_OUT
Definition: hid.h:63
+
#define HCI_FLAG_CONNECT_EVENT
Definition: BTD.h:69
+
#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 PS3_VID
Definition: BTD.h:25
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
BTD(USB *p)
Definition: BTD.cpp:27
-
char remote_name[30]
Definition: BTD.h:491
-
#define hrJERR
Definition: max3421e.h:225
+
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
-
virtual void Reset()
-
#define EV_MAX_SLOTS_CHANGE
Definition: BTD.h:94
-
static const uint8_t BTD_DATAIN_PIPE
Definition: BTD.h:555
-
void hci_set_local_name(const char *name)
Definition: BTD.cpp:1008
-
#define EV_QOS_SETUP_COMPLETE
Definition: BTD.h:96
-
void hci_write_scan_enable()
Definition: BTD.cpp:933
-
virtual uint8_t Release()
Definition: BTD.cpp:365
+
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:1016
+
#define EV_QOS_SETUP_COMPLETE
Definition: BTD.h:94
+
void hci_write_scan_enable()
Definition: BTD.cpp:941
+
uint8_t Release()
Definition: BTD.cpp:365
virtual void FreeAddress(uint8_t addr)=0
uint8_t epAttribs
Definition: address.h:37
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1297
+
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1305
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
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
bool watingForConnection
Definition: BTD.h:471
-
#define HCI_BDADDR_STATE
Definition: BTD.h:45
-
#define HCI_CONNECT_DEVICE_STATE
Definition: BTD.h:51
+
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:519
+
bool connectToHIDDevice
Definition: BTD.h:483
- -
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:796
-
uint8_t bAddress
Definition: BTD.h:539
+ +
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:799
+
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:523
+
bool incomingHIDDevice
Definition: BTD.h:487
#define NotifyFailUnknownDevice(...)
Definition: message.h:54
-
bool pairWithHIDDevice
Definition: BTD.h:525
-
uint32_t qNextPollTime
Definition: BTD.h:548
+
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:81
+
#define EV_CONNECT_COMPLETE
Definition: BTD.h:79
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: BTD.cpp:346
-
#define EV_DISCONNECT_COMPLETE
Definition: BTD.h:83
-
#define HCI_FLAG_READ_BDADDR
Definition: BTD.h:68
-
#define IOGEAR_GBU521_PID
Definition: BTD.h:30
-
bool connectToWii
Definition: BTD.h:503
-
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:48
-
#define HCI_LOCAL_VERSION_STATE
Definition: BTD.h:46
-
bool wiiUProController
Definition: BTD.h:513
-
uint16_t hci_handle
Definition: BTD.h:487
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:122
+
#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
+
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:48
+
#define HCI_LOCAL_VERSION_STATE
Definition: BTD.h:44
+
virtual void disconnect()=0
+
bool wiiUProController
Definition: BTD.h:477
+
uint16_t hci_handle
Definition: BTD.h:451
+
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:122
#define Notifyc(...)
Definition: message.h:46
Definition: address.h:32
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1142
-
#define HCI_RESET_STATE
Definition: BTD.h:43
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1150
+
#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:292
-
#define hrNAK
Definition: max3421e.h:216
-
void hci_read_bdaddr()
Definition: BTD.cpp:955
-
void hci_inquiry_cancel()
Definition: BTD.cpp:1034
-
#define L2CAP_CMD_INFORMATION_RESPONSE
Definition: BTD.h:173
+
#define hrNAK
Definition: max3421e.h:211
+
void hci_read_bdaddr()
Definition: BTD.cpp:963
+
void hci_inquiry_cancel()
Definition: BTD.cpp:1042
+
#define L2CAP_CMD_INFORMATION_RESPONSE
Definition: BTD.h:171
uint16_t wMaxPacketSize
Definition: usb_ch9.h:146
-
uint8_t my_bdaddr[6]
Definition: BTD.h:485
-
#define HID_REQUEST_SET_REPORT
Definition: BTD.h:39
-
#define EV_INCOMING_CONNECT
Definition: BTD.h:82
-
#define HCI_CONNECT_IN_STATE
Definition: BTD.h:55
+
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:50
+
#define HCI_INQUIRY_STATE
Definition: BTD.h:48
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:57
-
#define EV_INQUIRY_RESULT
Definition: BTD.h:80
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:83
-
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:168
-
virtual uint8_t Poll()
Definition: BTD.cpp:371
-
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:170
-
static const uint8_t BTD_CONTROL_PIPE
Definition: BTD.h:551
+
#define HCI_CONNECTED_STATE
Definition: BTD.h:55
+
#define EV_INQUIRY_RESULT
Definition: BTD.h:78
+
#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:371
+
#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:33
-
#define HCI_FLAG_READ_VERSION
Definition: BTD.h:69
-
uint8_t disc_bdaddr[6]
Definition: BTD.h:489
-
bool l2capConnectionClaimed
Definition: BTD.h:473
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
+
void disconnect()
Definition: BTD.cpp:383
+
#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:67
-
#define EV_NUM_COMPLETE_PKT
Definition: BTD.h:89
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:80
-
EpInfo epInfo[BTD_MAX_ENDPOINTS]
Definition: BTD.h:541
-
#define IOGEAR_GBU521_VID
Definition: BTD.h:29
-
virtual void ACLData(uint8_t *ACLData)
-
#define PS3_PID
Definition: BTD.h:25
+
#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
+
#define PS3_PID
Definition: BTD.h:26
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data)
Definition: Usb.cpp:206
-
#define BTD_MAX_ENDPOINTS
Definition: BTD.h:189
-
#define PS3NAVIGATION_PID
Definition: BTD.h:26
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:75
-
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:171
-
#define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE
Definition: BTD.h:95
-
#define EV_COMMAND_COMPLETE
Definition: BTD.h:97
-
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1310
+
#define BTD_MAX_ENDPOINTS
Definition: BTD.h:187
+
#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:1318
uint16_t idProduct
Definition: usb_ch9.h:107
-
#define L2CAP_CMD_CONNECTION_RESPONSE
Definition: BTD.h:167
-
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:169
-
#define hci_set_flag(flag)
Definition: BTD.h:75
-
void hci_write_class_of_device()
Definition: BTD.cpp:1154
-
#define HCI_CONNECTED_DEVICE_STATE
Definition: BTD.h:52
-
#define HCI_INIT_STATE
Definition: BTD.h:42
-
#define bmREQ_HID_OUT
Definition: BTD.h:38
-
void hci_pin_code_negative_request_reply()
Definition: BTD.cpp:1104
-
#define EV_CHANGE_CONNECTION_LINK
Definition: BTD.h:87
+
#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:1162
+
#define HCI_CONNECTED_DEVICE_STATE
Definition: BTD.h:50
+
#define HCI_INIT_STATE
Definition: BTD.h:40
+
void hci_pin_code_negative_request_reply()
Definition: BTD.cpp:1112
+
#define EV_CHANGE_CONNECTION_LINK
Definition: BTD.h:85
+
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:78
-
#define hci_check_flag(flag)
Definition: BTD.h:74
-
#define EV_ROLE_CHANGED
Definition: BTD.h:88
+
#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:206
-
#define HCI_CHECK_DEVICE_SERVICE
Definition: BTD.h:48
-
Definition: UsbCore.h:190
-
virtual void Run()
-
uint8_t bConfNum
Definition: BTD.h:544
-
void hci_link_key_request_negative_reply()
Definition: BTD.cpp:1118
-
#define EV_LOOPBACK_COMMAND
Definition: BTD.h:99
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1190
-
#define EV_LINK_KEY_NOTIFICATION
Definition: BTD.h:92
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1265
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1248
-
void hci_pin_code_request_reply()
Definition: BTD.cpp:1068
-
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:166
+
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:1126
+
#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:1198
+
#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:1273
+
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1256
+
void hci_pin_code_request_reply()
Definition: BTD.cpp:1076
+
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:164
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:210
-
#define EV_ENCRYPTION_CHANGE
Definition: BTD.h:86
+
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:76
-
USB * pUsb
Definition: BTD.h:533
+
#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:1132
-
void hci_read_local_version_information()
Definition: BTD.cpp:964
-
#define HCI_FLAG_REMOTE_NAME_COMPLETE
Definition: BTD.h:66
-
void hci_accept_connection()
Definition: BTD.cpp:973
-
#define EV_PAGE_SCAN_REP_MODE
Definition: BTD.h:100
-
#define HCI_FLAG_DEVICE_FOUND
Definition: BTD.h:70
-
#define HCI_CLASS_STATE
Definition: BTD.h:44
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:761
+
void hci_authentication_request()
Definition: BTD.cpp:1140
+
void hci_read_local_version_information()
Definition: BTD.cpp:972
+
#define HCI_FLAG_REMOTE_NAME_COMPLETE
Definition: BTD.h:64
+
void hci_accept_connection()
Definition: BTD.cpp:981
+
#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:764
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
-
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:86
-
void HCI_Command(uint8_t *data, uint16_t nbytes)
Definition: BTD.cpp:919
+
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:88
+
void HCI_Command(uint8_t *data, uint16_t nbytes)
Definition: BTD.cpp:927
diff --git a/_b_t_d_8h.html b/_b_t_d_8h.html index 02cf46e7..b8f1d579 100644 --- a/_b_t_d_8h.html +++ b/_b_t_d_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -93,12 +94,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#include "Usb.h"
+#include "hid.h"
Include dependency graph for BTD.h:
- +
This graph shows which files directly or indirectly include this file:
@@ -112,10 +114,10 @@ This graph shows which files directly or indirectly include this file:
- - + +

Classes

class  BluetoothService
 
class  BTD
 
class  BluetoothService
 
@@ -135,10 +137,6 @@ Macros - - - - @@ -173,23 +171,23 @@ Macros - + - + - + - + - + - + - + - + - + @@ -281,35 +279,35 @@ Macros - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -357,8 +355,6 @@ Macros - -

Macros

 
#define bmREQ_HCI_OUT   USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
 
#define bmREQ_HID_OUT   USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
 
#define HID_REQUEST_SET_REPORT   0x09
 
#define HCI_INIT_STATE   0
 
#define HCI_RESET_STATE   1
 
#define HCI_DISCONNECT_STATE   16
 
#define HCI_FLAG_CMD_COMPLETE   0x01
#define HCI_FLAG_CMD_COMPLETE   (1UL << 0)
 
#define HCI_FLAG_CONNECT_COMPLETE   0x02
#define HCI_FLAG_CONNECT_COMPLETE   (1UL << 1)
 
#define HCI_FLAG_DISCONNECT_COMPLETE   0x04
#define HCI_FLAG_DISCONNECT_COMPLETE   (1UL << 2)
 
#define HCI_FLAG_REMOTE_NAME_COMPLETE   0x08
#define HCI_FLAG_REMOTE_NAME_COMPLETE   (1UL << 3)
 
#define HCI_FLAG_INCOMING_REQUEST   0x10
#define HCI_FLAG_INCOMING_REQUEST   (1UL << 4)
 
#define HCI_FLAG_READ_BDADDR   0x20
#define HCI_FLAG_READ_BDADDR   (1UL << 5)
 
#define HCI_FLAG_READ_VERSION   0x40
#define HCI_FLAG_READ_VERSION   (1UL << 6)
 
#define HCI_FLAG_DEVICE_FOUND   0x80
#define HCI_FLAG_DEVICE_FOUND   (1UL << 7)
 
#define HCI_FLAG_CONNECT_EVENT   0x100
#define HCI_FLAG_CONNECT_EVENT   (1UL << 8)
 
#define hci_check_flag(flag)   (hci_event_flag & (flag))
 
 
#define WII_INIT_MOTION_PLUS_STATE   21
 
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST   0x00000001
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST   (1UL << 0)
 
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS   0x00000002
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS   (1UL << 1)
 
#define L2CAP_FLAG_CONTROL_CONNECTED   0x00000004
#define L2CAP_FLAG_CONTROL_CONNECTED   (1UL << 2)
 
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE   0x00000008
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE   (1UL << 3)
 
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST   0x00000010
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST   (1UL << 4)
 
#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS   0x00000020
#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS   (1UL << 5)
 
#define L2CAP_FLAG_INTERRUPT_CONNECTED   0x00000040
#define L2CAP_FLAG_INTERRUPT_CONNECTED   (1UL << 6)
 
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE   0x00000080
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE   (1UL << 7)
 
#define L2CAP_FLAG_CONNECTION_SDP_REQUEST   0x00000100
#define L2CAP_FLAG_CONNECTION_SDP_REQUEST   (1UL << 8)
 
#define L2CAP_FLAG_CONFIG_SDP_SUCCESS   0x00000200
#define L2CAP_FLAG_CONFIG_SDP_SUCCESS   (1UL << 9)
 
#define L2CAP_FLAG_DISCONNECT_SDP_REQUEST   0x00000400
#define L2CAP_FLAG_DISCONNECT_SDP_REQUEST   (1UL << 10)
 
#define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST   0x00000800
#define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST   (1UL << 11)
 
#define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS   0x00001000
#define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS   (1UL << 12)
 
#define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST   0x00002000
#define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST   (1UL << 13)
 
#define L2CAP_FLAG_DISCONNECT_RESPONSE   0x00004000
#define L2CAP_FLAG_DISCONNECT_RESPONSE   (1UL << 14)
 
#define l2cap_check_flag(flag)   (l2cap_event_flag & (flag))
 
 
#define PAIR   1
 
#define UHS_ACL_HANDLE_OK(x, y)   ((x[0] == (y & 0xff)) && (x[1] == ((y >> 8) | 0x20)))
 

Macro Definition Documentation

@@ -371,7 +367,7 @@ Macros
-

Definition at line 24 of file BTD.h.

+

Definition at line 25 of file BTD.h.

@@ -385,7 +381,7 @@ Macros
-

Definition at line 25 of file BTD.h.

+

Definition at line 26 of file BTD.h.

@@ -399,7 +395,7 @@ Macros
-

Definition at line 26 of file BTD.h.

+

Definition at line 27 of file BTD.h.

@@ -413,7 +409,7 @@ Macros
-

Definition at line 27 of file BTD.h.

+

Definition at line 28 of file BTD.h.

@@ -427,7 +423,7 @@ Macros
-

Definition at line 29 of file BTD.h.

+

Definition at line 30 of file BTD.h.

@@ -441,7 +437,7 @@ Macros
-

Definition at line 30 of file BTD.h.

+

Definition at line 31 of file BTD.h.

@@ -455,7 +451,7 @@ Macros
-

Definition at line 33 of file BTD.h.

+

Definition at line 34 of file BTD.h.

@@ -469,35 +465,7 @@ Macros
-

Definition at line 36 of file BTD.h.

- -
- - -
-
- -

Definition at line 38 of file BTD.h.

- -
-
- -
-
- - - - -
#define HID_REQUEST_SET_REPORT   0x09
-
- -

Definition at line 39 of file BTD.h.

+

Definition at line 37 of file BTD.h.

@@ -511,7 +479,7 @@ Macros
-

Definition at line 42 of file BTD.h.

+

Definition at line 40 of file BTD.h.

@@ -525,7 +493,7 @@ Macros
-

Definition at line 43 of file BTD.h.

+

Definition at line 41 of file BTD.h.

@@ -539,7 +507,7 @@ Macros
-

Definition at line 44 of file BTD.h.

+

Definition at line 42 of file BTD.h.

@@ -553,7 +521,7 @@ Macros
-

Definition at line 45 of file BTD.h.

+

Definition at line 43 of file BTD.h.

@@ -567,7 +535,7 @@ Macros
-

Definition at line 46 of file BTD.h.

+

Definition at line 44 of file BTD.h.

@@ -581,7 +549,7 @@ Macros
-

Definition at line 47 of file BTD.h.

+

Definition at line 45 of file BTD.h.

@@ -595,7 +563,7 @@ Macros
-

Definition at line 48 of file BTD.h.

+

Definition at line 46 of file BTD.h.

@@ -609,7 +577,7 @@ Macros
-

Definition at line 50 of file BTD.h.

+

Definition at line 48 of file BTD.h.

@@ -623,7 +591,7 @@ Macros
-

Definition at line 51 of file BTD.h.

+

Definition at line 49 of file BTD.h.

@@ -637,7 +605,7 @@ Macros
-

Definition at line 52 of file BTD.h.

+

Definition at line 50 of file BTD.h.

@@ -651,7 +619,7 @@ Macros
-

Definition at line 54 of file BTD.h.

+

Definition at line 52 of file BTD.h.

@@ -665,7 +633,7 @@ Macros
-

Definition at line 55 of file BTD.h.

+

Definition at line 53 of file BTD.h.

@@ -679,7 +647,7 @@ Macros
-

Definition at line 56 of file BTD.h.

+

Definition at line 54 of file BTD.h.

@@ -693,7 +661,7 @@ Macros
-

Definition at line 57 of file BTD.h.

+

Definition at line 55 of file BTD.h.

@@ -707,7 +675,7 @@ Macros
-

Definition at line 58 of file BTD.h.

+

Definition at line 56 of file BTD.h.

@@ -721,7 +689,7 @@ Macros
-

Definition at line 59 of file BTD.h.

+

Definition at line 57 of file BTD.h.

@@ -735,7 +703,7 @@ Macros
-

Definition at line 60 of file BTD.h.

+

Definition at line 58 of file BTD.h.

@@ -744,12 +712,12 @@ Macros
- +
#define HCI_FLAG_CMD_COMPLETE   0x01#define HCI_FLAG_CMD_COMPLETE   (1UL << 0)
-

Definition at line 63 of file BTD.h.

+

Definition at line 61 of file BTD.h.

@@ -758,12 +726,12 @@ Macros
- +
#define HCI_FLAG_CONNECT_COMPLETE   0x02#define HCI_FLAG_CONNECT_COMPLETE   (1UL << 1)
-

Definition at line 64 of file BTD.h.

+

Definition at line 62 of file BTD.h.

@@ -772,12 +740,12 @@ Macros
- +
#define HCI_FLAG_DISCONNECT_COMPLETE   0x04#define HCI_FLAG_DISCONNECT_COMPLETE   (1UL << 2)
-

Definition at line 65 of file BTD.h.

+

Definition at line 63 of file BTD.h.

@@ -786,12 +754,12 @@ Macros
- +
#define HCI_FLAG_REMOTE_NAME_COMPLETE   0x08#define HCI_FLAG_REMOTE_NAME_COMPLETE   (1UL << 3)
-

Definition at line 66 of file BTD.h.

+

Definition at line 64 of file BTD.h.

@@ -800,12 +768,12 @@ Macros
- +
#define HCI_FLAG_INCOMING_REQUEST   0x10#define HCI_FLAG_INCOMING_REQUEST   (1UL << 4)
-

Definition at line 67 of file BTD.h.

+

Definition at line 65 of file BTD.h.

@@ -814,12 +782,12 @@ Macros
- +
#define HCI_FLAG_READ_BDADDR   0x20#define HCI_FLAG_READ_BDADDR   (1UL << 5)
-

Definition at line 68 of file BTD.h.

+

Definition at line 66 of file BTD.h.

@@ -828,12 +796,12 @@ Macros
- +
#define HCI_FLAG_READ_VERSION   0x40#define HCI_FLAG_READ_VERSION   (1UL << 6)
-

Definition at line 69 of file BTD.h.

+

Definition at line 67 of file BTD.h.

@@ -842,12 +810,12 @@ Macros
- +
#define HCI_FLAG_DEVICE_FOUND   0x80#define HCI_FLAG_DEVICE_FOUND   (1UL << 7)
-

Definition at line 70 of file BTD.h.

+

Definition at line 68 of file BTD.h.

@@ -856,12 +824,12 @@ Macros
- +
#define HCI_FLAG_CONNECT_EVENT   0x100#define HCI_FLAG_CONNECT_EVENT   (1UL << 8)
-

Definition at line 71 of file BTD.h.

+

Definition at line 69 of file BTD.h.

@@ -879,7 +847,7 @@ Macros
-

Definition at line 74 of file BTD.h.

+

Definition at line 72 of file BTD.h.

@@ -897,7 +865,7 @@ Macros
-

Definition at line 75 of file BTD.h.

+

Definition at line 73 of file BTD.h.

@@ -915,7 +883,7 @@ Macros
-

Definition at line 76 of file BTD.h.

+

Definition at line 74 of file BTD.h.

@@ -929,7 +897,7 @@ Macros
-

Definition at line 79 of file BTD.h.

+

Definition at line 77 of file BTD.h.

@@ -943,7 +911,7 @@ Macros
-

Definition at line 80 of file BTD.h.

+

Definition at line 78 of file BTD.h.

@@ -957,7 +925,7 @@ Macros
-

Definition at line 81 of file BTD.h.

+

Definition at line 79 of file BTD.h.

@@ -971,7 +939,7 @@ Macros
-

Definition at line 82 of file BTD.h.

+

Definition at line 80 of file BTD.h.

@@ -985,7 +953,7 @@ Macros
-

Definition at line 83 of file BTD.h.

+

Definition at line 81 of file BTD.h.

@@ -999,7 +967,7 @@ Macros
-

Definition at line 84 of file BTD.h.

+

Definition at line 82 of file BTD.h.

@@ -1013,7 +981,7 @@ Macros
-

Definition at line 85 of file BTD.h.

+

Definition at line 83 of file BTD.h.

@@ -1027,7 +995,7 @@ Macros
-

Definition at line 86 of file BTD.h.

+

Definition at line 84 of file BTD.h.

@@ -1041,7 +1009,7 @@ Macros
-

Definition at line 87 of file BTD.h.

+

Definition at line 85 of file BTD.h.

@@ -1055,7 +1023,7 @@ Macros
-

Definition at line 88 of file BTD.h.

+

Definition at line 86 of file BTD.h.

@@ -1069,7 +1037,7 @@ Macros
-

Definition at line 89 of file BTD.h.

+

Definition at line 87 of file BTD.h.

@@ -1083,7 +1051,7 @@ Macros
-

Definition at line 90 of file BTD.h.

+

Definition at line 88 of file BTD.h.

@@ -1097,7 +1065,7 @@ Macros
-

Definition at line 91 of file BTD.h.

+

Definition at line 89 of file BTD.h.

@@ -1111,7 +1079,7 @@ Macros
-

Definition at line 92 of file BTD.h.

+

Definition at line 90 of file BTD.h.

@@ -1125,7 +1093,7 @@ Macros
-

Definition at line 93 of file BTD.h.

+

Definition at line 91 of file BTD.h.

@@ -1139,7 +1107,7 @@ Macros
-

Definition at line 94 of file BTD.h.

+

Definition at line 92 of file BTD.h.

@@ -1153,7 +1121,7 @@ Macros
-

Definition at line 95 of file BTD.h.

+

Definition at line 93 of file BTD.h.

@@ -1167,7 +1135,7 @@ Macros
-

Definition at line 96 of file BTD.h.

+

Definition at line 94 of file BTD.h.

@@ -1181,7 +1149,7 @@ Macros
-

Definition at line 97 of file BTD.h.

+

Definition at line 95 of file BTD.h.

@@ -1195,7 +1163,7 @@ Macros
-

Definition at line 98 of file BTD.h.

+

Definition at line 96 of file BTD.h.

@@ -1209,7 +1177,7 @@ Macros
-

Definition at line 99 of file BTD.h.

+

Definition at line 97 of file BTD.h.

@@ -1223,7 +1191,7 @@ Macros
-

Definition at line 100 of file BTD.h.

+

Definition at line 98 of file BTD.h.

@@ -1237,7 +1205,7 @@ Macros
-

Definition at line 103 of file BTD.h.

+

Definition at line 101 of file BTD.h.

@@ -1251,7 +1219,7 @@ Macros
-

Definition at line 104 of file BTD.h.

+

Definition at line 102 of file BTD.h.

@@ -1265,7 +1233,7 @@ Macros
-

Definition at line 107 of file BTD.h.

+

Definition at line 105 of file BTD.h.

@@ -1279,7 +1247,7 @@ Macros
-

Definition at line 108 of file BTD.h.

+

Definition at line 106 of file BTD.h.

@@ -1293,7 +1261,7 @@ Macros
-

Definition at line 109 of file BTD.h.

+

Definition at line 107 of file BTD.h.

@@ -1307,7 +1275,7 @@ Macros
-

Definition at line 110 of file BTD.h.

+

Definition at line 108 of file BTD.h.

@@ -1321,7 +1289,7 @@ Macros
-

Definition at line 113 of file BTD.h.

+

Definition at line 111 of file BTD.h.

@@ -1335,7 +1303,7 @@ Macros
-

Definition at line 114 of file BTD.h.

+

Definition at line 112 of file BTD.h.

@@ -1349,7 +1317,7 @@ Macros
-

Definition at line 115 of file BTD.h.

+

Definition at line 113 of file BTD.h.

@@ -1363,7 +1331,7 @@ Macros
-

Definition at line 116 of file BTD.h.

+

Definition at line 114 of file BTD.h.

@@ -1377,7 +1345,7 @@ Macros
-

Definition at line 119 of file BTD.h.

+

Definition at line 117 of file BTD.h.

@@ -1391,7 +1359,7 @@ Macros
-

Definition at line 120 of file BTD.h.

+

Definition at line 118 of file BTD.h.

@@ -1405,7 +1373,7 @@ Macros
-

Definition at line 123 of file BTD.h.

+

Definition at line 121 of file BTD.h.

@@ -1419,7 +1387,7 @@ Macros
-

Definition at line 124 of file BTD.h.

+

Definition at line 122 of file BTD.h.

@@ -1433,7 +1401,7 @@ Macros
-

Definition at line 126 of file BTD.h.

+

Definition at line 124 of file BTD.h.

@@ -1447,7 +1415,7 @@ Macros
-

Definition at line 129 of file BTD.h.

+

Definition at line 127 of file BTD.h.

@@ -1461,7 +1429,7 @@ Macros
-

Definition at line 130 of file BTD.h.

+

Definition at line 128 of file BTD.h.

@@ -1475,7 +1443,7 @@ Macros
-

Definition at line 131 of file BTD.h.

+

Definition at line 129 of file BTD.h.

@@ -1489,7 +1457,7 @@ Macros
-

Definition at line 132 of file BTD.h.

+

Definition at line 130 of file BTD.h.

@@ -1503,7 +1471,7 @@ Macros
-

Definition at line 133 of file BTD.h.

+

Definition at line 131 of file BTD.h.

@@ -1512,12 +1480,12 @@ Macros
- +
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST   0x00000001#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST   (1UL << 0)
-

Definition at line 136 of file BTD.h.

+

Definition at line 134 of file BTD.h.

@@ -1526,12 +1494,12 @@ Macros
- +
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS   0x00000002#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS   (1UL << 1)
-

Definition at line 137 of file BTD.h.

+

Definition at line 135 of file BTD.h.

@@ -1540,12 +1508,12 @@ Macros
- +
#define L2CAP_FLAG_CONTROL_CONNECTED   0x00000004#define L2CAP_FLAG_CONTROL_CONNECTED   (1UL << 2)
-

Definition at line 138 of file BTD.h.

+

Definition at line 136 of file BTD.h.

@@ -1554,12 +1522,12 @@ Macros
- +
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE   0x00000008#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE   (1UL << 3)
-

Definition at line 139 of file BTD.h.

+

Definition at line 137 of file BTD.h.

@@ -1568,12 +1536,12 @@ Macros
- +
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST   0x00000010#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST   (1UL << 4)
-

Definition at line 142 of file BTD.h.

+

Definition at line 140 of file BTD.h.

@@ -1582,12 +1550,12 @@ Macros
- +
#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS   0x00000020#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS   (1UL << 5)
-

Definition at line 143 of file BTD.h.

+

Definition at line 141 of file BTD.h.

@@ -1596,12 +1564,12 @@ Macros
- +
#define L2CAP_FLAG_INTERRUPT_CONNECTED   0x00000040#define L2CAP_FLAG_INTERRUPT_CONNECTED   (1UL << 6)
-

Definition at line 144 of file BTD.h.

+

Definition at line 142 of file BTD.h.

@@ -1610,12 +1578,12 @@ Macros
- +
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE   0x00000080#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE   (1UL << 7)
-

Definition at line 145 of file BTD.h.

+

Definition at line 143 of file BTD.h.

@@ -1624,12 +1592,12 @@ Macros
- +
#define L2CAP_FLAG_CONNECTION_SDP_REQUEST   0x00000100#define L2CAP_FLAG_CONNECTION_SDP_REQUEST   (1UL << 8)
-

Definition at line 148 of file BTD.h.

+

Definition at line 146 of file BTD.h.

@@ -1638,12 +1606,12 @@ Macros
- +
#define L2CAP_FLAG_CONFIG_SDP_SUCCESS   0x00000200#define L2CAP_FLAG_CONFIG_SDP_SUCCESS   (1UL << 9)
-

Definition at line 149 of file BTD.h.

+

Definition at line 147 of file BTD.h.

@@ -1652,12 +1620,12 @@ Macros
- +
#define L2CAP_FLAG_DISCONNECT_SDP_REQUEST   0x00000400#define L2CAP_FLAG_DISCONNECT_SDP_REQUEST   (1UL << 10)
-

Definition at line 150 of file BTD.h.

+

Definition at line 148 of file BTD.h.

@@ -1666,12 +1634,12 @@ Macros
- +
#define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST   0x00000800#define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST   (1UL << 11)
-

Definition at line 153 of file BTD.h.

+

Definition at line 151 of file BTD.h.

@@ -1680,12 +1648,12 @@ Macros
- +
#define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS   0x00001000#define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS   (1UL << 12)
-

Definition at line 154 of file BTD.h.

+

Definition at line 152 of file BTD.h.

@@ -1694,12 +1662,12 @@ Macros
- +
#define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST   0x00002000#define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST   (1UL << 13)
-

Definition at line 155 of file BTD.h.

+

Definition at line 153 of file BTD.h.

@@ -1708,12 +1676,12 @@ Macros
- +
#define L2CAP_FLAG_DISCONNECT_RESPONSE   0x00004000#define L2CAP_FLAG_DISCONNECT_RESPONSE   (1UL << 14)
-

Definition at line 157 of file BTD.h.

+

Definition at line 155 of file BTD.h.

@@ -1731,7 +1699,7 @@ Macros
-

Definition at line 160 of file BTD.h.

+

Definition at line 158 of file BTD.h.

@@ -1749,7 +1717,7 @@ Macros
-

Definition at line 161 of file BTD.h.

+

Definition at line 159 of file BTD.h.

@@ -1767,7 +1735,7 @@ Macros
-

Definition at line 162 of file BTD.h.

+

Definition at line 160 of file BTD.h.

@@ -1781,7 +1749,7 @@ Macros
-

Definition at line 165 of file BTD.h.

+

Definition at line 163 of file BTD.h.

@@ -1795,7 +1763,7 @@ Macros
-

Definition at line 166 of file BTD.h.

+

Definition at line 164 of file BTD.h.

@@ -1809,7 +1777,7 @@ Macros
-

Definition at line 167 of file BTD.h.

+

Definition at line 165 of file BTD.h.

@@ -1823,7 +1791,7 @@ Macros
-

Definition at line 168 of file BTD.h.

+

Definition at line 166 of file BTD.h.

@@ -1837,7 +1805,7 @@ Macros
-

Definition at line 169 of file BTD.h.

+

Definition at line 167 of file BTD.h.

@@ -1851,7 +1819,7 @@ Macros
-

Definition at line 170 of file BTD.h.

+

Definition at line 168 of file BTD.h.

@@ -1865,7 +1833,7 @@ Macros
-

Definition at line 171 of file BTD.h.

+

Definition at line 169 of file BTD.h.

@@ -1879,7 +1847,7 @@ Macros
-

Definition at line 172 of file BTD.h.

+

Definition at line 170 of file BTD.h.

@@ -1893,7 +1861,7 @@ Macros
-

Definition at line 173 of file BTD.h.

+

Definition at line 171 of file BTD.h.

@@ -1907,7 +1875,7 @@ Macros
-

Definition at line 176 of file BTD.h.

+

Definition at line 174 of file BTD.h.

@@ -1921,7 +1889,7 @@ Macros
-

Definition at line 177 of file BTD.h.

+

Definition at line 175 of file BTD.h.

@@ -1935,7 +1903,7 @@ Macros
-

Definition at line 180 of file BTD.h.

+

Definition at line 178 of file BTD.h.

@@ -1949,7 +1917,7 @@ Macros
-

Definition at line 181 of file BTD.h.

+

Definition at line 179 of file BTD.h.

@@ -1963,7 +1931,7 @@ Macros
-

Definition at line 182 of file BTD.h.

+

Definition at line 180 of file BTD.h.

@@ -1977,7 +1945,7 @@ Macros
-

Definition at line 183 of file BTD.h.

+

Definition at line 181 of file BTD.h.

@@ -1991,7 +1959,7 @@ Macros
-

Definition at line 186 of file BTD.h.

+

Definition at line 184 of file BTD.h.

@@ -2005,7 +1973,7 @@ Macros
-

Definition at line 187 of file BTD.h.

+

Definition at line 185 of file BTD.h.

@@ -2019,7 +1987,7 @@ Macros
-

Definition at line 189 of file BTD.h.

+

Definition at line 187 of file BTD.h.

@@ -2033,7 +2001,7 @@ Macros
-

Definition at line 190 of file BTD.h.

+

Definition at line 188 of file BTD.h.

@@ -2047,35 +2015,7 @@ Macros
-

Definition at line 192 of file BTD.h.

- -
- - -
-
- - - - - - - - - - - - - - - - - - -
#define UHS_ACL_HANDLE_OK( x,
 
)   ((x[0] == (y & 0xff)) && (x[1] == ((y >> 8) | 0x20)))
-
- -

Definition at line 207 of file BTD.h.

+

Definition at line 190 of file BTD.h.

@@ -2084,7 +2024,7 @@ Macros diff --git a/_b_t_d_8h__dep__incl.md5 b/_b_t_d_8h__dep__incl.md5 index c136623d..3f896a89 100644 --- a/_b_t_d_8h__dep__incl.md5 +++ b/_b_t_d_8h__dep__incl.md5 @@ -1 +1 @@ -a586d33041837831328e4bd5a24cb1bb \ No newline at end of file +1cf25c5527b32b2a9e530f3758fe7f24 \ No newline at end of file diff --git a/_b_t_d_8h__incl.map b/_b_t_d_8h__incl.map index 830f9213..76e8f727 100644 --- a/_b_t_d_8h__incl.map +++ b/_b_t_d_8h__incl.map @@ -1,3 +1,5 @@ - + + + diff --git a/_b_t_d_8h__incl.md5 b/_b_t_d_8h__incl.md5 index c6726354..156dedb9 100644 --- a/_b_t_d_8h__incl.md5 +++ b/_b_t_d_8h__incl.md5 @@ -1 +1 @@ -6a148ecdc8a7fa65c24885517e9426dd \ No newline at end of file +5207daceba9d7a9a37aadb1360508ea8 \ No newline at end of file diff --git a/_b_t_d_8h__incl.png b/_b_t_d_8h__incl.png index dc13158ec027cb433e35d565bda4bae8b6dc7049..be8d449474f3a942c342cecff26e347a285f05dc 100644 GIT binary patch literal 11357 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�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 P4Z}%`D~MHy82bMY2ty73 literal 2292 zcmb7GX*3&(5{{*jR$_MrwN{H-8haa5TO_ph5HyyQqV}7FqIPK&uR>KK#Vx88ORcrn z60Mfka%-!lYUxF+QCp}jeL3&Gch39!e$32|IWu$SocX?QQtfPzkW*5p0002Q(!$Jv z6A>H>1_3$#w7CQh006zQG`s2;$;EV!3bM8qGYNJYqy$*nyIW{DWeMOSDj zDu|p^7zJJP;urZYD7PYabWHF4=`_9L z{waT+)t|2uvHo<%nBY4d`-8o*D0J;+A4u#VPp{P@Jpq`U$_se}Oum|cIjx8R(p2Z5ElP@36a+CWfC28*(t^n#&JjEFPu;;xEI&}K{~B^ zrn~flYu$a4tnu~bap?Y)pl!HUvyPLaqg|eU@I}HOJAW8Pl>Gb|={Fw*FKuq7en^)_ zPE1UQ1dTYQ)TMNZwcr=hz|mGG-I(F4qft!n&(DmP=l}U6$mGF;2lYV{+G%NN&l>{A zhSsOv_%D1U2OYLbWt)TX5Rc5+S?s<*O&htn`Jza{)Og6y&=BaPTMVNp?)YGk$R{}7 zXyRq}o7V3_6`2YaX`;$DFKWGeM9|a%GBQI}xI|1@SXkIbR3ttss^#^%bz-O3^v-z_ zgrEP3u~F>74lVk;np!c6X5*^aQ=U~hVd*1Gbo&0K!nrP9eT+}wbm7Lv?<=E~dHeZ6 zG6neb%N}i!S2-JJ0i@NSjl4A5f|4TBhYok{s7z*@B5GqP7d+Q@_@s^Q|2kl;YHSm? z6GBe}iKX`|X8Ggs+SXK9qLf~M5~eL?-(fv4GjmlMYVsIXp~Em(-2E|Q+tSh!#^{rL zJrnOH()Kyhn%y2l3j!86*CpylaOm%5Oa+_XD zDh;0e{k?Y;CZbVkMnFcf%)1Bu*3@M56P*tD*lSS&gaqLpuU)E0IAdV&9zU?KK+YzU z`?#HFfRhPVbsZfyOr8c0DrO(-_;-|ZQJg{33X>q4cv3^0k7H*O>ehKPuYDl{v6ZC#Ens}ZMeY+zSrI*GG{ zQXJ2)in8+i9B8DGb2?JCpH*$9iHlVi9ahm9p7y_QKPg}p5MWRn%H2t@MBADw2T+MR)O z#lU1P51zlT;G^O>6BAF7@6^vIM@O@5M!!zQ)XL#5v$#EauXWj2l_X=xn18x?+qnn@ z?3;M)ck-K#FNdE=NO~Vr)1yr#Bu0YzMRpY+Jv%~E;b9>2c`=G0@}pO;wmYi#zlSC%MF09n&Q+tZvp|6A4DM{g}4M+Ic2#%k0|3YafgsPY!pa zJ^_zkVoo+?=j0#(431Q2YP6}H=PA*w4{ZLiwK<3UTIcf*USIane%8xAC^r?|mGK}$ zahPT+;aUHFaC5E)La2-oinPwvwQM}mCDE*s`Png58%x*T{r-;6pc8Pv>k4q%%5L22 z#9LkN1`Uutm}|SJf==q)QmVu>-7P03CC#T3HW+0hK6LpD-`b*vHS)EBu|%WjU8|wX zNphk_5#Apj6_ufA@C+@~fEO#3MB2TGR?D@_;5#aGkc1Uhn%`D;YtFpVkVNL2FPdx$ z%^Ats;BV5p;;qIOOnC9sY)kiN%&ne!u4XDeMg5fx@X~CR`@FqV_;A`XPr= zh4k;a*l%!ydc}2o`!b1=mt!vK`48QPK^z<$ZeMn7zt^B-fgmcFCijwoyQ-*?fyUs; z`D`Kt{HkhLp!J?OF5D=smyhIBfsU$=wN+&cCz--78g_ehSC*v+J(OniDNSVh{12jg~p%p^8lWPl-#_ w#wLEp=D^Tppdnd36qKRJX^Lg@Rmv?T(masIoNoqTX>Maybq$;JFEQmrVgLXD diff --git a/_b_t_d_8h_source.html b/_b_t_d_8h_source.html index acb7e89f..181e87c2 100644 --- a/_b_t_d_8h_source.html +++ b/_b_t_d_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -110,461 +111,477 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
19 #define _btd_h_
20 
21 #include "Usb.h"
-
22 
-
23 //PID and VID of the Sony PS3 devices
-
24 #define PS3_VID 0x054C // Sony Corporation
-
25 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
-
26 #define PS3NAVIGATION_PID 0x042F // Navigation controller
-
27 #define PS3MOVE_PID 0x03D5 // Motion controller
-
28 
-
29 #define IOGEAR_GBU521_VID 0x0A5C // The IOGEAR GBU521 dongle does not presents itself correctly, so we have to check for it manually
-
30 #define IOGEAR_GBU521_PID 0x21E8
-
31 
-
32 /* Bluetooth dongle data taken from descriptors */
-
33 #define BULK_MAXPKTSIZE 64 // Max size for ACL data
-
34 
-
35 // Used in control endpoint header for HCI Commands
-
36 #define bmREQ_HCI_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_DEVICE
-
37 // Used in control endpoint header for HID Commands
-
38 #define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
-
39 #define HID_REQUEST_SET_REPORT 0x09
-
40 
-
41 /* Bluetooth HCI states for hci_task() */
-
42 #define HCI_INIT_STATE 0
-
43 #define HCI_RESET_STATE 1
-
44 #define HCI_CLASS_STATE 2
-
45 #define HCI_BDADDR_STATE 3
-
46 #define HCI_LOCAL_VERSION_STATE 4
-
47 #define HCI_SET_NAME_STATE 5
-
48 #define HCI_CHECK_DEVICE_SERVICE 6
-
49 
-
50 #define HCI_INQUIRY_STATE 7 // These three states are only used if it should pair and connect to a device
-
51 #define HCI_CONNECT_DEVICE_STATE 8
-
52 #define HCI_CONNECTED_DEVICE_STATE 9
-
53 
-
54 #define HCI_SCANNING_STATE 10
-
55 #define HCI_CONNECT_IN_STATE 11
-
56 #define HCI_REMOTE_NAME_STATE 12
-
57 #define HCI_CONNECTED_STATE 13
-
58 #define HCI_DISABLE_SCAN_STATE 14
-
59 #define HCI_DONE_STATE 15
-
60 #define HCI_DISCONNECT_STATE 16
-
61 
-
62 /* HCI event flags*/
-
63 #define HCI_FLAG_CMD_COMPLETE 0x01
-
64 #define HCI_FLAG_CONNECT_COMPLETE 0x02
-
65 #define HCI_FLAG_DISCONNECT_COMPLETE 0x04
-
66 #define HCI_FLAG_REMOTE_NAME_COMPLETE 0x08
-
67 #define HCI_FLAG_INCOMING_REQUEST 0x10
-
68 #define HCI_FLAG_READ_BDADDR 0x20
-
69 #define HCI_FLAG_READ_VERSION 0x40
-
70 #define HCI_FLAG_DEVICE_FOUND 0x80
-
71 #define HCI_FLAG_CONNECT_EVENT 0x100
-
72 
-
73 /* Macros for HCI event flag tests */
-
74 #define hci_check_flag(flag) (hci_event_flag & (flag))
-
75 #define hci_set_flag(flag) (hci_event_flag |= (flag))
-
76 #define hci_clear_flag(flag) (hci_event_flag &= ~(flag))
-
77 
-
78 /* HCI Events managed */
-
79 #define EV_INQUIRY_COMPLETE 0x01
-
80 #define EV_INQUIRY_RESULT 0x02
-
81 #define EV_CONNECT_COMPLETE 0x03
-
82 #define EV_INCOMING_CONNECT 0x04
-
83 #define EV_DISCONNECT_COMPLETE 0x05
-
84 #define EV_AUTHENTICATION_COMPLETE 0x06
-
85 #define EV_REMOTE_NAME_COMPLETE 0x07
-
86 #define EV_ENCRYPTION_CHANGE 0x08
-
87 #define EV_CHANGE_CONNECTION_LINK 0x09
-
88 #define EV_ROLE_CHANGED 0x12
-
89 #define EV_NUM_COMPLETE_PKT 0x13
-
90 #define EV_PIN_CODE_REQUEST 0x16
-
91 #define EV_LINK_KEY_REQUEST 0x17
-
92 #define EV_LINK_KEY_NOTIFICATION 0x18
-
93 #define EV_DATA_BUFFER_OVERFLOW 0x1A
-
94 #define EV_MAX_SLOTS_CHANGE 0x1B
-
95 #define EV_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C
-
96 #define EV_QOS_SETUP_COMPLETE 0x0D
-
97 #define EV_COMMAND_COMPLETE 0x0E
-
98 #define EV_COMMAND_STATUS 0x0F
-
99 #define EV_LOOPBACK_COMMAND 0x19
-
100 #define EV_PAGE_SCAN_REP_MODE 0x20
-
101 
-
102 /* Bluetooth states for the different Bluetooth drivers */
-
103 #define L2CAP_WAIT 0
-
104 #define L2CAP_DONE 1
-
105 
-
106 /* Used for HID Control channel */
-
107 #define L2CAP_CONTROL_CONNECT_REQUEST 2
-
108 #define L2CAP_CONTROL_CONFIG_REQUEST 3
-
109 #define L2CAP_CONTROL_SUCCESS 4
-
110 #define L2CAP_CONTROL_DISCONNECT 5
-
111 
-
112 /* Used for HID Interrupt channel */
-
113 #define L2CAP_INTERRUPT_SETUP 6
-
114 #define L2CAP_INTERRUPT_CONNECT_REQUEST 7
-
115 #define L2CAP_INTERRUPT_CONFIG_REQUEST 8
-
116 #define L2CAP_INTERRUPT_DISCONNECT 9
-
117 
-
118 /* Used for SDP channel */
-
119 #define L2CAP_SDP_WAIT 10
-
120 #define L2CAP_SDP_SUCCESS 11
-
121 
-
122 /* Used for RFCOMM channel */
-
123 #define L2CAP_RFCOMM_WAIT 12
-
124 #define L2CAP_RFCOMM_SUCCESS 13
+
22 #include "hid.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 #define L2CAP_DISCONNECT_RESPONSE 14 // Used for both SDP and RFCOMM channel
-
127 
-
128 /* Bluetooth states used by some drivers */
-
129 #define TURN_ON_LED 17
-
130 #define PS3_ENABLE_SIXAXIS 18
-
131 #define WII_CHECK_MOTION_PLUS_STATE 19
-
132 #define WII_CHECK_EXTENSION_STATE 20
-
133 #define WII_INIT_MOTION_PLUS_STATE 21
-
134 
-
135 /* L2CAP event flags for HID Control channel */
-
136 #define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST 0x00000001
-
137 #define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS 0x00000002
-
138 #define L2CAP_FLAG_CONTROL_CONNECTED 0x00000004
-
139 #define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE 0x00000008
-
140 
-
141 /* L2CAP event flags for HID Interrupt channel */
-
142 #define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST 0x00000010
-
143 #define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS 0x00000020
-
144 #define L2CAP_FLAG_INTERRUPT_CONNECTED 0x00000040
-
145 #define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE 0x00000080
-
146 
-
147 /* L2CAP event flags for SDP channel */
-
148 #define L2CAP_FLAG_CONNECTION_SDP_REQUEST 0x00000100
-
149 #define L2CAP_FLAG_CONFIG_SDP_SUCCESS 0x00000200
-
150 #define L2CAP_FLAG_DISCONNECT_SDP_REQUEST 0x00000400
-
151 
-
152 /* L2CAP event flags for RFCOMM channel */
-
153 #define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST 0x00000800
-
154 #define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS 0x00001000
-
155 #define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST 0x00002000
+
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 #define L2CAP_FLAG_DISCONNECT_RESPONSE 0x00004000
-
158 
-
159 /* Macros for L2CAP event flag tests */
-
160 #define l2cap_check_flag(flag) (l2cap_event_flag & (flag))
-
161 #define l2cap_set_flag(flag) (l2cap_event_flag |= (flag))
-
162 #define l2cap_clear_flag(flag) (l2cap_event_flag &= ~(flag))
-
163 
-
164 /* L2CAP signaling commands */
-
165 #define L2CAP_CMD_COMMAND_REJECT 0x01
-
166 #define L2CAP_CMD_CONNECTION_REQUEST 0x02
-
167 #define L2CAP_CMD_CONNECTION_RESPONSE 0x03
-
168 #define L2CAP_CMD_CONFIG_REQUEST 0x04
-
169 #define L2CAP_CMD_CONFIG_RESPONSE 0x05
-
170 #define L2CAP_CMD_DISCONNECT_REQUEST 0x06
-
171 #define L2CAP_CMD_DISCONNECT_RESPONSE 0x07
-
172 #define L2CAP_CMD_INFORMATION_REQUEST 0x0A
-
173 #define L2CAP_CMD_INFORMATION_RESPONSE 0x0B
-
174 
-
175 // Used For Connection Response - Remember to Include High Byte
-
176 #define PENDING 0x01
-
177 #define SUCCESSFUL 0x00
-
178 
-
179 /* Bluetooth L2CAP PSM - see http://www.bluetooth.org/Technical/AssignedNumbers/logical_link.htm */
-
180 #define SDP_PSM 0x01 // Service Discovery Protocol PSM Value
-
181 #define RFCOMM_PSM 0x03 // RFCOMM PSM Value
-
182 #define HID_CTRL_PSM 0x11 // HID_Control PSM Value
-
183 #define HID_INTR_PSM 0x13 // HID_Interrupt PSM Value
-
184 
-
185 // Used to determine if it is a Bluetooth dongle
-
186 #define WI_SUBCLASS_RF 0x01 // RF Controller
-
187 #define WI_PROTOCOL_BT 0x01 // Bluetooth Programming Interface
-
188 
-
189 #define BTD_MAX_ENDPOINTS 4
-
190 #define BTD_NUM_SERVICES 4 // Max number of Bluetooth services - if you need more than 4 simply increase this number
+
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 #define PAIR 1
+
192 class BluetoothService;
193 
-
194 /* acl_handle_ok or it's a new connection */
-
195 #if 0
-
196 #define UHS_ACL_HANDLE_OK(x, y) ((uint16_t)(x[0]) | (uint16_t)(x[1] << 8)) == (y | 0x2000U)
-
197 #else
-
198 /*
-
199  * Better implementation.
-
200  * o One place for this code, it is reused four times in the source.
-
201  * Perhaps it is better as a function.
-
202  * o This should be faster since the && operation can early exit, this means
-
203  * the shift would only be performed if the first byte matches.
-
204  * o Casting is eliminated.
-
205  * o How does this compare in code size? No difference. It is a free optimization.
-
206  */
-
207 #define UHS_ACL_HANDLE_OK(x, y) ((x[0] == (y & 0xff)) && (x[1] == ((y >> 8) | 0x20)))
-
208 #endif
-
209 
- -
212 public:
-
217  virtual void ACLData(uint8_t* ACLData);
-
219  virtual void Run();
-
221  virtual void Reset();
-
223  virtual void disconnect();
-
224 };
-
225 
-
230 class BTD : public USBDeviceConfig, public UsbConfigXtracter {
-
231 public:
-
236  BTD(USB *p);
-
237 
-
246  virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
-
254  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
-
259  virtual uint8_t Release();
-
264  virtual uint8_t Poll();
-
265 
-
270  virtual uint8_t GetAddress() {
-
271  return bAddress;
-
272  };
-
273 
-
278  virtual bool isReady() {
-
279  return bPollEnable;
-
280  };
-
281 
-
287  virtual boolean DEVCLASSOK(uint8_t klass) {
-
288  return (klass == USB_CLASS_WIRELESS_CTRL);
-
289  };
-
290 
-
298  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
-
299  if(vid == IOGEAR_GBU521_VID && pid == IOGEAR_GBU521_PID)
-
300  return true;
-
301  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
-
302  if(vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID))
-
303  return true;
-
304  }
-
305  return false;
-
306  };
-
318  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
-
322  void disconnect() {
-
323  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++)
-
324  if(btService[i])
-
325  btService[i]->disconnect();
-
326  };
-
327 
- -
334  for(uint8_t i = 0; i < BTD_NUM_SERVICES; i++) {
-
335  if(!btService[i]) {
-
336  btService[i] = pService;
-
337  return i; // Return ID
-
338  }
-
339  }
-
340  return -1; // ErrorregisterServiceClass
-
341  };
-
342 
-
349  void HCI_Command(uint8_t* data, uint16_t nbytes);
-
351  void hci_reset();
-
353  void hci_read_bdaddr();
- -
360  void hci_set_local_name(const char* name);
-
362  void hci_write_scan_enable();
-
364  void hci_write_scan_disable();
-
366  void hci_remote_name();
-
368  void hci_accept_connection();
-
373  void hci_disconnect(uint16_t handle);
- - - - -
390  void hci_inquiry();
-
392  void hci_inquiry_cancel();
-
394  void hci_connect();
-
399  void hci_connect(uint8_t *bdaddr);
- -
413  void L2CAP_Command(uint16_t handle, uint8_t* data, uint8_t nbytes, uint8_t channelLow = 0x01, uint8_t channelHigh = 0x00);
-
421  void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t* scid, uint16_t psm);
-
430  void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid, uint8_t result);
-
437  void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t* dcid);
-
444  void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t* scid);
-
452  void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid);
-
460  void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t* dcid, uint8_t* scid);
-
467  void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh);
- - - - +
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  const char* btdName;
-
482  const char* btdPin;
-
483 
-
485  uint8_t my_bdaddr[6];
-
487  uint16_t hci_handle;
-
489  uint8_t disc_bdaddr[6];
-
491  char remote_name[30];
-
497  uint8_t hci_version;
+
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 
- -
501  pairWithWii = true;
-
502  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
503  };
-
505  bool connectToWii;
- - - - -
514 
-
516  void pairWithHID() {
-
517  pairWithHIDDevice = true;
-
518  hci_state = HCI_CHECK_DEVICE_SERVICE;
-
519  };
-
521  bool connectToHIDDevice;
- - -
526 
-
531  uint8_t readPollInterval() {
-
532  return pollInterval;
-
533  };
+
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 protected:
-
537  USB *pUsb;
-
539  uint8_t bAddress;
- -
542 
-
544  uint8_t bConfNum;
-
546  uint8_t bNumEP;
-
548  uint32_t qNextPollTime;
-
549 
-
551  static const uint8_t BTD_CONTROL_PIPE;
-
553  static const uint8_t BTD_EVENT_PIPE;
-
555  static const uint8_t BTD_DATAIN_PIPE;
-
557  static const uint8_t BTD_DATAOUT_PIPE;
-
558 
- -
564 
-
565 private:
-
566  void Initialize(); // Set all variables, endpoint structs etc. to default values
- -
568 
-
569  uint16_t PID, VID; // PID and VID of device connected
-
570 
-
571  uint8_t pollInterval;
-
572  bool bPollEnable;
-
573 
-
574  bool incomingPS4; // True if a PS4 controller is connecting
-
575  uint8_t classOfDevice[3]; // Class of device of last device
-
576 
-
577  /* Variables used by high level HCI task */
-
578  uint8_t hci_state; // Current state of Bluetooth HCI connection
-
579  uint16_t hci_counter; // Counter used for Bluetooth HCI reset loops
-
580  uint16_t hci_num_reset_loops; // This value indicate how many times it should read before trying to reset
-
581  uint16_t hci_event_flag; // HCI flags of received Bluetooth events
-
582  uint8_t inquiry_counter;
-
583 
-
584  uint8_t hcibuf[BULK_MAXPKTSIZE]; // General purpose buffer for HCI data
-
585  uint8_t l2capinbuf[BULK_MAXPKTSIZE]; // General purpose buffer for L2CAP in data
-
586  uint8_t l2capoutbuf[14]; // General purpose buffer for L2CAP out data
-
587 
-
588  /* State machines */
-
589  void HCI_event_task(); // Poll the HCI event pipe
-
590  void HCI_task(); // HCI state machine
-
591  void ACL_event_task(); // ACL input pipe
-
592 
-
593  /* Used to set the Bluetooth Address internally to the PS3 Controllers */
-
594  void setBdaddr(uint8_t* BDADDR);
-
595  void setMoveBdaddr(uint8_t* BDADDR);
-
596 };
-
597 #endif
-
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:557
-
bool incomingWii
Definition: BTD.h:507
-
void hci_connect()
Definition: BTD.cpp:1042
-
uint8_t bNumEP
Definition: BTD.h:546
-
const char * btdName
Definition: BTD.h:480
-
void hci_reset()
Definition: BTD.cpp:924
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1231
-
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1218
-
bool sdpConnectionClaimed
Definition: BTD.h:475
-
Definition: BTD.h:230
-
virtual boolean DEVCLASSOK(uint8_t klass)
Definition: BTD.h:287
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1284
-
bool rfcommConnectionClaimed
Definition: BTD.h:477
-
uint8_t hci_version
Definition: BTD.h:497
-
void hci_inquiry()
Definition: BTD.cpp:1020
-
static const uint8_t BTD_EVENT_PIPE
Definition: BTD.h:553
-
#define PS3MOVE_PID
Definition: BTD.h:27
+
535  uint8_t pollInterval;
+
536  bool bPollEnable;
+
537 
+
538  bool incomingPS4; // True if a PS4 controller is connecting
+
539  uint8_t classOfDevice[3]; // Class of device of last device
+
540 
+
541  /* Variables used by high level HCI task */
+
542  uint8_t hci_state; // Current state of Bluetooth HCI connection
+
543  uint16_t hci_counter; // Counter used for Bluetooth HCI reset loops
+
544  uint16_t hci_num_reset_loops; // This value indicate how many times it should read before trying to reset
+
545  uint16_t hci_event_flag; // HCI flags of received Bluetooth events
+
546  uint8_t inquiry_counter;
+
547 
+
548  uint8_t hcibuf[BULK_MAXPKTSIZE]; // General purpose buffer for HCI data
+
549  uint8_t l2capinbuf[BULK_MAXPKTSIZE]; // General purpose buffer for L2CAP in data
+
550  uint8_t l2capoutbuf[14]; // General purpose buffer for L2CAP out data
+
551 
+
552  /* State machines */
+
553  void HCI_event_task(); // Poll the HCI event pipe
+
554  void HCI_task(); // HCI state machine
+
555  void ACL_event_task(); // ACL input pipe
+
556 
+
557  /* Used to set the Bluetooth Address internally to the PS3 Controllers */
+
558  void setBdaddr(uint8_t* BDADDR);
+
559  void setMoveBdaddr(uint8_t* BDADDR);
+
560 };
+
561 
+ +
564 public:
+ +
566  if(pBtd)
+
567  pBtd->registerBluetoothService(this); // Register it as a Bluetooth service
+
568  };
+
573  virtual void ACLData(uint8_t* ACLData) = 0;
+
575  virtual void Run() = 0;
+
577  virtual void Reset() = 0;
+
579  virtual void disconnect() = 0;
+
580 
+
585  void attachOnInit(void (*funcOnInit)(void)) {
+
586  pFuncOnInit = funcOnInit; // TODO: This really belong in a class of it's own as it is repeated several times
+
587  };
+
588 
+
589 protected:
+
595  virtual void onInit() = 0;
+
596 
+
598  bool checkHciHandle(uint8_t *buf, uint16_t handle) {
+
599  return (buf[0] == (handle & 0xFF)) && (buf[1] == ((handle >> 8) | 0x20));
+
600  }
+
601 
+
603  void (*pFuncOnInit)(void);
+
604 
+ +
607 
+
609  uint16_t hci_handle;
+
610 
+ +
613 
+
615  uint8_t identifier;
+
616 };
+
617 
+
618 #endif
+
static const uint8_t BTD_DATAOUT_PIPE
Definition: BTD.h:521
+
bool incomingWii
Definition: BTD.h:471
+
void hci_connect()
Definition: BTD.cpp:1050
+
uint8_t bNumEP
Definition: BTD.h:510
+
const char * btdName
Definition: BTD.h:444
+
void hci_reset()
Definition: BTD.cpp:932
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1239
+
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1226
+
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:1292
+
bool rfcommConnectionClaimed
Definition: BTD.h:441
+
uint8_t hci_version
Definition: BTD.h:461
+ +
void hci_inquiry()
Definition: BTD.cpp:1028
+
static const uint8_t BTD_EVENT_PIPE
Definition: BTD.h:517
+
#define PS3MOVE_PID
Definition: BTD.h:28
-
bool pairWithWii
Definition: BTD.h:509
-
void hci_write_scan_disable()
Definition: BTD.cpp:946
-
virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: BTD.cpp:314
-
virtual uint8_t GetAddress()
Definition: BTD.h:270
-
#define BTD_NUM_SERVICES
Definition: BTD.h:190
-
const char * btdPin
Definition: BTD.h:482
-
bool motionPlusInside
Definition: BTD.h:511
-
void hci_remote_name()
Definition: BTD.cpp:989
- +
bool pairWithWii
Definition: BTD.h:473
+
uint8_t identifier
Definition: BTD.h:615
+
void hci_write_scan_disable()
Definition: BTD.cpp:954
+
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: BTD.cpp:314
+
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:997
+ -
#define PS3_VID
Definition: BTD.h:24
+
#define PS3_VID
Definition: BTD.h:25
BTD(USB *p)
Definition: BTD.cpp:27
-
char remote_name[30]
Definition: BTD.h:491
-
uint8_t readPollInterval()
Definition: BTD.h:531
-
virtual void Reset()
-
static const uint8_t BTD_DATAIN_PIPE
Definition: BTD.h:555
-
void hci_set_local_name(const char *name)
Definition: BTD.cpp:1008
-
void hci_write_scan_enable()
Definition: BTD.cpp:933
-
virtual uint8_t Release()
Definition: BTD.cpp:365
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1297
-
#define USB_CLASS_WIRELESS_CTRL
Definition: UsbCore.h:69
-
bool watingForConnection
Definition: BTD.h:471
-
bool connectToHIDDevice
Definition: BTD.h:519
-
uint8_t bAddress
Definition: BTD.h:539
-
bool incomingHIDDevice
Definition: BTD.h:523
-
bool pairWithHIDDevice
Definition: BTD.h:525
-
uint32_t qNextPollTime
Definition: BTD.h:548
+
char remote_name[30]
Definition: BTD.h:455
+
uint8_t readPollInterval()
Definition: BTD.h:495
+
virtual void Reset()=0
+
static const uint8_t BTD_DATAIN_PIPE
Definition: BTD.h:519
+
void hci_set_local_name(const char *name)
Definition: BTD.cpp:1016
+
void hci_write_scan_enable()
Definition: BTD.cpp:941
+
uint8_t Release()
Definition: BTD.cpp:365
+
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1305
+
#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:346
-
#define IOGEAR_GBU521_PID
Definition: BTD.h:30
-
bool connectToWii
Definition: BTD.h:503
-
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:48
-
bool wiiUProController
Definition: BTD.h:513
-
uint16_t hci_handle
Definition: BTD.h:487
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:122
+
#define IOGEAR_GBU521_PID
Definition: BTD.h:31
+
bool connectToWii
Definition: BTD.h:467
+
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:48
+
virtual void disconnect()=0
+
bool wiiUProController
Definition: BTD.h:477
+
uint16_t hci_handle
Definition: BTD.h:451
+
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: BTD.cpp:122
Definition: address.h:32
-
void pairWithHID()
Definition: BTD.h:516
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1142
- -
void hci_read_bdaddr()
Definition: BTD.cpp:955
-
void hci_inquiry_cancel()
Definition: BTD.cpp:1034
-
uint8_t my_bdaddr[6]
Definition: BTD.h:485
-
virtual uint8_t Poll()
Definition: BTD.cpp:371
-
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: BTD.h:298
-
static const uint8_t BTD_CONTROL_PIPE
Definition: BTD.h:551
+
void pairWithHID()
Definition: BTD.h:480
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1150
+ +
void hci_read_bdaddr()
Definition: BTD.cpp:963
+
void hci_inquiry_cancel()
Definition: BTD.cpp:1042
+
virtual void Run()=0
+
uint8_t my_bdaddr[6]
Definition: BTD.h:449
+
void(* pFuncOnInit)(void)
Definition: BTD.h:603
+
void attachOnInit(void(*funcOnInit)(void))
Definition: BTD.h:585
+
uint8_t Poll()
Definition: BTD.cpp:371
+
static const uint8_t BTD_CONTROL_PIPE
Definition: BTD.h:515
-
#define BULK_MAXPKTSIZE
Definition: BTD.h:33
-
void disconnect()
Definition: BTD.h:322
-
uint8_t disc_bdaddr[6]
Definition: BTD.h:489
-
int8_t registerServiceClass(BluetoothService *pService)
Definition: BTD.h:333
-
bool l2capConnectionClaimed
Definition: BTD.h:473
-
EpInfo epInfo[BTD_MAX_ENDPOINTS]
Definition: BTD.h:541
-
#define IOGEAR_GBU521_VID
Definition: BTD.h:29
-
virtual void ACLData(uint8_t *ACLData)
-
#define PS3_PID
Definition: BTD.h:25
-
#define BTD_MAX_ENDPOINTS
Definition: BTD.h:189
-
#define PS3NAVIGATION_PID
Definition: BTD.h:26
-
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1310
-
void hci_write_class_of_device()
Definition: BTD.cpp:1154
-
void hci_pin_code_negative_request_reply()
Definition: BTD.cpp:1104
-
#define HCI_CHECK_DEVICE_SERVICE
Definition: BTD.h:48
-
Definition: UsbCore.h:190
-
virtual void Run()
-
uint8_t bConfNum
Definition: BTD.h:544
-
void hci_link_key_request_negative_reply()
Definition: BTD.cpp:1118
-
void pairWithWiimote()
Definition: BTD.h:500
-
virtual bool isReady()
Definition: BTD.h:278
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1190
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1265
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1248
-
void hci_pin_code_request_reply()
Definition: BTD.cpp:1068
-
virtual void disconnect()
-
USB * pUsb
Definition: BTD.h:533
-
void hci_authentication_request()
Definition: BTD.cpp:1132
-
void hci_read_local_version_information()
Definition: BTD.cpp:964
-
void hci_accept_connection()
Definition: BTD.cpp:973
-
void HCI_Command(uint8_t *data, uint16_t nbytes)
Definition: BTD.cpp:919
+
BTD * pBtd
Definition: BTD.h:606
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
+
void disconnect()
Definition: BTD.cpp:383
+
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
+
#define PS3_PID
Definition: BTD.h:26
+
#define BTD_MAX_ENDPOINTS
Definition: BTD.h:187
+
#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:1318
+
BluetoothService(BTD *p)
Definition: BTD.h:565
+
void hci_write_class_of_device()
Definition: BTD.cpp:1162
+
uint16_t hci_handle
Definition: BTD.h:609
+
void hci_pin_code_negative_request_reply()
Definition: BTD.cpp:1112
+
virtual void ACLData(uint8_t *ACLData)=0
+
virtual bool DEVCLASSOK(uint8_t klass)
Definition: BTD.h:255
+
uint32_t l2cap_event_flag
Definition: BTD.h:612
+
#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:1126
+
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:1198
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1273
+
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1256
+
void hci_pin_code_request_reply()
Definition: BTD.cpp:1076
+
USB * pUsb
Definition: BTD.h:497
+
void hci_authentication_request()
Definition: BTD.cpp:1140
+
void hci_read_local_version_information()
Definition: BTD.cpp:972
+
void hci_accept_connection()
Definition: BTD.cpp:981
+
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:598
+
virtual void onInit()=0
+
void HCI_Command(uint8_t *data, uint16_t nbytes)
Definition: BTD.cpp:927
diff --git a/_b_t_h_i_d_8cpp.html b/_b_t_h_i_d_8cpp.html index 8fda4993..5271f63b 100644 --- a/_b_t_h_i_d_8cpp.html +++ b/_b_t_h_i_d_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTHID.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -95,7 +96,7 @@ Include dependency graph for BTHID.cpp:
- +

Go to the source code of this file.

@@ -104,7 +105,7 @@ Include dependency graph for BTHID.cpp: diff --git a/_b_t_h_i_d_8cpp__incl.map b/_b_t_h_i_d_8cpp__incl.map index 28742df1..8347d384 100644 --- a/_b_t_h_i_d_8cpp__incl.map +++ b/_b_t_h_i_d_8cpp__incl.map @@ -1,8 +1,8 @@ - - - + + + - - + + diff --git a/_b_t_h_i_d_8cpp__incl.md5 b/_b_t_h_i_d_8cpp__incl.md5 index ec5d712c..f16726cf 100644 --- a/_b_t_h_i_d_8cpp__incl.md5 +++ b/_b_t_h_i_d_8cpp__incl.md5 @@ -1 +1 @@ -3325b0ff5c79ca7ff5822cbf27f33902 \ No newline at end of file +5019ad894e519a7da9fb09997945ae68 \ 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 40db522083399361b823a26fecb6b6d8f0d7635d..4878fabe031c76670b070f520c059e6912d63d1f 100644 GIT binary patch literal 19163 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

F(sjyH`l`}38+u?>VB zAWm&9eXi literal 18120 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 diff --git a/_b_t_h_i_d_8cpp_source.html b/_b_t_h_i_d_8cpp_source.html index 35339da8..efbdf91c 100644 --- a/_b_t_h_i_d_8cpp_source.html +++ b/_b_t_h_i_d_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTHID.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

@@ -112,461 +113,462 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
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 pBtd(p), // pointer to USB class instance - mandatory
+
24 BluetoothService(p), // Pointer to USB class instance - mandatory
25 protocolMode(HID_BOOT_PROTOCOL) {
26  for(uint8_t i = 0; i < NUM_PARSERS; i++)
27  pRptParser[i] = NULL;
28 
-
29  if(pBtd)
-
30  pBtd->registerServiceClass(this); // Register it as a Bluetooth service
+ +
30  pBtd->btdPin = pin;
31 
- -
33  pBtd->btdPin = pin;
-
34 
-
35  /* Set device cid for the control and intterrupt channelse - LSB */
-
36  control_dcid[0] = 0x70; // 0x0070
-
37  control_dcid[1] = 0x00;
-
38  interrupt_dcid[0] = 0x71; // 0x0071
-
39  interrupt_dcid[1] = 0x00;
+
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  Reset();
-
42 }
-
43 
-
44 void BTHID::Reset() {
-
45  connected = false;
-
46  activeConnection = false;
-
47  l2cap_event_flag = 0; // Reset flags
-
48  l2cap_state = L2CAP_WAIT;
-
49  ResetBTHID();
-
50 }
-
51 
-
52 void BTHID::disconnect() { // Use this void to disconnect the device
-
53  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
-
54  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, interrupt_scid, interrupt_dcid);
-
55  Reset();
-
56  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
-
57 }
-
58 
-
59 void BTHID::ACLData(uint8_t* l2capinbuf) {
-
60  if(!pBtd->l2capConnectionClaimed && pBtd->incomingHIDDevice && !connected && !activeConnection) {
-
61  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
-
62  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
-
63  pBtd->incomingHIDDevice = false;
-
64  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
-
65  activeConnection = true;
-
66  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
-
67  l2cap_state = L2CAP_WAIT;
-
68  }
-
69  }
-
70  }
-
71  //if((l2capinbuf[0] | (uint16_t)l2capinbuf[1] << 8) == (hci_handle | 0x2000U)) { // acl_handle_ok or it's a new connection
-
72  if(UHS_ACL_HANDLE_OK(l2capinbuf, hci_handle)) { // acl_handle_ok or it's a new connection
-
73  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
-
74  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
-
75 #ifdef DEBUG_USB_HOST
-
76  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
-
77  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
-
78  Notify(PSTR(" "), 0x80);
-
79  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
-
80  Notify(PSTR(" "), 0x80);
-
81  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
-
82  Notify(PSTR(" "), 0x80);
-
83  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
-
84  Notify(PSTR(" "), 0x80);
-
85  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
-
86  Notify(PSTR(" "), 0x80);
-
87  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
-
88 #endif
-
89  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_RESPONSE) {
-
90  if(((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) && ((l2capinbuf[18] | (l2capinbuf[19] << 8)) == SUCCESSFUL)) { // Success
-
91  if(l2capinbuf[14] == control_dcid[0] && l2capinbuf[15] == control_dcid[1]) {
-
92  //Notify(PSTR("\r\nHID Control Connection Complete"), 0x80);
-
93  identifier = l2capinbuf[9];
-
94  control_scid[0] = l2capinbuf[12];
-
95  control_scid[1] = l2capinbuf[13];
- -
97  } else if(l2capinbuf[14] == interrupt_dcid[0] && l2capinbuf[15] == interrupt_dcid[1]) {
-
98  //Notify(PSTR("\r\nHID Interrupt Connection Complete"), 0x80);
-
99  identifier = l2capinbuf[9];
-
100  interrupt_scid[0] = l2capinbuf[12];
-
101  interrupt_scid[1] = l2capinbuf[13];
- -
103  }
-
104  }
-
105  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
-
106 #ifdef EXTRADEBUG
-
107  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
-
108  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
-
109  Notify(PSTR(" "), 0x80);
-
110  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
-
111  Notify(PSTR(" SCID: "), 0x80);
-
112  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
-
113  Notify(PSTR(" "), 0x80);
-
114  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
-
115  Notify(PSTR(" Identifier: "), 0x80);
-
116  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
-
117 #endif
-
118  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
-
119  identifier = l2capinbuf[9];
-
120  control_scid[0] = l2capinbuf[14];
-
121  control_scid[1] = l2capinbuf[15];
- -
123  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
-
124  identifier = l2capinbuf[9];
-
125  interrupt_scid[0] = l2capinbuf[14];
-
126  interrupt_scid[1] = l2capinbuf[15];
- -
128  }
-
129  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
-
130  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
-
131  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
132  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
-
133  identifier = l2capinbuf[9];
- -
135  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
136  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
-
137  identifier = l2capinbuf[9];
- -
139  }
-
140  }
-
141  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
-
142  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
143  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
- -
145  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
146  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
- -
148  }
-
149  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
-
150  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
-
151 #ifdef DEBUG_USB_HOST
-
152  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
-
153 #endif
-
154  identifier = l2capinbuf[9];
-
155  pBtd->l2cap_disconnection_response(hci_handle, identifier, control_dcid, control_scid);
-
156  Reset();
-
157  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
-
158 #ifdef DEBUG_USB_HOST
-
159  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
-
160 #endif
-
161  identifier = l2capinbuf[9];
-
162  pBtd->l2cap_disconnection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid);
-
163  Reset();
-
164  }
-
165  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
-
166  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
-
167  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
-
168  identifier = l2capinbuf[9];
- -
170  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
-
171  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
-
172  identifier = l2capinbuf[9];
- -
174  }
-
175  }
-
176 #ifdef EXTRADEBUG
-
177  else {
-
178  identifier = l2capinbuf[9];
-
179  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
-
180  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
-
181  }
-
182 #endif
-
183  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
-
184 #ifdef PRINTREPORT
-
185  Notify(PSTR("\r\nL2CAP Interrupt: "), 0x80);
-
186  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
-
187  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
-
188  Notify(PSTR(" "), 0x80);
-
189  }
-
190 #endif
-
191  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
-
192  uint16_t length = ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]);
-
193  ParseBTHIDData((uint8_t)(length - 1), &l2capinbuf[9]);
-
194 
-
195  switch(l2capinbuf[9]) {
-
196  case 0x01: // Keyboard or Joystick events
-
197  if(pRptParser[KEYBOARD_PARSER_ID])
-
198  pRptParser[KEYBOARD_PARSER_ID]->Parse(reinterpret_cast<HID *>(this), 0, (uint8_t)(length - 2), &l2capinbuf[10]); // Use reinterpret_cast again to extract the instance
-
199  break;
-
200 
-
201  case 0x02: // Mouse events
-
202  if(pRptParser[MOUSE_PARSER_ID])
-
203  pRptParser[MOUSE_PARSER_ID]->Parse(reinterpret_cast<HID *>(this), 0, (uint8_t)(length - 2), &l2capinbuf[10]); // Use reinterpret_cast again to extract the instance
-
204  break;
-
205 #ifdef EXTRADEBUG
-
206  default:
-
207  Notify(PSTR("\r\nUnknown Report type: "), 0x80);
-
208  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
-
209  break;
-
210 #endif
-
211  }
-
212  }
-
213  } else if(l2capinbuf[6] == control_dcid[0] && l2capinbuf[7] == control_dcid[1]) { // l2cap_control
-
214 #ifdef PRINTREPORT
-
215  Notify(PSTR("\r\nL2CAP Control: "), 0x80);
-
216  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
-
217  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
-
218  Notify(PSTR(" "), 0x80);
-
219  }
-
220 #endif
-
221  }
-
222 #ifdef EXTRADEBUG
-
223  else {
-
224  Notify(PSTR("\r\nUnsupported L2CAP Data - Channel ID: "), 0x80);
-
225  D_PrintHex<uint8_t > (l2capinbuf[7], 0x80);
-
226  Notify(PSTR(" "), 0x80);
-
227  D_PrintHex<uint8_t > (l2capinbuf[6], 0x80);
-
228 
-
229  Notify(PSTR("\r\nData: "), 0x80);
-
230  Notify(PSTR("\r\n"), 0x80);
-
231  for(uint16_t i = 0; i < ((uint16_t)l2capinbuf[5] << 8 | l2capinbuf[4]); i++) {
-
232  D_PrintHex<uint8_t > (l2capinbuf[i + 8], 0x80);
-
233  Notify(PSTR(" "), 0x80);
-
234  }
-
235  }
-
236 #endif
-
237  L2CAP_task();
-
238  }
-
239 }
-
240 
-
241 void BTHID::L2CAP_task() {
-
242  switch(l2cap_state) {
-
243  /* These states are used if the HID device is the host */
- - -
246 #ifdef DEBUG_USB_HOST
-
247  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
-
248 #endif
-
249  setProtocol(); // Set protocol before establishing HID interrupt channel
-
250  l2cap_state = L2CAP_INTERRUPT_SETUP;
-
251  }
-
252  break;
-
253 
- - -
256 #ifdef DEBUG_USB_HOST
-
257  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
-
258 #endif
-
259  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, PENDING);
+
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<HID *>(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<HID *>(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);
-
261  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, SUCCESSFUL);
-
262  identifier++;
-
263  delay(1);
- -
265 
-
266  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
-
267  }
-
268  break;
-
269 
-
270  /* These states are used if the Arduino is the host */
- - -
273 #ifdef DEBUG_USB_HOST
-
274  Notify(PSTR("\r\nSend HID Control Config Request"), 0x80);
-
275 #endif
-
276  identifier++;
- -
278  l2cap_state = L2CAP_CONTROL_CONFIG_REQUEST;
-
279  }
-
280  break;
-
281 
- - -
284  setProtocol(); // Set protocol before establishing HID interrupt channel
-
285  delay(1); // Short delay between commands - just to be sure
-
286 #ifdef DEBUG_USB_HOST
-
287  Notify(PSTR("\r\nSend HID Interrupt Connection Request"), 0x80);
-
288 #endif
-
289  identifier++;
-
290  pBtd->l2cap_connection_request(hci_handle, identifier, interrupt_dcid, HID_INTR_PSM);
-
291  l2cap_state = L2CAP_INTERRUPT_CONNECT_REQUEST;
-
292  }
-
293  break;
-
294 
- - -
297 #ifdef DEBUG_USB_HOST
-
298  Notify(PSTR("\r\nSend HID Interrupt Config Request"), 0x80);
-
299 #endif
-
300  identifier++;
- -
302  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
-
303  }
-
304  break;
-
305 
- -
307  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
-
308 #ifdef DEBUG_USB_HOST
-
309  Notify(PSTR("\r\nHID Channels Established"), 0x80);
-
310 #endif
-
311  pBtd->connectToHIDDevice = false;
-
312  pBtd->pairWithHIDDevice = false;
-
313  connected = true;
-
314  onInit();
-
315  l2cap_state = L2CAP_DONE;
-
316  }
+ +
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 
-
319  case L2CAP_DONE:
-
320  break;
-
321 
- - -
324 #ifdef DEBUG_USB_HOST
-
325  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
-
326 #endif
-
327  identifier++;
-
328  pBtd->l2cap_disconnection_request(hci_handle, identifier, control_scid, control_dcid);
-
329  l2cap_state = L2CAP_CONTROL_DISCONNECT;
-
330  }
-
331  break;
-
332 
- - -
335 #ifdef DEBUG_USB_HOST
-
336  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
-
337 #endif
- -
339  hci_handle = -1; // Reset handle
-
340  l2cap_event_flag = 0; // Reset flags
-
341  l2cap_state = L2CAP_WAIT;
-
342  }
-
343  break;
-
344  }
-
345 }
-
346 
-
347 void BTHID::Run() {
-
348  switch(l2cap_state) {
-
349  case L2CAP_WAIT:
-
350  if(pBtd->connectToHIDDevice && !pBtd->l2capConnectionClaimed && !connected && !activeConnection) {
- -
352  activeConnection = true;
-
353 #ifdef DEBUG_USB_HOST
-
354  Notify(PSTR("\r\nSend HID Control Connection Request"), 0x80);
-
355 #endif
-
356  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
-
357  l2cap_event_flag = 0; // Reset flags
-
358  identifier = 0;
-
359  pBtd->l2cap_connection_request(hci_handle, identifier, control_dcid, HID_CTRL_PSM);
-
360  l2cap_state = L2CAP_CONTROL_CONNECT_REQUEST;
- -
362 #ifdef DEBUG_USB_HOST
-
363  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
-
364 #endif
-
365  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, PENDING);
+ + +
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);
-
367  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, SUCCESSFUL);
-
368  identifier++;
-
369  delay(1);
- -
371  l2cap_state = L2CAP_CONTROL_SUCCESS;
-
372  }
-
373  break;
-
374  }
-
375 }
+ +
368  l2cap_state = L2CAP_CONTROL_SUCCESS;
+
369  }
+
370  break;
+
371  }
+
372 }
+
373 
+
374 /************************************************************/
+
375 /* HID Commands */
376 
377 /************************************************************/
-
378 /* HID Commands */
-
379 
-
380 /************************************************************/
-
381 void BTHID::setProtocol() {
-
382 #ifdef DEBUG_USB_HOST
-
383  Notify(PSTR("\r\nSet protocol mode: "), 0x80);
-
384  D_PrintHex<uint8_t > (protocolMode, 0x80);
-
385 #endif
-
386  if (protocolMode != HID_BOOT_PROTOCOL && protocolMode != HID_RPT_PROTOCOL) {
-
387 #ifdef DEBUG_USB_HOST
-
388  Notify(PSTR("\r\nNot a valid protocol mode. Using Boot protocol instead."), 0x80);
-
389 #endif
-
390  protocolMode = HID_BOOT_PROTOCOL; // Use Boot Protocol by default
-
391  }
-
392  uint8_t command = 0x70 | protocolMode; // Set Protocol, see Bluetooth HID specs page 33
-
393  pBtd->L2CAP_Command(hci_handle, &command, 1, control_scid[0], control_scid[1]);
-
394 }
-
395 
-
396 void BTHID::setLeds(uint8_t data) {
-
397  uint8_t buf[3];
-
398  buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
-
399  buf[1] = 0x01; // Report ID
-
400  buf[2] = data;
- -
402 }
-
#define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
Definition: BTD.h:139
-
#define UHS_ACL_HANDLE_OK(x, y)
Definition: BTD.h:207
-
#define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS
Definition: BTD.h:143
-
#define L2CAP_INTERRUPT_CONFIG_REQUEST
Definition: BTD.h:115
-
#define L2CAP_INTERRUPT_SETUP
Definition: BTD.h:113
-
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1231
-
#define SUCCESSFUL
Definition: BTD.h:177
-
virtual void ACLData(uint8_t *ACLData)
Definition: BTHID.cpp:59
-
void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
Definition: BTD.cpp:1218
-
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
Definition: BTD.h:142
+
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 != 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 = 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:1239
+
#define SUCCESSFUL
Definition: BTD.h:175
+
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:1226
+
#define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
Definition: BTD.h:140
#define HID_RPT_PROTOCOL
Definition: hid.h:83
-
Definition: BTD.h:230
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1284
-
uint8_t interrupt_scid[2]
Definition: BTHID.h:139
-
bool connected
Definition: BTHID.h:92
-
virtual void Run()
Definition: BTHID.cpp:347
-
const char * btdPin
Definition: BTD.h:482
-
#define L2CAP_DONE
Definition: BTD.h:104
-
#define L2CAP_CONTROL_SUCCESS
Definition: BTD.h:109
-
#define L2CAP_WAIT
Definition: BTD.h:103
-
virtual void ResetBTHID()
Definition: BTHID.h:123
-
virtual void Reset()
Definition: BTHID.cpp:44
-
#define L2CAP_CONTROL_CONFIG_REQUEST
Definition: BTD.h:108
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1297
-
uint8_t control_scid[2]
Definition: BTHID.h:136
+
Definition: BTD.h:198
+
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1292
+
uint8_t interrupt_scid[2]
Definition: BTHID.h:137
+
uint8_t identifier
Definition: BTD.h:615
+
bool connected
Definition: BTHID.h:83
+
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
+
virtual void ResetBTHID()
Definition: BTHID.h:128
+
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:1305
+
uint8_t control_scid[2]
Definition: BTHID.h:134
#define Notify(...)
Definition: message.h:44
-
bool connectToHIDDevice
Definition: BTD.h:519
+
bool connectToHIDDevice
Definition: BTD.h:483
#define HID_BOOT_PROTOCOL
Definition: hid.h:82
-
#define L2CAP_CONTROL_CONNECT_REQUEST
Definition: BTD.h:107
-
#define HID_CTRL_PSM
Definition: BTD.h:182
-
bool incomingHIDDevice
Definition: BTD.h:523
-
bool pairWithHIDDevice
Definition: BTD.h:525
+
#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 MOUSE_PARSER_ID
Definition: BTHID.h:25
-
uint16_t hci_handle
Definition: BTD.h:487
+
uint16_t hci_handle
Definition: BTD.h:451
-
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1142
-
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
Definition: BTD.h:145
-
virtual void disconnect()
Definition: BTHID.cpp:52
-
void setLeds(uint8_t data)
Definition: BTHID.cpp:396
-
virtual void ParseBTHIDData(uint8_t len, uint8_t *buf)
Definition: BTHID.h:115
-
BTD * pBtd
Definition: BTHID.h:129
-
#define l2cap_check_flag(flag)
Definition: BTD.h:160
-
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:168
-
#define L2CAP_FLAG_CONTROL_CONNECTED
Definition: BTD.h:138
-
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:170
-
#define L2CAP_CONTROL_DISCONNECT
Definition: BTD.h:110
-
#define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
Definition: BTD.h:136
-
uint16_t hci_handle
Definition: BTHID.h:132
-
#define HID_INTR_PSM
Definition: BTD.h:183
-
int8_t registerServiceClass(BluetoothService *pService)
Definition: BTD.h:333
-
bool l2capConnectionClaimed
Definition: BTD.h:473
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1150
+ +
#define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
Definition: BTD.h:143
+
void disconnect()
Definition: BTHID.cpp:49
+
void setLeds(uint8_t data)
Definition: BTHID.cpp:393
+
virtual void ParseBTHIDData(uint8_t len, uint8_t *buf)
Definition: BTHID.h:120
+
#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:606
+
#define HID_INTR_PSM
Definition: BTD.h:181
+
bool l2capConnectionClaimed
Definition: BTD.h:437
virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
-
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:171
-
#define L2CAP_CMD_CONNECTION_RESPONSE
Definition: BTD.h:167
-
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:169
+
#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
+
uint16_t hci_handle
Definition: BTD.h:609
#define NUM_PARSERS
Definition: BTHID.h:26
#define KEYBOARD_PARSER_ID
Definition: BTHID.h:24
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1190
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1265
-
#define PENDING
Definition: BTD.h:176
-
#define L2CAP_FLAG_INTERRUPT_CONNECTED
Definition: BTD.h:144
-
#define l2cap_set_flag(flag)
Definition: BTD.h:161
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1248
-
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
Definition: BTD.h:137
-
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:166
+
uint32_t l2cap_event_flag
Definition: BTD.h:612
+
void onInit()
Definition: BTHID.h:107
+
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1198
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1273
+
#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:1256
+
#define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
Definition: BTD.h:135
+
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:164
BTHID(BTD *p, bool pair=false, const char *pin="0000")
Definition: BTHID.cpp:23
-
#define L2CAP_INTERRUPT_CONNECT_REQUEST
Definition: BTD.h:114
-
void pair(void)
Definition: BTHID.h:95
-
#define L2CAP_INTERRUPT_DISCONNECT
Definition: BTD.h:116
-
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:165
+
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:598
+
#define L2CAP_INTERRUPT_CONNECT_REQUEST
Definition: BTD.h:112
+
void pair(void)
Definition: BTHID.h:86
+
#define L2CAP_INTERRUPT_DISCONNECT
Definition: BTD.h:114
+
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:163
diff --git a/_b_t_h_i_d_8h.html b/_b_t_h_i_d_8h.html index 831964c6..015e30f9 100644 --- a/_b_t_h_i_d_8h.html +++ b/_b_t_h_i_d_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTHID.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -99,7 +100,7 @@ Include dependency graph for BTHID.h:
- +
This graph shows which files directly or indirectly include this file:
@@ -173,7 +174,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 ca89e4dc..053bda1f 100644 --- a/_b_t_h_i_d_8h__dep__incl.md5 +++ b/_b_t_h_i_d_8h__dep__incl.md5 @@ -1 +1 @@ -98e640defd09cdb6bea449a9af48374c \ No newline at end of file +0205aeed5db75f7b218ba6ecd920ddcd \ No newline at end of file diff --git a/_b_t_h_i_d_8h__incl.map b/_b_t_h_i_d_8h__incl.map index d0f24b36..a49ee964 100644 --- a/_b_t_h_i_d_8h__incl.map +++ b/_b_t_h_i_d_8h__incl.map @@ -1,7 +1,7 @@ - - + + - - + + diff --git a/_b_t_h_i_d_8h__incl.md5 b/_b_t_h_i_d_8h__incl.md5 index f98ecfbe..4f97447f 100644 --- a/_b_t_h_i_d_8h__incl.md5 +++ b/_b_t_h_i_d_8h__incl.md5 @@ -1 +1 @@ -50c98864be761896492416679dad01a4 \ No newline at end of file +28e181610b904ff2ed75411a23593963 \ 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 0977c9e47c59805ead05cc976aaec111aa1df24e..cd4df36526537f753826e92aea91ad0a9b90a1d3 100644 GIT binary patch literal 16933 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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 b7947e85..ef5da9bf 100644 --- a/_b_t_h_i_d_8h_source.html +++ b/_b_t_h_i_d_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTHID.h Source File + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -120,116 +121,104 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
30 public:
37  BTHID(BTD *p, bool pair = false, const char *pin = "0000");
38 
-
44  virtual void ACLData(uint8_t* ACLData);
-
46  virtual void Run();
-
48  virtual void Reset();
-
50  virtual void disconnect();
- -
59  if (id >= NUM_PARSERS)
-
60  return NULL;
-
61  return pRptParser[id];
-
62  };
-
63 
-
70  bool SetReportParser(uint8_t id, HIDReportParser *prs) {
-
71  if (id >= NUM_PARSERS)
-
72  return false;
-
73  pRptParser[id] = prs;
-
74  return true;
-
75  };
-
76 
-
81  void setProtocolMode(uint8_t mode) {
-
82  protocolMode = mode;
-
83  };
+
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 
+
80  void setLeds(uint8_t data);
+
81 
+
83  bool connected;
84 
-
89  void setLeds(uint8_t data);
+
86  void pair(void) {
+
87  if(pBtd)
+
88  pBtd->pairWithHID();
+
89  };
90 
-
92  bool connected;
-
93 
-
95  void pair(void) {
-
96  if(pBtd)
-
97  pBtd->pairWithHID();
-
98  };
-
99 
-
104  void attachOnInit(void (*funcOnInit)(void)) {
-
105  pFuncOnInit = funcOnInit;
-
106  };
-
107 
-
108 protected:
-
115  virtual void ParseBTHIDData(uint8_t len, uint8_t *buf) {
-
116  return;
-
117  };
-
119  virtual void OnInitBTHID() {
-
120  return;
-
121  };
-
123  virtual void ResetBTHID() {
-
124  return;
-
125  }
- -
130 
-
132  uint16_t hci_handle;
-
133 
-
136  uint8_t control_scid[2];
-
137 
-
139  uint8_t interrupt_scid[2];
-
140 
-
141 private:
-
142  HIDReportParser *pRptParser[NUM_PARSERS]; // Pointer to HIDReportParsers.
-
143 
-
145  void setProtocol();
-
146  uint8_t protocolMode;
+
91 protected:
+
97  void ACLData(uint8_t* ACLData);
+
99  void Run();
+
101  void Reset();
+
107  void onInit() {
+
108  if(pFuncOnInit)
+
109  pFuncOnInit(); // Call the user function
+
110  OnInitBTHID();
+
111  };
+
120  virtual void ParseBTHIDData(uint8_t len, uint8_t *buf) {
+
121  return;
+
122  };
+
124  virtual void OnInitBTHID() {
+
125  return;
+
126  };
+
128  virtual void ResetBTHID() {
+
129  return;
+
130  }
+
134  uint8_t control_scid[2];
+
135 
+
137  uint8_t interrupt_scid[2];
+
138 
+
139 private:
+
140  HIDReportParser *pRptParser[NUM_PARSERS]; // Pointer to HIDReportParsers.
+
141 
+
143  void setProtocol();
+
144  uint8_t protocolMode;
+
145 
+
146  void L2CAP_task(); // L2CAP state machine
147 
-
153  void onInit() {
-
154  if(pFuncOnInit)
-
155  pFuncOnInit(); // Call the user function
-
156  OnInitBTHID();
-
157  };
-
158  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
-
159 
-
160  void L2CAP_task(); // L2CAP state machine
-
161 
-
162  bool activeConnection; // Used to indicate if it already has established a connection
-
163 
-
164  /* Variables used for L2CAP communication */
-
165  uint8_t control_dcid[2]; // L2CAP device CID for HID_Control - Always 0x0070
-
166  uint8_t interrupt_dcid[2]; // L2CAP device CID for HID_Interrupt - Always 0x0071
-
167  uint8_t identifier; // Identifier for connection
-
168  uint8_t l2cap_state;
-
169  uint32_t l2cap_event_flag; // l2cap flags of received Bluetooth events
-
170 };
-
171 #endif
+
148  bool activeConnection; // Used to indicate if it already has established a connection
+
149 
+
150  /* Variables used for L2CAP communication */
+
151  uint8_t control_dcid[2]; // L2CAP device CID for HID_Control - Always 0x0070
+
152  uint8_t interrupt_dcid[2]; // L2CAP device CID for HID_Interrupt - Always 0x0071
+
153  uint8_t l2cap_state;
+
154 };
+
155 #endif
-
virtual void OnInitBTHID()
Definition: BTHID.h:119
-
virtual void ACLData(uint8_t *ACLData)
Definition: BTHID.cpp:59
-
Definition: BTD.h:230
-
uint8_t interrupt_scid[2]
Definition: BTHID.h:139
-
bool connected
Definition: BTHID.h:92
-
virtual void Run()
Definition: BTHID.cpp:347
-
virtual void ResetBTHID()
Definition: BTHID.h:123
-
virtual void Reset()
Definition: BTHID.cpp:44
-
uint8_t control_scid[2]
Definition: BTHID.h:136
-
void attachOnInit(void(*funcOnInit)(void))
Definition: BTHID.h:104
-
void pairWithHID()
Definition: BTD.h:516
- -
virtual void disconnect()
Definition: BTHID.cpp:52
-
HIDReportParser * GetReportParser(uint8_t id)
Definition: BTHID.h:58
-
void setLeds(uint8_t data)
Definition: BTHID.cpp:396
-
virtual void ParseBTHIDData(uint8_t len, uint8_t *buf)
Definition: BTHID.h:115
-
BTD * pBtd
Definition: BTHID.h:129
-
uint16_t hci_handle
Definition: BTHID.h:132
+
virtual void OnInitBTHID()
Definition: BTHID.h:124
+
void ACLData(uint8_t *ACLData)
Definition: BTHID.cpp:56
+
Definition: BTD.h:198
+
uint8_t interrupt_scid[2]
Definition: BTHID.h:137
+
bool connected
Definition: BTHID.h:83
+
void Run()
Definition: BTHID.cpp:344
+
virtual void ResetBTHID()
Definition: BTHID.h:128
+
void Reset()
Definition: BTHID.cpp:41
+
uint8_t control_scid[2]
Definition: BTHID.h:134
+
void pairWithHID()
Definition: BTD.h:480
+ +
void disconnect()
Definition: BTHID.cpp:49
+
HIDReportParser * GetReportParser(uint8_t id)
Definition: BTHID.h:49
+
void setLeds(uint8_t data)
Definition: BTHID.cpp:393
+
virtual void ParseBTHIDData(uint8_t len, uint8_t *buf)
Definition: BTHID.h:120
+
void(* pFuncOnInit)(void)
Definition: BTD.h:603
+
BTD * pBtd
Definition: BTD.h:606
#define NUM_PARSERS
Definition: BTHID.h:26
+
void onInit()
Definition: BTHID.h:107
Definition: BTHID.h:29
-
void setProtocolMode(uint8_t mode)
Definition: BTHID.h:81
+
void setProtocolMode(uint8_t mode)
Definition: BTHID.h:72
BTHID(BTD *p, bool pair=false, const char *pin="0000")
Definition: BTHID.cpp:23
-
void pair(void)
Definition: BTHID.h:95
-
bool SetReportParser(uint8_t id, HIDReportParser *prs)
Definition: BTHID.h:70
+
void pair(void)
Definition: BTHID.h:86
+
bool SetReportParser(uint8_t id, HIDReportParser *prs)
Definition: BTHID.h:61
diff --git a/_p_s3_b_t_8cpp.html b/_p_s3_b_t_8cpp.html index 9a866655..d7fde8f4 100644 --- a/_p_s3_b_t_8cpp.html +++ b/_p_s3_b_t_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3BT.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -95,7 +96,7 @@ Include dependency graph for PS3BT.cpp:
- +

Go to the source code of this file.

@@ -104,7 +105,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 6c9a4e27..c1784287 100644 --- a/_p_s3_b_t_8cpp__incl.map +++ b/_p_s3_b_t_8cpp__incl.map @@ -1,7 +1,9 @@ - - - - - + + + + + + + diff --git a/_p_s3_b_t_8cpp__incl.md5 b/_p_s3_b_t_8cpp__incl.md5 index 972cd9fe..3eddc609 100644 --- a/_p_s3_b_t_8cpp__incl.md5 +++ b/_p_s3_b_t_8cpp__incl.md5 @@ -1 +1 @@ -2a26709935401ef53e5fb70ac8d80eef \ No newline at end of file +4aca24efbdc1291f07e6257ad7bd19ca \ 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 a4ea5f8a3ea68abc07e08ab68c35b1c6d0cb0d7a..870b0dd6d1bf0df5aa4cd69d8ab9325fa05ec2b7 100644 GIT binary patch literal 21164 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

)mf@xUm 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 literal 12327 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 AD*ylh diff --git a/_p_s3_b_t_8cpp_source.html b/_p_s3_b_t_8cpp_source.html index 6f3969bb..88140926 100644 --- a/_p_s3_b_t_8cpp_source.html +++ b/_p_s3_b_t_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3BT.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

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

Go to the source code of this file.

@@ -104,7 +105,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 a68640b2..bbc02762 100644 --- a/_p_s3_u_s_b_8cpp__incl.map +++ b/_p_s3_u_s_b_8cpp__incl.map @@ -1,6 +1,8 @@ - - - - + + + + + + diff --git a/_p_s3_u_s_b_8cpp__incl.md5 b/_p_s3_u_s_b_8cpp__incl.md5 index afd63d3f..ab8a99a6 100644 --- a/_p_s3_u_s_b_8cpp__incl.md5 +++ b/_p_s3_u_s_b_8cpp__incl.md5 @@ -1 +1 @@ -68d8fca935dc486bd7b23a04cf3b7f24 \ No newline at end of file +a2824aebe89d82dcd9d4b1ac1984f3c8 \ 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 e9f8e56b93494b0bdcc6deb6991c87fe283905f6..2565402b602fd2cf62f0b395a140ad35ed92f952 100644 GIT binary patch literal 20696 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 iG*B1=RR8 - + USB Host Shield 2.0: PS3USB.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -146,12 +147,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
55  // get memory address of USB device address pool
56  AddressPool &addrPool = pUsb->GetAddressPool();
57 #ifdef EXTRADEBUG
-
58  Notify(PSTR("\r\nPS3USB Init"), 0x80);
+
58  Notify(PSTR("\r\nPS3USB 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);
+
63  Notify(PSTR("\r\nAddress in use"), 0x80);
64 #endif
66  }
@@ -161,14 +162,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
70 
71  if(!p) {
72 #ifdef DEBUG_USB_HOST
-
73  Notify(PSTR("\r\nAddress not found"), 0x80);
+
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);
+
80  Notify(PSTR("\r\nepinfo is null"), 0x80);
81 #endif
83  }
@@ -211,13 +212,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
120  addrPool.FreeAddress(bAddress);
121  bAddress = 0;
122 #ifdef DEBUG_USB_HOST
-
123  Notify(PSTR("\r\nsetAddr: "), 0x80);
+
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);
+
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
@@ -243,13 +244,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
152 
153  /* Initialize data structures for endpoints of device */
154  epInfo[ PS3_OUTPUT_PIPE ].epAddr = 0x02; // PS3 output endpoint
- +
156  epInfo[ PS3_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
160  epInfo[ PS3_INPUT_PIPE ].epAddr = 0x01; // PS3 report endpoint
- +
162  epInfo[ PS3_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
@@ -268,12 +269,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
177  if(PID == PS3_PID || PID == PS3NAVIGATION_PID) {
178  if(PID == PS3_PID) {
179 #ifdef DEBUG_USB_HOST
-
180  Notify(PSTR("\r\nDualshock 3 Controller Connected"), 0x80);
+
180  Notify(PSTR("\r\nDualshock 3 Controller Connected"), 0x80);
181 #endif
182  PS3Connected = true;
183  } else { // must be a navigation controller
184 #ifdef DEBUG_USB_HOST
-
185  Notify(PSTR("\r\nNavigation Controller Connected"), 0x80);
+
185  Notify(PSTR("\r\nNavigation Controller Connected"), 0x80);
186 #endif
187  PS3NavigationConnected = true;
188  }
@@ -281,13 +282,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
190 
191  // Needed for PS3 Dualshock and Navigation commands to work
192  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
-
193  writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]);
+
193  writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]);
194 
195  for(uint8_t i = 6; i < 10; i++)
196  readBuf[i] = 0x7F; // Set the analog joystick values to center position
197  } else { // must be a Motion controller
198 #ifdef DEBUG_USB_HOST
-
199  Notify(PSTR("\r\nMotion Controller Connected"), 0x80);
+
199  Notify(PSTR("\r\nMotion Controller Connected"), 0x80);
200 #endif
201  PS3MoveConnected = true;
202  writeBuf[0] = 0x02; // Set report ID, this is needed for Move commands to work
@@ -299,10 +300,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
208  setBdaddr(my_bdaddr); // Set internal Bluetooth address
209 
210 #ifdef DEBUG_USB_HOST
-
211  Notify(PSTR("\r\nBluetooth Address was set to: "), 0x80);
+
211  Notify(PSTR("\r\nBluetooth Address was set to: "), 0x80);
212  for(int8_t i = 5; i > 0; i--) {
213  D_PrintHex<uint8_t > (my_bdaddr[i], 0x80);
-
214  Notify(PSTR(":"), 0x80);
+
214  Notify(PSTR(":"), 0x80);
215  }
216  D_PrintHex<uint8_t > (my_bdaddr[0], 0x80);
217 #endif
@@ -310,7 +311,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
219  onInit();
220 
221  bPollEnable = true;
-
222  Notify(PSTR("\r\n"), 0x80);
+
222  Notify(PSTR("\r\n"), 0x80);
223  timer = millis();
224  return 0; // Successful configuration
225 
@@ -341,7 +342,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
250 
251 Fail:
252 #ifdef DEBUG_USB_HOST
-
253  Notify(PSTR("\r\nPS3 Init Failed, error code: "), 0x80);
+
253  Notify(PSTR("\r\nPS3 Init Failed, error code: "), 0x80);
254  NotifyFail(rcode);
255 #endif
256  Release();
@@ -397,25 +398,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
306 #ifdef PRINTREPORT
307  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++) {
308  D_PrintHex<uint8_t > (readBuf[i], 0x80);
-
309  Notify(PSTR(" "), 0x80);
+
309  Notify(PSTR(" "), 0x80);
310  }
-
311  Notify(PSTR("\r\n"), 0x80);
+
311  Notify(PSTR("\r\n"), 0x80);
312 #endif
313 }
314 
-
316  return (ButtonState & pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]));
+
316  return (ButtonState & pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]));
317 }
318 
-
320  uint32_t button = pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]);
+
320  uint32_t button = pgm_read_dword(&PS3_BUTTONS[(uint8_t)b]);
321  bool click = (ButtonClickState & button);
322  ButtonClickState &= ~button; // Clear "click" event
323  return click;
324 }
325 
-
327  return (uint8_t)(readBuf[(pgm_read_byte(&PS3_ANALOG_BUTTONS[(uint8_t)a])) - 9]);
+
327  return (uint8_t)(readBuf[(pgm_read_byte(&PS3_ANALOG_BUTTONS[(uint8_t)a])) - 9]);
328 }
329 
@@ -456,32 +457,32 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
366  char statusOutput[100]; // Max string length plus null character
-
368  strcpy_P(statusOutput, PSTR("ConnectionStatus: "));
+
368  strcpy_P(statusOutput, PSTR("ConnectionStatus: "));
369 
-
370  if(getStatus(Plugged)) strcat_P(statusOutput, PSTR("Plugged"));
-
371  else if(getStatus(Unplugged)) strcat_P(statusOutput, PSTR("Unplugged"));
-
372  else strcat_P(statusOutput, PSTR("Error"));
+
370  if(getStatus(Plugged)) strcat_P(statusOutput, PSTR("Plugged"));
+
371  else if(getStatus(Unplugged)) strcat_P(statusOutput, PSTR("Unplugged"));
+
372  else strcat_P(statusOutput, PSTR("Error"));
373 
-
374  strcat_P(statusOutput, PSTR(" - PowerRating: "));
+
374  strcat_P(statusOutput, PSTR(" - PowerRating: "));
375 
-
376  if(getStatus(Charging)) strcat_P(statusOutput, PSTR("Charging"));
-
377  else if(getStatus(NotCharging)) strcat_P(statusOutput, PSTR("Not Charging"));
-
378  else if(getStatus(Shutdown)) strcat_P(statusOutput, PSTR("Shutdown"));
-
379  else if(getStatus(Dying)) strcat_P(statusOutput, PSTR("Dying"));
-
380  else if(getStatus(Low)) strcat_P(statusOutput, PSTR("Low"));
-
381  else if(getStatus(High)) strcat_P(statusOutput, PSTR("High"));
-
382  else if(getStatus(Full)) strcat_P(statusOutput, PSTR("Full"));
-
383  else strcat_P(statusOutput, PSTR("Error"));
+
376  if(getStatus(Charging)) strcat_P(statusOutput, PSTR("Charging"));
+
377  else if(getStatus(NotCharging)) strcat_P(statusOutput, PSTR("Not Charging"));
+
378  else if(getStatus(Shutdown)) strcat_P(statusOutput, PSTR("Shutdown"));
+
379  else if(getStatus(Dying)) strcat_P(statusOutput, PSTR("Dying"));
+
380  else if(getStatus(Low)) strcat_P(statusOutput, PSTR("Low"));
+
381  else if(getStatus(High)) strcat_P(statusOutput, PSTR("High"));
+
382  else if(getStatus(Full)) strcat_P(statusOutput, PSTR("Full"));
+
383  else strcat_P(statusOutput, PSTR("Error"));
384 
-
385  strcat_P(statusOutput, PSTR(" - WirelessStatus: "));
+
385  strcat_P(statusOutput, PSTR(" - WirelessStatus: "));
386 
-
387  if(getStatus(CableRumble)) strcat_P(statusOutput, PSTR("Cable - Rumble is on"));
-
388  else if(getStatus(Cable)) strcat_P(statusOutput, PSTR("Cable - Rumble is off"));
-
389  else if(getStatus(BluetoothRumble)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is on"));
-
390  else if(getStatus(Bluetooth)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is off"));
-
391  else strcat_P(statusOutput, PSTR("Error"));
+
387  if(getStatus(CableRumble)) strcat_P(statusOutput, PSTR("Cable - Rumble is on"));
+
388  else if(getStatus(Cable)) strcat_P(statusOutput, PSTR("Cable - Rumble is off"));
+
389  else if(getStatus(BluetoothRumble)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is on"));
+
390  else if(getStatus(Bluetooth)) strcat_P(statusOutput, PSTR("Bluetooth - Rumble is off"));
+
391  else strcat_P(statusOutput, PSTR("Error"));
392  } else
-
393  strcpy_P(statusOutput, PSTR("Error"));
+
393  strcpy_P(statusOutput, PSTR("Error"));
394 
395  USB_HOST_SERIAL.write(statusOutput);
396 }
@@ -489,12 +490,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
398 /* Playstation Sixaxis Dualshock and Navigation Controller commands */
399 void PS3USB::PS3_Command(uint8_t *data, uint16_t nbytes) {
400  // 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)
-
401  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL);
+
401  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x01, 0x02, 0x00, nbytes, nbytes, data, NULL);
402 }
403 
405  for(uint8_t i = 0; i < PS3_REPORT_BUFFER_SIZE; i++)
-
406  writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // Reset buffer
+
406  writeBuf[i] = pgm_read_byte(&PS3_REPORT_BUFFER[i]); // Reset buffer
407 
408  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
409 }
@@ -533,7 +534,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
442 }
443 
-
445  writeBuf[9] &= ~((uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1));
+
445  writeBuf[9] &= ~((uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1));
446  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
447 }
448 
@@ -541,13 +542,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
450  if(a == OFF)
451  setLedRaw(0);
452  else {
-
453  writeBuf[9] |= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
+
453  writeBuf[9] |= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
454  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
455  }
456 }
457 
-
459  writeBuf[9] ^= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
+
459  writeBuf[9] ^= (uint8_t)((pgm_read_byte(&PS3_LEDS[(uint8_t)a]) & 0x0f) << 1);
460  PS3_Command(writeBuf, PS3_REPORT_BUFFER_SIZE);
461 }
462 
@@ -561,14 +562,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
470  buf[i + 2] = bdaddr[5 - i]; // Copy into buffer, has to be written reversed, so it is MSB first
471 
472  // 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
-
473  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
+
473  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
474 }
475 
476 void PS3USB::getBdaddr(uint8_t *bdaddr) {
477  uint8_t buf[8];
478 
479  // 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
-
480  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
+
480  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0xF5, 0x03, 0x00, 8, 8, buf, NULL);
481 
482  for(uint8_t i = 0; i < 6; i++)
483  bdaddr[5 - i] = buf[i + 2]; // Copy into buffer reversed, so it is LSB first
@@ -582,7 +583,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
491  cmd_buf[3] = 0x00;
492 
493  // 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)
-
494  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF4, 0x03, 0x00, 4, 4, cmd_buf, NULL);
+
494  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0xF4, 0x03, 0x00, 4, 4, cmd_buf, NULL);
495 }
496 
497 /* Playstation Move Controller commands */
@@ -606,7 +607,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
515 void PS3USB::moveSetRumble(uint8_t rumble) {
516 #ifdef DEBUG_USB_HOST
517  if(rumble < 64 && rumble != 0) // The rumble value has to at least 64, or approximately 25% (64/255*100)
-
518  Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"), 0x80);
+
518  Notify(PSTR("\r\nThe rumble value has to at least 64, or approximately 25%"), 0x80);
519 #endif
520  writeBuf[6] = rumble; // Set the rumble value into the write buffer
521 
@@ -626,14 +627,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
535  buf[i + 1] = bdaddr[i];
536 
537  // 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
-
538  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
+
538  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x05, 0x03, 0x00, 11, 11, buf, NULL);
539 }
540 
541 void PS3USB::getMoveBdaddr(uint8_t *bdaddr) {
542  uint8_t buf[16];
543 
544  // 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
-
545  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x04, 0x03, 0x00, 16, 16, buf, NULL);
+
545  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x04, 0x03, 0x00, 16, 16, buf, NULL);
546 
547  for(uint8_t i = 0; i < 6; i++)
548  bdaddr[i] = buf[10 + i];
@@ -644,7 +645,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
553 
554  for(uint8_t i = 0; i < 3; i++) {
555  // 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
-
556  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x10, 0x03, 0x00, 49, 49, buf, NULL);
+
556  pUsb->ctrlReq(bAddress, epInfo[PS3_CONTROL_PIPE].epAddr, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, 0x10, 0x03, 0x00, 49, 49, buf, NULL);
557 
558  for(byte j = 0; j < 49; j++)
559  data[49 * i + j] = buf[j];
@@ -666,34 +667,40 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
void getBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:476
+
#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:81
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
+
#define strcpy_P(dest, src)
uint8_t bmNakPower
Definition: address.h:42
void setLedRaw(uint8_t value)
Definition: PS3USB.cpp:439
-
bool PS3NavigationConnected
Definition: PS3USB.h:273
-
void setLedOff()
Definition: PS3USB.h:224
-
#define PS3_INPUT_PIPE
Definition: PS3USB.h:33
+
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:27
+
#define PS3MOVE_PID
Definition: BTD.h:28
void setBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:463
-
virtual uint8_t Release()
Definition: PS3USB.cpp:261
+
#define HID_REQUEST_SET_REPORT
Definition: hid.h:72
+
uint8_t Release()
Definition: PS3USB.cpp:261
bool getButtonPress(ButtonEnum b)
Definition: PS3USB.cpp:315
-
#define PS3_OUTPUT_PIPE
Definition: PS3USB.h:32
+
#define PS3_OUTPUT_PIPE
Definition: PS3USB.h:30
#define NotifyFail(...)
Definition: message.h:55
-
bool PS3MoveConnected
Definition: PS3USB.h:271
+
bool PS3MoveConnected
Definition: PS3USB.h:262
AnalogHatEnum
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:805
+
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:808
+
#define bmREQ_HID_OUT
Definition: hid.h:63
+
#define USB_TRANSFER_TYPE_INTERRUPT
Definition: usb_ch9.h:86
StatusEnum
Definition: PS3Enums.h:113
void getMoveBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:541
-
#define PS3_VID
Definition: BTD.h:24
+
#define PS3_VID
Definition: BTD.h:25
+
#define pgm_read_byte(addr)
#define NotifyFailGetDevDescr(...)
Definition: message.h:50
uint8_t getAnalogButton(ButtonEnum a)
Definition: PS3USB.cpp:326
@@ -701,17 +708,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
Definition: Usb.cpp:64
void setRumbleOff()
Definition: PS3USB.cpp:411
const uint32_t PS3_BUTTONS[]
Definition: PS3Enums.h:62
-
#define EP_MAXPKTSIZE
Definition: PS3USB.h:25
-
bool PS3Connected
Definition: PS3USB.h:265
+
#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
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
#define Notify(...)
Definition: message.h:44
-
#define PS3_CONTROL_PIPE
Definition: PS3USB.h:31
+
#define PS3_CONTROL_PIPE
Definition: PS3USB.h:29
RumbleEnum
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:796
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:799
#define USB_HOST_SERIAL
Definition: settings.h:34
void setLedToggle(LEDEnum a)
Definition: PS3USB.cpp:458
uint8_t epAddr
Definition: address.h:33
@@ -720,8 +727,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
void moveSetBulb(uint8_t r, uint8_t g, uint8_t b)
Definition: PS3USB.cpp:502
Definition: PS3Enums.h:123
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: PS3USB.cpp:46
-
#define EP_INTERRUPT
Definition: PS3USB.h:28
+
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: PS3USB.cpp:46
Definition: address.h:32
#define MOVE_REPORT_BUFFER_SIZE
Definition: PS3Enums.h:40
void printStatusString()
Definition: PS3USB.cpp:365
@@ -729,55 +735,55 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
Definition: Usb.cpp:292
ButtonEnum
-
#define HID_REQUEST_SET_REPORT
Definition: BTD.h:39
#define HID_REQUEST_GET_REPORT
Definition: hid.h:69
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 getAnalogHat(AnalogHatEnum a)
Definition: PS3USB.cpp:330
-
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:83
-
USB * pUsb
Definition: PS3USB.h:277
+
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:85
+
#define PSTR(str)
+
USB * pUsb
Definition: PS3USB.h:268
ColorsEnum
const uint8_t PS3_ANALOG_BUTTONS[]
Definition: PS3Enums.h:92
#define USB_NAK_NOWAIT
Definition: address.h:29
AngleEnum
double getAngle(AngleEnum a)
Definition: PS3USB.cpp:338
-
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:80
-
#define PS3_PID
Definition: BTD.h:25
+
#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
Definition: UsbCore.h:82
+
#define PS3_PID
Definition: BTD.h:26
uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data)
Definition: Usb.cpp:206
-
#define PS3NAVIGATION_PID
Definition: BTD.h:26
+
#define PS3NAVIGATION_PID
Definition: BTD.h:27
void moveSetRumble(uint8_t rumble)
Definition: PS3USB.cpp:515
-
virtual uint8_t Poll()
Definition: PS3USB.cpp:271
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:75
+
uint8_t Poll()
Definition: PS3USB.cpp:271
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
-
#define PS3_MAX_ENDPOINTS
Definition: PS3USB.h:48
-
EpInfo epInfo[PS3_MAX_ENDPOINTS]
Definition: PS3USB.h:281
+
#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
+
#define bmREQ_HID_IN
Definition: hid.h:64
-
#define bmREQ_HID_OUT
Definition: BTD.h:38
-
#define bmREQ_HID_IN
Definition: PS3USB.h:43
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:78
+
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:80
void setLedOn(LEDEnum a)
Definition: PS3USB.cpp:449
+
#define strcat_P(dest, src)
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:206
-
uint8_t bAddress
Definition: PS3USB.h:279
+
AddressPool & GetAddressPool()
Definition: UsbCore.h:213
+
uint8_t bAddress
Definition: PS3USB.h:270
void setMoveBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:525
#define PS3_REPORT_BUFFER_SIZE
Definition: PS3Enums.h:24
-
Definition: UsbCore.h:190
+
Definition: UsbCore.h:197
SensorEnum
-
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:210
+
uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
Definition: UsbCore.h:217
#define NotifyFailSetConfDescr(...)
Definition: message.h:53
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:551
Definition: PS3Enums.h:125
bool getStatus(StatusEnum c)
Definition: PS3USB.cpp:361
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:761
+
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:764
#define NotifyFailSetDevTblEntry(...)
Definition: message.h:51
const uint8_t PS3_REPORT_BUFFER[PS3_REPORT_BUFFER_SIZE]
Definition: PS3Enums.h:27
bool getButtonClick(ButtonEnum b)
Definition: PS3USB.cpp:319
@@ -787,7 +793,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s3_u_s_b_8h.html b/_p_s3_u_s_b_8h.html index b55ee6fa..6ff336c4 100644 --- a/_p_s3_u_s_b_8h.html +++ b/_p_s3_u_s_b_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3USB.h File Reference + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -93,13 +94,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#include "Usb.h"
+#include "hid.h"
#include "PS3Enums.h"
Include dependency graph for PS3USB.h:
- +
This graph shows which files directly or indirectly include this file:
@@ -120,8 +122,6 @@ Classes Macros #define EP_MAXPKTSIZE   64   -#define EP_INTERRUPT   0x03 -  #define PS3_CONTROL_PIPE   0   #define PS3_OUTPUT_PIPE   1 @@ -136,14 +136,6 @@ Macros   #define PS3MOVE_PID   0x03D5   -#define bmREQ_HID_OUT   USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE -  -#define bmREQ_HID_IN   USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE -  -#define HID_REQUEST_GET_REPORT   0x01 -  -#define HID_REQUEST_SET_REPORT   0x09 -  #define PS3_MAX_ENDPOINTS   3   @@ -158,21 +150,7 @@ Macros
-

Definition at line 25 of file PS3USB.h.

- -
-
- -
-
- - - - -
#define EP_INTERRUPT   0x03
-
- -

Definition at line 28 of file PS3USB.h.

+

Definition at line 26 of file PS3USB.h.

@@ -186,7 +164,7 @@ Macros
-

Definition at line 31 of file PS3USB.h.

+

Definition at line 29 of file PS3USB.h.

@@ -200,7 +178,7 @@ Macros
-

Definition at line 32 of file PS3USB.h.

+

Definition at line 30 of file PS3USB.h.

@@ -214,7 +192,7 @@ Macros
-

Definition at line 33 of file PS3USB.h.

+

Definition at line 31 of file PS3USB.h.

@@ -228,7 +206,7 @@ Macros
-

Definition at line 36 of file PS3USB.h.

+

Definition at line 34 of file PS3USB.h.

@@ -242,7 +220,7 @@ Macros
-

Definition at line 37 of file PS3USB.h.

+

Definition at line 35 of file PS3USB.h.

@@ -256,7 +234,7 @@ Macros
-

Definition at line 38 of file PS3USB.h.

+

Definition at line 36 of file PS3USB.h.

@@ -270,63 +248,7 @@ Macros
-

Definition at line 39 of file PS3USB.h.

- -
- - -
-
- -

Definition at line 42 of file PS3USB.h.

- -
-
- -
-
- -

Definition at line 43 of file PS3USB.h.

- -
-
- -
-
- - - - -
#define HID_REQUEST_GET_REPORT   0x01
-
- -

Definition at line 45 of file PS3USB.h.

- -
-
- -
-
- - - - -
#define HID_REQUEST_SET_REPORT   0x09
-
- -

Definition at line 46 of file PS3USB.h.

+

Definition at line 37 of file PS3USB.h.

@@ -340,7 +262,7 @@ Macros
-

Definition at line 48 of file PS3USB.h.

+

Definition at line 39 of file PS3USB.h.

@@ -349,7 +271,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 b91d38d1..12e5013f 100644 --- a/_p_s3_u_s_b_8h__dep__incl.md5 +++ b/_p_s3_u_s_b_8h__dep__incl.md5 @@ -1 +1 @@ -10cd044b5bf58467538f65c844ab1455 \ No newline at end of file +0475266e9b2a94b52ed82e482fd5e58c \ No newline at end of file diff --git a/_p_s3_u_s_b_8h__incl.map b/_p_s3_u_s_b_8h__incl.map index 220e1654..168f5b6f 100644 --- a/_p_s3_u_s_b_8h__incl.map +++ b/_p_s3_u_s_b_8h__incl.map @@ -1,5 +1,7 @@ - - - + + + + + diff --git a/_p_s3_u_s_b_8h__incl.md5 b/_p_s3_u_s_b_8h__incl.md5 index 7be15006..177300e5 100644 --- a/_p_s3_u_s_b_8h__incl.md5 +++ b/_p_s3_u_s_b_8h__incl.md5 @@ -1 +1 @@ -d7ca50c1f7f20fdedd5d4e89b29bcaf5 \ No newline at end of file +2b18542091cc595d838d40ff497d2b2f \ 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 4dac0627620cb7461034e867beb8185ca965e2e1..8986c495fc7fa1772fa35bcbc0d47923ef272238 100644 GIT binary patch literal 17914 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 Z)PN-?{#Z3`;6E-%3NotFm6B$`{{txYIs*Uz diff --git a/_p_s3_u_s_b_8h_source.html b/_p_s3_u_s_b_8h_source.html index 1621d40c..502eabde 100644 --- a/_p_s3_u_s_b_8h_source.html +++ b/_p_s3_u_s_b_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3USB.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -110,186 +111,178 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
19 #define _ps3usb_h_
20 
21 #include "Usb.h"
-
22 #include "PS3Enums.h"
-
23 
-
24 /* PS3 data taken from descriptors */
-
25 #define EP_MAXPKTSIZE 64 // max size for data via USB
-
26 
-
27 /* Endpoint types */
-
28 #define EP_INTERRUPT 0x03
-
29 
-
30 /* Names we give to the 3 ps3 pipes - this is only used for setting the bluetooth address into the ps3 controllers */
-
31 #define PS3_CONTROL_PIPE 0
-
32 #define PS3_OUTPUT_PIPE 1
-
33 #define PS3_INPUT_PIPE 2
-
34 
-
35 //PID and VID of the different devices
-
36 #define PS3_VID 0x054C // Sony Corporation
-
37 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
-
38 #define PS3NAVIGATION_PID 0x042F // Navigation controller
-
39 #define PS3MOVE_PID 0x03D5 // Motion controller
+
22 #include "hid.h"
+
23 #include "PS3Enums.h"
+
24 
+
25 /* PS3 data taken from descriptors */
+
26 #define EP_MAXPKTSIZE 64 // max size for data via USB
+
27 
+
28 /* Names we give to the 3 ps3 pipes - this is only used for setting the bluetooth address into the ps3 controllers */
+
29 #define PS3_CONTROL_PIPE 0
+
30 #define PS3_OUTPUT_PIPE 1
+
31 #define PS3_INPUT_PIPE 2
+
32 
+
33 //PID and VID of the different devices
+
34 #define PS3_VID 0x054C // Sony Corporation
+
35 #define PS3_PID 0x0268 // PS3 Controller DualShock 3
+
36 #define PS3NAVIGATION_PID 0x042F // Navigation controller
+
37 #define PS3MOVE_PID 0x03D5 // Motion controller
+
38 
+
39 #define PS3_MAX_ENDPOINTS 3
40 
-
41 // Used in control endpoint header for HID Commands
-
42 #define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
-
43 #define bmREQ_HID_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
-
44 
-
45 #define HID_REQUEST_GET_REPORT 0x01
-
46 #define HID_REQUEST_SET_REPORT 0x09
-
47 
-
48 #define PS3_MAX_ENDPOINTS 3
-
49 
-
58 class PS3USB : public USBDeviceConfig {
-
59 public:
-
67  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);
-
68 
-
77  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
-
82  virtual uint8_t Release();
-
87  virtual uint8_t Poll();
-
88 
-
93  virtual uint8_t GetAddress() {
-
94  return bAddress;
-
95  };
-
96 
-
101  virtual bool isReady() {
-
102  return bPollEnable;
-
103  };
-
104 
-
111  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
-
112  return (vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID));
-
113  };
-
121  void setBdaddr(uint8_t *bdaddr);
-
127  void getBdaddr(uint8_t *bdaddr);
-
128 
-
134  void setMoveBdaddr(uint8_t *bdaddr);
-
140  void getMoveBdaddr(uint8_t *bdaddr);
-
145  void getMoveCalibration(uint8_t *data);
-
146 
-
158  bool getButtonPress(ButtonEnum b);
-
159  bool getButtonClick(ButtonEnum b);
-
170  uint8_t getAnalogButton(ButtonEnum a);
-
176  uint8_t getAnalogHat(AnalogHatEnum a);
-
183  uint16_t getSensor(SensorEnum a);
-
189  double getAngle(AngleEnum a);
-
195  bool getStatus(StatusEnum c);
-
197  void printStatusString();
-
198 
-
200  void setAllOff();
-
202  void setRumbleOff();
-
207  void setRumbleOn(RumbleEnum mode);
-
215  void setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower);
-
216 
-
221  void setLedRaw(uint8_t value);
-
222 
-
224  void setLedOff() {
-
225  setLedRaw(0);
-
226  }
-
231  void setLedOff(LEDEnum a);
-
236  void setLedOn(LEDEnum a);
-
241  void setLedToggle(LEDEnum a);
-
242 
-
247  void moveSetBulb(uint8_t r, uint8_t g, uint8_t b);
-
252  void moveSetBulb(ColorsEnum color);
-
257  void moveSetRumble(uint8_t rumble);
-
258 
-
263  void attachOnInit(void (*funcOnInit)(void)) {
-
264  pFuncOnInit = funcOnInit;
-
265  };
-
269  bool PS3Connected;
- - -
274 
-
275 protected:
- -
279  uint8_t bAddress;
- +
49 class PS3USB : public USBDeviceConfig {
+
50 public:
+
58  PS3USB(USB *pUsb, uint8_t btadr5 = 0, uint8_t btadr4 = 0, uint8_t btadr3 = 0, uint8_t btadr2 = 0, uint8_t btadr1 = 0, uint8_t btadr0 = 0);
+
59 
+
68  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
+
73  uint8_t Release();
+
78  uint8_t Poll();
+
79 
+
84  virtual uint8_t GetAddress() {
+
85  return bAddress;
+
86  };
+
87 
+
92  virtual bool isReady() {
+
93  return bPollEnable;
+
94  };
+
95 
+
102  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
+
103  return (vid == PS3_VID && (pid == PS3_PID || pid == PS3NAVIGATION_PID || pid == PS3MOVE_PID));
+
104  };
+
112  void setBdaddr(uint8_t *bdaddr);
+
118  void getBdaddr(uint8_t *bdaddr);
+
119 
+
125  void setMoveBdaddr(uint8_t *bdaddr);
+
131  void getMoveBdaddr(uint8_t *bdaddr);
+
136  void getMoveCalibration(uint8_t *data);
+
137 
+
149  bool getButtonPress(ButtonEnum b);
+
150  bool getButtonClick(ButtonEnum b);
+
161  uint8_t getAnalogButton(ButtonEnum a);
+
167  uint8_t getAnalogHat(AnalogHatEnum a);
+
174  uint16_t getSensor(SensorEnum a);
+
180  double getAngle(AngleEnum a);
+
186  bool getStatus(StatusEnum c);
+
188  void printStatusString();
+
189 
+
191  void setAllOff();
+
193  void setRumbleOff();
+
198  void setRumbleOn(RumbleEnum mode);
+
206  void setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower);
+
207 
+
212  void setLedRaw(uint8_t value);
+
213 
+
215  void setLedOff() {
+
216  setLedRaw(0);
+
217  }
+
222  void setLedOff(LEDEnum a);
+
227  void setLedOn(LEDEnum a);
+
232  void setLedToggle(LEDEnum a);
+
233 
+
238  void moveSetBulb(uint8_t r, uint8_t g, uint8_t b);
+
243  void moveSetBulb(ColorsEnum color);
+
248  void moveSetRumble(uint8_t rumble);
+
249 
+
254  void attachOnInit(void (*funcOnInit)(void)) {
+
255  pFuncOnInit = funcOnInit;
+
256  };
+
260  bool PS3Connected;
+ + +
265 
+
266 protected:
+ +
270  uint8_t bAddress;
+ +
273 
+
274 private:
+
280  void onInit();
+
281  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
282 
-
283 private:
-
289  void onInit();
-
290  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
-
291 
-
292  bool bPollEnable;
-
293 
-
294  uint32_t timer; // used to continuously set PS3 Move controller Bulb and rumble values
-
295 
-
296  uint32_t ButtonState;
-
297  uint32_t OldButtonState;
-
298  uint32_t ButtonClickState;
-
299 
-
300  uint8_t my_bdaddr[6]; // Change to your dongles Bluetooth address in the constructor
-
301  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
-
302  uint8_t writeBuf[EP_MAXPKTSIZE]; // General purpose buffer for output data
-
303 
-
304  void readReport(); // read incoming data
-
305  void printReport(); // print incoming date - Uncomment for debugging
-
306 
-
307  /* Private commands */
-
308  void PS3_Command(uint8_t *data, uint16_t nbytes);
-
309  void enable_sixaxis(); // Command used to enable the Dualshock 3 and Navigation controller to send data via USB
-
310  void Move_Command(uint8_t *data, uint16_t nbytes);
-
311 };
-
312 #endif
+
283  bool bPollEnable;
+
284 
+
285  uint32_t timer; // used to continuously set PS3 Move controller Bulb and rumble values
+
286 
+
287  uint32_t ButtonState;
+
288  uint32_t OldButtonState;
+
289  uint32_t ButtonClickState;
+
290 
+
291  uint8_t my_bdaddr[6]; // Change to your dongles Bluetooth address in the constructor
+
292  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
+
293  uint8_t writeBuf[EP_MAXPKTSIZE]; // General purpose buffer for output data
+
294 
+
295  void readReport(); // read incoming data
+
296  void printReport(); // print incoming date - Uncomment for debugging
+
297 
+
298  /* Private commands */
+
299  void PS3_Command(uint8_t *data, uint16_t nbytes);
+
300  void enable_sixaxis(); // Command used to enable the Dualshock 3 and Navigation controller to send data via USB
+
301  void Move_Command(uint8_t *data, uint16_t nbytes);
+
302 };
+
303 #endif
void getBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:476
-
Definition: PS3USB.h:58
+
Definition: PS3USB.h:49
void setLedRaw(uint8_t value)
Definition: PS3USB.cpp:439
-
bool PS3NavigationConnected
Definition: PS3USB.h:273
-
void setLedOff()
Definition: PS3USB.h:224
+
bool PS3NavigationConnected
Definition: PS3USB.h:264
+
void setLedOff()
Definition: PS3USB.h:215
+
void setBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:463
-
virtual uint8_t Release()
Definition: PS3USB.cpp:261
+
uint8_t Release()
Definition: PS3USB.cpp:261
bool getButtonPress(ButtonEnum b)
Definition: PS3USB.cpp:315
-
bool PS3MoveConnected
Definition: PS3USB.h:271
+
bool PS3MoveConnected
Definition: PS3USB.h:262
AnalogHatEnum
StatusEnum
Definition: PS3Enums.h:113
- +
void getMoveBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:541
uint8_t getAnalogButton(ButtonEnum a)
Definition: PS3USB.cpp:326
uint16_t getSensor(SensorEnum a)
Definition: PS3USB.cpp:334
void setRumbleOff()
Definition: PS3USB.cpp:411
-
#define EP_MAXPKTSIZE
Definition: PS3USB.h:25
-
bool PS3Connected
Definition: PS3USB.h:265
+
#define EP_MAXPKTSIZE
Definition: PS3USB.h:26
+
bool PS3Connected
Definition: PS3USB.h:256
LEDEnum
-
virtual uint8_t GetAddress()
Definition: PS3USB.h:93
+
virtual uint8_t GetAddress()
Definition: PS3USB.h:84
RumbleEnum
-
void attachOnInit(void(*funcOnInit)(void))
Definition: PS3USB.h:263
+
void attachOnInit(void(*funcOnInit)(void))
Definition: PS3USB.h:254
void setLedToggle(LEDEnum a)
Definition: PS3USB.cpp:458
void moveSetBulb(uint8_t r, uint8_t g, uint8_t b)
Definition: PS3USB.cpp:502
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: PS3USB.cpp:46
+
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: PS3USB.cpp:46
Definition: address.h:32
void printStatusString()
Definition: PS3USB.cpp:365
void setAllOff()
Definition: PS3USB.cpp:404
ButtonEnum
-
#define PS3_PID
Definition: PS3USB.h:37
+
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:330
-
USB * pUsb
Definition: PS3USB.h:277
+
USB * pUsb
Definition: PS3USB.h:268
ColorsEnum
AngleEnum
double getAngle(AngleEnum a)
Definition: PS3USB.cpp:338
void moveSetRumble(uint8_t rumble)
Definition: PS3USB.cpp:515
-
virtual uint8_t Poll()
Definition: PS3USB.cpp:271
-
#define PS3MOVE_PID
Definition: PS3USB.h:39
-
#define PS3_MAX_ENDPOINTS
Definition: PS3USB.h:48
-
EpInfo epInfo[PS3_MAX_ENDPOINTS]
Definition: PS3USB.h:281
+
uint8_t Poll()
Definition: PS3USB.cpp:271
+
#define PS3MOVE_PID
Definition: PS3USB.h:37
+
#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
-
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: PS3USB.h:111
void setLedOn(LEDEnum a)
Definition: PS3USB.cpp:449
-
#define PS3NAVIGATION_PID
Definition: PS3USB.h:38
-
#define PS3_VID
Definition: PS3USB.h:36
-
uint8_t bAddress
Definition: PS3USB.h:279
+
#define PS3NAVIGATION_PID
Definition: PS3USB.h:36
+
#define PS3_VID
Definition: PS3USB.h:34
+
uint8_t bAddress
Definition: PS3USB.h:270
void setMoveBdaddr(uint8_t *bdaddr)
Definition: PS3USB.cpp:525
-
Definition: UsbCore.h:190
+
Definition: UsbCore.h:197
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:551
bool getStatus(StatusEnum c)
Definition: PS3USB.cpp:361
-
virtual bool isReady()
Definition: PS3USB.h:101
+
virtual bool isReady()
Definition: PS3USB.h:92
bool getButtonClick(ButtonEnum b)
Definition: PS3USB.cpp:319
diff --git a/_p_s4_b_t_8h.html b/_p_s4_b_t_8h.html index ee64645b..2ca09d29 100644 --- a/_p_s4_b_t_8h.html +++ b/_p_s4_b_t_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4BT.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -98,7 +99,7 @@ Include dependency graph for PS4BT.h:
- +

Go to the source code of this file.

@@ -113,7 +114,7 @@ Classes diff --git a/_p_s4_b_t_8h__incl.map b/_p_s4_b_t_8h__incl.map index 5717dd5c..52b1ba70 100644 --- a/_p_s4_b_t_8h__incl.map +++ b/_p_s4_b_t_8h__incl.map @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/_p_s4_b_t_8h__incl.md5 b/_p_s4_b_t_8h__incl.md5 index 2832c4ad..3ce4b4b2 100644 --- a/_p_s4_b_t_8h__incl.md5 +++ b/_p_s4_b_t_8h__incl.md5 @@ -1 +1 @@ -105dd8723b891d12cb3a66169e6fa9c1 \ No newline at end of file +ce812a189234822fb9d18733d5d06169 \ 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 5858851fe9209708b3626dba689f7788e11e37ea..37f3d228b42408be52fa235a758f22314d13e181 100644 GIT binary patch literal 29380 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 diff --git a/_p_s4_b_t_8h_source.html b/_p_s4_b_t_8h_source.html index 55dd551a..2b8eb546 100644 --- a/_p_s4_b_t_8h_source.html +++ b/_p_s4_b_t_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4BT.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -123,106 +124,100 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
46  return BTHID::connected;
47  };
48 
-
53  void attachOnInit(void (*funcOnInit)(void)) {
-
54  pFuncOnInit = funcOnInit;
-
55  };
-
56 
-
57 protected:
-
64  virtual void ParseBTHIDData(uint8_t len, uint8_t *buf) {
-
65  PS4Parser::Parse(len, buf);
-
66  };
-
67 
-
73  virtual void OnInitBTHID() {
- -
75  enable_sixaxis(); // Make the controller send out the entire output report
-
76  if (pFuncOnInit)
-
77  pFuncOnInit(); // Call the user function
-
78  else
-
79  setLed(Blue);
-
80  };
-
81 
-
83  virtual void ResetBTHID() {
- -
85  };
-
89  virtual void sendOutputReport(PS4Output *output) { // Source: https://github.com/chrippa/ds4drv
-
90  uint8_t buf[79];
-
91  memset(buf, 0, sizeof(buf));
+
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[0] = 0x52; // HID BT Set_report (0x50) | Report Type (Output 0x02)
-
94  buf[1] = 0x11; // Report ID
-
95  buf[2] = 0x80;
-
96  buf[4]= 0xFF;
-
97 
-
98  buf[7] = output->smallRumble; // Small Rumble
-
99  buf[8] = output->bigRumble; // Big rumble
-
100 
-
101  buf[9] = output->r; // Red
-
102  buf[10] = output->g; // Green
-
103  buf[11] = output->b; // Blue
-
104 
-
105  buf[12] = output->flashOn; // Time to flash bright (255 = 2.5 seconds)
-
106  buf[13] = 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  HID_Command(buf, sizeof(buf));
-
113  };
-
116 private:
-
117  void enable_sixaxis() { // Command used to make the PS4 controller send out the entire output report
-
118  uint8_t buf[2];
-
119  buf[0] = 0x43; // HID BT Get_report (0x40) | Report Type (Feature 0x03)
-
120  buf[1] = 0x02; // Report ID
-
121 
-
122  HID_Command(buf, 2);
-
123  };
-
124 
-
125  void HID_Command(uint8_t *data, uint8_t nbytes) {
-
126  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]);
-
127  };
-
128 
-
129  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
-
130 };
-
131 #endif
+
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.h:369
-
Definition: BTD.h:230
+
Definition: BTD.h:198
uint8_t b
Definition: PS4Parser.h:118
void setLed(uint8_t r, uint8_t g, uint8_t b)
Definition: PS4Parser.h:333
bool connected()
Definition: PS4BT.h:45
-
bool connected
Definition: BTHID.h:92
+
bool connected
Definition: BTHID.h:83
uint8_t flashOn
Definition: PS4Parser.h:119
-
void attachOnInit(void(*funcOnInit)(void))
Definition: PS4BT.h:53
-
uint8_t control_scid[2]
Definition: BTHID.h:136
+
uint8_t control_scid[2]
Definition: BTHID.h:134
uint8_t g
Definition: PS4Parser.h:118
bool reportChanged
Definition: PS4Parser.h:120
void Parse(uint8_t len, uint8_t *buf)
Definition: PS4Parser.cpp:64
uint8_t r
Definition: PS4Parser.h:118
-
virtual void ParseBTHIDData(uint8_t len, uint8_t *buf)
Definition: PS4BT.h:64
+
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
-
BTD * pBtd
Definition: BTHID.h:129
+
void(* pFuncOnInit)(void)
Definition: BTD.h:603
uint8_t smallRumble
Definition: PS4Parser.h:117
-
uint16_t hci_handle
Definition: BTHID.h:132
-
virtual void sendOutputReport(PS4Output *output)
Definition: PS4BT.h:89
-
virtual void ResetBTHID()
Definition: PS4BT.h:83
+
virtual void sendOutputReport(PS4Output *output)
Definition: PS4BT.h:81
+
BTD * pBtd
Definition: BTD.h:606
+
virtual void ResetBTHID()
Definition: PS4BT.h:75
PS4BT(BTD *p, bool pair=false, const char *pin="0000")
Definition: PS4BT.h:36
-
virtual void OnInitBTHID()
Definition: PS4BT.h:73
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1190
+
uint16_t hci_handle
Definition: BTD.h:609
+
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:1198
Definition: BTHID.h:29
-
void pair(void)
Definition: BTHID.h:95
+
void pair(void)
Definition: BTHID.h:86
Definition: PS4BT.h:28
diff --git a/_p_s4_parser_8cpp.html b/_p_s4_parser_8cpp.html index cd76ff3c..09fca10a 100644 --- a/_p_s4_parser_8cpp.html +++ b/_p_s4_parser_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -104,7 +105,7 @@ Include dependency graph for PS4Parser.cpp:
diff --git a/_p_s4_parser_8cpp__incl.md5 b/_p_s4_parser_8cpp__incl.md5 index b54e7156..1f9ffe4e 100644 --- a/_p_s4_parser_8cpp__incl.md5 +++ b/_p_s4_parser_8cpp__incl.md5 @@ -1 +1 @@ -7b7a6c8921078ff071fc05959848bb21 \ No newline at end of file +03082f2d3fd4c67e7d5789f05b2dd70a \ No newline at end of file diff --git a/_p_s4_parser_8cpp_source.html b/_p_s4_parser_8cpp_source.html index 8bf83b8d..d7e9493c 100644 --- a/_p_s4_parser_8cpp_source.html +++ b/_p_s4_parser_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -130,11 +131,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
39  if (b <= LEFT) // Dpad
40  return checkDpad(b);
41  else
-
42  return ps4Data.btn.val & (1UL << pgm_read_byte(&PS4_BUTTONS[(uint8_t)b]));
+
42  return ps4Data.btn.val & (1UL << pgm_read_byte(&PS4_BUTTONS[(uint8_t)b]));
43 }
44 
-
46  uint32_t mask = 1UL << pgm_read_byte(&PS4_BUTTONS[(uint8_t)b]);
+
46  uint32_t mask = 1UL << pgm_read_byte(&PS4_BUTTONS[(uint8_t)b]);
47  bool click = buttonClickState.val & mask;
48  buttonClickState.val &= ~mask; // Clear "click" event
49  return click;
@@ -155,10 +156,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
64 void PS4Parser::Parse(uint8_t len, uint8_t *buf) {
65  if (len > 0 && buf) {
66 #ifdef PRINTREPORT
-
67  Notify(PSTR("\r\n"), 0x80);
+
67  Notify(PSTR("\r\n"), 0x80);
68  for (uint8_t i = 0; i < len; i++) {
69  D_PrintHex<uint8_t > (buf[i], 0x80);
-
70  Notify(PSTR(" "), 0x80);
+
70  Notify(PSTR(" "), 0x80);
71  }
72 #endif
73 
@@ -168,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
77  memcpy(&ps4Data, buf + 3, min(len - 3, sizeof(ps4Data)));
78  else {
79 #ifdef DEBUG_USB_HOST
-
80  Notify(PSTR("\r\nUnknown report id: "), 0x80);
+
80  Notify(PSTR("\r\nUnknown report id: "), 0x80);
81  D_PrintHex<uint8_t > (buf[0], 0x80);
82 #endif
83  return;
@@ -205,6 +206,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
bool getButtonPress(ButtonEnum b)
Definition: PS4Parser.cpp:38
AnalogHatEnum
+
#define pgm_read_byte(addr)
@@ -219,6 +221,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
virtual void sendOutputReport(PS4Output *output)=0
+
#define PSTR(str)
uint8_t dpad
Definition: PS4Parser.h:52
@@ -234,7 +237,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s4_parser_8h.html b/_p_s4_parser_8h.html index 2d989f52..4bdba7d9 100644 --- a/_p_s4_parser_8h.html +++ b/_p_s4_parser_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser.h File Reference + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -234,7 +235,7 @@ Variables diff --git a/_p_s4_parser_8h__dep__incl.md5 b/_p_s4_parser_8h__dep__incl.md5 index 8fd62cc2..2dc29627 100644 --- a/_p_s4_parser_8h__dep__incl.md5 +++ b/_p_s4_parser_8h__dep__incl.md5 @@ -1 +1 @@ -5e56bd64aa04badca5d0648201af05fb \ No newline at end of file +4d5a405a295dec480becbdb408726c5e \ No newline at end of file diff --git a/_p_s4_parser_8h__incl.md5 b/_p_s4_parser_8h__incl.md5 index 493b39f0..a7437e13 100644 --- a/_p_s4_parser_8h__incl.md5 +++ b/_p_s4_parser_8h__incl.md5 @@ -1 +1 @@ -559da26f56bdca12a84aceb0d7a5a74b \ No newline at end of file +29a4989044a63001a938d41ea83d3491 \ No newline at end of file diff --git a/_p_s4_parser_8h_source.html b/_p_s4_parser_8h_source.html index 2c44298a..1ede2be6 100644 --- a/_p_s4_parser_8h_source.html +++ b/_p_s4_parser_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser.h Source File + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -168,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
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
+
81  } __attribute__((packed)) finger[2]; // 0 = first finger, 1 = second finger
82 } __attribute__((packed));
83 
84 struct PS4Status {
@@ -186,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
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
+
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 
@@ -234,20 +235,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
167 
173  uint8_t getAnalogHat(AnalogHatEnum a);
174 
-
183  uint16_t getX(uint8_t finger = 0, uint8_t xyId = 0) {
-
184  return ps4Data.xy[xyId].finger[finger].x;
+
183  uint16_t getX(uint8_t finger = 0, uint8_t xyId = 0) {
+
184  return ps4Data.xy[xyId].finger[finger].x;
185  };
186 
-
195  uint16_t getY(uint8_t finger = 0, uint8_t xyId = 0) {
-
196  return ps4Data.xy[xyId].finger[finger].y;
+
195  uint16_t getY(uint8_t finger = 0, uint8_t xyId = 0) {
+
196  return ps4Data.xy[xyId].finger[finger].y;
197  };
198 
-
207  bool isTouching(uint8_t finger = 0, uint8_t xyId = 0) {
-
208  return !(ps4Data.xy[xyId].finger[finger].touching); // The bit is cleared when a finger is touching the touchpad
+
207  bool isTouching(uint8_t finger = 0, uint8_t xyId = 0) {
+
208  return !(ps4Data.xy[xyId].finger[finger].touching); // The bit is cleared when a finger is touching the touchpad
209  };
210 
-
219  uint8_t getTouchCounter(uint8_t finger = 0, uint8_t xyId = 0) {
-
220  return ps4Data.xy[xyId].finger[finger].counter;
+
219  uint8_t getTouchCounter(uint8_t finger = 0, uint8_t xyId = 0) {
+
220  return ps4Data.xy[xyId].finger[finger].counter;
221  };
222 
228  double getAngle(AngleEnum a) {
@@ -397,6 +398,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
int16_t getSensor(SensorEnum s)
Definition: PS4Parser.h:240
uint8_t flashOn
Definition: PS4Parser.h:119
+
struct touchpadXY::@28 finger[2]
uint8_t share
Definition: PS4Parser.h:62
@@ -416,9 +418,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
uint8_t counter
Definition: PS4Parser.h:77
uint16_t y
Definition: PS4Parser.h:80
-
struct touchpadXY::@24 finger[2]
- +
const uint8_t PS4_BUTTONS[]
Definition: PS4Parser.h:25
ButtonEnum
@@ -466,7 +467,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s4_u_s_b_8h.html b/_p_s4_u_s_b_8h.html index 210d3b47..c9eaff41 100644 --- a/_p_s4_u_s_b_8h.html +++ b/_p_s4_u_s_b_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4USB.h File Reference + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -150,7 +151,7 @@ Macros diff --git a/_p_s4_u_s_b_8h__incl.md5 b/_p_s4_u_s_b_8h__incl.md5 index d7a615bc..d7aff3fd 100644 --- a/_p_s4_u_s_b_8h__incl.md5 +++ b/_p_s4_u_s_b_8h__incl.md5 @@ -1 +1 @@ -c126bc79f3d87f6f416ad192609a96de \ No newline at end of file +6f7decca24cb5b3cb9ff8a80c692ad10 \ No newline at end of file diff --git a/_p_s4_u_s_b_8h_source.html b/_p_s4_u_s_b_8h_source.html index b13f740e..82fbec07 100644 --- a/_p_s4_u_s_b_8h_source.html +++ b/_p_s4_u_s_b_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4USB.h Source File + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -169,11 +170,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
110 
111  pUsb->outTransfer(bAddress, epInfo[ hidInterfaces[0].epIndex[epInterruptOutIndex] ].epAddr, sizeof(buf), buf);
112  };
-
115 private:
-
116  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
-
117 };
-
118 #endif
+
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
void Reset()
Definition: PS4Parser.h:369
void attachOnInit(void(*funcOnInit)(void))
Definition: PS4USB.h:54
virtual bool isReady()
Definition: hiduniversal.h:97
@@ -207,7 +212,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
USB * pUsb
Definition: hid.h:145
virtual void sendOutputReport(PS4Output *output)
Definition: PS4USB.h:90
PS4USB(USB *p)
Definition: PS4USB.h:37
-
Definition: UsbCore.h:190
+
Definition: UsbCore.h:197
EpInfo epInfo[totalEndpoints]
Definition: hiduniversal.h:64
@@ -215,7 +220,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s_buzz_8cpp.html b/_p_s_buzz_8cpp.html index 06b27a88..72e319fb 100644 --- a/_p_s_buzz_8cpp.html +++ b/_p_s_buzz_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -104,7 +105,7 @@ Include dependency graph for PSBuzz.cpp:
diff --git a/_p_s_buzz_8cpp__incl.md5 b/_p_s_buzz_8cpp__incl.md5 index 3e3ab755..b621778d 100644 --- a/_p_s_buzz_8cpp__incl.md5 +++ b/_p_s_buzz_8cpp__incl.md5 @@ -1 +1 @@ -548c6cb3bb73f0de55b17214908e97c2 \ No newline at end of file +ccb27c87a7828cc31b6f06794277dee5 \ No newline at end of file diff --git a/_p_s_buzz_8cpp_source.html b/_p_s_buzz_8cpp_source.html index b737f5a3..0eed6634 100644 --- a/_p_s_buzz_8cpp_source.html +++ b/_p_s_buzz_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -114,10 +115,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
23 void PSBuzz::ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
24  if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID && len > 0 && buf) {
25 #ifdef PRINTREPORT
-
26  Notify(PSTR("\r\n"), 0x80);
+
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);
+
29  Notify(PSTR(" "), 0x80);
30  }
31 #endif
32  memcpy(&psbuzzButtons, buf + 2, min(len - 2, sizeof(psbuzzButtons)));
@@ -169,27 +170,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
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_HIDOUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
+
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
void Reset()
Definition: PSBuzz.h:157
-
#define bmREQ_HIDOUT
Definition: hid.h:63
+
#define HID_REQUEST_SET_REPORT
Definition: hid.h:72
bool getButtonClick(ButtonEnum b, uint8_t controller=0)
Definition: PSBuzz.cpp:56
+
#define bmREQ_HID_OUT
Definition: hid.h:63
uint8_t bAddress
Definition: hid.h:146
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
bool getButtonPress(ButtonEnum b, uint8_t controller=0)
Definition: PSBuzz.cpp:52
-
virtual void ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
Definition: PSBuzz.cpp:23
+
void ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
Definition: PSBuzz.cpp:23
#define PSBUZZ_VID
Definition: PSBuzz.h:24
ButtonEnum
#define PSBUZZ_PID
Definition: PSBuzz.h:25
Definition: hid.h:143
-
#define HID_REQUEST_SET_REPORT
Definition: BTD.h:39
void setLedRaw(bool value, uint8_t controller=0)
Definition: PSBuzz.cpp:64
+
#define PSTR(str)
USB * pUsb
Definition: hid.h:145
-
virtual uint8_t OnInitSuccessful()
Definition: PSBuzz.cpp:41
+
uint8_t OnInitSuccessful()
Definition: PSBuzz.cpp:41
void setLedOnAll()
Definition: PSBuzz.h:114
uint32_t val
Definition: PSBuzz.h:36
EpInfo epInfo[totalEndpoints]
Definition: hiduniversal.h:64
@@ -198,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_p_s_buzz_8h.html b/_p_s_buzz_8h.html index 228cd2a4..07ba6a88 100644 --- a/_p_s_buzz_8h.html +++ b/_p_s_buzz_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz.h File Reference + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -159,7 +160,7 @@ Macros diff --git a/_p_s_buzz_8h__dep__incl.md5 b/_p_s_buzz_8h__dep__incl.md5 index c02fe703..5caa0d46 100644 --- a/_p_s_buzz_8h__dep__incl.md5 +++ b/_p_s_buzz_8h__dep__incl.md5 @@ -1 +1 @@ -b1edc92eb077ae74eaa6c13520327464 \ No newline at end of file +88928a152c2f379aa7b4a52bc6f3da10 \ No newline at end of file diff --git a/_p_s_buzz_8h__incl.md5 b/_p_s_buzz_8h__incl.md5 index fe1524ac..0cb4c14d 100644 --- a/_p_s_buzz_8h__incl.md5 +++ b/_p_s_buzz_8h__incl.md5 @@ -1 +1 @@ -1a6703ad2b9e33f56caa9fc30e3e4491 \ No newline at end of file +63019066017967cce826893baf0f58e6 \ No newline at end of file diff --git a/_p_s_buzz_8h_source.html b/_p_s_buzz_8h_source.html index fc4f3da8..7cd051e1 100644 --- a/_p_s_buzz_8h_source.html +++ b/_p_s_buzz_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz.h Source File + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -122,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
32  uint8_t green : 1;
33  uint8_t orange : 1;
34  uint8_t blue : 1;
-
35  } __attribute__((packed)) btn[4];
+
35  } __attribute__((packed)) btn[4];
36  uint32_t val : 20;
37 } __attribute__((packed));
38 
@@ -170,9 +171,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
133  setLedRaw(!ledState[controller], controller);
134  };
137 protected:
-
146  virtual void ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
+
146  void ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
147 
-
153  virtual uint8_t OnInitSuccessful();
+
153  uint8_t OnInitSuccessful();
157  void Reset() {
158  psbuzzButtons.val = 0;
159  oldButtonState.val = 0;
@@ -181,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
162  ledState[i] = 0;
163  };
164 
-
172  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
+
172  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
173  return (vid == PSBUZZ_VID && pid == PSBUZZ_PID);
174  };
177 private:
@@ -195,6 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
185 #endif
uint16_t PID
Definition: hiduniversal.h:69
uint8_t red
Definition: PSBuzz.h:30
+
struct PSBUZZButtons::@29 btn[4]
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
@@ -211,15 +213,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
#define PSBUZZ_PID
Definition: PSBuzz.h:25
uint8_t yellow
Definition: PSBuzz.h:31
Definition: hid.h:143
+
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: PSBuzz.h:172
void setLedOff(uint8_t controller=0)
Definition: PSBuzz.h:108
PSBuzz(USB *p)
Definition: PSBuzz.h:49
void setLedOnAll()
Definition: PSBuzz.h:114
-
Definition: UsbCore.h:190
+
Definition: UsbCore.h:197
void setLedOn(uint8_t controller=0)
Definition: PSBuzz.h:124
uint32_t val
Definition: PSBuzz.h:36
-
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: PSBuzz.h:172
-
struct PSBUZZButtons::@25 btn[4]
uint8_t orange
Definition: PSBuzz.h:33
void setLedOffAll()
Definition: PSBuzz.h:98
@@ -228,7 +229,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 2d26d51c..065ae20d 100644 --- a/_r_e_a_d_m_e_8md.html +++ b/_r_e_a_d_m_e_8md.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: README.md File Reference + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -92,7 +93,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_r_e_a_d_m_e_8md_source.html b/_r_e_a_d_m_e_8md_source.html index cd5261a5..2b9f1f3e 100644 --- a/_r_e_a_d_m_e_8md_source.html +++ b/_r_e_a_d_m_e_8md_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: README.md Source File + @@ -31,7 +32,7 @@
- + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -85,275 +86,351 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
README.md
-Go to the documentation of this file.
1 # USB Host Library Rev.2.0
+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 
-
6 # Summary
-
7 This is Revision 2.0 of MAX3421E-based USB Host Shield Library for AVR's.
-
8 
-
9 Project main web site is: <http://www.circuitsathome.com>.
-
10 
-
11 Some information can also be found at: <http://blog.tkjelectronics.dk/>.
-
12 
-
13 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>.
-
14 
-
15 ![USB Host Shield](http://www.circuitsathome.com/wp/wp-content/uploads/2012/02/UHS_20_main-288x216.jpg)
-
16 
-
17 For more information about the hardware see the [Hardware Manual](http://www.circuitsathome.com/usb-host-shield-hardware-manual).
-
18 
-
19 # Developed By
-
20 
-
21 * __Oleg Mazurov, Circuits\@Home__ - <mazurov@circuitsathome.com>
-
22 * __Alexei Glushchenko, Circuits\@Home__ - <alex-gl@mail.ru>
-
23  * Developers of the USB Core, HID, FTDI, ADK, ACM, and PL2303 libraries
-
24 * __Kristian Lauszus, TKJ Electronics__ - <kristianl@tkjelectronics.com>
-
25  * 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
-
26 * __Andrew Kroll__ - <xxxajk@gmail.com>
-
27  * Major contributor to mass storage code
-
28 
-
29 # How to include the library
-
30 
-
31 First download the library by clicking on the following link: <https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip>.
-
32 
-
33 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.
-
34 
-
35 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.
-
36 Now move the "USB\_Host\_Shield\_20" directory to the "libraries" directory.
-
37 
-
38 The final structure should look like this:
-
39 
-
40 * Arduino/
-
41  * libraries/
-
42  * USB\_Host\_Shield\_20/
-
43 
-
44 Now quit the Arduino IDE and reopen it.
-
45 
-
46 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.
-
47 
-
48 For more information visit the following site: <http://arduino.cc/en/Guide/Libraries>.
-
49 
-
50 # How to use the library
-
51 
-
52 ### Documentation
-
53 
-
54 Documentation for the library can be found at the following link: <http://felis.github.com/USB_Host_Shield_2.0/>.
-
55 
-
56 ### Enable debugging
-
57 
-
58 By default serial debugging is disabled. To turn it on simply change ```ENABLE_UHS_DEBUGGING``` to 1 in [settings.h](settings.h) like so:
-
59 
-
60 ```C++
-
61 #define ENABLE_UHS_DEBUGGING 1
-
62 ```
-
63 
-
64 ### Boards
-
65 
-
66 Currently the following boards are supported by the library:
-
67 
-
68 * All official Arduino AVR boards (Uno, Duemilanove, Mega, Mega 2560, Mega ADK, Leonardo etc.)
-
69 * Arduino Due
-
70  * If you are using the Arduino Due, then you must include the Arduino SPI library like so: ```#include <SPI.h>``` in your .ino file.
-
71 * Teensy (Teensy++ 1.0, Teensy 2.0, Teensy++ 2.0, and Teensy 3.x)
-
72  * 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.
-
73 * Balanduino
-
74 * Sanguino
-
75 * Black Widdow
-
76 
-
77 The following boards need to be activated manually in [settings.h](settings.h):
-
78 
-
79 * Arduino Mega ADK
-
80  * If you are using Arduino 1.5.5 or newer there is no need to activate the Arduino Mega ADK manually
-
81 * Black Widdow
-
82 
-
83 Simply set the corresponding value to 1 instead of 0.
-
84 
-
85 ### [Bluetooth libraries](BTD.cpp)
-
86 
-
87 The [BTD library](BTD.cpp) is a general purpose library for an ordinary Bluetooth dongle.
-
88 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.
-
89 Some different examples can be found in the [example directory](examples/Bluetooth).
-
90 
-
91 The BTD library also makes it possible to use multiple services at once, the following example sketch is an example of this:
-
92 [PS3SPP.ino](examples/Bluetooth/PS3SPP/PS3SPP.ino).
-
93 
-
94 ### [BTHID library](BTHID.cpp)
-
95 
-
96 The [Bluetooth HID library](BTHID.cpp) allows you to connect HID devices via Bluetooth to the USB Host Shield.
-
97 
-
98 Currently HID mice and keyboards are supported.
-
99 
-
100 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.
-
101 
-
102 The [PS4 library](#ps4-library) also uses this class to handle all Bluetooth communication.
-
103 
-
104 For information see the following blog post: <http://blog.tkjelectronics.dk/2013/12/bluetooth-hid-devices-now-supported-by-the-usb-host-library/>.
-
105 
-
106 ### [SPP library](SPP.cpp)
-
107 
-
108 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.
-
109 It has been tested successfully on Windows, Mac OS X, Linux, and Android.
-
110 
-
111 Take a look at the [SPP.ino](examples/Bluetooth/SPP/SPP.ino) example for more information.
-
112 
-
113 More information can be found at these blog posts:
-
114 
-
115 * <http://www.circuitsathome.com/mcu/bluetooth-rfcommspp-service-support-for-usb-host-2-0-library-released>
-
116 * <http://blog.tkjelectronics.dk/2012/07/rfcommspp-library-for-arduino/>
-
117 
-
118 To implement the SPP protocol I used a Bluetooth sniffing tool called [PacketLogger](http://www.tkjelectronics.com/uploads/PacketLogger.zip) developed by Apple.
-
119 It enables me to see the Bluetooth communication between my Mac and any device.
-
120 
-
121 ### PS4 Library
-
122 
-
123 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.
-
124 
-
125 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.
-
126 
-
127 Before you can use the PS4 controller via Bluetooth you will need to pair with it.
-
128 
-
129 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 paring mode.
-
130 
-
131 It should then automatically pair the dongle with your controller. This only have to be done once.
-
132 
-
133 For information see the following blog post: <http://blog.tkjelectronics.dk/2014/01/ps4-controller-now-supported-by-the-usb-host-library/>.
-
134 
-
135 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>.
-
136 
-
137 ### PS3 Library
-
138 
-
139 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.
-
140 
-
141 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.
-
142 
-
143 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.
-
144 
-
145 __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).
-
146 
-
147 For more information about the PS3 protocol see the official wiki: <https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information>.
-
148 
-
149 Also take a look at the blog posts:
-
150 
-
151 * <http://blog.tkjelectronics.dk/2012/01/ps3-controller-bt-library-for-arduino/>
-
152 * <http://www.circuitsathome.com/mcu/sony-ps3-controller-support-added-to-usb-host-library>
-
153 * <http://www.circuitsathome.com/mcu/arduino/interfacing-ps3-controllers-via-usb>
-
154 
-
155 A special thanks go to the following people:
-
156 
-
157 1. _Richard Ibbotson_ who made this excellent guide: <http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part>
-
158 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>
-
159 
-
160 Also a big thanks all the people behind these sites about the Motion controller:
-
161 
-
162 * <http://thp.io/2010/psmove/>
-
163 * <http://www.copenhagengamecollective.org/unimove/>
-
164 * <https://github.com/thp/psmoveapi>
-
165 * <http://code.google.com/p/moveonpc/>
-
166 
-
167 ### Xbox Libraries
-
168 
-
169 The library supports both the original Xbox controller via USB and the Xbox 360 controller both via USB and wirelessly.
-
170 
-
171 #### Xbox library
-
172 
-
173 The [XBOXOLD](XBOXOLD.cpp) class implements support for the original Xbox controller via USB.
-
174 
-
175 All the information are from the following sites:
-
176 
-
177 * <https://github.com/torvalds/linux/blob/master/Documentation/input/xpad.txt>
-
178 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
-
179 * <http://euc.jp/periphs/xbox-controller.ja.html>
-
180 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL#L15>
-
181 
-
182 #### Xbox 360 Library
-
183 
-
184 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).
-
185 
-
186 To use it via USB use the [XBOXUSB](XBOXUSB.cpp) library or to use it wirelessly use the [XBOXRECV](XBOXRECV.cpp) library.
-
187 
-
188 __Note that a Wireless controller can NOT be used via USB!__
-
189 
-
190 Examples code can be found in the [examples directory](examples/Xbox).
-
191 
-
192 Also see the following blog posts:
-
193 
-
194 * <http://www.circuitsathome.com/mcu/xbox360-controller-support-added-to-usb-host-shield-2-0-library>
-
195 * <http://blog.tkjelectronics.dk/2012/07/xbox-360-controller-support-added-to-the-usb-host-library/>
-
196 * <http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/>
-
197 
-
198 All the information regarding the Xbox 360 controller protocol are form these sites:
-
199 
-
200 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/UsbInfo>
-
201 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/WirelessUsbInfo>
-
202 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL>
-
203 
-
204 ### [Wii library](Wii.cpp)
-
205 
-
206 The [Wii](Wii.cpp) library support the Wiimote, but also the Nunchuch and Motion Plus extensions via Bluetooth. The Wii U Pro Controller is also supported via Bluetooth.
-
207 
-
208 First you have to pair with the controller, this is done automatically by the library if you create the instance like so:
-
209 
-
210 ```C++
-
211 WII Wii(&Btd, PAIR);
-
212 ```
-
213 
-
214 And then press 1 & 2 at once on the Wiimote or press sync if you are using a Wii U Pro Controller.
-
215 
-
216 After that you can simply create the instance like so:
-
217 
-
218 ```C++
-
219 WII Wii(&Btd);
-
220 ```
-
221 
-
222 Then just press any button on the Wiimote and it will then connect to the dongle.
-
223 
-
224 Take a look at the example for more information: [Wii.ino](examples/Bluetooth/Wii/Wii.ino).
-
225 
-
226 Also take a look at the blog post:
-
227 
-
228 * <http://blog.tkjelectronics.dk/2012/08/wiimote-added-to-usb-host-library/>
-
229 
-
230 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).
-
231 
-
232 The [WiiIRCamera.ino](examples/Bluetooth/WiiIRCamera/WiiIRCamera.ino) example shows how it can be used.
-
233 
-
234 
-
235 All the information about the Wii controllers are from these sites:
-
236 
-
237 * <http://wiibrew.org/wiki/Wiimote>
-
238 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers>
-
239 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Nunchuck>
-
240 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus>
-
241 * The old library created by _Tomoyuki Tanaka_: <https://github.com/moyuchin/WiiRemote_on_Arduino> also helped a lot.
-
242 
-
243 ### [PS Buzz Library](PSBuzz.cpp)
-
244 
-
245 This library implements support for the Playstation Buzz controllers via USB.
-
246 
-
247 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.
-
248 
-
249 The example [PSBuzz.ino](examples/PSBuzz/PSBuzz.ino) shows how one can do this with just a few lines of code.
-
250 
-
251 More information about the controller can be found at the following sites:
-
252 
-
253 * http://www.developerfusion.com/article/84338/making-usb-c-friendly/
-
254 * https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
-
255 
-
256 # FAQ
-
257 
-
258 > When I plug my device into the USB connector nothing happens?
-
259 
-
260 * Try to connect a external power supply to the Arduino - this solves the problem in most cases.
-
261 * 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);```.
- -
Definition: UsbCore.h:190
+
6 # Summary
+
7 This is Revision 2.0 of MAX3421E-based USB Host Shield Library for AVR's.
+
8 
+
9 Project main web site is: <http://www.circuitsathome.com>.
+
10 
+
11 Some information can also be found at: <http://blog.tkjelectronics.dk/>.
+
12 
+
13 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>.
+
14 
+
15 ![USB Host Shield](http://shop.tkjelectronics.dk/images/USB_Host_Shield1.jpg)
+
16 
+
17 For more information about the hardware see the [Hardware Manual](http://www.circuitsathome.com/usb-host-shield-hardware-manual).
+
18 
+
19 # Developed By
+
20 
+
21 * __Oleg Mazurov, Circuits\@Home__ - <mazurov@circuitsathome.com>
+
22 * __Alexei Glushchenko, Circuits\@Home__ - <alex-gl@mail.ru>
+
23  * Developers of the USB Core, HID, FTDI, ADK, ACM, and PL2303 libraries
+
24 * __Kristian Lauszus, TKJ Electronics__ - <kristianl@tkjelectronics.com>
+
25  * 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
+
26 * __Andrew Kroll__ - <xxxajk@gmail.com>
+
27  * Major contributor to mass storage code
+
28 * __guruthree__
+
29  * [Xbox ONE](#xbox-one-library) controller support
+
30 
+
31 # Donate
+
32 
+
33 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.
+
34 
+
35 <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>
+
36 
+
37 # Table of Contents
+
38 
+
39 * [How to include the library](#how-to-include-the-library)
+
40 * [How to use the library](#how-to-use-the-library)
+
41  * [Documentation](#documentation)
+
42  * [Enable debugging](#enable-debugging)
+
43  * [Boards](#boards)
+
44  * [Bluetooth libraries](#bluetooth-libraries)
+
45  * [BTHID library](#bthid-library)
+
46  * [SPP library](#spp-library)
+
47  * [PS4 Library](#ps4-library)
+
48  * [PS3 Library](#ps3-library)
+
49  * [Xbox Libraries](#xbox-libraries)
+
50  * [Xbox library](#xbox-library)
+
51  * [Xbox 360 Library](#xbox-360-library)
+
52  * [Xbox ONE Library](#xbox-one-library)
+
53  * [Wii library](#wii-library)
+
54  * [PS Buzz Library](#ps-buzz-library)
+
55 * [Interface modifications](#interface-modifications)
+
56 * [FAQ](#faq)
+
57 
+
58 # How to include the library
+
59 
+
60 First download the library by clicking on the following link: <https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip>.
+
61 
+
62 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.
+
63 
+
64 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.
+
65 Now move the "USB\_Host\_Shield\_20" directory to the "libraries" directory.
+
66 
+
67 The final structure should look like this:
+
68 
+
69 * Arduino/
+
70  * libraries/
+
71  * USB\_Host\_Shield\_20/
+
72 
+
73 Now quit the Arduino IDE and reopen it.
+
74 
+
75 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.
+
76 
+
77 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>.
+
78 
+
79 # How to use the library
+
80 
+
81 ### Documentation
+
82 
+
83 Documentation for the library can be found at the following link: <http://felis.github.com/USB_Host_Shield_2.0/>.
+
84 
+
85 ### Enable debugging
+
86 
+
87 By default serial debugging is disabled. To turn it on simply change ```ENABLE_UHS_DEBUGGING``` to 1 in [settings.h](settings.h) like so:
+
88 
+
89 ```C++
+
90 #define ENABLE_UHS_DEBUGGING 1
+
91 ```
+
92 
+
93 ### Boards
+
94 
+
95 Currently the following boards are supported by the library:
+
96 
+
97 * All official Arduino AVR boards (Uno, Duemilanove, Mega, Mega 2560, Mega ADK, Leonardo etc.)
+
98 * Arduino Due, Intel Galileo, Intel Galileo 2, and Intel Edison
+
99  * If you are using the Arduino Due, Intel Galileo or Intel Galileo 2, then you must include the Arduino SPI library like so: ```#include <SPI.h>``` in your .ino file.
+
100  * 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.
+
101 * Teensy (Teensy++ 1.0, Teensy 2.0, Teensy++ 2.0, and Teensy 3.x)
+
102  * 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.
+
103 * Balanduino
+
104 * Sanguino
+
105 * Black Widdow
+
106 * RedBearLab nRF51822
+
107  * If you are using the RedBearLab nRF51822, then you must include the RedBearLab SPI library like so: ```#include <SPI.h>``` in your .ino file.
+
108 * Digilent chipKIT
+
109  * Please see: <http://www.circuitsathome.com/mcu/usb/running-usb-host-code-on-digilent-chipkit-board>.
+
110 
+
111 The following boards need to be activated manually in [settings.h](settings.h):
+
112 
+
113 * Arduino Mega ADK
+
114  * If you are using Arduino 1.5.5 or newer there is no need to activate the Arduino Mega ADK manually
+
115 * Black Widdow
+
116 
+
117 Simply set the corresponding value to 1 instead of 0.
+
118 
+
119 ### [Bluetooth libraries](BTD.cpp)
+
120 
+
121 The [BTD library](BTD.cpp) is a general purpose library for an ordinary Bluetooth dongle.
+
122 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.
+
123 Some different examples can be found in the [example directory](examples/Bluetooth).
+
124 
+
125 The BTD library also makes it possible to use multiple services at once, the following example sketch is an example of this:
+
126 [PS3SPP.ino](examples/Bluetooth/PS3SPP/PS3SPP.ino).
+
127 
+
128 ### [BTHID library](BTHID.cpp)
+
129 
+
130 The [Bluetooth HID library](BTHID.cpp) allows you to connect HID devices via Bluetooth to the USB Host Shield.
+
131 
+
132 Currently HID mice and keyboards are supported.
+
133 
+
134 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.
+
135 
+
136 The [PS4 library](#ps4-library) also uses this class to handle all Bluetooth communication.
+
137 
+
138 For information see the following blog post: <http://blog.tkjelectronics.dk/2013/12/bluetooth-hid-devices-now-supported-by-the-usb-host-library/>.
+
139 
+
140 ### [SPP library](SPP.cpp)
+
141 
+
142 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.
+
143 It has been tested successfully on Windows, Mac OS X, Linux, and Android.
+
144 
+
145 Take a look at the [SPP.ino](examples/Bluetooth/SPP/SPP.ino) example for more information.
+
146 
+
147 More information can be found at these blog posts:
+
148 
+
149 * <http://www.circuitsathome.com/mcu/bluetooth-rfcommspp-service-support-for-usb-host-2-0-library-released>
+
150 * <http://blog.tkjelectronics.dk/2012/07/rfcommspp-library-for-arduino/>
+
151 
+
152 To implement the SPP protocol I used a Bluetooth sniffing tool called [PacketLogger](http://www.tkjelectronics.com/uploads/PacketLogger.zip) developed by Apple.
+
153 It enables me to see the Bluetooth communication between my Mac and any device.
+
154 
+
155 ### PS4 Library
+
156 
+
157 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.
+
158 
+
159 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.
+
160 
+
161 Before you can use the PS4 controller via Bluetooth you will need to pair with it.
+
162 
+
163 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 paring mode.
+
164 
+
165 It should then automatically pair the dongle with your controller. This only have to be done once.
+
166 
+
167 For information see the following blog post: <http://blog.tkjelectronics.dk/2014/01/ps4-controller-now-supported-by-the-usb-host-library/>.
+
168 
+
169 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>.
+
170 
+
171 ### PS3 Library
+
172 
+
173 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.
+
174 
+
175 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.
+
176 
+
177 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.
+
178 
+
179 __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).
+
180 
+
181 For more information about the PS3 protocol see the official wiki: <https://github.com/felis/USB_Host_Shield_2.0/wiki/PS3-Information>.
+
182 
+
183 Also take a look at the blog posts:
+
184 
+
185 * <http://blog.tkjelectronics.dk/2012/01/ps3-controller-bt-library-for-arduino/>
+
186 * <http://www.circuitsathome.com/mcu/sony-ps3-controller-support-added-to-usb-host-library>
+
187 * <http://www.circuitsathome.com/mcu/arduino/interfacing-ps3-controllers-via-usb>
+
188 
+
189 A special thanks go to the following people:
+
190 
+
191 1. _Richard Ibbotson_ who made this excellent guide: <http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part>
+
192 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>
+
193 
+
194 Also a big thanks all the people behind these sites about the Motion controller:
+
195 
+
196 * <http://thp.io/2010/psmove/>
+
197 * <http://www.copenhagengamecollective.org/unimove/>
+
198 * <https://github.com/thp/psmoveapi>
+
199 * <http://code.google.com/p/moveonpc/>
+
200 
+
201 ### Xbox Libraries
+
202 
+
203 The library supports both the original Xbox controller via USB and the Xbox 360 controller both via USB and wirelessly.
+
204 
+
205 #### Xbox library
+
206 
+
207 The [XBOXOLD](XBOXOLD.cpp) class implements support for the original Xbox controller via USB.
+
208 
+
209 All the information are from the following sites:
+
210 
+
211 * <https://github.com/torvalds/linux/blob/master/Documentation/input/xpad.txt>
+
212 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
+
213 * <http://euc.jp/periphs/xbox-controller.ja.html>
+
214 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL#L15>
+
215 
+
216 #### Xbox 360 Library
+
217 
+
218 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).
+
219 
+
220 To use it via USB use the [XBOXUSB](XBOXUSB.cpp) library or to use it wirelessly use the [XBOXRECV](XBOXRECV.cpp) library.
+
221 
+
222 __Note that a Wireless controller can NOT be used via USB!__
+
223 
+
224 Examples code can be found in the [examples directory](examples/Xbox).
+
225 
+
226 Also see the following blog posts:
+
227 
+
228 * <http://www.circuitsathome.com/mcu/xbox360-controller-support-added-to-usb-host-shield-2-0-library>
+
229 * <http://blog.tkjelectronics.dk/2012/07/xbox-360-controller-support-added-to-the-usb-host-library/>
+
230 * <http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/>
+
231 
+
232 All the information regarding the Xbox 360 controller protocol are form these sites:
+
233 
+
234 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/UsbInfo>
+
235 * <http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/WirelessUsbInfo>
+
236 * <https://github.com/Grumbel/xboxdrv/blob/master/PROTOCOL>
+
237 
+
238 #### Xbox ONE Library
+
239 
+
240 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:
+
241 
+
242 * <https://github.com/quantus/xbox-one-controller-protocol>
+
243 * <https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c>
+
244 * <https://github.com/kylelemons/xbox/blob/master/xbox.go>
+
245 
+
246 ### [Wii library](Wii.cpp)
+
247 
+
248 The [Wii](Wii.cpp) library support the Wiimote, but also the Nunchuch and Motion Plus extensions via Bluetooth. The Wii U Pro Controller is also supported via Bluetooth.
+
249 
+
250 First you have to pair with the controller, this is done automatically by the library if you create the instance like so:
+
251 
+
252 ```C++
+
253 WII Wii(&Btd, PAIR);
+
254 ```
+
255 
+
256 And then press 1 & 2 at once on the Wiimote or press sync if you are using a Wii U Pro Controller.
+
257 
+
258 After that you can simply create the instance like so:
+
259 
+
260 ```C++
+
261 WII Wii(&Btd);
+
262 ```
+
263 
+
264 Then just press any button on the Wiimote and it will then connect to the dongle.
+
265 
+
266 Take a look at the example for more information: [Wii.ino](examples/Bluetooth/Wii/Wii.ino).
+
267 
+
268 Also take a look at the blog post:
+
269 
+
270 * <http://blog.tkjelectronics.dk/2012/08/wiimote-added-to-usb-host-library/>
+
271 
+
272 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).
+
273 
+
274 The [WiiIRCamera.ino](examples/Bluetooth/WiiIRCamera/WiiIRCamera.ino) example shows how it can be used.
+
275 
+
276 
+
277 All the information about the Wii controllers are from these sites:
+
278 
+
279 * <http://wiibrew.org/wiki/Wiimote>
+
280 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers>
+
281 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Nunchuck>
+
282 * <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus>
+
283 * The old library created by _Tomoyuki Tanaka_: <https://github.com/moyuchin/WiiRemote_on_Arduino> also helped a lot.
+
284 
+
285 ### [PS Buzz Library](PSBuzz.cpp)
+
286 
+
287 This library implements support for the Playstation Buzz controllers via USB.
+
288 
+
289 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.
+
290 
+
291 The example [PSBuzz.ino](examples/PSBuzz/PSBuzz.ino) shows how one can do this with just a few lines of code.
+
292 
+
293 More information about the controller can be found at the following sites:
+
294 
+
295 * http://www.developerfusion.com/article/84338/making-usb-c-friendly/
+
296 * https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
+
297 
+
298 # Interface modifications
+
299 
+
300 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.
+
301 
+
302 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!
+
303 
+
304 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.
+
305 
+
306 After that you need modify the following entry in [UsbCore.h](UsbCore.h):
+
307 
+
308 ```C++
+
309 typedef MAX3421e<P10, P9> MAX3421E;
+
310 ```
+
311 
+
312 For instance if you have rerouted SS to pin 7 it should read:
+
313 
+
314 ```C++
+
315 typedef MAX3421e<P7, P9> MAX3421E;
+
316 ```
+
317 
+
318 See the "Interface modifications" section in the [hardware manual](https://www.circuitsathome.com/usb-host-shield-hardware-manual) for more information.
+
319 
+
320 # FAQ
+
321 
+
322 > When I plug my device into the USB connector nothing happens?
+
323 
+
324 * Try to connect a external power supply to the Arduino - this solves the problem in most cases.
+
325 * 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);```.
+
326 
+
327 > When I connecting my PS3 controller I get a output like this:
+
328 
+
329 ```
+
330 Dualshock 3 Controller Enabled
+
331 
+
332 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
+
333 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
+
334 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
+
335 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
+
336 LeftHatX: 0 LeftHatY: 0 RightHatX: 0 RightHatY: 0
+
337 ```
+
338 
+
339 * 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.
diff --git a/_s_p_p_8cpp.html b/_s_p_p_8cpp.html index 37da3a01..2b2e7d72 100644 --- a/_s_p_p_8cpp.html +++ b/_s_p_p_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPP.cpp File Reference + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -97,7 +98,7 @@ Include dependency graph for SPP.cpp:
- +

Go to the source code of this file.

@@ -145,7 +146,7 @@ Variables diff --git a/_s_p_p_8cpp__incl.map b/_s_p_p_8cpp__incl.map index f9cf35d2..76e3d532 100644 --- a/_s_p_p_8cpp__incl.map +++ b/_s_p_p_8cpp__incl.map @@ -1,5 +1,7 @@ - + + + diff --git a/_s_p_p_8cpp__incl.md5 b/_s_p_p_8cpp__incl.md5 index a9f94c2d..3b42f619 100644 --- a/_s_p_p_8cpp__incl.md5 +++ b/_s_p_p_8cpp__incl.md5 @@ -1 +1 @@ -7fcbcf3b461f8f3c5d0972f005f8a4e5 \ No newline at end of file +449619037175ca779e6e0127bdc68f55 \ No newline at end of file diff --git a/_s_p_p_8cpp__incl.png b/_s_p_p_8cpp__incl.png index f5233607025f0b523a721b7416f7cb20bdd49518..f678f44355ea072625afcccecc525e5e697dc38c 100644 GIT binary patch literal 15375 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 IX|vG(1y&inng9R* literal 5320 zcmd6rWm6l_x9%x!!J)WA(NaN*G(fT7DHK`?0aBol6fG{nOOa9tUMMcbDemqXoZ{~8 z8aO$3?%er*f_u)3J$uiZJ!{XbS@W#lvqQjIDga_eVk|5yfGS8)2eV_=BP>FE%!!?a zV+;$6CPGzF{+-*S{bV9*TD`~J4i5Pj;L<{56&WSqkDn*6#>w8RX_S^~;(h&%S35-` zUc`h;eN(C4 zH?WRU3b5>f?bR!TO7e@sbuS5Q1ksf99xoZ{K^E_-+`Jo`Q7WZmSW5d`2A1Ny6u9o~Qe?6I7bt-(8D3ZfMkP=OkSb zEumIA!_YUN@|H3%5&##{iRRTDDEe4!I~eb}Kcloo9UT=lP=*g+JW7O_r|}x_d6t@R)1z?|?zGlJIksPAGfT+E&HTO6x1rlF|o7h<96xDX)~QYuHKao_23%du?r_^YO4LNWxMawjN>lzCT)3!^CU9a_UO4Su0uU?4Mc0G5HN} zK;5o(o$lU>M3V{e68|-+ctX;}!F&=i3CW;Bi-TsuGrtnE&_K(unpemiOq*gId66MF z6Pehn;1hl1>{4eUO;>HlACj%H`~NnX_fj=AS5$~L*Rr>)U}FQ}{4Ivm@R!P-8dJk2 zZN|z`*i;1mIDI`mOKc1T`bhEtHXH)7U2!W07oypZ1cK7iNG}+>lFLr4a2>$-nok2d^ATx0ixMXJVgma@^I5(l(5#L?tGIFzNpa7RPvH%lXSep>)yZr9QIkK;Q*i z5qtwUu# zn0TzgTKID8fInW<7pyy5wXLzyYRtec;e8D)l~))W?M zT3Rm6vJEBs;)s*pCkb;(=g|oX>*`wf+V3ty9KEjB$vkV+DO5N>eJzrks|=*YG(GzR995WehF*d=K-y(|E}qE333?kJDl%~QRTVV z=iDEhQX`nD+Nw>#*g(-0Smo`Mm~S7)+8tp;AIhZxe>NP-cnMb5F*|FUz5>bUOJdlU(inaW~s0+g6ZvvQ%u>PnLexaWXMMqQp`?w|SwzLN%p+ zwG-rU*^l@%ca0h;;`^BK7n(|w;YLs7=bOg$vxmixQiU`L)SSM#OwiJI{AzT9g1nIbu4oY+EfL0YYgn1Ai;pI~J zep(Z;Pi&&Vj$6_CGMTtgP(Va@7jSYMA;kA>B0H+T47HhJt$8(XxwlN;BxyO-TeB^B(&E1VHWO@yk*u~-(-RwR zz4j9N?mt33F)=evr-Mb)X^!Uck4k$i6V*PD3^)G`tJ0)q7&Yc0iKozW$${is2x$Vjs5f@Im&xI_WjnBiBDx> zLjUk%|KVE<$X!{t^7UYtKx$+7MYZ}cP{lO$V7`9#7YKD(2*cqHoYDUMs@0ngw3d;y zh`40Abtn*NJfAeYQ#8f-rt39XVuIr2YqTt8Ds}vfO3{?Pzv6mq+onJo>~?`cO!n6B zeT8gVL4Atx%*@2Op;sJPy<`L3F`E#Zwk*@y*Sasy%TXxQB?hN&*P#}7SI14ifB#PN z(hoym82GY(vCJYYVteZ*?kQv^-mcJTcXIG@Nc!+dZw~ZqNf}vS$6GcKfes)C+FOuw zq2O5%8{bLWFgoGAP{?{YN$X~rhX3s3J;qvW+{))-6V{u}_pceS!I(t@r)AM+x(ntb ziUu|-yUOl0i(8y@BF5JBk}G0q1y<8#Jo6ZEGkWJek*`;EfuwUY<}xVS)V3dP=HY>a ze<7?v=8&;S1>QlrkEA`$tXR`=k!v3Y2yT|Yv;E-I{_k<|io-0Xi-Fx%q26WRt>%$v zy*)KPwWveAx!$Z<{w=P9yGZn=*o&hjj^tq6*jsz*v^0aut&#T0Z|9c8hFl?dDFKQ? ziHklD$v$bcKYe9kFxZ|-p>eS`POIP&j@k`)w%drtV*}%#R)Ig+WQUYipzjTO9V3;L zl=dFnUtC$P^&q`~!IGIEdMu5-o%bNOLY(m-&#I|; zM%=Run+0ajf*VNr_hq5xZVMF!gnx*&6#@z=kkUASQIDRYN>-Bp;E`nZilL$)%8z7Kj9EC$NKU~2rt4D=H$p3-RI_DeBu3)1M-Izv7EQ(< zJr;Ua7^Cv@fF$VMa(7-<;k`wZHvp z!u$kfu7{Hvw{1WHLfsVT$;?h3o&W(=)HERnR_ta=U>WP{kKpzoXPhtr1Vl2DJqp8X z9TEX}^CPl!boo<-4g+fb0|VB5P9pwaSa4<83yMDJP;tv~7zb3kcXxI^gH*b_tF{Hu zO6D7I$rB5pCO5);6-+#Jj)Q4ABJ@1s!fvc-VJ}6F0;T*@3+ckk!BpeK0Ve*J|myaRWFOc z(}DWI3u*Ti=(%IE6F$kD?@gC;F6#8Ds~41CR+{B{qaAhb^w!KVUQp()|8mjC1es^z z{sG1H=y=|B@!av9o<0Vfl>6gF9s^mjZ$ZoDc^v>zkm`}x|Fsh`B}f8tR&L&K7H&tJ zeaPB-QK?Vh_LzQ6|Er_meCpU4HRC-`_xl zl$hPZ@6K==1#rMZjYFope{LnD&Iu~(CT0;avNKv}P(DxwCVBaJV2Sep$hG zZT?aCr8=mK%}tYLIrLjKcpYmQ+5t@vg+;k%e3>jFEo6wwP-8L@1rmhZZ~O zkwR(L1C7WTahK{ zPdY}v>ib6W_ykFhFjP|`7K4ojqW{v`kzq&b7U~tyrK@t@W8WzJXb3L#4V07f4Li9# zsE^nfOzK9bleQgbzdom-6O;%c&M&8U1oUcC#Z>>;X1;EsTX`{Ukh0;s($$jR_cwSa z@~kAQD`to~NS(a;1RteRLvY`JKa xcI;^>U$NotF{7I|cY!)OfZ_jeI6V)K+TEU-M6FNVVSXsFRF$+8i{F^~{}=TyL6!gj diff --git a/_s_p_p_8cpp_source.html b/_s_p_p_8cpp_source.html index a2fd7a85..a8550554 100644 --- a/_s_p_p_8cpp_source.html +++ b/_s_p_p_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPP.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

@@ -134,856 +135,878 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
43 };
44 
45 SPP::SPP(BTD *p, const char* name, const char* pin) :
-
46 pBtd(p) // Pointer to BTD class instance - mandatory
+
46 BluetoothService(p) // Pointer to BTD class instance - mandatory
47 {
-
48  if(pBtd)
-
49  pBtd->registerServiceClass(this); // Register it as a Bluetooth service
+
48  pBtd->btdName = name;
+
49  pBtd->btdPin = pin;
50 
-
51  pBtd->btdName = name;
-
52  pBtd->btdPin = pin;
-
53 
-
54  /* Set device cid for the SDP and RFCOMM channelse */
-
55  sdp_dcid[0] = 0x50; // 0x0050
-
56  sdp_dcid[1] = 0x00;
-
57  rfcomm_dcid[0] = 0x51; // 0x0051
-
58  rfcomm_dcid[1] = 0x00;
+
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  Reset();
-
61 }
-
62 
-
63 void SPP::Reset() {
-
64  connected = false;
-
65  RFCOMMConnected = false;
-
66  SDPConnected = false;
-
67  waitForLastCommand = false;
-
68  l2cap_sdp_state = L2CAP_SDP_WAIT;
-
69  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT;
-
70  l2cap_event_flag = 0;
-
71  sppIndex = 0;
-
72 }
-
73 
- -
75  connected = false;
-
76  // First the two L2CAP channels has to be disconnected and then the HCI connection
-
77  if(RFCOMMConnected)
-
78  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, rfcomm_scid, rfcomm_dcid);
-
79  if(RFCOMMConnected && SDPConnected)
-
80  delay(1); // Add delay between commands
-
81  if(SDPConnected)
-
82  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, sdp_scid, sdp_dcid);
-
83  l2cap_sdp_state = L2CAP_DISCONNECT_RESPONSE;
-
84 }
-
85 
-
86 void SPP::ACLData(uint8_t* l2capinbuf) {
-
87  if(!connected) {
-
88  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
-
89  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == SDP_PSM && !pBtd->sdpConnectionClaimed) {
-
90  pBtd->sdpConnectionClaimed = true;
-
91  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
-
92  l2cap_sdp_state = L2CAP_SDP_WAIT; // Reset state
-
93  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == RFCOMM_PSM && !pBtd->rfcommConnectionClaimed) {
-
94  pBtd->rfcommConnectionClaimed = true;
-
95  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
-
96  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT; // Reset state
-
97  }
-
98  }
-
99  }
-
100  //if((l2capinbuf[0] | (uint16_t)l2capinbuf[1] << 8) == (hci_handle | 0x2000U)) { // acl_handle_ok
-
101  if(UHS_ACL_HANDLE_OK(l2capinbuf, hci_handle)) { // acl_handle_ok
-
102  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { //l2cap_control - Channel ID for ACL-U
-
103  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
-
104 #ifdef DEBUG_USB_HOST
-
105  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
-
106  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
-
107  Notify(PSTR(" "), 0x80);
-
108  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
-
109  Notify(PSTR(" Data: "), 0x80);
-
110  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
-
111  Notify(PSTR(" "), 0x80);
-
112  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
-
113  Notify(PSTR(" "), 0x80);
-
114  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
-
115  Notify(PSTR(" "), 0x80);
-
116  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
-
117 #endif
-
118  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
-
119 #ifdef EXTRADEBUG
-
120  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
-
121  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
-
122  Notify(PSTR(" "), 0x80);
-
123  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
-
124  Notify(PSTR(" SCID: "), 0x80);
-
125  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
-
126  Notify(PSTR(" "), 0x80);
-
127  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
-
128  Notify(PSTR(" Identifier: "), 0x80);
-
129  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
-
130 #endif
-
131  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
-
132  identifier = l2capinbuf[9];
-
133  sdp_scid[0] = l2capinbuf[14];
-
134  sdp_scid[1] = l2capinbuf[15];
- -
136  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == RFCOMM_PSM) { // ----- || -----
-
137  identifier = l2capinbuf[9];
-
138  rfcomm_scid[0] = l2capinbuf[14];
-
139  rfcomm_scid[1] = l2capinbuf[15];
- -
141  }
-
142  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
-
143  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
-
144  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
-
145  //Notify(PSTR("\r\nSDP Configuration Complete"), 0x80);
- -
147  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
-
148  //Notify(PSTR("\r\nRFCOMM Configuration Complete"), 0x80);
- -
150  }
-
151  }
-
152  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
-
153  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
-
154  //Notify(PSTR("\r\nSDP Configuration Request"), 0x80);
-
155  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], sdp_scid);
-
156  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
-
157  //Notify(PSTR("\r\nRFCOMM Configuration Request"), 0x80);
-
158  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], rfcomm_scid);
-
159  }
-
160  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
-
161  if(l2capinbuf[12] == sdp_dcid[0] && l2capinbuf[13] == sdp_dcid[1]) {
-
162  //Notify(PSTR("\r\nDisconnect Request: SDP Channel"), 0x80);
-
163  identifier = l2capinbuf[9];
- -
165  } else if(l2capinbuf[12] == rfcomm_dcid[0] && l2capinbuf[13] == rfcomm_dcid[1]) {
-
166  //Notify(PSTR("\r\nDisconnect Request: RFCOMM Channel"), 0x80);
-
167  identifier = l2capinbuf[9];
- -
169  }
-
170  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
-
171  if(l2capinbuf[12] == sdp_scid[0] && l2capinbuf[13] == sdp_scid[1]) {
-
172  //Notify(PSTR("\r\nDisconnect Response: SDP Channel"), 0x80);
-
173  identifier = l2capinbuf[9];
- -
175  } else if(l2capinbuf[12] == rfcomm_scid[0] && l2capinbuf[13] == rfcomm_scid[1]) {
-
176  //Notify(PSTR("\r\nDisconnect Response: RFCOMM Channel"), 0x80);
-
177  identifier = l2capinbuf[9];
- -
179  }
-
180  } else if(l2capinbuf[8] == L2CAP_CMD_INFORMATION_REQUEST) {
-
181 #ifdef DEBUG_USB_HOST
-
182  Notify(PSTR("\r\nInformation request"), 0x80);
-
183 #endif
-
184  identifier = l2capinbuf[9];
-
185  pBtd->l2cap_information_response(hci_handle, identifier, l2capinbuf[12], l2capinbuf[13]);
-
186  }
-
187 #ifdef EXTRADEBUG
-
188  else {
-
189  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
-
190  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
-
191  }
-
192 #endif
-
193  } else if(l2capinbuf[6] == sdp_dcid[0] && l2capinbuf[7] == sdp_dcid[1]) { // SDP
-
194  if(l2capinbuf[8] == SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU) {
-
195  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
-
196  if(firstMessage) {
-
197  serialPortResponse1(l2capinbuf[9], l2capinbuf[10]);
-
198  firstMessage = false;
-
199  } else {
-
200  serialPortResponse2(l2capinbuf[9], l2capinbuf[10]); // Serialport continuation state
-
201  firstMessage = true;
-
202  }
-
203  } else if(((l2capinbuf[16] << 8 | l2capinbuf[17]) == L2CAP_UUID) || ((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000 && (l2capinbuf[18] << 8 | l2capinbuf[19]) == L2CAP_UUID)) {
-
204  if(firstMessage) {
-
205  l2capResponse1(l2capinbuf[9], l2capinbuf[10]);
-
206  firstMessage = false;
-
207  } else {
-
208  l2capResponse2(l2capinbuf[9], l2capinbuf[10]); // L2CAP continuation state
-
209  firstMessage = true;
-
210  }
-
211  } else
-
212  serviceNotSupported(l2capinbuf[9], l2capinbuf[10]); // The service is not supported
-
213 #ifdef EXTRADEBUG
-
214  Notify(PSTR("\r\nUUID: "), 0x80);
-
215  uint16_t uuid;
-
216  if((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000) // Check if it's sending the UUID as a 128-bit UUID
-
217  uuid = (l2capinbuf[18] << 8 | l2capinbuf[19]);
-
218  else // Short UUID
-
219  uuid = (l2capinbuf[16] << 8 | l2capinbuf[17]);
-
220  D_PrintHex<uint16_t > (uuid, 0x80);
-
221 
-
222  Notify(PSTR("\r\nLength: "), 0x80);
-
223  uint16_t length = l2capinbuf[11] << 8 | l2capinbuf[12];
-
224  D_PrintHex<uint16_t > (length, 0x80);
-
225  Notify(PSTR("\r\nData: "), 0x80);
-
226  for(uint8_t i = 0; i < length; i++) {
-
227  D_PrintHex<uint8_t > (l2capinbuf[13 + i], 0x80);
-
228  Notify(PSTR(" "), 0x80);
-
229  }
-
230 #endif
-
231  }
-
232 #ifdef EXTRADEBUG
-
233  else {
-
234  Notify(PSTR("\r\nUnknown PDU: "), 0x80);
-
235  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
-
236  }
-
237 #endif
-
238  } else if(l2capinbuf[6] == rfcomm_dcid[0] && l2capinbuf[7] == rfcomm_dcid[1]) { // RFCOMM
-
239  rfcommChannel = l2capinbuf[8] & 0xF8;
-
240  rfcommDirection = l2capinbuf[8] & 0x04;
-
241  rfcommCommandResponse = l2capinbuf[8] & 0x02;
-
242  rfcommChannelType = l2capinbuf[9] & 0xEF;
-
243  rfcommPfBit = l2capinbuf[9] & 0x10;
-
244 
-
245  if(rfcommChannel >> 3 != 0x00)
-
246  rfcommChannelConnection = rfcommChannel;
-
247 
-
248 #ifdef EXTRADEBUG
-
249  Notify(PSTR("\r\nRFCOMM Channel: "), 0x80);
-
250  D_PrintHex<uint8_t > (rfcommChannel >> 3, 0x80);
-
251  Notify(PSTR(" Direction: "), 0x80);
-
252  D_PrintHex<uint8_t > (rfcommDirection >> 2, 0x80);
-
253  Notify(PSTR(" CommandResponse: "), 0x80);
-
254  D_PrintHex<uint8_t > (rfcommCommandResponse >> 1, 0x80);
-
255  Notify(PSTR(" ChannelType: "), 0x80);
-
256  D_PrintHex<uint8_t > (rfcommChannelType, 0x80);
-
257  Notify(PSTR(" PF_BIT: "), 0x80);
-
258  D_PrintHex<uint8_t > (rfcommPfBit, 0x80);
-
259 #endif
-
260  if(rfcommChannelType == RFCOMM_DISC) {
-
261 #ifdef DEBUG_USB_HOST
-
262  Notify(PSTR("\r\nReceived Disconnect RFCOMM Command on channel: "), 0x80);
-
263  D_PrintHex<uint8_t > (rfcommChannel >> 3, 0x80);
-
264 #endif
-
265  connected = false;
-
266  sendRfcomm(rfcommChannel, rfcommDirection, rfcommCommandResponse, RFCOMM_UA, rfcommPfBit, rfcommbuf, 0x00); // UA Command
-
267  }
-
268  if(connected) {
-
269  /* Read the incoming message */
-
270  if(rfcommChannelType == RFCOMM_UIH && rfcommChannel == rfcommChannelConnection) {
-
271  uint8_t length = l2capinbuf[10] >> 1; // Get length
-
272  uint8_t offset = l2capinbuf[4] - length - 4; // Check if there is credit
-
273  if(checkFcs(&l2capinbuf[8], l2capinbuf[11 + length + offset])) {
-
274  uint8_t i = 0;
-
275  for(; i < length; i++) {
-
276  if(rfcommAvailable + i >= sizeof (rfcommDataBuffer)) {
-
277 #ifdef DEBUG_USB_HOST
-
278  Notify(PSTR("\r\nWarning: Buffer is full!"), 0x80);
-
279 #endif
-
280  break;
-
281  }
-
282  rfcommDataBuffer[rfcommAvailable + i] = l2capinbuf[11 + i + offset];
-
283  }
-
284  rfcommAvailable += i;
-
285 #ifdef EXTRADEBUG
-
286  Notify(PSTR("\r\nRFCOMM Data Available: "), 0x80);
-
287  Notify(rfcommAvailable, 0x80);
-
288  if(offset) {
-
289  Notify(PSTR(" - Credit: 0x"), 0x80);
-
290  D_PrintHex<uint8_t > (l2capinbuf[11], 0x80);
-
291  }
-
292 #endif
-
293  }
-
294 #ifdef DEBUG_USB_HOST
-
295  else
-
296  Notify(PSTR("\r\nError in FCS checksum!"), 0x80);
-
297 #endif
-
298 #ifdef PRINTREPORT // Uncomment "#define PRINTREPORT" to print the report send to the Arduino via Bluetooth
-
299  for(uint8_t i = 0; i < length; i++)
-
300  Notifyc(l2capinbuf[i + 11 + offset], 0x80);
-
301 #endif
-
302  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_RPN_CMD) { // UIH Remote Port Negotiation Command
-
303 #ifdef DEBUG_USB_HOST
-
304  Notify(PSTR("\r\nReceived UIH Remote Port Negotiation Command"), 0x80);
-
305 #endif
-
306  rfcommbuf[0] = BT_RFCOMM_RPN_RSP; // Command
-
307  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
-
308  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
-
309  rfcommbuf[3] = l2capinbuf[14]; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
-
310  rfcommbuf[4] = l2capinbuf[15]; // Priority
-
311  rfcommbuf[5] = l2capinbuf[16]; // Timer
-
312  rfcommbuf[6] = l2capinbuf[17]; // Max Fram Size LSB
-
313  rfcommbuf[7] = l2capinbuf[18]; // Max Fram Size MSB
-
314  rfcommbuf[8] = l2capinbuf[19]; // MaxRatransm.
-
315  rfcommbuf[9] = l2capinbuf[20]; // Number of Frames
-
316  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A); // UIH Remote Port Negotiation Response
-
317  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_CMD) { // UIH Modem Status Command
-
318 #ifdef DEBUG_USB_HOST
-
319  Notify(PSTR("\r\nSend UIH Modem Status Response"), 0x80);
-
320 #endif
-
321  rfcommbuf[0] = BT_RFCOMM_MSC_RSP; // UIH Modem Status Response
-
322  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
-
323  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
-
324  rfcommbuf[3] = l2capinbuf[14];
-
325  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
-
326  }
-
327  } else {
-
328  if(rfcommChannelType == RFCOMM_SABM) { // SABM Command - this is sent twice: once for channel 0 and then for the channel to establish
-
329 #ifdef DEBUG_USB_HOST
-
330  Notify(PSTR("\r\nReceived SABM Command"), 0x80);
-
331 #endif
-
332  sendRfcomm(rfcommChannel, rfcommDirection, rfcommCommandResponse, RFCOMM_UA, rfcommPfBit, rfcommbuf, 0x00); // UA Command
-
333  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_PN_CMD) { // UIH Parameter Negotiation Command
-
334 #ifdef DEBUG_USB_HOST
-
335  Notify(PSTR("\r\nReceived UIH Parameter Negotiation Command"), 0x80);
-
336 #endif
-
337  rfcommbuf[0] = BT_RFCOMM_PN_RSP; // UIH Parameter Negotiation Response
-
338  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
-
339  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
-
340  rfcommbuf[3] = 0xE0; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
-
341  rfcommbuf[4] = 0x00; // Priority
-
342  rfcommbuf[5] = 0x00; // Timer
-
343  rfcommbuf[6] = BULK_MAXPKTSIZE - 14; // Max Fram Size LSB - set to the size of received data (50)
-
344  rfcommbuf[7] = 0x00; // Max Fram Size MSB
-
345  rfcommbuf[8] = 0x00; // MaxRatransm.
-
346  rfcommbuf[9] = 0x00; // Number of Frames
-
347  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A);
-
348  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_CMD) { // UIH Modem Status Command
-
349 #ifdef DEBUG_USB_HOST
-
350  Notify(PSTR("\r\nSend UIH Modem Status Response"), 0x80);
-
351 #endif
-
352  rfcommbuf[0] = BT_RFCOMM_MSC_RSP; // UIH Modem Status Response
-
353  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
-
354  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
-
355  rfcommbuf[3] = l2capinbuf[14];
-
356  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
-
357 
-
358  delay(1);
-
359 #ifdef DEBUG_USB_HOST
-
360  Notify(PSTR("\r\nSend UIH Modem Status Command"), 0x80);
-
361 #endif
-
362  rfcommbuf[0] = BT_RFCOMM_MSC_CMD; // UIH Modem Status Command
-
363  rfcommbuf[1] = 2 << 1 | 1; // Length and shiftet like so: length << 1 | 1
-
364  rfcommbuf[2] = l2capinbuf[13]; // Channel: (1 << 0) | (1 << 1) | (0 << 2) | (channel << 3)
-
365  rfcommbuf[3] = 0x8D; // Can receive frames (YES), Ready to Communicate (YES), Ready to Receive (YES), Incomig Call (NO), Data is Value (YES)
-
366 
-
367  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x04);
-
368  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_MSC_RSP) { // UIH Modem Status Response
-
369  if(!creditSent) {
-
370 #ifdef DEBUG_USB_HOST
-
371  Notify(PSTR("\r\nSend UIH Command with credit"), 0x80);
-
372 #endif
-
373  sendRfcommCredit(rfcommChannelConnection, rfcommDirection, 0, RFCOMM_UIH, 0x10, sizeof (rfcommDataBuffer)); // Send credit
-
374  creditSent = true;
-
375  timer = millis();
-
376  waitForLastCommand = true;
-
377  }
-
378  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[10] == 0x01) { // UIH Command with credit
-
379 #ifdef DEBUG_USB_HOST
-
380  Notify(PSTR("\r\nReceived UIH Command with credit"), 0x80);
-
381 #endif
-
382  } else if(rfcommChannelType == RFCOMM_UIH && l2capinbuf[11] == BT_RFCOMM_RPN_CMD) { // UIH Remote Port Negotiation Command
-
383 #ifdef DEBUG_USB_HOST
-
384  Notify(PSTR("\r\nReceived UIH Remote Port Negotiation Command"), 0x80);
-
385 #endif
-
386  rfcommbuf[0] = BT_RFCOMM_RPN_RSP; // Command
-
387  rfcommbuf[1] = l2capinbuf[12]; // Length and shiftet like so: length << 1 | 1
-
388  rfcommbuf[2] = l2capinbuf[13]; // Channel: channel << 1 | 1
-
389  rfcommbuf[3] = l2capinbuf[14]; // Pre difined for Bluetooth, see 5.5.3 of TS 07.10 Adaption for RFCOMM
-
390  rfcommbuf[4] = l2capinbuf[15]; // Priority
-
391  rfcommbuf[5] = l2capinbuf[16]; // Timer
-
392  rfcommbuf[6] = l2capinbuf[17]; // Max Fram Size LSB
-
393  rfcommbuf[7] = l2capinbuf[18]; // Max Fram Size MSB
-
394  rfcommbuf[8] = l2capinbuf[19]; // MaxRatransm.
-
395  rfcommbuf[9] = l2capinbuf[20]; // Number of Frames
-
396  sendRfcomm(rfcommChannel, rfcommDirection, 0, RFCOMM_UIH, rfcommPfBit, rfcommbuf, 0x0A); // UIH Remote Port Negotiation Response
-
397 #ifdef DEBUG_USB_HOST
-
398  Notify(PSTR("\r\nRFCOMM Connection is now established\r\n"), 0x80);
-
399 #endif
-
400  waitForLastCommand = false;
-
401  creditSent = false;
-
402  connected = true; // The RFCOMM channel is now established
-
403  sppIndex = 0;
-
404  }
-
405 #ifdef EXTRADEBUG
-
406  else if(rfcommChannelType != RFCOMM_DISC) {
-
407  Notify(PSTR("\r\nUnsupported RFCOMM Data - ChannelType: "), 0x80);
-
408  D_PrintHex<uint8_t > (rfcommChannelType, 0x80);
-
409  Notify(PSTR(" Command: "), 0x80);
-
410  D_PrintHex<uint8_t > (l2capinbuf[11], 0x80);
-
411  }
-
412 #endif
-
413  }
-
414  }
-
415 #ifdef EXTRADEBUG
-
416  else {
-
417  Notify(PSTR("\r\nUnsupported L2CAP Data - Channel ID: "), 0x80);
-
418  D_PrintHex<uint8_t > (l2capinbuf[7], 0x80);
-
419  Notify(PSTR(" "), 0x80);
-
420  D_PrintHex<uint8_t > (l2capinbuf[6], 0x80);
-
421  }
-
422 #endif
-
423  SDP_task();
-
424  RFCOMM_task();
-
425  }
-
426 }
-
427 
-
428 void SPP::Run() {
-
429  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
-
430 #ifdef DEBUG_USB_HOST
-
431  Notify(PSTR("\r\nRFCOMM Connection is now established - Automatic\r\n"), 0x80);
-
432 #endif
-
433  creditSent = false;
-
434  waitForLastCommand = false;
-
435  connected = true; // The RFCOMM channel is now established
-
436  sppIndex = 0;
-
437  }
-
438  send(); // Send all bytes currently in the buffer
-
439 }
-
440 
-
441 void SPP::SDP_task() {
-
442  switch(l2cap_sdp_state) {
-
443  case L2CAP_SDP_WAIT:
- - -
446 #ifdef DEBUG_USB_HOST
-
447  Notify(PSTR("\r\nSDP Incoming Connection Request"), 0x80);
-
448 #endif
-
449  pBtd->l2cap_connection_response(hci_handle, identifier, sdp_dcid, sdp_scid, PENDING);
-
450  delay(1);
-
451  pBtd->l2cap_connection_response(hci_handle, identifier, sdp_dcid, sdp_scid, SUCCESSFUL);
-
452  identifier++;
-
453  delay(1);
-
454  pBtd->l2cap_config_request(hci_handle, identifier, sdp_scid);
-
455  l2cap_sdp_state = L2CAP_SDP_SUCCESS;
- - -
458  SDPConnected = false;
-
459 #ifdef DEBUG_USB_HOST
-
460  Notify(PSTR("\r\nDisconnected SDP Channel"), 0x80);
-
461 #endif
-
462  pBtd->l2cap_disconnection_response(hci_handle, identifier, sdp_dcid, sdp_scid);
-
463  }
-
464  break;
-
465  case L2CAP_SDP_SUCCESS:
- - -
468 #ifdef DEBUG_USB_HOST
-
469  Notify(PSTR("\r\nSDP Successfully Configured"), 0x80);
-
470 #endif
-
471  firstMessage = true; // Reset bool
-
472  SDPConnected = true;
-
473  l2cap_sdp_state = L2CAP_SDP_WAIT;
-
474  }
-
475  break;
-
476 
-
477  case L2CAP_DISCONNECT_RESPONSE: // This is for both disconnection response from the RFCOMM and SDP channel if they were connected
- -
479 #ifdef DEBUG_USB_HOST
-
480  Notify(PSTR("\r\nDisconnected L2CAP Connection"), 0x80);
-
481 #endif
-
482  pBtd->hci_disconnect(hci_handle);
-
483  hci_handle = -1; // Reset handle
-
484  Reset();
-
485  }
-
486  break;
-
487  }
-
488 }
-
489 
-
490 void SPP::RFCOMM_task() {
-
491  switch(l2cap_rfcomm_state) {
-
492  case L2CAP_RFCOMM_WAIT:
- - -
495 #ifdef DEBUG_USB_HOST
-
496  Notify(PSTR("\r\nRFCOMM Incoming Connection Request"), 0x80);
-
497 #endif
-
498  pBtd->l2cap_connection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid, PENDING);
-
499  delay(1);
-
500  pBtd->l2cap_connection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid, SUCCESSFUL);
-
501  identifier++;
-
502  delay(1);
-
503  pBtd->l2cap_config_request(hci_handle, identifier, rfcomm_scid);
-
504  l2cap_rfcomm_state = L2CAP_RFCOMM_SUCCESS;
- - -
507  RFCOMMConnected = false;
-
508  connected = false;
-
509 #ifdef DEBUG_USB_HOST
-
510  Notify(PSTR("\r\nDisconnected RFCOMM Channel"), 0x80);
-
511 #endif
-
512  pBtd->l2cap_disconnection_response(hci_handle, identifier, rfcomm_dcid, rfcomm_scid);
-
513  }
-
514  break;
- - - -
518 #ifdef DEBUG_USB_HOST
-
519  Notify(PSTR("\r\nRFCOMM Successfully Configured"), 0x80);
-
520 #endif
-
521  rfcommAvailable = 0; // Reset number of bytes available
-
522  bytesRead = 0; // Reset number of bytes received
-
523  RFCOMMConnected = true;
-
524  l2cap_rfcomm_state = L2CAP_RFCOMM_WAIT;
-
525  }
-
526  break;
-
527  }
-
528 }
-
529 /************************************************************/
-
530 /* SDP Commands */
-
531 
-
532 /************************************************************/
-
533 void SPP::SDP_Command(uint8_t* data, uint8_t nbytes) { // See page 223 in the Bluetooth specs
-
534  pBtd->L2CAP_Command(hci_handle, data, nbytes, sdp_scid[0], sdp_scid[1]);
-
535 }
-
536 
-
537 void SPP::serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow) { // See page 235 in the Bluetooth specs
- -
539  l2capoutbuf[1] = transactionIDHigh;
-
540  l2capoutbuf[2] = transactionIDLow;
-
541  l2capoutbuf[3] = 0x00; // Parameter Length
-
542  l2capoutbuf[4] = 0x05; // Parameter Length
-
543  l2capoutbuf[5] = 0x00; // AttributeListsByteCount
-
544  l2capoutbuf[6] = 0x02; // AttributeListsByteCount
-
545 
-
546  /* Attribute ID/Value Sequence: */
-
547  l2capoutbuf[7] = 0x35;
-
548  l2capoutbuf[8] = 0x00;
-
549  l2capoutbuf[9] = 0x00;
-
550 
-
551  SDP_Command(l2capoutbuf, 10);
-
552 }
-
553 
-
554 void SPP::serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
- -
556  l2capoutbuf[1] = transactionIDHigh;
-
557  l2capoutbuf[2] = transactionIDLow;
-
558  l2capoutbuf[3] = 0x00; // Parameter Length
-
559  l2capoutbuf[4] = 0x2B; // Parameter Length
-
560  l2capoutbuf[5] = 0x00; // AttributeListsByteCount
-
561  l2capoutbuf[6] = 0x26; // AttributeListsByteCount
-
562 
-
563  /* Attribute ID/Value Sequence: */
-
564  l2capoutbuf[7] = 0x36;
-
565  l2capoutbuf[8] = 0x00;
-
566  l2capoutbuf[9] = 0x3C;
-
567  l2capoutbuf[10] = 0x36;
-
568  l2capoutbuf[11] = 0x00;
-
569 
-
570  l2capoutbuf[12] = 0x39;
-
571  l2capoutbuf[13] = 0x09;
-
572  l2capoutbuf[14] = 0x00;
-
573  l2capoutbuf[15] = 0x00;
-
574  l2capoutbuf[16] = 0x0A;
-
575  l2capoutbuf[17] = 0x00;
-
576  l2capoutbuf[18] = 0x01;
-
577  l2capoutbuf[19] = 0x00;
-
578  l2capoutbuf[20] = 0x06;
-
579  l2capoutbuf[21] = 0x09;
-
580  l2capoutbuf[22] = 0x00;
-
581  l2capoutbuf[23] = 0x01;
-
582  l2capoutbuf[24] = 0x35;
-
583  l2capoutbuf[25] = 0x03;
-
584  l2capoutbuf[26] = 0x19;
-
585  l2capoutbuf[27] = 0x11;
-
586 
-
587  l2capoutbuf[28] = 0x01;
-
588  l2capoutbuf[29] = 0x09;
-
589  l2capoutbuf[30] = 0x00;
-
590  l2capoutbuf[31] = 0x04;
-
591  l2capoutbuf[32] = 0x35;
-
592  l2capoutbuf[33] = 0x0C;
-
593  l2capoutbuf[34] = 0x35;
-
594  l2capoutbuf[35] = 0x03;
-
595  l2capoutbuf[36] = 0x19;
-
596  l2capoutbuf[37] = 0x01;
-
597  l2capoutbuf[38] = 0x00;
-
598  l2capoutbuf[39] = 0x35;
-
599  l2capoutbuf[40] = 0x05;
-
600  l2capoutbuf[41] = 0x19;
-
601  l2capoutbuf[42] = 0x00;
-
602  l2capoutbuf[43] = 0x03;
-
603 
-
604  l2capoutbuf[44] = 0x08;
-
605  l2capoutbuf[45] = 0x02; // Two extra bytes
-
606  l2capoutbuf[46] = 0x00; // 25 (0x19) more bytes to come
-
607  l2capoutbuf[47] = 0x19;
-
608 
-
609  SDP_Command(l2capoutbuf, 48);
-
610 }
-
611 
-
612 void SPP::serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
- -
614  l2capoutbuf[1] = transactionIDHigh;
-
615  l2capoutbuf[2] = transactionIDLow;
-
616  l2capoutbuf[3] = 0x00; // Parameter Length
-
617  l2capoutbuf[4] = 0x1C; // Parameter Length
-
618  l2capoutbuf[5] = 0x00; // AttributeListsByteCount
-
619  l2capoutbuf[6] = 0x19; // AttributeListsByteCount
-
620 
-
621  /* Attribute ID/Value Sequence: */
-
622  l2capoutbuf[7] = 0x01;
-
623  l2capoutbuf[8] = 0x09;
-
624  l2capoutbuf[9] = 0x00;
-
625  l2capoutbuf[10] = 0x06;
-
626  l2capoutbuf[11] = 0x35;
-
627 
-
628  l2capoutbuf[12] = 0x09;
-
629  l2capoutbuf[13] = 0x09;
-
630  l2capoutbuf[14] = 0x65;
-
631  l2capoutbuf[15] = 0x6E;
-
632  l2capoutbuf[16] = 0x09;
-
633  l2capoutbuf[17] = 0x00;
-
634  l2capoutbuf[18] = 0x6A;
-
635  l2capoutbuf[19] = 0x09;
-
636  l2capoutbuf[20] = 0x01;
-
637  l2capoutbuf[21] = 0x00;
-
638  l2capoutbuf[22] = 0x09;
-
639  l2capoutbuf[23] = 0x01;
-
640  l2capoutbuf[24] = 0x00;
-
641  l2capoutbuf[25] = 0x25;
-
642 
-
643  l2capoutbuf[26] = 0x05; // Name length
-
644  l2capoutbuf[27] = 'T';
-
645  l2capoutbuf[28] = 'K';
-
646  l2capoutbuf[29] = 'J';
-
647  l2capoutbuf[30] = 'S';
-
648  l2capoutbuf[31] = 'P';
-
649  l2capoutbuf[32] = 0x00; // No more data
-
650 
-
651  SDP_Command(l2capoutbuf, 33);
-
652 }
-
653 
-
654 void SPP::l2capResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
-
655  serialPortResponse1(transactionIDHigh, transactionIDLow); // These has to send all the supported functions, since it only supports virtual serialport it just sends the message again
-
656 }
-
657 
-
658 void SPP::l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow) {
-
659  serialPortResponse2(transactionIDHigh, transactionIDLow); // Same data as serialPortResponse2
-
660 }
-
661 /************************************************************/
-
662 /* RFCOMM Commands */
-
663 
-
664 /************************************************************/
-
665 void SPP::RFCOMM_Command(uint8_t* data, uint8_t nbytes) {
-
666  pBtd->L2CAP_Command(hci_handle, data, nbytes, rfcomm_scid[0], rfcomm_scid[1]);
-
667 }
-
668 
-
669 void SPP::sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t* data, uint8_t length) {
-
670  l2capoutbuf[0] = channel | direction | CR | extendAddress; // RFCOMM Address
-
671  l2capoutbuf[1] = channelType | pfBit; // RFCOMM Control
-
672  l2capoutbuf[2] = length << 1 | 0x01; // Length and format (always 0x01 bytes format)
-
673  uint8_t i = 0;
-
674  for(; i < length; i++)
-
675  l2capoutbuf[i + 3] = data[i];
-
676  l2capoutbuf[i + 3] = calcFcs(l2capoutbuf);
-
677 #ifdef EXTRADEBUG
-
678  Notify(PSTR(" - RFCOMM Data: "), 0x80);
-
679  for(i = 0; i < length + 4; i++) {
-
680  D_PrintHex<uint8_t > (l2capoutbuf[i], 0x80);
-
681  Notify(PSTR(" "), 0x80);
-
682  }
-
683 #endif
-
684  RFCOMM_Command(l2capoutbuf, length + 4);
-
685 }
-
686 
-
687 void SPP::sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit) {
-
688  l2capoutbuf[0] = channel | direction | CR | extendAddress; // RFCOMM Address
-
689  l2capoutbuf[1] = channelType | pfBit; // RFCOMM Control
-
690  l2capoutbuf[2] = 0x01; // Length = 0
-
691  l2capoutbuf[3] = credit; // Credit
-
692  l2capoutbuf[4] = calcFcs(l2capoutbuf);
-
693 #ifdef EXTRADEBUG
-
694  Notify(PSTR(" - RFCOMM Credit Data: "), 0x80);
-
695  for(uint8_t i = 0; i < 5; i++) {
-
696  D_PrintHex<uint8_t > (l2capoutbuf[i], 0x80);
-
697  Notify(PSTR(" "), 0x80);
-
698  }
-
699 #endif
-
700  RFCOMM_Command(l2capoutbuf, 5);
-
701 }
-
702 
-
703 /* CRC on 2 bytes */
-
704 uint8_t SPP::crc(uint8_t *data) {
-
705  return (pgm_read_byte(&rfcomm_crc_table[pgm_read_byte(&rfcomm_crc_table[0xFF ^ data[0]]) ^ data[1]]));
-
706 }
-
707 
-
708 /* Calculate FCS */
-
709 uint8_t SPP::calcFcs(uint8_t *data) {
-
710  uint8_t temp = crc(data);
-
711  if((data[1] & 0xEF) == RFCOMM_UIH)
-
712  return (0xFF - temp); // FCS on 2 bytes
-
713  else
-
714  return (0xFF - pgm_read_byte(&rfcomm_crc_table[temp ^ data[2]])); // FCS on 3 bytes
+
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 /* Check FCS */
-
718 bool SPP::checkFcs(uint8_t *data, uint8_t fcs) {
-
719  uint8_t temp = crc(data);
-
720  if((data[1] & 0xEF) != RFCOMM_UIH)
-
721  temp = pgm_read_byte(&rfcomm_crc_table[temp ^ data[2]]); // FCS on 3 bytes
-
722  return (pgm_read_byte(&rfcomm_crc_table[temp ^ fcs]) == 0xCF);
-
723 }
-
724 
-
725 /* Serial commands */
-
726 #if defined(ARDUINO) && ARDUINO >=100
-
727 
-
728 size_t SPP::write(uint8_t data) {
-
729  return write(&data, 1);
-
730 }
-
731 #else
-
732 
-
733 void SPP::write(uint8_t data) {
-
734  write(&data, 1);
-
735 }
-
736 #endif
-
737 
-
738 #if defined(ARDUINO) && ARDUINO >=100
-
739 
-
740 size_t SPP::write(const uint8_t *data, size_t size) {
-
741 #else
-
742 
-
743 void SPP::write(const uint8_t *data, size_t size) {
-
744 #endif
-
745  for(uint8_t i = 0; i < size; i++) {
-
746  if(sppIndex >= sizeof (sppOutputBuffer) / sizeof (sppOutputBuffer[0]))
-
747  send(); // Send the current data in the buffer
-
748  sppOutputBuffer[sppIndex++] = data[i]; // All the bytes are put into a buffer and then send using the send() function
-
749  }
-
750 #if defined(ARDUINO) && ARDUINO >=100
-
751  return size;
-
752 #endif
-
753 }
-
754 
-
755 void SPP::send() {
-
756  if(!connected || !sppIndex)
-
757  return;
-
758  uint8_t length; // This is the length of the string we are sending
-
759  uint8_t offset = 0; // This is used to keep track of where we are in the string
-
760 
-
761  l2capoutbuf[0] = rfcommChannelConnection | 0 | 0 | extendAddress; // RFCOMM Address
-
762  l2capoutbuf[1] = RFCOMM_UIH; // RFCOMM Control
-
763 
-
764  while(sppIndex) { // We will run this while loop until this variable is 0
-
765  if(sppIndex > (sizeof (l2capoutbuf) - 4)) // Check if the string is larger than the outgoing buffer
-
766  length = sizeof (l2capoutbuf) - 4;
-
767  else
-
768  length = sppIndex;
-
769 
-
770  l2capoutbuf[2] = length << 1 | 1; // Length
-
771  uint8_t i = 0;
-
772  for(; i < length; i++)
-
773  l2capoutbuf[i + 3] = sppOutputBuffer[i + offset];
-
774  l2capoutbuf[i + 3] = calcFcs(l2capoutbuf); // Calculate checksum
-
775 
-
776  RFCOMM_Command(l2capoutbuf, length + 4);
+
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  sppIndex -= length;
-
779  offset += length; // Increment the offset
-
780  }
-
781 }
-
782 
-
783 int SPP::available(void) {
-
784  return rfcommAvailable;
-
785 };
-
786 
-
787 void SPP::discard(void) {
-
788  rfcommAvailable = 0;
-
789 }
-
790 
-
791 int SPP::peek(void) {
-
792  if(rfcommAvailable == 0) // Don't read if there is nothing in the buffer
-
793  return -1;
-
794  return rfcommDataBuffer[0];
+
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::read(void) {
-
798  if(rfcommAvailable == 0) // Don't read if there is nothing in the buffer
-
799  return -1;
-
800  uint8_t output = rfcommDataBuffer[0];
-
801  for(uint8_t i = 1; i < rfcommAvailable; i++)
-
802  rfcommDataBuffer[i - 1] = rfcommDataBuffer[i]; // Shift the buffer one left
-
803  rfcommAvailable--;
-
804  bytesRead++;
-
805  if(bytesRead > (sizeof (rfcommDataBuffer) - 5)) { // We will send the command just before it runs out of credit
-
806  bytesRead = 0;
-
807  sendRfcommCredit(rfcommChannelConnection, rfcommDirection, 0, RFCOMM_UIH, 0x10, sizeof (rfcommDataBuffer)); // Send more credit
-
808 #ifdef EXTRADEBUG
-
809  Notify(PSTR("\r\nSent "), 0x80);
-
810  Notify((uint8_t)sizeof (rfcommDataBuffer), 0x80);
-
811  Notify(PSTR(" more credit"), 0x80);
-
812 #endif
-
813  }
-
814  return output;
-
815 }
-
#define UHS_ACL_HANDLE_OK(x, y)
Definition: BTD.h:207
-
virtual size_t write(uint8_t data)
Definition: SPP.cpp:728
-
const char * btdName
Definition: BTD.h:480
+
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
#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:1231
-
#define SUCCESSFUL
Definition: BTD.h:177
-
bool sdpConnectionClaimed
Definition: BTD.h:475
-
#define RFCOMM_PSM
Definition: BTD.h:181
+
void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
Definition: BTD.cpp:1239
+
#define SUCCESSFUL
Definition: BTD.h:175
+
bool sdpConnectionClaimed
Definition: BTD.h:439
+
#define RFCOMM_PSM
Definition: BTD.h:179
SPP(BTD *p, const char *name="Arduino", const char *pin="0000")
Definition: SPP.cpp:45
-
Definition: BTD.h:230
-
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1284
+
Definition: BTD.h:198
+
void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1292
#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:477
+
bool rfcommConnectionClaimed
Definition: BTD.h:441
#define SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU
Definition: SPP.h:25
-
#define L2CAP_FLAG_CONFIG_SDP_SUCCESS
Definition: BTD.h:149
+
uint8_t identifier
Definition: BTD.h:615
+
#define L2CAP_FLAG_CONFIG_SDP_SUCCESS
Definition: BTD.h:147
#define RFCOMM_DISC
Definition: SPP.h:34
#define SERIALPORT_UUID
Definition: SPP.h:26
-
#define L2CAP_SDP_SUCCESS
Definition: BTD.h:120
-
const char * btdPin
Definition: BTD.h:482
-
bool connected
Definition: SPP.h:79
-
#define L2CAP_CMD_INFORMATION_REQUEST
Definition: BTD.h:172
-
#define SDP_PSM
Definition: BTD.h:180
-
virtual int read(void)
Definition: SPP.cpp:797
-
void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
Definition: BTD.cpp:1297
+
#define L2CAP_SDP_SUCCESS
Definition: BTD.h:118
+
const char * btdPin
Definition: BTD.h:446
+
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
+
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:1305
#define extendAddress
Definition: SPP.h:36
-
#define L2CAP_RFCOMM_WAIT
Definition: BTD.h:123
+
#define L2CAP_RFCOMM_WAIT
Definition: BTD.h:121
#define Notify(...)
Definition: message.h:44
-
virtual void Run()
Definition: SPP.cpp:428
-
#define L2CAP_FLAG_CONNECTION_RFCOMM_REQUEST
Definition: BTD.h:153
-
uint16_t hci_handle
Definition: BTD.h:487
+
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:1142
-
virtual void Reset()
Definition: SPP.cpp:63
-
#define L2CAP_FLAG_DISCONNECT_SDP_REQUEST
Definition: BTD.h:150
+
void hci_disconnect(uint16_t handle)
Definition: BTD.cpp:1150
+ +
void Reset()
Definition: SPP.cpp:60
+
void(* pFuncOnInit)(void)
Definition: BTD.h:603
+
#define L2CAP_FLAG_DISCONNECT_SDP_REQUEST
Definition: BTD.h:148
#define RFCOMM_UIH
Definition: SPP.h:32
-
virtual int available(void)
Definition: SPP.cpp:783
-
#define l2cap_check_flag(flag)
Definition: BTD.h:160
-
#define L2CAP_CMD_CONFIG_REQUEST
Definition: BTD.h:168
-
#define L2CAP_CMD_DISCONNECT_REQUEST
Definition: BTD.h:170
-
void discard(void)
Definition: SPP.cpp:787
-
#define L2CAP_SDP_WAIT
Definition: BTD.h:119
-
#define BULK_MAXPKTSIZE
Definition: BTD.h:33
-
#define L2CAP_RFCOMM_SUCCESS
Definition: BTD.h:124
+
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
+
void discard(void)
Definition: SPP.cpp:801
+
#define L2CAP_SDP_WAIT
Definition: BTD.h:117
+
BTD * pBtd
Definition: BTD.h:606
+
#define BULK_MAXPKTSIZE
Definition: BTD.h:34
+
#define L2CAP_RFCOMM_SUCCESS
Definition: BTD.h:122
#define BT_RFCOMM_RPN_CMD
Definition: SPP.h:43
-
int8_t registerServiceClass(BluetoothService *pService)
Definition: BTD.h:333
-
#define L2CAP_FLAG_DISCONNECT_RESPONSE
Definition: BTD.h:157
-
#define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS
Definition: BTD.h:154
-
virtual void disconnect()
Definition: SPP.cpp:74
+
#define L2CAP_FLAG_DISCONNECT_RESPONSE
Definition: BTD.h:155
+
#define L2CAP_FLAG_CONFIG_RFCOMM_SUCCESS
Definition: BTD.h:152
+
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:171
+
#define L2CAP_CMD_DISCONNECT_RESPONSE
Definition: BTD.h:169
#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:1310
-
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:169
+
void l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)
Definition: BTD.cpp:1318
+
#define L2CAP_CMD_CONFIG_RESPONSE
Definition: BTD.h:167
+
uint16_t hci_handle
Definition: BTD.h:609
#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:148
-
#define l2cap_clear_flag(flag)
Definition: BTD.h:162
-
#define L2CAP_FLAG_DISCONNECT_RFCOMM_REQUEST
Definition: BTD.h:155
-
#define L2CAP_DISCONNECT_RESPONSE
Definition: BTD.h:126
-
void send(void)
Definition: SPP.cpp:755
-
void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
Definition: BTD.cpp:1190
-
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1265
-
#define PENDING
Definition: BTD.h:176
-
#define l2cap_set_flag(flag)
Definition: BTD.h:161
-
void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
Definition: BTD.cpp:1248
-
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:166
+
#define L2CAP_FLAG_CONNECTION_SDP_REQUEST
Definition: BTD.h:146
+
uint32_t l2cap_event_flag
Definition: BTD.h:612
+
#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
+
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:1198
+
void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
Definition: BTD.cpp:1273
+
#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:1256
+
#define L2CAP_CMD_CONNECTION_REQUEST
Definition: BTD.h:164
#define BT_RFCOMM_PN_RSP
Definition: SPP.h:40
-
virtual void ACLData(uint8_t *ACLData)
Definition: SPP.cpp:86
-
virtual int peek(void)
Definition: SPP.cpp:791
+
bool checkHciHandle(uint8_t *buf, uint16_t handle)
Definition: BTD.h:598
+
void ACLData(uint8_t *ACLData)
Definition: SPP.cpp:84
+
int peek(void)
Definition: SPP.cpp:805
-
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:165
+
#define L2CAP_CMD_COMMAND_REJECT
Definition: BTD.h:163
diff --git a/_s_p_p_8h.html b/_s_p_p_8h.html index 6bfd226c..336cda90 100644 --- a/_s_p_p_8h.html +++ b/_s_p_p_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPP.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -98,7 +99,7 @@ Include dependency graph for SPP.h:
- +
This graph shows which files directly or indirectly include this file:
@@ -364,7 +365,7 @@ Macros diff --git a/_s_p_p_8h__dep__incl.md5 b/_s_p_p_8h__dep__incl.md5 index 7717c9a2..c4196b87 100644 --- a/_s_p_p_8h__dep__incl.md5 +++ b/_s_p_p_8h__dep__incl.md5 @@ -1 +1 @@ -1f51bc8d7e57994b0706c73aa078945c \ No newline at end of file +8fa503e9bcede23521cf22418b0e794e \ No newline at end of file diff --git a/_s_p_p_8h__incl.map b/_s_p_p_8h__incl.map index 458dcf36..db82be58 100644 --- a/_s_p_p_8h__incl.map +++ b/_s_p_p_8h__incl.map @@ -1,4 +1,6 @@ - + + + diff --git a/_s_p_p_8h__incl.md5 b/_s_p_p_8h__incl.md5 index 92c4aedb..d72c4b71 100644 --- a/_s_p_p_8h__incl.md5 +++ b/_s_p_p_8h__incl.md5 @@ -1 +1 @@ -7a2283c4aaf9966c1076db5bf1388f90 \ No newline at end of file +8b33a921295a8bf80a577af260fae137 \ No newline at end of file diff --git a/_s_p_p_8h__incl.png b/_s_p_p_8h__incl.png index 6de5ae9483d3e073e6d43d6bf302e52c71b8ecea..10eba2f1761b728edfb279e7cf7098e36dd168ae 100644 GIT binary patch literal 13206 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 - + USB Host Shield 2.0: SPP.h Source File + @@ -31,7 +32,7 @@
- + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -149,126 +150,122 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
62 public:
69  SPP(BTD *p, const char *name = "Arduino", const char *pin = "0000");
70 
-
75  operator bool() {
-
76  return connected;
-
77  }
-
79  bool connected;
-
80 
-
86  virtual void ACLData(uint8_t* ACLData);
-
88  virtual void Run();
-
90  virtual void Reset();
-
92  virtual void disconnect();
-
100  virtual int available(void);
-
101 
-
103  virtual void flush(void) {
-
104  send();
-
105  };
-
110  virtual int peek(void);
-
115  virtual int read(void);
-
116 
-
117 #if defined(ARDUINO) && ARDUINO >=100
-
118 
-
123  virtual size_t write(uint8_t data);
-
130  virtual size_t write(const uint8_t* data, size_t size);
-
132  using Print::write;
-
133 #else
-
134 
-
138  virtual void write(uint8_t data);
-
144  virtual void write(const uint8_t* data, size_t size);
-
145 #endif
-
146 
-
148  void discard(void);
-
154  void send(void);
-
157 private:
-
158  /* Bluetooth dongle library pointer */
-
159  BTD *pBtd;
-
160 
-
161  /* Set true when a channel is created */
-
162  bool SDPConnected;
-
163  bool RFCOMMConnected;
-
164 
-
165  uint16_t hci_handle; // The HCI Handle for the connection
-
166 
-
167  /* Variables used by L2CAP state machines */
-
168  uint8_t l2cap_sdp_state;
-
169  uint8_t l2cap_rfcomm_state;
-
170  uint32_t l2cap_event_flag; // l2cap flags of received Bluetooth events
+
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  using Print::write;
+
124 #else
+
125 
+
129  void write(uint8_t data);
+
135  void write(const uint8_t* data, size_t size);
+
136 #endif
+
137 
+
139  void discard(void);
+
145  void send(void);
+
148 protected:
+
154  void ACLData(uint8_t* ACLData);
+
156  void Run();
+
158  void Reset();
+
164  void onInit();
+
167 private:
+
168  /* Set true when a channel is created */
+
169  bool SDPConnected;
+
170  bool RFCOMMConnected;
171 
-
172  uint8_t l2capoutbuf[BULK_MAXPKTSIZE]; // General purpose buffer for l2cap out data
-
173  uint8_t rfcommbuf[10]; // Buffer for RFCOMM Commands
-
174 
-
175  /* L2CAP Channels */
-
176  uint8_t sdp_scid[2]; // L2CAP source CID for SDP
-
177  uint8_t sdp_dcid[2]; // 0x0050
-
178  uint8_t rfcomm_scid[2]; // L2CAP source CID for RFCOMM
-
179  uint8_t rfcomm_dcid[2]; // 0x0051
-
180  uint8_t identifier; // Identifier for command
-
181 
-
182  /* RFCOMM Variables */
-
183  uint8_t rfcommChannel;
-
184  uint8_t rfcommChannelConnection; // This is the channel the SPP channel will be running at
-
185  uint8_t rfcommDirection;
-
186  uint8_t rfcommCommandResponse;
-
187  uint8_t rfcommChannelType;
-
188  uint8_t rfcommPfBit;
-
189 
-
190  unsigned long timer;
-
191  bool waitForLastCommand;
-
192  bool creditSent;
-
193 
-
194  uint8_t rfcommDataBuffer[100]; // Create a 100 sized buffer for incoming data
-
195  uint8_t sppOutputBuffer[100]; // Create a 100 sized buffer for outgoing SPP data
-
196  uint8_t sppIndex;
-
197  uint8_t rfcommAvailable;
-
198 
-
199  bool firstMessage; // Used to see if it's the first SDP request received
-
200  uint8_t bytesRead; // Counter to see when it's time to send more credit
+
172  /* Variables used by L2CAP state machines */
+
173  uint8_t l2cap_sdp_state;
+
174  uint8_t l2cap_rfcomm_state;
+
175 
+
176  uint8_t l2capoutbuf[BULK_MAXPKTSIZE]; // General purpose buffer for l2cap out data
+
177  uint8_t rfcommbuf[10]; // Buffer for RFCOMM Commands
+
178 
+
179  /* L2CAP Channels */
+
180  uint8_t sdp_scid[2]; // L2CAP source CID for SDP
+
181  uint8_t sdp_dcid[2]; // 0x0050
+
182  uint8_t rfcomm_scid[2]; // L2CAP source CID for RFCOMM
+
183  uint8_t rfcomm_dcid[2]; // 0x0051
+
184 
+
185  /* RFCOMM Variables */
+
186  uint8_t rfcommChannel;
+
187  uint8_t rfcommChannelConnection; // This is the channel the SPP channel will be running at
+
188  uint8_t rfcommDirection;
+
189  uint8_t rfcommCommandResponse;
+
190  uint8_t rfcommChannelType;
+
191  uint8_t rfcommPfBit;
+
192 
+
193  uint32_t timer;
+
194  bool waitForLastCommand;
+
195  bool creditSent;
+
196 
+
197  uint8_t rfcommDataBuffer[100]; // Create a 100 sized buffer for incoming data
+
198  uint8_t sppOutputBuffer[100]; // Create a 100 sized buffer for outgoing SPP data
+
199  uint8_t sppIndex;
+
200  uint8_t rfcommAvailable;
201 
-
202  /* State machines */
-
203  void SDP_task(); // SDP state machine
-
204  void RFCOMM_task(); // RFCOMM state machine
-
205 
-
206  /* SDP Commands */
-
207  void SDP_Command(uint8_t *data, uint8_t nbytes);
-
208  void serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow);
-
209  void serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
-
210  void serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
-
211  void l2capResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
-
212  void l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
-
213 
-
214  /* RFCOMM Commands */
-
215  void RFCOMM_Command(uint8_t *data, uint8_t nbytes);
-
216  void sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t *data, uint8_t length);
-
217  void sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit);
-
218  uint8_t calcFcs(uint8_t *data);
-
219  bool checkFcs(uint8_t *data, uint8_t fcs);
-
220  uint8_t crc(uint8_t *data);
-
221 };
-
222 #endif
-
virtual size_t write(uint8_t data)
Definition: SPP.cpp:728
+
202  bool firstMessage; // Used to see if it's the first SDP request received
+
203  uint8_t bytesRead; // Counter to see when it's time to send more credit
+
204 
+
205  /* State machines */
+
206  void SDP_task(); // SDP state machine
+
207  void RFCOMM_task(); // RFCOMM state machine
+
208 
+
209  /* SDP Commands */
+
210  void SDP_Command(uint8_t *data, uint8_t nbytes);
+
211  void serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLow);
+
212  void serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
+
213  void serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
+
214  void l2capResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLow);
+
215  void l2capResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLow);
+
216 
+
217  /* RFCOMM Commands */
+
218  void RFCOMM_Command(uint8_t *data, uint8_t nbytes);
+
219  void sendRfcomm(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t *data, uint8_t length);
+
220  void sendRfcommCredit(uint8_t channel, uint8_t direction, uint8_t CR, uint8_t channelType, uint8_t pfBit, uint8_t credit);
+
221  uint8_t calcFcs(uint8_t *data);
+
222  bool checkFcs(uint8_t *data, uint8_t fcs);
+
223  uint8_t crc(uint8_t *data);
+
224 };
+
225 #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:230
-
bool connected
Definition: SPP.h:79
-
virtual int read(void)
Definition: SPP.cpp:797
-
virtual void Run()
Definition: SPP.cpp:428
- -
virtual void Reset()
Definition: SPP.cpp:63
-
virtual void flush(void)
Definition: SPP.h:103
-
virtual int available(void)
Definition: SPP.cpp:783
-
void discard(void)
Definition: SPP.cpp:787
-
#define BULK_MAXPKTSIZE
Definition: BTD.h:33
-
virtual void disconnect()
Definition: SPP.cpp:74
+
Definition: BTD.h:198
+
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
+
void disconnect()
Definition: SPP.cpp:72
Definition: SPP.h:61
-
void send(void)
Definition: SPP.cpp:755
+
void send(void)
Definition: SPP.cpp:769
-
virtual void ACLData(uint8_t *ACLData)
Definition: SPP.cpp:86
-
virtual int peek(void)
Definition: SPP.cpp:791
+
void ACLData(uint8_t *ACLData)
Definition: SPP.cpp:84
+
int peek(void)
Definition: SPP.cpp:805
diff --git a/_usb_8cpp.html b/_usb_8cpp.html index ea25f889..2358dfd1 100644 --- a/_usb_8cpp.html +++ b/_usb_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Usb.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -104,7 +105,7 @@ Include dependency graph for Usb.cpp:
diff --git a/_usb_8cpp__incl.md5 b/_usb_8cpp__incl.md5 index e440b831..f71e6530 100644 --- a/_usb_8cpp__incl.md5 +++ b/_usb_8cpp__incl.md5 @@ -1 +1 @@ -86d6ea84d3f0ddc03b2836246a892476 \ No newline at end of file +983a9d4c5eeb9a3736dcb2d9192937eb \ No newline at end of file diff --git a/_usb_8cpp_source.html b/_usb_8cpp_source.html index d929651e..397c0170 100644 --- a/_usb_8cpp_source.html +++ b/_usb_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Usb.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -168,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
77  return 0;
78 }
79 
-
80 uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t &nak_limit) {
+
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)
@@ -182,8 +183,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
91  if(!*ppep)
93 
-
94  nak_limit = (0x0001UL << (((*ppep)->bmNakPower > USB_NAK_MAX_POWER) ? USB_NAK_MAX_POWER : (*ppep)->bmNakPower));
-
95  nak_limit--;
+
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);
@@ -223,7 +224,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
132  EpInfo *pep = NULL;
133  uint16_t nak_limit = 0;
134 
-
135  rcode = SetAddress(addr, ep, &pep, nak_limit);
+
135  rcode = SetAddress(addr, ep, &pep, &nak_limit);
136 
137  if(rcode)
138  return rcode;
@@ -231,10 +232,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
140  direction = ((bmReqType & 0x80) > 0);
141 
142  /* fill in setup packet */
-
143  setup_pkt.ReqType_u.bmRequestType = bmReqType;
+
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;
+
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 
@@ -298,7 +299,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
207  EpInfo *pep = NULL;
208  uint16_t nak_limit = 0;
209 
-
210  uint8_t rcode = SetAddress(addr, ep, &pep, nak_limit);
+
210  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
211 
212  if(rcode) {
213  USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81);
@@ -384,7 +385,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
293  EpInfo *pep = NULL;
294  uint16_t nak_limit = 0;
295 
-
296  uint8_t rcode = SetAddress(addr, ep, &pep, nak_limit);
+
296  uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit);
297 
298  if(rcode)
299  return rcode;
@@ -619,7 +620,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
528 }
529 
530 uint8_t USB::DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed) {
-
531  //uint8_t buf[12];
+
531  //uint8_t buf[12];
532  uint8_t rcode;
533  UsbDevice *p0 = NULL, *p = NULL;
534 
@@ -789,260 +790,263 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
698  // Allocate new address according to device class
699  //bAddress = addrPool.AllocAddress(parent, false, port);
700 
-
701  //if (!bAddress)
-
702  // return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL;
-
703  uint16_t vid = udd->idVendor;
-
704  uint16_t pid = udd->idProduct;
-
705  uint8_t klass = udd->bDeviceClass;
-
706 
-
707  // Attempt to configure if VID/PID or device class matches with a driver
-
708  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
-
709  if(!devConfig[devConfigIndex]) continue; // no driver
-
710  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
-
711  if(devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass)) {
-
712  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
- -
714  break;
-
715  }
-
716  }
-
717 
-
718  if(devConfigIndex < USB_NUMDEVICES) {
-
719  return rcode;
-
720  }
-
721 
-
722 
-
723  // blindly attempt to configure
-
724  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
-
725  if(!devConfig[devConfigIndex]) continue;
-
726  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
-
727  if(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
-
728  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
-
729 
-
730  //printf("ERROR ENUMERATING %2.2x\r\n", rcode);
- -
732  // in case of an error dev_index should be reset to 0
-
733  // in order to start from the very beginning the
-
734  // next time the program gets here
-
735  //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE)
-
736  // devConfigIndex = 0;
-
737  return rcode;
-
738  }
-
739  }
-
740  // if we get here that means that the device class is not supported by any of registered classes
-
741  rcode = DefaultAddressing(parent, port, lowspeed);
-
742 
-
743  return rcode;
-
744 }
+
701  uint16_t vid = udd->idVendor;
+
702  uint16_t pid = udd->idProduct;
+
703  uint8_t klass = udd->bDeviceClass;
+
704  uint8_t subklass = udd->bDeviceSubClass;
+
705  // Attempt to configure if VID/PID or device class matches with a driver
+
706  // Qualify with subclass too.
+
707  //
+
708  // VID/PID & class tests default to false for drivers not yet ported
+
709  // subclass defaults to true, so you don't have to define it if you don't have to.
+
710  //
+
711  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
+
712  if(!devConfig[devConfigIndex]) continue; // no driver
+
713  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
+
714  if(devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) {
+
715  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
+ +
717  break;
+
718  }
+
719  }
+
720 
+
721  if(devConfigIndex < USB_NUMDEVICES) {
+
722  return rcode;
+
723  }
+
724 
+
725 
+
726  // blindly attempt to configure
+
727  for(devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) {
+
728  if(!devConfig[devConfigIndex]) continue;
+
729  if(devConfig[devConfigIndex]->GetAddress()) continue; // consumed
+
730  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
+
731  rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed);
+
732 
+
733  //printf("ERROR ENUMERATING %2.2x\r\n", rcode);
+ +
735  // in case of an error dev_index should be reset to 0
+
736  // in order to start from the very beginning the
+
737  // next time the program gets here
+
738  //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE)
+
739  // devConfigIndex = 0;
+
740  return rcode;
+
741  }
+
742  }
+
743  // if we get here that means that the device class is not supported by any of registered classes
+
744  rcode = DefaultAddressing(parent, port, lowspeed);
745 
-
746 uint8_t USB::ReleaseDevice(uint8_t addr) {
-
747  if(!addr)
-
748  return 0;
-
749 
-
750  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
-
751  if(!devConfig[i]) continue;
-
752  if(devConfig[i]->GetAddress() == addr)
-
753  return devConfig[i]->Release();
-
754  }
-
755  return 0;
-
756 }
-
757 
-
758 #if 1
-
759 //get device descriptor
+
746  return rcode;
+
747 }
+
748 
+
749 uint8_t USB::ReleaseDevice(uint8_t addr) {
+
750  if(!addr)
+
751  return 0;
+
752 
+
753  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
+
754  if(!devConfig[i]) continue;
+
755  if(devConfig[i]->GetAddress() == addr)
+
756  return devConfig[i]->Release();
+
757  }
+
758  return 0;
+
759 }
760 
-
761 uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
-
762  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, NULL));
-
763 }
-
764 //get configuration descriptor
-
765 
-
766 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
-
767  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, NULL));
-
768 }
-
769 
-
770 /* 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
-
771  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 */
-
772 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) {
-
773  const uint8_t bufSize = 64;
-
774  uint8_t buf[bufSize];
-
775  USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR *>(buf);
-
776 
-
777  uint8_t ret = getConfDescr(addr, ep, 9, conf, buf);
-
778 
-
779  if(ret)
-
780  return ret;
+
761 #if 1
+
762 //get device descriptor
+
763 
+
764 uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
+
765  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, NULL));
+
766 }
+
767 //get configuration descriptor
+
768 
+
769 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
+
770  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, NULL));
+
771 }
+
772 
+
773 /* 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
+
774  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 */
+
775 uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) {
+
776  const uint8_t bufSize = 64;
+
777  uint8_t buf[bufSize];
+
778  USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR *>(buf);
+
779 
+
780  uint8_t ret = getConfDescr(addr, ep, 9, conf, buf);
781 
-
782  uint16_t total = ucd->wTotalLength;
-
783 
-
784  //USBTRACE2("\r\ntotal conf.size:", total);
-
785 
-
786  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p));
-
787 }
+
782  if(ret)
+
783  return ret;
+
784 
+
785  uint16_t total = ucd->wTotalLength;
+
786 
+
787  //USBTRACE2("\r\ntotal conf.size:", total);
788 
-
789 //get string descriptor
-
790 
-
791 uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) {
-
792  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, NULL));
-
793 }
-
794 //set address
-
795 
-
796 uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
-
797  uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL);
-
798  //delay(2); //per USB 2.0 sect.9.2.6.3
-
799  delay(300); // Older spec says you should wait at least 200ms
-
800  return rcode;
-
801  //return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
-
802 }
-
803 //set configuration
-
804 
-
805 uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
-
806  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
-
807 }
-
808 
-
809 #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:766
+
789  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p));
+
790 }
+
791 
+
792 //get string descriptor
+
793 
+
794 uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) {
+
795  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, NULL));
+
796 }
+
797 //set address
+
798 
+
799 uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
+
800  uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL);
+
801  //delay(2); //per USB 2.0 sect.9.2.6.3
+
802  delay(300); // Older spec says you should wait at least 200ms
+
803  return rcode;
+
804  //return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
+
805 }
+
806 //set configuration
+
807 
+
808 uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
+
809  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, NULL, NULL));
+
810 }
+
811 
+
812 #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:769
uint8_t bmRcvToggle
Definition: address.h:41
-
virtual uint8_t Poll()
Definition: UsbCore.h:134
-
#define USB_ERROR_EP_NOT_FOUND_IN_TBL
Definition: UsbCore.h:85
-
#define bmHUBPRE
Definition: max3421e.h:170
-
#define USB_ATTACHED_SUBSTATE_WAIT_RESET
Definition: UsbCore.h:112
-
#define FSHOST
Definition: max3421e.h:35
-
#define rHCTL
Definition: max3421e.h:179
+
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
+
union SETUP_PKT::@31 wVal_u
EpInfo * epinfo
Definition: address.h:76
bool lowspeed
Definition: address.h:79
-
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:81
+
#define USB_ERROR_EPINFO_IS_NULL
Definition: UsbCore.h:83
uint8_t bmNakPower
Definition: address.h:42
-
union SETUP_PKT::@26 ReqType_u
EpInfo * getEpInfoEntry(uint8_t addr, uint8_t ep)
Definition: Usb.cpp:44
-
#define bmSOFKAENAB
Definition: max3421e.h:171
+
#define bmSOFKAENAB
Definition: max3421e.h:166
#define USB_DESCRIPTOR_STRING
Definition: usb_ch9.h:65
-
uint16_t wLength
Definition: UsbCore.h:178
-
#define USB_SETTLE_DELAY
Definition: UsbCore.h:95
-
#define USB_ATTACHED_SUBSTATE_SETTLE
Definition: UsbCore.h:108
-
uint8_t getVbusState(void)
Definition: usbhost.h:105
-
#define bmRCVTOGRD
Definition: max3421e.h:204
-
#define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE
Definition: UsbCore.h:76
-
#define USB_RETRY_LIMIT
Definition: UsbCore.h:94
+
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:186
-
#define USB_ERROR_INVALID_MAX_PKT_SIZE
Definition: UsbCore.h:84
-
uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
Definition: Usb.cpp:805
-
#define USB_STATE_DETACHED
Definition: UsbCore.h:104
-
#define USB_NUMDEVICES
Definition: UsbCore.h:97
+
#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:808
+
#define USB_STATE_DETACHED
Definition: UsbCore.h:106
+
#define USB_NUMDEVICES
Definition: UsbCore.h:99
-
#define rRCVBC
Definition: max3421e.h:45
-
#define hrJERR
Definition: max3421e.h:225
+
#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:126
-
uint8_t Task()
Definition: usbhost.h:405
-
#define hrSUCCESS
Definition: max3421e.h:212
-
#define USB_STATE_ERROR
Definition: UsbCore.h:117
-
uint8_t bmRequestType
Definition: UsbCore.h:159
-
#define bmSNDTOGRD
Definition: max3421e.h:205
+
virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:128
+
uint8_t Task()
Definition: usbhost.h:482
+
#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 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
#define USB_DESCRIPTOR_CONFIGURATION
Definition: usb_ch9.h:64
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
-
#define bmHXFRDNIRQ
Definition: max3421e.h:151
-
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:796
+
#define bmHXFRDNIRQ
Definition: max3421e.h:146
+
uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
Definition: Usb.cpp:799
USB(void)
Definition: Usb.cpp:25
-
#define USB_STATE_RUNNING
Definition: UsbCore.h:116
+
#define USB_STATE_RUNNING
Definition: UsbCore.h:118
uint8_t epAddr
Definition: address.h:33
-
#define rRCVFIFO
Definition: max3421e.h:42
+
#define rRCVFIFO
Definition: max3421e.h:37
#define USB_NAK_MAX_POWER
Definition: address.h:27
virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)
Definition: address.h:180
-
uint16_t wIndex
Definition: UsbCore.h:177
-
#define bmBUSRST
Definition: max3421e.h:181
-
#define tokOUT
Definition: max3421e.h:195
-
#define tokIN
Definition: max3421e.h:194
-
#define LSHOST
Definition: max3421e.h:36
-
#define USB_XFER_TIMEOUT
Definition: UsbCore.h:92
+
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
Definition: address.h:32
-
#define rMODE
Definition: max3421e.h:165
+
#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:292
-
#define hrNAK
Definition: max3421e.h:216
-
#define bmREQ_GET_DESCR
Definition: UsbCore.h:45
-
#define rSNDBC
Definition: max3421e.h:46
-
#define rHRSL
Definition: max3421e.h:201
-
#define USB_ATTACHED_SUBSTATE_RESET_DEVICE
Definition: UsbCore.h:109
-
uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
Definition: usbhost.h:223
-
#define tokINHS
Definition: max3421e.h:196
-
#define bmLOWSPEED
Definition: max3421e.h:169
-
virtual void ResetHubPort(uint8_t port)
Definition: UsbCore.h:142
-
uint8_t * bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
Definition: usbhost.h:155
-
uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
Definition: Usb.cpp:791
+
#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:283
+
#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:191
+
uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
Definition: Usb.cpp:794
#define USB_REQUEST_SET_ADDRESS
Definition: usb_ch9.h:36
-
#define tokSETUP
Definition: max3421e.h:193
-
#define rHXFR
Definition: max3421e.h:190
-
#define rHIRQ
Definition: max3421e.h:142
+
#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:43
- -
#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
Definition: UsbCore.h:83
+
#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:197
+ +
#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:80
+
#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)
Definition: Usb.cpp:206
-
#define USB_STATE_MASK
Definition: UsbCore.h:102
-
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:75
+
#define USB_STATE_MASK
Definition: UsbCore.h:104
+
#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
Definition: UsbCore.h:77
+
union SETUP_PKT::@30 ReqType_u
void Task(void)
Definition: Usb.cpp:424
-
#define USB_DETACHED_SUBSTATE_ILLEGAL
Definition: UsbCore.h:107
-
#define hrTIMEOUT
Definition: max3421e.h:226
-
#define rPERADDR
Definition: max3421e.h:177
-
#define bmRCVDAVIRQ
Definition: max3421e.h:146
-
#define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE
Definition: UsbCore.h:110
-
void regWr(uint8_t reg, uint8_t data)
Definition: usbhost.h:130
-
#define bmRCVTOG0
Definition: max3421e.h:185
+
#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
-
#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
Definition: UsbCore.h:78
-
#define USB_STATE_CONFIGURING
Definition: UsbCore.h:115
+
#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:376
-
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: UsbCore.h:122
-
#define bmSNDTOG0
Definition: max3421e.h:187
-
uint8_t regRd(uint8_t reg)
Definition: usbhost.h:197
+
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:249
uint8_t maxPktSize
Definition: address.h:34
-
AddressPool & GetAddressPool()
Definition: UsbCore.h:206
-
#define USB_ERROR_INVALID_ARGUMENT
Definition: UsbCore.h:82
+
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:652
-
union SETUP_PKT::@27 wVal_u
#define USBTRACE3(s, r, l)
Definition: macros.h:78
-
uint8_t bRequest
Definition: UsbCore.h:167
-
#define SE0
Definition: max3421e.h:33
+
uint8_t bRequest
Definition: UsbCore.h:174
+
#define SE0
Definition: max3421e.h:28
virtual void FreeAddress(uint8_t addr)
Definition: address.h:254
-
virtual uint8_t Release()
Definition: UsbCore.h:130
-
#define bmFRAMEIRQ
Definition: max3421e.h:150
-
#define hrTOGERR
Definition: max3421e.h:218
-
#define SE1
Definition: max3421e.h:34
-
#define rSUDFIFO
Definition: max3421e.h:44
+
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:202
-
#define bmREQ_SET
Definition: UsbCore.h:46
+
#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:106
-
uint8_t wValueHi
Definition: UsbCore.h:174
+
#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:530
-
#define USB_DETACHED_SUBSTATE_INITIALIZE
Definition: UsbCore.h:105
-
uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
defined(USB_METHODS_INLINE)
Definition: Usb.cpp:761
-
#define USB_ATTACHED_SUBSTATE_WAIT_SOF
Definition: UsbCore.h:111
-
uint8_t wValueLo
Definition: UsbCore.h:173
-
#define bmSNDTOG1
Definition: max3421e.h:188
-
uint8_t ReleaseDevice(uint8_t addr)
Definition: Usb.cpp:746
-
#define USB_ERROR_TRANSFER_TIMEOUT
Definition: UsbCore.h:90
-
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:86
+
#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:764
+
#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:749
+
#define USB_ERROR_TRANSFER_TIMEOUT
Definition: UsbCore.h:92
+
#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
Definition: UsbCore.h:88
diff --git a/_usb_8h.html b/_usb_8h.html index e9816278..88df0d8f 100644 --- a/_usb_8h.html +++ b/_usb_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Usb.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
@@ -94,7 +95,7 @@ This graph shows which files directly or indirectly include this file:
- +

Go to the source code of this file.

@@ -103,7 +104,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 66b0741d..7cc17220 100644 --- a/_usb_8h__dep__incl.map +++ b/_usb_8h__dep__incl.map @@ -1,51 +1,51 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_usb_8h__dep__incl.md5 b/_usb_8h__dep__incl.md5 index 900bfaa1..55ecb829 100644 --- a/_usb_8h__dep__incl.md5 +++ b/_usb_8h__dep__incl.md5 @@ -1 +1 @@ -2f238cc81ba3ca92eea58f17f8d557d0 \ No newline at end of file +dde4986e96594b8b430995e47f0bfe36 \ No newline at end of file diff --git a/_usb_8h__dep__incl.png b/_usb_8h__dep__incl.png index 445dd76a795ff5dbd8561ea78db22d855a9dc7be..fc4a98a8d68925c9decedac2824bf893962f7117 100644 GIT binary patch literal 160812 zcmb4rby!sG-u0eg7>4eyp#)T56r^KN2_*#)lm?aV?g6A*43rug1PN)7mQW<5B?svm zKw`iV_~!Yp>wNEd&hfn0cmAB(d(VBZ{fo8MZ^!6rt5K4%kpTcec}M-W9ss}$0RWT= zgA(3ZBX&^&03>kdw(@;n&~_$C8prs{x{73p5uu`cgLLXJU2rIjN#-pFQ@X`R$tf0V z_9(CE+Sfi1MbjmW2}B%4>7QrTh6PhGeiFl1v>W3@85od@&+inPUbq419y7A4vUg ze@r-s>lLc!u>bO$|M$`guD}~|J)I6?{`+grz>sA^{`+%IC4niA58fy~{||o?nQ3UT z&>Dn&X=vuw?7j2lp$MC#*NT@7^)mDg5^f*r!4aFl=Z(#o9?T50}={r!l7`;#|HMP`y=m?AUj^ zBJPmiZc+iq+cnvCh5z9=H^^Y+#cZ6lOn<&(;p7ZcRo3-0^}GG{3nTaPR2xqZ)?S}v z#n1~jeNGj8ot7<21X!Q_Ix49i)o#OMo1IU8uGlG!YX13fXnO`4lY2L0?M42)mPjTc z#N)n!a+{&-#?p%5;g*9zc|)Uyiivvv-b7C4t%>(`^?8+*m0y#IuT0h0rQ(0~Z$_y( zTGzWQIOV-7_|qOP*MKSA{da3T{(MFhL$q+^lYT0tqvIJ5jxObU^{IJ@n>)dK;iI!L zg2x_|Y-1)$45-+P^W6*YgVh0#bSW3_a1v^7sfEC5hxw0<3q4iVy-nt4n}*Jl<)-Dg zqNuP+7Y9mnJW(8UGwI7hcFJ7ACzkczJC7#I9*X<)i_|xOh@kw;#kp0c&BslXX6cLA zW|w&Ua_URkzQx(*-SaO;8~VB`3+VAbhS5GvV*B!LxH!(-Sl~b0n3lxHDm{#;f?|i- zObP+#W0~I57ftu_o;I`ulrDVx@mF|BV3+b9Qo8ua?V90xb~H(^W<6bFhs8GUdWT%# z7x;X0l1MHcS9REtm8b&ZX8s!jQntfz+;XZ;;lp=U)sl`=tIlmfHSDs7PbW(!hvq1y zD+lt_hKi?RkIetL-XGLKGKP=8b&M3={Znj61~VF3od3RoKeK6w_+D+; zxK$o7HC}2s)KJ%w< z0}ckhW056Fs{_WSSq2Ud|A^j)C4>-CChs_H`^S&HZiRMs207!fH|uSvyXJ*ddggQY zJNry?heK2c)*eLd2gO``ueQm)*dEpCrvhR6DjmN=adGDIOA*-NMdKAZc_pQVohe$q zlJ+Z2HTT=Du<@7nJf!~Uxa8o+pPom%Z)E-Jie=*(c8!cW45z>ofsSzc|y*DE{T{ynVA6;bc zt+2BO*c7$-By`H9Z^L6NYf|x%@{{>@%&ao(R!jeU?>r#nkH=dnquv_-jy~kz6_mp* zy1VL~q;lT;y{XwGwmbmE=OO*ql%rSKQ6%Alz$Jk5i+=PPx970(H>5?I*^9ef=Xj0m z`7jA~hU2`C5nkVaT_#f5Yk_jzPTxG!7i{T-K(nWN3|e$K$X4(F~&%9vf>{ch$t z0&;0MU(aD1*Rl>uZV~R+B~#I!c-AFtxgCkgkA4TAe!gTCzB;?gCSm(9$KWF&boT1L z>TK+k(QgY@n5?usQy+~~p;66pn3fo-wN2rsOvpR4>hlpXj?B4}s!D1^WE*a0kpQ@| z^raYjioSZH@gLCg^RKKH=x=BD$J>CE7@(_jSzx4Wj*CRJIvKljEzQ*J94As*$`txA zHcGQVQanA|zjw@Xe)%zr#Iywmg^lxAXzj_iLz1bGRML`x8z2%mN#qAG6w=<+#Cy2| zq&{}ARca{a)k1pbivnHP4rDeJ1)b^DHG;uXp7Cr>R&W!Kvj0NMflefy-Zpygyj5|g z8ZeEb63O*s6*0vh$Je`O%GMq#|2l!T;ITzm2lHkz#Zt|s(^JaXLan&|nlcg3&5|P7 z48dSr^MYTR#oAydtY!}l&~LbZ?<7UbsU2n z04G;0f)kzq*z@1ErtKV(LD5hI{C z)#PO(vF&aisN8aZLf*cNupIp@RteGVK8F*dAz@XP#k&EUlche%QH&^hm~<5KKr#C~ z%!yy5C)8{-l!i^Bc$cJy2|~ha$w>hapkt1sx(_}*n0v=fxMS=nO~H2p2beQpZW2i;+)srd@AciHf%Ceu0A$$ zq80kWb|EXr52F3-t=%g*UFF`DeyN7;xXJFwBj<0qwa%ZPAFX(=A(s+4(;FK-E;b06 zcCw&wMaZccMgHpQLprB`RM@X|U8^cWU}`APc&&<7Pp{cpJ@DF^Xe>8vzQiGYw=Dm; zc%Adyrf5_2A%C0C*5sszevxQmd8+9Xv#n$vg9-5#IAqNGRwzv@vqcmklAf+S zs&o9IOfo2dhLf%BV&{;mAc@@7M=QTch3$^{%TtL=`Sy23g5=xPK%1a*i>VNL))_V( zKdZGsLPoNxgf0mzQV`vs*sOHuAzZ_PcF><{Y}VX%GD5QKOBsIpryX`9KHe5SL_kET zp|=4w7Jf^wldE3m+80X3b->N-_^`TrhQIX4K>8!}fHH79`2+l2AkUON71?3mLN!S* zROed0DSPN6|AA`7u+J#!29e~%up_V%riTU^F5LNUTW++x!M0GO+Gc3}3<>6$ySd)D zAOz;QiGIz6hq&KrBGzaemL~I-+P@`#;t*;M?l}A*h|YL~VtFMpg9(ig(3lX|l<|1* z%Po*7{)LmM#TGnU%Ccj|2C&xv-s&xIvB+yqzD>;wpD^Jr_b zq9%!N=b$BArG)(cHBbV9`b>J#l$a=i6n z2qh{Fgf^T@kjTHE#3tI5wojLh1|*N-yNzOU4TlLJ$)$;DFG%CQR`&?*%Og1Q=>lw?R^52P9iA zcGk|*T8+QcB8>(iiK27VlIpNEqtFKI+)PuJLYG7$15d5GUz^O;A>2@Uz3jD0P9#Hy z218h1(61VwAbeeto-M~p@2NBN@Q1XB*+GmN+IQ$vCgCM0`gm1V@V_09wMyKv?Pe< z2d%E7MPdj2z(js03sN3x4q?gjgS_{=3bmaW^ z4B|)$v7TSB)4(}G({Av|CY3MDwm}(pyq1+Z3 z_X8J)9a$nQxA+?}YQHM}c6LHubf1+ zCy9GEQR&o-Uu*8(bkm0?igwE7AAg4A9qg;OeKsM%lTR1TRFs>}oE$7A-;!k* z=M0+r@FcjY`-(!+7Tq40hIg!^%IfTw?vj;d_R>>J?aRmAv-;9Sl%Ehj@%*S1$TcG> zExowV$Fo;`~lnjixuIHhfx^-AvV_obbY3`mOnT|}DY>CXf%Pi5v=!C%LeG%6pQ&2z>$ zH)<9e0*}A1oi{6;K8~pPP6htRm-p5%e>IteRy2<;y{DDl_EL9u$nV}$Y-N|M;HwgH*Y49b^X1mFo#t7G3Xz{{ zUUrk(H(yNk?S_O@DM@Ar|7s+$QXl^i6aW}a*Sjo+rrlo$r{!EC$1x06@wMDE249Cgjj3kTek_TVPuU>(&Hodyh@W zieSSM5c_iAA-|(WOJAm7zQPAQ(}nh1z6`&+#;*$mK=#(a2*QTa<8(2Em0}DjhZ3n1 zmv#r9=eIHEy$7+lsq@WdF9B+2TP*#b1LKUNt^6^O1EeI`baf!3H9*eTSTn<`eiSygjRY&o4MQ+*Z9X z&31yK7uFvA5z^j%@d%z^!4@hJ_RMG{y;eb?CY1NCM->na)FBXIaLx!P@;V%fi3ho+ zq<(q}kqDO+r5yuBTgb-ir@jk2<*8M5jjgn6m7637O#}DJe!{ymWJ-ArqYcaq{j+gc zQw)@1eft+~_l0Xd{3WzE{~ejaAprmd>DR0uN?i33w-Lo*Su(^p!h_FbPo1O>hX=Wy zS_DXY_rG!yavxEb)ddWaW1n>%6NM&I@l$kkhmFA-D7Gu)f31^XC)}+5& zKb1&U0RFT!_xYjsDqQZm|T5NDNeY`1MT$ zvn>eKVLuYEykfw4y8}mPf^=DKgLFf~L2GQGhkS|an^9dU-=EFPK& zF^QRN4FyfyL9tozQt4vueyg@I=H7nt<|mV8s)N4t>UNm26ncjBE(E&t3(TWxoQtxE3oHn`kHULL~ zZ~HOnKd4xx`8w9oPrny+2u7=uztwd7B$LTOC?q@x~FVCi;ZNFHqO#na|NEFeVV z3w{L1!);$=>kJIT-%|4{i!DTc^QVZPS_>dQ;DkiM5?MKv;li~L1g}vsJ;HuA&EkIe zdNZkN#5#*M!{N=R=^Jw#U_H6BG=UmI^DU&7Y1ArXKx>wiOKnu> ziDI24roEi@_P6eA`V2LmOttF?B!g@WgMND6pFm_D`Nf(Q=amHl7j&9C3m1lpXMJrK z_(p7QT;#8VY}A#OGg6d35$M@sob8NZ!{<~RmHrzs;QR!-D|5|0PBp*jV>Uj-OV|!y zYEslrD6e|*Ey&91;km%h^#nGrqzMmq&w(~((^B$LQTT9X*$sg zr8_v-Ug*N@i3EC$vuL@ck2V>>nE`fS|lwxXr`Clk+`YjfxOG3 zp~$-aBqd$etBOPzkd>~Gt|y_|UL6gnaas7H%=tG=B9vO(bDhsJ8Bs?r?#| zl?y*FM<2T_el21u7Ly9GHu-^~j_9Jw7|BUEb5Sejj>4-*3l?fV+`gpsh=!89C6xd(D$Yku7<*b&9EeEv zL6ycHX0+ne76u0wS)DtKNFVS@_j4mn)cDbA65g!ex;ZpHFA6NcWbd z@j=nV8)_&78Ce;XGm9j5CHhiqfk@SufbrZ{z9oW zbS=P!79NAiSAItyoVKMhDYro19uL?+kX=0`sY_7j?ZcVZO(L49Ou~%AFjrOJhOerH zER}tJ@Sx53Q9z1w`VF1Gms`uxgcjX>8EG%|FCj700EN7>j~eh^h*O$McOfuFBJ&1e zSv5!o6!}bD#0&NkQ2KpZ(rMZZA}cuJ7MxdFaX3J7D%qI&QJ6$oI$HN6D^oF=-rVLo zl75z>Z1UcWGCt9P9=3C5vp?5nY9D*!p7)hrl z%Vi}8o|9zV@Y;O79>Tqc>uoUZJU>sxFZ}4P4^S7Fb4Qw?q)|*189K8SjW|xP`#QUh zAkS-$)v4RgHYV;(%VQgXOFZ3uo42*zv9`X(3$K-en9uM;=AMUZmvnW@8H33OXo+a} z0M>>Ih)|b_QQDCERhNi>7-g0RKI_A|wq~g7X#{!hjZa_IMQO}*@Y0SHr*E7aJbt{? zErCp%m8W)sidthY{j-ejt1x}yH6kQ<4}BI%AO^nx~Onn1{hHt$rc?`rLEdT-a7}^mlKoSE}u1w{ck@Epxr>TLp zs6D*(F)iTsb(ZH8uWB4w{mUXH*hy3txJP^-Ge47cvUUVvkMSxNm&~T9!dRT9B@Q|m zQ89qlvqN^vre)tkX!#PpaQ_F{FkgDRB2CxwXY!US5Rk0D88zp07bW||6*hm>C51DY zd%xRConsGzSHG?}cRo8M^!jzKS#+KdUbwA}D-|-P^TzOdsY@6d&(124-Rmy6ft=b=%WBO>(KB!KH$W<_%VmUU@YqbwUgoT7FdKe69+ zlFP`}hMT{JoiJAOV~JyQy~S98!{IF#8eD?1ccO$?`9Pyqt=FxZ&;yeMXf(-l4Sj!(hB>As|a#QNuA|uzuh?gGd%M3`5^m7wmL73MFF$6flt>NGKOE@xVtp@-;>_z`?Zw zV@3*NjS@rg5haH@sO`HUqsKaBxBbG|fKT@9Hgd5^%u#}kyAYdr;PKuWs1-IOquHy} zdne8Y4LI?SCgj*Pb$T#PI$BBth_v?))55(b1-ld@Qy zhHi2Pu0G;Xfg+!qnwyXZ;l0(746l0f2-Kp?q`u$RG?^5Ku5i4<#(JifJ-uG2=k}C) zTmMfUOgnYR$ur|BE9;y3tMpgTLN0c5?-oET6&NNI9H(|WZ+|mSA_) z0V5E@yj0eoK!h%`;Y4eY(BXQV3tGlI1&1^asx$YTyK^tp*rk(Dt8b{ht2|>oPFQ1^ zRYvgw{B8h`f%ati``n!OQR8X7e$W#-y_du%VQ!dsOl-t0RrLbBK-qS>l9`SJT|m4O zH;wCEjQ=sDq(zTWm6amPD*YD`8;*iV z3Y?Mh>!GOZNIsXo*5CBfu_i(av_GS*f4P6sT7V@=xCms1LqIvY;%0%S^STgKYV1%i z*NkA8UZRIhhFjW#A^zj_8*MzVRG;}zl&zef>)3O^QBM}<^*bI} z);|!?L^yD3Rzuym)1$j5L7sl+aHGX{{!WYFCmcy-vD*^i8~8*j!X>+zkYwP$#x3MM zERuO_e!S7O&3c)T2anQ1i*vLGuaIMCq7W24 z@Ez7f)@}#A42U76J)XiaVFaK=J%Cfxz1-Io%)Cx9td5hZRQ0p0q3g7Z{AUsqSx&Iu z@lGaH9{)>y^`a0!fs_FvvURU75*@Te6x-sM7+=IQFRMk(Jpa+c{7xb4RgjRfwE_~l z1mQk51ZdXB@8n4-Uk!s&KsE9^>A$Wue}~q^IZ@A0Urm7sI9^Oq_mGNyVqYeu`WXb# zAVui2BRT?m-apOQy`KUu5N>aTsqfDRWc#OC4Q3c9CI_D^n$EiQ9vu;NSb`M|9>P>d z@m$fJk&PaPjf9Q4t^AR{@{?Dj26RT;>b4T@Wd+BN08PUp4OIiIjaOM5X6+Vr%a&>) z2ltVv%ld9mNiw(zlrDeqJAvdQNj#_A_5N!ufGMZZ_n6O~a0; z4pL6q6nwVT+putc4Cc12xwxWnhF`cCP4VZi1)^tz@hi?_#T(AE4SwhIr?nNFJLL^l z4O{aqPMbeozFlqlwb#|H(%uc0a+)4luYXd1k$@Nu+j=LtSrnuypF^lo*=G9g-VEs?dVq z^V3yWm@zkjx$2$Tp1X#+L1=<#d|yphN7)oFx6DpNT$;^R?+1M(gLHUM_pW+1Q555=nanpjkLDA@jQ zj-AkWeS)8*hm+1J`JW+&VkmwFmO!xcr;u^vhe0JIddVrjNPML~85nX|=e)G3=KS-} zqOeGyqYMFY4U=GXD!q498Tzuv^09By_;wo%G7^wU#c9yHRT`?#Y$ z<~jaYg>*f9H$I$Bl8ZzrP0)z9yrJhxF0gh%V7I(>Tjj*q6uk(#@-h4y3Y0mw-^;yi zNyb5>uB`tZOi^q5ZJO7&a}&@v046ybCeWtXh&&d-`KRaEi9=cb{8(rh;g0d+`nFk zZeSD2Qt{RVtW`NdxY*@S>g{%W>nQNbdp`%|+OUJNTdwJ*g}scYoKtu#4)iq(Rc#sVJTu9`K&<#?uQG(O3u+Bz7>ZdMe+|Y@!f< zsXT2JxA(haHyB0r91a~tu~<%R>w8Tpu|1D5(GPdlr1>SWYG%9;`uPmqd58Esb-+YcU$7W#cVD~oBvf${(=&#j3GIjh5+ znR&0xu@9Qlm8PpGOI_%2L;?wn?@bTCqSAOvxRW^0l||j<>DmpHRSg-}+HWdLg*#r! zmBZO)g)b$t%=V@pgz2kpu4%G=RDSzntWzOtO*dQw{DO8?g5p#3koCj#p>q)1-(5$K zYY1ub`ma6PrGH72`6v+mvaDdTE(c=jk)uBj`xxs2rs&{eHOjp=hBj0BW~A*J`@}A~ zh=(@u&nnZ|6lmdv5(Hkyhon$O00b4@aVMw?4S08@pDB@W3=aeWm zwlY?iyIJw{Wj+|P9C~@)-=S`DFJM8g+tmGY3TY-+;9e#y_$10F0FA?AI_CInF~5kQ zAG!S3Id{2Ieit5E&l;9q7l;n(FL*t_q(A%u>NVxw%e^qEfZxVBefWAb<1*wuX@*y4 zs1Z4wmOq~I`b#`!z=yQ5o2n&dU@BX+~()R}dE7MgY zV~BNf;p1ERTCPG%;)4bp6246FN?YH9KMZA5pl+gAq|MRf7!_aamAyf=b^VmBSeqHG z^g2IVi0dg#(UrGGgI49wn}{GGmd zk&A>u0vE$UtHVgnC@RNbd1lFkj>Ex%s&wc|I2GB3G#NR09`t8tU$^CJ5&^vc2>5}7 z{R?Jd*ygE-)kA-&M_+&m4QmNytL?7=$5*4-hGtF}zy!a}PcOTKHHl>UuNDE6=h2ga zP^2=E-^XDgM^^~t@gc8>5X^7fDdR0h%|Ifox6OD-4_!v)Dw6UXh51R?Yd4S8viR~g z)%llU^LPpr)rxSw3~WO#R!)}&w!~KG+L99689AKZ@Y1->F+AYnOebiMZ8&^uX*reJ zi{N7~USKLH7xv?a^(1g9^xtA^h@-J>Ta477WwqgWU}cFCH-XnV&Fmy9)VV;&0(<37 zUl<{tKrK4n*SBsGjJ@+eODyz=P*(?o%HHXRO+A%A8sjH;MlKZGbm~tZ(5oxrw?hf$ z*owV2Zpk+JqpxrJ`FxT{-;z?Xdck1kDK_eNPa&AV1OPVA7+g!T_h%lB zW5By$H$jR)x$tXKLnk)*F;zpwGM6?INp#=h6c zgWUUehoS$Hl2PD8tLn&ra7sM~w*4haT%guc4`m=56pnY2W{azG>yQOHB(rXDQ(EVxZ;eg8vphwLZZ#X~I1WN8Z*6 zfd4+LVLz%<+Td#)-GyqbY7 zI7MGqsqEEoryQHsyZ*!tQ3T{L_*|S>=b;y;g|xaCx!$#ZvkqAaCF$`)uMUN@zMBo* zk(xjG6m)@4I>q~JwxkC*8WcgQ&M?72pJ*@c@p1x4HHIY5w)3OLZ{C?!afS`6SwlXY zfv!>4--mAjMa;8TffuMv(Kh*phXDQ9{l&M5a>hXH9zJ?zgdl?60hm{a3obXGW#r8= zU+s>TF{8n({^qG1QXoXXVTF7)yIp-3gJb;B#RemslXR`AfO}EVF_GmfdDkl|~e1 zTN41Y2rqNZt8cYa(_1#$kD&`-dP4%0qMt*KCEX@JxRnXHeiD!882Yh)v#A*q`z;^# z)pj$a^bPZB)O2A<>49&a_zdYYOGG4ywFD6g=y{IG<&-JYGZ&oa#@=4ZG*=4vA%rEcO0;qqJq^4ih{&sdueAhm@@|lov+vX{VYvG|cmJy2cJ*?$C|=$bgCuYT z9TMRt+gi7jt2M+FzLIAR-OfEKS8#n%Fz-4k&N5@@9QRW+ob&_0pg-^BgT1F@%_Oscy z%tf5j=9mB}Cd|#h{(#-FoJl%^BiQ$K&7`eLTYcF@uU|Exu4P!~l_uZg=xF@p(yGi1 zFvk;_CsSz_JY{HCXwOQgXn-9R+6Ma$b~g4S4eMf&o*WHAid<-lU~%c5?O2x?#$qBH?w5Le4hiDnL|{2VnFByH2NXLvgYRy8oHmW-|S6b z;RrU4cbDB>Q-mW>qTqZ`GAN^JJe)Ofu>An}+o)Ou`uI~QxkoST;H@7b+>NNnZ?!z8 z^ECb0H9!J~*STwIq zR|lKFS!_oxBjL_Rn_67S=zAGlc@$S3IQ~QuQ+|S8n<9fnkI-;XXY8|5c0nXj0w@~W zt6Ded1r|vaZ8$YvmBoRDx9Dyx3`w+r-rKPD6H1i{oRxr3I)}>|d&WkNrnL|rNkhID zE~_cnYsXU88O$O(cmP9fKuKtARi$%7iHwrS>d&21<7IS}&$*`XaKO&A$*&r{XH%@9?p#AXqs@~_Pz z93j6uHfbM4rY7O%!l@HIbmXsnD=ItbkxKNKG?VLG==!p^Yw!WK*0oWzfTfZvi)*`B z%1|yDBtUCXtVKe^y~uYK$3jxJK2smwyiq7Vn;@0w*>=(`WAMYoa>3xu+k?5;tMmR> z2-TeTcZAQ%%U;z<9pxtvOcyVR)jI~l?(&aRfJINM_HIIF@#V#(!cKN~R0w2n z*^I%b2|nKU`!pM0L-|_{mxyt-6lKnN@C8j2ZLG!Z(Mn{*;s|oI7CgdfcVDKT5 z32KfBqaFF0;!Q=vm+xcA)%Jb-o@*pRiXvPzR_8V3Iz@E#&SGnqc!+Nl!31!uNV^*4 zL)PQxy(m?9i5$g7P}NQOE#o~8o>xKm{Ko_m$P+oPanITJ@aJyk`W` zzL-<~9!fy{yK){^!rPsh`oqRNyM}^#4x)qiIjO20o|G9(83HW*$IsfgA1P7&MlLqn zUKK1IZxTr!n}s}C?u4Z#BTu6TGd$%Gq(w?T~N3@IX;i-ou~$y9df0ljavC^(`caC*u`aM>KQ)P&dDPctHlHQ%KUQemGGH77Pxz+k> zT)CEt0i>^$(EtaTR0ie$l=%@|P7nvwxaaznxbMGKTzM#l6GszB6CI@|u%$!oA{rxY zSyKomEP!h0+U42`Adw$x44Hx>tM=W31%DtxLs`d~y)ODqZdvBlEr4vqni)})AJsgE z0+GvM+tNDIq<~Ue4v7w7Jf<}Yq5h^mC}8%XXnq^!p<+98j-*i6DyYFV=)TWhmJcJ* zwPKC%Yr~;KAZe6$S+XJw&U3D4wJXr@7zorCT)Xk!Kt0~0h5rQzMcdABOs(Ze@WiruNs}~1{+e{8)G}-9Yg&&bUy!a3!Ve0y-#04T|MnQ&%dRk?-V35o=DVCQBCYI67}%21 zrhA5P4dZHmA_7oNG-vuRcHU5Y0x0Z#4Fykud~*r*zSh^Gdl1S7$H`wuGl3R~K{?;j zWF>@LE>Dcc_1vtJIka_L38mhevqh*>KQ*vPGMPA=bk~E^Gp0#WqJLOZU#Ec+KZ7Hu zb8dOmdu=&~47k64MDsk-zg%a;mj&4&A*=wKzFz~_e!Muhna>G3}8ol+G zO}@!gkxJ(i=s{bbNmFxN$NNtt;|O;`h1W6zF6Z123+Qfe^Wd|2k^O6-@x`1+j?>P(wzzC0VyawO{T z^JqHRt{x}d3u_mMSVJf4@#iyDG4Me)4X$f|%IWp&T{S@teyfi$v++s2a}&Pv-KU*d z%yK^3iQ?Hdcfx*tH#;GSDpW%QJf;g@Ub3IbXBBz~btIW|m3Fb(jcT z3~>KeT<0*EWrd{^y3NPz_r~sOey?7$H;)KOC1elW0q(K8T2{u0XepeMto{MbMW8#` zYV4j>&+niZBrJZQl-0zK6N11EXxcP4f9r=iplXk`2}NXTSt^{Ea`7eU-ZZZG6}a&o zK)JsAQCw`3R_SvKZeD(YX2^?L=m|hf&_dt2W#G0UY1OrG6yW+yKB?3LD|_ic@GyT2bTo4I-3 z2)woO;7;Y<$Ak0r0E@QYKdD>tR8}U8f-VMJmI+l?Vus|U6SEBtYme%_dM5;maRWpsiw zn!)lP&jNVg9IMQXgi0#_kDpmqhZIV3`UXP_Nr#>3TBCJ{cx^n8tTsGohOEXo>hzBe zR71|TrPZrOH-eueW`klwi&<+K;1RK6BzCcuATrb(m?00dVIhPaV zoyhj#r~bwJkx`?vkYiTN?GZEf(jCHZ(doR4L`~$5?QTH((zDPf(h05-U%u(~D~=cs zvaPNQsOTt%(Gzr&eSmmL!ooPyj`I0SCcP`k;PHF_N2#}i0Hg;p8hP1Xso`FTePon2 z*U*LFNHZ>n8EX>Euj5pc4qh(_ldVn6=D+(|e*aWEH$zo-sxVV}F`G$$y2Uwu)Y8~w z27WZ8DAzsbvtUF$mm*7CY_&ejRomK+MA>BdsX@djyzA$V#cEp>3Y-9E9h*!q8%Qq4 zDz+6LJHpgoe7gE{zlS~hwzGc1T)}Iu73DZh2$MHWQ?qY*>LNL=~j-Yg@lWgt@;%g67}48uO%A9y;j<2_UzET zdyyPt9=1I(lf7n$1Z5d^4a@G!JJ6^qD|-{MKoR z4j=7C<#)qCw-YoVmD0P??N(z@^Mi|zN`PQKk=PF;6sh5*STxm|U+U*#$t_J%Eaj-4 z$d002CF#qTM?j~$Ln#K+HN9t+rid|}=y(EhqC0FBJ@lIRU*GW}Up$Aspw&yoL|am^ z-hp?ST>q*Z&L(tA<^MH*eL{bMW^8e|=YL9fJ-7w~ypI@eNf{}b*!*d_HitIFe`orA zx1;UG`&;3>PlmFBzAYq+NsCpq`gpHTRjEKYYL13Kb&%92v5DMzOXWXmV55^g*G#T} z4DFV(Q(YZ2<)kbPT)Ld_<#3(o89F5uL#0exmmMkL-}cSc-aYP+F(mm=Z)``mf=EPgV680JXinxcg=R%v*uridLNKVK(1(eQhfF z^{*E2+=rLm`vtJ#w{|AH2ury$NVajvbED6|P+^%c@<`5Clu(gx%+I&x_I~N<{&FgP z5F28|1@kl%ud&p_s57pgDW{>c@v!=pTBVA*Kv*~>N|?&{R@CufW%oBVoVyz5_~vDXDi;enc zmXYi3SKt?C;I6A!qex_k*EI@gwWHBXv-H|4*@!f6ObCq)fCww zHfpE5^={i&cnH0%W-jQt+ub}>%9dM18!|A->%$n^B?+?e`#Eda?eC?t88TP$EMGP3L?VH zgr#dfP=;7zcJCp$?UP|;qs_nal9<#c9m0#%&KJ3?q&M=iEh>@x0FkU@^+^2SwPpPgF4U-RXR#@0u_C$*#$ zR_1-JUj>{U5z3pe&C^%!OtZdry?qh8z{==>G~nhmtV`%#31b zG5T2|q;H?Qf94RqIrpvT_H|6%^ADQ~4);Q(Q6S$G4#`U+u6uZAVv9Em?iS=2Ym3M1 zQtR)#8{@xf%wOq+!vi2S+e+{U4&vQeB_FC_qi^Bvn5bO*w z>`NA>MPiu&Y6mJKA*_w*Z+3Mz{m9I9Ukm-tfP6^BkFVvu*I5#7p?EyNwD&ehu>Jq! z0iJ)_6{*A6O6|(954dSAU@wj9<4@5AwzK*z-Q!RX|4UmV7R)U`IoSHQO!WE59rbd0 zZO12|tm)KJ+~y}MX(Sn{uS-d9V3rSE4iYi-8gsh|PUM&M_G8QxwYU6TfswXdjEKC1 zp8XIyK47-3W%!h66kp@O@;zhh_}rGsO_I5S$O(+}=wV?QgM&<86)N@IkFT}~z%Pgz zWy2uoK3P`#1VcMOQWn{=(29o=GDz1Xl4fkRwh#UT+4~C9+k(ZgWhfc$$l`T}-wzoe z*TIiw1POkbav=_o6JfZ_Tm(Mz?m0Hjq(gDb5CuHjla;AHt?*@jk$c22U4$Db z{8E1J$AKS)roWqtm4wz+9*nVAcpN2>*lOFjp59g5EtFg&*)kl8#5D&wpTzIwfBpAWObV5gjI6$r+=9hjEoBM?MZge@qqTi-ztnMjXrr$8tg*`MSwTCz z>D#ob7)B9k2kL0byC1+bjK-A__S&RSPdEb14gUO-=C!e{Sp2o$7S^(zlcZa+T@p>r zRh5t8ul184>G>GIOLwPOn(rfC8Re`2{OfPuz96V?zRLpW5t)QVM%Oj))cdZczWoF` z#S!;ARAMq=7Q@klg+^uY;qYe%`@bXI7^d^WVw`__6CDXqLCSf2*t_25?CsXs#?eW8 zC$L5SBo@zF^7{2;YmY|ceFLGudGh7_nXVfkTu!CVTo|3ZK>PsLvO&tNto#Ej536y! z>V=S7k-e9~{>R!m96%I5;ZScNFY2X%6r;Y2c6yai{Y26O>%7bJ<-(hb$lR~Mied^o z{Ak)D@ZOZnyjN8*2p{PQMiB_r+WnR?Hzpt+xMh@`zF6l7c)3(>(O6?k zCc1n*luI~|_;ua3cF6%zwM25c zTh>LcFi@jNexV{zEh$;fYoYPefwwyJ6%XQEgOQ%0FTrhauT8WL9o*WyPegWyaDy5X zcg&2NGo!E`ukH4z@>-AoKUTk7dSIUCiZV2M^1n_f5h9ik(j@@CQNGVV8PI3tD#i`k zW24W0=2f;G?hS)f!VOVeM(4P!kPP#{%07Pc=2r3X=k0Tct8{Ea;U} zU_+tA-{kKQ#K*fdOU|63J7dCLPx@N%&cNwgPlqQp5(iH4$s(?MI~a%3b4zO#2~yO- zvS*3_`dzg+ zi2^k+mp?RtMx-0hc_BEU*5?Sk3phJJRZC&&%nuwllxu=c#%LJ7{E5>vbH&kS^GPnwnOVLdGq{s}nHXw(@40oHf;x(!39rAqO+ zdNmt_B%7ZZzi{lxZbIMRW`KVHLj~Hre$PW6n26YbLFn@Rd3-y|yFWfZ68L&`u%!X^BcSJJZEUQbC zr&eMTijOvMnIxlEa&5!bTSvbw8khmF50xXJ9nigghVV0Q(R=|p#K(Cxgf2T>l^t5xu8sE9QZ5d4nI(MSPTUA8 ze3g5P6Qc>uf=S_LTSz(%5Q`d;O6V`+v?v15sdz{u zhdzzao=obwQ-2~R-U-L`@`z#>mki@12&5%_{=l{)Z&b~?4uaG2fqzDCJNU&JV%L(g zOf2{AmMje(H+mtZ$aUu}tr(koF_Ovj@~BC9Ak~0ztNG@{%0Z@ytjRjZ-$7qg`?&S> z@>}`Ivk3XiZMG`8=;zs1`V4&(S-xxO+`BiI-D)J7bo3dJr$mgiO;XKeKPUXgo|68} zJ}qy#dCY|KDeLaB{H@G!ee66%e4Px{UG!HyTVywYF zXE7!`v)2FE`8bB`{8Q0IBFo&|Z}q4rtOXj2G~5V+Az=%CT?7~nw^uvoUz&PvHd2sV zUBfym5kO|4hDfdd1X?E;eRrhWE9+cOH}N&^ zSZtraKnbi3-p&@8LgR8LMQA6W%BW;1|FhUbsa7n!HQ-xQ-{&?2?u!mnAv7tt4rGLk zPRb%V`g!@yFtfX3I2kA@0*eTHg?Rp$<8&v%Gw#zn*swEiAfqmW0z3%VIul-*g{Tzv znOF-THGzx(E2Ky<%D)}@q!|8po(5POV;LcFNjO47X|3m5V>pW7vO`k!w7 zYS^Lkf6|V^M}3R#1leX`QjIW1d0efC1Ae(dA?G{C3N=b{mil@YB@RtN{qAFHVBG?v zvf+vZ2HE>Ri7aDhpvF3J-*$ z^8?QA+iX(RwGc1eoKIRU%RXtX%?kbt`X@W9PWZRb`oNIl&Se4Ti)V9yQ{jNPM&b!J z4Xlu_FA0;VeJl63`EtvA;Rr0C-(V7Qt@*rg2gnL8-W(T+&&3MfVDPGWi!@$do&B>K zC?Za|jX@s{xzsUhQ?^CGQ?u)+{2Kex&1q#aG*k5yZ$Xm*hcU6=Bek$umDlEpN!>CXhPoe|O# z;-BJirh!acgO0Z*dd->e+^MC9Za~Z+vu`H70SBM+Ej>hEEoahqw>|(i^s)1i##Eum z))NSGJH62KcgJVTgWDh*_gGeHO%eQOc5n;&i_!?CBDn8AFhXcoE2e=m|=Hx*V@_P8T2DOxRWiC8tT)<&x;G#ZzjR@%-LnviSBH44rbLMj{Pn^yjE8)yc%`s10TUj#$0gnX9X!)|F|xLO3EIKvxA2}@?!vym~& zow&Jc^P9u6%XNAAgzey?Ak0yQW5U_lV8&=h!0&(i)VDH+%|17hixJARViWZ1kCO@@ z&SG_@b%&-n<&1%@CMil*?;heE{c_1BtGgR`cPp&vpCSo)#pu~`d##!f)RU^Tw_Z}_ z&*eXFxazvh+>=;hv(y2b|Mdd!hCX`h>`^T-&H$`pv!-mqeB5jaXItRZ9_I3EX;>%4 zxu$@btf}?$g#Fo=%k)C3MH<@uFxw#jkaMZ(#vNURs65y_{}}6%*(G8Qo)vsnrd@BA zsQa5<2)S-Ll=~P%FpGqEhAyjWh_{J4^Jv=|4f>r94)0BhDe(ZGkgOiLgMK`_f5!Mg ze^q_HcLEd^#a{^~Uho8xE5z+*#}DB2m+lAuk`~=VH{Jr8RQ(r{5t9*|zUuG$^kx)o zaAw^7&I~cjtkwR-cR?`5+>fEHSi;Q}PvqdsS3fV zgAmU+7h^{+HZqD)PyIYcs{Y@5qvs5a=qbkcuEYOVEQulnLqduKK*)qvA;!8qV+eg` zu=K$`sU556W<*w%b~m2?`;?*%76J&JC}d<(l`O@~&rR9@^6}-?1GbA$Q2e2jy3Ge0 z<3Gey{v;fwnfBjAkP&K*r?vob;di5~9Mj=qluv^Hvr{j1#;K9Bw8A8Ppmamu@B&-| zC>NZAMn%z|wCpi$w|&-q6sy?;PFm;vt7Rr8^|&vo@3(zXD>Igg}R z!-;X7cW=|H&~<(}IFt}~UEf`!-kN5CqPeW({|;n^L)PA9kEn7pRufV) zm29ZV0jg&O{V(Eo1#&$5uW@tqIn2)2ut}<58I-M|bVqXnpO$fnI;-)VVzTH_7wt@(z`sgvBK>F0ez4}6gYM+FR`5)Tn&1Va@{lL7ARDVMiCMZ7Z`lbOJ#`2u5V*UAI8{zHX z`ooZuvCJw867D{~R*zmlIsC1R3qUU|fs``m`_@&G=ro?J&50b`O+_yHdF;-P z?Iu5bCK1f`a?p&Nm{(Ro$s&D}HHv9|EWApc{&(lZ_G29?(9O`JdCJ%_VwoN&jHu6O+ob=}4ftO>kSd7|^_Fev~|;j=JhZ$iK;=?E1?* z-OG9AGhr6+Vnt=Bg+rXpwuO*4c(@^VFOH^`_d^Yy; z2uQAcEu=`7@ym;P7rKv2x|@ySPmuch;o;n~v4x!8t!44^>cRea{!tmcOc8KPb-_cS zAB5R4ZfPaF)K}?&+xPrtT$4515SkmT7$jXFcDy#nquBUIEh7f&M@kl+A_x4?bQOFv zUA2d0(vIT<;vQ>vf&pA$DD?X@oTllL`rHae^Q+(4fs;tnp>GlMcggGb}dZQkGy;B2r-M;@UCQKq>8 zOWe5|v`gq5G8rZ+Xekv(7pJIGlp+zQ7(h@F+ltJ}yg#t_Hl8jkZ}gels+hpPy7}@C zSox%+(Wvf!A2B@^*oG-Yl-%Vi_jmi+qLO8uGs}fvWep>jXjq3wg%N4&W|et?V#fUP zcq|^FXV;WBfnXzA1VnSZ=fbSo9ao9^4psR?Aba{w_MOroJ1vN7L!;T0Hoh`^XDF}E z2R9u^re_LShLWBxH7c@A|I5KBzy>J&Tg4-vYK0C{<=Q@%!h53{J1(WA)zQR`)}v&f zYfC4ntJ>?Xcn&Z6#IH}C(Polyxjcts^H$=F74sB zfqMa*mjOm&A;xpY0KYF_7HEtPb(ybpLrzM<^RZXGazY;o9U6fphYygW`gF8z&fv`J zl{XuB)JJY1B==zbkZn&!A8{(_#pLFJ`2|32KVO=CLU9(P&~}-sYIh+BEt7Dy)J0sq2V8nkZcvBw zK1}S7)6xizMX4(>trIvf^fF8b3LUk6gEvn{Tnnnok_$?I$lF#6;l!EDZ=jQ^X~6q& z58sFl#3=R3>DZa=J|p1$lEXITK!)Bq1#sb;ue`gATv*JP$GQH4r7#f$3EjUu1!0J$ zZHd~LJJsmh?B?o=ed>ia^3iwHP$DRy%{PzrO-4rD286?fQT#+5@MX;?q6BD8r|EM; zgflBJJ7R&Ivqu|{svk^$XqtQ$H5xQl^RGyl`>24IXBAH`Q}9185Azl!vz|scJ9Y7> zs9}dGr+z@f{ykl&syn<%qyJ}eZir432jrzTuwP@7)N?yAc2=4voVFy`t?#>Gp<0<}82v-DAH$oJ~}f~4fkXW@D@9NGU# zolU57f3fvr*sVblL_fCxGAsWN2?BjmF!a2FSps0RC@v!-aVxWBLpcd3cJF|{*yTLE zn4c<=zy70hHmt>Tfg7ywx=(=a+45;C;M7dePi$O<7D#NG0s3&#<4(BbMv9CquV@tW z&vw!lCgMF+XSIOY)elTNWi2=CA^p5HZA4d`!@eH_cA4hHo81~OcU%SsG5p`Mby!jE z7prF%wqmnVo9>%X?2q;A%%wfHEK=a>(Yc@n_&$21R+kh6jkVbBxh*N(()ao)Nl7yk z;?n>0KXEXS<+OSKEfr*S?|aW?2YPDvPJi1}+i8nwjWXi?s{tNQ zC9J8WgjvmrSXnq=AmcKe0Wb1t!7WfJ-(N1)OCkTE?%@ZIvCHM$xXN5GST0UEJivYxFqtq5FOJzEMQ zo0;zPCOY}T>t2fgRf7|GSVJD4W-jTG^h5>%V-B8G3eU%Q-(DlxId`(|%+IZKMV~wHkQTVGOVO|tvUr+^5 z{48N5xEF54ZUq~24a}SAhJ)gsL+4_E`xO2;ZJn;oj*CVpxBBv@0m(u8{$i8k&UwW( z&p*FUt{d+kC2|nKXE5*SF8^_+_M3b(VPxS!ZtM4Yy1J6bB9ONsSIe2rMdGNQx51wE z?RUch9_YOHJ9?(hP27bB!sI>Tl#nMTK__mKbBU(Oe<^zEZg1Rn_d;@30$hTRGC9#M zL0i0%6Ih-7&2QDa`z@)1aslB{T#owd(>DUxbdkZvcDxp~ge%==3z=UZ^c6q;;HyqL zyr3t5wur{#2f$NiPtB9Wwg3#_hf5%Zhwl^n&l&f)>%a-$+7bgBj2FA6ON?PXlp*nK z-Mf?Pjg&j1-ggoNw_}}u|2Fr)H6PlpXz<bo0)QL1Be;Zlcl9zc1v`g#E!yV#Z$79$02W^=~twknqoL z-A!8I{ogF7LMo4f>qmr%qY#`JCdwG02Bjtc){P5R`r_mNvcn_Ahz){O@e-R%@hR%P z^YF%+_I0T(aj`6joB6nxMr-~RGfvkfprs}ecOHX)`8_Qx<28N)jM&CWS_s}GK%-CR zWIqXrGG;hW`VV#~4F}w}fv%$^id$D=5t~JroqA^S`%oVQLyIR?u_;hGGUyWHK1sVP zah4#V&?>P{;g!r$x4N$+RUo}bzXL?eS6izyou$|w5DQmyg;y4c)gKK^%$1Z6>^CvF z^`kfP*+lNYdQfYsBXK`zEm9O;A!*@yS95pEoQYA)!uBEdlT3zrz)riI?^PF_{4Wi} z*TZcs)eo!b8*PMpr`>-)v|Kr;8YFw%s^_j>tjixeQ&-!TA7i<>l?CcnzDQ+~#GB2@ z_~-&#Q7EF|DGNr+9}OVrQ&Ie`GJPt@x>{X*h!HSK)t}3N%?yp?=&$&i023cdKx%X< zK>rm(k;$dmJdIl&9BQvV9soxoQJC67PrKi&3s8iFsnEV0&1-K)qAxsW8uOiQPgk13 zHL5xdkgauwt4XU%73Bp$TuL2lTGu>Ny3|AoXvkAc>p5lkxOuqe-g#grt{H~V&fL;4 zb#KTE;wCYfM32=xbkjYOwvO}=Cox6Ffw2RD*;ZTcUVql|b2uhSK(4(e2Mj#IUtVFw z`*!I9@yLk&X3zoa_ybyv*EaVGbt+`0?fx&VsZf9d&S>EN|LUMV*uTZ7KvXbL%5$M9Cj6D~1aKi+9?QhW=sS zX1Ra9csMBSQUO@+4|^Ex-T(fIGD|IF?b?Jd`p6L_APCmT>w-KkTh{tb`M} zeoM^(3A@BNm8zym`|4ile$|70GGxTO%r;a}C#(S^AgV87p{28z zecj{<86x9?e(~KZotl50yzIAG44wT`#I%+mUFM=Irf)M{IeKcH4M9BxQMLxLq95^@ zpu6}@(DxTRlm{Py-hdv~yq$G~r~oiJMM|!(IeyYle;KQ^?=ko^GQzTpd^vM+Zm+hD z@au=I=!*z)2{7oKtCeqD@yfs28OHd0O21{R4FaDuE1!iRt1Fj{X!7gXf6LK-3$bUl zMI0?D76UdP=C**aczOL+xqKZ*iiD5biOrIkkG>@?nmAZ*LgbCi5Rc&>KUFCYpkh##nQ6B8pkEwID4I6tdv6sCXw9es5 zXeS(e6^OUpdksadr~6zt*9`Poof6Gh_``W}NU9#H_VwP9Q+!8cfMauAV6vk)@;k4aeI&k}pT z4@JbWlv19)_dx9qSVE}CdDfO3$&1|TI&++VFdz^T*A^iA)+K2Ak;c6T@8;yR8By*Ej*|DFkb{ zqe&QO6@YaK(2LouEUwrbwUZ()uHlztheN{}K&DI%6aj3HO0^UF-t$YdB`)1@NtJh= zoz-~T6fBFOBm!C^ZZ@wWHO`Z z_A?B0InYX^X+M-_s7`>A)_qW7If2V?WJFqQG%`q_PY&|c%)K`!C?m?i{93b1PCnJf z+~Ea{Nvj%=rv9xWh9K+4i`%c8BZoW+WRw`lP#eAAyZuh7AAUz9 zEkALIH!pSRWCPy4Ecm!JR`RjD-P3rF!!LJl?dX6lAPv^T}A_bxW zF}a1N0GAhMpaZv-joG^IA?o>1?Lbh6-h*!uCN_+DJMMs8g0TbC7%gofG$6AJYy6Z^ zl2A&If>#Wg0I1itM9(&?$NZ7V@8a=O--naVw=xsu%~I`6hd({fTJdr&l;a~er)){%{JohL zkBrya4kqL@LeUT$1c=l1qYw(BPC)Bh3XW5wf^zkThS~2X<1suDY?g{ga93D$GoE3? zmuG{Bl~jOffve>+hoB&ERd^;n{r?e-zJv#Ig`W5sx0qalJewXi)aB z=Mtb~$tElVS&8fwy7>}|ljoHLv?Ffca+ACP9fyEfL(&0<0?2oekow;2xGX%lc#`~w z5<`Oz{Ms+N;%wyNq0ZER>5$JhyM1KGM|BbvY^A<0P!wDBr=;*_5y-Xk-QBIm8Q5OS{rxQ6Y1}QGwrYPjZ2m{Q z+)&U1Cp7I`?0mj&!5t@S$I;FvdXp$Uej55g)@;;uB$qrIcje7C^nNLDSm)TU za@=`K5I;L8cbV64GH$?d_JPhtW-Mr3nseN@og&`y$HGm001$|glep+J&tBfMPyg~9 zI4cvsdA1-wE_>8Z+3j^ye(SF!8dx}rRju7I_p3c?x!JNgJ6~RA<2vBT8P1crH8yyE z7aKHXbLLy|M_pd3schRjb$cDq24iRWKKsXRl?RIfK~=&p1qLYW1`wpaQ>=nY425Of zf3?zTU(-GXF%XBz3_BW5n|O*2wV4QfSq5Od^&1;=0w_TwT(nptbW;yhq#1S{OI^wf zwg5r*uO5OAVO16&K-OF6!VlJmXC=^y4>kdr+#KBGql^Ruz;2oZ8ZV0wflJs)Q5pno z3VA-%+;+qg4n`hWVUAe!q{0gW@WlkaNW2y0tDUcx0VHFx*Tlfgeh5jiT)+R(4rJik z0$eb7iepac(;@`=)X43%S#?vmBfa;1&A&C^bKQ#}YONW1v7?Jp(T!Lyw_D+ju#5oR zzKGn*Ut8w&SxR~^b#dXX}(cGmqkhXB3@7@=L&0t(`Opb_c>JR>p5^l|V z@!eXqf-ixb(u|8daXVmDDb;%jGwWIa*bIQg%Iys71Ah1A94P>(Y|;Z+FS{$fB*@ek zP(1CLoFcJyC>!id(?4wlG*+nPxVQg;TgLy4N_~Es9Q}Z5R;PUx}aXwqP+1ci*2uS&6+{bA(UHC`!ZS5zuU;DXhJ}m+H zJ|$mDzz?#r0qfsl&&O3BpMy^I&tuvm;Sf^!tLDpJE@p8GDO*=ZuRXbQAdPqc2mbhv zRuG0%JQlE!KI6>$d|13rPvRwE9AO!{ch@OVY;X*OK>hSul`U@k%V2l$WCO6*gbNH& z`4D=b;Ry%^98-D?!yq$mn8uzuGc7v9`wl1$F!)o4BDd}|4S~xcc8{>Fgk73q5K)XQ zR9&4JtUx%N4FD`21=l@zWx{Y_3+cyzJ^$ikRZ&7t{&V$$6c5NObaM_1J=c>u)ltoI%MW!G}BdEpB7kkQ_q9L&ny75v9D{Zo>bpg=@^vEav1{L0VhG? z+DyuXTc4i-3fgUhA$_Apy`@mjR)HvI_SYHczrzneO#sdtu{S0Ei2*7wJVPN^nL*X{ zqDwi5M*#=yLK=HH5<5%^Z$OXsho6j7lGU+`$?E*G(#`wXW;5BT6#n+?No3qTUncb~ zs0DrN=_|>pZ20BIAr#Y&s{ki{hl6XsFMDc;N|c))M&Ij3%&e?uUk+U_GmQj>|32tG zJ0Vs9hM0(CW!0{1+UW{P7<%3@Dd}-Vzo-u zJq$RRS!muc3kiDf6LtQ}W#Fvd;Lito3mZ{u+0#k9-Li)H{rDJw8EL;ev%r{V(up@z z%E$DUPJBX{>PjxjX!SLnZj8S>$=4C;%UK^F);zEweynj8C2wLxO|x}%PyX-kWFSN( z?^fP)dgqqjcpX-p3j#2d`_9yYjY49Zb@dbJnXtha9-GG&oo{p=4S9x=W-WaSqk~4~ zwn!T5`2hSEC*Dzgdn!;ps3uL^Ez%gxR=kvVA z?iJAgCV(uR78vI_H(ZB4sY_3M*141896hM<$*+UlbdJh^$OphWtLQzun}E0H39bjq z4jh5cZLw5_Sd&p|FhH4y5#o=`7V(bA>BsyU+z5dQu%bv&;6UpgJ%sqJ{4W*aMqa7b+}#1`#p|VKr>MLiaB}E#Ve2-fwjsOT zXJoGQ5T!C#lMfot6vqtn<^nHf5F1Jz8zQO&T>kH`~FEX`QjRmS>;zOcYUx0(1O) zqc9pA`Hm=(XNIWr#5)|{o>+D9S=o3t2Tt`4SK=5?y#RA)lDV=%Dm=rm-P=J*$=uBJ zN=k4#-__rF(iLMW1TkB5>1L4=1+C%h#pNy8gV{uXPfN>xruNaL|J3=eozwgbSZ?zr z7{u*U!ey~5LJvQG2JV$*n*n0%r{=#7&C`t+sIP{?Ovya^uO4jvS?Vk)7-H=4h%0_P z!`T!5M8AVfxMORKuH#57;t@Fl+bRnqt8sLpcAVH<++&i#6?1ssVQZwC;wXn3>^l$fFocoyP~i#rV!2H-BI(-`G62 zW%517U@wjOmOz-+vGJ1IS4DM+&}sI(}${5F1Yl`)(1VHli|8^zmbhk z9TwWd=KA+ol|xU#t~iEr^2OEYVuFyF!*E2pMyT6koR>*^BBslNElzq(0S})RJv7(* zC~aUXNS?I&_GIg<_{Tza$1-=@y~c}|I<*zUuToxN;R;;h{>S&kJU8~(zeu+O9cD3P zMO9M(XZkx`=fZ)cNBz$uYOFFiFX&_w>N{{cW*~^;``!A7lEuhp=*q99hcFjvz4xQv zE~1qt6RT{PYU))IW|%>cu?(?>TQ=jX66^)>8<~Ff2dO_hS^g^2qfY8ODu00QVIDIZ zpk+)kGo37_T#$!|ifvVheGk3SN?ufz$bnLi3K+sa6|Mx@y{U8#Ri}=aGHLSvAmw)m z2{?kVfbbbvJXYPw`9&8Yx5|G67o)<$7J`I{G-?`&jbGJ71nG>nofCycau_SzyuQIu z<7y|F{Xo+(sY)Y5z8A%2cEmn*LPp&FCN=89S7ybt+o{u zUW8Z^K0JhJAj=l)e`LXkL%$7eUqh}_WG`QBQ?;vNK#I%H4sK{_&62~Ck-)p5@q$6% z2QN?_K$T!aLDYlOLG08n88V@zW<4xrEG8TFkjQxlR@jSx2Z!+>8UOz5rX+lb>q5YF zy&_J;<&&|mu&1d!uqUly1HjYdbkxmc{Cxjj$PKmkA3Q{C1?Y7Yv7v9&a6RptO}FLu zCFE@HD{R!$?~#68&*uFl@X2zFMUzZ}2#2f;3=!P%Q*t5ysr)v5zbD*HKOhH%)w;v2 zbdkW`b=__B@qE{7PcEs~Ia>O9K-%j`fvNAZG|@vUW^f8$`s0(G8O*@~v`8M0EP;fs zR_}VhodWjISSM5NtI>}#4UhDGT^E0q8Q_lJi?Ql;O8--%10R|E)NTzMc<6Y|pC6*$ zqfbkXo<=7%xOcrmQG(uzFdJQ+OgKMdZOv3&?keoaR3$UTc_;_(h73~kKD+8O?l;fX z;4!-j{^1k*qSO72`g>;A+Iq^LPCB(hE{kqB_yr%(1%w7^25tmxGs*bAkyXr7@%^Z>K~5&1;19kL zKNA_L>sRtUVEUWuzI0hEYlew}DkuU}2MC&Hv$Nr?&LY_quwjcRMHuAYoL`qm5a%;+C0v1FugYVy;;F+OEruPikLP zVzS6z(er&$OECE=_jkkg&1L4h7>0dA79eP+Fm&}xoKPZ=GCGIf`2F%;l;N|kZc4@? zAPXTB^$`HC8C?;%cevn?Ie!kheeQ5|et*fd)nydY7hSjb<&oA{fo931(m^jL(@Pg> zifK+E`cn6B=1l@NNL42Z$pO5Ryz%*l9&6!)Rqw0%&dr zuv@iO;#Z!!%$Z{U(4pJtYrmn7J}*6!1+ic#4v|jJ(5;po2K!g7EWrUM!i0Qmjx!#C z^MA$S$_8pBq<&^NyR<%ym$$@KC+UN4liL{j10U^%6Qg8IWx*S3BA%kS$86Gd{Ks)D zj>ge152hAyvPoLPnZu_dtj**p6V4Ep^t^gpm<8tyGU3l0p^#`=tlwOLe_(NqUpN^C z1Nx1v!Vf=-UlVJ&UMu>%p=5^pDuVK)a^uE2@VO8*iTnLD6KH%`X}ZMXbW3utoc+k> zQ~j^>?oyBn)b98WCkMS!F>qb7FuFl0%Gf&sG*y2Bv}yGo>kjPSs0H=#gS^Mf<~}uF zxi>5MBFL1?gT7OcA3b=}XF#ZsC!{Dr$hD>x?_iUpMS>Tmur)6KMgDeHH)2%4sTbMv z{oOZQ~8C9MGALD82zyZ=-GU zemX_S`&+%kt&IsQ8ll*tAjh>BbZ4AqAEyv_9(oWN5sTB=(mpYSU6i zM}hr+8V^Reg=I<19V3=62+e7RrgR0%mqp6wTsQ=z3d-kue@`x>^(tS(nhjOJds1Em z9$6dejJ@P-8Eua#vrE!NCJtns<^xf4O9tg;(fCwv<+H_|zWEFFD5_i>_W5n+BfS)V z<5NVjD>6TUZ!d)W)X5!Ek|X1`@Cvil>#m4o)+9U^je#hUYF37VBI2(9{#w!_uke2T zgMf^LEgky~xa&aUu+;IC{z0+J!r!ZY)hgo3CkUk{p-;er4^-dG7ERZdYUh1oB#+g| z)a^=(5~4oe4Tm#78@z7;b0zRNHu^4Sr8HP$&(L*L zWZGgH@17h?6OJF0Vh{Jh*=J1CL`;g`ir(x8f+cY@mL=V-7kxmN@T0IZFs{j=u5Y&l zg*r>fL;)e0K;w=h1^aY(MWsMF;)mNpdJJMi>+0=L!MuiJ5}K)4nM{NEUys4;>Yo08 zJ!qH$AgPrc$_6AfAfydFZ!XLG=2+9JG>pjMFga>*=11tXwdYe~S=v?YqmqoBFUUpx z4jsH75vlSkeL?9xD$*tQ{?~i@ z2gPC$E^K>bR#e}z7lM9dI}GKjbkNBIP3Bn9pl8)jt-e=Zo*yMe|6rl!>5#!+AdPr| zS|^Q|^xygZlOmyYaNv63HaIU);%KbKzPv=8G0CMYr{W@&xMQ6bpsKvsDayHjutnQT zDFe~_8OltQ52L(Idkf4bWKXmRWFZ)O#_$>+LSOPwCHT>|cXvJN@Da>uY#liTJuD!l z1NmF##^_krJWT{bz+_DgMFypa<1n*`yzCA8s5|b^`6}a?^%^PD}mO7cmVc zLsq{bN&vr}^$P*z!O%(+1o42OBhak!1!n^@Knu$M_J!AE@`8~^s5J^iyJKEuE&ZHf zw#_=x|Kts@P}a~MRn)jR9+4y)#w(ys0-v(1TM>l<>_)OYOWc4GP&#;?hjr)uok6FGvgI-09@Qvs`4c^t#z)F+ zPua1O;p^mNPhJyUm@-JZKU-{o>BGLc-MxsyH2P&et$w+15C9?!(ack~*q#0L)$eHU z$?Xj>{#I39xx#}QRg0P0cI~P(AaklDH3v7_7AsPiG`X33=rhHaDuOYBZwUL!3%bVmn!A$zd8sbbQ6Jc?oRkoYB_mEo2bU%pv4Mmwrovt+@;-F2t10x;Dlwc|61*BEV zNLKD5F50Nvad7CamEjcIgkUyGSvH&Ve{JX$&Vwraf8z-=oE-$_1B@;tWL*7k6wph` zkP${RPS1W#M0y)lh(1RnK1f#k1BTVHKh1`|4buN2q93?s9Pw3eG4G4TdbwGXaXdpq z9N*K4{V?F43(lZ3?m>AsNTs}K##S@ttMozZ=ygMv#(SGc!QOTkPA_~@#@_1$X zOuHgw7y^Y4AEWWXBwf0RTo%RT`0w`c1xb>F?khT{^bpfxz)EKwxa z%B_z<-*#|GoRqR5Sr6M{+0|}FVWGnnmW1id&~mClSp%c*4o{OJ)o)A${Y>B(o*JX? z4>t^=8`WfaD5o%o8kAYWp>`Wk@lo+xfd@-!mKF0r}pny!L+zlB%l;UJgkZsEKfyEs9 zXKC$J$T)0ylZa+msCS8Du}!tHC;f3F@8l=C^XG{*LwH8>f2QU8tMsyzf4;jLo_QW7 z*1%!WGcD`dSXzdezGFrqIt5v7h>dW|>h^yXmwySZlGynJF>5)Nlew$mOTe4L7DB&e z?t4(DiFPFy6up2Li-45_Fs^=0XwBxKTQ(Dkd3DV&1vnX*yDD5Eh4ug1O^ri1iVLiW z!>3R~1*fJYv$k3+YWKC0`9-@@ zt+zZ*EU%@Y zLls0Ig^W&Xk9C^!kCyEYT_Kvn)%YYZ9N9Oc+8pRp*&6LTp*`EI6*q0ExlpnAVLJ#Q zb(6#}CV<$3$OKFZ2q&l))hxzHr?O7VK*O-c?<>DzcTBYbK1WhsNEq{-F>AtCuCH&K zA_IRjdJHisEfEBnW6nvh0dSS@yLPlvyhYP0t0lcp6n!YCp05aGiq&>N+P6`i%OUPk zf@4o}Nf)!g9gzYafBxLc{0d$yv8Xp{u%%?}!08OB{-?g@Jb z5KI(VY$}IByoD%If(#2RALUL>k|8ZAc<$)6Sn3|f>754OUbAv=D4=ofLB7r9-@PxH z-MiOfu1%d>LZfAHsii*qg7$z_9vCsH?GW7VIh$i80^OFUMd4ec#mb9XFaIV#Jyd~* z*4U3w#B94%-4OL3-VEi9xHal2q(L0j3?E^dSiUVWYfP+&?8HNE+e`C+zJ&~DKk&Q# z5nF>+0si8oZS~MJ7?1l=(m%3|XyplUP6f%&L1W z<+W*`ABIafc;d%nxK}I{xfwRzzRASRqxrm3KqyZBiEklO6 zUD)1ANhLP%S@)w+>GSH>mz?zRyF+=<_|ot@CZ1K++?sk<%#nq@X=_Y~(ca{03X^C0 zXtJYf8j+V@GJv+>%KI&oyl$Sr(Qtzsub%=sGx%)C@MFBvldE6LPkMM$AlFK{4^nv? zc4zC}`&r61c&tDAQAGGnQV|0phg#~e?4i_kxzrSEhb+~Y35(5|GG0x+PyHFAqHKXd zfmJAXw+*iKrb9dM@9{O>mlV$G?~FCj>M#QFa*^_6i^ZQmjwO&65t0EXK6*-dWJ}~Df$-CElA7f2Ci!yEs^ii-s1=d$ zD8aSef8HQYyW1Z{>+q=g`Rh0Za8SCbcT|TsPK-W1mPSGQF@s5#Oe^CtTw zqHO@VU34@Nl2v6mqS0%yUyQR}*QhbQ7*;#okYY>cAx;BOoDQ>(v71#dzi^HLG6hWI zx@Px-*Qchx;)#yeAo`Tzz8O(Oz(67#OfPz0svq3Ga!>lF(L`)hz(_Rcb+Ia$w=-s! z3`EcOWPpSawl-0_^6Ho#O`X(A%Fy3L#u$pF=g`B4%s)8q8f|vNpNF zZ($um1XIwU!Aw5esrd$GpsZVdD}Ifj?|hIYW$OMtp$c#iaya!T=pD>ZezC}@TK`Vx4T0C`;xfgv#XL-Hy-~lYSgNFw z&INl1?n^bRbPg8s%PtQT60cf_r6z+Osuov#A-8UftCicr0wHSl|>_4 z&Uq1q`G9~#a*Ld2U3f1S3~kmZ^ie|hO^779nf5vAwCys!Df02$6$61zLIJJo*#X(!!aeK_Y6h)Hc%8De`+PbQQu?P4VNqo>l^UJF!LgH zS+}9vo9^h}q1#6pGyn6_hu|UfHEI^g<2YEXs_g+oJab}t`b|2$1s~iKr>ChKE&9aY z*jxV6DCiNxNV@`|2gwm-?BmW%e9GwurOCoIzDtq_(t>U+6n-^`oXpmT<_I5(^V#fs} zK|dPzJTJ~B_onS?boGFCBE&>b;naZ#^=eO0n~1|(BFxe|jKf=6_X)^7WV5meG=DRe z!PCQrpVlcAg34g5JSWI$!7uz&?gW0`vCLoj$93!b)z|&nme{ZPI$R53hKk~E-57421uHaQcL4>uM##w5|FiJ7+w7y};x7e5uuBuhWtucxk@OQ?lTt`KMKPX+Wc$b|R zX!S#%>9T4Ag#mI9i{$FyCmq>>mNC6A6?zAj@=V4#7Mi->cKmk#e2w8rCU@9jaDPkq z@ok`5hvx}~Ap^U%O!$4ZWF;Uuwfwe{Bh!X#p!3;U!uJ}>Yu-RnxkF;aejS_cQB;|j zfJmnN2j=g} zSdm{gf#PF?d%4kIgg~CRO1IxGP*iG1j-KCs`_LEJW8Yk|;YN-1GGU?FOx_PXh*9#k z8?WVTLY1)V=dnn)b*w3JWk)tdb+XptCmtuC_fL;EqhZEtWB!SH|MYBNL}aZWmOH#^ zKe*~F+dNNl$_?u7Mu^G`Ao2+JvK2^q)aDkVA9ti(#C+7mu8iMJx4FsX*S#R9>ZK;? zv)Nh&tgVZKW*C@bP4*SF9tfevij^NvH&LR8g!LXS7vIo%0-bl4p*B>MLC-d{4pyNb zUp6UTQI+R=T2~56C6H$+ej5QnNdN8F$sZJH+&U$=@b7OhMwCe@L*uROx@fC7uF8D26BT4geS9(1&o7*Cm;M4Eq7O{cF3z`mUFdoyL&Yx8kENr zn{6$@-hWD5p1W>;oFNg~83Q)+DIhuU%NO;B7^?-pYYTdmUOCH%uZB$@&|24MD?_;8sTK!d0L1=XR>SBQ8jPTN^iT$goUt^N8>MPu!rMZ;= z8ahYB?s77|8E4Y)-jIC#i(Mk;(8U|6knQrPha-|xYmLa|0C~(WL91L|D2P%$h9F8& z&#Xx2zUl5KYFg-$is++keHewnzPA0seJS{gVJO}=n;PLb$r*Y z5f6k4#xhBNWK(F?C;#_o_~#CS=pmcYJv_<4NK9abK&(iBij{u!_pHuDj?i=jjeqIx zOjQL2A&a@u(EfabQr#(6nCx4->{sec_Q*`?#&VNW?0UhS*Oo$Bk-E|36;aFW@fAS0 zh#@dAMt*BFJvWS?@x9nONNXUIFI^`Br)V1BD5ma?BnGG@@$Z!GRzq+Bs#JHxb+G6p zi`V1OxY23|2jl6NFieP&J6_6^ufIo1#Mg55a+5d-gal|7G`YH7=8QPk29Kt)*~uRH z0v)Pujj6WINK)&F_A8N84x=xTGc>#32ji$zXmcEBxfCyCOg?ICQHgo$be>I!$VT5w zm#AjGNZ)((PX}hNaM7UmfV_)>+DB*?O#=kdXjc%!|ACH)n@?N1a!u zx=kMpA6s#~_Z0)Y5$K*UkfLIH;Q0a7K;2#fbX>{998ty>AdB0B=J643YcNIIH#>bs zmsF9KFJ;rpDzN&S!rK&pu4iT0x$$- zjT!eV-me=&@yQ+M6pb!h%5JBdN*L3I85bA{xO6~;kUElfa^81iy@kT(ki3oq@cx+4%1+E%^DTAyL`XPc~84CL6~O<*6r)0q1lM3u}nT9 z>qOWu?N?$0XJTiq#l`TR4v$gd;p7#M4Gi`#ukx!O@6TR|cR6p!^QPSY#MZ309%-oo zdc+~4EA)kv=E?oM)(`XbWseVc*)h6gyw^NCPw%>Q=g2-%+OOZH^Mm>)mz0Y(SV&h4*0@$~LO6b@Fw#7`H)zJDD(f)=M{yAcYRjVr;r!B{c1acO7 z3=#D_HfOqior*J{T%w#h1<ey!Z8KOk!Ets9lxFuo556tb9 z+syC)dR1Cn9mm0K?gv@z zWL(|%yaWtR)Mpe4ziMHdJ>mfD zvwPJ2#N>6YaTp-_OwrRenwVoZ&**N^_EFT8Sv_afU(Dl>adX*uOZ0%*x0Wa7^L*@J@!Pw;tEpNGnJclcD(P`p9^O1B!I+OnxF0Pc#>Gm>gT5J? zM>D)fFUjcdU;TO!7R5cRmHQX_RYT_XQcR?i>%c|&(SwY^F0Seltd{W>dWtWhq(l*v zD-!>+-yOpNBc-^)IV-rja}<(?!ak%fcL&H!7mpNSaPsFS0eFrh zM%ih|_iVxJEaAqG?^)CQy>7~PA4Mc*zGv}QWXA@h3;S;qj**5c@u&FLa-OTYZ%{MM zjU+R}oqwJQ-v{hYv8Dp*t%(h<$KgbJ;2v$&_O)!m)>C#;liEn4{Xub?Lm$Nx4nE`dyWP%H_CP4VuvJGp^iMr-xR@- z>jt;ye{KTKXh0e#OH!E!nH_$~iD(a@u0Ye}dKh*4jeEuzXE)rOY7%K1HE-n1$l>bo zCd+JY`KxW`wFEI7{V`5zM`mn@j%Rxx)@juFc)O>{6cT9qRo~1nwQ9QS>CvZowh`DM zSPa_#An&QN5K#N<^W@Kr*3IMxbqu+?+O^+wOpD;$9}J>8Zd4ue#m?52Ucl#11-AEG zY6twJeil@{9f#Kn^jrt=%T+Rn_QAFpyI}g0&QsNsou88RHU#q!rw*#rx(3}{^XC9| z&$nyaK<~N$tKD|MSmEWBnO6x?B4QJtrq|=W;7&H1i%7u9pzF3!4Yyg07jor|--vF} z0~zm%>&vT?8eU3 z=SSCzDLW8N&wK^GB zxbwL>93Sd<2)aT9BO|HRRl|p~1-X3e|NJV!^b#x|LJrk8^$K&AH~WK(gw*kJ2f6-P zb*`uv?^S-c-}WTm*S)~r;7rnPz;?>(&px@i4IH&D0%i{wmM^dJA}(yQlxev94&js61a zr88Mn>5mL73>G#aQJ|E3(4K`&CP+XaG&y6*QzhfWY9H#Xn$sk*hgMP&6H+>tnKn&; zXm*E=Z!uWiYJX1O5SnwsRBoPaTAFm0^0AZl+C2?Gac;A1%u0Z;zoE%*s@ zO$WfgJPX54_M({c%xPKGZ^^G}C3{*TPB1V*wdtBP_{5G*B%h-AL+Q;~H(DiwF@@MS zd%lIADsZt!6S96T5DgRQ#iN%meTIhPv`8B{^Z+dGk#FZsJdyaeXgwF`B|2j4LDlPr zp8f{JXITjsN}Z8$F_7Kqa{dI^^0(dQmA3M?5IsplG!-xi*}U*~sU|&>N`VjYkbK4R^{Iz=`@#itH)f~JAGYV0A@iv)k$WXFo7 zF<40hX9=)Ue&3HK-`XnH$jlfD617M@-Z#e@@NrDFER%TV7k{ul<9_DV?y=OJ|)8j9nbl0iCo!ZuQFzV zxpgtLO%#h_cRhzfeDKC>tNAsntICYg_|3;a#7}>`Lhbx#uQ-$36zoi3+eEjfU^=qs zcO4X@9;=KaM$sj-sa(3^jx8XhQ|=Z{Ycc^5IX;OPoRHUx-$Y{exO@r2lx58;PHd@pZsZ-aSLN zepi{i>V{NEQ!qT_JxiH~c7!+6_r?;Xdf=AqyJN!d#vGhHqSX>48$+)j1C2pUqUlO< zlR?MF2Fbz4NRAAk~75T}Mx9o+Jlrx8r+CN>h_H~Qv^MTD6leM`o zQ7u7v3QM-Xzo=yzTX15+)VU+hUSesXE^J2nL^F|~a@=Fr zgL&VsTP3*sDj49h{Tv@EMMJWYZsyOU*fMmpLvLAWP!~M;TVWJ3SSD3{iiM9s%J3o9 z=sMu(XYsFs_(Umb){szC)YdcJVU=*H*bg-~om3283Z)#N9l1$XnxQ@SH%76)O76(L zPCMi#dyfV$_5?qFxfo4vb`i_0OIS{jKk*=*dC86AnxCLC-IoaYBeqP|@$PvRGWj2#vCblwMboZQ@Ko zDs(~!i%`+`uq=gLTN#y8xFbi#?lzfzK(?Etg2f*5Q)E%Y6xRKs7r)yiCB(;D7{6c^ z@g2LVyc}VqN$&=r>k4)k>McWok1*A{(R%ATYcn{iX^q~cpAqENOHAs8tl@Y6E{P&9_K2otY@Aw z|M8(46$lv?J+!6SBhX5t=zhFqOOJ3>lzsbR@Ds(*ig$;M?5coXjp;bNvTLL?By|1W zA#u7zO7DaGe7(&LImViK!g|QnNknMGeJ*p1khpxb&STSt;qfI$v(FQ-L$TbKq?__8 z;*A>MIZr`iSVN>ooI3LYf^(S>RL(IIkwjx~=AVi`ao)r^8fL==*1+*i7FU<9H1w@nH@lSOM}EO)10_kn9a~Pm=bL_Z2E2~T@@W!=N@G< zJuj75*Q%}y;t_2{xi*9PYU+`^;%P%_vyB$V;Z-o_7r%gAtvS78^Mq6ql@1mC7@KbA zxO2@1nVt1eSmM>@%siw7D_}*`5#}()%*Bj~zHS&7ya!?K6%15FKuv5VeWj&C>N$Io zv+l)YQ)o++_LNM*kmb77AWE|zC27NTeVFX_d?VD6qsy^a^$pg+f4kk{r{ug1!NFHr zNQoV5!lSLVudFe{2OT~rpwczgk73-oPm)dSSql!;_YEBy{*wG01zHxlnqErtYUKP9la3AwSQuBQJL9#FiNy_W%uc8=PtFspOuxyQ0HQ6 z@w+L5c`s@cf6{VGL`$I49Tuvn!I2Z+R|58!wJwshuRRpRjkUZe*<|R2spclC#i&i{ zK_V9TU;d14*ejv;rIo>?5wAmDbs%j8LJ~lKWt`EKM`($*VFcEGD?ybW2OI{{^Zl44 z)uqH7;Xg&+1D7?FlLi)SR>oE z8bgj#GfJ9hF@t$L2C0N1>F@?I@7&*JYVEawRc~8Xis*h2nkf-?fQ*s(iBd4K^;wp= z6siiR=Pj*V=q%6jUKoxj$RoejAe;yTUli1{#awCr&z3g7%v5Q4aJzW;Iwyv4|Du!5 z7o($~=NS=x*UIrNBA3n%S|x4m8(OKn;6{p$@>Nn8W2J2Zuv=aG(|~W28Ipx=$heY6f!-R2nlo;eN zUyGnxm|!$_d%p5GTpFo9=MnEMCwz#j!#R`aza6~8RB13L5H0xw=0|76G#&pTP(c{; z@MqFz-_F5aFu&P*2krBgc-gM~!$l(fEUzg-eK`TnWVmIa0#z9U)diN@y`{sF`b zsfJ>*D$TZ|tn~&rHE8HdvPrk)K_I+8TUF1jra56~HR6T_ zze5kQ2^#ct9Eo!Eq1E@?V+EiifLH*aXK+Q@(%aefcxub!UhE?E?uSbwN|MaT)DmVz zVcexR(&$2dw;%n6_lT91b8A-zLot+))>7?A6Wayb-LPF=XZ1^>*&6AKgB@7B$+q z{U~YK&Hd`2qWhqFK*+UQPUP~|ls{9d-QePqefVt|@(Vw6rJ*xrC`BkeNKSeO4;0afJ||T_Eo)TK_JcSS4QPMn z@*g{fy8dZjD*kC-d?IZzH(J%VJtz-)TRyMId>FaaT+2LD?Hcrr<=+kkLm(e%rM_6| zVPsBb)WqIjF=kSj!Z$uEHFWb<{JI5h0N=~q7L+T+dJ{XJwllWuSjBijjjx6g6@OflFmV7H+<}hWUR}}1dkoI-5S2!F>lPg5O?&=urSsi*>LpvjZysc zg}MliB~RoCXhQ{N=Bc(hFVB)Z!iE&Ff?x=eHQ2!#4nZEB1J{o)UJ-63phdmhVA$^F z7|uWle`SE1A@hW2Gz>nO@KiA{k~#`>tPrv=4gL`Vdhofwc0OZ;DJY_!rr{mgGXCbf za@P9cTEGPs#%rTbAO{l<aieWXM=QJ4XHM%4(9^Un`5CM=di(izCx{02UHBky@FQ_bQOB#@5ves+-%gSdbORLrS6P;r?b+mhL(nd315Q z#o2zxk8^X_-CIC8o-c1`{Aux%)U9_zJuXjP;}43v+AKPc28r9!rVBPw2=c0{%`j5&N^=vX0PCE`8g!W_?SU9 zqwci|`DoNF+G@EAc_2B?y%fc7wimn0*16mX6}MaI>YJ>zwhZOi@2J3SR-(al3d}5r zwY682cTUuL0>Ve``(K| zSW})2U3_bIr-_v~vC7=u-6=ee#TuJ!&UP%Lm-x*lc?OC)|2VH>@u`)vX^|ZGGlruB-gBf(nV=6&&-@U#0Q`}?miMZH}!VZIAgf{ka&a< zu;cRR_suC3My`93^&Lq5P_`h=*vGKw$fH1Yt$@gztMA-6K-aO;hTTm$Bq8DHM4mFW z%8#&i;B^%}ob>r1*gPm^I1WF6Ik(p#9=#ClD=^L-yL*d^4EN5f5rbrO8tv@)e!9t1 z7Nqi_m<_45pmt5;GNX=Is@jYEQg!2RQHB8}Z8gyU3qSgN+jTw1PLkMQm~qvJ&4L>o zvqy%WEUwfo9|~+^^CuzrEkrjj;)i_k@Y^Djdpi=c}hwvAVJjg@&MlHlh{Fz!Nq)=tR|(_3L` z7yjvvkvhJD>qkSXUAg^s*h)9POFXMdLq{eP$I|H$r!k*9X4S_+ou^`De zL9t_ey?3NDI*^9F&{m?zNQg|&9g2Sz)~Bvu58i~84#pj3Nv%tP=HT=fEQ`)uy42^i2K!8ghOy1Hi}_qyUp4;a7TBHaKgl%~7f1DMj#SJW4K&$D zMEU-XGuD$(lOEEEL)!qT=&6}Mn@~3d!}ekZMtwoc&KY23logt&`lG+7bu;$<)YNlG zd%m^IpG{A3q)@a!2#FOjugx~8mqI8f7|_sny1^{;D3lH(WQWokU-2IXeL&TBF+h+e zb-;;`JwYOp_S4vR;Ka0g0|a6j4o5`s4Jhk_S*#OWEL^ilFdD&y+Q1}&iYz5iu!M;mircQ9BqUHfm zM>WKlcc>_8eAy7|5wW^bLuJK(h~&qd;kl06bL8(@F*ti$(FRP7I1@CD=ts1`KVrLG z;Jfku+c!fTp!Gzw=-+-3Rez;z8SESurR7}M@iA!Ylg2p{_2iI}UI_tXvhf-)YKc1I zOr!RecB3m(j3JIo#5RDh^{b5y8y%KkYf@Ts;!J`E?OV!c)@YoN&V*R>3N=FXu}QgB z4U00)d~?s4`v4SSduG_2Kfl@MZ^i0~8#v9EN7gaAL;rAJARdcNde)dqS80Yx!a1hQ zpCdT>68LgKdqpFL*KedXH2}7nu+IvIJs?qoq)U*L{fQp9HMVGC%CfV`CG(qhI$gnz`(R{DySKh@9y0_y@|gqDr^NkjqL;XGTp;pm zd8s|v?ons;G5R*p?3DgqSl0N)=L=>LGKHsD3(F_;h6b zgD+V8zer(;g&^aj8hSg^w!E3CH0*d4tQeAljM{pz{*-tGjAGsLb3wOBSk1V)pt+rE z9sN19-^5~+ZkzsUf{_ymK4HSU&`e{$22j-zEBfVORX9iS2^Vtk4a;j`>^S2+e&tSm|zF4syoYlTrxUFZ9Fr2gR~NDXa(HgDdiC z6sR_zPZWfSnW^++goNIps(r@RiaW_rz?2ccIvJul^Hj3Np$B+wRE{R>*XGAUme&;4 z(~6TbEFs9PsA}ifukTNUz7aj`UCyudkz8NPNC$AnBjby^e19heaYBwg_Hh)5IM|1_B zR2(k7V37fltGyf8=s9kBgMrAlhfjV72_>L(DdZPsh6Eq;Ld8!Ob}Ara5j=w%6w(fB z*jh~|j9pzSdb5dv;iJDVlJ<=90+P8Capx}tZ{Gl#jvTJ3xn%Q$fexQOL5ixOOmueYc(So0He8owU1=Nji5jx&9Npz%wnBJPfyLXpST zygKeiG>^W%qxeF{qD#;i(+hQm{GyVndEoDut<@aba#ut;d2a#-QdA02&Mjrbm$8wwqt%(B|KG)&56_6yOAC74S+1 ze18F-Z`>pGvu*!H+VI2o<@2i(D&~RrlJ-N!s2hmeVWfh`6InJi?q?Y1TwN5TcHD7N z)d*gJ>grzMKjdR&)|87w1r@yxJx&sm3As#jW`%oj>dnUnhBLy4lquuzCOnXgTDBu+_|+gQbwW#T}5yC67#PKZ-1OopFiD_@pRV|{&4;F zVg47yvc&c`^ig6V&gVpMt#wFHN8;#Kc+8Qfo3@4%HBoncHNpegO|q*HzS%O7FMbBk z?4x}4AcIW0OnF6YC)2PbeN_b4yJF*H_(j=F;>G=S@GPon5B|&KTB+sAjv59Z}#u8pUNajuGbtBr&gnS z01JR3_-A^kuGlB9Gh-;>q^SD+6A(io-|f%$u6Hq$IAtXvcsGS0o9wF^L{Ic$3X-+j zmAuoB@d68zv>}jI-74gMXqGheB!=|V)GjCi6AEVkA(}khq5#NM>(;QrOtr`TbQDO0 z4Lt-~(mnfC#`T_?C?V7`;}@SRomgwfE<)eYIaEtuCbJ+}4M}S(XNFQ~(?uf;B7!d^ zm+meXk6E9Ebe2hu5S8L?V1@d@22nxJhYy@`PKK7`WA!r{yqGFZ)Zh(m>iO~KGf|ru z=8`k2gA-4LJa1He{n9I|`O<^@Kz7GsKS%Tf_IwMMgg+T4CiuwEtlgCpq|EKmGgLV8 zPRPuwSGO*EU0lp1T_oO^g%}gLnl?CbtE2vw&^yYPIKzxZgS-xoEjsGe`8e#Jt5^*> z-wq@~uJGRP@4&tyiVB54JCmG*GvK=!O|LPygy~Wo#4V0j9c-WJ9lhMGC#Qf!Mg${R z@#8Dv<|)g8-=?1&3Y!WraHOsF$o#(V2R*NRjul`!1F zDvac3c5u5i`|_PX*Uw2vc99xvP$yu>y&XQ*aMUqgCs|z!1>pD-_Ql<&&|!qC@Abm4 z?k82=FS}A_6WM3P6&>p0d0>~YE}Ai}W51adDnCjivonmG2xHxNk!?G%D}oI&7xGqV zt6&~2iuxU^xo~_(*Veh_a&7oCR`#VcZ01C^bH50e7)QG8_JrvhzUE6^L71AaQD;?* zpGkHGyeP~V4<|Nf&X!cafTHjA2Sphj`^?f2ND?e8J2`#y2TT{h=q>%&ii_QH~DALKQSmkG)P zp2Bx;;G-|=bGPLa1;H*uM;Iu)@3cf*?DwK2>?R0Q?z#pcXLDO#D^4V8#JG78HvtvS zxQA$XNKuukOVzk*m!C354_!1km)5*goG9Y+n`NPtjuBfK5HJx4i=s&puT0u)-{8}d zmpECSfLW(^?)rQ@9Z5&_PUnZ}_tVcQ>)Plw@eJKq>UWP{6D@sRw@n>Jn%H9nUOn3; z;MGg7!bGH-VLg>5#KkdNVXW8_#gtyMa6O$~+3u(hAV8cH4{q1X1<>9dnN!8j4Fiiw zS3xg_hF|}rG7_6W=Xx^e40s&l;--e+d}CMvA+XV{wDUpjzr`IKh`(Ks-9{t-pDci& zQ3uy+wBM|-uu*?H7EkKSTZuf}N!xxqd7&Lar2kRR#6?#PqSn9J`~k798(tG%#UZCv zA4lhbo}4kyf4cEhKNuuGP+!RR{!EK2oxKLn{J&RBaD*2(Jzk^} zRZJ$_P(Lg;lheyYHQO3h?oI*RNE|HH9tkh-14qi4NxKJMkXp(pG&Ydn4r>Dg`fA7p z-$jo7s(LB=Uy-ro6s;sR;nZGDyk_@fThw~Zw2u9vUR;(Bq&aOj1ourT5VWIJ*^2dQt>rILun+86=WE1ioC3Jc#m)iyVl(PKX?00n~=yL0D96 z36_=WnnxYl>Ferx(WHcs||j{j;TiLo;;W+sGikR`58 z{Toc7Wx+loez^g^`jVk|>EjS zA8^szW>#W^-S^*Srmm;4Me90xiIcwqyeRbK*;I7`i+|M-vXw#pdgp+bmPj-Whm>2v z@Ae&mL`~9%LP>~TUZI9Lt<8To$bc2JiQcYS{r_1PH0X{27mV(B*0T|5Mh>s49diEu z=n@r=(sEsiH^I=&k%QsAK>|&wO39VZiy7HQ^IpBn`ja0rus-$B`uGy|e;%b|r6fy& zY3Htdih=X~oRDt!BgyX0&xZF4-*BWW6BIQ6F7v-arhk4EWs$YMs7?&B{tdQkcc)V6 zPg9)!&jkSdfLZ<~6cF-^aQ!QG03Hk}V*kAFRw`b(RLDBUOh3RmV>n~4u^z^7ZI=N< z+>`;w4vitE8@)$mD^y#PRQX{ud43Z=fXp!ZMNGMS1R@5j7H|!8p*?`rZmB<7->izT z@O7#%U?Ra|L#?RLui>eq)32_?t1x>0f6wNBuJ{NfdZELE^YwOGAG5RdktX=FpfTKHKGyL_Cpfs_2t6dVxu_o@uEFX{X%dhT|o z*+QTAcO&d}Pq!)#ADtfJt*SSGco%&j+(lv8-KZ_HS^N2U9K!83G>q-My>cSId+cs5 zPaJN59YfvSsjI}E!cvO9I zw5?#&MH-P+`}@>9`UBYBK10;2aTn&7qhG%6U-NV=Xh4MwmS2XrNSYyK^ z9?l7#@QY4ZwTkus{3g+cPjJu&L#Gp7Af9!OW$q4F3HX3VmqZpS}fb4O1X_dLMx8Go~6LSC5j zkn6qJc;16sD%)%};_@kT{tG>|?6ga-PlMtBS1Ep`9Nq&~Ox?vv1xBHJ=WG22Mgt7D zg;G4_LVY4SJaM(Po+2Fc0_%t3X(lE1+(*a)@P@N4$g=L|riGn5!DLIMI%a`Ht&DXF^}1 zd{xocFll#>p5edSp!E19(G2spGsp@NSIiR?@}hG9r=8O4zHR#$R*D<1O+y{4lWI}+ z6#xk>SZAv>I^sp#_niQYd3Hu}qD0*fcQk^_c#d$`CT@aaxA8UaYlap*w74$&cRBwY zf>9AYU(~Xvw#T#kV1Y+ni{%0iqJ_5?Y$bruGv8c&1;i8x04j8}mc)LFO?cAgSBD!6 zl22(IN(!Iemr#4I#(}0Ojrm>S4th160$N*>0nOyX-{htYb%78i$>}PQ$iA8$?a1Wc z;n);Yz-`OS$Qp3b2!BirK*KfFxVy^NM#C|NtktR*MxG$-xqv=7wjU5*3{r$Cy(77Q z8R~5R`%7}U<4O`OE0=X3LqP#xXD|OtA1(#6B5DjXB0{)rC**PNrpk3urWhX>y5A01;))Yd{+7WX^EB>vuO%;n=+_O+2m-cxKWynqe4W zcE^9dr&5%^%I|J5PH`XQ7>Pno)FtBd74b83q_?2~;dlLpb;4WxyeY5z!r0J41AxfL zA~UxDuBh~*@2PC>0gQ+tu$}nGSWCRt^Mn@Ts41DKE=bu>uX?`(?a^$L5e^7q-%_irFwfiQabz0P zuDlST0@!E{yPqCw1D#fT5F4#Wl4?_^-WDcs`JMk1*8SX1wfX6)SCT8<;1TfU>Zh_2 zP&@WQ+5oTfOUo<#-RN5J1DIdf_goSB5#OT4cE>enm@cftO9ng9-U|TMH2_lyoWH<+ zkVORD>u`IVIg0ePvCVfvazjN+X)tQ$p+BuY!<%^J<$n&D`-q<2kgxCPZm9zzff_Bd zTpu?rGRYDz2*~OD6>L@7c6Yd_7`PZc%t7{fU7#C?PupDyNCRv<3|`uA33W035q$5j zg>;JszkX{OR}P-iS2{k(KYjjOc<6KD#$Xi$W$bkp77ave;N1jDkP{#(jr>GyMvJP- zYuzIEaPMlXg>T)+GX2!&RAXGby2$cpqZ!4(G8IAlm0Lp6}mwWxdbo8J)``kfE%_Vo)@r1b)d zQi)RLv(;ARYS}a+Jr*<<&5q$Hk;7q_D+;b#>WS|PrhxobBqh|KzKF@vB*qo}`~aAa z*u%#<2G#abzhrXqKICiP7=Z*iLyTO0Hrl8tzJQOet_xZMenICG&J=k15lCkf+Xi3)?@lc z7L_c>B`D$K+Vg5f((=}P--^n08w0{d?`h|sE=z< zqSM$HvKE+@15_T?v9gUk+CxB)My3vrdC!L~=2(+jMJ_#d(L-M#IE^~lOmdZ*c??BU za61eL6ILrk9mHd8VD_O8Vy2r6-CObc8h3lxPBL;P_g>JVkB{atVjWyKte*4o=-?YA zCLU5IZ;2+oe1|HhPW~IIl3Xb9!~LX0#Bk$TQ(#AYXla>NEDBPq>q;Sz%_Y5QJi9dO zKsjUpphn4WsT(7Wi}Gt(G;u_T5MvAfA60J|6=nZL4Z|?N&_fLf5<^Rh5`uI{w=_ry zN(zE>4-L`?2uewpbV#S9l$5j*N_WTmy#ta+%zG{Z+SXQ4o>n1Pv%h zIs$ZT5UBh%Ip(-~bzomK=iB4nXhvd*RxX1TgU~k0&HM}-o_<%4 zm%Etzzue`LX=?Enf(K!5qC7bnJuv9~CJGPlJrfNf<*@=;s)DKmfR~;Yx0XUEBt0TAbIlSu$QrU+K>{~0LB9XNxYmeQ+V4I z4pYJC7sFyh2bIklBH%}rC6NOnFy3waiSg5j5&I>lU2+z;G3AhF(BPE6eMzG{yYg#< z(ZAy6ba64qt%8Z746}bN^^v8bQbf+Tt0+1lrw4Is;>-uLPr-5N=*ovZ9%R|a_V_y_ z52Fl-AU`YwuvqOypANQnsS!O)h6;Vq>qmOC{KNu&F*DP+{HfI5@zAG+AKUgsP`|&7 zK}+N!Wuq@3lf1tI=`2+KJN_?-C!+`;+trNllD{GS-zXWz1a69>bk%!INdlpgFKX@T ziXK_ghFLt$DSL?A8&~7dSC4)&=yM@L8wab_y&`H`2f;-#$g?3k&zSRG&>3vl7>2w@NMEK2|6N&omHtp2I zCbLhr3s)7;B(`K6$PYQR$RRL;M%=rhe`3)a%fb-VbCso%7H9YGWL(W2G=GIic?4&# z-*ruzxgpW3U154U_q-M#>R7q3#Pm?<1979Vz-jbVVHlat12FT;jFn^>RF~69BV+we zX5>CnHrUU`xpxP=J6+EZ)xNo!Avf|Nq-&A)IbZdTPI&J%9QVf+q?;7EPxS=^F`{K_ zC9uR4l^PNiffK!+2W;9!i7TsloL)56)8$MY&*^(FE;cbOXsXqL1|p{U7s$NcHuJ*z z!zX{UA0YwO#UJULeXqqx1Tr!khKB5>zET4!h-!q=DEtp`GS?-2^MK$_aLeC7C-+`Y z*~c#|T+?mwvwp5BO?t)3t4IqTN@zJ@sNoF?b5|P=VfQv+R-FZ=$!{Z~y!p-M6Si$5 z0Q{sL>=>=ZlxnRPHt4~LGg5yp9?&Z7-^_Z5;^dV&l>%JeMGK*Kp?TsMA=PDnAhaIY z+?f0{f(82U>-JCU`@;@{+ac|$)%`?6r*VlVUMHWrHZ??ByN&*y%sz&jJ#o`SN$yNw z1e`8rl$rA7lUk?(GuoteDU9F0(p8?dr6h&C9q#x0KQsKY?9y&4QJkEA%0E-4dFkf77klsr^CYjPZ{ z@0FE5o!`r7&{K1o+^G8JVkOb!eELqeE7uWO^#TW>{+FE7T~Jh)hD%h_y_mTF9H^pt zlH}_JVg27+OWU1EKGPvB=-V>Hd>d4`R-ZBcUON9m>^w&nNR188 z4vV`*P{iXor_59d7MS?Xv@J`;(k&3%{B#exl$E+ci|bOLZ)xKQ*6b@F`kH{9`co$T z?{4kZqdHt8(U+z*xzihGAGkmDQi@7uIPNG@vOs*9==#|MJWv zERWmZ!0eF!7 zJYB5AZ;+)ilI-BBeT_2z3N!>cb6#VIiC6zM7GS-^WIHi*{~68;bcPR^5`L%ig(9z{ zk=%XaP>Cy0sSzIbDX%@yJMK-C8b0^g?>XChv6p4Re5Q(XAdjk_ zhf#pTSy`Pm9^+qH`VZbo9!TgV{u`fi`U{Ws$-*zu`Yu~7K}o96&R7mY2X;u^ol)6< zR64cC6LnsTPkri^AVn!D!V21nR(Is08sadfoc!A7G#s^nXnXj{sMYtY=lLq}RyX7& zR7&DpF<;f#v~qK z{hqEy3Bo71=v{Ncxmuxw+WHmS1wHzFKq29R+ux2wpje`GBs@i#_S6OGN`KYy$9BK|hkNudLL-#nZ#&fGegt(Daucq~&A9j2)TQkG# z)5RVg5Roc)8{PNNHS39l6mVsF(c8(Q-;Pa01=sNmVd?uYK%Q#b8;jU#@7VAx{zE_4 ze06ZDT!yC5nE?$J6Jc%p(w!}PTdplOcO?~f)kTUq&0HY9Do?u$lc-n#c1haxj)V;2 zI{WE;1EWgGWsmkTW$@VkfeYHlXfq7)UEDlFN}8eN(U)g`W|YMsGt9Bj?t5Ws zzlyto#fbKvqrV&e3odr;{`@XmW%{rXah|5wk{8WN{BMldB|jK9xd%6m*tsQex$cVP z0e~?O5l<+VJ@jeu=278 z`-7Xi8Zf=-Gz>b!5V(nvs@?}(wHAQMiMKG{ za^T=?7-=s?-60^pb%mT?A$9+JCO7&P%qV)}?svS~D#sa_F4|b-xe|9jX?-<_91;EC)fL$B6fX}*%%PKP^gh8C_NGW+|sRf;QZK+*r#*{+y_ePg`B4Xfg zfuY8-mkwrAI27C{gP}+hpt<#Otstwk4Lzw$GTSgFZVxNSa=ti?hhW*VCT zYX{ynda!zFxS(*dRToFnT({~WMBE7DvpXXX&ikb*NSXXD@M#F|!xc52CUpT<^u603 zz(+@1C;or#QzH!OWuKJL3+Io#k_aPnOARl>O@ES7V&4+E4RIOZzr-}GW@}s;T^bT( zEtq;yT;h3Dux(QF%jVql1_dsj>YUS8R&=MGzOfBkN46WJCR!JId|`~WU&0nQkM zRM;PZxb>dktgL4p#blk}}<=n7rjv{MEY5CExeB7xf|B{T^G$e*wutofg2Oyo29C zt!p-^=+0mWD*)UgjJe;6d8Kk{t)ZuVa#Dnc-G>;~-p@Jj{a)Mku7tpKr#cB+wyZ`o zfd{%2K(K%#(wUg{HI4TRBWdl>cMI`aV*k12cI?H24NDp~!UNx0yN_Y;g~(Oril~s` zMpCC>wJ@f@|EOFu2{hb$dY>*7OWKjn5NUOcK7wF|ZquUGAliefiE* z8R4!8Hqk>jSTw!}(l#uD7Io02n7Y+iHHEutnYV${>+=k;@jiCbv?A@|hoP8`D9e|( zH&stK!{;FcZ&u(hUvS#c+-NEs+7V9!=}pvWM&Vd4ojPy^$+llmPY)vL;h!{Chwa0; ziTJYYsuBiJwzqW)sRehYjZ9eX7$d;AZp#LEBOJ97&$irLP->REVUeAs=B$6H`~EC{ zdp73xh?;b0t-8k{%ZvMSz;;#Rtki`}*n%tci9A@Xa2#&_e2~qqGss#dHAF+PeC>B5 z)WwA7eqX=UmnW3YA3KPOpLT5z1Hj&B$H<&-LG=FnuyoF)Q3z5d^Ihw9?Yq1^=fco&d>zTu*WE9buZEU@1D-P+lB;;E0e&6jcEtE!z+Za5 z5+gS-A4;^jmO-1mINtQjGSz}2 zl(i+VKgnn0wOAiL> zoOR%RG1&q`4Mc;4`+T`3+j@MAZ{eBPNf!!9Z-aVgY;K=hT8bFOxs1 z!foygIfaBHU^JEH-KvP~n3$WQu_+HLt%q8BF|jV}C?|2K1y7=I@6`>b#o_xRO({BPF(p({ z`)DC-&g-s+#e2tyBhwy2d@cs*k$nhEOag>*x%~dCe*~+HiLvpYBGF1B zHzsMiAVa(_4djBAwt%VcVA%*TWyl4W|Gws!2&}(>ZVQD)kmsXcn z`VQ~2;|ATklK2+u#zimxh2gRMWGr$CI86z#{0?}I5rcryL9$!5S}--x3-~ne9w``D z{PEpx)cvlH%K{A_s3_UM+9H1gi+XYk#{|~f+>c`|j!)&*kE;YowBP+V`g}%5f>$9ZEzC71n((j??;3KOSiP zDrS(~iJXp-_78S62Z|Nq7#*b4_0hk`4WKM8%ui=We4l^NYX<`J7|pxCL=!cl9MNf> zMlYW;bOb#aa-xZ712HE>*5i}q@RO6-@hafvLKv{h59N<1!A1}2`Y7mtN6a;Oh`4>J zj4_)1EK08HvFh)4N+=syD-jwoi=8wjJW%PP_V?4n6Ci@d5 zLZY@+qQ5!)=p3NFB7k6vq(h6gY(z<1LW>C9XVEx(`{HS{*fsl!p(F$WV45rfq1pjb zaDHvzSo{cFYf@mw_5!o!JP_g|YsMjiq`}<-IjjsENfbOg#4az3&u>n*pB5U_Q0@Dj zlwsWTY($BlAS&y&nmPI+V&kN`Gvr~!QdDG$vI>EUt`-9eUNZ4^_Y^F4w_h*b9*Va9 z7`|+5^;-1W-7Py^xcoG{-u#E=wfC^cu=|fw4_aaOJ$#>=^T>Yk(EV@PzMW$f3&?uH znTErHRKba_CaDTVmWj1B)tgHbWSpw)@tAX=ZIzh4ox!-4QAmSCc4o-I(nR$713EGM zQ=}g|1%u-Q^mdQ#h;#S*4|?QqkU!iBt>s1DUL29L7;I_D;57}?!#gbHtF_O}4e{Kholc0Y9Er2?m%RE;{@Q7vY^YMaxr>ZHlS1s`7|b9BMN~ zo6SjVN@|RvHp;`einVyuy4Ssq<(#)cJ$ZaZl91 zA+(mXDtJ7NU!mddXx8_c>2NyfoS*7)ORIrII5`_a*|meFZ*Q3gucAZl`2CPiz5e;d z<{DC^1ns_%bKdI#xUt7viri;ml}wein>=)k^!yx!(p<|#4qYruUOb(u^7G@i;%zx6(uiBzQa9nJo1_hFmJS1zeo0LvCpZnOXQOH5cd zvEW;RNqdjOSI^%ZEU^R6^4FV3eQmzGaWV-YCG*z_Jo#yHcD-th-K#2^=q3!H}~t}Cy9z~eFL z;d+Y$Szti3Rd6IGkynadSkq4j*NOpWNHjb|x%>kpH_#-7MS^&eDOMcV50>NAA}`kez+-gx~LAPk54Q63R#-Zx$$E2 zu-FOsTuzUgg9`yz%kAHzg=@a=F2cn)w!Uh$; z)m*=he;mtKyBEvXDM}32Hm!lAovEY-h31h942fO*^+2?UcQ9oZR@=|E@;O=9=GNGC zUv#bUl<+Q}UG7#XKcDY`#%=Sxne*&VJw~Et;rI7e*^%Y2Hf=ls)3^APd!HWR;YA|o z4cktiDkr?uYI)JD`8-$AY#`1Z5}9WGsB|b%{xFnRD1F<;(koR+%8$N+r%tqLxy?4zqREnfz_zv#9K%8!)HK6l&@( zHUqWG01ZmQ9f`L2ST6b#-d8CF>kbHdJ-WhY;Rd}<+{j;vQZUFG%-`tkQk(T*8pBah zEC)mNZ;(gkPjAWvEi-OpUct514j-SxzgHO~*ibuiwr}t8=V|izWr-7ds*UlttDHH- zrpq@z#TEmb-XJyF4uu&PBmU;Mi&1;@((i8Sqt#@k4?6lS-XEk-6$)gm6k?>(121-gTb^q75kM=8?8VrM;gtf z{-hzAb$y{_kYDzgT5fk?cqB{u^@q*a?nt+>pM_~3o^h2Jw`F6tXyqpj>EBMtUuivj zQ-Atz+<#spT^GS6QR^Sf6w8x6A4>N66xm%U5iq!~rkq|)2D$e*Pv_OF**BWQR4`7k zpCZ9>G`BB7aDR>kJz?gcyB_{PhqE#FfafDIlz|+5Fi3(5%vXdcY!1nB|c7%kv z{f~|hO!}ly?;wejt$!bL8W-g%f_3?TFz@R{;@I6qVHg8iLaFsw4s3KzPPH~)WmZ`_ zlsgwG{X(;YwK&;({u{>6tWI~Eg)82T#n!lqs!i7$dT6?s&tp=fUm9$-)9vqnr|@q6 zO>@vuue1m!*I4np^)ec?Z=5Gtc_!I*3j=TUd4s=PC-(qn>wF?}VOIpHznpd>3cU_&&{{u|3v(WcPquIhBqVge=(Qv!6D5u@>blonK zVbyex<&3KMRe6Z9mW64&>^+wtNW+BrPzUQwz*C%hm-e?CKP?R^Es_}woA!H{_}xHW zO)P`K&q6IJ{rWwHY?AOrxc{?vjjq}g=-I8VbO-Zp#nU7|M5Ih09L)3vA}4w`v45qn zuyiP8-$y-+op8+j+Fc*^4QQP+Hf+Uj+*>N?fmc6qt&K)vkq*}&LNz{=7@|ogN&gP+ zUsG_n{xw)NggKu$5KZ2bl9lQ137;{>GRg_FT!b6K<@mW)aODbmg#f$;mUQp^>oIX2 zF73+`%3#)G{F~gi?!c;_=mdU|(qCJIL-@r8MlvN;O4E(&4zZVc1{(zJ4K#4P=Y2=a z1%IR-V^0l8p&A3CX>3O}zl!JbNpK~p^hMLdM`5O40QO26U25ln&S{QwlP~KDc71q#4)FlBy&Jy>)h=sYzlH;~}@8~;SsC8G^q#c%+aW7e;e4Jen2FtdY zHIxajUZ}IjAzkF&Eu%rAr4miH8O?je;L9Xno~KEZ%sp?a^w5iJ6p}+*EmY6wzV=Zw z!Y=Od>kCs0jjepf)b^Exl+!rB&*AS^?7y+3)lm<(?OtIIMAB_jq6@TW&}>JGrjhXAK< z23UQh#Pgr_6Wm^agcOINVPzm}vgA%5a}m0fv%G)Do`W~Ne8V&I$aHF~X0Rr+;y z9X+Q7Gbl8rhA|KIR|OY7`3aeO4+y?7dO;irZtI4Fx{yUGqQ}oQ7SX8M^b`|&C7&!U z*scHg5@EsXb)v&PjEmyOtS1Q2#*5`;g3_Yv5qm8MM{I;eeEU+pM8Wl|Z*n0?z16qs zgCTJ}VWI9MCoRN^o)sxQ$QL?uEWh@8uhXxD9Xl} zEq3jEn?8EV(2E_}O$&s*JP+Y66M$_z$twU0W?-b_5vZO4^ za4O950cIoAl7Df6{p^ipcDDeq;&8LH#7b*QwL((2xVB;bb%-ESNUXt)eXz68tVS(x zmCI@Ho~|{Zw2)KBg3^98+o(YVz5fH#9|A~&lcjoD;*#pWi({)(WVscud6$i=wV;W9 ze1I%oJyGHFLjQWAeJs03(a5Oz5Q2dM4E@W)VbW?FZ2&jl%(LvTrAGB9_T^3rI3iJt z=Jo^TAJ}GatO3QUBIC%+E(tFufy~z37OzYRIfYq1;+TkBk%jM3K=iBfv<@5peCH{2 zsc#*_>2?PfClNI)9tePd%B7cn)ubf?h*Zv@TR;I@+W|N|caHx(%_TdtLVWL-EGo|h zM6GeOA5T})S- zl|;6M(*4Ml4*f9_&n${V9UOqa=S+m$$j=Cgd73Zrd!4fshg1MwqF!n=Gdsg&=0m$p znN(7~Ka)Q^46S5c+BG~|1B7NN(t5}Z52#p{gP<6@-C~%ZrJQ`PPWv?TzM6Nap zi}~G95zsb;eLvcOauCMdUy3ez_s{6)m+c?@0dJUtV;w$q2i+XmlK*V^P};3VnY3vS z?IcMA#c&qiSIOGmG~M38c2DegG|jiZ(z33oO?WIQ(+Q{S%M05nZf267y4UQcAh>VlihEHy^anE>6qCj=>f_qD+vQ0ICb zLi+VKbIgG!)*C;g&8CuWu1}i|iWeGBA16M}uTddFB|di9aOgMaj-swBu${^;1dH5C z1=Cdu`2!Z%RVW(FNYqmqxP!4{&bf3ArMXQfUq7!wpD57KFC?X7KucDpFK;=2Wlz^b z^-ZHaVhsEy68Q_(hWym)kN#>rwd?hp-t*b2ko(E&xO4~|8*B2Iwfuy=I{YL9epb7VXlaHZwfgOs(aynMq3P!Ihhkuy#YWB=6&?)_GCivAQO4Vv1 zK*%#qK&|LcPt$Y#LRYe+zZdS_huJm_W_thij0^o9mhy%|nOaEodkV}@7K6yai z%kNas_;cW#o!g73dUc&OClFu*6C14YEV)#5=$mY24zRy@3q=4~8dcJo?&Z*q z4wBjJ0eh#5ugOQvhf{s0B|ET-v7aGtVG|Kb2HNG zjx%_*#@^Zqzloup525vtxoR}r{~RX*6jE^iuX~{7?}sd;q1W*_gOr|yzb{mLE(I){ zLam&Hiy761JL5;Zc88vGV~q$Zg++pl=MNucQbPr6{8m)Tkr9sQ#YD@LrUs4R0A}Ot zXgp8k)onL|tCl!SCFQi;N3t`-@|;aYzeN)&!|hsA)7e_Y0|P#Shw_oK_Fu(RGVu`EyrXCM{`w2tUo;h4C4mE}xd9w98Bq zZ!#@}iqsd2cqKRD-VAZlWq*EgIESf*)kINqwP`z{<>!YgsVhYeWg3jBc5$MOvGa4? zIy-m{P*WUI3w|7wzcw7L0mSR!o5}Uo;hFe+(YT%vS zF$%G;HanXDh{Je}0!`xDGy3tQYVayci-461aL)96ZvCXE#irD6nh!O6bi7FfH%e~H zx33Q_D0uq3^cTJ5FR$rxL=wkBIBBxg-jeM5TZHBE3Q%s1eu-JDG7<~?m<57cB**jY zU)e98qCOHR7{VXQqU9B*@l&_&9^!40th^ofx_(P+ogwZQmBhXM;HK9HwpXCB>CTxk zO#Q?`tHt}C52f>&Eas`XV>pHsqkwqhyTW_E!S6J)8{KxRE>S-HF0lR>0-yJ*py`@L zB67PmQKWMaAF5xCj*rnJ5kODB+~LA*z<234Nvv3b@IH}vtuS_o4k>S|do|?CGPEXa+PdTfo9Hq0H)fm=M%q%SXXM*B{N;Ok^QNZ zlPD4>x)*fq$9&HtREE1U6~m)q?4|n@1LQ<){}=6JqQl-2XI3DQ?y$B+=VF~NfBRVR z#@Yg+0+WdawRUEl*(G889!{aV-J4|S2TSSnEMg@CpNkq@q9K)H?TS+3J{Vf~#g&rB~*{0fa5i&~;}e%}c< zBkv|!PZY;I7%SCl?aWs-bd&YUM&x_z{@dY7N-Zt5KYm`bk>8|oBVcQ7L7>Ua@KoQf zjNk68hGc0deLlEkC;1v2r;Y<2XXy(~+EX5qqz`UaXUxYhj&`o!AGF&COPMnWnRPs4 z?g}++^*YV}_dz$E%$_}=pLl?rWvQ20i5|@j23F9okT-^j+{UJY@mb+f`?vew536iZ zxB8G6$3AE^JBTZwn|$ZTy7cCS6ip`>!q^0nY~P8*t9A0Oq??uZ`@|R2?DpDSU~?36 z-&{gLAVg+wqT}NPq;%1l49D;pI(kY0)+j`WtGo=HRS--75+QDlU6-5fkWbu{HjK>- z38K@IxMqhC1cdAdS|1-Zq?lp=5@*Iqp;p2|dJM(@`5t5PydU~EQc?yeG7*MXgM)WC zCx`8{?;NL#0|zBh55&;qM(hNXdq(vLjec?|*e79^kFziREQKhNa+!iCAm$AWO&jA= zxdHE6%)8M`f<}xRtdCr-kW?9ZWw6nR1iQP9DByyj*- z$+=0&A$DoU8%2E@S(yYc>%y%L48T}_Ah1>ZRR`x;RanB>@9xIwrYi`zPKDGZvzPq4 z;S)Vlk9cz0hjS1K0{#%iQasi@=^3 z2iC3#_n#C&X9G#c*=5G8qld#pUw}eZ^YUckH?fwLIEvtDsRogtWwFk+0ywtHzqwxD zdwN+lmJ_lGpCf&L!&p6fY`>$F{6qH1f=^uwgRTrIm+PpS_;nE{M#pb-P6LTUWACX; zgqL4WlBkz(E&ExJ@RFDXps4zp@i`6fsj6e=LvwTiavfR;XT^=Ug!}0{i~SvvWHFHR z;U_wUDp(~(APw8bNXQr@%EJJK^PE!~voM`W{}$t|}%fB3M2$Lums9 z7gA)v>ijv&OxC|wt9yWA(rfe(GE}w7yYe>_`ns?}@T+HUJtV5a^m01b<2TTm4Rkd5 z!CtlJEB`A9YFJ2AOTYVHE-^YD{l(lEe~oB9G2pLJp!$3N^HaAdutk;p{8U_4zcPp5 z-GNyet$@jbkK3!k5W{K2&tc5Kr?J56pX1bs&i9F01J3!uz#8#p2e)hl(-tD9TDZKg z(QbxzRTwzfX8il?_DcN&d+>C&tbUPU9aEq8!f@2M?9qtL?ys68;Y>4dIK^!_nyrGzTE zd0!}K9~<1SWjA>|W{*UuiE7IbzZr2;faqn?W?>|!J5$GrS#!S7adIEfv>?!070eSN{NX%NRvmq=}nq<5+WIAVIm3LBGvsn5Xr=`Xp>1v2SQcI)WqH zc>ni|bd_nmZ5^@y=CgWtX>t6@Za{KR%n|NB`EM&0rb_}1P?s_VG?R!JK`z*2!rB=U z*}2~z{%Sghxi%*ywVXej(+_#cA88otSfag{q+q1o-L5r<>I#ri{qG1JZVCn2Jqkeb zNNO(Y|29V+-m8eGnh)Vlw1v&7V;$EYe&yu+}o}z*4sQ@%p~Rj@r!B+tPa^~;`Z!axO9`; z0@ERc#)=@~Q7MdEtn0YqJFOXmI!|ro0ciqO%d0xdVGV#beNv?UJ_|ng`qQ&IfnJFS zLzFjxg{l^tSqIcc`m0%IrA>nFoCdTm9cZ0ohf+n0qNxSn6cgyx6WtSWj~jF6F&3@^ zTye3kqJUYTp*C%PI@hf9(ZPUP0S34C%4B1G6BHv{LNSRr>@3$w~Wk#{#=H_iv zFJrlG(5fHs>MXloZhO8v*_xot#w-z&%DMxN%GGSy7ps7VEm+|}@FZFAbP%H{uvzw7 z*u}~Ab`UR+acX(%MS)zaGRp(Tdtfyc(8hrF=wkm51x8vyw^o97a5sm10JDLM6xC~1-4e2Y&^aAxGc z++^C^j^HY+YD#&pt!bD3ZN+$|@EP*n!=KsRfBN%{Bpx$_-w|~t#QxL;JS}?JLA$aM z7KgS5KNvzSF=Ok1{AX~6%SntDW_k$SX%==P+^u*-JK}!b+ewuFio=8^rKwUmPE^qT zA}s{pLqQ-Pzc)`I;Zv$WX=e05@|VP?5gv!N6)JHC*H3A5Uq9HOLn4p1U6+Lg#<~?nZg`mh4k$XRF{0g6z+zH;BcguIHX2!nLfas z#ML-;B*3V|Buo)Z0vSQ3+4nEi3{y!MD{&j(1IEhFd~Pxf~!}PxQB+0 z)D>xy^8LRorfCBNqK^|GX*!g8t@x!}E1zmBI@iFIB9&12OLyZ0#~1eX7vKS(LwE2slkcW%ZvgX9vs?%hn^DkEW_a2JMN9?3Qu+1I=5Yg zR8g;Dr>|&3t~f1{rgxo`y`(6FAIG0U;?UT1Jm-^zf zw?tuexaOB)RiSh|?r4uyjO|Db0es~<)@xTQew^5sj+wi{F1TQv4M*&@ilFu*4=%HmsC8ny5`-V#AS>>3I;SOhP1bM z`VD=Hur@`B2B*rnZHG_HzNhf%mg@orJPHn$vf4Rm(L6MzmE>6Irr-dh;V_hQ+n-FGmP$+wl^Q_JbFMNV$69$S3x56YEmq}7iR zrQizZ0@7TCmpvtn^#}l}gEnkUuO;S`pbZ@&%Cwu2Nn9L-f7XVc_M7)rT6+D>&+ui| zOYFdUTB5)7Ip`9O6!U;NhRsEv>NPr7&e++_ujswkj6%PKhHA_CA44LU1^G-6Kj0>j`C~JJ_eS^y0%f) z!5%Qn)8&2wG5bN2Rt!WDCg;yWm+;eMvOTETxnvI>z`BUgVQi9R?zh*kfok&oeq`4` zKH>c*xdJ+JF>n4@Dj(Dnqg$n?i+F_Rscu_|aJ62CNhEPvTLZqXwTe@Fh<*H&5! zH(Z{uMm&m?ms-24$rC5X^ zxB2`%WD25#&_8cay+>HT6r_}2V|&U`**#sc`5}$IKDynLctz!C2qa12i__=GBuSed zu1UW;-4QJUy^+>H(0C7|G#q)dyO6d`JBpfO0(g#{t!K1mFFa$x=CvF@7TruWq1Fi44tR)086kkK&FOOd94XK+fg_U|v3cqej*61F1^%5xxv*TtPo7^Mh;9aUej zuI12*Zons*2a@F)iT+JF2pHC;m6f$;11Zmv7|wDynvrn3B`IN$sF&(Uk+v844CK$; z^`!v2p+FsjPJoei(Q{SHe+(j{v6`5q0R+^9n(Zik3lW@G%<{i@VVS$L&6g=o9u&@+ zzIRL6E+n9kAx43)28M4JU{4Yi=>1=*f%Ad)#_(Fz?CQK20zk+xH(iTXYQOl+^yC;z za#UA@WFSMJUV!HY{?hDoV`XcnQ>H*h{6r(gYd(T|Wc__bztgvSS2yjU)oJxcNSf#+nLS8sxAO|=PTsx_tIHmw$^>Eajj`aA8 zai7SQ;|3)l5Z<6~$^aI|gdR;v*pY(eze)p6a~bOI7*Vi!VD$K}q#)5&(dsb*P?14a zz#|69b=UvyDvf{eH}RU|K%=Hi7La};YxC>KP+;`}emU+FHKff-VB?mE37A z%S6oa@Ihd?(^6ZH7;8(L(ah1m*28DR=FITTx$_6LxSGa;Noo8tK>ZYS4+4g-96;TS z07)tC2FnzYcuCe=!(;W%klarEiZ8z#a(Pz-)6y^Y}6lg-fnEoIPB?(Wqf;g z9uCCKG9YBG>C7@(u33WdZ_QLuA%=4ffH1`v&dhcz?F6!4o>?XqI_eR{!HuAq{}#aJ z*TsLZ@s-NE)}smC0hk3|J-OuP04t3g`P!vdI+~}H0Tz8ET0^PbKP7)A^1H=wJR+D2 zH4UWc!i`Ng9fj;jOEks8(_tXW@e>!{2Tg3nuyf`$WVzkwm+#L}AF4HTogNe;9Fdx3 zMzod_EO+1dIVn24V_ET`W=YBgsZ#i?Ak1#@=BraE7T$aCJ|yX#i2YFvYv0tdV&PH# zu^c(f|HJJTP>C}6Gy&OIXJX&JK)unNK1WMpbl+(tyuv00V2?)}_=h9Y@56F{I$JZ> zWv*oAr5KmM)vE8&s0c#&lTPYupug5mBN0=PVYs7$lo-)S^Wg5C;($&NyI0-xqTcZ{ z;0r!4__b!G#GGhw%>f8{adiH%kKGc)&`F6!XlL(Zq1TuF1!@u}(gT3btu9X(?f5sy zQBN^(_ND3NqK}lDO0%ND5Ozy9YEDfWB3N0t#|P+mYs;1!fcxWGn0?`wM}=e$;@LA9#4D*2*9#p%O{$qs?CS!d@rrq<71Z zqg`>`2BP*gVR`USQHvxU6zH+Jj+rqb&+2Mz0?rqbO}KNxc32a1lMlz}v0Rzk4POYbzES&|+Odr#XO4I*-(X@@)HKcl|y|MAm6IKS}h zt7EE^FtwWCyW5KXn%-Ev6)JwkYkn9UWtpPsw_QW$asLJdqG_KUZ$@?_9H?b>=7_4a zV^cTUuB;cD>?7;~ZZHwQB)~10yuiyQ*1#H|uHsFQtA=3zP;ruOTNyE=u! z#fEi33jh2i?_k+d1gwpN zyPVRWW`_I~1tmgzQ?*2tn2=VaQ-|w>eE{LmD*9Oh)?E)1G;lmt&ysracAqTUg(l2y zIQ2NRG8Xk#2FNKfp{`p`6oK*8BCdX%$Xz*)CHDUyd-vp_|L>D8GYVM61&tN=>TY3W zj>&fc7S|Tm=68+!qdIRI@F7X9`JBE_4n>jQ;9sP7dPursf;D>*AbsMmFdlx70A zqYy5-a2!{<_Kk5X322JoS85QpmIg#0YC!F5IVCb2afzVI`ov@MjNh&6ia5oOcJ&56#i7exz-f?KX1Rs?j0=-{2!i>D!^scuaj+ef zz?&;2Vy>mNe?Yp$R-Eg|`lSysMhnpu)KUAl+d4e<c5_iW0Jme3=hZM1=61t zFQeo`B>V5oJ8tj#XW~6(84wYUYYny}fcb?Iqo;7TzWtMwYpeq$rj1Dud-u15L8lFy z(!1R7V>QHN5Ii_N9DNhN>jyCdR2xL5&iDrRMy!GtYtKS9ryNH2mN{mQ&I|w(FRuHMwfpZ;IzpJ-;4LE%tA2+)^ra=jHvb+H6)Sm$=UUmyZ8LcWqk^U}$ zSe6AEUn=`WHDL%I&MN$j)h9~^kT>{})&8=0@VIgup#3tl1bYi2Q>qtIf061XdafPl z5O5$eb>mD|nRd6A0-vpP1H$9tA4!BA`jq8eL8-?p(yvMpR##+0l^BrQPe2qA8XDt? zUU630vc$DwM`3W{&N`ub&Y8iFtsL=8oKy;c!18ZP7yXXY53%g;)w2w~hy@>a`!fkn z-L5h)i2na_8g=Lr2^6V9RbjNuwdZ&3lKR4Z`6)1P!mx$8l=J0bU=8L1K8Cm9w=57O z#n;Ia^{s~z7%IRo1mD~jFDBo!1ol2GRF5ohcusZ>dQ^-(k0*+PhVI|JM)(Y@4Mi~M z%%eBL^*3+Qtdj0kw&X>^k|<;Z@}k0=2p9?_XHJ!#=7ztgEUz#D$gSqBQR4|5&^ot; z1l_%CKBh|H1YU!oj&00iSLd_jGv-}k6A`h%*w8X@6aF(4Y72Dl55vr#0EfC~N=aKf z7LkCqAeKLyHVrKP{LMwFGA+D%vbTDrgApom^Ja2O!=+6WT0&{cna2C_apN;1#gC8k znd^yw65nQGNsOsbZhv4XD_CNo>7K`sfh^4kY_a;E!>W`8VC4EO)q(t@*J?rv7M`Wu zy0CJxGk;k^U#)*kzQC5@o`CJ41231mTW@@5v^+AtYn&4B-gHq>W6;LlEHp`j+~RO| z36kk2G9tK;yKfu@0o#qU{mADPzeDX1Cn~QX>x7!zQsOgrx}o?E`CLqax8`0b^^OR1 zyfs?Uys^0k!x<(kyj%sVZtshyYG55;ZniH$C2}UqEV9QZ3S;{JxO(fjD!Zs_muAx` z-5?;1be9rRB3%-j?vRvjX(gpY1f>Ne1(fdYX45HMZa7Py_x-+e&R_m4Hr%n+Tyu_b z4WKEMq!w|@dF@m5ZTydN8dp*AST7t=8sW3^+FRd_h%2PT3?_OAKJe9s!WRSkNgVpe z6lf)AwG^uw^-HI>`Q5Fo>tskK2g796_1bky1*5iAZ<13AcvxROdxUr~15`G4Foe(H zD{m`Xue0!8Vgb9G9`+bgYRBp3K&R8+)BR{gnyJKJDeiN2-TN;_ks?1#abxB}RWm>j;s+IjNoTA*K4b%_vW2(hq>w(S^{*c# z0Z&XoO0<5=q1bW|aSX>1(qhfF*5(WdLiT#%vA0TiXnIRY@y>px754h_?t;;vNTBV5MWvxoK@y8`_YauCtBkjTsGO@;yR$>j&adU_ZFTx; zxN?&y5AeOO&DIe!ycz7he%`fdepbn!tFi8R_U0h~$&))JmeY{QTD6+kp_-GvNIftn znpBF^J>ic_ob(Uhi}Yl8^gg9T3k-nU&bKn1#}60kCH$UV9+u3+kZQU}u)uEB)UJ*m z=S9-CDm{XHisXDx`xXbn_>j^9zEP z+Sx)=r4fvj#;WWjSstTM}Gd{7nE4)72 z!?AV&AK7QLb79sg5cphWrAb>3fc#md6x?#srdK-6eMm80%+~b}T_OCY*9lmOg_Ujh z8BZ;GO$X;r!ny-b4gZ~E6lF{S%c$0RBqxtl=y|l*`8A9sR1IXcnxkgs8xy_}7awY0 zY+NYu*w@f%3wS~ycBwr;$Zq51g6r&Od@-A6u8LKB(l8%2 z?eJD3VOaONXgW@kK5?Uu&~x4BCHRhV8aH#}M)DJ6N!y-n4GnV*_z8aw5M$ zu51za2>E!bKBTD_tNK0xWF#arkr$f&#_x>KlYWql@)~LhY2tCDT>ra)S*674EZMr0x% z42`FDC->i-tltgwOS5$k*W_gMNG72co#%svgik=5|kd(@jRGa+b_}fJBn|6Deb+JZ|G38^)!XuE2G>q z`&FA}(P?}qEKN4t?9;+`$HLrz+b5=v7aGr4;kWxTI^AC=s`wx0x6=WwvD#E|7+Yh( zvv&Y|S9NbC*87*Hw5htn8SrJ+UVNMKr+b@bI&y?9tM(pM^W66U;~vt0z^na%R8DBU z^T2xMk3=8bv#A#;YR`zP8Q9of3}IXzuh16fbmr($DFTByfF)rffn*PD1LXIwUe~zk zlMk%)!_7;8O44RR6xrHR0@`TKHXWL$|@V<`JetRHbhinAD z#7$yRzl>qdAV>nG<`^)j+lW7ILq%+30Emx_#9HPJ-Ipp1kqeLYqCqtSAv$`Ixk#R_ z3_3H`oYT#dwO=A(_J-3s`->txAF+RGl?jC05=h4il~HewB#Qf-Cel8@-z8MShBE|8 zD+^;OY3=2oW(pnouvqttiEtMi(^b8BqOsJ(<#c-F26BAi@@T)gtn+Vxj{a~55YhsM z{(w(qRZisyP?cl2l0urPG_ekGvTI{zf>oNVT_|k;6sV=H#DX7Tn%H|l692$yxT)h5 zyx3@Rgdu@q$~(Q{ue_7L-b^L8oWYa-;L&RqUQv;|9n>oK-25p6epG-2AXI#76%3(a zZcCt*QWJ6CdZR}{uPYq(T3LC^*ZoaevHRa%|C$k2!&@S(Y)t#zi{`HUdx{lHD2G_f?pD&=aiu!27QoC`%p;1iarK zIyMi^S_Ct{4dR~{`~hk$&&O|~nAMNS&RZ1G{(a~F^hW<0wm@2%0r5NOBJ2n1rm0fh z{tWVDqkjX7|GqCd&~aJAClUD{POqr|idt@~ED%F5I~1tq-izK*4_Vi7bZ=Pij27`* z^b+n(?mpRDs7HLPm`Jyk@#lX&=r<=4{B|gxN@QH4Ctkph(p4Oq2{h86&rhvgs>7PY z+Y9}FU#9;q$nalV`iHH-IeA8f?<5~Jgmr6^|H=aYHYhj<@ZFy4>68+`__v1smi=p3 zoBTS(da02fOTu+fvFM;z9j2k-rRVO8$!SoVBzbr6ubh2U^Tg*rk*5Q`Uj0$fp1av& z23PZkJADuI1`+q~uRwF=x#AwKo?F8I-kJZsLBSAgpnwJ4Ri%slwD|UM<@dlQ^k3I| zR35kl@{I#Oyaj(y#fs$oPQ}Vw6PYTUK;Vo^E&2@X9llvM!`WgA z$mqDAeukoJezWLXH_Cl#87&GRiZH#I;T#EN;Qo-rp_R-MlJ9^ToPuy0&2odf9nklP z(boC%j$6%@;amGV5Y7VT_S);oXP}6itTd6j1ybKRYBfx(4XtnZ6_CXrZ*%Vw^v?(R z9)AJK+*H;rK=s)Dz2=_kZn#;7=Sf;C=5EElItI{sH%L5V`c_I34Q&KKtXX5P-tR10bYrpb~tg(VYc^pv9D%X~()R zNjmx?-=1_t;+2Z;yLTVEP|d_{x?kM22P2<@&m-)X#aIgtay2F@A@m0u_c<^Wg2pZ? zbcp-pD2|*j;zbHums6hG7?4_(yuCVdvSuG&QTOTz0fSxqqosOhT3{O8<~o^jWCASs z>b-%@P`AIN2|b!%P>OsNZw2TKwX@s($~MBIj+VXrNSbvYACEnNuZ=Y_?T#g{HS35- z-v)9%Im?06O_4u*1kJA(ffs}mG^g(jTp7tGcs3MT2!J`SZ8wrO!1QtD2vxTkbD`UH z(Avg=bDJtCi;9s@f2nudvVK+%Jesdl9?~^=dswIU77>uLxN)dOlVAH^XtQY)pj_;X zG3qqo0dLcX>U=zb2mqO#h$3LzxdLTg3@P_3Fm0HUMBa#p992wtWa*UxY?jW@*~`jA zW6zyYdU@v3vy~Q~GvU+LEL3s z7q?8Rd2%>t&?g8wEtU++rLI*RbZBQcCDF{2Y&3KSHA>9e!EY}xph6+d7fv;EHs?EI zwIJl-b~`sPxn(Ow_jNvqKm7_+)gR?->}QFp@McX|4Qg2hY{xtAKNQ^?%KaF4m8fX- z-$F}+h;4_zOmB)1O7}9v8Uj8)SIB0YN6C`GFvvT^f5xkdqk6r51@~lQ6|2c>q&xG4 z#IFx}!SmqfpbR!$V>NZh%(S>VUh#VKG2mvC^f3Ym^4;uzR0nDCI?jO?CBh%hMx=-Y z)2PC)*Ed)zq;osax)~G136nTTkY+8Oc_06{G8YsAXB_!iVi|qV4ZVM6dcITl1_*2@ zcvgJ^nPD1>;5539(}w*5Yp4(%?pISIIlE+$#H1wqk;CbwEbuw;g9n65DuHLT_p`gTi(^@mZA-LVUQbdN^OF8L}xGj`>9d zBKRPI@%}!bNsPo4j#X{l)}NnNtf$s{2Xo20dW z2aI5HkVmY-W7iMltEwssQoI?+f0Ibxjw6}HMz;8Y3 zWR}_j13faE?LE%>zzg_EXxTdy9y-S7qT73yH7 z5ClSmUiaPvIO4BJlx>J~!0D8($rJtPR;-4CfR{o_Nz9MEENG9WzliOEQ@_lVm_?Is zOT-|l8&&L#aKftEkHY(W8|+4mE!1pLk5`r;4Z&9BW4;lx4}KJBcaR7YgtRZoP_uD5 zeWtTp>c0a4*paCaRY>wAc1uEg!Z6CjRqR?YW}iumlBrOmCJJU5H^15akdbVLkG<(~ zd7%9|{h^m=0NTRiTr^l}SSJqahRee5M%HjL*7+UuuyXKO>g;sy=Eu&`sZA zR!QfPr(C?(hxBOBjK3FAbuU8Y#Wm*Qq9yUvKLQSvGVEi5XU-n zhX#dX8#{5RxF!@k_Fzjv4Wej6q-^>`F|GW$NyLPlm$fXt&dai5Xpz7`(yTneQl-7L zPX}YXhnrAJyw1EU7X(9KNOc~Fzeq&+%_W?XnSSxpYDDD4;gHaZR*0(&WzaK3ddk`q zvua2NyJ-6h6pjTlO7TdJehFA0b`0I$^{&Adb*e_>3KjU)y zmY<`-0Wklr2!w9kLFI!`cnby-$2s2UYzLxSDsOt72F(AO+UdAhKRf+LZafe2F#bl{ z`M5HsAjI&*i7d2G(A>nN`|iS7VRzU5IzFtff{UA{^N)d{uRH(4^p!boyidi^@wty5 zv`iU59jQc6mR*eoG6d`g4=>Mr{1H!J0oHD4gO&v6MjZ}EG`SuT!;$cM{btW8lgzru zcW-3Z+E}1D`fpDx^%JN>3KR+H^h{qD$@Rojr*!XvvVwRGX*)mIE{oQD33M`R!?7Ix zh+-|DlUK|~)$qgp1I9m@>{hm^P4vF6ycT=%PD+KqW%{_V!Mna{dh8qFTgZW>*5yn# zJaQ3Z*J>bjXpWP2oAJkScNR&f=AgFO5C!ER-8oc~A{t#U)EqYmfgOJb%OmLXJy`cJ z;H*dx3P3|OBb~#7Zd7^$VYH}S4%#ae!PX`HQm6zdLX1KL6!jt}5N%V~b=BT;NPm?M zI>0?s*q{wFv_|w7OQsdaSevbU`zl}&>jsr$==@+#Q-2Kw5s}3FC0>a#wNansV!5W* zgk00h96q*bnQ4I|>mq9`8vz zGn*iGmhD;xF+&(-`rs_ON*O+$AUy}-e z-BdCOEAwcMn!~{v;ot+1EpI8UlLD0Dqa1P1dJb@E-249R>&g9H&0Mk}bq;I&I|xAN z*o{gLe|Q}86a$UO3Syd3a45SI8YCF+g?dPkX{C@rqrIK&Z`y(5x=t-?7}4#@ieCN* zjh?T+XvI?9C4~7B>=aPbAQ#M8I#c&zP{r8EpbX|M;Sf1NDsI_TCdW+ZP11Xzgm~=4 zkP?&hd$}KLqRcgV(sFN!Gv77D$8q>U-EcV3Y7uQ%%uXN^e=ZTRgwo%4d?KeTGo^!8 zCzz(rfG;{0!`)g!l4Lr;m`5A&QFKF}8%TGrj8k+Sj_fAF8m_`gU%!kY`Xet*8zYFZ zmQ5Zo<|TC<_C*wuu{Mv9DP`h!65eD3-T@eS%+%{2zF%CCfBgo>*)LtYq3N4xLJ+_6 zF~4O+#Xk6N&E;pX32ScPQI&cSmq}rl!q>XyM{Mq;8;w9i+QP143l>Zm!bJgl_JK$< zlR3OA0(aTn=G&@7=Q^!>3YT$HXVb_SD7E`LTdu0y!c^%TaS1bD?AYf`MFriXTRr1t zabwAo`q{!Bc>ib56H>#YzCTf%;Oj;0_)JC_B?R+Ma)86J6VH*+I>zs=C1Rq%N>HJT znWMIZr@}M`+boJ#cwf#nq2``)CQAaH6qQFAQwU1-kjTv6$RoKbwZ$-8<{)B!S8?l5 zb5G-g)3u6iqPw4QZEhnKz(^hYzJ$AB^XIJ%sJLD8_=huj&}AP&ThW<})hDCm#g!@4Lf6AakW7b}J2~;w$GZ~AdfT*{2RJd&mdpjR;Y}UJrj0a59?>2ri+4tq>s<;UM({x`qm|#2a;KJ_PX#o zeZz0c3{3aFqFW;N+H%Id#S%^_fGr>WFanhtF zfc6-Bn$5eOH^;Q1Y}4I)_G2t2G;-`*(n6v)bnGj(pcMT?kT``C6CKQz_|tJf5ax7z zx;jXFPynW1hR1I^0)JTfyI3EX(6R2tIqJ1Z{|HY1{Al5PX-BFq1ZlXjMkg{B$KHXl z8fipU4Q(IgW#0HVQ9ZSw6wI=_Z2hgSnw&6~!x@R6?cUsreR36;n~zuv+Pg@$=HnsT zw<2%nB3V2ra?caFEb?D6O*_hMcO6hVqEEB&SIe%%xW9~+dHY=C;i~Q72}qfXch-{& z{xkX7bv7EVEDP=4{Leb^*KAki8l}V(hG%+XUhq}_N)Ow-1~(KLC17@Tv=a;JV0!(N zi4aZYt(oKzGCh*3^lAuym01BQ`>aj31qs%3hdfyXq)Rq5L7VsOf1aXDrlY`w&{V3B z<(}kmtoYT0kRo)eG%t@{fMXfSfx(l6`+lr> zUcuj^xNY!D!@6o*K|cQMDvkJ{huOTyFY2|HDmip{0+~_yOAj~OxzSy5R}d>XIT2GR zI*}|SnnxdPf$}F&R-P>~eG%?;c^%rAi76CcR-Gz}G&2Wc1%EW#u~TX4gpa~0jwQoR zA_BpWlBJ}M@jZv?S(tspa_jtNIWW0Jek%;=sCuaoVA_r2flcyF!WH{Unk=YGw07X< zxB_hvhN+d$bD!!PWTJQTY?$MBrvu#DzN4uR;4nA&nWA=RY`TgrY?Ry)Cq^~-QH&-E zgrPmL=W`Z$z~0t_!Ua6UmAvt>M=Nmv9g&ds3+ z637t2n>i%;4mij5FPTrok)$N5-M2NSE`eKbznIuuA?CSon4!0>83ip&a{gm8_z!%D01`>HAtghLdYT`eGR~3vjpZBl4*E@VEQmyM?@fb#%XWuAs*C?}FQC_ZiNo<4RUvEE<_$~O zL<3q`){w^7w)yK=!6;s!LEq&4oqmyT1+SlT-!U;OprZUi2IXam_>Fpq3V#zr!kH|P zlCDA)ApCbFI&k@DZ_hgT+oP`H9e2bfOsHG4_K8DxA0|SdeqA@nGASv#el{2xqrSBE@K%4A$6=FW$5P&&YG*)upjagY+v|v>^L*Yjb3j zGqqah*r_O@6H`XiE76RRdfN$k$8V;N=%>8=l=Rlp?S2$KT~=6vn=&7sW;XYDW#<#t z+__9w7+=g-IreeAOT6CSO-FasR5(PX`0TqJc8PRFO($FK2 z`UWxdLg13S_7RT4h#40i(mS}BgVb#!Sa>{c#Npj{m`Lo?QZFaF7CE_-h~j>#T&~&v zJ+qH@|Ir$7m!9vWA%aL5%;8<7Pl??U_sUV%8TN)&38581P|hEx&#VWaob!64A1Gxu zSasb$?|oE4{@?JvK^h^%03w3V(`!ojF3uF?db7Kmo}VXwsf^C^X`S@inwVXk3qJA0-hIc<&M||^q`RY<)K1pa8D;#rBvX5n+B+SL85Y%1c z79-}}zpyf*^r)oe(5^tQtDoQBMmOJIP8j)Nc>Y7kt{h2g6ix$Zf3Z{jRug4Y_j4J4 zj@CiSjCztIr>Uy$?YdOfmce5dvZvdwh3<-kBuri9!=Ix+PNyf0MT6yl-;$`Vnl*OS zbQc#V2(ct!A<-Qj4#mf#WP|)Y{G5N8<%r?KaB z#Hi%^KolFz!b?) zv`Uh3GF%ql@M~J1(&N&op(WSK!(5OAfmEG$LNB9^z(1kTS$8-5%wUFqW)>mRl>AH^ z1yaHL5FtPk>$uZH=Z^3NaYN1_3Pxptn5aM}Ege@)`w0tDC6n0hhX7+lIhyT6Xhd>H zm7vwZyT1y)46P=zg*sv5$V?)a8PQ2lOV77ck-6K{G&WaGlUp4cZ1bD*;^$4Zb@@`c%H@IOClphAcw{2EKlFTKJ zmJC`+QB}SatVWDasIB3x-3X`Dy+&2<6MWKKUvI|8zUYBIlw0~5M4|07Bxp*=I2Bro zyfh6;QDp6xK2b%l@r@KGIfR_a>mt5I6|Rze9`u0$lAp*<7OH(mO0P?1uM`0MfIu{l zg6KdTRQ*l~lPq(#eFBlfcQj)Hah}Fk_S1-&JAURztNClwM012OL?ZLTpm`fnY$5}Q zbgevAZ9^;~^M?xom=F8?>sCKJtZpf2;6R!WtXj-IT)tVN%HXy0a!W_Z7xF>=`}g5L zANgqfLBpyX*XPU(7{Qy*!Nor^Lkt>nhqj9acV+QPyLWMr!MaceCDm%I%e{weZn2SA z3iTDTP1IeVnj?)PD`HmuxXdtc2)>CKQbwt{#|-0eG{?UR8AQS&gY1M>@pPa)QrTNa z;6=%#?v_+vI@m%dn;m6)E-I?V(Ld^hKX@9wkKd4A$%n?MfgYpOK>ibnfRc|cYbVHa z60pslN3?IyWTZB!gBMjQ!P(UOAk7sw1~88C2X9};B6o+|vtA5*bs>SLKiw3XZ+jrN zmlytShd=0$3#@h+QnpARP-|6N6uc|n1pTHyBdBTZIuM~wm=n51N_;GR-^q;4pLK}5 ztdah{3vr0l;ddUK@;Kb;NiXq;)I-aBuYR?8xSN0_ZCc?2UGmRQQn-may!F2#5CsE` zP$Bd5d9o{rF)!MY=LvYG_V)4BU=%J-FT;J~F<)Wr%?Ni>1};dU$9mA(O$TO5L<+~w z7Eo_l<`)T4MqmAU%^GEmUtHsbHe-A-X9btY!7DP2sGMu+HpGsD39Uc<{%AGQ1BeET z*HMf7Kfa;#Ao*C06MotMzG-6_56_Shl}yP=r5#g{%XZ5V|k*b zCfW`vvS*g(uHGhjV>XLnXi6ANukqOlXrm6j(cq5+dFV>I#c7Un3SDt2>Ah)~6sUjG zFp#Z0AB1`EWH#T~Wt&Y`yvO@@HW=T86gdMktKe3n9d|?g4Plw8X%Y&Pf-`b21>KJD z{4?Z_uZi}ui$YuSRN~7*d?u_L>==hnVIyZCTFwG1Y66IQQa4Sy{(MaCq_%>PZAuT{ z`V*5sWrb~V+y*de3{#UoTIc;7`2eA_+zsMIgeCJj86~wEGM=weZjj(puesq&XY)jU z!=w9QY8(URTu!XCrg(_9kg|UoRE7lxXr!m6k%Mp+6JhGjgTj_O!{gB_P(h0OP zH1ekRNv>-aSB%TeyQmjziX?8E2Vj(nbl(bAhBTci%ZeS)h z9w5)h3)%bBe7DR^WqE*ocT>+vefw`R1r#o$Cs1Ufd5Uy#*(78l+} zAxyue@o9$LOvFHNPFZ$N$A>uymsR2#!8VK29#6rTTQ>hcuFz@L=u%^|zQH?T&3NYC zOQqR1q6Xa0HTo_ruWPo;JyoyptZv-GiFkOO@X1vzI~KV)X4^Ly`4e1d`B#lDbny$w z%Wb4xFjbvUYzF96vPHFR>4V5)-&7%Dm^7VWL=jPb#Q)A9Nd7H{}%5h=7Gj3NdTmYZe>M*M?`Lu&2`mrnkxpD@oKy&XcwI6)jYUz8?o+4 zQa(KPj&BE~79X>=sGhj~7FYbG*AfX`f$BhbEM#h6Gb`LFW^q7Dw>Zs&3VRz*xc|37 z;FTEc$&NyaUnO0L7Fmcx2{qC)3LQnM`3wQak|8WO-YJG`nwbA*UbVXwd=4_zf_amf zhx{*yaab)q!g(I3UTo>bH=>~awptj=4L>$TMgBR~ykmECRO%6--z>i@ zzFT>?K$wG9w|bOrJ^lKn)ua@M>d!Kv#ln15A4*esnllmTN{BG8PBw(ny@03kA*bWT-P0ROo+y*`zj(=ygwPX$2uB5wG>ad31*Dh zt7?rFiK=!EVYljy9z~;HiAdqUGoAWd9A64Ne)#tuR>>h?Yd{{areVwCI}pl7<*Pc& zK&i0B9Pp)u&6u9;l+f8Agf=*@wAzIt-j5NOb`xO*ps1MRb3;hd@jHG*xxT{s&ORI} z5T%N+p^yoS_^8gAmj&j&=0tm{&mJ{)Ne0{<;@>GgWC`>=tbVICCvmO`a#Zxe?E0jX z2~;IuzC8FeASO_1bn%40La~u{%aM0CctSIVaNJ&n;C3eI?!1h-xYTV1Cl}C87fbU zR3#ns8$U*)>OiJ;G{nLBdW{@<7bbvxemF|;tlbjzmHNtd?GHoFU1q8h>a|7=i_cTY_)`Fx*vxB^pr9vf5XRFMjjnHa# zE0Ava9mIE$kA-iU9E^O3V&M@&Cwdq9*6v!6xjcIKW}3-YUWAJfUU~HY83(BK91aWd zXG?Ddeeu(ET+z;ToL*^8B4uBK{_oyO#&0t!J%q~7i+;>>`*ed-@~1xKbECCC0U1;8 z=JXJZ26;L>pghB8ptw9C{}Vr1S0RCW0#67a-1nd4Ln^D1kqq+T+S($E$By)Kj=5#c*VuMO! zo^|^MSqgV!XF|Q0RdWzGkdWpdIly-Pb;L#B^Zq%~#Se=AhFv-kobEATCc{Dah zC6-$JphdE2qgaE*j9F7K7)X})fk5zI{+>8e9eUZWhroblL6Rr}g-u9G565|tSxADK zSqZPcb=+%#@nTgfnV%Q!YJWyOI}97sV*#iD(1lL86O}zyAVsK$f_UFV#PRe=1na9w zW=LG=AA0;<3?a&ikfX9GbX+P$`z=^__K#!NpAn0 zl%G){wUFCF%bn{7hPE0V%D&h_>A%GdO)hwUvxNqS#?6Hb(l9x+YA6SP{K zn_Wzd6L_xm$2&quamsl)z4pW^Do)j|^r4|L@Zo+>2#eo=1Eu=JLbJED(m7~8eaRVy`lYG6OrEmYwCZHF5Z9`4UN0}NqVeu0a$_8M$+@m)cI z(*mHYI}W@rj6B>-Q<$55q}T#Gy$S`^z?wQ+KKady33bw0fG^xWW`a>am;`2j2hx;* z?|~0Wlsuk7zb#g}LxjDY>#M(rQexRbmqv&q!67ayGZIQ8pb;%6|>PmUTmb+z5bnCnBM4b_4XE{DDjMUf~ zQ`RIvkE}nui&HK5^3c?BwA%TJn9@0Uezv$}Psp3V3cA%49ofhBRZ2QHRPtS)j^K2w z&dlH~`=^0EJ221)7H4m+#O=R~T2?GmLp=(@pc& zdH3JW{d&*FclV^0mvN!nz|hXYG+04}#t5$W!?&(qi2J+o5(U9b0&QEbzmoGp6hSGc z;W96DdhSK?4&}oi;Qz0|p*^}hv+1!hNhdWuu%`DItg-U1nsetRn1!3>=j;(3Y^&{H zC8D1%KsXYss{>Ve z>)BqP;yGKDoOCS-4{en=2x?s-=^7zv~B9PIz3ziSrWlPC1@52PABl7^#62x@LIGzd7o9Og{WN?kYoQ zY0`+`47ZkcFzwCg)&7;zNTzp^h!vF;qQziKZ&}>!AGpysCJJY{l}~4fG0r3(7QFd7 z4@E;)bLEcrv3KBavHE=%~f8J(X4R?(5C9;^gg5dsWcoq!{yl(incAz6OaO1k2 z1YaRt{G>GEI*MJfjMdj$X`~b<2O9tu5p7Bq22>DfLj}x5a2hdfyt;2P?uV>?OceqO zx$7RyATk|okY9A4JFf;GxsVQ(BBej|bYk~vjAX}Dx|7Ptobw=_4|HPAGGRDZ+()S# z&-Xlieazj>-J7mGW8v%JzE7-JQAjM>F~LS#I{TU_D&9p2D7y}6{DqTtC&kI^nR-|0 zLgjgqG-RAYFDNa>63eCK2s<)qvCF@?U41Z73_k?|haYu`G>`tM}wnQ3g!&CvRm z$@@1E&HBfDphu*In$A%2-aN}Kzte=riAG}g%?1`Y9O#6lMLcm-Nz`-`>MefBLN-CL zXj}>d2WpjgU0b>MpzjfvX31&1yb5(vi_X}3`;3(iX42W+REFD2_l5&+I;u^C%nJgc zM-JR0qcc?gFyk)xE%nqDkG@8qr`}2D7SJLAy#@(y!0_1T#b+_eu5V)ETqTU;l zqD?pYIEDZNsFNw;h*zQSga5~pGXWyv&nH%AFGz3?EuIczEW}ZcQO=8UsrNm)74d50 zCAT=-@UBzxnrQdeVbt~h;I(KULBu>isOCxbI4scNDW}z#eM_HyVEBD_-8`rq}in+HpsW9lwp{S>@MKro+Ok{&J27yD3Kzh+M z;>}?B?4bEjbo#?>BzeFs4SeXpZ$at-BjZA(rj_&;4*n@V4;O;FdIzwhcZQTHr{#JR zInr@U9(Rj67fAsjt0w$+IM$dua>CgbeIwFIAsi|vUmpm~u=0Eq2wr^)lM2nrh z*0~j{y)Z^OG<@WK)lwt4cXZ~oWX2R_T0u)!o{ZW42H#zM(+}sj`iOO5zAP(?(tM@ zw)jo7kt=|a8p66e9JRmt5h{?t)Fd}@MiuBJH!zba;AMP|u|NY+9*Z(q-X}`(c#qNz zs~iQk^ZGntHpojr4W;l{K4;X+Fx+SjBIP_HV}&k4Z4uO(E(GNYz8?>G__^TMbmqr; zwLjdy{iN}izW8z$o>jK!fY7q)L6Mo{UX<3_fr#~X=vZ6&dv-$i9sqdwr>SknL0N@T zMdI@0S0eLCKnFec+)v5vJ^SO!7Ix?t6wNBOyd zN58gU<7fiv!-UqQcn;qjxiYJkdYPx$zAc0^$9g@rt~cEB8!MQbZ84G+L?&}Qx>#(q zcgQ)WxRZpZEzvPWS$>w3i_khKU?$288u}$Up7fhf39f^iUe!VWlM0b9EB!sq0BJTa zbHguF9Awy+^p)XT_VlzcC57qNF}xa(GkYF_Qsi60bYCx$)%{@&mkoB^mB^M~li7u< z9F_4$9&d1O!r!7$n;ww`u<6s~8~IjwR=92ESMEFW{W+JorMwT(XMFh(cX9ajc#8SZ zT!JZ3{2$=RVfq};slNP)(g$?MsX|307k2<@OWr4MXa&5hX9%yDQfTZ$g;fU1oMoEp z0*413IGj}o3_rN0$7jV-p@8Aq9MXr=k4M-T*8U|m_l7;N0}+1-$(8u|R$iJK$p!5| z=U5iv0I`mlsitm9>_b;GPUT-~rK?~QV+$zlhU&0bK@t1G6Du!70EXSjpDr zWvxwCQs|aQGAffU+Qmy#U0EBnC5(J?L9UVs7xF;p8JCcG?G)_ga z<%c`u&>)RVhungi0F#xT>8Nw{gjVAp+=;pEDaoaD{`Kr(>t57P#rQuAK%(B$I zZ(D?}BHh}KR2$)N2cG>&{W%`m@McC6)Y1!X*^1xVLodYtX}zxr5Cw;5V`j}%Fk`H( z9>~@8x2^!|rX=t|q%+q45^E(ZgWt8K(Jma@dC@!3KUmc=uto^LZgoon{I5_|ehvqI zc_jjkdeq%g#ZCk>xyTgwI)}ICaoP1Y{efjobq75xUs!11U6owWQYNcOhQp!!jbJ3L z!nG=PPkRPwzZa9A!LQ?n%25540p{Zp^RDPtwWsE={gps2*vFAmxEoM1`-F;+avC?W zn{Hs52x4B_rT_&$1JXYkh9u#Mo0gR>nW(S)Fa{Du@Jr+Uy*~q9{7Aui)(w01gYzFI zlR*Bd>%Fzk2)K7pV!uF7fc^Pv@ZU{R&-fj&gDjhTtoeZq6>*<&b?*oN+v0K)(Y}0c zd>(t`iunZY@ibvsQbgUujxt9dL$IED$K;9s=L|r=2YjB^39TltR12tI!!X4LGN zX`H`Ee|gxwfuZ~S+mm0<6Q4O8!xIT*it=9iz-uU~AEM71`z@G1wLZ2wazX6d7gP?c$aganw)GJo?k0Jh(}^bt;p;{sdQkRN+Q45{|5pYy+lv#VNNwET}3ePX#@w^Z<;nK5MOy$?F}8fFf9OA?kFxLkl+u+g%kUOF6p z+B02F%4$3AR~z{7Bq0XzAev-o>%{%^uMPH^HaIt6UXex3=+o|m*o_n~ZBZh#svAj( zj@hqeHh^`;sD8c1X!MxkKX=9dm@I%Ub`R2WvqdcGb4tjmKb{0K%giqhUflm*M+;rf zUk^=Ad*A=MNyZ?5PI?GHJo0z9=1~y6a6T+{@dPTrPxwfh1JF$>+>n85zVxrrfm1gH zxNC0{qzP0%A>^9YvMN@ubv;QTMTDKxS~FJ{<^Ru2&6^-J(%51GR4xDa$N67x2|@)T;BqNx7JHhLmgUz4U^s3( zzWU$WE4}*H3bV?aMhu?mb_NK@&Q1bGW&8JwC_UuUdKx2x%a7{K@5dKhUIXY3#?IDIXY$ic>V%x+IVm zwuWFON=a*Pwgw;7!v=Dtu%zA&SQ_dzdzKptH)dBYvO*f9SAq7D>j-i@;Npc+(`4K{ zjoBC?dHxdf7uiJf)f>+at@!@bi}s?vblzu+D~eGrD7dtjVhBKToa{Pu%qpe0I$ng3 zs2_<dNc8--}Ci1ydyl|t*yt=|fHz}|Gw zuls%NkM@M%%zcpmhjW%(KUru`{DqPcp^_;f|cCMzl&=ofS3J}E? zeFe#cz~85}-Z`c8yZ?vBy;X)Gp7!@hX|)W0DfO z>pSB3r@)~9`bDN7s&V7GUwe-`*cx7D`qAltr#O|%*sixTEGE7nR>W)f)l+8nPX#sB znyjVxyW>meZ(4XN%1rs-Su9zsgux!!M%$z-7!P z>auE~LOvMauy{@Si0wR{A!}n8&XdBO8wp6~fXeYYs7fXp;Z!M_c&u$`{e%7gwF zd{R&2dESZRb4EB-vQ}T9^Hu9zUzF<3J>162EI?V2Azmg=qfj11T&1KxNWy=n4yC`7 zcZggp9(!S-hTk4x*c0D5Xv8Aq?R5*JsEIga$8@o0Z^AJjl>oJ=>+s$Bv$2BbUjR<& z&E2J=$ukyL6mmp|072*FtQToqhiO^8*ZZV;{xr68-z@c+Urro)=eJLQ?PPDUk@;sv zDS&%10>HqNsbZ9nhN6ksPUl{&OaXg&vST>GtFx?1#u4~%uGDeD&f{SOx>Z~7n55dx zR18&oy?T3_zDSD%F_p>#wj!+tmo?!=)%HQI?cq7tA{Wd5tRD=If&n~ncK)XUg@iBX zW98Jazqpd2I$f)^+~w8pG*AELL4o-TFYhYb#g0a#5L+qlPdc8P=Na>asI9K;1xU>B zn^Q}RU{$W?1?@sn#8u2|w(V#efGd~0+n2(AHNMn5DC&Y=ONl?J52DkJn|=zv+2I&U zKM_;?c$(SIw|5P23DH>~&Tkk=CEm`qBgF!CbX37aFDp(TkK%0M z#z5odS&*>Krno!#rJ~kBpR-JJ8RaNVl`>e7`FAH#TknjCdeRq7S`2*)lK8s;i8lM0 z?IM7RI9+}#6b5}%t|s3OAwy&|MTrd};6Vbv`ShXvV9tK?+rV(LM~a~ho`GuBJxAW7901&Xs2@$&Cj+ZntrfptC7AU=1BJ)&|Bo5ty~Gn zWKUwLeECzZ*|V<5pzf90pQpFA{$Pb{7Sn0eZWzt)*kx08Mnpja;%8-mbB;d3+LZ&w zqsPq{2g z%Tnci!n}=g8R6bmwoYYycPr-b>^^6X=KtP@K71b6=TCzU?EhWiK|;N@fHbV>g!dy- zx$CbOHa<`~AJD;X>y%SEWUXY*Uj?V3hd9*5P!O2)ndJn#jIQ})phndB9@ft8vJOlH9OwuF0ngTlMh%= z>IoRbgdTh1tRQdV+o!I$e5IuRd1%v{UD@TmKhRF(LIv*B%GQi6hy88adAvVmg!5rA zzu;NZ{^ZCDqu-Tu)XcY64~q4w#wFYfzL#?Y#yn5?#fJ22rtLz}kfOpa)GBpM;UXx;Zs;u~42)eNE9~iN&Gx9Jsv@3wIx4hsXhr%ic5k%_7GIgNig??X;Q3 zT7e4hAO{DOSJJEZcWtS>(A3_}cX(fR*id644$C%7TlXtQHmiHMUZNLOm6vD_{{L@) z1;%LO*4NVI_r4eXeJr_)tZ#l*ng5>`pc5OBNVjt^|2wt7-}fO*F^KjZ;MvH#ccpO} z>MdbbwBB-%YT+Hz#t4gGQ=BI?(P5K~sv_&5{FrzJY^_^aIMa7atoW}0?_lU1{=E(h z_A}x*O5Iz9ml{gZBsiQ!&sjYTYHgC5G^HBomrgn6q&+WAyr6v#21!1no zdtXGHOWp8UOY_1{?hj%oe2x^37-%8@N zsB?Vuk`71MD;=#`)k9C#-#^&Dirl~>l2(qpXyex88>w){myA$FCEU;G)HyTHc!d2u zItfTIXMv;x3$>sJXRPCp#Rl>rS3t-E z`is({d9qBSpUj+rZRkvZPsUdq*`1M+nS;C%v^MFvdb72Uk>~uH!PI%)89!eG5vcxZ zplcE_xgd&41hS_igZz-D{nNeqy}GW-y7^xyF=ixivROTtc9c-y!JQL~Sy{W*joG@= zuQ871+f%e0Cf$})N{zlZ(SGWtF(5JUX@+tz4gqJ~T(IuUs=ofJ^{MqJRN{_*itV)) zd@q9ByTxu$N|&mMXt;=fcY_&6$jzo|Cw(XKe~n~%O8DX&x! zPuw1K8T!8~BXW)p0@3;7YAzB)j-Y;fivcEc!EV|s@eOVtiRmyoc}Q_sg>xb{XXv(s zQ{vh2hH$lyo(*`eFuhf??tCDZVB&1Rr_Aw8xD7Mgm|8AUV2o(5d8H66Y^+@1T1{uqP4VcQSM5bAOy zTc^?4W#;NXbUWMQ=zU))8`tB-a^;WRBJ1aN+f`jF%MLuQ!FsHMgLkNMTtyGRlyiR|zCp~(egux;euCt*MwEZ5B7Nh^0`J{RU z>Ml{LT!Ral+DQypW$!=SEK0rTdI2nUqjc8_&X+J$>m1Mt_bA~!D`6NBt_1|>!T}Q_ zLXVN7C2rNGv+Adh%^PM5gnZqS^_#SlZDX4;zJu&moQB0#J!l`$#tnVN$kbf`DqgP*b)}fC?fv9-A z&Rqj{Gdbc|8>To$LY#{WxrT@D1*$A{m(_^ zgdYzQIA1CmjCoLIw+3ZOg{#PxGL;xo``vx~qQWsRk>2;3*Ko`Myj})f1W-oHN!FOJ z@_~&4%xv`=Ts>w@as&3uRcm&U@T=p>HUHZjHE)mNG@EwE6c<`Zq;o*a_A%$9)r;wGI}le6KtbR=?isKjF!z+yz_3 zA1;q3Eq9z3vLw|BbwD-}o_Ci#j|#$kQWs0ZWY!+9{<`Aay*eA{BxqZhbpOx-UU`rlV zpSt{SG-`#KA|vr>%=+Fu+3&!4tfuAwV!3iW%`z893SHjhz zLXeb^ux}F^dgbEZTMdH}LGjYvmd%NS=b6B0uMM@QA)iLnXzhvB)SBX!e-yH4*L>64 z2b!fkfQ(pdDC3`qOoifq62_YShVrMvqVIUVKAc-CP|j;GWhuq*R-is z8G+lFv*e&F-ALskANqN)GNCD*kJ(pY(t|HZFn-%S4o7%9VMAb^ICb51{wyhkqnBB! zR8N`S*iB1ymhvI!)eG9W!T$2P%DXC!XvqSVpvJB-f%(eyD8~z}Vlm(XN6ecSg5nV- zOVRG9MeVu^cbjRGH#^&BVPzTgAWXKKFV(J8#ikGZAL=&;BU6~U_q#TNAww*L zube)qej6TNJUd%|;*u4@O_lcr`l$5*1@wo1ofl%Wv)*(jev@a*Ix6NS91F&^>s@Mbi=e{7x#Y~-38 z6yVDGLwrT`7;k~FMB~9+QD}I$h$ZxJ>%`w`s(fbd@l9HC7mdrkQ7Xa9pRW5|#HwkY zYW(hpBL;csWz;U~#mj%5^8ZqE06I{Eu(DPK-fFRO`fji51|@%1R2AMwqyo?`$e1J3 zmCBfB*6{s42`yOWx;J573ZsR99lRo@TuB-g#SV z2AzPU&fwb-ZR!*bxxhTShEFUen-$}*ux}6_%i#{cmVIZ}TGZE)S3Gau>W<!%=>n5gU0t|I@r`5- zM;#t$V06*2FLk=~*_xcHJ?GVjR!OG5|I>{9lcxPzo4wzz3E!L<01eanSvzsvNgIdf zxh~@sAOG##0tG?g8hAzZ3FCLNRuQ@N7NSBPoGTR82=)3X3Htkgh0lgNFW)NilGP~dHeDebyae{t#xTg}z!My7| zL7~0I1a;;`>$jYgLx*iSE%^^^Tjq2bHJHD9$5E}&NJk9NXFPj9X-L6vaYFG`Dt5+( zpI^KS3gxF$G}v{m2IP?j0+!?j?eMP}A0+b>oab&nWXvGavUwOfemr0NtBG*anVP0w z5=_}W4Eps^i`&4xO~6T zJy}>dsH)OLPpG&F|Gx(KpJy&3j0}3vDBr6sM_z~3#N6Eui_w2`fe{1`(W4<#9+x5V z1LZO_s`hHDEN@F>?+8>s1L~S-YozGOGS`=NG{(Lf#Z%u^Jd2}Su60;C-m*FQ*XWaI z4X5!dptQ;-t2u}s_m|%G>3X30(DdujP+G(Mo>GO?HzEe*tV|#>BBJU8c>AjDTx2K( zPi-21(NGQcgSH%K#!Lv``6iCzO%GUeP6yS(I}Kr%x0HKkY$Hd;AMiT9NDy#$kPX5B z-5qcm{1^}!Hrrgg+wnHCFN#Vix~uKAbdK#pjl))nd7jMbVhK}@N$Klo8e)u1@mvM{ zrP0&N62U3^YM?8czGxSnEVk%zeyARBYB}HN{K;iU;ak&1W<$4EfuvpCLnX?{hMJJ4 zX?$h?S}0VQRn`R7QR&Hp-#DZwO_2}2muOCgP>I`&I|{6#est>weIwn?)!r~8v)A&w z(8sh~sst-l`j3(S6Mp*eraBwz>Xrbg9FnzCK5F{ab9Z7$D2LDDm(k zqz#op)~316B)2ZxEnOQ5M>LHvL=;B5o;KZQ8Zv)&sgBeJzjA6`sbm_ zu!As?eK(2acVy|MMy6N1-cjLVo@k8B&ZLx-s!BII;Q2z%Ec@+r*^< z%Eu@49B{)zO}0(%RErhyw-NofDW2Jtl6*|#+OTiwMII4-K{P7`96z&%h=BE83@PuY zK5cV#O%1KM+`Rmdt=MtM;}^xzYXi0L#S?PE#7h&W4>PPP4_b09+vGo*4OlWZxBd#` z6w(M2c?hw)^-5-q4B)(cWnOs@e0}2PQnWJS?e+odV(JyV-i`ZiFV-# ze;y}q9!yq`9$BpS!`~@>Ev4>g7jJFfySEYvB5S8A}@{2f)I$xnAF3 ztn*HaJP1MwKS=9}w?&KCnehjD$e$OQ}}iRcwloj{$w z5k)vj*)-h~rd=$CDFFjv_zM9!Pji%5wtCSI){>{^A*6PDl+{oh5@@c>^MJ*T(_i?% zrihsnd)~2z$bq)_NCzlW#^QIyjyef_t9)DAAlFD%;meUKa&t}5|K?6Z8ckH4#skz8 zawkJC_KA0&eTdVQYZvCV_XO!opN1rRoBy|K3c#mC?G0ta9#bH2B5ExOaN%b9D~dp) z{oXN&LCh-eAxajGxK{83^eEkP@4x7MPn(hrva~}V?cl6ku7bIx8Q!<4dS`yK@1MDR z*t;6tx2j$F+teZGKmulzJu9S@6WRBwS|{DdBmY@)m7XV)@ZlHtcAV*AM$co?_e&kb z`I!N&zkohH0$gRx-}qJ;4cw(46cxtj?vM+5w4-Y@k2-FQNPAj5VwGq5+#a+(ypV|; znwMU$RoYPMO!QSkZ#s--=*lFu@nGn#e1*f9JXxHzKXP4Vwn4Dsi_cmt+1LnVlCoP& zYoy-!4t-UAkuk743^mi5gGQ_r0?Psn`g$!UCQX}|H2#xUmbfZwu)Dddz0q@Xw=rZ( zbj-$)-gxT7G13A&6))MiCy@A_OK`hG*Fd~=bOc$3GJRUQ;Qcpdz!p#i$^_p7W678D z=uYctX=~H3bmdC*c-u<~H7NcLB}gUE_L-FaYd8y2`WRh?NR5I=jdGu| z9EfAd%b$#VlIn4)ge&-qih$^(%i~Xvy?ex+ltvw4?p@lzoYdo}P>IJY|Ut=#)}l z-x0SbV^n+iqCl$g^?k{ehTU^LNnVp~tgx)6{#5<8y6>Q!>y4tqKhkyv>0_;*NjJHd z+VSU%#(#nfb=a+d8=$u(m+rai`mJKc@7ktiC1Oadhw|??Uj`Ks#F3L(e&d=lPmm8K zXnP|wjkl+|NSwC6miS{ZLWA+0K5sj0PoYm6@mWzJIa!vL z%ii}M1Jx>4O%S{kKSNpIM7X|A8%nyv-VkE{QVyih7rhT61fZ-k6rG6|pOd-xIh|qa zOyRo0Y;d+^*m9go4o1P3fD4?g&{lgOr`7b$ij)fSwQON6RXzQEfj^mENY z7Tx3iS7qT*i1te|^m~G??apc{v(9EE%QoXHLXQ8IAW6?|DR(If54yDQUn{+pg!G-v z&xnITSZp6x#o+Id^7~|zr9d24b`i051%C{_g{*~ZymT|B_?U|f^#*^taU&}?;FVaj zR~?5l8;tC8YMq8YgUkWDFYsq}ScL=E2E{IzeDWzN15Ay8DPDNB9@zG(`*!Y|)F`BJ zuu4iQZq7G}_73FrgaIl8UMB&RAG(U?2PFBL`P5nkK$Ctr^=zsbs4xN4d-e0DqrOtO`2iVq1jr1Pzsx_Cs0Bw$JqV-lagY4XG=_>$%J3t1&gLX^-x4fG4g z+q@4Uakw)|M*7WO%JM8?=P?+BiN{xwTd2#SpXc+O_zSX}ByogJON3D9<RR5ePb zS&0p%)X=at=q8F1uo4(`1pj>Azn2corFw;YG(17%p$=*Vt2Abpr)G@#lv9dN{o`4R z>L}dhR~rvV%ynRa1W1)H((qI$b19o{b6+`c#gBokdq^IqdewoS5Sn0ct~$pfgX=IX zI2UwCm!v)=EP;kqq+valeip1@mk-R6J;u=vjDXuj2WS5A!i~Y*>I?V1Cc}b<7PIi% z9V!B17-Wj3(e#Q6bpRgAakZ5o;(fe@2esgb=7YY56~OJ|A}2p4X4I8}Ocd6KoO4w3 z>KX7CQX8G&s-ip1MqQw12leG#R$yOtQ z5E0hw@kh!Hw2@jtyZU8e08Td%ZX=d zxH~=b$HV`?l5_}!m=2{DaUo#h5Tyb9#?HE>+J)~>e;hqZnA+iwi3c4eP+TWwovOY) z8GwI1K`+Kd=cLa1i8kt)J<;XAxE;zyU6}Ym*Z?#IyEel2U+o=)32bk#$1*UHuDG*y z^$UEfvZw_DA!1zwf}Y$Ctk`jn9S*dcZAf5fSf^rL4-^HREA(9Too+MBc8oM%-4xtf z1XGC54%hG0jV4Q9mp(arc((W&{fCsef@VM;l(oI$_i%>UtCUDjF`IyQB`l=B&T-v? zFKy!JyB-knKd{Kcgs>2hGX0of+6y!`n;6V8YHMu2LaIQ`!X%l3SwDj0lC>?NRs<%$CZx7^%Yn*1J+6hOt zd}iUaj1Nx_hEYGgnnWU2W1$abu*;`}lVF;G(d|%yaXDJ}g6AHZ#az7<^L7pS$u*dY z+BVn8w+kA{h!3aOMvQiomr6O*Ja&Ob%IO%_N9RA=AoRQJO##I*?x>@pUwqXa!&2=&XE zQ35b+li8_R*p8raRPuP#n0k-yCNR9-$oe8Y=4H^y{4gxTy$(9FR{4nYi@SNH z1(&-tTm~&ZJD$vMeEv-Wzn}n}C&#|%L3}p~0~yK)=4!N{8P)Zx6IFCnxf``>0`Or*(l&P#c2x1=qo=^6sN`_-z#pydEmj@-_v04B7M$@U zv+?{3ns#-+L;kWBA(b~+Nvjds26YERLk>IDCA6BQqy_LT(_Lzw#W2!MIg0&B!=j0+ zT=#>*WqjRnOgVP^6B#{Ln7&&(W;f|=3}a{@kx&Kd%BNi+AYZ~q_FeL&fAG8KV{{8{ z1M#Y3>95eX9y9?p)*!@u@Lj}NscB!pu0b06iR=&D(xB9yy=H!m>+>ykXGio&4=IzT z??d`*U~1{uKCHc)j-SUM4%$1K?A=fQj$nV+iqt{3utTfRffBFV&XigMH}Z0g!)DH4 z2P>g@_M>W#fBPr~MBFE!sYLyq3L^a0m3|GdIUc?xYvcAAcMk|T#MUa-uIymT0=rP* z$3sG(0VQBFpiGa-vR`@nUf6dROHc};gZ`fC!3Sv`1wtU_D)k1+vvG9OLvf(LH{)JP ze}y-Re`SjpdxkK09KK9kDp2PjFeTBr1~Y=SbkAnBypY<3T^3Xf(`|M|arMVm%Bebh zPHxla1Uh{kI2jqwXJq#XS6&=+-xrFO9LYLUH?<$+D&c&TF+bBEd=wpT2FkJv;mT1BHy{AwYxGR;yihuz9zNe|X>sp3FXOpO&Ymey*GIA7E@WytPn$ zM*l|x1JDf}8?UR#3&cl&kz*s}_24jJ^N{kXbPls1KDEqP zdYOrb6u1R>+AweyaS;m+BZXG(Ncb6y5HV_7qwm`z1nCIic7H9oxD3ElbgQtQG4M|RNp|8fn&cLAA+#y=G*-k*S!Ao7(^)K2xe>nS z*enit|DMl%rZ?=Dd4{|_b^c!Jz}QEflh0GR)-?9WP>G%h{pDTZn4obT=pk!ecGCQ7 zP@E;41{{a~oihAzdmkWYTV#K{lNAE6XxX!U$s_M006G-53da;aPhtPJs1*@IAoeny z*G~|C2f=G~h@!9u^WPB)XGk;j6ICwHUSs#BaY2)D7q@c`sEklFjv^rH9;qpbM!M~r zcYBCBIrflcSU!z4Pp^Ac3eS=(rWv_vIbEI%ie-l~JFNDS+ds1t5HbCAwjRT^;RRZs z>NaS!ST~D@gOYGB-Hff#&aCl#T3B1r@8HJ(TVBD(E>Ncd(ewS?vr!e+ z=F?{kI-G`IHNRN?3%w)WaaG8M>A~QWv1${1YUk-UcC8<+0Y!95uI#Sr?SJt#5mN+g zY)VRBlmiYiNp^8#1mDtAF_R+U&0GV{(~nYws54d)gaFZ%adtl56Q%|u2Kx@n1XrJG z$9%1#_%}d4RP7g}l)yY)TYHXSlq6funf68-7^8PF7AA6A=g4&_i(em=m5w%hmsFL0 zZMnQWyRY^P$s9Qzav^gxQfV$uRV@NPZav-;p;G{JAvuo|A48NovqmaP`MAxH`KkB-m$;}J1MYFZ=|cDmBK*f%SxzC*(_p(>-#XX%~{B#rICG8 zRYm0ujv?if*+*JHkUY@_Tan>g^Wc3xB$7{cx1;yB0pc_r75)+R&h+s!?6i-A7Jp(A zA~SO!^Ppd!t}ve+&uo6OnNuLVG;q>ryb-iK&*M-s; z3Ro~|);s8jk$@cL*}g(zzgrisrY5?#H69DF#KPcq#~iJCr_fZ;7~%DuX6~$mXpR^Y45pclC5gyYXNm2qDZP8ADniYM)5TQ~j0Nrgfpr1B%qo}{;ySp) zYskM)StV}cklUYBZ!`AOq(K#ko9%hMu}zP!sk=o?+x(z3c8!jCdpG(G*!9ESV-2np zqvje$f(L5@JAp)JYIe8}>s#0SZti)CVRiHD5-`SU3Z1QXw@yqs-NkQZc;|}bfu#UI zvoZT<YQ2M7mpA8&JYZ%>A6XY@OHQ#=`dpRzN)U~4LVmXr-JNG5jk_#DA7yPVLR$ zun=XrNMOaQ1jX34)A7T$vD~wWbqgaZGsVoscKX)fy)gTFC7O(H*Jxs&vo--FKj6AB zXxCx*gG2p;7<=8%b~=XbmEe*UYtL7ZuvP%bnN5|Sots3=CqfuyMMX1P z00V&J5O_e_MkJrADhD34brbrnqc&B-^qCDBWqUkN$VV*?uzuwb z^2Qki5->(TC>FH}rd$CuM2)ujrjuhO+&9C79rQyyv|mK3?3MI|kR$I$P)LTXs*ez~ zhl$v~*}EB2O#+|~n;ju{+7N`t(D(FtZlzT^Lv}mWntYi-_}rJy^qtMm(;9yv-Tp7B z%8lBjtSPd>U-rG1XUxyM0)P%l!!bM=cW?AAOHbc%$Df`BnuGworOY0K3K>=bL0~4? zA5O1M+<(xC;#hb{<8RPMx;<OpEyUU#Hr2TMvoTu=*j_jjWqok1DfcX`W=As(* zc1zc#INvcF1!AHP31{Pg>k*9s14@RpCAyPNCp&x|d!=d&`}!;aX*k(|zaYf(iRt=} zsLU|@tui*2)jV(|(3W)U3@s*p$hsd*yi$Y3>Iu5roa(VFo8NM`q%+;tJb=Ff0JBoVLmp7Ut7S!wvo4>kC|8vJ4@csln>gH5a+p!akTRH_gB zIgwsIa6fwaj%&<73(xT$cwcR$iFXOyIsO<%e`}&d7v+k5ve|pb^ff~Y_s+K4{d#VR=yI$^bxb^h7+Q`#L@;jVvam#Vtr@$fpaQCYDc=qOJhflHsU3YZ$ z%M)Bt=O2e*1_^sjuHqr_;ju}$p-rdD6dre0Uf2x_3a)}}ykMORwcV~@W>Ao=N<5Y` zySeU|7AN;l9iGT~v)WI{d$JgtZVtr;P@$Ye@A$|PfT}YU~5`? zJ?x7zC=Wjq++LJX_CtXp5$Fl*uf7|*mA8(pQf|~QNdjOm6vl9owcHdTmja5A0cnb( z7#TZ}zFSxp2DC`0Ol4kjLZ_J-4cGUx-MyFU0|=RFcIX%tQ&x1nxw+Et5;2TcWhFzzzm{8VCR*mt~h!4((0ZrA4a?GwunlFrJ| zL%Cp9sDtNn=qEEw^JyD0P|758lRZF8)^_0^9doUp#NJuL4!m{iHr7I-g)PrjCEy8k z>9P#-Dtay9>k+8sk>=Wee*XF788K_>llf00*OBy9r$>{#=cVOl1LUHRZqK`dgelx5 zq&rZnn?IN=h(P!dyS&BPdjS}MKQFmEtjnCYNEq`))Ras0OlvZ_I+3cbfPn&*i6EnxP(yRXm`FR^G9U{+UljpjTmB zgs*QkdPvQqM_DgoC9`y|=kX|g&BLNG06q0Zt&=k3k$Y}SpA?fl022v0t%>0C8^Dbk zV(6rAHVS*yTX1ty7kjsP*v^sKyAK#}UR@+GX{H)l`47nSy+`G|B5KE6xDmodGv*`Z z%qqCNI$2=UIU4;0+;BSHp^c5>8zEZi7QGiZMwAde4CugR=Y4%s0Su<7iUx*0c@kZ8ZO87% z+trM@tvLZkX~eL$4*`Bq_nngLv|DXpVe{GmpjHn6Jx3MM%vcx}l!yjt?92$4P`?I! zBr{zwWq`+0kZ>UR3S?N87;kWh3>~KsoPonCHKASChUt%DDV1_0wy z-E=93@Oh)#uNT%>gYhgW08eg5XYn!y&AM`(!!OR9eiMr?95D#y4Go3g@X?V{Pp3e zC=j9W@P4zBpu)((R4=3G=XwxJ8t4lj#I1L(f?p#G?=}W-ErDcmDTVS9f7i$h$@30U`k*D(q3tTUVNVD~Ere)}LQnMP8<%EY!JZJ#Z^8x?(i>;f9DTPMv;pc6_(7wDgWc0$ zD&n8w6anEDLBAY#H{4@zz2`TTg z%Zw&dhTPfvJ^8s@WhSs@k4M1FdER~NMjTcxkktoR^-4}q242qiNTc7On67^eCN_N?+fJLF~6#@vNB zugf;v>-4!VrpODd7j@U?Cr8)p#+}|`A{_A;O`WpD0Y*PS>%to?=}Ji0iHBlq7)f@p zhC-CN zP#m@WgO0NH?O9Ad7cVJbLrITvI~_mnB5_s$_+yJo5yDC+9x!*Q0ax^A!6tyZcX-3P`$&$W;}Cfa=Uo zPnAzexcxy~dICLOt*$B$7{hcpKP!wX*z?`2i>zV&XS@WyY>EfKTT{H3Ghv|Q6@`9T z6gKV@BUFp(!EL+M9&9s5k}rCgo09qMvs$P z7J$Q4(!lZfaH4{^7ISrh zBX{&8=NeaMe1iP2BHoy8-0^iRwS0;Yo%eawm?K6-(7Hq0#wSxzLT$HY%uX3BQq{n_ zn{n^&u;VbS*zvBM>y;aQY{qn;*qW+{01Ml4B;3U?a##t`UsnJDk5AC-P=>nVSiggp( zxi)j3egzU&EI%deWyH(1Z-El%SxqhC8x-p|r~({niP$hoCEMy7wStxMXEwMRZpn-elYU4;$lFYR^L33@D82^50L;`UfPMp?;2rkIfC$qA} zXKjAv$o{CpKR5JcG6T`vi#s$+rgQ5^&ya$H1ICGXRKH+y#1HtRNUs)^<${HlUjfcE zUnif;Pl!*8)R*|=WC z|EA&#AhR`}z6Er+hm$MrnL5*+89nExWi1*-y#cYJ*_ibp7ckZYJF~VO3s(@JLRs$W zR2Phh zSpv zTw&UFY%63ju8Ml*Fx|zW*AEM2a2B~-rYeDrWasGZ4db<9l2$T zJ-W9vJps3;wYDwNZwRa5H`NZZ?)dA@1d|~ky)+YRPfG|#{H>5Pz;GKt@xVIo=V2k2$ zgNJpb;sYzDyai?uG=yrcoV0DhVS-G?o;w|H1{3)AF4gYy&3l$bezSe?Yg5EB-e%4q z3UH(Qhz)1ocU7ae3@WD7JVlV+lE4}lrqovzdQ6C|MgTsrW6GWn71YEe5!_^XBZ4Z8 z*-5neI3kY2_ZrRBTaZoo(k@SEW~_bzs{QiWF)1rFmCdkO^7Vc;s(3z8q7I}d6#SGt z=gJx{I@qG%8z-7zX;5M;brSop?D$M#Mm%OEhO!iDuoNf|hn-Q-W9hNuF-;l87-ReI z!R_U^?vNdDgIYL<2w*K=4mcArwT!o_hW|W$(8%IKPW3As*0^sP*!G$lQN|eF1@OdT z%Qp6$zQH(Wwb~K7XU}Ps_SeIQzC$2*?WT{xHLxQ=vbw!V#pAFlM&*p!4kRovEXCn_ zJxdx1Mc2XCu+ED1^=HcRD1)4dy1#J!CMbMAC*TODW{S!q-){1(jRvcKA6O|q2OX_s z%MMI@Fb31p{^a?@_0+N6cZ?*Kil{613?K&H&Vd34pKTHBfYpLL)(V5K&mG)kf<}ra zi}v>iH2ZQAxG`gNf;73nX8V!^QHSaN>Y8PdVtv$$!NNdI+KzH=9`11RCM}q57)6VO zOo~#0ianUzR8c10AM~HS*t_YjLoK%3L&Y(j8d=f~Zf$q0{mCU@`(8f9Ws5tMXpmyj zVM&fnB~KwK|9krL@=Cj|>``j{Fh#G5xw=%U=BeBjzzBUcxV-Guj;Rt#X}tfA?I~Yg z$a|F!V#+Xm*c7se$02Bl7r)0cX=0yP6_*-grm|!)NWuz=NuKyTL&Fx3o{Pt$k6~Yc@#MK0 zW^M$i(SYK6gp$92uCd!<0bZP&A#>MnIC1)$&REQ?aRsD zl5$IdAea{y4ctfdJY3~3Lmm7NclEM=@o>cwPP?5B8vWgvf$V`;fZfK4R{sJur9wiM z7|SbDF~=aqKV_Hs$YmjLyen8-z_h{Q_EmdgR!RT1&jTIV)LR0;0X^XIe2WxpIYsI@ zPiQ+_9hDsQaEZSD&Dl2ooY=Md_Qc*|zA;32?RFD;Ngx~2tnT^YnFtD4TpH6Y>FKDg zsnC6_=L#Bv={k0`xF-vZtS+K~@O4o2s7Irou#(>0Z79p*g9X9igWsW)xhv@rMW_*q z2yXoRQ5xTbGlRsBdQVAt0CBo@egaOOvK%kJC~`P{r)*hK;n~L8z3m@>3Avm7fyaG6 zySZn)G`t~bc&Yt9F{sc;3vHYMmsf%t!l6+*TbPBpka$yT;lZcT=c!q3nZr3p!b<#% zrjasdxLEs@8jpa*D2BXx`-Ke{&0p@-!ppTu8q`Sd>URDg7A+Es2eiOXgpCy!E^bp} zppCl!Y<`E2O1(hB^|YwGUZZ4`F;~QtY%sz_*#mA}``3F9lL2|ypVMj@{7d$t8Ly{j zjseH-C2XVB|6^ggFj%!)7S&cP6Us=;N{(ez?=7blUj*C~#PYM6S_Oczt3Pz-WC0P7 zWL?swe&DgDT4bpaB*}$M2$t@h3N(t%y*b=EmbdC0C;6Xu84*(su0=Td?l9aZBCLE0 zp%sa`n0~e3JjDKlZ!*zCbiD#+1z&`~F9yME10vezKTJpRm4i+nfAj6bLzqwN!(2-+ zSY&88z;epu&*VY$&BAllV2R`v)mocje)Hh{WE*hS&S*ZA>abh4 zUVkAqgjFyF%)(58P}IB96wgW9mJ-MCu#0SqF}%?R*Aj{K@NqV<2MxGaWE|P&s=3eX zk!GB)o%a@epJm(*CEEGQenZUgent>Kr1xxH(~q*t+3ZG!gc4UT?OqFpesX44eLt=5ixfoaXTpvmc=tb7`3M5$Y;n(-1 zIuNGyJhqx%X_iayP=F{&-wze95V;0clVIJ8O;JB5%c}sa#lQ{vP{|I?6o7|xORf99 znltx!^<3o98mn7n_dD%?+s4Ox3wr^t?)@}LYsK-WrO&E(&yC#kX)TKCj6^o$wc~?} z1^Tg?Pj>qCuQcr~Go8xjI^W>~ahICS=6NNJL>g%!`ojEG4^kFvv*YsQbzplP1w6LR zWYRoNc3H&VV9C17&2~7fKHT0uHmB#e%^vhC|C!hz{k=E(nm1A|_TiEqo(n{>-No@c z^N!76++3Zuvdive+gw(MZq-JSqc(li^j)Wn_M;A9l<@7H=8)ni4;~Vjogq+UxzByx zqa~;c_N}%QnN-RQcFNwFI6~3&ysLvR?nLPU6$rl&R+uhj)i1ON zVdPan7Gu4mAe2T&i@rY47ZaL#x*WNxVZC7f$X}^+535w{O|eg_AJTq5Q<-URy>-q9 z+=qJb^6mL1{;DKv1oYA#a7*kP;Bik@>JHruqX7lwP`+D-RYkp4YgeDiY`J0ZHkW-G!SxhIms6&uN2|I3BZc;(#{ zQjB`%hG*p7hvrEfX5m(|aNYZ_(L-WcbfN68WCpb^dVD%-shtdn7vI=T9@9_H5|Djn5?ynio8Zcqp#0zKIX-yg2wir~)*C zu)axgmK?VFqo`zx_=h#H@o1680D&>yCm%Di(Di#S_E#c>`z49>4;9l_4~aE@rh1*s zxdMp@TdX<-Zj*CdKjBig`6l`Tt{D0Tfamh**@@!c6ki;Z9b>Y<45D_o8uqS7ISq$C zix_;?G%TGG(9X`}YQOjpG|-uo;1GjZzp%(}0qG3fSwM?f(h=uy*m zq#35++%~g0V*)X_;vDl}v#7>fIr{R*XEy3{=2V(SRw?f z5g4>7Jx~cGf3YAwc=ye>>9O~m6bbrY_3B+p_K=;AQ8+NL%XR|(Oqiq4Au>3)%o_?c z*IC0paUM9nQRvm>@}`9TV5j#fV0b%2i&1Kp%?73`a7>NI{;6$MloOeiUC_@#lyC=C#S7 zBQ}Tv;|E_ss1sXv=Q_;h8?}ep>vbS|LF#`qq?e@qq%JVR<=&Al-1mvABr)UhALnT? zbIY+p`RCVa54)9xKKr1?>RZt=dN*KGZUHz9Ct|2XIWzW1Bs>~TiM0rq~LXWeUE>xx}BXwE0^Yp2HZ z*uTW(06RVHuP;i9i>wJWIAeRhj4JaJtTKgZF8{wsiqZx=Q10E|ovq#2Cm6(R-BVR&zJ`msHuZjDXAq;!#n=s0A(!DUdPKR)=4+$z!Q ztCqpc<%y}A_PL<{dp*Rv{?Z1!C|F7g|L>Ro@snj}JpPV0&+8Px!gMSOZ_j;u1X+bY z&fys2nRjOIW5tTk04$aVB_&NfC(Bv-c~&$b;KYtuQfOQck@FaW#O3(%v|;1_j|KPl z453Q|X9(SSo6b+3%r@Y{_5sM$?s0N^$~E%C^&Hw!1ebnVCxJO-{T@c7!fQRPRMvd? z?t0Yko*oUC;@D3=TM`Ax1AgM(;}IzVi?Y`f`HGMKdI$#C)156}?9U9Ijfzp1pT4k~ ziXCKc9J(-NK78BMZM6-Kd-lEoaK~$GkSd8`}i6jpV4n5U53CVeoL)vc4(G zuo^Fc<9NZ|_(l>ye8p;(0g%#~k_c{G74U9}-mT69(cw*JUElsPO9~#ob08tXJzi+*Dmk_e@jEx>zJ^vA`oo z{R?1q3fo^bcf&@6JxVydhuv% z7d+i4WgXxCrGi9?D-rckO?uf2*#rMLqyG4(K=%ogha#bTG*a&(QU1z1p2hu;$?w=9 z*7R_H%MCiBhX*Fr3{w(tCb;q9OB^FYd+Hq5feGvgQ2D!k;)@v}J>CW@AtI!}aSe+V z&&|(T8^^1iWI_EIB8{j!z-Xx4NU2w_`@;*HRQ@^B2S*%ajh%sEdN64NFCsUxD8(|8k4FMxy<3nuZB7lt5mxn}I`x$lCu^sLssueUptT4=I4LP_(cogD z!wAX{)+M0Rz^7!a71;v#NMSe;tm#a}=jim$cL0*oT+z_T>NDG%{hTqF+%@t$@L|4& z2dlv>+pj`ybeu+EYBLE`XNSwJhNI?3lo*N{@UKB{qpfgpG>Vx4+ zcN$2bpOpLEDY9r5Gw>}q1Y)w`N3>pVr3xx4ET`)*lV!$Hm6wu+o_a-?W3}eHQyuF8 zOPjBl)+0i&rmR*I;He>Fe5}Acf4nt3;OGR4(b3_Xcl}6otVa*bbDt}Iv2krxpXp2H zQZ(He6FA*Wn%ua9_x2BRJnRah{-J{}KSV8f?&C8R`pAxmJrM7Xty<1Z^U4)#QSTi6 zgv$k@;x)R}6)ZH)M*z~ay#i3W3reiToVKH_1D(z*6}8r3{aU8QrtY-9nlC`cX3aEl z_!QPMKfgF*p8!%bXE1E2U0UZdzx*o6bcP)VrfKhq-bH(4_}*w}g=W|_A8xKij3!1? z?#lu8c)nzC&ijt=9Z^+V*uQj!8Y(n`4Q~p(TWvAuV_A@ZZ|Ee|$x;X8#0rR$m;D}^ z$9Tjz!`jUGxyE$GjO#(C`jd9zHq9UpA_Atc1RGT=vPy+S=Ijn^`)fJMNg-fRQgy%g zH;3vK2E+^97dX2bg5>Fvc5<`5<<{2ALdmJqE+SP6WOgV+7l~$C1Ui&Vw7?O+U55E- z;$cO`MzqiS`3{{xR3J78fBI6f%ZCck`SknowUhDO5RlN@F`Jh$0UPUF+ZGs|Tx31- z{9Oeh`)g)Q%=#9)M!|MLHjl^m&(&lL6HQoFsI6zP_(*#oTC?AsNkE_tR=Y}t>zf_rT9@p6k_dCKM2lNTmtqbPvWFec=RmiD61Z_XtW`|P;47Yz_y6UY;i-5vY(}moujs+aZ+rQ=R8XO%O zb~v+DT65K#tbON5+^3X)ZYQoh@8vJD=5}at$ZWYiYTN{}qG`7fVEKhfN4v!5uvMhr zSmQvc1`5G8S-a34uiuX5pLR5A;4QU~ld12v=mN;vA7+xpru^`XQjQiI_r1_^(DgFn z=c!of+ioUR#V|xBt*1+i_P6oot$zO~3TMOj4$?UA*?E+I-cXSKZhiN4m?->k{xR&D z_~6>-CcZ#a{z%}_mG=hOR?6FNN-3{dugt??$$T$hvKX)z1>c1wMdgk>2gCP;-h9+s z4{O5rQ?Khi_Py9EDZg2)(zrbuy2&|t((n7>mHZx@gibhv($M!hztxIAcB({6)!~Q5 zRAJnM^HL=t(Kp7QIQA(0`ezu+p&qi^8N>(8U)(s$V*Xs8d6mTQ;WpuQ-*(&)9T=oK zP~D1MqJ!eKAYe@8(pd>v&sFjMICW`ccl&SFpQcFAv7DF` zHG=sdf-q?$$g;(G5tvK97BBzZpfA)_0y3ZOr?Su~(sM>S?N@u)_c1jS#hR?GSm=oM zWFyn1Iz;w-1mE2yy!DtID8;oUpmBrN!~nEad@G%$#q79Iblfm%Ad(R=-$qD8`u;IpbHBo8e3Qo{MkB zXmHzw0~*h(w!U_12A+#1y6jI|`o}qca-ns92hz8ElN^NPzo(+$3yv8LyAlu()G-{Z z01L-lRDOB&&KDx!=wN`0JTtRF#&Ri5!7yXtof*6F}8YLL-^Tk0pWn^PEA#*U`m0v9u`2E_T!R(>o&tGVx~|V2l=FCAh)2 zR{){k0Igi)b`DY9qD4~@lWR1JK?Ela&FD{r*GF(Y`%j;{%HU{J?&2sP7hdmj4L3M^ z&S7v?vOrd0>Cwr0-Z~y1+&MwOua}2 zOrVCZzgwlEW-c|-i9Q4aXfQ&Wo9gyiVxqPWwZgtglzG1SB%ZyhcbgEwv&On!+VIsU z1I|g?1ZQeZ+k8lx8Q&q|%>hFFnp*n#4~!QS3Rm8yh#4=0WeE^Z(mIQJSb>&3Ysus~ z8ZoI#P2oNKtJ)WwUJuForGQ^T^yM(4dBv+IGkj2oQTdVEj9W?0xLmjob89MiZgvm- z>LQW->`z38yx6xBwf3gJm(XD@r8fl-VIW-wSyDE`h@z2e+uc6tpS3TA63C>1NQ#@t zRX50*mxhjd9h!sc+T5rY8IlAvc%f13N8ic88;|ke8N5^V zj&~a)wf29-jEP_sH&n0d%hv4G3L8nSUA(=vK1%bDprn2GfO5lqlmFE)MdR%?a;Xf2x&jSSIR;b#y zTOWLDN8tCjJ_{{+yO--owZnFMbdEqAlCJv-8Q$`C@h*fNmhr250T%1cSlSoh{Ojev z=zfeK!bn?st8o>T1n5u%k+FUP6UxbD4+$>(%&o zx1G<8jSXjUd)E_GMIBwMYpq7%Mt0a3NjNhPL_&B1tt%4Opx%8yVgk7E^wKy+xd`M@ zp4<+wXE>#0?sB9#M(-^LwrBN|$D;zB%}E~oT1KB75R6d*5J!|te+rmmZ~{wR+21SF zk%qiWgG55TNae4P_#x7DNBn53(~WNSIHimmK|6Gn`{~x#)uW=X(NK>{^b*h^_!A5+ z&Cbd)R;!|5N6E1-675fDDTY3PN-{FI+8Mg<6YlH_I+q)}zgFeA}+0#FAM|0`N*M0X6BTkuJ%?OBSqi&wfM6u@0X}Mt>4%(}}lmm?) zL3xn#&3Nk4>@lNeroX&&8Bgx~u$n9a=HwgEErDfx$aeEEYmtXrbdPynFMUam{M}NA zV;G!rL@EfgDZ+JsS~;`Gz{jI}?K(;qgKp92X^}01%di)`xD9SBO}N14{;<}Z4)>J~ zLEj@FIP+c=4Y7z=#%T44eORKk^NFcraJJdzQ?F zjKar5HNIr7$AJw!yJ;~OZHW*o=gWjs?r*%sWnIR%dA9%~If4%*T)~%kR?l6ozic~C zDA2gBw2aL14bQ?`;dez32^k!f7w&`Wqy)@+CVmO5^-kRwQb!9d?YCmUEdA(=0&)4o zFO6t@!@0G4Z6S8Detgp@&_35_fU*vR0$VKWv~GH+i^nrT809)s(Zfc$-7%nrXfsADm;*5HX)k z6pj_jaBKi0AnUA*H#EFM>+k$so;RO2ORj`bj6xbL@fq4;$JUlp`BwR#&dcvs%Knik zXF)xEGKo*R`!vxy56=Ou{AvOx{Z|^}^Gedvmhw{2L z%vKz}2edDY%3tNEnaHwZxzR?@;|Z~Tpt6&fP4=gUE+7LR5>?_F_Yp}5fd~Q4ZTDSb zmT>SbZo8PY5QSTrPC!he)8@dgK)6L%8@(NU7>97Gm!7J{3KLCN{b#*TJzgH~x3#mz zY!jXHS3TQ20y^q<>PHz&WwMxx_9;UNVfP(pv4>z9hV8YrH4rv364^1u-*5W_dNE?l zrzBP!QzEyMLP#HtxCI!ax63uRxwT^kd=7#}b=7QR%dILhoC|5cZs3^h?^!pzcSg-h_uHMBHpPRc@=GaEcczqQ?} zRd_PGmE+VXt(ebMZE7;11Yu8os#Klw=U>fJaUSqm_BwN4ZyRmCZW?W>W4b zWIEd@vk2l)X>H(>8sMhmPt>Mu+a~th8K2~wz>;wA^gv^sZJ9ujGND8cUTEc=Sa$5C z93lHy>Q@=T(V|U?uS3&7vm?XlzodCSt)y*nT%aCJxaX?je1Htc*+wdt_35~go_NSU zAZjikkaEv|`~BU$5p@yi4k9^ow6W+!kQ%z)WHs0g^~S6#kEK#M&OSmTiLTc|?-{Qk zEycIM#)iCiR#L4C`tTX+bSzBixQ7)Y%$&++Kke9Y$neuHKyf2$t1178H-2J=TpLM% zp$68^W#R)Bs6?I_{kX!F3m1$ki1TGfJ$hYXjRnP?5wH|#>iC#dhr}1&h9otDm8OK0 zWRd}(g2KKC%aK<|!O-BdE+JVYF}#Yb^Y zz0jGD8Z)L%!E`&+0i%5UXw(yvD|M1FCjc?zTcW~`WkBB~4*0d;#;;XUe@>HELd)5G z5f9uxFoj>r+s2p-3!(QiJ3O&Zr!XHujF!(L4*|X5y0$kpW>biUmnxPi`2iKI8O}-F z%Q-6?mVuwze6v@=QrK3H0X1PB&2HPKpJ5gm_V9JaJ*AXTrby$*Bj6*XdHNF%hMxUJ zT;N5M9-p0o;OAM^hH={rOmuZGNE7#Mb5JS0_Jox>Z-dO+l zxnnB%CFRafqqSD92zrG}z>ZAEBt5}DM|1zmyZsC`dkV1hb4KLD$dYkCaw=GnXX~9o zVV&rV?q;;7E6oQ7)uV6u_`AH&N%5;tTh8bmHU)DaOQ8XdxJ{vu#u-#y#^Y*}-nabO zSNc%uxgY-lx$dHYuEZ6RLW~@8}(@Hg37xK*5fhv1EacQJZVN6cJCG2iYD%UEHg40anHp6QuW9abHu8&MYv%F$StT6k(3dD*w^ua>xm05lkv7OquWW7E^$wgbEp&)GNooO>5bMYBWa!;DbzhV zF6~_PcY}BiCai5`hf+=02Awh``k;RhS>;vLn9+TIF;uvpdPqycFs!-aMU?4WD%}38 z45Q+p zXo4oU1Qqm3$YfZ&)U#*JTOM|_v#Y|AdA-e1k9e0nVstTEsY#O`XNSV0zv%hooKVFt zh|a_RceC_=Ag6O{G$n~{+oh&rQFIDH~ zPiK{5K6)yyyci@ z>>PcvvlCHWO8W@JR%ph-+M}7>NR>lwTJ{~m09b7oK0|4m!oJ6Wq!?YhEqTbcX3O&K zi=T_PfBSj{m1H6GG+t|1z4+Zl_=M>ZM{_7ZnwctHCXbcGKNF19&`Qzb!Y_Sp3eLKBfWncRh(x0J-bw0T)L%?Q1EGx#f8 zcWZ#P83!;h)lvO`?MI~C)Ru4g;m@*dU?64m82Ol-^>aO-9mhPAo(jF(Vsf0}x9WQeXSP*X~z&iXWelvX;S3CrPOq62jSspwOScpvgy{vFb_T##hS^|2Yx$xnaEf$%Zme2 z!S~RxDekZpxtZQ;8Cryqv*-^ZeB56yjuhK{`Q|RZ?^K=R&Fq3Hu>e+N@CqM7@4Epf z8O2|6Zd$$G&YUqBdXRU)Jf806e>x+4CU$o|c{=r4b@vYHTx2=uXkBQBl!H^a66-X}uO>44|NIi2PHCk!NBLKBx^aWGn};pY{ovphvn zw4atxHTOiBum}pHF>LW}Ap3@4(B(w?9qpNx9F~L$SySaR+4{$DSEbMZiC zk^Y@_fE~HqRRM&U+x^%G2iJ*B02iWz4k9GKHjVIZoj&RP{D_hwwR#&saj-u5+G;w;Ig}L1rd3Niif+5V@}&&cYTSDnCd z)Z2M=`*4tslJ-WEyvMLXszE4^Jnt1G4s}<9ATKfY7@1hT9RWqUn=TLhfxMA!$bXYZ zE+Nq{2lK&Qa&&byb9Hqyb2YmZXkG65PW0dftKZHz%h*1g{+?RTPWwFSW*vZQJT5|I zs>i)9NG8vNv$;AAyTKGkUAa-)hk6nR7gbbxKT@MLfzSrXA%u11ri;cM*wU10 ze#5Q)%~W^qfY;{V{WU+roK|!NSH_(&fIjk(u>}N~Lv>QBxykkLoihch_GE#oy(npH zpoYY1N3iX6$BMua{Vg7<{dasFuQ2!+vPRr5OLvtV_RcfZ!>0>))AhC5UN;d9xFKp^ ztWcsO_MFkLB~nQ|0tSVIO&lNA=fb>5Ldxq@9Pmv1Nlt35XV@i4q^>=-cJEM`SGLP< z$qy}mL>P62yYh&V`iFL)F1(;=^G6zBEYT`|`QX^x9)@a5LF%?DOfNm{x^-vE*}eDp z_e9;}@vUyOZR!DQwP^o{hciCe>)>JS;&cYx^8l*_?ERqmg3&j<(Ac8N| zM$2UmHR=0u{*Zrv(KJBTcG4e1wtp7yD*O!Lz2daUB>U6gs{ZV#MvQ^R^;O!fM6zO zvNFoeUsYrBh3paS7~+9Ekg7DR)A^?od|X?%9UE4 zN8~woOmDA4+n(goo_V&1V$Iq28*K)A>KUinr*@NGgiiLMhR{`+cn0|n+n&n0X-=BG zVSj6cllRA%fk`dsg@d#gc12z8LO4ThJ=Z--e;^oybx})mchM4$9sJ2~_DD&Mbxz!! zR2!7l_}+^Xu;8jKwmbLEBg)`#_8t8GSyG#O$t*hMatnv?#Xpe#aB6ZD3GcEi0Jk5x zrTYRJXAt%|f(c&Q3pKft3zCFE#MKq=I|GH8p3X+acjYsdkCEp_~EKe61 zRm&6?!M$x`9yt-%BkHrGySTnPWVH3O32?+(s0PMvJ^THu_1M9*KazyigCnd^b38|L z%b*Q}dpx~xNLR2e|1xKf>o1iUD=PYV>Z1w=TsD`+zRPV_LK?(>eL-WNIt(;6-_s6$ zLZL?_1g<8e$31L1T8M#Gm(`}}hoN(+Uw-_oKGc4!BUl!_?zs&a8{a)@@~_S3Tq8vm zbkTP?$XQ={-HF-jp8mwch?-Pr77e?}n1-39U30;5B9Fkk6n}0dx3Q|x#H@RC`540K z5Q#{w)xPKwF2Oxi=SrLv292rqH+hmqF~q;OEh2a* zVQvrBnZ$EYDI#SnA@pdf{cs?0R~5|daA6Qf`u}+?(SdJgA7?7efNu%`Ofrt`QA2et z+N58@9Uta7?lVQapO+RF+_m*$GdZaDT#!asiX|NCa#0}-NFnJ65J?~(Yg z?1Jy}HOQKUYE2k1{KpTJi%EPvJekK78&L&80lU_2aeQ>qPt0xO^3coa<{anKV~#*z z^D7N_2f+-ATOI|!x+7}eY|>`r$tTR(=Zkrqel;EZvXDpqOB(D2nI5xy(}UQ(gz;Rh z!DcVF&5`slP?1g~`*W;*Aw`#@vv>NN94*wV)CLa>5HXeQ3CPi65O$q;!~u+W^Nd#s zX@C0DLep;Mk7NZ0LjI3^+t&t7?v>L8mfjgE6-*A3s_?zt$pWbsQ8$<8K+^Q<7i0N% z;K|*Xr<^)%eZoaIim}l6*dS%_j6Sz+I{+mIXONkyYtct#WkX&)!Z?$$^LD<#eNpD9 z_IBQuJ*U+XWQ}v%%u1e>g~GLNV}%8l1c-KoY!6N(@lqFXDJr`^82PlM=yKB=-Wf~4kGA!F7Lr@HpC1ZkiP)N@C}2nTiiD} zbq$R?W~S{?)tTFy=tg~gJH^zRXxxB2H9ke_sq~3gNw*%(Qj*PXJgZ9=>V1H`GL+0E zC0Q>TgH4%X2~2tsS^#CX{`!i}*RVH5*n`U!?@?Uq!+p<;{59J>I9M#^wv6+vNs#%P?G`k@NC(JoLon@eYg6BUeffFZWadPwY1tlJFXF(oc6@}w7h<@ zdv~}#A$%(5n-Gv|jPe$ktm?KJFQm)3!dkLg;lo0Dz_?-frqPYV!pp4qJ|-Ps%$M-R zd0{cEc;=$nGod#{?n`M!P4~bagMYB6jeF8(D%rJON-ScQjozu`NB>^qV#Tuv!wQf~ zGGazht)3-w5UL^RH~KyuOoF*uE3IM!nJ)3>9bDJikYBLi9&4s-ksB4A_3Z(%H@jg= zHYy1Q2;VKkMP*EcwNf*qU`pHi?{|H|(kPnH6|`h;wwXQN^ZVp+jJK)V@G)tN2a3D4 zI0?Of0|tXl5JS$bQDv%v_a41<@Xz%;VA9!7Ijp(nv5)|1S1jRECv?F(7R>>WWW6=1 zv*l>-`ewO>2iy(Mi}eVWKU(A@RKM?T0vRCk9&4Z00Ku){IJRCIi2>gMlJ%a~VvIu5 zY_=E~Q64z-xaFkxs^_*OaGAVK-j=Pk`eWeTGiG5sawFHboi=qA6}#wHnNu)c~gOF+Rg z;63Dy!P|=d57iA{2%-{9tsI@M#HmSmj0wFwWc9MqM(jonqLm^8B2!!25aMGOA6N!dkDhT$H+;NS05N06*sK*|*sKl*W7$!;Hrmkj$8594(Lj)5KUWLmed|H7#H1d-B5GKxMkz@73P)bK_`eDp9XL zw3kvSq(79phOdWM?9Xv3pa4oAB6z*BnxT4H-o$O#a(DSy!0o7NJ)5>(*xTJX{qXB= z(zix$=k9LdAjP=zbSpI?a$G5j4EFV`!g}UYESnhCE2MT61eZSvs?pO8?u|te#>^xM zW8aitIrHyr0uf#1^+RzuOr2EV>r0GA*8B(&j(s zv^(LFdV)&&tLU{-l(Jx`(Arw}eovOs*;Z$jZQ+X^7QH@j}T)3)J`&X5ag zVJuWUJ7y8jsc`j%;Z#31-C8QHKn*;G##ahSBeZ~qrJxz?)WvK^rGx~PHX2I)EErom zA$(SCrp!8D+e#%jXJXK#djID^NAf{^Upn7J928xO^zo z&}^y416qdPc_<%7oMKc`r-~B#XAH&c^(^(8JrzHEN5gtU&Z#@7-=?I@Ec@rr*@}gW z>D~S96OV(+xEcoT4+_s)|D1-{&P|F%k^2?)raS1!bOlOCeRL(}$mnEt7Pop)<)30@ z-&83#XTy!k$PBYCfAN++mdp+>7;nXPK05q^O{McTSG~tsv~iHm>KF33oLALfQ`YS0 zvErkoLfNn2g3f-!+94!9H&g1l$u|-jf@TR2$ruDw48Tegdd=x&Z=v|*{4>Z*?JaC` zs61bb;JJ4pKBr-sYKI>M%g@(*j+6wVgJ z-SL_tI6H#mUQOgXlWB^Z$E}OJl#hpSzn8|+)G1xDd7N1;S}s{ zR{8Hes*Qf;&GwVuQny8(7adkjU90-^8aWe|H!R8Du7(Yy-Ya8fm+YlrRa!O zo7sL5@zNuw%#s5BMUgUsFRZ80L@j~5DJSs#&&>o?-$-8P9dWW3#V$XvS@8w*0<;4U zwL@5ONEzC$XjqKTcWSKiPBP}D*k)*NFVnfxUF_WM-RSlFn;v|vEvHLM&v$uVg9niL zGwXKD`PfE3kzy2C@DQ4i$>jt`D}|P3M5oN^`;ER2#bJ(}S7Y5a42h33!TU!!EM=%m z(5ZLIG&ZetMa7(NLu0ol1x?i-)s@rD)M6zr&FRu>k+c(Jr+9uxNfXn@lX}0(4JVi} z^&4I1Nj__G45d_Sl05&NJx|^TRt7vF)-~x@p^$*EwhR%b&L?lPM38GOdCSmq5=etf zPrYRk-=ZIcn-ec3WbFkxT%Y31)tzL$`TmX*qVV|kRh!U8hDbpqH_Ftr<9pBxG9zdf zX^1a*6a*Wm)Avd-R=bB*xz$?~X^LauSrI#^@4ygTq8!)Xrr=G~@Rhc4FFkyH8TC~W zpCXBC9l4g~D#rhEa#ReKbhKD7@YqmT895V8`%3vABMrV0q)?B*h$(39Bn?6Eo7u=h z>5;H6LEUj1f>!Fw&l`bwEj&E_oYu3L7=+@YKf}E5uP4na=HJB_4pCXnI+V8Ix0B&l zFGoM@IFuT;1_AQ)WOS;q0lV&{i-6ZKw`m=k<`tDuu44@H`|# zl}WYVlwP&1o17?` zgz$(P=cPv?FV?zG_d9wjbhDpqtEoz z>}aCU+NF1FM2vq*kuBV8Q2;JPb9>*eP7G;GpITYcT03V z1O@iK=JOw-r$}mSK`h`p8Wkc*oq+@Ci3#QpWTQ8TxqjxW`AKH|e9Ja3VEO!yK_44i zyKHB?ASyV&JhOj1vRJ;XB;dFfpqMXPm#^38>hPl~UI>nmYE8h3R967hE~Vb*>R#5w ze*b*#U`!97yZf=E zG`;T#5J&FA^V{~KI4o0JW8uK|H>ltOJrE}I*{7bv#OAS)_?@p4nbjq8-|-rWin>u&EZ>4qF!Fkf1VIZ;G;=?*Dv7p98{{Q001-4w*9acSyp^ z5?*^bX^zZXS&v7B%R-lI`!uvILygdu$K!BkdDu$GFzn50?F=>kjVsm*00|!Ub0Zt*8KvBP<}JLOY1yY%b}ZXU zjE5?Om~%iro*^#9CFH~3tF%nicDD9&W~-$9=;A9WYS8^_&MH;PYFO@GeE+?B@558Y zt;7Hn9&#xzEvuKL3=;ZkrP{8&o%Kpch{^~uu_M^5V@trCkUWYN>E_^-h_mprx;e>^ zEXbC6nx=?f!uIgTd69X<<4ni0n-a5?bI7puK5IB@?O;yv=Kk~4kLR8joUe zDp{}a?Thu`b~}2T!e3cEui|$VLn-=4m)>QuSo75(e*+Vc=JF!1g`puEQwqI}BcRXd zc>e=QFeIGVOLNnxT$Z0o2B?v~d{GtM#Wzl6VnxMGqu+V-6ZMj-kTd#vmA$=@PiMrMM! zfU+VB`w9E)TboTx z_bF=~1^7X)j<)R)p;BfXW&l*DPWx}A*PWP!L5!_HR@Bej*IPSO$mQeX%aD) zDr{SDNq%K5*XmaQXk|v2O9*86#P0cVVHL2Z>Nm@;{WxXlMj~ZTjxeNRseMUF57}IH zj)VVPt=rp0#}o{Zs`e>zh^(4X+tK|Srup}utpr)R_^sJyl2inBo)=%(^y)fEH4hd% zhOp&oEnlmn4YFXq!4}3LO$$wYhK;R{~_}CtMBjVH>Zjs zwm6yDN)7I+$k-U1h?Vp9{cbEPsN4@vuzxoq=Y_QRt~KneKgM10Q(O5;7_$axykY~4vLS0V70 zPntt46EX0}&rZSE_=66&HpX5Zp+RDo3BlDjGW%Wn?nT=-7XK%5M2y0$7yB{O(K2x$ z9{IPe@R9S0(S88Rd=yeh32rX1<|VCViXwZZukylWFVBi}LbAd2ZeWNxpjCIUyYJ66 zM;~z7drYd+boJiW<9hREJpS87US!Ks?^ojB6m>O136KUf`0_)`~%4GA0WqxU9ygd6naK#JXa!bZ&HF zoZjU;vEmiLEq=?54-EB>S~$hY4`kBXT@AcH8)n!W#^DUPpNMXheZodYCVkoIE-=*z zJYFEMT=JI`oO_Qr_d-}ZH1hwdXrErB|HxWJ_?b~hGFBF_dKF8%-1n=5uk(q-%3Y0m zE;pAXQY}r{g6KP2{-$N)31sAd;7AA<5G2F~6pWy1eAzRHt)Zvu4JOm2!%pWrhAjDC z6@eL69wy<3r<%oiqS;9Kp-^P=eSf$eRBS;aFykZ3GVpD{{oL1VP0kQwXNE63o+I^! zfIerTjF`#n4={u2>g(3s&$+o>a85wk!%bjxiFVj2)zLLQUa1G_5X2{9Ehc@q#}dEY zZ!b;05s^~1&(~1Cp!6?#&BVhqxWYr0-dQ)|JLi0yZ+Ul(;hHx6M~0we@Sw~%{MSM!NQ7FqfC z*Xvck255)+GGU8CdI0!cbzv`b8%TV@xILo(_99=VCk*eC5vt9454FPIv$%w@oM{MM zz6}ks^8UMAoYvIr)K6&P=Yu-OLy%8;I!)&n7>h9KhM)0+)bx5i#t(GY2JcZzPY#@j z|99dq8J4J~0d|AjHIiy+|{T? zu5Gpdv-B~nAcKpthFlmqfdO6i6Ej)x9ZIcLrfGavZD!2l)oQo6CYsqDf!pc0-ojUm zq!vahRP$XG^;g;>-IWqj%inJAa(M7$p4L0%*HXp{*V~(Wz5g~IPJEZITl>t+-+rp_ z?L?D@fbLE96LoBovuuJs- zJf6VBF>rmRH5JC3^m9NDu2Yp)`TR`Pfe;`VBWEOwdQy&AnkC^qZ3rRTZm=byLXOS; z1cODLr+kC8_RGKAzC7w-9{)TavhxkLzpnO;QYab>R)w!^mVMu-Wi)y46mz|ja4FKB zWPW4X7dtVdgRysI=Hrg3JJgD7weez2 zloKr`VZlHHcjE@vGRha#VT~V)j6ZNp`|eNs7+TG+7YFWN++~E`!aGf`j=N9i%u7(% z{!YNJYngpVwb`Dc%Nq^7uU-htA|h!C0_cd9sl{NDpOFpl6t^oc2`|;Z4XuA^tbI0T zo*r3h$7XC)#elB?p`pL)BBCZ;uMu$e3}PjZq_SIT+9#S3UnO*^JpQG%f3Cy3O!|)3 zMth*!Ku;M7s)*22Ty1VYjyOmQO_kpovWB>~G>33A(+woq$3{}ju`p{|97iJ~Ujnp< z6xr&>VYy+et)5eRGE#W3X7QuMQXNb5t=(>Zt0}kBliuYLOl?)D*DJ$daQyZI2se_; z@b`~?+y1H2>oUhfe$S8O^Md!Z|7_o&2sGlG;RyT~v`Hv^-$%awd}UsDFg+KUBl=Ep zm&Vs*y>>b?SikapdDHm>+h=0sX85>^Hi2@ya-!8i9+h4yP6y7|-?V&y!E5U-7S!t}^{ZR|=oOEZhNDumLe| z%iC8`p&i5ba4o82-2XW_`RNgUqScLJh4{a`ZSg7i6}y(jRXF=&H@b&h-DCml0t}??bo_6@;(e=5`;&?b7-Zu`XBDK472Ro{}XNv zm83DwG7Y*$w?lHMmvjlkGeKP#oI|p4~+|K7U=dfcycgj_8>ti&kPe59z)4oeN(&@nv8nX=T?( zT#)%8)LQ@jlk&7uD#Tmj@7!(1X*8Av2*0;tGm0&8tPPI1M3(nMeiA%>k4*#KqZ;aP=&4 z#_|I48M>goUPX>!UYTY0r0DNsIj>MaTXR#zFY;U^ZNA)Lm95JA zTCwNFtFtZYlE&DriEOD&{$AQDqyp7U4dAY4Cp!C>9S!8iUY9p?6PR?JjR+|YDT$Gq zy(x^3S1 z>JLopM?ou?h4KlG0LDr>J*;iE^&L74?`Zv>!)1jJ$zquf67Ph9O<*hs#e2julG#f4 zw@z$o8#)$;Z`oy_5w7niIEBbYdj^z@f^{WQAE1+BU=`1j(D z(f?WS2#*l~7vKuPs!;YC*yw6zzpn-dmOfY(8Ved`d8-wua2>`*G|#C_7TCXm(_=;5 z#(>SCh4(?oO?{ZixL%ij z7(4;ifs}U-K}IxR!19B}2?=cEIAv4^zg%El-J-I8`lhtYf75Us;Eeu-FzmV?Pit(;#}GlW0ADNdXrRR+ZVu^;(!FE5AZ>b$SN zeLT3z=fZv1NWkrRo@1|ZDm<-{UOXU6?NhGcm%3TMUF_vc184YWeM6)s%yJCITMf~e zN@8D(MZu~eucdBu%ZvpDs8~|^IY?a$Fdd<26jh6>y}vW>cUwOE{MfMcIWp>00tDmz zXdgZ4s8I4}md~%Rhhu?}75(4oXRazArzfXNA*0${wS+P*ALZyRzTH9{eVr;zNu%w& z`V+n*FQ`{so;;C!f4o3c6-wmuEGNVnnz#OyShK3>4HBUHvM}3~=%%xt=ACB$^AwTL zL2?B^EyXR>+L?+m3MXrG=?4VvC2ICcDHE@6Y$p5l~X3K{^E_q!uA88bP|dq`MpL%RcAa|J=R*JBDKobtntI^?mQ0 z^O;ZRK09Zki<7H&NoE7PW);m05kzTvgr21DI+|aA>X&XnR3|c|&~f#>>GQt>nl!LS zgHT$SqLPh;{qD3_glxyrs&^F+T@xr|vJXdHKTQwuj5g1v{k+d4v>NI!CcoCdE2D|d z^^8@CDlir2b&Kd>J8I{5bU{ASYy}$aA1~LaDw-8(Y#&ZEKIk(RQ1DahkuPNS7MeNh zoGow)H8SZ)o54a?Qxjf2VoB>0SCH zS{#}%nHPr)=_X6pajBILP-i~FJ|pxHpkm!v#&P$= z{bKJ+i3fqh=qYCoU!Lw{ADpWPe?nJ+=vEcFmneR9V7mtG2yan9Z^ACWFK*P#|7VJZ zrDOQxW4}KEBqJtJ&bc!1899;^N&yB~?0>-xzd}saNnp}h5?5iO*|QQ&96yvZgKk~} zX^#+}ZzMI{9Bvv0SaTZv$+yNUD>}M1@=7gFUbFyqQIIkQ5ibQxav?Vgo*p9b8n2v_ z&?|PYTl-B1HkobEENFG`L-V0k!fG0i)6};lD0b=-j(v*r5h;OfiXPAj;_aI@&Gs_H zf9Es^^Sx7&y*qD4k^V`mn2xz+wQc0y;7tDSGub08AWt_2lI48vIwXT*t4E?L>~QL+ zwD=Z}Lu8Sm4D`cR4x%6ovPJf)#3uldV;|SSP`s6CSI8$cpMtWlv z6Fw`7>AhJ&-#0Ro|7YjT^>E;mz%cS80a3Xi2-*-S+c8~@`c$u;z#In(4t!wfl^?*u za&y>p(8@biz5Su_RD;KJE!he_zS(d<9>m>5S|JOT(^TH~a(0b*Cc$EJLkSlHr9r(sILjW@T=8q2Aw1cXdehd8T$il%3&_Vm~ z@>90Gt|P#Try4K2n>z_mO$X9ri-w69q{2-3iU@*GM3|$6zZeXnn4@7L@R-|h#}Y!6 zmxf+ppi1X|{e!Ugnw*cUcw%BHKzY#R%bU`Ff@&Y>klyLyzEY?vHr@lXDv8=d0|jX) zblc75HfpWhdY@Tn;Ja7fldndsFm&*Kv}?1jIH+DU z-}lAe-EPaI@?+17+$4Aq;J@E)M<+Zg(&-rEE&WI%_D4kmm%8v%&gO-9aECaZi;cd9GwA3t&vV2~xQe!I`S>#rL81 zKiBj31QRw(m*88`J7^FW%+VdQ)-xJT?d9O}NX7m6=v1t2fT;9-eXg@QU7c#~wiw5} z-FFp1s!B>MYSz2P-<&76o;&^VTmjhxT^!*vX~uKsN-i|{G{Fmt7ULR7#3UI%g|#kx zUn=oeI|YOT6{CcI9p1E09M%;;u9Z@40DMQtW7NnY&e8FMs01N*lpOiPlM(gmzPB`n z3ygFUI0gLs^S&?iuoSpt<8QCUa0$#py`&O3VnHzP@w9&o7t_&i`7i&V|9xNp{lbSe z&q$@B@^VOE12%~ou)w2AyG$1+6X5u6N1gs9jPO``QtY$F4cNtR&ifX96>^`#%m!;! z?$1Ank30d%?>pPu(V5>iTceimSwcr+{cg8HeCiM@0!Vx)g=*49%M4@(TI6{uDLIgU zfg+=jo3H~Tx95?d=k+eV^c({B?}Q&xbxxj74Mg2uqAYuwrDrR^1wBVZ?dKAON^T~@ z5sQPKgbxMm<$Y{*d8N{@qW?{p4J^dHP^?=PtEF++grA^-n75;Hhyi;_dQf%wLYhHz zIB&CurXd;?LMV1d;@NI91RV!Jw&*Dl6UCakAi*`$HYdaMPj`Yuti5^MKj@Y;CupFe zo%CBm@zR7nhoHAfJQm@LVt;rS{2GEm#*;LJRdlco;Et;CVfJ}y-@bC2NDCOP>+O84 zcq)U}^MIu$-2vHV7vL}dLOlD`8O|!0yptoiOjbOQ0q-d z9Vxh1HVHS8E+VZ&w-}f&K_PKp%?ed{oy=WlgHHS`!*cj(C1sb`Qyey=dB8}hb6868 zOh=YW7wKb+$YfC1DZ!h|=<(iXk4-cv-QUcbjsEwKlr06fCyWzCbt|V)cBePSjMd#4 z8T#jFl^nsfibWm0yWHqa1Q#+2l=OWp3@k?zYHY<+t7A?CEtir5ToAXy*k)lO_cu9S zlpLcqL$O~(Mdk|Xj5|*Md1^P&1B&g!QDpoi*T;IBDLWH2;B*Q<@?<<)%9FD2+f$HB z9TqPv#WxgAT-FPQfKm8A26^@i_0r5w{BAsyBSWseli~jOg%kF202Z9t><9UjQElLY zxxA`IlE#Si!~6~1g3pMY=!Ic0NCg~V8hPLo1bQR=W@;}mYExlgaY@>rahHu`ry|k) zol>nW9r>1HBlkmz9k_z(OSH9IjZANO8=lH<)HT~G9)aE+mWl)kC#ob`084w*{;$)i z%Bb?XfRr$yo%}uG#baIfCDQ)?Om*`N4hM_Rb7U)AHtq0T3lt2_nN%m@M;+S8t89dF8@Q?-!nayQ>9<;gyf{!SgRlR4O&NzZ!5UD3|fR0u3 zOaO%lbj^HWMB_Amfb-8a#2Dahx(M^iUun=R+f*s&X9C&M3Y|)=q8d>AKv`tb0TInP zn=7zb1&zUVi;nvx{X{dt@G<fVG=1y&{!tMOUY%Vamhjk5huw z|FzCk*9Vqq40vLlZ=UK(wyK-1_mAa0pvCEAZf82BD8rcE`_4jp5zlHwYrTq{494w_W9i?#6q2O@Wu3W=5 zQ3Bq)`Yk0V3~ze60SHe}h>m0e+`hB1P!!cCkPE6Q*q@GCJVjl3?(~~S_f-VR&@2-L zU{k)L8N(j?;IgUmY_G>m3=LyME5t9QdHB4Z11W_;Sg*W`yOL34#ocICM7l86jqN#j&WOm}T6G%Sy zirN)|sQ=l@pb^R$iG_Hs#%1x><=RF9rh-Mvc^;Vxjxdr9`Ue!y^q7P=M!lGbxATXG ze-*aFlhDr)ql?qC>jVD-T=8c3h_Wm-ZVLrP9$dN$SzOUBk980j``+iULvgsm#H^^~ zLsuL9KL=V`f*Txu`o+@H-;%vikK{Vo}@q|L0&{p#}{(UTujKfT!>_O-)5uhm>1 z@yb4Q5y|l+XDR;efoZ0*p)L?mN* zxPeaqF@0U8AKme+)G+K}K4S5|{R(@m3X1$#`Hu!HKji4*GDG9O#)mQw_EHz?8Qapf zn9|h_#})qfq$V`VMQRF`qlH!CbC|o&sy1hl3(08?E|;TJ4s5+ISL=@E+`WO(btw>T zT*xj8cg@v{6iF|TSKD~6{$iASw(!aN?=v6ZlEGeq26Tz8d_Ihbrz??t<~zs^?Td&7 zE6(EH=p*wrtVEJCG3-n80)QeF_a`O0XMPtF3{rx`UBy5HVN?xQ>n{*jKVBS8}fG@Fr_poOX z!i7dxXx551spMq~#Vj_r-WVVVBMR6GK9x&6i;P8Q_Bc}n!?Ai%=eL=RIc+f4wLXuXq~w;_imDuK|tV8g$^Y771p5$4mnkX<#usa3a8fKMjIHh(WyfnOwlG z7tD5ih^!mD;nZRmw~N_yICkO?48Nm4>wi8mhM{gG8`cQZ9}G(V8dJ(oCDUM2pSmks zO*Dw=O||D=!F;9&@8u~*!sTWp#VsZ_7`FUg8>x4d z!WY0SaN8F(Dupl9mCtBu(IuXoaAE{oeFYN_cz4>U;ZglQ8afOw1fYW%syB@(;vZE~ z|N2$JAbo=f?i^j0Qv~pg106v!o17B&PyBJ$q}eFQke_}3RQ9D=u3?jYNn=~&H24s?(A`|O2r4x~M>$8Y zQuwaBnYJYOqW?Fc%Z(JMjCZuV5`qtW7|-LHZOqudqZ#{xNbd;HUlu729eok?l?Cke zC_PBA@5O3SI&0_arH z_z;vnPd42aIv&ECp;x8ZEi@I|=E!$;pw2#ljfK`OJYFJt3P@Zw{=qQh(_f5YJ*d(=O^E?qg^8)lWCt3oeBJuTSCi!&B&+uN-!GcMDE>^Je95T6Iok zr0-rbb{8stAHATdGB<>IAR+D*Yu+<}`2diTM~zVR<4O}2r|KkvR63s(Io&e(s9Cz)?$LR{x$KukAqWV%G5$r4|`0GMHY`Y?p&ksXAG3l0PIvj;F0yXm6;2%r!G(ht@z_@^!;z!w*j?!MWuC0wP+CtZtn!1PuM zu9Oy%84V93Vi%1On15H~bT)PqFFfK%6A)-gVk_~&3lPJAm#UE~`B9Z4=VE#B0#TMy zpyKh`s(eZk-vc1~a8$)>S8r*OiuqN~Hv2CWW{6KA@Qi|epKBbi<(EtLGWqU%B!K38 zDBtv%1LAN6&j7QZ=kvkI2)-#;j`513FFJRWJW#F!L;^u|f8e3Bs6NmN zQU$0JiZ$)YRz4M}W28tNf>)9i^y?L$Tk0^RwadvK1*i)?LxjEgk_m$!=yrbB zY){x1`yb-p7wJ$WZjK1NOHWL(1$_i>ClRD7U`PtUqMo+FbY!y_AS9BAWEPWr{3#S; zIcS#gHI4x)UV2Q(WyJ7=;ZnT~x!6vuO_*Xen4CKMBnQ$}`%WQ_%avb5t|bFA4srU7 zN_98Q4wprx`JwLnWx(+Beo)~T5&ZLK;qWF**NY~>&G$`KJT>CC=qr>^%GQWpTB#po zpqoV}eje$aqEu?Z&X9E$p4>>nL?YIdll!JO%E@A#xYK&1K#UX6dAJ6qf5i%oj3w|W z>ArfnW_}C~7YCjz%WY1lhZ6>x5z`uA>+>fsF&)BU{J<_90EBId+4o9yts*(%b75!0 zy_^H;X7!ADnq^%Ge5sBgs`5!NU{{}B$%?}4& zjvPFq?}AU|8$g0)1D{$9IImKs2$G(p11%$U9@(=Y4qd3Kkmnj2ievM2X)^)SXJ!ZP zuCMLrfp4p+_$OX~rCNk>Ye9zFm#s18Q)*U5N&H~h_U$qOuJugCjIzGxfvKO3JAQO% zBnT@A02#;8#fns4mmpecg5f(LCU86!vY+P<+>$!_BNIV}qWei}@8w49R5npkGZ00N zt*_bubJap|%itD1_}4~~l!az;Q2na}7V1)EM~sJRdJ*xUzKl%820IN7YSrA=v_NhZ z3s_6vxTWBkm1$pzlfxvKS(It(kq@V&mUBKfUs%!>nk&VmMMNFY4gWu~;=o0q*+d6QiHBwO>DEGoL`RYO^;65?m%~+-+N3=B zk))%?#wzgSgeW|rn8}RJYc?_K>BUdVevT(mQowuH++=WJT5)O*YoaPxeEafio!i3! zG0l5gf3!Fg9nMqtB-_yQmUi2#-dM#_2euTqJ>poKAk&EdC7sr(*5>{3gpw1#T0N+`pb z4|5`Yp_h9K`m!NRo95GTV|CJJS$34uD7kXz&2WzbUV<}|-Ff|N6n;8BKb9y2E$3A& zAKp0p=b!J);7i5Bi2BS$K}~azL6Z9L(_4|$1Vh&ytQSCz>6OI8`U8Ak+!MKZcJM10 zOs0^FM3{YZ+R)X~E6?M;{4eY}Z|@nX+P}3FqH&)<>^>N)MUtr@qc4yADgjRw5(zvL zp53IwAc-2Ra2Y`0(yLiEQ?tVWqEXLhVp{E4ePk7MB;@{}F-T0C*#Yta#Uich*E743 z59~p^^GFPG9snZur6%G#WU&rI9Xhq8|KEEJkaYFHl>U+79`w80m^XUTdB!98lIA#t zfMqzG|AwB&TQFq^W!K2Sr$Tz(&-+tMbDF?Da*H85;v*>CV72udW_{sM;rkm+mF7E= zWZrL;e|i&#=AO*1Ng^CBckuYZxWor5*LlCGTEsV67wp=$^v62KxmR0WxW}AG0Ju5p0kGV_iD{6L%K|hxqE%|8odw|{yH=IxW zaNDKkc36yMk-5_P`e%^~vPTjHr>3t_N|DK7%J2(_`!omxvAh%sF>0}iZ{#vn@_ahq zyk2NB*v2f69t)Ne@jUF9e&TJ=#(4G6{ZNOWfTfW@2oZq$n3g9lO+t?*wTeld5Jq@~*l{^y=MV6eGkt>%-`=1T< zM-!yQaR;D7+z4p|pGQdnkO% zY@JS|az`MdzibTcRK$}ORmJ%55x~(K-_dLfBQ-a49LkB_lP@Y#qQfWDBhQ8{lEysaLSiZQ3=88&~iSoEJ<;rDmR=<%b&0(1Z9COe&aCWUVwnE03%!8dE z>jx@c2Om_abg(s25XDvh(wnIiDNan8wnh)((g&OBCQ@N*(scTdLtqO|jCeFvHDIY6 z{_sA3l*5bfh+X>63q})|gbx4@j1VxxC4yLmH|BlQY{eS4EI_-NkpHGPr62QkYv-!N z`JOMGRG9XYgJV%A)8fzRzX%fts+)VF;9Hb)-X_CuX&R*23$}xJikv~@pyvL7W0%GH zJe9ngtzOTt(Nd9~QGbZw$M7d6ooZVwc}bUAtAIY4-Is@U=uxCX81(p7}JfbLs{Ej1;{qK({O`zdJB@N~A*ckLo z7V)lpkd#4GNjW!6x@zLDPUU2WbF)@7C$c7~IH`cZ?_`7PP39t(xx7w1b=l%!#cT`` zE!|+2q*=USKL=o=k4Lp(|Hj-2rS2!2GMe3!L;&&(CB#bj_bvNwyP}EuKdBzze0u_N zpClWlmuaBKd#?!UkIkis&qX5_psYU!SoZ@dQ6OqP)XV|i1cOAMfF&-OBAy~HYrIs1 zX2EYJ6$tt?Res-z-y$MHc4z#vN^Q7-`@dp4+Y73{1ZEO17s1?UQrO^kD`6rJpGfUN zw2~a@-Z1{1HD$qOY8XZNn@=jB5M3nLyO@OH;zWF1dhgs5R|*nivo@p&EuyyPezJ3B zPgQ<;8F`+Ld4emO^!cMu1Q<$>YvdJ$#lK|AtcaWM%uq3`r6Y&n8g&x8d5jtNc zR3Kw&)5uVX`3W;}g|4wcHNYxHO3)gb633n@#EU^Hmsh0!^D{8bQtgDGPncGko0%{( z$|pQ*ReTf;7n(-4I(GsbPb+{7_yMys?TLE}s1%t4$>!2owC;N+O#`n#=R2(Ti>Q}o z>UemsrBqVoCqrz5y6P zAK|c-*CXW?B$UYjCx|h|T|GtYM;o_4%)GT8GwDxE{b(i;Yfuzcev!y3)0YzbRKGC^ z+s<`kP~tYbAMG8A@-N-3Q9hS*k7?~Xh1S+Rsa2)gYku2lH6k{xMYoI%J0MAKs(Lr{ z;&}VejA|}dSd>G(NY-h+f5GW^O(Ht_@HC29H9ro-bI4wu%(w%MBQcM<;WQN(_2G;pHXrT5f@MsrW?j zu9wm5ameeDTp2oOjcT4O;p$H7;&QZD|DCmsql$lYFX(ExP>2D3u5n5PCHR#mP5eBf zRSIZsa!ehDzUv66vtQ8mT!uv=;?egQ?j45{CvN=oo3Yn^oy!0HtDvi_o*(_WSBj9^ zj*`1zJVO5W4_>@%J5l2~@FX&e?Qbj_%X!!iN3}U%o$`8t;3~IYT5CUtnFpQw3w!*gjj|*MPFd5 z2!B$niD)hl{Q3RvZ{0}+T?*YM^&=A;k>i*b_fV)`$I`(v_{|xXlaWj?E@QTch8$uo%8A^bmT!xTRg7|9A$211SXG5uF0acAG(h9O~DhPwJ;(=?uFeCfS&_*U<05Lp~%|T8>nY~bs~^u7i!c2a;L`7 z0@1OD7&q_fz?{dDBOS@T&Pfu%ibW+{5JH$?NlyQ%$og#Tynxp)D1;wyck&*Bs{G_) zA9Z|%g*+xl+MmY!CoFaM1c!bFomH+cRp9(rzz4!+F+VOQKChE^+SOJ8im|;JV$D_H zEH1D_a{dESyAC}W`7r}MuyhURm2v|egUcj;dYwkR4=x+|^!)r^IPA zL+8*RTJYR*q3LHqL#KyWA^dV$Sc?$SjoI%zU`P1POOAHmG^OGqSbVwtQ>0_C0baNf ztxgSvvZf_|B<^k;vtFaP(Z7E@fSYxfA^?3M@ZRb zy0}MbTH^n%(I3qafTLMBj?Z+p_vhpW_x)mwn32v&V<3kBRt-j%Tg9hN*JpY%F`%1$ zt|mbrR5XYb#hRaB~tsA%JARTe!nj{Qx|CzO{6a0{)tjsQ*pitLrpFHmc+Q(pfo1 z!Jv){y$@^qQa$S)fIZYO$8 z(e}G_E!s<&AKTMa{I6?;1BaCP`s}FJ8Em+}1K$AWzi3jQS61)X8r_J`C zH|WFPEJ`8#rM3+F^#dp|To2E_I-)LjYyfEr`1bz(D2$I7lt=1AdMp)R5F0le=mAo(9WRxhkqHDac-*l~jMJ>t(BF);3Un42@ zQpZ}8W`c9XytLVBtaYF&RoL^#Q`xxJAj{X#Lpq@!_@bI_sWEW~qk#(@3&PD_gM;{Y zS#^5zJmX@d1@=}gNSK%%4cE}KSgisCyZ7s=;2)ZS%l8GOI$F-ue4mQ25Sxb60C{Mk zYTr~kd`euSnzJ<4rN;9e$A}OT0TojcB==-j>b=@1nRt#zM8xo2r`GLd=PDcnXm}_` z^4XQMKh$4YQgal%W6hy@DMF^*&?0!S-+Z3{K4$qEaB70vC{86$R%WF$@{LHOudqxR zaI(~JS-S$_nn*x4+JAqBGrbPZt;*`=^PQ=jp!WvJ-V1J@=Q1{CSKLC6_nVPut&g=b zX|08{ua}5zM|EoLWI$f+@2y}A;*^>Z49-Tw=G2|pI#m!VgIl`0$w8?&UAKfc7_3x0 zp)5K}?yN^-=3_-{uR)-cl=(n9`%JC9!2Te#7S|m}0^W?K z=W6~il_{&90q>}_x?1M^02Id;WTexa?}z@XT{w#YII7?R7i_}os;L6hCFeP6VGpIb znRv*4zlXn+f2awpf%+;U-D``v^4AD2#mdq@U?=bdU4)7I7)V8UfEYaM2&SEp0Eu=G z)W!rZd5$d~N?`?u?Q~V=GZ+~pI4j_Ep{DY#g@zKv5il1mnguuRIl*3d{JRb#Xw`T# zK=8-w`@7q|Om6g03H&%xY8UQ+sj*^B+wF2n-R9dfosrE*iHnDhE<@B82{EHUAr0M2 zx`_i0r4Dww)|VP$baQdo2lEDDjD4KLU9gwHw;FjJqZv}7Rc;taz^WmSMe)q=$H$gP zkTaYrf#%`^F7*(ms3DzTS`5lrOI^qih9J~PJOCcontEIJ{$xZEXtH%@Jlz`iK)kC3 z%H;3BCr7~wZo0LgfmZRHwTK8rM$rXfvG%M_P@G|pC!UK!q+2e_BkF{oCu*3IJPQbv zVnSBzp&qd&ZDf#7%H-K|lM=55#02dM<6!N589`tWnFzeXhc)h(#4(@2o&nHM5_fqW zeINIrvl8{3dW&z=J_>%@sPO~b3P}IHpRd74UnQyP5Wx&ec?ja2?fU6`?nXw8g;_1g z`GY^QxCTe-ug1q~`5ruRt)!a9X|)LH_K*Y915tRAEHl6l#;h`S7)1wTWN;&Jna!tM zl4*eNG8#nh{7Mqg!GkZ22ho2aWR^tM`o!Z4)mek@bq&{+2av(MAx9Y)Z}dD)aT7sl z9}JNYPXUoBF_-&0tb*szN{{8M`tE7r#TA*EU&~;Z?=PDs==z&y_AM$MS(N}KVg&Ty z&OEq#`0&K5db!QMaBQ0if2;3dIsnB#5*K;=32YLlQ*m<7at5`NJ;}!b>@ZEfeso7^ zJZ{+_8F+)FINatpZ&fQb?k4^gv;R?vZk-|--<4A2(a6?ymz;#PR^YJbQB$A=`F!}H zaH}&j@cBicD+L!J@;H(OyQ`O+_6AG|RWGyU||R4oj^yu7y0EQIys?oz#@=k4Cf)jRaSi zf5$poQr?`+*oT5-(r&h8LFqZXu}nm5BP$%du{Pm(1EIDyHTsT~TM=e|`7$$8>BrHn z4jIo;(rk(HE5G+yDGmebMOhoSX*UiB*{=L!?+0U8=_m?PyPvlRd(3IbR?RH4{%Li# zdvy-1yF{~N)@}{K*A2kpx8U?8G|kvCOCkuxXxeiZ_~{?+XgB%P8D%5>z#W$IEhv&R z|H%^bVbex$Mzm-eKc9uM#_VQjst#OGB7WeL@38$nIBDFo&^xAJ|OfM45p=*UEfPno#X!^wlfW);@o}dNgM@jsqX1oL9*c6G9;LF98(++)7xQz#MGb@*z0P2y#GRa!Z9 z|2@8@$sjRJxg@9;NY5?Q4F7Hl+mhEd@dx$?YBx~Km~+yCOZI?w1ZT+l=K zIXPIZc{Tq@kX&zw zIYyz`a;H1JA2hY%u#4d5aEkE!ObPRB^?a;)r@JrKg(A9zyA*jhlYmmqsYaW|s5D4e z+K&9kq{CRyLG%6X!0(7QXZS5fu;b<`BGGudx5a0j0lnLfv`};*&E8e2cd-OqO+`Iv zTv^w2_1BuVWY=!EYQ;(eOLbA}9J-8Cs7xQkS*QlAcTCEd;P^;K?H#rQyb-pGR-bqEvybN z%3b2BH>1!OpvN{RcvP`dq=$$VWeY6tDw<7v;fQsi3rpsv0MvRmx#CXPAD5Pde3K?r ze!ShsgXJrubQH+Sj?{?X>PtB-`%y7+sC`Sar4n~QjcHiC?-y75s`YFPa^nAtivO}w zqltU;^u%mwa5JcdokSBB&HHrua2ZSi(PYflnCaO(RB4t8Cv>yA;$b8$cg>YPFIe;~ zM3NHqUQ@MEhU7F`S#%*E36=-=TOoD(O1_|^+;yPDjXeMX$jSYJkgmm0-v9zJOhgzy zVmu-$7D2bTc#S8pF2W1&DdTs!t#)FzYblZ*BQP3l;g}uf{5a~sG}dxBA*7|##$~tr(A6{<{;I| zXHgdcdoCIJqu-C0(h4e#JDVnV-Az-Bx$<}xVKhjqR%{8Zg zjki>7F?P11FUXpT;|ZC7oy`^xX4J}^>M5MbNx=GZQz+M9fEVEa=1$N$?v`lU6I)DH zHOux{14zEw>64ZK!C5@RfEF&8t18H5j^Gv1mCEeD`xC1u@4H(X3A=^}%aF7i4qgM( zejY?Y2k%ua>N;zIowqA0megWpTkINs_*es2@j<$+Os9--8E?DOTHM zxmveNc)G9Ck<`?AFDRM48OaD($C}1N10Fktfx2tdu++L5bl z5BuS3-8RT!-pJ`=MJR+Esg9Rq*r@L@{*EW$prXCp$vbq);<|`vF+(EJ%v6086rc3z zlbOq`$s$}@iSlC-Sf|Z zBTkb@g94&9HjqddTNV*fAW3=@JLd?c%)j+tXdC_sN*>&pRXJx_Iw)*Fb53_CEyv!% zdlj50#UG5!7fgEG>VkLyp9CtS^1sFJk8y@$VhVi}_?t-qBtdq$Z! zV8ahsV;Te50gTOrpK(ixNrT2vT4+lb)2$u@_$uO#W=aIflfxgr@Wl*~*KnA4C?3jQ z2jTq4dy>MvMlV-LO1ww48zl7Jk|J~2I1?G774Ols+B(HkEx&--=v%a?Fts^z*SCy` z^jr7v4S{hcraH}#7c-~?sO?%wbf4${*_w8o<^17NayzG2HZFSBoTXK!vnr{FNp;~$ z#HP_dEefU9n+t~)jH!oMR!(=3YkQqt3tm&Fx#^hNh9=d_%!+?rxQvkZG2YR&Xj!&}JYJg<*E>zB!JB^Lq0yQ|fI{?cAbU6X5z)gi zt~DT?i%h5D`Y7z3?UPdd6@IuI$^Sy#{=z98KL#kqv%+vWTax$!Ncoc3gSFAoJSu`6 zkr7a&^<2r4DRq5}@}me3zSuD9Yi++jB(AJ_^4Jd9MOV^}ypoM=70Fsh&5ujz`<+*0 zW9^D#5;B6N0;^$2@om6k6vq;{wT%cECN>fY@??e(Ns!h|i3#`;JRf(WuwZ*KgS<#~F3Q2(3jE9`ZI-VMy)UZU$oEqf#KJw8@L zhM&F;C8@e&)+9C&;Vn7?>0r$?o=?RJcX{5G5ck9XyXaQ{M@h;LM6btp&s%VeRQaARo57xL}Yj{o6-~ilxJC z)gNn+`pa&)G`=cLwL0US7X2g(sh*29&^&)u#yoK{TkR=qDHKV{(@CU{9yW7Lv!^h?g>@2pZy7p)LsZ7xYyEWbE^!=0VXZ5K9`x_0tFVx#+ zGJ8<@)W<3+n#8Vr^yNwjXXdU^bgf{%Oc9fZfh~v(CSaAASd{Vra{74=BL{EGbpTomY7%hiho}@xETp}%a zodF>Nakp06v9sEGmPOznMwT=jcn6o{qHI?~zd}fpA=%|9Gm!2^uT!hzzz;4i?<*6h zH`?*Ly9{xtZ;Sbm}yUxUfdklPingYim6K?*Jp)Swrb(@^v*wRLT? zh!U(Hv$9hQ*a_EktXSJuwFwoJmCqcTpNaY}?ja)Lp!L_RP<2-9Aw+O-J@dXeFq*Mb zN(pq~fAQDt$8Xc=frI#wL_D+wQP4fjwP+tei{~mOWr`qFW z>X8^~*A~A<2@@asi9I*B(wP4hH`*tS(Uy@ZJCmxV5|0|H@xc)S%AlbVGBW?Qo5;9H z<_Nd&$x}*-6}Cx(vi_P^=Uz@knwcd*M>Ht0MvWoK2PEaYvvrlWpU2e!#SDB0!Hxv8 z&!3}|g!V+5mF&uRHQChGSqru2&Jj&jw#UfXZ~_ohVT`4-sCPJRD=fPbP-%H{AG6Y~ z=vBQ_P6mc+wgU1OFdifpO@P}8bnZa@1Q{c3F+jb7E0FFQxY>S4o$XTt?U@tZ6_=95 zV^Z#R$3%x-kA)C;vFSGuy!H=7(A=smW+p!gnMc$+7?RkC$Qi=af8K8j zcn5Wk$c5ReXo&O)FNMaJ=*iP04kWDm?z+4*;So*FI9KoO_eB?T3-|A%{r8@E?Ncgy z5vuKkJto8;%9ei2Wfhh`6`Asy*6s^cbw|L!&1MLXFERP zhMI54zTNrC54ER0!Zf3dHp+}ID|?OqB)6JH`}9L&I)!RYSSBrJ!fCh4Lj0mo)_(Z3 z=+GXxdlx`p2QD77TT2_QSmE*Lny{gUkGPTP=K$LC9|{;Tvi zzL)G<+oxW}&-rZTlD`G~W_KF~NwDvEAfp3;cas*G8uZ2`Zqde`l>jF%dD zA^8)knVNd8@nx{Fs-aTc3o6-PjX#G!S!aAp=Bq|6YsJ$ zWp85U*_A_v6pnZ*O%PkL$aK9IjEt@kHOo?F;PAx`%HKTEyFD%Q-$mqevBMIiv@h}r z+fjc)=rYu_LZKR{Hf3N^=cZzo(=;PdwqMJwfwYdC#^{ok7x4O)Gi$#LA@4-&L({~T zv9@A4Aw6YT%(ZZmD51frT4PgcPgA}^@>jJAikl`&tt#sbqqdOC{7jehaZlX^0W%HN zwI^oh!|uv~D&T(`Na@!~HMo7ex#bve)u~#*Yd(B*v@Ujk`Frlzqn(dVyUo|%t`ay~ z^d@|!kt#Vc#sp7Q2sX8Tp|&y~c`=;Q?S9Fn{klbOJB$1(5JuLReZZdQ>GWp=( z?)ExV-(v~+{`t{Q>rkFQEJQaBiDoUF19KM`1M4gcFKXx9bS|8$1UQmloOIJJtEBts zR~UN!x2Ig3t#c=5W?w4262CnEb2o%tm%50`-j+9WHUgEseX%mzck!avK?3Iq`-I4p z+B?BSQGOQ?etuzeCBO83sHFNKtvq7udA$~$! zzSLEhO8dkek?v0l3R)fGb01F-aUAx!K}PwV9=$L0bX-T0S7WKy5!BIl z>2|Fzdxq3)D63>A7<{|ct3HIHnz<;FUm0DcH(o4zp`7T?A%uNc>6590ewDz@vYoQtBueT`wD*l!$A49fTaeu7#Cw zI4FsIxi1-n^7zHxw+^LZjqfiwc$6X2&C)v27%2`~_?t7mTyzN$BzH+=$9rk1wR(@pfLb2toGh3nFS`yFQ zqy9NqcU9*1cG1TLDq_QxH@d+C65H|d81E0;^j2lN=Q6PrSJG8Ds}@du@23X*h@1iu zmn^Yn_g6*MHz(DSv2JcL%gVpnBVf3zissWxHROM4BpR+$?rQKxn9IO6#s9kRI@>$J zH?~+XbUA_?6WqJV!hf^h*ra(?+N0h4YD;(VWj8YHYJn~B(=Sfo5Fk;opH(VT)wno| zcZ0H7SqkqGnYo{muTH#6mesf*sX4WFo>RJx_kE;#x0kb-LbXB{=ly-8v*I98ivIP> z()y;z(|QR8!HKOD$#rARrLBROtNuD0B)`jw5>BR%Q3Aw+D{0mKrwxTGTu0}#d4`-P zl;iGlKa2kyg@0NVN@wbdLoe|qzWn)!jpayv;up75{0bK*|1@7T5kYUY>K}Byw>O`Q zBcdq?oD?0dR}`@7J15TPk#z`C7^c09pX+1KuCI!e6$c2GN!^VTv$!Dp4DyAX=_ofl zOR>+J`5kt}*6{sshM)F(F6iFjw439p7oggWTynLad3Qf}skiVeQQwQXaYJjISY8)* z!nQ(Jh~nZ}FJZgpT{C?PfBebYXVjg_oHi}JKSY5?!V!o2zb`cD2&{xz)XtjYi(yHcN}uo< zj2)!t?fhbjofM&0sqQg!>X%tCOm)0EMm)M#mtpvGP|bA}uaMc;^5D*{qyJOaRmVlS zHf>p1DHRYFL{Jcs4gmq_P!Lf245Fx@#qs?r!+*)$_jZ zIY+KSdvW9`!h1mD!z(A>OQwo`?@<$ zpnO=D?^Vs4lm`p55iakAe-z%N!-p5lNEc7~=@F=Zdh2&DLJJYn4YGL>t6vLf2Nmux zjyn6r6}%=E;03IwstLXdR~19;edf?Ms}~CO@JDkc5(Lb%_p_jI(xNCP!F%8lWC(I~ zZ|xPQ6TW3M(>}SeP?nytmBvg)dUrPd8i(0nu(?1Zhaj$rU##@jg@&skO*`5XJW$^U zfpG6h*fb*}U>j<630b&`l1@*L3X7K%@ ze@WIg@YV_~-UVQxPR1{d)R(r9C zoY;kAzp872CX8J_{1NJ1K+5zyoypQh(v%l8l?Xbw|la5Gk8+{lc5cM#XI$8 zl+0P=yn~{+4-P^-!u_HB4c5i8cOkaz3DXcB;QSIe{Of>0@vMybsegD85gOJn`ltj?2o1Pw~*G` z9=_3=tXX}9t%ri@@n^DER)9l(^G}C-4q}82w;>HWT|RaoJQRDNVTx$PHu3Db$x6o1E z%a1uZni#5T7il&|WG!zN)P5qBPSY3SgfhYY3sx|&CHNTx8%{TPnt1mw2&3=_Qc;0! zLXxn+XDjxcO7)thG-_RIn1c1@I%}rh8yKn-9Ur@~r`q55WNBos7XN8zXoRsb$A1ig zHZOHMvT|82Xj^fa5M&nSjm>@VKU4JUC!_@UNYZJbAN%VgQ!2%p-lSI<<=!X+RXlE0 znG~uYrFhQV*T!85yf2d}=z3SWpL|h&k$?IAFS{l!i^X%Y;UijYZe7he)+t(-aIz6} zKNqw(XI2zg{PX)^u-O9`O*t(yG09&*O^g|DdA#Nu7!gH8tV#TGZR?|zo{>@74v6>` z?VkJx%zb6c_we{~db)Qux<0k0@lnctIpOTMAkN7s@5eZ!Owj)@-(Nq?kTI&*NS2sE zb%z2IcKHQurb{*7e%Ss>o6OZ0w24r$ePhn+P5M%8kx6*B9cE)Hmv z=Md$NRahe=Sy7D<8x1&o!`xlRL)y-!euhRy)nGDg|nt|L8slGEJQ1xd0o6NP|U^0!Zrx&awCsLoA+mgkVRyc zh8&KE&z?1y_SKe7obFx%W7gud9L6#cO_#iKRCC{ZoGCRtnMf+oZ;5DShLsA!N^i!` z)hVw(r~JF~I*0Tl{eoM;J_rRxJVR1|8*&bSml=1tS8a86E$25aqB-1&Cm8Olms*%I zB)Gn;=4~cp*E9iDy#eS=CBp`Apo+C?ri=1aD1@!P-9y)jI;W~t3#ZHLtTAtpp$#ML z3%>_hQ>+byn;m3f3mq*NJ?4?mAz32*xb?X+PEbECRU*yhdw?PDi)pi}?}6@vmG*J? zYDUH0v39+W20=2&BsARgcy|ST($V?gUPN0l789=$AV1QFjbo zP7l0yXCj>t6K>~otj6}SUxXv{K?|6LaqNpX36_I7*2}XoXO=o{C7(}JNj)AZ*EsVm zeXB?G@;{$Lw*;Y-Mz^2T|KiKzi;1*`AR4M92L1VoI8n>UN+hw8{Wbv zb}xzdo;UtS{B2NwTt$;L`eH0gUi73N91QXy`xJB|EI-+N#8DVK-(}B=lH2H=%Q+h7 zh>vzf@^4lwdy>5`QQf;^_Oz(Tc5J7Wk&?$OBF@>&Vb49|y0b}9##U-8_Q=Qxul-`b z@}gRT|~az34DV z?13baE1v+)f6bF6u=F8yjnFB}lP#WD*Uj^#244lL_NPBCXQrc`*k0nLMrIKYSK3Ds z#2@8mzZc__Ltyb%OD$rl5tc zQ5Ds`Bac9=erv?hz{VmMb}lY88<>uvSW0Z<{EuO3WzDxlTe(d8ZtQ-uO;A7Dm0jMe zqt^4f(9E!3*Y0f~^$&ZF`7LQ|Wb7x$*LOX^Af~RS@GEPzf^DeU!%uGuswHXoq2nGN zD8d|t1qONT_py{A4^qdAO?|*$giJWi5mYUqY;$E}q#hMRNnyx-qO06Sfn67pl)oLi z$@fp##cH zO_V#$mK(iAsKp8Jft)$f|VhO!>=1Ouo>+J%%EUxD4v;$UF z!itAvzH;wmd#co=XVIqhz-eo>h+cM4^{J_%M~Qw*XOTJTpbFg`%oKjcGZbs!FySV? zXnjxPt(YgC=F6|#>^0kpI?t1mJ3hP!GEYl??is#0ISqQ(XscFAhcx>x$21z|!SmA0 z1%5PmF`OdaMvJLeJLVD=Gvby%o9a9=KRyQi1s8GD8Jn7?e99a$mq@ai{Pp%HLeK)CTjPyT)M4h)eO}{R2t?XKzO$ozo6mtKmbZ4zmyAWTku% z7DT6xb#AT1q@&}XyC^-J1fnFPp3rQ3%kJ%kwv~47M?4z1sSwd8ah0Dy#ZfUZF;Tro zXG=PvD`_#Eg%>WFsZ6RrBZc6G(IvKDR!U>V!wFwtQZRg9v0AD0IGXL|=Sx(>9YE<{ za0LijY@0R?1Fe4ekY?Sj3YmA5+MFZ@`x6lOF z!fqT@?CdXHU1j7t#|bB!k+F{68*WsqMG)XLl)!5o^4k%^*HRidNltLnnu$~C{o_+yl15mc$B8z3bWMQPirLv^}fC@ zsqNUb8dHZ|>%_r+FFqOaP~<`C==8aB+&+&Uh%4K)*ry4i2ntoP4OP8AzA>fJYQ_is z3)_jUnz_%nX0PuaE+wF0a4L-g76VgU8k^u(qZ|p`3`dDmt| zCIAD66yDVX`7&7w>bTflI>9FjEaVS(F>;-2(G`UhgDRDnhO&HSy&ej#-?{nkY zchAp=N(&)1RBy&gSpyjqi`?h>pwNc^_^)l~mC@apF4^7x{@qPMGF^^s+1jJ3wNrR+ zy_ic^pZISf_D{P>;|{?i)+_+tDN~{izW3-HipAZ)} zSH!iA$w+)MzX&m-eK3dmvK1NM8po5J$V3d?2Ak5nyZp86%_Z}rWiluQJAO22&#~QK z<}j-sSg)0yhb<%XJw>^|#;|7`;_wKtJMgq zNIHL+*)RR{BgGrBM!fmi@z;1;{%k|FZZ~5DcFd2y%3mN8ymU*31LI1` zGfFClDY8}CiW%as>SVku9QLI^o`V=(Q9#e?c+{YVopxN#W@B`&Ho%&%Gz%pwrO&3h z&v$=37OD)47WD{kvv^8mlZ2nf5WnBe7v5iL`Q65r7Qgb|@%pZ6nN`P!q2|}Wz8hU~ z{qo3&h>|xXW8k>Ow(I0eCx5y%Em=6%&Hv!|UoQlg4j-590mwXHGqLAOd=~Gc!G@>Q z6Gzg=B<8?wLocpO)J>$x9tp_aWwz!PJz6$L*G;5mFs6Yz_d5A>Q4sYBE@lKaKWWy* zCSnW{D}MFpWV~+Uvt8BE>P;b8^&9iFvjb~^p7i}^^ADjUV3c;7VHu-|%!9lxQPG~k zoDqwtsHnjTTYm|FL0n2V>a-+Tqs9OF5@D|j2ZT?yAM%>^!cWVVsn5y>JB5ni65%0@ zf9IBe#u;LZc*;&T-d5Xrno%0b77E0+Yc=GRt*_o)NjIc}sIVoK`Z^FfOH-Fr|eW8Sum8+?w=Gd12wf~f2u$~o{hDcTyfEk&K zANr30E-hkGiWuE!aR@BE_c>B2(fvdn(fdftjha=aPRUHlV0YOw(Z4`{ZZv{TFjp#o zRp}Kl*-%+u#wKqr{rR$Ymw)Yn2SOZ1VzK%yoYzK|Z|L=W*UBf7DrNhg zXQIEEf)rn|a2za)M#J;`cL)MOyF4FCAE1TpxuC&Z$`Ph?yX^Xs zLPl&NTPl`e0F1S|Rv@+$xQ6%Cv z+Uz!#^Y06WVR3$jH7~_fswYa!^IR&=s(3(&y*_HQsA}wG+sG7BO)V-V>$3Se{RlRy za?wdg+^2{rM<%bUGAzplijhh~JA;dz^&{i33E_BrwjX30}uhVd>EOT4NU z#%IjS9v+T;@lLb1Tuyctc6%O{`S>sqOXR8#G$lBNIzmQ$w&wEuaLe~UlW}M- zMQe{*cSH~DF%2K>u$Xv0pkR;Y&5d-V6!-m!BHyd)?kslf?$w(?j0HkGhD z<2xa77j`%`tS@-ISSarCU@rP4aLC}!x?*p~DN)-w=S|qV_ni;<;i#fuK2f{kDrzyj zQQHmr#|rpuRimTrltf?tu-p5w{!A1|gwl&lPOmqitA=(((B6gG-M>tMf;w`fsA%P2 zj$stQm0|!_M|Or1j6{#8HU=}E#`UuME&OKE&mr+)z!Li5kI|C75rg0}mM6=`e8ziL z*w694@EMp8%Co~4#)d&y)2zVFT>9l^a?JYDuCrH3maf5UHW~>?EIXn*(&(cE?9Hrv zsK=+!tmM~o;CZ|_(EbZ;Q!va$p{ap}9hmiJsO@5c84B(QjkR&hm5_(E*5sPqbqd`^ z&MXBx|1o5L(G9@K4gelSdFO`i2@^*mgWJ|-Y1JhDXhxo2T<)y+AnLZQq{?uS90*q2 zu!JRrz|EV$(a5$C=QbuYC{vhh{ut!03z!}@mh5QI0?JI=B#8q$)k`SjDcW0q0xGd+ zym`Lw&EyPKX`*TS6MjWqtNPY8JJ}LQS5v9R*}s6##x<8gzjKfUro^pPHRGLKH=6YhK1wYm+L0-GNih7I0D!-;E`y$I zING{Mqj)chJ#0fFievs)^a7vsIMZ16V*VT$XMX8ge<}6xi~9ul;J$FJ;2pLM)jeM?HMbU)n};U^$bFZ4vDUqs%s%$@#hP^#peF-TnQ96un&@ zm%SxQ9XHgeZIYJBFp;BhiO>kR_hq15Lk*m{#tvT$k{d1gXv%i^HfGaCp#5R}=6P;b z95r`GfVnU}e}T%(<8*6p<#_8zBjDP=d$%pdKUg^AxdxbNe(1=jEZDOWvrsTRyD3Z{ z4z&r5=CjsK@TjfcgtuS&c@_cAG4excX&jvPKE~N!*xcGfA0K2}0OLz9DRSzVBn(tl zORXo|%}0yl3Cb0W{MQaua~&%yp6NaB_EgO_T_X%KLhch77#beF zgSD!2f{WU7#PR-axz6oKGIB1y>PzkBl|17pL_m~{~@tS0fUF-fG;V-hV-1o?~Q^F zXsgU%M@zDgiZ^7gQ`@0SSHKLRLajIcp6)-sEbIcbePROT zCd1aW!!@on`SzjxDe^kTfQt!1!%RU%GFka6KhxbQpDitJc^1GqvZ?#X(hbTW{G)!fu?yM|G2QIyf@B~r&IWkihSTJ?n8#AXzQ&tl$&m1EV6WjA7=gM=zys8QaRCoBij0a34Gb_A zy|IC;)vhO9UNBpu%;*lwFK_o0o7ZC4$hwB72}i~Cz%WoWPup$B7xDG>`5Z05!d=NJ z{ky+AflP4XA60&5L~P=c-X-W|bi$9-yKOmsTs7%OioVN>gEEqAdv154 z3a@rVs}NZv8A)P%SHcJ*H+LT}pf{{!9$=BzxRi18JeKhJ8EMeu>$lvX6hxqEHa=gB zx%VOjbD!Q^T(AZe4hn*Y^J~%8jRe1+b7>VUPZmY{u0k!moB8%j?C4U1A1F zK47Td*y2#$3>VxYH;Xo3`{$X*CRV5)OBAnhr6zqO9*kf7ftvwcC$c+yPifHKY=A5G zab$!@lVqJcw8L+EzUK|;9u^f?v0yUD!NJi=s65#rz3AtF7-N^cRadl7FI5smKMoiD?k5;vee*$D}TMbk4Ob$jcnxUtutF`^R0e87tEwD zErh_+!oUk>4=?hLpx_>wUJ@U|zMZlQPTXJSz16VXWUfdP#1Nn)oNki#Vhbg>FnGw5 zqx-y0n^#=+#?*L?+AZ4J(9c__Y(I>-?LiTz2Pc>$3{ydz1@>=yN~53-7Ep%e^EPgn z1Pv}qA@!2h0N(r~L-3$+qUM;~%6r*Fw^{t(L1&lE2AB0vq7kuT{=pxlseJ5+fznQ4KU06 z&jUnb1w8MkfC%U<-L!U?L2kz3tt7*?3!tZqPeq4F=4a>;tO&u@OzB@W&?k~6Kpr2T z0CcZ6@vY@(t*az}vP^AnHP>=D|GTT0AG`2h(C(u2S}R$8Sy&HEc$7F)A%gJsq(M+@@u z1-4x)=9tj7$M1>LZ{Ow|@-@c1-gF@FmVseG;daZztSY<=re*g#JTVx@v`xO@r?q*n zk(lwyf2NIZ7zACs#+@=l#z$etAX`T};4cvTT4j$0=t)!ayW5k=@(CbH zxgk9IY-MzyX=@Xc7~kJ)Q{jEy=z6r?#9{gQ9ZWS_)gF^A6JD?1v*=FL9!zb0TQC6Ae@kldAIR`%w)V8snb+xuc2uJH4XaS-ZA}iv05349@jU2 z;Iws>Im6fo+qno;B1~M{Q{|wMt&}cBG1O@R9@zqdPj$NHQ3qCn+O4=A6Dqb2BMujY zm&xnyjp3*=)_eX6rv7;Z6ZJq=G2`mP2+w+POv28s^fj*~F6tg``gemWf*`CG9!eV|Dl*P%_00$qm1Zh!S)XSgJ%U3u!90p=O+$>A zm!?93A!UcUet0Bg!^R12mPfnZ%WrQ946DH7bkpMon>^M?(u>2e|M^ru-7p)*vYLAo z^5D_sn+?$GT=Qhfa!*HO)_g6c3j_Yhw@6UApugBuSfeUp((ls<%dhW}NDBoC zHH$?Y!c`LOoM>EyHv~|v`5h2892%X!D-Lo4jTG#MyKE+^DUU)cr<|O;&OuZd64$b$ zj}$}!+A4K%s6DH7Uvqg_K`-ij_yks2oB9)-{L6-9Xo6K@9*QYR4FOo$=`@pTlwa;$ z94bw`pB4A|FLS#<+nuFyUrE$NA#a`DdN`jgc1!|ReoN{JLcVeCV57Bkpv+nv5F_OZ zZ~V#FuDza{0VeI!L$QelKrH?6VxpHlZ0)bsEi&3!NeQhS_9E2QOOGENi{|4nnPnHb zt(*BfvN;DS0MLfm|4JW?!UZftRN|vxuKH%vh}jOxZdU173pG~EqlsD}BCc-(|2{?`_1u)GNvyxwvbH zcFwqEc%48KRK>0&UKkx_Io0m{zc}K*KN0bPHJX-c^X$_~q$y8+QOQl$zRP0UTxoBB zlKyaALj30*Uy(|D@m&DJEKJ~d13DnmT!v2YTh153HP`1s!n~alNx@z1sX1heE_ zv@1FKEk+GFfL5-@g5c{$3)p9_!IU{YPMO=<+t-ngLBKU3CsGk}-Cp@&wsy@ZmhC3- z?`K?$CIoYsQfkE26lKI3U}IHfa+#JgvjIJ!WjgLrq3tnZe*v_NyGW1`7{Oz(+i=V8 zT|qmb!BkU`NeNj$(4pyiw4@_i0MhBIdD?8`COv~V>e%AsT9w7yurCeA)wIFv5VJx3 z(c(NegdgBzh5?Vq26!FAk0vX%N^vWL8eOH|1D7lg<9q&qA#mw}z%lLf&C1a0=lU@}O|%+|MvZs^hBODUx9SRiQO!(c!)d=bw43K~ z(sj2Q5cY!~A1>Kot^(tFvDBsbPQqhH*-J*Dzt?XTb#7puAUBg}wAnt^tpW>}Dw(#tqlG~_JltB2&O|*0#MB~0w>~7m zv9G9!$$ke)HQ!OCIGKAun_ODCb7)VG?0iSpOS z{ry7x58!;F$+sFKLxXvDKoRNQo6M*bE^Lr+*3DXe`pUcT*AjZ*B zyRYX>n5Ka6Tj+~K59U@qL6SVYG19|ccYKxd&ZNTLDUs)EnW@&4zdzPnqA1vxS zmjEt?YE10yO7T@Q zXpahAInQyr85yL-t*vpqfBAYe8L%splE8RiOfS+8FnQh6&E{Hnn)yT$0fi1jjl>Ly zh?N1p1+m@ZbC^SlpQaGXCxH5QI{4=y>wO5I+V;qhh3Rd;qDb&*Xq1>e^EEeAxs8{h zMr6M7YN8uNA9k~d^l|II(kizJn5JCh`1&YklcJ#iFkIF162-!LuETi za_0d+a)(KZwM0Xhj5;-^yqJu-I>E?G#KA>Upd?WQvMOeEr#mzl>Q-|o68hm!;D?k1 zfS+arV@&8(2tR*}D+0TOMK1Cx1f(st`C7v({_B3Pz{Rja(i6t}_QaXCHWB3)$ywYY z2xHuLy0{wt_>gqu&>NUw>CaX$kA5%V{Q)J z<#B3@F3wC`C@W;Wb$#~fY^jEI&A^3=R~1rYs-8FTQi~^`VIl( z<9iROUc5bWTbx9B@z22*F6+l$@%h!bk%n6(vdRx9QrjCj)m#6fnD4PaR6av5KzK>$0i&N80R z@r~Jq)_^xdjGCs0yU&s)=mTk*-A=)^eVI+53z51%Sm*>}N?hyXn{d?!&-g%+op&WN zJSN5*=#S+Cc{ub}X6FsQ=GM%3sfBgbY*9Q4H!MjE1e6O(!3z=; z9M|qaCpNFpJc_1EVw@T+~(Ne2^}ml?s8-kss08i*TS>LYZEm+eE@#(om!n+BVzQf zk1~#5;ARceBcl(XT|byhK=(YPzHZ1YbqgE^41ZK<9>ZH(x81u|$iS*mdXu)PS;l4a zD_-gI`{EJR!2Y}e%dn}{;g@0hK3M>I4AgY;GoD_wh4@@YJo`okXfI0wvYb=iVA_@% zof%PcM^M70;lN!sfgS}l2R|Up_z)q8c z>Al@4#GN=lP?vuMH0Ov;6sf;aZd=S5}U|^ zTZg+#zxbxdGqt%h6e3P)?i$M8%Jn{>uB)&x>)_Q@P+0Qv>p5zLBqPnyl3Pn~DhC38 zOql-fwP6$oruvG_)qfzegrsqh z0U$MPKeZ=L1ghYoMBXNYR3oTkIngBZQ>|U=&-5n9|H9fF{ekrN&%|(wz=09#=tKnm z7ybdy_J|df-PlQ0eOSy>i6wK4gEyVxg{O>RK^Bgc1iB)*9fYQFYs^Z*(-M)m=yP9wDNa%+%o_<^= z^w{^}G3l-+oTzoHI@v9&D*@6rqo0B75<{Hb`|GytoPbLt^qKG>ucrh-VgAb*84pcK z_GD0U#vZqRn|;T&ZG94q*BibSB%}vayGjmsme3={36^uQwt*#JfTmCfXvG}6G)*y> zbRWmzR=KU?KIjBl0g`W*JqBaaWMdBX55kn>3aYDxs`kcR2m*qRZTg=+93gaH_xd7U z9YplD)LL((Wvyl}-VKO+Or;tb8I1xhQOoto22eN|uny!qf-gf3bK|*<HXXh8mQL@?tcn3iN%nz-{-I>Wb!RlX`cRSY!=wfds0+ zLsT7awpjuJH1@dDzNv+x!onQTpvh~}P2-_`DF{QM&;)xzfZ<61WX8>E!$SZn{MidJ ztt~za9T-s{(7#a$RJp#&3GXO-dmYjNDlo zI?}fsLTRyw+eBn4YVr94E^tYwWFClJjRJpamGx>U8^SW~yu`LNkR6$KvHvdq6|=F* zk~|vaI||_Uz-*0~YleXS-Kc)?T?%-HcyP(laLvUx`#NWbaM2EcTQ!fqK~J{2MAxkD zcHw&r9@|M0d@96jV<>}sDG-A_)E8?(GSiYy+JCv}^C9q(0Cw*qvAN1eq4Wn^;hky~ z6%~j!wz7SEA^r?5)_Xckj*sR5`%&ucV_FTl1-s{@n|==eWECea4G$7iSX6XUc(<uNmKCjDjNUv_e#fU*2L_$TQ2!IQQXFF^1{8Ir@D1~8D8^TS04txx@OGd zOrdHvI#kofoDTvD^}lZa$++P$DXg}`(&G@(dHKqzwm^r=jf?=QlEHQ8MJSRF1nIi1 z_d)HG=w81fgHAzay1EzprrRCXO_lI&et!Nzu!dh6ruLj0AHyUopF8P-8qga$zSj)8 z?%4<>C}~WtR;}$e5I3kUK3V{5#UPGi#V(djt4cmWWOv%1WAyCE zueSNofqYc~z?dz$-C$HSB^5 zde}};x8Kas*yQK@F=qA>CGTBf6?a|o6-U*2@q9L%&X^|&`XhV|yJ5vaJRM1(z{EXT zJHehEXq@^_P{TD}cwc}mu5)~9@F68pC}k9uyl!`RqKd#fabK!&wm-aF3xvLQ>(3J^ z5A#d5Df0R!f{IhYFLvCiYocHCpEtSA)-l98CM#UPgJx>k52&c-jy7}{fBJrmV%4iW zRgwQmqW_8^{%&}okeN=+q_ARqZH4vMl|V3W-){<-jXoSWY0l?kk|Ipi>X{>0m?P5Z zL!twb54?_UM_^iEbD&}*OSy#Xy$q$)c3?{HCrs;f@PJJQ5+GaOfpME$d4-h<^1RJSxoUN;U@(pfu6uQU|P_?-nr=T8X9yPr>@G+ zvX9m>nWAa;UOeq%a`BA~+Y~5l5>@otTcAzc3il+r74tYN$8tysomH;He4JcaczkNk zpXn&a+Uf(^34*I3tujgG*A35<>R%U{UUziMoE$%YzMI-*nUgvtO*g)!jhhE|k-dIL64a$B2m02U8B6_6=FXPH=?_&<0 zv7B~LoOk(rk(1Sl0*6rZ9;Ec->(*PB&+E zX^y=Gh``(iIbF7U9{M1GAoJV=FaRyP0J0s)hzWOGA2E%R3D2_!@pLyBNerb0u~};S*1KJlYa1HRnf@C>0I``kkl=d4co?i2a9V>mn-9ZNZ$h7yS!+Y8?)YA74lF z_?7fkNUFKhR-N|>r)`1lX%9j112sVdzj$ca&Yn((KH*QR-KvQb_N!Fxxfla? zN6Vi%|2|d=N6q$oOrIqJZCMt+SVsGd?5|RfzdIXnT~eaOj3h0BnbQX%ssy0ov2ME~ zrx#)i73Yh99wt$9W_tX!twrVMITkSS+w*G1afTRYsFJ5W#&N%G(78Wzfp{zh42Ib| zF+KtJ!zD*5;MyP%_DN8TEFEjQYq}-XG6NK0tw7xHx{fL5`)!km`wI)Iq0w_})&O{o!dI@|eBi)0sS}Q*MU25Hxz>i~_o4cFl0~a7pKEk?#Sr z5nmT>ODh}0%ZB*g>f%mFmUET~s;bQrd=;V~FtOtSxDNEAljI*Ts~Al#6f`(2sWgD1 z@i0z_a1eYrrRn5AXh}7bO2%XmXBm(X9F(-mF1*UPFhsA!T4;|Kd z(RX?r#KmuY9S%2|0A8YG#f+W~_n5g8ayD&nHQo%;0>&!>e|j?2q39ju*{ba{6K
    M7FJR=JA#n7Y>UVtYac!06C_ zq-rKSPt(tBgXrw=oEr4&?Ck95n8U=%c~AR}OmhVu+YAfM)_Wq4?jlH#rg#H$nVmBr1=M@*Gbl63V#(fpJ!^_1D=%oH_AJp8oM^LmI2GDg? zr=EEO*~7K-o@bkpb)*D}@mp1%c7LS0Kq}h=iC^V{p#%=nb-dC9iUowHM$2F5yUfKo zG>%~Tu}d{5l#m}UX6GFeIxCukSlV6tk|V}_Qa0zRmu!9qLdmy48F7+Fo>SPM&=;D- zm=KHrGOl@f3^nO}nvfw*s+HSaV)x_d|%z%ih2c?7hi$c~Wq z50=Eg4Q!WAlBtf3rJ7j6lSq9z$eFcU_;`^v$iAc^*MdAq^t4_3-LirzDfSZ(iUeg9Vmf%84=yt&;IoKHfYXvDJXlEM1^!Kx5?_ftV z`-hY9nIzNzmFKD1hhd6)z+i7O*{h6b0o5;10~wp3oxo8!PpjjrJl#qWr3&%FA>7Se z8F*t4ob`zk(yULtrNGLB1-c0!?0gIs1z_9co4d}Q656UPWt{Tl<}{$M#+>HjY7bI$D?;Wz z6`r2rw8@m%>g8*JJO`*4WqdUaykIdVki}7&7m&kBJQRH>UL^o;=?$MdMj5RE;o8}} z=lW{oegE=szy289386sodn(YqVs=n@?pi1GY5WvgRB`GmIGxj~aoAwI`j z;4rT$dM89fpDIWir0eVUBuk#YDFgNEEowjR!gjPNn2Q5^s9s9nd&>xxiuKyr@to*N z`S(C>!*SerNKna>*2^C+a*J~_7Iea+7q;!Hqi3HkF7?{=?8=%(z}kvcrt*x8?A#Ua z3@3_v>47!6@ zmNkCz^?NqD3*-uoQ~<5Di{R%dyi&^%huvl^Y?WG2->zIjv5<G$nhr`Q7j9Ns{8}#isY6P%G;&WIz7p(gvd?2u(>@^SeNfip8==@kv71Bt}#E; z6#grB`0odyLy0v4@GhCIOCa2%uAIJIX%>yVj8rB9_nrF1Ct}bd)1*Ay|N7g7W0IF; z3K@6F7#H?*SYt{0_9u1wek(TmuMd7(B&K))o}m^zEl~1Q2#ji-mg1&Drd$DU8+46_ zIkS{u1mEAIaD}rqW)X7xMrx~n%Lt>cb>3MFoA_*it_KJ~ zO@KOdV^l|@)WUZtnSgB%Tra&d*cGPzeB-Wo+BaOd$YE>%kXrVbd9yyGw{~;{IH}V= z0L&w4IR@+jAGc7k!D+DruCx9Jzej(hs-)$RW~&#bghM2O0({^?+A~H{KdM;OwWXmv zYan@9jES2;KBw0VP4Yq?up7@Qc`c+rCEs?7G6U0o!O)I;7F2oT52_%PdWl&?WF&cz zB*O`pVPBq(D0t-upm)x(Q08+fLkNjsJAgJmv$eNrVH$WObV17v^GGd3l%XMv(j%Jw zngu=Rq{W|)HU;5w+Jsf*G!&@K7{S4KPmmQW-S@o;GU5L|bpVvV#JA|M5hq=slnjX# z3{brFd#w3~Uz)-DVW2u*`HbWb@A!vL33kOaF;9qm{Pg>K{o&;bzL>&UTHfqGkl(-W v0`dnYL3FT7ar;kf>EF)EuRDR1A>BU<7_lj?tB@2r2mX5`Dfa*+q3ij73&A6{ literal 149810 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 xQ~uAMtF{9a819S|hVL5^_@7 - + USB Host Shield 2.0: Usb.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -148,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_usb_core_8h.html b/_usb_core_8h.html index 4ac0f93b..0ca209a2 100644 --- a/_usb_core_8h.html +++ b/_usb_core_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UsbCore.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -185,7 +186,7 @@ Macros   #define USB_ERROR_TRANSFER_TIMEOUT   0xFF   -#define USB_XFER_TIMEOUT   10000 +#define USB_XFER_TIMEOUT   5000   #define USB_RETRY_LIMIT   3   @@ -244,7 +245,7 @@ Typedefs
    -

    Definition at line 45 of file UsbCore.h.

    +

    Definition at line 47 of file UsbCore.h.

    @@ -258,7 +259,7 @@ Typedefs
    -

    Definition at line 46 of file UsbCore.h.

    +

    Definition at line 48 of file UsbCore.h.

    @@ -272,7 +273,7 @@ Typedefs
    -

    Definition at line 47 of file UsbCore.h.

    +

    Definition at line 49 of file UsbCore.h.

    @@ -286,7 +287,7 @@ Typedefs
    -

    Definition at line 54 of file UsbCore.h.

    +

    Definition at line 56 of file UsbCore.h.

    @@ -300,7 +301,7 @@ Typedefs
    -

    Definition at line 55 of file UsbCore.h.

    +

    Definition at line 57 of file UsbCore.h.

    @@ -314,7 +315,7 @@ Typedefs
    -

    Definition at line 56 of file UsbCore.h.

    +

    Definition at line 58 of file UsbCore.h.

    @@ -328,7 +329,7 @@ Typedefs
    -

    Definition at line 57 of file UsbCore.h.

    +

    Definition at line 59 of file UsbCore.h.

    @@ -342,7 +343,7 @@ Typedefs
    -

    Definition at line 58 of file UsbCore.h.

    +

    Definition at line 60 of file UsbCore.h.

    @@ -356,7 +357,7 @@ Typedefs
    -

    Definition at line 59 of file UsbCore.h.

    +

    Definition at line 61 of file UsbCore.h.

    @@ -370,7 +371,7 @@ Typedefs
    -

    Definition at line 60 of file UsbCore.h.

    +

    Definition at line 62 of file UsbCore.h.

    @@ -384,7 +385,7 @@ Typedefs
    -

    Definition at line 61 of file UsbCore.h.

    +

    Definition at line 63 of file UsbCore.h.

    @@ -398,7 +399,7 @@ Typedefs
    -

    Definition at line 62 of file UsbCore.h.

    +

    Definition at line 64 of file UsbCore.h.

    @@ -412,7 +413,7 @@ Typedefs
    -

    Definition at line 63 of file UsbCore.h.

    +

    Definition at line 65 of file UsbCore.h.

    @@ -426,7 +427,7 @@ Typedefs
    -

    Definition at line 64 of file UsbCore.h.

    +

    Definition at line 66 of file UsbCore.h.

    @@ -440,7 +441,7 @@ Typedefs
    -

    Definition at line 65 of file UsbCore.h.

    +

    Definition at line 67 of file UsbCore.h.

    @@ -454,7 +455,7 @@ Typedefs
    -

    Definition at line 66 of file UsbCore.h.

    +

    Definition at line 68 of file UsbCore.h.

    @@ -468,7 +469,7 @@ Typedefs
    -

    Definition at line 67 of file UsbCore.h.

    +

    Definition at line 69 of file UsbCore.h.

    @@ -482,7 +483,7 @@ Typedefs
    -

    Definition at line 68 of file UsbCore.h.

    +

    Definition at line 70 of file UsbCore.h.

    @@ -496,7 +497,7 @@ Typedefs
    -

    Definition at line 69 of file UsbCore.h.

    +

    Definition at line 71 of file UsbCore.h.

    @@ -510,7 +511,7 @@ Typedefs
    -

    Definition at line 70 of file UsbCore.h.

    +

    Definition at line 72 of file UsbCore.h.

    @@ -524,7 +525,7 @@ Typedefs
    -

    Definition at line 71 of file UsbCore.h.

    +

    Definition at line 73 of file UsbCore.h.

    @@ -538,7 +539,7 @@ Typedefs
    -

    Definition at line 72 of file UsbCore.h.

    +

    Definition at line 74 of file UsbCore.h.

    @@ -552,7 +553,7 @@ Typedefs
    -

    Definition at line 75 of file UsbCore.h.

    +

    Definition at line 77 of file UsbCore.h.

    @@ -566,7 +567,7 @@ Typedefs
    -

    Definition at line 76 of file UsbCore.h.

    +

    Definition at line 78 of file UsbCore.h.

    @@ -580,7 +581,7 @@ Typedefs
    -

    Definition at line 77 of file UsbCore.h.

    +

    Definition at line 79 of file UsbCore.h.

    @@ -594,7 +595,7 @@ Typedefs
    -

    Definition at line 78 of file UsbCore.h.

    +

    Definition at line 80 of file UsbCore.h.

    @@ -608,7 +609,7 @@ Typedefs
    -

    Definition at line 79 of file UsbCore.h.

    +

    Definition at line 81 of file UsbCore.h.

    @@ -622,7 +623,7 @@ Typedefs
    -

    Definition at line 80 of file UsbCore.h.

    +

    Definition at line 82 of file UsbCore.h.

    @@ -636,7 +637,7 @@ Typedefs
    -

    Definition at line 81 of file UsbCore.h.

    +

    Definition at line 83 of file UsbCore.h.

    @@ -650,7 +651,7 @@ Typedefs
    -

    Definition at line 82 of file UsbCore.h.

    +

    Definition at line 84 of file UsbCore.h.

    @@ -664,7 +665,7 @@ Typedefs
    -

    Definition at line 83 of file UsbCore.h.

    +

    Definition at line 85 of file UsbCore.h.

    @@ -678,7 +679,7 @@ Typedefs
    -

    Definition at line 84 of file UsbCore.h.

    +

    Definition at line 86 of file UsbCore.h.

    @@ -692,7 +693,7 @@ Typedefs
    -

    Definition at line 85 of file UsbCore.h.

    +

    Definition at line 87 of file UsbCore.h.

    @@ -706,7 +707,7 @@ Typedefs
    -

    Definition at line 86 of file UsbCore.h.

    +

    Definition at line 88 of file UsbCore.h.

    @@ -720,7 +721,7 @@ Typedefs
    -

    Definition at line 87 of file UsbCore.h.

    +

    Definition at line 89 of file UsbCore.h.

    @@ -734,7 +735,7 @@ Typedefs
    -

    Definition at line 88 of file UsbCore.h.

    +

    Definition at line 90 of file UsbCore.h.

    @@ -748,7 +749,7 @@ Typedefs
    -

    Definition at line 89 of file UsbCore.h.

    +

    Definition at line 91 of file UsbCore.h.

    @@ -762,7 +763,7 @@ Typedefs
    -

    Definition at line 90 of file UsbCore.h.

    +

    Definition at line 92 of file UsbCore.h.

    @@ -771,12 +772,12 @@ Typedefs
    - +
    #define USB_XFER_TIMEOUT   10000#define USB_XFER_TIMEOUT   5000
    -

    Definition at line 92 of file UsbCore.h.

    +

    Definition at line 94 of file UsbCore.h.

    @@ -790,7 +791,7 @@ Typedefs
    -

    Definition at line 94 of file UsbCore.h.

    +

    Definition at line 96 of file UsbCore.h.

    @@ -804,7 +805,7 @@ Typedefs
    -

    Definition at line 95 of file UsbCore.h.

    +

    Definition at line 97 of file UsbCore.h.

    @@ -818,7 +819,7 @@ Typedefs
    -

    Definition at line 97 of file UsbCore.h.

    +

    Definition at line 99 of file UsbCore.h.

    @@ -832,7 +833,7 @@ Typedefs
    -

    Definition at line 99 of file UsbCore.h.

    +

    Definition at line 101 of file UsbCore.h.

    @@ -846,7 +847,7 @@ Typedefs
    -

    Definition at line 102 of file UsbCore.h.

    +

    Definition at line 104 of file UsbCore.h.

    @@ -860,7 +861,7 @@ Typedefs
    -

    Definition at line 104 of file UsbCore.h.

    +

    Definition at line 106 of file UsbCore.h.

    @@ -874,7 +875,7 @@ Typedefs
    -

    Definition at line 105 of file UsbCore.h.

    +

    Definition at line 107 of file UsbCore.h.

    @@ -888,7 +889,7 @@ Typedefs
    -

    Definition at line 106 of file UsbCore.h.

    +

    Definition at line 108 of file UsbCore.h.

    @@ -902,7 +903,7 @@ Typedefs
    -

    Definition at line 107 of file UsbCore.h.

    +

    Definition at line 109 of file UsbCore.h.

    @@ -916,7 +917,7 @@ Typedefs
    -

    Definition at line 108 of file UsbCore.h.

    +

    Definition at line 110 of file UsbCore.h.

    @@ -930,7 +931,7 @@ Typedefs
    -

    Definition at line 109 of file UsbCore.h.

    +

    Definition at line 111 of file UsbCore.h.

    @@ -944,7 +945,7 @@ Typedefs
    -

    Definition at line 110 of file UsbCore.h.

    +

    Definition at line 112 of file UsbCore.h.

    @@ -958,7 +959,7 @@ Typedefs
    -

    Definition at line 111 of file UsbCore.h.

    +

    Definition at line 113 of file UsbCore.h.

    @@ -972,7 +973,7 @@ Typedefs
    -

    Definition at line 112 of file UsbCore.h.

    +

    Definition at line 114 of file UsbCore.h.

    @@ -986,7 +987,7 @@ Typedefs
    -

    Definition at line 113 of file UsbCore.h.

    +

    Definition at line 115 of file UsbCore.h.

    @@ -1000,7 +1001,7 @@ Typedefs
    -

    Definition at line 114 of file UsbCore.h.

    +

    Definition at line 116 of file UsbCore.h.

    @@ -1014,7 +1015,7 @@ Typedefs
    -

    Definition at line 115 of file UsbCore.h.

    +

    Definition at line 117 of file UsbCore.h.

    @@ -1028,7 +1029,7 @@ Typedefs
    -

    Definition at line 116 of file UsbCore.h.

    +

    Definition at line 118 of file UsbCore.h.

    @@ -1042,7 +1043,7 @@ Typedefs
    -

    Definition at line 117 of file UsbCore.h.

    +

    Definition at line 119 of file UsbCore.h.

    @@ -1057,7 +1058,7 @@ Typedefs
    -

    Definition at line 41 of file UsbCore.h.

    +

    Definition at line 43 of file UsbCore.h.

    @@ -1078,7 +1079,7 @@ Typedefs diff --git a/_usb_core_8h_source.html b/_usb_core_8h_source.html index 5884a036..b9aed439 100644 --- a/_usb_core_8h_source.html +++ b/_usb_core_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UsbCore.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -128,326 +129,334 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    37 typedef MAX3421e<P53, P54> MAX3421E; // Arduino Mega ADK
    38 #elif defined(ARDUINO_AVR_BALANDUINO)
    39 typedef MAX3421e<P20, P19> MAX3421E; // Balanduino
    -
    40 #else
    -
    41 typedef MAX3421e<P10, P9> MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo, Due etc.) or Teensy 2.0 and 3.0
    -
    42 #endif
    -
    43 
    -
    44 /* Common setup data constant combinations */
    -
    45 #define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //get descriptor request type
    -
    46 #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'
    -
    47 #define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE //get interface request type
    -
    48 
    -
    49 // D7 data transfer direction (0 - host-to-device, 1 - device-to-host)
    -
    50 // D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved)
    -
    51 // D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved)
    -
    52 
    -
    53 // USB Device Classes
    -
    54 #define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors
    -
    55 #define USB_CLASS_AUDIO 0x01 // Audio
    -
    56 #define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control
    -
    57 #define USB_CLASS_HID 0x03 // HID
    -
    58 #define USB_CLASS_PHYSICAL 0x05 // Physical
    -
    59 #define USB_CLASS_IMAGE 0x06 // Image
    -
    60 #define USB_CLASS_PRINTER 0x07 // Printer
    -
    61 #define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage
    -
    62 #define USB_CLASS_HUB 0x09 // Hub
    -
    63 #define USB_CLASS_CDC_DATA 0x0a // CDC-Data
    -
    64 #define USB_CLASS_SMART_CARD 0x0b // Smart-Card
    -
    65 #define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security
    -
    66 #define USB_CLASS_VIDEO 0x0e // Video
    -
    67 #define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare
    -
    68 #define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device
    -
    69 #define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller
    -
    70 #define USB_CLASS_MISC 0xef // Miscellaneous
    -
    71 #define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific
    -
    72 #define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific
    -
    73 
    -
    74 // Additional Error Codes
    -
    75 #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1
    -
    76 #define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2
    -
    77 #define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3
    -
    78 #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4
    -
    79 #define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5
    -
    80 #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6
    -
    81 #define USB_ERROR_EPINFO_IS_NULL 0xD7
    -
    82 #define USB_ERROR_INVALID_ARGUMENT 0xD8
    -
    83 #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9
    -
    84 #define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA
    -
    85 #define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB
    -
    86 #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET 0xE0
    -
    87 #define USB_ERROR_FailGetDevDescr 0xE1
    -
    88 #define USB_ERROR_FailSetDevTblEntry 0xE2
    -
    89 #define USB_ERROR_FailGetConfDescr 0xE3
    -
    90 #define USB_ERROR_TRANSFER_TIMEOUT 0xFF
    -
    91 
    -
    92 #define USB_XFER_TIMEOUT 10000 //30000 // (5000) USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec
    -
    93 //#define USB_NAK_LIMIT 32000 //NAK limit for a transfer. 0 means NAKs are not counted
    -
    94 #define USB_RETRY_LIMIT 3 // 3 retry limit for a transfer
    -
    95 #define USB_SETTLE_DELAY 200 //settle delay in milliseconds
    -
    96 
    -
    97 #define USB_NUMDEVICES 16 //number of USB devices
    -
    98 //#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller
    -
    99 #define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms
    -
    100 
    -
    101 /* USB state machine states */
    -
    102 #define USB_STATE_MASK 0xf0
    -
    103 
    -
    104 #define USB_STATE_DETACHED 0x10
    -
    105 #define USB_DETACHED_SUBSTATE_INITIALIZE 0x11
    -
    106 #define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12
    -
    107 #define USB_DETACHED_SUBSTATE_ILLEGAL 0x13
    -
    108 #define USB_ATTACHED_SUBSTATE_SETTLE 0x20
    -
    109 #define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30
    -
    110 #define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40
    -
    111 #define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50
    -
    112 #define USB_ATTACHED_SUBSTATE_WAIT_RESET 0x51
    -
    113 #define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60
    -
    114 #define USB_STATE_ADDRESSING 0x70
    -
    115 #define USB_STATE_CONFIGURING 0x80
    -
    116 #define USB_STATE_RUNNING 0x90
    -
    117 #define USB_STATE_ERROR 0xa0
    -
    118 
    - -
    120 public:
    -
    121 
    -
    122  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    123  return 0;
    -
    124  }
    -
    125 
    -
    126  virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    127  return 0;
    -
    128  }
    -
    129 
    -
    130  virtual uint8_t Release() {
    -
    131  return 0;
    -
    132  }
    -
    133 
    -
    134  virtual uint8_t Poll() {
    -
    135  return 0;
    -
    136  }
    -
    137 
    -
    138  virtual uint8_t GetAddress() {
    -
    139  return 0;
    -
    140  }
    -
    141 
    -
    142  virtual void ResetHubPort(uint8_t port) {
    -
    143  return;
    -
    144  } // Note used for hubs only!
    -
    145 
    -
    146  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    147  return false;
    -
    148  }
    -
    149 
    -
    150  virtual boolean DEVCLASSOK(uint8_t klass) {
    -
    151  return false;
    -
    152  }
    -
    153 };
    -
    154 
    -
    155 /* USB Setup Packet Structure */
    -
    156 typedef struct {
    -
    157 
    -
    158  union { // offset description
    -
    159  uint8_t bmRequestType; // 0 Bit-map of request type
    -
    160 
    -
    161  struct {
    -
    162  uint8_t recipient : 5; // Recipient of the request
    -
    163  uint8_t type : 2; // Type of request
    -
    164  uint8_t direction : 1; // Direction of data X-fer
    -
    165  } __attribute__((packed));
    -
    166  } ReqType_u;
    -
    167  uint8_t bRequest; // 1 Request
    -
    168 
    -
    169  union {
    -
    170  uint16_t wValue; // 2 Depends on bRequest
    -
    171 
    -
    172  struct {
    -
    173  uint8_t wValueLo;
    -
    174  uint8_t wValueHi;
    -
    175  } __attribute__((packed));
    -
    176  } wVal_u;
    -
    177  uint16_t wIndex; // 4 Depends on bRequest
    -
    178  uint16_t wLength; // 6 Depends on bRequest
    -
    179 } __attribute__((packed)) SETUP_PKT, *PSETUP_PKT;
    -
    180 
    -
    181 
    -
    182 
    -
    183 // Base class for incoming data parser
    -
    184 
    - -
    186 public:
    -
    187  virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) = 0;
    -
    188 };
    +
    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 class USB : public MAX3421E {
    - -
    192  USBDeviceConfig* devConfig[USB_NUMDEVICES];
    -
    193  uint8_t bmHubPre;
    -
    194 
    -
    195 public:
    -
    196  USB(void);
    -
    197 
    -
    198  void SetHubPreMask() {
    -
    199  bmHubPre |= bmHUBPRE;
    -
    200  };
    +
    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 
    - -
    203  bmHubPre &= (~bmHUBPRE);
    -
    204  };
    -
    205 
    - -
    207  return (AddressPool&)addrPool;
    -
    208  };
    -
    209 
    - -
    211  for(uint8_t i = 0; i < USB_NUMDEVICES; i++) {
    -
    212  if(!devConfig[i]) {
    -
    213  devConfig[i] = pdev;
    -
    214  return 0;
    -
    215  }
    -
    216  }
    - -
    218  };
    -
    219 
    - -
    221  addrPool.ForEachUsbDevice(pfunc);
    -
    222  };
    -
    223  uint8_t getUsbTaskState(void);
    -
    224  void setUsbTaskState(uint8_t state);
    -
    225 
    -
    226  EpInfo* getEpInfoEntry(uint8_t addr, uint8_t ep);
    -
    227  uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr);
    -
    228 
    -
    229  /* Control requests */
    -
    230  uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
    -
    231  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr);
    +
    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  uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p);
    -
    234 
    -
    235  uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr);
    -
    236  uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr);
    -
    237  uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value);
    -
    238 
    -
    239  uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, boolean direction);
    -
    240  uint8_t ctrlStatus(uint8_t ep, boolean direction, uint16_t nak_limit);
    -
    241  uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data);
    -
    242  uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data);
    -
    243  uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit);
    -
    244 
    -
    245  void Task(void);
    -
    246 
    -
    247  uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed);
    -
    248  uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed);
    -
    249  uint8_t ReleaseDevice(uint8_t addr);
    -
    250 
    -
    251  uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi,
    -
    252  uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p);
    +
    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);
    +
    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 private:
    -
    255  void init();
    -
    256  uint8_t SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t &nak_limit);
    -
    257  uint8_t OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data);
    -
    258  uint8_t InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data);
    -
    259  uint8_t AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed);
    -
    260 };
    -
    261 
    -
    262 #if 0 //defined(USB_METHODS_INLINE)
    -
    263 //get device descriptor
    -
    264 
    -
    265 inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) {
    -
    266  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr));
    -
    267 }
    -
    268 //get configuration descriptor
    -
    269 
    -
    270 inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) {
    -
    271  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr));
    -
    272 }
    -
    273 //get string descriptor
    -
    274 
    -
    275 inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) {
    -
    276  return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr));
    -
    277 }
    -
    278 //set address
    -
    279 
    -
    280 inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) {
    -
    281  return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, NULL));
    -
    282 }
    -
    283 //set configuration
    -
    284 
    -
    285 inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) {
    -
    286  return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, NULL));
    -
    287 }
    -
    288 
    -
    289 #endif // defined(USB_METHODS_INLINE)
    -
    290 
    -
    291 #endif /* USBCORE_H */
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:766
    +
    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);
    +
    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:769
    -
    uint16_t wValue
    Definition: UsbCore.h:170
    -
    virtual uint8_t Poll()
    Definition: UsbCore.h:134
    -
    #define bmHUBPRE
    Definition: max3421e.h:170
    -
    virtual uint8_t GetAddress()
    Definition: UsbCore.h:138
    +
    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
    EpInfo * getEpInfoEntry(uint8_t addr, uint8_t ep)
    Definition: Usb.cpp:44
    #define USB_DESCRIPTOR_STRING
    Definition: usb_ch9.h:65
    -
    uint16_t wLength
    Definition: UsbCore.h:178
    - +
    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:805
    -
    #define USB_NUMDEVICES
    Definition: UsbCore.h:97
    - +
    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:808
    +
    #define USB_NUMDEVICES
    Definition: UsbCore.h:99
    +
    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:126
    -
    uint8_t bmRequestType
    Definition: UsbCore.h:159
    +
    virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: UsbCore.h:128
    +
    uint8_t bmRequestType
    Definition: UsbCore.h:166
    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
    -
    void ResetHubPreMask()
    Definition: UsbCore.h:202
    -
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:796
    -
    uint8_t ctrlStatus(uint8_t ep, boolean direction, uint16_t nak_limit)
    +
    void ResetHubPreMask()
    Definition: UsbCore.h:209
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    USB(void)
    Definition: Usb.cpp:25
    -
    void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
    Definition: address.h:90
    -
    uint16_t wIndex
    Definition: UsbCore.h:177
    -
    void SetHubPreMask()
    Definition: UsbCore.h:198
    +
    uint16_t wIndex
    Definition: UsbCore.h:184
    +
    void SetHubPreMask()
    Definition: UsbCore.h:205
    Definition: address.h:32
    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:292
    -
    #define bmREQ_GET_DESCR
    Definition: UsbCore.h:45
    -
    virtual void ResetHubPort(uint8_t port)
    Definition: UsbCore.h:142
    -
    #define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS
    Definition: UsbCore.h:77
    -
    uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr)
    Definition: Usb.cpp:791
    +
    #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:794
    #define USB_REQUEST_SET_ADDRESS
    Definition: usb_ch9.h:36
    -
    MAX3421e< P10, P9 > MAX3421E
    Definition: UsbCore.h:41
    - - +
    uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit)
    +
    MAX3421e< P10, P9 > MAX3421E
    Definition: UsbCore.h:43
    + +
    uint8_t getUsbTaskState(void)
    Definition: Usb.cpp:36
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data)
    Definition: Usb.cpp:206
    void Task(void)
    Definition: Usb.cpp:424
    +
    virtual bool DEVSUBCLASSOK(uint8_t subklass)
    Definition: UsbCore.h:156
    -
    virtual boolean DEVCLASSOK(uint8_t klass)
    Definition: UsbCore.h:150
    void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
    Definition: address.h:191
    -
    uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, boolean direction)
    uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit)
    Definition: Usb.cpp:376
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: UsbCore.h:122
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:206
    +
    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
    uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: Usb.cpp:652
    -
    Definition: UsbCore.h:190
    -
    virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: UsbCore.h:146
    -
    uint8_t bRequest
    Definition: UsbCore.h:167
    -
    virtual uint8_t Release()
    Definition: UsbCore.h:130
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:210
    -
    #define bmREQ_SET
    Definition: UsbCore.h:46
    -
    void ForEachUsbDevice(UsbDeviceHandleFunc pfunc)
    Definition: UsbCore.h:220
    +
    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:174
    +
    uint8_t wValueHi
    Definition: UsbCore.h:181
    uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: Usb.cpp:530
    -
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:761
    -
    uint8_t wValueLo
    Definition: UsbCore.h:173
    -
    uint8_t ReleaseDevice(uint8_t addr)
    Definition: Usb.cpp:746
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:764
    +
    uint8_t wValueLo
    Definition: UsbCore.h:180
    +
    void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
    Definition: address.h:90
    +
    uint8_t ReleaseDevice(uint8_t addr)
    Definition: Usb.cpp:749
    diff --git a/_wii_8cpp.html b/_wii_8cpp.html index 87a2d32e..c3291877 100644 --- a/_wii_8cpp.html +++ b/_wii_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Wii.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,7 @@ Include dependency graph for Wii.cpp:
    - +

    Go to the source code of this file.

    @@ -217,7 +218,7 @@ Variables diff --git a/_wii_8cpp__incl.map b/_wii_8cpp__incl.map index 204251c8..6a229cb9 100644 --- a/_wii_8cpp__incl.map +++ b/_wii_8cpp__incl.map @@ -1,6 +1,8 @@ - - + + + + diff --git a/_wii_8cpp__incl.md5 b/_wii_8cpp__incl.md5 index 7b0c4e29..6f89a0be 100644 --- a/_wii_8cpp__incl.md5 +++ b/_wii_8cpp__incl.md5 @@ -1 +1 @@ -ea76bb891427717ec3bb9ab7b2d76881 \ No newline at end of file +083313d0770479906a6dbdca88768783 \ No newline at end of file diff --git a/_wii_8cpp__incl.png b/_wii_8cpp__incl.png index 96035bdf5407266eb536343c11d21b38c3214ba7..ecd96f349fef2f44a2d1e998a5db36e820e1cdaf 100644 GIT binary patch literal 18091 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 literal 9602 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 TgAReSRWNc=${%YaOhWz#m^4y; diff --git a/_wii_8cpp_source.html b/_wii_8cpp_source.html index 1f13ded8..0df4510b 100644 --- a/_wii_8cpp_source.html +++ b/_wii_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Wii.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -174,1252 +175,1258 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    83 };
    84 
    85 WII::WII(BTD *p, bool pair) :
    -
    86 pBtd(p) // pointer to USB class instance - mandatory
    +
    86 BluetoothService(p) // Pointer to USB class instance - mandatory
    87 {
    -
    88  if(pBtd)
    -
    89  pBtd->registerServiceClass(this); // Register it as a Bluetooth service
    -
    90 
    -
    91  pBtd->pairWithWii = pair;
    -
    92 
    -
    93  HIDBuffer[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    94 
    -
    95  /* Set device cid for the control and intterrupt channelse - LSB */
    -
    96  control_dcid[0] = 0x60; //0x0060
    -
    97  control_dcid[1] = 0x00;
    -
    98  interrupt_dcid[0] = 0x61; //0x0061
    -
    99  interrupt_dcid[1] = 0x00;
    + +
    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  Reset();
    -
    102 }
    -
    103 
    -
    104 void WII::Reset() {
    -
    105  wiimoteConnected = false;
    -
    106  nunchuckConnected = false;
    -
    107  motionPlusConnected = false;
    -
    108  activateNunchuck = false;
    -
    109  motionValuesReset = false;
    -
    110  activeConnection = false;
    -
    111  motionPlusInside = false;
    -
    112  pBtd->wiiUProController = false;
    - -
    114  l2cap_event_flag = 0; // Reset flags
    -
    115  l2cap_state = L2CAP_WAIT;
    -
    116 }
    -
    117 
    -
    118 void WII::disconnect() { // Use this void to disconnect any of the controllers
    -
    119  if(!motionPlusInside) { // The old Wiimote needs a delay after the first command or it will automatically reconnect
    -
    120  if(motionPlusConnected) {
    -
    121 #ifdef DEBUG_USB_HOST
    -
    122  Notify(PSTR("\r\nDeactivating Motion Plus"), 0x80);
    -
    123 #endif
    -
    124  initExtension1(); // This will disable the Motion Plus extension
    -
    125  }
    -
    126  timer = millis() + 1000; // We have to wait for the message before the rest of the channels can be deactivated
    -
    127  } else
    -
    128  timer = millis(); // Don't wait
    -
    129  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
    -
    130  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, interrupt_scid, interrupt_dcid);
    -
    131  Reset();
    -
    132  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
    -
    133 }
    -
    134 
    -
    135 void WII::ACLData(uint8_t* l2capinbuf) {
    -
    136  if(!pBtd->l2capConnectionClaimed && pBtd->incomingWii && !wiimoteConnected && !activeConnection) {
    -
    137  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    -
    138  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
    -
    139  motionPlusInside = pBtd->motionPlusInside;
    -
    140  pBtd->incomingWii = false;
    -
    141  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
    -
    142  activeConnection = true;
    -
    143  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    -
    144  l2cap_state = L2CAP_WAIT;
    -
    145  }
    -
    146  }
    -
    147  }
    -
    148  //if((l2capinbuf[0] | (uint16_t)l2capinbuf[1] << 8) == (hci_handle | 0x2000U)) { // acl_handle_ok or it's a new connection
    -
    149  if(UHS_ACL_HANDLE_OK(l2capinbuf, hci_handle)) { // acl_handle_ok or it's a new connection
    -
    150  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { //l2cap_control - Channel ID for ACL-U
    -
    151  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
    -
    152 #ifdef DEBUG_USB_HOST
    -
    153  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
    -
    154  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    155  Notify(PSTR(" "), 0x80);
    -
    156  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    -
    157  Notify(PSTR(" "), 0x80);
    -
    158  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
    -
    159  Notify(PSTR(" "), 0x80);
    -
    160  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
    -
    161  Notify(PSTR(" "), 0x80);
    -
    162  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    -
    163  Notify(PSTR(" "), 0x80);
    -
    164  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    165 #endif
    -
    166  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_RESPONSE) {
    -
    167  if(((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) && ((l2capinbuf[18] | (l2capinbuf[19] << 8)) == SUCCESSFUL)) { // Success
    -
    168  if(l2capinbuf[14] == control_dcid[0] && l2capinbuf[15] == control_dcid[1]) {
    -
    169  //Notify(PSTR("\r\nHID Control Connection Complete"), 0x80);
    -
    170  identifier = l2capinbuf[9];
    -
    171  control_scid[0] = l2capinbuf[12];
    -
    172  control_scid[1] = l2capinbuf[13];
    - -
    174  } else if(l2capinbuf[14] == interrupt_dcid[0] && l2capinbuf[15] == interrupt_dcid[1]) {
    -
    175  //Notify(PSTR("\r\nHID Interrupt Connection Complete"), 0x80);
    -
    176  identifier = l2capinbuf[9];
    -
    177  interrupt_scid[0] = l2capinbuf[12];
    -
    178  interrupt_scid[1] = l2capinbuf[13];
    - -
    180  }
    -
    181  }
    -
    182  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    -
    183 #ifdef EXTRADEBUG
    -
    184  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
    -
    185  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    186  Notify(PSTR(" "), 0x80);
    -
    187  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    -
    188  Notify(PSTR(" SCID: "), 0x80);
    -
    189  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    -
    190  Notify(PSTR(" "), 0x80);
    -
    191  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    192  Notify(PSTR(" Identifier: "), 0x80);
    -
    193  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    -
    194 #endif
    -
    195  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
    -
    196  identifier = l2capinbuf[9];
    -
    197  control_scid[0] = l2capinbuf[14];
    -
    198  control_scid[1] = l2capinbuf[15];
    - -
    200  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
    -
    201  identifier = l2capinbuf[9];
    -
    202  interrupt_scid[0] = l2capinbuf[14];
    -
    203  interrupt_scid[1] = l2capinbuf[15];
    - -
    205  }
    -
    206  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
    -
    207  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
    -
    208  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    -
    209  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
    -
    210  identifier = l2capinbuf[9];
    - -
    212  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    -
    213  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
    -
    214  identifier = l2capinbuf[9];
    - -
    216  }
    -
    217  }
    -
    218  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
    -
    219  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    -
    220  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
    -
    221  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], control_scid);
    -
    222  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    -
    223  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
    -
    224  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], interrupt_scid);
    -
    225  }
    -
    226  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
    -
    227  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    -
    228 #ifdef DEBUG_USB_HOST
    -
    229  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
    -
    230 #endif
    -
    231  identifier = l2capinbuf[9];
    -
    232  pBtd->l2cap_disconnection_response(hci_handle, identifier, control_dcid, control_scid);
    -
    233  Reset();
    -
    234  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    -
    235 #ifdef DEBUG_USB_HOST
    -
    236  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
    -
    237 #endif
    -
    238  identifier = l2capinbuf[9];
    -
    239  pBtd->l2cap_disconnection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid);
    -
    240  Reset();
    -
    241  }
    -
    242  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
    -
    243  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
    -
    244  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
    -
    245  identifier = l2capinbuf[9];
    - -
    247  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
    -
    248  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
    -
    249  identifier = l2capinbuf[9];
    - -
    251  }
    -
    252  }
    -
    253 #ifdef EXTRADEBUG
    -
    254  else {
    -
    255  identifier = l2capinbuf[9];
    -
    256  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
    -
    257  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
    -
    258  }
    -
    259 #endif
    -
    260  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
    -
    261  //Notify(PSTR("\r\nL2CAP Interrupt"), 0x80);
    -
    262  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
    -
    263  if((l2capinbuf[9] >= 0x20 && l2capinbuf[9] <= 0x22) || (l2capinbuf[9] >= 0x30 && l2capinbuf[9] <= 0x37) || l2capinbuf[9] == 0x3e || l2capinbuf[9] == 0x3f) { // These reports include the buttons
    -
    264  if((l2capinbuf[9] >= 0x20 && l2capinbuf[9] <= 0x22) || l2capinbuf[9] == 0x31 || l2capinbuf[9] == 0x33) // These reports have no extensions bytes
    -
    265  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8));
    - -
    267  ButtonState = (uint32_t)(((~l2capinbuf[23]) & 0xFE) | ((uint16_t)(~l2capinbuf[24]) << 8) | ((uint32_t)((~l2capinbuf[25]) & 0x03) << 16));
    -
    268  else if(motionPlusConnected) {
    -
    269  if(l2capinbuf[20] & 0x02) // Only update the wiimote buttons, since the extension bytes are from the Motion Plus
    -
    270  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)(ButtonState & 0xFFFF0000)));
    -
    271  else if(nunchuckConnected) // Update if it's a report from the Nunchuck
    -
    272  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)((~l2capinbuf[20]) & 0x0C) << 14));
    -
    273  //else if(classicControllerConnected) // Update if it's a report from the Classic Controller
    -
    274  } else if(nunchuckConnected) // The Nunchuck is directly connected
    -
    275  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)((~l2capinbuf[20]) & 0x03) << 16));
    -
    276  //else if(classicControllerConnected) // The Classic Controller is directly connected
    -
    277  else if(!unknownExtensionConnected)
    -
    278  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8));
    -
    279 #ifdef PRINTREPORT
    -
    280  Notify(PSTR("ButtonState: "), 0x80);
    -
    281  D_PrintHex<uint32_t > (ButtonState, 0x80);
    -
    282  Notify(PSTR("\r\n"), 0x80);
    -
    283 #endif
    -
    284  if(ButtonState != OldButtonState) {
    -
    285  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    -
    286  OldButtonState = ButtonState;
    -
    287  }
    -
    288  }
    -
    289  if(l2capinbuf[9] == 0x31 || l2capinbuf[9] == 0x33 || l2capinbuf[9] == 0x35 || l2capinbuf[9] == 0x37) { // Read the accelerometer
    -
    290  accXwiimote = ((l2capinbuf[12] << 2) | (l2capinbuf[10] & 0x60 >> 5)) - 500;
    -
    291  accYwiimote = ((l2capinbuf[13] << 2) | (l2capinbuf[11] & 0x20 >> 4)) - 500;
    -
    292  accZwiimote = ((l2capinbuf[14] << 2) | (l2capinbuf[11] & 0x40 >> 5)) - 500;
    -
    293  }
    -
    294  switch(l2capinbuf[9]) {
    -
    295  case 0x20: // Status Information - (a1) 20 BB BB LF 00 00 VV
    -
    296 #ifdef EXTRADEBUG
    -
    297  Notify(PSTR("\r\nStatus report was received"), 0x80);
    -
    298 #endif
    -
    299  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)
    -
    300  batteryLevel = l2capinbuf[15]; // Update battery level
    -
    301 #ifdef DEBUG_USB_HOST
    -
    302  if(l2capinbuf[12] & 0x01)
    -
    303  Notify(PSTR("\r\nWARNING: Battery is nearly empty"), 0x80);
    -
    304 #endif
    -
    305  if(checkExtension) { // If this is false it means that the user must have called getBatteryLevel()
    -
    306  if(l2capinbuf[12] & 0x02) { // Check if a extension is connected
    -
    307 #ifdef DEBUG_USB_HOST
    -
    308  if(!unknownExtensionConnected)
    -
    309  Notify(PSTR("\r\nExtension connected"), 0x80);
    -
    310 #endif
    -
    311  unknownExtensionConnected = true;
    -
    312 #ifdef WIICAMERA
    -
    313  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    -
    314 #endif
    -
    315  setReportMode(false, 0x35); // Also read the extension
    -
    316  } else {
    -
    317 #ifdef DEBUG_USB_HOST
    -
    318  Notify(PSTR("\r\nExtension disconnected"), 0x80);
    -
    319 #endif
    -
    320  if(motionPlusConnected) {
    -
    321 #ifdef DEBUG_USB_HOST
    -
    322  Notify(PSTR(" - from Motion Plus"), 0x80);
    -
    323 #endif
    - -
    325  if(!activateNunchuck) // If it's already trying to initialize the Nunchuck don't set it to false
    -
    326  nunchuckConnected = false;
    -
    327  //else if(classicControllerConnected)
    -
    328  } else if(nunchuckConnected) {
    -
    329 #ifdef DEBUG_USB_HOST
    -
    330  Notify(PSTR(" - Nunchuck"), 0x80);
    -
    331 #endif
    -
    332  nunchuckConnected = false; // It must be the Nunchuck controller then
    - -
    334  onInit();
    -
    335  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
    -
    336  } else
    -
    337  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
    -
    338  }
    -
    339  } else
    -
    340  checkExtension = true; // Check for extensions by default
    -
    341  break;
    -
    342  case 0x21: // Read Memory Data
    -
    343  if((l2capinbuf[12] & 0x0F) == 0) { // No error
    -
    344  // See: http://wiibrew.org/wiki/Wiimote/Extension_Controllers
    -
    345  if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x00) {
    -
    346 #ifdef DEBUG_USB_HOST
    -
    347  Notify(PSTR("\r\nNunchuck connected"), 0x80);
    -
    348 #endif
    - -
    350  } else if(l2capinbuf[16] == 0x00 && (l2capinbuf[17] == 0xA6 || l2capinbuf[17] == 0xA4) && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x05) {
    -
    351 #ifdef DEBUG_USB_HOST
    -
    352  Notify(PSTR("\r\nMotion Plus connected"), 0x80);
    -
    353 #endif
    - -
    355  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x04 && l2capinbuf[20] == 0x05) {
    -
    356 #ifdef DEBUG_USB_HOST
    -
    357  Notify(PSTR("\r\nMotion Plus activated in normal mode"), 0x80);
    -
    358 #endif
    -
    359  motionPlusConnected = true;
    -
    360 #ifdef WIICAMERA
    -
    361  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    -
    362 #endif
    -
    363  setReportMode(false, 0x35); // Also read the extension
    -
    364  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x05 && l2capinbuf[20] == 0x05) {
    -
    365 #ifdef DEBUG_USB_HOST
    -
    366  Notify(PSTR("\r\nMotion Plus activated in Nunchuck pass-through mode"), 0x80);
    -
    367 #endif
    -
    368  activateNunchuck = false;
    -
    369  motionPlusConnected = true;
    -
    370  nunchuckConnected = true;
    -
    371 #ifdef WIICAMERA
    -
    372  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    -
    373 #endif
    -
    374  setReportMode(false, 0x35); // Also read the extension
    -
    375  } 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) {
    -
    376 #ifdef DEBUG_USB_HOST
    -
    377  Notify(PSTR("\r\nInactive Wii Motion Plus"), 0x80);
    -
    378  Notify(PSTR("\r\nPlease unplug the Motion Plus, disconnect the Wiimote and then replug the Motion Plus Extension"), 0x80);
    -
    379 #endif
    -
    380  stateCounter = 300; // Skip the rest in "WII_CHECK_MOTION_PLUS_STATE"
    -
    381  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x01 && l2capinbuf[20] == 0x20) {
    -
    382 #ifdef DEBUG_USB_HOST
    -
    383  Notify(PSTR("\r\nWii U Pro Controller connected"), 0x80);
    -
    384 #endif
    - -
    386  }
    -
    387 #ifdef DEBUG_USB_HOST
    -
    388  else {
    -
    389  Notify(PSTR("\r\nUnknown Device: "), 0x80);
    -
    390  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    391  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    392  Notify(PSTR("\r\nData: "), 0x80);
    -
    393  for(uint8_t i = 0; i < ((l2capinbuf[12] >> 4) + 1); i++) { // bit 4-7 is the length-1
    -
    394  D_PrintHex<uint8_t > (l2capinbuf[15 + i], 0x80);
    -
    395  Notify(PSTR(" "), 0x80);
    -
    396  }
    -
    397  }
    -
    398 #endif
    -
    399  }
    -
    400 #ifdef EXTRADEBUG
    -
    401  else {
    -
    402  Notify(PSTR("\r\nReport Error: "), 0x80);
    -
    403  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    -
    404  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    -
    405  }
    -
    406 #endif
    -
    407  break;
    -
    408  case 0x22: // Acknowledge output report, return function result
    -
    409 #ifdef DEBUG_USB_HOST
    -
    410  if(l2capinbuf[13] != 0x00) { // Check if there is an error
    -
    411  Notify(PSTR("\r\nCommand failed: "), 0x80);
    -
    412  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    -
    413  }
    -
    414 #endif
    -
    415  break;
    -
    416  case 0x30: // Core buttons - (a1) 30 BB BB
    -
    417  break;
    -
    418  case 0x31: // Core Buttons and Accelerometer - (a1) 31 BB BB AA AA AA
    -
    419  break;
    -
    420  case 0x32: // Core Buttons with 8 Extension bytes - (a1) 32 BB BB EE EE EE EE EE EE EE EE
    -
    421  break;
    -
    422  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
    -
    423 #ifdef WIICAMERA
    -
    424  // Read the IR data
    -
    425  IR_object_x1 = (l2capinbuf[15] | ((uint16_t)(l2capinbuf[17] & 0x30) << 4)); // x position
    -
    426  IR_object_y1 = (l2capinbuf[16] | ((uint16_t)(l2capinbuf[17] & 0xC0) << 2)); // y position
    -
    427  IR_object_s1 = (l2capinbuf[17] & 0x0F); // size value, 0-15
    -
    428 
    -
    429  IR_object_x2 = (l2capinbuf[18] | ((uint16_t)(l2capinbuf[20] & 0x30) << 4));
    -
    430  IR_object_y2 = (l2capinbuf[19] | ((uint16_t)(l2capinbuf[20] & 0xC0) << 2));
    -
    431  IR_object_s2 = (l2capinbuf[20] & 0x0F);
    -
    432 
    -
    433  IR_object_x3 = (l2capinbuf[21] | ((uint16_t)(l2capinbuf[23] & 0x30) << 4));
    -
    434  IR_object_y3 = (l2capinbuf[22] | ((uint16_t)(l2capinbuf[23] & 0xC0) << 2));
    -
    435  IR_object_s3 = (l2capinbuf[23] & 0x0F);
    -
    436 
    -
    437  IR_object_x4 = (l2capinbuf[24] | ((uint16_t)(l2capinbuf[26] & 0x30) << 4));
    -
    438  IR_object_y4 = (l2capinbuf[25] | ((uint16_t)(l2capinbuf[26] & 0xC0) << 2));
    -
    439  IR_object_s4 = (l2capinbuf[26] & 0x0F);
    -
    440 #endif
    -
    441  break;
    -
    442  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
    -
    443  break;
    -
    444  /* 0x3e and 0x3f both give unknown report types when report mode is 0x3e or 0x3f with mode number 0x05 */
    -
    445  case 0x3E: // Core Buttons with Accelerometer and 32 IR bytes
    -
    446  // (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
    -
    447  // corresponds to output report mode 0x3e
    -
    448 
    -
    449  /**** for reading in full mode: DOES NOT WORK YET ****/
    -
    450  /* When it works it will also have intensity and bounding box data */
    -
    451  /*
    -
    452  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
    -
    453  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
    -
    454  IR_object_s1 = (l2capinbuf[15] & 0x0F);
    -
    455  */
    -
    456  break;
    -
    457  case 0x3F:
    -
    458  /*
    -
    459  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
    -
    460  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
    -
    461  IR_object_s1 = (l2capinbuf[15] & 0x0F);
    -
    462  */
    -
    463  break;
    -
    464  case 0x35: // Core Buttons and Accelerometer with 16 Extension Bytes
    -
    465  // (a1) 35 BB BB AA AA AA EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE
    -
    466  if(motionPlusConnected) {
    -
    467  if(l2capinbuf[20] & 0x02) { // Check if it's a report from the Motion controller or the extension
    -
    468  if(motionValuesReset) { // We will only use the values when the gyro value has been set
    -
    469  gyroYawRaw = ((l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6)) - gyroYawZero);
    -
    470  gyroRollRaw = ((l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6)) - gyroRollZero);
    -
    471  gyroPitchRaw = ((l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6)) - gyroPitchZero);
    -
    472 
    -
    473  yawGyroSpeed = (double)gyroYawRaw / ((double)gyroYawZero / yawGyroScale);
    -
    474  rollGyroSpeed = -(double)gyroRollRaw / ((double)gyroRollZero / rollGyroScale); // We invert these values so they will fit the acc values
    - -
    476 
    -
    477  /* The onboard gyro has two ranges for slow and fast mode */
    -
    478  if(!(l2capinbuf[18] & 0x02)) // Check if fast mode is used
    -
    479  yawGyroSpeed *= 4.545;
    -
    480  if(!(l2capinbuf[18] & 0x01)) // Check if fast mode is used
    -
    481  pitchGyroSpeed *= 4.545;
    -
    482  if(!(l2capinbuf[19] & 0x02)) // Check if fast mode is used
    -
    483  rollGyroSpeed *= 4.545;
    +
    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  l2cap_event_flag = 0; // Reset flags
    +
    112  l2cap_state = L2CAP_WAIT;
    +
    113 }
    +
    114 
    +
    115 void WII::disconnect() { // Use this void to disconnect any of the controllers
    +
    116  if(!motionPlusInside) { // The old Wiimote needs a delay after the first command or it will automatically reconnect
    +
    117  if(motionPlusConnected) {
    +
    118 #ifdef DEBUG_USB_HOST
    +
    119  Notify(PSTR("\r\nDeactivating Motion Plus"), 0x80);
    +
    120 #endif
    +
    121  initExtension1(); // This will disable the Motion Plus extension
    +
    122  }
    +
    123  timer = millis() + 1000; // We have to wait for the message before the rest of the channels can be deactivated
    +
    124  } else
    +
    125  timer = millis(); // Don't wait
    +
    126  // First the HID interrupt channel has to be disconnected, then the HID control channel and finally the HCI connection
    +
    127  pBtd->l2cap_disconnection_request(hci_handle, ++identifier, interrupt_scid, interrupt_dcid);
    +
    128  Reset();
    +
    129  l2cap_state = L2CAP_INTERRUPT_DISCONNECT;
    +
    130 }
    +
    131 
    +
    132 void WII::ACLData(uint8_t* l2capinbuf) {
    +
    133  if(!pBtd->l2capConnectionClaimed && pBtd->incomingWii && !wiimoteConnected && !activeConnection) {
    +
    134  if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    +
    135  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
    +
    136  motionPlusInside = pBtd->motionPlusInside;
    +
    137  pBtd->incomingWii = false;
    +
    138  pBtd->l2capConnectionClaimed = true; // Claim that the incoming connection belongs to this service
    +
    139  activeConnection = true;
    +
    140  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    +
    141  l2cap_state = L2CAP_WAIT;
    +
    142  }
    +
    143  }
    +
    144  }
    +
    145 
    +
    146  if(checkHciHandle(l2capinbuf, hci_handle)) { // acl_handle_ok
    +
    147  if((l2capinbuf[6] | (l2capinbuf[7] << 8)) == 0x0001U) { // l2cap_control - Channel ID for ACL-U
    +
    148  if(l2capinbuf[8] == L2CAP_CMD_COMMAND_REJECT) {
    +
    149 #ifdef DEBUG_USB_HOST
    +
    150  Notify(PSTR("\r\nL2CAP Command Rejected - Reason: "), 0x80);
    +
    151  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    +
    152  Notify(PSTR(" "), 0x80);
    +
    153  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    +
    154  Notify(PSTR(" "), 0x80);
    +
    155  D_PrintHex<uint8_t > (l2capinbuf[17], 0x80);
    +
    156  Notify(PSTR(" "), 0x80);
    +
    157  D_PrintHex<uint8_t > (l2capinbuf[16], 0x80);
    +
    158  Notify(PSTR(" "), 0x80);
    +
    159  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    +
    160  Notify(PSTR(" "), 0x80);
    +
    161  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    +
    162 #endif
    +
    163  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_RESPONSE) {
    +
    164  if(((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) && ((l2capinbuf[18] | (l2capinbuf[19] << 8)) == SUCCESSFUL)) { // Success
    +
    165  if(l2capinbuf[14] == control_dcid[0] && l2capinbuf[15] == control_dcid[1]) {
    +
    166  //Notify(PSTR("\r\nHID Control Connection Complete"), 0x80);
    +
    167  identifier = l2capinbuf[9];
    +
    168  control_scid[0] = l2capinbuf[12];
    +
    169  control_scid[1] = l2capinbuf[13];
    + +
    171  } else if(l2capinbuf[14] == interrupt_dcid[0] && l2capinbuf[15] == interrupt_dcid[1]) {
    +
    172  //Notify(PSTR("\r\nHID Interrupt Connection Complete"), 0x80);
    +
    173  identifier = l2capinbuf[9];
    +
    174  interrupt_scid[0] = l2capinbuf[12];
    +
    175  interrupt_scid[1] = l2capinbuf[13];
    + +
    177  }
    +
    178  }
    +
    179  } else if(l2capinbuf[8] == L2CAP_CMD_CONNECTION_REQUEST) {
    +
    180 #ifdef EXTRADEBUG
    +
    181  Notify(PSTR("\r\nL2CAP Connection Request - PSM: "), 0x80);
    +
    182  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    +
    183  Notify(PSTR(" "), 0x80);
    +
    184  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    +
    185  Notify(PSTR(" SCID: "), 0x80);
    +
    186  D_PrintHex<uint8_t > (l2capinbuf[15], 0x80);
    +
    187  Notify(PSTR(" "), 0x80);
    +
    188  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    +
    189  Notify(PSTR(" Identifier: "), 0x80);
    +
    190  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    +
    191 #endif
    +
    192  if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_CTRL_PSM) {
    +
    193  identifier = l2capinbuf[9];
    +
    194  control_scid[0] = l2capinbuf[14];
    +
    195  control_scid[1] = l2capinbuf[15];
    + +
    197  } else if((l2capinbuf[12] | (l2capinbuf[13] << 8)) == HID_INTR_PSM) {
    +
    198  identifier = l2capinbuf[9];
    +
    199  interrupt_scid[0] = l2capinbuf[14];
    +
    200  interrupt_scid[1] = l2capinbuf[15];
    + +
    202  }
    +
    203  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_RESPONSE) {
    +
    204  if((l2capinbuf[16] | (l2capinbuf[17] << 8)) == 0x0000) { // Success
    +
    205  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    +
    206  //Notify(PSTR("\r\nHID Control Configuration Complete"), 0x80);
    +
    207  identifier = l2capinbuf[9];
    + +
    209  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    +
    210  //Notify(PSTR("\r\nHID Interrupt Configuration Complete"), 0x80);
    +
    211  identifier = l2capinbuf[9];
    + +
    213  }
    +
    214  }
    +
    215  } else if(l2capinbuf[8] == L2CAP_CMD_CONFIG_REQUEST) {
    +
    216  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    +
    217  //Notify(PSTR("\r\nHID Control Configuration Request"), 0x80);
    +
    218  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], control_scid);
    +
    219  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    +
    220  //Notify(PSTR("\r\nHID Interrupt Configuration Request"), 0x80);
    +
    221  pBtd->l2cap_config_response(hci_handle, l2capinbuf[9], interrupt_scid);
    +
    222  }
    +
    223  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_REQUEST) {
    +
    224  if(l2capinbuf[12] == control_dcid[0] && l2capinbuf[13] == control_dcid[1]) {
    +
    225 #ifdef DEBUG_USB_HOST
    +
    226  Notify(PSTR("\r\nDisconnect Request: Control Channel"), 0x80);
    +
    227 #endif
    +
    228  identifier = l2capinbuf[9];
    +
    229  pBtd->l2cap_disconnection_response(hci_handle, identifier, control_dcid, control_scid);
    +
    230  Reset();
    +
    231  } else if(l2capinbuf[12] == interrupt_dcid[0] && l2capinbuf[13] == interrupt_dcid[1]) {
    +
    232 #ifdef DEBUG_USB_HOST
    +
    233  Notify(PSTR("\r\nDisconnect Request: Interrupt Channel"), 0x80);
    +
    234 #endif
    +
    235  identifier = l2capinbuf[9];
    +
    236  pBtd->l2cap_disconnection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid);
    +
    237  Reset();
    +
    238  }
    +
    239  } else if(l2capinbuf[8] == L2CAP_CMD_DISCONNECT_RESPONSE) {
    +
    240  if(l2capinbuf[12] == control_scid[0] && l2capinbuf[13] == control_scid[1]) {
    +
    241  //Notify(PSTR("\r\nDisconnect Response: Control Channel"), 0x80);
    +
    242  identifier = l2capinbuf[9];
    + +
    244  } else if(l2capinbuf[12] == interrupt_scid[0] && l2capinbuf[13] == interrupt_scid[1]) {
    +
    245  //Notify(PSTR("\r\nDisconnect Response: Interrupt Channel"), 0x80);
    +
    246  identifier = l2capinbuf[9];
    + +
    248  }
    +
    249  }
    +
    250 #ifdef EXTRADEBUG
    +
    251  else {
    +
    252  identifier = l2capinbuf[9];
    +
    253  Notify(PSTR("\r\nL2CAP Unknown Signaling Command: "), 0x80);
    +
    254  D_PrintHex<uint8_t > (l2capinbuf[8], 0x80);
    +
    255  }
    +
    256 #endif
    +
    257  } else if(l2capinbuf[6] == interrupt_dcid[0] && l2capinbuf[7] == interrupt_dcid[1]) { // l2cap_interrupt
    +
    258  //Notify(PSTR("\r\nL2CAP Interrupt"), 0x80);
    +
    259  if(l2capinbuf[8] == 0xA1) { // HID_THDR_DATA_INPUT
    +
    260  if((l2capinbuf[9] >= 0x20 && l2capinbuf[9] <= 0x22) || (l2capinbuf[9] >= 0x30 && l2capinbuf[9] <= 0x37) || l2capinbuf[9] == 0x3e || l2capinbuf[9] == 0x3f) { // These reports include the buttons
    +
    261  if((l2capinbuf[9] >= 0x20 && l2capinbuf[9] <= 0x22) || l2capinbuf[9] == 0x31 || l2capinbuf[9] == 0x33) // These reports have no extensions bytes
    +
    262  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8));
    + +
    264  ButtonState = (uint32_t)(((~l2capinbuf[23]) & 0xFE) | ((uint16_t)(~l2capinbuf[24]) << 8) | ((uint32_t)((~l2capinbuf[25]) & 0x03) << 16));
    +
    265  else if(motionPlusConnected) {
    +
    266  if(l2capinbuf[20] & 0x02) // Only update the wiimote buttons, since the extension bytes are from the Motion Plus
    +
    267  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)(ButtonState & 0xFFFF0000)));
    +
    268  else if(nunchuckConnected) // Update if it's a report from the Nunchuck
    +
    269  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)((~l2capinbuf[20]) & 0x0C) << 14));
    +
    270  //else if(classicControllerConnected) // Update if it's a report from the Classic Controller
    +
    271  } else if(nunchuckConnected) // The Nunchuck is directly connected
    +
    272  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8) | ((uint32_t)((~l2capinbuf[20]) & 0x03) << 16));
    +
    273  //else if(classicControllerConnected) // The Classic Controller is directly connected
    +
    274  else if(!unknownExtensionConnected)
    +
    275  ButtonState = (uint32_t)((l2capinbuf[10] & 0x1F) | ((uint16_t)(l2capinbuf[11] & 0x9F) << 8));
    +
    276 #ifdef PRINTREPORT
    +
    277  Notify(PSTR("ButtonState: "), 0x80);
    +
    278  D_PrintHex<uint32_t > (ButtonState, 0x80);
    +
    279  Notify(PSTR("\r\n"), 0x80);
    +
    280 #endif
    +
    281  if(ButtonState != OldButtonState) {
    +
    282  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    +
    283  OldButtonState = ButtonState;
    +
    284  }
    +
    285  }
    +
    286  if(l2capinbuf[9] == 0x31 || l2capinbuf[9] == 0x33 || l2capinbuf[9] == 0x35 || l2capinbuf[9] == 0x37) { // Read the accelerometer
    +
    287  accXwiimote = ((l2capinbuf[12] << 2) | (l2capinbuf[10] & 0x60 >> 5)) - 500;
    +
    288  accYwiimote = ((l2capinbuf[13] << 2) | (l2capinbuf[11] & 0x20 >> 4)) - 500;
    +
    289  accZwiimote = ((l2capinbuf[14] << 2) | (l2capinbuf[11] & 0x40 >> 5)) - 500;
    +
    290  }
    +
    291  switch(l2capinbuf[9]) {
    +
    292  case 0x20: // Status Information - (a1) 20 BB BB LF 00 00 VV
    +
    293 #ifdef EXTRADEBUG
    +
    294  Notify(PSTR("\r\nStatus report was received"), 0x80);
    +
    295 #endif
    +
    296  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)
    +
    297  batteryLevel = l2capinbuf[15]; // Update battery level
    +
    298 #ifdef DEBUG_USB_HOST
    +
    299  if(l2capinbuf[12] & 0x01)
    +
    300  Notify(PSTR("\r\nWARNING: Battery is nearly empty"), 0x80);
    +
    301 #endif
    +
    302  if(checkExtension) { // If this is false it means that the user must have called getBatteryLevel()
    +
    303  if(l2capinbuf[12] & 0x02) { // Check if a extension is connected
    +
    304 #ifdef DEBUG_USB_HOST
    +
    305  if(!unknownExtensionConnected)
    +
    306  Notify(PSTR("\r\nExtension connected"), 0x80);
    +
    307 #endif
    +
    308  unknownExtensionConnected = true;
    +
    309 #ifdef WIICAMERA
    +
    310  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    +
    311 #endif
    +
    312  setReportMode(false, 0x35); // Also read the extension
    +
    313  } else {
    +
    314 #ifdef DEBUG_USB_HOST
    +
    315  Notify(PSTR("\r\nExtension disconnected"), 0x80);
    +
    316 #endif
    +
    317  if(motionPlusConnected) {
    +
    318 #ifdef DEBUG_USB_HOST
    +
    319  Notify(PSTR(" - from Motion Plus"), 0x80);
    +
    320 #endif
    + +
    322  if(!activateNunchuck) // If it's already trying to initialize the Nunchuck don't set it to false
    +
    323  nunchuckConnected = false;
    +
    324  //else if(classicControllerConnected)
    +
    325  } else if(nunchuckConnected) {
    +
    326 #ifdef DEBUG_USB_HOST
    +
    327  Notify(PSTR(" - Nunchuck"), 0x80);
    +
    328 #endif
    +
    329  nunchuckConnected = false; // It must be the Nunchuck controller then
    + +
    331  onInit();
    +
    332  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
    +
    333  } else
    +
    334  setReportMode(false, 0x31); // If there is no extension connected we will read the buttons and accelerometer
    +
    335  }
    +
    336  } else
    +
    337  checkExtension = true; // Check for extensions by default
    +
    338  break;
    +
    339  case 0x21: // Read Memory Data
    +
    340  if((l2capinbuf[12] & 0x0F) == 0) { // No error
    +
    341  // See: http://wiibrew.org/wiki/Wiimote/Extension_Controllers
    +
    342  if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x00) {
    +
    343 #ifdef DEBUG_USB_HOST
    +
    344  Notify(PSTR("\r\nNunchuck connected"), 0x80);
    +
    345 #endif
    + +
    347  } else if(l2capinbuf[16] == 0x00 && (l2capinbuf[17] == 0xA6 || l2capinbuf[17] == 0xA4) && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x00 && l2capinbuf[20] == 0x05) {
    +
    348 #ifdef DEBUG_USB_HOST
    +
    349  Notify(PSTR("\r\nMotion Plus connected"), 0x80);
    +
    350 #endif
    + +
    352  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x04 && l2capinbuf[20] == 0x05) {
    +
    353 #ifdef DEBUG_USB_HOST
    +
    354  Notify(PSTR("\r\nMotion Plus activated in normal mode"), 0x80);
    +
    355 #endif
    +
    356  motionPlusConnected = true;
    +
    357 #ifdef WIICAMERA
    +
    358  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    +
    359 #endif
    +
    360  setReportMode(false, 0x35); // Also read the extension
    +
    361  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x05 && l2capinbuf[20] == 0x05) {
    +
    362 #ifdef DEBUG_USB_HOST
    +
    363  Notify(PSTR("\r\nMotion Plus activated in Nunchuck pass-through mode"), 0x80);
    +
    364 #endif
    +
    365  activateNunchuck = false;
    +
    366  motionPlusConnected = true;
    +
    367  nunchuckConnected = true;
    +
    368 #ifdef WIICAMERA
    +
    369  if(!isIRCameraEnabled()) // Don't activate the Motion Plus if we are trying to initialize the IR camera
    +
    370 #endif
    +
    371  setReportMode(false, 0x35); // Also read the extension
    +
    372  } 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) {
    +
    373 #ifdef DEBUG_USB_HOST
    +
    374  Notify(PSTR("\r\nInactive Wii Motion Plus"), 0x80);
    +
    375  Notify(PSTR("\r\nPlease unplug the Motion Plus, disconnect the Wiimote and then replug the Motion Plus Extension"), 0x80);
    +
    376 #endif
    +
    377  stateCounter = 300; // Skip the rest in "WII_CHECK_MOTION_PLUS_STATE"
    +
    378  } else if(l2capinbuf[16] == 0x00 && l2capinbuf[17] == 0xA4 && l2capinbuf[18] == 0x20 && l2capinbuf[19] == 0x01 && l2capinbuf[20] == 0x20) {
    +
    379 #ifdef DEBUG_USB_HOST
    +
    380  Notify(PSTR("\r\nWii U Pro Controller connected"), 0x80);
    +
    381 #endif
    + +
    383  }
    +
    384 #ifdef DEBUG_USB_HOST
    +
    385  else {
    +
    386  Notify(PSTR("\r\nUnknown Device: "), 0x80);
    +
    387  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    +
    388  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    +
    389  Notify(PSTR("\r\nData: "), 0x80);
    +
    390  for(uint8_t i = 0; i < ((l2capinbuf[12] >> 4) + 1); i++) { // bit 4-7 is the length-1
    +
    391  D_PrintHex<uint8_t > (l2capinbuf[15 + i], 0x80);
    +
    392  Notify(PSTR(" "), 0x80);
    +
    393  }
    +
    394  }
    +
    395 #endif
    +
    396  }
    +
    397 #ifdef EXTRADEBUG
    +
    398  else {
    +
    399  Notify(PSTR("\r\nReport Error: "), 0x80);
    +
    400  D_PrintHex<uint8_t > (l2capinbuf[13], 0x80);
    +
    401  D_PrintHex<uint8_t > (l2capinbuf[14], 0x80);
    +
    402  }
    +
    403 #endif
    +
    404  break;
    +
    405  case 0x22: // Acknowledge output report, return function result
    +
    406 #ifdef DEBUG_USB_HOST
    +
    407  if(l2capinbuf[13] != 0x00) { // Check if there is an error
    +
    408  Notify(PSTR("\r\nCommand failed: "), 0x80);
    +
    409  D_PrintHex<uint8_t > (l2capinbuf[12], 0x80);
    +
    410  }
    +
    411 #endif
    +
    412  break;
    +
    413  case 0x30: // Core buttons - (a1) 30 BB BB
    +
    414  break;
    +
    415  case 0x31: // Core Buttons and Accelerometer - (a1) 31 BB BB AA AA AA
    +
    416  break;
    +
    417  case 0x32: // Core Buttons with 8 Extension bytes - (a1) 32 BB BB EE EE EE EE EE EE EE EE
    +
    418  break;
    +
    419  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
    +
    420 #ifdef WIICAMERA
    +
    421  // Read the IR data
    +
    422  IR_object_x1 = (l2capinbuf[15] | ((uint16_t)(l2capinbuf[17] & 0x30) << 4)); // x position
    +
    423  IR_object_y1 = (l2capinbuf[16] | ((uint16_t)(l2capinbuf[17] & 0xC0) << 2)); // y position
    +
    424  IR_object_s1 = (l2capinbuf[17] & 0x0F); // size value, 0-15
    +
    425 
    +
    426  IR_object_x2 = (l2capinbuf[18] | ((uint16_t)(l2capinbuf[20] & 0x30) << 4));
    +
    427  IR_object_y2 = (l2capinbuf[19] | ((uint16_t)(l2capinbuf[20] & 0xC0) << 2));
    +
    428  IR_object_s2 = (l2capinbuf[20] & 0x0F);
    +
    429 
    +
    430  IR_object_x3 = (l2capinbuf[21] | ((uint16_t)(l2capinbuf[23] & 0x30) << 4));
    +
    431  IR_object_y3 = (l2capinbuf[22] | ((uint16_t)(l2capinbuf[23] & 0xC0) << 2));
    +
    432  IR_object_s3 = (l2capinbuf[23] & 0x0F);
    +
    433 
    +
    434  IR_object_x4 = (l2capinbuf[24] | ((uint16_t)(l2capinbuf[26] & 0x30) << 4));
    +
    435  IR_object_y4 = (l2capinbuf[25] | ((uint16_t)(l2capinbuf[26] & 0xC0) << 2));
    +
    436  IR_object_s4 = (l2capinbuf[26] & 0x0F);
    +
    437 #endif
    +
    438  break;
    +
    439  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
    +
    440  break;
    +
    441  /* 0x3e and 0x3f both give unknown report types when report mode is 0x3e or 0x3f with mode number 0x05 */
    +
    442  case 0x3E: // Core Buttons with Accelerometer and 32 IR bytes
    +
    443  // (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
    +
    444  // corresponds to output report mode 0x3e
    +
    445 
    +
    446  /**** for reading in full mode: DOES NOT WORK YET ****/
    +
    447  /* When it works it will also have intensity and bounding box data */
    +
    448  /*
    +
    449  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
    +
    450  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
    +
    451  IR_object_s1 = (l2capinbuf[15] & 0x0F);
    +
    452  */
    +
    453  break;
    +
    454  case 0x3F:
    +
    455  /*
    +
    456  IR_object_x1 = (l2capinbuf[13] | ((uint16_t)(l2capinbuf[15] & 0x30) << 4));
    +
    457  IR_object_y1 = (l2capinbuf[14] | ((uint16_t)(l2capinbuf[15] & 0xC0) << 2));
    +
    458  IR_object_s1 = (l2capinbuf[15] & 0x0F);
    +
    459  */
    +
    460  break;
    +
    461  case 0x35: // Core Buttons and Accelerometer with 16 Extension Bytes
    +
    462  // (a1) 35 BB BB AA AA AA EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE
    +
    463  if(motionPlusConnected) {
    +
    464  if(l2capinbuf[20] & 0x02) { // Check if it's a report from the Motion controller or the extension
    +
    465  if(motionValuesReset) { // We will only use the values when the gyro value has been set
    +
    466  gyroYawRaw = ((l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6)) - gyroYawZero);
    +
    467  gyroRollRaw = ((l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6)) - gyroRollZero);
    +
    468  gyroPitchRaw = ((l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6)) - gyroPitchZero);
    +
    469 
    +
    470  yawGyroSpeed = (double)gyroYawRaw / ((double)gyroYawZero / yawGyroScale);
    +
    471  rollGyroSpeed = -(double)gyroRollRaw / ((double)gyroRollZero / rollGyroScale); // We invert these values so they will fit the acc values
    + +
    473 
    +
    474  /* The onboard gyro has two ranges for slow and fast mode */
    +
    475  if(!(l2capinbuf[18] & 0x02)) // Check if fast mode is used
    +
    476  yawGyroSpeed *= 4.545;
    +
    477  if(!(l2capinbuf[18] & 0x01)) // Check if fast mode is used
    +
    478  pitchGyroSpeed *= 4.545;
    +
    479  if(!(l2capinbuf[19] & 0x02)) // Check if fast mode is used
    +
    480  rollGyroSpeed *= 4.545;
    +
    481 
    +
    482  compPitch = (0.93 * (compPitch + (pitchGyroSpeed * (double)(micros() - timer) / 1000000)))+(0.07 * getWiimotePitch()); // Use a complimentary filter to calculate the angle
    +
    483  compRoll = (0.93 * (compRoll + (rollGyroSpeed * (double)(micros() - timer) / 1000000)))+(0.07 * getWiimoteRoll());
    484 
    -
    485  compPitch = (0.93 * (compPitch + (pitchGyroSpeed * (double)(micros() - timer) / 1000000)))+(0.07 * getWiimotePitch()); // Use a complimentary filter to calculate the angle
    -
    486  compRoll = (0.93 * (compRoll + (rollGyroSpeed * (double)(micros() - timer) / 1000000)))+(0.07 * getWiimoteRoll());
    -
    487 
    -
    488  gyroYaw += (yawGyroSpeed * ((double)(micros() - timer) / 1000000));
    -
    489  gyroRoll += (rollGyroSpeed * ((double)(micros() - timer) / 1000000));
    -
    490  gyroPitch += (pitchGyroSpeed * ((double)(micros() - timer) / 1000000));
    -
    491  timer = micros();
    -
    492  /*
    -
    493  // Uncomment these lines to tune the gyro scale variabels
    -
    494  Notify(PSTR("\r\ngyroYaw: "), 0x80);
    -
    495  Notify(gyroYaw, 0x80);
    -
    496  Notify(PSTR("\tgyroRoll: "), 0x80);
    -
    497  Notify(gyroRoll, 0x80);
    -
    498  Notify(PSTR("\tgyroPitch: "), 0x80);
    -
    499  Notify(gyroPitch, 0x80);
    -
    500  */
    -
    501  /*
    -
    502  Notify(PSTR("\twiimoteRoll: "), 0x80);
    -
    503  Notify(wiimoteRoll, 0x80);
    -
    504  Notify(PSTR("\twiimotePitch: "), 0x80);
    -
    505  Notify(wiimotePitch, 0x80);
    -
    506  */
    -
    507  } else {
    -
    508  if((micros() - timer) > 1000000) { // Loop for 1 sec before resetting the values
    -
    509 #ifdef DEBUG_USB_HOST
    -
    510  Notify(PSTR("\r\nThe gyro values has been reset"), 0x80);
    -
    511 #endif
    -
    512  gyroYawZero = (l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6));
    -
    513  gyroRollZero = (l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6));
    -
    514  gyroPitchZero = (l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6));
    -
    515 
    -
    516  rollGyroScale = 500; // You might need to adjust these
    -
    517  pitchGyroScale = 400;
    -
    518  yawGyroScale = 415;
    -
    519 
    -
    520  gyroYaw = 0;
    -
    521  gyroRoll = 0;
    -
    522  gyroPitch = 0;
    -
    523 
    -
    524  motionValuesReset = true;
    -
    525  timer = micros();
    -
    526  }
    -
    527  }
    -
    528  } else {
    -
    529  if(nunchuckConnected) {
    -
    530  hatValues[HatX] = l2capinbuf[15];
    -
    531  hatValues[HatY] = l2capinbuf[16];
    -
    532  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x10 >> 3)) - 416;
    -
    533  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x20 >> 4)) - 416;
    -
    534  accZnunchuck = (((l2capinbuf[19] & 0xFE) << 2) | (l2capinbuf[20] & 0xC0 >> 5)) - 416;
    -
    535  }
    -
    536  //else if(classicControllerConnected) { }
    -
    537  }
    -
    538  if(l2capinbuf[19] & 0x01) {
    -
    539  if(!extensionConnected) {
    -
    540  extensionConnected = true;
    -
    541  unknownExtensionConnected = true;
    -
    542 #ifdef DEBUG_USB_HOST
    -
    543  Notify(PSTR("\r\nExtension connected to Motion Plus"), 0x80);
    -
    544 #endif
    -
    545  }
    -
    546  } else {
    -
    547  if(extensionConnected && !unknownExtensionConnected) {
    -
    548  extensionConnected = false;
    -
    549  unknownExtensionConnected = true;
    -
    550 #ifdef DEBUG_USB_HOST
    -
    551  Notify(PSTR("\r\nExtension disconnected from Motion Plus"), 0x80);
    -
    552 #endif
    -
    553  nunchuckConnected = false; // There is no extension connected to the Motion Plus if this report is sent
    -
    554  }
    -
    555  }
    -
    556 
    -
    557  } else if(nunchuckConnected) {
    -
    558  hatValues[HatX] = l2capinbuf[15];
    -
    559  hatValues[HatY] = l2capinbuf[16];
    -
    560  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x0C >> 2)) - 416;
    -
    561  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x30 >> 4)) - 416;
    -
    562  accZnunchuck = ((l2capinbuf[19] << 2) | (l2capinbuf[20] & 0xC0 >> 6)) - 416;
    -
    563  } else if(wiiUProControllerConnected) {
    -
    564  hatValues[LeftHatX] = (l2capinbuf[15] | l2capinbuf[16] << 8);
    -
    565  hatValues[RightHatX] = (l2capinbuf[17] | l2capinbuf[18] << 8);
    -
    566  hatValues[LeftHatY] = (l2capinbuf[19] | l2capinbuf[20] << 8);
    -
    567  hatValues[RightHatY] = (l2capinbuf[21] | l2capinbuf[22] << 8);
    -
    568  }
    -
    569  break;
    -
    570 #ifdef DEBUG_USB_HOST
    -
    571  default:
    -
    572  Notify(PSTR("\r\nUnknown Report type: "), 0x80);
    -
    573  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    -
    574  break;
    -
    575 #endif
    -
    576  }
    -
    577  }
    -
    578  }
    -
    579  L2CAP_task();
    -
    580  }
    -
    581 }
    -
    582 
    -
    583 void WII::L2CAP_task() {
    -
    584  switch(l2cap_state) {
    -
    585  /* These states are used if the Wiimote is the host */
    - - -
    588 #ifdef DEBUG_USB_HOST
    -
    589  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
    -
    590 #endif
    -
    591  l2cap_state = L2CAP_INTERRUPT_SETUP;
    -
    592  }
    -
    593  break;
    -
    594 
    - - -
    597 #ifdef DEBUG_USB_HOST
    -
    598  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
    -
    599 #endif
    -
    600  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, PENDING);
    +
    485  gyroYaw += (yawGyroSpeed * ((double)(micros() - timer) / 1000000));
    +
    486  gyroRoll += (rollGyroSpeed * ((double)(micros() - timer) / 1000000));
    +
    487  gyroPitch += (pitchGyroSpeed * ((double)(micros() - timer) / 1000000));
    +
    488  timer = micros();
    +
    489  /*
    +
    490  // Uncomment these lines to tune the gyro scale variabels
    +
    491  Notify(PSTR("\r\ngyroYaw: "), 0x80);
    +
    492  Notify(gyroYaw, 0x80);
    +
    493  Notify(PSTR("\tgyroRoll: "), 0x80);
    +
    494  Notify(gyroRoll, 0x80);
    +
    495  Notify(PSTR("\tgyroPitch: "), 0x80);
    +
    496  Notify(gyroPitch, 0x80);
    +
    497  */
    +
    498  /*
    +
    499  Notify(PSTR("\twiimoteRoll: "), 0x80);
    +
    500  Notify(wiimoteRoll, 0x80);
    +
    501  Notify(PSTR("\twiimotePitch: "), 0x80);
    +
    502  Notify(wiimotePitch, 0x80);
    +
    503  */
    +
    504  } else {
    +
    505  if((micros() - timer) > 1000000) { // Loop for 1 sec before resetting the values
    +
    506 #ifdef DEBUG_USB_HOST
    +
    507  Notify(PSTR("\r\nThe gyro values has been reset"), 0x80);
    +
    508 #endif
    +
    509  gyroYawZero = (l2capinbuf[15] | ((l2capinbuf[18] & 0xFC) << 6));
    +
    510  gyroRollZero = (l2capinbuf[16] | ((l2capinbuf[19] & 0xFC) << 6));
    +
    511  gyroPitchZero = (l2capinbuf[17] | ((l2capinbuf[20] & 0xFC) << 6));
    +
    512 
    +
    513  rollGyroScale = 500; // You might need to adjust these
    +
    514  pitchGyroScale = 400;
    +
    515  yawGyroScale = 415;
    +
    516 
    +
    517  gyroYaw = 0;
    +
    518  gyroRoll = 0;
    +
    519  gyroPitch = 0;
    +
    520 
    +
    521  motionValuesReset = true;
    +
    522  timer = micros();
    +
    523  }
    +
    524  }
    +
    525  } else {
    +
    526  if(nunchuckConnected) {
    +
    527  hatValues[HatX] = l2capinbuf[15];
    +
    528  hatValues[HatY] = l2capinbuf[16];
    +
    529  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x10 >> 3)) - 416;
    +
    530  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x20 >> 4)) - 416;
    +
    531  accZnunchuck = (((l2capinbuf[19] & 0xFE) << 2) | (l2capinbuf[20] & 0xC0 >> 5)) - 416;
    +
    532  }
    +
    533  //else if(classicControllerConnected) { }
    +
    534  }
    +
    535  if(l2capinbuf[19] & 0x01) {
    +
    536  if(!extensionConnected) {
    +
    537  extensionConnected = true;
    +
    538  unknownExtensionConnected = true;
    +
    539 #ifdef DEBUG_USB_HOST
    +
    540  Notify(PSTR("\r\nExtension connected to Motion Plus"), 0x80);
    +
    541 #endif
    +
    542  }
    +
    543  } else {
    +
    544  if(extensionConnected && !unknownExtensionConnected) {
    +
    545  extensionConnected = false;
    +
    546  unknownExtensionConnected = true;
    +
    547 #ifdef DEBUG_USB_HOST
    +
    548  Notify(PSTR("\r\nExtension disconnected from Motion Plus"), 0x80);
    +
    549 #endif
    +
    550  nunchuckConnected = false; // There is no extension connected to the Motion Plus if this report is sent
    +
    551  }
    +
    552  }
    +
    553 
    +
    554  } else if(nunchuckConnected) {
    +
    555  hatValues[HatX] = l2capinbuf[15];
    +
    556  hatValues[HatY] = l2capinbuf[16];
    +
    557  accXnunchuck = ((l2capinbuf[17] << 2) | (l2capinbuf[20] & 0x0C >> 2)) - 416;
    +
    558  accYnunchuck = ((l2capinbuf[18] << 2) | (l2capinbuf[20] & 0x30 >> 4)) - 416;
    +
    559  accZnunchuck = ((l2capinbuf[19] << 2) | (l2capinbuf[20] & 0xC0 >> 6)) - 416;
    +
    560  } else if(wiiUProControllerConnected) {
    +
    561  hatValues[LeftHatX] = (l2capinbuf[15] | l2capinbuf[16] << 8);
    +
    562  hatValues[RightHatX] = (l2capinbuf[17] | l2capinbuf[18] << 8);
    +
    563  hatValues[LeftHatY] = (l2capinbuf[19] | l2capinbuf[20] << 8);
    +
    564  hatValues[RightHatY] = (l2capinbuf[21] | l2capinbuf[22] << 8);
    +
    565  }
    +
    566  break;
    +
    567 #ifdef DEBUG_USB_HOST
    +
    568  default:
    +
    569  Notify(PSTR("\r\nUnknown Report type: "), 0x80);
    +
    570  D_PrintHex<uint8_t > (l2capinbuf[9], 0x80);
    +
    571  break;
    +
    572 #endif
    +
    573  }
    +
    574  }
    +
    575  }
    +
    576  L2CAP_task();
    +
    577  }
    +
    578 }
    +
    579 
    +
    580 void WII::L2CAP_task() {
    +
    581  switch(l2cap_state) {
    +
    582  /* These states are used if the Wiimote is the host */
    + + +
    585 #ifdef DEBUG_USB_HOST
    +
    586  Notify(PSTR("\r\nHID Control Successfully Configured"), 0x80);
    +
    587 #endif
    +
    588  l2cap_state = L2CAP_INTERRUPT_SETUP;
    +
    589  }
    +
    590  break;
    +
    591 
    + + +
    594 #ifdef DEBUG_USB_HOST
    +
    595  Notify(PSTR("\r\nHID Interrupt Incoming Connection Request"), 0x80);
    +
    596 #endif
    +
    597  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, PENDING);
    +
    598  delay(1);
    +
    599  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, SUCCESSFUL);
    +
    600  identifier++;
    601  delay(1);
    -
    602  pBtd->l2cap_connection_response(hci_handle, identifier, interrupt_dcid, interrupt_scid, SUCCESSFUL);
    -
    603  identifier++;
    -
    604  delay(1);
    -
    605  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
    -
    606 
    -
    607  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
    -
    608  }
    -
    609  break;
    -
    610 
    -
    611  /* These states are used if the Arduino is the host */
    - - -
    614 #ifdef DEBUG_USB_HOST
    -
    615  Notify(PSTR("\r\nSend HID Control Config Request"), 0x80);
    -
    616 #endif
    -
    617  identifier++;
    -
    618  pBtd->l2cap_config_request(hci_handle, identifier, control_scid);
    -
    619  l2cap_state = L2CAP_CONTROL_CONFIG_REQUEST;
    -
    620  }
    -
    621  break;
    -
    622 
    - - -
    625 #ifdef DEBUG_USB_HOST
    -
    626  Notify(PSTR("\r\nSend HID Interrupt Connection Request"), 0x80);
    -
    627 #endif
    -
    628  identifier++;
    -
    629  pBtd->l2cap_connection_request(hci_handle, identifier, interrupt_dcid, HID_INTR_PSM);
    -
    630  l2cap_state = L2CAP_INTERRUPT_CONNECT_REQUEST;
    -
    631  }
    -
    632  break;
    -
    633 
    - - -
    636 #ifdef DEBUG_USB_HOST
    -
    637  Notify(PSTR("\r\nSend HID Interrupt Config Request"), 0x80);
    -
    638 #endif
    -
    639  identifier++;
    -
    640  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
    -
    641  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
    -
    642  }
    -
    643  break;
    -
    644 
    - -
    646  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
    -
    647 #ifdef DEBUG_USB_HOST
    -
    648  Notify(PSTR("\r\nHID Channels Established"), 0x80);
    -
    649 #endif
    -
    650  pBtd->connectToWii = false;
    -
    651  pBtd->pairWithWii = false;
    -
    652  stateCounter = 0;
    -
    653  l2cap_state = WII_CHECK_MOTION_PLUS_STATE;
    -
    654  }
    -
    655  break;
    -
    656 
    -
    657  /* The next states are in run() */
    -
    658 
    - -
    660  if(l2cap_check_flag(L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE) && ((long)(millis() - timer) >= 0L)) {
    -
    661 #ifdef DEBUG_USB_HOST
    -
    662  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
    -
    663 #endif
    -
    664  identifier++;
    -
    665  pBtd->l2cap_disconnection_request(hci_handle, identifier, control_scid, control_dcid);
    -
    666  l2cap_state = L2CAP_CONTROL_DISCONNECT;
    -
    667  }
    -
    668  break;
    -
    669 
    - - -
    672 #ifdef DEBUG_USB_HOST
    -
    673  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
    -
    674 #endif
    -
    675  pBtd->hci_disconnect(hci_handle);
    -
    676  hci_handle = -1; // Reset handle
    -
    677  l2cap_event_flag = 0; // Reset flags
    -
    678  l2cap_state = L2CAP_WAIT;
    -
    679  }
    -
    680  break;
    -
    681  }
    -
    682 }
    -
    683 
    -
    684 void WII::Run() {
    -
    685  if(l2cap_state == L2CAP_INTERRUPT_DISCONNECT && ((long)(millis() - timer) >= 0L))
    -
    686  L2CAP_task(); // Call the rest of the disconnection routine after we have waited long enough
    -
    687 
    -
    688  switch(l2cap_state) {
    -
    689  case L2CAP_WAIT:
    -
    690  if(pBtd->connectToWii && !pBtd->l2capConnectionClaimed && !wiimoteConnected && !activeConnection) {
    -
    691  pBtd->l2capConnectionClaimed = true;
    -
    692  activeConnection = true;
    -
    693  motionPlusInside = pBtd->motionPlusInside;
    -
    694 #ifdef DEBUG_USB_HOST
    -
    695  Notify(PSTR("\r\nSend HID Control Connection Request"), 0x80);
    -
    696 #endif
    -
    697  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    -
    698  l2cap_event_flag = 0; // Reset flags
    -
    699  identifier = 0;
    -
    700  pBtd->l2cap_connection_request(hci_handle, identifier, control_dcid, HID_CTRL_PSM);
    -
    701  l2cap_state = L2CAP_CONTROL_CONNECT_REQUEST;
    - -
    703 #ifdef DEBUG_USB_HOST
    -
    704  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
    -
    705 #endif
    -
    706  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, PENDING);
    +
    602  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
    +
    603 
    +
    604  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
    +
    605  }
    +
    606  break;
    +
    607 
    +
    608  /* These states are used if the Arduino is the host */
    + + +
    611 #ifdef DEBUG_USB_HOST
    +
    612  Notify(PSTR("\r\nSend HID Control Config Request"), 0x80);
    +
    613 #endif
    +
    614  identifier++;
    + +
    616  l2cap_state = L2CAP_CONTROL_CONFIG_REQUEST;
    +
    617  }
    +
    618  break;
    +
    619 
    + + +
    622 #ifdef DEBUG_USB_HOST
    +
    623  Notify(PSTR("\r\nSend HID Interrupt Connection Request"), 0x80);
    +
    624 #endif
    +
    625  identifier++;
    + +
    627  l2cap_state = L2CAP_INTERRUPT_CONNECT_REQUEST;
    +
    628  }
    +
    629  break;
    +
    630 
    + + +
    633 #ifdef DEBUG_USB_HOST
    +
    634  Notify(PSTR("\r\nSend HID Interrupt Config Request"), 0x80);
    +
    635 #endif
    +
    636  identifier++;
    +
    637  pBtd->l2cap_config_request(hci_handle, identifier, interrupt_scid);
    +
    638  l2cap_state = L2CAP_INTERRUPT_CONFIG_REQUEST;
    +
    639  }
    +
    640  break;
    +
    641 
    + +
    643  if(l2cap_check_flag(L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS)) { // Now the HID channels is established
    +
    644 #ifdef DEBUG_USB_HOST
    +
    645  Notify(PSTR("\r\nHID Channels Established"), 0x80);
    +
    646 #endif
    +
    647  pBtd->connectToWii = false;
    +
    648  pBtd->pairWithWii = false;
    +
    649  stateCounter = 0;
    +
    650  l2cap_state = WII_CHECK_MOTION_PLUS_STATE;
    +
    651  }
    +
    652  break;
    +
    653 
    +
    654  /* The next states are in run() */
    +
    655 
    + +
    657  if(l2cap_check_flag(L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE) && ((long)(millis() - timer) >= 0L)) {
    +
    658 #ifdef DEBUG_USB_HOST
    +
    659  Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
    +
    660 #endif
    +
    661  identifier++;
    +
    662  pBtd->l2cap_disconnection_request(hci_handle, identifier, control_scid, control_dcid);
    +
    663  l2cap_state = L2CAP_CONTROL_DISCONNECT;
    +
    664  }
    +
    665  break;
    +
    666 
    + + +
    669 #ifdef DEBUG_USB_HOST
    +
    670  Notify(PSTR("\r\nDisconnected Control Channel"), 0x80);
    +
    671 #endif
    + +
    673  hci_handle = -1; // Reset handle
    +
    674  l2cap_event_flag = 0; // Reset flags
    +
    675  l2cap_state = L2CAP_WAIT;
    +
    676  }
    +
    677  break;
    +
    678  }
    +
    679 }
    +
    680 
    +
    681 void WII::Run() {
    +
    682  if(l2cap_state == L2CAP_INTERRUPT_DISCONNECT && ((long)(millis() - timer) >= 0L))
    +
    683  L2CAP_task(); // Call the rest of the disconnection routine after we have waited long enough
    +
    684 
    +
    685  switch(l2cap_state) {
    +
    686  case L2CAP_WAIT:
    +
    687  if(pBtd->connectToWii && !pBtd->l2capConnectionClaimed && !wiimoteConnected && !activeConnection) {
    + +
    689  activeConnection = true;
    +
    690  motionPlusInside = pBtd->motionPlusInside;
    +
    691 #ifdef DEBUG_USB_HOST
    +
    692  Notify(PSTR("\r\nSend HID Control Connection Request"), 0x80);
    +
    693 #endif
    +
    694  hci_handle = pBtd->hci_handle; // Store the HCI Handle for the connection
    +
    695  l2cap_event_flag = 0; // Reset flags
    +
    696  identifier = 0;
    + +
    698  l2cap_state = L2CAP_CONTROL_CONNECT_REQUEST;
    + +
    700 #ifdef DEBUG_USB_HOST
    +
    701  Notify(PSTR("\r\nHID Control Incoming Connection Request"), 0x80);
    +
    702 #endif
    +
    703  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, PENDING);
    +
    704  delay(1);
    +
    705  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, SUCCESSFUL);
    +
    706  identifier++;
    707  delay(1);
    -
    708  pBtd->l2cap_connection_response(hci_handle, identifier, control_dcid, control_scid, SUCCESSFUL);
    -
    709  identifier++;
    -
    710  delay(1);
    -
    711  pBtd->l2cap_config_request(hci_handle, identifier, control_scid);
    -
    712  l2cap_state = L2CAP_CONTROL_SUCCESS;
    -
    713  }
    -
    714  break;
    -
    715 
    - -
    717 #ifdef DEBUG_USB_HOST
    -
    718  if(stateCounter == 0) // Only print onnce
    -
    719  Notify(PSTR("\r\nChecking if a Motion Plus is connected"), 0x80);
    -
    720 #endif
    -
    721  stateCounter++;
    -
    722  if(stateCounter % 200 == 0)
    -
    723  checkMotionPresent(); // Check if there is a motion plus connected
    - -
    725  stateCounter = 0;
    -
    726  l2cap_state = WII_INIT_MOTION_PLUS_STATE;
    -
    727  timer = micros();
    -
    728 
    -
    729  if(unknownExtensionConnected) {
    -
    730 #ifdef DEBUG_USB_HOST
    -
    731  Notify(PSTR("\r\nA extension is also connected"), 0x80);
    -
    732 #endif
    -
    733  activateNunchuck = true; // For we will just set this to true as this the only extension supported so far
    -
    734  }
    -
    735 
    -
    736  } else if(stateCounter == 601) { // We will try three times to check for the motion plus
    -
    737 #ifdef DEBUG_USB_HOST
    -
    738  Notify(PSTR("\r\nNo Motion Plus was detected"), 0x80);
    -
    739 #endif
    -
    740  stateCounter = 0;
    -
    741  l2cap_state = WII_CHECK_EXTENSION_STATE;
    -
    742  }
    -
    743  break;
    -
    744 
    -
    745  case WII_CHECK_EXTENSION_STATE: // This is used to check if there is anything plugged in to the extension port
    -
    746 #ifdef DEBUG_USB_HOST
    -
    747  if(stateCounter == 0) // Only print onnce
    -
    748  Notify(PSTR("\r\nChecking if there is any extension connected"), 0x80);
    -
    749 #endif
    -
    750  stateCounter++; // We use this counter as there has to be a short delay between the commands
    -
    751  if(stateCounter == 1)
    -
    752  statusRequest(); // See if a new device has connected
    -
    753  if(stateCounter == 100) {
    -
    754  if(unknownExtensionConnected) // Check if there is a extension is connected to the port
    -
    755  initExtension1();
    -
    756  else
    -
    757  stateCounter = 399;
    -
    758  } else if(stateCounter == 200)
    -
    759  initExtension2();
    -
    760  else if(stateCounter == 300) {
    -
    761  readExtensionType();
    -
    762  unknownExtensionConnected = false;
    -
    763  } else if(stateCounter == 400) {
    -
    764  stateCounter = 0;
    -
    765  l2cap_state = TURN_ON_LED;
    -
    766  }
    -
    767  break;
    -
    768 
    - -
    770  stateCounter++;
    -
    771  if(stateCounter == 1)
    -
    772  initMotionPlus();
    -
    773  else if(stateCounter == 100)
    -
    774  activateMotionPlus();
    -
    775  else if(stateCounter == 200)
    -
    776  readExtensionType(); // Check if it has been activated
    -
    777  else if(stateCounter == 300) {
    -
    778  stateCounter = 0;
    -
    779  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
    -
    780  l2cap_state = TURN_ON_LED;
    -
    781  }
    -
    782  break;
    -
    783 
    -
    784  case TURN_ON_LED:
    - -
    786  nunchuckConnected = true;
    -
    787  wiimoteConnected = true;
    -
    788  onInit();
    -
    789  l2cap_state = L2CAP_DONE;
    -
    790  break;
    -
    791 
    -
    792  case L2CAP_DONE:
    -
    793  if(unknownExtensionConnected) {
    -
    794 #ifdef DEBUG_USB_HOST
    -
    795  if(stateCounter == 0) // Only print once
    -
    796  Notify(PSTR("\r\nChecking extension port"), 0x80);
    -
    797 #endif
    -
    798  stateCounter++; // We will use this counter as there has to be a short delay between the commands
    -
    799  if(stateCounter == 50)
    -
    800  statusRequest();
    -
    801  else if(stateCounter == 100)
    -
    802  initExtension1();
    -
    803  else if(stateCounter == 150)
    -
    804  if((extensionConnected && motionPlusConnected) || (unknownExtensionConnected && !motionPlusConnected))
    -
    805  initExtension2();
    -
    806  else
    -
    807  stateCounter = 299; // There is no extension connected
    -
    808  else if(stateCounter == 200)
    -
    809  readExtensionType();
    -
    810  else if(stateCounter == 250) {
    - -
    812 #ifdef DEBUG_USB_HOST
    -
    813  Notify(PSTR("\r\nNunchuck was reconnected"), 0x80);
    -
    814 #endif
    -
    815  activateNunchuck = true;
    -
    816  nunchuckConnected = true;
    -
    817  }
    - -
    819  stateCounter = 449;
    -
    820  } else if(stateCounter == 300) {
    -
    821  if(motionPlusConnected) {
    -
    822 #ifdef DEBUG_USB_HOST
    -
    823  Notify(PSTR("\r\nReactivating the Motion Plus"), 0x80);
    -
    824 #endif
    -
    825  initMotionPlus();
    -
    826  } else
    -
    827  stateCounter = 449;
    -
    828  } else if(stateCounter == 350)
    -
    829  activateMotionPlus();
    -
    830  else if(stateCounter == 400)
    -
    831  readExtensionType(); // Check if it has been activated
    -
    832  else if(stateCounter == 450) {
    -
    833  onInit();
    -
    834  stateCounter = 0;
    -
    835  unknownExtensionConnected = false;
    -
    836  }
    -
    837  } else
    -
    838  stateCounter = 0;
    -
    839  break;
    -
    840  }
    -
    841 }
    + +
    709  l2cap_state = L2CAP_CONTROL_SUCCESS;
    +
    710  }
    +
    711  break;
    +
    712 
    + +
    714 #ifdef DEBUG_USB_HOST
    +
    715  if(stateCounter == 0) // Only print onnce
    +
    716  Notify(PSTR("\r\nChecking if a Motion Plus is connected"), 0x80);
    +
    717 #endif
    +
    718  stateCounter++;
    +
    719  if(stateCounter % 200 == 0)
    +
    720  checkMotionPresent(); // Check if there is a motion plus connected
    + +
    722  stateCounter = 0;
    +
    723  l2cap_state = WII_INIT_MOTION_PLUS_STATE;
    +
    724  timer = micros();
    +
    725 
    +
    726  if(unknownExtensionConnected) {
    +
    727 #ifdef DEBUG_USB_HOST
    +
    728  Notify(PSTR("\r\nA extension is also connected"), 0x80);
    +
    729 #endif
    +
    730  activateNunchuck = true; // For we will just set this to true as this the only extension supported so far
    +
    731  }
    +
    732 
    +
    733  } else if(stateCounter == 601) { // We will try three times to check for the motion plus
    +
    734 #ifdef DEBUG_USB_HOST
    +
    735  Notify(PSTR("\r\nNo Motion Plus was detected"), 0x80);
    +
    736 #endif
    +
    737  stateCounter = 0;
    +
    738  l2cap_state = WII_CHECK_EXTENSION_STATE;
    +
    739  }
    +
    740  break;
    +
    741 
    +
    742  case WII_CHECK_EXTENSION_STATE: // This is used to check if there is anything plugged in to the extension port
    +
    743 #ifdef DEBUG_USB_HOST
    +
    744  if(stateCounter == 0) // Only print onnce
    +
    745  Notify(PSTR("\r\nChecking if there is any extension connected"), 0x80);
    +
    746 #endif
    +
    747  stateCounter++; // We use this counter as there has to be a short delay between the commands
    +
    748  if(stateCounter == 1)
    +
    749  statusRequest(); // See if a new device has connected
    +
    750  if(stateCounter == 100) {
    +
    751  if(unknownExtensionConnected) // Check if there is a extension is connected to the port
    +
    752  initExtension1();
    +
    753  else
    +
    754  stateCounter = 399;
    +
    755  } else if(stateCounter == 200)
    +
    756  initExtension2();
    +
    757  else if(stateCounter == 300) {
    +
    758  readExtensionType();
    +
    759  unknownExtensionConnected = false;
    +
    760  } else if(stateCounter == 400) {
    +
    761  stateCounter = 0;
    +
    762  l2cap_state = TURN_ON_LED;
    +
    763  }
    +
    764  break;
    +
    765 
    + +
    767  stateCounter++;
    +
    768  if(stateCounter == 1)
    +
    769  initMotionPlus();
    +
    770  else if(stateCounter == 100)
    +
    771  activateMotionPlus();
    +
    772  else if(stateCounter == 200)
    +
    773  readExtensionType(); // Check if it has been activated
    +
    774  else if(stateCounter == 300) {
    +
    775  stateCounter = 0;
    +
    776  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
    +
    777  l2cap_state = TURN_ON_LED;
    +
    778  }
    +
    779  break;
    +
    780 
    +
    781  case TURN_ON_LED:
    + +
    783  nunchuckConnected = true;
    +
    784  wiimoteConnected = true;
    +
    785  onInit();
    +
    786  l2cap_state = L2CAP_DONE;
    +
    787  break;
    +
    788 
    +
    789  case L2CAP_DONE:
    +
    790  if(unknownExtensionConnected) {
    +
    791 #ifdef DEBUG_USB_HOST
    +
    792  if(stateCounter == 0) // Only print once
    +
    793  Notify(PSTR("\r\nChecking extension port"), 0x80);
    +
    794 #endif
    +
    795  stateCounter++; // We will use this counter as there has to be a short delay between the commands
    +
    796  if(stateCounter == 50)
    +
    797  statusRequest();
    +
    798  else if(stateCounter == 100)
    +
    799  initExtension1();
    +
    800  else if(stateCounter == 150)
    +
    801  if((extensionConnected && motionPlusConnected) || (unknownExtensionConnected && !motionPlusConnected))
    +
    802  initExtension2();
    +
    803  else
    +
    804  stateCounter = 299; // There is no extension connected
    +
    805  else if(stateCounter == 200)
    +
    806  readExtensionType();
    +
    807  else if(stateCounter == 250) {
    + +
    809 #ifdef DEBUG_USB_HOST
    +
    810  Notify(PSTR("\r\nNunchuck was reconnected"), 0x80);
    +
    811 #endif
    +
    812  activateNunchuck = true;
    +
    813  nunchuckConnected = true;
    +
    814  }
    + +
    816  stateCounter = 449;
    +
    817  } else if(stateCounter == 300) {
    +
    818  if(motionPlusConnected) {
    +
    819 #ifdef DEBUG_USB_HOST
    +
    820  Notify(PSTR("\r\nReactivating the Motion Plus"), 0x80);
    +
    821 #endif
    +
    822  initMotionPlus();
    +
    823  } else
    +
    824  stateCounter = 449;
    +
    825  } else if(stateCounter == 350)
    +
    826  activateMotionPlus();
    +
    827  else if(stateCounter == 400)
    +
    828  readExtensionType(); // Check if it has been activated
    +
    829  else if(stateCounter == 450) {
    +
    830  onInit();
    +
    831  stateCounter = 0;
    +
    832  unknownExtensionConnected = false;
    +
    833  }
    +
    834  } else
    +
    835  stateCounter = 0;
    +
    836  break;
    +
    837  }
    +
    838 }
    +
    839 
    +
    840 /************************************************************/
    +
    841 /* HID Commands */
    842 
    843 /************************************************************/
    -
    844 /* HID Commands */
    -
    845 
    -
    846 /************************************************************/
    -
    847 void WII::HID_Command(uint8_t* data, uint8_t nbytes) {
    -
    848  if(motionPlusInside)
    -
    849  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
    -
    850  else
    -
    851  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]);
    -
    852 }
    -
    853 
    - -
    855  HIDBuffer[1] = 0x11;
    -
    856  HIDBuffer[2] = 0x00;
    -
    857  HID_Command(HIDBuffer, 3);
    -
    858 }
    -
    859 
    - -
    861  HIDBuffer[1] = 0x11;
    -
    862  HIDBuffer[2] &= ~0x01; // Bit 0 control the rumble
    -
    863  HID_Command(HIDBuffer, 3);
    -
    864 }
    -
    865 
    - -
    867  HIDBuffer[1] = 0x11;
    -
    868  HIDBuffer[2] |= 0x01; // Bit 0 control the rumble
    -
    869  HID_Command(HIDBuffer, 3);
    -
    870 }
    -
    871 
    - -
    873  HIDBuffer[1] = 0x11;
    -
    874  HIDBuffer[2] ^= 0x01; // Bit 0 control the rumble
    -
    875  HID_Command(HIDBuffer, 3);
    -
    876 }
    -
    877 
    -
    878 void WII::setLedRaw(uint8_t value) {
    -
    879  HIDBuffer[1] = 0x11;
    -
    880  HIDBuffer[2] = value | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    881  HID_Command(HIDBuffer, 3);
    -
    882 }
    -
    883 
    - -
    885  HIDBuffer[1] = 0x11;
    -
    886  HIDBuffer[2] &= ~(pgm_read_byte(&WII_LEDS[(uint8_t)a]));
    -
    887  HID_Command(HIDBuffer, 3);
    -
    888 }
    -
    889 
    - -
    891  if(a == OFF)
    -
    892  setLedRaw(0);
    -
    893  else {
    -
    894  HIDBuffer[1] = 0x11;
    -
    895  HIDBuffer[2] |= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
    -
    896  HID_Command(HIDBuffer, 3);
    -
    897  }
    -
    898 }
    -
    899 
    - -
    901  HIDBuffer[1] = 0x11;
    -
    902  HIDBuffer[2] ^= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
    -
    903  HID_Command(HIDBuffer, 3);
    -
    904 }
    -
    905 
    - -
    907  HIDBuffer[1] = 0x11;
    -
    908  HIDBuffer[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    909  if(wiimoteConnected)
    -
    910  HIDBuffer[2] |= 0x10; // If it's connected LED1 will light up
    - -
    912  HIDBuffer[2] |= 0x20; // If it's connected LED2 will light up
    - -
    914  HIDBuffer[2] |= 0x40; // If it's connected LED3 will light up
    +
    844 void WII::HID_Command(uint8_t* data, uint8_t nbytes) {
    +
    845  if(motionPlusInside)
    +
    846  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
    +
    847  else
    +
    848  pBtd->L2CAP_Command(hci_handle, data, nbytes, control_scid[0], control_scid[1]);
    +
    849 }
    +
    850 
    + +
    852  HIDBuffer[1] = 0x11;
    +
    853  HIDBuffer[2] = 0x00;
    +
    854  HID_Command(HIDBuffer, 3);
    +
    855 }
    +
    856 
    + +
    858  HIDBuffer[1] = 0x11;
    +
    859  HIDBuffer[2] &= ~0x01; // Bit 0 control the rumble
    +
    860  HID_Command(HIDBuffer, 3);
    +
    861 }
    +
    862 
    + +
    864  HIDBuffer[1] = 0x11;
    +
    865  HIDBuffer[2] |= 0x01; // Bit 0 control the rumble
    +
    866  HID_Command(HIDBuffer, 3);
    +
    867 }
    +
    868 
    + +
    870  HIDBuffer[1] = 0x11;
    +
    871  HIDBuffer[2] ^= 0x01; // Bit 0 control the rumble
    +
    872  HID_Command(HIDBuffer, 3);
    +
    873 }
    +
    874 
    +
    875 void WII::setLedRaw(uint8_t value) {
    +
    876  HIDBuffer[1] = 0x11;
    +
    877  HIDBuffer[2] = value | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    +
    878  HID_Command(HIDBuffer, 3);
    +
    879 }
    +
    880 
    + +
    882  HIDBuffer[1] = 0x11;
    +
    883  HIDBuffer[2] &= ~(pgm_read_byte(&WII_LEDS[(uint8_t)a]));
    +
    884  HID_Command(HIDBuffer, 3);
    +
    885 }
    +
    886 
    + +
    888  if(a == OFF)
    +
    889  setLedRaw(0);
    +
    890  else {
    +
    891  HIDBuffer[1] = 0x11;
    +
    892  HIDBuffer[2] |= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
    +
    893  HID_Command(HIDBuffer, 3);
    +
    894  }
    +
    895 }
    +
    896 
    + +
    898  HIDBuffer[1] = 0x11;
    +
    899  HIDBuffer[2] ^= pgm_read_byte(&WII_LEDS[(uint8_t)a]);
    +
    900  HID_Command(HIDBuffer, 3);
    +
    901 }
    +
    902 
    + +
    904  HIDBuffer[1] = 0x11;
    +
    905  HIDBuffer[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
    +
    906  if(wiimoteConnected)
    +
    907  HIDBuffer[2] |= 0x10; // If it's connected LED1 will light up
    + +
    909  HIDBuffer[2] |= 0x20; // If it's connected LED2 will light up
    + +
    911  HIDBuffer[2] |= 0x40; // If it's connected LED3 will light up
    +
    912 
    +
    913  HID_Command(HIDBuffer, 3);
    +
    914 }
    915 
    -
    916  HID_Command(HIDBuffer, 3);
    -
    917 }
    -
    918 
    - -
    920  checkExtension = false; // This is needed so the library knows that the status response is a response to this function
    -
    921  statusRequest(); // This will update the battery level
    -
    922  return batteryLevel;
    -
    923 };
    -
    924 
    -
    925 void WII::setReportMode(bool continuous, uint8_t mode) {
    -
    926  uint8_t cmd_buf[4];
    -
    927  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    928  cmd_buf[1] = 0x12;
    -
    929  if(continuous)
    -
    930  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    931  else
    -
    932  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    933  cmd_buf[3] = mode;
    -
    934  HID_Command(cmd_buf, 4);
    -
    935 }
    -
    936 
    -
    937 void WII::statusRequest() {
    -
    938  uint8_t cmd_buf[3];
    -
    939  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    940  cmd_buf[1] = 0x15;
    -
    941  cmd_buf[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
    -
    942  HID_Command(cmd_buf, 3);
    -
    943 }
    + +
    917  checkExtension = false; // This is needed so the library knows that the status response is a response to this function
    +
    918  statusRequest(); // This will update the battery level
    +
    919  return batteryLevel;
    +
    920 };
    +
    921 
    +
    922 void WII::setReportMode(bool continuous, uint8_t mode) {
    +
    923  uint8_t cmd_buf[4];
    +
    924  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    +
    925  cmd_buf[1] = 0x12;
    +
    926  if(continuous)
    +
    927  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    +
    928  else
    +
    929  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Keep the rumble bit
    +
    930  cmd_buf[3] = mode;
    +
    931  HID_Command(cmd_buf, 4);
    +
    932 }
    +
    933 
    +
    934 void WII::statusRequest() {
    +
    935  uint8_t cmd_buf[3];
    +
    936  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    +
    937  cmd_buf[1] = 0x15;
    +
    938  cmd_buf[2] = (HIDBuffer[2] & 0x01); // Keep the rumble bit
    +
    939  HID_Command(cmd_buf, 3);
    +
    940 }
    +
    941 
    +
    942 /************************************************************/
    +
    943 /* Memmory Commands */
    944 
    945 /************************************************************/
    -
    946 /* Memmory Commands */
    -
    947 
    -
    948 /************************************************************/
    -
    949 void WII::writeData(uint32_t offset, uint8_t size, uint8_t* data) {
    -
    950  uint8_t cmd_buf[23];
    -
    951  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    952  cmd_buf[1] = 0x16; // Write data
    -
    953  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Write to memory, clear bit 2 to write to EEPROM
    -
    954  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
    -
    955  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
    -
    956  cmd_buf[5] = (uint8_t)(offset & 0xFF);
    -
    957  cmd_buf[6] = size;
    -
    958  uint8_t i = 0;
    -
    959  for(; i < size; i++)
    -
    960  cmd_buf[7 + i] = data[i];
    -
    961  for(; i < 16; i++) // Set the rest to zero
    -
    962  cmd_buf[7 + i] = 0x00;
    -
    963  HID_Command(cmd_buf, 23);
    -
    964 }
    -
    965 
    -
    966 void WII::initExtension1() {
    -
    967  uint8_t buf[1];
    -
    968  buf[0] = 0x55;
    -
    969  writeData(0xA400F0, 1, buf);
    -
    970 }
    -
    971 
    -
    972 void WII::initExtension2() {
    -
    973  uint8_t buf[1];
    -
    974  buf[0] = 0x00;
    -
    975  writeData(0xA400FB, 1, buf);
    -
    976 }
    -
    977 
    -
    978 void WII::initMotionPlus() {
    -
    979  uint8_t buf[1];
    -
    980  buf[0] = 0x55;
    -
    981  writeData(0xA600F0, 1, buf);
    -
    982 }
    -
    983 
    -
    984 void WII::activateMotionPlus() {
    -
    985  uint8_t buf[1];
    -
    986  if(pBtd->wiiUProController) {
    -
    987 #ifdef DEBUG_USB_HOST
    -
    988  Notify(PSTR("\r\nActivating Wii U Pro Controller"), 0x80);
    -
    989 #endif
    -
    990  buf[0] = 0x00; // It seems like you can send anything but 0x04, 0x05, and 0x07
    -
    991  } else if(activateNunchuck) {
    -
    992 #ifdef DEBUG_USB_HOST
    -
    993  Notify(PSTR("\r\nActivating Motion Plus in pass-through mode"), 0x80);
    -
    994 #endif
    -
    995  buf[0] = 0x05; // Activate nunchuck pass-through mode
    -
    996  }//else if(classicControllerConnected && extensionConnected)
    -
    997  //buf[0] = 0x07;
    -
    998  else {
    -
    999 #ifdef DEBUG_USB_HOST
    -
    1000  Notify(PSTR("\r\nActivating Motion Plus in normal mode"), 0x80);
    -
    1001 #endif
    -
    1002  buf[0] = 0x04; // Don't use any extension
    -
    1003  }
    -
    1004  writeData(0xA600FE, 1, buf);
    -
    1005 }
    -
    1006 
    -
    1007 void WII::readData(uint32_t offset, uint16_t size, bool EEPROM) {
    -
    1008  uint8_t cmd_buf[8];
    -
    1009  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    1010  cmd_buf[1] = 0x17; // Read data
    -
    1011  if(EEPROM)
    -
    1012  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Read from EEPROM
    -
    1013  else
    -
    1014  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Read from memory
    -
    1015  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
    -
    1016  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
    -
    1017  cmd_buf[5] = (uint8_t)(offset & 0xFF);
    -
    1018  cmd_buf[6] = (uint8_t)((size & 0xFF00) >> 8);
    -
    1019  cmd_buf[7] = (uint8_t)(size & 0xFF);
    +
    946 void WII::writeData(uint32_t offset, uint8_t size, uint8_t* data) {
    +
    947  uint8_t cmd_buf[23];
    +
    948  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    +
    949  cmd_buf[1] = 0x16; // Write data
    +
    950  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Write to memory, clear bit 2 to write to EEPROM
    +
    951  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
    +
    952  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
    +
    953  cmd_buf[5] = (uint8_t)(offset & 0xFF);
    +
    954  cmd_buf[6] = size;
    +
    955  uint8_t i = 0;
    +
    956  for(; i < size; i++)
    +
    957  cmd_buf[7 + i] = data[i];
    +
    958  for(; i < 16; i++) // Set the rest to zero
    +
    959  cmd_buf[7 + i] = 0x00;
    +
    960  HID_Command(cmd_buf, 23);
    +
    961 }
    +
    962 
    +
    963 void WII::initExtension1() {
    +
    964  uint8_t buf[1];
    +
    965  buf[0] = 0x55;
    +
    966  writeData(0xA400F0, 1, buf);
    +
    967 }
    +
    968 
    +
    969 void WII::initExtension2() {
    +
    970  uint8_t buf[1];
    +
    971  buf[0] = 0x00;
    +
    972  writeData(0xA400FB, 1, buf);
    +
    973 }
    +
    974 
    +
    975 void WII::initMotionPlus() {
    +
    976  uint8_t buf[1];
    +
    977  buf[0] = 0x55;
    +
    978  writeData(0xA600F0, 1, buf);
    +
    979 }
    +
    980 
    +
    981 void WII::activateMotionPlus() {
    +
    982  uint8_t buf[1];
    +
    983  if(pBtd->wiiUProController) {
    +
    984 #ifdef DEBUG_USB_HOST
    +
    985  Notify(PSTR("\r\nActivating Wii U Pro Controller"), 0x80);
    +
    986 #endif
    +
    987  buf[0] = 0x00; // It seems like you can send anything but 0x04, 0x05, and 0x07
    +
    988  } else if(activateNunchuck) {
    +
    989 #ifdef DEBUG_USB_HOST
    +
    990  Notify(PSTR("\r\nActivating Motion Plus in pass-through mode"), 0x80);
    +
    991 #endif
    +
    992  buf[0] = 0x05; // Activate nunchuck pass-through mode
    +
    993  }//else if(classicControllerConnected && extensionConnected)
    +
    994  //buf[0] = 0x07;
    +
    995  else {
    +
    996 #ifdef DEBUG_USB_HOST
    +
    997  Notify(PSTR("\r\nActivating Motion Plus in normal mode"), 0x80);
    +
    998 #endif
    +
    999  buf[0] = 0x04; // Don't use any extension
    +
    1000  }
    +
    1001  writeData(0xA600FE, 1, buf);
    +
    1002 }
    +
    1003 
    +
    1004 void WII::readData(uint32_t offset, uint16_t size, bool EEPROM) {
    +
    1005  uint8_t cmd_buf[8];
    +
    1006  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    +
    1007  cmd_buf[1] = 0x17; // Read data
    +
    1008  if(EEPROM)
    +
    1009  cmd_buf[2] = 0x00 | (HIDBuffer[2] & 0x01); // Read from EEPROM
    +
    1010  else
    +
    1011  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Read from memory
    +
    1012  cmd_buf[3] = (uint8_t)((offset & 0xFF0000) >> 16);
    +
    1013  cmd_buf[4] = (uint8_t)((offset & 0xFF00) >> 8);
    +
    1014  cmd_buf[5] = (uint8_t)(offset & 0xFF);
    +
    1015  cmd_buf[6] = (uint8_t)((size & 0xFF00) >> 8);
    +
    1016  cmd_buf[7] = (uint8_t)(size & 0xFF);
    +
    1017 
    +
    1018  HID_Command(cmd_buf, 8);
    +
    1019 }
    1020 
    -
    1021  HID_Command(cmd_buf, 8);
    -
    1022 }
    -
    1023 
    -
    1024 void WII::readExtensionType() {
    -
    1025  readData(0xA400FA, 6, false);
    -
    1026 }
    -
    1027 
    -
    1028 void WII::readCalData() {
    -
    1029  readData(0x0016, 8, true);
    -
    1030 }
    -
    1031 
    -
    1032 void WII::checkMotionPresent() {
    -
    1033  readData(0xA600FA, 6, false);
    -
    1034 }
    +
    1021 void WII::readExtensionType() {
    +
    1022  readData(0xA400FA, 6, false);
    +
    1023 }
    +
    1024 
    +
    1025 void WII::readCalData() {
    +
    1026  readData(0x0016, 8, true);
    +
    1027 }
    +
    1028 
    +
    1029 void WII::checkMotionPresent() {
    +
    1030  readData(0xA600FA, 6, false);
    +
    1031 }
    +
    1032 
    +
    1033 /************************************************************/
    +
    1034 /* WII Commands */
    1035 
    1036 /************************************************************/
    -
    1037 /* WII Commands */
    -
    1038 
    -
    1039 /************************************************************/
    -
    1040 
    -
    1041 bool WII::getButtonPress(ButtonEnum b) { // Return true when a button is pressed
    - -
    1043  return (ButtonState & pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]));
    -
    1044  else
    -
    1045  return (ButtonState & pgm_read_dword(&WII_BUTTONS[(uint8_t)b]));
    -
    1046 }
    -
    1047 
    -
    1048 bool WII::getButtonClick(ButtonEnum b) { // Only return true when a button is clicked
    -
    1049  uint32_t button;
    - -
    1051  button = pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]);
    -
    1052  else
    -
    1053  button = pgm_read_dword(&WII_BUTTONS[(uint8_t)b]);
    -
    1054  bool click = (ButtonClickState & button);
    -
    1055  ButtonClickState &= ~button; // clear "click" event
    -
    1056  return click;
    -
    1057 }
    -
    1058 
    - -
    1060  if(!nunchuckConnected)
    -
    1061  return 127; // Return center position
    -
    1062  else {
    -
    1063  uint8_t output = hatValues[(uint8_t)a];
    -
    1064  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
    -
    1065  return 127;
    -
    1066  else
    -
    1067  return output;
    -
    1068  }
    -
    1069 }
    -
    1070 
    - - -
    1073  return 2000;
    -
    1074  else {
    -
    1075  uint16_t output = hatValues[(uint8_t)a];
    -
    1076  if(output == 0x00) // The joystick will only read 0 when it is first initializing, so we will just return the center position
    -
    1077  return 2000;
    -
    1078  else
    -
    1079  return output;
    -
    1080  }
    -
    1081 }
    -
    1082 
    -
    1083 void WII::onInit() {
    -
    1084  if(pFuncOnInit)
    -
    1085  pFuncOnInit(); // Call the user function
    -
    1086  else
    -
    1087  setLedStatus();
    -
    1088 }
    -
    1089 
    -
    1090 /************************************************************/
    -
    1091 /* The following functions are for the IR camera */
    -
    1092 /************************************************************/
    -
    1093 
    -
    1094 #ifdef WIICAMERA
    -
    1095 
    -
    1096 void WII::IRinitialize() { // Turns on and initialises the IR camera
    -
    1097 
    -
    1098  enableIRCamera1();
    -
    1099 #ifdef DEBUG_USB_HOST
    -
    1100  Notify(PSTR("\r\nEnable IR Camera1 Complete"), 0x80);
    -
    1101 #endif
    -
    1102  delay(80);
    -
    1103 
    -
    1104  enableIRCamera2();
    -
    1105 #ifdef DEBUG_USB_HOST
    -
    1106  Notify(PSTR("\r\nEnable IR Camera2 Complete"), 0x80);
    -
    1107 #endif
    -
    1108  delay(80);
    -
    1109 
    -
    1110  write0x08Value();
    -
    1111 #ifdef DEBUG_USB_HOST
    -
    1112  Notify(PSTR("\r\nWrote hex number 0x08"), 0x80);
    -
    1113 #endif
    -
    1114  delay(80);
    -
    1115 
    -
    1116  writeSensitivityBlock1();
    -
    1117 #ifdef DEBUG_USB_HOST
    -
    1118  Notify(PSTR("\r\nWrote Sensitivity Block 1"), 0x80);
    -
    1119 #endif
    -
    1120  delay(80);
    -
    1121 
    -
    1122  writeSensitivityBlock2();
    -
    1123 #ifdef DEBUG_USB_HOST
    -
    1124  Notify(PSTR("\r\nWrote Sensitivity Block 2"), 0x80);
    -
    1125 #endif
    -
    1126  delay(80);
    -
    1127 
    -
    1128  uint8_t mode_num = 0x03;
    -
    1129  setWiiModeNumber(mode_num); // Change input for whatever mode you want i.e. 0x01, 0x03, or 0x05
    -
    1130 #ifdef DEBUG_USB_HOST
    -
    1131  Notify(PSTR("\r\nSet Wii Mode Number To 0x"), 0x80);
    -
    1132  D_PrintHex<uint8_t > (mode_num, 0x80);
    -
    1133 #endif
    -
    1134  delay(80);
    -
    1135 
    -
    1136  write0x08Value();
    -
    1137 #ifdef DEBUG_USB_HOST
    -
    1138  Notify(PSTR("\r\nWrote Hex Number 0x08"), 0x80);
    -
    1139 #endif
    -
    1140  delay(80);
    -
    1141 
    -
    1142  setReportMode(false, 0x33);
    -
    1143  //setReportMode(false, 0x3f); // For full reporting mode, doesn't work yet
    -
    1144 #ifdef DEBUG_USB_HOST
    -
    1145  Notify(PSTR("\r\nSet Report Mode to 0x33"), 0x80);
    -
    1146 #endif
    -
    1147  delay(80);
    -
    1148 
    -
    1149  statusRequest(); // Used to update wiiState - call isIRCameraEnabled() afterwards to check if it actually worked
    -
    1150 #ifdef DEBUG_USB_HOST
    -
    1151  Notify(PSTR("\r\nIR Initialized"), 0x80);
    -
    1152 #endif
    -
    1153 }
    -
    1154 
    -
    1155 void WII::enableIRCamera1() {
    -
    1156  uint8_t cmd_buf[3];
    -
    1157  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    1158  cmd_buf[1] = 0x13; // Output report 13
    -
    1159  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
    -
    1160  HID_Command(cmd_buf, 3);
    -
    1161 }
    -
    1162 
    -
    1163 void WII::enableIRCamera2() {
    -
    1164  uint8_t cmd_buf[3];
    -
    1165  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    -
    1166  cmd_buf[1] = 0x1A; // Output report 1A
    -
    1167  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
    -
    1168  HID_Command(cmd_buf, 3);
    -
    1169 }
    -
    1170 
    -
    1171 void WII::writeSensitivityBlock1() {
    -
    1172  uint8_t buf[9];
    -
    1173  buf[0] = 0x00;
    -
    1174  buf[1] = 0x00;
    -
    1175  buf[2] = 0x00;
    -
    1176  buf[3] = 0x00;
    -
    1177  buf[4] = 0x00;
    -
    1178  buf[5] = 0x00;
    -
    1179  buf[6] = 0x90;
    -
    1180  buf[7] = 0x00;
    -
    1181  buf[8] = 0x41;
    +
    1037 
    +
    1038 bool WII::getButtonPress(ButtonEnum b) { // Return true when a button is pressed
    + +
    1040  return (ButtonState & pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]));
    +
    1041  else
    +
    1042  return (ButtonState & pgm_read_dword(&WII_BUTTONS[(uint8_t)b]));
    +
    1043 }
    +
    1044 
    +
    1045 bool WII::getButtonClick(ButtonEnum b) { // Only return true when a button is clicked
    +
    1046  uint32_t button;
    + +
    1048  button = pgm_read_dword(&WII_PROCONTROLLER_BUTTONS[(uint8_t)b]);
    +
    1049  else
    +
    1050  button = pgm_read_dword(&WII_BUTTONS[(uint8_t)b]);
    +
    1051  bool click = (ButtonClickState & button);
    +
    1052  ButtonClickState &= ~button; // clear "click" event
    +
    1053  return click;
    +
    1054 }
    +
    1055 
    + +
    1057  if(!nunchuckConnected)
    +
    1058  return 127; // Return center position
    +
    1059  else {
    +
    1060  uint8_t output = hatValues[(uint8_t)a];
    +
    1061  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
    +
    1062  return 127;
    +
    1063  else
    +
    1064  return output;
    +
    1065  }
    +
    1066 }
    +
    1067 
    + + +
    1070  return 2000;
    +
    1071  else {
    +
    1072  uint16_t output = hatValues[(uint8_t)a];
    +
    1073  if(output == 0x00) // The joystick will only read 0 when it is first initializing, so we will just return the center position
    +
    1074  return 2000;
    +
    1075  else
    +
    1076  return output;
    +
    1077  }
    +
    1078 }
    +
    1079 
    +
    1080 void WII::onInit() {
    +
    1081  if(pFuncOnInit)
    +
    1082  pFuncOnInit(); // Call the user function
    +
    1083  else
    +
    1084  setLedStatus();
    +
    1085 }
    +
    1086 
    +
    1087 /************************************************************/
    +
    1088 /* The following functions are for the IR camera */
    +
    1089 /************************************************************/
    +
    1090 
    +
    1091 #ifdef WIICAMERA
    +
    1092 
    +
    1093 void WII::IRinitialize() { // Turns on and initialises the IR camera
    +
    1094 
    +
    1095  enableIRCamera1();
    +
    1096 #ifdef DEBUG_USB_HOST
    +
    1097  Notify(PSTR("\r\nEnable IR Camera1 Complete"), 0x80);
    +
    1098 #endif
    +
    1099  delay(80);
    +
    1100 
    +
    1101  enableIRCamera2();
    +
    1102 #ifdef DEBUG_USB_HOST
    +
    1103  Notify(PSTR("\r\nEnable IR Camera2 Complete"), 0x80);
    +
    1104 #endif
    +
    1105  delay(80);
    +
    1106 
    +
    1107  write0x08Value();
    +
    1108 #ifdef DEBUG_USB_HOST
    +
    1109  Notify(PSTR("\r\nWrote hex number 0x08"), 0x80);
    +
    1110 #endif
    +
    1111  delay(80);
    +
    1112 
    +
    1113  writeSensitivityBlock1();
    +
    1114 #ifdef DEBUG_USB_HOST
    +
    1115  Notify(PSTR("\r\nWrote Sensitivity Block 1"), 0x80);
    +
    1116 #endif
    +
    1117  delay(80);
    +
    1118 
    +
    1119  writeSensitivityBlock2();
    +
    1120 #ifdef DEBUG_USB_HOST
    +
    1121  Notify(PSTR("\r\nWrote Sensitivity Block 2"), 0x80);
    +
    1122 #endif
    +
    1123  delay(80);
    +
    1124 
    +
    1125  uint8_t mode_num = 0x03;
    +
    1126  setWiiModeNumber(mode_num); // Change input for whatever mode you want i.e. 0x01, 0x03, or 0x05
    +
    1127 #ifdef DEBUG_USB_HOST
    +
    1128  Notify(PSTR("\r\nSet Wii Mode Number To 0x"), 0x80);
    +
    1129  D_PrintHex<uint8_t > (mode_num, 0x80);
    +
    1130 #endif
    +
    1131  delay(80);
    +
    1132 
    +
    1133  write0x08Value();
    +
    1134 #ifdef DEBUG_USB_HOST
    +
    1135  Notify(PSTR("\r\nWrote Hex Number 0x08"), 0x80);
    +
    1136 #endif
    +
    1137  delay(80);
    +
    1138 
    +
    1139  setReportMode(false, 0x33);
    +
    1140  //setReportMode(false, 0x3f); // For full reporting mode, doesn't work yet
    +
    1141 #ifdef DEBUG_USB_HOST
    +
    1142  Notify(PSTR("\r\nSet Report Mode to 0x33"), 0x80);
    +
    1143 #endif
    +
    1144  delay(80);
    +
    1145 
    +
    1146  statusRequest(); // Used to update wiiState - call isIRCameraEnabled() afterwards to check if it actually worked
    +
    1147 #ifdef DEBUG_USB_HOST
    +
    1148  Notify(PSTR("\r\nIR Initialized"), 0x80);
    +
    1149 #endif
    +
    1150 }
    +
    1151 
    +
    1152 void WII::enableIRCamera1() {
    +
    1153  uint8_t cmd_buf[3];
    +
    1154  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    +
    1155  cmd_buf[1] = 0x13; // Output report 13
    +
    1156  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
    +
    1157  HID_Command(cmd_buf, 3);
    +
    1158 }
    +
    1159 
    +
    1160 void WII::enableIRCamera2() {
    +
    1161  uint8_t cmd_buf[3];
    +
    1162  cmd_buf[0] = 0xA2; // HID BT DATA_request (0xA0) | Report Type (Output 0x02)
    +
    1163  cmd_buf[1] = 0x1A; // Output report 1A
    +
    1164  cmd_buf[2] = 0x04 | (HIDBuffer[2] & 0x01); // Keep the rumble bit and sets bit 2
    +
    1165  HID_Command(cmd_buf, 3);
    +
    1166 }
    +
    1167 
    +
    1168 void WII::writeSensitivityBlock1() {
    +
    1169  uint8_t buf[9];
    +
    1170  buf[0] = 0x00;
    +
    1171  buf[1] = 0x00;
    +
    1172  buf[2] = 0x00;
    +
    1173  buf[3] = 0x00;
    +
    1174  buf[4] = 0x00;
    +
    1175  buf[5] = 0x00;
    +
    1176  buf[6] = 0x90;
    +
    1177  buf[7] = 0x00;
    +
    1178  buf[8] = 0x41;
    +
    1179 
    +
    1180  writeData(0xB00000, 9, buf);
    +
    1181 }
    1182 
    -
    1183  writeData(0xB00000, 9, buf);
    -
    1184 }
    -
    1185 
    -
    1186 void WII::writeSensitivityBlock2() {
    -
    1187  uint8_t buf[2];
    -
    1188  buf[0] = 0x40;
    -
    1189  buf[1] = 0x00;
    +
    1183 void WII::writeSensitivityBlock2() {
    +
    1184  uint8_t buf[2];
    +
    1185  buf[0] = 0x40;
    +
    1186  buf[1] = 0x00;
    +
    1187 
    +
    1188  writeData(0xB0001A, 2, buf);
    +
    1189 }
    1190 
    -
    1191  writeData(0xB0001A, 2, buf);
    -
    1192 }
    -
    1193 
    -
    1194 void WII::write0x08Value() {
    -
    1195  uint8_t cmd = 0x08;
    -
    1196  writeData(0xb00030, 1, &cmd);
    -
    1197 }
    -
    1198 
    -
    1199 void WII::setWiiModeNumber(uint8_t mode_number) { // mode_number in hex i.e. 0x03 for extended mode
    -
    1200  writeData(0xb00033, 1, &mode_number);
    -
    1201 }
    -
    1202 #endif
    -
    bool wiimoteConnected
    Definition: Wii.h:199
    -
    #define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
    Definition: BTD.h:139
    -
    bool incomingWii
    Definition: BTD.h:507
    -
    #define UHS_ACL_HANDLE_OK(x, y)
    Definition: BTD.h:207
    +
    1191 void WII::write0x08Value() {
    +
    1192  uint8_t cmd = 0x08;
    +
    1193  writeData(0xb00030, 1, &cmd);
    +
    1194 }
    +
    1195 
    +
    1196 void WII::setWiiModeNumber(uint8_t mode_number) { // mode_number in hex i.e. 0x03 for extended mode
    +
    1197  writeData(0xb00033, 1, &mode_number);
    +
    1198 }
    +
    1199 #endif
    +
    bool wiimoteConnected
    Definition: Wii.h:182
    +
    #define L2CAP_FLAG_DISCONNECT_CONTROL_RESPONSE
    Definition: BTD.h:137
    +
    bool incomingWii
    Definition: BTD.h:471
    +
    void onInit()
    Definition: Wii.cpp:1080
    -
    int16_t gyroPitchRaw
    Definition: Wii.h:271
    +
    int16_t gyroPitchRaw
    Definition: Wii.h:254
    +
    #define pgm_read_dword(addr)
    #define wii_clear_flag(flag)
    Definition: Wii.h:32
    -
    #define L2CAP_FLAG_CONFIG_INTERRUPT_SUCCESS
    Definition: BTD.h:143
    -
    #define L2CAP_INTERRUPT_CONFIG_REQUEST
    Definition: BTD.h:115
    -
    #define L2CAP_INTERRUPT_SETUP
    Definition: BTD.h:113
    -
    uint16_t rollGyroScale
    Definition: Wii.h:263
    -
    void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
    Definition: BTD.cpp:1231
    -
    #define SUCCESSFUL
    Definition: BTD.h:177
    -
    void l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)
    Definition: BTD.cpp:1218
    -
    #define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
    Definition: BTD.h:142
    -
    void setLedToggle(LEDEnum a)
    Definition: Wii.cpp:900
    -
    void setLedRaw(uint8_t value)
    Definition: Wii.cpp:878
    -
    uint8_t getAnalogHat(HatEnum a)
    Definition: Wii.cpp:1059
    -
    uint16_t yawGyroScale
    Definition: Wii.h:264
    +
    #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
    +
    uint16_t rollGyroScale
    Definition: Wii.h:246
    +
    void l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)
    Definition: BTD.cpp:1239
    +
    #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:1226
    +
    #define L2CAP_FLAG_CONNECTION_INTERRUPT_REQUEST
    Definition: BTD.h:140
    +
    void setLedToggle(LEDEnum a)
    Definition: Wii.cpp:897
    +
    void setLedRaw(uint8_t value)
    Definition: Wii.cpp:875
    +
    uint8_t getAnalogHat(HatEnum a)
    Definition: Wii.cpp:1056
    +
    uint16_t yawGyroScale
    Definition: Wii.h:247
    Definition: Wii.h:39
    -
    Definition: BTD.h:230
    +
    Definition: BTD.h:198
    #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:1284
    -
    virtual void ACLData(uint8_t *ACLData)
    Definition: Wii.cpp:135
    -
    bool pairWithWii
    Definition: BTD.h:509
    -
    double gyroRoll
    Definition: Wii.h:249
    -
    void setRumbleOn()
    Definition: Wii.cpp:866
    -
    virtual void Reset()
    Definition: Wii.cpp:104
    +
    void l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
    Definition: BTD.cpp:1292
    +
    void ACLData(uint8_t *ACLData)
    Definition: Wii.cpp:132
    +
    bool pairWithWii
    Definition: BTD.h:473
    +
    uint8_t identifier
    Definition: BTD.h:615
    +
    double gyroRoll
    Definition: Wii.h:232
    +
    void setRumbleOn()
    Definition: Wii.cpp:863
    +
    void Reset()
    Definition: Wii.cpp:101
    AnalogHatEnum
    -
    #define TURN_ON_LED
    Definition: BTD.h:129
    -
    int16_t accZnunchuck
    Definition: Wii.h:242
    -
    uint8_t getBatteryLevel()
    Definition: Wii.cpp:919
    -
    virtual void disconnect()
    Definition: Wii.cpp:118
    -
    bool motionPlusInside
    Definition: BTD.h:511
    -
    #define L2CAP_DONE
    Definition: BTD.h:104
    +
    #define TURN_ON_LED
    Definition: BTD.h:127
    +
    int16_t accZnunchuck
    Definition: Wii.h:225
    +
    uint8_t getBatteryLevel()
    Definition: Wii.cpp:916
    +
    void disconnect()
    Definition: Wii.cpp:115
    +
    bool motionPlusInside
    Definition: BTD.h:475
    +
    #define L2CAP_DONE
    Definition: BTD.h:102
    #define wii_set_flag(flag)
    Definition: Wii.h:31
    -
    #define L2CAP_CONTROL_SUCCESS
    Definition: BTD.h:109
    -
    #define L2CAP_WAIT
    Definition: BTD.h:103
    -
    int16_t accXnunchuck
    Definition: Wii.h:242
    -
    #define L2CAP_CONTROL_CONFIG_REQUEST
    Definition: BTD.h:108
    -
    int16_t gyroRollRaw
    Definition: Wii.h:270
    +
    #define L2CAP_CONTROL_SUCCESS
    Definition: BTD.h:107
    +
    #define L2CAP_WAIT
    Definition: BTD.h:101
    +
    int16_t accXnunchuck
    Definition: Wii.h:225
    +
    #define pgm_read_byte(addr)
    +
    #define L2CAP_CONTROL_CONFIG_REQUEST
    Definition: BTD.h:106
    +
    int16_t gyroRollRaw
    Definition: Wii.h:253
    LEDEnum
    -
    void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
    Definition: BTD.cpp:1297
    -
    void IRinitialize()
    Definition: Wii.cpp:1096
    +
    void l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)
    Definition: BTD.cpp:1305
    +
    void IRinitialize()
    Definition: Wii.cpp:1093
    Definition: Wii.h:37
    #define Notify(...)
    Definition: message.h:44
    -
    void setRumbleToggle()
    Definition: Wii.cpp:872
    -
    int16_t gyroPitchZero
    Definition: Wii.h:278
    -
    uint16_t pitchGyroScale
    Definition: Wii.h:262
    -
    #define L2CAP_CONTROL_CONNECT_REQUEST
    Definition: BTD.h:107
    -
    #define HID_CTRL_PSM
    Definition: BTD.h:182
    -
    double getWiimoteRoll()
    Definition: Wii.h:222
    +
    void setRumbleToggle()
    Definition: Wii.cpp:869
    +
    int16_t gyroPitchZero
    Definition: Wii.h:261
    +
    uint16_t pitchGyroScale
    Definition: Wii.h:245
    +
    #define L2CAP_CONTROL_CONNECT_REQUEST
    Definition: BTD.h:105
    +
    #define HID_CTRL_PSM
    Definition: BTD.h:180
    +
    double getWiimoteRoll()
    Definition: Wii.h:205
    WII(BTD *p, bool pair=false)
    Definition: Wii.cpp:85
    -
    double rollGyroSpeed
    Definition: Wii.h:256
    -
    #define WII_CHECK_EXTENSION_STATE
    Definition: BTD.h:132
    +
    double rollGyroSpeed
    Definition: Wii.h:239
    +
    #define WII_CHECK_EXTENSION_STATE
    Definition: BTD.h:130
    -
    bool connectToWii
    Definition: BTD.h:503
    -
    bool wiiUProController
    Definition: BTD.h:513
    -
    uint16_t hci_handle
    Definition: BTD.h:487
    -
    void hci_disconnect(uint16_t handle)
    Definition: BTD.cpp:1142
    -
    void setLedStatus()
    Definition: Wii.cpp:906
    -
    #define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
    Definition: BTD.h:145
    +
    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:1150
    + +
    void setLedStatus()
    Definition: Wii.cpp:903
    +
    #define L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE
    Definition: BTD.h:143
    #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:1048
    -
    int16_t accYwiimote
    Definition: Wii.h:236
    -
    bool wiiUProControllerConnected
    Definition: Wii.h:210
    +
    bool getButtonClick(ButtonEnum b)
    Definition: Wii.cpp:1045
    +
    int16_t accYwiimote
    Definition: Wii.h:219
    +
    bool wiiUProControllerConnected
    Definition: Wii.h:193
    +
    void(* pFuncOnInit)(void)
    Definition: BTD.h:603
    -
    #define l2cap_check_flag(flag)
    Definition: BTD.h:160
    -
    void setRumbleOff()
    Definition: Wii.cpp:860
    -
    #define L2CAP_CMD_CONFIG_REQUEST
    Definition: BTD.h:168
    -
    #define L2CAP_FLAG_CONTROL_CONNECTED
    Definition: BTD.h:138
    -
    #define L2CAP_CMD_DISCONNECT_REQUEST
    Definition: BTD.h:170
    -
    void setAllOff()
    Definition: Wii.cpp:854
    -
    #define L2CAP_CONTROL_DISCONNECT
    Definition: BTD.h:110
    +
    #define l2cap_check_flag(flag)
    Definition: BTD.h:158
    +
    void setRumbleOff()
    Definition: Wii.cpp:857
    +
    #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
    +
    void setAllOff()
    Definition: Wii.cpp:851
    +
    #define L2CAP_CONTROL_DISCONNECT
    Definition: BTD.h:108
    const uint32_t WII_BUTTONS[]
    Definition: Wii.cpp:40
    -
    #define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
    Definition: BTD.h:136
    -
    void setLedOff()
    Definition: Wii.h:152
    -
    #define WII_CHECK_MOTION_PLUS_STATE
    Definition: BTD.h:131
    -
    double gyroYaw
    Definition: Wii.h:251
    -
    #define HID_INTR_PSM
    Definition: BTD.h:183
    -
    bool nunchuckConnected
    Definition: Wii.h:206
    +
    #define L2CAP_FLAG_CONNECTION_CONTROL_REQUEST
    Definition: BTD.h:134
    +
    void setLedOff()
    Definition: Wii.h:143
    +
    #define WII_CHECK_MOTION_PLUS_STATE
    Definition: BTD.h:129
    +
    BTD * pBtd
    Definition: BTD.h:606
    +
    double gyroYaw
    Definition: Wii.h:234
    +
    #define HID_INTR_PSM
    Definition: BTD.h:181
    +
    bool nunchuckConnected
    Definition: Wii.h:189
    -
    int8_t registerServiceClass(BluetoothService *pService)
    Definition: BTD.h:333
    -
    bool l2capConnectionClaimed
    Definition: BTD.h:473
    -
    int16_t gyroYawRaw
    Definition: Wii.h:269
    -
    bool isIRCameraEnabled()
    Definition: Wii.h:389
    +
    bool l2capConnectionClaimed
    Definition: BTD.h:437
    +
    int16_t gyroYawRaw
    Definition: Wii.h:252
    +
    bool isIRCameraEnabled()
    Definition: Wii.h:372
    const uint32_t WII_PROCONTROLLER_BUTTONS[]
    Definition: Wii.cpp:59
    -
    #define L2CAP_CMD_DISCONNECT_RESPONSE
    Definition: BTD.h:171
    -
    #define L2CAP_CMD_CONNECTION_RESPONSE
    Definition: BTD.h:167
    -
    #define L2CAP_CMD_CONFIG_RESPONSE
    Definition: BTD.h:169
    -
    double getWiimotePitch()
    Definition: Wii.h:218
    -
    void pair(void)
    Definition: Wii.h:89
    -
    void setLedOn(LEDEnum a)
    Definition: Wii.cpp:890
    -
    double yawGyroSpeed
    Definition: Wii.h:257
    +
    #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
    +
    double getWiimotePitch()
    Definition: Wii.h:201
    +
    void pair(void)
    Definition: Wii.h:80
    +
    uint16_t hci_handle
    Definition: BTD.h:609
    +
    void setLedOn(LEDEnum a)
    Definition: Wii.cpp:887
    +
    double yawGyroSpeed
    Definition: Wii.h:240
    HatEnum
    Definition: Wii.h:35
    -
    int16_t accYnunchuck
    Definition: Wii.h:242
    -
    int16_t gyroYawZero
    Definition: Wii.h:276
    +
    int16_t accYnunchuck
    Definition: Wii.h:225
    +
    int16_t gyroYawZero
    Definition: Wii.h:259
    +
    uint32_t l2cap_event_flag
    Definition: BTD.h:612
    #define wii_check_flag(flag)
    Definition: Wii.h:30
    -
    double pitchGyroSpeed
    Definition: Wii.h:255
    -
    double gyroPitch
    Definition: Wii.h:247
    -
    #define WII_INIT_MOTION_PLUS_STATE
    Definition: BTD.h:133
    -
    void L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)
    Definition: BTD.cpp:1190
    -
    void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
    Definition: BTD.cpp:1265
    -
    #define PENDING
    Definition: BTD.h:176
    -
    #define L2CAP_FLAG_INTERRUPT_CONNECTED
    Definition: BTD.h:144
    -
    #define l2cap_set_flag(flag)
    Definition: BTD.h:161
    -
    void l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)
    Definition: BTD.cpp:1248
    +
    double pitchGyroSpeed
    Definition: Wii.h:238
    +
    double gyroPitch
    Definition: Wii.h:230
    +
    #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:1198
    +
    void l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)
    Definition: BTD.cpp:1273
    +
    #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:1256
    -
    bool getButtonPress(ButtonEnum b)
    Definition: Wii.cpp:1041
    -
    #define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
    Definition: BTD.h:137
    +
    bool getButtonPress(ButtonEnum b)
    Definition: Wii.cpp:1038
    +
    #define L2CAP_FLAG_CONFIG_CONTROL_SUCCESS
    Definition: BTD.h:135
    -
    #define L2CAP_CMD_CONNECTION_REQUEST
    Definition: BTD.h:166
    -
    bool motionPlusConnected
    Definition: Wii.h:208
    -
    int16_t gyroRollZero
    Definition: Wii.h:277
    -
    #define L2CAP_INTERRUPT_CONNECT_REQUEST
    Definition: BTD.h:114
    -
    virtual void Run()
    Definition: Wii.cpp:684
    -
    #define L2CAP_INTERRUPT_DISCONNECT
    Definition: BTD.h:116
    -
    int16_t accXwiimote
    Definition: Wii.h:236
    -
    int16_t accZwiimote
    Definition: Wii.h:236
    -
    #define L2CAP_CMD_COMMAND_REJECT
    Definition: BTD.h:165
    +
    #define L2CAP_CMD_CONNECTION_REQUEST
    Definition: BTD.h:164
    +
    bool motionPlusConnected
    Definition: Wii.h:191
    +
    int16_t gyroRollZero
    Definition: Wii.h:260
    +
    bool checkHciHandle(uint8_t *buf, uint16_t handle)
    Definition: BTD.h:598
    +
    #define L2CAP_INTERRUPT_CONNECT_REQUEST
    Definition: BTD.h:112
    +
    void Run()
    Definition: Wii.cpp:681
    +
    #define L2CAP_INTERRUPT_DISCONNECT
    Definition: BTD.h:114
    +
    int16_t accXwiimote
    Definition: Wii.h:219
    +
    int16_t accZwiimote
    Definition: Wii.h:219
    +
    #define L2CAP_CMD_COMMAND_REJECT
    Definition: BTD.h:163
    diff --git a/_wii_8h.html b/_wii_8h.html index 68ec671e..0c7c1310 100644 --- a/_wii_8h.html +++ b/_wii_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Wii.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,7 +101,7 @@ Include dependency graph for Wii.h:
    - +
    This graph shows which files directly or indirectly include this file:
    @@ -249,7 +250,7 @@ Enumerations diff --git a/_wii_8h__dep__incl.md5 b/_wii_8h__dep__incl.md5 index 1300a3e5..141f0cf4 100644 --- a/_wii_8h__dep__incl.md5 +++ b/_wii_8h__dep__incl.md5 @@ -1 +1 @@ -4f5ed0d059dbe61d52339b9d9d877c07 \ No newline at end of file +68e486939ecaf1de2be16bf264fe38d3 \ No newline at end of file diff --git a/_wii_8h__incl.map b/_wii_8h__incl.map index fe6475a4..7893419c 100644 --- a/_wii_8h__incl.map +++ b/_wii_8h__incl.map @@ -1,5 +1,7 @@ - - + + + + diff --git a/_wii_8h__incl.md5 b/_wii_8h__incl.md5 index 8af172ab..f8ae3450 100644 --- a/_wii_8h__incl.md5 +++ b/_wii_8h__incl.md5 @@ -1 +1 @@ -8f6053582134fdb8a44a345a833d0cc3 \ No newline at end of file +1975c7b33cbe34ad70871dbfd062d74a \ No newline at end of file diff --git a/_wii_8h__incl.png b/_wii_8h__incl.png index bc6aac08dbd7e801b4f08acafac11b499f668686..1be2f584e1b5a958f8251ec02a77d69fff3113ad 100644 GIT binary patch literal 15996 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 literal 7600 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 QlSNQg(2%c@wfyvd0DVbsZU6uP diff --git a/_wii_8h_source.html b/_wii_8h_source.html index e2a17752..c49390a8 100644 --- a/_wii_8h_source.html +++ b/_wii_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Wii.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -131,329 +132,321 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    48 public:
    55  WII(BTD *p, bool pair = false);
    56 
    -
    62  virtual void ACLData(uint8_t* ACLData);
    -
    64  virtual void Run();
    -
    66  virtual void Reset();
    -
    68  virtual void disconnect();
    -
    82  bool getButtonPress(ButtonEnum b);
    -
    83  bool getButtonClick(ButtonEnum b);
    -
    89  void pair(void) {
    -
    90  if(pBtd)
    -
    91  pBtd->pairWithWiimote();
    -
    92  };
    -
    98  uint8_t getAnalogHat(HatEnum a);
    -
    104  uint16_t getAnalogHat(AnalogHatEnum a);
    -
    105 
    -
    110  double getPitch() {
    - -
    112  return compPitch;
    -
    113  return getWiimotePitch();
    -
    114  };
    -
    115 
    -
    120  double getRoll() {
    - -
    122  return compRoll;
    -
    123  return getWiimoteRoll();
    -
    124  };
    -
    125 
    -
    132  double getYaw() {
    -
    133  return gyroYaw;
    -
    134  };
    +
    59  void disconnect();
    +
    73  bool getButtonPress(ButtonEnum b);
    +
    74  bool getButtonClick(ButtonEnum b);
    +
    80  void pair(void) {
    +
    81  if(pBtd)
    + +
    83  };
    +
    89  uint8_t getAnalogHat(HatEnum a);
    +
    95  uint16_t getAnalogHat(AnalogHatEnum a);
    +
    96 
    +
    101  double getPitch() {
    + +
    103  return compPitch;
    +
    104  return getWiimotePitch();
    +
    105  };
    +
    106 
    +
    111  double getRoll() {
    + +
    113  return compRoll;
    +
    114  return getWiimoteRoll();
    +
    115  };
    +
    116 
    +
    123  double getYaw() {
    +
    124  return gyroYaw;
    +
    125  };
    +
    126 
    +
    128  void setAllOff();
    +
    130  void setRumbleOff();
    +
    132  void setRumbleOn();
    +
    134  void setRumbleToggle();
    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  };
    -
    192 
    -
    197  void attachOnInit(void (*funcOnInit)(void)) {
    -
    198  pFuncOnInit = funcOnInit;
    -
    199  };
    -
    204  bool wiimoteConnected;
    - - - -
    213  /* IMU Data, might be usefull if you need to do something more advanced than just calculating the angle */
    -
    214 
    -
    218  double getWiimotePitch() {
    -
    219  return (atan2(accYwiimote, accZwiimote) + PI) * RAD_TO_DEG;
    -
    220  };
    -
    221 
    -
    222  double getWiimoteRoll() {
    -
    223  return (atan2(accXwiimote, accZwiimote) + PI) * RAD_TO_DEG;
    -
    224  };
    -
    230  double getNunchuckPitch() {
    -
    231  return (atan2(accYnunchuck, accZnunchuck) + PI) * RAD_TO_DEG;
    -
    232  };
    -
    233 
    -
    234  double getNunchuckRoll() {
    -
    235  return (atan2(accXnunchuck, accZnunchuck) + PI) * RAD_TO_DEG;
    -
    236  };
    - - -
    245  /* Variables for the gyro inside the Motion Plus */
    -
    247  double gyroPitch;
    -
    249  double gyroRoll;
    -
    251  double gyroYaw;
    -
    252 
    - - -
    257  double yawGyroSpeed;
    -
    262  uint16_t pitchGyroScale;
    -
    263  uint16_t rollGyroScale;
    -
    264  uint16_t yawGyroScale;
    -
    269  int16_t gyroYawRaw;
    -
    270  int16_t gyroRollRaw;
    -
    271  int16_t gyroPitchRaw;
    -
    276  int16_t gyroYawZero;
    -
    277  int16_t gyroRollZero;
    -
    278  int16_t gyroPitchZero;
    -
    281 #ifdef WIICAMERA
    -
    282 
    -
    286  void IRinitialize();
    -
    287 
    -
    292  uint16_t getIRx1() {
    -
    293  return IR_object_x1;
    -
    294  };
    -
    295 
    -
    300  uint16_t getIRy1() {
    -
    301  return IR_object_y1;
    -
    302  };
    -
    303 
    -
    308  uint8_t getIRs1() {
    -
    309  return IR_object_s1;
    -
    310  };
    -
    311 
    -
    316  uint16_t getIRx2() {
    -
    317  return IR_object_x2;
    -
    318  };
    -
    319 
    -
    324  uint16_t getIRy2() {
    -
    325  return IR_object_y2;
    -
    326  };
    -
    327 
    -
    332  uint8_t getIRs2() {
    -
    333  return IR_object_s2;
    -
    334  };
    -
    335 
    -
    340  uint16_t getIRx3() {
    -
    341  return IR_object_x3;
    -
    342  };
    -
    343 
    -
    348  uint16_t getIRy3() {
    -
    349  return IR_object_y3;
    -
    350  };
    -
    351 
    -
    356  uint8_t getIRs3() {
    -
    357  return IR_object_s3;
    -
    358  };
    -
    359 
    -
    364  uint16_t getIRx4() {
    -
    365  return IR_object_x4;
    -
    366  };
    -
    367 
    -
    372  uint16_t getIRy4() {
    -
    373  return IR_object_y4;
    +
    140  void setLedRaw(uint8_t value);
    +
    141 
    +
    143  void setLedOff() {
    +
    144  setLedRaw(0);
    +
    145  };
    +
    150  void setLedOff(LEDEnum a);
    +
    155  void setLedOn(LEDEnum a);
    +
    160  void setLedToggle(LEDEnum a);
    +
    168  void setLedStatus();
    +
    169 
    +
    174  uint8_t getBatteryLevel();
    +
    175 
    +
    180  uint8_t getWiiState() {
    +
    181  return wiiState;
    +
    182  };
    +
    187  bool wiimoteConnected;
    + + + +
    196  /* IMU Data, might be usefull if you need to do something more advanced than just calculating the angle */
    +
    197 
    +
    201  double getWiimotePitch() {
    +
    202  return (atan2(accYwiimote, accZwiimote) + PI) * RAD_TO_DEG;
    +
    203  };
    +
    204 
    +
    205  double getWiimoteRoll() {
    +
    206  return (atan2(accXwiimote, accZwiimote) + PI) * RAD_TO_DEG;
    +
    207  };
    +
    213  double getNunchuckPitch() {
    +
    214  return (atan2(accYnunchuck, accZnunchuck) + PI) * RAD_TO_DEG;
    +
    215  };
    +
    216 
    +
    217  double getNunchuckRoll() {
    +
    218  return (atan2(accXnunchuck, accZnunchuck) + PI) * RAD_TO_DEG;
    +
    219  };
    + + +
    228  /* Variables for the gyro inside the Motion Plus */
    +
    230  double gyroPitch;
    +
    232  double gyroRoll;
    +
    234  double gyroYaw;
    +
    235 
    + + +
    240  double yawGyroSpeed;
    +
    245  uint16_t pitchGyroScale;
    +
    246  uint16_t rollGyroScale;
    +
    247  uint16_t yawGyroScale;
    +
    252  int16_t gyroYawRaw;
    +
    253  int16_t gyroRollRaw;
    +
    254  int16_t gyroPitchRaw;
    +
    259  int16_t gyroYawZero;
    +
    260  int16_t gyroRollZero;
    +
    261  int16_t gyroPitchZero;
    +
    264 #ifdef WIICAMERA
    +
    265 
    +
    269  void IRinitialize();
    +
    270 
    +
    275  uint16_t getIRx1() {
    +
    276  return IR_object_x1;
    +
    277  };
    +
    278 
    +
    283  uint16_t getIRy1() {
    +
    284  return IR_object_y1;
    +
    285  };
    +
    286 
    +
    291  uint8_t getIRs1() {
    +
    292  return IR_object_s1;
    +
    293  };
    +
    294 
    +
    299  uint16_t getIRx2() {
    +
    300  return IR_object_x2;
    +
    301  };
    +
    302 
    +
    307  uint16_t getIRy2() {
    +
    308  return IR_object_y2;
    +
    309  };
    +
    310 
    +
    315  uint8_t getIRs2() {
    +
    316  return IR_object_s2;
    +
    317  };
    +
    318 
    +
    323  uint16_t getIRx3() {
    +
    324  return IR_object_x3;
    +
    325  };
    +
    326 
    +
    331  uint16_t getIRy3() {
    +
    332  return IR_object_y3;
    +
    333  };
    +
    334 
    +
    339  uint8_t getIRs3() {
    +
    340  return IR_object_s3;
    +
    341  };
    +
    342 
    +
    347  uint16_t getIRx4() {
    +
    348  return IR_object_x4;
    +
    349  };
    +
    350 
    +
    355  uint16_t getIRy4() {
    +
    356  return IR_object_y4;
    +
    357  };
    +
    358 
    +
    363  uint8_t getIRs4() {
    +
    364  return IR_object_s4;
    +
    365  };
    +
    366 
    + +
    373  return (wiiState & 0x08);
    374  };
    -
    375 
    -
    380  uint8_t getIRs4() {
    -
    381  return IR_object_s4;
    -
    382  };
    -
    383 
    - -
    390  return (wiiState & 0x08);
    -
    391  };
    -
    393 #endif
    -
    394 
    -
    395 private:
    -
    396  BTD *pBtd; // Pointer to BTD instance
    -
    397 
    -
    403  void onInit();
    -
    404  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    405 
    -
    406  void L2CAP_task(); // L2CAP state machine
    +
    376 #endif
    +
    377 
    +
    378 protected:
    +
    384  void ACLData(uint8_t* ACLData);
    +
    386  void Run();
    +
    388  void Reset();
    +
    394  void onInit();
    +
    397 private:
    +
    398 
    +
    399  void L2CAP_task(); // L2CAP state machine
    +
    400 
    +
    401  /* Variables filled from HCI event management */
    +
    402  bool activeConnection; // Used to indicate if it's already has established a connection
    +
    403 
    +
    404  /* Variables used by high level L2CAP task */
    +
    405  uint8_t l2cap_state;
    +
    406  uint8_t wii_event_flag; // Used for Wii flags
    407 
    -
    408  /* Variables filled from HCI event management */
    -
    409  uint16_t hci_handle;
    -
    410  bool activeConnection; // Used to indicate if it's already has established a connection
    -
    411 
    -
    412  /* Variables used by high level L2CAP task */
    -
    413  uint8_t l2cap_state;
    -
    414  uint32_t l2cap_event_flag; // L2CAP flags of received Bluetooth events
    -
    415  uint8_t wii_event_flag; // Used for Wii flags
    -
    416 
    -
    417  uint32_t ButtonState;
    -
    418  uint32_t OldButtonState;
    -
    419  uint32_t ButtonClickState;
    -
    420  uint16_t hatValues[4];
    -
    421 
    -
    422  uint8_t HIDBuffer[3]; // Used to store HID commands
    -
    423 
    -
    424  uint16_t stateCounter;
    -
    425  bool unknownExtensionConnected;
    -
    426  bool extensionConnected;
    -
    427  bool checkExtension; // Set to false when getBatteryLevel() is called otherwise if should be true
    -
    428  bool motionPlusInside; // True if it's a new Wiimote with the Motion Plus extension build into it
    -
    429 
    -
    430  /* L2CAP Channels */
    -
    431  uint8_t control_scid[2]; // L2CAP source CID for HID_Control
    -
    432  uint8_t control_dcid[2]; // 0x0060
    -
    433  uint8_t interrupt_scid[2]; // L2CAP source CID for HID_Interrupt
    -
    434  uint8_t interrupt_dcid[2]; // 0x0061
    -
    435  uint8_t identifier; // Identifier for connection
    +
    408  uint32_t ButtonState;
    +
    409  uint32_t OldButtonState;
    +
    410  uint32_t ButtonClickState;
    +
    411  uint16_t hatValues[4];
    +
    412 
    +
    413  uint8_t HIDBuffer[3]; // Used to store HID commands
    +
    414 
    +
    415  uint16_t stateCounter;
    +
    416  bool unknownExtensionConnected;
    +
    417  bool extensionConnected;
    +
    418  bool checkExtension; // Set to false when getBatteryLevel() is called otherwise if should be true
    +
    419  bool motionPlusInside; // True if it's a new Wiimote with the Motion Plus extension build into it
    +
    420 
    +
    421  /* L2CAP Channels */
    +
    422  uint8_t control_scid[2]; // L2CAP source CID for HID_Control
    +
    423  uint8_t control_dcid[2]; // 0x0060
    +
    424  uint8_t interrupt_scid[2]; // L2CAP source CID for HID_Interrupt
    +
    425  uint8_t interrupt_dcid[2]; // 0x0061
    +
    426 
    +
    427  /* HID Commands */
    +
    428  void HID_Command(uint8_t* data, uint8_t nbytes);
    +
    429  void setReportMode(bool continuous, uint8_t mode);
    +
    430 
    +
    431  void writeData(uint32_t offset, uint8_t size, uint8_t* data);
    +
    432  void initExtension1();
    +
    433  void initExtension2();
    +
    434 
    +
    435  void statusRequest(); // Used to update the Wiimote state and battery level
    436 
    -
    437  /* HID Commands */
    -
    438  void HID_Command(uint8_t* data, uint8_t nbytes);
    -
    439  void setReportMode(bool continuous, uint8_t mode);
    +
    437  void readData(uint32_t offset, uint16_t size, bool EEPROM);
    +
    438  void readExtensionType();
    +
    439  void readCalData();
    440 
    -
    441  void writeData(uint32_t offset, uint8_t size, uint8_t* data);
    -
    442  void initExtension1();
    -
    443  void initExtension2();
    +
    441  void checkMotionPresent(); // Used to see if a Motion Plus is connected to the Wiimote
    +
    442  void initMotionPlus();
    +
    443  void activateMotionPlus();
    444 
    -
    445  void statusRequest(); // Used to update the Wiimote state and battery level
    -
    446 
    -
    447  void readData(uint32_t offset, uint16_t size, bool EEPROM);
    -
    448  void readExtensionType();
    -
    449  void readCalData();
    -
    450 
    -
    451  void checkMotionPresent(); // Used to see if a Motion Plus is connected to the Wiimote
    -
    452  void initMotionPlus();
    -
    453  void activateMotionPlus();
    +
    445  double compPitch; // Fusioned angle using a complimentary filter if the Motion Plus is connected
    +
    446  double compRoll; // Fusioned angle using a complimentary filter if the Motion Plus is connected
    +
    447 
    +
    448  bool activateNunchuck;
    +
    449  bool motionValuesReset; // This bool is true when the gyro values has been reset
    +
    450  uint32_t timer;
    +
    451 
    +
    452  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)
    +
    453  uint8_t batteryLevel;
    454 
    -
    455  double compPitch; // Fusioned angle using a complimentary filter if the Motion Plus is connected
    -
    456  double compRoll; // Fusioned angle using a complimentary filter if the Motion Plus is connected
    -
    457 
    -
    458  bool activateNunchuck;
    -
    459  bool motionValuesReset; // This bool is true when the gyro values has been reset
    -
    460  unsigned long timer;
    -
    461 
    -
    462  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)
    -
    463  uint8_t batteryLevel;
    -
    464 
    -
    465 #ifdef WIICAMERA
    -
    466  /* Private function and variables for the readings from the IR Camera */
    -
    467  void enableIRCamera1(); // Sets bit 2 of output report 13
    -
    468  void enableIRCamera2(); // Sets bit 2 of output report 1A
    -
    469  void writeSensitivityBlock1();
    -
    470  void writeSensitivityBlock2();
    -
    471  void write0x08Value();
    -
    472  void setWiiModeNumber(uint8_t mode_number);
    -
    473 
    -
    474  uint16_t IR_object_x1; // IR x position 10 bits
    -
    475  uint16_t IR_object_y1; // IR y position 10 bits
    -
    476  uint8_t IR_object_s1; // IR size value
    -
    477  uint16_t IR_object_x2;
    -
    478  uint16_t IR_object_y2;
    -
    479  uint8_t IR_object_s2;
    -
    480  uint16_t IR_object_x3; // IR x position 10 bits
    -
    481  uint16_t IR_object_y3; // IR y position 10 bits
    -
    482  uint8_t IR_object_s3; // IR size value
    -
    483  uint16_t IR_object_x4;
    -
    484  uint16_t IR_object_y4;
    -
    485  uint8_t IR_object_s4;
    -
    486 #endif
    -
    487 };
    -
    488 #endif
    -
    bool wiimoteConnected
    Definition: Wii.h:199
    -
    int16_t gyroPitchRaw
    Definition: Wii.h:271
    -
    uint16_t rollGyroScale
    Definition: Wii.h:263
    -
    double getNunchuckPitch()
    Definition: Wii.h:230
    -
    void setLedToggle(LEDEnum a)
    Definition: Wii.cpp:900
    -
    void setLedRaw(uint8_t value)
    Definition: Wii.cpp:878
    -
    uint8_t getAnalogHat(HatEnum a)
    Definition: Wii.cpp:1059
    -
    uint16_t yawGyroScale
    Definition: Wii.h:264
    +
    455 #ifdef WIICAMERA
    +
    456  /* Private function and variables for the readings from the IR Camera */
    +
    457  void enableIRCamera1(); // Sets bit 2 of output report 13
    +
    458  void enableIRCamera2(); // Sets bit 2 of output report 1A
    +
    459  void writeSensitivityBlock1();
    +
    460  void writeSensitivityBlock2();
    +
    461  void write0x08Value();
    +
    462  void setWiiModeNumber(uint8_t mode_number);
    +
    463 
    +
    464  uint16_t IR_object_x1; // IR x position 10 bits
    +
    465  uint16_t IR_object_y1; // IR y position 10 bits
    +
    466  uint8_t IR_object_s1; // IR size value
    +
    467  uint16_t IR_object_x2;
    +
    468  uint16_t IR_object_y2;
    +
    469  uint8_t IR_object_s2;
    +
    470  uint16_t IR_object_x3; // IR x position 10 bits
    +
    471  uint16_t IR_object_y3; // IR y position 10 bits
    +
    472  uint8_t IR_object_s3; // IR size value
    +
    473  uint16_t IR_object_x4;
    +
    474  uint16_t IR_object_y4;
    +
    475  uint8_t IR_object_s4;
    +
    476 #endif
    +
    477 };
    +
    478 #endif
    +
    bool wiimoteConnected
    Definition: Wii.h:182
    +
    void onInit()
    Definition: Wii.cpp:1080
    +
    int16_t gyroPitchRaw
    Definition: Wii.h:254
    +
    uint16_t rollGyroScale
    Definition: Wii.h:246
    +
    double getNunchuckPitch()
    Definition: Wii.h:213
    +
    void setLedToggle(LEDEnum a)
    Definition: Wii.cpp:897
    +
    void setLedRaw(uint8_t value)
    Definition: Wii.cpp:875
    +
    uint8_t getAnalogHat(HatEnum a)
    Definition: Wii.cpp:1056
    +
    uint16_t yawGyroScale
    Definition: Wii.h:247
    Definition: Wii.h:39
    -
    Definition: BTD.h:230
    -
    uint8_t getIRs1()
    Definition: Wii.h:308
    -
    uint8_t getIRs3()
    Definition: Wii.h:356
    -
    double getNunchuckRoll()
    Definition: Wii.h:234
    -
    virtual void ACLData(uint8_t *ACLData)
    Definition: Wii.cpp:135
    -
    double gyroRoll
    Definition: Wii.h:249
    -
    uint16_t getIRx4()
    Definition: Wii.h:364
    -
    void setRumbleOn()
    Definition: Wii.cpp:866
    -
    virtual void Reset()
    Definition: Wii.cpp:104
    -
    double getRoll()
    Definition: Wii.h:120
    +
    Definition: BTD.h:198
    +
    uint8_t getIRs1()
    Definition: Wii.h:291
    +
    uint8_t getIRs3()
    Definition: Wii.h:339
    +
    double getNunchuckRoll()
    Definition: Wii.h:217
    +
    void ACLData(uint8_t *ACLData)
    Definition: Wii.cpp:132
    +
    double gyroRoll
    Definition: Wii.h:232
    +
    uint16_t getIRx4()
    Definition: Wii.h:347
    +
    void setRumbleOn()
    Definition: Wii.cpp:863
    +
    void Reset()
    Definition: Wii.cpp:101
    +
    double getRoll()
    Definition: Wii.h:111
    AnalogHatEnum
    -
    int16_t accZnunchuck
    Definition: Wii.h:242
    -
    uint8_t getBatteryLevel()
    Definition: Wii.cpp:919
    -
    virtual void disconnect()
    Definition: Wii.cpp:118
    -
    double getPitch()
    Definition: Wii.h:110
    -
    int16_t accXnunchuck
    Definition: Wii.h:242
    -
    uint8_t getWiiState()
    Definition: Wii.h:189
    -
    uint16_t getIRy2()
    Definition: Wii.h:324
    -
    int16_t gyroRollRaw
    Definition: Wii.h:270
    +
    int16_t accZnunchuck
    Definition: Wii.h:225
    +
    uint8_t getBatteryLevel()
    Definition: Wii.cpp:916
    +
    void disconnect()
    Definition: Wii.cpp:115
    +
    double getPitch()
    Definition: Wii.h:101
    +
    int16_t accXnunchuck
    Definition: Wii.h:225
    +
    uint8_t getWiiState()
    Definition: Wii.h:180
    +
    uint16_t getIRy2()
    Definition: Wii.h:307
    +
    int16_t gyroRollRaw
    Definition: Wii.h:253
    LEDEnum
    -
    void IRinitialize()
    Definition: Wii.cpp:1096
    +
    void IRinitialize()
    Definition: Wii.cpp:1093
    Definition: Wii.h:37
    -
    uint16_t getIRx2()
    Definition: Wii.h:316
    -
    uint16_t getIRx1()
    Definition: Wii.h:292
    -
    void setRumbleToggle()
    Definition: Wii.cpp:872
    -
    int16_t gyroPitchZero
    Definition: Wii.h:278
    -
    uint16_t pitchGyroScale
    Definition: Wii.h:262
    -
    double getWiimoteRoll()
    Definition: Wii.h:222
    +
    uint16_t getIRx2()
    Definition: Wii.h:299
    +
    uint16_t getIRx1()
    Definition: Wii.h:275
    +
    void setRumbleToggle()
    Definition: Wii.cpp:869
    +
    int16_t gyroPitchZero
    Definition: Wii.h:261
    +
    uint16_t pitchGyroScale
    Definition: Wii.h:245
    +
    double getWiimoteRoll()
    Definition: Wii.h:205
    WII(BTD *p, bool pair=false)
    Definition: Wii.cpp:85
    -
    double rollGyroSpeed
    Definition: Wii.h:256
    -
    uint8_t getIRs4()
    Definition: Wii.h:380
    -
    uint16_t getIRy3()
    Definition: Wii.h:348
    - -
    void setLedStatus()
    Definition: Wii.cpp:906
    +
    double rollGyroSpeed
    Definition: Wii.h:239
    +
    uint8_t getIRs4()
    Definition: Wii.h:363
    +
    uint16_t getIRy3()
    Definition: Wii.h:331
    + +
    void setLedStatus()
    Definition: Wii.cpp:903
    ButtonEnum
    -
    bool getButtonClick(ButtonEnum b)
    Definition: Wii.cpp:1048
    -
    int16_t accYwiimote
    Definition: Wii.h:236
    -
    bool wiiUProControllerConnected
    Definition: Wii.h:210
    -
    void setRumbleOff()
    Definition: Wii.cpp:860
    -
    void setAllOff()
    Definition: Wii.cpp:854
    -
    void setLedOff()
    Definition: Wii.h:152
    -
    uint16_t getIRy1()
    Definition: Wii.h:300
    -
    uint16_t getIRx3()
    Definition: Wii.h:340
    -
    double gyroYaw
    Definition: Wii.h:251
    -
    bool nunchuckConnected
    Definition: Wii.h:206
    -
    uint16_t getIRy4()
    Definition: Wii.h:372
    -
    int16_t gyroYawRaw
    Definition: Wii.h:269
    -
    bool isIRCameraEnabled()
    Definition: Wii.h:389
    -
    void attachOnInit(void(*funcOnInit)(void))
    Definition: Wii.h:197
    -
    double getYaw()
    Definition: Wii.h:132
    -
    double getWiimotePitch()
    Definition: Wii.h:218
    -
    void pair(void)
    Definition: Wii.h:89
    -
    void setLedOn(LEDEnum a)
    Definition: Wii.cpp:890
    -
    double yawGyroSpeed
    Definition: Wii.h:257
    +
    bool getButtonClick(ButtonEnum b)
    Definition: Wii.cpp:1045
    +
    int16_t accYwiimote
    Definition: Wii.h:219
    +
    bool wiiUProControllerConnected
    Definition: Wii.h:193
    +
    void setRumbleOff()
    Definition: Wii.cpp:857
    +
    void setAllOff()
    Definition: Wii.cpp:851
    +
    void setLedOff()
    Definition: Wii.h:143
    +
    uint16_t getIRy1()
    Definition: Wii.h:283
    +
    uint16_t getIRx3()
    Definition: Wii.h:323
    +
    BTD * pBtd
    Definition: BTD.h:606
    +
    double gyroYaw
    Definition: Wii.h:234
    +
    bool nunchuckConnected
    Definition: Wii.h:189
    +
    uint16_t getIRy4()
    Definition: Wii.h:355
    +
    int16_t gyroYawRaw
    Definition: Wii.h:252
    +
    bool isIRCameraEnabled()
    Definition: Wii.h:372
    +
    double getYaw()
    Definition: Wii.h:123
    +
    double getWiimotePitch()
    Definition: Wii.h:201
    +
    void pair(void)
    Definition: Wii.h:80
    +
    void setLedOn(LEDEnum a)
    Definition: Wii.cpp:887
    +
    double yawGyroSpeed
    Definition: Wii.h:240
    HatEnum
    Definition: Wii.h:35
    -
    int16_t accYnunchuck
    Definition: Wii.h:242
    -
    int16_t gyroYawZero
    Definition: Wii.h:276
    -
    double pitchGyroSpeed
    Definition: Wii.h:255
    -
    void pairWithWiimote()
    Definition: BTD.h:500
    -
    uint8_t getIRs2()
    Definition: Wii.h:332
    -
    double gyroPitch
    Definition: Wii.h:247
    +
    int16_t accYnunchuck
    Definition: Wii.h:225
    +
    int16_t gyroYawZero
    Definition: Wii.h:259
    +
    double pitchGyroSpeed
    Definition: Wii.h:238
    +
    void pairWithWiimote()
    Definition: BTD.h:464
    +
    uint8_t getIRs2()
    Definition: Wii.h:315
    +
    double gyroPitch
    Definition: Wii.h:230
    Definition: Wii.h:47
    -
    bool getButtonPress(ButtonEnum b)
    Definition: Wii.cpp:1041
    +
    bool getButtonPress(ButtonEnum b)
    Definition: Wii.cpp:1038
    -
    bool motionPlusConnected
    Definition: Wii.h:208
    -
    int16_t gyroRollZero
    Definition: Wii.h:277
    -
    virtual void Run()
    Definition: Wii.cpp:684
    -
    int16_t accXwiimote
    Definition: Wii.h:236
    -
    int16_t accZwiimote
    Definition: Wii.h:236
    +
    bool motionPlusConnected
    Definition: Wii.h:191
    +
    int16_t gyroRollZero
    Definition: Wii.h:260
    +
    void Run()
    Definition: Wii.cpp:681
    +
    int16_t accXwiimote
    Definition: Wii.h:219
    +
    int16_t accZwiimote
    Definition: Wii.h:219
    diff --git a/_wii_camera_readme_8md.html b/_wii_camera_readme_8md.html index 84c74590..a60c281d 100644 --- a/_wii_camera_readme_8md.html +++ b/_wii_camera_readme_8md.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: WiiCameraReadme.md File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -92,7 +93,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_wii_camera_readme_8md_source.html b/_wii_camera_readme_8md_source.html index cb258d86..a456bb65 100644 --- a/_wii_camera_readme_8md_source.html +++ b/_wii_camera_readme_8md_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: WiiCameraReadme.md Source File + @@ -31,7 +32,7 @@
    - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,27 +86,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    WiiCameraReadme.md
    -Go to the documentation of this file.
    1 Please see <http://wiibrew.org/wiki/Wiimote#IR_Camera> for the complete capabilities of the Wii camera. The IR camera code was written based on the above website and with support from Kristian Lauszus.
    +Go to the documentation of this file.
    1 Please see <http://wiibrew.org/wiki/Wiimote#IR_Camera> for the complete capabilities of the Wii camera. The IR camera code was written based on the above website and with support from Kristian Lauszus.
    2 
    -
    3 This library is large, if you run into memory problems when uploading to the Arduino, disable serial debugging.
    +
    3 This library is large, if you run into memory problems when uploading to the Arduino, disable serial debugging.
    4 
    -
    5 To enable the IR camera code, simply set ```ENABLE_WII_IR_CAMERA``` to 1 in [settings.h](settings.h).
    +
    5 To enable the IR camera code, simply set ```ENABLE_WII_IR_CAMERA``` to 1 in [settings.h](settings.h).
    6 
    7 This library implements the following settings:
    8 
    -
    9 * Report sensitivity mode: 00 00 00 00 00 00 90 00 41 40 00 Suggested by inio (high sensitivity)
    -
    10 * Data Format: Extended mode (0x03). Full mode is not working yet. The output reports 0x3e and 0x3f need tampering with
    -
    11  * In this mode the camera outputs x and y coordinates and a size dimension for the 4 brightest points.
    +
    9 * Report sensitivity mode: 00 00 00 00 00 00 90 00 41 40 00 Suggested by inio (high sensitivity)
    +
    10 * Data Format: Extended mode (0x03). Full mode is not working yet. The output reports 0x3e and 0x3f need tampering with
    +
    11  * In this mode the camera outputs x and y coordinates and a size dimension for the 4 brightest points.
    12 
    -
    13 Again, read through <http://wiibrew.org/wiki/Wiimote#IR_Camera> to get an understanding of the camera and its settings.
    -
    #define ENABLE_WII_IR_CAMERA
    Definition: settings.h:55
    -
    Definition: PS3Enums.h:125
    +
    13 Again, read through <http://wiibrew.org/wiki/Wiimote#IR_Camera> to get an understanding of the camera and its settings.
    diff --git a/_x_b_o_x_o_l_d_8cpp.html b/_x_b_o_x_o_l_d_8cpp.html index fc59f891..d51e4b33 100644 --- a/_x_b_o_x_o_l_d_8cpp.html +++ b/_x_b_o_x_o_l_d_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXOLD.cpp File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -97,7 +98,7 @@ Include dependency graph for XBOXOLD.cpp:
    - +

    Go to the source code of this file.

    @@ -150,7 +151,7 @@ Variables diff --git a/_x_b_o_x_o_l_d_8cpp__incl.map b/_x_b_o_x_o_l_d_8cpp__incl.map index f891722c..db35a5e0 100644 --- a/_x_b_o_x_o_l_d_8cpp__incl.map +++ b/_x_b_o_x_o_l_d_8cpp__incl.map @@ -1,5 +1,7 @@ - - - + + + + + diff --git a/_x_b_o_x_o_l_d_8cpp__incl.md5 b/_x_b_o_x_o_l_d_8cpp__incl.md5 index a14166fb..fc70e91c 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 @@ -824a8833fbb3f9293199791af2e49083 \ No newline at end of file +6ca487f1802363c83de863e788aae1c0 \ 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 e2f4427d1a85b67b7f874c72b61e0a0a96ea0e5d..a83a3b0c38b69102061af84aedf31957644ea8ea 100644 GIT binary patch literal 18252 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 Rm`4Br002ovPDHLkV1kW0wAugw literal 9475 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 - + USB Host Shield 2.0: XBOXOLD.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -161,12 +162,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    71  // get memory address of USB device address pool
    72  AddressPool &addrPool = pUsb->GetAddressPool();
    73 #ifdef EXTRADEBUG
    -
    74  Notify(PSTR("\r\nXBOXUSB Init"), 0x80);
    +
    74  Notify(PSTR("\r\nXBOXUSB Init"), 0x80);
    75 #endif
    76  // check if address has already been assigned to an instance
    77  if(bAddress) {
    78 #ifdef DEBUG_USB_HOST
    -
    79  Notify(PSTR("\r\nAddress in use"), 0x80);
    +
    79  Notify(PSTR("\r\nAddress in use"), 0x80);
    80 #endif
    82  }
    @@ -176,14 +177,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    86 
    87  if(!p) {
    88 #ifdef DEBUG_USB_HOST
    -
    89  Notify(PSTR("\r\nAddress not found"), 0x80);
    +
    89  Notify(PSTR("\r\nAddress not found"), 0x80);
    90 #endif
    92  }
    93 
    94  if(!p->epinfo) {
    95 #ifdef DEBUG_USB_HOST
    -
    96  Notify(PSTR("\r\nepinfo is null"), 0x80);
    +
    96  Notify(PSTR("\r\nepinfo is null"), 0x80);
    97 #endif
    99  }
    @@ -226,13 +227,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    136  addrPool.FreeAddress(bAddress);
    137  bAddress = 0;
    138 #ifdef DEBUG_USB_HOST
    -
    139  Notify(PSTR("\r\nsetAddr: "), 0x80);
    +
    139  Notify(PSTR("\r\nsetAddr: "), 0x80);
    140  D_PrintHex<uint8_t > (rcode, 0x80);
    141 #endif
    142  return rcode;
    143  }
    144 #ifdef EXTRADEBUG
    -
    145  Notify(PSTR("\r\nAddr: "), 0x80);
    +
    145  Notify(PSTR("\r\nAddr: "), 0x80);
    146  D_PrintHex<uint8_t > (bAddress, 0x80);
    147 #endif
    148  //delay(300); // Spec says you should wait at least 200ms
    @@ -257,13 +258,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    167 
    168  /* Initialize data structures for endpoints of device */
    169  epInfo[ XBOX_INPUT_PIPE ].epAddr = 0x01; // XBOX report endpoint
    - +
    171  epInfo[ XBOX_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    175  epInfo[ XBOX_OUTPUT_PIPE ].epAddr = 0x02; // XBOX output endpoint
    - +
    177  epInfo[ XBOX_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    @@ -280,7 +281,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    190  goto FailSetConfDescr;
    191 
    192 #ifdef DEBUG_USB_HOST
    -
    193  Notify(PSTR("\r\nXbox Controller Connected\r\n"), 0x80);
    +
    193  Notify(PSTR("\r\nXbox Controller Connected\r\n"), 0x80);
    194 #endif
    195  if(pFuncOnInit)
    196  pFuncOnInit(); // Call the user function
    @@ -315,7 +316,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    225 
    226 Fail:
    227 #ifdef DEBUG_USB_HOST
    -
    228  Notify(PSTR("\r\nXbox Init Failed, error code: "), 0x80);
    +
    228  Notify(PSTR("\r\nXbox Init Failed, error code: "), 0x80);
    229  NotifyFail(rcode);
    230 #endif
    231  Release();
    @@ -375,21 +376,21 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    285  return;
    286  for(uint8_t i = 0; i < length; i++) {
    287  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    -
    288  Notify(PSTR(" "), 0x80);
    +
    288  Notify(PSTR(" "), 0x80);
    289  }
    -
    290  Notify(PSTR("\r\n"), 0x80);
    +
    290  Notify(PSTR("\r\n"), 0x80);
    291 #endif
    292 }
    293 
    -
    295  uint8_t button = pgm_read_byte(&XBOXOLD_BUTTONS[(uint8_t)b]);
    +
    295  uint8_t button = pgm_read_byte(&XBOXOLD_BUTTONS[(uint8_t)b]);
    296  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
    297  return buttonValues[button]; // Analog buttons
    298  return (ButtonState & button); // Digital buttons
    299 }
    300 
    -
    302  uint8_t button = pgm_read_byte(&XBOXOLD_BUTTONS[(uint8_t)b]);
    +
    302  uint8_t button = pgm_read_byte(&XBOXOLD_BUTTONS[(uint8_t)b]);
    303  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
    304  if(buttonClicked[button]) {
    305  buttonClicked[button] = false;
    @@ -410,7 +411,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    320 /* Xbox Controller commands */
    321 void XBOXOLD::XboxCommand(uint8_t* data, uint16_t nbytes) {
    322  //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)
    -
    323  pUsb->ctrlReq(bAddress, epInfo[XBOX_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    +
    323  pUsb->ctrlReq(bAddress, epInfo[XBOX_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    324 }
    325 
    326 void XBOXOLD::setRumbleOn(uint8_t lValue, uint8_t rValue) {
    @@ -431,22 +432,26 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    EpInfo * epinfo
    Definition: address.h:76
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:81
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    uint8_t bmNakPower
    Definition: address.h:42
    -
    virtual uint8_t Release()
    Definition: XBOXOLD.cpp:236
    +
    uint8_t Release()
    Definition: XBOXOLD.cpp:236
    +
    #define HID_REQUEST_SET_REPORT
    Definition: hid.h:72
    #define NotifyFail(...)
    Definition: message.h:55
    AnalogHatEnum
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:805
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:808
    +
    #define bmREQ_HID_OUT
    Definition: hid.h:63
    +
    #define USB_TRANSFER_TYPE_INTERRUPT
    Definition: usb_ch9.h:86
    +
    #define pgm_read_byte(addr)
    void setRumbleOn(uint8_t lValue, uint8_t rValue)
    Definition: XBOXOLD.cpp:326
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    -
    #define XBOX_OLD_PID4
    Definition: XBOXOLD.h:43
    -
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXOLD.h:159
    -
    #define EP_MAXPKTSIZE
    Definition: PS3USB.h:25
    +
    #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
    @@ -455,54 +460,52 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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:796
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    uint8_t epAddr
    Definition: address.h:33
    #define NotifyFailUnknownDevice(...)
    Definition: message.h:54
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    int16_t getAnalogHat(AnalogHatEnum a)
    Definition: XBOXOLD.cpp:316
    -
    #define XBOX_VID
    Definition: XBOXOLD.h:36
    -
    #define XBOX_INPUT_PIPE
    Definition: XBOXOLD.h:32
    +
    #define XBOX_VID
    Definition: XBOXOLD.h:34
    +
    #define XBOX_INPUT_PIPE
    Definition: XBOXOLD.h:30
    XBOXOLD(USB *pUsb)
    Definition: XBOXOLD.cpp:47
    -
    #define EP_INTERRUPT
    Definition: PS3USB.h:28
    -
    #define XBOX_OLD_PID1
    Definition: XBOXOLD.h:40
    +
    #define XBOX_OLD_PID1
    Definition: XBOXOLD.h:38
    Definition: address.h:32
    ButtonEnum
    -
    #define HID_REQUEST_SET_REPORT
    Definition: BTD.h:39
    -
    #define JOYTECH_VID
    Definition: XBOXOLD.h:38
    -
    USB * pUsb
    Definition: XBOXOLD.h:155
    +
    #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:83
    -
    virtual uint8_t Poll()
    Definition: XBOXOLD.cpp:244
    -
    #define XBOX_OLD_PID2
    Definition: XBOXOLD.h:41
    -
    #define MADCATZ_VID
    Definition: XBOXOLD.h:37
    -
    #define XBOX_OUTPUT_PIPE
    Definition: XBOXOLD.h:33
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    +
    #define PSTR(str)
    +
    uint8_t Poll()
    Definition: XBOXOLD.cpp:244
    +
    #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:80
    +
    #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)
    Definition: Usb.cpp:206
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXOLD.cpp:62
    -
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXOLD.h:49
    -
    #define XBOX_OLD_PID3
    Definition: XBOXOLD.h:42
    -
    #define bmREQ_HID_OUT
    Definition: BTD.h:38
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:78
    -
    bool XboxConnected
    Definition: XBOXOLD.h:147
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXOLD.cpp:62
    +
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXOLD.h:43
    +
    #define XBOX_OLD_PID3
    Definition: XBOXOLD.h:40
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    +
    bool XboxConnected
    Definition: XBOXOLD.h:141
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:206
    -
    Definition: UsbCore.h:190
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    +
    Definition: UsbCore.h:197
    bool getButtonClick(ButtonEnum b)
    Definition: XBOXOLD.cpp:301
    uint8_t getButtonPress(ButtonEnum b)
    Definition: XBOXOLD.cpp:294
    -
    #define XBOX_CONTROL_PIPE
    Definition: XBOXOLD.h:31
    -
    uint8_t bAddress
    Definition: XBOXOLD.h:157
    +
    #define XBOX_CONTROL_PIPE
    Definition: XBOXOLD.h:29
    +
    uint8_t bAddress
    Definition: XBOXOLD.h:151
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:210
    +
    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:761
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:764
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    @@ -510,7 +513,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/_x_b_o_x_o_l_d_8h.html b/_x_b_o_x_o_l_d_8h.html index d2fc7a6c..91f38801 100644 --- a/_x_b_o_x_o_l_d_8h.html +++ b/_x_b_o_x_o_l_d_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXOLD.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -93,13 +94,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #include "Usb.h"
    +#include "hid.h"
    #include "controllerEnums.h"
    Include dependency graph for XBOXOLD.h:
    - +
    This graph shows which files directly or indirectly include this file:
    @@ -120,8 +122,6 @@ Classes Macros #define EP_MAXPKTSIZE   32   -#define EP_INTERRUPT   0x03 -  #define XBOX_CONTROL_PIPE   0   #define XBOX_INPUT_PIPE   1 @@ -142,10 +142,6 @@ Macros   #define XBOX_OLD_PID4   0x0289   -#define bmREQ_HID_OUT   USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE -  -#define HID_REQUEST_SET_REPORT   0x09 -  #define XBOX_MAX_ENDPOINTS   3   @@ -160,21 +156,7 @@ Macros
    -

    Definition at line 25 of file XBOXOLD.h.

    - -
    -
    - -
    -
    - - - - -
    #define EP_INTERRUPT   0x03
    -
    - -

    Definition at line 28 of file XBOXOLD.h.

    +

    Definition at line 26 of file XBOXOLD.h.

    @@ -188,7 +170,7 @@ Macros
    -

    Definition at line 31 of file XBOXOLD.h.

    +

    Definition at line 29 of file XBOXOLD.h.

    @@ -202,7 +184,7 @@ Macros
    -

    Definition at line 32 of file XBOXOLD.h.

    +

    Definition at line 30 of file XBOXOLD.h.

    @@ -216,7 +198,7 @@ Macros
    -

    Definition at line 33 of file XBOXOLD.h.

    +

    Definition at line 31 of file XBOXOLD.h.

    @@ -230,7 +212,7 @@ Macros
    -

    Definition at line 36 of file XBOXOLD.h.

    +

    Definition at line 34 of file XBOXOLD.h.

    @@ -244,7 +226,7 @@ Macros
    -

    Definition at line 37 of file XBOXOLD.h.

    +

    Definition at line 35 of file XBOXOLD.h.

    @@ -258,7 +240,7 @@ Macros
    -

    Definition at line 38 of file XBOXOLD.h.

    +

    Definition at line 36 of file XBOXOLD.h.

    @@ -272,7 +254,7 @@ Macros
    -

    Definition at line 40 of file XBOXOLD.h.

    +

    Definition at line 38 of file XBOXOLD.h.

    @@ -286,7 +268,7 @@ Macros
    -

    Definition at line 41 of file XBOXOLD.h.

    +

    Definition at line 39 of file XBOXOLD.h.

    @@ -300,7 +282,7 @@ Macros
    -

    Definition at line 42 of file XBOXOLD.h.

    +

    Definition at line 40 of file XBOXOLD.h.

    @@ -314,35 +296,7 @@ Macros
    -

    Definition at line 43 of file XBOXOLD.h.

    - -
    - - -
    -
    - -

    Definition at line 46 of file XBOXOLD.h.

    - -
    -
    - -
    -
    - - - - -
    #define HID_REQUEST_SET_REPORT   0x09
    -
    - -

    Definition at line 47 of file XBOXOLD.h.

    +

    Definition at line 41 of file XBOXOLD.h.

    @@ -356,7 +310,7 @@ Macros
    -

    Definition at line 49 of file XBOXOLD.h.

    +

    Definition at line 43 of file XBOXOLD.h.

    @@ -365,7 +319,7 @@ Macros diff --git a/_x_b_o_x_o_l_d_8h__dep__incl.md5 b/_x_b_o_x_o_l_d_8h__dep__incl.md5 index 0678f7d2..cc366f2a 100644 --- a/_x_b_o_x_o_l_d_8h__dep__incl.md5 +++ b/_x_b_o_x_o_l_d_8h__dep__incl.md5 @@ -1 +1 @@ -4624e3aee3651b0e57e6bf6ae6dd27ec \ No newline at end of file +82c0a98cce5027def9ffaed26c3bac43 \ No newline at end of file diff --git a/_x_b_o_x_o_l_d_8h__incl.map b/_x_b_o_x_o_l_d_8h__incl.map index becbba3c..33e489b5 100644 --- a/_x_b_o_x_o_l_d_8h__incl.map +++ b/_x_b_o_x_o_l_d_8h__incl.map @@ -1,4 +1,6 @@ - - + + + + diff --git a/_x_b_o_x_o_l_d_8h__incl.md5 b/_x_b_o_x_o_l_d_8h__incl.md5 index f13dfbe6..0d076c8d 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 @@ -6940d62d40c6dde15fe74f063d6e1a3a \ No newline at end of file +dd156c3d5965e1290a24adfc14d297d7 \ 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 111db7ca8017e9ccf9b33784e2ac5c5805850227..708e1e4f6b562f6292bdc452c729c9588a6dff28 100644 GIT binary patch literal 15230 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 literal 6737 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 - + USB Host Shield 2.0: XBOXOLD.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -110,139 +111,134 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    19 #define _xboxold_h_
    20 
    21 #include "Usb.h"
    -
    22 #include "controllerEnums.h"
    -
    23 
    -
    24 /* Data Xbox taken from descriptors */
    -
    25 #define EP_MAXPKTSIZE 32 // Max size for data via USB
    -
    26 
    -
    27 /* Endpoint types */
    -
    28 #define EP_INTERRUPT 0x03
    -
    29 
    -
    30 /* Names we give to the 3 Xbox pipes */
    -
    31 #define XBOX_CONTROL_PIPE 0
    -
    32 #define XBOX_INPUT_PIPE 1
    -
    33 #define XBOX_OUTPUT_PIPE 2
    -
    34 
    -
    35 // PID and VID of the different devices
    -
    36 #define XBOX_VID 0x045E // Microsoft Corporation
    -
    37 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz controllers
    -
    38 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    -
    39 
    -
    40 #define XBOX_OLD_PID1 0x0202 // Original Microsoft Xbox controller (US)
    -
    41 #define XBOX_OLD_PID2 0x0285 // Original Microsoft Xbox controller (Japan)
    -
    42 #define XBOX_OLD_PID3 0x0287 // Microsoft Microsoft Xbox Controller S
    -
    43 #define XBOX_OLD_PID4 0x0289 // Smaller Microsoft Xbox controller (US)
    +
    22 #include "hid.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 
    -
    45 // Used in control endpoint header for HID Commands
    -
    46 #define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    -
    47 #define HID_REQUEST_SET_REPORT 0x09
    -
    48 
    -
    49 #define XBOX_MAX_ENDPOINTS 3
    -
    50 
    -
    52 class XBOXOLD : public USBDeviceConfig {
    -
    53 public:
    -
    58  XBOXOLD(USB *pUsb);
    -
    59 
    -
    68  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    73  virtual uint8_t Release();
    -
    78  virtual uint8_t Poll();
    -
    79 
    -
    84  virtual uint8_t GetAddress() {
    -
    85  return bAddress;
    -
    86  };
    -
    87 
    -
    92  virtual bool isReady() {
    -
    93  return bPollEnable;
    -
    94  };
    -
    95 
    -
    102  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    103  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));
    -
    104  };
    -
    118  uint8_t getButtonPress(ButtonEnum b);
    -
    119  bool getButtonClick(ButtonEnum b);
    -
    128  int16_t getAnalogHat(AnalogHatEnum a);
    -
    129 
    -
    131  void setRumbleOff() {
    -
    132  setRumbleOn(0, 0);
    -
    133  };
    -
    139  void setRumbleOn(uint8_t lValue, uint8_t rValue);
    -
    140 
    -
    145  void attachOnInit(void (*funcOnInit)(void)) {
    -
    146  pFuncOnInit = funcOnInit;
    -
    147  };
    -
    151  bool XboxConnected;
    -
    152 
    -
    153 protected:
    - -
    157  uint8_t bAddress;
    - -
    160 
    -
    161 private:
    -
    167  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    168 
    -
    169  bool bPollEnable;
    -
    170 
    -
    171  /* Variables to store the digital buttons */
    -
    172  uint8_t ButtonState;
    -
    173  uint8_t OldButtonState;
    -
    174  uint8_t ButtonClickState;
    -
    175 
    -
    176  /* Variables to store the analog buttons */
    -
    177  uint8_t buttonValues[8]; // A, B, X, Y, BLACK, WHITE, L1, and R1
    -
    178  uint8_t oldButtonValues[8];
    -
    179  bool buttonClicked[8];
    -
    180 
    -
    181  int16_t hatValue[4]; // Joystick values
    -
    182 
    -
    183  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    -
    184 
    -
    185  void readReport(); // Read incoming data
    -
    186  void printReport(uint16_t length); // Print incoming date
    -
    187 
    -
    188  /* Private commands */
    -
    189  void XboxCommand(uint8_t* data, uint16_t nbytes);
    -
    190 };
    -
    191 #endif
    -
    virtual uint8_t Release()
    Definition: XBOXOLD.cpp:236
    -
    void attachOnInit(void(*funcOnInit)(void))
    Definition: XBOXOLD.h:145
    +
    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:236
    +
    void attachOnInit(void(*funcOnInit)(void))
    Definition: XBOXOLD.h:139
    +
    AnalogHatEnum
    -
    virtual uint8_t GetAddress()
    Definition: XBOXOLD.h:84
    - +
    virtual uint8_t GetAddress()
    Definition: XBOXOLD.h:78
    + - +
    void setRumbleOn(uint8_t lValue, uint8_t rValue)
    Definition: XBOXOLD.cpp:326
    -
    virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: XBOXOLD.h:102
    -
    #define XBOX_OLD_PID4
    Definition: XBOXOLD.h:43
    -
    virtual bool isReady()
    Definition: XBOXOLD.h:92
    -
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXOLD.h:159
    +
    #define XBOX_OLD_PID4
    Definition: XBOXOLD.h:41
    +
    virtual bool isReady()
    Definition: XBOXOLD.h:86
    +
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXOLD.h:153
    int16_t getAnalogHat(AnalogHatEnum a)
    Definition: XBOXOLD.cpp:316
    -
    #define XBOX_VID
    Definition: XBOXOLD.h:36
    +
    #define XBOX_VID
    Definition: XBOXOLD.h:34
    XBOXOLD(USB *pUsb)
    Definition: XBOXOLD.cpp:47
    -
    #define XBOX_OLD_PID1
    Definition: XBOXOLD.h:40
    +
    #define XBOX_OLD_PID1
    Definition: XBOXOLD.h:38
    Definition: address.h:32
    ButtonEnum
    -
    #define JOYTECH_VID
    Definition: XBOXOLD.h:38
    -
    USB * pUsb
    Definition: XBOXOLD.h:155
    -
    virtual uint8_t Poll()
    Definition: XBOXOLD.cpp:244
    -
    #define XBOX_OLD_PID2
    Definition: XBOXOLD.h:41
    -
    #define MADCATZ_VID
    Definition: XBOXOLD.h:37
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXOLD.cpp:62
    -
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXOLD.h:49
    -
    #define XBOX_OLD_PID3
    Definition: XBOXOLD.h:42
    -
    bool XboxConnected
    Definition: XBOXOLD.h:147
    -
    Definition: UsbCore.h:190
    +
    #define JOYTECH_VID
    Definition: XBOXOLD.h:36
    +
    USB * pUsb
    Definition: XBOXOLD.h:149
    +
    uint8_t Poll()
    Definition: XBOXOLD.cpp:244
    +
    #define XBOX_OLD_PID2
    Definition: XBOXOLD.h:39
    +
    #define MADCATZ_VID
    Definition: XBOXOLD.h:35
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXOLD.cpp:62
    +
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXOLD.h:43
    +
    #define XBOX_OLD_PID3
    Definition: XBOXOLD.h:40
    +
    bool XboxConnected
    Definition: XBOXOLD.h:141
    +
    Definition: UsbCore.h:197
    bool getButtonClick(ButtonEnum b)
    Definition: XBOXOLD.cpp:301
    -
    void setRumbleOff()
    Definition: XBOXOLD.h:131
    +
    void setRumbleOff()
    Definition: XBOXOLD.h:125
    uint8_t getButtonPress(ButtonEnum b)
    Definition: XBOXOLD.cpp:294
    -
    uint8_t bAddress
    Definition: XBOXOLD.h:157
    -
    #define EP_MAXPKTSIZE
    Definition: XBOXOLD.h:25
    +
    uint8_t bAddress
    Definition: XBOXOLD.h:151
    +
    virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: XBOXOLD.h:96
    +
    #define EP_MAXPKTSIZE
    Definition: XBOXOLD.h:26
    diff --git a/_x_b_o_x_o_n_e_8cpp.html b/_x_b_o_x_o_n_e_8cpp.html new file mode 100644 index 00000000..95b7c608 --- /dev/null +++ b/_x_b_o_x_o_n_e_8cpp.html @@ -0,0 +1,111 @@ + + + + + + +USB Host Shield 2.0: XBOXONE.cpp File Reference + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    XBOXONE.cpp File Reference
    +
    +
    +
    #include "XBOXONE.h"
    +
    +Include dependency graph for XBOXONE.cpp:
    +
    +
    + + +
    +
    +

    Go to the source code of this file.

    +
    + + + + diff --git a/_x_b_o_x_o_n_e_8cpp__incl.map b/_x_b_o_x_o_n_e_8cpp__incl.map new file mode 100644 index 00000000..975bd31d --- /dev/null +++ b/_x_b_o_x_o_n_e_8cpp__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/_x_b_o_x_o_n_e_8cpp__incl.md5 b/_x_b_o_x_o_n_e_8cpp__incl.md5 new file mode 100644 index 00000000..adfce4de --- /dev/null +++ b/_x_b_o_x_o_n_e_8cpp__incl.md5 @@ -0,0 +1 @@ +a31c4a2760319c972359266d1c3ccfe5 \ No newline at end of file diff --git a/_x_b_o_x_o_n_e_8cpp__incl.png b/_x_b_o_x_o_n_e_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..48da411f309dbe145a074afc8bdd4d4884c7aa52 GIT binary patch literal 11989 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 + + + + + +USB Host Shield 2.0: XBOXONE.cpp Source File + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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].epAttribs = 0;
    + +
    36  }
    +
    37 
    +
    38  if(pUsb) // register in USB subsystem
    +
    39  pUsb->RegisterDeviceClass(this); //set devConfig[] entry
    +
    40 }
    +
    41 
    +
    42 uint8_t XBOXONE::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    +
    43  uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)];
    +
    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;
    +
    49  uint16_t VID;
    +
    50 
    +
    51  // get memory address of USB device address pool
    +
    52  AddressPool &addrPool = pUsb->GetAddressPool();
    +
    53 #ifdef EXTRADEBUG
    +
    54  Notify(PSTR("\r\nXBOXONE Init"), 0x80);
    +
    55 #endif
    +
    56  // check if address has already been assigned to an instance
    +
    57  if(bAddress) {
    +
    58 #ifdef DEBUG_USB_HOST
    +
    59  Notify(PSTR("\r\nAddress in use"), 0x80);
    +
    60 #endif
    + +
    62  }
    +
    63 
    +
    64  // Get pointer to pseudo device with address 0 assigned
    +
    65  p = addrPool.GetUsbDevicePtr(0);
    +
    66 
    +
    67  if(!p) {
    +
    68 #ifdef DEBUG_USB_HOST
    +
    69  Notify(PSTR("\r\nAddress not found"), 0x80);
    +
    70 #endif
    + +
    72  }
    +
    73 
    +
    74  if(!p->epinfo) {
    +
    75 #ifdef DEBUG_USB_HOST
    +
    76  Notify(PSTR("\r\nepinfo is null"), 0x80);
    +
    77 #endif
    + +
    79  }
    +
    80 
    +
    81  // Save old pointer to EP_RECORD of address 0
    +
    82  oldep_ptr = p->epinfo;
    +
    83 
    +
    84  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    +
    85  p->epinfo = epInfo;
    +
    86 
    +
    87  p->lowspeed = lowspeed;
    +
    88 
    +
    89  // Get device descriptor
    +
    90  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Get device descriptor - addr, ep, nbytes, data
    +
    91  // Restore p->epinfo
    +
    92  p->epinfo = oldep_ptr;
    +
    93 
    +
    94  if(rcode)
    +
    95  goto FailGetDevDescr;
    +
    96 
    +
    97  VID = udd->idVendor;
    +
    98  PID = udd->idProduct;
    +
    99 
    +
    100  if(!VIDPIDOK(VID, PID)) // Check VID
    +
    101  goto FailUnknownDevice;
    +
    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 device descriptor
    +
    110  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    +
    111 
    +
    112  // Assign new address to the device
    +
    113  rcode = pUsb->setAddr(0, 0, bAddress);
    +
    114  if(rcode) {
    +
    115  p->lowspeed = false;
    +
    116  addrPool.FreeAddress(bAddress);
    +
    117  bAddress = 0;
    +
    118 #ifdef DEBUG_USB_HOST
    +
    119  Notify(PSTR("\r\nsetAddr: "), 0x80);
    +
    120  D_PrintHex<uint8_t > (rcode, 0x80);
    +
    121 #endif
    +
    122  return rcode;
    +
    123  }
    +
    124 #ifdef EXTRADEBUG
    +
    125  Notify(PSTR("\r\nAddr: "), 0x80);
    +
    126  D_PrintHex<uint8_t > (bAddress, 0x80);
    +
    127 #endif
    +
    128  //delay(300); // Spec says you should wait at least 200ms
    +
    129 
    +
    130  p->lowspeed = false;
    +
    131 
    +
    132  //get pointer to assigned address record
    +
    133  p = addrPool.GetUsbDevicePtr(bAddress);
    +
    134  if(!p)
    + +
    136 
    +
    137  p->lowspeed = lowspeed;
    +
    138 
    +
    139  // Assign epInfo to epinfo pointer - only EP0 is known
    +
    140  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    +
    141  if(rcode)
    +
    142  goto FailSetDevTblEntry;
    +
    143 
    +
    144  /* The application will work in reduced host mode, so we can save program and data
    +
    145  memory space. After verifying the VID we will use known values for the
    +
    146  configuration values for device, interface, endpoints and HID for the XBOXONE Controllers */
    +
    147 
    +
    148  /* Initialize data structures for endpoints of device */
    +
    149  epInfo[ XBOX_OUTPUT_PIPE ].epAddr = 0x01; // XBOX one output endpoint
    + +
    151  epInfo[ XBOX_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    + + + +
    155  epInfo[ XBOX_INPUT_PIPE ].epAddr = 0x01; // XBOX one input endpoint
    + +
    157  epInfo[ XBOX_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    + + + +
    161 
    +
    162  rcode = pUsb->setEpInfoEntry(bAddress, 3, epInfo);
    +
    163  if(rcode)
    +
    164  goto FailSetDevTblEntry;
    +
    165 
    +
    166  delay(200); // Give time for address change
    +
    167 
    +
    168  rcode = pUsb->setConf(bAddress, epInfo[ XBOX_CONTROL_PIPE ].epAddr, 1);
    +
    169  if(rcode)
    +
    170  goto FailSetConfDescr;
    +
    171 
    +
    172 #ifdef DEBUG_USB_HOST
    +
    173  Notify(PSTR("\r\nXbox One Controller Connected\r\n"), 0x80);
    +
    174 #endif
    +
    175 
    +
    176  delay(200); // let things settle
    +
    177 
    +
    178  // initialize the controller for input
    +
    179  writeBuf[0] = 0x05;
    +
    180  writeBuf[1] = 0x20;
    +
    181  rcode = XboxCommand(writeBuf, 2);
    +
    182  if (rcode)
    +
    183  goto Fail;
    +
    184 
    +
    185  onInit();
    +
    186  XboxOneConnected = true;
    +
    187  bPollEnable = true;
    +
    188  return 0; // Successful configuration
    +
    189 
    +
    190  /* Diagnostic messages */
    +
    191 FailGetDevDescr:
    +
    192 #ifdef DEBUG_USB_HOST
    + +
    194  goto Fail;
    +
    195 #endif
    +
    196 
    +
    197 FailSetDevTblEntry:
    +
    198 #ifdef DEBUG_USB_HOST
    + +
    200  goto Fail;
    +
    201 #endif
    +
    202 
    +
    203 FailSetConfDescr:
    +
    204 #ifdef DEBUG_USB_HOST
    + +
    206 #endif
    +
    207  goto Fail;
    +
    208 
    +
    209 FailUnknownDevice:
    +
    210 #ifdef DEBUG_USB_HOST
    +
    211  NotifyFailUnknownDevice(VID, PID);
    +
    212 #endif
    + +
    214 
    +
    215 Fail:
    +
    216 #ifdef DEBUG_USB_HOST
    +
    217  Notify(PSTR("\r\nXbox One Init Failed, error code: "), 0x80);
    +
    218  NotifyFail(rcode);
    +
    219 #endif
    +
    220  Release();
    +
    221  return rcode;
    +
    222 }
    +
    223 
    +
    224 /* Performs a cleanup after failed Init() attempt */
    +
    225 uint8_t XBOXONE::Release() {
    +
    226  XboxOneConnected = false;
    + +
    228  bAddress = 0;
    +
    229  bPollEnable = false;
    +
    230 #ifdef DEBUG_USB_HOST
    +
    231  Notify(PSTR("\r\nXbox One Controller Disconnected\r\n"), 0x80);
    +
    232 #endif
    +
    233  return 0;
    +
    234 }
    +
    235 
    +
    236 uint8_t XBOXONE::Poll() {
    +
    237  if(!bPollEnable)
    +
    238  return 0;
    +
    239  uint16_t BUFFER_SIZE = EP_MAXPKTSIZE;
    +
    240  uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[ XBOX_INPUT_PIPE ].epAddr, &BUFFER_SIZE, readBuf);
    +
    241  if (!rcode) {
    +
    242  readReport();
    +
    243 #ifdef PRINTREPORT
    +
    244  printReport(); // Uncomment "#define PRINTREPORT" to print the report send by the Xbox ONE Controller
    +
    245 #endif
    +
    246  }
    +
    247 #ifdef DEBUG_USB_HOST
    +
    248  else if (rcode != 0x04) { // not a matter of no update to send
    +
    249  Notify(PSTR("\r\nXbox One Poll Failed, error code: "), 0x80);
    +
    250  NotifyFail(rcode);
    +
    251  }
    +
    252 #endif
    +
    253  return rcode;
    +
    254 }
    +
    255 
    +
    256 void XBOXONE::readReport() {
    +
    257  if(readBuf == NULL)
    +
    258  return;
    +
    259  if(readBuf[0] == 0x07) {
    +
    260  // The XBOX button has a separate message
    +
    261  if(readBuf[4] == 1)
    +
    262  ButtonState |= XBOX_BUTTONS[XBOX];
    +
    263  else
    +
    264  ButtonState &= ~XBOX_BUTTONS[XBOX];
    +
    265  }
    +
    266  if(readBuf[0] != 0x20) { // Check if it's the correct report, otherwise return - the controller also sends different status reports
    +
    267 #ifdef EXTRADEBUG
    +
    268  Notify(PSTR("\r\nXbox Poll: "), 0x80);
    +
    269  D_PrintHex<uint8_t > (readBuf[0], 0x80); // 0x03 is a heart beat report!
    +
    270 #endif
    +
    271  return;
    +
    272  }
    +
    273 
    +
    274  uint16_t xbox = ButtonState & XBOX_BUTTONS[XBOX]; // Since the XBOX button is separate, save it and add it back in
    +
    275  // xbox button from before, dpad, abxy, start/back, sync, stick click, shoulder buttons
    +
    276  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);
    +
    277 
    +
    278  triggerValue[0] = (uint16_t)(((uint16_t)readBuf[7] << 8) | readBuf[6]);
    +
    279  triggerValue[1] = (uint16_t)(((uint16_t)readBuf[9] << 8) | readBuf[8]);
    +
    280 
    +
    281  hatValue[LeftHatX] = (int16_t)(((uint16_t)readBuf[11] << 8) | readBuf[10]);
    +
    282  hatValue[LeftHatY] = (int16_t)(((uint16_t)readBuf[13] << 8) | readBuf[12]);
    +
    283  hatValue[RightHatX] = (int16_t)(((uint16_t)readBuf[15] << 8) | readBuf[14]);
    +
    284  hatValue[RightHatY] = (int16_t)(((uint16_t)readBuf[17] << 8) | readBuf[16]);
    +
    285 
    +
    286  //Notify(PSTR("\r\nButtonState"), 0x80);
    +
    287  //PrintHex<uint16_t>(ButtonState, 0x80);
    +
    288 
    +
    289  if(ButtonState != OldButtonState) {
    +
    290  ButtonClickState = ButtonState & ~OldButtonState; // Update click state variable
    +
    291  OldButtonState = ButtonState;
    +
    292  }
    +
    293 
    +
    294  // Handle click detection for triggers
    +
    295  if(triggerValue[0] != 0 && triggerValueOld[0] == 0)
    +
    296  L2Clicked = true;
    +
    297  triggerValueOld[0] = triggerValue[0];
    +
    298  if(triggerValue[1] != 0 && triggerValueOld[1] == 0)
    +
    299  R2Clicked = true;
    +
    300  triggerValueOld[1] = triggerValue[1];
    +
    301 }
    +
    302 
    +
    303 void XBOXONE::printReport() { //Uncomment "#define PRINTREPORT" to print the report send by the Xbox ONE Controller
    +
    304 #ifdef PRINTREPORT
    +
    305  if(readBuf == NULL)
    +
    306  return;
    +
    307  for(uint8_t i = 0; i < XBOX_REPORT_BUFFER_SIZE; i++) {
    +
    308  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    +
    309  Notify(PSTR(" "), 0x80);
    +
    310  }
    +
    311  Notify(PSTR("\r\n"), 0x80);
    +
    312 #endif
    +
    313 }
    +
    314 
    + +
    316  if(b == L2) // These are analog buttons
    +
    317  return triggerValue[0];
    +
    318  else if(b == R2)
    +
    319  return triggerValue[1];
    +
    320  return (bool)(ButtonState & ((uint16_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b])));
    +
    321 }
    +
    322 
    + +
    324  if(b == L2) {
    +
    325  if(L2Clicked) {
    +
    326  L2Clicked = false;
    +
    327  return true;
    +
    328  }
    +
    329  return false;
    +
    330  } else if(b == R2) {
    +
    331  if(R2Clicked) {
    +
    332  R2Clicked = false;
    +
    333  return true;
    +
    334  }
    +
    335  return false;
    +
    336  }
    +
    337  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    +
    338  bool click = (ButtonClickState & button);
    +
    339  ButtonClickState &= ~button; // clear "click" event
    +
    340  return click;
    +
    341 }
    +
    342 
    + +
    344  return hatValue[a];
    +
    345 }
    +
    346 
    +
    347 /* Xbox Controller commands */
    +
    348 uint8_t XBOXONE::XboxCommand(uint8_t* data, uint16_t nbytes) {
    +
    349  uint8_t rcode = pUsb->outTransfer(bAddress, epInfo[ XBOX_OUTPUT_PIPE ].epAddr, nbytes, data);
    +
    350 #ifdef DEBUG_USB_HOST
    +
    351  Notify(PSTR("\r\nXboxCommand, Return: "), 0x80);
    +
    352  D_PrintHex<uint8_t > (rcode, 0x80);
    +
    353 #endif
    +
    354  return rcode;
    +
    355 }
    +
    356 
    +
    357 void XBOXONE::onInit() {
    +
    358  // a short buzz to show the controller is active
    +
    359  writeBuf[0] = 0x09;
    +
    360  writeBuf[1] = 0x08;
    +
    361  writeBuf[2] = 0x00;
    +
    362  writeBuf[3] = 0x09;
    +
    363  writeBuf[4] = 0x00;
    +
    364  writeBuf[5] = 0x0f;
    +
    365  writeBuf[6] = 0x04;
    +
    366  writeBuf[7] = 0x04;
    +
    367  writeBuf[8] = 0x20;
    +
    368  writeBuf[9] = 0x20;
    +
    369  writeBuf[10] = 0x80;
    +
    370  XboxCommand(writeBuf, 11);
    +
    371 
    +
    372  if(pFuncOnInit)
    +
    373  pFuncOnInit(); // Call the user function
    +
    374 }
    +
    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:808
    +
    uint8_t bAddress
    Definition: XBOXONE.h:138
    +
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXONE.h:140
    +
    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
    +
    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:799
    +
    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:225
    +
    #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:292
    +
    ButtonEnum
    +
    virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: XBOXONE.h:96
    + +
    uint16_t getButtonPress(ButtonEnum b)
    Definition: XBOXONE.cpp:315
    +
    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:323
    +
    virtual uint8_t Poll()
    Definition: XBOXONE.cpp:236
    +
    #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
    +
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data)
    Definition: Usb.cpp:206
    +
    #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:42
    +
    #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:343
    + + +
    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:764
    +
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    + +
    + + + + diff --git a/_x_b_o_x_o_n_e_8h.html b/_x_b_o_x_o_n_e_8h.html new file mode 100644 index 00000000..902621b7 --- /dev/null +++ b/_x_b_o_x_o_n_e_8h.html @@ -0,0 +1,260 @@ + + + + + + +USB Host Shield 2.0: XBOXONE.h File Reference + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    XBOXONE.h File Reference
    +
    +
    +
    #include "Usb.h"
    +#include "xboxEnums.h"
    +
    +Include dependency graph for XBOXONE.h:
    +
    +
    + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + +
    +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  XBOXONE
     
    + + + + + + + + + + + + + + + + + +

    +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
     
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define EP_MAXPKTSIZE   32
    +
    + +

    Definition at line 30 of file XBOXONE.h.

    + +
    +
    + +
    +
    + + + + +
    #define XBOX_CONTROL_PIPE   0
    +
    + +

    Definition at line 33 of file XBOXONE.h.

    + +
    +
    + +
    +
    + + + + +
    #define XBOX_OUTPUT_PIPE   1
    +
    + +

    Definition at line 34 of file XBOXONE.h.

    + +
    +
    + +
    +
    + + + + +
    #define XBOX_INPUT_PIPE   2
    +
    + +

    Definition at line 35 of file XBOXONE.h.

    + +
    +
    + +
    +
    + + + + +
    #define XBOX_VID   0x045E
    +
    + +

    Definition at line 38 of file XBOXONE.h.

    + +
    +
    + +
    +
    + + + + +
    #define XBOX_ONE_PID   0x02D1
    +
    + +

    Definition at line 39 of file XBOXONE.h.

    + +
    +
    + +
    +
    + + + + +
    #define XBOX_REPORT_BUFFER_SIZE   14
    +
    + +

    Definition at line 41 of file XBOXONE.h.

    + +
    +
    + +
    +
    + + + + +
    #define XBOX_MAX_ENDPOINTS   3
    +
    + +

    Definition at line 43 of file XBOXONE.h.

    + +
    +
    +
    + + + + diff --git a/_x_b_o_x_o_n_e_8h__dep__incl.map b/_x_b_o_x_o_n_e_8h__dep__incl.map new file mode 100644 index 00000000..ece7b3d2 --- /dev/null +++ b/_x_b_o_x_o_n_e_8h__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/_x_b_o_x_o_n_e_8h__dep__incl.md5 b/_x_b_o_x_o_n_e_8h__dep__incl.md5 new file mode 100644 index 00000000..c13f788f --- /dev/null +++ b/_x_b_o_x_o_n_e_8h__dep__incl.md5 @@ -0,0 +1 @@ +fd61d6c8f3280fcb7695abf658ecef71 \ No newline at end of file diff --git a/_x_b_o_x_o_n_e_8h__dep__incl.png b/_x_b_o_x_o_n_e_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..9ddbb2a6ef06021651e4bf0a03d6b9be4a8bf720 GIT binary patch literal 4333 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 literal 0 HcmV?d00001 diff --git a/_x_b_o_x_o_n_e_8h__incl.map b/_x_b_o_x_o_n_e_8h__incl.map new file mode 100644 index 00000000..f75f1482 --- /dev/null +++ b/_x_b_o_x_o_n_e_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/_x_b_o_x_o_n_e_8h__incl.md5 b/_x_b_o_x_o_n_e_8h__incl.md5 new file mode 100644 index 00000000..14781353 --- /dev/null +++ b/_x_b_o_x_o_n_e_8h__incl.md5 @@ -0,0 +1 @@ +0dde0ce6aa02e651aff1df3147ecf48a \ No newline at end of file diff --git a/_x_b_o_x_o_n_e_8h__incl.png b/_x_b_o_x_o_n_e_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9e64918f0e7575d19279f93550daaefcee5141 GIT binary patch literal 9070 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 literal 0 HcmV?d00001 diff --git a/_x_b_o_x_o_n_e_8h_source.html b/_x_b_o_x_o_n_e_8h_source.html new file mode 100644 index 00000000..0129a6dc --- /dev/null +++ b/_x_b_o_x_o_n_e_8h_source.html @@ -0,0 +1,233 @@ + + + + + + +USB Host Shield 2.0: XBOXONE.h Source File + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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 boolean 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
    +
    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:225
    +
    Definition: address.h:32
    +
    ButtonEnum
    +
    virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: XBOXONE.h:96
    +
    uint16_t getButtonPress(ButtonEnum b)
    Definition: XBOXONE.cpp:315
    +
    virtual uint8_t GetAddress()
    Definition: XBOXONE.h:78
    +
    #define EP_MAXPKTSIZE
    Definition: XBOXONE.h:30
    +
    bool getButtonClick(ButtonEnum b)
    Definition: XBOXONE.cpp:323
    +
    virtual uint8_t Poll()
    Definition: XBOXONE.cpp:236
    +
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXONE.cpp:42
    +
    Definition: UsbCore.h:197
    +
    int16_t getAnalogHat(AnalogHatEnum a)
    Definition: XBOXONE.cpp:343
    +
    #define XBOX_ONE_PID
    Definition: XBOXONE.h:39
    + +
    + + + + 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 d7d69cbe..b5299107 100644 --- a/_x_b_o_x_r_e_c_v_8cpp.html +++ b/_x_b_o_x_r_e_c_v_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for XBOXRECV.cpp:
    diff --git a/_x_b_o_x_r_e_c_v_8cpp__incl.md5 b/_x_b_o_x_r_e_c_v_8cpp__incl.md5 index 1c1fdc93..b0488834 100644 --- a/_x_b_o_x_r_e_c_v_8cpp__incl.md5 +++ b/_x_b_o_x_r_e_c_v_8cpp__incl.md5 @@ -1 +1 @@ -bfbd5b9c880d6b279e7fd3a120aaed59 \ No newline at end of file +afd0356fb2e414737dbcea38c7c8282b \ No newline at end of file diff --git a/_x_b_o_x_r_e_c_v_8cpp_source.html b/_x_b_o_x_r_e_c_v_8cpp_source.html index c97739c6..a55260fb 100644 --- a/_x_b_o_x_r_e_c_v_8cpp_source.html +++ b/_x_b_o_x_r_e_c_v_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -139,12 +140,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    48 
    49  AddressPool &addrPool = pUsb->GetAddressPool(); // Get memory address of USB device address pool
    50 #ifdef EXTRADEBUG
    -
    51  Notify(PSTR("\r\nXBOXRECV Init"), 0x80);
    +
    51  Notify(PSTR("\r\nXBOXRECV Init"), 0x80);
    52 #endif
    53 
    54  if(bAddress) { // Check if address has already been assigned to an instance
    55 #ifdef DEBUG_USB_HOST
    -
    56  Notify(PSTR("\r\nAddress in use"), 0x80);
    +
    56  Notify(PSTR("\r\nAddress in use"), 0x80);
    57 #endif
    59  }
    @@ -153,14 +154,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    62 
    63  if(!p) {
    64 #ifdef DEBUG_USB_HOST
    -
    65  Notify(PSTR("\r\nAddress not found"), 0x80);
    +
    65  Notify(PSTR("\r\nAddress not found"), 0x80);
    66 #endif
    68  }
    69 
    70  if(!p->epinfo) {
    71 #ifdef DEBUG_USB_HOST
    -
    72  Notify(PSTR("\r\nepinfo is null"), 0x80);
    +
    72  Notify(PSTR("\r\nepinfo is null"), 0x80);
    73 #endif
    75  }
    @@ -181,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    90 
    91  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
    92 #ifdef DEBUG_USB_HOST
    -
    93  Notify(PSTR("\r\nYou'll need a wireless receiver for this libary to work"), 0x80);
    +
    93  Notify(PSTR("\r\nYou'll need a wireless receiver for this libary to work"), 0x80);
    94 #endif
    95  goto FailUnknownDevice;
    96  }
    @@ -190,7 +191,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    99 
    100  if(!bAddress) {
    101 #ifdef DEBUG_USB_HOST
    -
    102  Notify(PSTR("\r\nOut of address space"), 0x80);
    +
    102  Notify(PSTR("\r\nOut of address space"), 0x80);
    103 #endif
    105  }
    @@ -218,7 +219,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    127 
    128 Fail:
    129 #ifdef DEBUG_USB_HOST
    -
    130  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    +
    130  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    131  NotifyFail(rcode);
    132 #endif
    133  Release();
    @@ -230,13 +231,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    139 
    140  AddressPool &addrPool = pUsb->GetAddressPool();
    141 #ifdef EXTRADEBUG
    -
    142  Notify(PSTR("\r\nBTD Init"), 0x80);
    +
    142  Notify(PSTR("\r\nBTD Init"), 0x80);
    143 #endif
    144  UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
    145 
    146  if(!p) {
    147 #ifdef DEBUG_USB_HOST
    -
    148  Notify(PSTR("\r\nAddress not found"), 0x80);
    +
    148  Notify(PSTR("\r\nAddress not found"), 0x80);
    149 #endif
    151  }
    @@ -246,14 +247,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    155  rcode = pUsb->setAddr(0, 0, bAddress); // Assign new address to the device
    156  if(rcode) {
    157 #ifdef DEBUG_USB_HOST
    -
    158  Notify(PSTR("\r\nsetAddr: "), 0x80);
    +
    158  Notify(PSTR("\r\nsetAddr: "), 0x80);
    159  D_PrintHex<uint8_t > (rcode, 0x80);
    160 #endif
    161  p->lowspeed = false;
    162  goto Fail;
    163  }
    164 #ifdef EXTRADEBUG
    -
    165  Notify(PSTR("\r\nAddr: "), 0x80);
    +
    165  Notify(PSTR("\r\nAddr: "), 0x80);
    166  D_PrintHex<uint8_t > (bAddress, 0x80);
    167 #endif
    168 
    @@ -262,7 +263,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    171  p = addrPool.GetUsbDevicePtr(bAddress); // Get pointer to assigned address record
    172  if(!p) {
    173 #ifdef DEBUG_USB_HOST
    -
    174  Notify(PSTR("\r\nAddress not found"), 0x80);
    +
    174  Notify(PSTR("\r\nAddress not found"), 0x80);
    175 #endif
    177  }
    @@ -279,52 +280,52 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    188 
    189  /* Initialize data structures for endpoints of device */
    190  epInfo[ XBOX_INPUT_PIPE_1 ].epAddr = 0x01; // XBOX 360 report endpoint - poll interval 1ms
    - +
    192  epInfo[ XBOX_INPUT_PIPE_1 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    196  epInfo[ XBOX_OUTPUT_PIPE_1 ].epAddr = 0x01; // XBOX 360 output endpoint - poll interval 8ms
    - +
    198  epInfo[ XBOX_OUTPUT_PIPE_1 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    202 
    203  epInfo[ XBOX_INPUT_PIPE_2 ].epAddr = 0x03; // XBOX 360 report endpoint - poll interval 1ms
    - +
    205  epInfo[ XBOX_INPUT_PIPE_2 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    209  epInfo[ XBOX_OUTPUT_PIPE_2 ].epAddr = 0x03; // XBOX 360 output endpoint - poll interval 8ms
    - +
    211  epInfo[ XBOX_OUTPUT_PIPE_2 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    215 
    216  epInfo[ XBOX_INPUT_PIPE_3 ].epAddr = 0x05; // XBOX 360 report endpoint - poll interval 1ms
    - +
    218  epInfo[ XBOX_INPUT_PIPE_3 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    222  epInfo[ XBOX_OUTPUT_PIPE_3 ].epAddr = 0x05; // XBOX 360 output endpoint - poll interval 8ms
    - +
    224  epInfo[ XBOX_OUTPUT_PIPE_3 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    228 
    229  epInfo[ XBOX_INPUT_PIPE_4 ].epAddr = 0x07; // XBOX 360 report endpoint - poll interval 1ms
    - +
    231  epInfo[ XBOX_INPUT_PIPE_4 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    235  epInfo[ XBOX_OUTPUT_PIPE_4 ].epAddr = 0x07; // XBOX 360 output endpoint - poll interval 8ms
    - +
    237  epInfo[ XBOX_OUTPUT_PIPE_4 ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    @@ -341,7 +342,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    250  goto FailSetConfDescr;
    251 
    252 #ifdef DEBUG_USB_HOST
    -
    253  Notify(PSTR("\r\nXbox Wireless Receiver Connected\r\n"), 0x80);
    +
    253  Notify(PSTR("\r\nXbox Wireless Receiver Connected\r\n"), 0x80);
    254 #endif
    255  XboxReceiverConnected = true;
    256  bPollEnable = true;
    @@ -362,7 +363,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    271 
    272 Fail:
    273 #ifdef DEBUG_USB_HOST
    -
    274  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    +
    274  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    275  NotifyFail(rcode);
    276 #endif
    277  Release();
    @@ -404,9 +405,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    313  pUsb->inTransfer(bAddress, epInfo[ inputPipe ].epAddr, &bufferSize, readBuf);
    314  if(bufferSize > 0) { // The number of received bytes
    315 #ifdef EXTRADEBUG
    -
    316  Notify(PSTR("Bytes Received: "), 0x80);
    +
    316  Notify(PSTR("Bytes Received: "), 0x80);
    317  D_PrintHex<uint16_t > (bufferSize, 0x80);
    -
    318  Notify(PSTR("\r\n"), 0x80);
    +
    318  Notify(PSTR("\r\n"), 0x80);
    319 #endif
    320  readReport(i);
    321 #ifdef PRINTREPORT
    @@ -424,28 +425,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    333  if(readBuf[0] == 0x08 && readBuf[1] != Xbox360Connected[controller]) {
    334  Xbox360Connected[controller] = readBuf[1];
    335 #ifdef DEBUG_USB_HOST
    -
    336  Notify(PSTR("Controller "), 0x80);
    +
    336  Notify(PSTR("Controller "), 0x80);
    337  Notify(controller, 0x80);
    338 #endif
    339  if(Xbox360Connected[controller]) {
    340 #ifdef DEBUG_USB_HOST
    341  const char* str = 0;
    342  switch(readBuf[1]) {
    -
    343  case 0x80: str = PSTR(" as controller\r\n");
    +
    343  case 0x80: str = PSTR(" as controller\r\n");
    344  break;
    -
    345  case 0x40: str = PSTR(" as headset\r\n");
    +
    345  case 0x40: str = PSTR(" as headset\r\n");
    346  break;
    -
    347  case 0xC0: str = PSTR(" as controller+headset\r\n");
    +
    347  case 0xC0: str = PSTR(" as controller+headset\r\n");
    348  break;
    349  }
    -
    350  Notify(PSTR(": connected"), 0x80);
    +
    350  Notify(PSTR(": connected"), 0x80);
    351  Notify(str, 0x80);
    352 #endif
    353  onInit(controller);
    354  }
    355 #ifdef DEBUG_USB_HOST
    356  else
    -
    357  Notify(PSTR(": disconnected\r\n"), 0x80);
    +
    357  Notify(PSTR(": disconnected\r\n"), 0x80);
    358 #endif
    359  return;
    360  }
    @@ -486,14 +487,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    395 #ifdef PRINTREPORT
    396  if(readBuf == NULL)
    397  return;
    -
    398  Notify(PSTR("Controller "), 0x80);
    +
    398  Notify(PSTR("Controller "), 0x80);
    399  Notify(controller, 0x80);
    -
    400  Notify(PSTR(": "), 0x80);
    +
    400  Notify(PSTR(": "), 0x80);
    401  for(uint8_t i = 0; i < nBytes; i++) {
    402  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    -
    403  Notify(PSTR(" "), 0x80);
    +
    403  Notify(PSTR(" "), 0x80);
    404  }
    -
    405  Notify(PSTR("\r\n"), 0x80);
    +
    405  Notify(PSTR("\r\n"), 0x80);
    406 #endif
    407 }
    408 
    @@ -502,7 +503,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    411  return (uint8_t)(ButtonState[controller] >> 8);
    412  else if(b == R2)
    413  return (uint8_t)ButtonState[controller];
    -
    414  return (bool)(ButtonState[controller] & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]) << 16));
    +
    414  return (bool)(ButtonState[controller] & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]) << 16));
    415 }
    416 
    417 bool XBOXRECV::getButtonClick(ButtonEnum b, uint8_t controller) {
    @@ -519,7 +520,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    428  }
    429  return false;
    430  }
    -
    431  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    +
    431  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    432  bool click = (ButtonClickState[controller] & button);
    433  ButtonClickState[controller] &= ~button; // clear "click" event
    434  return click;
    @@ -581,7 +582,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    490  pUsb->outTransfer(bAddress, epInfo[ outputPipe ].epAddr, nbytes, data);
    491 #ifdef EXTRADEBUG
    492  if(rcode)
    -
    493  Notify(PSTR("Error sending Xbox message\r\n"), 0x80);
    +
    493  Notify(PSTR("Error sending Xbox message\r\n"), 0x80);
    494 #endif
    495 }
    496 
    @@ -607,11 +608,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    516  if(led == OFF)
    517  setLedRaw(0, controller);
    518  else if(led != ALL) // All LEDs can't be on a the same time
    -
    519  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4, controller);
    +
    519  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4, controller);
    520 }
    521 
    522 void XBOXRECV::setLedBlink(LEDEnum led, uint8_t controller) {
    -
    523  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]), controller);
    +
    523  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]), controller);
    524 }
    525 
    526 void XBOXRECV::setLedMode(LEDModeEnum ledMode, uint8_t controller) { // This function is used to do some speciel LED stuff the controller supports
    @@ -674,110 +675,113 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    583 }
    uint8_t bmRcvToggle
    Definition: address.h:41
    -
    #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
    Definition: XBOXRECV.h:49
    +
    #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:81
    -
    virtual uint8_t Poll()
    Definition: XBOXRECV.cpp:292
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +
    uint8_t Poll()
    Definition: XBOXRECV.cpp:292
    void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller=0)
    Definition: XBOXRECV.cpp:556
    uint8_t bmNakPower
    Definition: address.h:42
    -
    #define XBOX_WIRELESS_RECEIVER_PID
    Definition: XBOXRECV.h:48
    +
    #define XBOX_WIRELESS_RECEIVER_PID
    Definition: XBOXRECV.h:45
    -
    uint8_t bAddress
    Definition: XBOXRECV.h:240
    +
    uint8_t bAddress
    Definition: XBOXRECV.h:237
    +
    #define pgm_read_word(addr)
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:105
    #define NotifyFail(...)
    Definition: message.h:55
    -
    uint8_t Xbox360Connected[4]
    Definition: XBOXRECV.h:234
    +
    uint8_t Xbox360Connected[4]
    Definition: XBOXRECV.h:231
    void setLedMode(LEDModeEnum lm, uint8_t controller=0)
    Definition: XBOXRECV.cpp:526
    AnalogHatEnum
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:805
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:808
    bool buttonChanged(uint8_t controller=0)
    Definition: XBOXRECV.cpp:441
    -
    #define XBOX_OUTPUT_PIPE_3
    Definition: XBOXRECV.h:39
    -
    virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXRECV.cpp:40
    -
    #define USB_ERROR_FailGetDevDescr
    Definition: UsbCore.h:87
    +
    #define XBOX_OUTPUT_PIPE_3
    Definition: XBOXRECV.h:36
    +
    uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXRECV.cpp:40
    +
    #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:225
    +
    #define hrJERR
    Definition: max3421e.h:220
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    -
    #define EP_MAXPKTSIZE
    Definition: PS3USB.h:25
    +
    #define EP_MAXPKTSIZE
    Definition: PS3USB.h:26
    virtual void FreeAddress(uint8_t addr)=0
    LEDEnum
    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:796
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    uint8_t epAddr
    Definition: address.h:33
    -
    #define XBOX_INPUT_PIPE_2
    Definition: XBOXRECV.h:36
    +
    #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 XBOX_VID
    Definition: XBOXOLD.h:36
    +
    #define XBOX_VID
    Definition: XBOXOLD.h:34
    -
    virtual uint8_t Release()
    Definition: XBOXRECV.cpp:282
    -
    #define EP_INTERRUPT
    Definition: PS3USB.h:28
    +
    uint8_t Release()
    Definition: XBOXRECV.cpp:282
    Definition: address.h:32
    bool getButtonClick(ButtonEnum b, uint8_t controller=0)
    Definition: XBOXRECV.cpp:417
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:292
    void setLedOn(LEDEnum l, uint8_t controller=0)
    Definition: XBOXRECV.cpp:515
    ButtonEnum
    uint8_t getButtonPress(ButtonEnum b, uint8_t controller=0)
    Definition: XBOXRECV.cpp:409
    -
    bool XboxReceiverConnected
    Definition: XBOXRECV.h:228
    +
    bool XboxReceiverConnected
    Definition: XBOXRECV.h:225
    -
    #define JOYTECH_VID
    Definition: XBOXOLD.h:38
    +
    #define JOYTECH_VID
    Definition: XBOXOLD.h:36
    uint8_t getBatteryLevel(uint8_t controller=0)
    Definition: XBOXRECV.cpp:466
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    -
    #define XBOX_OUTPUT_PIPE_1
    Definition: XBOXRECV.h:35
    +
    #define XBOX_OUTPUT_PIPE_1
    Definition: XBOXRECV.h:32
    uint8_t bmSndToggle
    Definition: address.h:40
    int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller=0)
    Definition: XBOXRECV.cpp:437
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:83
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    +
    #define PSTR(str)
    XBOXRECV(USB *pUsb)
    Definition: XBOXRECV.cpp:25
    -
    #define MADCATZ_VID
    Definition: XBOXOLD.h:37
    -
    #define XBOX_INPUT_PIPE_1
    Definition: XBOXRECV.h:34
    +
    #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:522
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:80
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXRECV.cpp:137
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXRECV.cpp:137
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data)
    Definition: Usb.cpp:206
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    void setLedRaw(uint8_t value, uint8_t controller=0)
    Definition: XBOXRECV.cpp:506
    const uint8_t XBOX_LEDS[]
    Definition: xboxEnums.h:32
    uint16_t idProduct
    Definition: usb_ch9.h:107
    -
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXOLD.h:49
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:78
    +
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXOLD.h:43
    +
    #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:206
    -
    Definition: UsbCore.h:190
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    +
    Definition: UsbCore.h:197
    -
    #define XBOX_INPUT_PIPE_3
    Definition: XBOXRECV.h:38
    -
    #define XBOX_CONTROL_PIPE
    Definition: XBOXOLD.h:31
    +
    #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:40
    +
    #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:210
    +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    void disconnect(uint8_t controller=0)
    Definition: XBOXRECV.cpp:497
    -
    #define XBOX_OUTPUT_PIPE_4
    Definition: XBOXRECV.h:41
    -
    USB * pUsb
    Definition: XBOXRECV.h:238
    -
    #define XBOX_OUTPUT_PIPE_2
    Definition: XBOXRECV.h:37
    -
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:761
    -
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXRECV.h:242
    +
    #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:764
    +
    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:86
    +
    #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
    Definition: UsbCore.h:88
    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 9a6bfaf4..ae665f14 100644 --- a/_x_b_o_x_r_e_c_v_8h.html +++ b/_x_b_o_x_r_e_c_v_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -120,8 +121,6 @@ Classes Macros #define EP_MAXPKTSIZE   32   -#define EP_INTERRUPT   0x03 -  #define XBOX_CONTROL_PIPE   0   #define XBOX_INPUT_PIPE_1   1 @@ -166,20 +165,6 @@ Macros

    Definition at line 27 of file XBOXRECV.h.

    -
    - - -
    -
    - - - - -
    #define EP_INTERRUPT   0x03
    -
    - -

    Definition at line 30 of file XBOXRECV.h.

    -
    @@ -192,7 +177,7 @@ Macros
    -

    Definition at line 33 of file XBOXRECV.h.

    +

    Definition at line 30 of file XBOXRECV.h.

    @@ -206,7 +191,7 @@ Macros
    -

    Definition at line 34 of file XBOXRECV.h.

    +

    Definition at line 31 of file XBOXRECV.h.

    @@ -220,7 +205,7 @@ Macros
    -

    Definition at line 35 of file XBOXRECV.h.

    +

    Definition at line 32 of file XBOXRECV.h.

    @@ -234,7 +219,7 @@ Macros
    -

    Definition at line 36 of file XBOXRECV.h.

    +

    Definition at line 33 of file XBOXRECV.h.

    @@ -248,7 +233,7 @@ Macros
    -

    Definition at line 37 of file XBOXRECV.h.

    +

    Definition at line 34 of file XBOXRECV.h.

    @@ -262,7 +247,7 @@ Macros
    -

    Definition at line 38 of file XBOXRECV.h.

    +

    Definition at line 35 of file XBOXRECV.h.

    @@ -276,7 +261,7 @@ Macros
    -

    Definition at line 39 of file XBOXRECV.h.

    +

    Definition at line 36 of file XBOXRECV.h.

    @@ -290,7 +275,7 @@ Macros
    -

    Definition at line 40 of file XBOXRECV.h.

    +

    Definition at line 37 of file XBOXRECV.h.

    @@ -304,7 +289,7 @@ Macros
    -

    Definition at line 41 of file XBOXRECV.h.

    +

    Definition at line 38 of file XBOXRECV.h.

    @@ -318,7 +303,7 @@ Macros
    -

    Definition at line 44 of file XBOXRECV.h.

    +

    Definition at line 41 of file XBOXRECV.h.

    @@ -332,7 +317,7 @@ Macros
    -

    Definition at line 45 of file XBOXRECV.h.

    +

    Definition at line 42 of file XBOXRECV.h.

    @@ -346,7 +331,7 @@ Macros
    -

    Definition at line 46 of file XBOXRECV.h.

    +

    Definition at line 43 of file XBOXRECV.h.

    @@ -360,7 +345,7 @@ Macros
    -

    Definition at line 48 of file XBOXRECV.h.

    +

    Definition at line 45 of file XBOXRECV.h.

    @@ -374,7 +359,7 @@ Macros
    -

    Definition at line 49 of file XBOXRECV.h.

    +

    Definition at line 46 of file XBOXRECV.h.

    @@ -388,7 +373,7 @@ Macros
    -

    Definition at line 51 of file XBOXRECV.h.

    +

    Definition at line 48 of file XBOXRECV.h.

    @@ -397,7 +382,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 4ca65192..10cd6192 100644 --- a/_x_b_o_x_r_e_c_v_8h__dep__incl.md5 +++ b/_x_b_o_x_r_e_c_v_8h__dep__incl.md5 @@ -1 +1 @@ -74b9b88b9a5da90f0879a3aae3ebebb6 \ No newline at end of file +1b17ab2dd30a29c1f644e03c41d46777 \ No newline at end of file diff --git a/_x_b_o_x_r_e_c_v_8h__incl.md5 b/_x_b_o_x_r_e_c_v_8h__incl.md5 index 59a0ccbc..e4e3f6bf 100644 --- a/_x_b_o_x_r_e_c_v_8h__incl.md5 +++ b/_x_b_o_x_r_e_c_v_8h__incl.md5 @@ -1 +1 @@ -ce5138122fc59e139125ea0dd172d247 \ No newline at end of file +b243ba8a771536bf11d1fde69b3f7cff \ No newline at end of file diff --git a/_x_b_o_x_r_e_c_v_8h_source.html b/_x_b_o_x_r_e_c_v_8h_source.html index 45506d5c..e65f9e09 100644 --- a/_x_b_o_x_r_e_c_v_8h_source.html +++ b/_x_b_o_x_r_e_c_v_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -117,168 +118,165 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    26 /* Data Xbox 360 taken from descriptors */
    27 #define EP_MAXPKTSIZE 32 // max size for data via USB
    28 
    -
    29 /* Endpoint types */
    -
    30 #define EP_INTERRUPT 0x03
    -
    31 
    -
    32 /* Names we give to the 9 Xbox360 pipes */
    -
    33 #define XBOX_CONTROL_PIPE 0
    -
    34 #define XBOX_INPUT_PIPE_1 1
    -
    35 #define XBOX_OUTPUT_PIPE_1 2
    -
    36 #define XBOX_INPUT_PIPE_2 3
    -
    37 #define XBOX_OUTPUT_PIPE_2 4
    -
    38 #define XBOX_INPUT_PIPE_3 5
    -
    39 #define XBOX_OUTPUT_PIPE_3 6
    -
    40 #define XBOX_INPUT_PIPE_4 7
    -
    41 #define XBOX_OUTPUT_PIPE_4 8
    -
    42 
    -
    43 // PID and VID of the different devices
    -
    44 #define XBOX_VID 0x045E // Microsoft Corporation
    -
    45 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz receivers
    -
    46 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    +
    29 /* Names we give to the 9 Xbox360 pipes */
    +
    30 #define XBOX_CONTROL_PIPE 0
    +
    31 #define XBOX_INPUT_PIPE_1 1
    +
    32 #define XBOX_OUTPUT_PIPE_1 2
    +
    33 #define XBOX_INPUT_PIPE_2 3
    +
    34 #define XBOX_OUTPUT_PIPE_2 4
    +
    35 #define XBOX_INPUT_PIPE_3 5
    +
    36 #define XBOX_OUTPUT_PIPE_3 6
    +
    37 #define XBOX_INPUT_PIPE_4 7
    +
    38 #define XBOX_OUTPUT_PIPE_4 8
    +
    39 
    +
    40 // PID and VID of the different devices
    +
    41 #define XBOX_VID 0x045E // Microsoft Corporation
    +
    42 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz receivers
    +
    43 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    +
    44 
    +
    45 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
    +
    46 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
    47 
    -
    48 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
    -
    49 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
    -
    50 
    -
    51 #define XBOX_MAX_ENDPOINTS 9
    -
    52 
    -
    58 class XBOXRECV : public USBDeviceConfig {
    -
    59 public:
    -
    64  XBOXRECV(USB *pUsb);
    -
    65 
    -
    74  virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
    -
    82  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    87  virtual uint8_t Release();
    -
    92  virtual uint8_t Poll();
    -
    93 
    -
    98  virtual uint8_t GetAddress() {
    -
    99  return bAddress;
    -
    100  };
    -
    101 
    -
    106  virtual bool isReady() {
    -
    107  return bPollEnable;
    -
    108  };
    -
    109 
    -
    116  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    117  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID) && (pid == XBOX_WIRELESS_RECEIVER_PID || pid == XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID));
    -
    118  };
    -
    133  uint8_t getButtonPress(ButtonEnum b, uint8_t controller = 0);
    -
    134  bool getButtonClick(ButtonEnum b, uint8_t controller = 0);
    -
    144  int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller = 0);
    -
    145 
    -
    150  void disconnect(uint8_t controller = 0);
    -
    151 
    -
    156  void setAllOff(uint8_t controller = 0) {
    -
    157  setRumbleOn(0, 0, controller);
    -
    158  setLedOff(controller);
    -
    159  };
    -
    160 
    -
    165  void setRumbleOff(uint8_t controller = 0) {
    -
    166  setRumbleOn(0, 0, controller);
    -
    167  };
    -
    174  void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller = 0);
    -
    182  void setLedRaw(uint8_t value, uint8_t controller = 0);
    -
    183 
    -
    188  void setLedOff(uint8_t controller = 0) {
    -
    189  setLedRaw(0, controller);
    -
    190  };
    -
    196  void setLedOn(LEDEnum l, uint8_t controller = 0);
    -
    202  void setLedBlink(LEDEnum l, uint8_t controller = 0);
    -
    208  void setLedMode(LEDModeEnum lm, uint8_t controller = 0);
    -
    214  uint8_t getBatteryLevel(uint8_t controller = 0);
    -
    220  bool buttonChanged(uint8_t controller = 0);
    -
    221 
    -
    226  void attachOnInit(void (*funcOnInit)(void)) {
    -
    227  pFuncOnInit = funcOnInit;
    -
    228  };
    - -
    234  uint8_t Xbox360Connected[4];
    -
    235 
    -
    236 protected:
    - -
    240  uint8_t bAddress;
    - -
    243 
    -
    244 private:
    -
    251  void onInit(uint8_t controller);
    -
    252  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    253 
    -
    254  bool bPollEnable;
    -
    255 
    -
    256  /* Variables to store the buttons */
    -
    257  uint32_t ButtonState[4];
    -
    258  uint32_t OldButtonState[4];
    -
    259  uint16_t ButtonClickState[4];
    -
    260  int16_t hatValue[4][4];
    -
    261  uint16_t controllerStatus[4];
    -
    262  bool buttonStateChanged[4]; // True if a button has changed
    +
    48 #define XBOX_MAX_ENDPOINTS 9
    +
    49 
    +
    55 class XBOXRECV : public USBDeviceConfig {
    +
    56 public:
    +
    61  XBOXRECV(USB *pUsb);
    +
    62 
    +
    71  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
    +
    79  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    +
    84  uint8_t Release();
    +
    89  uint8_t Poll();
    +
    90 
    +
    95  virtual uint8_t GetAddress() {
    +
    96  return bAddress;
    +
    97  };
    +
    98 
    +
    103  virtual bool isReady() {
    +
    104  return bPollEnable;
    +
    105  };
    +
    106 
    +
    113  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    +
    114  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID) && (pid == XBOX_WIRELESS_RECEIVER_PID || pid == XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID));
    +
    115  };
    +
    130  uint8_t getButtonPress(ButtonEnum b, uint8_t controller = 0);
    +
    131  bool getButtonClick(ButtonEnum b, uint8_t controller = 0);
    +
    141  int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller = 0);
    +
    142 
    +
    147  void disconnect(uint8_t controller = 0);
    +
    148 
    +
    153  void setAllOff(uint8_t controller = 0) {
    +
    154  setRumbleOn(0, 0, controller);
    +
    155  setLedOff(controller);
    +
    156  };
    +
    157 
    +
    162  void setRumbleOff(uint8_t controller = 0) {
    +
    163  setRumbleOn(0, 0, controller);
    +
    164  };
    +
    171  void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller = 0);
    +
    179  void setLedRaw(uint8_t value, uint8_t controller = 0);
    +
    180 
    +
    185  void setLedOff(uint8_t controller = 0) {
    +
    186  setLedRaw(0, controller);
    +
    187  };
    +
    193  void setLedOn(LEDEnum l, uint8_t controller = 0);
    +
    199  void setLedBlink(LEDEnum l, uint8_t controller = 0);
    +
    205  void setLedMode(LEDModeEnum lm, uint8_t controller = 0);
    +
    211  uint8_t getBatteryLevel(uint8_t controller = 0);
    +
    217  bool buttonChanged(uint8_t controller = 0);
    +
    218 
    +
    223  void attachOnInit(void (*funcOnInit)(void)) {
    +
    224  pFuncOnInit = funcOnInit;
    +
    225  };
    + +
    231  uint8_t Xbox360Connected[4];
    +
    232 
    +
    233 protected:
    + +
    237  uint8_t bAddress;
    + +
    240 
    +
    241 private:
    +
    248  void onInit(uint8_t controller);
    +
    249  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    +
    250 
    +
    251  bool bPollEnable;
    +
    252 
    +
    253  /* Variables to store the buttons */
    +
    254  uint32_t ButtonState[4];
    +
    255  uint32_t OldButtonState[4];
    +
    256  uint16_t ButtonClickState[4];
    +
    257  int16_t hatValue[4][4];
    +
    258  uint16_t controllerStatus[4];
    +
    259  bool buttonStateChanged[4]; // True if a button has changed
    +
    260 
    +
    261  bool L2Clicked[4]; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    +
    262  bool R2Clicked[4];
    263 
    -
    264  bool L2Clicked[4]; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    -
    265  bool R2Clicked[4];
    -
    266 
    -
    267  uint32_t checkStatusTimer; // Timing for checkStatus() signals
    +
    264  uint32_t checkStatusTimer; // Timing for checkStatus() signals
    +
    265 
    +
    266  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    +
    267  uint8_t writeBuf[7]; // General purpose buffer for output data
    268 
    -
    269  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    -
    270  uint8_t writeBuf[7]; // General purpose buffer for output data
    +
    269  void readReport(uint8_t controller); // read incoming data
    +
    270  void printReport(uint8_t controller, uint8_t nBytes); // print incoming date - Uncomment for debugging
    271 
    -
    272  void readReport(uint8_t controller); // read incoming data
    -
    273  void printReport(uint8_t controller, uint8_t nBytes); // print incoming date - Uncomment for debugging
    -
    274 
    -
    275  /* Private commands */
    -
    276  void XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes);
    -
    277  void checkStatus();
    -
    278 };
    -
    279 #endif
    -
    #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
    Definition: XBOXRECV.h:49
    +
    272  /* Private commands */
    +
    273  void XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes);
    +
    274  void checkStatus();
    +
    275 };
    +
    276 #endif
    +
    #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
    Definition: XBOXRECV.h:46
    LEDModeEnum
    Definition: xboxEnums.h:24
    -
    virtual uint8_t Poll()
    Definition: XBOXRECV.cpp:292
    +
    uint8_t Poll()
    Definition: XBOXRECV.cpp:292
    void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller=0)
    Definition: XBOXRECV.cpp:556
    -
    #define XBOX_WIRELESS_RECEIVER_PID
    Definition: XBOXRECV.h:48
    -
    uint8_t bAddress
    Definition: XBOXRECV.h:240
    -
    void setLedOff(uint8_t controller=0)
    Definition: XBOXRECV.h:188
    +
    virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: XBOXRECV.h:113
    +
    #define XBOX_WIRELESS_RECEIVER_PID
    Definition: XBOXRECV.h:45
    +
    uint8_t bAddress
    Definition: XBOXRECV.h:237
    +
    void setLedOff(uint8_t controller=0)
    Definition: XBOXRECV.h:185
    #define EP_MAXPKTSIZE
    Definition: XBOXRECV.h:27
    -
    virtual uint8_t GetAddress()
    Definition: XBOXRECV.h:98
    -
    uint8_t Xbox360Connected[4]
    Definition: XBOXRECV.h:234
    +
    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:526
    AnalogHatEnum
    bool buttonChanged(uint8_t controller=0)
    Definition: XBOXRECV.cpp:441
    -
    void setRumbleOff(uint8_t controller=0)
    Definition: XBOXRECV.h:165
    -
    virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXRECV.cpp:40
    - +
    void setRumbleOff(uint8_t controller=0)
    Definition: XBOXRECV.h:162
    +
    uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXRECV.cpp:40
    + -
    virtual bool isReady()
    Definition: XBOXRECV.h:106
    +
    virtual bool isReady()
    Definition: XBOXRECV.h:103
    LEDEnum
    -
    #define XBOX_VID
    Definition: XBOXRECV.h:44
    -
    void setAllOff(uint8_t controller=0)
    Definition: XBOXRECV.h:156
    -
    virtual uint8_t Release()
    Definition: XBOXRECV.cpp:282
    +
    #define XBOX_VID
    Definition: XBOXRECV.h:41
    +
    void setAllOff(uint8_t controller=0)
    Definition: XBOXRECV.h:153
    +
    uint8_t Release()
    Definition: XBOXRECV.cpp:282
    Definition: address.h:32
    bool getButtonClick(ButtonEnum b, uint8_t controller=0)
    Definition: XBOXRECV.cpp:417
    void setLedOn(LEDEnum l, uint8_t controller=0)
    Definition: XBOXRECV.cpp:515
    ButtonEnum
    uint8_t getButtonPress(ButtonEnum b, uint8_t controller=0)
    Definition: XBOXRECV.cpp:409
    -
    bool XboxReceiverConnected
    Definition: XBOXRECV.h:228
    +
    bool XboxReceiverConnected
    Definition: XBOXRECV.h:225
    uint8_t getBatteryLevel(uint8_t controller=0)
    Definition: XBOXRECV.cpp:466
    int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller=0)
    Definition: XBOXRECV.cpp:437
    XBOXRECV(USB *pUsb)
    Definition: XBOXRECV.cpp:25
    -
    #define JOYTECH_VID
    Definition: XBOXRECV.h:46
    +
    #define JOYTECH_VID
    Definition: XBOXRECV.h:43
    void setLedBlink(LEDEnum l, uint8_t controller=0)
    Definition: XBOXRECV.cpp:522
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXRECV.cpp:137
    -
    #define MADCATZ_VID
    Definition: XBOXRECV.h:45
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXRECV.cpp:137
    +
    #define MADCATZ_VID
    Definition: XBOXRECV.h:42
    void setLedRaw(uint8_t value, uint8_t controller=0)
    Definition: XBOXRECV.cpp:506
    -
    virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: XBOXRECV.h:116
    -
    Definition: UsbCore.h:190
    -
    void attachOnInit(void(*funcOnInit)(void))
    Definition: XBOXRECV.h:226
    +
    Definition: UsbCore.h:197
    +
    void attachOnInit(void(*funcOnInit)(void))
    Definition: XBOXRECV.h:223
    void disconnect(uint8_t controller=0)
    Definition: XBOXRECV.cpp:497
    - -
    USB * pUsb
    Definition: XBOXRECV.h:238
    -
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXRECV.h:242
    -
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXRECV.h:51
    + +
    USB * pUsb
    Definition: XBOXRECV.h:235
    +
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXRECV.h:239
    +
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXRECV.h:48
    diff --git a/_x_b_o_x_u_s_b_8cpp.html b/_x_b_o_x_u_s_b_8cpp.html index b5632af2..79a065f3 100644 --- a/_x_b_o_x_u_s_b_8cpp.html +++ b/_x_b_o_x_u_s_b_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -95,7 +96,7 @@ Include dependency graph for XBOXUSB.cpp:
    - +

    Go to the source code of this file.

    @@ -104,7 +105,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 f13c1f25..b078f7d8 100644 --- a/_x_b_o_x_u_s_b_8cpp__incl.map +++ b/_x_b_o_x_u_s_b_8cpp__incl.map @@ -1,6 +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 b8265da5..2356cea0 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 @@ -bf6f13928de61e73244f2efd80b18c87 \ No newline at end of file +c0a331b895b98f54285abbe4728f1391 \ 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 fa533e2fa93f8d97947b96dbcd68dbe24b8699f7..56430db6a5305661ee63667be753df5d9849c910 100644 GIT binary patch literal 21255 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 Q0C0ImPumz(q3IC$Ka{RxJ^%m! literal 12214 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 diff --git a/_x_b_o_x_u_s_b_8cpp_source.html b/_x_b_o_x_u_s_b_8cpp_source.html index da57e35e..3430f852 100644 --- a/_x_b_o_x_u_s_b_8cpp_source.html +++ b/_x_b_o_x_u_s_b_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -138,12 +139,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    47  // get memory address of USB device address pool
    48  AddressPool &addrPool = pUsb->GetAddressPool();
    49 #ifdef EXTRADEBUG
    -
    50  Notify(PSTR("\r\nXBOXUSB Init"), 0x80);
    +
    50  Notify(PSTR("\r\nXBOXUSB Init"), 0x80);
    51 #endif
    52  // check if address has already been assigned to an instance
    53  if(bAddress) {
    54 #ifdef DEBUG_USB_HOST
    -
    55  Notify(PSTR("\r\nAddress in use"), 0x80);
    +
    55  Notify(PSTR("\r\nAddress in use"), 0x80);
    56 #endif
    58  }
    @@ -153,14 +154,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    62 
    63  if(!p) {
    64 #ifdef DEBUG_USB_HOST
    -
    65  Notify(PSTR("\r\nAddress not found"), 0x80);
    +
    65  Notify(PSTR("\r\nAddress not found"), 0x80);
    66 #endif
    68  }
    69 
    70  if(!p->epinfo) {
    71 #ifdef DEBUG_USB_HOST
    -
    72  Notify(PSTR("\r\nepinfo is null"), 0x80);
    +
    72  Notify(PSTR("\r\nepinfo is null"), 0x80);
    73 #endif
    75  }
    @@ -188,15 +189,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    97  goto FailUnknownDevice;
    98  if(PID == XBOX_WIRELESS_PID) {
    99 #ifdef DEBUG_USB_HOST
    -
    100  Notify(PSTR("\r\nYou have plugged in a wireless Xbox 360 controller - it doesn't support USB communication"), 0x80);
    +
    100  Notify(PSTR("\r\nYou have plugged in a wireless Xbox 360 controller - it doesn't support USB communication"), 0x80);
    101 #endif
    102  goto FailUnknownDevice;
    104 #ifdef DEBUG_USB_HOST
    -
    105  Notify(PSTR("\r\nThis library only supports Xbox 360 controllers via USB"), 0x80);
    +
    105  Notify(PSTR("\r\nThis library only supports Xbox 360 controllers via USB"), 0x80);
    106 #endif
    107  goto FailUnknownDevice;
    -
    108  } else if(PID != XBOX_WIRED_PID && PID != MADCATZ_WIRED_PID && PID != GAMESTOP_WIRED_PID && PID != AFTERGLOW_WIRED_PID) // Check PID
    +
    108  } else if(PID != XBOX_WIRED_PID && PID != MADCATZ_WIRED_PID && PID != GAMESTOP_WIRED_PID && PID != AFTERGLOW_WIRED_PID && PID != JOYTECH_WIRED_PID) // Check PID
    109  goto FailUnknownDevice;
    110 
    111  // Allocate new address according to device class
    @@ -215,13 +216,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    124  addrPool.FreeAddress(bAddress);
    125  bAddress = 0;
    126 #ifdef DEBUG_USB_HOST
    -
    127  Notify(PSTR("\r\nsetAddr: "), 0x80);
    +
    127  Notify(PSTR("\r\nsetAddr: "), 0x80);
    128  D_PrintHex<uint8_t > (rcode, 0x80);
    129 #endif
    130  return rcode;
    131  }
    132 #ifdef EXTRADEBUG
    -
    133  Notify(PSTR("\r\nAddr: "), 0x80);
    +
    133  Notify(PSTR("\r\nAddr: "), 0x80);
    134  D_PrintHex<uint8_t > (bAddress, 0x80);
    135 #endif
    136  //delay(300); // Spec says you should wait at least 200ms
    @@ -246,13 +247,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    155 
    156  /* Initialize data structures for endpoints of device */
    157  epInfo[ XBOX_INPUT_PIPE ].epAddr = 0x01; // XBOX 360 report endpoint
    - +
    159  epInfo[ XBOX_INPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    163  epInfo[ XBOX_OUTPUT_PIPE ].epAddr = 0x02; // XBOX 360 output endpoint
    - +
    165  epInfo[ XBOX_OUTPUT_PIPE ].bmNakPower = USB_NAK_NOWAIT; // Only poll once for interrupt endpoints
    @@ -269,7 +270,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    178  goto FailSetConfDescr;
    179 
    180 #ifdef DEBUG_USB_HOST
    -
    181  Notify(PSTR("\r\nXbox 360 Controller Connected\r\n"), 0x80);
    +
    181  Notify(PSTR("\r\nXbox 360 Controller Connected\r\n"), 0x80);
    182 #endif
    183  onInit();
    184  Xbox360Connected = true;
    @@ -303,7 +304,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    212 
    213 Fail:
    214 #ifdef DEBUG_USB_HOST
    -
    215  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    +
    215  Notify(PSTR("\r\nXbox 360 Init Failed, error code: "), 0x80);
    216  NotifyFail(rcode);
    217 #endif
    218  Release();
    @@ -362,11 +363,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    271 #ifdef PRINTREPORT
    272  if(readBuf == NULL)
    273  return;
    -
    274  for(uint8_t i = 0; i < XBOX_REPORT_BUFFER_SIZE; i++) {
    +
    274  for(uint8_t i = 0; i < XBOX_REPORT_BUFFER_SIZE; i++) {
    275  D_PrintHex<uint8_t > (readBuf[i], 0x80);
    -
    276  Notify(PSTR(" "), 0x80);
    +
    276  Notify(PSTR(" "), 0x80);
    277  }
    -
    278  Notify(PSTR("\r\n"), 0x80);
    +
    278  Notify(PSTR("\r\n"), 0x80);
    279 #endif
    280 }
    281 
    @@ -375,7 +376,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    284  return (uint8_t)(ButtonState >> 8);
    285  else if(b == R2)
    286  return (uint8_t)ButtonState;
    -
    287  return (bool)(ButtonState & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]) << 16));
    +
    287  return (bool)(ButtonState & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]) << 16));
    288 }
    289 
    @@ -392,7 +393,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    301  }
    302  return false;
    303  }
    -
    304  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    +
    304  uint16_t button = pgm_read_word(&XBOX_BUTTONS[(uint8_t)b]);
    305  bool click = (ButtonClickState & button);
    306  ButtonClickState &= ~button; // clear "click" event
    307  return click;
    @@ -405,7 +406,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    314 /* Xbox Controller commands */
    315 void XBOXUSB::XboxCommand(uint8_t* data, uint16_t nbytes) {
    316  //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)
    -
    317  pUsb->ctrlReq(bAddress, epInfo[XBOX_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    +
    317  pUsb->ctrlReq(bAddress, epInfo[XBOX_CONTROL_PIPE].epAddr, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
    318 }
    319 
    320 void XBOXUSB::setLedRaw(uint8_t value) {
    @@ -420,11 +421,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    329  if(led == OFF)
    330  setLedRaw(0);
    331  else if(led != ALL) // All LEDs can't be on a the same time
    -
    332  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4);
    +
    332  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4);
    333 }
    334 
    -
    336  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]));
    +
    336  setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]));
    337 }
    338 
    339 void XBOXUSB::setLedMode(LEDModeEnum ledMode) { // This function is used to do some special LED stuff the controller supports
    @@ -450,101 +451,105 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    359  else
    360  setLedOn(LED1);
    361 }
    -
    #define XBOX_WIRED_PID
    Definition: XBOXUSB.h:41
    +
    #define XBOX_WIRED_PID
    Definition: XBOXUSB.h:39
    uint8_t bmRcvToggle
    Definition: address.h:41
    -
    #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
    Definition: XBOXRECV.h:49
    +
    #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:81
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    uint8_t bmNakPower
    Definition: address.h:42
    -
    #define XBOX_WIRELESS_RECEIVER_PID
    Definition: XBOXRECV.h:48
    +
    #define XBOX_WIRELESS_RECEIVER_PID
    Definition: XBOXRECV.h:45
    void setLedOn(LEDEnum l)
    Definition: XBOXUSB.cpp:328
    +
    #define pgm_read_word(addr)
    +
    #define HID_REQUEST_SET_REPORT
    Definition: hid.h:72
    +
    #define JOYTECH_WIRED_PID
    Definition: XBOXUSB.h:44
    #define NotifyFail(...)
    Definition: message.h:55
    AnalogHatEnum
    -
    USB * pUsb
    Definition: XBOXUSB.h:194
    -
    #define XBOX_REPORT_BUFFER_SIZE
    Definition: XBOXUSB.h:49
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:805
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXUSB.cpp:38
    +
    USB * pUsb
    Definition: XBOXUSB.h:189
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:808
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXUSB.cpp:38
    +
    #define bmREQ_HID_OUT
    Definition: hid.h:63
    +
    #define USB_TRANSFER_TYPE_INTERRUPT
    Definition: usb_ch9.h:86
    int16_t getAnalogHat(AnalogHatEnum a)
    Definition: XBOXUSB.cpp:310
    void setLedBlink(LEDEnum l)
    Definition: XBOXUSB.cpp:335
    +
    #define pgm_read_byte(addr)
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    -
    #define AFTERGLOW_WIRED_PID
    Definition: XBOXUSB.h:47
    +
    #define AFTERGLOW_WIRED_PID
    Definition: XBOXUSB.h:46
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    -
    #define EP_MAXPKTSIZE
    Definition: PS3USB.h:25
    +
    #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
    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:796
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    uint8_t epAddr
    Definition: address.h:33
    #define NotifyFailUnknownDevice(...)
    Definition: message.h:54
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    -
    #define XBOX_VID
    Definition: XBOXOLD.h:36
    -
    #define XBOX_INPUT_PIPE
    Definition: XBOXOLD.h:32
    +
    #define XBOX_VID
    Definition: XBOXOLD.h:34
    +
    #define XBOX_INPUT_PIPE
    Definition: XBOXOLD.h:30
    -
    uint8_t bAddress
    Definition: XBOXUSB.h:196
    +
    uint8_t bAddress
    Definition: XBOXUSB.h:191
    uint8_t getButtonPress(ButtonEnum b)
    Definition: XBOXUSB.cpp:282
    -
    #define EP_INTERRUPT
    Definition: PS3USB.h:28
    Definition: address.h:32
    -
    #define XBOX_WIRELESS_PID
    Definition: XBOXUSB.h:42
    +
    #define XBOX_WIRELESS_PID
    Definition: XBOXUSB.h:40
    ButtonEnum
    -
    bool Xbox360Connected
    Definition: XBOXUSB.h:186
    +
    bool Xbox360Connected
    Definition: XBOXUSB.h:181
    -
    #define HID_REQUEST_SET_REPORT
    Definition: BTD.h:39
    -
    #define JOYTECH_VID
    Definition: XBOXOLD.h:38
    +
    #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:83
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    +
    #define PSTR(str)
    void setRumbleOn(uint8_t lValue, uint8_t rValue)
    Definition: XBOXUSB.cpp:343
    XBOXUSB(USB *pUsb)
    Definition: XBOXUSB.cpp:23
    -
    #define MADCATZ_VID
    Definition: XBOXOLD.h:37
    +
    #define MADCATZ_VID
    Definition: XBOXOLD.h:35
    -
    #define XBOX_OUTPUT_PIPE
    Definition: XBOXOLD.h:33
    +
    #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:80
    +
    #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)
    Definition: Usb.cpp:206
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    -
    #define GAMESTOP_VID
    Definition: XBOXUSB.h:39
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    +
    #define GAMESTOP_VID
    Definition: XBOXUSB.h:37
    const uint8_t XBOX_LEDS[]
    Definition: xboxEnums.h:32
    bool getButtonClick(ButtonEnum b)
    Definition: XBOXUSB.cpp:290
    -
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXOLD.h:49
    -
    #define bmREQ_HID_OUT
    Definition: BTD.h:38
    +
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXOLD.h:43
    void setLedRaw(uint8_t value)
    Definition: XBOXUSB.cpp:320
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:78
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    void setLedMode(LEDModeEnum lm)
    Definition: XBOXUSB.cpp:339
    -
    #define MADCATZ_WIRED_PID
    Definition: XBOXUSB.h:45
    +
    #define MADCATZ_WIRED_PID
    Definition: XBOXUSB.h:43
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:206
    -
    Definition: UsbCore.h:190
    -
    #define XBOX_CONTROL_PIPE
    Definition: XBOXOLD.h:31
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    +
    Definition: UsbCore.h:197
    +
    #define XBOX_CONTROL_PIPE
    Definition: XBOXOLD.h:29
    -
    virtual uint8_t Release()
    Definition: XBOXUSB.cpp:223
    +
    uint8_t Release()
    Definition: XBOXUSB.cpp:223
    const uint16_t XBOX_BUTTONS[]
    Definition: xboxEnums.h:41
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:210
    +
    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:761
    -
    virtual uint8_t Poll()
    Definition: XBOXUSB.cpp:231
    +
    #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:764
    +
    uint8_t Poll()
    Definition: XBOXUSB.cpp:231
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    -
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXUSB.h:198
    -
    #define GAMESTOP_WIRED_PID
    Definition: XBOXUSB.h:46
    +
    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 19be58ad..fd8b4e94 100644 --- a/_x_b_o_x_u_s_b_8h.html +++ b/_x_b_o_x_u_s_b_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -93,13 +94,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #include "Usb.h"
    +#include "hid.h"
    #include "xboxEnums.h"
    Include dependency graph for XBOXUSB.h:
    - +
    This graph shows which files directly or indirectly include this file:
    @@ -120,8 +122,6 @@ Classes Macros #define EP_MAXPKTSIZE   32   -#define EP_INTERRUPT   0x03 -  #define XBOX_CONTROL_PIPE   0   #define XBOX_INPUT_PIPE   1 @@ -146,16 +146,14 @@ Macros   #define MADCATZ_WIRED_PID   0xF016   +#define JOYTECH_WIRED_PID   0xBEEF +  #define GAMESTOP_WIRED_PID   0x0401   #define AFTERGLOW_WIRED_PID   0x0213   #define XBOX_REPORT_BUFFER_SIZE   14   -#define bmREQ_HID_OUT   USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE -  -#define HID_REQUEST_SET_REPORT   0x09 -  #define XBOX_MAX_ENDPOINTS   3   @@ -170,21 +168,7 @@ Macros
    -

    Definition at line 25 of file XBOXUSB.h.

    - -
    -
    - -
    -
    - - - - -
    #define EP_INTERRUPT   0x03
    -
    - -

    Definition at line 28 of file XBOXUSB.h.

    +

    Definition at line 26 of file XBOXUSB.h.

    @@ -198,7 +182,7 @@ Macros
    -

    Definition at line 31 of file XBOXUSB.h.

    +

    Definition at line 29 of file XBOXUSB.h.

    @@ -212,7 +196,7 @@ Macros
    -

    Definition at line 32 of file XBOXUSB.h.

    +

    Definition at line 30 of file XBOXUSB.h.

    @@ -226,7 +210,7 @@ Macros
    -

    Definition at line 33 of file XBOXUSB.h.

    +

    Definition at line 31 of file XBOXUSB.h.

    @@ -240,7 +224,7 @@ Macros
    -

    Definition at line 36 of file XBOXUSB.h.

    +

    Definition at line 34 of file XBOXUSB.h.

    @@ -254,7 +238,7 @@ Macros
    -

    Definition at line 37 of file XBOXUSB.h.

    +

    Definition at line 35 of file XBOXUSB.h.

    @@ -268,7 +252,7 @@ Macros
    -

    Definition at line 38 of file XBOXUSB.h.

    +

    Definition at line 36 of file XBOXUSB.h.

    @@ -282,7 +266,7 @@ Macros
    -

    Definition at line 39 of file XBOXUSB.h.

    +

    Definition at line 37 of file XBOXUSB.h.

    @@ -296,7 +280,7 @@ Macros
    -

    Definition at line 41 of file XBOXUSB.h.

    +

    Definition at line 39 of file XBOXUSB.h.

    @@ -310,7 +294,7 @@ Macros
    -

    Definition at line 42 of file XBOXUSB.h.

    +

    Definition at line 40 of file XBOXUSB.h.

    @@ -324,7 +308,7 @@ Macros
    -

    Definition at line 43 of file XBOXUSB.h.

    +

    Definition at line 41 of file XBOXUSB.h.

    @@ -338,7 +322,7 @@ Macros
    -

    Definition at line 44 of file XBOXUSB.h.

    +

    Definition at line 42 of file XBOXUSB.h.

    @@ -352,7 +336,21 @@ Macros
    -

    Definition at line 45 of file XBOXUSB.h.

    +

    Definition at line 43 of file XBOXUSB.h.

    + +
    + + +
    +
    + + + + +
    #define JOYTECH_WIRED_PID   0xBEEF
    +
    + +

    Definition at line 44 of file XBOXUSB.h.

    @@ -366,7 +364,7 @@ Macros
    -

    Definition at line 46 of file XBOXUSB.h.

    +

    Definition at line 45 of file XBOXUSB.h.

    @@ -380,7 +378,7 @@ Macros
    -

    Definition at line 47 of file XBOXUSB.h.

    +

    Definition at line 46 of file XBOXUSB.h.

    @@ -394,35 +392,7 @@ Macros
    -

    Definition at line 49 of file XBOXUSB.h.

    - -
    - - -
    -
    - -

    Definition at line 52 of file XBOXUSB.h.

    - -
    -
    - -
    -
    - - - - -
    #define HID_REQUEST_SET_REPORT   0x09
    -
    - -

    Definition at line 53 of file XBOXUSB.h.

    +

    Definition at line 48 of file XBOXUSB.h.

    @@ -436,7 +406,7 @@ Macros
    -

    Definition at line 55 of file XBOXUSB.h.

    +

    Definition at line 50 of file XBOXUSB.h.

    @@ -445,7 +415,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 03f735e5..ffb0405c 100644 --- a/_x_b_o_x_u_s_b_8h__dep__incl.md5 +++ b/_x_b_o_x_u_s_b_8h__dep__incl.md5 @@ -1 +1 @@ -aef1e874621fe82e06208994ca6c31c1 \ No newline at end of file +18da52fa9e2758f5b169a34307b52822 \ No newline at end of file diff --git a/_x_b_o_x_u_s_b_8h__incl.map b/_x_b_o_x_u_s_b_8h__incl.map index 749333bf..c72dc833 100644 --- a/_x_b_o_x_u_s_b_8h__incl.map +++ b/_x_b_o_x_u_s_b_8h__incl.map @@ -1,5 +1,7 @@ - - - + + + + + diff --git a/_x_b_o_x_u_s_b_8h__incl.md5 b/_x_b_o_x_u_s_b_8h__incl.md5 index f6913543..996076e6 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 @@ -fbb46adf1eb28c436edfb4eb5f8dd91c \ No newline at end of file +ade2f495e451981906f6ba85da0903b4 \ 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 eb88ee73829cedafe3de1e103060be38240669a2..138ad26c1ec19a1f21fd59e763652ee16ad19970 100644 GIT binary patch literal 18016 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 diff --git a/_x_b_o_x_u_s_b_8h_source.html b/_x_b_o_x_u_s_b_8h_source.html index 8f53719e..576ffd6d 100644 --- a/_x_b_o_x_u_s_b_8h_source.html +++ b/_x_b_o_x_u_s_b_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -110,167 +111,164 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    19 #define _xboxusb_h_
    20 
    21 #include "Usb.h"
    -
    22 #include "xboxEnums.h"
    -
    23 
    -
    24 /* Data Xbox 360 taken from descriptors */
    -
    25 #define EP_MAXPKTSIZE 32 // max size for data via USB
    -
    26 
    -
    27 /* Endpoint types */
    -
    28 #define EP_INTERRUPT 0x03
    -
    29 
    -
    30 /* Names we give to the 3 Xbox360 pipes */
    -
    31 #define XBOX_CONTROL_PIPE 0
    -
    32 #define XBOX_INPUT_PIPE 1
    -
    33 #define XBOX_OUTPUT_PIPE 2
    -
    34 
    -
    35 // PID and VID of the different devices
    -
    36 #define XBOX_VID 0x045E // Microsoft Corporation
    -
    37 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz controllers
    -
    38 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    -
    39 #define GAMESTOP_VID 0x0E6F // Gamestop controller
    -
    40 
    -
    41 #define XBOX_WIRED_PID 0x028E // Microsoft 360 Wired controller
    -
    42 #define XBOX_WIRELESS_PID 0x028F // Wireless controller only support charging
    -
    43 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
    -
    44 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
    -
    45 #define MADCATZ_WIRED_PID 0xF016 // Mad Catz wired controller
    -
    46 #define GAMESTOP_WIRED_PID 0x0401 // Gamestop wired controller
    -
    47 #define AFTERGLOW_WIRED_PID 0x0213 // Afterglow wired controller - it uses the same VID as a Gamestop controller
    -
    48 
    -
    49 #define XBOX_REPORT_BUFFER_SIZE 14 // Size of the input report buffer
    -
    50 
    -
    51 // Used in control endpoint header for HID Commands
    -
    52 #define bmREQ_HID_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    -
    53 #define HID_REQUEST_SET_REPORT 0x09
    -
    54 
    -
    55 #define XBOX_MAX_ENDPOINTS 3
    -
    56 
    -
    58 class XBOXUSB : public USBDeviceConfig {
    -
    59 public:
    -
    64  XBOXUSB(USB *pUsb);
    -
    65 
    -
    74  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    79  virtual uint8_t Release();
    -
    84  virtual uint8_t Poll();
    -
    85 
    -
    90  virtual uint8_t GetAddress() {
    -
    91  return bAddress;
    -
    92  };
    -
    93 
    -
    98  virtual bool isReady() {
    -
    99  return bPollEnable;
    -
    100  };
    -
    101 
    -
    108  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
    -
    109  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID || vid == GAMESTOP_VID) && (pid == XBOX_WIRED_PID || pid == MADCATZ_WIRED_PID || pid == GAMESTOP_WIRED_PID || pid == AFTERGLOW_WIRED_PID));
    -
    110  };
    -
    124  uint8_t getButtonPress(ButtonEnum b);
    -
    125  bool getButtonClick(ButtonEnum b);
    -
    134  int16_t getAnalogHat(AnalogHatEnum a);
    -
    135 
    -
    137  void setAllOff() {
    -
    138  setRumbleOn(0, 0);
    -
    139  setLedRaw(0);
    +
    22 #include "hid.h"
    +
    23 #include "xboxEnums.h"
    +
    24 
    +
    25 /* Data Xbox 360 taken from descriptors */
    +
    26 #define EP_MAXPKTSIZE 32 // max size for data via USB
    +
    27 
    +
    28 /* Names we give to the 3 Xbox360 pipes */
    +
    29 #define XBOX_CONTROL_PIPE 0
    +
    30 #define XBOX_INPUT_PIPE 1
    +
    31 #define XBOX_OUTPUT_PIPE 2
    +
    32 
    +
    33 // PID and VID of the different devices
    +
    34 #define XBOX_VID 0x045E // Microsoft Corporation
    +
    35 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz controllers
    +
    36 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
    +
    37 #define GAMESTOP_VID 0x0E6F // Gamestop controller
    +
    38 
    +
    39 #define XBOX_WIRED_PID 0x028E // Microsoft 360 Wired controller
    +
    40 #define XBOX_WIRELESS_PID 0x028F // Wireless controller only support charging
    +
    41 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
    +
    42 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
    +
    43 #define MADCATZ_WIRED_PID 0xF016 // Mad Catz wired controller
    +
    44 #define JOYTECH_WIRED_PID 0xBEEF // For Joytech wired controller
    +
    45 #define GAMESTOP_WIRED_PID 0x0401 // Gamestop wired controller
    +
    46 #define AFTERGLOW_WIRED_PID 0x0213 // Afterglow wired controller - it uses the same VID as a Gamestop controller
    +
    47 
    +
    48 #define XBOX_REPORT_BUFFER_SIZE 14 // Size of the input report buffer
    +
    49 
    +
    50 #define XBOX_MAX_ENDPOINTS 3
    +
    51 
    +
    53 class XBOXUSB : public USBDeviceConfig {
    +
    54 public:
    +
    59  XBOXUSB(USB *pUsb);
    +
    60 
    +
    69  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    +
    74  uint8_t Release();
    +
    79  uint8_t Poll();
    +
    80 
    +
    85  virtual uint8_t GetAddress() {
    +
    86  return bAddress;
    +
    87  };
    +
    88 
    +
    93  virtual bool isReady() {
    +
    94  return bPollEnable;
    +
    95  };
    +
    96 
    +
    103  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    +
    104  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID || vid == GAMESTOP_VID) && (pid == XBOX_WIRED_PID || pid == MADCATZ_WIRED_PID || pid == GAMESTOP_WIRED_PID || pid == AFTERGLOW_WIRED_PID || pid == JOYTECH_WIRED_PID));
    +
    105  };
    +
    119  uint8_t getButtonPress(ButtonEnum b);
    +
    120  bool getButtonClick(ButtonEnum b);
    +
    129  int16_t getAnalogHat(AnalogHatEnum a);
    +
    130 
    +
    132  void setAllOff() {
    +
    133  setRumbleOn(0, 0);
    +
    134  setLedRaw(0);
    +
    135  };
    +
    136 
    +
    138  void setRumbleOff() {
    +
    139  setRumbleOn(0, 0);
    140  };
    -
    141 
    -
    143  void setRumbleOff() {
    -
    144  setRumbleOn(0, 0);
    -
    145  };
    -
    151  void setRumbleOn(uint8_t lValue, uint8_t rValue);
    -
    158  void setLedRaw(uint8_t value);
    -
    159 
    -
    161  void setLedOff() {
    -
    162  setLedRaw(0);
    -
    163  };
    -
    168  void setLedOn(LEDEnum l);
    -
    173  void setLedBlink(LEDEnum l);
    -
    178  void setLedMode(LEDModeEnum lm);
    -
    179 
    -
    184  void attachOnInit(void (*funcOnInit)(void)) {
    -
    185  pFuncOnInit = funcOnInit;
    -
    186  };
    -
    190  bool Xbox360Connected;
    -
    191 
    -
    192 protected:
    - -
    196  uint8_t bAddress;
    - -
    199 
    -
    200 private:
    -
    206  void onInit();
    -
    207  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    -
    208 
    -
    209  bool bPollEnable;
    -
    210 
    -
    211  /* Variables to store the buttons */
    -
    212  uint32_t ButtonState;
    -
    213  uint32_t OldButtonState;
    -
    214  uint16_t ButtonClickState;
    -
    215  int16_t hatValue[4];
    -
    216  uint16_t controllerStatus;
    -
    217 
    -
    218  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    -
    219  bool R2Clicked;
    -
    220 
    -
    221  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    -
    222  uint8_t writeBuf[8]; // General purpose buffer for output data
    -
    223 
    -
    224  void readReport(); // read incoming data
    -
    225  void printReport(); // print incoming date - Uncomment for debugging
    -
    226 
    -
    227  /* Private commands */
    -
    228  void XboxCommand(uint8_t* data, uint16_t nbytes);
    -
    229 };
    -
    230 #endif
    -
    #define XBOX_WIRED_PID
    Definition: XBOXUSB.h:41
    +
    146  void setRumbleOn(uint8_t lValue, uint8_t rValue);
    +
    153  void setLedRaw(uint8_t value);
    +
    154 
    +
    156  void setLedOff() {
    +
    157  setLedRaw(0);
    +
    158  };
    +
    163  void setLedOn(LEDEnum l);
    +
    168  void setLedBlink(LEDEnum l);
    +
    173  void setLedMode(LEDModeEnum lm);
    +
    174 
    +
    179  void attachOnInit(void (*funcOnInit)(void)) {
    +
    180  pFuncOnInit = funcOnInit;
    +
    181  };
    +
    185  bool Xbox360Connected;
    +
    186 
    +
    187 protected:
    + +
    191  uint8_t bAddress;
    + +
    194 
    +
    195 private:
    +
    201  void onInit();
    +
    202  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
    +
    203 
    +
    204  bool bPollEnable;
    +
    205 
    +
    206  /* Variables to store the buttons */
    +
    207  uint32_t ButtonState;
    +
    208  uint32_t OldButtonState;
    +
    209  uint16_t ButtonClickState;
    +
    210  int16_t hatValue[4];
    +
    211  uint16_t controllerStatus;
    +
    212 
    +
    213  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
    +
    214  bool R2Clicked;
    +
    215 
    +
    216  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
    +
    217  uint8_t writeBuf[8]; // General purpose buffer for output data
    +
    218 
    +
    219  void readReport(); // read incoming data
    +
    220  void printReport(); // print incoming date - Uncomment for debugging
    +
    221 
    +
    222  /* Private commands */
    +
    223  void XboxCommand(uint8_t* data, uint16_t nbytes);
    +
    224 };
    +
    225 #endif
    +
    #define XBOX_WIRED_PID
    Definition: XBOXUSB.h:39
    LEDModeEnum
    Definition: xboxEnums.h:24
    void setLedOn(LEDEnum l)
    Definition: XBOXUSB.cpp:328
    -
    #define MADCATZ_VID
    Definition: XBOXUSB.h:37
    -
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXUSB.h:55
    -
    #define JOYTECH_VID
    Definition: XBOXUSB.h:38
    +
    #define MADCATZ_VID
    Definition: XBOXUSB.h:35
    +
    #define XBOX_MAX_ENDPOINTS
    Definition: XBOXUSB.h:50
    +
    #define JOYTECH_VID
    Definition: XBOXUSB.h:36
    +
    virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: XBOXUSB.h:103
    + +
    #define JOYTECH_WIRED_PID
    Definition: XBOXUSB.h:44
    AnalogHatEnum
    -
    USB * pUsb
    Definition: XBOXUSB.h:194
    -
    void setLedOff()
    Definition: XBOXUSB.h:161
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: XBOXUSB.cpp:38
    - +
    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:38
    +
    int16_t getAnalogHat(AnalogHatEnum a)
    Definition: XBOXUSB.cpp:310
    void setLedBlink(LEDEnum l)
    Definition: XBOXUSB.cpp:335
    -
    virtual bool isReady()
    Definition: XBOXUSB.h:98
    -
    #define AFTERGLOW_WIRED_PID
    Definition: XBOXUSB.h:47
    +
    virtual bool isReady()
    Definition: XBOXUSB.h:93
    +
    #define AFTERGLOW_WIRED_PID
    Definition: XBOXUSB.h:46
    LEDEnum
    -
    void attachOnInit(void(*funcOnInit)(void))
    Definition: XBOXUSB.h:184
    -
    uint8_t bAddress
    Definition: XBOXUSB.h:196
    +
    void attachOnInit(void(*funcOnInit)(void))
    Definition: XBOXUSB.h:179
    +
    uint8_t bAddress
    Definition: XBOXUSB.h:191
    uint8_t getButtonPress(ButtonEnum b)
    Definition: XBOXUSB.cpp:282
    Definition: address.h:32
    ButtonEnum
    -
    bool Xbox360Connected
    Definition: XBOXUSB.h:186
    -
    #define XBOX_VID
    Definition: XBOXUSB.h:36
    +
    bool Xbox360Connected
    Definition: XBOXUSB.h:181
    +
    #define XBOX_VID
    Definition: XBOXUSB.h:34
    void setRumbleOn(uint8_t lValue, uint8_t rValue)
    Definition: XBOXUSB.cpp:343
    XBOXUSB(USB *pUsb)
    Definition: XBOXUSB.cpp:23
    -
    virtual uint8_t GetAddress()
    Definition: XBOXUSB.h:90
    -
    #define GAMESTOP_VID
    Definition: XBOXUSB.h:39
    +
    virtual uint8_t GetAddress()
    Definition: XBOXUSB.h:85
    +
    #define GAMESTOP_VID
    Definition: XBOXUSB.h:37
    bool getButtonClick(ButtonEnum b)
    Definition: XBOXUSB.cpp:290
    -
    #define EP_MAXPKTSIZE
    Definition: XBOXUSB.h:25
    -
    virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: XBOXUSB.h:108
    -
    void setRumbleOff()
    Definition: XBOXUSB.h:143
    +
    #define EP_MAXPKTSIZE
    Definition: XBOXUSB.h:26
    +
    void setRumbleOff()
    Definition: XBOXUSB.h:138
    void setLedRaw(uint8_t value)
    Definition: XBOXUSB.cpp:320
    void setLedMode(LEDModeEnum lm)
    Definition: XBOXUSB.cpp:339
    -
    #define MADCATZ_WIRED_PID
    Definition: XBOXUSB.h:45
    - -
    Definition: UsbCore.h:190
    -
    void setAllOff()
    Definition: XBOXUSB.h:137
    -
    virtual uint8_t Release()
    Definition: XBOXUSB.cpp:223
    -
    virtual uint8_t Poll()
    Definition: XBOXUSB.cpp:231
    -
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXUSB.h:198
    -
    #define GAMESTOP_WIRED_PID
    Definition: XBOXUSB.h:46
    +
    #define MADCATZ_WIRED_PID
    Definition: XBOXUSB.h:43
    + +
    Definition: UsbCore.h:197
    +
    void setAllOff()
    Definition: XBOXUSB.h:132
    +
    uint8_t Release()
    Definition: XBOXUSB.cpp:223
    +
    uint8_t Poll()
    Definition: XBOXUSB.cpp:231
    +
    EpInfo epInfo[XBOX_MAX_ENDPOINTS]
    Definition: XBOXUSB.h:193
    +
    #define GAMESTOP_WIRED_PID
    Definition: XBOXUSB.h:45
    diff --git a/address_8h.html b/address_8h.html index 1a11ff89..8611f30e 100644 --- a/address_8h.html +++ b/address_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: address.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -132,8 +133,8 @@ Macros - - + +

    Typedefs

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

    Macro Definition Documentation

    @@ -263,12 +264,12 @@ Typedefs

    Typedef Documentation

    - +
    - +
    typedef void(* UsbDeviceHandleFunc)(UsbDevice *pdev)typedef void(* UsbDeviceHandleFunc) (UsbDevice *pdev)
    @@ -282,7 +283,7 @@ Typedefs diff --git a/address_8h_source.html b/address_8h_source.html index f6c8299c..4da712d1 100644 --- a/address_8h_source.html +++ b/address_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: address.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -115,10 +116,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    +
    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
    @@ -135,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    44  };
    45 } __attribute__((packed));
    46 
    -
    47 // 7 6 5 4 3 2 1 0
    +
    47 // 7 6 5 4 3 2 1 0
    48 // ---------------------------------
    49 // | | H | P | P | P | A | A | A |
    50 // ---------------------------------
    @@ -159,16 +160,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    +
    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
    +
    80  // uint8_t devclass; // device class
    81 } __attribute__((packed));
    82 
    83 class AddressPool {
    @@ -178,10 +179,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    87  virtual void FreeAddress(uint8_t addr) = 0;
    88 };
    89 
    -
    90 typedef void (*UsbDeviceHandleFunc)(UsbDevice *pdev);
    +
    90 typedef void (*UsbDeviceHandleFunc)(UsbDevice *pdev);
    91 
    -
    92 #define ADDR_ERROR_INVALID_INDEX 0xFF
    -
    93 #define ADDR_ERROR_INVALID_ADDRESS 0xFF
    +
    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 {
    @@ -279,7 +280,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    188 
    189  // Performs an operation specified by pfunc for each addressed device
    190 
    - +
    192  if(!pfunc)
    193  return;
    194 
    @@ -356,17 +357,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    265  // It can be rather helpfull to find out if there are hubs attached than getting the exact number of hubs.
    266  //uint8_t GetNumHubs()
    267  //{
    -
    268  // return hubCounter;
    +
    268  // return hubCounter;
    269  //};
    270  //uint8_t GetNumDevices()
    271  //{
    -
    272  // uint8_t counter = 0;
    +
    272  // uint8_t counter = 0;
    273 
    -
    274  // for (uint8_t i=1; i<MAX_DEVICES_ALLOWED; i++)
    -
    275  // if (thePool[i].address != 0);
    -
    276  // counter ++;
    +
    274  // for (uint8_t i=1; i<MAX_DEVICES_ALLOWED; i++)
    +
    275  // if (thePool[i].address != 0);
    +
    276  // counter ++;
    277 
    -
    278  // return counter;
    +
    278  // return counter;
    279  //};
    280 };
    281 
    @@ -385,7 +386,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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:180
    -
    void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
    Definition: address.h:90
    Definition: address.h:32
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    uint8_t bmSndToggle
    Definition: address.h:40
    @@ -401,12 +401,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)
    Definition: address.h:202
    UsbDeviceAddress address
    Definition: address.h:77
    uint8_t bmHub
    Definition: address.h:64
    +
    void(* UsbDeviceHandleFunc)(UsbDevice *pdev)
    Definition: address.h:90
    diff --git a/adk_8cpp.html b/adk_8cpp.html index 432c50a5..c551d280 100644 --- a/adk_8cpp.html +++ b/adk_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: adk.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for adk.cpp:
    diff --git a/adk_8cpp__incl.md5 b/adk_8cpp__incl.md5 index a794ca89..aeb01f6d 100644 --- a/adk_8cpp__incl.md5 +++ b/adk_8cpp__incl.md5 @@ -1 +1 @@ -d6ef7cc264e9225e78397a4cf8f08152 \ No newline at end of file +44064901c7f950ea3e40c91d455ee2ad \ No newline at end of file diff --git a/adk_8cpp_source.html b/adk_8cpp_source.html index dbbff754..99cb8af4 100644 --- a/adk_8cpp_source.html +++ b/adk_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: adk.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -384,8 +385,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    293 #endif
    294 
    295  //FailOnInit:
    -
    296  // USBTRACE("OnInit:");
    -
    297  // goto Fail;
    +
    296  // USBTRACE("OnInit:");
    +
    297  // goto Fail;
    298  //
    299 SwAttempt:
    300 #ifdef DEBUG_USB_HOST
    @@ -445,22 +446,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    354 }
    355 
    -
    357  Notify(PSTR("Endpoint descriptor:"), 0x80);
    -
    358  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    -
    359  PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    -
    360  Notify(PSTR("\r\nType:\t\t"), 0x80);
    -
    361  PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    -
    362  Notify(PSTR("\r\nAddress:\t"), 0x80);
    -
    363  PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    -
    364  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    -
    365  PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    -
    366  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    -
    367  PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    -
    368  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    -
    369  PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    -
    370  Notify(PSTR("\r\n"), 0x80);
    +
    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:766
    +
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:769
    #define ADB_PID
    Definition: adk.h:27
    #define ACCESSORY_STRING_MODEL
    Definition: adk.h:43
    @@ -468,10 +469,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
    Definition: adk.cpp:346
    EpInfo * epinfo
    Definition: address.h:76
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:81
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    uint8_t bmNakPower
    Definition: address.h:42
    -
    virtual uint8_t Release()
    Definition: adk.cpp:336
    +
    uint8_t Release()
    Definition: adk.cpp:336
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: adk.cpp:352
    @@ -479,10 +480,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #define ACCESSORY_STRING_URI
    Definition: adk.h:46
    #define ACCESSORY_STRING_MANUFACTURER
    Definition: adk.h:42
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: adk.cpp:311
    +
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: adk.cpp:311
    USB * pUsb
    Definition: adk.h:73
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:805
    -
    virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: adk.cpp:58
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:808
    +
    uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: adk.cpp:58
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    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
    @@ -492,9 +493,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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:796
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    uint8_t epAddr
    Definition: address.h:33
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    @@ -508,35 +509,36 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:83
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    +
    #define PSTR(str)
    #define ADK_MAX_ENDPOINTS
    Definition: adk.h:49
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: adk.cpp:356
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:80
    +
    #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)
    Definition: Usb.cpp:206
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:206
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: adk.cpp:63
    -
    Definition: UsbCore.h:190
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: adk.cpp:63
    +
    Definition: UsbCore.h:197
    #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:210
    +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    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:761
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:764
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    uint8_t bAddress
    Definition: adk.h:74
    -
    #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
    Definition: UsbCore.h:86
    +
    #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET
    Definition: UsbCore.h:88
    diff --git a/adk_8h.html b/adk_8h.html index d26f844d..c8ca1a91 100644 --- a/adk_8h.html +++ b/adk_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: adk.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -380,7 +381,7 @@ Macros diff --git a/adk_8h__dep__incl.md5 b/adk_8h__dep__incl.md5 index ddb1727d..721031bf 100644 --- a/adk_8h__dep__incl.md5 +++ b/adk_8h__dep__incl.md5 @@ -1 +1 @@ -c99e1b47b64e7d137c66cdf8662c2d34 \ No newline at end of file +e6d0d56c52d3fb6e81b76806cae456b2 \ No newline at end of file diff --git a/adk_8h__incl.md5 b/adk_8h__incl.md5 index 12b6b5d1..78ab8688 100644 --- a/adk_8h__incl.md5 +++ b/adk_8h__incl.md5 @@ -1 +1 @@ -60a0d9759961c77b6c4712add13727e1 \ No newline at end of file +6316d3a392a1c1e1b044b310cd053323 \ No newline at end of file diff --git a/adk_8h_source.html b/adk_8h_source.html index 4248c570..49bbe11c 100644 --- a/adk_8h_source.html +++ b/adk_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: adk.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -174,7 +175,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    84 
    85 public:
    -
    86  ADK(USB *pUsb, const char* manufacturer,
    +
    86  ADK(USB *pUsb, const char* manufacturer,
    87  const char* model,
    88  const char* description,
    89  const char* version,
    @@ -187,9 +188,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    96 
    97 
    98  // USBDeviceConfig implementation
    -
    99  virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
    -
    100  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    101  virtual uint8_t Release();
    +
    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;
    @@ -203,12 +204,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    112  return ready;
    113  };
    114 
    -
    115  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
    +
    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  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    +
    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 */
    @@ -232,14 +233,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #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:346
    -
    virtual uint8_t Release()
    Definition: adk.cpp:336
    +
    uint8_t Release()
    Definition: adk.cpp:336
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: adk.cpp:352
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: adk.cpp:311
    +
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: adk.cpp:311
    USB * pUsb
    Definition: adk.h:73
    -
    virtual uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: adk.cpp:58
    +
    uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: adk.cpp:58
    #define ADK_GETPROTO
    Definition: adk.h:35
    - +
    virtual bool isReady()
    Definition: adk.h:111
    static const uint8_t epDataOutIndex
    Definition: adk.h:70
    @@ -253,15 +254,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    bool ready
    Definition: adk.h:78
    virtual uint8_t GetAddress()
    Definition: adk.h:107
    Definition: address.h:32
    -
    virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: adk.h:115
    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:356
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: adk.cpp:63
    -
    Definition: UsbCore.h:190
    +
    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:63
    +
    Definition: UsbCore.h:197
    uint8_t bNumEP
    Definition: adk.h:77
    #define ADK_VID
    Definition: adk.h:25
    uint8_t bConfNum
    Definition: adk.h:75
    @@ -271,7 +272,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/annotated.html b/annotated.html index 3c6a9048..4dec11f0 100644 --- a/annotated.html +++ b/annotated.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class List + @@ -31,7 +32,7 @@
    - + @@ -73,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages + @@ -185,7 +189,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/arrowdown.png b/arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/arrowright.png b/arrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ee22f937a07d1dbfc27c669d11f8ed13e2f152 GIT binary patch literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/avrpins_8h.html b/avrpins_8h.html index a2912514..e2f35248 100644 --- a/avrpins_8h.html +++ b/avrpins_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: avrpins.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/avrpins_8h_source.html b/avrpins_8h_source.html index 062716c9..a8921eb0 100644 --- a/avrpins_8h_source.html +++ b/avrpins_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: avrpins.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -763,217 +764,468 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    672 // http://balanduino.net/
    673 #define P0 Pd0 /* 0 - PD0 */
    674 #define P1 Pd1 /* 1 - PD1 */
    -
    675 #define P2 Pb2 /* 2 - PB2 */
    -
    676 #define P3 Pd6 /* 3 - PD6 */
    -
    677 #define P4 Pd7 /* 4 - PD7 */
    -
    678 #define P5 Pb3 /* 5 - PB3 */
    -
    679 #define P6 Pb4 /* 6 - PB4 */
    -
    680 #define P7 Pa0 /* 7 - PA0 */
    -
    681 #define P8 Pa1 /* 8 - PA1 */
    -
    682 #define P9 Pa2 /* 9 - PA2 */
    -
    683 #define P10 Pa3 /* 10 - PA3 */
    -
    684 #define P11 Pa4 /* 11 - PA4 */
    -
    685 #define P12 Pa5 /* 12 - PA5 */
    -
    686 #define P13 Pc1 /* 13 - PC1 */
    -
    687 #define P14 Pc0 /* 14 - PC0 */
    -
    688 #define P15 Pd2 /* 15 - PD2 */
    -
    689 #define P16 Pd3 /* 16 - PD3 */
    -
    690 #define P17 Pd4 /* 17 - PD4 */
    -
    691 #define P18 Pd5 /* 18 - PD5 */
    -
    692 #define P19 Pc2 /* 19 - PC2 */
    -
    693 #define P20 Pc3 /* 20 - PC3 */
    -
    694 #define P21 Pc4 /* 21 - PC4 */
    -
    695 #define P22 Pc5 /* 22 - PC5 */
    -
    696 #define P23 Pc6 /* 23 - PC6 */
    -
    697 #define P24 Pc7 /* 24 - PC7 */
    -
    698 #define P25 Pb0 /* 25 - PB0 */
    -
    699 #define P26 Pb1 /* 26 - PB1 */
    -
    700 #define P27 Pb5 /* 27 - PB5 */
    -
    701 #define P28 Pb6 /* 28 - PB6 */
    -
    702 #define P29 Pb7 /* 29 - PB7 */
    -
    703 #define P30 Pa6 /* 30 - PA6 */
    -
    704 #define P31 Pa7 /* 31 - PA7 */
    -
    705 // Balanduino
    -
    706 
    -
    707 #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
    -
    708 // Sanguino pin numbers
    -
    709 // Homepage: http://sanguino.cc/hardware
    -
    710 // Hardware add-on: https://github.com/Lauszus/Sanguino
    -
    711 #define P0 Pb0
    -
    712 #define P1 Pb1
    -
    713 #define P2 Pb2
    -
    714 #define P3 Pb3
    -
    715 #define P4 Pb4
    -
    716 #define P5 Pb5
    -
    717 #define P6 Pb6
    -
    718 #define P7 Pb7
    -
    719 #define P8 Pd0
    -
    720 #define P9 Pd1
    -
    721 #define P10 Pd2
    -
    722 #define P11 Pd3
    -
    723 #define P12 Pd4
    -
    724 #define P13 Pd5
    -
    725 #define P14 Pd6
    -
    726 #define P15 Pd7
    -
    727 #define P16 Pc0
    -
    728 #define P17 Pc1
    -
    729 #define P18 Pc2
    -
    730 #define P19 Pc3
    -
    731 #define P20 Pc4
    -
    732 #define P21 Pc5
    -
    733 #define P22 Pc6
    -
    734 #define P23 Pc7
    -
    735 #define P24 Pa0
    -
    736 #define P25 Pa1
    -
    737 #define P26 Pa2
    -
    738 #define P27 Pa3
    -
    739 #define P28 Pa4
    -
    740 #define P29 Pa5
    -
    741 #define P30 Pa6
    -
    742 #define P31 Pa7
    -
    743 // Sanguino
    -
    744 
    -
    745 #else
    -
    746 #error "Please define board in avrpins.h"
    -
    747 
    -
    748 #endif // Arduino pin definitions
    -
    749 
    -
    750 #endif // __AVR__
    -
    751 
    -
    752 #if defined(__arm__)
    -
    753 
    -
    754 // pointers are 32 bits on ARM
    -
    755 #define pgm_read_pointer(p) pgm_read_dword(p)
    -
    756 
    -
    757 #if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__))
    -
    758 
    -
    759 #include "core_pins.h"
    -
    760 #include "avr_emulation.h"
    -
    761 
    -
    762 #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
    -
    763 #define GPIO_BITBAND_PTR(reg, bit) ((uint8_t *)GPIO_BITBAND_ADDR((reg), (bit)))
    -
    764 
    -
    765 #define MAKE_PIN(className, baseReg, pinNum, configReg) \
    -
    766 class className { \
    -
    767 public: \
    -
    768  static void Set() { \
    -
    769  *GPIO_BITBAND_PTR(baseReg, pinNum) = 1; \
    -
    770  } \
    -
    771  static void Clear() { \
    -
    772  *GPIO_BITBAND_PTR(baseReg, pinNum) = 0; \
    -
    773  } \
    -
    774  static void SetDirRead() { \
    -
    775  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    -
    776  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 0; \
    -
    777  } \
    -
    778  static void SetDirWrite() { \
    -
    779  configReg = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); \
    -
    780  *(GPIO_BITBAND_PTR(baseReg, pinNum) + 640) = 1; \
    -
    781  } \
    -
    782  static uint8_t IsSet() { \
    -
    783  return *(GPIO_BITBAND_PTR(baseReg, pinNum) + 512); \
    +
    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 };
    -
    786 
    -
    787 MAKE_PIN(P0, CORE_PIN0_PORTREG, CORE_PIN0_BIT, CORE_PIN0_CONFIG);
    -
    788 MAKE_PIN(P1, CORE_PIN1_PORTREG, CORE_PIN1_BIT, CORE_PIN1_CONFIG);
    -
    789 MAKE_PIN(P2, CORE_PIN2_PORTREG, CORE_PIN2_BIT, CORE_PIN2_CONFIG);
    -
    790 MAKE_PIN(P3, CORE_PIN3_PORTREG, CORE_PIN3_BIT, CORE_PIN3_CONFIG);
    -
    791 MAKE_PIN(P4, CORE_PIN4_PORTREG, CORE_PIN4_BIT, CORE_PIN4_CONFIG);
    -
    792 MAKE_PIN(P5, CORE_PIN5_PORTREG, CORE_PIN5_BIT, CORE_PIN5_CONFIG);
    -
    793 MAKE_PIN(P6, CORE_PIN6_PORTREG, CORE_PIN6_BIT, CORE_PIN6_CONFIG);
    -
    794 MAKE_PIN(P7, CORE_PIN7_PORTREG, CORE_PIN7_BIT, CORE_PIN7_CONFIG);
    -
    795 MAKE_PIN(P8, CORE_PIN8_PORTREG, CORE_PIN8_BIT, CORE_PIN8_CONFIG);
    -
    796 MAKE_PIN(P9, CORE_PIN9_PORTREG, CORE_PIN9_BIT, CORE_PIN9_CONFIG);
    -
    797 MAKE_PIN(P10, CORE_PIN10_PORTREG, CORE_PIN10_BIT, CORE_PIN10_CONFIG);
    -
    798 MAKE_PIN(P11, CORE_PIN11_PORTREG, CORE_PIN11_BIT, CORE_PIN11_CONFIG);
    -
    799 MAKE_PIN(P12, CORE_PIN12_PORTREG, CORE_PIN12_BIT, CORE_PIN12_CONFIG);
    -
    800 MAKE_PIN(P13, CORE_PIN13_PORTREG, CORE_PIN13_BIT, CORE_PIN13_CONFIG);
    -
    801 MAKE_PIN(P14, CORE_PIN14_PORTREG, CORE_PIN14_BIT, CORE_PIN14_CONFIG);
    -
    802 MAKE_PIN(P15, CORE_PIN15_PORTREG, CORE_PIN15_BIT, CORE_PIN15_CONFIG);
    -
    803 MAKE_PIN(P16, CORE_PIN16_PORTREG, CORE_PIN16_BIT, CORE_PIN16_CONFIG);
    -
    804 MAKE_PIN(P17, CORE_PIN17_PORTREG, CORE_PIN17_BIT, CORE_PIN17_CONFIG);
    -
    805 MAKE_PIN(P18, CORE_PIN18_PORTREG, CORE_PIN18_BIT, CORE_PIN18_CONFIG);
    -
    806 MAKE_PIN(P19, CORE_PIN19_PORTREG, CORE_PIN19_BIT, CORE_PIN19_CONFIG);
    -
    807 MAKE_PIN(P20, CORE_PIN20_PORTREG, CORE_PIN20_BIT, CORE_PIN20_CONFIG);
    -
    808 MAKE_PIN(P21, CORE_PIN21_PORTREG, CORE_PIN21_BIT, CORE_PIN21_CONFIG);
    -
    809 MAKE_PIN(P22, CORE_PIN22_PORTREG, CORE_PIN22_BIT, CORE_PIN22_CONFIG);
    -
    810 MAKE_PIN(P23, CORE_PIN23_PORTREG, CORE_PIN23_BIT, CORE_PIN23_CONFIG);
    -
    811 MAKE_PIN(P24, CORE_PIN24_PORTREG, CORE_PIN24_BIT, CORE_PIN24_CONFIG);
    -
    812 MAKE_PIN(P25, CORE_PIN25_PORTREG, CORE_PIN25_BIT, CORE_PIN25_CONFIG);
    -
    813 MAKE_PIN(P26, CORE_PIN26_PORTREG, CORE_PIN26_BIT, CORE_PIN26_CONFIG);
    -
    814 MAKE_PIN(P27, CORE_PIN27_PORTREG, CORE_PIN27_BIT, CORE_PIN27_CONFIG);
    -
    815 MAKE_PIN(P28, CORE_PIN28_PORTREG, CORE_PIN28_BIT, CORE_PIN28_CONFIG);
    -
    816 MAKE_PIN(P29, CORE_PIN29_PORTREG, CORE_PIN29_BIT, CORE_PIN29_CONFIG);
    -
    817 MAKE_PIN(P30, CORE_PIN30_PORTREG, CORE_PIN30_BIT, CORE_PIN30_CONFIG);
    -
    818 MAKE_PIN(P31, CORE_PIN31_PORTREG, CORE_PIN31_BIT, CORE_PIN31_CONFIG);
    -
    819 MAKE_PIN(P32, CORE_PIN32_PORTREG, CORE_PIN32_BIT, CORE_PIN32_CONFIG);
    -
    820 MAKE_PIN(P33, CORE_PIN33_PORTREG, CORE_PIN33_BIT, CORE_PIN33_CONFIG);
    -
    821 
    -
    822 #undef MAKE_PIN
    -
    823 
    -
    824 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    -
    825 
    -
    826 // SetDirRead:
    -
    827 // Disable interrupts
    -
    828 // Disable the pull up resistor
    -
    829 // Set to INPUT
    -
    830 // Enable PIO
    -
    831 
    -
    832 // SetDirWrite:
    -
    833 // Disable interrupts
    -
    834 // Disable the pull up resistor
    -
    835 // Set to OUTPUT
    -
    836 // Enable PIO
    +
    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 #define MAKE_PIN(className, pio, pinMask) \
    -
    839 class className { \
    -
    840 public: \
    -
    841  static void Set() { \
    -
    842  pio->PIO_SODR = pinMask; \
    -
    843  } \
    -
    844  static void Clear() { \
    -
    845  pio->PIO_CODR = pinMask; \
    -
    846  } \
    -
    847  static void SetDirRead() { \
    -
    848  pio->PIO_IDR = pinMask ; \
    -
    849  pio->PIO_PUDR = pinMask; \
    -
    850  pio->PIO_ODR = pinMask; \
    -
    851  pio->PIO_PER = pinMask; \
    -
    852  } \
    -
    853  static void SetDirWrite() { \
    -
    854  pio->PIO_IDR = pinMask ; \
    -
    855  pio->PIO_PUDR = pinMask; \
    -
    856  pio->PIO_OER = pinMask; \
    -
    857  pio->PIO_PER = pinMask; \
    -
    858  } \
    -
    859  static uint8_t IsSet() { \
    -
    860  return pio->PIO_PDSR & pinMask; \
    -
    861  } \
    -
    862 };
    -
    863 
    -
    864 MAKE_PIN(P9, PIOC, PIO_PC21); // INT
    -
    865 MAKE_PIN(P10, PIOC, PIO_PC29); // SS
    -
    866 MAKE_PIN(P74, PIOA, PIO_PA25); // MISO
    -
    867 MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI
    -
    868 MAKE_PIN(P76, PIOA, PIO_PA27); // CLK
    -
    869 
    -
    870 #undef MAKE_PIN
    -
    871 
    -
    872 #else
    -
    873 #error "Please define board in avrpins.h"
    -
    874 
    -
    875 #endif
    -
    876 
    -
    877 #endif // __arm__
    -
    878 
    -
    879 #endif //_avrpins_h_
    +
    838 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    +
    839 
    +
    840 // SetDirRead:
    +
    841 // Disable interrupts
    +
    842 // Disable the pull up resistor
    +
    843 // Set to INPUT
    +
    844 // Enable PIO
    +
    845 
    +
    846 // SetDirWrite:
    +
    847 // Disable interrupts
    +
    848 // Disable the pull up resistor
    +
    849 // Set to OUTPUT
    +
    850 // Enable PIO
    +
    851 
    +
    852 #define MAKE_PIN(className, pio, pinMask) \
    +
    853 class className { \
    +
    854 public: \
    +
    855  static void Set() { \
    +
    856  pio->PIO_SODR = pinMask; \
    +
    857  } \
    +
    858  static void Clear() { \
    +
    859  pio->PIO_CODR = pinMask; \
    +
    860  } \
    +
    861  static void SetDirRead() { \
    +
    862  pio->PIO_IDR = pinMask ; \
    +
    863  pio->PIO_PUDR = pinMask; \
    +
    864  pio->PIO_ODR = pinMask; \
    +
    865  pio->PIO_PER = pinMask; \
    +
    866  } \
    +
    867  static void SetDirWrite() { \
    +
    868  pio->PIO_IDR = pinMask ; \
    +
    869  pio->PIO_PUDR = pinMask; \
    +
    870  pio->PIO_OER = pinMask; \
    +
    871  pio->PIO_PER = pinMask; \
    +
    872  } \
    +
    873  static uint8_t IsSet() { \
    +
    874  return pio->PIO_PDSR & pinMask; \
    +
    875  } \
    +
    876 };
    +
    877 
    +
    878 // See: http://arduino.cc/en/Hacking/PinMappingSAM3X and variant.cpp
    +
    879 
    +
    880 MAKE_PIN(P0, PIOA, PIO_PA8);
    +
    881 MAKE_PIN(P1, PIOA, PIO_PA9);
    +
    882 MAKE_PIN(P2, PIOB, PIO_PB25);
    +
    883 MAKE_PIN(P3, PIOC, PIO_PC28);
    +
    884 MAKE_PIN(P4, PIOC, PIO_PC26);
    +
    885 MAKE_PIN(P5, PIOC, PIO_PC25);
    +
    886 MAKE_PIN(P6, PIOC, PIO_PC24);
    +
    887 MAKE_PIN(P7, PIOC, PIO_PC23);
    +
    888 MAKE_PIN(P8, PIOC, PIO_PC22);
    +
    889 MAKE_PIN(P9, PIOC, PIO_PC21);
    +
    890 MAKE_PIN(P10, PIOC, PIO_PC29);
    +
    891 MAKE_PIN(P11, PIOD, PIO_PD7);
    +
    892 MAKE_PIN(P12, PIOD, PIO_PD8);
    +
    893 MAKE_PIN(P13, PIOB, PIO_PB27);
    +
    894 MAKE_PIN(P14, PIOD, PIO_PD4);
    +
    895 MAKE_PIN(P15, PIOD, PIO_PD5);
    +
    896 MAKE_PIN(P16, PIOA, PIO_PA13);
    +
    897 MAKE_PIN(P17, PIOA, PIO_PA12);
    +
    898 MAKE_PIN(P18, PIOA, PIO_PA11);
    +
    899 MAKE_PIN(P19, PIOA, PIO_PA10);
    +
    900 MAKE_PIN(P20, PIOB, PIO_PB12);
    +
    901 MAKE_PIN(P21, PIOB, PIO_PB13);
    +
    902 MAKE_PIN(P22, PIOB, PIO_PB26);
    +
    903 MAKE_PIN(P23, PIOA, PIO_PA14);
    +
    904 MAKE_PIN(P24, PIOA, PIO_PA15);
    +
    905 MAKE_PIN(P25, PIOD, PIO_PD0);
    +
    906 MAKE_PIN(P26, PIOD, PIO_PD1);
    +
    907 MAKE_PIN(P27, PIOD, PIO_PD2);
    +
    908 MAKE_PIN(P28, PIOD, PIO_PD3);
    +
    909 MAKE_PIN(P29, PIOD, PIO_PD6);
    +
    910 MAKE_PIN(P30, PIOD, PIO_PD9);
    +
    911 MAKE_PIN(P31, PIOA, PIO_PA7);
    +
    912 MAKE_PIN(P32, PIOD, PIO_PD10);
    +
    913 MAKE_PIN(P33, PIOC, PIO_PC1);
    +
    914 MAKE_PIN(P34, PIOC, PIO_PC2);
    +
    915 MAKE_PIN(P35, PIOC, PIO_PC3);
    +
    916 MAKE_PIN(P36, PIOC, PIO_PC4);
    +
    917 MAKE_PIN(P37, PIOC, PIO_PC5);
    +
    918 MAKE_PIN(P38, PIOC, PIO_PC6);
    +
    919 MAKE_PIN(P39, PIOC, PIO_PC7);
    +
    920 MAKE_PIN(P40, PIOC, PIO_PC8);
    +
    921 MAKE_PIN(P41, PIOC, PIO_PC9);
    +
    922 MAKE_PIN(P42, PIOA, PIO_PA19);
    +
    923 MAKE_PIN(P43, PIOA, PIO_PA20);
    +
    924 MAKE_PIN(P44, PIOC, PIO_PC19);
    +
    925 MAKE_PIN(P45, PIOC, PIO_PC18);
    +
    926 MAKE_PIN(P46, PIOC, PIO_PC17);
    +
    927 MAKE_PIN(P47, PIOC, PIO_PC16);
    +
    928 MAKE_PIN(P48, PIOC, PIO_PC15);
    +
    929 MAKE_PIN(P49, PIOC, PIO_PC14);
    +
    930 MAKE_PIN(P50, PIOC, PIO_PC13);
    +
    931 MAKE_PIN(P51, PIOC, PIO_PC12);
    +
    932 MAKE_PIN(P52, PIOB, PIO_PB21);
    +
    933 MAKE_PIN(P53, PIOB, PIO_PB14);
    +
    934 MAKE_PIN(P54, PIOA, PIO_PA16);
    +
    935 MAKE_PIN(P55, PIOA, PIO_PA24);
    +
    936 MAKE_PIN(P56, PIOA, PIO_PA23);
    +
    937 MAKE_PIN(P57, PIOA, PIO_PA22);
    +
    938 MAKE_PIN(P58, PIOA, PIO_PA6);
    +
    939 MAKE_PIN(P59, PIOA, PIO_PA4);
    +
    940 MAKE_PIN(P60, PIOA, PIO_PA3);
    +
    941 MAKE_PIN(P61, PIOA, PIO_PA2);
    +
    942 MAKE_PIN(P62, PIOB, PIO_PB17);
    +
    943 MAKE_PIN(P63, PIOB, PIO_PB18);
    +
    944 MAKE_PIN(P64, PIOB, PIO_PB19);
    +
    945 MAKE_PIN(P65, PIOB, PIO_PB20);
    +
    946 MAKE_PIN(P66, PIOB, PIO_PB15);
    +
    947 MAKE_PIN(P67, PIOB, PIO_PB16);
    +
    948 MAKE_PIN(P68, PIOA, PIO_PA1);
    +
    949 MAKE_PIN(P69, PIOA, PIO_PA0);
    +
    950 MAKE_PIN(P70, PIOA, PIO_PA17);
    +
    951 MAKE_PIN(P71, PIOA, PIO_PA18);
    +
    952 MAKE_PIN(P72, PIOC, PIO_PC30);
    +
    953 MAKE_PIN(P73, PIOA, PIO_PA21);
    +
    954 MAKE_PIN(P74, PIOA, PIO_PA25); // MISO
    +
    955 MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI
    +
    956 MAKE_PIN(P76, PIOA, PIO_PA27); // CLK
    +
    957 MAKE_PIN(P77, PIOA, PIO_PA28);
    +
    958 MAKE_PIN(P78, PIOB, PIO_PB23); // Unconnected
    +
    959 
    +
    960 #undef MAKE_PIN
    +
    961 
    +
    962 #elif defined(RBL_NRF51822)
    +
    963 
    +
    964 #define MAKE_PIN(className, pin) \
    +
    965 class className { \
    +
    966 public: \
    +
    967  static void Set() { \
    +
    968  nrf_gpio_pin_set(pin); \
    +
    969  } \
    +
    970  static void Clear() { \
    +
    971  nrf_gpio_pin_clear(pin); \
    +
    972  } \
    +
    973  static void SetDirRead() { \
    +
    974  nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); \
    +
    975  } \
    +
    976  static void SetDirWrite() { \
    +
    977  nrf_gpio_cfg_output(pin); \
    +
    978  } \
    +
    979  static uint8_t IsSet() { \
    +
    980  return (uint8_t)nrf_gpio_pin_read(pin); \
    +
    981  } \
    +
    982 };
    +
    983 
    +
    984 // See: pin_transform.c in RBL nRF51822 SDK
    +
    985 MAKE_PIN(P0, Pin_nRF51822_to_Arduino(D0));
    +
    986 MAKE_PIN(P1, Pin_nRF51822_to_Arduino(D1));
    +
    987 MAKE_PIN(P2, Pin_nRF51822_to_Arduino(D2));
    +
    988 MAKE_PIN(P3, Pin_nRF51822_to_Arduino(D3));
    +
    989 MAKE_PIN(P4, Pin_nRF51822_to_Arduino(D4));
    +
    990 MAKE_PIN(P5, Pin_nRF51822_to_Arduino(D5));
    +
    991 MAKE_PIN(P6, Pin_nRF51822_to_Arduino(D6));
    +
    992 MAKE_PIN(P7, Pin_nRF51822_to_Arduino(D7));
    +
    993 MAKE_PIN(P8, Pin_nRF51822_to_Arduino(D8));
    +
    994 MAKE_PIN(P9, Pin_nRF51822_to_Arduino(D9)); // INT
    +
    995 MAKE_PIN(P10, Pin_nRF51822_to_Arduino(D10)); // SS
    +
    996 MAKE_PIN(P11, Pin_nRF51822_to_Arduino(D11));
    +
    997 MAKE_PIN(P12, Pin_nRF51822_to_Arduino(D12));
    +
    998 MAKE_PIN(P13, Pin_nRF51822_to_Arduino(D13));
    +
    999 MAKE_PIN(P14, Pin_nRF51822_to_Arduino(D14));
    +
    1000 MAKE_PIN(P15, Pin_nRF51822_to_Arduino(D15));
    +
    1001 MAKE_PIN(P17, Pin_nRF51822_to_Arduino(D17)); // MISO
    +
    1002 MAKE_PIN(P18, Pin_nRF51822_to_Arduino(D18)); // MOSI
    +
    1003 MAKE_PIN(P16, Pin_nRF51822_to_Arduino(D16)); // CLK
    +
    1004 MAKE_PIN(P19, Pin_nRF51822_to_Arduino(D19));
    +
    1005 MAKE_PIN(P20, Pin_nRF51822_to_Arduino(D20));
    +
    1006 MAKE_PIN(P21, Pin_nRF51822_to_Arduino(D21));
    +
    1007 MAKE_PIN(P22, Pin_nRF51822_to_Arduino(D22));
    +
    1008 MAKE_PIN(P23, Pin_nRF51822_to_Arduino(D23));
    +
    1009 MAKE_PIN(P24, Pin_nRF51822_to_Arduino(D24));
    +
    1010 
    +
    1011 #undef MAKE_PIN
    +
    1012 
    +
    1013 #else
    +
    1014 #error "Please define board in avrpins.h"
    +
    1015 
    +
    1016 #endif
    +
    1017 
    +
    1018 #elif defined(__ARDUINO_X86__) // Intel Galileo, Intel Galileo 2 and Intel Edison
    +
    1019 
    +
    1020 #include <avr/pgmspace.h>
    +
    1021 
    +
    1022 // Pointers are 32 bits on x86
    +
    1023 #define pgm_read_pointer(p) pgm_read_dword(p)
    +
    1024 
    +
    1025 #if PLATFORM_ID == 0xE1 // Edison platform id
    +
    1026 #define pinToFastPin(pin) 1 // As far as I can tell all pins can be used as fast pins
    +
    1027 #endif
    +
    1028 
    +
    1029 // Pin 2 and 3 on the Intel Galileo supports a higher rate,
    +
    1030 // so it is recommended to use one of these as the SS pin.
    +
    1031 
    +
    1032 #define MAKE_PIN(className, pin) \
    +
    1033 class className { \
    +
    1034 public: \
    +
    1035  static void Set() { \
    +
    1036  fastDigitalWrite(pin, HIGH); \
    +
    1037  } \
    +
    1038  static void Clear() { \
    +
    1039  fastDigitalWrite(pin, LOW); \
    +
    1040  } \
    +
    1041  static void SetDirRead() { \
    +
    1042  if (pinToFastPin(pin)) \
    +
    1043  pinMode(pin, INPUT_FAST); \
    +
    1044  else \
    +
    1045  pinMode(pin, INPUT); \
    +
    1046  } \
    +
    1047  static void SetDirWrite() { \
    +
    1048  if (pinToFastPin(pin)) \
    +
    1049  pinMode(pin, OUTPUT_FAST); \
    +
    1050  else \
    +
    1051  pinMode(pin, OUTPUT); \
    +
    1052  } \
    +
    1053  static uint8_t IsSet() { \
    +
    1054  return fastDigitalRead(pin); \
    +
    1055  } \
    +
    1056 };
    +
    1057 
    +
    1058 MAKE_PIN(P0, 0);
    +
    1059 MAKE_PIN(P1, 1);
    +
    1060 MAKE_PIN(P2, 2);
    +
    1061 MAKE_PIN(P3, 3);
    +
    1062 MAKE_PIN(P4, 4);
    +
    1063 MAKE_PIN(P5, 5);
    +
    1064 MAKE_PIN(P6, 6);
    +
    1065 MAKE_PIN(P7, 7);
    +
    1066 MAKE_PIN(P8, 8);
    +
    1067 MAKE_PIN(P9, 9);
    +
    1068 MAKE_PIN(P10, 10);
    +
    1069 MAKE_PIN(P11, 11);
    +
    1070 MAKE_PIN(P12, 12);
    +
    1071 MAKE_PIN(P13, 13);
    +
    1072 MAKE_PIN(P14, 14); // A0
    +
    1073 MAKE_PIN(P15, 15); // A1
    +
    1074 MAKE_PIN(P16, 16); // A2
    +
    1075 MAKE_PIN(P17, 17); // A3
    +
    1076 MAKE_PIN(P18, 18); // A4
    +
    1077 MAKE_PIN(P19, 19); // A5
    +
    1078 
    +
    1079 #undef MAKE_PIN
    +
    1080 
    +
    1081 #elif defined(__MIPSEL__)
    +
    1082 // MIPSEL (MIPS architecture using a little endian byte order)
    +
    1083 
    +
    1084 // MIPS size_t = 4
    +
    1085 #define pgm_read_pointer(p) pgm_read_dword(p)
    +
    1086 
    +
    1087 #define MAKE_PIN(className, pin) \
    +
    1088 class className { \
    +
    1089 public: \
    +
    1090  static void Set() { \
    +
    1091  digitalWrite(pin, HIGH);\
    +
    1092  } \
    +
    1093  static void Clear() { \
    +
    1094  digitalWrite(pin, LOW); \
    +
    1095  } \
    +
    1096  static void SetDirRead() { \
    +
    1097  pinMode(pin, INPUT); \
    +
    1098  } \
    +
    1099  static void SetDirWrite() { \
    +
    1100  pinMode(pin, OUTPUT); \
    +
    1101  } \
    +
    1102  static uint8_t IsSet() { \
    +
    1103  return digitalRead(pin); \
    +
    1104  } \
    +
    1105 };
    +
    1106 
    +
    1107 // 0 .. 13 - Digital pins
    +
    1108 MAKE_PIN(P0, 0); // RX
    +
    1109 MAKE_PIN(P1, 1); // TX
    +
    1110 MAKE_PIN(P2, 2); //
    +
    1111 MAKE_PIN(P3, 3); //
    +
    1112 MAKE_PIN(P4, 4); //
    +
    1113 MAKE_PIN(P5, 5); //
    +
    1114 MAKE_PIN(P6, 6); //
    +
    1115 MAKE_PIN(P7, 7); //
    +
    1116 MAKE_PIN(P8, 8); //
    +
    1117 MAKE_PIN(P9, 9); //
    +
    1118 MAKE_PIN(P10, 10); //
    +
    1119 MAKE_PIN(P11, 11); //
    +
    1120 MAKE_PIN(P12, 12); //
    +
    1121 MAKE_PIN(P13, 13); //
    +
    1122 
    +
    1123 #undef MAKE_PIN
    +
    1124 
    +
    1125 #else
    +
    1126 #error "Please define board in avrpins.h"
    +
    1127 
    +
    1128 #endif
    +
    1129 
    +
    1130 #endif //_avrpins_h_
    diff --git a/cdc___x_r21_b1411_8cpp.html b/cdc___x_r21_b1411_8cpp.html new file mode 100644 index 00000000..c04f5bca --- /dev/null +++ b/cdc___x_r21_b1411_8cpp.html @@ -0,0 +1,111 @@ + + + + + + +USB Host Shield 2.0: cdc_XR21B1411.cpp File Reference + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cdc_XR21B1411.cpp File Reference
    +
    +
    +
    #include "cdc_XR21B1411.h"
    +
    +Include dependency graph for cdc_XR21B1411.cpp:
    +
    +
    + + +
    +
    +

    Go to the source code of this file.

    +
    + + + + diff --git a/cdc___x_r21_b1411_8cpp__incl.map b/cdc___x_r21_b1411_8cpp__incl.map new file mode 100644 index 00000000..4a806b5a --- /dev/null +++ b/cdc___x_r21_b1411_8cpp__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/cdc___x_r21_b1411_8cpp__incl.md5 b/cdc___x_r21_b1411_8cpp__incl.md5 new file mode 100644 index 00000000..488365a4 --- /dev/null +++ b/cdc___x_r21_b1411_8cpp__incl.md5 @@ -0,0 +1 @@ +94c1f3e832d30d1e0699ba30de20f4fa \ No newline at end of file diff --git a/cdc___x_r21_b1411_8cpp__incl.png b/cdc___x_r21_b1411_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..fb15fdd73f394558e7107bda2f7c82985f34f351 GIT binary patch literal 8564 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 literal 0 HcmV?d00001 diff --git a/cdc___x_r21_b1411_8cpp_source.html b/cdc___x_r21_b1411_8cpp_source.html new file mode 100644 index 00000000..fb52973e --- /dev/null +++ b/cdc___x_r21_b1411_8cpp_source.html @@ -0,0 +1,374 @@ + + + + + + +USB Host Shield 2.0: cdc_XR21B1411.cpp Source File + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cdc_XR21B1411.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 "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:769
    + +
    #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
    +
    virtual void autoflowRTS(bool s)
    +
    bool lowspeed
    Definition: address.h:79
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +
    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:808
    +
    uint8_t bNumEP
    Definition: cdcacm.h:175
    +
    EpInfo epInfo[ACM_MAX_ENDPOINTS]
    Definition: cdcacm.h:181
    +
    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
    +
    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
    +
    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:799
    +
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    +
    virtual void wide(bool s)
    Definition: cdcacm.h:245
    +
    virtual void autoflowXON(bool s)
    +
    Definition: address.h:32
    +
    #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
    + +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    +
    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:257
    +
    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
    +
    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:764
    +
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    + +
    + + + + diff --git a/cdc___x_r21_b1411_8h.html b/cdc___x_r21_b1411_8h.html new file mode 100644 index 00000000..bf6e4b52 --- /dev/null +++ b/cdc___x_r21_b1411_8h.html @@ -0,0 +1,1027 @@ + + + + + + +USB Host Shield 2.0: cdc_XR21B1411.h File Reference + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    cdc_XR21B1411.h File Reference
    +
    +
    +
    #include "cdcacm.h"
    +
    +Include dependency graph for cdc_XR21B1411.h:
    +
    +
    + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + +
    +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  XR21B1411
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    #define XR_REG_CUSTOM_DRIVER   (0x020DU)
     
    #define XR_REG_CUSTOM_DRIVER_ACTIVE   (0x0001U)
     
    #define XR_REG_ACM_FLOW_CTL   (0x0216U)
     
    #define XR_REG_FLOW_CTL   (0x0C06U)
     
    #define XR_REG_FLOW_CTL_HALF_DPLX   (0x0008U)
     
    #define XR_REG_FLOW_CTL_MODE_MASK   (0x0007U)
     
    #define XR_REG_FLOW_CTL_NONE   (0x0000U)
     
    #define XR_REG_FLOW_CTL_HW   (0x0001U)
     
    #define XR_REG_FLOW_CTL_SW   (0x0002U)
     
    #define XR_REG_FLOW_CTL_MMMRX   (0x0003U)
     
    #define XR_REG_FLOW_CTL_MMMRXTX   (0x0004U)
     
    #define XR_REG_ACM_GPIO_MODE   (0x0217U)
     
    #define XR_REG_GPIO_MODE   (0x0C0CU)
     
    #define XR_REG_GPIO_MODE_GPIO   (0x0000U)
     
    #define XR_REG_GPIO_MODE_FC_RTSCTS   (0x0001U)
     
    #define XR_REG_GPIO_MODE_FC_DTRDSR   (0x0002U)
     
    #define XR_REG_GPIO_MODE_ATE   (0x0003U)
     
    #define XR_REG_GPIO_MODE_ATE_ADDRESS   (0x0004U)
     
    #define XR_REG_ACM_GPIO_DIR   (0x0218U)
     
    #define XR_REG_GPIO_DIR   (0x0C0DU)
     
    #define XR_REG_ACM_GPIO_INT   (0x0219U)
     
    #define XR_REG_GPIO_INT   (0x0C11U)
     
    #define XR_REG_GPIO_MASK   (0x001FU)
     
    #define XR_REG_UART_ENABLE   (0x0C00U)
     
    #define XR_REG_UART_ENABLE_RX   (0x0002U)
     
    #define XR_REG_UART_ENABLE_TX   (0x0001U)
     
    #define XR_REG_ERROR_STATUS   (0x0C09U)
     
    #define XR_REG_ERROR_STATUS_MASK   (0x00F8U)
     
    #define XR_REG_ERROR_STATUS_ERROR   (0x0070U)
     
    #define XR_REG_ERROR_STATUS_BREAK   (0x0008U)
     
    #define XR_REG_ERROR_STATUS_OVERRUN   (0x0010U)
     
    #define XR_REG_ERROR_STATUS_PARITY   (0x0020U)
     
    #define XR_REG_ERROR_STATUS_FRAME   (0x0040U)
     
    #define XR_REG_ERROR_STATUS_BREAK   (0x0080U)
     
    #define XR_REG_TX_BREAK   (0x0C0AU)
     
    #define XR_REG_XCVR_EN_DELAY   (0x0C0BU)
     
    #define XR_REG_GPIO_SET   (0x0C0EU)
     
    #define XR_REG_GPIO_CLR   (0x0C0FU)
     
    #define XR_REG_GPIO_STATUS   (0x0C10U)
     
    #define XR_REG_CUSTOMISED_INT   (0x0C12U)
     
    #define XR_REG_PIN_PULLUP_ENABLE   (0x0C14U)
     
    #define XR_REG_PIN_PULLDOWN_ENABLE   (0x0C15U)
     
    #define XR_REG_LOOPBACK   (0x0C16U)
     
    #define XR_REG_RX_FIFO_LATENCY   (0x0CC2U)
     
    #define XR_REG_RX_FIFO_LATENCY_ENABLE   (0x0001U)
     
    #define XR_REG_WIDE_MODE   (0x0D02U)
     
    #define XR_REG_WIDE_MODE_ENABLE   (0x0001U)
     
    #define XR_REG_XON_CHAR   (0x0C07U)
     
    #define XR_REG_XOFF_CHAR   (0x0C08U)
     
    #define XR_REG_TX_FIFO_RESET   (0x0C80U)
     
    #define XR_REG_TX_FIFO_COUNT   (0x0C81U)
     
    #define XR_REG_RX_FIFO_RESET   (0x0CC0U)
     
    #define XR_REG_RX_FIFO_COUNT   (0x0CC1U)
     
    #define XR_WRITE_REQUEST_TYPE   (0x40U)
     
    #define XR_READ_REQUEST_TYPE   (0xC0U)
     
    #define XR_MAX_ENDPOINTS   4
     
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define XR_REG_CUSTOM_DRIVER   (0x020DU)
    +
    + +

    Definition at line 24 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_CUSTOM_DRIVER_ACTIVE   (0x0001U)
    +
    + +

    Definition at line 25 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ACM_FLOW_CTL   (0x0216U)
    +
    + +

    Definition at line 27 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_FLOW_CTL   (0x0C06U)
    +
    + +

    Definition at line 28 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_FLOW_CTL_HALF_DPLX   (0x0008U)
    +
    + +

    Definition at line 29 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_FLOW_CTL_MODE_MASK   (0x0007U)
    +
    + +

    Definition at line 30 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_FLOW_CTL_NONE   (0x0000U)
    +
    + +

    Definition at line 31 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_FLOW_CTL_HW   (0x0001U)
    +
    + +

    Definition at line 32 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_FLOW_CTL_SW   (0x0002U)
    +
    + +

    Definition at line 33 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_FLOW_CTL_MMMRX   (0x0003U)
    +
    + +

    Definition at line 34 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_FLOW_CTL_MMMRXTX   (0x0004U)
    +
    + +

    Definition at line 35 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ACM_GPIO_MODE   (0x0217U)
    +
    + +

    Definition at line 37 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_MODE   (0x0C0CU)
    +
    + +

    Definition at line 38 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_MODE_GPIO   (0x0000U)
    +
    + +

    Definition at line 39 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_MODE_FC_RTSCTS   (0x0001U)
    +
    + +

    Definition at line 40 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_MODE_FC_DTRDSR   (0x0002U)
    +
    + +

    Definition at line 41 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_MODE_ATE   (0x0003U)
    +
    + +

    Definition at line 42 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_MODE_ATE_ADDRESS   (0x0004U)
    +
    + +

    Definition at line 43 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ACM_GPIO_DIR   (0x0218U)
    +
    + +

    Definition at line 45 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_DIR   (0x0C0DU)
    +
    + +

    Definition at line 46 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ACM_GPIO_INT   (0x0219U)
    +
    + +

    Definition at line 48 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_INT   (0x0C11U)
    +
    + +

    Definition at line 49 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_MASK   (0x001FU)
    +
    + +

    Definition at line 50 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_UART_ENABLE   (0x0C00U)
    +
    + +

    Definition at line 52 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_UART_ENABLE_RX   (0x0002U)
    +
    + +

    Definition at line 53 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_UART_ENABLE_TX   (0x0001U)
    +
    + +

    Definition at line 54 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ERROR_STATUS   (0x0C09U)
    +
    + +

    Definition at line 56 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ERROR_STATUS_MASK   (0x00F8U)
    +
    + +

    Definition at line 57 of file cdc_XR21B1411.h.

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

    Definition at line 58 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ERROR_STATUS_BREAK   (0x0008U)
    +
    + +

    Definition at line 63 of file cdc_XR21B1411.h.

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

    Definition at line 60 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ERROR_STATUS_PARITY   (0x0020U)
    +
    + +

    Definition at line 61 of file cdc_XR21B1411.h.

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

    Definition at line 62 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_ERROR_STATUS_BREAK   (0x0080U)
    +
    + +

    Definition at line 63 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_TX_BREAK   (0x0C0AU)
    +
    + +

    Definition at line 65 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_XCVR_EN_DELAY   (0x0C0BU)
    +
    + +

    Definition at line 67 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_SET   (0x0C0EU)
    +
    + +

    Definition at line 69 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_CLR   (0x0C0FU)
    +
    + +

    Definition at line 71 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_GPIO_STATUS   (0x0C10U)
    +
    + +

    Definition at line 73 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_CUSTOMISED_INT   (0x0C12U)
    +
    + +

    Definition at line 75 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_PIN_PULLUP_ENABLE   (0x0C14U)
    +
    + +

    Definition at line 77 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_PIN_PULLDOWN_ENABLE   (0x0C15U)
    +
    + +

    Definition at line 79 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_LOOPBACK   (0x0C16U)
    +
    + +

    Definition at line 81 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_RX_FIFO_LATENCY   (0x0CC2U)
    +
    + +

    Definition at line 83 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_RX_FIFO_LATENCY_ENABLE   (0x0001U)
    +
    + +

    Definition at line 84 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_WIDE_MODE   (0x0D02U)
    +
    + +

    Definition at line 86 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_WIDE_MODE_ENABLE   (0x0001U)
    +
    + +

    Definition at line 87 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_XON_CHAR   (0x0C07U)
    +
    + +

    Definition at line 89 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_XOFF_CHAR   (0x0C08U)
    +
    + +

    Definition at line 90 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_TX_FIFO_RESET   (0x0C80U)
    +
    + +

    Definition at line 92 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_TX_FIFO_COUNT   (0x0C81U)
    +
    + +

    Definition at line 93 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_RX_FIFO_RESET   (0x0CC0U)
    +
    + +

    Definition at line 94 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_REG_RX_FIFO_COUNT   (0x0CC1U)
    +
    + +

    Definition at line 95 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_WRITE_REQUEST_TYPE   (0x40U)
    +
    + +

    Definition at line 97 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_READ_REQUEST_TYPE   (0xC0U)
    +
    + +

    Definition at line 99 of file cdc_XR21B1411.h.

    + +
    +
    + +
    +
    + + + + +
    #define XR_MAX_ENDPOINTS   4
    +
    + +

    Definition at line 101 of file cdc_XR21B1411.h.

    + +
    +
    +
    + + + + diff --git a/cdc___x_r21_b1411_8h__dep__incl.map b/cdc___x_r21_b1411_8h__dep__incl.map new file mode 100644 index 00000000..a71f1f70 --- /dev/null +++ b/cdc___x_r21_b1411_8h__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/cdc___x_r21_b1411_8h__dep__incl.md5 b/cdc___x_r21_b1411_8h__dep__incl.md5 new file mode 100644 index 00000000..d1f48836 --- /dev/null +++ b/cdc___x_r21_b1411_8h__dep__incl.md5 @@ -0,0 +1 @@ +250b78e5b50dfc5c4569c99531678ec3 \ No newline at end of file diff --git a/cdc___x_r21_b1411_8h__dep__incl.png b/cdc___x_r21_b1411_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f110787f80370220f905fffe3bf65e14100025ba GIT binary patch literal 4928 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 iATmRhLS|jiEm2?ys>2HP{l7nBIOS$cK7Ypm literal 0 HcmV?d00001 diff --git a/cdc___x_r21_b1411_8h__incl.map b/cdc___x_r21_b1411_8h__incl.map new file mode 100644 index 00000000..e2cc2275 --- /dev/null +++ b/cdc___x_r21_b1411_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/cdc___x_r21_b1411_8h__incl.md5 b/cdc___x_r21_b1411_8h__incl.md5 new file mode 100644 index 00000000..8ab25f05 --- /dev/null +++ b/cdc___x_r21_b1411_8h__incl.md5 @@ -0,0 +1 @@ +ab5d3dff2680fe378e5afcfe3049b74b \ No newline at end of file diff --git a/cdc___x_r21_b1411_8h__incl.png b/cdc___x_r21_b1411_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..0d676005ccc02fddba01833e043b2ac2a36d9328 GIT binary patch literal 5528 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 + + + + + +USB Host Shield 2.0: cdc_XR21B1411.h Source File + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cdc_XR21B1411.h
    +
    +
    +Go to the documentation of this file.
    1 /* Copyright (C) 2015 Andrew J. Kroll
    +
    2  and
    +
    3  Circuits At Home, LTD. All rights reserved.
    +
    4 
    +
    5 This software may be distributed and modified under the terms of the GNU
    +
    6 General Public License version 2 (GPL2) as published by the Free Software
    +
    7 Foundation and appearing in the file GPL2.TXT included in the packaging of
    +
    8 this file. Please note that GPL2 Section 2[b] requires that all works based
    +
    9 on this software must also be made publicly available under the terms of
    +
    10 the GPL2 ("Copyleft").
    +
    11 
    +
    12 Contact information
    +
    13 -------------------
    +
    14 
    +
    15 Circuits At Home, LTD
    +
    16 Web : http://www.circuitsathome.com
    +
    17 e-mail : support@circuitsathome.com
    +
    18  */
    +
    19 #if !defined(__CDC_XR21B1411_H__)
    +
    20 #define __CDC_XR21B1411_H__
    +
    21 
    +
    22 #include "cdcacm.h"
    +
    23 
    +
    24 #define XR_REG_CUSTOM_DRIVER (0x020DU) // DRIVER SELECT
    +
    25 #define XR_REG_CUSTOM_DRIVER_ACTIVE (0x0001U) // 0: CDC 1: CUSTOM
    +
    26 
    +
    27 #define XR_REG_ACM_FLOW_CTL (0x0216U) // FLOW CONTROL REGISTER CDCACM MODE
    +
    28 #define XR_REG_FLOW_CTL (0x0C06U) // FLOW CONTROL REGISTER CUSTOM MODE
    +
    29 #define XR_REG_FLOW_CTL_HALF_DPLX (0x0008U) // 0:FULL DUPLEX 1:HALF DUPLEX
    +
    30 #define XR_REG_FLOW_CTL_MODE_MASK (0x0007U) // MODE BITMASK
    +
    31 #define XR_REG_FLOW_CTL_NONE (0x0000U) // NO FLOW CONTROL
    +
    32 #define XR_REG_FLOW_CTL_HW (0x0001U) // HARDWARE FLOW CONTROL
    +
    33 #define XR_REG_FLOW_CTL_SW (0x0002U) // SOFTWARE FLOW CONTROL
    +
    34 #define XR_REG_FLOW_CTL_MMMRX (0x0003U) // MULTIDROP RX UPON ADDRESS MATCH
    +
    35 #define XR_REG_FLOW_CTL_MMMRXTX (0x0004U) // MULTIDROP RX/TX UPON ADDRESS MATCH
    +
    36 
    +
    37 #define XR_REG_ACM_GPIO_MODE (0x0217U) // GPIO MODE REGISTER IN CDCACM MODE
    +
    38 #define XR_REG_GPIO_MODE (0x0C0CU) // GPIO MODE REGISTER IN CUSTOM MODE
    +
    39 #define XR_REG_GPIO_MODE_GPIO (0x0000U) // ALL GPIO PINS ACM PROGRAMMABLE
    +
    40 #define XR_REG_GPIO_MODE_FC_RTSCTS (0x0001U) // AUTO RTSCTS HW FC (GPIO 4/5)
    +
    41 #define XR_REG_GPIO_MODE_FC_DTRDSR (0x0002U) // AUTO DTRDSR HW FC (GPIO 2/3)
    +
    42 #define XR_REG_GPIO_MODE_ATE (0x0003U) // AUTO TRANSCEIVER ENABLE DURING TX (GPIO 5)
    +
    43 #define XR_REG_GPIO_MODE_ATE_ADDRESS (0x0004U) // AUTO TRANSCEIVER ENABLE ON ADDRESS MATCH (GPIO 5)
    +
    44 
    +
    45 #define XR_REG_ACM_GPIO_DIR (0x0218U) // GPIO DIRECTION REGISTER CDCACM MODE, 0:IN 1:OUT
    +
    46 #define XR_REG_GPIO_DIR (0x0C0DU) // GPIO DIRECTION REGISTER CUSTOM MODE, 0:IN 1:OUT
    +
    47 
    +
    48 #define XR_REG_ACM_GPIO_INT (0x0219U) // GPIO PIN CHANGE INTERRUPT ENABLE CDCACM MODE, 0: ENABLED 1: DISABLED
    +
    49 #define XR_REG_GPIO_INT (0x0C11U) // GPIO PIN CHANGE INTERRUPT ENABLE CUSTOM MODE, 0: ENABLED 1: DISABLED
    +
    50 #define XR_REG_GPIO_MASK (0x001FU) // GPIO REGISTERS BITMASK
    +
    51 
    +
    52 #define XR_REG_UART_ENABLE (0x0C00U) // UART I/O ENABLE REGISTER
    +
    53 #define XR_REG_UART_ENABLE_RX (0x0002U) // 0:DISABLED 1:ENABLED
    +
    54 #define XR_REG_UART_ENABLE_TX (0x0001U) // 0:DISABLED 1:ENABLED
    +
    55 
    +
    56 #define XR_REG_ERROR_STATUS (0x0C09U) // ERROR STATUS REGISTER
    +
    57 #define XR_REG_ERROR_STATUS_MASK (0x00F8U) // ERROR STATUS BITMASK
    +
    58 #define XR_REG_ERROR_STATUS_ERROR (0x0070U) // ERROR STATUS ERROR BITMASK
    +
    59 #define XR_REG_ERROR_STATUS_BREAK (0x0008U) // BREAK HAS BEEN DETECTED
    +
    60 #define XR_REG_ERROR_STATUS_OVERRUN (0x0010U) // RX OVERRUN ERROR
    +
    61 #define XR_REG_ERROR_STATUS_PARITY (0x0020U) // PARITY ERROR
    +
    62 #define XR_REG_ERROR_STATUS_FRAME (0x0040U) // FRAMING ERROR
    +
    63 #define XR_REG_ERROR_STATUS_BREAK (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
    +
    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
    +
    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:304
    +
    #define XR_REG_FLOW_CTL_HW
    Definition: cdc_XR21B1411.h:32
    +
    bool enhanced
    Definition: cdcacm.h:149
    +
    bool wide
    Definition: cdcacm.h:152
    +
    virtual void autoflowXON(bool s)
    +
    bool autoflow_XON
    Definition: cdcacm.h:155
    +
    bool autoflow_RTS
    Definition: cdcacm.h:153
    +
    #define XR_REG_FLOW_CTL_SW
    Definition: cdc_XR21B1411.h:33
    +
    #define XR_READ_REQUEST_TYPE
    Definition: cdc_XR21B1411.h:99
    + +
    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 SetLineCoding(const LINE_CODING *dataptr)
    Definition: cdcacm.cpp:300
    + + +
    #define XR_REG_FLOW_CTL_HALF_DPLX
    Definition: cdc_XR21B1411.h:29
    +
    virtual tty_features enhanced_features(void)
    +
    virtual void autoflowDSR(bool s)
    +
    bool half_duplex
    Definition: cdcacm.h:156
    + +
    Definition: UsbCore.h:197
    +
    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
    +
    #define XR_REG_GPIO_MODE_GPIO
    Definition: cdc_XR21B1411.h:39
    +
    #define XR_REG_FLOW_CTL_MODE_MASK
    Definition: cdc_XR21B1411.h:30
    +
    + + + + diff --git a/cdcacm_8cpp.html b/cdcacm_8cpp.html index 8732c352..4a062855 100644 --- a/cdcacm_8cpp.html +++ b/cdcacm_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcacm.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for cdcacm.cpp:
    diff --git a/cdcacm_8cpp__incl.md5 b/cdcacm_8cpp__incl.md5 index 49395eca..9fd4609d 100644 --- a/cdcacm_8cpp__incl.md5 +++ b/cdcacm_8cpp__incl.md5 @@ -1 +1 @@ -b7b7a67edb342e99305bf84049fe6e3a \ No newline at end of file +8836c5951dac28c739547b666b24d9f8 \ No newline at end of file diff --git a/cdcacm_8cpp_source.html b/cdcacm_8cpp_source.html index e69fbb75..080d3116 100644 --- a/cdcacm_8cpp_source.html +++ b/cdcacm_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcacm.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -121,429 +122,418 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    30 qNextPollTime(0),
    31 bPollEnable(false),
    32 ready(false) {
    -
    33  for(uint8_t i = 0; i < ACM_MAX_ENDPOINTS; i++) {
    -
    34  epInfo[i].epAddr = 0;
    -
    35  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    36  epInfo[i].epAttribs = 0;
    -
    37  //epInfo[i].bmNakPower = USB_NAK_NOWAIT;
    - +
    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].epAttribs = 0;
    +
    39 
    -
    40  //if (!i)
    - -
    42  }
    -
    43  if(pUsb)
    - -
    45 }
    +
    40  }
    +
    41  if(pUsb)
    + +
    43 }
    +
    44 
    +
    45 uint8_t ACM::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    46 
    -
    47 uint8_t ACM::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    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  rcode = pAsync->OnInit(this);
    -
    174 
    -
    175  if(rcode)
    -
    176  goto FailOnInit;
    -
    177 
    -
    178  USBTRACE("ACM configured\r\n");
    -
    179 
    -
    180  ready = true;
    -
    181 
    -
    182  //bPollEnable = true;
    +
    47  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    +
    48 
    +
    49  uint8_t buf[constBufSize];
    +
    50  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    +
    51 
    +
    52  uint8_t rcode;
    +
    53  UsbDevice *p = NULL;
    +
    54  EpInfo *oldep_ptr = NULL;
    +
    55  uint8_t num_of_conf; // number of configurations
    +
    56 
    +
    57  AddressPool &addrPool = pUsb->GetAddressPool();
    +
    58 
    +
    59  USBTRACE("ACM Init\r\n");
    +
    60 
    +
    61  if(bAddress)
    + +
    63 
    +
    64  // Get pointer to pseudo device with address 0 assigned
    +
    65  p = addrPool.GetUsbDevicePtr(0);
    +
    66 
    +
    67  if(!p)
    + +
    69 
    +
    70  if(!p->epinfo) {
    +
    71  USBTRACE("epinfo\r\n");
    + +
    73  }
    +
    74 
    +
    75  // Save old pointer to EP_RECORD of address 0
    +
    76  oldep_ptr = p->epinfo;
    +
    77 
    +
    78  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    +
    79  p->epinfo = epInfo;
    +
    80 
    +
    81  p->lowspeed = lowspeed;
    +
    82 
    +
    83  // Get device descriptor
    +
    84  rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf);
    +
    85 
    +
    86  // Restore p->epinfo
    +
    87  p->epinfo = oldep_ptr;
    +
    88 
    +
    89  if(rcode)
    +
    90  goto FailGetDevDescr;
    +
    91 
    +
    92  // Allocate new address according to device class
    +
    93  bAddress = addrPool.AllocAddress(parent, false, port);
    +
    94 
    +
    95  if(!bAddress)
    + +
    97 
    +
    98  // Extract Max Packet Size from the device descriptor
    + +
    100 
    +
    101  // Assign new address to the device
    +
    102  rcode = pUsb->setAddr(0, 0, bAddress);
    +
    103 
    +
    104  if(rcode) {
    +
    105  p->lowspeed = false;
    +
    106  addrPool.FreeAddress(bAddress);
    +
    107  bAddress = 0;
    +
    108  USBTRACE2("setAddr:", rcode);
    +
    109  return rcode;
    +
    110  }
    +
    111 
    +
    112  USBTRACE2("Addr:", bAddress);
    +
    113 
    +
    114  p->lowspeed = false;
    +
    115 
    +
    116  p = addrPool.GetUsbDevicePtr(bAddress);
    +
    117 
    +
    118  if(!p)
    + +
    120 
    +
    121  p->lowspeed = lowspeed;
    +
    122 
    +
    123  num_of_conf = udd->bNumConfigurations;
    +
    124 
    +
    125  // Assign epInfo to epinfo pointer
    +
    126  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    +
    127 
    +
    128  if(rcode)
    +
    129  goto FailSetDevTblEntry;
    +
    130 
    +
    131  USBTRACE2("NC:", num_of_conf);
    +
    132 
    +
    133  for(uint8_t i = 0; i < num_of_conf; i++) {
    + + + + + +
    139  CP_MASK_COMPARE_PROTOCOL > CdcControlParser(this);
    +
    140 
    + +
    142  CP_MASK_COMPARE_CLASS> CdcDataParser(this);
    +
    143 
    +
    144  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcControlParser);
    +
    145 
    +
    146  if(rcode)
    +
    147  goto FailGetConfDescr;
    +
    148 
    +
    149  rcode = pUsb->getConfDescr(bAddress, 0, i, &CdcDataParser);
    +
    150 
    +
    151  if(rcode)
    +
    152  goto FailGetConfDescr;
    +
    153 
    +
    154  if(bNumEP > 1)
    +
    155  break;
    +
    156  } // for
    +
    157 
    +
    158  if(bNumEP < 4)
    + +
    160 
    +
    161  // Assign epInfo to epinfo pointer
    + +
    163 
    +
    164  USBTRACE2("Conf:", bConfNum);
    +
    165 
    +
    166  // Set Configuration Value
    +
    167  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    +
    168 
    +
    169  if(rcode)
    +
    170  goto FailSetConfDescr;
    +
    171 
    +
    172  // Set up features status
    + +
    174  half_duplex(false);
    +
    175  autoflowRTS(false);
    +
    176  autoflowDSR(false);
    +
    177  autoflowXON(false);
    +
    178  wide(false); // Always false, because this is only available in custom mode.
    +
    179  rcode = pAsync->OnInit(this);
    +
    180 
    +
    181  if(rcode)
    +
    182  goto FailOnInit;
    183 
    -
    184  //USBTRACE("Poll enabled\r\n");
    -
    185  return 0;
    -
    186 
    -
    187 FailGetDevDescr:
    -
    188 #ifdef DEBUG_USB_HOST
    - -
    190  goto Fail;
    -
    191 #endif
    +
    184  USBTRACE("ACM configured\r\n");
    +
    185 
    +
    186  ready = true;
    +
    187 
    +
    188  //bPollEnable = true;
    +
    189 
    +
    190  //USBTRACE("Poll enabled\r\n");
    +
    191  return 0;
    192 
    -
    193 FailSetDevTblEntry:
    +
    193 FailGetDevDescr:
    194 #ifdef DEBUG_USB_HOST
    - +
    196  goto Fail;
    197 #endif
    198 
    -
    199 FailGetConfDescr:
    +
    199 FailSetDevTblEntry:
    200 #ifdef DEBUG_USB_HOST
    - +
    202  goto Fail;
    203 #endif
    204 
    -
    205 FailSetConfDescr:
    +
    205 FailGetConfDescr:
    206 #ifdef DEBUG_USB_HOST
    - +
    208  goto Fail;
    209 #endif
    210 
    -
    211 FailOnInit:
    +
    211 FailSetConfDescr:
    212 #ifdef DEBUG_USB_HOST
    -
    213  USBTRACE("OnInit:");
    -
    214 #endif
    -
    215 
    -
    216 #ifdef DEBUG_USB_HOST
    -
    217 Fail:
    -
    218  NotifyFail(rcode);
    -
    219 #endif
    -
    220  Release();
    -
    221  return rcode;
    -
    222 }
    -
    223 
    -
    224 void ACM::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    225  ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
    -
    226  ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
    -
    227  ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
    -
    228 
    -
    229  bConfNum = conf;
    -
    230 
    -
    231  uint8_t index;
    -
    232 
    -
    233  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
    -
    234  index = epInterruptInIndex;
    -
    235  else
    -
    236  if((pep->bmAttributes & 0x02) == 2)
    -
    237  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    -
    238  else
    -
    239  return;
    -
    240 
    -
    241  // Fill in the endpoint info structure
    -
    242  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    243  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    244  epInfo[index].epAttribs = 0;
    -
    245 
    -
    246  bNumEP++;
    -
    247 
    - -
    249 }
    -
    250 
    -
    251 uint8_t ACM::Release() {
    - + +
    214  goto Fail;
    +
    215 #endif
    +
    216 
    +
    217 FailOnInit:
    +
    218 #ifdef DEBUG_USB_HOST
    +
    219  USBTRACE("OnInit:");
    +
    220 #endif
    +
    221 
    +
    222 #ifdef DEBUG_USB_HOST
    +
    223 Fail:
    +
    224  NotifyFail(rcode);
    +
    225 #endif
    +
    226  Release();
    +
    227  return rcode;
    +
    228 }
    +
    229 
    +
    230 void ACM::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    +
    231  //ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
    +
    232  //ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
    +
    233  //ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
    +
    234 
    +
    235  bConfNum = conf;
    +
    236 
    +
    237  uint8_t index;
    +
    238 
    +
    239  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
    +
    240  index = epInterruptInIndex;
    +
    241  else
    +
    242  if((pep->bmAttributes & 0x02) == 2)
    +
    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].epAttribs = 0;
    +
    251 
    +
    252  bNumEP++;
    253 
    -
    254  bControlIface = 0;
    -
    255  bDataIface = 0;
    -
    256  bNumEP = 1;
    -
    257 
    -
    258  bAddress = 0;
    -
    259  qNextPollTime = 0;
    -
    260  bPollEnable = false;
    -
    261  return 0;
    -
    262 }
    -
    263 
    -
    264 uint8_t ACM::Poll() {
    -
    265  uint8_t rcode = 0;
    -
    266 
    -
    267  if(!bPollEnable)
    -
    268  return 0;
    -
    269 
    -
    270  //uint32_t time_now = millis();
    -
    271 
    -
    272  //if (qNextPollTime <= time_now)
    -
    273  //{
    -
    274  // qNextPollTime = time_now + 100;
    -
    275 
    -
    276  // uint8_t rcode;
    -
    277  // const uint8_t constBufSize = 16;
    -
    278  // uint8_t buf[constBufSize];
    + +
    255 }
    +
    256 
    +
    257 uint8_t ACM::Release() {
    +
    258  ready = false;
    + +
    260 
    +
    261  bControlIface = 0;
    +
    262  bDataIface = 0;
    +
    263  bNumEP = 1;
    +
    264 
    +
    265  bAddress = 0;
    +
    266  qNextPollTime = 0;
    +
    267  bPollEnable = false;
    +
    268  return 0;
    +
    269 }
    +
    270 
    +
    271 uint8_t ACM::Poll() {
    +
    272  uint8_t rcode = 0;
    +
    273 
    +
    274  if(!bPollEnable)
    +
    275  return 0;
    +
    276 
    +
    277  return rcode;
    +
    278 }
    279 
    -
    280  // for (uint8_t i=0; i<constBufSize; i++)
    -
    281  // buf[i] = 0;
    -
    282 
    -
    283  // uint16_t read = (constBufSize > epInfo[epInterruptInIndex].maxPktSize)
    -
    284  // ? epInfo[epInterruptInIndex].maxPktSize : constBufSize;
    -
    285  // rcode = pUsb->inTransfer(bAddress, epInfo[epInterruptInIndex].epAddr, &read, buf);
    -
    286 
    -
    287  // if (rcode)
    -
    288  // return rcode;
    -
    289 
    -
    290  // for (uint8_t i=0; i<read; i++)
    -
    291  // {
    -
    292  // PrintHex<uint8_t>(buf[i]);
    -
    293  // USB_HOST_SERIAL.print(" ");
    -
    294  // }
    -
    295  // USBTRACE("\r\n");
    -
    296  //}
    -
    297  return rcode;
    +
    280 uint8_t ACM::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    +
    281  return pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    +
    282 }
    +
    283 
    +
    284 uint8_t ACM::SndData(uint16_t nbytes, uint8_t *dataptr) {
    +
    285  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    +
    286 }
    +
    287 
    +
    288 uint8_t ACM::SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
    +
    289  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
    +
    290 }
    +
    291 
    +
    292 uint8_t ACM::GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
    +
    293  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
    +
    294 }
    +
    295 
    +
    296 uint8_t ACM::ClearCommFeature(uint16_t fid) {
    +
    297  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_CLEAR_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, 0, 0, NULL, NULL));
    298 }
    299 
    -
    300 uint8_t ACM::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    -
    301  return pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    +
    300 uint8_t ACM::SetLineCoding(const LINE_CODING *dataptr) {
    +
    301  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
    302 }
    303 
    -
    304 uint8_t ACM::SndData(uint16_t nbytes, uint8_t *dataptr) {
    -
    305  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    +
    304 uint8_t ACM::GetLineCoding(LINE_CODING *dataptr) {
    +
    305  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
    306 }
    307 
    -
    308 uint8_t ACM::SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
    -
    309  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
    +
    308 uint8_t ACM::SetControlLineState(uint8_t state) {
    +
    309  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_CONTROL_LINE_STATE, state, 0, bControlIface, 0, 0, NULL, NULL));
    310 }
    311 
    -
    312 uint8_t ACM::GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr) {
    -
    313  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, nbytes, nbytes, dataptr, NULL));
    +
    312 uint8_t ACM::SendBreak(uint16_t duration) {
    +
    313  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SEND_BREAK, (duration & 0xff), (duration >> 8), bControlIface, 0, 0, NULL, NULL));
    314 }
    315 
    -
    316 uint8_t ACM::ClearCommFeature(uint16_t fid) {
    -
    317  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_CLEAR_COMM_FEATURE, (fid & 0xff), (fid >> 8), bControlIface, 0, 0, NULL, NULL));
    -
    318 }
    -
    319 
    -
    320 uint8_t ACM::SetLineCoding(const LINE_CODING *dataptr) {
    -
    321  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
    -
    322 }
    -
    323 
    -
    324 uint8_t ACM::GetLineCoding(LINE_CODING *dataptr) {
    -
    325  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCIN, CDC_GET_LINE_CODING, 0x00, 0x00, bControlIface, sizeof (LINE_CODING), sizeof (LINE_CODING), (uint8_t*)dataptr, NULL));
    -
    326 }
    -
    327 
    -
    328 uint8_t ACM::SetControlLineState(uint8_t state) {
    -
    329  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SET_CONTROL_LINE_STATE, state, 0, bControlIface, 0, 0, NULL, NULL));
    -
    330 }
    -
    331 
    -
    332 uint8_t ACM::SendBreak(uint16_t duration) {
    -
    333  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_CDCOUT, CDC_SEND_BREAK, (duration & 0xff), (duration >> 8), bControlIface, 0, 0, NULL, NULL));
    -
    334 }
    -
    335 
    - -
    337  Notify(PSTR("Endpoint descriptor:"), 0x80);
    -
    338  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    -
    339  PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    -
    340  Notify(PSTR("\r\nType:\t\t"), 0x80);
    -
    341  PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    -
    342  Notify(PSTR("\r\nAddress:\t"), 0x80);
    -
    343  PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    -
    344  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    -
    345  PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    -
    346  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    -
    347  PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    -
    348  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    -
    349  PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    -
    350  Notify(PSTR("\r\n"), 0x80);
    -
    351 }
    -
    #define USB_CLASS_COM_AND_CDC_CTRL
    Definition: UsbCore.h:56
    -
    #define USB_CLASS_CDC_DATA
    Definition: UsbCore.h:63
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:766
    + +
    317  Notify(PSTR("Endpoint descriptor:"), 0x80);
    +
    318  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    +
    319  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    +
    320  Notify(PSTR("\r\nType:\t\t"), 0x80);
    +
    321  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    +
    322  Notify(PSTR("\r\nAddress:\t"), 0x80);
    +
    323  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    +
    324  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    +
    325  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    +
    326  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    +
    327  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    +
    328  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    +
    329  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    +
    330  Notify(PSTR("\r\n"), 0x80);
    +
    331 }
    +
    #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:769
    #define CDC_SUBCLASS_ACM
    Definition: cdcacm.h:27
    +
    virtual tty_features enhanced_features(void)
    Definition: cdcacm.h:222
    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
    +
    #define CP_MASK_COMPARE_PROTOCOL
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:81
    -
    static const uint8_t epInterruptInIndex
    Definition: cdcacm.h:142
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +
    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:141
    +
    static const uint8_t epDataOutIndex
    Definition: cdcacm.h:166
    #define CDC_CLEAR_COMM_FEATURE
    Definition: cdcacm.h:55
    -
    uint32_t qNextPollTime
    Definition: cdcacm.h:151
    +
    uint32_t qNextPollTime
    Definition: cdcacm.h:176
    -
    uint8_t bControlIface
    Definition: cdcacm.h:148
    +
    uint8_t bControlIface
    Definition: cdcacm.h:173
    #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
    -
    bool ready
    Definition: cdcacm.h:153
    +
    volatile bool ready
    Definition: cdcacm.h:178
    #define NotifyFail(...)
    Definition: message.h:55
    -
    uint8_t bDataIface
    Definition: cdcacm.h:149
    -
    USB * pUsb
    Definition: cdcacm.h:144
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:805
    -
    uint8_t bNumEP
    Definition: cdcacm.h:150
    +
    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:808
    +
    uint8_t bNumEP
    Definition: cdcacm.h:175
    #define bmREQ_CDCOUT
    Definition: cdcacm.h:22
    -
    EpInfo epInfo[ACM_MAX_ENDPOINTS]
    Definition: cdcacm.h:155
    +
    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
    -
    bool bPollEnable
    Definition: cdcacm.h:152
    +
    #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 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
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
    -
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: cdcacm.cpp:336
    +
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: cdcacm.cpp:316
    #define Notify(...)
    Definition: message.h:44
    -
    CDCAsyncOper * pAsync
    Definition: cdcacm.h:145
    +
    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:796
    -
    #define ACM_MAX_ENDPOINTS
    Definition: cdcacm.h:136
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    +
    #define ACM_MAX_ENDPOINTS
    Definition: cdcacm.h:161
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    -
    uint8_t GetLineCoding(LINE_CODING *dataptr)
    Definition: cdcacm.cpp:324
    +
    virtual void wide(bool s)
    Definition: cdcacm.h:245
    +
    uint8_t GetLineCoding(LINE_CODING *dataptr)
    Definition: cdcacm.cpp:304
    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 bmREQ_CDCIN
    Definition: cdcacm.h:23
    -
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:304
    -
    virtual uint8_t Poll()
    Definition: cdcacm.cpp:264
    +
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:284
    +
    uint8_t Poll()
    Definition: cdcacm.cpp:271
    Definition: address.h:32
    #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:292
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcacm.cpp:47
    -
    #define CP_MASK_COMPARE_SUBCLASS
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcacm.cpp:45
    +
    #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:140
    -
    uint8_t bAddress
    Definition: cdcacm.h:146
    +
    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
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:83
    +
    #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:320
    +
    uint8_t SetLineCoding(const LINE_CODING *dataptr)
    Definition: cdcacm.cpp:300
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcacm.cpp:224
    -
    uint8_t SendBreak(uint16_t duration)
    Definition: cdcacm.cpp:332
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:80
    +
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcacm.cpp:230
    +
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    +
    uint8_t SendBreak(uint16_t duration)
    Definition: cdcacm.cpp:312
    +
    #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)
    Definition: Usb.cpp:206
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    -
    uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:312
    -
    virtual uint8_t Release()
    Definition: cdcacm.cpp:251
    -
    uint8_t bConfNum
    Definition: cdcacm.h:147
    +
    #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:292
    +
    uint8_t Release()
    Definition: cdcacm.cpp:257
    +
    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:78
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    #define CDC_SET_CONTROL_LINE_STATE
    Definition: cdcacm.h:64
    -
    virtual uint8_t OnInit(ACM *pacm)=0
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:206
    -
    Definition: UsbCore.h:190
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:210
    +
    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
    -
    uint8_t SetControlLineState(uint8_t state)
    Definition: cdcacm.cpp:328
    -
    uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:308
    -
    uint8_t ClearCommFeature(uint16_t fid)
    Definition: cdcacm.cpp:316
    +
    tty_features _enhanced_status
    Definition: cdcacm.h:179
    +
    uint8_t SetControlLineState(uint8_t state)
    Definition: cdcacm.cpp:308
    +
    uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:288
    +
    uint8_t ClearCommFeature(uint16_t fid)
    Definition: cdcacm.cpp:296
    +
    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:761
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:764
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    -
    uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
    Definition: cdcacm.cpp:300
    +
    uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
    Definition: cdcacm.cpp:280
    diff --git a/cdcacm_8h.html b/cdcacm_8h.html index 32e1fea2..f0bde03b 100644 --- a/cdcacm_8h.html +++ b/cdcacm_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcacm.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -106,7 +107,7 @@ This graph shows which files directly or indirectly include this file:
    - +

    Go to the source code of this file.

    @@ -125,6 +126,8 @@ Classes   class  CDCAsyncOper   +struct  tty_features +  class  ACM   @@ -969,7 +972,7 @@ Typedefs
    -

    Definition at line 136 of file cdcacm.h.

    +

    Definition at line 161 of file cdcacm.h.

    @@ -1016,7 +1019,7 @@ Typedefs diff --git a/cdcacm_8h__dep__incl.map b/cdcacm_8h__dep__incl.map index 6b4e7e53..a9251060 100644 --- a/cdcacm_8h__dep__incl.map +++ b/cdcacm_8h__dep__incl.map @@ -1,5 +1,7 @@ - - - + + + + + diff --git a/cdcacm_8h__dep__incl.md5 b/cdcacm_8h__dep__incl.md5 index bbb3eb6c..9355f061 100644 --- a/cdcacm_8h__dep__incl.md5 +++ b/cdcacm_8h__dep__incl.md5 @@ -1 +1 @@ -97039ecdaa206b15dc79322f7b3da49a \ No newline at end of file +d9684fa8dbbab21f6c77cde6aba312ed \ No newline at end of file diff --git a/cdcacm_8h__dep__incl.png b/cdcacm_8h__dep__incl.png index 166474effacdbeb3a8a5d5d329b55245c28fe9cd..03fa1f4ed9682cc170152b33533954a8dfe6e2e4 100644 GIT binary patch literal 13622 zcmd^`^;29;^yZNP27*hl;1Vo2A-HSs;5xWVLU4DtAc5cxK?A|v-QC^Yo$Q5ozgxAn zf5QGkP1l`j`nH@t&*wZ7q97-Mf<%A>1qFp7B`K-|1qJO7e69h*1Aj3oX^o(u*q@|C zg_ND4k8}_h!&Ptv%4V8P-cweX(gys4nD1u!QwMW1IhB|oh5`uN zCsBel65ki&f`$ev)SEm5Oal`q%>q1tetquk%?c_(_}>qFUmD>5X$V?$31I|_gPw0U z&@@{-J=m%F*3E~LIhj<-botizMnRv@pi`9{b(73O9|bc!pYGXBhu;Zk|HhIBt*@`| z_Q%uv7yTfIhzU}G=m}g&IKUYqMOrnC4hPd8EXEK0{TX!|6YsB&4*YY>2;K#I50iZ= zS74WV{qLeM(8k~xL7ffdmvOfGfN4bRAem-AUI!fvg6T&m_o?qL1l}do8x}($aJ5x< zjFJ{;kfS4l;>bi{93m#hzzpi;-U$pE>$U8}0-h;>D1_A1*^!@9sAnm>uyyyBWoWN!^5HH4PfO%T* zu6?NJ>S~+cWSO48e4YLKT$oQ{Ixi@ine^54YeYDVJ9YZc=w%Y0w$6=|8 z-}P{Qb67c|6o7=Yo1gBPxHq0#C>Hki2Rw6XmRQ($!$~v!-l-}c)_b`e^NGB% z!Y}y+?sw;x*9*2^y2J6CxTc&!1qHzc{^;o1`=2y1@Yv1JacC3-xvxhA{-rn`&5KRs z%fFX|dwRIZ&y!8=x9WyK`g2O8IntcKvqHe2bR=3O=hpJQ^{>9&EP8U$Yqbf;G>> z*+1;AmuC7j13#H=_EZIEV0=h3Foj9Y3Kt4QSAnko>UY2sa9CjH$|fg#+v*o?hL8bEVw)()98kOlZB%F4ePQ%t~8NVb7iS1H|#;RSg8J>KZ)icu-Kts z$BYXVxF&U*!0lkcLR;nOCx$*KaIrJORHk2#)Z}@8xwkd+xjSqHmfvj;FNIG0N}h1=smcFD+7gC~c7B!7c(L7+?!?@n68ps~ zI+TyI9+m96pSNq=S=4eR$Lv(uU;&Os*W!h$U_?&m?^# z-5ob_M^H_U$q=267sjT})Nfels|!WVx(ZGly3Hl+sdSp@(k0mlLNC%i34}CiSvp-Z z53$C#j482nYK+o2^l$SPY?%hb4sDFKF}S7L(=Q8?o)dzbr;sbHSicdOytfuaUx2+TEN%NJCK!bMOrCrEE<$iPC8^Ny zsG=A%)DUsCA{n&GxAxT^l_zcx>P#lNT9w=M(Aa2BYa)zRGTB6PVe~6CE@rj*XHj~ zOz>P)K#xL#_`U)(g~olLd-m_?ZvV%#^_iABxbq=M=EEnNdlaJ*inIKTYJ9 zz2W|)T)4jL_0LkCb2%9Ct6QG;iEZ;7! z8TOL2(B5Zq1ny|`2IF*tZ;^;woXd&Bri93=BDRiSuJ)<0!gE-@bw6NG%-Vmdpa?|yq8Pa@Uv;orBi`FUAsI;qGjK#gmoPs&HPY1(UNAx>=%k-yN)=6s?Rp0 zU13C+%Ik9Mn)7d2$N(xEjI-qBMZ3TB5Cf7yNf4LkQ%OzuupmD5yGaa-x;PrvOBkmt z5Q`8%~$tl+Hx?Pi_kUYaKIjDK<-RgSQeJoKQ3!AShqNYoJysK1vxSkS~hGL^p zp-V5&8qa;R!Yw01?WTnQRW-)BQf#b}V7w+0oqIOOc5`v>&!e3n(Yvt`rIu-$-jtre zuqX6EQ#mt@FTY}M&u+fcENLenR&XH1gZxiBDm@tA$eks48mAfOV# z$z@Qm99{L;JFPU58bSWUX*}Y|7o}B0oO8UCKe|8Fkf^v!L0xT^p97vH%Rp{JC3@Nh zgECO>*2B{Go^HG{u-*@!@BY)>U%Z2^K^@f+_IkQvqElx^*y@exTiA(iO6IWSOa2pi zQFjgf1GYGw|29LVcU@Gl+{|Kh71q~((=wN1TKMurAQtzqD@3|PDwaq17d#4sG4RjG zjN?s1`%&IH2`!x;H>_NY{p`6z-e@pB5=6qVKQp5V1ZOP;21CZFrI;8qCl^Z-ZvHIhcLCFn0r*O55ueRA6>5&&t zd+g=TXFY$_bd^u#makc!A4tGYG=ILFxK=LHb-7@fD?6Au(dQVSX;iln_{@HDk$_hP z4wsg~Ux~}`#XCO87J-A5Y zlh~X6Q>mOOOg6()9NFCuWXNH)%VO*BN;9*62H*^ft#?;iLagpELjIbi42u8<`l6qb z`pf0Th*t&T-aE}Ii=gicOZ8J5A@h%lA#jw*aBn_NG`f_1`uODa&*RtqRkF~R{L;0d zTN^5?bKJq<;>e)_Y6eo!5|VbAmJZR^sa>D3OAP_Efoa0$Q2D8Z4+zfrVAj>-m9sl(Zr*R1j)kbCH*t|2zY zj&Xya524xRE-Jg{!aN&1OKimj{Gg>M(iw-gn1KgwQglP6w(#Js8w;2gI#vUy=aSx?7#BdI~C8FWi(+6xRSHc1j(2Ng^2s68CeK>2({%teLpguU2 z^Xpr??r?Jv%w~8@4G;l)Z3GIm^h7k-%9*&!mqe-J%@54K&ghN^DUz8Z_;SDn{WLjt z-MWz3Wqh9KWse)dIeRcgPdvTbKsC4@SxMESH;$I*Gh#$19u$4q!6ZH%0#+)&hey0) zfB)CREpaOUS^A6UO}vMP4P@_3k)8h1Wb1k5Tt*#Yat3E5={ay5t$lVPlGj<6bbHPP zhl7&HoCT%v4)4~E9KLWr(?;|T`U0PbL%HRQVzoxupxfQ#57<=^;u!c{Gmsq(a5%R* zoiprr&e+YzN8DH9>?ZS-zLRIrW$!Z71n0OuKMpAuO*b@}ne)ao=>^O0><@=$*0K5p z#|5&HcV+Sxz*d?#Y@s|2pYnF_RD31gj*H7e1Gdtbnn_>U`qsd|3<+Xt-c-Vk4*;So>U3`E^Ir1RRv0xK$p(qPB?3b{`o74k>@-EYo}T4$4nV;?r~oU; zz|ERbNNEh#M8qU5ce(Ivr-h&iJn|<;>*kqHJa^o$$=N(Syg$uh!uIjP=#70(pG;D- zhBKUM{%|cq{vjOiPivWoKXzyD%h{^9<)OP4_{ZD+-rQsOVWWkfFxdyu8(+ClX;N`- zvQrcRX6iT2&s1f7kLzW(3nS09{Pb!GiFHHv_ufA=I^pYIU;`AXwbfZPnU6E9Vf zyL-A8+lbPp{9EX$m#h{J9t*aZs*g_+LL_z{ z%m&s*D)znJf|LrH_&4!@QQ}tot!ReA*0-=H%{)JMK=%`Iv_*w(H}`<#DEo3S?L^Ne znSePe=`9$DY@TyGl>U#-c<7fK+~1orLZWhn{C+7F zD&0MumD&ggd;bm>2Iqb8Z5JgXnBu!Z-n{eCc**DHd@ieI_G#Jdq{+;=7tveWCEjKE zcSZeV(p&qW6c{>bcYP?v>2!~-3sM#aGd1@S--qM3^zya=_YR=`=_=0NMV2ZnfwG`| zDvaNZ9?mh1`XkccHU`)lzn}7aA~@p}2{4oNoXl6m7oNmjt3n=3u95nP)4}aaEqk01 zg2gi~%ef^(RySeQNdUwAy+Ez3QL;9bJ7QyMn98N-NW$fV-*Gz5a6ND!?Xr@Q^_g_) zBlc&!(&uYPWIr9-t+m_mnvN=!b;ZNO%Wp$3(3CGt_Uzv{qs8r%($QT}u zkC8A`7&VV$qx|q{fkGyFmBkgJ)=)&|(?itzFGvOy1jb-RrQwAdl5KdFNcjQ+afzt3 zZIR*h+`=#E6ya%r&{Y?Lg2(*#WUE!3VUPFSP z7S?HyTaVa=pGfy2-i9+FG8<08ts{#AtHlwNlCL_0nEM_#qRP(52M{(tsU41nJ=Mnf z0++wA-EF|o4UhsmyZoD}K%AYgYS{FzxVzBHoUa-P{2+&-juA`^8qbT!$JH$W=uVUP zEN|J@4Kx?iDJgOxi7)&qajLJvQ*HpDHZgEqDn+Q97^5b-f97PWQEeu79Ye#y?A0we zxIzUtF}z)_ZqMWg%suH9seli+)mWC;Ft|8=4_5+C8|`4>%lC;U&!41Y zY?i(LJ$Wyf3L>|O0=X-7@pP{l|2~H}1|HWpqgi|1Vs#daX$D6^hgs-q(P)5u>4Ov0 z$Xbk1{1Qxi6|aa_Ckwv-aPIT6z`b)(Y(KyE*vu<408SVXl1n-{T3(yCfrvNb3+H|_R(>~1;Mwj1p(y=>R`n_TH#Rc>q$bzP#H>$4b7at79YC9!Zy1E7fKp!P1`7jzT5kj$3W2sg;#zdAcS%T56ba zm$6Ibaboni9Fss??&%L>YQFVtzS~Y#@3RRV*{QZ(a6XbNGaA}i?+SAv$&I3t`>TIR zM*Ts%HagAyTx!|fR^X)RQcqX5srPYnhC}ISLJ=8y+YDfCXK$EoBW;?lRQFOA{+d&4 z|H(_vPjd}*MuA)7F>Cin{0m?|-!53s-EcqzO4ckn5}xGMiY~TZmMUh8D_2>l@XwbC zEO|a0P1ZYD-kChP?dATwg`Ccml-+jb&;7NUWA&Ya_x$&Gf!6eRKA>DUs?7a{~ z>>50r#+STGsOt{Qvb*MF2gqbcYI!{{`Afc>;?OS+mx0w2zNXqVeS=_W+#>(;J7BU5 zIUZ;kSD4Mk2<7C234eXG{w3;ix+*l|eZD)EJ^pOdcqVTC56{e%aC9ygcu6)5y!NRg zwY{>I=ks4)#g?bW1jaifT987eTuj2960Mr^1T??SJ^<)S3p`!MhL3J+l$G6==(X^Z zRG*bTF1wxZ-LD0a&^R40Ho7dDuA@Lkt074h~P!b)?(cdaXw~*xfNdTPME^jRzFE#8{&FEq+SQk;~ef10B zJL|-1#Bt=}SJ*6{3Ojo0i+$g9y*RCi?IF6s{ivS}4_VQx*a5s{tJaOjkR<@E|Af3R z-QxLli+oYc{(V=$_3%&6VrWNcX&u*Q(56+oz9|@B&p#upWs+Ex3lzwp5%9YU8bAMJ zgi$Zmt}6gwyp08x-ZO98xqI_gf)*ue`2Nmd5(R}lHh6gf$4_#nGG`4B2`&YQ|6k^YkpxdAhM<9(0)!}xZF;*b^R-iD1c+&h}Qv)5EDj=y*fJ^l`0Xu~>KFPlgx&I`P&?fp5y;|wv5ANtl zo2B}YmBYEp3BH@fj`v=&`2f?Dauf78pK81P{h+`HoTP-P*v2UN&IYM-R*Oj*Db#&S zAVi8iX_P~RgqybFmyKrhf8E*bPoe4+h>$g9cZhkmJl|W^SW&`>6gZ8dh2ygYB4N{z zS`Z@}jpZrik3K6#HZ&Gg1)&gjBdBt05rzEQObssjtf_!-7Ve<6{fnrfemeo$Gg$J$ zNN$@`e~&AFVpV+mC&}~@AwH`Sv$`Jrv4$Ag=NWuT!~Qs0_%P*erxg#=Q?u#SP)7ZW z-nsIN9ktHG;3+mt+|o4VYAcOw%b8O6&rs)De+&XxjC#?f4t(L>@TLy175y+;KrIcn zS*eR57{p#&=CE0uEl~fHHCAaVe^+I@vJA;HEstB>Mnwa9hU)DqExWfLAuV8M5=KflQq1jx{m&7sDa;37_zF5R9c$bF_#~e zm=wJe1fI>s^0fMf*ZT*vde$F@pOaAxB^L?A8jsgDK}<}l?9R-F=72e+rl2W1-YcQ)X(chTKH~!W=9xKbxmH|$G zLYtqG%iki)JU4BTF@6m?mPC9FKiNxuDf)OmuB0;4-4-$&NDfT989~asf%QxtFCfMn zTf(?^_@h(n3OPP^`jB{WuDDkQTi3c$6a*&H_PsCAB*lEWB>ffB;+ds=>hpnu536r? zZ=0UMWf!fggCVxx*y2W%fZQU>Ec_q$yKi&E{z(BP4G;kXUH_zbkY9{xPb3jytUV5$ zGWg@J(M?p$JL==X;!Xl7hixy%YA`B9f4=KP41Uu3&>s3TtN*|CJ_=?3}K?)U%7V;Ns2P z6Tm8(674D|DKh`p9Put_GJ<=#!O8aSt+iL;m&-t=oFkWuZ7C81>F4OYOk#K{9Ff1W z=+!5yZNZZ$#H9U?6gjq!5PyUBOHxq$&xiZJIGJM1()EqO=q1i^+X-sH@}#?mnGKwX z5vc3Dy~F8y%g3R8O5dB&Hy}ct6pl%?Rrk=azMjjJ>PSL^J-kBsa;cjf+vo~oqpc7z z?~~_o9j7I#ec}l|Wx>-Z)IiP@Rz0_-3L{dP$&}SVxx`#NMc9lV{-GJdEQmxz$}-Ii znKDjtOEI?T*$=G}c?KsoIw>D}RDtw$9ZA(MGZC6oGreZxz2wj<* znyjP%D{T{>x;fbz{${qnLmJPlbspLO8uqG4YT9Mte@j=0kkn6Kh0~56>v(T#+ayV{b$4y`+|R`Dsr2pHW!mR3!tRx`#ZhK*Sj2sH zMInDcZ>TJ{D&O?XaDJy8Jur+*!t)6+$azzI>Id?RM3iBV^Os}HMdyAaX;hr{)fh3G zhxyw`Jv>7BI@H{q9~rdxOr^=tk6~z6^TD0OO$~XLq+mp^*wI^9suAY36)U#dn-nMS zTcl4~0c%fA;PQJWcrgOsQxO(}El8-q&1uPq)`zV6+H!yP3->>@gy zC#Zv%2R((!?G~LXAOmF}jAtXr%p$r2`3;j<;Uf+2M_j-{>Y&MkcDC6=!tGET21TWM zqZq`j4&8O04aJpR$)bRDvAA|6$7dpvxhA=vg{)P0KC`)uDf%vM~V7zhU5;7|gi4&9#LtTk2Q zkNZj}_zSY_6tKLRv}u4TbCM*+e8Tn(X-k?%T{2<3x`*X%E<5WhJ8abhIq3(CNdr5jiG-TRFC{*pTTawEwk4clh?WL zd3U}Q@}8CoNiq^oGRgj(B*pgwGs9@g47x5sO3gmpW*V*UgEW@RE(OcXtA5;XSr{9^BM;zA_asG?(lc;6|D{lc zF8!H6sQ1huclps5{As8ktk6mTN_bxmKBH8xJhO1{<8d94uYOi=(#JQ#bb4ptV8ma^ zKerlFe~0&@sHPr`o+7Ov;ctb}Q39Ge{#R3~uO0n?Gu)sQ)O-#6B>d9=rs6(G*Oqyv z>HQmQk%{!3cn&=HqEKXYiL4Q%gu{Kaa(%5Qp5gx9&0lyiONU+a2;8b)-f=EzmZd$D zYKp9%ibaE3yW$OSp?7s;r6#c8B)xB4D0sZm9B|+AsQ&P4id_3sIGXZKlCPF41o%C5=mPa&#CXu%$fi_|1ys5J>u5DeGL|H+72b zQy>Tx-p6fjCCd&kOsj}vHe^V1e8h|_b~{EauFT?ZhM+Z31_t>-4VrpjY`+z@4%ntI zHS@F$(r4eHS2jm0idQVaEL?kWg#g;fp9H{rYdz|QuVxogx)(Bl)0GqQ>M0?81cTUv zpm;Q+9jZ)jV|N?z#`A_oENQ=;@pB=L(Aeo(bR=gfXzDrVVLPstSJp6UUVhIW$&_fd z+Q~%4-wFvxmC|S<+W!l})Mc-6Du#aJzYeL{FGDEq?ri^{ZI~n;x!6gsB!5Pp)87ci zSRKG%b+Tq2i2u9ZN9FL-ohx|-HzjoSgGW72kTr>0xf(V8_T-NInff!Jn5lzi8~ z_6#K%=qd~F#fn-9^3hR+^;=>-WrxaztT znao?d&gq0@Il(o`vgY%$iyzwFEV>|gUm2)pXTkZXTb=Zy!xW@W=wy~t^$fn54=DI;r>PP2Qwyyxen{OBZ?$s%%e zOK_)!n_A$isjNi4*Pc?l$QT)m)dKw9T6sEIA=^t$og3!Q{Bk_mts>h@$->YM-9y^@ zR?!Qf=5|Fv>F_c)auTEo3k|Fw0gL?nDxZ8@NmL8#&5%%jdYG{gL53P&)$`*Mck4|7S44#G4`4@$GQs>=2D+wHazZ2GmI9I)`Oc}Tk#ZRYCBSI4D@HoK&|qV; zBe4`94W1UIMj_(<`S!!SaHWZkz&LtQ0w7%sxyOoLI--U7v$zb)jYcLtz`1K=I6hl1 zjDJ(8)TJ1R+z;gouLi3CdKdUI78QK1VpfZ9{~4dKUyM%yjon4B#-|QoL$8*@jBUQ| zcXZkp;}eoggxZS<0XpcVT&EA0)u;I4pdwXzDO+Nn6a2>vP+y8m9Y~_F*)JUl=DeH? z+D#7KS4Y@8fG>c8aDu5NUfm3mFQqu8UdzVUGxZ4>I8&(f=(3To@F7MR0985BGtU3H z8SsGdy;CLq_3pJJ@)tHPNmh0StUs`_%)t0Q6$`R+y>=vu1auT5th=G|>hRKkad@fw znEik7qMi6M)9go!b+NA3hf)AZ`O`e@_6El5DLx>QL|z{7SNv(5(vk-OM4dG2jXk}P7-DDTFx z!a7M}@_x{%kIR!!Pg`wjmYf4KXjJ%{0B(jX)+Ee@hyAIdrt6DBkN8D3J&&z}Siq@< zDF&5|mOCrD3g}SMBY_m1YkB@V%A=JQ0U>fMNid@J?wi+j1uTUCkP?=`t~614-6EYp zAvF4v_`dLK>;HLp%2k+BJCjrQ0;%@ucG9wwZJW8IpkIu4;!(u1fH2BoHSVu%pRF`S z1Ku;7`}?jSP=(8H^Fx^Mfkn_>0XT~+V8qHtAa)ik-9||4v0kcI@s#`mc-#i%OJ7n* z*#^g>EFQp{aCHnYt86{5r>UzH0M|*$hrRtkV?F=3^k#eL@$O>p`Qar0_SX3#e&K4t zwk7@)U}Oi^%UX+hegIXBVD?c1wDU#0E{+d&SSz5g%@%9FvfHh;8Vzg!yviK-_9bAh z!<;`&_j;BB++;s)0Xv{17PU;q^V36^u?oOz3dAD_`Vy+`MB@%IVUR9+V{#TwR$LEC zKohect>;I97t=}Py_)<2`a0Y~AKlSqJ9S-X2I$#(1FGoeb112lb z$|=lSe4wDj>@(-`qo#Ik8vu?kuB&@s9{8GGd}ZVqtx#yzpSbpb{gVl}0j1&)(1>#c zo^M5tqlo$Fj!wD>ZR4(^ZUC#7^l(nVdqxJCN=zp?^#T)*tr)sBcf} zVN9I@OvkZ1@$_m0SNl@{Chj9Y0jzy{+r(%LE_e({cntb@0*|MD2MuMlF+spmO4lpO zrF-5N4n&nDvzZR#1)-5#U(H=F07@J=PA|jXy~c8eQNebfzaQgv)ekKkz%6hoZyLD! zVQCR<0V1t*QsT34=f~6F>UF%x1uGD%P9VSf+;p?d=FDu${Z+>WI_hsXzt^hfY)^2o>izK+)wVqYe$=oQb1XV_Zj_ zw1)f3nM2iZ5O}t^u^B-?=b27*ixmj`| zS^7R9>+jAyafPg#j^mSoQC^e{fMJ|Hq9=sOEa1RZ(ev|oIXVzl-|Qj)E>aOVBy3U> z*2@_^FR5fh5Vz0s^J$1?V8Z110%ln}JR-jrOCW{CbQS)WJQ)`C9M6HcX#c~PAVw!r0A0GGBfC6Wm{~m{>U0@S;X;{Kbamxu?6T%I z$kRV{4+YTD{g?y^zV@Ejw+_i&0R3`06N@fpYD>q_=tHn!3;l3^K6E~!o}e^;}rNq)FkRCa1aT92o!}x{Gj?=PYHURQENgE zbf^1qwM?DzeU%)I@M|&@k%}#$pK%E)!mB>XmdX+QaMtZPz=eU&OA{}VCc&&(ZAE)z zvC`}z4pbLV(k9qb>r17EVDGCS3;9flWV=$vuPBEV$A66d6F`{iFC<7j;?&t=Z1JW% zpYL|Q+3v`{yFCjU`;bkat!+EZayB3%#joEC7v9<5+jhTn zOnm0YYBETZjTfFn;`R7-9d&t_@Pl4+N_P~A{2+tX65IvG1&4NBt~)v^8>zweA<}sO zt}f}9UqZ`dw2*Ja{ut33Hi@Qfk4TTd?Ac2NFU2vyFwlAq*yGoYE*CjyEL2{S6UF55 zv+j3nvFk-PhWr>We&q?^{Lzm?qoEr=V~lfpp1!dbQrhMwvliS}Z}DuBBu_MKb&V%L-a}J+K-M${jfHZNj_;BO%R?}Wv2Ya!A6qGu6a`l2UP(;~ITB|<_`1@XCFo+5YeT>OV(3f#rR@yKGAApXEMKHuwk z^p02|^)&Ex1F9&U_6(g$$oiP{%9|l9iE$3&i&kdAFC2Ir&l?LMng-uE{*hKBuM9c? zCO%)WRy86qt$<%}zj0%WZ<-&IY>xInE&|~}F2#UNULDS$)esY2oK%J!L0S@bvQ~A9 z-4b*0UWjcFa*keljn6L9x(F5a-Gq1xNr&Lli#JIcsO2;q5JG+Wy6(@raA)sw`qeLn zzsRgWtH$OMh@t(9ph3X&B5>T%Q#Hd(X#6!2xS}YTs;%b8?}gPFGGR37Q>+E~`P*}_ z?P-~#K8Lr8vV=mZ-U|69u^0xbbtkB+H#fT(Aa8@ajej_R{2wdpB`?!%ZJq*62l)hh ze&>MwF<%yO+AVrfwurdXoQUD>+%#`U(~Iw*dJkUhuNrc<xf*(9eXAb5HbbS?D#l?H* zxkr5z7^L$E&Si8pD_P3C++vEFGlwHAB%czGP3RwRo#Nrs`r{_jSj>BuL2~K*N9V9o zu!D$L;{ZmHpX8ZjivBi8LR}q$##{#h|3D>x0{7^`vIr^99$d+YFV4yS$gkD*u>%o{R$Xgr4R3eb>)s8AS{a3&av zHge`PNh+(c@JkoQLjq=q_xH5scIFjB{>~JvwGf9wurqvY2)2G26sA1z;{(wrxB)Ur z3cR|EcNsh!h{kY4?2d>zy%wx0F2fQ&L%o*3gF~6BxMy43`nwl=0<&5YxlYKiTF&3QKtSw%vprI3(-Fnl z&P}U|Bc&ynj>C|7)XI&d`Z+`~!v!q%fSep3)5pOg95@yAUf&naAdcz$5*c* z1*NUs=LM4aOm53R7(cz-+_v7%&9yxg0l52xeZ0%KLpfkasc*^ko>!MkZQKG84AE^D zrk(3AZt$&pCIczA-xs=oC0?RSoVp3@6Y7|>yww}*s@A2BbLgx;oG^x_4_3D6m#Ht+ zeqhQru>RS?9G#;NU+;YiME?Ny_Gr()u!zZ*s2Z5<67cNQky&4?4srV&zh50*Gv(1!?qa&203B zHwF3qNPmyN3k&I*UQrLyM>VeDH@z2#VIbu-Jz7?PVu(5yGwA2w@7i9;O-WzEncj+dvW)BI^UhS z^Zg6=ha@wZJv(Qg{hs} zkdf5%L_9P^OC^+T6zj%Jbcsz24lDunAh07kZO?x{e3?+b=nJDStRZZPFc^h~+QdK5Zk z2n3{#7ldr33u*W^98|yt1|xlo*Oq{QKtbQ+B|uzT2NKRy;COHz50WGmIwT?zDk5V@ z@5wIkh!}{Su~GilCeHxeSQ42C1!TSx=}5=}&cl>TpA5Gw>C`CkK{-&t(^N~-t1+y@t@ z`8pG`8|2h{9K>TCSf_~#1e=9$t<-+Tuv=(kgO@U7FHV=~>>X5f5lOy(1*`6ZNMcf# z?~G>Ve`vDz+VVW#R;qeBsn2WkJf-H#(ce1DR2cmpMF4orE<|$7`ADb`da?^Jd|8WF6gXUW7e+; z({?4}w=Z~s&j0~&DW&mfcKQ45FSRw%Q-JDhW-Bk?7#!p6Ugx_5F=SJ?+dzYkLSsL**)7D(ky&ONXlzX@cGxbpFEwQ5LCpMxYB_e!pH5> zp%}zP^oq&j<$86y-9gCpo~LHKG#$6w=~FN*mdoXOD-HcF{|+wr_X%pn$zl~9DHJhJ zqgGd@!}$iqt(honco;U~Es205)kvmr%GJ?Q8OY^gcY>J`V$bdI_YYSZ*GE*phtomp zuESQhgWR8h6=gv z=BQi!sitPrjrXL65-xT4TwC6ptZCL;szGtLek9NmkdY~dV^gTp!t}ho)qv^c=IShp z=NoKTs9l3|gF-m1Z5iuyKGwkz9uz zS4>SSRR^P^qfO%#;~Hf8zv+p>KIOtQg>3OK1DQ*S~gix}n+b>2yg>Nm=F3CEv%mz3+a!tfW<@ zP0u2f@pQBKRmJjb^QR_ElS#HR4%llHbOKc;YTKYz6H85WpBz1mobB4n`~ zjHU2beLLkyO+{-K|3m7r*B3jWOuIsTf3pZyjAr_`hjQ^dw*}Zmz%R=pIV;P) zAmH*m!p!QD%uA5uFaIY7kgm8ZZ&b5f?>zNWyC92@-)Qk<4^5dci;!sS!#oZe)Ig)9g6^*VO3Ir9Ms;$QvXobu?nz`EgH2eB-beE= zt>Cs%Y9wB`GG7u^-r${?1@M-QLk2HAoH!B*suDi zxX%)d@aW(nnHvsYfS zSlH)^XFDl-mVDuN*RyEcXjTUvkBV{4IDdmruhzpbQ1TPx>DA%B=OgB%LKhffE}k)C z=*t_K{9G41*$$_-T^Evte&^d1%Q4*1m49J2w*UXX_)W5?d_#K`Y z6G2Y$o^a<{E_(ZNm%IY4>OiL#N zC18DmTXat>DcP`Cvmqe*{2)NeV=3l=Fe{au%!&RAQB5g$aQrp)!R)ctc|&jb*eQyV z!WgpoSXN}Cz2DdCys%1#a1~g{PcK^Irr*>4UO{N=VATJR_`0?H5fM_a-f{ zS17oHR0e#ArAp!}^w%zYcS9gs@C;4{1}2q~vJ`fDSQ!>s>>3#=b~qX8S~ezN3l6QXq*?+qpBYm6!J<_;4)R`0v53t$sdvtw0lMGN0%Z zM*>Gsh2d_BKMBBXp!`eQ*2{@3+N}K9^D6CgBOg3-{6jHz3etEL^<(RI$*JPCXDvW! zo#VH$K*=5J-cq>ij>}!#9VksFBF3_Lxu{YsG*+y!G1B={2+ycPw_{$Og>z}@P z_t8PEk3$OV=|F+|PK1~4yeeS2a7_F;hkVzqqc_UHuHg_lAI zB(~cl2MUI*BDwM@D+E$NQ$^~YE!BwC>QnbM)kNjrcp;Y`PRai3_4V;e2GRcCPs6EM z9E6oHqAR!MU5N9}sFZ9}h&=twWP30#p6Yw---9l>_2JbcoeX@w@inzt2JaFdd68XYG-Z?_);zbP$ zg=~2pHtg)pS+J;IA7!5{+!%vh^7&j`Nvex)-8g*B`M}}KN88shNLhiq)=t7!@mSZM^JZr z{HYEFHC#-p7;icl2yFPAKi{g*!ZeCS;?8bDu0tU?bgbq7bd%Izc=cS}EdEoqUxh(S zA5Q3<1kt71Nq=c1zHq5%sbQP)PGRZ?wQLJv3sn$T#QZ|FDWxe7xj;3w@q?xySb0Jr zP4FC<$3`3H$>2tIf5Ai9)%-X0zXev)#8I^6Y=>SRi1#J`4nuT~^sl9nb^d*^xAb;} zo9t1r(E?i*f?U!BXdo60rdT{ldbieIre}|3E2WLWDys6YQ5d2~X1rJk8jD#mUvfGh zuae>yrAZ}-Xq2H?Yt6AvtKBUZtHI8(TvLQpw0YSP%4rw0Y&V1(`S;BIac6kQC*6Mjv)mPG!Z|$BkDpsd;$iHZCgjl@{Cm}Jr%;} zv_Ky#Z)QHQ-EIdRgN+;Th{=KVDxr3HtQZ!t`@@;;kx=lC{eXefAdh`b#X|)O&Q+Js z%`k(Ow=gE35)5YAJe0iMy&Cs04A0LSbsjm6Ohn2V-JUM{Q}o9Pef)Yr4^^U?Z#*Qy zBH>ISKFZF!I_wSD%2nXYTP91MV$x`ZU23x0tkRaQKL9#^0>gY~)NrezHtsgWPt6T0 zFNJY^3yQ$5Jiwc9f0e0@mTw5%oR9}56%B;T>z&XWHHBxf$|eS&2PM*>17^_LOr6J09W?&p*1oz!Hnx z!a^*${?{Ud(Z)`G2&hu9UlFN1V1hP_93+B*tHwn6wf(+Z4MY=9Ut?lLY*JH!*bSNo z_%q`)u3HECFN-erzWOJ!Qw@yLC8l?p+7BMu0Mc@^jQWX5iX<;Aw#~<})wnB!S;m%P zh+%pR7Y)Zq;{G~Yn^@dbx~_SgTD8?x%+28M5XZ)g!NI=owDB+$r}_Hq8)UB22gKx2 z(0N<)IISuG5pH8FV$y*Je0^T>RMY6|X}oRV6_mb)AWPPDcsN3A%vwl5l~Fd67OyYU zT#5^#`9me0Bvfw?Ob->OPbdk+uBcQ&p z#aZ(kWQ-6k{m}HPkXm{jo}RkYeBPtO-{gI1&1Tr@N}AH^6aeV~I+Z8%ALe{Vo$(~6m;e^55dY^U-@8p$EH zQgq-DB1GK2@pYy}P*5Onwqb(#sPRBjUjXE@JSDJ)N=SfZ3?OJ&q%vsOja~KW3t~oywXU=?Sfti`Jow2c%LXP66&f9IW%;@U~Zt&6k-+8haQr@yrK+R>j9n5GQ z3p#JE9`myD-!zNmz-?yAe-7rpQ}6V>ol08(Ks+f;z3BZ*@5^Z&!Y%;dP8Fc;4@$Rv zVFCa}?=QC0>9cZZmy=L(j*hN`rf&b5cONs?&7m^(yCfuJ)m2TZ)2`6B&#Zb$p()RT zsU{ArIPX^y%Op!xd)_?wM9$Cju}&fgsorverb%23b<{#)tgl z9so}Hcb5k&q^_}+;j7_y6>9lmTa4HZM5pM)?B(-R%e_Y;*J~%Sqz#8ZCRhGGj^|42 z4@AG@&0;BGTpag0P$#uJUhW`0*w@dM3atlV->O(S^LKL(^D@xorpkA9dB@*WT-Fjv5$Gj>mI@2l8_V zgw^WN37IYP<>O{_FV#gnEuscQ>(Ql`Qk$$|X3mwJ8FaaB}@{qKXq2Pj(joYrNgl|AV+ zE(0EJocdFQjo37b-ouo7kWYbSz~HaEHgT~Ikzhh#N`v0vN zjJ_y(|2=PO_`Akw(CZKoMR2inaUg0^e7p&$e{j$SC@L;c!ZZPGw7gM_kJcr&I8R{Fjlb#-afmC_<6BO%SjSiy23spwi0VrIS(*()PuS6H+>`TH_)pW{r zB~`?33vj~}cr^J105YC1d4ziZ?7)3|I3GjBVG)vn&KI<$rjk4jUj+LuGB~}ajGMBD z)x5$H!PV}3ctnQBiQSbXcx=A(nxN1$T9QBzU)HQZD>WW-Z0cqVsDUG0-uB_EG$$eK zi)0W|z`yp!qmWK~L*~e=I?@5mh|bM}kf;4wj+>UoiNzKd4Pe*adpTOzh18&SXX7?o zwTB;2TT03xhuRTFb~Y9G*>s)rj=!x&dccm$G9ck^+udHDHhs+wZ&K#y|zw_ zqp)bVfO%NI_|qxQe4`zi-)TQFYy+^72p^yBk71tLt`YI%VU;93>w*r;BJ&+SO=n?2 zSeMXNoIYNgnfDcJdC1|HS<{;Nld{E;LW))v-gofXXsrr;Ew&6Z3vt#ck=OZ78v{&k zj)0Zb=fVb9qlvY!nKGR?Pq6~s4-nQp3&lx*Lt#UMcU*hG!bqdj%4 z*Subco)2>~kGX6QQ+L2~e!2hsli*oftAmQJVbR|_ek<4I$%80ao05k9# z?*eaD)mU}6!(6TGDf~yw6_|x>F_B(Ta}bu&tCK|?wE2E9WY!f)_-ozUL2ePQjAUS>7dq zUfo`dpQM&vo3np3kBE+j6nS3STs(O9O5p^fWE5i>4eiIU3u3x;W_5`qP3T@~CEJcw zODucEmew@lflJ4Df=F$kuW&E35IZ)4ZAngD$D48+Qw6z&jPM-OO^Q{rmn-CX^0^fU zi318sBf%k{;AIDmz<+B{m^VH9xtDmX7T(U7s8q_(QrDJs}MK}jl5 zF!_u*RZZ09hI7v+h_6T13*4VKIo}`N;2@cvAkJaz9(eioUj6?oq%+*I-eSzOtgen0C+&`N*s>jZOL-VrrHMiz>0@n`;(-szy)=wYb~qH-=&a+5_l>A^~`X1{y(Z0X18=^>{vnuypk^?Rb- zzQ`}Wk|&5p-GhckM}YoOtasY*_fSFWh@=uKd2?v=jb0It(NO5v16xwmu%2=GNS0@$ z3!KNqg9ot!ZI7+&nin`JQSR^M$#$iOwGA|E)PeITY(|2-mb;!Yjiub9cfz+rf$k$z zVMK9zte(2V=t@l!k=v^-fD(i-rEE}Vx&`TU%;lceI7s}EOJfR^0OS6t*=XJxG><2! z{Iu9|?g`e2d8MtOY%HTPL-)G$1!5;dOcy+FtE8YXHfaoUZ{ zHBd>`JNbn3LSdA4zU#d@k}yqRzR64O0aCr$Y--QDI^5lEG&Lm(-BNYBd!V!|yM(@y z3qt^?Leqv3{PYK$iTSEgxoO+*YduGGddK=TN$)!rmKaXCk z-9i7-k~ZSrnp>5(Z*$~ddG*=ceu~{CBswJk(fosqPp8RKAjB$QZ@fcgMNoo%&;VwZ zUOPRnWH$@2J4U9sDmoz4|KNw?CHnn2kRVt+-d(zG55I)}9v(^O*Gl^_7=cU6$j%ovfgh7j-MXywK4#; zqM9k>W;vE6I+ZVvLn`df>UT9~@h@m2B$f*H4W>NP&X>a~Y$c60cs2Y>?0+%iU9oPB z**8%i_cT7cG)X-m3@IcMzgZ3bm-oQ$li5B*pX9vaaf+1)BnuiiXUP8LygN=E)1+$! z5S!L1po}U{N6G(zK$QG{VSuUiYKPN?9AOH|yMzBodiRT6wF;?F^mzb>8yak8VV*z) zHskqC!<7ErxAA|ve%Et0ZU9=Plp&yYx|Q%=8Yr4UEdh-1WF`%UBs5Q|r>Rm6ULukH zYajz;HfnL+;^_-b7xQbqy4i>;vsmUUI^8YJwPk(K&ldBmx1NTTa?S>5e?DI6>PqIb z)7NqzcO1;=9~iJMr(q%L4%IR{?2E*QJ#cj1E;1!JlQGxpBwM^bDC%%N@ zxb_8n!~oFgd^MxNmky9esH8!NA6ce2`ZS9Z6BtM!7}=z&n?1Q2VfJ#jH2q;aVOZBHgz z?qC`rQl0RJd~!#K47mMBS6J1v8d2f8_Mrh!Mop>Zb0Htv5N+Hi`+ob0yioQ3Q{Slh zU`-x@aZ?o*%{NP;cf0v=zJ0+$Wx{`bLZ>x6v|ySOl!P25&6U{uuj2SBjl{%#l9>SG z0l1OHbQf8t5J?W31J}lEk6|iy1yKxtvJFU#B>i8=h?!-0YcL zZ}B=epML52B|9VA;=8V05fA{=QJ+VLgT3cY|5}Cg;6>WJH0U+$2%Q+@B^N<*qKOE~ zF?UHTQc7nwz27gZ(o`^M53E5&{R*h$aVQFgra*aiWz6>-3v0T5Qc6so>Wo@uMZMZj zYQE!)#Q-X0c^uBmt^zb8U1j+nQR{|>i0hdJ^Q3VIYBnE9D{YW<<*dG{O|y0-fiPs@ zurz9amJgu}c$nCwl5n~Dt7qn>HL*?^&A*DXF(FUsR}d`)B+oo>WWR_P-&A-1evz1l zX-!KBux3@;=TXOy@yD8(nf(iLeX%*Sn6+R9<*>{BX<9=Hph_r4zH^6P$i>}I2)onq zrH%ucF4*F*^ZCiAAA?r@e0wA*bc#$JLJ%FO>XOUw5tPnrlU&>94cx310Jf7*@Y^|^ zX`icq!`bv|W!%sKl73xQOUpjB1Dvd@Y89q=v{3I#VUvCrSzbJNEf9NUA4v8*>W{M1 zkMn^YSx)AxVZ>3hi#$fJ#*Jf)brJRKGzWlQycLwf{f+mlJZdkowni2$%!9;jG*j3j zL{GGOzpN($k;RsgoHb1(ihk(VhdI;oH7sP(UxWKC1Bx{Ez9!{sv2wvE#6;!+nMpNr za(%0JTpu(xz6s3qiBMp^QI#Gc$0WF8++)L@q4#s+9AD+oWDj_H5UY8^A{?P6rW5?_ zwRFjPtI*L)qTM#ISqEhY|2)1;CD;@k% z)3GNK#5(Zhi!#VDGw(aTB#-of`BOXUb_qt99cq`#T)%lBAXM>2b-jgJO#a~GdJ%(Y z;v}HMxU@K}1&m-iNg%p - + USB Host Shield 2.0: cdcacm.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -114,53 +115,53 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    +
    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
    +
    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
    +
    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
    +
    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
    @@ -218,149 +219,221 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    127 
    129 public:
    -
    130  virtual uint8_t OnInit(ACM *pacm) = 0;
    -
    131  //virtual void OnDataRcvd(ACM *pacm, uint8_t nbytes, uint8_t *dataptr) = 0;
    -
    132  //virtual void OnDisconnected(ACM *pacm) = 0;
    -
    133 };
    -
    134 
    -
    135 
    -
    136 #define ACM_MAX_ENDPOINTS 4
    +
    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 
    -
    138 class ACM : public USBDeviceConfig, public UsbConfigXtracter {
    -
    139 protected:
    -
    140  static const uint8_t epDataInIndex; // DataIn endpoint index
    -
    141  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    -
    142  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
    -
    143 
    - - -
    146  uint8_t bAddress;
    -
    147  uint8_t bConfNum; // configuration number
    -
    148  uint8_t bControlIface; // Control interface value
    -
    149  uint8_t bDataIface; // Data interface value
    -
    150  uint8_t bNumEP; // total number of EP in the configuration
    -
    151  uint32_t qNextPollTime; // next poll time
    -
    152  bool bPollEnable; // poll enable flag
    -
    153  bool ready; //device ready indicator
    -
    154 
    - -
    156 
    - -
    158 
    -
    159 public:
    -
    160  ACM(USB *pusb, CDCAsyncOper *pasync);
    -
    161 
    -
    162  uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr);
    -
    163  uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr);
    -
    164  uint8_t ClearCommFeature(uint16_t fid);
    -
    165  uint8_t SetLineCoding(const LINE_CODING *dataptr);
    -
    166  uint8_t GetLineCoding(LINE_CODING *dataptr);
    -
    167  uint8_t SetControlLineState(uint8_t state);
    -
    168  uint8_t SendBreak(uint16_t duration);
    -
    169  uint8_t GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr);
    -
    170 
    -
    171  // Methods for recieving and sending data
    -
    172  uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr);
    -
    173  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    -
    174 
    -
    175  // USBDeviceConfig implementation
    -
    176  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    177  virtual uint8_t Release();
    -
    178  virtual uint8_t Poll();
    -
    179 
    -
    180  virtual uint8_t GetAddress() {
    -
    181  return bAddress;
    -
    182  };
    -
    183 
    -
    184  virtual bool isReady() {
    -
    185  return ready;
    -
    186  };
    +
    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 
    + +
    184 
    +
    185 public:
    +
    186  ACM(USB *pusb, CDCAsyncOper *pasync);
    187 
    -
    188  // UsbConfigXtracter implementation
    -
    189  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    190 };
    -
    191 
    -
    192 #endif // __CDCACM_H__
    +
    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 
    +
    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
    ACM(USB *pusb, CDCAsyncOper *pasync)
    Definition: cdcacm.cpp:23
    -
    static const uint8_t epInterruptInIndex
    Definition: cdcacm.h:142
    -
    virtual uint8_t GetAddress()
    Definition: cdcacm.h:180
    -
    static const uint8_t epDataOutIndex
    Definition: cdcacm.h:141
    -
    uint32_t qNextPollTime
    Definition: cdcacm.h:151
    +
    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
    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:148
    +
    uint8_t bControlIface
    Definition: cdcacm.h:173
    uint16_t wValue
    Definition: cdcacm.h:120
    -
    bool ready
    Definition: cdcacm.h:153
    -
    uint8_t bDataIface
    Definition: cdcacm.h:149
    -
    USB * pUsb
    Definition: cdcacm.h:144
    +
    volatile bool ready
    Definition: cdcacm.h:178
    +
    uint8_t bDataIface
    Definition: cdcacm.h:174
    +
    USB * pUsb
    Definition: cdcacm.h:169
    uint8_t bDataInterface
    Definition: cdcacm.h:91
    uint8_t bDescriptorType
    Definition: cdcacm.h:88
    -
    uint8_t bNumEP
    Definition: cdcacm.h:150
    +
    virtual void autoflowRTS(bool s)
    Definition: cdcacm.h:233
    +
    uint8_t bNumEP
    Definition: cdcacm.h:175
    -
    EpInfo epInfo[ACM_MAX_ENDPOINTS]
    Definition: cdcacm.h:155
    - +
    EpInfo epInfo[ACM_MAX_ENDPOINTS]
    Definition: cdcacm.h:181
    + +
    uint8_t tty
    Definition: cdcacm.h:146
    uint8_t bFunctionLength
    Definition: cdcacm.h:95
    +
    virtual tty_features enhanced_status(void)
    Definition: cdcacm.h:218
    uint8_t bDescriptorSubtype
    Definition: cdcacm.h:89
    uint8_t bNumRingerPatterns
    Definition: cdcacm.h:107
    -
    bool bPollEnable
    Definition: cdcacm.h:152
    uint8_t bDescriptorSubtype
    Definition: cdcacm.h:97
    uint16_t bmState
    Definition: cdcacm.h:123
    -
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: cdcacm.cpp:336
    -
    CDCAsyncOper * pAsync
    Definition: cdcacm.h:145
    -
    #define ACM_MAX_ENDPOINTS
    Definition: cdcacm.h:136
    -
    uint8_t GetLineCoding(LINE_CODING *dataptr)
    Definition: cdcacm.cpp:324
    +
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: cdcacm.cpp:316
    +
    CDCAsyncOper * pAsync
    Definition: cdcacm.h:170
    +
    #define ACM_MAX_ENDPOINTS
    Definition: cdcacm.h:161
    +
    virtual void wide(bool s)
    Definition: cdcacm.h:245
    +
    uint8_t GetLineCoding(LINE_CODING *dataptr)
    Definition: cdcacm.cpp:304
    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
    uint8_t bRingerVolSteps
    Definition: cdcacm.h:106
    -
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:304
    -
    virtual uint8_t Poll()
    Definition: cdcacm.cpp:264
    +
    bool autoflow_XON
    Definition: cdcacm.h:155
    +
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:284
    +
    bool autoflow_RTS
    Definition: cdcacm.h:153
    +
    uint8_t Poll()
    Definition: cdcacm.cpp:271
    Definition: address.h:32
    uint8_t bmCapabilities
    Definition: cdcacm.h:98
    uint8_t bDescriptorSubtype
    Definition: cdcacm.h:105
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcacm.cpp:47
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcacm.cpp:45
    +
    uint8_t bmRequestType
    Definition: cdcacm.h:118
    -
    static const uint8_t epDataInIndex
    Definition: cdcacm.h:140
    -
    uint8_t bAddress
    Definition: cdcacm.h:146
    +
    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
    -
    virtual bool isReady()
    Definition: cdcacm.h:184
    -
    uint8_t SetLineCoding(const LINE_CODING *dataptr)
    Definition: cdcacm.cpp:320
    +
    virtual bool isReady()
    Definition: cdcacm.h:214
    +
    uint8_t SetLineCoding(const LINE_CODING *dataptr)
    Definition: cdcacm.cpp:300
    uint8_t bFunctionLength
    Definition: cdcacm.h:103
    struct ACM_FUNC_DESCR TEL_CALL_STATE_REP_CPBL_FUNC_DESCR
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcacm.cpp:224
    -
    uint8_t SendBreak(uint16_t duration)
    Definition: cdcacm.cpp:332
    +
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcacm.cpp:230
    +
    uint8_t SendBreak(uint16_t duration)
    Definition: cdcacm.cpp:312
    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:312
    -
    virtual uint8_t Release()
    Definition: cdcacm.cpp:251
    -
    uint8_t bConfNum
    Definition: cdcacm.h:147
    +
    uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:292
    +
    bool half_duplex
    Definition: cdcacm.h:156
    +
    uint8_t Release()
    Definition: cdcacm.cpp:257
    +
    uint8_t bConfNum
    Definition: cdcacm.h:172
    struct ACM_FUNC_DESCR TEL_OPER_MODES_FUNC_DESCR
    -
    virtual uint8_t OnInit(ACM *pacm)=0
    -
    Definition: UsbCore.h:190
    -
    Definition: cdcacm.h:138
    +
    Definition: UsbCore.h:197
    +
    volatile bool bPollEnable
    Definition: cdcacm.h:177
    +
    Definition: cdcacm.h:163
    uint8_t bDescriptorType
    Definition: cdcacm.h:104
    -
    uint8_t SetControlLineState(uint8_t state)
    Definition: cdcacm.cpp:328
    -
    uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:308
    -
    uint8_t ClearCommFeature(uint16_t fid)
    Definition: cdcacm.cpp:316
    +
    tty_features _enhanced_status
    Definition: cdcacm.h:179
    +
    uint8_t SetControlLineState(uint8_t state)
    Definition: cdcacm.cpp:308
    +
    uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
    Definition: cdcacm.cpp:288
    +
    uint8_t ClearCommFeature(uint16_t fid)
    Definition: cdcacm.cpp:296
    struct ACM_FUNC_DESCR DLM_FUNC_DESCR
    +
    virtual void half_duplex(bool s)
    Definition: cdcacm.h:242
    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:300
    +
    uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr)
    Definition: cdcacm.cpp:280
    diff --git a/cdcftdi_8cpp.html b/cdcftdi_8cpp.html index b8e8d212..fb6b42c2 100644 --- a/cdcftdi_8cpp.html +++ b/cdcftdi_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcftdi.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for cdcftdi.cpp:
    diff --git a/cdcftdi_8cpp__incl.md5 b/cdcftdi_8cpp__incl.md5 index 958e3057..f6dd1fa8 100644 --- a/cdcftdi_8cpp__incl.md5 +++ b/cdcftdi_8cpp__incl.md5 @@ -1 +1 @@ -65fc37f20195417aa899b408712d428a \ No newline at end of file +e865f32d985af2b4d5e2da82e7c52bae \ No newline at end of file diff --git a/cdcftdi_8cpp_source.html b/cdcftdi_8cpp_source.html index 6d81d6c1..ba45527b 100644 --- a/cdcftdi_8cpp_source.html +++ b/cdcftdi_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcftdi.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -121,326 +122,321 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    30  epInfo[i].epAddr = 0;
    31  epInfo[i].maxPktSize = (i) ? 0 : 8;
    32  epInfo[i].epAttribs = 0;
    -
    33 
    -
    34  //if (!i)
    -
    35  epInfo[i].bmNakPower = 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  //uint8_t len = 0;
    -
    50  //uint16_t cd_len = 0;
    +
    33  epInfo[i].bmNakPower = (i==epDataInIndex) ? USB_NAK_NOWAIT: USB_NAK_MAX_POWER;
    +
    34  }
    +
    35  if(pUsb)
    +
    36  pUsb->RegisterDeviceClass(this);
    +
    37 }
    +
    38 
    +
    39 uint8_t FTDI::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    +
    40  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    +
    41 
    +
    42  uint8_t buf[constBufSize];
    +
    43  USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast<USB_DEVICE_DESCRIPTOR*>(buf);
    +
    44  uint8_t rcode;
    +
    45  UsbDevice *p = NULL;
    +
    46  EpInfo *oldep_ptr = NULL;
    +
    47 
    +
    48  uint8_t num_of_conf; // number of configurations
    +
    49 
    +
    50  AddressPool &addrPool = pUsb->GetAddressPool();
    51 
    -
    52  uint8_t num_of_conf; // number of configurations
    -
    53  //uint8_t num_of_intf; // number of interfaces
    -
    54 
    -
    55  AddressPool &addrPool = pUsb->GetAddressPool();
    +
    52  USBTRACE("FTDI Init\r\n");
    +
    53 
    +
    54  if(bAddress)
    +
    56 
    -
    57  USBTRACE("FTDI Init\r\n");
    -
    58 
    -
    59  if(bAddress)
    - -
    61 
    -
    62  // Get pointer to pseudo device with address 0 assigned
    -
    63  p = addrPool.GetUsbDevicePtr(0);
    -
    64 
    -
    65  if(!p)
    - +
    57  // Get pointer to pseudo device with address 0 assigned
    +
    58  p = addrPool.GetUsbDevicePtr(0);
    +
    59 
    +
    60  if(!p)
    + +
    62 
    +
    63  if(!p->epinfo) {
    +
    64  USBTRACE("epinfo\r\n");
    + +
    66  }
    67 
    -
    68  if(!p->epinfo) {
    -
    69  USBTRACE("epinfo\r\n");
    - -
    71  }
    -
    72 
    -
    73  // Save old pointer to EP_RECORD of address 0
    -
    74  oldep_ptr = p->epinfo;
    +
    68  // Save old pointer to EP_RECORD of address 0
    +
    69  oldep_ptr = p->epinfo;
    +
    70 
    +
    71  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    +
    72  p->epinfo = epInfo;
    +
    73 
    +
    74  p->lowspeed = lowspeed;
    75 
    -
    76  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    77  p->epinfo = epInfo;
    +
    76  // Get device descriptor
    +
    77  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), buf);
    78 
    -
    79  p->lowspeed = lowspeed;
    -
    80 
    -
    81  // Get device descriptor
    -
    82  rcode = pUsb->getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), buf);
    -
    83 
    -
    84  // Restore p->epinfo
    -
    85  p->epinfo = oldep_ptr;
    +
    79  // Restore p->epinfo
    +
    80  p->epinfo = oldep_ptr;
    +
    81 
    +
    82  if(rcode)
    +
    83  goto FailGetDevDescr;
    +
    84  if(udd->idVendor != FTDI_VID || udd->idProduct != FTDI_PID)
    +
    86 
    -
    87  if(rcode)
    -
    88  goto FailGetDevDescr;
    -
    89  if(udd->idVendor != FTDI_VID || udd->idProduct != FTDI_PID)
    - -
    91 
    -
    92  // Save type of FTDI chip
    -
    93  wFTDIType = udd->bcdDevice;
    -
    94 
    -
    95  // Allocate new address according to device class
    -
    96  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    97 
    -
    98  if(!bAddress)
    - -
    100 
    -
    101  // Extract Max Packet Size from the device descriptor
    -
    102  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    -
    103 
    -
    104  // Assign new address to the device
    -
    105  rcode = pUsb->setAddr(0, 0, bAddress);
    -
    106 
    -
    107  if(rcode) {
    -
    108  p->lowspeed = false;
    -
    109  addrPool.FreeAddress(bAddress);
    -
    110  bAddress = 0;
    -
    111  USBTRACE2("setAddr:", rcode);
    -
    112  return rcode;
    -
    113  }
    -
    114 
    -
    115  USBTRACE2("Addr:", bAddress);
    -
    116 
    -
    117  p->lowspeed = false;
    +
    87  // Save type of FTDI chip
    +
    88  wFTDIType = 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
    +
    97  epInfo[0].maxPktSize = udd->bMaxPacketSize0;
    +
    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 = addrPool.GetUsbDevicePtr(bAddress);
    +
    119  p->lowspeed = lowspeed;
    120 
    -
    121  if(!p)
    - -
    123 
    -
    124  p->lowspeed = lowspeed;
    +
    121  num_of_conf = udd->bNumConfigurations;
    +
    122 
    +
    123  // Assign epInfo to epinfo pointer
    +
    124  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    125 
    -
    126  num_of_conf = udd->bNumConfigurations;
    -
    127 
    -
    128  // Assign epInfo to epinfo pointer
    -
    129  rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
    +
    126  if(rcode)
    +
    127  goto FailSetDevTblEntry;
    +
    128 
    +
    129  USBTRACE2("NC:", num_of_conf);
    130 
    -
    131  if(rcode)
    -
    132  goto FailSetDevTblEntry;
    -
    133 
    -
    134  USBTRACE2("NC:", num_of_conf);
    -
    135 
    -
    136  for(uint8_t i = 0; i < num_of_conf; i++) {
    - - +
    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, &HexDump);
    +
    140  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    141 
    142  if(rcode)
    143  goto FailGetConfDescr;
    144 
    -
    145  rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    146 
    -
    147  if(rcode)
    -
    148  goto FailGetConfDescr;
    -
    149 
    -
    150  if(bNumEP > 1)
    -
    151  break;
    -
    152  } // for
    +
    145  if(bNumEP > 1)
    +
    146  break;
    +
    147  } // for
    +
    148 
    +
    149  if(bNumEP < 2)
    + +
    151 
    +
    152  USBTRACE2("NumEP:", bNumEP);
    153 
    -
    154  if(bNumEP < 2)
    - +
    154  // Assign epInfo to epinfo pointer
    +
    155  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    156 
    -
    157  USBTRACE2("NumEP:", bNumEP);
    +
    157  USBTRACE2("Conf:", bConfNum);
    158 
    -
    159  // Assign epInfo to epinfo pointer
    -
    160  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    +
    159  // Set Configuration Value
    +
    160  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    161 
    -
    162  USBTRACE2("Conf:", bConfNum);
    -
    163 
    -
    164  // Set Configuration Value
    -
    165  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    +
    162  if(rcode)
    +
    163  goto FailSetConfDescr;
    +
    164 
    +
    165  rcode = pAsync->OnInit(this);
    166 
    167  if(rcode)
    -
    168  goto FailSetConfDescr;
    +
    168  goto FailOnInit;
    169 
    -
    170  rcode = pAsync->OnInit(this);
    +
    170  USBTRACE("FTDI configured\r\n");
    171 
    -
    172  if(rcode)
    -
    173  goto FailOnInit;
    +
    172  bPollEnable = true;
    +
    173  return 0;
    174 
    -
    175  USBTRACE("FTDI configured\r\n");
    -
    176 
    -
    177  bPollEnable = true;
    -
    178  return 0;
    -
    179 
    -
    180 FailGetDevDescr:
    -
    181 #ifdef DEBUG_USB_HOST
    - -
    183  goto Fail;
    -
    184 #endif
    -
    185 
    -
    186 FailSetDevTblEntry:
    -
    187 #ifdef DEBUG_USB_HOST
    - -
    189  goto Fail;
    -
    190 #endif
    -
    191 
    -
    192 FailGetConfDescr:
    -
    193 #ifdef DEBUG_USB_HOST
    - -
    195  goto Fail;
    -
    196 #endif
    -
    197 
    -
    198 FailSetConfDescr:
    -
    199 #ifdef DEBUG_USB_HOST
    - -
    201  goto Fail;
    -
    202 #endif
    -
    203 
    -
    204 FailOnInit:
    -
    205 #ifdef DEBUG_USB_HOST
    -
    206  USBTRACE("OnInit:");
    -
    207 
    -
    208 Fail:
    -
    209  NotifyFail(rcode);
    -
    210 #endif
    -
    211  Release();
    -
    212  return rcode;
    -
    213 }
    +
    175 FailGetDevDescr:
    +
    176 #ifdef DEBUG_USB_HOST
    + +
    178  goto Fail;
    +
    179 #endif
    +
    180 
    +
    181 FailSetDevTblEntry:
    +
    182 #ifdef DEBUG_USB_HOST
    + +
    184  goto Fail;
    +
    185 #endif
    +
    186 
    +
    187 FailGetConfDescr:
    +
    188 #ifdef DEBUG_USB_HOST
    + +
    190  goto Fail;
    +
    191 #endif
    +
    192 
    +
    193 FailSetConfDescr:
    +
    194 #ifdef DEBUG_USB_HOST
    + +
    196  goto Fail;
    +
    197 #endif
    +
    198 
    +
    199 FailOnInit:
    +
    200 #ifdef DEBUG_USB_HOST
    +
    201  USBTRACE("OnInit:");
    +
    202 
    +
    203 Fail:
    +
    204  NotifyFail(rcode);
    +
    205 #endif
    +
    206  Release();
    +
    207  return rcode;
    +
    208 }
    +
    209 
    +
    210 void FTDI::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    +
    211  ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
    +
    212  ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
    +
    213  ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
    214 
    -
    215 void FTDI::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    216  ErrorMessage<uint8_t > (PSTR("Conf.Val"), conf);
    -
    217  ErrorMessage<uint8_t > (PSTR("Iface Num"), iface);
    -
    218  ErrorMessage<uint8_t > (PSTR("Alt.Set"), alt);
    -
    219 
    -
    220  bConfNum = conf;
    -
    221 
    -
    222  uint8_t index;
    -
    223 
    -
    224  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
    -
    225  index = epInterruptInIndex;
    -
    226  else
    -
    227  if((pep->bmAttributes & 0x02) == 2)
    -
    228  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    -
    229  else
    -
    230  return;
    +
    215  bConfNum = conf;
    +
    216 
    +
    217  uint8_t index;
    +
    218 
    +
    219  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
    +
    220  index = epInterruptInIndex;
    +
    221  else
    +
    222  if((pep->bmAttributes & 0x02) == 2)
    +
    223  index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
    +
    224  else
    +
    225  return;
    +
    226 
    +
    227  // Fill in the endpoint info structure
    +
    228  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    +
    229  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    +
    230  epInfo[index].epAttribs = 0;
    231 
    -
    232  // Fill in the endpoint info structure
    -
    233  epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    234  epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    235  epInfo[index].epAttribs = 0;
    +
    232  bNumEP++;
    +
    233 
    +
    234  PrintEndpointDescriptor(pep);
    +
    235 }
    236 
    -
    237  bNumEP++;
    -
    238 
    -
    239  PrintEndpointDescriptor(pep);
    -
    240 }
    -
    241 
    -
    242 uint8_t FTDI::Release() {
    -
    243  pUsb->GetAddressPool().FreeAddress(bAddress);
    -
    244 
    -
    245  bAddress = 0;
    -
    246  bNumEP = 1;
    -
    247  qNextPollTime = 0;
    -
    248  bPollEnable = false;
    -
    249  return 0;
    -
    250 }
    -
    251 
    -
    252 uint8_t FTDI::Poll() {
    -
    253  uint8_t rcode = 0;
    -
    254 
    -
    255  //if (!bPollEnable)
    -
    256  // return 0;
    -
    257 
    -
    258  //if (qNextPollTime <= millis())
    -
    259  //{
    -
    260  // USB_HOST_SERIAL.println(bAddress, HEX);
    +
    237 uint8_t FTDI::Release() {
    +
    238  pUsb->GetAddressPool().FreeAddress(bAddress);
    +
    239 
    +
    240  bAddress = 0;
    +
    241  bNumEP = 1;
    +
    242  qNextPollTime = 0;
    +
    243  bPollEnable = false;
    +
    244  return pAsync->OnRelease(this);
    +
    245 }
    +
    246 
    +
    247 uint8_t FTDI::Poll() {
    +
    248  uint8_t rcode = 0;
    +
    249 
    +
    250  //if (!bPollEnable)
    +
    251  // return 0;
    +
    252 
    +
    253  //if (qNextPollTime <= millis())
    +
    254  //{
    +
    255  // USB_HOST_SERIAL.println(bAddress, HEX);
    +
    256 
    +
    257  // qNextPollTime = millis() + 100;
    +
    258  //}
    +
    259  return rcode;
    +
    260 }
    261 
    -
    262  // qNextPollTime = millis() + 100;
    -
    263  //}
    -
    264  return rcode;
    -
    265 }
    -
    266 
    -
    267 uint8_t FTDI::SetBaudRate(uint32_t baud) {
    -
    268  uint16_t baud_value, baud_index = 0;
    -
    269  uint32_t divisor3;
    -
    270 
    -
    271  divisor3 = 48000000 / 2 / baud; // divisor shifted 3 bits to the left
    -
    272 
    -
    273  if(wFTDIType == FT232AM) {
    -
    274  if((divisor3 & 0x7) == 7)
    -
    275  divisor3++; // round x.7/8 up to x+1
    -
    276 
    -
    277  baud_value = divisor3 >> 3;
    -
    278  divisor3 &= 0x7;
    -
    279 
    -
    280  if(divisor3 == 1) baud_value |= 0xc000;
    -
    281  else // 0.125
    -
    282  if(divisor3 >= 4) baud_value |= 0x4000;
    -
    283  else // 0.5
    -
    284  if(divisor3 != 0) baud_value |= 0x8000; // 0.25
    -
    285  if(baud_value == 1) baud_value = 0; /* special case for maximum baud rate */
    -
    286  } else {
    -
    287  static const unsigned char divfrac [8] = {0, 3, 2, 0, 1, 1, 2, 3};
    -
    288  static const unsigned char divindex[8] = {0, 0, 0, 1, 0, 1, 1, 1};
    -
    289 
    -
    290  baud_value = divisor3 >> 3;
    -
    291  baud_value |= divfrac [divisor3 & 0x7] << 14;
    -
    292  baud_index = divindex[divisor3 & 0x7];
    -
    293 
    -
    294  /* Deal with special cases for highest baud rates. */
    -
    295  if(baud_value == 1) baud_value = 0;
    -
    296  else // 1.0
    -
    297  if(baud_value == 0x4001) baud_value = 1; // 1.5
    -
    298  }
    -
    299  USBTRACE2("baud_value:", baud_value);
    -
    300  USBTRACE2("baud_index:", baud_index);
    -
    301  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);
    -
    302 }
    -
    303 
    -
    304 uint8_t FTDI::SetModemControl(uint16_t signal) {
    -
    305  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_MODEM_CTRL, signal & 0xff, signal >> 8, 0, 0, 0, NULL, NULL);
    -
    306 }
    -
    307 
    -
    308 uint8_t FTDI::SetFlowControl(uint8_t protocol, uint8_t xon, uint8_t xoff) {
    -
    309  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_FLOW_CTRL, xon, xoff, protocol << 8, 0, 0, NULL, NULL);
    -
    310 }
    -
    311 
    -
    312 uint8_t FTDI::SetData(uint16_t databm) {
    -
    313  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_DATA, databm & 0xff, databm >> 8, 0, 0, 0, NULL, NULL);
    -
    314 }
    -
    315 
    -
    316 uint8_t FTDI::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    -
    317  return pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    -
    318 }
    -
    319 
    -
    320 uint8_t FTDI::SndData(uint16_t nbytes, uint8_t *dataptr) {
    -
    321  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    -
    322 }
    -
    323 
    -
    324 void FTDI::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr) {
    -
    325  Notify(PSTR("Endpoint descriptor:"), 0x80);
    -
    326  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    -
    327  PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    -
    328  Notify(PSTR("\r\nType:\t\t"), 0x80);
    -
    329  PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    -
    330  Notify(PSTR("\r\nAddress:\t"), 0x80);
    -
    331  PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    -
    332  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    -
    333  PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    -
    334  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    -
    335  PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    -
    336  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    -
    337  PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    -
    338  Notify(PSTR("\r\n"), 0x80);
    -
    339 }
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:766
    +
    262 uint8_t FTDI::SetBaudRate(uint32_t baud) {
    +
    263  uint16_t baud_value, baud_index = 0;
    +
    264  uint32_t divisor3;
    +
    265 
    +
    266  divisor3 = 48000000 / 2 / baud; // divisor shifted 3 bits to the left
    +
    267 
    +
    268  if(wFTDIType == FT232AM) {
    +
    269  if((divisor3 & 0x7) == 7)
    +
    270  divisor3++; // round x.7/8 up to x+1
    +
    271 
    +
    272  baud_value = divisor3 >> 3;
    +
    273  divisor3 &= 0x7;
    +
    274 
    +
    275  if(divisor3 == 1) baud_value |= 0xc000;
    +
    276  else // 0.125
    +
    277  if(divisor3 >= 4) baud_value |= 0x4000;
    +
    278  else // 0.5
    +
    279  if(divisor3 != 0) baud_value |= 0x8000; // 0.25
    +
    280  if(baud_value == 1) baud_value = 0; /* special case for maximum baud rate */
    +
    281  } else {
    +
    282  static const unsigned char divfrac [8] = {0, 3, 2, 0, 1, 1, 2, 3};
    +
    283  static const unsigned char divindex[8] = {0, 0, 0, 1, 0, 1, 1, 1};
    +
    284 
    +
    285  baud_value = divisor3 >> 3;
    +
    286  baud_value |= divfrac [divisor3 & 0x7] << 14;
    +
    287  baud_index = divindex[divisor3 & 0x7];
    +
    288 
    +
    289  /* Deal with special cases for highest baud rates. */
    +
    290  if(baud_value == 1) baud_value = 0;
    +
    291  else // 1.0
    +
    292  if(baud_value == 0x4001) baud_value = 1; // 1.5
    +
    293  }
    +
    294  USBTRACE2("baud_value:", baud_value);
    +
    295  USBTRACE2("baud_index:", baud_index);
    +
    296  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);
    +
    297 }
    +
    298 
    +
    299 uint8_t FTDI::SetModemControl(uint16_t signal) {
    +
    300  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_MODEM_CTRL, signal & 0xff, signal >> 8, 0, 0, 0, NULL, NULL);
    +
    301 }
    +
    302 
    +
    303 uint8_t FTDI::SetFlowControl(uint8_t protocol, uint8_t xon, uint8_t xoff) {
    +
    304  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_FLOW_CTRL, xon, xoff, protocol << 8, 0, 0, NULL, NULL);
    +
    305 }
    +
    306 
    +
    307 uint8_t FTDI::SetData(uint16_t databm) {
    +
    308  return pUsb->ctrlReq(bAddress, 0, bmREQ_FTDI_OUT, FTDI_SIO_SET_DATA, databm & 0xff, databm >> 8, 0, 0, 0, NULL, NULL);
    +
    309 }
    +
    310 
    +
    311 uint8_t FTDI::RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr) {
    +
    312  return pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, bytes_rcvd, dataptr);
    +
    313 }
    +
    314 
    +
    315 uint8_t FTDI::SndData(uint16_t nbytes, uint8_t *dataptr) {
    +
    316  return pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, nbytes, dataptr);
    +
    317 }
    +
    318 
    +
    319 void FTDI::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr) {
    +
    320  Notify(PSTR("Endpoint descriptor:"), 0x80);
    +
    321  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    +
    322  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    +
    323  Notify(PSTR("\r\nType:\t\t"), 0x80);
    +
    324  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    +
    325  Notify(PSTR("\r\nAddress:\t"), 0x80);
    +
    326  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    +
    327  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    +
    328  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    +
    329  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    +
    330  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    +
    331  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    +
    332  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    +
    333  Notify(PSTR("\r\n"), 0x80);
    +
    334 }
    +
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:769
    #define bmREQ_FTDI_OUT
    Definition: cdcftdi.h:22
    EpInfo * epinfo
    Definition: address.h:76
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcftdi.cpp:215
    +
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcftdi.cpp:210
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:81
    -
    uint8_t SetBaudRate(uint32_t baud)
    Definition: cdcftdi.cpp:267
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +
    uint8_t SetBaudRate(uint32_t baud)
    Definition: cdcftdi.cpp:262
    uint8_t bmNakPower
    Definition: address.h:42
    #define FT232AM
    Definition: cdcftdi.h:31
    uint16_t bcdDevice
    Definition: usb_ch9.h:108
    -
    uint8_t SetModemControl(uint16_t control)
    Definition: cdcftdi.cpp:304
    +
    uint8_t SetModemControl(uint16_t control)
    Definition: cdcftdi.cpp:299
    #define FTDI_SIO_SET_BAUD_RATE
    Definition: cdcftdi.h:40
    @@ -452,55 +448,58 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #define NotifyFail(...)
    Definition: message.h:55
    #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:308
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:805
    +
    uint8_t SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)
    Definition: cdcftdi.cpp:303
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:808
    #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:316
    +
    uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: cdcftdi.cpp:311
    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
    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:796
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    uint8_t epAddr
    Definition: address.h:33
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    -
    virtual uint8_t Poll()
    Definition: cdcftdi.cpp:252
    +
    uint8_t Poll()
    Definition: cdcftdi.cpp:247
    Definition: address.h:32
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:292
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    #define FTDI_PID
    Definition: cdcftdi.h:29
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcftdi.cpp:41
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcftdi.cpp:39
    #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
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:83
    -
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcftdi.cpp:320
    +
    virtual uint8_t OnInit(FTDI *pftdi)
    Definition: cdcftdi.h:82
    +
    #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:315
    -
    virtual uint8_t OnInit(FTDI *pftdi)=0
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:80
    +
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    +
    virtual uint8_t OnRelease(FTDI *pftdi)
    Definition: cdcftdi.h:85
    #define FTDI_VID
    Definition: cdcftdi.h:28
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data)
    Definition: Usb.cpp:206
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    -
    virtual uint8_t Release()
    Definition: cdcftdi.cpp:242
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    +
    uint8_t Release()
    Definition: cdcftdi.cpp:237
    uint16_t idProduct
    Definition: usb_ch9.h:107
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:112
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:78
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    #define FTDI_SIO_MODEM_CTRL
    Definition: cdcftdi.h:38
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:206
    -
    Definition: UsbCore.h:190
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:210
    +
    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:312
    -
    #define FTDI_MAX_ENDPOINTS
    Definition: cdcftdi.h:87
    +
    uint8_t SetData(uint16_t databm)
    Definition: cdcftdi.cpp:307
    +
    #define FTDI_MAX_ENDPOINTS
    Definition: cdcftdi.h:92
    #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:761
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:764
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    @@ -508,7 +507,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/cdcftdi_8h.html b/cdcftdi_8h.html index 2a7ec6fd..d1246275 100644 --- a/cdcftdi_8h.html +++ b/cdcftdi_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcftdi.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -805,7 +806,7 @@ Macros
    -

    Definition at line 87 of file cdcftdi.h.

    +

    Definition at line 92 of file cdcftdi.h.

    @@ -814,7 +815,7 @@ Macros diff --git a/cdcftdi_8h__dep__incl.md5 b/cdcftdi_8h__dep__incl.md5 index 400265fa..d2a73e5f 100644 --- a/cdcftdi_8h__dep__incl.md5 +++ b/cdcftdi_8h__dep__incl.md5 @@ -1 +1 @@ -6df33ccb134496caa17a0ccfb805cc20 \ No newline at end of file +bb94e7e9d10e1bde33f1040736fc690f \ No newline at end of file diff --git a/cdcftdi_8h__incl.md5 b/cdcftdi_8h__incl.md5 index a83f7eac..8f85634d 100644 --- a/cdcftdi_8h__incl.md5 +++ b/cdcftdi_8h__incl.md5 @@ -1 +1 @@ -7d34e76d8855698f6d76eca966d6ea18 \ No newline at end of file +5a325c73b89e2318a59e437a1ca1f735 \ No newline at end of file diff --git a/cdcftdi_8h_source.html b/cdcftdi_8h_source.html index 657af0ff..a74a5172 100644 --- a/cdcftdi_8h_source.html +++ b/cdcftdi_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcftdi.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,143 +114,157 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    +
    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
    +
    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
    +
    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 */
    +
    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
    +
    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)
    +
    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 ))
    +
    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)
    +
    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
    +
    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  virtual uint8_t OnInit(FTDI *pftdi) = 0;
    -
    82 };
    -
    83 
    +
    81 
    +
    82  virtual uint8_t OnInit(FTDI *pftdi) {
    +
    83  };
    84 
    -
    85 // Only single port chips are currently supported by the library,
    -
    86 // so only three endpoints are allocated.
    -
    87 #define FTDI_MAX_ENDPOINTS 3
    +
    85  virtual uint8_t OnRelease(FTDI *pftdi) {
    +
    86  };
    +
    87 };
    88 
    -
    89 class FTDI : public USBDeviceConfig, public UsbConfigXtracter {
    -
    90  static const uint8_t epDataInIndex; // DataIn endpoint index
    -
    91  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    -
    92  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
    +
    89 
    +
    90 // Only single port chips are currently supported by the library,
    +
    91 // so only three endpoints are allocated.
    +
    92 #define FTDI_MAX_ENDPOINTS 3
    93 
    -
    94  FTDIAsyncOper *pAsync;
    -
    95  USB *pUsb;
    -
    96  uint8_t bAddress;
    -
    97  uint8_t bConfNum; // configuration number
    -
    98  uint8_t bNumIface; // number of interfaces in the configuration
    -
    99  uint8_t bNumEP; // total number of EP in the configuration
    -
    100  uint32_t qNextPollTime; // next poll time
    -
    101  bool bPollEnable; // poll enable flag
    -
    102  uint16_t wFTDIType; // Type of FTDI chip
    -
    103 
    -
    104  EpInfo epInfo[FTDI_MAX_ENDPOINTS];
    -
    105 
    -
    106  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
    -
    107 
    -
    108 public:
    -
    109  FTDI(USB *pusb, FTDIAsyncOper *pasync);
    +
    94 class FTDI : public USBDeviceConfig, public UsbConfigXtracter {
    +
    95  static const uint8_t epDataInIndex; // DataIn endpoint index
    +
    96  static const uint8_t epDataOutIndex; // DataOUT endpoint index
    +
    97  static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
    +
    98 
    +
    99  FTDIAsyncOper *pAsync;
    +
    100  USB *pUsb;
    +
    101  uint8_t bAddress;
    +
    102  uint8_t bConfNum; // configuration number
    +
    103  uint8_t bNumIface; // number of interfaces in the configuration
    +
    104  uint8_t bNumEP; // total number of EP in the configuration
    +
    105  uint32_t qNextPollTime; // next poll time
    +
    106  bool bPollEnable; // poll enable flag
    +
    107  uint16_t wFTDIType; // Type of FTDI chip
    +
    108 
    +
    109  EpInfo epInfo[FTDI_MAX_ENDPOINTS];
    110 
    -
    111  uint8_t SetBaudRate(uint32_t baud);
    -
    112  uint8_t SetModemControl(uint16_t control);
    -
    113  uint8_t SetFlowControl(uint8_t protocol, uint8_t xon = 0x11, uint8_t xoff = 0x13);
    -
    114  uint8_t SetData(uint16_t databm);
    +
    111  void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
    +
    112 
    +
    113 public:
    +
    114  FTDI(USB *pusb, FTDIAsyncOper *pasync);
    115 
    -
    116  // Methods for recieving and sending data
    -
    117  uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr);
    -
    118  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    -
    119 
    -
    120  // USBDeviceConfig implementation
    -
    121  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    122  virtual uint8_t Release();
    -
    123  virtual uint8_t Poll();
    +
    116  uint8_t SetBaudRate(uint32_t baud);
    +
    117  uint8_t SetModemControl(uint16_t control);
    +
    118  uint8_t SetFlowControl(uint8_t protocol, uint8_t xon = 0x11, uint8_t xoff = 0x13);
    +
    119  uint8_t SetData(uint16_t databm);
    +
    120 
    +
    121  // Methods for recieving and sending data
    +
    122  uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr);
    +
    123  uint8_t SndData(uint16_t nbytes, uint8_t *dataptr);
    124 
    -
    125  virtual uint8_t GetAddress() {
    -
    126  return bAddress;
    -
    127  };
    -
    128 
    -
    129  // UsbConfigXtracter implementation
    -
    130  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    131 };
    -
    132 
    -
    133 #endif // __CDCFTDI_H__
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcftdi.cpp:215
    -
    uint8_t SetBaudRate(uint32_t baud)
    Definition: cdcftdi.cpp:267
    -
    uint8_t SetModemControl(uint16_t control)
    Definition: cdcftdi.cpp:304
    +
    125  // USBDeviceConfig implementation
    +
    126  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    +
    127  uint8_t Release();
    +
    128  uint8_t Poll();
    +
    129 
    +
    130  virtual uint8_t GetAddress() {
    +
    131  return bAddress;
    +
    132  };
    +
    133 
    +
    134  // UsbConfigXtracter implementation
    +
    135  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    +
    136 
    +
    137  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
    +
    138  return (vid == FTDI_VID && pid == FTDI_PID);
    +
    139  }
    +
    140 
    +
    141 };
    +
    142 
    +
    143 #endif // __CDCFTDI_H__
    +
    virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
    Definition: cdcftdi.h:137
    +
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: cdcftdi.cpp:210
    +
    uint8_t SetBaudRate(uint32_t baud)
    Definition: cdcftdi.cpp:262
    +
    uint8_t SetModemControl(uint16_t control)
    Definition: cdcftdi.cpp:299
    FTDI(USB *pusb, FTDIAsyncOper *pasync)
    Definition: cdcftdi.cpp:23
    -
    uint8_t SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)
    Definition: cdcftdi.cpp:308
    - +
    uint8_t SetFlowControl(uint8_t protocol, uint8_t xon=0x11, uint8_t xoff=0x13)
    Definition: cdcftdi.cpp:303
    + -
    uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: cdcftdi.cpp:316
    -
    virtual uint8_t Poll()
    Definition: cdcftdi.cpp:252
    +
    uint8_t RcvData(uint16_t *bytes_rcvd, uint8_t *dataptr)
    Definition: cdcftdi.cpp:311
    +
    uint8_t Poll()
    Definition: cdcftdi.cpp:247
    Definition: address.h:32
    -
    Definition: cdcftdi.h:89
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcftdi.cpp:41
    -
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcftdi.cpp:320
    -
    virtual uint8_t GetAddress()
    Definition: cdcftdi.h:125
    +
    Definition: cdcftdi.h:94
    +
    #define FTDI_PID
    Definition: cdcftdi.h:29
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcftdi.cpp:39
    +
    virtual uint8_t OnInit(FTDI *pftdi)
    Definition: cdcftdi.h:82
    +
    uint8_t SndData(uint16_t nbytes, uint8_t *dataptr)
    Definition: cdcftdi.cpp:315
    +
    virtual uint8_t GetAddress()
    Definition: cdcftdi.h:130
    -
    virtual uint8_t OnInit(FTDI *pftdi)=0
    -
    virtual uint8_t Release()
    Definition: cdcftdi.cpp:242
    -
    Definition: UsbCore.h:190
    -
    uint8_t SetData(uint16_t databm)
    Definition: cdcftdi.cpp:312
    -
    #define FTDI_MAX_ENDPOINTS
    Definition: cdcftdi.h:87
    +
    virtual uint8_t OnRelease(FTDI *pftdi)
    Definition: cdcftdi.h:85
    +
    #define FTDI_VID
    Definition: cdcftdi.h:28
    +
    uint8_t Release()
    Definition: cdcftdi.cpp:237
    +
    Definition: UsbCore.h:197
    +
    uint8_t SetData(uint16_t databm)
    Definition: cdcftdi.cpp:307
    +
    #define FTDI_MAX_ENDPOINTS
    Definition: cdcftdi.h:92
    diff --git a/cdcprolific_8cpp.html b/cdcprolific_8cpp.html index 5e5af464..19b9d676 100644 --- a/cdcprolific_8cpp.html +++ b/cdcprolific_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcprolific.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for cdcprolific.cpp:
    diff --git a/cdcprolific_8cpp__incl.md5 b/cdcprolific_8cpp__incl.md5 index 44ce861d..1e1ab220 100644 --- a/cdcprolific_8cpp__incl.md5 +++ b/cdcprolific_8cpp__incl.md5 @@ -1 +1 @@ -1b82f3fbedb914a6f7a2686151967527 \ No newline at end of file +a91e5714ebd81502b745c96a64138390 \ No newline at end of file diff --git a/cdcprolific_8cpp_source.html b/cdcprolific_8cpp_source.html index 092a7bfc..31248a13 100644 --- a/cdcprolific_8cpp_source.html +++ b/cdcprolific_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcprolific.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -236,7 +237,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    145  if(rcode)
    146  goto FailSetConfDescr;
    147 
    -
    148  rcode = pAsync->OnInit(this);
    +
    148  rcode = pAsync->OnInit(this);
    149 
    150  if(rcode)
    151  goto FailOnInit;
    @@ -244,7 +245,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    153  USBTRACE("PL configured\r\n");
    154 
    155  //bPollEnable = true;
    -
    156  ready = true;
    +
    156  ready = true;
    157  return 0;
    158 
    159 FailGetDevDescr:
    @@ -286,69 +287,69 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    195 
    196 //uint8_t PL::Poll()
    197 //{
    -
    198 // uint8_t rcode = 0;
    +
    198 // uint8_t rcode = 0;
    199 //
    -
    200 // //if (!bPollEnable)
    -
    201 // // return 0;
    +
    200 // //if (!bPollEnable)
    +
    201 // // return 0;
    202 //
    -
    203 // //if (qNextPollTime <= millis())
    -
    204 // //{
    -
    205 // // USB_HOST_SERIAL.println(bAddress, HEX);
    +
    203 // //if (qNextPollTime <= millis())
    +
    204 // //{
    +
    205 // // USB_HOST_SERIAL.println(bAddress, HEX);
    206 //
    -
    207 // // qNextPollTime = millis() + 100;
    -
    208 // //}
    -
    209 // return rcode;
    +
    207 // // qNextPollTime = millis() + 100;
    +
    208 // //}
    +
    209 // return rcode;
    210 //}
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:766
    +
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:769
    EpInfo * epinfo
    Definition: address.h:76
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:81
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +
    virtual uint8_t OnInit(ACM *pacm)
    Definition: cdcacm.h:131
    uint16_t bcdDevice
    Definition: usb_ch9.h:108
    #define PL_PID
    Definition: cdcprolific.h:23
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcprolific.cpp:24
    +
    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
    -
    bool ready
    Definition: cdcacm.h:153
    +
    volatile bool ready
    Definition: cdcacm.h:178
    #define NotifyFail(...)
    Definition: message.h:55
    -
    USB * pUsb
    Definition: cdcacm.h:144
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:805
    -
    uint8_t bNumEP
    Definition: cdcacm.h:150
    -
    EpInfo epInfo[ACM_MAX_ENDPOINTS]
    Definition: cdcacm.h:155
    +
    USB * pUsb
    Definition: cdcacm.h:169
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:808
    +
    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
    virtual void FreeAddress(uint8_t addr)=0
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
    -
    CDCAsyncOper * pAsync
    Definition: cdcacm.h:145
    - +
    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:796
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    Definition: address.h:32
    #define PL_VID
    Definition: cdcprolific.h:22
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    -
    uint8_t bAddress
    Definition: cdcacm.h:146
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:83
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:80
    +
    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
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    uint16_t idProduct
    Definition: usb_ch9.h:107
    -
    virtual uint8_t Release()
    Definition: cdcacm.cpp:251
    -
    uint8_t bConfNum
    Definition: cdcacm.h:147
    +
    uint8_t Release()
    Definition: cdcacm.cpp:257
    +
    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:78
    -
    virtual uint8_t OnInit(ACM *pacm)=0
    +
    #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:206
    -
    Definition: UsbCore.h:190
    -
    Definition: cdcacm.h:138
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    +
    Definition: UsbCore.h:197
    +
    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:761
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:764
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    @@ -356,7 +357,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/cdcprolific_8h.html b/cdcprolific_8h.html index 3749bd30..1c73a705 100644 --- a/cdcprolific_8h.html +++ b/cdcprolific_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcprolific.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -677,7 +678,7 @@ Enumerations
    -

    Definition at line 68 of file cdcprolific.h.

    +

    Definition at line 60 of file cdcprolific.h.

    @@ -691,7 +692,7 @@ Enumerations
    -

    Definition at line 69 of file cdcprolific.h.

    +

    Definition at line 61 of file cdcprolific.h.

    @@ -705,7 +706,7 @@ Enumerations
    -

    Definition at line 70 of file cdcprolific.h.

    +

    Definition at line 62 of file cdcprolific.h.

    @@ -719,7 +720,7 @@ Enumerations
    -

    Definition at line 71 of file cdcprolific.h.

    +

    Definition at line 63 of file cdcprolific.h.

    @@ -733,7 +734,7 @@ Enumerations
    -

    Definition at line 72 of file cdcprolific.h.

    +

    Definition at line 64 of file cdcprolific.h.

    @@ -747,7 +748,7 @@ Enumerations
    -

    Definition at line 74 of file cdcprolific.h.

    +

    Definition at line 66 of file cdcprolific.h.

    @@ -761,7 +762,7 @@ Enumerations
    -

    Definition at line 75 of file cdcprolific.h.

    +

    Definition at line 67 of file cdcprolific.h.

    @@ -775,7 +776,7 @@ Enumerations
    -

    Definition at line 76 of file cdcprolific.h.

    +

    Definition at line 68 of file cdcprolific.h.

    @@ -789,7 +790,7 @@ Enumerations
    -

    Definition at line 77 of file cdcprolific.h.

    +

    Definition at line 69 of file cdcprolific.h.

    @@ -803,7 +804,7 @@ Enumerations
    -

    Definition at line 78 of file cdcprolific.h.

    +

    Definition at line 70 of file cdcprolific.h.

    @@ -817,7 +818,7 @@ Enumerations
    -

    Definition at line 80 of file cdcprolific.h.

    +

    Definition at line 72 of file cdcprolific.h.

    @@ -831,7 +832,7 @@ Enumerations
    -

    Definition at line 81 of file cdcprolific.h.

    +

    Definition at line 73 of file cdcprolific.h.

    @@ -845,7 +846,7 @@ Enumerations
    -

    Definition at line 83 of file cdcprolific.h.

    +

    Definition at line 75 of file cdcprolific.h.

    @@ -859,7 +860,7 @@ Enumerations
    -

    Definition at line 84 of file cdcprolific.h.

    +

    Definition at line 76 of file cdcprolific.h.

    @@ -873,7 +874,7 @@ Enumerations
    -

    Definition at line 87 of file cdcprolific.h.

    +

    Definition at line 79 of file cdcprolific.h.

    @@ -887,7 +888,7 @@ Enumerations
    -

    Definition at line 88 of file cdcprolific.h.

    +

    Definition at line 80 of file cdcprolific.h.

    @@ -901,7 +902,7 @@ Enumerations
    -

    Definition at line 89 of file cdcprolific.h.

    +

    Definition at line 81 of file cdcprolific.h.

    @@ -915,7 +916,7 @@ Enumerations
    -

    Definition at line 90 of file cdcprolific.h.

    +

    Definition at line 82 of file cdcprolific.h.

    @@ -929,7 +930,7 @@ Enumerations
    -

    Definition at line 91 of file cdcprolific.h.

    +

    Definition at line 83 of file cdcprolific.h.

    @@ -943,7 +944,7 @@ Enumerations
    -

    Definition at line 93 of file cdcprolific.h.

    +

    Definition at line 85 of file cdcprolific.h.

    @@ -957,7 +958,7 @@ Enumerations
    -

    Definition at line 94 of file cdcprolific.h.

    +

    Definition at line 86 of file cdcprolific.h.

    @@ -971,7 +972,7 @@ Enumerations
    -

    Definition at line 95 of file cdcprolific.h.

    +

    Definition at line 87 of file cdcprolific.h.

    @@ -985,7 +986,7 @@ Enumerations
    -

    Definition at line 96 of file cdcprolific.h.

    +

    Definition at line 88 of file cdcprolific.h.

    @@ -999,7 +1000,7 @@ Enumerations
    -

    Definition at line 98 of file cdcprolific.h.

    +

    Definition at line 90 of file cdcprolific.h.

    @@ -1013,7 +1014,7 @@ Enumerations
    -

    Definition at line 99 of file cdcprolific.h.

    +

    Definition at line 91 of file cdcprolific.h.

    @@ -1027,7 +1028,7 @@ Enumerations
    -

    Definition at line 100 of file cdcprolific.h.

    +

    Definition at line 92 of file cdcprolific.h.

    @@ -1041,7 +1042,7 @@ Enumerations
    -

    Definition at line 101 of file cdcprolific.h.

    +

    Definition at line 93 of file cdcprolific.h.

    @@ -1055,7 +1056,7 @@ Enumerations
    -

    Definition at line 104 of file cdcprolific.h.

    +

    Definition at line 96 of file cdcprolific.h.

    @@ -1069,7 +1070,7 @@ Enumerations
    -

    Definition at line 105 of file cdcprolific.h.

    +

    Definition at line 97 of file cdcprolific.h.

    @@ -1083,7 +1084,7 @@ Enumerations
    -

    Definition at line 116 of file cdcprolific.h.

    +

    Definition at line 100 of file cdcprolific.h.

    @@ -1110,7 +1111,7 @@ Enumerations -

    Definition at line 60 of file cdcprolific.h.

    +

    Definition at line 102 of file cdcprolific.h.

    @@ -1136,7 +1137,7 @@ Enumerations -

    Definition at line 107 of file cdcprolific.h.

    +

    Definition at line 110 of file cdcprolific.h.

    @@ -1145,7 +1146,7 @@ Enumerations diff --git a/cdcprolific_8h__dep__incl.md5 b/cdcprolific_8h__dep__incl.md5 index 6e869c59..3f648651 100644 --- a/cdcprolific_8h__dep__incl.md5 +++ b/cdcprolific_8h__dep__incl.md5 @@ -1 +1 @@ -7e1c0310ccf8e65031fd95168f61528c \ No newline at end of file +5601c68c5c5e913b421194d3f765f64d \ No newline at end of file diff --git a/cdcprolific_8h__incl.md5 b/cdcprolific_8h__incl.md5 index 4016e2b7..e7519a47 100644 --- a/cdcprolific_8h__incl.md5 +++ b/cdcprolific_8h__incl.md5 @@ -1 +1 @@ -e26e4be2e6b8e7c00195ad3f65bee601 \ No newline at end of file +9d9a09dd605ff7c3be8e192a907ecbfe \ No newline at end of file diff --git a/cdcprolific_8h_source.html b/cdcprolific_8h_source.html index 150d8dc1..ccb28001 100644 --- a/cdcprolific_8h_source.html +++ b/cdcprolific_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: cdcprolific.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,140 +114,141 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    22 #define PL_VID 0x067B
    23 #define PL_PID ( 0x2303 || 0x0609 )
    24 
    -
    25 //#define PL_PID 0x0609
    +
    25 //#define PL_PID 0x0609
    26 
    27 #define PROLIFIC_REV_H 0x0202
    28 #define PROLIFIC_REV_X 0x0300
    29 #define PROLIFIC_REV_HX_CHIP_D 0x0400
    30 #define PROLIFIC_REV_1 0x0001
    31 
    -
    32 #define kXOnChar '\x11'
    -
    33 #define kXOffChar '\x13'
    +
    32 #define kXOnChar '\x11'
    +
    33 #define kXOffChar '\x13'
    34 
    -
    35 #define SPECIAL_SHIFT (5)
    -
    36 #define SPECIAL_MASK ((1<<SPECIAL_SHIFT) - 1)
    -
    37 #define STATE_ALL ( PD_RS232_S_MASK | PD_S_MASK )
    -
    38 #define FLOW_RX_AUTO ( PD_RS232_A_RFR | PD_RS232_A_DTR | PD_RS232_A_RXO )
    -
    39 #define FLOW_TX_AUTO ( PD_RS232_A_CTS | PD_RS232_A_DSR | PD_RS232_A_TXO | PD_RS232_A_DCD )
    -
    40 #define CAN_BE_AUTO ( FLOW_RX_AUTO | FLOW_TX_AUTO )
    -
    41 #define CAN_NOTIFY ( PD_RS232_N_MASK )
    -
    42 #define EXTERNAL_MASK ( PD_S_MASK | (PD_RS232_S_MASK & ~PD_RS232_S_LOOP) )
    -
    43 #define INTERNAL_DELAY ( PD_RS232_S_LOOP )
    -
    44 #define DEFAULT_AUTO ( PD_RS232_A_DTR | PD_RS232_A_RFR | PD_RS232_A_CTS | PD_RS232_A_DSR )
    -
    45 #define DEFAULT_NOTIFY 0x00
    -
    46 #define DEFAULT_STATE ( PD_S_TX_ENABLE | PD_S_RX_ENABLE | PD_RS232_A_TXO | PD_RS232_A_RXO )
    +
    35 #define SPECIAL_SHIFT (5)
    +
    36 #define SPECIAL_MASK ((1<<SPECIAL_SHIFT) - 1)
    +
    37 #define STATE_ALL ( PD_RS232_S_MASK | PD_S_MASK )
    +
    38 #define FLOW_RX_AUTO ( PD_RS232_A_RFR | PD_RS232_A_DTR | PD_RS232_A_RXO )
    +
    39 #define FLOW_TX_AUTO ( PD_RS232_A_CTS | PD_RS232_A_DSR | PD_RS232_A_TXO | PD_RS232_A_DCD )
    +
    40 #define CAN_BE_AUTO ( FLOW_RX_AUTO | FLOW_TX_AUTO )
    +
    41 #define CAN_NOTIFY ( PD_RS232_N_MASK )
    +
    42 #define EXTERNAL_MASK ( PD_S_MASK | (PD_RS232_S_MASK & ~PD_RS232_S_LOOP) )
    +
    43 #define INTERNAL_DELAY ( PD_RS232_S_LOOP )
    +
    44 #define DEFAULT_AUTO ( PD_RS232_A_DTR | PD_RS232_A_RFR | PD_RS232_A_CTS | PD_RS232_A_DSR )
    +
    45 #define DEFAULT_NOTIFY 0x00
    +
    46 #define DEFAULT_STATE ( PD_S_TX_ENABLE | PD_S_RX_ENABLE | PD_RS232_A_TXO | PD_RS232_A_RXO )
    47 
    48 #define CONTINUE_SEND 1
    49 #define PAUSE_SEND 2
    50 
    -
    51 #define kRxAutoFlow ((UInt32)( PD_RS232_A_RFR | PD_RS232_A_DTR | PD_RS232_A_RXO ))
    -
    52 #define kTxAutoFlow ((UInt32)( PD_RS232_A_CTS | PD_RS232_A_DSR | PD_RS232_A_TXO | PD_RS232_A_DCD ))
    -
    53 #define kControl_StateMask ((UInt32)( PD_RS232_S_CTS | PD_RS232_S_DSR | PD_RS232_S_CAR | PD_RS232_S_RI ))
    -
    54 #define kRxQueueState ((UInt32)( PD_S_RXQ_EMPTY | PD_S_RXQ_LOW_WATER | PD_S_RXQ_HIGH_WATER | PD_S_RXQ_FULL ))
    -
    55 #define kTxQueueState ((UInt32)( PD_S_TXQ_EMPTY | PD_S_TXQ_LOW_WATER | PD_S_TXQ_HIGH_WATER | PD_S_TXQ_FULL ))
    +
    51 #define kRxAutoFlow ((UInt32)( PD_RS232_A_RFR | PD_RS232_A_DTR | PD_RS232_A_RXO ))
    +
    52 #define kTxAutoFlow ((UInt32)( PD_RS232_A_CTS | PD_RS232_A_DSR | PD_RS232_A_TXO | PD_RS232_A_DCD ))
    +
    53 #define kControl_StateMask ((UInt32)( PD_RS232_S_CTS | PD_RS232_S_DSR | PD_RS232_S_CAR | PD_RS232_S_RI ))
    +
    54 #define kRxQueueState ((UInt32)( PD_S_RXQ_EMPTY | PD_S_RXQ_LOW_WATER | PD_S_RXQ_HIGH_WATER | PD_S_RXQ_FULL ))
    +
    55 #define kTxQueueState ((UInt32)( PD_S_TXQ_EMPTY | PD_S_TXQ_LOW_WATER | PD_S_TXQ_HIGH_WATER | PD_S_TXQ_FULL ))
    56 
    57 #define kCONTROL_DTR 0x01
    58 #define kCONTROL_RTS 0x02
    59 
    -
    60 enum tXO_State {
    -
    61  kXOnSent = -2,
    -
    62  kXOffSent = -1,
    -
    63  kXO_Idle = 0,
    - - -
    66 };
    -
    67 
    -
    68 #define kStateTransientMask 0x74
    -
    69 #define kBreakError 0x04
    -
    70 #define kFrameError 0x10
    -
    71 #define kParityError 0x20
    -
    72 #define kOverrunError 0x40
    -
    73 
    -
    74 #define kCTS 0x80
    -
    75 #define kDSR 0x02
    -
    76 #define kRI 0x08
    -
    77 #define kDCD 0x01
    -
    78 #define kHandshakeInMask ((UInt32)( PD_RS232_S_CTS | PD_RS232_S_DSR | PD_RS232_S_CAR | PD_RS232_S_RI ))
    -
    79 
    -
    80 #define VENDOR_WRITE_REQUEST_TYPE 0x40
    -
    81 #define VENDOR_WRITE_REQUEST 0x01
    -
    82 
    -
    83 #define VENDOR_READ_REQUEST_TYPE 0xc0
    -
    84 #define VENDOR_READ_REQUEST 0x01
    -
    85 
    -
    86 // Device Configuration Registers (DCR0, DCR1, DCR2)
    -
    87 #define SET_DCR0 0x00
    -
    88 #define GET_DCR0 0x80
    -
    89 #define DCR0_INIT 0x01
    -
    90 #define DCR0_INIT_H 0x41
    -
    91 #define DCR0_INIT_X 0x61
    -
    92 
    -
    93 #define SET_DCR1 0x01
    -
    94 #define GET_DCR1 0x81
    -
    95 #define DCR1_INIT_H 0x80
    -
    96 #define DCR1_INIT_X 0x00
    -
    97 
    -
    98 #define SET_DCR2 0x02
    -
    99 #define GET_DCR2 0x82
    -
    100 #define DCR2_INIT_H 0x24
    -
    101 #define DCR2_INIT_X 0x44
    -
    102 
    -
    103 // On-chip Data Buffers:
    -
    104 #define RESET_DOWNSTREAM_DATA_PIPE 0x08
    -
    105 #define RESET_UPSTREAM_DATA_PIPE 0x09
    -
    106 
    - - -
    109  type_1, /* don't know the difference between type 0 and */
    -
    110  rev_X, /* type 1, until someone from prolific tells us... */
    -
    111  rev_HX, /* HX version of the pl2303 chip */
    - -
    113 };
    -
    114 
    -
    115 
    -
    116 #define PL_MAX_ENDPOINTS 4
    +
    60 #define kStateTransientMask 0x74
    +
    61 #define kBreakError 0x04
    +
    62 #define kFrameError 0x10
    +
    63 #define kParityError 0x20
    +
    64 #define kOverrunError 0x40
    +
    65 
    +
    66 #define kCTS 0x80
    +
    67 #define kDSR 0x02
    +
    68 #define kRI 0x08
    +
    69 #define kDCD 0x01
    +
    70 #define kHandshakeInMask ((UInt32)( PD_RS232_S_CTS | PD_RS232_S_DSR | PD_RS232_S_CAR | PD_RS232_S_RI ))
    +
    71 
    +
    72 #define VENDOR_WRITE_REQUEST_TYPE 0x40
    +
    73 #define VENDOR_WRITE_REQUEST 0x01
    +
    74 
    +
    75 #define VENDOR_READ_REQUEST_TYPE 0xc0
    +
    76 #define VENDOR_READ_REQUEST 0x01
    +
    77 
    +
    78 // Device Configuration Registers (DCR0, DCR1, DCR2)
    +
    79 #define SET_DCR0 0x00
    +
    80 #define GET_DCR0 0x80
    +
    81 #define DCR0_INIT 0x01
    +
    82 #define DCR0_INIT_H 0x41
    +
    83 #define DCR0_INIT_X 0x61
    +
    84 
    +
    85 #define SET_DCR1 0x01
    +
    86 #define GET_DCR1 0x81
    +
    87 #define DCR1_INIT_H 0x80
    +
    88 #define DCR1_INIT_X 0x00
    +
    89 
    +
    90 #define SET_DCR2 0x02
    +
    91 #define GET_DCR2 0x82
    +
    92 #define DCR2_INIT_H 0x24
    +
    93 #define DCR2_INIT_X 0x44
    +
    94 
    +
    95 // On-chip Data Buffers:
    +
    96 #define RESET_DOWNSTREAM_DATA_PIPE 0x08
    +
    97 #define RESET_UPSTREAM_DATA_PIPE 0x09
    +
    98 
    +
    99 
    +
    100 #define PL_MAX_ENDPOINTS 4
    +
    101 
    +
    102 enum tXO_State {
    +
    103  kXOnSent = -2,
    +
    104  kXOffSent = -1,
    +
    105  kXO_Idle = 0,
    + + +
    108 };
    +
    109 
    + + +
    112  type_1, /* don't know the difference between type 0 and */
    +
    113  rev_X, /* type 1, until someone from prolific tells us... */
    +
    114  rev_HX, /* HX version of the pl2303 chip */
    + +
    116 };
    117 
    -
    118 class PL2303 : public ACM {
    -
    119  uint16_t wPLType; // Type of chip
    -
    120 
    -
    121 public:
    -
    122  PL2303(USB *pusb, CDCAsyncOper *pasync);
    -
    123 
    -
    124  // USBDeviceConfig implementation
    -
    125  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    126  //virtual uint8_t Release();
    -
    127  //virtual uint8_t Poll();
    -
    128  //virtual uint8_t GetAddress() { return bAddress; };
    -
    129 
    -
    131  //virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    132 };
    -
    133 
    -
    134 #endif // __CDCPROLIFIC_H__
    - - -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcprolific.cpp:24
    +
    118 
    +
    119 class PL2303 : public ACM {
    +
    120  uint16_t wPLType; // Type of chip
    +
    121 
    +
    122 public:
    +
    123  PL2303(USB *pusb, CDCAsyncOper *pasync);
    +
    124 
    +
    125  // USBDeviceConfig implementation
    +
    126  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    +
    127  //virtual uint8_t Release();
    +
    128  //virtual uint8_t Poll();
    +
    129  //virtual uint8_t GetAddress() { return bAddress; };
    +
    130 
    +
    132  //virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    +
    133 };
    +
    134 
    +
    135 #endif // __CDCPROLIFIC_H__
    + + +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: cdcprolific.cpp:24
    PL2303(USB *pusb, CDCAsyncOper *pasync)
    Definition: cdcprolific.cpp:19
    - -
    tXO_State
    Definition: cdcprolific.h:60
    - - - - - - -
    pl2303_type
    Definition: cdcprolific.h:107
    + +
    tXO_State
    Definition: cdcprolific.h:102
    + + + + + + +
    pl2303_type
    Definition: cdcprolific.h:110
    - - -
    Definition: UsbCore.h:190
    -
    Definition: cdcacm.h:138
    + + +
    Definition: UsbCore.h:197
    +
    Definition: cdcacm.h:163
    diff --git a/class_a_c_m-members.html b/class_a_c_m-members.html index af1245dc..c889dc66 100644 --- a/class_a_c_m-members.html +++ b/class_a_c_m-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -90,17 +91,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for ACM, including all inherited members.

    - - - - - - - - - - + + + + + + + + + + + + + + + + + + @@ -109,29 +118,31 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
    ACM(USB *pusb, CDCAsyncOper *pasync)ACM
    bAddressACMprotected
    bConfNumACMprotected
    bControlIfaceACMprotected
    bDataIfaceACMprotected
    bNumEPACMprotected
    bPollEnableACMprotected
    ClearCommFeature(uint16_t fid)ACM
    ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    _enhanced_statusACMprotected
    ACM(USB *pusb, CDCAsyncOper *pasync)ACM
    autoflowDSR(bool s)ACMinlinevirtual
    autoflowRTS(bool s)ACMinlinevirtual
    autoflowXON(bool s)ACMinlinevirtual
    available(void)ACMinline
    bAddressACMprotected
    bConfNumACMprotected
    bControlIfaceACMprotected
    bDataIfaceACMprotected
    bNumEPACMprotected
    bPollEnableACMprotected
    ClearCommFeature(uint16_t fid)ACM
    ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual
    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
    GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM
    GetLineCoding(LINE_CODING *dataptr)ACM
    GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr)ACM
    Init(uint8_t parent, uint8_t port, bool lowspeed)ACMvirtual
    isReady()ACMinlinevirtual
    pAsyncACMprotected
    Poll()ACMvirtual
    PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)ACMprotected
    pUsbACMprotected
    qNextPollTimeACMprotected
    RcvData(uint16_t *nbytesptr, uint8_t *dataptr)ACM
    readyACMprotected
    Release()ACMvirtual
    ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
    SendBreak(uint16_t duration)ACM
    SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM
    SetControlLineState(uint8_t state)ACM
    SetLineCoding(const LINE_CODING *dataptr)ACM
    SndData(uint16_t nbytes, uint8_t *dataptr)ACM
    VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    half_duplex(bool s)ACMinlinevirtual
    Init(uint8_t parent, uint8_t port, bool lowspeed)ACMvirtual
    isReady()ACMinlinevirtual
    pAsyncACMprotected
    Poll()ACMvirtual
    PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)ACMprotected
    pUsbACMprotected
    qNextPollTimeACMprotected
    RcvData(uint16_t *nbytesptr, uint8_t *dataptr)ACM
    readyACMprotected
    Release()ACMvirtual
    ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
    SendBreak(uint16_t duration)ACM
    SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM
    SetControlLineState(uint8_t state)ACM
    SetLineCoding(const LINE_CODING *dataptr)ACM
    SndData(uint16_t nbytes, uint8_t *dataptr)ACM
    VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    wide(bool s)ACMinlinevirtual
    diff --git a/class_a_c_m.html b/class_a_c_m.html index 217e95dd..bc36a52d 100644 --- a/class_a_c_m.html +++ b/class_a_c_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ACM Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,14 +101,14 @@ Inheritance diagram for ACM:
    Inheritance graph
    - +
    [legend]
    Collaboration diagram for ACM:
    Collaboration graph
    - +
    [legend]
    - + - + - + + + - + + + + + + + + + + + + + + + - - - - + + + + + +

    @@ -134,27 +135,45 @@ Public Member Functions

     
    uint8_t SndData (uint16_t nbytes, uint8_t *dataptr)
     
    virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)
    uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)
     
    virtual uint8_t Release ()
    uint8_t Release ()
     
    virtual uint8_t Poll ()
    uint8_t Poll ()
     
    bool available (void)
     
    virtual uint8_t GetAddress ()
     
    virtual bool isReady ()
     
    virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    virtual tty_features enhanced_status (void)
     
    virtual tty_features enhanced_features (void)
     
    virtual void autoflowRTS (bool s)
     
    virtual void autoflowDSR (bool s)
     
    virtual void autoflowXON (bool s)
     
    virtual void half_duplex (bool s)
     
    virtual void wide (bool s)
     
    void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
     
    - Public Member Functions inherited from USBDeviceConfig
    virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)
     
    virtual void ResetHubPort (uint8_t port)
     
    virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid)
     
    virtual boolean DEVCLASSOK (uint8_t klass)
     
    virtual bool VIDPIDOK (uint16_t vid, uint16_t pid)
     
    virtual bool DEVCLASSOK (uint8_t klass)
     
    virtual bool DEVSUBCLASSOK (uint8_t subklass)
     
    @@ -179,10 +198,12 @@ Protected Attributes - - - - + + + + + +

    Protected Member Functions

     
    uint32_t qNextPollTime
     
    bool bPollEnable
     
    bool ready
     
    volatile bool bPollEnable
     
    volatile bool ready
     
    tty_features _enhanced_status
     
    EpInfo epInfo [ACM_MAX_ENDPOINTS]
     
    @@ -197,7 +218,7 @@ Static Protected Attributes

    Detailed Description

    -

    Definition at line 138 of file cdcacm.h.

    +

    Definition at line 163 of file cdcacm.h.

    Constructor & Destructor Documentation

    @@ -250,7 +271,7 @@ Static Protected Attributes
    -

    Definition at line 336 of file cdcacm.cpp.

    +

    Definition at line 316 of file cdcacm.cpp.

    @@ -284,7 +305,7 @@ Static Protected Attributes
    -

    Definition at line 308 of file cdcacm.cpp.

    +

    Definition at line 288 of file cdcacm.cpp.

    @@ -318,7 +339,7 @@ Static Protected Attributes
    -

    Definition at line 312 of file cdcacm.cpp.

    +

    Definition at line 292 of file cdcacm.cpp.

    @@ -336,7 +357,7 @@ Static Protected Attributes
    -

    Definition at line 316 of file cdcacm.cpp.

    +

    Definition at line 296 of file cdcacm.cpp.

    @@ -354,7 +375,7 @@ Static Protected Attributes
    -

    Definition at line 320 of file cdcacm.cpp.

    +

    Definition at line 300 of file cdcacm.cpp.

    @@ -372,7 +393,7 @@ Static Protected Attributes
    -

    Definition at line 324 of file cdcacm.cpp.

    +

    Definition at line 304 of file cdcacm.cpp.

    @@ -390,7 +411,7 @@ Static Protected Attributes
    -

    Definition at line 328 of file cdcacm.cpp.

    +

    Definition at line 308 of file cdcacm.cpp.

    @@ -408,7 +429,7 @@ Static Protected Attributes
    -

    Definition at line 332 of file cdcacm.cpp.

    +

    Definition at line 312 of file cdcacm.cpp.

    @@ -462,7 +483,7 @@ Static Protected Attributes
    -

    Definition at line 300 of file cdcacm.cpp.

    +

    Definition at line 280 of file cdcacm.cpp.

    @@ -490,7 +511,7 @@ Static Protected Attributes
    -

    Definition at line 304 of file cdcacm.cpp.

    +

    Definition at line 284 of file cdcacm.cpp.

    @@ -536,7 +557,7 @@ Static Protected Attributes

    Reimplemented in PL2303.

    -

    Definition at line 47 of file cdcacm.cpp.

    +

    Definition at line 45 of file cdcacm.cpp.

    @@ -563,7 +584,7 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 251 of file cdcacm.cpp.

    +

    Definition at line 257 of file cdcacm.cpp.

    @@ -590,7 +611,33 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 264 of file cdcacm.cpp.

    +

    Definition at line 271 of file cdcacm.cpp.

    + + + + +
    +
    + + + + + +
    + + + + + + + + +
    bool ACM::available (void )
    +
    +inline
    +
    + +

    Definition at line 206 of file cdcacm.h.

    @@ -617,7 +664,7 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 180 of file cdcacm.h.

    +

    Definition at line 210 of file cdcacm.h.

    @@ -642,7 +689,199 @@ Static Protected Attributes
    -

    Definition at line 184 of file cdcacm.h.

    +

    Definition at line 214 of file cdcacm.h.

    + +
    + + +
    +
    + + + + + +
    + + + + + + + + +
    virtual tty_features ACM::enhanced_status (void )
    +
    +inlinevirtual
    +
    + +

    Definition at line 218 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    virtual tty_features ACM::enhanced_features (void )
    +
    +inlinevirtual
    +
    + +

    Reimplemented in XR21B1411.

    + +

    Definition at line 222 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    virtual void ACM::autoflowRTS (bool s)
    +
    +inlinevirtual
    +
    + +

    Reimplemented in XR21B1411.

    + +

    Definition at line 233 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    virtual void ACM::autoflowDSR (bool s)
    +
    +inlinevirtual
    +
    + +

    Reimplemented in XR21B1411.

    + +

    Definition at line 236 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    virtual void ACM::autoflowXON (bool s)
    +
    +inlinevirtual
    +
    + +

    Reimplemented in XR21B1411.

    + +

    Definition at line 239 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    virtual void ACM::half_duplex (bool s)
    +
    +inlinevirtual
    +
    + +

    Reimplemented in XR21B1411.

    + +

    Definition at line 242 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    virtual void ACM::wide (bool s)
    +
    +inlinevirtual
    +
    + +

    Definition at line 245 of file cdcacm.h.

    @@ -696,9 +935,9 @@ Static Protected Attributes
    -

    Implements UsbConfigXtracter.

    +

    Reimplemented from UsbConfigXtracter.

    -

    Definition at line 224 of file cdcacm.cpp.

    +

    Definition at line 230 of file cdcacm.cpp.

    @@ -721,7 +960,7 @@ Static Protected Attributes
    -

    Definition at line 140 of file cdcacm.h.

    +

    Definition at line 165 of file cdcacm.h.

    @@ -743,7 +982,7 @@ Static Protected Attributes
    -

    Definition at line 141 of file cdcacm.h.

    +

    Definition at line 166 of file cdcacm.h.

    @@ -765,7 +1004,7 @@ Static Protected Attributes
    -

    Definition at line 142 of file cdcacm.h.

    +

    Definition at line 167 of file cdcacm.h.

    @@ -787,7 +1026,7 @@ Static Protected Attributes
    -

    Definition at line 144 of file cdcacm.h.

    +

    Definition at line 169 of file cdcacm.h.

    @@ -809,7 +1048,7 @@ Static Protected Attributes
    -

    Definition at line 145 of file cdcacm.h.

    +

    Definition at line 170 of file cdcacm.h.

    @@ -831,7 +1070,7 @@ Static Protected Attributes
    -

    Definition at line 146 of file cdcacm.h.

    +

    Definition at line 171 of file cdcacm.h.

    @@ -853,7 +1092,7 @@ Static Protected Attributes
    -

    Definition at line 147 of file cdcacm.h.

    +

    Definition at line 172 of file cdcacm.h.

    @@ -875,7 +1114,7 @@ Static Protected Attributes
    -

    Definition at line 148 of file cdcacm.h.

    +

    Definition at line 173 of file cdcacm.h.

    @@ -897,7 +1136,7 @@ Static Protected Attributes
    -

    Definition at line 149 of file cdcacm.h.

    +

    Definition at line 174 of file cdcacm.h.

    @@ -919,7 +1158,7 @@ Static Protected Attributes
    -

    Definition at line 150 of file cdcacm.h.

    +

    Definition at line 175 of file cdcacm.h.

    @@ -941,11 +1180,11 @@ Static Protected Attributes
    -

    Definition at line 151 of file cdcacm.h.

    +

    Definition at line 176 of file cdcacm.h.

    - +
    @@ -953,7 +1192,7 @@ Static Protected Attributes @@ -963,11 +1202,11 @@ Static Protected Attributes
    - +
    bool ACM::bPollEnablevolatile bool ACM::bPollEnable
    -

    Definition at line 152 of file cdcacm.h.

    +

    Definition at line 177 of file cdcacm.h.

    - +
    @@ -975,7 +1214,7 @@ Static Protected Attributes @@ -985,7 +1224,29 @@ Static Protected Attributes
    - +
    bool ACM::readyvolatile bool ACM::ready
    -

    Definition at line 153 of file cdcacm.h.

    +

    Definition at line 178 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    tty_features ACM::_enhanced_status
    +
    +protected
    +
    + +

    Definition at line 179 of file cdcacm.h.

    @@ -1007,7 +1268,7 @@ Static Protected Attributes
    -

    Definition at line 155 of file cdcacm.h.

    +

    Definition at line 181 of file cdcacm.h.

    @@ -1020,7 +1281,7 @@ Static Protected Attributes diff --git a/class_a_c_m__coll__graph.map b/class_a_c_m__coll__graph.map index f5ef757e..cfeb8127 100644 --- a/class_a_c_m__coll__graph.map +++ b/class_a_c_m__coll__graph.map @@ -5,4 +5,5 @@ + diff --git a/class_a_c_m__coll__graph.md5 b/class_a_c_m__coll__graph.md5 index cbec54cc..f43712cc 100644 --- a/class_a_c_m__coll__graph.md5 +++ b/class_a_c_m__coll__graph.md5 @@ -1 +1 @@ -1882407469fb975afc811a5305d11f3f \ No newline at end of file +587ce662854a9a2b4677918117ea2d18 \ No newline at end of file diff --git a/class_a_c_m__coll__graph.png b/class_a_c_m__coll__graph.png index 65513261c8813821b284657fe1fe40cc148bcecd..8544d30d0904ff2ef6b37be1bfbd0e647916f398 100644 GIT binary patch literal 24008 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 naqw^swF3gY|E@bN0unPGfKOTXP literal 20499 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 - + + diff --git a/class_a_c_m__inherit__graph.md5 b/class_a_c_m__inherit__graph.md5 index 6e76693b..69d55cdc 100644 --- a/class_a_c_m__inherit__graph.md5 +++ b/class_a_c_m__inherit__graph.md5 @@ -1 +1 @@ -0dd94ad9ae7f9063d8b27eae0ee50e3a \ No newline at end of file +1778af41b23c3b83c73bd88577cd17cc \ No newline at end of file diff --git a/class_a_c_m__inherit__graph.png b/class_a_c_m__inherit__graph.png index 02aad4149ed355dfe62544331b1aed2d6bf2d81b..ff988c4b12b84472c1019e354a3ea482eeb3588e 100644 GIT binary patch literal 12723 zcmX|Ibx>PvW+}&x56e&(|*W&K(Qe5}3JG1#C zlVn~p_jlj5bM8sF>IYeL6k-%OI5>29IVp8GICxs%bv+abc-Cx{i-d#Y_$n_YuIT}P zYzRrklb&Sdh4EOrtu-d9D`gn%0 z+~&6`EVn8N4j4{*uQB~oYqP9Y^!b*?@XuH7(Tmxr;{dUIsc`d5i^0T!+DJole8t8y2Hzf&}ih~1BtAHHd znp_UpOAcjFyYQD1#)Frpq{3FsPmJBOod-_2762UX|GyC6k5vSZfb_RmIYVfHy^I6Sj4g8P|g-g zyFOVygdeE37=lJPJGDLEGbJ%7BwA7pR|=(@MLC`8!u@ZI`*s)4d*d2QbQZnpp!m1))P8-@WCiXkp0Y@jt9~!`GXD+ zGFGd_#oYw_Nb`-;v=gkh0V9@rxIW$=pwB7%yxFUk^iB&DSStFI#ATyCn9j{qYcna+ zN>+1$OaGy;0|uFVKPE(D^(beZTazon9SzS*ZpKb9@L7)NT* zjjJLgejBEk$UyZB=k+&NJem)1pAfhGLZX=W#m)%RbByRSA36!oFg9eN3bw+E97bc}tp z9+wW$RGgxL&~hzAP6|Do{WbJ9h1F0Xh7MuK@8v1Qd8>aNif|Lr3UB)L>1vkjnM}Zy zGU~n41Epp$0wjtfj#iOia%h`y80(Ln_Ios(gFxd=SQx6olRUEMcnr=#a_Vtr0^0eQAa45;($H07zb9J%e91KemjB+8A$Epyb%kOQ`aP1ow?wn( zj}?DJ#bXdF)%lgoj-~4)r|aB+OEf&U_PBNy&~mflrM}|#{EuQVTex|O!qo5it^{j> zt?f~LQ1+>+4DS4CBa*FQW`;Y^W4 zFba0`fM%(-G96mYxXbQn(!gd_A9+C_BI@9+*c&M%&x@N4lFP>`c=G7|$jLR~cqj}x4NfDfGVh*z4*>4dp!Y(d` z*hpCZ`;FySd?|A<^#dKL*JRMKQmK0_+D(44(o}NuM@cqk>X*c}nR0y+p>{Nf-!$Z7 zCP=oVf-57Ctue7TEsyVSC6k;zOx_3~yb&TH7K%lqlS3N%7G*vVPqbtjpD5V7M%1|$ zGjGxe+X}d(|B%U^I?3Mpbgds=|FH)J1_|!~cbSx1!64Zkq%j@cBkkj)TLYvq9DdK< zu<*E!A;y|dMt*57i2~=<5}j#q#6Q%F;vYx8vgdK9iV+LC9kHh}khGx1HZYfRrt>|OJF8TS(68XhpT7bA*7h|y$j$` z&fpmlyX}vou|Q*oP_I`Vv(aU8UZ;AQ=U$oZbS0UTD*!7QT6qFI^}dJlZ*oA*xB{~X~Pze zsx9PeLeGH7b{s6wXCcYhfo{nSSQor3tf;W2YZ&EZuXff5_mr6XlN@p7j&6j+hag%! zUE`nt{XiwOA&$!a)a`ud)DiaPK*_)^rO^3rkOUecK2o|ZYQdkXc_5&8^keTF!)L(7 zhH}}?MEL`??wHiBwf?qaD^#R=9G^4+-ZIwWqf3WtteJ!qoCEv?PXBHDQ*K+n{th*H zFY<*Xf2`F<7x;@YAb;es->m9BQ;`n2Hvm1s(3j?6*VZqfxr+};7U4ul08)WshO-$< z&j#v44?TzBgBCC#7?DI^qTMjm6LLj8cf#o#^WL5b%u-0%hmVIKiNyAbk3{Pyl^>+v zkS1%rVIF?!#~{{K#zN}%r)+soCgPgyxrJ%+48(o4%*#%O<1mAfA0~weGptDShq~+K zo*I?+t=Q*QB)_?y_sEDy3{X6QuRu8h*Wn_J%$xoQ-!7^_paSJdJnu2QcYMr$((N-V z$CLQpQGz4E_EQISO&s6 zC?1tB`*^Y5YYHOh428iALQ*6yqWs_*#9>Ha4F7rA(6$EzJ_^yw@7mUqp)YbYRC%%rQ=^--K`P1`W?7~0MDY|66)8Rc)t zY?PtgqbG^}%Ah2Pcwq;30356a;WN+Sfk_h(PTP!#lsiK3A+cjO|$iP!D7$EAL5kD$f~i3f;=`Utt_TAz{pv`T=&-r&sJISFpqk6R)lQ5tbIDl%j3yBFmn6`Ex&ALfOGc10 zFvV(Co6AFZ!{CFO{MW=)W8lAS6T3#XUw4V)gRbs2V??*ehIpKk8D@<`-6Xf+hU9*e zY@5lOy+%bR55E)wC7rHBrJXuE`(ktq`X*8)hz>Fr*|~$_T!N!3Z>A?y1!L zsaI1R71tSziaYcn2tk(A?jH@B;yXV>*Qelfcn(mq-r7{97plW&)6hmA~{pHd+?xXTtCpzIO0ChcK`v&H_@Si$DrW zwQSJCB-gZbg*CFn>S5c$oE?myyUm0a4>xWPEJdOgbJs20Wf(r<@^=^4%}Do9a}BT$ zqL5y%+1ZEhT!euRE5Tgs+Uz2p)SMoiPGa!uyedeXzNcP?9@5F_L_Z_J#YF9}`T)Q#+C1vv&=bMO5(hwKltLs z{(f_U-Up!ea`i575e%BWhtcc)U~+=7Q|LDAM&5jHrH3|o)@w}kY#EyeItc;KXLKfuuJ zwo&lL8{u4-KLwjjYM@cfC)y9p-q4PIR;^suqu0Q;B&kFP$AnvSE6e4eh$iLNV~@Vc zbJHKDE@rL}SAot=X@u<`1wO!?8wpZEBtea3OZx;l|Br};`9JXQwid~)Cd?Dz==%jI zytXdway1O+@`@__zDFnWpkHkF3MH@7v6_M+9^=^KE0Ypop_L|DP8m{?uHk zsFY5JGln8kz0x_zOpW9N4x-JC?&v>P;<%C}OjPne?maF*)%c>YEJMiihpBJB_L zrXa3FMO9>$dS~3qJXK|;#RI1;V>J$El7*$0$@e*6jMd?z*FXK+$0cE-{I1`lu=F)0 zy^|%PIbBm@5n77c#`K`?&16HG`FOcTB%E82I{KOrtI-Em{%UbJ{-i8{FU~xR>TxVM zn&uWVDjMai;g>x)P`kM^L8gL=U4(T=FcS!JG~#omMN-#y_17S*p6_5+5Tuak-S=)V zRp-}=rI{VVEuQBVZ{AyZ9J(62_%9(I~h6iL4BXykMH4V3;r;a@2K7s%f=m$lw|80*)mMKXkqtK2n2f^J z;U2gw1`EB#&6VjCR^B6uDB&>Bj|#|-?BQ7r=Y0k~s~txIgBL&q4nbSgj59xP8;0a9%$cpZZ?==gIL4v)Pg=4Z z4C(~}RJl?E$Wda#AL0CNO@-%eB(u9h{tOZlCay7ky*OiO$g;57-A-vU-#q07X%+6^ zQi7A&UXtk14LFPw*&xuO?{gW=4PV zwsY{&o1h|IF`8b*XiJf=FZ{m!Xr9b-=ITWTEhXxTRvRiN`on6>)B8rxv(^2~0^%N| zM8Q12^Dj8L@rqBrOf_1h3a4m~BO>9=?x^9WZFcWJ!_#_m)FzXTP(qbn`G9nrL}(Q8 z6)rk?OVo-_J>AQ67-t1iFAEU68w9HiE)elg^Ul;1CqgPUmbJTjd^(Be-0Timd#irf zs{{3MNpvLVK8|C(%2es4W3QAE(a(l(kHZ;ZqZQ?KeZ!clqJVmj#@(;SZcB+j8$s}U z#9vOISpd2t)LlA5W4Wma?+q#t6$79we^_>w;8>wnsV~jZgjT8cFsK&g+{$z|f9-HL8HE zwjj0<#E`~*i4xPLfyW`TycB~wFi$e0f4-5`(DFR%hF6bbhhM*bARr<_-dcJuT`Tk-(Mv+QRguSjGy`al-vrfG(`muf%jqEdiU?QC|%74{` zr3W9X5#AE@y9>m*xfc@ee__No_0E1w zYSm7sQ$IA~E2sPi+iPv>ZI&9eoy{VGOYItecH|n(R@8j=eJbe=(bAN;W!AaFDv!q^UZTw^Edn0 z`o)b5z9OG6%3}P%@A>mE46ETYc(~jBb+Mgmv0Sj%+yfAZ=I0pBzgFgJbnYZcRCIes z(kA0Bwug?$Y0XzpSN@C{jHCVc=ia}66_|*~t99oZ*A)`&=DdKcTk)pu0HZ`L5i%9) za0kfMI|v6~9}6;CL8o)u&>`0^Kg*;BihUs8wr0xP^8a|LM64*!SKrw!#LwwGbOs+v z6pm#!QcK;R_f5OG9jPfdkh26!icCQf}&Qj36 z!~Hv<9cVtA?XBxbtAJTmxs0n+BSBQ@`!wNAc5B|aHR1LxOgb2oOhEbS;2X6;c(jY% zS9>ky_TQ@NTG_u(nt^lIggo(lzB z_6z!D=IKkUTC-neU_f!RhO1U|dU?KLlnj~r_`Eeylu_36m~Z%#eDiDPiDoFq@q~OBgP^1utF5a8o{c6g9bZnC$h^15NykNrg>La<6h&d*1tsek z6%qr>4o%Gj44X8)(f=~@_&96eL94n^k$4@J{v+nH{(-fcEqukTg^r)` zz-_IXK2fYJZol{eH$#c9KeDv=_(Q17@}aDCiXJdzRfcWa>hZf1en?MKthdjg=iL?C*&$$!1v<0n9i z!Ch3Uv2xEX)0_OS^#EwFJEhh1<8d@r((-sZ*`=uH;6#RC8Btuc9T@v^BQ7h%lfsKR z!9qV;vhS~YsHtG)@#G?mWl`(1I>+>0G_G!W3gd7lv%#EnvLjzIyuCG(z!HJMuN6P! z>bKT5Oyboa*?R1=5*d0}T9XIKLe>eG_uf)`Es!yu7|rTq(Q5N~_<$@v7{87E-|z2C z+rw!q>Q|G4-I%Y54zU_a40QPjR8RWUYmckx&)|Z4ZKn*LC-HA2G3$|3EtoL`}TX|PGIw?`zA4=1E zb?T09#SC+)zL_!dskm(qvK-7+eQKHh*d3PSjb_Pzb)Y5q9TTgMBv)KL7N>}EzkiNv zbJ^Xtzrvu+7j>J`@pPruEWz-%jp@=043pqO-Tpl~*+Ni?!*+pk0k#ALSRv$1&Z^bn z?G8+osK_rjkI|)y5OEfA&??~F!dh-lmaQtR3CeZPnUvEnk^WpxB&f|OB1mGwYh|Nt zi2O2c69EYGw=yhBartnzzM_(ZY^=FqVS*eAhl*R3l~dkUhBQ1f_0jnJD);f-*jAlE z$Ws-Df_=>*V0zFXBcfHCLh1AKgX1e#12mD5813r|8fB&Utr&UpR!$qzJmG^t3cyD3 zmA*!o-5pq&mfh+g(R<6eR`dn9Rjj{HI;&0-y1xEUX z+mP(nyi*ag<#^qOkbvIpU89%8M&M&(ccd76cnck{oxRp947%6^b_Uk76^5=m!$bh_ zDmY!HmjIByOng*Nb5&-H099&7-%<{7`?oum;tH^kCd&-9;5B&FFfWD@ybXkQ{eR+i zJHu%-LEEEbI)+7OXHEx`C73=}(>jTwe!e{1>M>)bw0X}@5C85O9p4IKl>-~1{)hFh z3Tk49p zK%^E&ExmWQn^OYNGyn7&6a#yo9&V&diAiIdQBhF~ta5s!Q};>5ixiUbfz8c$00N}@ zbTEnOx78Rqs7j**Dis2h%l=qoH9zL%SF)m{n=giAv4~dX*;fYQ*|l->0tch5NACs7LK4dEgxC5J=`LY3N9z#Ky zpbh^+fPLk%n`6iJZ)Q8jq5r@fcpOI~ivvxp8D^Bqo3WJrzkY&}WWqc^8FpRQ5|{*! zMa$el38vt(#qODN`=_e4(#|eF7rk1_X@X4ncNPdjDxjQ{ufQ6w046 zdrh$2>*|!`OR}~WHWU#IH0m%fBC9bILS(<^rmca0m46C{TdvxMelg?FDk#JVsYg4k zEGe$9>pTs1DS?}nUvqm}17$;GrOmG`)8b!AxcjNh-;JKWxu^l68A%1n(^mb?9J|!i zV4!0PrdHDC_kR1Q(dexAGzfVIRc&?UP2141Oz)onLbclU=B?7U@7?yBKTp?a0zUVg zIr@>gMt?s2(^_P^H%wcom7O?Q?&J5N<_T3#l!>xd(5n{OaQ97TZ@^YfQ+K*?jQY?0 zbj9cXsK&xO#6A&5Nd+V3j_6~cxat3LkXTqK-!-?Gi%#NOvYY*o*!tr8%ZtlL2Mh)( zjQ|!H2>9nbLZjQvW9MIS?;X}+*POTH#*kL4hickhe(JD&p!9HBU%%O3s1>vmaVP$A zbjzJn-@NTum(D8p8r_9thqg7;)M&)q2lP83A(K^RyB3X>#fa`2^$zm?rcYNvh}D$_ z2YIHvnHezsx+9%Bi95!{bCE6gm2~#o*Bj#PbKnvgO)lJ5^4OM}C+Uav5zN{lP)nI6usB}Ydx!yRvi~SDmm|a zZNu~V!QbU`D7A9>mUoK2h`VFk3RMbciqj}js>N7Z%{S#;jAHx6XaUHf3zQld54r`& zs)5_nHxWv~TG;H~CEdG;9teQvn(~tkJOYALD)nL|BZUl}qWb)9HX)(F(d<8+bRKPm zY;6W)HbUr7UohzXMj%B=t_@W;KQL7kb%*0h&(mT3N-;tioS6ACcEIg?`or%er}Y!>ieRgrVoT%Z#MAg4 zoji`r4-NWFRF=iRUZ>NS&1lNje&CiExrcg1eJn%}CEp*f+2Z*c!3*rztulLbviwjC z1I=I*#5B3LetSgzC4)(k9@~kkIeipk9nDUEK!aI`xr6D_pjVU(FIKM*7mR9^U}3P* zl4g+XqWfw3C%%^!+>KkYQd%NDJ*wcA=Guhnj9H9D{^h>LIU*t^TeYi7>1p0;;{V;Z zO-YvUo%}JWG?>VU{&c(9?3}m-A1B9r06$$y=n_uxJ>|bz^2|I0_heQ>g`F9J%1%qg z`7aL_Ly#0Bq@T+cqVU5)c6CRdkO1r?7s+&RC6z)FOMbP5z&aJ zVplv0@=-ymCfz4Gy-`059}(`H52k2=0uPf-F8@!tSTgi^{V;QdkadtI@M{nls1*|V z85BGh8$BeN_F@PB)Sj>2};dAJ(lkCxAYt%E=#ed0;9ErSDQO&OVbWEPCmEJzJfk1f;S2sET zZSL@L87@lMeJwgEJ1=xeB1vqIB+1jSQYKwH%Qz zcJmT*CV|Y%)YO5=tj96~@r~J&H5LWGC)B8OGu0E%=6KIWvz$JyKHG}yr6=%z`>)O( zs&o-ev8upV6eDW%ana4X$46EyJpNR7{+%T-3-0Imv5q%VU*iXZi3~sca{LNFI zD;q!>H+4pt=%bVZj)>)UP;KF5(;LN-Pq}~07fP0~lq+uYX{LHgcnEY5hzc}3L~*}tL3ibfr3%d-?8Yin)X@L%d~ksg zjHS9J5V2;wOz${fC6~hv=I^XfxBu=Gzb8owAUd{C;ne@eQvLFX!3%1&W-GIFShy4{ z6)r>XBnWXxNMx9AIhBnuV!1BQi^1Dllr6(RN1GPsa6MbI0A?WMQXQScT^hhrZ}4Em zxZBaK;?aLM$NDJ>iTxHm?|MD6ocs)XB7(b7K*_ELM=?NC&A47qVyeHD7$9O+{2I7W zS8hJ34K7|Nkl`k5-Z=fkOV3X9i4{2ls2$+o)t64M%iCnkAH-ZAr8HjNBgZE;(4l~y zErzbghtu?7g<5%wXtWAEM-M+Vc*h5m+6H`VfDymi6cuD_!MtvwR^#^~?RtBb)=rqq z-%A4eiG$^+3MtNA^?e9Em?9E4Y}PI~SuTapO;QdZW}3aisO=$Mo4X5g?;OJkN*g_E zZb^Pxk}KX5^Dd6~lAO_@-mB92?>pxj(-2En{fV|0BU)W~RVx)Bk>|g!e!axg5W|>>*Uv%X4O0y=@k3jhwvz`2z=o^M6C3H=Of=x(?`(>}BSwi@wEB z+w04Wr1$hJ(Ag#A@O|#6JBCh2lqwA%3Ht#!^QW2_-}Z>?5 z%!;o(7tS)4CoK|&fl^{0d%WOl}Z-93f-i>pP9edX0HX*@3iF~dX}&kHxeWFCkd)t&Y~a*k#uL%P-07a z+ga9u-Nke%Tzy!91l&)&*a1_R$x2K8mtD?xmCRVhnem7M9e+@6PG$QW>i_^9ktBWN z#`k_vXd-sZHZ)cXZI26mOHpzh0Imht4MC^RN{MD9?<2Cg&iB#CAwVOeknVv~= z#)_<%qGu|S&4%kkCnc8pP(83^yC@3rqeYt#NhT&Iml1R`FYvyrP`y6-Ye^ zVEgM%w^AAGia-S6n zWMhiW`l9vrNzT73#=pJU|4}m9%P)Qp;0HY-msZ)kfD7F=U*SWDo+DGMYTl4$*<6np z_ax_?L92HfAWf42ez969>#$!`V)7)6heQyv zorLW^`m>w^I-Vipl@?Foptw2oM_^0(-EO`*5l}Gg7GAWtpBl|;v#I5S^Smd;<%_m;!2=%u=PPfTR|#YvYHkeb!m%~L-E`lpQ=yPQU@_kbcT(C2ue z_U@!vmejNz@e}eK0Em9#0UX67wx!6?YFiEf(^VRsg&UCRfY$IgXOvZ=Sm|=fW$aZx zmicG<4iLFjXXqCz5yh~3P!x?wH;xf7}dFeqZ)r|l`gcZWG&()?1mNy(fyEk z%PJD$`EO@HHV|`rG)vH1y^T%ydd|$-s~2|Yoojivo8$LY8hlQ|Wi5vPPBRx!j-@K3 zu#W7={>QhmfzS^Kg%*=fs402@QQrZy%inh+oc^sa5_i}NfY;wX0!!Z@%=I*@>^!&Q z1+`>mJ#)dixVaEa>mdLSN!JgQJ%{7cgV}y#CbaiN63%B&`MsjmXc2f*|7X3P2>c!j z8-TUz)=42uG@Jp7wEFYooy{oeY{rKQ!>;m9w!eTq)&zZo98z-6?S$Q|fB;kCR-Cdo zhT=5LN+kCM*j*v~o8GLqU##<tS|_iPTt*;P}yL_vTAS8f>Jpg>`|4*Th+kgj^&O{;ugwtYP*6 zBD3JCPt)&^AAk_r_5n157o(q0WdMkX{;az7$FwU%CV@_QE3FY3)<^@x7vIhjeFGB} z+5~uji<2QyI)5ZwLF4>;e5>v->|Q`}M_lk*X$_rD1j)rezT)fE0g_8`v>O?pli1m& zd^_zbpxFz10f>t39C{F}QAd_ETMmux>|!(_eEg>t(>~#4&(=T!**Tz3pucXaIMBv??_h7ne)GWhaU`phGKQ z6A{uI)Pv1d4KcxpQr5{8ga3M1UVj_wi2f=I9Qxwa+ZBTDaxN=K%|xQ;?liskPt_fh z@H8)4>g{nK=ZHb}`H^(&XA{r0p>s55?#$)hZzTJG*St4nXh5I4F4lqf-p2EsR1&e_ zVmyH{5Q}xQ_lE18!P362*GGDBzuI2_?P>`isj9*c7_%S>r47v@gLVT<{~feH!JG2V z{-Z;exJT9^;$u}1Owi~4cOm?^e+woCcwycL5HwN~zRLPMG8BJONrv#rx(F2*?3je} ztL)oi@wa4Pa7yzjDaGpZH#fVVs!tXxTM+FrZ%UA2jrI?+sux1n9RZ5UF7X6+ms#>e zFI=6=Fk0N|)8IzIK$c*ACR^Zerw$~K%UlHrK-@r3pt(Rl;j7^4&F!n=Q(WfbV00#= zHVp~3;)<0VO(vLJ&O}aSbO40}2RK?mI^I81Y9Q$Bj|6ma1+Rxe?uGz4p)|%8DMj~F zmir2o5)vu_vlB+dMcOP+=a;;;kr4>iyBqmleY%z{dZPnuwm-o%*95Xp`7&ZDj%u5d zfTB4?kLdk-C^Q*9wa4enoG{Ga3*elp6GDL@lHJRUpm!9fp%_s2@QZ+*;ENGro4oB0?KY=MM2_`_l-+55sT^e8!v$kZ~_px-r?*F?{sYppk)UgboWhZ^HC5}%2V z6WdNj@RZop3Zon4^U;wb8o^#|A;5Z9Fb!}iyVX0;_S&Sdx00^?BLV{RK3Uh?Lc&J$U5G!A>5qW(a3+!w$T7w4uSp@5P&^JsWo zGB66E=>q~1S}Z#=1r-)V4MYf+h9W}x&n#Jv=K+GK$-pOZVkv-SzGu3Qc^oqwKxr|W zsVCywzb&RJ;C{mFH)>PK6oL-hBP})J%cnH%4+Es0yZJ2#VY!&_vXq5UE#h>rm}P}x z#dZsEd8|zQ!&(nlc1>_)=?*#42{Oo`KkqEB$8~pv%MeG0CrRvW$37y=ha%=fRc@$F zQ@2j1Z3i9SPe90l5E0}FSM`~mZhJ^A0V;f@x7!E3!y>mulT#+U+wB+n2%?GtjKn(ewr`>~kp@3gU?rlC!Zu`Gfj?uw$xDBbs*o@V{2%P+O=bW9 literal 10169 zcmdUV)n6N3)Gh=I?!{i*t+*6-2^O?a+_gxN;w}Y>ySueepg4s9#oe{V-QA_%a4x>9 zbN+yHliwsWJF}Os{X8oYsw$6(Mv4Xp2ZyPsAfo{X2Tu=NH-V9XPc4{2G#ngbprVYV zmM8qNA!?h7_M?Bxd?f}o8ntXf0i9;}5Y!5dge4T>TXFhGC#$&n{(>)_nb~qIomxsO zJj&wBS7uFchT(L>zthWy(_`h^+|9prr;Cr-pP&72bK7r8Z$6BFc+@-fp8qvBWJ27x zTdax;MI?Zapo$Mt9CTJN;w6g;q{#m%yN*#{#42SMsKu#hPG@I zCEdg8&I=<06E%1z=RdOo`=$gzApY@t2(l8mUl@SvNg3nSDliksAI!vjFIk8U$V8P1 zmI+NZ^1Igl0P}4zekXRng-3&FbbNdVZ z^BxkmxBN@sc%hb--pT9b`F3@hXIw;@&u%6^9FuJ7k5h+Af(?p-NcKak^E#;DSuLHj zi(?f586*Dm_c*N_1t6N(!yfI24*zyay33tWTH>Lu=Zj$utqKi#A-@M+(VGQxtwI@8 z>QcEFQoZm@D&~0ovFvx-r>7nNN{Ng-CB+Cjgr>b8)G^yxeVKKlF>gP{-J= z!u+giYWyd`^Obr@JNwS@PQ6it`@c?MMGPvL(C9bpd-KKtCES)n6Tnt~4`o>wyKMHU z|9g2xQd6#_9nbAKCgFecL)zB3A_bp(^X2(b6NB4shKXwU?_{}+i{1_tr5SlE3TaG>Yjk*&kU?Ia zj*_J!2~^V)XyqaFYPlkdQCQ3yH-DTMeS5ZtQj&JzeAYUHbkZMBe#KGvU8#fa30QTM zb5}k7eB|{!GhxN344Dk{zBy8Kc(N7kN22>;U)`R{ZG|z`A+X{}%dX!z!YW3}GVnto zfyQXu1wsEuk$jxSN}E^v)5KbUyt4 zzS?LCUi`cV|7tT%9IaML$p5gasT?qUqSy+G;>dgkZG5F(T@+DhP-rM3_o-+%t=N<3 zaI!{g7mV@Fr%`+SHq@K^NePp$glhdPAyAhpH4`fZX4Z?wV$fW3KX6L4PW{d>;Q89$ ze+MC6^}9}0DB{H4n*YnaHH&^D+p=>vCL)gq#-#*}jV~3k+GZz(s5kih`Q`Bx#KeN= zI9I8sp-!dRbHDoUg>n4cX`#k6nNf|x%l~pzU>fioc7G~e1qI?ycZnF@4hsIxcM>o6 z;{ijDC$L9H7TucsElU56=bJ2?eH2Pxs#EzFu1dIj*yWgTV%$5|9q?dAs3jyap5}bA zz%+1TavF=27d+Tk-`zja>|)-!ovIHWwm6upVkHmP+Zz}EXCM@p<=7etNo8X`M(~G{ z5U_vHD*nvF=06Glx*w^R=G8juxEXl5Cm`KuULVYsh<0O3x64y_g;Mz6nI<^?XxSk> zn6IX6o6<7Y4L{#6%Nv@w?D+T0;l4i=#`69L8!bk0jOl-LLZP-x^~|*mZSmA!2*}wk z0-o+%_G`{#3JmkfO%XvT-Lh_5HmpoUQ!ncgluuK#3(0^jFv*3qU>#WGLSTN+REAyq z&CwLbVL0EsGLLaM;wSifB-_QGC6h2eAFnZGr>%j6ZW9v>EB_F88szu&@3VJCv&cTL zc$IY(7CpHiEljQsBOt ztF)?E@=b4#Jsigj%4cO{{GaD1zfOmQo6WhK&AD`YO-wS-vCFn|g^@!_R9di8GagSn zjF;FqoaLG4pMsQl*-|7j`eMoLJO8!ct|aky;(fU*Yk;K-mK<|=DUkc@qzG$;T-RTG zq30e%!7mNE843>UvaqUYm4TsdWzEvd<%#*xJ)Nz0W12*Jgw#~-^6B={_~-7I-iT6j zI$P~ebT$pzkw#JuiKpIRFz9sT?=vt5g-vF4ocEC-Dk4HeuH=Y=?+&B|(`aVTiTlxfn<%3~o`cQ?E-Dc0s463#`N3W=d7a zybL=0{UQ-2|C3hVi{uOq-a{8xP@0G|6-34*X*aOLYA5l2ub|+(w?FaA#r$WX&79HsX)%E;-GX_13S(~@zh zgz&{kdrJA6Ay**}X#69xg7x^t5w{X~!0kP8Y;qyGYKh0bGwc^)Sog<2jVk_{4@7o; zlC9Fh;W7yOBIzMoVf>LE135&J8{yKAU0`_2h>*};P;k9#Xqa1EL1nelu@85**tiN-y_kL3A3DE95) zGph22AU-X(x_{?QMI&UH7|Rh3yE_Xq^TT}MjJC!@B4q-j5sF$45d<$phVSfi&h(s3 zO$U9E&{Cizv@DG=PNv-S{CX{^l|FjzZc{vww%)F=s-=^;K5>_C%uP;^1H5ljX{9vp z9{m|SFgXpc*7OUyl=co01y{O10u{NQYkJw|w0)-pM_>sAM!H7&EtzvCRFC^)sym)o zvxhp$S`J1(PyN$#O)9k3egiSq6&|C#20rV&ozqx9$^4cdE2SjDb^l`ym4( z^`p52cxYfWO5DbPb9c5m^n&#ei3eCB_8DkDV7ykSfXca z6=D4laX|+0qsE3VN!#_Y(Y=5gsw7UONhGJ@GbK9Xk0i#djQsux%5j%!ZD$zOoDT9h z(EXs5g2anZ@pmJ_Nl0h}nvq25DG)jDwdCVm(NP74_Q9EPlZSi2p#<275C?Z*z(qMs zOVV(4OAyEs$0sTZ0XZ6aKgx=6OrqxySix+&>+*2 zlcOXJFZnj%8(FOV7&Jq?fC3ORgyC32V0GqJ^S7*6FpM$4H}TEw4`cx|FBEK&Dz{)m zLG{TP5fpo45n;L{nsU~)K_Q9|YpIfEsM{r5aZqFM%^-O~S56QTQu69w5(OU<=J!iX z$-TLzoC%;3&I8ipv};Xd>_a+CrdF?=aR@e%2p;D|-`ejAj?^Q%j`YfNHyZ&PSLi`^ z!E(_LJ#pLgC`W$H+Cqs*%mAi`AoL~Pr6paRA#?5!VckJi=MZj6-MiB0#~BzS@PCb( z8-}AD$pp)LDs2YM#i25smo+Y%av8@LkeN;7I+b*49_t*DHX47_2`<+#G^}}3RFxTYei z7xo+sx+>zPR0~@lpNe0@2cwUS6t=Gk#G6OXubJw9yCz{Wf{fFs8!M2x$NVhWqQW_w zn7-Iiq|M0TqcoW#9{0_0YE8Jy6+Dziy+SY(nH+gn{(O5#pD zpkXB3ig>PZKFr91Yr0t0)pCS!CLS)T8B>y)A zTj=ecx9lv=JC$z7CJ$=&iTf%0AmR8m&GXL}8KX`gZ2iA;8+EqSU#4m?V}RrN;a*o(|R<9G<>pq87rp6^U={#nbrSi_mL`v4D<&L4o5>vy0ckgK@LqK+q+0Ubho?>SHcP?M8~s!S0#t`V3-JKjD)!)?_3V7VE5c*aLrEqLR)dVHK+t#Y(h% z3iEp0dRy4c|Jn9xlt5YH;o5%VQTLQK5I`3YC9aeU4S#*B92h$mzz;DZ!t{Oebl5ST z;E6I4#t9Bx!e?az83lj01qXY;vEY$hF<$6;bu^4 z@8GXzC>;gT9jUgK(`o@Zk)5R~0T+!e=z4|MVm1UVVeRM99AaA|U;8C~BquwR_w0|@f`HR|41Ga?Z{{eb1J;?77%zeJ z#jyFOkv{hWt)#eaH2;}N?KX`NZz=%eftM?OI~i!~RT4Q;Pd(ZdqJPj68`sX%E+x_FdLc7LvBn|+`{QI4Q9GlKD8iC-3OTKnFKEI3a#zEgfGZf!#@T4&Jqnhl+4*H6L84#!sSEElm_^_q{V}juR1O zd$B4oh!3}Uz1A1(=0$^Vd{^|{eT)h#!oLF69e^(4b29IPuusKyG!6f) z@m>{<&$>)W{m46*giozEBhLpgVXhx+EfI^VM7BqmC;phsyj=`pGq_1I2K~Ig{?k;);IqvDW7^E|hxv}d#uAuQY@$MVW z+tyZP)sd%{=YGrJ^^uIrHqKVYKS}#o1*+c}>FFb86;@#}OrKAV+9IwoGBOTlzvp&; z+FLm~S~yR`(HP6tv%NXWZLLm`{;r`o7(_VT{^%#AOgtuO=6%e!OhH>UTkp8+*eL!G zf2+zt75&k5dnk2|jt`~+c<~~l!-u3^|M5HLd^i-Y_Dj_)ty??D;iK8Rm!?(6lCd1| zf^XVRJEJdoYf18Mt^thmO^Jyi_GRit7oi2n%E+p@B1*J!A`FbBf`Y@b!=(H(hl{Qt zzK`BzN2V!D48F0$zS&j^^RRbq8vsbw%kxQX`gZj+e!YKxn%Sx8@T{=d=SJ+slSK4# zL@x4Ywvby~c!u$PDTlO40w#{7=8&aPc4$p*SU z=`r^6C(^&)FfDAslu1Otq0%kaZuZxkc2np{myHpxv&g1yBMO9{WUi( zEm3MJW)^Ld3$I_O-^by~2ux|jOVqc&fWT6cf0(SdvO0{SnFHB{^}=P1a*#Uh2dfMz zcbny~zulAtcwND*(tO(d`xIPhNa45h;t&?v?8>!023?=-hhILo=WZK_{IS2<^4tXX zTj>%$wO9(#Zk-YA zX8ObTIci73*E5=V>N!Fsws&X!V7#K%1xX1-W{(4nFJL^)RTz&&y8&D7+Qa?s_xph& zX0w2+ovgS!@&^*>S&}AMb&aUnZ~YY0EuSoR%>xy-4v-;aAt+H3+wal$u<$UnO-$lAPmtHV!x`smORZvG zzcO{NjRCTS!#u~wzs+i~s2m@7IbtYRwfW;*l@i8t+a;D;{UEG5NBMDL2Lokush?gI zWGexPi@DZ9e=wF4q01#Abz_w&a?i{HUHi~){oE5-=c{#NvsAm8PaL^1;Oc%J1iZm_ zhR3wq7iYS~mB^C%R7JpWcOlVylB;s2ww8SEW`Dmcwu(icyY$U+W9LDeOzr64NQS7z zUAQGlO}Iy4w{4e7W}DgseHTO@buhBQ!YMa7`KWhZy~5nQd4KxXaKuVsFG{`D=v(=1 zr|$4}DTVt>W9d4p>tZs;f#dQgTdOG)pb5C@TI6!-5~@YTZ^doAv03&;G}ZKDY~CJj zn(oHN-VC8epPs20uW|SGV6;%W#6fy(_u#zijU#hdxw5V&q_=x4Ojg>i)kmlPwj5gi zJ8yM&+HH?-ZJu(Y{sz~#Fr1QXRw*UTj-`6tY4s2%suNSTEKch{Nroxl_!pwrAMT4m zHW!44-=HX0M3H@^+OX%L@ll4Fqb9!ZCqX5nu)j!Tu79g)>-NU-XQB)4^!uxgXiRf& zc$ZdqQd$lTji`huWhE{n&jQ%U(Dk8!=9`O~{b^42L8O@I(Pv|SF9z&cor!$OD$hL~ zKAZnAam0aG?^QD_`=C+DIGiI)c74E?QFA@0?b*>y@yzt-&N;xK4%h{stl0P9k`EdSjWZ+@0|}wHQ)9JUX39-Sx16?02qvX~rfo zqM2zC^+c$sbVx;VIJ33p{gr0|tG+z!hOINL{k=aehs$+q&5Xvc^r@f>4uXu@qb)O zkK1YjROQR9_>-x*fa-Lf8oy1)c)U& zNI^qo<22EMju&tAM95P}31$ImWGm)AFUk`p0j=2yA4BaHGDc;d;yC)-Qnw)6ezRns zp!#9jl^FC*^OJ5^GrjNvOB1v}%5m_=&a^Ce?`%{yr9@8~aRVO6iJs+_>_s$dG(fI1 z(9+A)mZhQq%3oB(hdFK*&|4tv2LJcr9KY!G4}D8KN713;zYL_LREKh(v4p%Xe0~|3 zmPGqy&Gd?afa=rj-Uh%2dc#)MxVxi&M(sCmE(Tk-J@bmQ8{5$sz?`tFW$xZaBD>$} z(m+t#P4xFgpTd0LoUA`33%R$ZvA65@$Q9HRsLM*YL)61ompP1^9Gh_PAYA5sq$_hh z&Yy#LZ)1T9G>AL9Hl{q1c@4y6GF65+&~u(5){N#LO&SQJ0Z}He9pS?r(%>{*T2+8f zlt@1v8Hvj4TKZ2+>4Z69XNLK;6DnaaNR1<8^*DROP*!PR+?KBFx>H%?y8HIS_>~kc z__b&_L#G942s5Mw@MDXMquYLMSzYP`5C+w}HVNpBcd?<=e~uRIs|vCr<;=|FD5jn* zRt~CZaNYo3ZQAu_HGv8f@Z%M1M2z(}94kG-8s3y9`$SMmCQt?763J+S2ZY2y`_lm% znl2pUt@q&ys<562J;yV@%G)T3f!9ojk%Ei}vL4H}Mn6$OtYC@{*}k5s5DG;PjS)k~ zd_CGaPeK31bp|7K6e}ozL5jB9L&t7g11TBrkkoLSNdd$DKxW4r)|fcRXFBsrsRSDn z@n$1K5rN}PF#(v+FO>%Lr;!}P^j)N+eiMZP7v?n-QA1jSXsa|l_Tip7aDDOq^8J+} za3I*2))2GA^G-@xegDwxu*iMiJBtz}!35qz<}1iAHf2M^!{gRyba+3&sFXUa0;bzi zgyz@ePDw@FJ-*SM{IPCEj0xbUm&{!mrm)m8&f;0TD3YRX!B?Jh5 zEI{ZZ3GHcMaZn9VV9>~fV#)!++yhX#1xO#D4x1ir9w9P4ZzD}m2VVqs0jmlwe9D$V+P2s93XEi0rYtE2a4>A z4S=~00ysfsfE{y%r1Dal(!>*6iNx&SAhv!!RgDvWX_o$k-|iqG)#`a}cEz3V6#JTy zqKK0-;{pB4fB?%Y8Ro z?2hFW!TcVlR0Nh~tjBW+6~eK|Apm!)FX4#;)2p+3?Q*=IujebwdZT6l7L%0?T;+Mb zF;gUu4KU4|4UWr87s4J##LNDV$9NrLl<5m@AS|A27{XbB``VQ!z|V5xz1dps}i zmC);*jTV%K>q|QL8!6G~u!!;EDLv*3uytR70_zjD`s;IbkQ;+?I@Nea%~#;hr#PWcm#~pSPXu|lt*CRfRrAR%$b;!v@Mn#pd5&tWXL4R_q7`rs>nPhM7_GP z;<*_^!+iX=WqN-2^rfFNAi2N@m>lS>mI_0oAz|118JhmL+`K>bsuKbGi*c@q7dQYI z+8E7#mjuis4C<_sY*Eb3yY7qtsrl`|s_VF@HAxURHEt4V&O2AR-v=FcQb77Y*IwmT z=83RoRL#x@I#GP3chv0Tp8uY2+b2FWIsjcjU4#TDRTDso=Beh1sQ{ATC3ZR)wII$P!xiKji&^;@ch&GvEKLollS9slO=H)kF_dK^GhEt;N&h^ zi%cxoEo|Go#i=y1Q4=+$-Q^a8iPW_4CA@BG&kxu5Qt;FnCqOsH>wRVOp}~%D8JM$h zyE`-Gc9*AOp3ZO?%M*7JqoF{a0{B$h{#bIYY9rBvd|-6M;{H(9_q79{ymmj*w?{O8+0+=&-b1(Vn_foqV z#o-N=%R2U!TR-_{Xb3W{FkDgaN=?1d>u z?E9yaQehR>vg!Tw96ea~%HX!_VaxY8Ub>onZ=9iCCEEusdi(Mke;q>DAIubZCxpFT zB&kJ#8J5=D6`u-#Q4QsU%57pxH)itLPxVCN%R+vm<9xo@8Z<*mp_Rwl$PgeE@#HjZ zM%FI|2>OWEc?7Q(U|ed8V#q^5H;F+7046*Je+66VAoNgxu=2=fj!J?h=#)XeNfC;0 zO`kf%Q$JuZV0Y|-hoyNl4xIipR^1UXK_&bbO9xGQo7zBDhz|1>TVpwYOo|{OB}^fx zkSE;;i)0qXIcIPByWwSTXs(B@75F z3P1_@Pmev5S(eKG^?dWc537KHp9?G@ak{O+NffniNa#(*6^en;_BdG;vX7jQvd)NQ zmRd*EoJSzg2A|!_>7j^bXz;Vly;|;erUdY}Kn>b@5t_kc0&#@_^-Ed1?2R0*vpC?s jC)LvIK{Pm;;3rDZnIms>g*yxw$%9jrRh9W6WfJ^9Qk7%h diff --git a/class_a_d_k-members.html b/class_a_d_k-members.html index cbe1ba3c..c015f0cb 100644 --- a/class_a_d_k-members.html +++ b/class_a_d_k-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -95,29 +96,30 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); bConfNumADKprotected bNumEPADKprotected ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)ADKvirtual - DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual - EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)ADKvirtual - epDataInIndexADKprotectedstatic - epDataOutIndexADKprotectedstatic - epInfoADKprotected - GetAddress()ADKinlinevirtual - Init(uint8_t parent, uint8_t port, bool lowspeed)ADKvirtual - isReady()ADKinlinevirtual - Poll()ADKinlinevirtual - PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)ADKprotected - pUsbADKprotected - RcvData(uint16_t *nbytesptr, uint8_t *dataptr)ADK - readyADKprotected - Release()ADKvirtual - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - SndData(uint16_t nbytes, uint8_t *dataptr)ADK - VIDPIDOK(uint16_t vid, uint16_t pid)ADKinlinevirtual + DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)ADKvirtual + epDataInIndexADKprotectedstatic + epDataOutIndexADKprotectedstatic + epInfoADKprotected + GetAddress()ADKinlinevirtual + Init(uint8_t parent, uint8_t port, bool lowspeed)ADKvirtual + isReady()ADKinlinevirtual + Poll()ADKinlinevirtual + PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)ADKprotected + pUsbADKprotected + RcvData(uint16_t *nbytesptr, uint8_t *dataptr)ADK + readyADKprotected + Release()ADKvirtual + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + SndData(uint16_t nbytes, uint8_t *dataptr)ADK + VIDPIDOK(uint16_t vid, uint16_t pid)ADKinlinevirtual
    diff --git a/class_a_d_k.html b/class_a_d_k.html index 7b78f19d..fcb644e0 100644 --- a/class_a_d_k.html +++ b/class_a_d_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ADK Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -118,11 +119,11 @@ Public Member Functions   uint8_t SndData (uint16_t nbytes, uint8_t *dataptr)   -virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   virtual uint8_t Poll ()   @@ -130,15 +131,17 @@ Public Member Functions   virtual bool isReady ()   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  -virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) +  +void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)   - Public Member Functions inherited from USBDeviceConfig virtual void ResetHubPort (uint8_t port)   -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  @@ -506,7 +509,7 @@ Static Protected Attributes - +

    Protected Member Functions

    @@ -514,7 +517,7 @@ Static Protected Attributes
    - + @@ -538,7 +541,7 @@ Static Protected Attributes
    virtual boolean ADK::VIDPIDOK virtual bool ADK::VIDPIDOK ( uint16_t  vid,
    -

    Reimplemented from USBDeviceConfig.

    +

    Reimplemented from USBDeviceConfig.

    Definition at line 115 of file adk.h.

    @@ -594,7 +597,7 @@ Static Protected Attributes
    -

    Implements UsbConfigXtracter.

    +

    Reimplemented from UsbConfigXtracter.

    Definition at line 311 of file adk.cpp.

    @@ -786,7 +789,7 @@ Static Protected Attributes diff --git a/class_a_d_k__coll__graph.md5 b/class_a_d_k__coll__graph.md5 index 2341756e..6e64816d 100644 --- a/class_a_d_k__coll__graph.md5 +++ b/class_a_d_k__coll__graph.md5 @@ -1 +1 @@ -37dc8161587ef9d91ca02f00e06d8d3e \ No newline at end of file +677a6776b852e96bee247fd946d74be2 \ No newline at end of file diff --git a/class_a_d_k__inherit__graph.md5 b/class_a_d_k__inherit__graph.md5 index 007981fa..55e30802 100644 --- a/class_a_d_k__inherit__graph.md5 +++ b/class_a_d_k__inherit__graph.md5 @@ -1 +1 @@ -bf61a3a2026b57525489bd4fa1b38220 \ No newline at end of file +bca330dbfb30c1761bf024a703ee6a77 \ No newline at end of file diff --git a/class_address_pool-members.html b/class_address_pool-members.html index a44847eb..ee21dc30 100644 --- a/class_address_pool-members.html +++ b/class_address_pool-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_address_pool.html b/class_address_pool.html index 63de2747..489dc986 100644 --- a/class_address_pool.html +++ b/class_address_pool.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: AddressPool Class Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -215,7 +216,7 @@ Public Member Functions diff --git a/class_address_pool__inherit__graph.md5 b/class_address_pool__inherit__graph.md5 index 208556c0..67a01c56 100644 --- a/class_address_pool__inherit__graph.md5 +++ b/class_address_pool__inherit__graph.md5 @@ -1 +1 @@ -120a062cef01918a52a6cdb4ddb3eba1 \ No newline at end of file +1e8b44e83a78a2dc42bcafc432f2a436 \ No newline at end of file diff --git a/class_address_pool_impl-members.html b/class_address_pool_impl-members.html index dbd58f87..01c7ee16 100644 --- a/class_address_pool_impl-members.html +++ b/class_address_pool_impl-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -100,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_address_pool_impl.html b/class_address_pool_impl.html index 1e6a2438..12c6084c 100644 --- a/class_address_pool_impl.html +++ b/class_address_pool_impl.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: AddressPoolImpl< MAX_DEVICES_ALLOWED > Class Template Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,7 +114,7 @@ Public Member Functions   virtual UsbDeviceGetUsbDevicePtr (uint8_t addr)   -void ForEachUsbDevice (UsbDeviceHandleFunc pfunc) +void ForEachUsbDevice (UsbDeviceHandleFunc pfunc)   virtual uint8_t AllocAddress (uint8_t parent, bool is_hub=false, uint8_t port=0)   @@ -197,7 +198,7 @@ template<const uint8_t MAX_DEVICES_ALLOWED>
    void AddressPoolImpl< MAX_DEVICES_ALLOWED >::ForEachUsbDevice ( - UsbDeviceHandleFunc  + UsbDeviceHandleFunc  pfunc) @@ -297,7 +298,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 3317b219..77f1e07a 100644 --- a/class_address_pool_impl__coll__graph.md5 +++ b/class_address_pool_impl__coll__graph.md5 @@ -1 +1 @@ -4928b921ed421db937e32278788f372b \ No newline at end of file +77bc5e9fa2748d39429df403e8aba060 \ No newline at end of file diff --git a/class_address_pool_impl__inherit__graph.md5 b/class_address_pool_impl__inherit__graph.md5 index 3317b219..77f1e07a 100644 --- a/class_address_pool_impl__inherit__graph.md5 +++ b/class_address_pool_impl__inherit__graph.md5 @@ -1 +1 @@ -4928b921ed421db937e32278788f372b \ No newline at end of file +77bc5e9fa2748d39429df403e8aba060 \ No newline at end of file diff --git a/class_b_t_d-members.html b/class_b_t_d-members.html index 7f97288d..59e73a5b 100644 --- a/class_b_t_d-members.html +++ b/class_b_t_d-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -103,72 +104,73 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)BTDvirtual connectToHIDDeviceBTD connectToWiiBTD - DEVCLASSOK(uint8_t klass)BTDinlinevirtual - disc_bdaddrBTD - disconnect()BTDinline - EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)BTDvirtual - epInfoBTDprotected - GetAddress()BTDinlinevirtual - hci_accept_connection()BTD - hci_authentication_request()BTD - HCI_Command(uint8_t *data, uint16_t nbytes)BTD - hci_connect()BTD - hci_connect(uint8_t *bdaddr)BTD - hci_disconnect(uint16_t handle)BTD - hci_handleBTD - hci_inquiry()BTD - hci_inquiry_cancel()BTD - hci_link_key_request_negative_reply()BTD - hci_pin_code_negative_request_reply()BTD - hci_pin_code_request_reply()BTD - hci_read_bdaddr()BTD - hci_read_local_version_information()BTD - hci_remote_name()BTD - hci_reset()BTD - hci_set_local_name(const char *name)BTD - hci_versionBTD - hci_write_class_of_device()BTD - hci_write_scan_disable()BTD - hci_write_scan_enable()BTD - incomingHIDDeviceBTD - incomingWiiBTD - Init(uint8_t parent, uint8_t port, bool lowspeed)BTDvirtual - isReady()BTDinlinevirtual - L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)BTD - l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)BTD - l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)BTD - l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)BTD - l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)BTD - l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)BTD - l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)BTD - l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)BTD - l2capConnectionClaimedBTD - motionPlusInsideBTD - my_bdaddrBTD - pairWithHID()BTDinline - pairWithHIDDeviceBTD - pairWithWiiBTD - pairWithWiimote()BTDinline - Poll()BTDvirtual - PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)BTDprotected - pUsbBTDprotected - qNextPollTimeBTDprotected - readPollInterval()BTDinline - registerServiceClass(BluetoothService *pService)BTDinline - Release()BTDvirtual - remote_nameBTD - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - rfcommConnectionClaimedBTD - sdpConnectionClaimedBTD - VIDPIDOK(uint16_t vid, uint16_t pid)BTDinlinevirtual - watingForConnectionBTD - wiiUProControllerBTD + DEVCLASSOK(uint8_t klass)BTDinlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + disc_bdaddrBTD + disconnect()BTD + EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)BTDvirtual + epInfoBTDprotected + GetAddress()BTDinlinevirtual + hci_accept_connection()BTD + hci_authentication_request()BTD + HCI_Command(uint8_t *data, uint16_t nbytes)BTD + hci_connect()BTD + hci_connect(uint8_t *bdaddr)BTD + hci_disconnect(uint16_t handle)BTD + hci_handleBTD + hci_inquiry()BTD + hci_inquiry_cancel()BTD + hci_link_key_request_negative_reply()BTD + hci_pin_code_negative_request_reply()BTD + hci_pin_code_request_reply()BTD + hci_read_bdaddr()BTD + hci_read_local_version_information()BTD + hci_remote_name()BTD + hci_reset()BTD + hci_set_local_name(const char *name)BTD + hci_versionBTD + hci_write_class_of_device()BTD + hci_write_scan_disable()BTD + hci_write_scan_enable()BTD + incomingHIDDeviceBTD + incomingWiiBTD + Init(uint8_t parent, uint8_t port, bool lowspeed)BTDvirtual + isReady()BTDinlinevirtual + L2CAP_Command(uint16_t handle, uint8_t *data, uint8_t nbytes, uint8_t channelLow=0x01, uint8_t channelHigh=0x00)BTD + l2cap_config_request(uint16_t handle, uint8_t rxid, uint8_t *dcid)BTD + l2cap_config_response(uint16_t handle, uint8_t rxid, uint8_t *scid)BTD + l2cap_connection_request(uint16_t handle, uint8_t rxid, uint8_t *scid, uint16_t psm)BTD + l2cap_connection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid, uint8_t result)BTD + l2cap_disconnection_request(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)BTD + l2cap_disconnection_response(uint16_t handle, uint8_t rxid, uint8_t *dcid, uint8_t *scid)BTD + l2cap_information_response(uint16_t handle, uint8_t rxid, uint8_t infoTypeLow, uint8_t infoTypeHigh)BTD + l2capConnectionClaimedBTD + motionPlusInsideBTD + my_bdaddrBTD + pairWithHID()BTDinline + pairWithHIDDeviceBTD + pairWithWiiBTD + pairWithWiimote()BTDinline + Poll()BTDvirtual + PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)BTDprotected + pUsbBTDprotected + qNextPollTimeBTDprotected + readPollInterval()BTDinline + registerBluetoothService(BluetoothService *pService)BTDinline + Release()BTDvirtual + remote_nameBTD + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + rfcommConnectionClaimedBTD + sdpConnectionClaimedBTD + VIDPIDOK(uint16_t vid, uint16_t pid)BTDinlinevirtual + watingForConnectionBTD + wiiUProControllerBTD
    diff --git a/class_b_t_d.html b/class_b_t_d.html index 4c735f36..1f4b2dfd 100644 --- a/class_b_t_d.html +++ b/class_b_t_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BTD Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -117,8 +118,8 @@ Public Member Functions   void disconnect ()   -int8_t registerServiceClass (BluetoothService *pService) -  +int8_t registerBluetoothService (BluetoothService *pService) +  void pairWithWiimote ()   void pairWithHID () @@ -126,24 +127,24 @@ Public Member Functions uint8_t readPollInterval ()  
    USBDeviceConfig implementation
    -virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   virtual bool isReady ()   -virtual boolean DEVCLASSOK (uint8_t klass) -  -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) + 
    UsbConfigXtracter implementation
    -virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) +void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)  
    HCI Commands
    void HCI_Command (uint8_t *data, uint16_t nbytes) @@ -204,6 +205,8 @@ Public Member Functions - Public Member Functions inherited from USBDeviceConfig virtual void ResetHubPort (uint8_t port)   +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  @@ -280,7 +283,7 @@ 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 230 of file BTD.h.

    +

    Definition at line 198 of file BTD.h.

    Constructor & Destructor Documentation

    @@ -493,7 +496,7 @@ Static Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 270 of file BTD.h.

    +

    Definition at line 238 of file BTD.h.

    @@ -519,11 +522,11 @@ Static Protected Attributes

    Used to check if the dongle has been initialized.

    Returns
    True if it's ready.
    -

    Definition at line 278 of file BTD.h.

    +

    Definition at line 246 of file BTD.h.

    - +

    Public Attributes

    @@ -531,7 +534,7 @@ Static Protected Attributes

    Reimplemented in PS4BT.

    -

    Definition at line 115 of file BTHID.h.

    +

    Definition at line 120 of file BTHID.h.

    @@ -588,7 +602,7 @@ Protected Attributes

    Reimplemented in PS4BT.

    -

    Definition at line 119 of file BTHID.h.

    +

    Definition at line 124 of file BTHID.h.

    @@ -616,7 +630,7 @@ Protected Attributes

    Reimplemented in PS4BT.

    -

    Definition at line 123 of file BTHID.h.

    +

    Definition at line 128 of file BTHID.h.

    @@ -632,53 +646,7 @@ Protected Attributes

    True if a device is connected

    -

    Definition at line 92 of file BTHID.h.

    - -
    - - -
    -
    -
    - + @@ -552,13 +555,13 @@ Static Protected Attributes
    Returns
    Returns true if the device's USB class matches this driver.
    -

    Reimplemented from USBDeviceConfig.

    +

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 287 of file BTD.h.

    +

    Definition at line 255 of file BTD.h.

    - +
    virtual boolean BTD::DEVCLASSOK virtual bool BTD::DEVCLASSOK ( uint8_t  klass)
    @@ -566,7 +569,7 @@ Static Protected Attributes

    Used this to disconnect the devices.

    -

    Reimplemented from BluetoothService.

    +

    Implements BluetoothService.

    -

    Definition at line 52 of file BTHID.cpp.

    +

    Definition at line 49 of file BTHID.cpp.

    @@ -356,7 +284,7 @@ Protected Attributes
    Returns
    Returns the corresponding HIDReportParser. Returns NULL if id is not valid.
    -

    Definition at line 58 of file BTHID.h.

    +

    Definition at line 49 of file BTHID.h.

    @@ -400,7 +328,7 @@ Protected Attributes
    Returns
    Returns true if the HIDReportParser is set. False otherwise.
    -

    Definition at line 70 of file BTHID.h.

    +

    Definition at line 61 of file BTHID.h.

    @@ -432,7 +360,7 @@ Protected Attributes -

    Definition at line 81 of file BTHID.h.

    +

    Definition at line 72 of file BTHID.h.

    @@ -456,7 +384,7 @@ Protected Attributes -

    Definition at line 396 of file BTHID.cpp.

    +

    Definition at line 393 of file BTHID.cpp.

    @@ -483,11 +411,11 @@ Protected Attributes

    Call this to start the paring sequence with a device

    -

    Definition at line 95 of file BTHID.h.

    +

    Definition at line 86 of file BTHID.h.

    - +
    - + @@ -598,9 +601,9 @@ Static Protected Attributes
    Returns
    Returns true if the device's VID and PID matches this driver.
    -

    Reimplemented from USBDeviceConfig.

    +

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 298 of file BTD.h.

    +

    Definition at line 266 of file BTD.h.

    @@ -664,7 +667,7 @@ Static Protected Attributes -

    Implements UsbConfigXtracter.

    +

    Reimplemented from UsbConfigXtracter.

    Definition at line 314 of file BTD.cpp.

    @@ -673,9 +676,6 @@ Static Protected Attributes
    -
    virtual boolean BTD::VIDPIDOK virtual bool BTD::VIDPIDOK ( uint16_t  vid,
    - - - - -
    @@ -684,19 +684,14 @@ Static Protected Attributes
    void BTD::disconnect
    -
    -inline

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

    -

    Definition at line 322 of file BTD.h.

    +

    Definition at line 383 of file BTD.cpp.

    - +
    @@ -704,7 +699,7 @@ Static Protected Attributes

    Member Function Documentation

    - -
    -
    -
    - + @@ -725,7 +720,7 @@ Static Protected Attributes
    Returns
    The service ID on success or -1 on fail.
    -

    Definition at line 333 of file BTD.h.

    +

    Definition at line 297 of file BTD.h.

    @@ -760,7 +755,7 @@ Static Protected Attributes -

    Definition at line 919 of file BTD.cpp.

    +

    Definition at line 927 of file BTD.cpp.

    @@ -778,7 +773,7 @@ Static Protected Attributes

    Reset the Bluetooth dongle.

    -

    Definition at line 924 of file BTD.cpp.

    +

    Definition at line 932 of file BTD.cpp.

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

    Read the Bluetooth address of the dongle.

    -

    Definition at line 955 of file BTD.cpp.

    +

    Definition at line 963 of file BTD.cpp.

    @@ -814,7 +809,7 @@ Static Protected Attributes

    Read the HCI Version of the Bluetooth dongle.

    -

    Definition at line 964 of file BTD.cpp.

    +

    Definition at line 972 of file BTD.cpp.

    @@ -838,7 +833,7 @@ Static Protected Attributes -

    Definition at line 1008 of file BTD.cpp.

    +

    Definition at line 1016 of file BTD.cpp.

    @@ -856,7 +851,7 @@ Static Protected Attributes

    Enable visibility to other Bluetooth devices.

    -

    Definition at line 933 of file BTD.cpp.

    +

    Definition at line 941 of file BTD.cpp.

    @@ -874,7 +869,7 @@ Static Protected Attributes

    Disable visibility to other Bluetooth devices.

    -

    Definition at line 946 of file BTD.cpp.

    +

    Definition at line 954 of file BTD.cpp.

    @@ -892,7 +887,7 @@ Static Protected Attributes

    Read the remote devices name.

    -

    Definition at line 989 of file BTD.cpp.

    +

    Definition at line 997 of file BTD.cpp.

    @@ -910,7 +905,7 @@ Static Protected Attributes

    Accept the connection with the Bluetooth device.

    -

    Definition at line 973 of file BTD.cpp.

    +

    Definition at line 981 of file BTD.cpp.

    @@ -934,7 +929,7 @@ Static Protected Attributes -

    Definition at line 1142 of file BTD.cpp.

    +

    Definition at line 1150 of file BTD.cpp.

    @@ -952,7 +947,7 @@ 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 1068 of file BTD.cpp.

    +

    Definition at line 1076 of file BTD.cpp.

    @@ -970,7 +965,7 @@ Static Protected Attributes

    Respons when no pin was set.

    -

    Definition at line 1104 of file BTD.cpp.

    +

    Definition at line 1112 of file BTD.cpp.

    @@ -988,7 +983,7 @@ 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 1118 of file BTD.cpp.

    +

    Definition at line 1126 of file BTD.cpp.

    @@ -1006,7 +1001,7 @@ Static Protected Attributes

    Used to try to authenticate with the remote device.

    -

    Definition at line 1132 of file BTD.cpp.

    +

    Definition at line 1140 of file BTD.cpp.

    @@ -1024,7 +1019,7 @@ Static Protected Attributes

    Start a HCI inquiry.

    -

    Definition at line 1020 of file BTD.cpp.

    +

    Definition at line 1028 of file BTD.cpp.

    @@ -1042,7 +1037,7 @@ Static Protected Attributes

    Cancel a HCI inquiry.

    -

    Definition at line 1034 of file BTD.cpp.

    +

    Definition at line 1042 of file BTD.cpp.

    @@ -1060,7 +1055,7 @@ Static Protected Attributes

    Connect to last device communicated with.

    -

    Definition at line 1042 of file BTD.cpp.

    +

    Definition at line 1050 of file BTD.cpp.

    @@ -1084,7 +1079,7 @@ Static Protected Attributes -

    Definition at line 1046 of file BTD.cpp.

    +

    Definition at line 1054 of file BTD.cpp.

    @@ -1102,7 +1097,7 @@ Static Protected Attributes

    Used to a set the class of the device.

    -

    Definition at line 1154 of file BTD.cpp.

    +

    Definition at line 1162 of file BTD.cpp.

    @@ -1157,7 +1152,7 @@ Static Protected Attributes -

    Definition at line 1190 of file BTD.cpp.

    +

    Definition at line 1198 of file BTD.cpp.

    @@ -1206,7 +1201,7 @@ Static Protected Attributes -

    Definition at line 1218 of file BTD.cpp.

    +

    Definition at line 1226 of file BTD.cpp.

    @@ -1262,7 +1257,7 @@ Static Protected Attributes -

    Definition at line 1231 of file BTD.cpp.

    +

    Definition at line 1239 of file BTD.cpp.

    @@ -1304,7 +1299,7 @@ Static Protected Attributes -

    Definition at line 1248 of file BTD.cpp.

    +

    Definition at line 1256 of file BTD.cpp.

    @@ -1346,7 +1341,7 @@ Static Protected Attributes -

    Definition at line 1265 of file BTD.cpp.

    +

    Definition at line 1273 of file BTD.cpp.

    @@ -1395,7 +1390,7 @@ Static Protected Attributes -

    Definition at line 1284 of file BTD.cpp.

    +

    Definition at line 1292 of file BTD.cpp.

    @@ -1444,7 +1439,7 @@ Static Protected Attributes -

    Definition at line 1297 of file BTD.cpp.

    +

    Definition at line 1305 of file BTD.cpp.

    @@ -1492,7 +1487,7 @@ Static Protected Attributes -

    Definition at line 1310 of file BTD.cpp.

    +

    Definition at line 1318 of file BTD.cpp.

    @@ -1518,7 +1513,7 @@ Static Protected Attributes

    Call this function to pair with a Wiimote

    -

    Definition at line 500 of file BTD.h.

    +

    Definition at line 464 of file BTD.h.

    @@ -1544,7 +1539,7 @@ Static Protected Attributes

    Call this function to pair with a Wiimote

    -

    Definition at line 516 of file BTD.h.

    +

    Definition at line 480 of file BTD.h.

    @@ -1570,7 +1565,7 @@ Static Protected Attributes

    Read the poll interval taken from the endpoint descriptors.

    Returns
    The poll interval in ms.
    -

    Definition at line 531 of file BTD.h.

    +

    Definition at line 495 of file BTD.h.

    @@ -1618,7 +1613,7 @@ Static Protected Attributes

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

    -

    Definition at line 471 of file BTD.h.

    +

    Definition at line 435 of file BTD.h.

    @@ -1633,7 +1628,7 @@ Static Protected Attributes

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

    -

    Definition at line 473 of file BTD.h.

    +

    Definition at line 437 of file BTD.h.

    @@ -1648,7 +1643,7 @@ Static Protected Attributes

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

    -

    Definition at line 475 of file BTD.h.

    +

    Definition at line 439 of file BTD.h.

    @@ -1663,7 +1658,7 @@ Static Protected Attributes

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

    -

    Definition at line 477 of file BTD.h.

    +

    Definition at line 441 of file BTD.h.

    @@ -1678,7 +1673,7 @@ 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 480 of file BTD.h.

    +

    Definition at line 444 of file BTD.h.

    @@ -1693,7 +1688,7 @@ 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 482 of file BTD.h.

    +

    Definition at line 446 of file BTD.h.

    @@ -1708,7 +1703,7 @@ Static Protected Attributes

    The bluetooth dongles Bluetooth address.

    -

    Definition at line 485 of file BTD.h.

    +

    Definition at line 449 of file BTD.h.

    @@ -1723,7 +1718,7 @@ Static Protected Attributes

    HCI handle for the last connection.

    -

    Definition at line 487 of file BTD.h.

    +

    Definition at line 451 of file BTD.h.

    @@ -1738,7 +1733,7 @@ Static Protected Attributes

    Last incoming devices Bluetooth address.

    -

    Definition at line 489 of file BTD.h.

    +

    Definition at line 453 of file BTD.h.

    @@ -1753,7 +1748,7 @@ Static Protected Attributes

    First 30 chars of last remote name.

    -

    Definition at line 491 of file BTD.h.

    +

    Definition at line 455 of file BTD.h.

    @@ -1768,7 +1763,7 @@ 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 497 of file BTD.h.

    +

    Definition at line 461 of file BTD.h.

    @@ -1783,7 +1778,7 @@ Static Protected Attributes

    Used to only send the ACL data to the Wiimote.

    -

    Definition at line 503 of file BTD.h.

    +

    Definition at line 467 of file BTD.h.

    @@ -1798,7 +1793,7 @@ Static Protected Attributes

    True if a Wiimote is connecting.

    -

    Definition at line 507 of file BTD.h.

    +

    Definition at line 471 of file BTD.h.

    @@ -1813,7 +1808,7 @@ Static Protected Attributes

    True when it should pair with a Wiimote.

    -

    Definition at line 509 of file BTD.h.

    +

    Definition at line 473 of file BTD.h.

    @@ -1828,7 +1823,7 @@ Static Protected Attributes

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

    -

    Definition at line 511 of file BTD.h.

    +

    Definition at line 475 of file BTD.h.

    @@ -1843,7 +1838,7 @@ Static Protected Attributes

    True if it's a Wii U Pro Controller.

    -

    Definition at line 513 of file BTD.h.

    +

    Definition at line 477 of file BTD.h.

    @@ -1858,7 +1853,7 @@ Static Protected Attributes

    Used to only send the ACL data to the Wiimote.

    -

    Definition at line 519 of file BTD.h.

    +

    Definition at line 483 of file BTD.h.

    @@ -1873,7 +1868,7 @@ Static Protected Attributes

    True if a Wiimote is connecting.

    -

    Definition at line 523 of file BTD.h.

    +

    Definition at line 487 of file BTD.h.

    @@ -1888,7 +1883,7 @@ Static Protected Attributes

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

    -

    Definition at line 525 of file BTD.h.

    +

    Definition at line 489 of file BTD.h.

    @@ -1911,7 +1906,7 @@ Static Protected Attributes

    Pointer to USB class instance.

    -

    Definition at line 533 of file BTD.h.

    +

    Definition at line 497 of file BTD.h.

    @@ -1934,7 +1929,7 @@ Static Protected Attributes

    Device address.

    -

    Definition at line 539 of file BTD.h.

    +

    Definition at line 503 of file BTD.h.

    @@ -1957,7 +1952,7 @@ Static Protected Attributes

    Endpoint info structure.

    -

    Definition at line 541 of file BTD.h.

    +

    Definition at line 505 of file BTD.h.

    @@ -1980,7 +1975,7 @@ Static Protected Attributes

    Configuration number.

    -

    Definition at line 544 of file BTD.h.

    +

    Definition at line 508 of file BTD.h.

    @@ -2003,7 +1998,7 @@ Static Protected Attributes

    Total number of endpoints in the configuration.

    -

    Definition at line 546 of file BTD.h.

    +

    Definition at line 510 of file BTD.h.

    @@ -2026,7 +2021,7 @@ Static Protected Attributes

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

    -

    Definition at line 548 of file BTD.h.

    +

    Definition at line 512 of file BTD.h.

    @@ -2049,7 +2044,7 @@ Static Protected Attributes

    Bluetooth dongle control endpoint.

    -

    Definition at line 551 of file BTD.h.

    +

    Definition at line 515 of file BTD.h.

    @@ -2072,7 +2067,7 @@ Static Protected Attributes

    HCI event endpoint index.

    -

    Definition at line 553 of file BTD.h.

    +

    Definition at line 517 of file BTD.h.

    @@ -2095,7 +2090,7 @@ Static Protected Attributes

    ACL In endpoint index.

    -

    Definition at line 555 of file BTD.h.

    +

    Definition at line 519 of file BTD.h.

    @@ -2118,7 +2113,7 @@ Static Protected Attributes

    ACL Out endpoint index.

    -

    Definition at line 557 of file BTD.h.

    +

    Definition at line 521 of file BTD.h.

    @@ -2131,7 +2126,7 @@ Static Protected Attributes diff --git a/class_b_t_d__coll__graph.md5 b/class_b_t_d__coll__graph.md5 index 3b9a2e08..7288133e 100644 --- a/class_b_t_d__coll__graph.md5 +++ b/class_b_t_d__coll__graph.md5 @@ -1 +1 @@ -ca95807276f7b79a9da3fd2fb6368499 \ No newline at end of file +e72568841cb2f05e3bfabb29e1ce8457 \ No newline at end of file diff --git a/class_b_t_d__inherit__graph.md5 b/class_b_t_d__inherit__graph.md5 index 5d318cb2..95bb3a3b 100644 --- a/class_b_t_d__inherit__graph.md5 +++ b/class_b_t_d__inherit__graph.md5 @@ -1 +1 @@ -d46813718d41f5c0027726790fddd324 \ No newline at end of file +36ee382408a95d482da81524513435df \ No newline at end of file diff --git a/class_b_t_h_i_d-members.html b/class_b_t_h_i_d-members.html index d3489879..f611546a 100644 --- a/class_b_t_h_i_d-members.html +++ b/class_b_t_h_i_d-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    int8_t BTD::registerServiceClass int8_t BTD::registerBluetoothService ( BluetoothService pService)
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -90,22 +91,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for BTHID, including all inherited members.

    - - - + + + + + - - - - - - - + + + + + + + + + + + - + @@ -114,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_b_t_h_i_d.html b/class_b_t_h_i_d.html index cda431c6..aa90cd14 100644 --- a/class_b_t_h_i_d.html +++ b/class_b_t_h_i_d.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: BTHID Class Reference + @@ -31,7 +32,7 @@
    ACLData(uint8_t *ACLData)BTHIDvirtual
    attachOnInit(void(*funcOnInit)(void))BTHIDinline
    BTHID(BTD *p, bool pair=false, const char *pin="0000")BTHID
    ACLData(uint8_t *ACLData)BTHIDprotectedvirtual
    attachOnInit(void(*funcOnInit)(void))BluetoothServiceinline
    BluetoothService(BTD *p)BluetoothServiceinline
    BTHID(BTD *p, bool pair=false, const char *pin="0000")BTHID
    checkHciHandle(uint8_t *buf, uint16_t handle)BluetoothServiceinlineprotected
    connectedBTHID
    control_scidBTHIDprotected
    disconnect()BTHIDvirtual
    GetReportParser(uint8_t id)BTHIDinline
    hci_handleBTHIDprotected
    interrupt_scidBTHIDprotected
    OnInitBTHID()BTHIDinlineprotectedvirtual
    pair(void)BTHIDinline
    ParseBTHIDData(uint8_t len, uint8_t *buf)BTHIDinlineprotectedvirtual
    pBtdBTHIDprotected
    Reset()BTHIDvirtual
    hci_handleBluetoothServiceprotected
    identifierBluetoothServiceprotected
    interrupt_scidBTHIDprotected
    l2cap_event_flagBluetoothServiceprotected
    onInit()BTHIDinlineprotectedvirtual
    OnInitBTHID()BTHIDinlineprotectedvirtual
    pair(void)BTHIDinline
    ParseBTHIDData(uint8_t len, uint8_t *buf)BTHIDinlineprotectedvirtual
    pBtdBluetoothServiceprotected
    pFuncOnInitBluetoothServiceprotected
    Reset()BTHIDprotectedvirtual
    ResetBTHID()BTHIDinlineprotectedvirtual
    Run()BTHIDvirtual
    Run()BTHIDprotectedvirtual
    setLeds(uint8_t data)BTHID
    setProtocolMode(uint8_t mode)BTHIDinline
    SetReportParser(uint8_t id, HIDReportParser *prs)BTHIDinline
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -106,7 +107,7 @@ Collaboration diagram for BTHID:
    Collaboration graph
    - +
    [legend]
    - - - - - - - - - - - + + + + +

    @@ -123,17 +124,11 @@ Public Member Functions

     
    void pair (void)
     
    void attachOnInit (void(*funcOnInit)(void))
     
    BluetoothService implementation
    virtual void ACLData (uint8_t *ACLData)
     
    virtual void Run ()
     
    virtual void Reset ()
     
    virtual void disconnect ()
     
    - Public Member Functions inherited from BluetoothService
     BluetoothService (BTD *p)
     
    void attachOnInit (void(*funcOnInit)(void))
     
    @@ -149,17 +144,40 @@ Protected Member Functions + + +

    Public Attributes

     
    virtual void ResetBTHID ()
     
    - Protected Member Functions inherited from BluetoothService
    bool checkHciHandle (uint8_t *buf, uint16_t handle)
     
    - - - - + + + + + + + + + + + +

    Protected Attributes

    BTDpBtd
     
    uint16_t hci_handle
     
    uint8_t control_scid [2]
     
    uint8_t interrupt_scid [2]
     
    - Protected Attributes inherited from BluetoothService
    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
     
    uint32_t l2cap_event_flag
     
    uint8_t identifier
     
    + + + + + + + + + + +

    +BluetoothService implementation

    void disconnect ()
     
    void ACLData (uint8_t *ACLData)
     
    void Run ()
     
    void Reset ()
     
    void onInit ()
     

    Detailed Description

    This BluetoothService class implements support for Bluetooth HID devices.

    @@ -209,96 +227,6 @@ Protected Attributes
    - - - - -
    - - - - - - - - -
    void BTHID::ACLData (uint8_t * ACLData)
    -
    -virtual
    -
    -

    Used to pass acldata to the services.

    Parameters
    - - -
    ACLDataIncoming acldata.
    -
    -
    - -

    Reimplemented from BluetoothService.

    - -

    Definition at line 59 of file BTHID.cpp.

    - -
    -
    - -
    -
    - - - - - -
    - - - - - - - -
    void BTHID::Run ()
    -
    -virtual
    -
    -

    Used to run part of the state machine.

    - -

    Reimplemented from BluetoothService.

    - -

    Definition at line 347 of file BTHID.cpp.

    - -
    -
    - -
    -
    - - - - - -
    - - - - - - - -
    void BTHID::Reset ()
    -
    -virtual
    -
    -

    Use this to reset the service.

    - -

    Reimplemented from BluetoothService.

    - -

    Definition at line 44 of file BTHID.cpp.

    - -
    -
    @@ -321,9 +249,9 @@ Protected Attributes
    @@ -495,27 +423,113 @@ Protected Attributes +protectedvirtual
    - + - - + +
    void BTHID::attachOnInit void BTHID::ACLData (void(*)(void) funcOnInit)uint8_t * ACLData)
    -inline
    -

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

    Parameters
    +

    Used to pass acldata to the services.

    Parameters
    - +
    funcOnInitFunction to call.
    ACLDataIncoming acldata.
    -

    Definition at line 104 of file BTHID.h.

    +

    Implements BluetoothService.

    + +

    Definition at line 56 of file BTHID.cpp.

    + +
    + + +
    +
    + + + + + +
    + + + + + + + +
    void BTHID::Run ()
    +
    +protectedvirtual
    +
    +

    Used to run part of the state machine.

    + +

    Implements BluetoothService.

    + +

    Definition at line 344 of file BTHID.cpp.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void BTHID::Reset ()
    +
    +protectedvirtual
    +
    +

    Use this to reset the service.

    + +

    Implements BluetoothService.

    + +

    Definition at line 41 of file BTHID.cpp.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void BTHID::onInit ()
    +
    +inlineprotectedvirtual
    +
    +

    Called when a device is successfully initialized. Use attachOnInit(void (*funcOnInit)(void)) to call your own function. This is useful for instance if you want to set the LEDs in a specific way.

    + +

    Implements BluetoothService.

    + +

    Definition at line 107 of file BTHID.h.

    @@ -560,7 +574,7 @@ Protected Attributes
    - - - - -
    - - - - -
    BTD* BTHID::pBtd
    -
    -protected
    -
    -

    Pointer to BTD instance

    - -

    Definition at line 129 of file BTHID.h.

    - -
    - - -
    -
    - - - - - -
    - - - - -
    uint16_t BTHID::hci_handle
    -
    -protected
    -
    -

    HCI Handle for connection

    - -

    Definition at line 132 of file BTHID.h.

    +

    Definition at line 83 of file BTHID.h.

    @@ -701,7 +669,7 @@ Protected Attributes

    L2CAP source CID for HID_Control

    -

    Definition at line 136 of file BTHID.h.

    +

    Definition at line 134 of file BTHID.h.

    @@ -724,7 +692,7 @@ Protected Attributes

    L2CAP source CID for HID_Interrupt

    -

    Definition at line 139 of file BTHID.h.

    +

    Definition at line 137 of file BTHID.h.

    @@ -737,7 +705,7 @@ Protected Attributes diff --git a/class_b_t_h_i_d__coll__graph.map b/class_b_t_h_i_d__coll__graph.map index 51439fee..4be7a39c 100644 --- a/class_b_t_h_i_d__coll__graph.map +++ b/class_b_t_h_i_d__coll__graph.map @@ -1,6 +1,6 @@ - - + + diff --git a/class_b_t_h_i_d__coll__graph.md5 b/class_b_t_h_i_d__coll__graph.md5 index 56671f82..b8a6fc7c 100644 --- a/class_b_t_h_i_d__coll__graph.md5 +++ b/class_b_t_h_i_d__coll__graph.md5 @@ -1 +1 @@ -e2f89679fd56e506438c2555a46fcf89 \ No newline at end of file +328440863f58d32544996d4a0a7788ae \ No newline at end of file diff --git a/class_b_t_h_i_d__coll__graph.png b/class_b_t_h_i_d__coll__graph.png index 82ee7f2d3536b52f6718c58c3eda85c510f10948..76ed39710e46aa3ba76034c5bcd4b5f4b1613d34 100644 GIT binary patch literal 22478 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

    vK2rQH50HaOET< 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 Y1@R}}A19ZIGQpRLfyKcxeM;EB0ClsNI{*Lx literal 22759 zcmeFZMOa+H7Bz}A(0DiQ?!kfuhsIrk2AAL=K!D)x9^4@WcL)&N6A11af(LhZ{=>cZ zpS;-onAb_W(a+U}WGwnymFC zaB$*q@=`EOclbj?6mL9fLO+|}Wz_a-b}jKTm+n9slRRc^5I&N$G!&{{J0YqG!G}og zQZco=705eG3I%*Ypk6qBWIS?mYgRl;XdOCS_Uc@rZ>_82c6j0za#+sv;D(XlqM{-M z`cqMX!3Y5n;vXDMQuGzrfIt58KRRlvKsCL<|GXL~E>24o$oaM07>(n9uLr6v{`Z|P zuR%!03sZa0fj6#DjW;?Nx47&ktelw3$ee8sNN)7U6@U2x;U?f1u|P}E%D3rLF~S3Z z;IXM8goLv1zQ51AKWdGO#A9C1)1)W11F;*m$(8F=YX`+V+@9-;ppt4)07Bgj9)8C}g&+&c-(Z>r&U8Au;HP>edXM1x)2EP zVX&?sa5&WkRa!#Qf1k+z6as-+w+Z6LBEiGNfop`r{aI5^|98O+a=_1@QY4%va26vO z$uiMI@vKwTolhAmS^Ti$j(c`|Cbh0JvSU-2N(dT$iE6HB%87{A)p&t?;?C`MZZV5i znQo72jUQtP3`!sM6*BT(Lp(r+4dm#!@melV|^ic5C}7>aZ9p zmXuxUi;xe$g;6{}8_sOKN#m)^fERG6@AXEka(}Q8>~sCsP0!uEsSiPID4sSWUX}2$i zH06X`=yOTU(ce}();4=zVQ|e)#Y3}ygUKx9S2Id%wqHf!^2A@&Cg}jP|9~A(kJjUL z)GSNN@Ay?YK(}tncDABa(8mjQ^AlIqy5f=<#&6z-k$D|UCh)DcsL1DHLYC#>{hxP=-KDtT(QDCA3GV#n3a4y0;Z?cLR zX25teS8ZI}?7ThcJSHL=CwvB0PUrf?ptA7YVmFGTgNh*dqMy=loYbK$?+A(&81dch zczL=^>y>Mqq25VQx+Wt*+n$e?2E%Y(_@636A$&p z&mB@-rO`;_F=DuNIHH0o?=Jh({#PdDxRc&SsV-}sSajMtXcM5`Y7)uzFAW>R+uso-<7;8y)558Rw z8O7F_dtnIy8Civ?Qw(&&CW~W8->970<$hKm$s2|)=Krg`CvwVlw5X?YdO1uSpw_b$#IRR+!9w%|}ONu=5YlYnEZXo+D}FJ8#)zM_$Bjhbc@cMOcYaO{sV+jR z+^D@Jv{@9gbviFxCUQBgu}87Ucu%KSFIB<7X4KZy=Nqxte3{E@H##nip%pkx-4Oz+3|lAXYt17b z?-J%LqMAI^;t0@c*2md3B zJE4{gr5lcl!-88_(0JupBs{|oK}}9=(2ovi2MCK* zc+kZ;m^%95k*Ekbji3ZoNlfa2^Ty+dh1beBcdwQBABc+dsL>HVQRE?^HUBpOAc3eJ zqUqoancjBELc{L-9S{)ym-}M;!9877e$4IvNe%FEz@PswUTsnZeSTEjMS|}X7kA5D z<%Tbni>LAJPP9`3Iq@7UZ#@S~2Iy29DX)vhS5%ovLl}Cc5MCCK7P9lFv3jq7o94KF z(_=@?sKq(#M(V!Y#zRDMxtn3_zj^Zu#=wdyH$H5q7@zjTO8`>RLP)(bkycw-!MHYK zIdSeBlNG+hl{G172(?_YX=oB>|IK(_AOenM$KC_qwt(je@K z0G^Zx6!5O@hlZLOXRf~7#UBTK%$|mtT@2ug(J%3i|H+ADRE~#w7?tmw)yN-zT2W2@ zuxH$PxZTGxQ~09(l0K6%a72Oh*~J0Tt^YlXM}mVRb-wj@NZ5voYa=NRGF@~`Y@rksY4$D|*n99rcp&=pTSpq^zMxN&c93C+ljTLXX{xjyu z5ICi;oFR+22F&j-OGH@unh9anSuHp!z(A=Gq5Pf~I6%4>we%g&$WCOe9zXh9Tp6^v zNCm(H9yw{$OkjI`sRa+G*JYa^xXQTmxmBgfX0L6GtN ztWvk|-Tm>OEZgYV<#^6#adA+d-*k{8HGqEI9i7z1`%S{HM4Mx|#;rd0KMaRXhV9?KFG!)4#j??dU;J@!pB#b9=vidC zP?(UGR)Wu}J6?XsD%{pYKw&gl?y)(NsS_0yRre};`=i}##je)V;l5D*v81GA1DpPj zc|;=I!RUqY+w*N^YU%*X(JUKW_BR0mT`PXi%DLWWsI^oDH8q@Zgn}$Aktd|0-uzl6 zYTX;Vih+Hw)rL8v{5q>K&k)lKQ$luwuWweo6Zht-kCTPlvUdPPIpc;yN~*ZFwq`VN zG@QM~WWq7Uyao_T*H*4^)dgx!H)@PdyX!hy2bFX~hX%WWxrbwXucc=5eL<0AFI)nd)GZhsOIYf{d){vJ{2M9;UQ2(i4 zT%$&gc%m*lY5)$w=l!@ezjeAfkT^3aSuqX&cs?d}@h{bQGM-kp#Pf1*8UTowMq9(_ zGv}1PHvu(o6&QncO5cXGxbDlOb6LFY?tHu=tpsv)oJ1R5E^tF>0QVKMzWc7*Gxf>o z_ROL|VSh?hO!=Cn@|8~2xQ?-p^q)qD;#<+ixYN9ylmF@8pg@!a>6?!Q%o;@{SE;Xb z*lm~F1TK$P#Qq+_5f>G9tZ!_fM#-OK3j-j7&l{VRFIpj)MH&EAHK?hX7u2h^Lak04 z$UdjP2v4d#t!`V0r>KDFvz_W@)W4?J5I#jbat8$E;X~GLAy(Kv^D%E2M9R zt)JfDG6-p0ozKmuIZSxE^uJ|gl z>D5zB-=lN1eGMLae!3RBRQE!dtDhz`(4nEB*-5v`q4pLMd?~YdK5fdiTrYcRjSC&O zNjgfN@OZp3R6XAvxG=D>BKiu<&f80^8*FNR0FYnWQ;K@));gc8!tS2#kJ%oH5U7bJ z7|BFDrxRK4g)4!L4@rVvY+Q+%B$DKH-fd+%fFD2Gf-De-B;h0|+!KYrL0fuOgHdrc z`?-LUOVI_)Z|yyfXE$Av*K-=s+pomPTIaVO!HDNr=#Ga`X3)$PL&B?IxPdKWO%!1Q z60@6SRpe)%56JwqH7wuVT{`seO*(3FvBA!MS#}!?uixhGlq!3C>SdY(N*ztaSJtjqAXW~5KL|l5{2_dIz2Y|`j@DE2Qdu}g>rRZC%=kM_ zqf#<1N(CSwT~K8{|E81}UOawPd3kxaUtJC}t~P47KHnNqNW&)M|6)>GqFeiIknk3^ zQP23fM;q4CfRs((kOaGHclBr19Cs@++rKRhBn3MmeaKLvnl2tpT;@d-@YW3uy#gIKx7j#QkFxNtinjp~Tq@{K zpYO6e33}$Kw;Bhcw(6lq(Cw(Ao9=QrWD4Ee))6A%I; z@G@SlcO4*ayMRr=4j6k~&j8OdLj_$ST0~le3X%bU%58cTYLE0!Vv+NDp*X5(w1ZKY zl-n};?y1G?xT*%0_6{`&8N=wc|91v3zYp4PL4!`2l^_QSpOAD^L_Y7Joj>DSCnKh| zL+RMLRW~LkVOJ5|MDG#qx{8!DSxQWZyL}W^Ogvv-rc?a{lOn-nr(4||X5dW=mP*uV zNn_9`*ISP}%6)f!=E3rC<&;}t#c_Se=O7TVQdOMD6_F_&a@`?tBu+CSXX6JKR!QeM zJpo(tVlz>dWi31w5o82K4nQ$QtV5Og)E`TpPp_CVzS

    d==3)4mFE~6MAQ|jD-M^ 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 GBmM_E#$W#c diff --git a/class_b_t_h_i_d__inherit__graph.md5 b/class_b_t_h_i_d__inherit__graph.md5 index a07e90bb..d99946b7 100644 --- a/class_b_t_h_i_d__inherit__graph.md5 +++ b/class_b_t_h_i_d__inherit__graph.md5 @@ -1 +1 @@ -84cb6c869d9ec98ca739f6ef702e34ea \ No newline at end of file +0461eab4196d51bce1337c7c83a0da9f \ No newline at end of file diff --git a/class_bluetooth_service-members.html b/class_bluetooth_service-members.html index 5e82858f..3697a230 100644 --- a/class_bluetooth_service-members.html +++ b/class_bluetooth_service-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

    @@ -90,16 +91,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for BluetoothService, including all inherited members.

    - - - - + + + + + + + + + + + + +
    ACLData(uint8_t *ACLData)BluetoothServicevirtual
    disconnect()BluetoothServicevirtual
    Reset()BluetoothServicevirtual
    Run()BluetoothServicevirtual
    ACLData(uint8_t *ACLData)=0BluetoothServicepure virtual
    attachOnInit(void(*funcOnInit)(void))BluetoothServiceinline
    BluetoothService(BTD *p)BluetoothServiceinline
    checkHciHandle(uint8_t *buf, uint16_t handle)BluetoothServiceinlineprotected
    disconnect()=0BluetoothServicepure virtual
    hci_handleBluetoothServiceprotected
    identifierBluetoothServiceprotected
    l2cap_event_flagBluetoothServiceprotected
    onInit()=0BluetoothServiceprotectedpure virtual
    pBtdBluetoothServiceprotected
    pFuncOnInitBluetoothServiceprotected
    Reset()=0BluetoothServicepure virtual
    Run()=0BluetoothServicepure virtual
    diff --git a/class_bluetooth_service.html b/class_bluetooth_service.html index 60c171a9..8e3da9d3 100644 --- a/class_bluetooth_service.html +++ b/class_bluetooth_service.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BluetoothService Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -85,9 +86,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    -
    BluetoothService Class Reference
    +
    BluetoothService Class Referenceabstract
    @@ -99,24 +102,82 @@ Inheritance diagram for BluetoothService:
    [legend]
    +
    +Collaboration diagram for BluetoothService:
    +
    +
    Collaboration graph
    + + +
    [legend]
    - - - - - - - - + + + + + + + + + + + + +

    Public Member Functions

    virtual void ACLData (uint8_t *ACLData)
     
    virtual void Run ()
     
    virtual void Reset ()
     
    virtual void disconnect ()
     
     BluetoothService (BTD *p)
     
    virtual void ACLData (uint8_t *ACLData)=0
     
    virtual void Run ()=0
     
    virtual void Reset ()=0
     
    virtual void disconnect ()=0
     
    void attachOnInit (void(*funcOnInit)(void))
     
    + + + + + +

    +Protected Member Functions

    virtual void onInit ()=0
     
    bool checkHciHandle (uint8_t *buf, uint16_t handle)
     
    + + + + + + + + + + +

    +Protected Attributes

    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
     
    uint32_t l2cap_event_flag
     
    uint8_t identifier
     

    Detailed Description

    All Bluetooth services should inherit this class.

    -

    Definition at line 211 of file BTD.h.

    -

    Member Function Documentation

    - +

    Definition at line 563 of file BTD.h.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + +
    + + + + + + + + +
    BluetoothService::BluetoothService (BTDp)
    +
    +inline
    +
    + +

    Definition at line 565 of file BTD.h.

    + +
    +
    +

    Member Function Documentation

    +
    @@ -133,7 +194,7 @@ Public Member Functions
    -virtual +pure virtual
    @@ -144,11 +205,11 @@ Public Member Functions -

    Reimplemented in SPP, WII, PS3BT, and BTHID.

    +

    Implemented in WII, PS3BT, SPP, and BTHID.

    - +
    @@ -164,17 +225,17 @@ Public Member Functions
    -virtual +pure virtual

    Used to run the different state machines in the Bluetooth service.

    -

    Reimplemented in SPP, WII, PS3BT, and BTHID.

    +

    Implemented in WII, PS3BT, SPP, and BTHID.

    - +
    @@ -190,17 +251,17 @@ Public Member Functions
    -virtual +pure virtual

    Used to reset the Bluetooth service.

    -

    Reimplemented in SPP, WII, PS3BT, and BTHID.

    +

    Implemented in WII, PS3BT, SPP, and BTHID.

    - +
    @@ -216,13 +277,224 @@ Public Member Functions
    -virtual +pure virtual

    Used to disconnect both the L2CAP Channel and the HCI Connection for the Bluetooth service.

    -

    Reimplemented in SPP, WII, PS3BT, and BTHID.

    +

    Implemented in SPP, WII, PS3BT, and BTHID.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    void BluetoothService::attachOnInit (void(*)(void) funcOnInit)
    +
    +inline
    +
    +

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

    Parameters
    + + +
    funcOnInitFunction to call.
    +
    +
    + +

    Definition at line 585 of file BTD.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    virtual void BluetoothService::onInit ()
    +
    +protectedpure virtual
    +
    +

    Called when a device is successfully initialized. Use attachOnInit(void (*funcOnInit)(void)) to call your own function. This is useful for instance if you want to set the LEDs in a specific way.

    + +

    Implemented in WII, PS3BT, SPP, and BTHID.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    bool BluetoothService::checkHciHandle (uint8_t * buf,
    uint16_t handle 
    )
    +
    +inlineprotected
    +
    +

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

    + +

    Definition at line 598 of file BTD.h.

    + +
    +
    +

    Member Data Documentation

    + +
    +
    + + + + + +
    + + + + +
    void(* BluetoothService::pFuncOnInit) (void)
    +
    +protected
    +
    +

    Pointer to function called in onInit().

    + +

    Definition at line 603 of file BTD.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    BTD* BluetoothService::pBtd
    +
    +protected
    +
    +

    Pointer to BTD instance.

    + +

    Definition at line 606 of file BTD.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    uint16_t BluetoothService::hci_handle
    +
    +protected
    +
    +

    The HCI Handle for the connection.

    + +

    Definition at line 609 of file BTD.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    uint32_t BluetoothService::l2cap_event_flag
    +
    +protected
    +
    +

    L2CAP flags of received Bluetooth events.

    + +

    Definition at line 612 of file BTD.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + +
    uint8_t BluetoothService::identifier
    +
    +protected
    +
    +

    Identifier for L2CAP commands.

    + +

    Definition at line 615 of file BTD.h.

    @@ -234,7 +506,7 @@ Public Member Functions diff --git a/class_bluetooth_service__coll__graph.map b/class_bluetooth_service__coll__graph.map new file mode 100644 index 00000000..97b069d6 --- /dev/null +++ b/class_bluetooth_service__coll__graph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/class_bluetooth_service__coll__graph.md5 b/class_bluetooth_service__coll__graph.md5 new file mode 100644 index 00000000..c59d7e12 --- /dev/null +++ b/class_bluetooth_service__coll__graph.md5 @@ -0,0 +1 @@ +63004da77f15c2792f7eb5740b2b02f1 \ No newline at end of file diff --git a/class_bluetooth_service__coll__graph.png b/class_bluetooth_service__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..acd45b9a4320c01ef297b185ea867b6f63d0d93b GIT binary patch literal 20220 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 literal 0 HcmV?d00001 diff --git a/class_bluetooth_service__inherit__graph.md5 b/class_bluetooth_service__inherit__graph.md5 index d459942e..89adea58 100644 --- a/class_bluetooth_service__inherit__graph.md5 +++ b/class_bluetooth_service__inherit__graph.md5 @@ -1 +1 @@ -649bd2daee1f85302b66a7c86467bc90 \ No newline at end of file +ed04eb4acfc3583220d1627fb69bac21 \ No newline at end of file diff --git a/class_bulk_only-members.html b/class_bulk_only-members.html index d25ecd70..8bd04ec0 100644 --- a/class_bulk_only-members.html +++ b/class_bulk_only-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -103,44 +104,45 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); CurrentCapacityBulkOnlyprotected CurrentSectorSizeBulkOnlyprotected dCBWTagBulkOnlyprotected - DEVCLASSOK(uint8_t klass)BulkOnlyinlinevirtual - EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)BulkOnlyvirtual - epDataInIndexBulkOnlyprotectedstatic - epDataOutIndexBulkOnlyprotectedstatic - epInfoBulkOnlyprotected - epInterruptInIndexBulkOnlyprotectedstatic - GetAddress()BulkOnlyinlinevirtual - GetbMaxLUN()BulkOnlyinline - GetbTheLUN()BulkOnlyinline - GetCapacity(uint8_t lun)BulkOnly - GetLastUsbError()BulkOnlyinline - GetSectorSize(uint8_t lun)BulkOnly - Init(uint8_t parent, uint8_t port, bool lowspeed)BulkOnlyvirtual - LockMedia(uint8_t lun, uint8_t lock)BulkOnly - LUNIsGood(uint8_t lun)BulkOnly - LUNOkBulkOnlyprotected - MediaCTL(uint8_t lun, uint8_t ctl)BulkOnly - OnInit()BulkOnlyinlineprotectedvirtual - Poll()BulkOnlyvirtual - PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)BulkOnlyprotected - pUsbBulkOnlyprotected - qNextPollTimeBulkOnlyprotected - Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf)BulkOnly - Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs)BulkOnly - Release()BulkOnlyvirtual - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)BulkOnly - SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)BulkOnly - VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual - Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf)BulkOnly - WriteOkBulkOnlyprotected - WriteProtected(uint8_t lun)BulkOnly + DEVCLASSOK(uint8_t klass)BulkOnlyinlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)BulkOnlyvirtual + epDataInIndexBulkOnlyprotectedstatic + epDataOutIndexBulkOnlyprotectedstatic + epInfoBulkOnlyprotected + epInterruptInIndexBulkOnlyprotectedstatic + GetAddress()BulkOnlyinlinevirtual + GetbMaxLUN()BulkOnlyinline + GetbTheLUN()BulkOnlyinline + GetCapacity(uint8_t lun)BulkOnly + GetLastUsbError()BulkOnlyinline + GetSectorSize(uint8_t lun)BulkOnly + Init(uint8_t parent, uint8_t port, bool lowspeed)BulkOnlyvirtual + LockMedia(uint8_t lun, uint8_t lock)BulkOnly + LUNIsGood(uint8_t lun)BulkOnly + LUNOkBulkOnlyprotected + MediaCTL(uint8_t lun, uint8_t ctl)BulkOnly + OnInit()BulkOnlyinlineprotectedvirtual + Poll()BulkOnlyvirtual + PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)BulkOnlyprotected + pUsbBulkOnlyprotected + qNextPollTimeBulkOnlyprotected + Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf)BulkOnly + Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs)BulkOnly + Release()BulkOnlyvirtual + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)BulkOnly + SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)BulkOnly + VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual + Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf)BulkOnly + WriteOkBulkOnlyprotected + WriteProtected(uint8_t lun)BulkOnly
    diff --git a/class_bulk_only.html b/class_bulk_only.html index 8e827102..400eedc1 100644 --- a/class_bulk_only.html +++ b/class_bulk_only.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: BulkOnly Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -120,8 +121,8 @@ Public Member Functions   uint8_t GetbTheLUN ()   -boolean WriteProtected (uint8_t lun) -  +bool WriteProtected (uint8_t lun) +  uint8_t MediaCTL (uint8_t lun, uint8_t ctl)   uint8_t Read (uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf) @@ -138,20 +139,20 @@ Public Member Functions   uint16_t GetSectorSize (uint8_t lun)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   -virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) +void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)   -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  uint8_t SCSITransaction6 (CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir)   uint8_t SCSITransaction10 (CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) @@ -159,8 +160,10 @@ Public Member Functions - Public Member Functions inherited from USBDeviceConfig virtual void ResetHubPort (uint8_t port)   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  @@ -368,12 +371,12 @@ Static Protected Attributes - +

    Protected Member Functions

    - + @@ -962,13 +965,13 @@ Static Protected Attributes -

    Implements UsbConfigXtracter.

    +

    Reimplemented from UsbConfigXtracter.

    Definition at line 543 of file masstorage.cpp.

    - +
    boolean BulkOnly::WriteProtected bool BulkOnly::WriteProtected ( uint8_t  lun)
    @@ -976,7 +979,7 @@ Static Protected Attributes diff --git a/class_bulk_only__coll__graph.md5 b/class_bulk_only__coll__graph.md5 index e993d046..65616e8f 100644 --- a/class_bulk_only__coll__graph.md5 +++ b/class_bulk_only__coll__graph.md5 @@ -1 +1 @@ -3d45c6122208407db0c669272fecf2e2 \ No newline at end of file +f9839364bbfdcee0034202ae5496cf49 \ No newline at end of file diff --git a/class_bulk_only__inherit__graph.md5 b/class_bulk_only__inherit__graph.md5 index d585bee0..ab44521f 100644 --- a/class_bulk_only__inherit__graph.md5 +++ b/class_bulk_only__inherit__graph.md5 @@ -1 +1 @@ -56d5764d63044c2fb0319b525dd7bedc \ No newline at end of file +2b66e1860fb7442508174e207255d1ed \ No newline at end of file diff --git a/class_byte_skipper-members.html b/class_byte_skipper-members.html index cb637311..7672ebd4 100644 --- a/class_byte_skipper-members.html +++ b/class_byte_skipper-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -990,7 +993,7 @@ Static Protected Attributes
    virtual boolean BulkOnly::DEVCLASSOK virtual bool BulkOnly::DEVCLASSOK ( uint8_t  klass)
    -

    Reimplemented from USBDeviceConfig.

    +

    Reimplemented from USBDeviceConfig.

    Definition at line 535 of file masstorage.h.

    @@ -1526,7 +1529,7 @@ Static Protected Attributes
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_byte_skipper.html b/class_byte_skipper.html index e6c1df4a..a4f9a9af 100644 --- a/class_byte_skipper.html +++ b/class_byte_skipper.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ByteSkipper Class Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -208,7 +209,7 @@ Public Member Functions diff --git a/class_c_d_c_async_oper-members.html b/class_c_d_c_async_oper-members.html index 09c30429..24fa6cf2 100644 --- a/class_c_d_c_async_oper-members.html +++ b/class_c_d_c_async_oper-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -90,13 +91,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for CDCAsyncOper, including all inherited members.

    - +
    OnInit(ACM *pacm)=0CDCAsyncOperpure virtual
    OnInit(ACM *pacm)CDCAsyncOperinlinevirtual
    diff --git a/class_c_d_c_async_oper.html b/class_c_d_c_async_oper.html index 4242e0b9..1e175b78 100644 --- a/class_c_d_c_async_oper.html +++ b/class_c_d_c_async_oper.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: CDCAsyncOper Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -87,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Public Member Functions | List of all members
    -
    CDCAsyncOper Class Referenceabstract
    +
    CDCAsyncOper Class Reference
    @@ -95,14 +96,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - + +

    Public Member Functions

    virtual uint8_t OnInit (ACM *pacm)=0
     
    virtual uint8_t OnInit (ACM *pacm)
     

    Detailed Description

    Definition at line 128 of file cdcacm.h.

    Member Function Documentation

    - +
    @@ -119,11 +120,13 @@ Public Member Functions
    -pure virtual +inlinevirtual
    +

    Definition at line 131 of file cdcacm.h.

    +

    The documentation for this class was generated from the following file:
      @@ -134,7 +137,7 @@ Public Member Functions diff --git a/class_config_desc_parser-members.html b/class_config_desc_parser-members.html index 5540a595..cff30400 100644 --- a/class_config_desc_parser-members.html +++ b/class_config_desc_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_config_desc_parser.html b/class_config_desc_parser.html index a4a88143..a04ad44b 100644 --- a/class_config_desc_parser.html +++ b/class_config_desc_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK > Class Template Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,7 +114,7 @@ Public Member Functions    ConfigDescParser (UsbConfigXtracter *xtractor)   -virtual void Parse (const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) +void Parse (const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)  

    Detailed Description

    @@ -121,7 +122,7 @@ Public Member Functions class ConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK > -

    Definition at line 38 of file confdescparser.h.

    +

    Definition at line 40 of file confdescparser.h.

    Constructor & Destructor Documentation

    @@ -139,7 +140,7 @@ template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PRO
    -

    Definition at line 70 of file confdescparser.h.

    +

    Definition at line 72 of file confdescparser.h.

    @@ -168,7 +169,7 @@ template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PRO
    -

    Definition at line 62 of file confdescparser.h.

    +

    Definition at line 64 of file confdescparser.h.

    @@ -214,7 +215,7 @@ template<const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PRO

    Implements USBReadParser.

    -

    Definition at line 82 of file confdescparser.h.

    +

    Definition at line 84 of file confdescparser.h.

    @@ -226,7 +227,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 d500e5a6..6d67d32a 100644 --- a/class_config_desc_parser__coll__graph.md5 +++ b/class_config_desc_parser__coll__graph.md5 @@ -1 +1 @@ -e7881467fbeaf56de26bf3e709c6ae68 \ No newline at end of file +43e2ececa16e23c2ef0bb98404d9dd99 \ No newline at end of file diff --git a/class_config_desc_parser__inherit__graph.md5 b/class_config_desc_parser__inherit__graph.md5 index d500e5a6..6d67d32a 100644 --- a/class_config_desc_parser__inherit__graph.md5 +++ b/class_config_desc_parser__inherit__graph.md5 @@ -1 +1 @@ -e7881467fbeaf56de26bf3e709c6ae68 \ No newline at end of file +43e2ececa16e23c2ef0bb98404d9dd99 \ No newline at end of file diff --git a/class_f_t_d_i-members.html b/class_f_t_d_i-members.html index 92fc057b..a4cb666f 100644 --- a/class_f_t_d_i-members.html +++ b/class_f_t_d_i-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -91,27 +92,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for FTDI, including all inherited members.

    - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
    ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)FTDIvirtual
    FTDI(USB *pusb, FTDIAsyncOper *pasync)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)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual
    EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)FTDIvirtual
    FTDI(USB *pusb, FTDIAsyncOper *pasync)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
    diff --git a/class_f_t_d_i.html b/class_f_t_d_i.html index dba102aa..f55a8255 100644 --- a/class_f_t_d_i.html +++ b/class_f_t_d_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: FTDI Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -123,29 +124,31 @@ Public Member Functions   uint8_t SndData (uint16_t nbytes, uint8_t *dataptr)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   -virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) +void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)   +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) +  - Public Member Functions inherited from USBDeviceConfig virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)   virtual void ResetHubPort (uint8_t port)   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) + 

    Detailed Description

    -

    Definition at line 89 of file cdcftdi.h.

    +

    Definition at line 94 of file cdcftdi.h.

    Constructor & Destructor Documentation

    @@ -190,7 +193,7 @@ Public Member Functions
    -

    Definition at line 267 of file cdcftdi.cpp.

    +

    Definition at line 262 of file cdcftdi.cpp.

    @@ -208,7 +211,7 @@ Public Member Functions
    -

    Definition at line 304 of file cdcftdi.cpp.

    +

    Definition at line 299 of file cdcftdi.cpp.

    @@ -242,7 +245,7 @@ Public Member Functions
    -

    Definition at line 308 of file cdcftdi.cpp.

    +

    Definition at line 303 of file cdcftdi.cpp.

    @@ -260,7 +263,7 @@ Public Member Functions
    -

    Definition at line 312 of file cdcftdi.cpp.

    +

    Definition at line 307 of file cdcftdi.cpp.

    @@ -288,7 +291,7 @@ Public Member Functions
    -

    Definition at line 316 of file cdcftdi.cpp.

    +

    Definition at line 311 of file cdcftdi.cpp.

    @@ -316,7 +319,7 @@ Public Member Functions
    -

    Definition at line 320 of file cdcftdi.cpp.

    +

    Definition at line 315 of file cdcftdi.cpp.

    @@ -360,7 +363,7 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 41 of file cdcftdi.cpp.

    +

    Definition at line 39 of file cdcftdi.cpp.

    @@ -387,7 +390,7 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 242 of file cdcftdi.cpp.

    +

    Definition at line 237 of file cdcftdi.cpp.

    @@ -414,7 +417,7 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 252 of file cdcftdi.cpp.

    +

    Definition at line 247 of file cdcftdi.cpp.

    @@ -441,7 +444,7 @@ Public Member Functions

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 125 of file cdcftdi.h.

    +

    Definition at line 130 of file cdcftdi.h.

    @@ -495,9 +498,47 @@ Public Member Functions
    -

    Implements UsbConfigXtracter.

    +

    Reimplemented from UsbConfigXtracter.

    -

    Definition at line 215 of file cdcftdi.cpp.

    +

    Definition at line 210 of file cdcftdi.cpp.

    + +
    + + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    virtual bool FTDI::VIDPIDOK (uint16_t vid,
    uint16_t pid 
    )
    +
    +inlinevirtual
    +
    + +

    Reimplemented from USBDeviceConfig.

    + +

    Definition at line 137 of file cdcftdi.h.

    @@ -510,7 +551,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 76857971..8736ae0b 100644 --- a/class_f_t_d_i__coll__graph.md5 +++ b/class_f_t_d_i__coll__graph.md5 @@ -1 +1 @@ -e5e07d3721e783dff0d1e851b88878cf \ No newline at end of file +7639ae03a2a3c77cae9f7ef89dc8dcfd \ No newline at end of file diff --git a/class_f_t_d_i__inherit__graph.md5 b/class_f_t_d_i__inherit__graph.md5 index 76857971..8736ae0b 100644 --- a/class_f_t_d_i__inherit__graph.md5 +++ b/class_f_t_d_i__inherit__graph.md5 @@ -1 +1 @@ -e5e07d3721e783dff0d1e851b88878cf \ No newline at end of file +7639ae03a2a3c77cae9f7ef89dc8dcfd \ No newline at end of file diff --git a/class_f_t_d_i_async_oper-members.html b/class_f_t_d_i_async_oper-members.html index 7389ac60..18109746 100644 --- a/class_f_t_d_i_async_oper-members.html +++ b/class_f_t_d_i_async_oper-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -90,13 +91,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for FTDIAsyncOper, including all inherited members.

    - + +
    OnInit(FTDI *pftdi)=0FTDIAsyncOperpure virtual
    OnInit(FTDI *pftdi)FTDIAsyncOperinlinevirtual
    OnRelease(FTDI *pftdi)FTDIAsyncOperinlinevirtual
    diff --git a/class_f_t_d_i_async_oper.html b/class_f_t_d_i_async_oper.html index 4296113f..4c7289c1 100644 --- a/class_f_t_d_i_async_oper.html +++ b/class_f_t_d_i_async_oper.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: FTDIAsyncOper Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -87,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Public Member Functions | List of all members
    -
    FTDIAsyncOper Class Referenceabstract
    +
    FTDIAsyncOper Class Reference
    @@ -95,14 +96,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - + + + +

    Public Member Functions

    virtual uint8_t OnInit (FTDI *pftdi)=0
     
    virtual uint8_t OnInit (FTDI *pftdi)
     
    virtual uint8_t OnRelease (FTDI *pftdi)
     

    Detailed Description

    Definition at line 79 of file cdcftdi.h.

    Member Function Documentation

    - +
    @@ -119,11 +122,39 @@ Public Member Functions
    -pure virtual +inlinevirtual
    +

    Definition at line 82 of file cdcftdi.h.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + + +
    virtual uint8_t FTDIAsyncOper::OnRelease (FTDIpftdi)
    +
    +inlinevirtual
    +
    + +

    Definition at line 85 of file cdcftdi.h.

    +

    The documentation for this class was generated from the following file:
      @@ -134,7 +165,7 @@ Public Member Functions diff --git a/class_h_i_d-members.html b/class_h_i_d-members.html index 3838293c..d8110976 100644 --- a/class_h_i_d-members.html +++ b/class_h_i_d-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -92,40 +93,41 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    bAddressHIDprotected
    ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)=0UsbConfigXtracterpure virtual
    epInterruptInIndexHIDprotectedstatic
    epInterruptOutIndexHIDprotectedstatic
    GetAddress()USBDeviceConfiginlinevirtual
    GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID
    GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID
    GetProtocol(uint8_t iface, uint8_t *dataptr)HID
    GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID
    GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID
    GetReportParser(uint8_t id)HIDprotectedvirtual
    GetUsb()HIDinline
    HID(USB *pusb)HIDinline
    Init(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    maxEpPerInterfaceHIDprotectedstatic
    maxHidInterfacesHIDprotectedstatic
    Poll()USBDeviceConfiginlinevirtual
    PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)HIDprotected
    PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)HIDprotected
    pUsbHIDprotected
    Release()USBDeviceConfiginlinevirtual
    ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
    SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)HID
    SetProtocol(uint8_t iface, uint8_t protocol)HID
    SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID
    SetReportParser(uint8_t id, HIDReportParser *prs)HIDvirtual
    totalEndpointsHIDprotectedstatic
    VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual
    EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)UsbConfigXtracterinlinevirtual
    epInterruptInIndexHIDprotectedstatic
    epInterruptOutIndexHIDprotectedstatic
    GetAddress()USBDeviceConfiginlinevirtual
    GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID
    GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID
    GetProtocol(uint8_t iface, uint8_t *dataptr)HID
    GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID
    GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID
    GetReportParser(uint8_t id)HIDinlineprotectedvirtual
    GetUsb()HIDinline
    HID(USB *pusb)HIDinline
    Init(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    maxEpPerInterfaceHIDprotectedstatic
    maxHidInterfacesHIDprotectedstatic
    Poll()USBDeviceConfiginlinevirtual
    PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)HIDprotected
    PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)HIDprotected
    pUsbHIDprotected
    Release()USBDeviceConfiginlinevirtual
    ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
    SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)HID
    SetProtocol(uint8_t iface, uint8_t protocol)HID
    SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID
    SetReportParser(uint8_t id, HIDReportParser *prs)HIDinlinevirtual
    totalEndpointsHIDprotectedstatic
    VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    diff --git a/class_h_i_d.html b/class_h_i_d.html index 59636a40..dee501bb 100644 --- a/class_h_i_d.html +++ b/class_h_i_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HID Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -147,13 +148,15 @@ Public Member Functions   virtual void ResetHubPort (uint8_t port)   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) +  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  - Public Member Functions inherited from UsbConfigXtracter -virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)=0 -  +virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) +  @@ -284,13 +287,15 @@ Static Protected Attributes

    Protected Member Functions

    -protectedvirtual +inlineprotectedvirtual

    Reimplemented in HIDUniversal.

    +

    Definition at line 159 of file hid.h.

    +
    @@ -345,13 +350,15 @@ Static Protected Attributes -virtual +inlinevirtual

    Reimplemented in HIDBoot< BOOT_PROTOCOL >, and HIDUniversal.

    +

    Definition at line 170 of file hid.h.

    +
    @@ -806,7 +813,7 @@ Static Protected Attributes diff --git a/class_h_i_d__coll__graph.md5 b/class_h_i_d__coll__graph.md5 index b57fdbbe..e5576691 100644 --- a/class_h_i_d__coll__graph.md5 +++ b/class_h_i_d__coll__graph.md5 @@ -1 +1 @@ -95e144b588214fefcf1c4b3b9ba8f1c5 \ No newline at end of file +0bbaf00e03400d0290a9b287d0a16910 \ No newline at end of file diff --git a/class_h_i_d__inherit__graph.md5 b/class_h_i_d__inherit__graph.md5 index 8bfa03ac..ad197148 100644 --- a/class_h_i_d__inherit__graph.md5 +++ b/class_h_i_d__inherit__graph.md5 @@ -1 +1 @@ -6dd916998d818c6a4632c4e2d93efcaa \ No newline at end of file +f301a139f053cfea05fcf52a0b155296 \ No newline at end of file diff --git a/class_h_i_d_boot-members.html b/class_h_i_d_boot-members.html index 0e9ef2bb..558d0079 100644 --- a/class_h_i_d_boot-members.html +++ b/class_h_i_d_boot-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -92,20 +93,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -119,13 +122,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +
    bAddressHIDprotected
    ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)HIDBoot< BOOT_PROTOCOL >virtual
    epInterruptInIndexHIDprotectedstatic
    epInterruptOutIndexHIDprotectedstatic
    GetAddress()HIDBoot< BOOT_PROTOCOL >inlinevirtual
    GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID
    GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID
    GetProtocol(uint8_t iface, uint8_t *dataptr)HID
    GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID
    GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID
    GetUsb()HIDinline
    HID(USB *pusb)HIDinline
    HIDBoot(USB *p)HIDBoot< BOOT_PROTOCOL >
    Init(uint8_t parent, uint8_t port, bool lowspeed)HIDBoot< BOOT_PROTOCOL >virtual
    DEVCLASSOK(uint8_t klass)HIDBoot< BOOT_PROTOCOL >inlinevirtual
    DEVSUBCLASSOK(uint8_t subklass)HIDBoot< BOOT_PROTOCOL >inlinevirtual
    EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)HIDBoot< BOOT_PROTOCOL >virtual
    epInterruptInIndexHIDprotectedstatic
    epInterruptOutIndexHIDprotectedstatic
    GetAddress()HIDBoot< BOOT_PROTOCOL >inlinevirtual
    GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID
    GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID
    GetProtocol(uint8_t iface, uint8_t *dataptr)HID
    GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID
    GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID
    GetUsb()HIDinline
    HID(USB *pusb)HIDinline
    HIDBoot(USB *p)HIDBoot< BOOT_PROTOCOL >
    Init(uint8_t parent, uint8_t port, bool lowspeed)HIDBoot< BOOT_PROTOCOL >virtual
    isReady()HIDBoot< BOOT_PROTOCOL >inlinevirtual
    maxEpPerInterfaceHIDprotectedstatic
    maxHidInterfacesHIDprotectedstatic
    Poll()HIDBoot< BOOT_PROTOCOL >virtual
    SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID
    SetReportParser(uint8_t id, HIDReportParser *prs)HIDBoot< BOOT_PROTOCOL >inlinevirtual
    totalEndpointsHIDprotectedstatic
    VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    diff --git a/class_h_i_d_boot.html b/class_h_i_d_boot.html index 1faa2d75..13c38c0c 100644 --- a/class_h_i_d_boot.html +++ b/class_h_i_d_boot.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HIDBoot< BOOT_PROTOCOL > Class Template Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,16 +114,22 @@ Public Member Functions   virtual bool SetReportParser (uint8_t id, HIDReportParser *prs)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   +virtual bool isReady () +  virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)   +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  - Public Member Functions inherited from HID  HID (USB *pusb)   @@ -149,10 +156,8 @@ Public Member Functions   virtual void ResetHubPort (uint8_t port)   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) +  @@ -183,7 +188,7 @@ Additional Inherited Members class HIDBoot< BOOT_PROTOCOL > -

    Definition at line 179 of file hidboot.h.

    +

    Definition at line 199 of file hidboot.h.

    Constructor & Destructor Documentation

    @@ -201,7 +206,7 @@ template<const uint8_t BOOT_PROTOCOL>

    Additional Inherited Members

    -

    Definition at line 220 of file hidboot.h.

    +

    Definition at line 253 of file hidboot.h.

    @@ -242,7 +247,7 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from HID.

    -

    Definition at line 201 of file hidboot.h.

    +

    Definition at line 221 of file hidboot.h.

    @@ -288,7 +293,7 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 247 of file hidboot.h.

    +

    Definition at line 280 of file hidboot.h.

    @@ -317,7 +322,7 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 522 of file hidboot.h.

    +

    Definition at line 555 of file hidboot.h.

    @@ -346,7 +351,7 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 536 of file hidboot.h.

    +

    Definition at line 569 of file hidboot.h.

    @@ -375,7 +380,34 @@ template<const uint8_t BOOT_PROTOCOL>

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 211 of file hidboot.h.

    +

    Definition at line 231 of file hidboot.h.

    + + + + +
    +
    +
    +template<const uint8_t BOOT_PROTOCOL>
    + + + + + +
    + + + + + + + +
    virtual bool HIDBoot< BOOT_PROTOCOL >::isReady ()
    +
    +inlinevirtual
    +
    + +

    Definition at line 235 of file hidboot.h.

    @@ -431,9 +463,69 @@ template<const uint8_t BOOT_PROTOCOL>
    -

    Implements UsbConfigXtracter.

    +

    Reimplemented from UsbConfigXtracter.

    -

    Definition at line 498 of file hidboot.h.

    +

    Definition at line 531 of file hidboot.h.

    + +
    + + +
    +
    +
    +template<const uint8_t BOOT_PROTOCOL>
    + + + + + +
    + + + + + + + + +
    virtual bool HIDBoot< BOOT_PROTOCOL >::DEVCLASSOK (uint8_t klass)
    +
    +inlinevirtual
    +
    + +

    Reimplemented from USBDeviceConfig.

    + +

    Definition at line 243 of file hidboot.h.

    + +
    +
    + +
    +
    +
    +template<const uint8_t BOOT_PROTOCOL>
    + + + + + +
    + + + + + + + + +
    virtual bool HIDBoot< BOOT_PROTOCOL >::DEVSUBCLASSOK (uint8_t subklass)
    +
    +inlinevirtual
    +
    + +

    Reimplemented from USBDeviceConfig.

    + +

    Definition at line 247 of file hidboot.h.

    @@ -445,7 +537,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 d90f3b69..eaa3c1fb 100644 --- a/class_h_i_d_boot__coll__graph.md5 +++ b/class_h_i_d_boot__coll__graph.md5 @@ -1 +1 @@ -6920cfc35976940c341067e838cfc9bd \ No newline at end of file +bafdede624ab47c8361b847c10219b24 \ No newline at end of file diff --git a/class_h_i_d_boot__inherit__graph.md5 b/class_h_i_d_boot__inherit__graph.md5 index 630b7c89..089c865b 100644 --- a/class_h_i_d_boot__inherit__graph.md5 +++ b/class_h_i_d_boot__inherit__graph.md5 @@ -1 +1 @@ -eb02cf549973a15ded74b4d4aab3ce68 \ No newline at end of file +a12f8110be687fd6090103dc7c427109 \ No newline at end of file diff --git a/class_h_i_d_report_parser-members.html b/class_h_i_d_report_parser-members.html index 4e3c2c16..b60777de 100644 --- a/class_h_i_d_report_parser-members.html +++ b/class_h_i_d_report_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_h_i_d_report_parser.html b/class_h_i_d_report_parser.html index f6d4cbe6..060e4a1b 100644 --- a/class_h_i_d_report_parser.html +++ b/class_h_i_d_report_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HIDReportParser Class Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -165,7 +166,7 @@ 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 44e50d86..25b71fe2 100644 --- a/class_h_i_d_report_parser__inherit__graph.md5 +++ b/class_h_i_d_report_parser__inherit__graph.md5 @@ -1 +1 @@ -c82eb64e4e9d8248b32e0db32cbfa973 \ No newline at end of file +8be112e5d3300b51cf0649c53a258712 \ No newline at end of file diff --git a/class_h_i_d_universal-members.html b/class_h_i_d_universal-members.html index 8f1fa383..d7c5d8f3 100644 --- a/class_h_i_d_universal-members.html +++ b/class_h_i_d_universal-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -93,48 +94,50 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); bAddressHIDprotected bHasReportIdHIDUniversalprotected ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual - DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual - EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)HIDUniversalvirtual - epInfoHIDUniversalprotected - epInterruptInIndexHIDprotectedstatic - epInterruptOutIndexHIDprotectedstatic - GetAddress()HIDUniversalinlinevirtual - GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID - GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID - GetProtocol(uint8_t iface, uint8_t *dataptr)HID - GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID - GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID - GetReportParser(uint8_t id)HIDUniversalprotectedvirtual - GetUsb()HIDinline - HID(USB *pusb)HIDinline - hidInterfacesHIDUniversalprotected - HIDUniversal(USB *p)HIDUniversal - Init(uint8_t parent, uint8_t port, bool lowspeed)HIDUniversalvirtual - isReady()HIDUniversalinlinevirtual - maxEpPerInterfaceHIDprotectedstatic - maxHidInterfacesHIDprotectedstatic - OnInitSuccessful()HIDUniversalinlineprotectedvirtual - ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)HIDUniversalinlineprotectedvirtual - PIDHIDUniversalprotected - Poll()HIDUniversalvirtual - PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)HIDprotected - PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)HIDprotected - pUsbHIDprotected - Release()HIDUniversalvirtual - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)HID - SetProtocol(uint8_t iface, uint8_t protocol)HID - SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID - SetReportParser(uint8_t id, HIDReportParser *prs)HIDUniversalvirtual + DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)HIDUniversalvirtual + epInfoHIDUniversalprotected + epInterruptInIndexHIDprotectedstatic + epInterruptOutIndexHIDprotectedstatic + GetAddress()HIDUniversalinlinevirtual + GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID + GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID + GetProtocol(uint8_t iface, uint8_t *dataptr)HID + GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID + GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID + GetReportParser(uint8_t id)HIDUniversalprotectedvirtual + GetUsb()HIDinline + HID(USB *pusb)HIDinline + hidInterfacesHIDUniversalprotected + HIDUniversal(USB *p)HIDUniversal + Init(uint8_t parent, uint8_t port, bool lowspeed)HIDUniversalvirtual + isReady()HIDUniversalinlinevirtual + maxEpPerInterfaceHIDprotectedstatic + maxHidInterfacesHIDprotectedstatic + OnInitSuccessful()HIDUniversalinlineprotectedvirtual + ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)HIDUniversalinlineprotectedvirtual + PIDHIDUniversalprotected + Poll()HIDUniversalvirtual + PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)HIDprotected + PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)HIDprotected + pUsbHIDprotected + Release()HIDUniversalvirtual + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)HID + SetProtocol(uint8_t iface, uint8_t protocol)HID + SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID + SetReportParser(uint8_t id, HIDReportParser *prs)HIDUniversalvirtual + SndRpt(uint16_t nbytes, uint8_t *dataptr)HIDUniversal totalEndpointsHIDprotectedstatic VIDHIDUniversalprotected - VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual + VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    diff --git a/class_h_i_d_universal.html b/class_h_i_d_universal.html index 60e7df89..296af776 100644 --- a/class_h_i_d_universal.html +++ b/class_h_i_d_universal.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HIDUniversal Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -114,20 +115,22 @@ Collaboration diagram for HIDUniversal:
    Public Member Functions  HIDUniversal (USB *p)   -virtual bool SetReportParser (uint8_t id, HIDReportParser *prs) +bool SetReportParser (uint8_t id, HIDReportParser *prs)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   virtual bool isReady ()   -virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) +void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)   +uint8_t SndRpt (uint16_t nbytes, uint8_t *dataptr) +  - Public Member Functions inherited from HID  HID (USB *pusb)   @@ -154,14 +157,16 @@ Public Member Functions   virtual void ResetHubPort (uint8_t port)   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) +  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  - + @@ -571,10 +576,38 @@ Additional Inherited Members

    Protected Member Functions

    virtual HIDReportParserGetReportParser (uint8_t id)
    HIDReportParserGetReportParser (uint8_t id)
     
    virtual uint8_t OnInitSuccessful ()
     
    -

    Implements UsbConfigXtracter.

    +

    Reimplemented from UsbConfigXtracter.

    Definition at line 294 of file hiduniversal.cpp.

    +
    + + +
    +
    + + + + + + + + + + + + + + + + + + +
    uint8_t HIDUniversal::SndRpt (uint16_t nbytes,
    uint8_t * dataptr 
    )
    +
    + +

    Definition at line 423 of file hiduniversal.cpp.

    +

    Member Data Documentation

    @@ -697,7 +730,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 8b57cecf..aa7d2be9 100644 --- a/class_h_i_d_universal__coll__graph.md5 +++ b/class_h_i_d_universal__coll__graph.md5 @@ -1 +1 @@ -1437ba957c63d5d30a95779f4bc8d82e \ No newline at end of file +a460ad006dfb1d3b707394a29d3b88e7 \ No newline at end of file diff --git a/class_h_i_d_universal__inherit__graph.md5 b/class_h_i_d_universal__inherit__graph.md5 index 2f21b994..eaea3795 100644 --- a/class_h_i_d_universal__inherit__graph.md5 +++ b/class_h_i_d_universal__inherit__graph.md5 @@ -1 +1 @@ -e09792a51b247b4f11a36a8a6df5cb8b \ No newline at end of file +539835fca70173164746ed6947c2a429 \ No newline at end of file diff --git a/class_hex_dumper-members.html b/class_hex_dumper-members.html index 67ae5327..c0e29581 100644 --- a/class_hex_dumper-members.html +++ b/class_hex_dumper-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -92,13 +93,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +
    HexDumper()HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >inline
    Initialize()HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >inline
    Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >virtual
    Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >
    diff --git a/class_hex_dumper.html b/class_hex_dumper.html index f1e1acfa..902813ca 100644 --- a/class_hex_dumper.html +++ b/class_hex_dumper.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE > Class Template Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,15 +97,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Inheritance diagram for HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >:
    Inheritance graph
    - -
    [legend]
    Collaboration diagram for HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >:
    Collaboration graph
    - -
    [legend]
    - +

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

     
    void Initialize ()
     
    virtual void Parse (const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)
    void Parse (const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)
     

    Detailed Description

    @@ -183,9 +180,6 @@ template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE>
    template<class BASE_CLASS , class LEN_TYPE , class OFFSET_TYPE >
    - - - - - -
    @@ -211,11 +205,6 @@ template<class BASE_CLASS , class LEN_TYPE , class OFFSET_TYPE >
    void HexDumper< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >::Parse
    -
    -virtual

    Definition at line 43 of file hexdump.h.

    @@ -230,7 +219,7 @@ template<class BASE_CLASS , class LEN_TYPE , class OFFSET_TYPE >
    diff --git a/class_hex_dumper__coll__graph.md5 b/class_hex_dumper__coll__graph.md5 index 8c6445be..c9f3f213 100644 --- a/class_hex_dumper__coll__graph.md5 +++ b/class_hex_dumper__coll__graph.md5 @@ -1 +1 @@ -6b19c97018ed43d19b0cb24ee29f2b87 \ No newline at end of file +5be5e99ec5970ed3fe98ca3cc812cd40 \ No newline at end of file diff --git a/class_hex_dumper__inherit__graph.md5 b/class_hex_dumper__inherit__graph.md5 index 8c6445be..c9f3f213 100644 --- a/class_hex_dumper__inherit__graph.md5 +++ b/class_hex_dumper__inherit__graph.md5 @@ -1 +1 @@ -6b19c97018ed43d19b0cb24ee29f2b87 \ No newline at end of file +5be5e99ec5970ed3fe98ca3cc812cd40 \ No newline at end of file diff --git a/class_keyboard_report_parser-members.html b/class_keyboard_report_parser-members.html index 2e1d1582..c723ea7e 100644 --- a/class_keyboard_report_parser-members.html +++ b/class_keyboard_report_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,23 +97,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); getPadKeys()KeyboardReportParserinlineprotectedvirtual getSymKeysLo()KeyboardReportParserinlineprotectedvirtual getSymKeysUp()KeyboardReportParserinlineprotectedvirtual - HandleLockingKeys(HID *hid, uint8_t key)KeyboardReportParserprotectedvirtual + HandleLockingKeys(HID *hid, uint8_t key)KeyboardReportParserinlineprotectedvirtual kbdInfoKeyboardReportParser kbdLedsKeyboardReportParser - kbdLockingKeysKeyboardReportParserprotected + kbdLockingKeysKeyboardReportParserprotected KeyboardReportParser()KeyboardReportParserinline OemToAscii(uint8_t mod, uint8_t key)KeyboardReportParserprotected OnControlKeysChanged(uint8_t before, uint8_t after)KeyboardReportParserinlineprotectedvirtual OnKeyDown(uint8_t mod, uint8_t key)KeyboardReportParserinlineprotectedvirtual OnKeyUp(uint8_t mod, uint8_t key)KeyboardReportParserinlineprotectedvirtual Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)KeyboardReportParservirtual - prevStateKeyboardReportParserprotected + prevStateKeyboardReportParserprotected
    diff --git a/class_keyboard_report_parser.html b/class_keyboard_report_parser.html index 99b4b8c2..355d3454 100644 --- a/class_keyboard_report_parser.html +++ b/class_keyboard_report_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: KeyboardReportParser Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,15 +114,15 @@ Collaboration diagram for KeyboardReportParser:
    Public Member Functions  KeyboardReportParser ()   -virtual void Parse (HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) +void Parse (HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)   - - + + @@ -139,20 +140,20 @@ Protected Member Functions

    Protected Member Functions

    uint8_t OemToAscii (uint8_t mod, uint8_t key)
     
    virtual uint8_t HandleLockingKeys (HID *hid, uint8_t key)
     
    virtual uint8_t HandleLockingKeys (HID *hid, uint8_t key)
     
    virtual void OnControlKeysChanged (uint8_t before, uint8_t after)
     
    virtual void OnKeyDown (uint8_t mod, uint8_t key)
    - - - - - - - - - - - - - - + + + + + + + + + + + + + +

    Protected Attributes

    union {
       KBDINFO   kbdInfo
     
       uint8_t   bInfo [sizeof(KBDINFO)]
     
    prevState
     
    union {
       KBDLEDS   kbdLeds
     
       uint8_t   bLeds
     
    kbdLockingKeys
     
    union {
       KBDINFO   kbdInfo
     
       uint8_t   bInfo [sizeof(KBDINFO)]
     
    prevState
     
    union {
       KBDLEDS   kbdLeds
     
       uint8_t   bLeds
     
    kbdLockingKeys
     

    Detailed Description

    @@ -216,7 +217,7 @@ Protected Attributes
    -

    Definition at line 186 of file hidboot.cpp.

    +

    Definition at line 165 of file hidboot.cpp.

    @@ -270,7 +271,7 @@ Protected Attributes - +
    @@ -278,7 +279,7 @@ Protected Attributes +inlineprotectedvirtual
    - + @@ -297,12 +298,12 @@ Protected Attributes
    uint8_t KeyboardReportParser::HandleLockingKeys virtual uint8_t KeyboardReportParser::HandleLockingKeys ( HID hid,
    -protectedvirtual
    -

    Definition at line 160 of file hidboot.cpp.

    +

    Definition at line 151 of file hidboot.h.

    @@ -338,7 +339,7 @@ Protected Attributes
    -

    Definition at line 152 of file hidboot.h.

    +

    Definition at line 172 of file hidboot.h.

    @@ -374,7 +375,7 @@ Protected Attributes
    -

    Definition at line 155 of file hidboot.h.

    +

    Definition at line 175 of file hidboot.h.

    @@ -410,7 +411,7 @@ Protected Attributes
    -

    Definition at line 158 of file hidboot.h.

    +

    Definition at line 178 of file hidboot.h.

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

    Definition at line 161 of file hidboot.h.

    +

    Definition at line 181 of file hidboot.h.

    @@ -460,7 +461,7 @@ Protected Attributes
    -

    Definition at line 165 of file hidboot.h.

    +

    Definition at line 185 of file hidboot.h.

    @@ -485,7 +486,7 @@ Protected Attributes
    -

    Definition at line 169 of file hidboot.h.

    +

    Definition at line 189 of file hidboot.h.

    @@ -510,7 +511,7 @@ Protected Attributes
    -

    Definition at line 173 of file hidboot.h.

    +

    Definition at line 193 of file hidboot.h.

    @@ -543,7 +544,7 @@ Protected Attributes - +
    @@ -583,7 +584,7 @@ Protected Attributes - +
    @@ -604,7 +605,7 @@ Protected Attributes diff --git a/class_keyboard_report_parser__coll__graph.md5 b/class_keyboard_report_parser__coll__graph.md5 index dbd84d99..b3538af0 100644 --- a/class_keyboard_report_parser__coll__graph.md5 +++ b/class_keyboard_report_parser__coll__graph.md5 @@ -1 +1 @@ -de31ab1b6045c46c724624d2f45ecd22 \ No newline at end of file +bb7b1a74ec2625233c79c3d3448ef47a \ No newline at end of file diff --git a/class_keyboard_report_parser__inherit__graph.md5 b/class_keyboard_report_parser__inherit__graph.md5 index 4f094571..5b9658e5 100644 --- a/class_keyboard_report_parser__inherit__graph.md5 +++ b/class_keyboard_report_parser__inherit__graph.md5 @@ -1 +1 @@ -ea9cb8a4a1aab693a56a91401236d24e \ No newline at end of file +c874e74f72d0db473ce869577e6f92d6 \ No newline at end of file diff --git a/class_m_a_x3421e-members.html b/class_m_a_x3421e-members.html index 9e195fe9..3fbaa977 100644 --- a/class_m_a_x3421e-members.html +++ b/class_m_a_x3421e-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -111,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_m_a_x3421e.html b/class_m_a_x3421e.html index f1009de0..fddb42c3 100644 --- a/class_m_a_x3421e.html +++ b/class_m_a_x3421e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: MAX3421e< SPI_SS, INTR > Class Template Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -140,7 +141,7 @@ Public Member Functions class MAX3421e< SPI_SS, INTR > -

    Definition at line 86 of file usbhost.h.

    +

    Definition at line 109 of file usbhost.h.

    Constructor & Destructor Documentation

    @@ -157,7 +158,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 119 of file usbhost.h.

    +

    Definition at line 142 of file usbhost.h.

    @@ -188,7 +189,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 130 of file usbhost.h.

    +

    Definition at line 153 of file usbhost.h.

    @@ -224,7 +225,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 155 of file usbhost.h.

    +

    Definition at line 191 of file usbhost.h.

    @@ -244,7 +245,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 188 of file usbhost.h.

    +

    Definition at line 240 of file usbhost.h.

    @@ -264,7 +265,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 197 of file usbhost.h.

    +

    Definition at line 249 of file usbhost.h.

    @@ -300,7 +301,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 223 of file usbhost.h.

    +

    Definition at line 283 of file usbhost.h.

    @@ -319,7 +320,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 264 of file usbhost.h.

    +

    Definition at line 341 of file usbhost.h.

    @@ -338,7 +339,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 275 of file usbhost.h.

    +

    Definition at line 352 of file usbhost.h.

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

    Definition at line 289 of file usbhost.h.

    +

    Definition at line 366 of file usbhost.h.

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

    Definition at line 326 of file usbhost.h.

    +

    Definition at line 403 of file usbhost.h.

    @@ -405,7 +406,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 101 of file usbhost.h.

    +

    Definition at line 124 of file usbhost.h.

    @@ -433,7 +434,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 105 of file usbhost.h.

    +

    Definition at line 128 of file usbhost.h.

    @@ -452,7 +453,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 370 of file usbhost.h.

    +

    Definition at line 447 of file usbhost.h.

    @@ -488,7 +489,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 424 of file usbhost.h.

    +

    Definition at line 501 of file usbhost.h.

    @@ -508,7 +509,7 @@ template<typename SPI_SS , typename INTR >
    -

    Definition at line 405 of file usbhost.h.

    +

    Definition at line 482 of file usbhost.h.

    @@ -520,7 +521,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 9c6ebd2d..e9dc0389 100644 --- a/class_m_a_x3421e__inherit__graph.md5 +++ b/class_m_a_x3421e__inherit__graph.md5 @@ -1 +1 @@ -77bb5e0b002d7306a86fd50983493adb \ No newline at end of file +6b7dcdcf5b00fbf00c69a08de5fc301c \ No newline at end of file diff --git a/class_max___l_c_d-members.html b/class_max___l_c_d-members.html index f1de51d5..879f828a 100644 --- a/class_max___l_c_d-members.html +++ b/class_max___l_c_d-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -110,13 +111,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); scrollDisplayLeft()Max_LCD scrollDisplayRight()Max_LCD setCursor(uint8_t, uint8_t)Max_LCD - write(uint8_t)Max_LCDinlinevirtual + write(uint8_t)Max_LCDinline
    diff --git a/class_max___l_c_d.html b/class_max___l_c_d.html index 8d360eff..9f899c7a 100644 --- a/class_max___l_c_d.html +++ b/class_max___l_c_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Max_LCD Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -96,15 +97,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Inheritance diagram for Max_LCD:
    Inheritance graph
    - -
    [legend]
    Collaboration diagram for Max_LCD:
    Collaboration graph
    - -
    [legend]
    - +

    @@ -149,7 +146,7 @@ Public Member Functions

     
    void command (uint8_t)
     
    virtual size_t write (uint8_t)
    size_t write (uint8_t)
     

    Detailed Description

    @@ -569,7 +566,7 @@ Public Member Functions -inlinevirtual +inline
    @@ -587,7 +584,7 @@ Public Member Functions diff --git a/class_max___l_c_d__coll__graph.md5 b/class_max___l_c_d__coll__graph.md5 index 687ddba5..8d049f39 100644 --- a/class_max___l_c_d__coll__graph.md5 +++ b/class_max___l_c_d__coll__graph.md5 @@ -1 +1 @@ -25074a74d69adb1d486aa8133e08ae69 \ No newline at end of file +14cf14911886c71d7e91596c82a5010c \ No newline at end of file diff --git a/class_max___l_c_d__inherit__graph.md5 b/class_max___l_c_d__inherit__graph.md5 index 687ddba5..8d049f39 100644 --- a/class_max___l_c_d__inherit__graph.md5 +++ b/class_max___l_c_d__inherit__graph.md5 @@ -1 +1 @@ -25074a74d69adb1d486aa8133e08ae69 \ No newline at end of file +14cf14911886c71d7e91596c82a5010c \ No newline at end of file diff --git a/class_mouse_report_parser-members.html b/class_mouse_report_parser-members.html index ca74649e..25f2e94c 100644 --- a/class_mouse_report_parser-members.html +++ b/class_mouse_report_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -105,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_mouse_report_parser.html b/class_mouse_report_parser.html index d944a1e0..b9be913f 100644 --- a/class_mouse_report_parser.html +++ b/class_mouse_report_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: MouseReportParser Class Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -110,7 +111,7 @@ Collaboration diagram for MouseReportParser:
    - +

    Public Member Functions

    virtual void Parse (HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    void Parse (HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
     
    diff --git a/class_mouse_report_parser__coll__graph.md5 b/class_mouse_report_parser__coll__graph.md5 index f830f24d..0d410a43 100644 --- a/class_mouse_report_parser__coll__graph.md5 +++ b/class_mouse_report_parser__coll__graph.md5 @@ -1 +1 @@ -53fbe637398f71f4437285858e2dc022 \ No newline at end of file +405a7d8e938e10b74a7c678fcf2f2523 \ No newline at end of file diff --git a/class_mouse_report_parser__inherit__graph.md5 b/class_mouse_report_parser__inherit__graph.md5 index 621cb958..6dbeddc2 100644 --- a/class_mouse_report_parser__inherit__graph.md5 +++ b/class_mouse_report_parser__inherit__graph.md5 @@ -1 +1 @@ -7e59901244ab319897b579870a1fbeaf \ No newline at end of file +06cbf9c7fbacf4aaec1bcdfdc9d69628 \ No newline at end of file diff --git a/class_multi_byte_value_parser-members.html b/class_multi_byte_value_parser-members.html index 0df75f24..62018755 100644 --- a/class_multi_byte_value_parser-members.html +++ b/class_multi_byte_value_parser-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@

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

    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -99,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_multi_byte_value_parser.html b/class_multi_byte_value_parser.html index a22e1879..d1fd3335 100644 --- a/class_multi_byte_value_parser.html +++ b/class_multi_byte_value_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: MultiByteValueParser Class Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -222,7 +223,7 @@ Public Member Functions diff --git a/class_p_l2303-members.html b/class_p_l2303-members.html index 94fdd3e7..31a49975 100644 --- a/class_p_l2303-members.html +++ b/class_p_l2303-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -90,17 +91,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for PL2303, including all inherited members.

    - - - - - - - - - - + + + + + + + + + + + + + + + + + + @@ -109,30 +118,32 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
    ACM(USB *pusb, CDCAsyncOper *pasync)ACM
    bAddressACMprotected
    bConfNumACMprotected
    bControlIfaceACMprotected
    bDataIfaceACMprotected
    bNumEPACMprotected
    bPollEnableACMprotected
    ClearCommFeature(uint16_t fid)ACM
    ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    _enhanced_statusACMprotected
    ACM(USB *pusb, CDCAsyncOper *pasync)ACM
    autoflowDSR(bool s)ACMinlinevirtual
    autoflowRTS(bool s)ACMinlinevirtual
    autoflowXON(bool s)ACMinlinevirtual
    available(void)ACMinline
    bAddressACMprotected
    bConfNumACMprotected
    bControlIfaceACMprotected
    bDataIfaceACMprotected
    bNumEPACMprotected
    bPollEnableACMprotected
    ClearCommFeature(uint16_t fid)ACM
    ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
    DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
    DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual
    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
    GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM
    GetLineCoding(LINE_CODING *dataptr)ACM
    GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr)ACM
    Init(uint8_t parent, uint8_t port, bool lowspeed)PL2303virtual
    isReady()ACMinlinevirtual
    pAsyncACMprotected
    PL2303(USB *pusb, CDCAsyncOper *pasync)PL2303
    Poll()ACMvirtual
    PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)ACMprotected
    pUsbACMprotected
    qNextPollTimeACMprotected
    RcvData(uint16_t *nbytesptr, uint8_t *dataptr)ACM
    readyACMprotected
    Release()ACMvirtual
    ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
    SendBreak(uint16_t duration)ACM
    SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM
    SetControlLineState(uint8_t state)ACM
    SetLineCoding(const LINE_CODING *dataptr)ACM
    SndData(uint16_t nbytes, uint8_t *dataptr)ACM
    VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    half_duplex(bool s)ACMinlinevirtual
    Init(uint8_t parent, uint8_t port, bool lowspeed)PL2303virtual
    isReady()ACMinlinevirtual
    pAsyncACMprotected
    PL2303(USB *pusb, CDCAsyncOper *pasync)PL2303
    Poll()ACMvirtual
    PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)ACMprotected
    pUsbACMprotected
    qNextPollTimeACMprotected
    RcvData(uint16_t *nbytesptr, uint8_t *dataptr)ACM
    readyACMprotected
    Release()ACMvirtual
    ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
    SendBreak(uint16_t duration)ACM
    SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM
    SetControlLineState(uint8_t state)ACM
    SetLineCoding(const LINE_CODING *dataptr)ACM
    SndData(uint16_t nbytes, uint8_t *dataptr)ACM
    VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
    wide(bool s)ACMinlinevirtual
    diff --git a/class_p_l2303.html b/class_p_l2303.html index 2a24e0ed..3bc9a5cd 100644 --- a/class_p_l2303.html +++ b/class_p_l2303.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PL2303 Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,14 +105,14 @@ Collaboration diagram for PL2303:
    Collaboration graph
    - +
    [legend]
    - + @@ -136,25 +137,43 @@ Public Member Functions - + - + + + - + + + + + + + + + + + + + + + - - - - + + + + + +

    Public Member Functions

     PL2303 (USB *pusb, CDCAsyncOper *pasync)
     
    virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)
    uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)
     
    - Public Member Functions inherited from ACM
     ACM (USB *pusb, CDCAsyncOper *pasync)
     
    uint8_t SndData (uint16_t nbytes, uint8_t *dataptr)
     
    virtual uint8_t Release ()
    uint8_t Release ()
     
    virtual uint8_t Poll ()
    uint8_t Poll ()
     
    bool available (void)
     
    virtual uint8_t GetAddress ()
     
    virtual bool isReady ()
     
    virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    virtual tty_features enhanced_status (void)
     
    virtual tty_features enhanced_features (void)
     
    virtual void autoflowRTS (bool s)
     
    virtual void autoflowDSR (bool s)
     
    virtual void autoflowXON (bool s)
     
    virtual void half_duplex (bool s)
     
    virtual void wide (bool s)
     
    void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
     
    - Public Member Functions inherited from USBDeviceConfig
    virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)
     
    virtual void ResetHubPort (uint8_t port)
     
    virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid)
     
    virtual boolean DEVCLASSOK (uint8_t klass)
     
    virtual bool VIDPIDOK (uint16_t vid, uint16_t pid)
     
    virtual bool DEVCLASSOK (uint8_t klass)
     
    virtual bool DEVSUBCLASSOK (uint8_t subklass)
     
    @@ -178,10 +197,12 @@ Additional Inherited Members - - - - + + + + + + @@ -194,7 +215,7 @@ Additional Inherited Members

    Additional Inherited Members

     
    uint32_t qNextPollTime
     
    bool bPollEnable
     
    bool ready
     
    volatile bool bPollEnable
     
    volatile bool ready
     
    tty_features _enhanced_status
     
    EpInfo epInfo [ACM_MAX_ENDPOINTS]
     
    - Static Protected Attributes inherited from ACM

    Detailed Description

    -

    Definition at line 118 of file cdcprolific.h.

    +

    Definition at line 119 of file cdcprolific.h.

    Constructor & Destructor Documentation

    @@ -278,7 +299,7 @@ Additional Inherited Members diff --git a/class_p_l2303__coll__graph.map b/class_p_l2303__coll__graph.map index 2f7f8d7d..abad38d3 100644 --- a/class_p_l2303__coll__graph.map +++ b/class_p_l2303__coll__graph.map @@ -1,9 +1,10 @@ - + + diff --git a/class_p_l2303__coll__graph.md5 b/class_p_l2303__coll__graph.md5 index 2bbe6b6f..3fccb2c3 100644 --- a/class_p_l2303__coll__graph.md5 +++ b/class_p_l2303__coll__graph.md5 @@ -1 +1 @@ -c150bc00ab8cc2b5946563b5a0ecbb7e \ No newline at end of file +da3590f8b39ab5267484ef72f2899a2c \ No newline at end of file diff --git a/class_p_l2303__coll__graph.png b/class_p_l2303__coll__graph.png index e9a710f719e7b394fa6867b7fac787a8a6488bff..fec05578fd9a8ad768ab3998458bd8eab7ab9699 100644 GIT binary patch literal 26973 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 literal 23422 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 - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -90,8 +91,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for PS3BT, including all inherited members.

    - - + + + + @@ -103,16 +106,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - + + + + + + + + + - - + + @@ -127,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s3_b_t.html b/class_p_s3_b_t.html index 2ff3c550..59c3a777 100644 --- a/class_p_s3_b_t.html +++ b/class_p_s3_b_t.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: PS3BT Class Reference + @@ -31,7 +32,7 @@
    ACLData(uint8_t *ACLData)PS3BTvirtual
    attachOnInit(void(*funcOnInit)(void))PS3BTinline
    ACLData(uint8_t *ACLData)PS3BTprotectedvirtual
    attachOnInit(void(*funcOnInit)(void))BluetoothServiceinline
    BluetoothService(BTD *p)BluetoothServiceinline
    checkHciHandle(uint8_t *buf, uint16_t handle)BluetoothServiceinlineprotected
    disconnect()PS3BTvirtual
    get9DOFValues(SensorEnum a)PS3BT
    getAnalogButton(ButtonEnum a)PS3BT
    getSensor(SensorEnum a)PS3BT
    getStatus(StatusEnum c)PS3BT
    getTemperature()PS3BT
    moveSetBulb(uint8_t r, uint8_t g, uint8_t b)PS3BT
    moveSetBulb(ColorsEnum color)PS3BT
    moveSetRumble(uint8_t rumble)PS3BT
    hci_handleBluetoothServiceprotected
    identifierBluetoothServiceprotected
    l2cap_event_flagBluetoothServiceprotected
    moveSetBulb(uint8_t r, uint8_t g, uint8_t b)PS3BT
    moveSetBulb(ColorsEnum color)PS3BT
    moveSetRumble(uint8_t rumble)PS3BT
    onInit()PS3BTprotectedvirtual
    pBtdBluetoothServiceprotected
    pFuncOnInitBluetoothServiceprotected
    printStatusString()PS3BT
    PS3BT(BTD *pBtd, uint8_t btadr5=0, uint8_t btadr4=0, uint8_t btadr3=0, uint8_t btadr2=0, uint8_t btadr1=0, uint8_t btadr0=0)PS3BT
    PS3ConnectedPS3BT
    PS3MoveConnectedPS3BT
    PS3NavigationConnectedPS3BT
    Reset()PS3BTvirtual
    Run()PS3BTvirtual
    Reset()PS3BTprotectedvirtual
    Run()PS3BTprotectedvirtual
    setAllOff()PS3BT
    setLedOff()PS3BTinline
    setLedOff(LEDEnum a)PS3BT
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -105,22 +106,13 @@ Collaboration diagram for PS3BT:
    Collaboration graph
    - +
    [legend]
    - + - - - - - - - - - @@ -168,8 +160,11 @@ Public Member Functions - - + + + + +

    Public Member Functions

     PS3BT (BTD *pBtd, uint8_t btadr5=0, uint8_t btadr4=0, uint8_t btadr3=0, uint8_t btadr2=0, uint8_t btadr1=0, uint8_t btadr0=0)
     PS3BT (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)
     
    BluetoothService implementation
    virtual void ACLData (uint8_t *ACLData)
     
    virtual void Run ()
     
    virtual void Reset ()
     
    virtual void disconnect ()
     
    PS3 Controller functions
    bool getButtonPress (ButtonEnum b)
     
     
    uint32_t getLastMessageTime ()
     
    void attachOnInit (void(*funcOnInit)(void))
     
    - Public Member Functions inherited from BluetoothService
     BluetoothService (BTD *p)
     
    void attachOnInit (void(*funcOnInit)(void))
     
    @@ -179,6 +174,36 @@ Public Attributes +

    Public Attributes

     
    bool PS3NavigationConnected
     
    + + + + + + + + + + + +

    +BluetoothService implementation

    void disconnect ()
     
    void ACLData (uint8_t *ACLData)
     
    void Run ()
     
    void Reset ()
     
    void onInit ()
     
    + + + + + + + + + + + + + + +

    +Additional Inherited Members

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

    Detailed Description

    This BluetoothService class implements support for all the official PS3 Controllers: Dualshock 3, Navigation or a Motion controller via Bluetooth.

    @@ -252,96 +277,6 @@ Public Attributes

    Member Function Documentation

    - -
    -
    - - - - - -
    - - - - - - - - -
    void PS3BT::ACLData (uint8_t * ACLData)
    -
    -virtual
    -
    -

    Used to pass acldata to the services.

    Parameters
    - - -
    ACLDataIncoming acldata.
    -
    -
    - -

    Reimplemented from BluetoothService.

    - -

    Definition at line 227 of file PS3BT.cpp.

    - -
    -
    - -
    -
    - - - - - -
    - - - - - - - -
    void PS3BT::Run ()
    -
    -virtual
    -
    -

    Used to run part of the state machine.

    - -

    Reimplemented from BluetoothService.

    - -

    Definition at line 458 of file PS3BT.cpp.

    - -
    -
    - -
    -
    - - - - - -
    - - - - - - - -
    void PS3BT::Reset ()
    -
    -virtual
    -
    -

    Use this to reset the service.

    - -

    Reimplemented from BluetoothService.

    - -

    Definition at line 207 of file PS3BT.cpp.

    - -
    -
    @@ -364,9 +299,9 @@ Public Attributes

    Used this to disconnect any of the controllers.

    -

    Reimplemented from BluetoothService.

    +

    Implements BluetoothService.

    -

    Definition at line 220 of file PS3BT.cpp.

    +

    Definition at line 217 of file PS3BT.cpp.

    @@ -393,7 +328,7 @@ Public 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 52 of file PS3BT.cpp.

    +

    Definition at line 49 of file PS3BT.cpp.

    @@ -420,7 +355,7 @@ Public 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 56 of file PS3BT.cpp.

    +

    Definition at line 53 of file PS3BT.cpp.

    @@ -445,7 +380,7 @@ Public Attributes
    Returns
    Analog value in the range of 0-255.
    -

    Definition at line 63 of file PS3BT.cpp.

    +

    Definition at line 60 of file PS3BT.cpp.

    @@ -470,7 +405,7 @@ Public Attributes
    Returns
    Return the analog value in the range of 0-255.
    -

    Definition at line 67 of file PS3BT.cpp.

    +

    Definition at line 64 of file PS3BT.cpp.

    @@ -495,7 +430,7 @@ Public Attributes
    Returns
    Return the raw sensor value.
    -

    Definition at line 71 of file PS3BT.cpp.

    +

    Definition at line 68 of file PS3BT.cpp.

    @@ -520,7 +455,7 @@ Public Attributes
    Returns
    Return the angle in the range of 0-360.
    -

    Definition at line 88 of file PS3BT.cpp.

    +

    Definition at line 85 of file PS3BT.cpp.

    @@ -545,7 +480,7 @@ Public Attributes
    Returns
    The value in SI units.
    -

    Definition at line 115 of file PS3BT.cpp.

    +

    Definition at line 112 of file PS3BT.cpp.

    @@ -570,7 +505,7 @@ Public Attributes
    Returns
    True if correct and false if not.
    -

    Definition at line 159 of file PS3BT.cpp.

    +

    Definition at line 156 of file PS3BT.cpp.

    @@ -588,7 +523,7 @@ Public Attributes

    Read all the available statuses from the controller and prints it as a nice formated string.

    -

    Definition at line 163 of file PS3BT.cpp.

    +

    Definition at line 160 of file PS3BT.cpp.

    @@ -606,7 +541,7 @@ Public Attributes

    Read the temperature from the Move controller.

    Returns
    The temperature in degrees Celsius.
    -

    Definition at line 144 of file PS3BT.cpp.

    +

    Definition at line 141 of file PS3BT.cpp.

    @@ -624,7 +559,7 @@ Public Attributes

    Used to set all LEDs and rumble off.

    -

    Definition at line 523 of file PS3BT.cpp.

    +

    Definition at line 519 of file PS3BT.cpp.

    @@ -642,7 +577,7 @@ Public Attributes

    Turn off rumble.

    -

    Definition at line 534 of file PS3BT.cpp.

    +

    Definition at line 530 of file PS3BT.cpp.

    @@ -666,7 +601,7 @@ Public Attributes -

    Definition at line 543 of file PS3BT.cpp.

    +

    Definition at line 539 of file PS3BT.cpp.

    @@ -715,7 +650,7 @@ Public Attributes -

    Definition at line 552 of file PS3BT.cpp.

    +

    Definition at line 548 of file PS3BT.cpp.

    @@ -739,7 +674,7 @@ Public Attributes -

    Definition at line 560 of file PS3BT.cpp.

    +

    Definition at line 556 of file PS3BT.cpp.

    @@ -765,7 +700,7 @@ Public Attributes

    Turn all LEDs off.

    -

    Definition at line 147 of file PS3BT.h.

    +

    Definition at line 138 of file PS3BT.h.

    @@ -789,7 +724,7 @@ Public Attributes -

    Definition at line 565 of file PS3BT.cpp.

    +

    Definition at line 561 of file PS3BT.cpp.

    @@ -813,7 +748,7 @@ Public Attributes -

    Definition at line 570 of file PS3BT.cpp.

    +

    Definition at line 566 of file PS3BT.cpp.

    @@ -837,7 +772,7 @@ Public Attributes -

    Definition at line 579 of file PS3BT.cpp.

    +

    Definition at line 575 of file PS3BT.cpp.

    @@ -877,7 +812,7 @@ Public Attributes -

    Definition at line 605 of file PS3BT.cpp.

    +

    Definition at line 601 of file PS3BT.cpp.

    @@ -901,7 +836,7 @@ Public Attributes -

    Definition at line 614 of file PS3BT.cpp.

    +

    Definition at line 610 of file PS3BT.cpp.

    @@ -925,7 +860,7 @@ Public Attributes -

    Definition at line 618 of file PS3BT.cpp.

    +

    Definition at line 614 of file PS3BT.cpp.

    @@ -951,11 +886,11 @@ Public Attributes

    Used to get the millis() of the last message

    -

    Definition at line 183 of file PS3BT.h.

    +

    Definition at line 174 of file PS3BT.h.

    - +
    @@ -963,27 +898,113 @@ Public Attributes +protectedvirtual
    - + - - + +
    void PS3BT::attachOnInit void PS3BT::ACLData (void(*)(void) funcOnInit)uint8_t * ACLData)
    -inline
    -

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

    Parameters
    +

    Used to pass acldata to the services.

    Parameters
    - +
    funcOnInitFunction to call.
    ACLDataIncoming acldata.
    -

    Definition at line 191 of file PS3BT.h.

    +

    Implements BluetoothService.

    + +

    Definition at line 224 of file PS3BT.cpp.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void PS3BT::Run ()
    +
    +protectedvirtual
    +
    +

    Used to run part of the state machine.

    + +

    Implements BluetoothService.

    + +

    Definition at line 454 of file PS3BT.cpp.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void PS3BT::Reset ()
    +
    +protectedvirtual
    +
    +

    Use this to reset the service.

    + +

    Implements BluetoothService.

    + +

    Definition at line 204 of file PS3BT.cpp.

    + +
    +
    + +
    +
    + + + + + +
    + + + + + + + +
    void PS3BT::onInit ()
    +
    +protectedvirtual
    +
    +

    Called when the controller is successfully initialized. Use attachOnInit(void (*funcOnInit)(void)) to call your own function. This is useful for instance if you want to set the LEDs in a specific way.

    + +

    Implements BluetoothService.

    + +

    Definition at line 625 of file PS3BT.cpp.

    @@ -999,7 +1020,7 @@ Public Attributes

    Variable used to indicate if the normal Playstation controller is successfully connected.

    -

    Definition at line 193 of file PS3BT.h.

    +

    Definition at line 176 of file PS3BT.h.

    @@ -1014,7 +1035,7 @@ Public Attributes

    Variable used to indicate if the Move controller is successfully connected.

    -

    Definition at line 199 of file PS3BT.h.

    +

    Definition at line 182 of file PS3BT.h.

    @@ -1029,7 +1050,7 @@ Public Attributes

    Variable used to indicate if the Navigation controller is successfully connected.

    -

    Definition at line 201 of file PS3BT.h.

    +

    Definition at line 184 of file PS3BT.h.

    @@ -1042,7 +1063,7 @@ Public Attributes diff --git a/class_p_s3_b_t__coll__graph.map b/class_p_s3_b_t__coll__graph.map index 88ec45a6..2fe4b216 100644 --- a/class_p_s3_b_t__coll__graph.map +++ b/class_p_s3_b_t__coll__graph.map @@ -1,3 +1,9 @@ - + + + + + + + diff --git a/class_p_s3_b_t__coll__graph.md5 b/class_p_s3_b_t__coll__graph.md5 index 12c7deaf..9944a07a 100644 --- a/class_p_s3_b_t__coll__graph.md5 +++ b/class_p_s3_b_t__coll__graph.md5 @@ -1 +1 @@ -06c1c66f64f4c39618a1d5ab9446b806 \ No newline at end of file +7cded78e6e9cacc4756734b2d8e3a17f \ No newline at end of file diff --git a/class_p_s3_b_t__coll__graph.png b/class_p_s3_b_t__coll__graph.png index 8cad5dca7ac0bce7da7070e3a39f2e976f9e0257..fafb7c64f54caa906f46b2905aefd2e9e1d44770 100644 GIT binary patch literal 22820 zcmeFZWm_Cwv@MD>(0Jo+!QF$qySuwY@ZfGCxCM8IAVC7b-CcqN4KBf5Z}Dc|ea??K z&(nM;x~qE0TvNszqa#$6Wl)g_k)WWUP~~JL)uEuEyMaF&Fg)-d?jbpRC@4`VIY}{1 z59q&H2tL?S4+A-I5U-QA2relv3{`04T$pOvI&xDnQPB6u(uJ#rf;UJD&=?rT5J*zF z=6>53*L`Y;?C+Pyuou!41(u%*RY%89I~PAKM~;$Cj>b7BIGKmpqU6M7V5mf2U-5F} z6!M7TlpGi1hKW#!alk8}cb6Q5Ne=z``fLe<9TIPNKPvF=Emg=l_5ZwM3&W0)FnZQ!4?Fb3ML9nO2Q_&x!j+DgI&Bs77V_-*nQVOG&E$!Xj36Q zDlA^{6=g>1zmY>Qfq_wUjmpXffPmLG`GBCwa_Sz}`2Xe*5&{KhCdljbXcijF#_Ki7oG-&+D?YukwVKhrXCx?vJ zQ8cI8@TYoChJSw)fkhI%22C=#p!;zq1{RjZXgarocQ8bn(8T9V%D3I;&bdG$98F); z3o8V2y6A)*V!WSaLzd@txCadDNDiuaKrT_;q3nxGQGC(Rx9_UFefCtol_I9zrVJs-~ouK22Yx+E7%RLJHrt#q^CL{jCHNej#$Fo0u z(!gIdU@!+sqynE5Gst*8E~iRU5(|0Nt5s+-|5ZWcugrUTIO(u+UTF9A{vh1k5qx*(|s7`kFWzW#Uc!^uwb^N0B-3R;R}#X$ZnNOFgnViIVQGZTH-M=zL0f%H5;$&>NHU#$`6Bt`t@ejw7o&+IC|LLB=Z6zb5o%RV@2DGJighjNbNE-M z6Y^P9n_JvAXt>ojiBV@{Wn^T{UFH)L0{OMYiXgju(RJ_WN?-fwPUCa5u>0 zx!2W!6*i;x=`(zKGyORC;cU7k{N0-GO_r%8-H!lu8s&)S=s7dfX@Pr~shrOkS@?Nh zEU4cXSq>$5ISW>ylL-qdWoF~$mNCqfmeOODeKbpG$BZef@)WRJs4+`7*t6*c`8OY7 ztoOGrZVr^l1%O~gp{ykp=>yoB|Ni(512I1h;&t7NGhLVO`+_4ihKFJ-361926$Izi zM_9y+tk~en0&{jm>H2*g`oE=9hU%VBhGDxPodb zF9ebYex?x>!=LJ#82uL@9cxhjduIgF$py<@GRd*;q%QvU!_rpa5r~U5Qy4=v6D10W zcZ{GK4isr~bK4Fh!_`(dDh3AW@vMsvq`5ffp*YU7*J}G8!S6#aL+Me0duUFhz5(OOC=a8 z$Ob4OQDasauY#JLT`wUa0XY4?-eK8=SbTT8rU!p8@=*j9LbMc-Nx$AGLvqZ6)mSlZ z&F}a7?DGy(L{-RA&19-2CVAi~MylW)s}*LOp__T`=++QpPYQW|<_DM*1`Lh1<`>&s3|H^0eJ}yxRdGN!#Mfz)M6qOT%OQKbQulcp4bC9ZCC~$?+nz_ zq{gU3DGi%lOY{kLzj;Qye2@g@D;?Tbm;m^Z*iP1tZ&*EStu*8^F?4BfKSa+zw3-gA10AZW77=F}^^CS<_OOHZ*9`M)Oh@Sg64qvzq_>Our9ADMI$4Rn-M=C@} zi^GV^$$Hj-3I;w;gpHX9Jl0eQCK%qg`iE&V-Ddw)gYlo#H~!$>8Lk6#mV4^|4A7An z*wz6YdQQpzGM{yH;L_iAiuFG;4cG*$Linp>(I{v`ry+owntC0kNh+p^HNopA7 zUs`l40bG*lUn=~25HB$G7)EvL q?IZ&(pC|K8{yk^_BbVIOFrGu=U(WOl$tAxG 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 m? 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 literal 3995 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 - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -93,51 +94,52 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); attachOnInit(void(*funcOnInit)(void))PS3USBinline bAddressPS3USBprotected ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual - DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual - epInfoPS3USBprotected - GetAddress()PS3USBinlinevirtual - getAnalogButton(ButtonEnum a)PS3USB - getAnalogHat(AnalogHatEnum a)PS3USB - getAngle(AngleEnum a)PS3USB - getBdaddr(uint8_t *bdaddr)PS3USB - getButtonClick(ButtonEnum b)PS3USB - getButtonPress(ButtonEnum b)PS3USB - getMoveBdaddr(uint8_t *bdaddr)PS3USB - getMoveCalibration(uint8_t *data)PS3USB - getSensor(SensorEnum a)PS3USB - getStatus(StatusEnum c)PS3USB - Init(uint8_t parent, uint8_t port, bool lowspeed)PS3USBvirtual - isReady()PS3USBinlinevirtual - moveSetBulb(uint8_t r, uint8_t g, uint8_t b)PS3USB - moveSetBulb(ColorsEnum color)PS3USB - moveSetRumble(uint8_t rumble)PS3USB - Poll()PS3USBvirtual - printStatusString()PS3USB - PS3ConnectedPS3USB - PS3MoveConnectedPS3USB - PS3NavigationConnectedPS3USB - 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)PS3USB - pUsbPS3USBprotected - Release()PS3USBvirtual - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - setAllOff()PS3USB - setBdaddr(uint8_t *bdaddr)PS3USB - setLedOff()PS3USBinline - setLedOff(LEDEnum a)PS3USB - setLedOn(LEDEnum a)PS3USB - setLedRaw(uint8_t value)PS3USB - setLedToggle(LEDEnum a)PS3USB - setMoveBdaddr(uint8_t *bdaddr)PS3USB - setRumbleOff()PS3USB - setRumbleOn(RumbleEnum mode)PS3USB - setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)PS3USB - VIDPIDOK(uint16_t vid, uint16_t pid)PS3USBinlinevirtual + DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + epInfoPS3USBprotected + GetAddress()PS3USBinlinevirtual + getAnalogButton(ButtonEnum a)PS3USB + getAnalogHat(AnalogHatEnum a)PS3USB + getAngle(AngleEnum a)PS3USB + getBdaddr(uint8_t *bdaddr)PS3USB + getButtonClick(ButtonEnum b)PS3USB + getButtonPress(ButtonEnum b)PS3USB + getMoveBdaddr(uint8_t *bdaddr)PS3USB + getMoveCalibration(uint8_t *data)PS3USB + getSensor(SensorEnum a)PS3USB + getStatus(StatusEnum c)PS3USB + Init(uint8_t parent, uint8_t port, bool lowspeed)PS3USBvirtual + isReady()PS3USBinlinevirtual + moveSetBulb(uint8_t r, uint8_t g, uint8_t b)PS3USB + moveSetBulb(ColorsEnum color)PS3USB + moveSetRumble(uint8_t rumble)PS3USB + Poll()PS3USBvirtual + printStatusString()PS3USB + PS3ConnectedPS3USB + PS3MoveConnectedPS3USB + PS3NavigationConnectedPS3USB + 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)PS3USB + pUsbPS3USBprotected + Release()PS3USBvirtual + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + setAllOff()PS3USB + setBdaddr(uint8_t *bdaddr)PS3USB + setLedOff()PS3USBinline + setLedOff(LEDEnum a)PS3USB + setLedOn(LEDEnum a)PS3USB + setLedRaw(uint8_t value)PS3USB + setLedToggle(LEDEnum a)PS3USB + setMoveBdaddr(uint8_t *bdaddr)PS3USB + setRumbleOff()PS3USB + setRumbleOn(RumbleEnum mode)PS3USB + setRumbleOn(uint8_t rightDuration, uint8_t rightPower, uint8_t leftDuration, uint8_t leftPower)PS3USB + VIDPIDOK(uint16_t vid, uint16_t pid)PS3USBinlinevirtual
    diff --git a/class_p_s3_u_s_b.html b/class_p_s3_u_s_b.html index 7da9a98f..9ca6ce1a 100644 --- a/class_p_s3_u_s_b.html +++ b/class_p_s3_u_s_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS3USB Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -124,18 +125,18 @@ Public Member Functions void getMoveCalibration (uint8_t *data)  
    USBDeviceConfig implementation
    -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   virtual bool isReady ()   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) + 
    PS3 Controller functions
    bool getButtonPress (ButtonEnum b)   @@ -184,8 +185,10 @@ Public Member Functions   virtual void ResetHubPort (uint8_t port)   -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  @@ -210,7 +213,7 @@ Protected Attributes

    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 58 of file PS3USB.h.

    +

    Definition at line 49 of file PS3USB.h.

    Constructor & Destructor Documentation

    @@ -411,7 +414,7 @@ Protected Attributes

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 93 of file PS3USB.h.

    +

    Definition at line 84 of file PS3USB.h.

    @@ -437,11 +440,11 @@ Protected Attributes

    Used to check if the controller has been initialized.

    Returns
    True if it's ready.
    -

    Definition at line 101 of file PS3USB.h.

    +

    Definition at line 92 of file PS3USB.h.

    - +

    Public Attributes

    @@ -449,7 +452,7 @@ Protected Attributes

    Definition at line 45 of file PS4BT.h.

    - - - -
    -
    -
    - + @@ -481,9 +484,9 @@ Protected Attributes
    Returns
    Returns true if the device's VID and PID matches this driver.
    -

    Reimplemented from USBDeviceConfig.

    +

    Reimplemented from USBDeviceConfig.

    -

    Definition at line 111 of file PS3USB.h.

    +

    Definition at line 102 of file PS3USB.h.

    @@ -959,7 +962,7 @@ Protected Attributes

    Turn all LEDs off.

    -

    Definition at line 224 of file PS3USB.h.

    +

    Definition at line 215 of file PS3USB.h.

    @@ -1151,7 +1154,7 @@ Protected Attributes -

    Definition at line 263 of file PS3USB.h.

    +

    Definition at line 254 of file PS3USB.h.

    @@ -1167,7 +1170,7 @@ Protected Attributes

    Variable used to indicate if the normal playstation controller is successfully connected.

    -

    Definition at line 265 of file PS3USB.h.

    +

    Definition at line 256 of file PS3USB.h.

    @@ -1182,7 +1185,7 @@ Protected Attributes

    Variable used to indicate if the move controller is successfully connected.

    -

    Definition at line 271 of file PS3USB.h.

    +

    Definition at line 262 of file PS3USB.h.

    @@ -1197,7 +1200,7 @@ Protected Attributes

    Variable used to indicate if the navigation controller is successfully connected.

    -

    Definition at line 273 of file PS3USB.h.

    +

    Definition at line 264 of file PS3USB.h.

    @@ -1220,7 +1223,7 @@ Protected Attributes

    Pointer to USB class instance.

    -

    Definition at line 277 of file PS3USB.h.

    +

    Definition at line 268 of file PS3USB.h.

    @@ -1243,7 +1246,7 @@ Protected Attributes

    Device address.

    -

    Definition at line 279 of file PS3USB.h.

    +

    Definition at line 270 of file PS3USB.h.

    @@ -1266,7 +1269,7 @@ Protected Attributes

    Endpoint info structure.

    -

    Definition at line 281 of file PS3USB.h.

    +

    Definition at line 272 of file PS3USB.h.

    @@ -1279,7 +1282,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 4a94ee41..1aae81d3 100644 --- a/class_p_s3_u_s_b__coll__graph.md5 +++ b/class_p_s3_u_s_b__coll__graph.md5 @@ -1 +1 @@ -9e8c5435724f7c7e70dfbe754d4e9919 \ No newline at end of file +06f5f28fefcd0973f7f3cf5ab5f01033 \ No newline at end of file diff --git a/class_p_s3_u_s_b__inherit__graph.md5 b/class_p_s3_u_s_b__inherit__graph.md5 index 44086750..b241da78 100644 --- a/class_p_s3_u_s_b__inherit__graph.md5 +++ b/class_p_s3_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -d6728a689bb029a7cd4f4e23b5bf2c3c \ No newline at end of file +77f7ca570be060c1a40a0845510a4a59 \ No newline at end of file diff --git a/class_p_s4_b_t-members.html b/class_p_s4_b_t-members.html index d2fda1c5..47a6641f 100644 --- a/class_p_s4_b_t-members.html +++ b/class_p_s4_b_t-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    virtual boolean PS3USB::VIDPIDOK virtual bool PS3USB::VIDPIDOK ( uint16_t  vid,
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -90,9 +91,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for PS4BT, including all inherited members.

    - - - + + + + + @@ -111,20 +114,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - + + + + + + + + + + + + - + - + @@ -142,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s4_b_t.html b/class_p_s4_b_t.html index a77aa2af..56f3a2e1 100644 --- a/class_p_s4_b_t.html +++ b/class_p_s4_b_t.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: PS4BT Class Reference + @@ -31,7 +32,7 @@
    ACLData(uint8_t *ACLData)BTHIDvirtual
    attachOnInit(void(*funcOnInit)(void))PS4BTinline
    BTHID(BTD *p, bool pair=false, const char *pin="0000")BTHID
    ACLData(uint8_t *ACLData)BTHIDprotectedvirtual
    attachOnInit(void(*funcOnInit)(void))BluetoothServiceinline
    BluetoothService(BTD *p)BluetoothServiceinline
    BTHID(BTD *p, bool pair=false, const char *pin="0000")BTHID
    checkHciHandle(uint8_t *buf, uint16_t handle)BluetoothServiceinlineprotected
    connected()PS4BTinline
    BTHID::connectedBTHID
    control_scidBTHIDprotected
    getUsbStatus()PS4Parserinline
    getX(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline
    getY(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline
    hci_handleBTHIDprotected
    interrupt_scidBTHIDprotected
    isTouching(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline
    OnInitBTHID()PS4BTinlineprotectedvirtual
    pair(void)BTHIDinline
    Parse(uint8_t len, uint8_t *buf)PS4Parserprotected
    ParseBTHIDData(uint8_t len, uint8_t *buf)PS4BTinlineprotectedvirtual
    pBtdBTHIDprotected
    hci_handleBluetoothServiceprotected
    identifierBluetoothServiceprotected
    interrupt_scidBTHIDprotected
    isTouching(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline
    l2cap_event_flagBluetoothServiceprotected
    onInit()BTHIDinlineprotectedvirtual
    OnInitBTHID()PS4BTinlineprotectedvirtual
    pair(void)BTHIDinline
    Parse(uint8_t len, uint8_t *buf)PS4Parserprotected
    ParseBTHIDData(uint8_t len, uint8_t *buf)PS4BTinlineprotectedvirtual
    pBtdBluetoothServiceprotected
    pFuncOnInitBluetoothServiceprotected
    PS4BT(BTD *p, bool pair=false, const char *pin="0000")PS4BTinline
    PS4Parser()PS4Parserinline
    BTHID::Reset()BTHIDvirtual
    BTHID::Reset()BTHIDprotectedvirtual
    PS4Parser::Reset()PS4Parserinlineprotected
    ResetBTHID()PS4BTinlineprotectedvirtual
    Run()BTHIDvirtual
    Run()BTHIDprotectedvirtual
    sendOutputReport(PS4Output *output)PS4BTinlineprotectedvirtual
    setAllOff()PS4Parserinline
    setLed(uint8_t r, uint8_t g, uint8_t b)PS4Parserinline
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Collaboration diagram for PS4BT:
    Collaboration graph
    - +
    [legend]
    - - @@ -128,16 +127,13 @@ Public Member Functions - - - - - - - - - + + + + + + @@ -198,7 +194,18 @@ Protected Member Functions - + + + + + + + + + + + + @@ -211,14 +218,21 @@ Additional Inherited Members - - - - + + + + + + + + + + +

    @@ -113,8 +114,6 @@ Public Member Functions

     
    bool connected ()
     
    void attachOnInit (void(*funcOnInit)(void))
     
    - Public Member Functions inherited from BTHID
     BTHID (BTD *p, bool pair=false, const char *pin="0000")
     
     
    void pair (void)
     
    void attachOnInit (void(*funcOnInit)(void))
     
    virtual void ACLData (uint8_t *ACLData)
     
    virtual void Run ()
     
    virtual void Reset ()
     
    virtual void disconnect ()
    void disconnect ()
     
    - Public Member Functions inherited from BluetoothService
     BluetoothService (BTD *p)
     
    void attachOnInit (void(*funcOnInit)(void))
     
    - Public Member Functions inherited from PS4Parser
     PS4Parser ()
     
    PS4Parser implementation
    virtual void sendOutputReport (PS4Output *output)
     
    Overridable functions
    - Protected Member Functions inherited from BTHID
    void ACLData (uint8_t *ACLData)
     
    void Run ()
     
    void Reset ()
     
    void onInit ()
     
    - Protected Member Functions inherited from BluetoothService
    bool checkHciHandle (uint8_t *buf, uint16_t handle)
     
    - Protected Member Functions inherited from PS4Parser
    void Parse (uint8_t len, uint8_t *buf)
     
    bool connected
     
    - Protected Attributes inherited from BTHID
    BTDpBtd
     
    uint16_t hci_handle
     
    uint8_t control_scid [2]
     
    uint8_t interrupt_scid [2]
     
    - Protected Attributes inherited from BluetoothService
    void(* pFuncOnInit )(void)
     
    BTDpBtd
     
    uint16_t hci_handle
     
    uint32_t l2cap_event_flag
     
    uint8_t identifier
     

    Detailed Description

    This class implements support for the PS4 controller via Bluetooth. It uses the BTHID class for all the Bluetooth communication.

    @@ -300,38 +314,6 @@ Additional Inherited Members
    - - - - -
    - - - - - - - - -
    void PS4BT::attachOnInit (void(*)(void) funcOnInit)
    -
    -inline
    -
    -

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

    Parameters
    - - -
    funcOnInitFunction to call.
    -
    -
    - -

    Definition at line 53 of file PS4BT.h.

    -
    @@ -375,7 +357,7 @@ Additional Inherited Members

    Reimplemented from BTHID.

    -

    Definition at line 64 of file PS4BT.h.

    +

    Definition at line 56 of file PS4BT.h.

    @@ -403,7 +385,7 @@ Additional Inherited Members

    Reimplemented from BTHID.

    -

    Definition at line 73 of file PS4BT.h.

    +

    Definition at line 65 of file PS4BT.h.

    @@ -431,7 +413,7 @@ Additional Inherited Members

    Reimplemented from BTHID.

    -

    Definition at line 83 of file PS4BT.h.

    +

    Definition at line 75 of file PS4BT.h.

    @@ -465,7 +447,7 @@ Additional Inherited Members

    Implements PS4Parser.

    -

    Definition at line 89 of file PS4BT.h.

    +

    Definition at line 81 of file PS4BT.h.

    @@ -477,7 +459,7 @@ Additional Inherited Members diff --git a/class_p_s4_b_t__coll__graph.map b/class_p_s4_b_t__coll__graph.map index 971b5051..9a5d60b0 100644 --- a/class_p_s4_b_t__coll__graph.map +++ b/class_p_s4_b_t__coll__graph.map @@ -1,11 +1,11 @@ - - + + - + diff --git a/class_p_s4_b_t__coll__graph.md5 b/class_p_s4_b_t__coll__graph.md5 index 15bc6a9e..57a44763 100644 --- a/class_p_s4_b_t__coll__graph.md5 +++ b/class_p_s4_b_t__coll__graph.md5 @@ -1 +1 @@ -bd3d43880c0d25a1a94cad2c30ff5cdc \ No newline at end of file +4bb85a2b4d5163f1d591f32b835727dc \ No newline at end of file diff --git a/class_p_s4_b_t__coll__graph.png b/class_p_s4_b_t__coll__graph.png index decf2db26a160c0776d36f3ea36d19ebb962ce1b..d96b67a9d31ed67fe01fa960b6905bffee79f9ca 100644 GIT binary patch literal 27019 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 literal 26878 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%0AyP-*_1DH-d&CZ(L@$3QGQoz9_OVJ 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 MRyR - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -121,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_s4_parser.html b/class_p_s4_parser.html index fd8e7f47..7f8f1a26 100644 --- a/class_p_s4_parser.html +++ b/class_p_s4_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Parser Class Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -1028,7 +1029,7 @@ Protected Member Functions diff --git a/class_p_s4_parser__inherit__graph.md5 b/class_p_s4_parser__inherit__graph.md5 index 3664c5e9..7d6cd78a 100644 --- a/class_p_s4_parser__inherit__graph.md5 +++ b/class_p_s4_parser__inherit__graph.md5 @@ -1 +1 @@ -3640c7e8714d328b9cdd367ff0a243af \ No newline at end of file +b842fe07d690c9e08045bf8e0d96d45b \ No newline at end of file diff --git a/class_p_s4_u_s_b-members.html b/class_p_s4_u_s_b-members.html index e19d7529..d81cdb0d 100644 --- a/class_p_s4_u_s_b-members.html +++ b/class_p_s4_u_s_b-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -95,75 +96,77 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); bHasReportIdHIDUniversalprotected ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual connected()PS4USBinline - DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual - EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)HIDUniversalvirtual - epInfoHIDUniversalprotected - epInterruptInIndexHIDprotectedstatic - epInterruptOutIndexHIDprotectedstatic - GetAddress()HIDUniversalinlinevirtual - getAnalogButton(ButtonEnum b)PS4Parser - getAnalogHat(AnalogHatEnum a)PS4Parser - getAngle(AngleEnum a)PS4Parserinline - getAudioStatus()PS4Parserinline - getBatteryLevel()PS4Parserinline - getButtonClick(ButtonEnum b)PS4Parser - getButtonPress(ButtonEnum b)PS4Parser - GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID - GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID - getMicStatus()PS4Parserinline - GetProtocol(uint8_t iface, uint8_t *dataptr)HID - GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID - GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID - GetReportParser(uint8_t id)HIDUniversalprotectedvirtual - getSensor(SensorEnum s)PS4Parserinline - getTouchCounter(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline - GetUsb()HIDinline - getUsbStatus()PS4Parserinline - getX(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline - getY(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline - HID(USB *pusb)HIDinline - hidInterfacesHIDUniversalprotected - HIDUniversal(USB *p)HIDUniversal - Init(uint8_t parent, uint8_t port, bool lowspeed)HIDUniversalvirtual - isReady()HIDUniversalinlinevirtual - isTouching(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline - maxEpPerInterfaceHIDprotectedstatic - maxHidInterfacesHIDprotectedstatic - OnInitSuccessful()PS4USBinlineprotectedvirtual - Parse(uint8_t len, uint8_t *buf)PS4Parserprotected - ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)PS4USBinlineprotectedvirtual - PIDHIDUniversalprotected - Poll()HIDUniversalvirtual - PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)HIDprotected - PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)HIDprotected - PS4Parser()PS4Parserinline - PS4USB(USB *p)PS4USBinline - pUsbHIDprotected - Release()HIDUniversalvirtual - Reset()PS4Parserinlineprotected - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - sendOutputReport(PS4Output *output)PS4USBinlineprotectedvirtual - setAllOff()PS4Parserinline - SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)HID - setLed(uint8_t r, uint8_t g, uint8_t b)PS4Parserinline - setLed(ColorsEnum color)PS4Parserinline - setLedFlash(uint8_t flashOn, uint8_t flashOff)PS4Parserinline - setLedOff()PS4Parserinline - SetProtocol(uint8_t iface, uint8_t protocol)HID - SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID - SetReportParser(uint8_t id, HIDReportParser *prs)HIDUniversalvirtual - setRumbleOff()PS4Parserinline - setRumbleOn(RumbleEnum mode)PS4Parserinline - setRumbleOn(uint8_t bigRumble, uint8_t smallRumble)PS4Parserinline + DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)HIDUniversalvirtual + epInfoHIDUniversalprotected + epInterruptInIndexHIDprotectedstatic + epInterruptOutIndexHIDprotectedstatic + GetAddress()HIDUniversalinlinevirtual + getAnalogButton(ButtonEnum b)PS4Parser + getAnalogHat(AnalogHatEnum a)PS4Parser + getAngle(AngleEnum a)PS4Parserinline + getAudioStatus()PS4Parserinline + getBatteryLevel()PS4Parserinline + getButtonClick(ButtonEnum b)PS4Parser + getButtonPress(ButtonEnum b)PS4Parser + GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID + GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID + getMicStatus()PS4Parserinline + GetProtocol(uint8_t iface, uint8_t *dataptr)HID + GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID + GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID + GetReportParser(uint8_t id)HIDUniversalprotectedvirtual + getSensor(SensorEnum s)PS4Parserinline + getTouchCounter(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline + GetUsb()HIDinline + getUsbStatus()PS4Parserinline + getX(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline + getY(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline + HID(USB *pusb)HIDinline + hidInterfacesHIDUniversalprotected + HIDUniversal(USB *p)HIDUniversal + Init(uint8_t parent, uint8_t port, bool lowspeed)HIDUniversalvirtual + isReady()HIDUniversalinlinevirtual + isTouching(uint8_t finger=0, uint8_t xyId=0)PS4Parserinline + maxEpPerInterfaceHIDprotectedstatic + maxHidInterfacesHIDprotectedstatic + OnInitSuccessful()PS4USBinlineprotectedvirtual + Parse(uint8_t len, uint8_t *buf)PS4Parserprotected + ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)PS4USBinlineprotectedvirtual + PIDHIDUniversalprotected + Poll()HIDUniversalvirtual + PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)HIDprotected + PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)HIDprotected + PS4Parser()PS4Parserinline + PS4USB(USB *p)PS4USBinline + pUsbHIDprotected + Release()HIDUniversalvirtual + Reset()PS4Parserinlineprotected + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + sendOutputReport(PS4Output *output)PS4USBinlineprotectedvirtual + setAllOff()PS4Parserinline + SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)HID + setLed(uint8_t r, uint8_t g, uint8_t b)PS4Parserinline + setLed(ColorsEnum color)PS4Parserinline + setLedFlash(uint8_t flashOn, uint8_t flashOff)PS4Parserinline + setLedOff()PS4Parserinline + SetProtocol(uint8_t iface, uint8_t protocol)HID + SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID + SetReportParser(uint8_t id, HIDReportParser *prs)HIDUniversalvirtual + setRumbleOff()PS4Parserinline + setRumbleOn(RumbleEnum mode)PS4Parserinline + setRumbleOn(uint8_t bigRumble, uint8_t smallRumble)PS4Parserinline + SndRpt(uint16_t nbytes, uint8_t *dataptr)HIDUniversal totalEndpointsHIDprotectedstatic VIDHIDUniversalprotected - VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual + VIDPIDOK(uint16_t vid, uint16_t pid)PS4USBinlineprotectedvirtual
    diff --git a/class_p_s4_u_s_b.html b/class_p_s4_u_s_b.html index 3b12d617..fe7fff48 100644 --- a/class_p_s4_u_s_b.html +++ b/class_p_s4_u_s_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4USB Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -118,20 +119,22 @@ Public Member Functions - Public Member Functions inherited from HIDUniversal  HIDUniversal (USB *p)   -virtual bool SetReportParser (uint8_t id, HIDReportParser *prs) +bool SetReportParser (uint8_t id, HIDReportParser *prs)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   virtual bool isReady ()   -virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) +void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)   +uint8_t SndRpt (uint16_t nbytes, uint8_t *dataptr) +  - Public Member Functions inherited from HID  HID (USB *pusb)   @@ -158,10 +161,10 @@ Public Member Functions   virtual void ResetHubPort (uint8_t port)   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  - Public Member Functions inherited from PS4Parser  PS4Parser ()   @@ -220,8 +223,11 @@ Protected Member Functions
    PS4Parser implementation
    virtual void sendOutputReport (PS4Output *output)   +
    USBDeviceConfig implementation
    +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) +  - Protected Member Functions inherited from HIDUniversal -virtual HIDReportParserGetReportParser (uint8_t id) +HIDReportParserGetReportParser (uint8_t id)   - Protected Member Functions inherited from HID void PrintEndpointDescriptor (const USB_ENDPOINT_DESCRIPTOR *ep_ptr) @@ -479,6 +485,52 @@ Additional Inherited Members

    Definition at line 90 of file PS4USB.h.

    +
    + + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    virtual bool PS4USB::VIDPIDOK (uint16_t vid,
    uint16_t pid 
    )
    +
    +inlineprotectedvirtual
    +
    +

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

    Parameters
    + + + +
    vidThe device's VID.
    pidThe device's PID.
    +
    +
    +
    Returns
    Returns true if the device's VID and PID matches this driver.
    + +

    Reimplemented from USBDeviceConfig.

    + +

    Definition at line 122 of file PS4USB.h.

    +

    The documentation for this class was generated from the following file:
      @@ -489,7 +541,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 772048de..9394fd9f 100644 --- a/class_p_s4_u_s_b__coll__graph.md5 +++ b/class_p_s4_u_s_b__coll__graph.md5 @@ -1 +1 @@ -2fd35c4c63b41eb030a7f254514f46f8 \ No newline at end of file +b0faf5c4d6f93001a949db6c893a73c6 \ No newline at end of file diff --git a/class_p_s4_u_s_b__inherit__graph.md5 b/class_p_s4_u_s_b__inherit__graph.md5 index 251dfc64..81ff3e11 100644 --- a/class_p_s4_u_s_b__inherit__graph.md5 +++ b/class_p_s4_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -cfbb24c41aff07d80752a0c75e594196 \ No newline at end of file +6ebcfbbae9fe69305e0a0cabea54d610 \ No newline at end of file diff --git a/class_p_s_buzz-members.html b/class_p_s_buzz-members.html index 4ed78699..567117f9 100644 --- a/class_p_s_buzz-members.html +++ b/class_p_s_buzz-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -95,58 +96,60 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); bHasReportIdHIDUniversalprotected ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual connected()PSBuzzinline - DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual - EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)HIDUniversalvirtual - epInfoHIDUniversalprotected - epInterruptInIndexHIDprotectedstatic - epInterruptOutIndexHIDprotectedstatic - GetAddress()HIDUniversalinlinevirtual - getButtonClick(ButtonEnum b, uint8_t controller=0)PSBuzz - getButtonPress(ButtonEnum b, uint8_t controller=0)PSBuzz - GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID - GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID - GetProtocol(uint8_t iface, uint8_t *dataptr)HID - GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID - GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID - GetReportParser(uint8_t id)HIDUniversalprotectedvirtual - GetUsb()HIDinline - HID(USB *pusb)HIDinline - hidInterfacesHIDUniversalprotected - HIDUniversal(USB *p)HIDUniversal - Init(uint8_t parent, uint8_t port, bool lowspeed)HIDUniversalvirtual - isReady()HIDUniversalinlinevirtual - maxEpPerInterfaceHIDprotectedstatic - maxHidInterfacesHIDprotectedstatic - OnInitSuccessful()PSBuzzprotectedvirtual - ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)PSBuzzprotectedvirtual - PIDHIDUniversalprotected - Poll()HIDUniversalvirtual - PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)HIDprotected - PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)HIDprotected - PSBuzz(USB *p)PSBuzzinline - pUsbHIDprotected - Release()HIDUniversalvirtual - Reset()PSBuzzinlineprotected - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)HID - setLedOff(uint8_t controller=0)PSBuzzinline - setLedOffAll()PSBuzzinline - setLedOn(uint8_t controller=0)PSBuzzinline - setLedOnAll()PSBuzzinline - setLedRaw(bool value, uint8_t controller=0)PSBuzz - setLedToggle(uint8_t controller=0)PSBuzzinline - SetProtocol(uint8_t iface, uint8_t protocol)HID - SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID - SetReportParser(uint8_t id, HIDReportParser *prs)HIDUniversalvirtual + DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)HIDUniversalvirtual + epInfoHIDUniversalprotected + epInterruptInIndexHIDprotectedstatic + epInterruptOutIndexHIDprotectedstatic + GetAddress()HIDUniversalinlinevirtual + getButtonClick(ButtonEnum b, uint8_t controller=0)PSBuzz + getButtonPress(ButtonEnum b, uint8_t controller=0)PSBuzz + GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t *dataptr)HID + GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)HID + GetProtocol(uint8_t iface, uint8_t *dataptr)HID + GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID + GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)HID + GetReportParser(uint8_t id)HIDUniversalprotectedvirtual + GetUsb()HIDinline + HID(USB *pusb)HIDinline + hidInterfacesHIDUniversalprotected + HIDUniversal(USB *p)HIDUniversal + Init(uint8_t parent, uint8_t port, bool lowspeed)HIDUniversalvirtual + isReady()HIDUniversalinlinevirtual + maxEpPerInterfaceHIDprotectedstatic + maxHidInterfacesHIDprotectedstatic + OnInitSuccessful()PSBuzzprotectedvirtual + ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)PSBuzzprotectedvirtual + PIDHIDUniversalprotected + Poll()HIDUniversalvirtual + PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)HIDprotected + PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)HIDprotected + PSBuzz(USB *p)PSBuzzinline + pUsbHIDprotected + Release()HIDUniversalvirtual + Reset()PSBuzzinlineprotected + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)HID + setLedOff(uint8_t controller=0)PSBuzzinline + setLedOffAll()PSBuzzinline + setLedOn(uint8_t controller=0)PSBuzzinline + setLedOnAll()PSBuzzinline + setLedRaw(bool value, uint8_t controller=0)PSBuzz + setLedToggle(uint8_t controller=0)PSBuzzinline + SetProtocol(uint8_t iface, uint8_t protocol)HID + SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)HID + SetReportParser(uint8_t id, HIDReportParser *prs)HIDUniversalvirtual + SndRpt(uint16_t nbytes, uint8_t *dataptr)HIDUniversal totalEndpointsHIDprotectedstatic VIDHIDUniversalprotected - VIDPIDOK(uint16_t vid, uint16_t pid)PSBuzzinlineprotectedvirtual + VIDPIDOK(uint16_t vid, uint16_t pid)PSBuzzinlineprotectedvirtual
      diff --git a/class_p_s_buzz.html b/class_p_s_buzz.html index a3b1f906..3355811b 100644 --- a/class_p_s_buzz.html +++ b/class_p_s_buzz.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PSBuzz Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -136,20 +137,22 @@ Public Member Functions - Public Member Functions inherited from HIDUniversal  HIDUniversal (USB *p)   -virtual bool SetReportParser (uint8_t id, HIDReportParser *prs) +bool SetReportParser (uint8_t id, HIDReportParser *prs)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   virtual bool isReady ()   -virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) +void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)   +uint8_t SndRpt (uint16_t nbytes, uint8_t *dataptr) +  - Public Member Functions inherited from HID  HID (USB *pusb)   @@ -176,23 +179,25 @@ Public Member Functions   virtual void ResetHubPort (uint8_t port)   -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  - + - + - - + + - + @@ -699,7 +704,7 @@ Additional Inherited Members - +

      Protected Member Functions

      void Reset ()
       
      HIDUniversal implementation
      virtual void ParseHIDData (HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
      void ParseHIDData (HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
       
      virtual uint8_t OnInitSuccessful ()
      uint8_t OnInitSuccessful ()
       
      USBDeviceConfig implementation
      virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid)
       
      virtual bool VIDPIDOK (uint16_t vid, uint16_t pid)
       
      - Protected Member Functions inherited from HIDUniversal
      virtual HIDReportParserGetReportParser (uint8_t id)
      HIDReportParserGetReportParser (uint8_t id)
       
      - Protected Member Functions inherited from HID
      void PrintEndpointDescriptor (const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
      @@ -707,7 +712,7 @@ Additional Inherited Members
      - + @@ -739,7 +744,7 @@ Additional Inherited Members
      Returns
      Returns true if the device's VID and PID matches this driver.
      -

      Reimplemented from USBDeviceConfig.

      +

      Reimplemented from USBDeviceConfig.

      Definition at line 172 of file PSBuzz.h.

      @@ -754,7 +759,7 @@ Additional Inherited Members diff --git a/class_p_s_buzz__coll__graph.md5 b/class_p_s_buzz__coll__graph.md5 index c4c5e944..47e3d2fc 100644 --- a/class_p_s_buzz__coll__graph.md5 +++ b/class_p_s_buzz__coll__graph.md5 @@ -1 +1 @@ -b00847596f03c9ccb2a8740a3bb14f2c \ No newline at end of file +acd49db36a26a691ee392a22ae2d80bc \ No newline at end of file diff --git a/class_p_s_buzz__inherit__graph.md5 b/class_p_s_buzz__inherit__graph.md5 index 6bf600ee..69941d86 100644 --- a/class_p_s_buzz__inherit__graph.md5 +++ b/class_p_s_buzz__inherit__graph.md5 @@ -1 +1 @@ -339327821a93a64d18fd7b166cbfc9e0 \ No newline at end of file +53ce72b873bd66e22d1aec7f4efc1448 \ No newline at end of file diff --git a/class_p_t_p_list_parser-members.html b/class_p_t_p_list_parser-members.html index f191c123..1df50fb3 100644 --- a/class_p_t_p_list_parser-members.html +++ b/class_p_t_p_list_parser-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
      virtual boolean PSBuzz::VIDPIDOK virtual bool PSBuzz::VIDPIDOK ( uint16_t  vid,
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -101,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_p_t_p_list_parser.html b/class_p_t_p_list_parser.html index 2e1d8e5b..da80ba4a 100644 --- a/class_p_t_p_list_parser.html +++ b/class_p_t_p_list_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PTPListParser Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -107,7 +108,7 @@ Public Member Functions   void Initialize (const uint8_t len_size, const uint8_t val_size, MultiValueBuffer *const p, const uint8_t mode=modeArray)   -bool Parse (uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me=NULL) +bool Parse (uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me=NULL)  

      Detailed Description

      @@ -228,7 +229,7 @@ Public Member Functions - PTP_ARRAY_EL_FUNC  + PTP_ARRAY_EL_FUNC  pf, @@ -258,7 +259,7 @@ Public Member Functions diff --git a/class_report_desc_parser-members.html b/class_report_desc_parser-members.html index 5ad703c2..e8d156c3 100644 --- a/class_report_desc_parser-members.html +++ b/class_report_desc_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -111,9 +112,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); digitTitles0ReportDescParserBasestatic digitTitles1ReportDescParserBasestatic digitTitles2ReportDescParserBasestatic - enErrorBufferTooSmall enum valueReportDescParserBase - enErrorIncomplete enum valueReportDescParserBase - enErrorSuccess enum valueReportDescParserBase + enErrorBufferTooSmall enum valueReportDescParserBase + enErrorIncomplete enum valueReportDescParserBase + enErrorSuccess enum valueReportDescParserBase gameTitles0ReportDescParserBasestatic gameTitles1ReportDescParserBasestatic genDesktopTitles0ReportDescParserBasestatic @@ -171,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); theBufferReportDescParserBaseprotected theSkipperReportDescParserBaseprotected totalSizeReportDescParserBaseprotected - UsagePageFunc typedefReportDescParserBase + UsagePageFunc typedefReportDescParserBase usagePageFunctionsReportDescParserBaseprotectedstatic usagePageTitles0ReportDescParserBasestatic usagePageTitles1ReportDescParserBasestatic @@ -184,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_report_desc_parser.html b/class_report_desc_parser.html index 85bafc7f..f1c3e9e4 100644 --- a/class_report_desc_parser.html +++ b/class_report_desc_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ReportDescParser Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -109,17 +110,17 @@ Collaboration diagram for ReportDescParser:

      Additional Inherited Members

      - Public Types inherited from ReportDescParserBase -enum  { enErrorSuccess = 0, -enErrorIncomplete, -enErrorBufferTooSmall +enum  { enErrorSuccess = 0, +enErrorIncomplete, +enErrorBufferTooSmall } -  -typedef void(* UsagePageFunc )(uint16_t usage) -  +  +typedef void(* UsagePageFunc) (uint16_t usage) +  - Public Member Functions inherited from ReportDescParserBase  ReportDescParserBase ()   -virtual void Parse (const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) +void Parse (const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)   - Static Public Member Functions inherited from ReportDescParserBase static void PrintGenericDesktopPageUsage (uint16_t usage) @@ -288,15 +289,15 @@ Additional Inherited Members   uint16_t totalSize   -UsagePageFunc pfUsage +UsagePageFunc pfUsage   - Static Protected Attributes inherited from ReportDescParserBase -static UsagePageFunc usagePageFunctions [] +static UsagePageFunc usagePageFunctions []  

      Detailed Description

      -

      Definition at line 144 of file hidescriptorparser.h.

      +

      Definition at line 145 of file hidescriptorparser.h.


      The documentation for this class was generated from the following file: @@ -305,7 +306,7 @@ Additional Inherited Members diff --git a/class_report_desc_parser2-members.html b/class_report_desc_parser2-members.html index cf7846fb..c818218c 100644 --- a/class_report_desc_parser2-members.html +++ b/class_report_desc_parser2-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -111,9 +112,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); digitTitles0ReportDescParserBasestatic digitTitles1ReportDescParserBasestatic digitTitles2ReportDescParserBasestatic - enErrorBufferTooSmall enum valueReportDescParserBase - enErrorIncomplete enum valueReportDescParserBase - enErrorSuccess enum valueReportDescParserBase + enErrorBufferTooSmall enum valueReportDescParserBase + enErrorIncomplete enum valueReportDescParserBase + enErrorSuccess enum valueReportDescParserBase gameTitles0ReportDescParserBasestatic gameTitles1ReportDescParserBasestatic genDesktopTitles0ReportDescParserBasestatic @@ -172,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); theBufferReportDescParserBaseprotected theSkipperReportDescParserBaseprotected totalSizeReportDescParserBaseprotected - UsagePageFunc typedefReportDescParserBase + UsagePageFunc typedefReportDescParserBase usagePageFunctionsReportDescParserBaseprotectedstatic usagePageTitles0ReportDescParserBasestatic usagePageTitles1ReportDescParserBasestatic @@ -185,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_report_desc_parser2.html b/class_report_desc_parser2.html index c841e69d..7698120a 100644 --- a/class_report_desc_parser2.html +++ b/class_report_desc_parser2.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ReportDescParser2 Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -115,7 +116,7 @@ Public Member Functions - Public Member Functions inherited from ReportDescParserBase  ReportDescParserBase ()   -virtual void Parse (const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) +void Parse (const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)   - - - - + + + @@ -298,15 +299,15 @@ Additional Inherited Members - + - +

      @@ -129,13 +130,13 @@ Protected Member Functions

      Additional Inherited Members

      - Public Types inherited from ReportDescParserBase
      enum  { enErrorSuccess = 0, -enErrorIncomplete, -enErrorBufferTooSmall +
      enum  { enErrorSuccess = 0, +enErrorIncomplete, +enErrorBufferTooSmall }
       
      typedef void(* UsagePageFunc )(uint16_t usage)
       
       
      typedef void(* UsagePageFunc) (uint16_t usage)
       
      - Static Public Member Functions inherited from ReportDescParserBase
      static void PrintGenericDesktopPageUsage (uint16_t usage)
       
       
      uint16_t totalSize
       
      UsagePageFunc pfUsage
      UsagePageFunc pfUsage
       
      - Static Protected Attributes inherited from ReportDescParserBase
      static UsagePageFunc usagePageFunctions []
      static UsagePageFunc usagePageFunctions []
       

      Detailed Description

      -

      Definition at line 147 of file hidescriptorparser.h.

      +

      Definition at line 148 of file hidescriptorparser.h.

      Constructor & Destructor Documentation

      @@ -340,7 +341,7 @@ Additional Inherited Members
      -

      Definition at line 163 of file hidescriptorparser.h.

      +

      Definition at line 165 of file hidescriptorparser.h.

      @@ -379,7 +380,7 @@ Additional Inherited Members

      Reimplemented from ReportDescParserBase.

      -

      Definition at line 1440 of file hidescriptorparser.cpp.

      +

      Definition at line 1429 of file hidescriptorparser.cpp.

      @@ -392,7 +393,7 @@ Additional Inherited Members diff --git a/class_report_desc_parser2__coll__graph.md5 b/class_report_desc_parser2__coll__graph.md5 index d407d228..af9db977 100644 --- a/class_report_desc_parser2__coll__graph.md5 +++ b/class_report_desc_parser2__coll__graph.md5 @@ -1 +1 @@ -e88568f5fec50e92ab94f403c7de23cd \ No newline at end of file +27a80771267ed2f61d1a7277c51beb79 \ No newline at end of file diff --git a/class_report_desc_parser2__inherit__graph.md5 b/class_report_desc_parser2__inherit__graph.md5 index 2edb6da6..5a0ef029 100644 --- a/class_report_desc_parser2__inherit__graph.md5 +++ b/class_report_desc_parser2__inherit__graph.md5 @@ -1 +1 @@ -a90860eeadb8724d3f4a2fd3d74642dc \ No newline at end of file +28f3942ed411cf191d1a779af42e8bd4 \ No newline at end of file diff --git a/class_report_desc_parser__coll__graph.md5 b/class_report_desc_parser__coll__graph.md5 index 8bc859ff..60356562 100644 --- a/class_report_desc_parser__coll__graph.md5 +++ b/class_report_desc_parser__coll__graph.md5 @@ -1 +1 @@ -98068a7aa912a8da28e63e8afb9a1494 \ No newline at end of file +4eeff98c7d713241096fda58cb34b342 \ No newline at end of file diff --git a/class_report_desc_parser__inherit__graph.md5 b/class_report_desc_parser__inherit__graph.md5 index 643203cd..f89c23d6 100644 --- a/class_report_desc_parser__inherit__graph.md5 +++ b/class_report_desc_parser__inherit__graph.md5 @@ -1 +1 @@ -365ba2bc5b9634b96848151575c7bc86 \ No newline at end of file +d91197785a3b88c599def77d68a6ee2e \ No newline at end of file diff --git a/class_report_desc_parser_base-members.html b/class_report_desc_parser_base-members.html index c30fe94e..98e3e596 100644 --- a/class_report_desc_parser_base-members.html +++ b/class_report_desc_parser_base-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -111,9 +112,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); digitTitles0ReportDescParserBasestatic digitTitles1ReportDescParserBasestatic digitTitles2ReportDescParserBasestatic - enErrorBufferTooSmall enum valueReportDescParserBase - enErrorIncomplete enum valueReportDescParserBase - enErrorSuccess enum valueReportDescParserBase + enErrorBufferTooSmall enum valueReportDescParserBase + enErrorIncomplete enum valueReportDescParserBase + enErrorSuccess enum valueReportDescParserBase gameTitles0ReportDescParserBasestatic gameTitles1ReportDescParserBasestatic genDesktopTitles0ReportDescParserBasestatic @@ -171,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); theBufferReportDescParserBaseprotected theSkipperReportDescParserBaseprotected totalSizeReportDescParserBaseprotected - UsagePageFunc typedefReportDescParserBase + UsagePageFunc typedefReportDescParserBase usagePageFunctionsReportDescParserBaseprotectedstatic usagePageTitles0ReportDescParserBasestatic usagePageTitles1ReportDescParserBasestatic @@ -184,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_report_desc_parser_base.html b/class_report_desc_parser_base.html index 799fafca..22b0ad33 100644 --- a/class_report_desc_parser_base.html +++ b/class_report_desc_parser_base.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: ReportDescParserBase Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -116,19 +117,19 @@ Collaboration diagram for ReportDescParserBase:
      - - - - + + +

      Public Types

      enum  { enErrorSuccess = 0, -enErrorIncomplete, -enErrorBufferTooSmall +
      enum  { enErrorSuccess = 0, +enErrorIncomplete, +enErrorBufferTooSmall }
       
      typedef void(* UsagePageFunc )(uint16_t usage)
       
       
      typedef void(* UsagePageFunc) (uint16_t usage)
       
      - +

      Public Member Functions

       ReportDescParserBase ()
       
      virtual void Parse (const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
      void Parse (const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
       
      - +

      @@ -307,24 +308,24 @@ Protected Attributes

       
      uint16_t totalSize
       
      UsagePageFunc pfUsage
      UsagePageFunc pfUsage
       
      - +

      Static Protected Attributes

      static UsagePageFunc usagePageFunctions []
      static UsagePageFunc usagePageFunctions []
       

      Detailed Description

      Definition at line 22 of file hidescriptorparser.h.

      Member Typedef Documentation

      - +
      - +
      typedef void(* ReportDescParserBase::UsagePageFunc)(uint16_t usage)typedef void(* ReportDescParserBase::UsagePageFunc) (uint16_t usage)
      @@ -334,7 +335,7 @@ Static Protected Attributes

      Member Enumeration Documentation

      - +
      @@ -344,15 +345,15 @@ Static Protected Attributes
      - - -
      Enumerator
      enErrorSuccess  +
      Enumerator
      enErrorSuccess 
      enErrorIncomplete  +
      enErrorIncomplete 
      enErrorBufferTooSmall  +
      enErrorBufferTooSmall 
      -

      Definition at line 137 of file hidescriptorparser.h.

      +

      Definition at line 138 of file hidescriptorparser.h.

      @@ -378,7 +379,7 @@ Static Protected Attributes
      -

      Definition at line 123 of file hidescriptorparser.h.

      +

      Definition at line 124 of file hidescriptorparser.h.

      @@ -405,7 +406,7 @@ Static Protected Attributes
      -

      Definition at line 1304 of file hidescriptorparser.cpp.

      +

      Definition at line 1293 of file hidescriptorparser.cpp.

      @@ -431,7 +432,7 @@ Static Protected Attributes
      -

      Definition at line 1316 of file hidescriptorparser.cpp.

      +

      Definition at line 1305 of file hidescriptorparser.cpp.

      @@ -457,7 +458,7 @@ Static Protected Attributes
      -

      Definition at line 1326 of file hidescriptorparser.cpp.

      +

      Definition at line 1315 of file hidescriptorparser.cpp.

      @@ -483,7 +484,7 @@ Static Protected Attributes
      -

      Definition at line 1335 of file hidescriptorparser.cpp.

      +

      Definition at line 1324 of file hidescriptorparser.cpp.

      @@ -509,7 +510,7 @@ Static Protected Attributes
      -

      Definition at line 1345 of file hidescriptorparser.cpp.

      +

      Definition at line 1334 of file hidescriptorparser.cpp.

      @@ -535,7 +536,7 @@ Static Protected Attributes
      -

      Definition at line 1354 of file hidescriptorparser.cpp.

      +

      Definition at line 1343 of file hidescriptorparser.cpp.

      @@ -561,7 +562,7 @@ Static Protected Attributes
      -

      Definition at line 1362 of file hidescriptorparser.cpp.

      +

      Definition at line 1351 of file hidescriptorparser.cpp.

      @@ -587,7 +588,7 @@ Static Protected Attributes
      -

      Definition at line 1287 of file hidescriptorparser.cpp.

      +

      Definition at line 1276 of file hidescriptorparser.cpp.

      @@ -613,7 +614,7 @@ Static Protected Attributes
      -

      Definition at line 1295 of file hidescriptorparser.cpp.

      +

      Definition at line 1284 of file hidescriptorparser.cpp.

      @@ -639,7 +640,7 @@ Static Protected Attributes
      -

      Definition at line 1370 of file hidescriptorparser.cpp.

      +

      Definition at line 1359 of file hidescriptorparser.cpp.

      @@ -665,7 +666,7 @@ Static Protected Attributes
      -

      Definition at line 1383 of file hidescriptorparser.cpp.

      +

      Definition at line 1372 of file hidescriptorparser.cpp.

      @@ -691,7 +692,7 @@ Static Protected Attributes
      -

      Definition at line 1405 of file hidescriptorparser.cpp.

      +

      Definition at line 1394 of file hidescriptorparser.cpp.

      @@ -717,7 +718,7 @@ Static Protected Attributes
      -

      Definition at line 1415 of file hidescriptorparser.cpp.

      +

      Definition at line 1404 of file hidescriptorparser.cpp.

      @@ -743,7 +744,7 @@ Static Protected Attributes
      -

      Definition at line 1425 of file hidescriptorparser.cpp.

      +

      Definition at line 1414 of file hidescriptorparser.cpp.

      @@ -895,7 +896,7 @@ Static Protected Attributes
      -

      Definition at line 1262 of file hidescriptorparser.cpp.

      +

      Definition at line 1251 of file hidescriptorparser.cpp.

      @@ -2620,7 +2621,7 @@ Static Protected Attributes - +
      ReportDescParserBase::UsagePageFunc ReportDescParserBase::usagePageFunctionsReportDescParserBase::UsagePageFunc ReportDescParserBase::usagePageFunctions
      @@ -2880,7 +2881,7 @@ Static Protected Attributes - +
      UsagePageFunc ReportDescParserBase::pfUsageUsagePageFunc ReportDescParserBase::pfUsage
      @@ -2890,7 +2891,7 @@ Static Protected Attributes
      -

      Definition at line 116 of file hidescriptorparser.h.

      +

      Definition at line 117 of file hidescriptorparser.h.

      @@ -2903,7 +2904,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 4ccc7df1..668df278 100644 --- a/class_report_desc_parser_base__coll__graph.md5 +++ b/class_report_desc_parser_base__coll__graph.md5 @@ -1 +1 @@ -3aaf77127ccb15eb053d63ecd209b92d \ No newline at end of file +b9d3bd37562883d7bba8b8814d6dc468 \ No newline at end of file diff --git a/class_report_desc_parser_base__inherit__graph.md5 b/class_report_desc_parser_base__inherit__graph.md5 index f0e80d19..92049196 100644 --- a/class_report_desc_parser_base__inherit__graph.md5 +++ b/class_report_desc_parser_base__inherit__graph.md5 @@ -1 +1 @@ -0cd654ef024537560fb4e09bdd02d877 \ No newline at end of file +e17b83123517010d14d04955e7bfd25a \ No newline at end of file diff --git a/class_s_p_p-members.html b/class_s_p_p-members.html index f12cfae9..7cdc4596 100644 --- a/class_s_p_p-members.html +++ b/class_s_p_p-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -90,27 +91,36 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

      This is the complete list of members for SPP, including all inherited members.

      - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
      ACLData(uint8_t *ACLData)SPPvirtual
      available(void)SPPvirtual
      connectedSPP
      discard(void)SPP
      disconnect()SPPvirtual
      flush(void)SPPinlinevirtual
      operator bool()SPPinline
      peek(void)SPPvirtual
      read(void)SPPvirtual
      Reset()SPPvirtual
      Run()SPPvirtual
      send(void)SPP
      SPP(BTD *p, const char *name="Arduino", const char *pin="0000")SPP
      write(uint8_t data)SPPvirtual
      write(const uint8_t *data, size_t size)SPPvirtual
      ACLData(uint8_t *ACLData)SPPprotectedvirtual
      attachOnInit(void(*funcOnInit)(void))BluetoothServiceinline
      available(void)SPP
      BluetoothService(BTD *p)BluetoothServiceinline
      checkHciHandle(uint8_t *buf, uint16_t handle)BluetoothServiceinlineprotected
      connectedSPP
      discard(void)SPP
      disconnect()SPPvirtual
      flush(void)SPPinline
      hci_handleBluetoothServiceprotected
      identifierBluetoothServiceprotected
      l2cap_event_flagBluetoothServiceprotected
      onInit()SPPprotectedvirtual
      operator bool()SPPinline
      pBtdBluetoothServiceprotected
      peek(void)SPP
      pFuncOnInitBluetoothServiceprotected
      read(void)SPP
      Reset()SPPprotectedvirtual
      Run()SPPprotectedvirtual
      send(void)SPP
      SPP(BTD *p, const char *name="Arduino", const char *pin="0000")SPP
      write(uint8_t data)SPP
      write(const uint8_t *data, size_t size)SPP
      diff --git a/class_s_p_p.html b/class_s_p_p.html index 02c36cea..19f5042f 100644 --- a/class_s_p_p.html +++ b/class_s_p_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPP Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -105,7 +106,7 @@ Collaboration diagram for SPP:
      Collaboration graph
      - +
      [legend]
      - - - - - - - - - - + - - - + + + - + - + - + + + + + +

      @@ -114,37 +115,63 @@ Public Member Functions

       
       operator bool ()
       
      BluetoothService implementation
      virtual void ACLData (uint8_t *ACLData)
       
      virtual void Run ()
       
      virtual void Reset ()
       
      virtual void disconnect ()
       
      Serial port profile (SPP) Print functions
      virtual int available (void)
      int available (void)
       
      virtual void flush (void)
       
      virtual int peek (void)
      void flush (void)
       
      int peek (void)
       
      virtual int read (void)
      int read (void)
       
      virtual size_t write (uint8_t data)
      size_t write (uint8_t data)
       
      virtual size_t write (const uint8_t *data, size_t size)
      size_t write (const uint8_t *data, size_t size)
       
      void discard (void)
       
      void send (void)
       
      - Public Member Functions inherited from BluetoothService
       BluetoothService (BTD *p)
       
      void attachOnInit (void(*funcOnInit)(void))
       
      +

      Public Attributes

      bool connected
       
      + + + + + + + + + + + +

      +BluetoothService implementation

      void disconnect ()
       
      void ACLData (uint8_t *ACLData)
       
      void Run ()
       
      void Reset ()
       
      void onInit ()
       
      + + + + + + + + + + + + + + +

      +Additional Inherited Members

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

      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.

      @@ -194,122 +221,6 @@ Public Attributes

      Member Function Documentation

      - -
      -
      - - - - - -
      - - - - - - - -
      SPP::operator bool ()
      -
      -inline
      -
      -

      Used to provide Boolean tests for the class.

      Returns
      Return true if SPP communication is connected.
      - -

      Definition at line 75 of file SPP.h.

      - -
      -
      - -
      -
      - - - - - -
      - - - - - - - - -
      void SPP::ACLData (uint8_t * ACLData)
      -
      -virtual
      -
      -

      Used to pass acldata to the services.

      Parameters
      - - -
      ACLDataIncoming acldata.
      -
      -
      - -

      Reimplemented from BluetoothService.

      - -

      Definition at line 86 of file SPP.cpp.

      - -
      -
      - -
      -
      - - - - - -
      - - - - - - - -
      void SPP::Run ()
      -
      -virtual
      -
      -

      Used to establish the connection automatically.

      - -

      Reimplemented from BluetoothService.

      - -

      Definition at line 428 of file SPP.cpp.

      - -
      -
      - -
      -
      - - - - - -
      - - - - - - - -
      void SPP::Reset ()
      -
      -virtual
      -
      -

      Use this to reset the service.

      - -

      Reimplemented from BluetoothService.

      - -

      Definition at line 63 of file SPP.cpp.

      - -
      -
      @@ -332,18 +243,41 @@ Public Attributes

      Used this to disconnect the virtual serial port.

      -

      Reimplemented from BluetoothService.

      +

      Implements BluetoothService.

      -

      Definition at line 74 of file SPP.cpp.

      +

      Definition at line 72 of file SPP.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      SPP::operator bool ()
      +
      +inline
      +
      +

      Used to provide Boolean tests for the class.

      Returns
      Return true if SPP communication is connected.
      + +

      Definition at line 80 of file SPP.h.

      - - - - - -
      @@ -353,19 +287,14 @@ Public Attributes
      int SPP::available
      -
      -virtual

      Get number of bytes waiting to be read.

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

      Definition at line 783 of file SPP.cpp.

      +

      Definition at line 797 of file SPP.cpp.

      - +
      @@ -373,7 +302,7 @@ Public Attributes +inline
      - + @@ -382,22 +311,19 @@ Public Attributes
      virtual void SPP::flush void SPP::flush ( void  )
      -inlinevirtual

      Send out all bytes in the buffer.

      -

      Definition at line 103 of file SPP.h.

      +

      Definition at line 94 of file SPP.h.

      - - - - - -
      @@ -407,24 +333,16 @@ Public Attributes
      int SPP::peek
      -
      -virtual

      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 791 of file SPP.cpp.

      +

      Definition at line 805 of file SPP.cpp.

      - - - - - -
      @@ -434,24 +352,16 @@ Public Attributes
      int SPP::read
      -
      -virtual

      Used to read the buffer.

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

      Definition at line 797 of file SPP.cpp.

      +

      Definition at line 811 of file SPP.cpp.

      - - - - - -
      @@ -461,11 +371,6 @@ Public Attributes
      size_t SPP::write
      -
      -virtual

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

      Parameters
      @@ -475,16 +380,13 @@ Public Attributes
      Returns
      Return the number of bytes written.
      -

      Definition at line 728 of file SPP.cpp.

      +

      Definition at line 742 of file SPP.cpp.

      -
      - - - - -
      @@ -504,11 +406,6 @@ Public Attributes
      size_t SPP::write
      -
      -virtual

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

      Parameters
      @@ -519,7 +416,7 @@ Public Attributes
      Returns
      Return the number of bytes written.
      -

      Definition at line 740 of file SPP.cpp.

      +

      Definition at line 754 of file SPP.cpp.

      @@ -538,7 +435,7 @@ Public Attributes

      Discard all the bytes in the buffer.

      -

      Definition at line 787 of file SPP.cpp.

      +

      Definition at line 801 of file SPP.cpp.

      @@ -557,7 +454,125 @@ Public Attributes

      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 755 of file SPP.cpp.

      +

      Definition at line 769 of file SPP.cpp.

      + +
      + + +
      +
      +
      + + + + +
      + + + + + + + + +
      void SPP::ACLData (uint8_t * ACLData)
      +
      +protectedvirtual
      +
      +

      Used to pass acldata to the services.

      Parameters
      + + +
      ACLDataIncoming acldata.
      +
      +
      + +

      Implements BluetoothService.

      + +

      Definition at line 84 of file SPP.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      void SPP::Run ()
      +
      +protectedvirtual
      +
      +

      Used to establish the connection automatically.

      + +

      Implements BluetoothService.

      + +

      Definition at line 423 of file SPP.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      void SPP::Reset ()
      +
      +protectedvirtual
      +
      +

      Use this to reset the service.

      + +

      Implements BluetoothService.

      + +

      Definition at line 60 of file SPP.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      void SPP::onInit ()
      +
      +protectedvirtual
      +
      +

      Called when a device is successfully initialized. Use attachOnInit(void (*funcOnInit)(void)) to call your own function. This is useful for instance if you want to set the LEDs in a specific way.

      + +

      Implements BluetoothService.

      + +

      Definition at line 433 of file SPP.cpp.

      @@ -573,7 +588,7 @@ Public Attributes

      Variable used to indicate if the connection is established.

      -

      Definition at line 79 of file SPP.h.

      +

      Definition at line 84 of file SPP.h.

      @@ -586,7 +601,7 @@ Public Attributes diff --git a/class_s_p_p__coll__graph.map b/class_s_p_p__coll__graph.map index a3405338..cbba8de7 100644 --- a/class_s_p_p__coll__graph.map +++ b/class_s_p_p__coll__graph.map @@ -1,3 +1,9 @@ - + + + + + + + diff --git a/class_s_p_p__coll__graph.md5 b/class_s_p_p__coll__graph.md5 index e973d10c..7a218c80 100644 --- a/class_s_p_p__coll__graph.md5 +++ b/class_s_p_p__coll__graph.md5 @@ -1 +1 @@ -ad43f67ad3955f71f35444c1f7c5f2b9 \ No newline at end of file +cad9aa3d2819cbf714312820a38ed5ae \ No newline at end of file diff --git a/class_s_p_p__coll__graph.png b/class_s_p_p__coll__graph.png index 5d8ed5ed5f881621d7adf83dde1c06593e6b8a66..c74e80611be039bee113ccc96cefe4f3aeb73e73 100644 GIT binary patch literal 24243 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 KMNUMnLSTXjq%J!E diff --git a/class_s_p_p__inherit__graph.md5 b/class_s_p_p__inherit__graph.md5 index e973d10c..57b548e0 100644 --- a/class_s_p_p__inherit__graph.md5 +++ b/class_s_p_p__inherit__graph.md5 @@ -1 +1 @@ -ad43f67ad3955f71f35444c1f7c5f2b9 \ No newline at end of file +c60255fca3d4c819dfb05175121e3419 \ No newline at end of file diff --git a/class_s_pi-members.html b/class_s_pi-members.html index 67b3c57e..bb823592 100644 --- a/class_s_pi-members.html +++ b/class_s_pi-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_s_pi.html b/class_s_pi.html index 61db7386..0b56c71a 100644 --- a/class_s_pi.html +++ b/class_s_pi.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SPi< SPI_CLK, SPI_MOSI, SPI_MISO, SPI_SS > Class Template Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -128,7 +129,7 @@ template<typename SPI_CLK , typename SPI_MOSI , typename SPI_MISO , typename
      -

      Definition at line 50 of file usbhost.h.

      +

      Definition at line 47 of file usbhost.h.

      @@ -140,7 +141,7 @@ template<typename SPI_CLK , typename SPI_MOSI , typename SPI_MISO , typename diff --git a/class_sink_parser-members.html b/class_sink_parser-members.html index cd74e280..923499df 100644 --- a/class_sink_parser-members.html +++ b/class_sink_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -98,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_sink_parser.html b/class_sink_parser.html index 4c9323c5..e3e37cc0 100644 --- a/class_sink_parser.html +++ b/class_sink_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: SinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE > Class Template Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -96,15 +97,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Inheritance diagram for SinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >:
      Inheritance graph
      - -
      [legend]
      Collaboration diagram for SinkParser< BASE_CLASS, LEN_TYPE, OFFSET_TYPE >:
      Collaboration graph
      - -
      [legend]

      @@ -230,7 +227,7 @@ template<class BASE_CLASS, class LEN_TYPE, class OFFSET_TYPE> diff --git a/class_sink_parser__coll__graph.md5 b/class_sink_parser__coll__graph.md5 index 94441a8f..1a5a95f4 100644 --- a/class_sink_parser__coll__graph.md5 +++ b/class_sink_parser__coll__graph.md5 @@ -1 +1 @@ -3490c81dd23a588a195411cd35b073eb \ No newline at end of file +d02f7fd8d26a0375ade46df3226bf199 \ No newline at end of file diff --git a/class_sink_parser__inherit__graph.md5 b/class_sink_parser__inherit__graph.md5 index 94441a8f..1a5a95f4 100644 --- a/class_sink_parser__inherit__graph.md5 +++ b/class_sink_parser__inherit__graph.md5 @@ -1 +1 @@ -3490c81dd23a588a195411cd35b073eb \ No newline at end of file +d02f7fd8d26a0375ade46df3226bf199 \ No newline at end of file diff --git a/class_u_s_b-members.html b/class_u_s_b-members.html index 4fe90ec3..105bc8f2 100644 --- a/class_u_s_b-members.html +++ b/class_u_s_b-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@

      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -94,9 +95,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)MAX3421e< SPI_SS, INTR > bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)MAX3421e< SPI_SS, INTR > Configuring(uint8_t parent, uint8_t port, bool lowspeed)USB - ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, boolean direction)USB + ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, bool direction)USB 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)USB - ctrlStatus(uint8_t ep, boolean direction, uint16_t nak_limit)USB + ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit)USB DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed)USB dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit)USB ForEachUsbDevice(UsbDeviceHandleFunc pfunc)USBinline @@ -136,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_s_b.html b/class_u_s_b.html index 0c083260..992327ea 100644 --- a/class_u_s_b.html +++ b/class_u_s_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USB Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -119,7 +120,7 @@ Public Member Functions   uint8_t RegisterDeviceClass (USBDeviceConfig *pdev)   -void ForEachUsbDevice (UsbDeviceHandleFunc pfunc) +void ForEachUsbDevice (UsbDeviceHandleFunc pfunc)   uint8_t getUsbTaskState (void)   @@ -142,10 +143,10 @@ Public Member Functions   uint8_t setConf (uint8_t addr, uint8_t ep, uint8_t conf_value)   -uint8_t ctrlData (uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, boolean direction) -  -uint8_t ctrlStatus (uint8_t ep, boolean direction, uint16_t nak_limit) -  +uint8_t ctrlData (uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, bool direction) +  +uint8_t ctrlStatus (uint8_t ep, bool direction, uint16_t nak_limit) +  uint8_t inTransfer (uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data)   uint8_t outTransfer (uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data) @@ -198,7 +199,7 @@ Public Member Functions

      Detailed Description

      -

      Definition at line 190 of file UsbCore.h.

      +

      Definition at line 197 of file UsbCore.h.

      Constructor & Destructor Documentation

      @@ -240,7 +241,7 @@ Public Member Functions
      -

      Definition at line 198 of file UsbCore.h.

      +

      Definition at line 205 of file UsbCore.h.

      @@ -265,7 +266,7 @@ Public Member Functions
      -

      Definition at line 202 of file UsbCore.h.

      +

      Definition at line 209 of file UsbCore.h.

      @@ -290,7 +291,7 @@ Public Member Functions
      -

      Definition at line 206 of file UsbCore.h.

      +

      Definition at line 213 of file UsbCore.h.

      @@ -316,7 +317,7 @@ Public Member Functions
      -

      Definition at line 210 of file UsbCore.h.

      +

      Definition at line 217 of file UsbCore.h.

      @@ -330,7 +331,7 @@ Public Member Functions void USB::ForEachUsbDevice ( - UsbDeviceHandleFunc  + UsbDeviceHandleFunc  pfunc) @@ -342,7 +343,7 @@ Public Member Functions
      -

      Definition at line 220 of file UsbCore.h.

      +

      Definition at line 227 of file UsbCore.h.

      @@ -482,7 +483,7 @@ Public Member Functions

      defined(USB_METHODS_INLINE)

      -

      Definition at line 761 of file Usb.cpp.

      +

      Definition at line 764 of file Usb.cpp.

      @@ -528,7 +529,7 @@ Public Member Functions
      -

      Definition at line 766 of file Usb.cpp.

      +

      Definition at line 769 of file Usb.cpp.

      @@ -568,7 +569,7 @@ Public Member Functions
      -

      Definition at line 772 of file Usb.cpp.

      +

      Definition at line 775 of file Usb.cpp.

      @@ -620,7 +621,7 @@ Public Member Functions
      -

      Definition at line 791 of file Usb.cpp.

      +

      Definition at line 794 of file Usb.cpp.

      @@ -654,7 +655,7 @@ Public Member Functions
      -

      Definition at line 796 of file Usb.cpp.

      +

      Definition at line 799 of file Usb.cpp.

      @@ -688,11 +689,11 @@ Public Member Functions
      -

      Definition at line 805 of file Usb.cpp.

      +

      Definition at line 808 of file Usb.cpp.

      - +
      @@ -723,7 +724,7 @@ Public Member Functions - + @@ -736,7 +737,7 @@ Public Member Functions - +
      boolean bool  direction 
      @@ -749,7 +750,7 @@ Public Member Functions - + @@ -982,7 +983,7 @@ Public Member Functions
      boolean bool  direction,
      -

      Definition at line 746 of file Usb.cpp.

      +

      Definition at line 749 of file Usb.cpp.

      @@ -1077,7 +1078,7 @@ Public Member Functions diff --git a/class_u_s_b__coll__graph.md5 b/class_u_s_b__coll__graph.md5 index 7e9ee7c6..2b3a8617 100644 --- a/class_u_s_b__coll__graph.md5 +++ b/class_u_s_b__coll__graph.md5 @@ -1 +1 @@ -958d3d033294f8997a9a06c6fc924cb4 \ No newline at end of file +48f1f6d22e8ca875c8c73c2869a63fbd \ No newline at end of file diff --git a/class_u_s_b__inherit__graph.md5 b/class_u_s_b__inherit__graph.md5 index 7e9ee7c6..2b3a8617 100644 --- a/class_u_s_b__inherit__graph.md5 +++ b/class_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -958d3d033294f8997a9a06c6fc924cb4 \ No newline at end of file +48f1f6d22e8ca875c8c73c2869a63fbd \ No newline at end of file diff --git a/class_u_s_b_device_config-members.html b/class_u_s_b_device_config-members.html index ce6121d2..9f8c6290 100644 --- a/class_u_s_b_device_config-members.html +++ b/class_u_s_b_device_config-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -91,19 +92,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

      This is the complete list of members for USBDeviceConfig, including all inherited members.

      - - - - - - - + + + + + + + +
      ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
      DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
      GetAddress()USBDeviceConfiginlinevirtual
      Init(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
      Poll()USBDeviceConfiginlinevirtual
      Release()USBDeviceConfiginlinevirtual
      ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
      VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
      DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
      DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual
      GetAddress()USBDeviceConfiginlinevirtual
      Init(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
      Poll()USBDeviceConfiginlinevirtual
      Release()USBDeviceConfiginlinevirtual
      ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
      VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlinevirtual
      diff --git a/class_u_s_b_device_config.html b/class_u_s_b_device_config.html index eaa7d3d2..81821245 100644 --- a/class_u_s_b_device_config.html +++ b/class_u_s_b_device_config.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USBDeviceConfig Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -97,7 +98,7 @@ Inheritance diagram for USBDeviceConfig:
      Inheritance graph
      - +
      [legend]
      - - - - + + + + + +

      @@ -114,14 +115,16 @@ Public Member Functions

       
      virtual void ResetHubPort (uint8_t port)
       
      virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid)
       
      virtual boolean DEVCLASSOK (uint8_t klass)
       
      virtual bool VIDPIDOK (uint16_t vid, uint16_t pid)
       
      virtual bool DEVCLASSOK (uint8_t klass)
       
      virtual bool DEVSUBCLASSOK (uint8_t subklass)
       

      Detailed Description

      -

      Definition at line 119 of file UsbCore.h.

      +

      Definition at line 121 of file UsbCore.h.

      Member Function Documentation

      @@ -161,9 +164,9 @@ Public Member Functions
      -

      Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, USBHub, ACM, PL2303, FTDI, ADK, HIDUniversal, XBOXRECV, PS3USB, XBOXUSB, and XBOXOLD.

      +

      Reimplemented in BulkOnly, HIDBoot< BOOT_PROTOCOL >, BTD, ACM, USBHub, FTDI, PL2303, XR21B1411, ADK, HIDUniversal, XBOXRECV, XBOXUSB, PS3USB, XBOXOLD, and XBOXONE.

      -

      Definition at line 122 of file UsbCore.h.

      +

      Definition at line 124 of file UsbCore.h.

      @@ -207,7 +210,7 @@ Public Member Functions

      Reimplemented in BulkOnly, BTD, ADK, and XBOXRECV.

      -

      Definition at line 126 of file UsbCore.h.

      +

      Definition at line 128 of file UsbCore.h.

      @@ -232,9 +235,9 @@ Public Member Functions
      -

      Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, USBHub, ACM, FTDI, ADK, HIDUniversal, XBOXRECV, PS3USB, XBOXUSB, and XBOXOLD.

      +

      Reimplemented in BulkOnly, HIDBoot< BOOT_PROTOCOL >, BTD, ACM, USBHub, FTDI, ADK, HIDUniversal, XBOXRECV, XBOXUSB, PS3USB, XBOXOLD, and XBOXONE.

      -

      Definition at line 130 of file UsbCore.h.

      +

      Definition at line 132 of file UsbCore.h.

      @@ -259,9 +262,9 @@ Public Member Functions
      -

      Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, USBHub, ACM, FTDI, ADK, XBOXRECV, HIDUniversal, PS3USB, XBOXUSB, and XBOXOLD.

      +

      Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, ACM, USBHub, FTDI, ADK, HIDUniversal, XBOXRECV, XBOXUSB, PS3USB, XBOXOLD, and XBOXONE.

      -

      Definition at line 134 of file UsbCore.h.

      +

      Definition at line 136 of file UsbCore.h.

      @@ -286,9 +289,9 @@ Public Member Functions
      -

      Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, USBHub, ACM, FTDI, ADK, XBOXRECV, HIDUniversal, PS3USB, XBOXUSB, and XBOXOLD.

      +

      Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, ACM, USBHub, FTDI, ADK, XBOXRECV, HIDUniversal, XBOXUSB, PS3USB, XBOXOLD, and XBOXONE.

      -

      Definition at line 138 of file UsbCore.h.

      +

      Definition at line 140 of file UsbCore.h.

      @@ -316,11 +319,11 @@ Public Member Functions

      Reimplemented in USBHub.

      -

      Definition at line 142 of file UsbCore.h.

      +

      Definition at line 144 of file UsbCore.h.

      - +
      @@ -328,7 +331,7 @@ Public Member Functions - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
      - + @@ -352,13 +355,13 @@ Public Member Functions
      virtual boolean USBDeviceConfig::VIDPIDOK virtual bool USBDeviceConfig::VIDPIDOK ( uint16_t  vid,
      -

      Reimplemented in BTD, PSBuzz, XBOXRECV, ADK, PS3USB, XBOXUSB, and XBOXOLD.

      +

      Reimplemented in BTD, PSBuzz, FTDI, PS4USB, ADK, XR21B1411, XBOXRECV, XBOXUSB, PS3USB, XBOXOLD, and XBOXONE.

      -

      Definition at line 146 of file UsbCore.h.

      +

      Definition at line 148 of file UsbCore.h.

      - +
      @@ -366,7 +369,7 @@ Public Member Functions diff --git a/class_u_s_b_device_config__inherit__graph.map b/class_u_s_b_device_config__inherit__graph.map index c731a3db..58bba4d0 100644 --- a/class_u_s_b_device_config__inherit__graph.map +++ b/class_u_s_b_device_config__inherit__graph.map @@ -1,18 +1,20 @@ - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + + + diff --git a/class_u_s_b_device_config__inherit__graph.md5 b/class_u_s_b_device_config__inherit__graph.md5 index 112cb633..401d8b43 100644 --- a/class_u_s_b_device_config__inherit__graph.md5 +++ b/class_u_s_b_device_config__inherit__graph.md5 @@ -1 +1 @@ -bae7c167f0b5438ebb571bf6f171be4d \ No newline at end of file +6831024533778db2de22cf346940f001 \ 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 4e658f7417f9c7316d5dbcedc0402e23bd19abeb..5b7c1b359a61e83fef2f41b71dcd990cd4f28415 100644 GIT binary patch literal 49975 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]@p7-T`I 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 diff --git a/class_u_s_b_hub-members.html b/class_u_s_b_hub-members.html index 50fd0809..ad7414f1 100644 --- a/class_u_s_b_hub-members.html +++ b/class_u_s_b_hub-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
      - + @@ -380,9 +383,37 @@ Public Member Functions
      virtual boolean USBDeviceConfig::DEVCLASSOK virtual bool USBDeviceConfig::DEVCLASSOK ( uint8_t  klass)
      -

      Reimplemented in BulkOnly, BTD, and USBHub.

      +

      Reimplemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, and USBHub.

      -

      Definition at line 150 of file UsbCore.h.

      +

      Definition at line 152 of file UsbCore.h.

      + +
      + + +
      +
      + + + + + +
      + + + + + + + + +
      virtual bool USBDeviceConfig::DEVSUBCLASSOK (uint8_t subklass)
      +
      +inlinevirtual
      +
      + +

      Reimplemented in HIDBoot< BOOT_PROTOCOL >.

      + +

      Definition at line 156 of file UsbCore.h.

      @@ -394,7 +425,7 @@ Public Member Functions
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
      +
      @@ -93,27 +94,28 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      ClearHubFeature(uint8_t fid)USBHubinline
      ClearPortFeature(uint8_t fid, uint8_t port, uint8_t sel=0)USBHubinline
      ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlineprivatevirtual
      DEVCLASSOK(uint8_t klass)USBHubinlinevirtual
      GetAddress()USBHubinlinevirtual
      GetHubDescriptor(uint8_t index, uint16_t nbytes, uint8_t *dataptr)USBHubinline
      GetHubStatus(uint16_t nbytes, uint8_t *dataptr)USBHubinline
      GetPortStatus(uint8_t port, uint16_t nbytes, uint8_t *dataptr)USBHubinline
      Init(uint8_t parent, uint8_t port, bool lowspeed)USBHubvirtual
      Poll()USBHubvirtual
      PrintHubStatus()USBHub
      Release()USBHubvirtual
      ResetHubPort(uint8_t port)USBHubvirtual
      SetHubDescriptor(uint8_t port, uint16_t nbytes, uint8_t *dataptr)USBHubinline
      SetHubFeature(uint8_t fid)USBHubinline
      SetPortFeature(uint8_t fid, uint8_t port, uint8_t sel=0)USBHubinline
      USBHub(USB *p)USBHub
      VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlineprivatevirtual
      DEVCLASSOK(uint8_t klass)USBHubinlinevirtual
      DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlineprivatevirtual
      GetAddress()USBHubinlinevirtual
      GetHubDescriptor(uint8_t index, uint16_t nbytes, uint8_t *dataptr)USBHubinline
      GetHubStatus(uint16_t nbytes, uint8_t *dataptr)USBHubinline
      GetPortStatus(uint8_t port, uint16_t nbytes, uint8_t *dataptr)USBHubinline
      Init(uint8_t parent, uint8_t port, bool lowspeed)USBHubvirtual
      Poll()USBHubvirtual
      PrintHubStatus()USBHub
      Release()USBHubvirtual
      ResetHubPort(uint8_t port)USBHubvirtual
      SetHubDescriptor(uint8_t port, uint16_t nbytes, uint8_t *dataptr)USBHubinline
      SetHubFeature(uint8_t fid)USBHubinline
      SetPortFeature(uint8_t fid, uint8_t port, uint8_t sel=0)USBHubinline
      USBHub(USB *p)USBHub
      VIDPIDOK(uint16_t vid, uint16_t pid)USBDeviceConfiginlineprivatevirtual
      diff --git a/class_u_s_b_hub.html b/class_u_s_b_hub.html index b24ee529..85948d66 100644 --- a/class_u_s_b_hub.html +++ b/class_u_s_b_hub.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USBHub Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -129,18 +130,18 @@ Public Member Functions   void PrintHubStatus ()   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   -virtual void ResetHubPort (uint8_t port) +void ResetHubPort (uint8_t port)   virtual uint8_t GetAddress ()   -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) + 

      Detailed Description

      @@ -631,7 +632,7 @@ Public Member Functions
      - +
      @@ -639,7 +640,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 b9529b44..5328fe8d 100644 --- a/class_u_s_b_hub__coll__graph.md5 +++ b/class_u_s_b_hub__coll__graph.md5 @@ -1 +1 @@ -829d383fdf38e9eac95bde2714eaf868 \ No newline at end of file +bf8ca3c3b9277566d37448eda78dfa47 \ No newline at end of file diff --git a/class_u_s_b_hub__inherit__graph.md5 b/class_u_s_b_hub__inherit__graph.md5 index b9529b44..5328fe8d 100644 --- a/class_u_s_b_hub__inherit__graph.md5 +++ b/class_u_s_b_hub__inherit__graph.md5 @@ -1 +1 @@ -829d383fdf38e9eac95bde2714eaf868 \ No newline at end of file +bf8ca3c3b9277566d37448eda78dfa47 \ No newline at end of file diff --git a/class_u_s_b_read_parser-members.html b/class_u_s_b_read_parser-members.html index d275016f..e7cfbe3c 100644 --- a/class_u_s_b_read_parser-members.html +++ b/class_u_s_b_read_parser-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
      - + @@ -653,7 +654,7 @@ Public Member Functions
      virtual boolean USBHub::DEVCLASSOK virtual bool USBHub::DEVCLASSOK ( uint8_t  klass)
      -

      Reimplemented from USBDeviceConfig.

      +

      Reimplemented from USBDeviceConfig.

      Definition at line 203 of file usbhub.h.

      @@ -668,7 +669,7 @@ Public Member Functions
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
      +
      @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_u_s_b_read_parser.html b/class_u_s_b_read_parser.html index efb5c8ab..7d065f5a 100644 --- a/class_u_s_b_read_parser.html +++ b/class_u_s_b_read_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USBReadParser Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -107,7 +108,7 @@ Public Member Functions

      Detailed Description

      -

      Definition at line 185 of file UsbCore.h.

      +

      Definition at line 192 of file UsbCore.h.

      Member Function Documentation

      @@ -159,7 +160,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 3e81e179..b9ca8675 100644 --- a/class_u_s_b_read_parser__inherit__graph.md5 +++ b/class_u_s_b_read_parser__inherit__graph.md5 @@ -1 +1 @@ -a4a6a1be4628303ad484eca83de7cecb \ No newline at end of file +ec3e429c5021a90ad76c1c993c8aa8bc \ No newline at end of file diff --git a/class_universal_report_parser-members.html b/class_universal_report_parser-members.html index c451b1e7..99a4f37e 100644 --- a/class_universal_report_parser-members.html +++ b/class_universal_report_parser-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
      +
      @@ -96,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_universal_report_parser.html b/class_universal_report_parser.html index b09d41f0..fcf4fd05 100644 --- a/class_universal_report_parser.html +++ b/class_universal_report_parser.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UniversalReportParser Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -114,7 +115,7 @@ Public Member Functions

      Detailed Description

      -

      Definition at line 168 of file hidescriptorparser.h.

      +

      Definition at line 170 of file hidescriptorparser.h.

      Member Function Documentation

      @@ -162,7 +163,7 @@ Public Member Functions

      Implements HIDReportParser.

      -

      Definition at line 1592 of file hidescriptorparser.cpp.

      +

      Definition at line 1581 of file hidescriptorparser.cpp.

      @@ -175,7 +176,7 @@ Public Member Functions diff --git a/class_universal_report_parser__coll__graph.md5 b/class_universal_report_parser__coll__graph.md5 index 84a58c13..18ce6809 100644 --- a/class_universal_report_parser__coll__graph.md5 +++ b/class_universal_report_parser__coll__graph.md5 @@ -1 +1 @@ -53ad9438e520f79d9514bd51ffe26f67 \ No newline at end of file +6ae2ae36eea0ce9a020916893890ce48 \ No newline at end of file diff --git a/class_universal_report_parser__inherit__graph.md5 b/class_universal_report_parser__inherit__graph.md5 index 84a58c13..18ce6809 100644 --- a/class_universal_report_parser__inherit__graph.md5 +++ b/class_universal_report_parser__inherit__graph.md5 @@ -1 +1 @@ -53ad9438e520f79d9514bd51ffe26f67 \ No newline at end of file +6ae2ae36eea0ce9a020916893890ce48 \ No newline at end of file diff --git a/class_usb_config_xtracter-members.html b/class_usb_config_xtracter-members.html index 0656d528..8f15dc75 100644 --- a/class_usb_config_xtracter-members.html +++ b/class_usb_config_xtracter-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -90,13 +91,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

      This is the complete list of members for UsbConfigXtracter, including all inherited members.

      - +
      EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)=0UsbConfigXtracterpure virtual
      EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)UsbConfigXtracterinlinevirtual
      diff --git a/class_usb_config_xtracter.html b/class_usb_config_xtracter.html index 3d782daa..e56ebe70 100644 --- a/class_usb_config_xtracter.html +++ b/class_usb_config_xtracter.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: UsbConfigXtracter Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -87,7 +88,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Public Member Functions | List of all members
      -
      UsbConfigXtracter Class Referenceabstract
      +
      UsbConfigXtracter Class Reference
      @@ -97,19 +98,19 @@ Inheritance diagram for UsbConfigXtracter:
      Inheritance graph
      - +
      [legend]
      - - + +

      Public Member Functions

      virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)=0
       
      virtual void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
       

      Detailed Description

      Definition at line 23 of file confdescparser.h.

      Member Function Documentation

      - +
      @@ -154,12 +155,14 @@ Public Member Functions
      -pure virtual +inlinevirtual
      -

      Implemented in BulkOnly, BTD, HIDBoot< BOOT_PROTOCOL >, ACM, FTDI, ADK, and HIDUniversal.

      +

      Reimplemented in BulkOnly, BTD, ACM, HIDBoot< BOOT_PROTOCOL >, FTDI, ADK, and HIDUniversal.

      + +

      Definition at line 28 of file confdescparser.h.

      @@ -171,7 +174,7 @@ Public Member Functions diff --git a/class_usb_config_xtracter__inherit__graph.map b/class_usb_config_xtracter__inherit__graph.map index 0bd79956..53fd6c0d 100644 --- a/class_usb_config_xtracter__inherit__graph.map +++ b/class_usb_config_xtracter__inherit__graph.map @@ -1,13 +1,14 @@ - - - - - - + + + + + + - - - - + + + + + diff --git a/class_usb_config_xtracter__inherit__graph.md5 b/class_usb_config_xtracter__inherit__graph.md5 index cbb27042..c6fb1571 100644 --- a/class_usb_config_xtracter__inherit__graph.md5 +++ b/class_usb_config_xtracter__inherit__graph.md5 @@ -1 +1 @@ -6891acf957621ad6ed7fe7d0952ae234 \ No newline at end of file +73a44afb42037ad6712c5c061d4add8c \ 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 dcda6542967779cdbb3c53cc0e741ec40a2ee0bc..130119db055669cb2235653086b30c8051094c48 100644 GIT binary patch literal 31343 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 literal 28670 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 H-i!P{;VJq3 diff --git a/class_w_i_i-members.html b/class_w_i_i-members.html index 0823d17e..351e9d2c 100644 --- a/class_w_i_i-members.html +++ b/class_w_i_i-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -96,8 +97,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); accYwiimoteWII accZnunchuckWII accZwiimoteWII - ACLData(uint8_t *ACLData)WIIvirtual - attachOnInit(void(*funcOnInit)(void))WIIinline + ACLData(uint8_t *ACLData)WIIprotectedvirtual + attachOnInit(void(*funcOnInit)(void))BluetoothServiceinline + BluetoothService(BTD *p)BluetoothServiceinline + checkHciHandle(uint8_t *buf, uint16_t handle)BluetoothServiceinlineprotected disconnect()WIIvirtual getAnalogHat(HatEnum a)WII getAnalogHat(AnalogHatEnum a)WII @@ -133,17 +136,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); gyroYawWII gyroYawRawWII gyroYawZeroWII + hci_handleBluetoothServiceprotected + identifierBluetoothServiceprotected IRinitialize()WII isIRCameraEnabled()WIIinline - motionPlusConnectedWII - nunchuckConnectedWII + l2cap_event_flagBluetoothServiceprotected + motionPlusConnectedWII + nunchuckConnectedWII + onInit()WIIprotectedvirtual pair(void)WIIinline + pBtdBluetoothServiceprotected + pFuncOnInitBluetoothServiceprotected pitchGyroScaleWII pitchGyroSpeedWII - Reset()WIIvirtual + Reset()WIIprotectedvirtual rollGyroScaleWII rollGyroSpeedWII - Run()WIIvirtual + Run()WIIprotectedvirtual setAllOff()WII setLedOff()WIIinline setLedOff(LEDEnum a)WII @@ -164,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/class_w_i_i.html b/class_w_i_i.html index f6b79910..fc291440 100644 --- a/class_w_i_i.html +++ b/class_w_i_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: WII Class Reference + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -105,22 +106,13 @@ Collaboration diagram for WII:
      Collaboration graph
      - +
      [legend]
      - - - - - - - - - @@ -162,8 +154,6 @@ Public Member Functions - - @@ -205,6 +195,11 @@ Public Member Functions + + + + +

      Public Member Functions

       WII (BTD *p, bool pair=false)
       
      BluetoothService implementation
      virtual void ACLData (uint8_t *ACLData)
       
      virtual void Run ()
       
      virtual void Reset ()
       
      virtual void disconnect ()
       
      Wii Controller functions
      bool getButtonPress (ButtonEnum b)
       
       
      uint8_t getWiiState ()
       
      void attachOnInit (void(*funcOnInit)(void))
       
      double getWiimotePitch ()
       
       
      bool isIRCameraEnabled ()
       
      - Public Member Functions inherited from BluetoothService
       BluetoothService (BTD *p)
       
      void attachOnInit (void(*funcOnInit)(void))
       
      @@ -264,6 +259,36 @@ Public Attributes +

      Public Attributes

       
      int16_t gyroPitchZero
       
      + + + + + + + + + + + +

      +BluetoothService implementation

      void disconnect ()
       
      void ACLData (uint8_t *ACLData)
       
      void Run ()
       
      void Reset ()
       
      void onInit ()
       
      + + + + + + + + + + + + + + +

      +Additional Inherited Members

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

      Detailed Description

      This BluetoothService class implements support for the Wiimote including the Nunchuck and Motion Plus extension.

      @@ -307,96 +332,6 @@ Public Attributes

      Member Function Documentation

      - -
      -
      - - - - - -
      - - - - - - - - -
      void WII::ACLData (uint8_t * ACLData)
      -
      -virtual
      -
      -

      Used to pass acldata to the services.

      Parameters
      - - -
      ACLDataIncoming acldata.
      -
      -
      - -

      Reimplemented from BluetoothService.

      - -

      Definition at line 135 of file Wii.cpp.

      - -
      -
      - -
      -
      - - - - - -
      - - - - - - - -
      void WII::Run ()
      -
      -virtual
      -
      -

      Used to run part of the state machine.

      - -

      Reimplemented from BluetoothService.

      - -

      Definition at line 684 of file Wii.cpp.

      - -
      -
      - -
      -
      - - - - - -
      - - - - - - - -
      void WII::Reset ()
      -
      -virtual
      -
      -

      Use this to reset the service.

      - -

      Reimplemented from BluetoothService.

      - -

      Definition at line 104 of file Wii.cpp.

      - -
      -
      @@ -419,9 +354,9 @@ Public Attributes

      Used this to disconnect any of the controllers.

      -

      Reimplemented from BluetoothService.

      +

      Implements BluetoothService.

      -

      Definition at line 118 of file Wii.cpp.

      +

      Definition at line 115 of file Wii.cpp.

      @@ -448,7 +383,7 @@ Public 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 1041 of file Wii.cpp.

      +

      Definition at line 1038 of file Wii.cpp.

      @@ -475,7 +410,7 @@ Public 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 1048 of file Wii.cpp.

      +

      Definition at line 1045 of file Wii.cpp.

      @@ -502,7 +437,7 @@ Public Attributes

      Call this to start the paring sequence with a controller

      -

      Definition at line 89 of file Wii.h.

      +

      Definition at line 80 of file Wii.h.

      @@ -527,7 +462,7 @@ Public Attributes
      Returns
      Return the analog value in the range from approximately 25-230.
      -

      Definition at line 1059 of file Wii.cpp.

      +

      Definition at line 1056 of file Wii.cpp.

      @@ -552,7 +487,7 @@ Public Attributes
      Returns
      Return the analog value in the range from approximately 800-3200.
      -

      Definition at line 1071 of file Wii.cpp.

      +

      Definition at line 1068 of file Wii.cpp.

      @@ -578,7 +513,7 @@ Public Attributes

      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 101 of file Wii.h.

      @@ -604,7 +539,7 @@ Public Attributes

      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 111 of file Wii.h.

      @@ -631,7 +566,7 @@ Public Attributes

      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 123 of file Wii.h.

      @@ -649,7 +584,7 @@ Public Attributes

      Used to set all LEDs and rumble off.

      -

      Definition at line 854 of file Wii.cpp.

      +

      Definition at line 851 of file Wii.cpp.

      @@ -667,7 +602,7 @@ Public Attributes

      Turn off rumble.

      -

      Definition at line 860 of file Wii.cpp.

      +

      Definition at line 857 of file Wii.cpp.

      @@ -685,7 +620,7 @@ Public Attributes

      Turn on rumble.

      -

      Definition at line 866 of file Wii.cpp.

      +

      Definition at line 863 of file Wii.cpp.

      @@ -703,7 +638,7 @@ Public Attributes

      Toggle rumble.

      -

      Definition at line 872 of file Wii.cpp.

      +

      Definition at line 869 of file Wii.cpp.

      @@ -727,7 +662,7 @@ Public Attributes -

      Definition at line 878 of file Wii.cpp.

      +

      Definition at line 875 of file Wii.cpp.

      @@ -753,7 +688,7 @@ Public Attributes

      Turn all LEDs off.

      -

      Definition at line 152 of file Wii.h.

      +

      Definition at line 143 of file Wii.h.

      @@ -777,7 +712,7 @@ Public Attributes -

      Definition at line 884 of file Wii.cpp.

      +

      Definition at line 881 of file Wii.cpp.

      @@ -801,7 +736,7 @@ Public Attributes -

      Definition at line 890 of file Wii.cpp.

      +

      Definition at line 887 of file Wii.cpp.

      @@ -825,7 +760,7 @@ Public Attributes -

      Definition at line 900 of file Wii.cpp.

      +

      Definition at line 897 of file Wii.cpp.

      @@ -844,7 +779,7 @@ Public Attributes

      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 906 of file Wii.cpp.

      +

      Definition at line 903 of file Wii.cpp.

      @@ -862,7 +797,7 @@ Public Attributes

      Return the battery level of the Wiimote.

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

      Definition at line 919 of file Wii.cpp.

      +

      Definition at line 916 of file Wii.cpp.

      @@ -888,39 +823,7 @@ Public Attributes

      Return the Wiimote state.

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

      Definition at line 189 of file Wii.h.

      - -
      - - -
      -
      - - - - - -
      - - - - - - - - -
      void WII::attachOnInit (void(*)(void) funcOnInit)
      -
      -inline
      -
      -

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

      Parameters
      - - -
      funcOnInitFunction to call.
      -
      -
      - -

      Definition at line 197 of file Wii.h.

      +

      Definition at line 180 of file Wii.h.

      @@ -946,7 +849,7 @@ Public Attributes

      Pitch and roll calculated from the accelerometer inside the Wiimote.

      -

      Definition at line 218 of file Wii.h.

      +

      Definition at line 201 of file Wii.h.

      @@ -972,7 +875,7 @@ Public Attributes

      Pitch and roll calculated from the accelerometer inside the Wiimote.

      -

      Definition at line 222 of file Wii.h.

      +

      Definition at line 205 of file Wii.h.

      @@ -998,7 +901,7 @@ Public Attributes

      Pitch and roll calculated from the accelerometer inside the Nunchuck.

      -

      Definition at line 230 of file Wii.h.

      +

      Definition at line 213 of file Wii.h.

      @@ -1024,7 +927,7 @@ Public Attributes

      Pitch and roll calculated from the accelerometer inside the Nunchuck.

      -

      Definition at line 234 of file Wii.h.

      +

      Definition at line 217 of file Wii.h.

      @@ -1042,7 +945,7 @@ Public Attributes

      Initialises the camera as per the steps from: http://wiibrew.org/wiki/Wiimote#IR_Camera

      -

      Definition at line 1096 of file Wii.cpp.

      +

      Definition at line 1093 of file Wii.cpp.

      @@ -1068,7 +971,7 @@ Public Attributes

      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 292 of file Wii.h.

      +

      Definition at line 275 of file Wii.h.

      @@ -1094,7 +997,7 @@ Public Attributes

      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 300 of file Wii.h.

      +

      Definition at line 283 of file Wii.h.

      @@ -1120,7 +1023,7 @@ Public Attributes

      IR object 1 size read from the Wii IR camera.

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

      Definition at line 308 of file Wii.h.

      +

      Definition at line 291 of file Wii.h.

      @@ -1146,7 +1049,7 @@ Public Attributes

      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 316 of file Wii.h.

      +

      Definition at line 299 of file Wii.h.

      @@ -1172,7 +1075,7 @@ Public Attributes

      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 324 of file Wii.h.

      +

      Definition at line 307 of file Wii.h.

      @@ -1198,7 +1101,7 @@ Public Attributes

      IR object 2 size read from the Wii IR camera.

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

      Definition at line 332 of file Wii.h.

      +

      Definition at line 315 of file Wii.h.

      @@ -1224,7 +1127,7 @@ Public Attributes

      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 340 of file Wii.h.

      +

      Definition at line 323 of file Wii.h.

      @@ -1250,7 +1153,7 @@ Public Attributes

      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 348 of file Wii.h.

      +

      Definition at line 331 of file Wii.h.

      @@ -1276,7 +1179,7 @@ Public Attributes

      IR object 3 size read from the Wii IR camera.

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

      Definition at line 356 of file Wii.h.

      +

      Definition at line 339 of file Wii.h.

      @@ -1302,7 +1205,7 @@ Public Attributes

      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 364 of file Wii.h.

      +

      Definition at line 347 of file Wii.h.

      @@ -1328,7 +1231,7 @@ Public Attributes

      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 372 of file Wii.h.

      +

      Definition at line 355 of file Wii.h.

      @@ -1354,7 +1257,7 @@ Public Attributes

      IR object 4 size read from the Wii IR camera.

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

      Definition at line 380 of file Wii.h.

      +

      Definition at line 363 of file Wii.h.

      @@ -1380,7 +1283,125 @@ Public Attributes

      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 389 of file Wii.h.

      +

      Definition at line 372 of file Wii.h.

      + +
      + + +
      +
      + + + + + +
      + + + + + + + + +
      void WII::ACLData (uint8_t * ACLData)
      +
      +protectedvirtual
      +
      +

      Used to pass acldata to the services.

      Parameters
      + + +
      ACLDataIncoming acldata.
      +
      +
      + +

      Implements BluetoothService.

      + +

      Definition at line 132 of file Wii.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      void WII::Run ()
      +
      +protectedvirtual
      +
      +

      Used to run part of the state machine.

      + +

      Implements BluetoothService.

      + +

      Definition at line 681 of file Wii.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      void WII::Reset ()
      +
      +protectedvirtual
      +
      +

      Use this to reset the service.

      + +

      Implements BluetoothService.

      + +

      Definition at line 101 of file Wii.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      void WII::onInit ()
      +
      +protectedvirtual
      +
      +

      Called when the controller is successfully initialized. Use attachOnInit(void (*funcOnInit)(void)) to call your own function. This is useful for instance if you want to set the LEDs in a specific way.

      + +

      Implements BluetoothService.

      + +

      Definition at line 1080 of file Wii.cpp.

      @@ -1396,7 +1417,7 @@ Public Attributes

      Variable used to indicate if a Wiimote is connected.

      -

      Definition at line 199 of file Wii.h.

      +

      Definition at line 182 of file Wii.h.

      @@ -1411,7 +1432,7 @@ Public Attributes

      Variable used to indicate if a Nunchuck controller is connected.

      -

      Definition at line 206 of file Wii.h.

      +

      Definition at line 189 of file Wii.h.

      @@ -1426,7 +1447,7 @@ Public Attributes

      Variable used to indicate if a Nunchuck controller is connected.

      -

      Definition at line 208 of file Wii.h.

      +

      Definition at line 191 of file Wii.h.

      @@ -1441,7 +1462,7 @@ Public Attributes

      Variable used to indicate if a Wii U Pro controller is connected.

      -

      Definition at line 210 of file Wii.h.

      +

      Definition at line 193 of file Wii.h.

      @@ -1456,7 +1477,7 @@ Public Attributes

      Accelerometer values used to calculate pitch and roll.

      -

      Definition at line 236 of file Wii.h.

      +

      Definition at line 219 of file Wii.h.

      @@ -1471,7 +1492,7 @@ Public Attributes

      Accelerometer values used to calculate pitch and roll.

      -

      Definition at line 236 of file Wii.h.

      +

      Definition at line 219 of file Wii.h.

      @@ -1486,7 +1507,7 @@ Public Attributes

      Accelerometer values used to calculate pitch and roll.

      -

      Definition at line 236 of file Wii.h.

      +

      Definition at line 219 of file Wii.h.

      @@ -1501,7 +1522,7 @@ Public Attributes

      Accelerometer values used to calculate pitch and roll.

      -

      Definition at line 242 of file Wii.h.

      +

      Definition at line 225 of file Wii.h.

      @@ -1516,7 +1537,7 @@ Public Attributes

      Accelerometer values used to calculate pitch and roll.

      -

      Definition at line 242 of file Wii.h.

      +

      Definition at line 225 of file Wii.h.

      @@ -1531,7 +1552,7 @@ Public Attributes

      Accelerometer values used to calculate pitch and roll.

      -

      Definition at line 242 of file Wii.h.

      +

      Definition at line 225 of file Wii.h.

      @@ -1546,7 +1567,7 @@ Public Attributes

      This is the pitch calculated by the gyro - use this to tune WII::pitchGyroScale.

      -

      Definition at line 247 of file Wii.h.

      +

      Definition at line 230 of file Wii.h.

      @@ -1561,7 +1582,7 @@ Public Attributes

      This is the roll calculated by the gyro - use this to tune WII::rollGyroScale.

      -

      Definition at line 249 of file Wii.h.

      +

      Definition at line 232 of file Wii.h.

      @@ -1576,7 +1597,7 @@ Public Attributes

      This is the yaw calculated by the gyro - use this to tune WII::yawGyroScale.

      -

      Definition at line 251 of file Wii.h.

      +

      Definition at line 234 of file Wii.h.

      @@ -1591,7 +1612,7 @@ Public Attributes

      The speed in deg/s from the gyro.

      -

      Definition at line 255 of file Wii.h.

      +

      Definition at line 238 of file Wii.h.

      @@ -1606,7 +1627,7 @@ Public Attributes

      The speed in deg/s from the gyro.

      -

      Definition at line 256 of file Wii.h.

      +

      Definition at line 239 of file Wii.h.

      @@ -1621,7 +1642,7 @@ Public Attributes

      The speed in deg/s from the gyro.

      -

      Definition at line 257 of file Wii.h.

      +

      Definition at line 240 of file Wii.h.

      @@ -1636,7 +1657,7 @@ Public Attributes

      You might need to fine-tune these values.

      -

      Definition at line 262 of file Wii.h.

      +

      Definition at line 245 of file Wii.h.

      @@ -1651,7 +1672,7 @@ Public Attributes

      You might need to fine-tune these values.

      -

      Definition at line 263 of file Wii.h.

      +

      Definition at line 246 of file Wii.h.

      @@ -1666,7 +1687,7 @@ Public Attributes

      You might need to fine-tune these values.

      -

      Definition at line 264 of file Wii.h.

      +

      Definition at line 247 of file Wii.h.

      @@ -1681,7 +1702,7 @@ Public Attributes

      Raw value read directly from the Motion Plus.

      -

      Definition at line 269 of file Wii.h.

      +

      Definition at line 252 of file Wii.h.

      @@ -1696,7 +1717,7 @@ Public Attributes

      Raw value read directly from the Motion Plus.

      -

      Definition at line 270 of file Wii.h.

      +

      Definition at line 253 of file Wii.h.

      @@ -1711,7 +1732,7 @@ Public Attributes

      Raw value read directly from the Motion Plus.

      -

      Definition at line 271 of file Wii.h.

      +

      Definition at line 254 of file Wii.h.

      @@ -1726,7 +1747,7 @@ Public Attributes

      These values are set when the controller is first initialized.

      -

      Definition at line 276 of file Wii.h.

      +

      Definition at line 259 of file Wii.h.

      @@ -1741,7 +1762,7 @@ Public Attributes

      These values are set when the controller is first initialized.

      -

      Definition at line 277 of file Wii.h.

      +

      Definition at line 260 of file Wii.h.

      @@ -1756,7 +1777,7 @@ Public Attributes

      These values are set when the controller is first initialized.

      -

      Definition at line 278 of file Wii.h.

      +

      Definition at line 261 of file Wii.h.

      @@ -1769,7 +1790,7 @@ Public Attributes diff --git a/class_w_i_i__coll__graph.map b/class_w_i_i__coll__graph.map index b77c71f3..cef2072f 100644 --- a/class_w_i_i__coll__graph.map +++ b/class_w_i_i__coll__graph.map @@ -1,3 +1,9 @@ - + + + + + + + diff --git a/class_w_i_i__coll__graph.md5 b/class_w_i_i__coll__graph.md5 index 082665f3..32ea2769 100644 --- a/class_w_i_i__coll__graph.md5 +++ b/class_w_i_i__coll__graph.md5 @@ -1 +1 @@ -274c2668d752a02d95ef3bcfd0e20596 \ No newline at end of file +e2fa40aab171687d763b41a969505c68 \ No newline at end of file diff --git a/class_w_i_i__coll__graph.png b/class_w_i_i__coll__graph.png index 3255cae96c68ab7aa9b406fb6523026b4ed15220..4fc5e0850a095b7c1bf09acab4044061dc95f305 100644 GIT binary patch literal 22282 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 KfL#NDoboR#7FQww literal 3461 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 JmFc2l{s$&Jo$det diff --git a/class_w_i_i__inherit__graph.md5 b/class_w_i_i__inherit__graph.md5 index 082665f3..6b41428e 100644 --- a/class_w_i_i__inherit__graph.md5 +++ b/class_w_i_i__inherit__graph.md5 @@ -1 +1 @@ -274c2668d752a02d95ef3bcfd0e20596 \ No newline at end of file +0f2ab569d0b7006cfff8d64fe9f9fda1 \ No newline at end of file diff --git a/class_x_b_o_x_o_l_d-members.html b/class_x_b_o_x_o_l_d-members.html index 0df0a265..093ed896 100644 --- a/class_x_b_o_x_o_l_d-members.html +++ b/class_x_b_o_x_o_l_d-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -93,29 +94,30 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); attachOnInit(void(*funcOnInit)(void))XBOXOLDinline bAddressXBOXOLDprotected ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual - DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual - epInfoXBOXOLDprotected - GetAddress()XBOXOLDinlinevirtual - getAnalogHat(AnalogHatEnum a)XBOXOLD - getButtonClick(ButtonEnum b)XBOXOLD - getButtonPress(ButtonEnum b)XBOXOLD - Init(uint8_t parent, uint8_t port, bool lowspeed)XBOXOLDvirtual - isReady()XBOXOLDinlinevirtual - Poll()XBOXOLDvirtual - pUsbXBOXOLDprotected - Release()XBOXOLDvirtual - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - setRumbleOff()XBOXOLDinline - setRumbleOn(uint8_t lValue, uint8_t rValue)XBOXOLD - VIDPIDOK(uint16_t vid, uint16_t pid)XBOXOLDinlinevirtual - XboxConnectedXBOXOLD - XBOXOLD(USB *pUsb)XBOXOLD + DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + epInfoXBOXOLDprotected + GetAddress()XBOXOLDinlinevirtual + getAnalogHat(AnalogHatEnum a)XBOXOLD + getButtonClick(ButtonEnum b)XBOXOLD + getButtonPress(ButtonEnum b)XBOXOLD + Init(uint8_t parent, uint8_t port, bool lowspeed)XBOXOLDvirtual + isReady()XBOXOLDinlinevirtual + Poll()XBOXOLDvirtual + pUsbXBOXOLDprotected + Release()XBOXOLDvirtual + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + setRumbleOff()XBOXOLDinline + setRumbleOn(uint8_t lValue, uint8_t rValue)XBOXOLD + VIDPIDOK(uint16_t vid, uint16_t pid)XBOXOLDinlinevirtual + XboxConnectedXBOXOLD + XBOXOLD(USB *pUsb)XBOXOLD
      diff --git a/class_x_b_o_x_o_l_d.html b/class_x_b_o_x_o_l_d.html index 9d0089f1..1089f538 100644 --- a/class_x_b_o_x_o_l_d.html +++ b/class_x_b_o_x_o_l_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXOLD Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -114,18 +115,18 @@ Public Member Functions  XBOXOLD (USB *pUsb)  
      USBDeviceConfig implementation
      -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   virtual bool isReady ()   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) + 
      Xbox Controller functions
      uint8_t getButtonPress (ButtonEnum b)   @@ -144,8 +145,10 @@ Public Member Functions   virtual void ResetHubPort (uint8_t port)   -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  @@ -164,7 +167,7 @@ Protected Attributes

      Detailed Description

      This class implements support for a the original Xbox controller via USB.

      -

      Definition at line 52 of file XBOXOLD.h.

      +

      Definition at line 46 of file XBOXOLD.h.

      Constructor & Destructor Documentation

      @@ -324,7 +327,7 @@ Protected Attributes

      Reimplemented from USBDeviceConfig.

      -

      Definition at line 84 of file XBOXOLD.h.

      +

      Definition at line 78 of file XBOXOLD.h.

      @@ -350,11 +353,11 @@ Protected Attributes

      Used to check if the controller has been initialized.

      Returns
      True if it's ready.
      -

      Definition at line 92 of file XBOXOLD.h.

      +

      Definition at line 86 of file XBOXOLD.h.

      - +

      Public Attributes

      @@ -362,7 +365,7 @@ Protected Attributes
      - + @@ -394,9 +397,9 @@ Protected Attributes
      Returns
      Returns true if the device's VID and PID matches this driver.
      -

      Reimplemented from USBDeviceConfig.

      +

      Reimplemented from USBDeviceConfig.

      -

      Definition at line 102 of file XBOXOLD.h.

      +

      Definition at line 96 of file XBOXOLD.h.

      @@ -501,7 +504,7 @@ Protected Attributes

      Turn rumble off the controller.

      -

      Definition at line 131 of file XBOXOLD.h.

      +

      Definition at line 125 of file XBOXOLD.h.

      @@ -568,7 +571,7 @@ Protected Attributes -

      Definition at line 145 of file XBOXOLD.h.

      +

      Definition at line 139 of file XBOXOLD.h.

      @@ -584,7 +587,7 @@ Protected Attributes

      True if a Xbox controller is connected.

      -

      Definition at line 147 of file XBOXOLD.h.

      +

      Definition at line 141 of file XBOXOLD.h.

      @@ -607,7 +610,7 @@ Protected Attributes

      Pointer to USB class instance.

      -

      Definition at line 155 of file XBOXOLD.h.

      +

      Definition at line 149 of file XBOXOLD.h.

      @@ -630,7 +633,7 @@ Protected Attributes

      Device address.

      -

      Definition at line 157 of file XBOXOLD.h.

      +

      Definition at line 151 of file XBOXOLD.h.

      @@ -653,7 +656,7 @@ Protected Attributes

      Endpoint info structure.

      -

      Definition at line 159 of file XBOXOLD.h.

      +

      Definition at line 153 of file XBOXOLD.h.

      @@ -666,7 +669,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 080b0529..c02a188a 100644 --- a/class_x_b_o_x_o_l_d__coll__graph.md5 +++ b/class_x_b_o_x_o_l_d__coll__graph.md5 @@ -1 +1 @@ -c19d30d5e649c9f2f16f4d7e601bbf7f \ No newline at end of file +3285ca35607fc26fc3c6347499cd29e6 \ No newline at end of file diff --git a/class_x_b_o_x_o_l_d__inherit__graph.md5 b/class_x_b_o_x_o_l_d__inherit__graph.md5 index 037a1214..73dafbc3 100644 --- a/class_x_b_o_x_o_l_d__inherit__graph.md5 +++ b/class_x_b_o_x_o_l_d__inherit__graph.md5 @@ -1 +1 @@ -98da7f9bfeb2fdd99a2d7ac6d8b06832 \ No newline at end of file +1eeb2bcd708d5b17ef18f534c5633a29 \ No newline at end of file diff --git a/class_x_b_o_x_o_n_e-members.html b/class_x_b_o_x_o_n_e-members.html new file mode 100644 index 00000000..eca0c765 --- /dev/null +++ b/class_x_b_o_x_o_n_e-members.html @@ -0,0 +1,121 @@ + + + + + + +USB Host Shield 2.0: Member List + + + + + + + + + + + +
      +
      +
      virtual boolean XBOXOLD::VIDPIDOK virtual bool XBOXOLD::VIDPIDOK ( uint16_t  vid,
      + + + + + +
      +
      USB Host Shield 2.0 +
      +
      + + + + + + + +
      +
      + + +
      + +
      + + +
      +
      +
      XBOXONE Member List
      +
      +
      + +

      This is the complete list of members for XBOXONE, including all inherited members.

      + + + + + + + + + + + + + + + + + + + + +
      attachOnInit(void(*funcOnInit)(void))XBOXONEinline
      bAddressXBOXONEprotected
      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
      pUsbXBOXONEprotected
      Release()XBOXONEvirtual
      ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
      VIDPIDOK(uint16_t vid, uint16_t pid)XBOXONEinlinevirtual
      XBOXONE(USB *pUsb)XBOXONE
      XboxOneConnectedXBOXONE
      + + + + diff --git a/class_x_b_o_x_o_n_e.html b/class_x_b_o_x_o_n_e.html new file mode 100644 index 00000000..c5acccb1 --- /dev/null +++ b/class_x_b_o_x_o_n_e.html @@ -0,0 +1,610 @@ + + + + + + +USB Host Shield 2.0: XBOXONE Class Reference + + + + + + + + + + + +
      +
      + + + + + + +
      +
      USB Host Shield 2.0 +
      +
      +
      + + + + + + +
      +
      + + +
      + +
      + +
      + +
      + +

      #include <XBOXONE.h>

      +
      +Inheritance diagram for XBOXONE:
      +
      +
      Inheritance graph
      + + +
      [legend]
      +
      +Collaboration diagram for XBOXONE:
      +
      +
      Collaboration graph
      + + +
      [legend]
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       XBOXONE (USB *pUsb)
       
      USBDeviceConfig implementation
      virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)
       
      virtual uint8_t Release ()
       
      virtual uint8_t Poll ()
       
      virtual uint8_t GetAddress ()
       
      virtual bool isReady ()
       
      virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid)
       
      Xbox Controller functions
      uint16_t getButtonPress (ButtonEnum b)
       
      bool getButtonClick (ButtonEnum b)
       
      int16_t getAnalogHat (AnalogHatEnum a)
       
      void attachOnInit (void(*funcOnInit)(void))
       
      - Public Member Functions inherited from USBDeviceConfig
      virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)
       
      virtual void ResetHubPort (uint8_t port)
       
      virtual bool DEVCLASSOK (uint8_t klass)
       
      virtual bool DEVSUBCLASSOK (uint8_t subklass)
       
      + + + +

      +Public Attributes

      bool XboxOneConnected
       
      + + + + + + + +

      +Protected Attributes

      USBpUsb
       
      uint8_t bAddress
       
      EpInfo epInfo [XBOX_MAX_ENDPOINTS]
       
      +

      Detailed Description

      +

      This class implements support for a Xbox ONE controller connected via USB.

      + +

      Definition at line 46 of file XBOXONE.h.

      +

      Constructor & Destructor Documentation

      + +
      +
      + + + + + + + + +
      XBOXONE::XBOXONE (USBpUsb)
      +
      +

      Constructor for the XBOXONE class.

      Parameters
      + + +
      pUsbPointer to USB class instance.
      +
      +
      + +

      Definition at line 27 of file XBOXONE.cpp.

      + +
      +
      +

      Member Function Documentation

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      uint8_t XBOXONE::Init (uint8_t parent,
      uint8_t port,
      bool lowspeed 
      )
      +
      +virtual
      +
      +

      Initialize the Xbox Controller.

      Parameters
      + + + + +
      parentHub number.
      portPort number on the hub.
      lowspeedSpeed of the device.
      +
      +
      +
      Returns
      0 on success.
      + +

      Reimplemented from USBDeviceConfig.

      + +

      Definition at line 42 of file XBOXONE.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      uint8_t XBOXONE::Release ()
      +
      +virtual
      +
      +

      Release the USB device.

      Returns
      0 on success.
      + +

      Reimplemented from USBDeviceConfig.

      + +

      Definition at line 225 of file XBOXONE.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      uint8_t XBOXONE::Poll ()
      +
      +virtual
      +
      +

      Poll the USB Input endpoins and run the state machines.

      Returns
      0 on success.
      + +

      Reimplemented from USBDeviceConfig.

      + +

      Definition at line 236 of file XBOXONE.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      virtual uint8_t XBOXONE::GetAddress ()
      +
      +inlinevirtual
      +
      +

      Get the device address.

      Returns
      The device address.
      + +

      Reimplemented from USBDeviceConfig.

      + +

      Definition at line 78 of file XBOXONE.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + +
      virtual bool XBOXONE::isReady ()
      +
      +inlinevirtual
      +
      +

      Used to check if the controller has been initialized.

      Returns
      True if it's ready.
      + +

      Definition at line 86 of file XBOXONE.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      virtual boolean XBOXONE::VIDPIDOK (uint16_t vid,
      uint16_t pid 
      )
      +
      +inlinevirtual
      +
      +

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

      Parameters
      + + + +
      vidThe device's VID.
      pidThe device's PID.
      +
      +
      +
      Returns
      Returns true if the device's VID and PID matches this driver.
      + +

      Reimplemented from USBDeviceConfig.

      + +

      Definition at line 96 of file XBOXONE.h.

      + +
      +
      + +
      +
      + + + + + + + + +
      uint16_t XBOXONE::getButtonPress (ButtonEnum b)
      +
      +

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

      +

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

      +

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

      Parameters
      + + +
      bButtonEnum to read.
      +
      +
      +
      Returns
      getButtonClick(ButtonEnum b) will return a bool, while getButtonPress(ButtonEnum b) will return a word if reading L2 or R2.
      + +

      Definition at line 315 of file XBOXONE.cpp.

      + +
      +
      + +
      +
      + + + + + + + + +
      bool XBOXONE::getButtonClick (ButtonEnum b)
      +
      +

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

      +

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

      +

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

      Parameters
      + + +
      bButtonEnum to read.
      +
      +
      +
      Returns
      getButtonClick(ButtonEnum b) will return a bool, while getButtonPress(ButtonEnum b) will return a word if reading L2 or R2.
      + +

      Definition at line 323 of file XBOXONE.cpp.

      + +
      +
      + +
      +
      + + + + + + + + +
      int16_t XBOXONE::getAnalogHat (AnalogHatEnum a)
      +
      +

      Return the analog value from the joysticks on the controller.

      Parameters
      + + +
      aEither LeftHatX, LeftHatY, RightHatX or RightHatY.
      +
      +
      +
      Returns
      Returns a signed 16-bit integer.
      + +

      Definition at line 343 of file XBOXONE.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + +
      void XBOXONE::attachOnInit (void(*)(void) funcOnInit)
      +
      +inline
      +
      +

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

      Parameters
      + + +
      funcOnInitFunction to call.
      +
      +
      + +

      Definition at line 126 of file XBOXONE.h.

      + +
      +
      +

      Member Data Documentation

      + +
      +
      + + + + +
      bool XBOXONE::XboxOneConnected
      +
      +

      True if a Xbox ONE controller is connected.

      + +

      Definition at line 128 of file XBOXONE.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + +
      USB* XBOXONE::pUsb
      +
      +protected
      +
      +

      Pointer to USB class instance.

      + +

      Definition at line 136 of file XBOXONE.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + +
      uint8_t XBOXONE::bAddress
      +
      +protected
      +
      +

      Device address.

      + +

      Definition at line 138 of file XBOXONE.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + +
      EpInfo XBOXONE::epInfo[XBOX_MAX_ENDPOINTS]
      +
      +protected
      +
      +

      Endpoint info structure.

      + +

      Definition at line 140 of file XBOXONE.h.

      + +
      +
      +
      The documentation for this class was generated from the following files: +
      + + + + 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 new file mode 100644 index 00000000..d57aea04 --- /dev/null +++ b/class_x_b_o_x_o_n_e__coll__graph.map @@ -0,0 +1,6 @@ + + + + + + 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 new file mode 100644 index 00000000..44dc070e --- /dev/null +++ b/class_x_b_o_x_o_n_e__coll__graph.md5 @@ -0,0 +1 @@ +57bf78dcea511b3e3448e9603d73bed9 \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..e6e0603041557da3c6e2a1052d99198e910ea0a4 GIT binary patch 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 new file mode 100644 index 00000000..394fccd8 --- /dev/null +++ b/class_x_b_o_x_o_n_e__inherit__graph.md5 @@ -0,0 +1 @@ +7524668a9732abeee25eb125a21bda5f \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..d60bbc9f75a15325c3bc3406cc58c6a6573f539a GIT binary patch literal 4595 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 F{{c?k-wpr( literal 0 HcmV?d00001 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 6e0fbe49..117a8863 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,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -94,38 +95,39 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); bAddressXBOXRECVprotected buttonChanged(uint8_t controller=0)XBOXRECV ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)XBOXRECVvirtual - DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual - disconnect(uint8_t controller=0)XBOXRECV - epInfoXBOXRECVprotected - GetAddress()XBOXRECVinlinevirtual - getAnalogHat(AnalogHatEnum a, uint8_t controller=0)XBOXRECV - getBatteryLevel(uint8_t controller=0)XBOXRECV - getButtonClick(ButtonEnum b, uint8_t controller=0)XBOXRECV - getButtonPress(ButtonEnum b, uint8_t controller=0)XBOXRECV - Init(uint8_t parent, uint8_t port, bool lowspeed)XBOXRECVvirtual - isReady()XBOXRECVinlinevirtual - Poll()XBOXRECVvirtual - pUsbXBOXRECVprotected - Release()XBOXRECVvirtual - ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual - setAllOff(uint8_t controller=0)XBOXRECVinline - setLedBlink(LEDEnum l, uint8_t controller=0)XBOXRECV - setLedMode(LEDModeEnum lm, uint8_t controller=0)XBOXRECV - setLedOff(uint8_t controller=0)XBOXRECVinline - setLedOn(LEDEnum l, uint8_t controller=0)XBOXRECV - setLedRaw(uint8_t value, uint8_t controller=0)XBOXRECV - setRumbleOff(uint8_t controller=0)XBOXRECVinline - setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller=0)XBOXRECV - VIDPIDOK(uint16_t vid, uint16_t pid)XBOXRECVinlinevirtual - Xbox360ConnectedXBOXRECV - XboxReceiverConnectedXBOXRECV - XBOXRECV(USB *pUsb)XBOXRECV + DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual + DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual + disconnect(uint8_t controller=0)XBOXRECV + epInfoXBOXRECVprotected + GetAddress()XBOXRECVinlinevirtual + getAnalogHat(AnalogHatEnum a, uint8_t controller=0)XBOXRECV + getBatteryLevel(uint8_t controller=0)XBOXRECV + getButtonClick(ButtonEnum b, uint8_t controller=0)XBOXRECV + getButtonPress(ButtonEnum b, uint8_t controller=0)XBOXRECV + Init(uint8_t parent, uint8_t port, bool lowspeed)XBOXRECVvirtual + isReady()XBOXRECVinlinevirtual + Poll()XBOXRECVvirtual + pUsbXBOXRECVprotected + Release()XBOXRECVvirtual + ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual + setAllOff(uint8_t controller=0)XBOXRECVinline + setLedBlink(LEDEnum l, uint8_t controller=0)XBOXRECV + setLedMode(LEDModeEnum lm, uint8_t controller=0)XBOXRECV + setLedOff(uint8_t controller=0)XBOXRECVinline + setLedOn(LEDEnum l, uint8_t controller=0)XBOXRECV + setLedRaw(uint8_t value, uint8_t controller=0)XBOXRECV + setRumbleOff(uint8_t controller=0)XBOXRECVinline + setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller=0)XBOXRECV + VIDPIDOK(uint16_t vid, uint16_t pid)XBOXRECVinlinevirtual + Xbox360ConnectedXBOXRECV + XboxReceiverConnectedXBOXRECV + XBOXRECV(USB *pUsb)XBOXRECV
      diff --git a/class_x_b_o_x_r_e_c_v.html b/class_x_b_o_x_r_e_c_v.html index 5d4fd3ea..bd1981bc 100644 --- a/class_x_b_o_x_r_e_c_v.html +++ b/class_x_b_o_x_r_e_c_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXRECV Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -114,20 +115,20 @@ Public Member Functions  XBOXRECV (USB *pUsb)  
      USBDeviceConfig implementation
      -virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   virtual bool isReady ()   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) + 
      Xbox Controller functions
      uint8_t getButtonPress (ButtonEnum b, uint8_t controller=0)   @@ -162,8 +163,10 @@ Public Member Functions - Public Member Functions inherited from USBDeviceConfig virtual void ResetHubPort (uint8_t port)   -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  @@ -185,7 +188,7 @@ Protected Attributes

      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 58 of file XBOXRECV.h.

      +

      Definition at line 55 of file XBOXRECV.h.

      Constructor & Destructor Documentation

      @@ -398,7 +401,7 @@ Protected Attributes

      Reimplemented from USBDeviceConfig.

      -

      Definition at line 98 of file XBOXRECV.h.

      +

      Definition at line 95 of file XBOXRECV.h.

      @@ -424,11 +427,11 @@ Protected Attributes

      Used to check if the controller has been initialized.

      Returns
      True if it's ready.
      -

      Definition at line 106 of file XBOXRECV.h.

      +

      Definition at line 103 of file XBOXRECV.h.

      - +

      Public Attributes

      @@ -436,7 +439,7 @@ Protected Attributes - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
      - + @@ -468,9 +471,9 @@ Protected Attributes
      Returns
      Returns true if the device's VID and PID matches this driver.
      -

      Reimplemented from USBDeviceConfig.

      +

      Reimplemented from USBDeviceConfig.

      -

      Definition at line 116 of file XBOXRECV.h.

      +

      Definition at line 113 of file XBOXRECV.h.

      @@ -638,7 +641,7 @@ Protected Attributes -

      Definition at line 156 of file XBOXRECV.h.

      +

      Definition at line 153 of file XBOXRECV.h.

      @@ -670,7 +673,7 @@ Protected Attributes -

      Definition at line 165 of file XBOXRECV.h.

      +

      Definition at line 162 of file XBOXRECV.h.

      @@ -779,7 +782,7 @@ Protected Attributes -

      Definition at line 188 of file XBOXRECV.h.

      +

      Definition at line 185 of file XBOXRECV.h.

      @@ -966,7 +969,7 @@ Protected Attributes -

      Definition at line 226 of file XBOXRECV.h.

      +

      Definition at line 223 of file XBOXRECV.h.

      @@ -982,7 +985,7 @@ Protected Attributes

      True if a wireless receiver is connected.

      -

      Definition at line 228 of file XBOXRECV.h.

      +

      Definition at line 225 of file XBOXRECV.h.

      @@ -997,7 +1000,7 @@ Protected Attributes

      Variable used to indicate if the XBOX 360 controller is successfully connected.

      -

      Definition at line 234 of file XBOXRECV.h.

      +

      Definition at line 231 of file XBOXRECV.h.

      @@ -1020,7 +1023,7 @@ Protected Attributes

      Pointer to USB class instance.

      -

      Definition at line 238 of file XBOXRECV.h.

      +

      Definition at line 235 of file XBOXRECV.h.

      @@ -1043,7 +1046,7 @@ Protected Attributes

      Device address.

      -

      Definition at line 240 of file XBOXRECV.h.

      +

      Definition at line 237 of file XBOXRECV.h.

      @@ -1066,7 +1069,7 @@ Protected Attributes

      Endpoint info structure.

      -

      Definition at line 242 of file XBOXRECV.h.

      +

      Definition at line 239 of file XBOXRECV.h.

      @@ -1079,7 +1082,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 eca497ab..bb538112 100644 --- a/class_x_b_o_x_r_e_c_v__coll__graph.md5 +++ b/class_x_b_o_x_r_e_c_v__coll__graph.md5 @@ -1 +1 @@ -ed9aab39c26cf617dcffaf5cd6075f83 \ No newline at end of file +2d7f0ed5a487b4ea4ec343e72841b2c4 \ No newline at end of file diff --git a/class_x_b_o_x_r_e_c_v__inherit__graph.md5 b/class_x_b_o_x_r_e_c_v__inherit__graph.md5 index 9c40d748..b6ad7df6 100644 --- a/class_x_b_o_x_r_e_c_v__inherit__graph.md5 +++ b/class_x_b_o_x_r_e_c_v__inherit__graph.md5 @@ -1 +1 @@ -65afe7bd4794abb7f38cbc4be13ce865 \ No newline at end of file +f7208ed6bda886c3efbb05f7e1cbd52d \ No newline at end of file diff --git a/class_x_b_o_x_u_s_b-members.html b/class_x_b_o_x_u_s_b-members.html index ffbf9166..b92b2f1d 100644 --- a/class_x_b_o_x_u_s_b-members.html +++ b/class_x_b_o_x_u_s_b-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
      virtual boolean XBOXRECV::VIDPIDOK virtual bool XBOXRECV::VIDPIDOK ( uint16_t  vid,
      - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -93,35 +94,36 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      attachOnInit(void(*funcOnInit)(void))XBOXUSBinline
      bAddressXBOXUSBprotected
      ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
      DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
      epInfoXBOXUSBprotected
      GetAddress()XBOXUSBinlinevirtual
      getAnalogHat(AnalogHatEnum a)XBOXUSB
      getButtonClick(ButtonEnum b)XBOXUSB
      getButtonPress(ButtonEnum b)XBOXUSB
      Init(uint8_t parent, uint8_t port, bool lowspeed)XBOXUSBvirtual
      isReady()XBOXUSBinlinevirtual
      Poll()XBOXUSBvirtual
      pUsbXBOXUSBprotected
      Release()XBOXUSBvirtual
      ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
      setAllOff()XBOXUSBinline
      setLedBlink(LEDEnum l)XBOXUSB
      setLedMode(LEDModeEnum lm)XBOXUSB
      setLedOff()XBOXUSBinline
      setLedOn(LEDEnum l)XBOXUSB
      setLedRaw(uint8_t value)XBOXUSB
      setRumbleOff()XBOXUSBinline
      setRumbleOn(uint8_t lValue, uint8_t rValue)XBOXUSB
      VIDPIDOK(uint16_t vid, uint16_t pid)XBOXUSBinlinevirtual
      Xbox360ConnectedXBOXUSB
      XBOXUSB(USB *pUsb)XBOXUSB
      DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
      DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual
      epInfoXBOXUSBprotected
      GetAddress()XBOXUSBinlinevirtual
      getAnalogHat(AnalogHatEnum a)XBOXUSB
      getButtonClick(ButtonEnum b)XBOXUSB
      getButtonPress(ButtonEnum b)XBOXUSB
      Init(uint8_t parent, uint8_t port, bool lowspeed)XBOXUSBvirtual
      isReady()XBOXUSBinlinevirtual
      Poll()XBOXUSBvirtual
      pUsbXBOXUSBprotected
      Release()XBOXUSBvirtual
      ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
      setAllOff()XBOXUSBinline
      setLedBlink(LEDEnum l)XBOXUSB
      setLedMode(LEDModeEnum lm)XBOXUSB
      setLedOff()XBOXUSBinline
      setLedOn(LEDEnum l)XBOXUSB
      setLedRaw(uint8_t value)XBOXUSB
      setRumbleOff()XBOXUSBinline
      setRumbleOn(uint8_t lValue, uint8_t rValue)XBOXUSB
      VIDPIDOK(uint16_t vid, uint16_t pid)XBOXUSBinlinevirtual
      Xbox360ConnectedXBOXUSB
      XBOXUSB(USB *pUsb)XBOXUSB
      diff --git a/class_x_b_o_x_u_s_b.html b/class_x_b_o_x_u_s_b.html index 2caddfd8..2ba20afa 100644 --- a/class_x_b_o_x_u_s_b.html +++ b/class_x_b_o_x_u_s_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: XBOXUSB Class Reference + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -114,18 +115,18 @@ Public Member Functions  XBOXUSB (USB *pUsb)  
      USBDeviceConfig implementation
      -virtual uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed) +uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)   -virtual uint8_t Release () +uint8_t Release ()   -virtual uint8_t Poll () +uint8_t Poll ()   virtual uint8_t GetAddress ()   virtual bool isReady ()   -virtual boolean VIDPIDOK (uint16_t vid, uint16_t pid) -  +virtual bool VIDPIDOK (uint16_t vid, uint16_t pid) + 
      Xbox Controller functions
      uint8_t getButtonPress (ButtonEnum b)   @@ -156,8 +157,10 @@ Public Member Functions   virtual void ResetHubPort (uint8_t port)   -virtual boolean DEVCLASSOK (uint8_t klass) -  +virtual bool DEVCLASSOK (uint8_t klass) +  +virtual bool DEVSUBCLASSOK (uint8_t subklass) +  @@ -176,7 +179,7 @@ Protected Attributes

      Detailed Description

      This class implements support for a Xbox wired controller via USB.

      -

      Definition at line 58 of file XBOXUSB.h.

      +

      Definition at line 53 of file XBOXUSB.h.

      Constructor & Destructor Documentation

      @@ -336,7 +339,7 @@ Protected Attributes

      Reimplemented from USBDeviceConfig.

      -

      Definition at line 90 of file XBOXUSB.h.

      +

      Definition at line 85 of file XBOXUSB.h.

      @@ -362,11 +365,11 @@ Protected Attributes

      Used to check if the controller has been initialized.

      Returns
      True if it's ready.
      -

      Definition at line 98 of file XBOXUSB.h.

      +

      Definition at line 93 of file XBOXUSB.h.

      - +

      Public Attributes

      @@ -374,7 +377,7 @@ Protected Attributes
      - + @@ -406,9 +409,9 @@ Protected Attributes
      Returns
      Returns true if the device's VID and PID matches this driver.
      -

      Reimplemented from USBDeviceConfig.

      +

      Reimplemented from USBDeviceConfig.

      -

      Definition at line 108 of file XBOXUSB.h.

      +

      Definition at line 103 of file XBOXUSB.h.

      @@ -513,7 +516,7 @@ Protected Attributes

      Turn rumble off and all the LEDs on the controller.

      -

      Definition at line 137 of file XBOXUSB.h.

      +

      Definition at line 132 of file XBOXUSB.h.

      @@ -539,7 +542,7 @@ Protected Attributes

      Turn rumble off the controller.

      -

      Definition at line 143 of file XBOXUSB.h.

      +

      Definition at line 138 of file XBOXUSB.h.

      @@ -624,7 +627,7 @@ Protected Attributes

      Turn all LEDs off the controller.

      -

      Definition at line 161 of file XBOXUSB.h.

      +

      Definition at line 156 of file XBOXUSB.h.

      @@ -728,7 +731,7 @@ Protected Attributes -

      Definition at line 184 of file XBOXUSB.h.

      +

      Definition at line 179 of file XBOXUSB.h.

      @@ -744,7 +747,7 @@ Protected Attributes

      True if a Xbox 360 controller is connected.

      -

      Definition at line 186 of file XBOXUSB.h.

      +

      Definition at line 181 of file XBOXUSB.h.

      @@ -767,7 +770,7 @@ Protected Attributes

      Pointer to USB class instance.

      -

      Definition at line 194 of file XBOXUSB.h.

      +

      Definition at line 189 of file XBOXUSB.h.

      @@ -790,7 +793,7 @@ Protected Attributes

      Device address.

      -

      Definition at line 196 of file XBOXUSB.h.

      +

      Definition at line 191 of file XBOXUSB.h.

      @@ -813,7 +816,7 @@ Protected Attributes

      Endpoint info structure.

      -

      Definition at line 198 of file XBOXUSB.h.

      +

      Definition at line 193 of file XBOXUSB.h.

      @@ -826,7 +829,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 bd1c0e53..d2631857 100644 --- a/class_x_b_o_x_u_s_b__coll__graph.md5 +++ b/class_x_b_o_x_u_s_b__coll__graph.md5 @@ -1 +1 @@ -dee322f84a53a66ca571152698f981be \ No newline at end of file +654de9f0f1b78cafbc20482878c5abaf \ No newline at end of file diff --git a/class_x_b_o_x_u_s_b__inherit__graph.md5 b/class_x_b_o_x_u_s_b__inherit__graph.md5 index 7e11e2c0..816edbfb 100644 --- a/class_x_b_o_x_u_s_b__inherit__graph.md5 +++ b/class_x_b_o_x_u_s_b__inherit__graph.md5 @@ -1 +1 @@ -0686bddb1558a264c6860f5ed66959a5 \ No newline at end of file +f856eb1a72c58d28a6481d6c3bc6012d \ No newline at end of file diff --git a/class_x_r21_b1411-members.html b/class_x_r21_b1411-members.html new file mode 100644 index 00000000..684f04bc --- /dev/null +++ b/class_x_r21_b1411-members.html @@ -0,0 +1,151 @@ + + + + + + +USB Host Shield 2.0: Member List + + + + + + + + + + + +
      +
      +
      virtual boolean XBOXUSB::VIDPIDOK virtual bool XBOXUSB::VIDPIDOK ( uint16_t  vid,
      + + + + + +
      +
      USB Host Shield 2.0 +
      +
      + + + + + + + +
      +
      + + +
      + +
      + + +
      +
      +
      XR21B1411 Member List
      +
      +
      + +

      This is the complete list of members for XR21B1411, including all inherited members.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      _enhanced_statusACMprotected
      ACM(USB *pusb, CDCAsyncOper *pasync)ACM
      autoflowDSR(bool s)XR21B1411inlinevirtual
      autoflowRTS(bool s)XR21B1411inlinevirtual
      autoflowXON(bool s)XR21B1411inlinevirtual
      available(void)ACMinline
      bAddressACMprotected
      bConfNumACMprotected
      bControlIfaceACMprotected
      bDataIfaceACMprotected
      bNumEPACMprotected
      bPollEnableACMprotected
      ClearCommFeature(uint16_t fid)ACM
      ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)USBDeviceConfiginlinevirtual
      DEVCLASSOK(uint8_t klass)USBDeviceConfiginlinevirtual
      DEVSUBCLASSOK(uint8_t subklass)USBDeviceConfiginlinevirtual
      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
      GetAddress()ACMinlinevirtual
      GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM
      GetLineCoding(LINE_CODING *dataptr)ACM
      GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr)ACM
      half_duplex(bool s)XR21B1411inlinevirtual
      Init(uint8_t parent, uint8_t port, bool lowspeed)XR21B1411virtual
      isReady()ACMinlinevirtual
      pAsyncACMprotected
      Poll()ACMvirtual
      PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)ACMprotected
      pUsbACMprotected
      qNextPollTimeACMprotected
      RcvData(uint16_t *nbytesptr, uint8_t *dataptr)ACM
      read_register(uint16_t reg, uint16_t *val)XR21B1411inline
      readyACMprotected
      Release()ACMvirtual
      ResetHubPort(uint8_t port)USBDeviceConfiginlinevirtual
      SendBreak(uint16_t duration)ACM
      SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr)ACM
      SetControlLineState(uint8_t state)ACM
      SetLineCoding(const LINE_CODING *dataptr)ACM
      SndData(uint16_t nbytes, uint8_t *dataptr)ACM
      VIDPIDOK(uint16_t vid, uint16_t pid)XR21B1411inlinevirtual
      wide(bool s)ACMinlinevirtual
      write_register(uint16_t reg, uint16_t val)XR21B1411inline
      XR21B1411(USB *pusb, CDCAsyncOper *pasync)XR21B1411
      + + + + diff --git a/class_x_r21_b1411.html b/class_x_r21_b1411.html new file mode 100644 index 00000000..2e264374 --- /dev/null +++ b/class_x_r21_b1411.html @@ -0,0 +1,569 @@ + + + + + + +USB Host Shield 2.0: XR21B1411 Class Reference + + + + + + + + + + + +
      +
      + + + + + + +
      +
      USB Host Shield 2.0 +
      +
      +
      + + + + + + +
      +
      + + +
      + +
      + +
      +
      + +
      +
      XR21B1411 Class Reference
      +
      +
      + +

      #include <cdc_XR21B1411.h>

      +
      +Inheritance diagram for XR21B1411:
      +
      +
      Inheritance graph
      + + +
      [legend]
      +
      +Collaboration diagram for XR21B1411:
      +
      +
      Collaboration graph
      + + +
      [legend]
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       XR21B1411 (USB *pusb, CDCAsyncOper *pasync)
       
      virtual bool VIDPIDOK (uint16_t vid, uint16_t pid)
       
      uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)
       
      virtual tty_features enhanced_features (void)
       
      uint8_t read_register (uint16_t reg, uint16_t *val)
       
      uint8_t write_register (uint16_t reg, uint16_t val)
       
      virtual void autoflowRTS (bool s)
       
      virtual void autoflowDSR (bool s)
       
      virtual void autoflowXON (bool s)
       
      virtual void half_duplex (bool s)
       
      - Public Member Functions inherited from ACM
       ACM (USB *pusb, CDCAsyncOper *pasync)
       
      uint8_t SetCommFeature (uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
       
      uint8_t GetCommFeature (uint16_t fid, uint8_t nbytes, uint8_t *dataptr)
       
      uint8_t ClearCommFeature (uint16_t fid)
       
      uint8_t SetLineCoding (const LINE_CODING *dataptr)
       
      uint8_t GetLineCoding (LINE_CODING *dataptr)
       
      uint8_t SetControlLineState (uint8_t state)
       
      uint8_t SendBreak (uint16_t duration)
       
      uint8_t GetNotif (uint16_t *bytes_rcvd, uint8_t *dataptr)
       
      uint8_t RcvData (uint16_t *nbytesptr, uint8_t *dataptr)
       
      uint8_t SndData (uint16_t nbytes, uint8_t *dataptr)
       
      uint8_t Init (uint8_t parent, uint8_t port, bool lowspeed)
       
      uint8_t Release ()
       
      uint8_t Poll ()
       
      bool available (void)
       
      virtual uint8_t GetAddress ()
       
      virtual bool isReady ()
       
      virtual tty_features enhanced_status (void)
       
      virtual void wide (bool s)
       
      void EndpointXtract (uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
       
      - Public Member Functions inherited from USBDeviceConfig
      virtual uint8_t ConfigureDevice (uint8_t parent, uint8_t port, bool lowspeed)
       
      virtual void ResetHubPort (uint8_t port)
       
      virtual bool DEVCLASSOK (uint8_t klass)
       
      virtual bool DEVSUBCLASSOK (uint8_t subklass)
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Additional Inherited Members

      - Protected Member Functions inherited from ACM
      void PrintEndpointDescriptor (const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
       
      - Protected Attributes inherited from ACM
      USBpUsb
       
      CDCAsyncOperpAsync
       
      uint8_t bAddress
       
      uint8_t bConfNum
       
      uint8_t bControlIface
       
      uint8_t bDataIface
       
      uint8_t bNumEP
       
      uint32_t qNextPollTime
       
      volatile bool bPollEnable
       
      volatile bool ready
       
      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.

      +

      Constructor & Destructor Documentation

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      XR21B1411::XR21B1411 (USBpusb,
      CDCAsyncOperpasync 
      )
      +
      + +

      Definition at line 19 of file cdc_XR21B1411.cpp.

      + +
      +
      +

      Member Function Documentation

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      virtual bool XR21B1411::VIDPIDOK (uint16_t vid,
      uint16_t pid 
      )
      +
      +inlinevirtual
      +
      +

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

      Parameters
      + + + +
      vidThe device's VID.
      pidThe device's PID.
      +
      +
      +
      Returns
      Returns true if the device's VID and PID matches this driver.
      + +

      Reimplemented from USBDeviceConfig.

      + +

      Definition at line 115 of file cdc_XR21B1411.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      uint8_t XR21B1411::Init (uint8_t parent,
      uint8_t port,
      bool lowspeed 
      )
      +
      +virtual
      +
      + +

      Reimplemented from USBDeviceConfig.

      + +

      Definition at line 25 of file cdc_XR21B1411.cpp.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + +
      virtual tty_features XR21B1411::enhanced_features (void )
      +
      +inlinevirtual
      +
      + +

      Reimplemented from ACM.

      + +

      Definition at line 121 of file cdc_XR21B1411.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      uint8_t XR21B1411::read_register (uint16_t reg,
      uint16_t * val 
      )
      +
      +inline
      +
      + +

      Definition at line 132 of file cdc_XR21B1411.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      uint8_t XR21B1411::write_register (uint16_t reg,
      uint16_t val 
      )
      +
      +inline
      +
      + +

      Definition at line 136 of file cdc_XR21B1411.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + +
      virtual void XR21B1411::autoflowRTS (bool s)
      +
      +inlinevirtual
      +
      + +

      Reimplemented from ACM.

      + +

      Definition at line 145 of file cdc_XR21B1411.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + +
      virtual void XR21B1411::autoflowDSR (bool s)
      +
      +inlinevirtual
      +
      + +

      Reimplemented from ACM.

      + +

      Definition at line 176 of file cdc_XR21B1411.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + +
      virtual void XR21B1411::autoflowXON (bool s)
      +
      +inlinevirtual
      +
      + +

      Reimplemented from ACM.

      + +

      Definition at line 211 of file cdc_XR21B1411.h.

      + +
      +
      + +
      +
      + + + + + +
      + + + + + + + + +
      virtual void XR21B1411::half_duplex (bool s)
      +
      +inlinevirtual
      +
      + +

      Reimplemented from ACM.

      + +

      Definition at line 243 of file cdc_XR21B1411.h.

      + +
      +
      +
      The documentation for this class was generated from the following files: +
      + + + + diff --git a/class_x_r21_b1411__coll__graph.map b/class_x_r21_b1411__coll__graph.map new file mode 100644 index 00000000..130845a5 --- /dev/null +++ b/class_x_r21_b1411__coll__graph.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/class_x_r21_b1411__coll__graph.md5 b/class_x_r21_b1411__coll__graph.md5 new file mode 100644 index 00000000..f6a09260 --- /dev/null +++ b/class_x_r21_b1411__coll__graph.md5 @@ -0,0 +1 @@ +2dbccd1b011c53b5f85709ffafe012c5 \ No newline at end of file diff --git a/class_x_r21_b1411__coll__graph.png b/class_x_r21_b1411__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..31c6a205fe2002806b629d55a4452880320b7f21 GIT binary patch literal 27070 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 Sw(nwqA9ZCNr78uR(EkC(XtNps literal 0 HcmV?d00001 diff --git a/class_x_r21_b1411__inherit__graph.map b/class_x_r21_b1411__inherit__graph.map new file mode 100644 index 00000000..ccb1b775 --- /dev/null +++ b/class_x_r21_b1411__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/class_x_r21_b1411__inherit__graph.md5 b/class_x_r21_b1411__inherit__graph.md5 new file mode 100644 index 00000000..b61794d2 --- /dev/null +++ b/class_x_r21_b1411__inherit__graph.md5 @@ -0,0 +1 @@ +b90701a331346260b7eefd76bf910398 \ No newline at end of file diff --git a/class_x_r21_b1411__inherit__graph.png b/class_x_r21_b1411__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f77673651a07d6e69b0db6caca59813637f5b3b9 GIT binary patch literal 10243 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 literal 0 HcmV?d00001 diff --git a/classes.html b/classes.html index 0a32fd28..b138be49 100644 --- a/classes.html +++ b/classes.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Index + @@ -31,7 +32,7 @@
      - + @@ -73,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -90,49 +91,51 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      A | B | C | E | F | H | I | K | L | M | P | R | S | T | U | W | X
      - - - - - - - - + + + + - - - - + + + - - + + + + + + + + - - - - - - - - - - + + + + + + + +
        A  
      -
      CLASS_NOTIFICATION   
        K  
      -
      PS4Data   USB   
      CommandBlockWrapper   PS4Output   USB_CONFIGURATION_DESCRIPTOR   
      ACM   CommandBlockWrapperBase   KBDINFO   PS4Parser   USB_DEVICE_DESCRIPTOR   
      ACM_FUNC_DESCR   CommandStatusWrapper   KBDLEDS   PS4Status   USB_ENDPOINT_DESCRIPTOR   
      AddressPool   ConfigDescParser   KeyboardReportParser   PS4USB   USB_HID_DESCRIPTOR   
      AddressPoolImpl   
        E  
      -
        L  
      -
      PSBuzz   USB_INTERFACE_DESCRIPTOR   
      ADK   PSBUZZButtons   UsbConfigXtracter   
        B  
      -
      EpInfo   LINE_CODING   PTPListParser   UsbDevice   
        F  
      -
        M  
      -
        R  
      +
      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   
      BASICCDB   USBDeviceConfig   
      BluetoothService   FTDI   MainItemIOFeature   ReportDescParser   USBHub   
      BTD   FTDIAsyncOper   MAX3421e   ReportDescParser2   USBReadParser   
      BTHID   
        H  
      -
      Max_LCD   ReportDescParserBase   
        W  
      +
      AddressPoolImpl   
        M  
      +
      USBDeviceConfig   
      ADK   EpInfo   ReportDescParser   USBHub   
        B  
      +
        F  
      +
      MainItemIOFeature   ReportDescParser2   USBReadParser   
      MAX3421e   ReportDescParserBase   
        W  
      BulkOnly   MODIFIERKEYS   RequestSenseResponce   
      ByteSkipper   HexDumper   MOUSEINFO   
        S  
      +
      BASICCDB   FTDI   Max_LCD   RequestSenseResponce   
      BluetoothService   FTDIAsyncOper   MODIFIERKEYS   
        S  
      WII   
      BTD   
        H  
      +
      MOUSEINFO   
        X  
      +
      BTHID   MouseReportParser   SETUP_PKT   
      BulkOnly   HexDumper   MultiByteValueParser   SinkParser   XBOXOLD   
      ByteSkipper   HID   MultiValueBuffer   SPi   XBOXONE   
        C  
      -
      HID   MouseReportParser   
        X  
      +
      HID_CLASS_DESCRIPTOR_LEN_AND_TYPE   
        P  
      +
      SPP   XBOXRECV   
      HIDBoot   
        T  
      +
      XBOXUSB   
      CALL_MGMNT_FUNC_DESCR   HidItemPrefix   PL2303   XR21B1411   
      Capacity   HIDReportParser   PS3BT   TEL_RINGER_FUNC_DESCR   
        t  
      HID_CLASS_DESCRIPTOR_LEN_AND_TYPE   MultiByteValueParser   SETUP_PKT   
      CALL_MGMNT_FUNC_DESCR   HIDBoot   MultiValueBuffer   SinkParser   XBOXOLD   
      Capacity   HidItemPrefix   
        P  
      -
      SPi   XBOXRECV   
      CDB10   HIDReportParser   SPP   XBOXUSB   
      CDB12   HIDUniversal   PL2303   
        T  
      -
        t  
      +
      CDB10   HIDUniversal   PS3USB   
        U  
      CDB6   HubDescriptor   PS3BT   
      CDB_LBA32_16   HubEvent   PS3USB   TEL_RINGER_FUNC_DESCR   touchpadXY   
      CDB_LBA64_16   
        I  
      -
      PS4BT   
        U  
      -
      CDCAsyncOper   PS4Buttons   
      InquiryResponse   UniversalReportParser   
      CDB12   HubDescriptor   PS4BT   touchpadXY   
      CDB6   HubEvent   PS4Buttons   UniversalReportParser   tty_features   
      CDB_LBA32_16   
        I  
      +
      PS4Data   USB   
      CDB_LBA64_16   PS4Output   USB_CONFIGURATION_DESCRIPTOR   
      CDCAsyncOper   InquiryResponse   PS4Parser   USB_DEVICE_DESCRIPTOR   
      CLASS_NOTIFICATION   
        K  
      +
      PS4Status   USB_ENDPOINT_DESCRIPTOR   
      KBDINFO   
      A | B | C | E | F | H | I | K | L | M | P | R | S | T | U | W | X
      @@ -141,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/confdescparser_8h.html b/confdescparser_8h.html index 9ff6e7d2..68260aba 100644 --- a/confdescparser_8h.html +++ b/confdescparser_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: confdescparser.h File Reference + @@ -31,7 +32,7 @@
      - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -124,7 +125,7 @@ Macros
      -

      Definition at line 30 of file confdescparser.h.

      +

      Definition at line 32 of file confdescparser.h.

      @@ -138,7 +139,7 @@ Macros
      -

      Definition at line 31 of file confdescparser.h.

      +

      Definition at line 33 of file confdescparser.h.

      @@ -152,7 +153,7 @@ Macros
      -

      Definition at line 32 of file confdescparser.h.

      +

      Definition at line 34 of file confdescparser.h.

      @@ -166,7 +167,7 @@ Macros
      -

      Definition at line 33 of file confdescparser.h.

      +

      Definition at line 35 of file confdescparser.h.

      @@ -175,7 +176,7 @@ Macros diff --git a/confdescparser_8h_source.html b/confdescparser_8h_source.html index ab5675f9..635a60c6 100644 --- a/confdescparser_8h_source.html +++ b/confdescparser_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: confdescparser.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -115,199 +116,196 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      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  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep) = 0;
      -
      28 };
      -
      29 
      -
      30 #define CP_MASK_COMPARE_CLASS 1
      -
      31 #define CP_MASK_COMPARE_SUBCLASS 2
      -
      32 #define CP_MASK_COMPARE_PROTOCOL 4
      -
      33 #define CP_MASK_COMPARE_ALL 7
      -
      34 
      -
      35 // Configuration Descriptor Parser Class Template
      +
      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 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
      - -
      39  UsbConfigXtracter *theXtractor;
      -
      40  MultiValueBuffer theBuffer;
      -
      41  MultiByteValueParser valParser;
      -
      42  ByteSkipper theSkipper;
      -
      43  uint8_t varBuffer[16 /*sizeof(USB_CONFIGURATION_DESCRIPTOR)*/];
      -
      44 
      -
      45  uint8_t stateParseDescr; // ParseDescriptor state
      +
      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 dscrLen; // Descriptor length
      -
      48  uint8_t dscrType; // Descriptor type
      -
      49 
      -
      50  bool isGoodInterface; // Apropriate interface flag
      -
      51  uint8_t confValue; // Configuration value
      -
      52  uint8_t protoValue; // Protocol value
      -
      53  uint8_t ifaceNumber; // Interface number
      -
      54  uint8_t ifaceAltSet; // Interface alternate settings
      -
      55 
      -
      56  bool UseOr;
      -
      57  bool ParseDescriptor(uint8_t **pp, uint16_t *pcntdn);
      -
      58  void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc);
      -
      59 
      -
      60 public:
      +
      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  void SetOR(void) {
      -
      63  UseOr = true;
      -
      64  }
      - -
      66  virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset);
      -
      67 };
      -
      68 
      -
      69 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
      - -
      71 theXtractor(xtractor),
      -
      72 stateParseDescr(0),
      -
      73 dscrLen(0),
      -
      74 dscrType(0),
      -
      75 UseOr(false) {
      -
      76  theBuffer.pValue = varBuffer;
      -
      77  valParser.Initialize(&theBuffer);
      -
      78  theSkipper.Initialize(&theBuffer);
      -
      79 };
      -
      80 
      -
      81 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
      -
      82 void ConfigDescParser<CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK>::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) {
      -
      83  uint16_t cntdn = (uint16_t)len;
      -
      84  uint8_t *p = (uint8_t*)pbuf;
      -
      85 
      -
      86  while(cntdn)
      -
      87  if(!ParseDescriptor(&p, &cntdn))
      -
      88  return;
      -
      89 }
      -
      90 
      -
      91 /* Parser for the configuration descriptor. Takes values for class, subclass, protocol fields in interface descriptor and
      -
      92  compare masks for them. When the match is found, calls EndpointXtract passing buffer containing endpoint descriptor */
      -
      93 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
      - -
      95  USB_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast<USB_CONFIGURATION_DESCRIPTOR*>(varBuffer);
      -
      96  USB_INTERFACE_DESCRIPTOR* uid = reinterpret_cast<USB_INTERFACE_DESCRIPTOR*>(varBuffer);
      -
      97  switch(stateParseDescr) {
      -
      98  case 0:
      -
      99  theBuffer.valueSize = 2;
      -
      100  valParser.Initialize(&theBuffer);
      -
      101  stateParseDescr = 1;
      -
      102  case 1:
      -
      103  if(!valParser.Parse(pp, pcntdn))
      -
      104  return false;
      -
      105  dscrLen = *((uint8_t*)theBuffer.pValue);
      -
      106  dscrType = *((uint8_t*)theBuffer.pValue + 1);
      -
      107  stateParseDescr = 2;
      -
      108  case 2:
      -
      109  // This is a sort of hack. Assuming that two bytes are all ready in the buffer
      -
      110  // the pointer is positioned two bytes ahead in order for the rest of descriptor
      -
      111  // to be read right after the size and the type fields.
      -
      112  // This should be used carefully. varBuffer should be used directly to handle data
      -
      113  // in the buffer.
      -
      114  theBuffer.pValue = varBuffer + 2;
      -
      115  stateParseDescr = 3;
      -
      116  case 3:
      -
      117  switch(dscrType) {
      - -
      119  isGoodInterface = false;
      - -
      121  theBuffer.valueSize = sizeof (USB_CONFIGURATION_DESCRIPTOR) - 2;
      -
      122  break;
      - -
      124  theBuffer.valueSize = sizeof (USB_ENDPOINT_DESCRIPTOR) - 2;
      -
      125  break;
      -
      126  case HID_DESCRIPTOR_HID:
      -
      127  theBuffer.valueSize = dscrLen - 2;
      -
      128  break;
      -
      129  }
      -
      130  valParser.Initialize(&theBuffer);
      -
      131  stateParseDescr = 4;
      -
      132  case 4:
      -
      133  switch(dscrType) {
      - -
      135  if(!valParser.Parse(pp, pcntdn))
      -
      136  return false;
      -
      137  confValue = ucd->bConfigurationValue;
      -
      138  break;
      - -
      140  if(!valParser.Parse(pp, pcntdn))
      -
      141  return false;
      -
      142  if((MASK & CP_MASK_COMPARE_CLASS) && uid->bInterfaceClass != CLASS_ID)
      -
      143  break;
      -
      144  if((MASK & CP_MASK_COMPARE_SUBCLASS) && uid->bInterfaceSubClass != SUBCLASS_ID)
      +
      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(UseOr) {
      -
      147  if((!((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol)))
      -
      148  break;
      -
      149  } else {
      -
      150  if((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol != PROTOCOL_ID)
      -
      151  break;
      -
      152  }
      -
      153  isGoodInterface = true;
      -
      154  ifaceNumber = uid->bInterfaceNumber;
      -
      155  ifaceAltSet = uid->bAlternateSetting;
      -
      156  protoValue = uid->bInterfaceProtocol;
      -
      157  break;
      - -
      159  if(!valParser.Parse(pp, pcntdn))
      -
      160  return false;
      -
      161  if(isGoodInterface)
      -
      162  if(theXtractor)
      -
      163  theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_ENDPOINT_DESCRIPTOR*)varBuffer);
      -
      164  break;
      -
      165  //case HID_DESCRIPTOR_HID:
      -
      166  // if (!valParser.Parse(pp, pcntdn))
      -
      167  // return false;
      -
      168  // PrintHidDescriptor((const USB_HID_DESCRIPTOR*)varBuffer);
      -
      169  // break;
      -
      170  default:
      -
      171  if(!theSkipper.Skip(pp, pcntdn, dscrLen - 2))
      -
      172  return false;
      -
      173  }
      -
      174  theBuffer.pValue = varBuffer;
      -
      175  stateParseDescr = 0;
      -
      176  }
      -
      177  return true;
      -
      178 }
      -
      179 
      -
      180 template <const uint8_t CLASS_ID, const uint8_t SUBCLASS_ID, const uint8_t PROTOCOL_ID, const uint8_t MASK>
      - -
      182  Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80);
      -
      183  Notify(PSTR("bDescLength:\t\t"), 0x80);
      -
      184  PrintHex<uint8_t > (pDesc->bLength, 0x80);
      -
      185 
      -
      186  Notify(PSTR("\r\nbDescriptorType:\t"), 0x80);
      -
      187  PrintHex<uint8_t > (pDesc->bDescriptorType, 0x80);
      -
      188 
      -
      189  Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80);
      -
      190  PrintHex<uint16_t > (pDesc->bcdHID, 0x80);
      -
      191 
      -
      192  Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80);
      -
      193  PrintHex<uint8_t > (pDesc->bCountryCode, 0x80);
      -
      194 
      -
      195  Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80);
      -
      196  PrintHex<uint8_t > (pDesc->bNumDescriptors, 0x80);
      -
      197 
      -
      198  //Notify(PSTR("\r\nbDescrType:\t\t"));
      -
      199  //PrintHex<uint8_t>(pDesc->bDescrType);
      -
      200  //
      -
      201  //Notify(PSTR("\r\nwDescriptorLength:\t"));
      -
      202  //PrintHex<uint16_t>(pDesc->wDescriptorLength);
      -
      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
      +
      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)
      @@ -315,30 +313,30 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      #define USB_DESCRIPTOR_ENDPOINT
      Definition: usb_ch9.h:67
      uint8_t bLength
      Definition: usb_ch9.h:152
      -
      virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
      -
      #define CP_MASK_COMPARE_CLASS
      +
      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
      - + -
      virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)=0
      void Initialize(MultiValueBuffer *pbuf)
      Definition: parsetools.h:60
      uint8_t bCountryCode
      Definition: usb_ch9.h:155
      -
      #define CP_MASK_COMPARE_SUBCLASS
      -
      void SetOR(void)
      +
      #define CP_MASK_COMPARE_SUBCLASS
      +
      void SetOR(void)
      uint8_t bNumDescriptors
      Definition: usb_ch9.h:156
      - +
      uint8_t bDescriptorType
      Definition: usb_ch9.h:153
      +
      #define PSTR(str)
      #define HID_DESCRIPTOR_HID
      Definition: hid.h:77
      -
      ConfigDescParser(UsbConfigXtracter *xtractor)
      +
      ConfigDescParser(UsbConfigXtracter *xtractor)
      void Initialize(MultiValueBuffer *const pbuf)
      Definition: parsetools.h:42
      uint8_t bInterfaceSubClass
      Definition: usb_ch9.h:135
      @@ -351,7 +349,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/controller_enums_8h.html b/controller_enums_8h.html index 26e90ecd..22eba40b 100644 --- a/controller_enums_8h.html +++ b/controller_enums_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: controllerEnums.h File Reference + @@ -31,7 +32,7 @@
      - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -96,7 +97,7 @@ This graph shows which files directly or indirectly include this file:
      - +

      Go to the source code of this file.

      @@ -606,7 +607,7 @@ Enumerations diff --git a/controller_enums_8h__dep__incl.map b/controller_enums_8h__dep__incl.map index 076013bc..00c525a3 100644 --- a/controller_enums_8h__dep__incl.map +++ b/controller_enums_8h__dep__incl.map @@ -3,8 +3,8 @@ - - + + @@ -14,9 +14,11 @@ - - - - - + + + + + + + diff --git a/controller_enums_8h__dep__incl.md5 b/controller_enums_8h__dep__incl.md5 index e6a0ccc4..a454f8ea 100644 --- a/controller_enums_8h__dep__incl.md5 +++ b/controller_enums_8h__dep__incl.md5 @@ -1 +1 @@ -fe5c51348d3091d83f3b5de18458c4fe \ No newline at end of file +4fdabf04235560d8eaef94d5795a6445 \ No newline at end of file diff --git a/controller_enums_8h__dep__incl.png b/controller_enums_8h__dep__incl.png index 817f11217c00bfffd8299d528187fdd58efd1ab1..539588fa3e1226b018a04517fdeced38b205804b 100644 GIT binary patch literal 54541 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¬BLtD2NctehQ;HOJA;J#Yk}*l7fG(yN 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

      j=_mFNET_rh-hmcgkEOz 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 literal 49216 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 - + USB Host Shield 2.0: controllerEnums.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

      @@ -332,7 +333,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/dir_397a095372f04465e811d0ee219bbf8f.html b/dir_397a095372f04465e811d0ee219bbf8f.html index 9405d727..054f8a21 100644 --- a/dir_397a095372f04465e811d0ee219bbf8f.html +++ b/dir_397a095372f04465e811d0ee219bbf8f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: USB_Host_Shield_2.0 Directory Reference + @@ -31,7 +32,7 @@
      - + @@ -64,7 +65,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -109,6 +110,10 @@ Files   file  BTHID.h [code]   +file  cdc_XR21B1411.cpp [code] +  +file  cdc_XR21B1411.h [code] +  file  cdcacm.cpp [code]   file  cdcacm.h [code] @@ -213,6 +218,8 @@ Files   file  usbhub.h [code]   +file  version_helper.h [code] +  file  Wii.cpp [code]   file  Wii.h [code] @@ -223,6 +230,10 @@ Files   file  XBOXOLD.h [code]   +file  XBOXONE.cpp [code] +  +file  XBOXONE.h [code] +  file  XBOXRECV.cpp [code]   file  XBOXRECV.h [code] @@ -237,7 +248,7 @@ Files diff --git a/dir_e5fbe6d2783ccd4c93c7856d92d7be6e.html b/dir_e5fbe6d2783ccd4c93c7856d92d7be6e.html index ba77edf5..a1240dcb 100644 --- a/dir_e5fbe6d2783ccd4c93c7856d92d7be6e.html +++ b/dir_e5fbe6d2783ccd4c93c7856d92d7be6e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: GitHub Directory Reference + @@ -31,7 +32,7 @@
      - + @@ -64,7 +65,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -101,7 +102,7 @@ Directories diff --git a/doc.png b/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/doxygen.css b/doxygen.css index 0a8f9627..a0008331 100644 --- a/doxygen.css +++ b/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.8.7 */ +/* The standard CSS for doxygen 1.8.9.1 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; @@ -227,7 +227,7 @@ span.lineno a:hover { background-color: #C8C8C8; } -div.ah { +div.ah, span.ah { background-color: black; font-weight: bold; color: #ffffff; @@ -245,6 +245,15 @@ div.ah { background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + div.groupHeader { margin-left: 16px; margin-top: 12px; @@ -773,7 +782,7 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('ftv2folderopen.png'); + background-image:url('folderopen.png'); background-position: 0px -4px; background-repeat: repeat-y; vertical-align:top; @@ -784,7 +793,7 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('ftv2folderclosed.png'); + background-image:url('folderclosed.png'); background-position: 0px -4px; background-repeat: repeat-y; vertical-align:top; @@ -795,7 +804,7 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('ftv2doc.png'); + background-image:url('doc.png'); background-position: 0px -4px; background-repeat: repeat-y; vertical-align:top; diff --git a/files.html b/files.html index 0a6cab12..06ddf588 100644 --- a/files.html +++ b/files.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File List + @@ -31,7 +32,7 @@
      - + @@ -71,7 +72,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -95,67 +96,72 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  BTD.h  BTHID.cpp  BTHID.h - cdcacm.cpp - cdcacm.h - cdcftdi.cpp - cdcftdi.h - cdcprolific.cpp - cdcprolific.h - confdescparser.h - controllerEnums.h - hexdump.h - hid.cpp - hid.h - hidboot.cpp - hidboot.h - hidescriptorparser.cpp - hidescriptorparser.h - hiduniversal.cpp - hiduniversal.h - hidusagestr.h - hidusagetitlearrays.cpp - macros.h - masstorage.cpp - masstorage.h - max3421e.h - max_LCD.cpp - max_LCD.h - message.cpp - message.h - parsetools.cpp - parsetools.h - printhex.h - PS3BT.cpp - PS3BT.h - PS3Enums.h - PS3USB.cpp - PS3USB.h - PS4BT.h - PS4Parser.cpp - PS4Parser.h - PS4USB.h - PSBuzz.cpp - PSBuzz.h - settings.h - sink_parser.h - SPP.cpp - SPP.h - Usb.cpp - Usb.h - usb_ch9.h - UsbCore.h - usbhost.h - usbhub.cpp - usbhub.h - Wii.cpp - Wii.h - xboxEnums.h - XBOXOLD.cpp - XBOXOLD.h - XBOXRECV.cpp - XBOXRECV.h - XBOXUSB.cpp - XBOXUSB.h + cdc_XR21B1411.cpp + cdc_XR21B1411.h + cdcacm.cpp + cdcacm.h + cdcftdi.cpp + cdcftdi.h + cdcprolific.cpp + cdcprolific.h + confdescparser.h + controllerEnums.h + hexdump.h + hid.cpp + hid.h + hidboot.cpp + hidboot.h + hidescriptorparser.cpp + hidescriptorparser.h + hiduniversal.cpp + hiduniversal.h + hidusagestr.h + hidusagetitlearrays.cpp + macros.h + masstorage.cpp + masstorage.h + max3421e.h + max_LCD.cpp + max_LCD.h + message.cpp + message.h + parsetools.cpp + parsetools.h + printhex.h + PS3BT.cpp + PS3BT.h + PS3Enums.h + PS3USB.cpp + PS3USB.h + PS4BT.h + PS4Parser.cpp + PS4Parser.h + PS4USB.h + PSBuzz.cpp + PSBuzz.h + settings.h + sink_parser.h + SPP.cpp + SPP.h + Usb.cpp + Usb.h + usb_ch9.h + UsbCore.h + usbhost.h + usbhub.cpp + usbhub.h + version_helper.h + Wii.cpp + Wii.h + xboxEnums.h + XBOXOLD.cpp + XBOXOLD.h + XBOXONE.cpp + XBOXONE.h + XBOXRECV.cpp + XBOXRECV.h + XBOXUSB.cpp + XBOXUSB.h
      @@ -163,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/folderclosed.png b/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/functions.html b/functions.html index 5b004730..b2d114eb 100644 --- a/functions.html +++ b/functions.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@ - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
      @@ -123,138 +125,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      Here is a list of all class members with links to the classes they belong to:
      -

      - a -

      @@ -262,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_a.html b/functions_a.html new file mode 100644 index 00000000..f1104f77 --- /dev/null +++ b/functions_a.html @@ -0,0 +1,290 @@ + + + + + + +USB Host Shield 2.0: Class Members + + + + + + + + + + + +
      +
      + + + + + + +
      +
      USB Host Shield 2.0 +
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      + +
      + +
      +
      Here is a list of all class members with links to the classes they belong to:
      + +

      - a -

      +
      + + + + diff --git a/functions_b.html b/functions_b.html index 810c1a2c..f1a5f097 100644 --- a/functions_b.html +++ b/functions_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
      - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
      @@ -144,6 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , HID , PS3USB , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -288,6 +291,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • blue : PSBUZZButtons
    • +
    • BluetoothService() +: BluetoothService +
    • bmAddress : UsbDeviceAddress
    • @@ -485,7 +491,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : LINE_CODING
    • bPollEnable -: ACM +: ACM , BulkOnly
    • bPwrOn2PwrGood @@ -544,7 +550,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • btn : PS4Data -, PSBUZZButtons +, PSBUZZButtons
    • bType : HidItemPrefix @@ -573,7 +579,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_c.html b/functions_c.html index 6137342d..c4591983 100644 --- a/functions_c.html +++ b/functions_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    • - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
      @@ -133,6 +135,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • CDB6() : CDB6
    • +
    • checkHciHandle() +: BluetoothService +
    • circle : PS4Buttons
    • @@ -158,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Max_LCD
    • CommandBlockWrapper() -: CommandBlockWrapper +: CommandBlockWrapper
    • CommandBlockWrapperBase() : CommandBlockWrapperBase @@ -257,13 +262,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS4Buttons
    • ctrlData() -: USB +: USB
    • ctrlReq() : USB
    • ctrlStatus() -: USB +: USB
    • CurrentCapacity : BulkOnly @@ -280,7 +285,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_d.html b/functions_d.html index 9199462f..e61984fb 100644 --- a/functions_d.html +++ b/functions_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    • - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
      @@ -153,14 +155,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : UsbDeviceAddress
    • DEVCLASSOK() -: BTD -, BulkOnly -, USBDeviceConfig -, USBHub +: BTD +, BulkOnly +, HIDBoot< BOOT_PROTOCOL > +, USBDeviceConfig +, USBHub
    • DeviceType : InquiryResponse
    • +
    • DEVSUBCLASSOK() +: HIDBoot< BOOT_PROTOCOL > +, USBDeviceConfig +
    • digitTitles0 : ReportDescParserBase
    • @@ -180,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : SPP
    • disconnect() -: BluetoothService +: BluetoothService , BTD , BTHID , PS3BT @@ -222,7 +229,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_e.html b/functions_e.html index 357ad4c7..3e39c6c6 100644 --- a/functions_e.html +++ b/functions_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    • - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
      @@ -135,16 +137,26 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , FTDI , HIDBoot< BOOT_PROTOCOL > , HIDUniversal -, UsbConfigXtracter +, UsbConfigXtracter
    • enErrorBufferTooSmall -: ReportDescParserBase +: ReportDescParserBase
    • enErrorIncomplete -: ReportDescParserBase +: ReportDescParserBase
    • enErrorSuccess -: ReportDescParserBase +: ReportDescParserBase +
    • +
    • enhanced +: tty_features +
    • +
    • enhanced_features() +: ACM +, XR21B1411 +
    • +
    • enhanced_status() +: ACM
    • epAddr : EpInfo @@ -178,6 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • epInfo : XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB
    • @@ -198,7 +211,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_enum.html b/functions_enum.html index 16afa9e3..b1917f6e 100644 --- a/functions_enum.html +++ b/functions_enum.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Enumerations + @@ -31,7 +32,7 @@
      - + @@ -83,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -103,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_eval.html b/functions_eval.html index 89f91b47..3065e2ad 100644 --- a/functions_eval.html +++ b/functions_eval.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Enumerator + @@ -31,7 +32,7 @@
      - + @@ -83,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -95,13 +96,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
       
      - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      +
      @@ -125,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

      - f -

      • finger -: touchpadXY +: touchpadXY
      • flashOff : PS4Output @@ -134,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS4Output
      • flush() -: SPP +: SPP
      • ForEachUsbDevice() : AddressPoolImpl< MAX_DEVICES_ALLOWED > @@ -153,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func.html b/functions_func.html index 71cff612..c472b570 100644 --- a/functions_func.html +++ b/functions_func.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
      - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -123,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

      - a -

      @@ -166,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_b.html b/functions_func_b.html index 8eebeff0..6d2c163c 100644 --- a/functions_func_b.html +++ b/functions_func_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@ - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -128,6 +129,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • blink() : Max_LCD
    • +
    • BluetoothService() +: BluetoothService +
    • BTD() : BTD
    • @@ -158,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_c.html b/functions_func_c.html index 8d71837a..8384acb9 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
      - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -128,6 +129,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • CDB6() : CDB6
    • +
    • checkHciHandle() +: BluetoothService +
    • clear() : Max_LCD
    • @@ -147,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : CommandBlockWrapper
    • CommandBlockWrapperBase() -: CommandBlockWrapperBase +: CommandBlockWrapperBase
    • ConfigDescParser() : ConfigDescParser< CLASS_ID, SUBCLASS_ID, PROTOCOL_ID, MASK > @@ -171,13 +175,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Max_LCD
    • ctrlData() -: USB +: USB
    • ctrlReq() : USB
    • ctrlStatus() -: USB +: USB
    • cursor() : Max_LCD @@ -188,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_d.html b/functions_func_d.html index fe8fe180..32655f25 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    • - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -126,16 +127,21 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : USB
    • DEVCLASSOK() -: BTD -, BulkOnly -, USBDeviceConfig -, USBHub +: BTD +, BulkOnly +, HIDBoot< BOOT_PROTOCOL > +, USBDeviceConfig +, USBHub +
    • +
    • DEVSUBCLASSOK() +: HIDBoot< BOOT_PROTOCOL > +, USBDeviceConfig
    • discard() : SPP
    • disconnect() -: BluetoothService +: BluetoothService , BTD , BTHID , PS3BT @@ -155,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_e.html b/functions_func_e.html index 18faf4d4..10dc856f 100644 --- a/functions_func_e.html +++ b/functions_func_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    • - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
      @@ -130,7 +131,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , FTDI , HIDBoot< BOOT_PROTOCOL > , HIDUniversal -, UsbConfigXtracter +, UsbConfigXtracter + +
    • enhanced_features() +: ACM +, XR21B1411 +
    • +
    • enhanced_status() +: ACM
    @@ -138,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_f.html b/functions_func_f.html index 47a84869..37fd4fd0 100644 --- a/functions_func_f.html +++ b/functions_func_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@ - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -123,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    - f -

    • flush() -: SPP +: SPP
    • ForEachUsbDevice() : AddressPoolImpl< MAX_DEVICES_ALLOWED > @@ -142,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_g.html b/functions_func_g.html index fab85629..d4b76f96 100644 --- a/functions_func_g.html +++ b/functions_func_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -137,6 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , USBDeviceConfig , USBHub , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -154,6 +156,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PS4Parser , WII , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -189,6 +192,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PSBuzz , WII , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -199,6 +203,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PSBuzz , WII , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -397,7 +402,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_h.html b/functions_func_h.html index d897663e..dd6165ba 100644 --- a/functions_func_h.html +++ b/functions_func_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -122,8 +123,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  

    - h -

      +
    • half_duplex() +: ACM +, XR21B1411 +
    • HandleLockingKeys() -: KeyboardReportParser +: KeyboardReportParser
    • hci_accept_connection() : BTD @@ -135,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : BTD
    • hci_connect() -: BTD +: BTD
    • hci_disconnect() : BTD @@ -200,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_i.html b/functions_func_i.html index 2b5e2b9c..a8361278 100644 --- a/functions_func_i.html +++ b/functions_func_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -146,8 +147,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : USBDeviceConfig , USBHub , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB +, XR21B1411
  1. Initialize() : ByteSkipper @@ -172,9 +175,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ACM , ADK , BTD +, HIDBoot< BOOT_PROTOCOL > , HIDUniversal , PS3USB , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB
  2. @@ -187,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_k.html b/functions_func_k.html index 1acbc832..005d5283 100644 --- a/functions_func_k.html +++ b/functions_func_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -131,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_l.html b/functions_func_l.html index 263ee348..b23f7865 100644 --- a/functions_func_l.html +++ b/functions_func_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -161,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_m.html b/functions_func_m.html index 6f1d1203..65de91a7 100644 --- a/functions_func_m.html +++ b/functions_func_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -148,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_n.html b/functions_func_n.html index 34a5022f..ec762e69 100644 --- a/functions_func_n.html +++ b/functions_func_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -140,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_o.html b/functions_func_o.html index 52fbd1db..ab5d0eeb 100644 --- a/functions_func_o.html +++ b/functions_func_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -128,10 +129,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  3. OnControlKeysChanged() : KeyboardReportParser
  4. +
  5. onInit() +: BluetoothService +, BTHID +
  6. OnInit() : BulkOnly -, CDCAsyncOper -, FTDIAsyncOper +, CDCAsyncOper +, FTDIAsyncOper +
  7. +
  8. onInit() +: PS3BT +, SPP +, WII
  9. OnInitBTHID() : BTHID @@ -163,6 +173,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  10. OnMouseMove() : MouseReportParser
  11. +
  12. OnRelease() +: FTDIAsyncOper +
  13. OnRightButtonDown() : MouseReportParser
  14. @@ -181,7 +194,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_p.html b/functions_func_p.html index 80362ba2..1d886f65 100644 --- a/functions_func_p.html +++ b/functions_func_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -177,6 +178,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , USBDeviceConfig , USBHub , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -278,7 +280,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_r.html b/functions_func_r.html index 934512ef..db88fdbe 100644 --- a/functions_func_r.html +++ b/functions_func_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -133,15 +134,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  15. read() : SPP
  16. +
  17. read_register() +: XR21B1411 +
  18. readPollInterval() : BTD
  19. +
  20. registerBluetoothService() +: BTD +
  21. RegisterDeviceClass() : USB
  22. -
  23. registerServiceClass() -: BTD -
  24. regRd() : MAX3421e< SPI_SS, INTR >
  25. @@ -160,6 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , USBDeviceConfig , USBHub , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -173,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ReportDescParserBase
  26. Reset() -: BluetoothService +: BluetoothService , BTHID
  27. reset() @@ -201,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Max_LCD
  28. Run() -: BluetoothService +: BluetoothService , BTHID , PS3BT , SPP @@ -213,7 +218,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_s.html b/functions_func_s.html index 73d726d4..2592b270 100644 --- a/functions_func_s.html +++ b/functions_func_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
  29. - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -294,7 +295,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  30. setRumbleOn() : PS3BT , PS3USB -, PS4Parser +, PS4Parser , WII , XBOXOLD , XBOXRECV @@ -320,6 +321,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , ADK , FTDI
  31. +
  32. SndRpt() +: HIDUniversal +
  33. SPP() : SPP
  34. @@ -329,7 +333,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_t.html b/functions_func_t.html index 12e9d56b..ea54ffba 100644 --- a/functions_func_t.html +++ b/functions_func_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -132,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_u.html b/functions_func_u.html index e573eca8..fdd921dc 100644 --- a/functions_func_u.html +++ b/functions_func_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -134,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_v.html b/functions_func_v.html index 247a7fd4..ecce6d8c 100644 --- a/functions_func_v.html +++ b/functions_func_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@
    - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -126,14 +127,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : MAX3421e< SPI_SS, INTR >
  35. VIDPIDOK() -: ADK -, BTD -, PS3USB -, PSBuzz -, USBDeviceConfig -, XBOXOLD -, XBOXRECV -, XBOXUSB +: ADK +, BTD +, FTDI +, PS3USB +, PS4USB +, PSBuzz +, USBDeviceConfig +, XBOXOLD +, XBOXONE +, XBOXRECV +, XBOXUSB +, XR21B1411
  36. @@ -141,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_w.html b/functions_func_w.html index 5b4da08a..0a33d47d 100644 --- a/functions_func_w.html +++ b/functions_func_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@ - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -122,6 +123,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  

    - w -

      +
    • wide() +: ACM +
    • WII() : WII
    • @@ -130,10 +134,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • write() : Max_LCD -, SPP +, SPP +
    • +
    • write_register() +: XR21B1411
    • WriteProtected() -: BulkOnly +: BulkOnly
    @@ -141,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_x.html b/functions_func_x.html index e3f813ee..7a27072a 100644 --- a/functions_func_x.html +++ b/functions_func_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Functions + @@ -31,7 +32,7 @@ - + @@ -109,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -125,19 +126,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  37. XBOXOLD() : XBOXOLD
  38. +
  39. XBOXONE() +: XBOXONE +
  40. XBOXRECV() : XBOXRECV
  41. XBOXUSB() : XBOXUSB
  42. +
  43. XR21B1411() +: XR21B1411 +
  44. diff --git a/functions_g.html b/functions_g.html index 9642cd46..54e6e073 100644 --- a/functions_g.html +++ b/functions_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@ - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -166,6 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , USBDeviceConfig , USBHub , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -181,8 +184,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS3BT , PS3USB , PS4Parser -, WII +, WII , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -218,6 +222,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PSBuzz , WII , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -228,6 +233,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PSBuzz , WII , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -465,7 +471,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_h.html b/functions_h.html index d2b236d8..b6d6ecad 100644 --- a/functions_h.html +++ b/functions_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -124,8 +126,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Here is a list of all class members with links to the classes they belong to:

    - h -

      +
    • half_duplex() +: ACM +, tty_features +, XR21B1411 +
    • HandleLockingKeys() -: KeyboardReportParser +: KeyboardReportParser
    • hatValue : PS4Data @@ -146,8 +153,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : BTD
    • hci_handle -: BTD -, BTHID +: BluetoothService +, BTD
    • hci_inquiry() : BTD @@ -218,7 +225,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_i.html b/functions_i.html index c91c525f..d99251d2 100644 --- a/functions_i.html +++ b/functions_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -127,6 +129,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  45. iConfiguration : USB_CONFIGURATION_DESCRIPTOR
  46. +
  47. identifier +: BluetoothService +
  48. idProduct : USB_DEVICE_DESCRIPTOR
  49. @@ -175,8 +180,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : USBDeviceConfig , USBHub , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB +, XR21B1411
  50. Initialize() : ByteSkipper @@ -210,9 +217,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ACM , ADK , BTD +, HIDBoot< BOOT_PROTOCOL > , HIDUniversal , PS3USB , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB
  51. @@ -234,7 +243,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_k.html b/functions_k.html index 41937143..b08042a5 100644 --- a/functions_k.html +++ b/functions_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -131,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : KeyboardReportParser
  52. kbdLockingKeys -: KeyboardReportParser +: KeyboardReportParser
  53. KeyboardReportParser() : KeyboardReportParser @@ -145,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_l.html b/functions_l.html index 911a4e30..d7839109 100644 --- a/functions_l.html +++ b/functions_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
  54. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -151,6 +153,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  55. l2cap_disconnection_response() : BTD
  56. +
  57. l2cap_event_flag +: BluetoothService +
  58. l2cap_information_response() : BTD
  59. @@ -239,7 +244,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_m.html b/functions_m.html index 2b601c07..96a938a9 100644 --- a/functions_m.html +++ b/functions_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -211,7 +213,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_n.html b/functions_n.html index 125d0f61..52dd48d6 100644 --- a/functions_n.html +++ b/functions_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -148,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_o.html b/functions_o.html index d3308ed5..60cc19af 100644 --- a/functions_o.html +++ b/functions_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -130,10 +132,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  60. OnControlKeysChanged() : KeyboardReportParser
  61. +
  62. onInit() +: BluetoothService +, BTHID +
  63. OnInit() : BulkOnly -, CDCAsyncOper -, FTDIAsyncOper +, CDCAsyncOper +, FTDIAsyncOper +
  64. +
  65. onInit() +: PS3BT +, SPP +, WII
  66. OnInitBTHID() : BTHID @@ -165,6 +176,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  67. OnMouseMove() : MouseReportParser
  68. +
  69. OnRelease() +: FTDIAsyncOper +
  70. OnRightButtonDown() : MouseReportParser
  71. @@ -200,7 +214,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_p.html b/functions_p.html index 102e3709..44c5b335 100644 --- a/functions_p.html +++ b/functions_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -174,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ACM
  72. pBtd -: BTHID +: BluetoothService
  73. peek() : SPP @@ -182,6 +184,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  74. PeripheralQualifier : InquiryResponse
  75. +
  76. pFuncOnInit +: BluetoothService +
  77. pfUsage : ReportDescParserBase
  78. @@ -209,6 +214,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , USBDeviceConfig , USBHub , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -216,7 +222,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : HubDescriptor
  79. prevState -: KeyboardReportParser +: KeyboardReportParser
  80. PrintAlphanumDisplayPageUsage() : ReportDescParserBase @@ -339,6 +345,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , HID , PS3USB , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB
  81. @@ -351,7 +358,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_q.html b/functions_q.html index 2301eac7..1a4ace9d 100644 --- a/functions_q.html +++ b/functions_q.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -135,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_r.html b/functions_r.html index fd272c9f..e69f145a 100644 --- a/functions_r.html +++ b/functions_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -153,11 +155,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  82. read() : SPP
  83. +
  84. read_register() +: XR21B1411 +
  85. readPollInterval() : BTD
  86. ready -: ACM +: ACM , ADK
  87. recipient @@ -166,12 +171,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  88. red : PSBUZZButtons
  89. +
  90. registerBluetoothService() +: BTD +
  91. RegisterDeviceClass() : USB
  92. -
  93. registerServiceClass() -: BTD -
  94. regRd() : MAX3421e< SPI_SS, INTR >
  95. @@ -193,6 +198,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , USBDeviceConfig , USBHub , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -218,7 +224,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ReportDescParserBase
  96. ReqType_u -: SETUP_PKT +: SETUP_PKT
  97. Res : InquiryResponse @@ -231,7 +237,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : InquiryResponse
  98. Reset() -: BluetoothService +: BluetoothService , BTHID
  99. reset() @@ -280,7 +286,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ReportDescParserBase
  100. Run() -: BluetoothService +: BluetoothService , BTHID , PS3BT , SPP @@ -292,7 +298,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_s.html b/functions_s.html index fbde0278..14da2732 100644 --- a/functions_s.html +++ b/functions_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
  101. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -351,6 +353,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , ADK , FTDI +
  102. SndRpt() +: HIDUniversal +
  103. SoftReset : InquiryResponse
  104. @@ -381,7 +386,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_t.html b/functions_t.html index 5d0ab450..f520b4b4 100644 --- a/functions_t.html +++ b/functions_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -182,6 +184,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  105. TTThinkTime : HubDescriptor
  106. +
  107. tty +: tty_features +
  108. type : SETUP_PKT
  109. @@ -191,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_type.html b/functions_type.html index e7d78d8f..2b1fa5f9 100644 --- a/functions_type.html +++ b/functions_type.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Typedefs + @@ -31,7 +32,7 @@
    - + @@ -83,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -95,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); @@ -103,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_u.html b/functions_u.html index 3ef6b8c5..2e9dca9d 100644 --- a/functions_u.html +++ b/functions_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -131,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : BASICCDB
  110. UsagePageFunc -: ReportDescParserBase +: ReportDescParserBase
  111. usagePageFunctions : ReportDescParserBase @@ -157,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_v.html b/functions_v.html index 4eab2f70..6a3dc7c1 100644 --- a/functions_v.html +++ b/functions_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
  112. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -150,14 +152,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : HIDUniversal
  113. VIDPIDOK() -: ADK -, BTD -, PS3USB -, PSBuzz -, USBDeviceConfig -, XBOXOLD -, XBOXRECV -, XBOXUSB +: ADK +, BTD +, FTDI +, PS3USB +, PS4USB +, PSBuzz +, USBDeviceConfig +, XBOXOLD +, XBOXONE +, XBOXRECV +, XBOXUSB +, XR21B1411
  114. vrTitles0 : ReportDescParserBase @@ -174,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars.html b/functions_vars.html index 2f8528c5..98c55914 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
  115. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -123,100 +125,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
      -

    - a -

    @@ -224,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_a.html b/functions_vars_a.html new file mode 100644 index 00000000..c7525240 --- /dev/null +++ b/functions_vars_a.html @@ -0,0 +1,241 @@ + + + + + + +USB Host Shield 2.0: Class Members - Variables + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

    +
    + + + + diff --git a/functions_vars_b.html b/functions_vars_b.html index 494f323e..8db4e403 100644 --- a/functions_vars_b.html +++ b/functions_vars_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -144,6 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , HID , PS3USB , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB @@ -479,7 +482,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : LINE_CODING
  116. bPollEnable -: ACM +: ACM , BulkOnly
  117. bPwrOn2PwrGood @@ -532,7 +535,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  118. btn : PS4Data -, PSBUZZButtons +, PSBUZZButtons
  119. bType : HidItemPrefix @@ -543,7 +546,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_c.html b/functions_vars_c.html index 2e04f501..dcaa3483 100644 --- a/functions_vars_c.html +++ b/functions_vars_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
  120. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -222,7 +224,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_d.html b/functions_vars_d.html index 995d6b64..204ba679 100644 --- a/functions_vars_d.html +++ b/functions_vars_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -195,7 +197,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_e.html b/functions_vars_e.html index ef33c223..45c95b87 100644 --- a/functions_vars_e.html +++ b/functions_vars_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -127,6 +129,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  121. ENCSERV : InquiryResponse
  122. +
  123. enhanced +: tty_features +
  124. epAddr : EpInfo
  125. @@ -159,6 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  126. epInfo : XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB
  127. @@ -179,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_f.html b/functions_vars_f.html index 9aba5d2d..dd51fbc5 100644 --- a/functions_vars_f.html +++ b/functions_vars_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -125,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    - f -

    • finger -: touchpadXY +: touchpadXY
    • flashOff : PS4Output @@ -139,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_g.html b/functions_vars_g.html index 54c09262..7cc16c63 100644 --- a/functions_vars_g.html +++ b/functions_vars_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -196,7 +198,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_h.html b/functions_vars_h.html index c726d792..f3363d80 100644 --- a/functions_vars_h.html +++ b/functions_vars_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -124,12 +126,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  

    - h -

      +
    • half_duplex +: tty_features +
    • hatValue : PS4Data
    • hci_handle -: BTD -, BTHID +: BluetoothService +, BTD
    • hci_version : BTD @@ -146,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_i.html b/functions_vars_i.html index 7b858525..50355563 100644 --- a/functions_vars_i.html +++ b/functions_vars_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -127,6 +129,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  128. iConfiguration : USB_CONFIGURATION_DESCRIPTOR
  129. +
  130. identifier +: BluetoothService +
  131. idProduct : USB_DEVICE_DESCRIPTOR
  132. @@ -175,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_k.html b/functions_vars_k.html index e0599bcc..cee9e1ba 100644 --- a/functions_vars_k.html +++ b/functions_vars_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -131,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : KeyboardReportParser
  133. kbdLockingKeys -: KeyboardReportParser +: KeyboardReportParser
  134. Keys : KBDINFO @@ -142,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_l.html b/functions_vars_l.html index 6a991b69..8a44453c 100644 --- a/functions_vars_l.html +++ b/functions_vars_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
  135. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -130,6 +132,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  136. l2 : PS4Buttons
  137. +
  138. l2cap_event_flag +: BluetoothService +
  139. l2capConnectionClaimed : BTD
  140. @@ -206,7 +211,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_m.html b/functions_vars_m.html index 5eb7db3a..bad23287 100644 --- a/functions_vars_m.html +++ b/functions_vars_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -185,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_n.html b/functions_vars_n.html index 27d548a7..fa6b3d06 100644 --- a/functions_vars_n.html +++ b/functions_vars_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -136,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_o.html b/functions_vars_o.html index d29517c2..3413c9e9 100644 --- a/functions_vars_o.html +++ b/functions_vars_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -147,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_p.html b/functions_vars_p.html index 3882b490..1d5b1149 100644 --- a/functions_vars_p.html +++ b/functions_vars_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -134,11 +136,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : ACM
  141. pBtd -: BTHID +: BluetoothService
  142. PeripheralQualifier : InquiryResponse
  143. +
  144. pFuncOnInit +: BluetoothService +
  145. pfUsage : ReportDescParserBase
  146. @@ -155,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : HubDescriptor
  147. prevState -: KeyboardReportParser +: KeyboardReportParser
  148. ProductID : InquiryResponse @@ -186,6 +191,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , HID , PS3USB , XBOXOLD +, XBOXONE , XBOXRECV , XBOXUSB
  149. @@ -198,7 +204,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_q.html b/functions_vars_q.html index dc33ac16..7281e801 100644 --- a/functions_vars_q.html +++ b/functions_vars_q.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -135,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_r.html b/functions_vars_r.html index 50ace537..c763c593 100644 --- a/functions_vars_r.html +++ b/functions_vars_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -143,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS4Buttons
  150. ready -: ACM +: ACM , ADK
  151. recipient @@ -168,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS4Buttons
  152. ReqType_u -: SETUP_PKT +: SETUP_PKT
  153. Res : InquiryResponse @@ -207,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_s.html b/functions_vars_s.html index 74597112..d9f434d1 100644 --- a/functions_vars_s.html +++ b/functions_vars_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
  154. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -180,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_t.html b/functions_vars_t.html index d39d8e39..4e5b7210 100644 --- a/functions_vars_t.html +++ b/functions_vars_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -178,6 +180,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  155. TTThinkTime : HubDescriptor
  156. +
  157. tty +: tty_features +
  158. type : SETUP_PKT
  159. @@ -187,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_u.html b/functions_vars_u.html index 5a739d2e..84720ce5 100644 --- a/functions_vars_u.html +++ b/functions_vars_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -148,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_v.html b/functions_vars_v.html index aa9b745d..0e9746db 100644 --- a/functions_vars_v.html +++ b/functions_vars_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -161,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_w.html b/functions_vars_w.html index 885da766..36498fa8 100644 --- a/functions_vars_w.html +++ b/functions_vars_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -131,6 +133,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : HID_CLASS_DESCRIPTOR_LEN_AND_TYPE , USB_HID_DESCRIPTOR +
  160. wide +: tty_features +
  161. WideBus16Bit : InquiryResponse
  162. @@ -164,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : USB_CONFIGURATION_DESCRIPTOR
  163. wVal_u -: SETUP_PKT +: SETUP_PKT
  164. wValue : CLASS_NOTIFICATION @@ -182,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_x.html b/functions_vars_x.html index 9e30c351..1f6cd951 100644 --- a/functions_vars_x.html +++ b/functions_vars_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
  165. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -134,6 +136,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  166. XboxConnected : XBOXOLD
  167. +
  168. XboxOneConnected +: XBOXONE +
  169. XboxReceiverConnected : XBOXRECV
  170. @@ -146,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars_y.html b/functions_vars_y.html index 57f99169..dd9b85d7 100644 --- a/functions_vars_y.html +++ b/functions_vars_y.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members - Variables + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -142,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_w.html b/functions_w.html index bdc2926b..8344b3a6 100644 --- a/functions_w.html +++ b/functions_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -131,6 +133,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : HID_CLASS_DESCRIPTOR_LEN_AND_TYPE , USB_HID_DESCRIPTOR +
  171. wide() +: ACM +, tty_features +
  172. WideBus16Bit : InquiryResponse
  173. @@ -167,17 +173,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Max_LCD , SPP +
  174. write_register() +: XR21B1411 +
  175. WriteOk : BulkOnly
  176. WriteProtected() -: BulkOnly +: BulkOnly
  177. wTotalLength : USB_CONFIGURATION_DESCRIPTOR
  178. wVal_u -: SETUP_PKT +: SETUP_PKT
  179. wValue : CLASS_NOTIFICATION @@ -195,7 +204,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_x.html b/functions_x.html index f752de5e..b8b2fc61 100644 --- a/functions_x.html +++ b/functions_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
  180. - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -137,6 +139,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  181. XBOXOLD() : XBOXOLD
  182. +
  183. XBOXONE() +: XBOXONE +
  184. +
  185. XboxOneConnected +: XBOXONE +
  186. XboxReceiverConnected : XBOXRECV
  187. @@ -146,6 +154,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  188. XBOXUSB() : XBOXUSB
  189. +
  190. XR21B1411() +: XR21B1411 +
  191. xy : PS4Data
  192. @@ -155,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_y.html b/functions_y.html index 2c55995b..3a6252f8 100644 --- a/functions_y.html +++ b/functions_y.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Class Members + @@ -31,7 +32,7 @@
    - + @@ -79,7 +80,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +
    @@ -142,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals.html b/globals.html index 1bf86055..382602f1 100644 --- a/globals.html +++ b/globals.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -131,13 +132,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  193. __HIDUSAGETITLEARRAYS_H__ : hidusagetitlearrays.cpp
  194. +
  195. __PGMSPACE_H_ +: version_helper.h +
  196. +
  197. _SFR_BYTE +: version_helper.h +
  198. diff --git a/globals_a.html b/globals_a.html index d1a57df8..087ea679 100644 --- a/globals_a.html +++ b/globals_a.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -218,7 +219,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_b.html b/globals_b.html index f8ea314c..20f2b337 100644 --- a/globals_b.html +++ b/globals_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -567,22 +568,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : BTD.h
  199. bmREQ_HID_IN -: PS3USB.h +: hid.h
  200. bmREQ_HID_OUT -: XBOXUSB.h -, XBOXOLD.h -, BTD.h -, PS3USB.h +: hid.h
  201. -
  202. bmREQ_HIDIN -: hid.h -
  203. -
  204. bmREQ_HIDOUT -: hid.h -
  205. -
  206. bmREQ_HIDREPORT -: hid.h +
  207. bmREQ_HID_REPORT +: hid.h
  208. bmREQ_MASSIN : masstorage.h @@ -728,7 +720,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_c.html b/globals_c.html index 230792df..17bd7a9a 100644 --- a/globals_c.html +++ b/globals_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
  209. - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -320,7 +321,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_d.html b/globals_d.html index ae2e2ae3..5b317cb9 100644 --- a/globals_d.html +++ b/globals_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -224,7 +225,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs.html b/globals_defs.html index 02a638d7..437cc0dc 100644 --- a/globals_defs.html +++ b/globals_defs.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -129,13 +130,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  210. __HIDUSAGETITLEARRAYS_H__ : hidusagetitlearrays.cpp
  211. +
  212. __PGMSPACE_H_ +: version_helper.h +
  213. +
  214. _SFR_BYTE +: version_helper.h +
  215. diff --git a/globals_defs_a.html b/globals_defs_a.html index cc73daea..f9ab5465 100644 --- a/globals_defs_a.html +++ b/globals_defs_a.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -183,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_b.html b/globals_defs_b.html index f843a6d7..71e19c58 100644 --- a/globals_defs_b.html +++ b/globals_defs_b.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -541,22 +542,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : BTD.h
  216. bmREQ_HID_IN -: PS3USB.h +: hid.h
  217. bmREQ_HID_OUT -: XBOXUSB.h -, PS3USB.h -, XBOXOLD.h -, BTD.h +: hid.h
  218. -
  219. bmREQ_HIDIN -: hid.h -
  220. -
  221. bmREQ_HIDOUT -: hid.h -
  222. -
  223. bmREQ_HIDREPORT -: hid.h +
  224. bmREQ_HID_REPORT +: hid.h
  225. bmREQ_MASSIN : masstorage.h @@ -699,7 +691,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_c.html b/globals_defs_c.html index bfaa436e..ef27095c 100644 --- a/globals_defs_c.html +++ b/globals_defs_c.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
  226. - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -288,7 +289,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_d.html b/globals_defs_d.html index 8cbf41c6..7a7833e5 100644 --- a/globals_defs_d.html +++ b/globals_defs_d.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -177,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_e.html b/globals_defs_e.html index 0b0eed92..bb4ca217 100644 --- a/globals_defs_e.html +++ b/globals_defs_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -135,17 +136,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  227. EP_DESCR_LEN : usb_ch9.h
  228. -
  229. EP_INTERRUPT -: XBOXUSB.h -, PS3USB.h -, XBOXOLD.h -, XBOXRECV.h -
  230. EP_MAXPKTSIZE -: PS3USB.h -, XBOXOLD.h -, XBOXRECV.h +: XBOXRECV.h , XBOXUSB.h +, PS3USB.h +, XBOXOLD.h +, XBOXONE.h
  231. epMUL : hidboot.h @@ -231,7 +227,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_f.html b/globals_defs_f.html index 528b0679..fbae9eff 100644 --- a/globals_defs_f.html +++ b/globals_defs_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
  232. - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -123,12 +124,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  

    - f -

      +
    • F +: version_helper.h +
    • FLOW_RX_AUTO : cdcprolific.h
    • FLOW_TX_AUTO : cdcprolific.h
    • +
    • fprintf_P +: version_helper.h +
    • FSHOST : max3421e.h
    • @@ -261,7 +268,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_g.html b/globals_defs_g.html index 2167de37..00ca9b89 100644 --- a/globals_defs_g.html +++ b/globals_defs_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -156,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_h.html b/globals_defs_h.html index 7cc87b85..30266a61 100644 --- a/globals_defs_h.html +++ b/globals_defs_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -294,7 +295,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  233. HID_REQUEST_GET_REPORT : hid.h -, PS3USB.h
  234. HID_REQUEST_SET_IDLE : hid.h @@ -303,11 +303,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : hid.h
  235. HID_REQUEST_SET_REPORT -: PS3USB.h -, XBOXOLD.h -, XBOXUSB.h -, hid.h -, BTD.h +: hid.h
  236. HID_RPT_PROTOCOL : hid.h @@ -459,7 +455,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_i.html b/globals_defs_i.html index ccc2f0b6..ff1c9ad2 100644 --- a/globals_defs_i.html +++ b/globals_defs_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
  237. - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -141,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_j.html b/globals_defs_j.html index 6ed691aa..62300476 100644 --- a/globals_defs_j.html +++ b/globals_defs_j.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -125,8 +126,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    - j -

    @@ -134,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_k.html b/globals_defs_k.html index 2ed6380b..e497ceb3 100644 --- a/globals_defs_k.html +++ b/globals_defs_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -189,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_l.html b/globals_defs_l.html index c0daa67e..deec21dd 100644 --- a/globals_defs_l.html +++ b/globals_defs_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -354,7 +355,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_m.html b/globals_defs_m.html index b0b65724..563e5fdb 100644 --- a/globals_defs_m.html +++ b/globals_defs_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -281,6 +282,21 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  238. MAX_REPORT_PARSERS : hid.h
  239. +
  240. memchr_P +: version_helper.h +
  241. +
  242. memcmp_P +: version_helper.h +
  243. +
  244. memcpy_P +: version_helper.h +
  245. +
  246. memmem_P +: version_helper.h +
  247. +
  248. memrchr_P +: version_helper.h +
  249. MODE_FS_HOST : max3421e.h
  250. @@ -302,7 +318,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_n.html b/globals_defs_n.html index 2432c5cd..3e0201e6 100644 --- a/globals_defs_n.html +++ b/globals_defs_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -162,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_o.html b/globals_defs_o.html index 68f3eb70..7c6ad86e 100644 --- a/globals_defs_o.html +++ b/globals_defs_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -144,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_p.html b/globals_defs_p.html index 890e595b..0a615949 100644 --- a/globals_defs_p.html +++ b/globals_defs_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -132,6 +133,48 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  251. PENDING : BTD.h
  252. +
  253. PGM_P +: version_helper.h +
  254. +
  255. pgm_read_byte +: version_helper.h +
  256. +
  257. pgm_read_byte_far +: version_helper.h +
  258. +
  259. pgm_read_byte_near +: version_helper.h +
  260. +
  261. pgm_read_dword +: version_helper.h +
  262. +
  263. pgm_read_dword_far +: version_helper.h +
  264. +
  265. pgm_read_dword_near +: version_helper.h +
  266. +
  267. pgm_read_float +: version_helper.h +
  268. +
  269. pgm_read_float_far +: version_helper.h +
  270. +
  271. pgm_read_float_near +: version_helper.h +
  272. +
  273. pgm_read_pointer +: version_helper.h +
  274. +
  275. pgm_read_word +: version_helper.h +
  276. +
  277. pgm_read_word_far +: version_helper.h +
  278. +
  279. pgm_read_word_near +: version_helper.h +
  280. PL_MAX_ENDPOINTS : cdcprolific.h
  281. @@ -141,6 +184,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  282. PL_VID : cdcprolific.h
  283. +
  284. printf_P +: version_helper.h +
  285. PROLIFIC_REV_1 : cdcprolific.h
  286. @@ -169,8 +215,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : PS3USB.h
  287. PS3_PID -: BTD.h -, PS3USB.h +: PS3USB.h +, BTD.h
  288. PS3_REPORT_BUFFER_SIZE : PS3Enums.h @@ -180,12 +226,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , PS3USB.h
  289. PS3MOVE_PID -: BTD.h -, PS3USB.h +: PS3USB.h +, BTD.h
  290. PS3NAVIGATION_PID -: BTD.h -, PS3USB.h +: PS3USB.h +, BTD.h
  291. PS4_PID : PS4USB.h @@ -199,13 +245,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  292. PSBUZZ_VID : PSBuzz.h
  293. +
  294. PSTR +: version_helper.h +
  295. diff --git a/globals_defs_r.html b/globals_defs_r.html index 6e693d83..a014c9a5 100644 --- a/globals_defs_r.html +++ b/globals_defs_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -228,7 +229,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_s.html b/globals_defs_s.html index 82641ad4..2b2a64fb 100644 --- a/globals_defs_s.html +++ b/globals_defs_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -384,15 +385,81 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  296. SET_RS : max_LCD.cpp
  297. +
  298. snprintf_P +: version_helper.h +
  299. SPECIAL_MASK : cdcprolific.h
  300. SPECIAL_SHIFT : cdcprolific.h
  301. +
  302. sprintf_P +: version_helper.h +
  303. STATE_ALL : cdcprolific.h
  304. +
  305. strcasecmp_P +: version_helper.h +
  306. +
  307. strcasestr_P +: version_helper.h +
  308. +
  309. strcat_P +: version_helper.h +
  310. +
  311. strchr_P +: version_helper.h +
  312. +
  313. strchrnul_P +: version_helper.h +
  314. +
  315. strcmp_P +: version_helper.h +
  316. +
  317. strcpy_P +: version_helper.h +
  318. +
  319. strlcat_P +: version_helper.h +
  320. +
  321. strlcpy_P +: version_helper.h +
  322. +
  323. strlen_P +: version_helper.h +
  324. +
  325. strncasecmp_P +: version_helper.h +
  326. +
  327. strncat_P +: version_helper.h +
  328. +
  329. strncmp_P +: version_helper.h +
  330. +
  331. strncpy_P +: version_helper.h +
  332. +
  333. strnlen_P +: version_helper.h +
  334. +
  335. strpbrk_P +: version_helper.h +
  336. +
  337. strrchr_P +: version_helper.h +
  338. +
  339. strsep_P +: version_helper.h +
  340. +
  341. strspn_P +: version_helper.h +
  342. +
  343. strstr_P +: version_helper.h +
  344. SUCCESSFUL : BTD.h
  345. @@ -405,7 +472,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_t.html b/globals_defs_t.html index 14bc2b5b..c49c3893 100644 --- a/globals_defs_t.html +++ b/globals_defs_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -231,7 +232,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_u.html b/globals_defs_u.html index b1813854..dfbad129 100644 --- a/globals_defs_u.html +++ b/globals_defs_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -123,9 +124,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  

    - u -

      -
    • UHS_ACL_HANDLE_OK -: BTD.h -
    • UHS_HID_BOOT_KEY_CAPS_LOCK : hidboot.h
    • @@ -495,7 +493,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_v.html b/globals_defs_v.html index 9fabc0cb..e98d5d5c 100644 --- a/globals_defs_v.html +++ b/globals_defs_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -141,13 +142,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  346. VENDOR_WRITE_REQUEST_TYPE : cdcprolific.h
  347. +
  348. vfprintf_P +: version_helper.h +
  349. +
  350. vsnprintf_P +: version_helper.h +
  351. +
  352. vsprintf_P +: version_helper.h +
  353. diff --git a/globals_defs_w.html b/globals_defs_w.html index d340e376..cf873690 100644 --- a/globals_defs_w.html +++ b/globals_defs_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -159,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_defs_x.html b/globals_defs_x.html index 67581488..4d985b21 100644 --- a/globals_defs_x.html +++ b/globals_defs_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -125,11 +126,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    - x -

    diff --git a/globals_e.html b/globals_e.html index 83b0d3f0..a0f97e2f 100644 --- a/globals_e.html +++ b/globals_e.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -152,17 +153,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  354. EP_DESCR_LEN : usb_ch9.h
  355. -
  356. EP_INTERRUPT -: XBOXOLD.h -, XBOXRECV.h -, XBOXUSB.h -, PS3USB.h -
  357. EP_MAXPKTSIZE -: PS3USB.h -, XBOXOLD.h +: XBOXOLD.h +, XBOXONE.h , XBOXRECV.h , XBOXUSB.h +, PS3USB.h
  358. epMUL : hidboot.h @@ -251,7 +247,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_enum.html b/globals_enum.html index d9bc462f..8f2ef7c9 100644 --- a/globals_enum.html +++ b/globals_enum.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
  359. - + @@ -82,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -141,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_eval.html b/globals_eval.html index d4f46980..6a81fb70 100644 --- a/globals_eval.html +++ b/globals_eval.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -108,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -600,12 +601,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  360. Y : controllerEnums.h
  361. -
  362. YELLOW -: controllerEnums.h -
  363. Yellow : controllerEnums.h
  364. +
  365. YELLOW +: controllerEnums.h +
  366. @@ -625,7 +626,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_f.html b/globals_f.html index 098c3081..990e91a2 100644 --- a/globals_f.html +++ b/globals_f.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -125,6 +126,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Here is a list of all file members with links to the files they belong to:

    - f -

      +
    • F +: version_helper.h +
    • FASTBLINK : xboxEnums.h
    • @@ -134,6 +138,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • FLOW_TX_AUTO : cdcprolific.h
    • +
    • fprintf_P +: version_helper.h +
    • FSHOST : max3421e.h
    • @@ -269,7 +276,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_func.html b/globals_func.html index 520fa67d..ef3654cf 100644 --- a/globals_func.html +++ b/globals_func.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -82,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -138,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_g.html b/globals_g.html index 6f0df6f5..8890987c 100644 --- a/globals_g.html +++ b/globals_g.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -182,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_h.html b/globals_h.html index 3362ade5..9e8fca0a 100644 --- a/globals_h.html +++ b/globals_h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -305,7 +306,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  367. HID_REQUEST_GET_REPORT : hid.h -, PS3USB.h
  368. HID_REQUEST_SET_IDLE : hid.h @@ -314,11 +314,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : hid.h
  369. HID_REQUEST_SET_REPORT -: BTD.h -, hid.h -, PS3USB.h -, XBOXOLD.h -, XBOXUSB.h +: hid.h
  370. HID_RPT_PROTOCOL : hid.h @@ -476,7 +472,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_i.html b/globals_i.html index 5fdd9d83..894c83e7 100644 --- a/globals_i.html +++ b/globals_i.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
  371. - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_j.html b/globals_j.html index 85bc8c8a..8310b841 100644 --- a/globals_j.html +++ b/globals_j.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -127,8 +128,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    - j -

    @@ -136,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_k.html b/globals_k.html index 2aabeb5a..de9934f3 100644 --- a/globals_k.html +++ b/globals_k.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -206,7 +207,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_l.html b/globals_l.html index 623f5feb..de8168c2 100644 --- a/globals_l.html +++ b/globals_l.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -419,7 +420,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_m.html b/globals_m.html index 0b53acfd..9d8e48e5 100644 --- a/globals_m.html +++ b/globals_m.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -286,6 +287,21 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  372. MAX_REPORT_PARSERS : hid.h
  373. +
  374. memchr_P +: version_helper.h +
  375. +
  376. memcmp_P +: version_helper.h +
  377. +
  378. memcpy_P +: version_helper.h +
  379. +
  380. memmem_P +: version_helper.h +
  381. +
  382. memrchr_P +: version_helper.h +
  383. MINUS : controllerEnums.h
  384. @@ -343,7 +359,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_n.html b/globals_n.html index c7af4d4e..10afc0b1 100644 --- a/globals_n.html +++ b/globals_n.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -167,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_o.html b/globals_o.html index 7518e49b..a54ed16e 100644 --- a/globals_o.html +++ b/globals_o.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -161,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_p.html b/globals_p.html index 349aede6..0df06e93 100644 --- a/globals_p.html +++ b/globals_p.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -134,6 +135,48 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  385. PENDING : BTD.h
  386. +
  387. PGM_P +: version_helper.h +
  388. +
  389. pgm_read_byte +: version_helper.h +
  390. +
  391. pgm_read_byte_far +: version_helper.h +
  392. +
  393. pgm_read_byte_near +: version_helper.h +
  394. +
  395. pgm_read_dword +: version_helper.h +
  396. +
  397. pgm_read_dword_far +: version_helper.h +
  398. +
  399. pgm_read_dword_near +: version_helper.h +
  400. +
  401. pgm_read_float +: version_helper.h +
  402. +
  403. pgm_read_float_far +: version_helper.h +
  404. +
  405. pgm_read_float_near +: version_helper.h +
  406. +
  407. pgm_read_pointer +: version_helper.h +
  408. +
  409. pgm_read_word +: version_helper.h +
  410. +
  411. pgm_read_word_far +: version_helper.h +
  412. +
  413. pgm_read_word_near +: version_helper.h +
  414. Pitch : controllerEnums.h
  415. @@ -158,6 +201,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  416. PrintBin() : printhex.h
  417. +
  418. printf_P +: version_helper.h +
  419. PrintHex() : printhex.h
  420. @@ -168,6 +214,33 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : usbhub.cpp , usbhub.h +
  421. prog_char +: version_helper.h +
  422. +
  423. prog_int16_t +: version_helper.h +
  424. +
  425. prog_int32_t +: version_helper.h +
  426. +
  427. prog_int8_t +: version_helper.h +
  428. +
  429. prog_uchar +: version_helper.h +
  430. +
  431. prog_uint16_t +: version_helper.h +
  432. +
  433. prog_uint32_t +: version_helper.h +
  434. +
  435. prog_uint8_t +: version_helper.h +
  436. +
  437. prog_void +: version_helper.h +
  438. PROLIFIC_REV_1 : cdcprolific.h
  439. @@ -247,6 +320,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  440. PSETUP_PKT : UsbCore.h
  441. +
  442. PSTR +: version_helper.h +
  443. pstrCRLF : hidusagestr.h
  444. @@ -1606,12 +1682,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  445. pstrUsageHeadphone : hidusagestr.h
  446. -
  447. pstrUsageHeadSet -: hidusagestr.h -
  448. pstrUsageHeadset : hidusagestr.h
  449. +
  450. pstrUsageHeadSet +: hidusagestr.h +
  451. pstrUsageHeadTracker : hidusagestr.h
  452. @@ -2825,7 +2901,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : hidusagestr.h
  453. PTP_ARRAY_EL_FUNC -: parsetools.h +: parsetools.h
  454. Purble : controllerEnums.h @@ -2836,7 +2912,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_r.html b/globals_r.html index e53b8a53..5b408081 100644 --- a/globals_r.html +++ b/globals_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
  455. - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -284,7 +285,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_s.html b/globals_s.html index 472e147c..fb683010 100644 --- a/globals_s.html +++ b/globals_s.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -404,12 +405,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  456. SLOWBLINK : xboxEnums.h
  457. +
  458. snprintf_P +: version_helper.h +
  459. SPECIAL_MASK : cdcprolific.h
  460. SPECIAL_SHIFT : cdcprolific.h
  461. +
  462. sprintf_P +: version_helper.h +
  463. SQUARE : controllerEnums.h
  464. @@ -422,6 +429,66 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  465. StatusEnum : PS3Enums.h
  466. +
  467. strcasecmp_P +: version_helper.h +
  468. +
  469. strcasestr_P +: version_helper.h +
  470. +
  471. strcat_P +: version_helper.h +
  472. +
  473. strchr_P +: version_helper.h +
  474. +
  475. strchrnul_P +: version_helper.h +
  476. +
  477. strcmp_P +: version_helper.h +
  478. +
  479. strcpy_P +: version_helper.h +
  480. +
  481. strlcat_P +: version_helper.h +
  482. +
  483. strlcpy_P +: version_helper.h +
  484. +
  485. strlen_P +: version_helper.h +
  486. +
  487. strncasecmp_P +: version_helper.h +
  488. +
  489. strncat_P +: version_helper.h +
  490. +
  491. strncmp_P +: version_helper.h +
  492. +
  493. strncpy_P +: version_helper.h +
  494. +
  495. strnlen_P +: version_helper.h +
  496. +
  497. strpbrk_P +: version_helper.h +
  498. +
  499. strrchr_P +: version_helper.h +
  500. +
  501. strsep_P +: version_helper.h +
  502. +
  503. strspn_P +: version_helper.h +
  504. +
  505. strstr_P +: version_helper.h +
  506. SUCCESSFUL : BTD.h
  507. @@ -437,7 +504,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_t.html b/globals_t.html index c27027e0..f842cc48 100644 --- a/globals_t.html +++ b/globals_t.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -260,7 +261,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_type.html b/globals_type.html index e501b039..7f103252 100644 --- a/globals_type.html +++ b/globals_type.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -82,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -111,11 +112,38 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  508. MAX3421E : UsbCore.h
  509. +
  510. prog_char +: version_helper.h +
  511. +
  512. prog_int16_t +: version_helper.h +
  513. +
  514. prog_int32_t +: version_helper.h +
  515. +
  516. prog_int8_t +: version_helper.h +
  517. +
  518. prog_uchar +: version_helper.h +
  519. +
  520. prog_uint16_t +: version_helper.h +
  521. +
  522. prog_uint32_t +: version_helper.h +
  523. +
  524. prog_uint8_t +: version_helper.h +
  525. +
  526. prog_void +: version_helper.h +
  527. PSETUP_PKT : UsbCore.h
  528. PTP_ARRAY_EL_FUNC -: parsetools.h +: parsetools.h
  529. TEL_CALL_STATE_REP_CPBL_FUNC_DESCR : cdcacm.h @@ -124,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : cdcacm.h
  530. UsbDeviceHandleFunc -: address.h +: address.h
  531. @@ -132,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_u.html b/globals_u.html index d5d0227a..a9543a28 100644 --- a/globals_u.html +++ b/globals_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -125,9 +126,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Here is a list of all file members with links to the files they belong to:

    - u -

      -
    • UHS_ACL_HANDLE_OK -: BTD.h -
    • UHS_HID_BOOT_KEY_CAPS_LOCK : hidboot.h
    • @@ -474,13 +472,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : UsbCore.h
    • UsbDEBUGlvl -: message.cpp -, sink_parser.h +: sink_parser.h +, message.cpp , hexdump.h , message.h
    • UsbDeviceHandleFunc -: address.h +: address.h
    • USBTRACE : macros.h @@ -515,7 +513,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_v.html b/globals_v.html index f85a589e..baa645cb 100644 --- a/globals_v.html +++ b/globals_v.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -152,13 +153,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  532. VENDOR_WRITE_REQUEST_TYPE : cdcprolific.h
  533. +
  534. vfprintf_P +: version_helper.h +
  535. +
  536. vsnprintf_P +: version_helper.h +
  537. +
  538. vsprintf_P +: version_helper.h +
  539. diff --git a/globals_vars.html b/globals_vars.html index 582c1fbf..16fa3c0b 100644 --- a/globals_vars.html +++ b/globals_vars.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -2702,7 +2703,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_r.html b/globals_vars_r.html index 1a327094..0239bef0 100644 --- a/globals_vars_r.html +++ b/globals_vars_r.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -113,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_u.html b/globals_vars_u.html index cb6c81f0..5c428f46 100644 --- a/globals_vars_u.html +++ b/globals_vars_u.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -116,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_w.html b/globals_vars_w.html index 70901d94..83c4155f 100644 --- a/globals_vars_w.html +++ b/globals_vars_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -119,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_vars_x.html b/globals_vars_x.html index 32860729..e4d43fec 100644 --- a/globals_vars_x.html +++ b/globals_vars_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -119,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_w.html b/globals_w.html index 27bd6dfd..6e2fe578 100644 --- a/globals_w.html +++ b/globals_w.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -176,7 +177,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/globals_x.html b/globals_x.html index 2316da65..66725aac 100644 --- a/globals_x.html +++ b/globals_x.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@
    - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -136,12 +137,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  540. XBOX_CONTROL_PIPE : XBOXOLD.h +, XBOXONE.h , XBOXRECV.h , XBOXUSB.h
  541. XBOX_INPUT_PIPE -: XBOXUSB.h -, XBOXOLD.h +: XBOXOLD.h +, XBOXONE.h +, XBOXUSB.h
  542. XBOX_INPUT_PIPE_1 : XBOXRECV.h @@ -159,9 +162,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : xboxEnums.h
  543. XBOX_MAX_ENDPOINTS -: XBOXUSB.h -, XBOXOLD.h +: XBOXOLD.h +, XBOXONE.h , XBOXRECV.h +, XBOXUSB.h
  544. XBOX_OLD_PID1 : XBOXOLD.h @@ -175,8 +179,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  545. XBOX_OLD_PID4 : XBOXOLD.h
  546. +
  547. XBOX_ONE_PID +: XBOXONE.h +
  548. XBOX_OUTPUT_PIPE : XBOXOLD.h +, XBOXONE.h , XBOXUSB.h
  549. XBOX_OUTPUT_PIPE_1 @@ -192,12 +200,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : XBOXRECV.h
  550. XBOX_REPORT_BUFFER_SIZE -: XBOXUSB.h +: XBOXONE.h +, XBOXUSB.h
  551. XBOX_VID -: XBOXRECV.h +: XBOXOLD.h +, XBOXONE.h +, XBOXRECV.h , XBOXUSB.h -, XBOXOLD.h
  552. XBOX_WIRED_PID : XBOXUSB.h @@ -206,8 +216,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : XBOXUSB.h
  553. XBOX_WIRELESS_RECEIVER_PID -: XBOXUSB.h -, XBOXRECV.h +: XBOXRECV.h +, XBOXUSB.h
  554. XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID : XBOXRECV.h @@ -225,13 +235,178 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  555. XOOM : adk.h
  556. +
  557. XR_MAX_ENDPOINTS +: cdc_XR21B1411.h +
  558. +
  559. XR_READ_REQUEST_TYPE +: cdc_XR21B1411.h +
  560. +
  561. XR_REG_ACM_FLOW_CTL +: cdc_XR21B1411.h +
  562. +
  563. XR_REG_ACM_GPIO_DIR +: cdc_XR21B1411.h +
  564. +
  565. XR_REG_ACM_GPIO_INT +: cdc_XR21B1411.h +
  566. +
  567. XR_REG_ACM_GPIO_MODE +: cdc_XR21B1411.h +
  568. +
  569. XR_REG_CUSTOM_DRIVER +: cdc_XR21B1411.h +
  570. +
  571. XR_REG_CUSTOM_DRIVER_ACTIVE +: cdc_XR21B1411.h +
  572. +
  573. XR_REG_CUSTOMISED_INT +: cdc_XR21B1411.h +
  574. +
  575. XR_REG_ERROR_STATUS +: cdc_XR21B1411.h +
  576. +
  577. XR_REG_ERROR_STATUS_BREAK +: cdc_XR21B1411.h +
  578. +
  579. XR_REG_ERROR_STATUS_ERROR +: cdc_XR21B1411.h +
  580. +
  581. XR_REG_ERROR_STATUS_FRAME +: cdc_XR21B1411.h +
  582. +
  583. XR_REG_ERROR_STATUS_MASK +: cdc_XR21B1411.h +
  584. +
  585. XR_REG_ERROR_STATUS_OVERRUN +: cdc_XR21B1411.h +
  586. +
  587. XR_REG_ERROR_STATUS_PARITY +: cdc_XR21B1411.h +
  588. +
  589. XR_REG_FLOW_CTL +: cdc_XR21B1411.h +
  590. +
  591. XR_REG_FLOW_CTL_HALF_DPLX +: cdc_XR21B1411.h +
  592. +
  593. XR_REG_FLOW_CTL_HW +: cdc_XR21B1411.h +
  594. +
  595. XR_REG_FLOW_CTL_MMMRX +: cdc_XR21B1411.h +
  596. +
  597. XR_REG_FLOW_CTL_MMMRXTX +: cdc_XR21B1411.h +
  598. +
  599. XR_REG_FLOW_CTL_MODE_MASK +: cdc_XR21B1411.h +
  600. +
  601. XR_REG_FLOW_CTL_NONE +: cdc_XR21B1411.h +
  602. +
  603. XR_REG_FLOW_CTL_SW +: cdc_XR21B1411.h +
  604. +
  605. XR_REG_GPIO_CLR +: cdc_XR21B1411.h +
  606. +
  607. XR_REG_GPIO_DIR +: cdc_XR21B1411.h +
  608. +
  609. XR_REG_GPIO_INT +: cdc_XR21B1411.h +
  610. +
  611. XR_REG_GPIO_MASK +: cdc_XR21B1411.h +
  612. +
  613. XR_REG_GPIO_MODE +: cdc_XR21B1411.h +
  614. +
  615. XR_REG_GPIO_MODE_ATE +: cdc_XR21B1411.h +
  616. +
  617. XR_REG_GPIO_MODE_ATE_ADDRESS +: cdc_XR21B1411.h +
  618. +
  619. XR_REG_GPIO_MODE_FC_DTRDSR +: cdc_XR21B1411.h +
  620. +
  621. XR_REG_GPIO_MODE_FC_RTSCTS +: cdc_XR21B1411.h +
  622. +
  623. XR_REG_GPIO_MODE_GPIO +: cdc_XR21B1411.h +
  624. +
  625. XR_REG_GPIO_SET +: cdc_XR21B1411.h +
  626. +
  627. XR_REG_GPIO_STATUS +: cdc_XR21B1411.h +
  628. +
  629. XR_REG_LOOPBACK +: cdc_XR21B1411.h +
  630. +
  631. XR_REG_PIN_PULLDOWN_ENABLE +: cdc_XR21B1411.h +
  632. +
  633. XR_REG_PIN_PULLUP_ENABLE +: cdc_XR21B1411.h +
  634. +
  635. XR_REG_RX_FIFO_COUNT +: cdc_XR21B1411.h +
  636. +
  637. XR_REG_RX_FIFO_LATENCY +: cdc_XR21B1411.h +
  638. +
  639. XR_REG_RX_FIFO_LATENCY_ENABLE +: cdc_XR21B1411.h +
  640. +
  641. XR_REG_RX_FIFO_RESET +: cdc_XR21B1411.h +
  642. +
  643. XR_REG_TX_BREAK +: cdc_XR21B1411.h +
  644. +
  645. XR_REG_TX_FIFO_COUNT +: cdc_XR21B1411.h +
  646. +
  647. XR_REG_TX_FIFO_RESET +: cdc_XR21B1411.h +
  648. +
  649. XR_REG_UART_ENABLE +: cdc_XR21B1411.h +
  650. +
  651. XR_REG_UART_ENABLE_RX +: cdc_XR21B1411.h +
  652. +
  653. XR_REG_UART_ENABLE_TX +: cdc_XR21B1411.h +
  654. +
  655. XR_REG_WIDE_MODE +: cdc_XR21B1411.h +
  656. +
  657. XR_REG_WIDE_MODE_ENABLE +: cdc_XR21B1411.h +
  658. +
  659. XR_REG_XCVR_EN_DELAY +: cdc_XR21B1411.h +
  660. +
  661. XR_REG_XOFF_CHAR +: cdc_XR21B1411.h +
  662. +
  663. XR_REG_XON_CHAR +: cdc_XR21B1411.h +
  664. +
  665. XR_WRITE_REQUEST_TYPE +: cdc_XR21B1411.h +
  666. diff --git a/globals_y.html b/globals_y.html index bf024928..d332d8fa 100644 --- a/globals_y.html +++ b/globals_y.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -128,19 +129,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  667. Y : controllerEnums.h
  668. -
  669. Yellow -: controllerEnums.h -
  670. YELLOW : controllerEnums.h
  671. +
  672. Yellow +: controllerEnums.h +
  673. diff --git a/globals_z.html b/globals_z.html index 2fbd6fb8..322b0dd4 100644 --- a/globals_z.html +++ b/globals_z.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: File Members + @@ -31,7 +32,7 @@ - + @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -140,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/graph_legend.html b/graph_legend.html index 8aed3bc9..308b189a 100644 --- a/graph_legend.html +++ b/graph_legend.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Graph Legend + @@ -31,7 +32,7 @@
    - + @@ -65,7 +66,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -80,40 +81,40 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

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

    -

    Consider the following example:

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

    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:

    @@ -147,7 +148,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem diff --git a/hexdump_8h.html b/hexdump_8h.html index cab6f6a4..c3d5b01b 100644 --- a/hexdump_8h.html +++ b/hexdump_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hexdump.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -125,7 +126,7 @@ Variables diff --git a/hexdump_8h_source.html b/hexdump_8h_source.html index 49a6fb20..bc6947cb 100644 --- a/hexdump_8h_source.html +++ b/hexdump_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hexdump.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -127,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    36  byteTotal = 0;
    37  };
    38 
    -
    39  virtual void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset);
    +
    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>
    @@ -136,13 +137,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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);
    +
    48  E_Notify(PSTR(": "), 0x80);
    49  }
    50  PrintHex<uint8_t > (pbuf[j], 0x80);
    -
    51  E_Notify(PSTR(" "), 0x80);
    +
    51  E_Notify(PSTR(" "), 0x80);
    52 
    53  if(byteCount == 15) {
    -
    54  E_Notify(PSTR("\r\n"), 0x80);
    +
    54  E_Notify(PSTR("\r\n"), 0x80);
    55  byteCount = 0xFF;
    56  }
    57  }
    @@ -153,15 +154,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    -
    virtual void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)
    Definition: hexdump.h:43
    +
    void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset)
    Definition: hexdump.h:43
    diff --git a/hid_8cpp.html b/hid_8cpp.html index f3e645fb..621a4e8d 100644 --- a/hid_8cpp.html +++ b/hid_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hid.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for hid.cpp:
    diff --git a/hid_8cpp__incl.md5 b/hid_8cpp__incl.md5 index ebd987a6..5717c5ed 100644 --- a/hid_8cpp__incl.md5 +++ b/hid_8cpp__incl.md5 @@ -1 +1 @@ -bbd5085fd941c995891b2435bdf87f40 \ No newline at end of file +03c94cb8befed052703cc30b5194045a \ No newline at end of file diff --git a/hid_8cpp_source.html b/hid_8cpp_source.html index 1fb8ade7..54ec5b1a 100644 --- a/hid_8cpp_source.html +++ b/hid_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hid.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -115,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    24  const uint8_t constBufLen = 64;
    25  uint8_t buf[constBufLen];
    26 
    -
    27  uint8_t rcode = pUsb->ctrlReq(bAddress, ep, bmREQ_HIDREPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00,
    +
    27  uint8_t rcode = pUsb->ctrlReq(bAddress, ep, bmREQ_HID_REPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00,
    28  HID_DESCRIPTOR_REPORT, 0x0000, 128, constBufLen, buf, (USBReadParser*)parser);
    29 
    30  //return ((rcode != hrSTALL) ? rcode : 0);
    @@ -126,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    35  const uint8_t constBufLen = 64;
    36  uint8_t buf[constBufLen];
    37 
    -
    38  uint8_t rcode = pUsb->ctrlReq(bAddress, 0x00, bmREQ_HIDREPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00,
    +
    38  uint8_t rcode = pUsb->ctrlReq(bAddress, 0x00, bmREQ_HID_REPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00,
    39  HID_DESCRIPTOR_REPORT, wIndex, 128, constBufLen, buf, (USBReadParser*)parser);
    40 
    41  //return ((rcode != hrSTALL) ? rcode : 0);
    @@ -139,66 +140,66 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    48 //}
    49 
    50 uint8_t HID::SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr) {
    -
    51  return ( pUsb->ctrlReq(bAddress, ep, bmREQ_HIDOUT, HID_REQUEST_SET_REPORT, report_id, report_type, iface, nbytes, nbytes, dataptr, NULL));
    +
    51  return ( pUsb->ctrlReq(bAddress, ep, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, report_id, report_type, iface, nbytes, nbytes, dataptr, NULL));
    52 }
    53 
    54 uint8_t HID::GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr) {
    -
    55  return ( pUsb->ctrlReq(bAddress, ep, bmREQ_HIDIN, HID_REQUEST_GET_REPORT, report_id, report_type, iface, nbytes, nbytes, dataptr, NULL));
    +
    55  return ( pUsb->ctrlReq(bAddress, ep, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, report_id, report_type, iface, nbytes, nbytes, dataptr, NULL));
    56 }
    57 
    58 uint8_t HID::GetIdle(uint8_t iface, uint8_t reportID, uint8_t* dataptr) {
    -
    59  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HIDIN, HID_REQUEST_GET_IDLE, reportID, 0, iface, 0x0001, 0x0001, dataptr, NULL));
    +
    59  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HID_IN, HID_REQUEST_GET_IDLE, reportID, 0, iface, 0x0001, 0x0001, dataptr, NULL));
    60 }
    61 
    62 uint8_t HID::SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration) {
    -
    63  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HIDOUT, HID_REQUEST_SET_IDLE, reportID, duration, iface, 0x0000, 0x0000, NULL, NULL));
    +
    63  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HID_OUT, HID_REQUEST_SET_IDLE, reportID, duration, iface, 0x0000, 0x0000, NULL, NULL));
    64 }
    65 
    66 uint8_t HID::SetProtocol(uint8_t iface, uint8_t protocol) {
    -
    67  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HIDOUT, HID_REQUEST_SET_PROTOCOL, protocol, 0x00, iface, 0x0000, 0x0000, NULL, NULL));
    +
    67  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HID_OUT, HID_REQUEST_SET_PROTOCOL, protocol, 0x00, iface, 0x0000, 0x0000, NULL, NULL));
    68 }
    69 
    70 uint8_t HID::GetProtocol(uint8_t iface, uint8_t* dataptr) {
    -
    71  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HIDIN, HID_REQUEST_GET_PROTOCOL, 0x00, 0x00, iface, 0x0001, 0x0001, dataptr, NULL));
    +
    71  return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HID_IN, HID_REQUEST_GET_PROTOCOL, 0x00, 0x00, iface, 0x0001, 0x0001, dataptr, NULL));
    72 }
    73 
    -
    75  Notify(PSTR("Endpoint descriptor:"), 0x80);
    -
    76  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    +
    75  Notify(PSTR("Endpoint descriptor:"), 0x80);
    +
    76  Notify(PSTR("\r\nLength:\t\t"), 0x80);
    77  D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80);
    -
    78  Notify(PSTR("\r\nType:\t\t"), 0x80);
    +
    78  Notify(PSTR("\r\nType:\t\t"), 0x80);
    79  D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80);
    -
    80  Notify(PSTR("\r\nAddress:\t"), 0x80);
    +
    80  Notify(PSTR("\r\nAddress:\t"), 0x80);
    81  D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80);
    -
    82  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    +
    82  Notify(PSTR("\r\nAttributes:\t"), 0x80);
    83  D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80);
    -
    84  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    +
    84  Notify(PSTR("\r\nMaxPktSize:\t"), 0x80);
    85  D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80);
    -
    86  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    +
    86  Notify(PSTR("\r\nPoll Intrv:\t"), 0x80);
    87  D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80);
    88 }
    89 
    -
    91  Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80);
    -
    92  Notify(PSTR("bDescLength:\t\t"), 0x80);
    +
    91  Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80);
    +
    92  Notify(PSTR("bDescLength:\t\t"), 0x80);
    93  D_PrintHex<uint8_t > (pDesc->bLength, 0x80);
    94 
    -
    95  Notify(PSTR("\r\nbDescriptorType:\t"), 0x80);
    +
    95  Notify(PSTR("\r\nbDescriptorType:\t"), 0x80);
    96  D_PrintHex<uint8_t > (pDesc->bDescriptorType, 0x80);
    97 
    -
    98  Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80);
    +
    98  Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80);
    99  D_PrintHex<uint16_t > (pDesc->bcdHID, 0x80);
    100 
    -
    101  Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80);
    +
    101  Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80);
    102  D_PrintHex<uint8_t > (pDesc->bCountryCode, 0x80);
    103 
    -
    104  Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80);
    +
    104  Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80);
    105  D_PrintHex<uint8_t > (pDesc->bNumDescriptors, 0x80);
    106 
    -
    107  Notify(PSTR("\r\nbDescrType:\t\t"), 0x80);
    +
    107  Notify(PSTR("\r\nbDescrType:\t\t"), 0x80);
    108  D_PrintHex<uint8_t > (pDesc->bDescrType, 0x80);
    109 
    -
    110  Notify(PSTR("\r\nwDescriptorLength:\t"), 0x80);
    +
    110  Notify(PSTR("\r\nwDescriptorLength:\t"), 0x80);
    111  D_PrintHex<uint16_t > (pDesc->wDescriptorLength, 0x80);
    112 }
    #define HID_DESCRIPTOR_REPORT
    Definition: hid.h:78
    @@ -206,13 +207,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)
    Definition: hid.cpp:58
    uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: hid.cpp:50
    -
    #define bmREQ_HIDOUT
    Definition: hid.h:63
    +
    #define HID_REQUEST_SET_REPORT
    Definition: hid.h:72
    uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: hid.cpp:54
    #define USB_REQUEST_GET_DESCRIPTOR
    Definition: usb_ch9.h:37
    #define HID_REQUEST_SET_IDLE
    Definition: hid.h:73
    +
    #define bmREQ_HID_OUT
    Definition: hid.h:63
    uint8_t bLength
    Definition: usb_ch9.h:152
    uint8_t bAddress
    Definition: hid.h:146
    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
    @@ -222,22 +224,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t SetProtocol(uint8_t iface, uint8_t protocol)
    Definition: hid.cpp:66
    uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)
    Definition: hid.cpp:34
    -
    #define bmREQ_HIDREPORT
    Definition: hid.h:65
    uint16_t wDescriptorLength
    Definition: usb_ch9.h:158
    uint8_t bCountryCode
    Definition: usb_ch9.h:155
    #define HID_REQUEST_SET_PROTOCOL
    Definition: hid.h:74
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    -
    #define HID_REQUEST_SET_REPORT
    Definition: BTD.h:39
    #define HID_REQUEST_GET_REPORT
    Definition: hid.h:69
    uint8_t bNumDescriptors
    Definition: usb_ch9.h:156
    +
    #define bmREQ_HID_REPORT
    Definition: hid.h:65
    uint8_t bEndpointAddress
    Definition: usb_ch9.h:144
    - +
    uint8_t bDescriptorType
    Definition: usb_ch9.h:153
    +
    #define PSTR(str)
    void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)
    Definition: hid.cpp:90
    +
    #define bmREQ_HID_IN
    Definition: hid.h:64
    USB * pUsb
    Definition: hid.h:145
    uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)
    Definition: hid.cpp:62
    -
    #define bmREQ_HIDIN
    Definition: hid.h:64
    void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
    Definition: hid.cpp:74
    uint16_t bcdHID
    Definition: usb_ch9.h:154
    #define HID_REQUEST_GET_PROTOCOL
    Definition: hid.h:71
    @@ -247,7 +249,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hid_8h.html b/hid_8h.html index e09cb66b..29d5220a 100644 --- a/hid_8h.html +++ b/hid_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hid.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -106,7 +107,7 @@ This graph shows which files directly or indirectly include this file:
    - +

    Go to the source code of this file.

    @@ -188,12 +189,12 @@ Macros   #define TAG_LOCAL_USAGEMAX   0x20   -#define bmREQ_HIDOUT   USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE -  -#define bmREQ_HIDIN   USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE -  -#define bmREQ_HIDREPORT   USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_INTERFACE -  +#define bmREQ_HID_OUT   USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE +  +#define bmREQ_HID_IN   USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE +  +#define bmREQ_HID_REPORT   USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_INTERFACE +  #define HID_REQUEST_GET_REPORT   0x01   #define HID_REQUEST_GET_IDLE   0x02 @@ -712,12 +713,12 @@ Macros - + - + - +
    @@ -1235,7 +1236,7 @@ Macros diff --git a/hid_8h__dep__incl.map b/hid_8h__dep__incl.map index 2efd26b4..be0cca6c 100644 --- a/hid_8h__dep__incl.map +++ b/hid_8h__dep__incl.map @@ -1,15 +1,29 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hid_8h__dep__incl.md5 b/hid_8h__dep__incl.md5 index 11dd4e14..ea74fb29 100644 --- a/hid_8h__dep__incl.md5 +++ b/hid_8h__dep__incl.md5 @@ -1 +1 @@ -c1b8478deaa54c22ebe0efb6ce5e6d38 \ No newline at end of file +84c62dd49b6032d3aba037e31041d9a8 \ No newline at end of file diff --git a/hid_8h__dep__incl.png b/hid_8h__dep__incl.png index b5ce56f3f52fe45f178e6dd87961c5f765a28204..7be016bfe054eeecb2382a56661a32e4872f9fc1 100644 GIT binary patch literal 64796 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 literal 33484 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]s*zp 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 - + USB Host Shield 2.0: hid.h Source File + @@ -31,7 +32,7 @@

    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -111,8 +112,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    20 #include "Usb.h"
    21 #include "hidusagestr.h"
    22 
    -
    23 #define MAX_REPORT_PARSERS 2
    -
    24 #define HID_MAX_HID_CLASS_DESCRIPTORS 5
    +
    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
    @@ -151,9 +152,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    60 #define TAG_LOCAL_USAGEMAX 0x20
    61 
    62 /* HID requests */
    -
    63 #define bmREQ_HIDOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    -
    64 #define bmREQ_HIDIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
    -
    65 #define bmREQ_HIDREPORT USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_INTERFACE
    +
    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 */
    @@ -199,10 +200,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    +
    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
    +
    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
    @@ -242,44 +243,45 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    151 
    152  static const uint8_t maxHidInterfaces = 3;
    153  static const uint8_t maxEpPerInterface = 2;
    -
    154  static const uint8_t totalEndpoints = (maxHidInterfaces * maxEpPerInterface + 1);
    +
    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);
    +
    159  virtual HIDReportParser* GetReportParser(uint8_t id) {};
    160 
    161 public:
    162 
    -
    163  HID(USB *pusb) : pUsb(pusb) {
    +
    163  HID(USB *pusb) : pUsb(pusb) {
    164  };
    165 
    166  const USB* GetUsb() {
    167  return pUsb;
    168  };
    -
    169  virtual bool SetReportParser(uint8_t id, HIDReportParser *prs);
    -
    170 
    -
    171  uint8_t SetProtocol(uint8_t iface, uint8_t protocol);
    -
    172  uint8_t GetProtocol(uint8_t iface, uint8_t* dataptr);
    -
    173  uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t* dataptr);
    -
    174  uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration);
    -
    175 
    -
    176  uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser = NULL);
    -
    177 
    -
    178  uint8_t GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
    -
    179  uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
    -
    180  uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
    -
    181 };
    -
    182 
    -
    183 #endif // __HID_H__
    +
    169 
    +
    170  virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {};
    +
    171 
    +
    172  uint8_t SetProtocol(uint8_t iface, uint8_t protocol);
    +
    173  uint8_t GetProtocol(uint8_t iface, uint8_t* dataptr);
    +
    174  uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t* dataptr);
    +
    175  uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration);
    +
    176 
    +
    177  uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser = NULL);
    +
    178 
    +
    179  uint8_t GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
    +
    180  uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
    +
    181  uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
    +
    182 };
    +
    183 
    +
    184 #endif // __HID_H__
    uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)
    Definition: hid.cpp:58
    -
    virtual HIDReportParser * GetReportParser(uint8_t id)
    +
    virtual HIDReportParser * GetReportParser(uint8_t id)
    Definition: hid.h:159
    uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: hid.cpp:50
    uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: hid.cpp:54
    uint8_t bmIsConstantOrData
    Definition: hid.h:126
    static const uint8_t epInterruptOutIndex
    Definition: hid.h:150
    - +
    uint8_t bAddress
    Definition: hid.h:146
    uint8_t bmIsArrayOrVariable
    Definition: hid.h:127
    @@ -297,8 +299,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Definition: hid.h:143
    HID(USB *pusb)
    Definition: hid.h:163
    uint8_t bmIsNullOrNoNull
    Definition: hid.h:132
    - -
    virtual bool SetReportParser(uint8_t id, HIDReportParser *prs)
    + +
    virtual bool SetReportParser(uint8_t id, HIDReportParser *prs)
    Definition: hid.h:170
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
    void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)
    Definition: hid.cpp:90
    @@ -310,7 +312,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Definition: UsbCore.h:190
    +
    Definition: UsbCore.h:197
    uint8_t bmIsNoPreferedOrPrefered
    Definition: hid.h:131
    static const uint8_t totalEndpoints
    Definition: hid.h:154
    uint8_t bmIsRelativeOrAbsolute
    Definition: hid.h:128
    @@ -322,7 +324,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidboot_8cpp.html b/hidboot_8cpp.html index a84d1af3..c0cc8828 100644 --- a/hidboot_8cpp.html +++ b/hidboot_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidboot.cpp File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for hidboot.cpp:
    diff --git a/hidboot_8cpp__incl.md5 b/hidboot_8cpp__incl.md5 index 4a84fd5f..3178c9e8 100644 --- a/hidboot_8cpp__incl.md5 +++ b/hidboot_8cpp__incl.md5 @@ -1 +1 @@ -0c189f333bf0da28d707e488d907562e \ No newline at end of file +3f878238886edaa1e92d4597e28ac4a8 \ No newline at end of file diff --git a/hidboot_8cpp_source.html b/hidboot_8cpp_source.html index 4a266a37..efdd6f85 100644 --- a/hidboot_8cpp_source.html +++ b/hidboot_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidboot.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -220,115 +221,91 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    129  if (buf[2] == 1)
    130  return;
    131 
    -
    132  //KBDINFO *pki = (KBDINFO*)buf;
    +
    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  }
    +
    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)
    +
    144  if (buf[i] == prevState.bInfo[j] && buf[i] != 1)
    145  down = true;
    -
    146  if (buf[j] == prevState.bInfo[i] && prevState.bInfo[i] != 1)
    +
    146  if (buf[j] == prevState.bInfo[i] && prevState.bInfo[i] != 1)
    147  up = true;
    148  }
    149  if (!down) {
    -
    150  HandleLockingKeys(hid, buf[i]);
    +
    150  HandleLockingKeys(hid, buf[i]);
    151  OnKeyDown(*buf, buf[i]);
    152  }
    153  if (!up)
    -
    154  OnKeyUp(prevState.bInfo[0], prevState.bInfo[i]);
    +
    154  OnKeyUp(prevState.bInfo[0], prevState.bInfo[i]);
    155  }
    156  for (uint8_t i = 0; i < 8; i++)
    -
    157  prevState.bInfo[i] = buf[i];
    +
    157  prevState.bInfo[i] = buf[i];
    158 };
    159 
    -
    160 uint8_t KeyboardReportParser::HandleLockingKeys(HID *hid, uint8_t key) {
    -
    161  uint8_t old_keys = kbdLockingKeys.bLeds;
    -
    162 
    -
    163  switch (key) {
    - -
    165  kbdLockingKeys.kbdLeds.bmNumLock = ~kbdLockingKeys.kbdLeds.bmNumLock;
    -
    166  break;
    - -
    168  kbdLockingKeys.kbdLeds.bmCapsLock = ~kbdLockingKeys.kbdLeds.bmCapsLock;
    -
    169  break;
    - -
    171  kbdLockingKeys.kbdLeds.bmScrollLock = ~kbdLockingKeys.kbdLeds.bmScrollLock;
    -
    172  break;
    -
    173  }
    +
    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  if (old_keys != kbdLockingKeys.bLeds && hid)
    -
    176  return (hid->SetReport(0, 0/*hid->GetIface()*/, 2, 0, 1, &kbdLockingKeys.bLeds));
    -
    177 
    -
    178  return 0;
    -
    179 }
    -
    180 
    -
    181 const uint8_t KeyboardReportParser::numKeys[10] PROGMEM = {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')'};
    -
    182 const uint8_t KeyboardReportParser::symKeysUp[12] PROGMEM = {'_', '+', '{', '}', '|', '~', ':', '"', '~', '<', '>', '?'};
    -
    183 const uint8_t KeyboardReportParser::symKeysLo[12] PROGMEM = {'-', '=', '[', ']', '\\', ' ', ';', '\'', '`', ',', '.', '/'};
    -
    184 const uint8_t KeyboardReportParser::padKeys[5] PROGMEM = {'/', '*', '-', '+', 0x13};
    -
    185 
    -
    186 uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key) {
    -
    187  uint8_t shift = (mod & 0x22);
    -
    188 
    -
    189  // [a-z]
    -
    190  if (VALUE_WITHIN(key, 0x04, 0x1d)) {
    -
    191  // Upper case letters
    -
    192  if ((kbdLockingKeys.kbdLeds.bmCapsLock == 0 && (mod & 2)) ||
    -
    193  (kbdLockingKeys.kbdLeds.bmCapsLock == 1 && (mod & 2) == 0))
    -
    194  return (key - 4 + 'A');
    -
    195 
    -
    196  // Lower case letters
    -
    197  else
    -
    198  return (key - 4 + 'a');
    -
    199  }// Numbers
    -
    200  else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
    -
    201  if (shift)
    -
    202  return ((uint8_t)pgm_read_byte(&getNumKeys()[key - 0x1e]));
    -
    203  else
    -
    204  return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');
    -
    205  }// Keypad Numbers
    -
    206  else if(VALUE_WITHIN(key, 0x59, 0x61)) {
    -
    207  if(kbdLockingKeys.kbdLeds.bmNumLock == 1)
    -
    208  return (key - 0x59 + '1');
    -
    209  } else if(VALUE_WITHIN(key, 0x2d, 0x38))
    -
    210  return ((shift) ? (uint8_t)pgm_read_byte(&getSymKeysUp()[key - 0x2d]) : (uint8_t)pgm_read_byte(&getSymKeysLo()[key - 0x2d]));
    -
    211  else if(VALUE_WITHIN(key, 0x54, 0x58))
    -
    212  return (uint8_t)pgm_read_byte(&getPadKeys()[key - 0x54]);
    -
    213  else {
    -
    214  switch(key) {
    -
    215  case UHS_HID_BOOT_KEY_SPACE: return (0x20);
    -
    216  case UHS_HID_BOOT_KEY_ENTER: return (0x13);
    -
    217  case UHS_HID_BOOT_KEY_ZERO2: return ((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '0': 0);
    -
    218  case UHS_HID_BOOT_KEY_PERIOD: return ((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '.': 0);
    -
    219  }
    -
    220  }
    -
    221  return ( 0);
    -
    222 }
    +
    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 }
    #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:169
    +
    virtual const uint8_t * getSymKeysLo()
    Definition: hidboot.h:189
    virtual void OnRightButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:75
    -
    virtual void OnKeyDown(uint8_t mod, uint8_t key)
    Definition: hidboot.h:155
    -
    uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: hid.cpp:50
    +
    virtual void OnKeyDown(uint8_t mod, uint8_t key)
    Definition: hidboot.h:175
    +
    virtual uint8_t HandleLockingKeys(HID *hid, uint8_t key)
    Definition: hidboot.h:151
    virtual void OnMiddleButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:78
    -
    virtual uint8_t HandleLockingKeys(HID *hid, uint8_t key)
    Definition: hidboot.cpp:160
    -
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:19
    +
    void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:19
    #define UHS_HID_BOOT_KEY_ZERO2
    Definition: hidboot.h:28
    -
    #define UHS_HID_BOOT_KEY_SCROLL_LOCK
    Definition: hidboot.h:26
    -
    union KeyboardReportParser::@14 kbdLockingKeys
    -
    union KeyboardReportParser::@13 prevState
    +
    #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:158
    -
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:127
    -
    virtual const uint8_t * getSymKeysUp()
    Definition: hidboot.h:165
    +
    virtual void OnKeyUp(uint8_t mod, uint8_t key)
    Definition: hidboot.h:178
    +
    void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:127
    +
    virtual const uint8_t * getSymKeysUp()
    Definition: hidboot.h:185
    uint8_t bmMiddleButton
    Definition: hidboot.h:44
    virtual void OnLeftButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:66
    #define UHS_HID_BOOT_KEY_SPACE
    Definition: hidboot.h:24
    @@ -338,23 +315,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    Definition: hid.h:143
    #define VALUE_WITHIN(v, l, h)
    Definition: macros.h:28
    virtual void OnMiddleButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:81
    -
    #define UHS_HID_BOOT_KEY_NUM_LOCK
    Definition: hidboot.h:27
    #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:152
    +
    virtual void OnControlKeysChanged(uint8_t before, uint8_t after)
    Definition: hidboot.h:172
    virtual void OnLeftButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:69
    -
    virtual const uint8_t * getNumKeys()
    Definition: hidboot.h:161
    -
    virtual const uint8_t * getPadKeys()
    Definition: hidboot.h:173
    +
    virtual const uint8_t * getNumKeys()
    Definition: hidboot.h:181
    +
    union KeyboardReportParser::@18 kbdLockingKeys
    +
    virtual const uint8_t * getPadKeys()
    Definition: hidboot.h:193
    int8_t dY
    Definition: hidboot.h:48
    uint8_t bmLeftButton
    Definition: hidboot.h:42
    -
    #define UHS_HID_BOOT_KEY_CAPS_LOCK
    Definition: hidboot.h:25
    -
    uint8_t OemToAscii(uint8_t mod, uint8_t key)
    Definition: hidboot.cpp:186
    +
    uint8_t OemToAscii(uint8_t mod, uint8_t key)
    Definition: hidboot.cpp:165
    diff --git a/hidboot_8h.html b/hidboot_8h.html index 017a0d27..7022e171 100644 --- a/hidboot_8h.html +++ b/hidboot_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidboot.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -324,7 +325,7 @@ Macros diff --git a/hidboot_8h__dep__incl.md5 b/hidboot_8h__dep__incl.md5 index fde1084f..4ec250d7 100644 --- a/hidboot_8h__dep__incl.md5 +++ b/hidboot_8h__dep__incl.md5 @@ -1 +1 @@ -6ab61eb2435ebc69d824293cce425db4 \ No newline at end of file +eb017a1dbabb14c916b6c609ad0b5f09 \ No newline at end of file diff --git a/hidboot_8h__incl.md5 b/hidboot_8h__incl.md5 index 1abb40d3..caa29a41 100644 --- a/hidboot_8h__incl.md5 +++ b/hidboot_8h__incl.md5 @@ -1 +1 @@ -a189a867cd61aacdf2d7e1bed35f13d7 \ No newline at end of file +64945fd12fafd7f11121e63e28020a79 \ No newline at end of file diff --git a/hidboot_8h_source.html b/hidboot_8h_source.html index c630b806..aa8779d6 100644 --- a/hidboot_8h_source.html +++ b/hidboot_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidboot.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -147,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    56  } prevState;
    57 
    58 public:
    -
    59  virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    +
    59  void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    60 
    61 protected:
    62 
    @@ -220,510 +221,544 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    129  union {
    131  uint8_t bInfo[sizeof (KBDINFO)];
    -
    132  } prevState;
    +
    132  } prevState;
    133 
    134  union {
    136  uint8_t bLeds;
    -
    137  } kbdLockingKeys;
    +
    137  } kbdLockingKeys;
    138 
    139  uint8_t OemToAscii(uint8_t mod, uint8_t key);
    140 
    141 public:
    142 
    -
    144  kbdLockingKeys.bLeds = 0;
    +
    144  kbdLockingKeys.bLeds = 0;
    145  };
    146 
    -
    147  virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    +
    147  void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    148 
    149 protected:
    -
    150  virtual uint8_t HandleLockingKeys(HID* hid, uint8_t key);
    -
    151 
    -
    152  virtual void OnControlKeysChanged(uint8_t before, uint8_t after) {
    -
    153  };
    -
    154 
    -
    155  virtual void OnKeyDown(uint8_t mod, uint8_t key) {
    -
    156  };
    -
    157 
    -
    158  virtual void OnKeyUp(uint8_t mod, uint8_t key) {
    -
    159  };
    -
    160 
    -
    161  virtual const uint8_t *getNumKeys() {
    -
    162  return numKeys;
    -
    163  };
    -
    164 
    -
    165  virtual const uint8_t *getSymKeysUp() {
    -
    166  return symKeysUp;
    -
    167  };
    +
    150 
    +
    151  virtual uint8_t HandleLockingKeys(HID* 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  return (hid->SetReport(0, 0/*hid->GetIface()*/, 2, 0, 1, &kbdLockingKeys.bLeds));
    168 
    -
    169  virtual const uint8_t *getSymKeysLo() {
    -
    170  return symKeysLo;
    -
    171  };
    -
    172 
    -
    173  virtual const uint8_t *getPadKeys() {
    -
    174  return padKeys;
    -
    175  };
    -
    176 };
    +
    169  return 0;
    +
    170  };
    +
    171 
    +
    172  virtual void OnControlKeysChanged(uint8_t before, uint8_t after) {
    +
    173  };
    +
    174 
    +
    175  virtual void OnKeyDown(uint8_t mod, uint8_t key) {
    +
    176  };
    177 
    -
    178 template <const uint8_t BOOT_PROTOCOL>
    -
    179 class HIDBoot : public HID //public USBDeviceConfig, public UsbConfigXtracter
    -
    180 {
    -
    181  EpInfo epInfo[totalEndpoints(BOOT_PROTOCOL)];
    -
    182  HIDReportParser *pRptParser[epMUL(BOOT_PROTOCOL)];
    -
    183 
    -
    184  uint8_t bConfNum; // configuration number
    -
    185  uint8_t bIfaceNum; // Interface Number
    -
    186  uint8_t bNumIface; // number of interfaces in the configuration
    -
    187  uint8_t bNumEP; // total number of EP in the configuration
    -
    188  uint32_t qNextPollTime; // next poll time
    -
    189  bool bPollEnable; // poll enable flag
    -
    190  uint8_t bInterval; // largest interval
    -
    191 
    -
    192  void Initialize();
    -
    193 
    -
    194  virtual HIDReportParser* GetReportParser(uint8_t id) {
    -
    195  return pRptParser[id];
    -
    196  };
    +
    178  virtual void OnKeyUp(uint8_t mod, uint8_t key) {
    +
    179  };
    +
    180 
    +
    181  virtual const uint8_t *getNumKeys() {
    +
    182  return numKeys;
    +
    183  };
    +
    184 
    +
    185  virtual const uint8_t *getSymKeysUp() {
    +
    186  return symKeysUp;
    +
    187  };
    +
    188 
    +
    189  virtual const uint8_t *getSymKeysLo() {
    +
    190  return symKeysLo;
    +
    191  };
    +
    192 
    +
    193  virtual const uint8_t *getPadKeys() {
    +
    194  return padKeys;
    +
    195  };
    +
    196 };
    197 
    -
    198 public:
    -
    199  HIDBoot(USB *p);
    -
    200 
    -
    201  virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {
    -
    202  pRptParser[id] = prs;
    -
    203  return true;
    -
    204  };
    -
    205 
    -
    206  // USBDeviceConfig implementation
    -
    207  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    208  virtual uint8_t Release();
    -
    209  virtual uint8_t Poll();
    -
    210 
    -
    211  virtual uint8_t GetAddress() {
    -
    212  return bAddress;
    -
    213  };
    -
    214 
    -
    215  // UsbConfigXtracter implementation
    -
    216  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    217 };
    -
    218 
    -
    219 template <const uint8_t BOOT_PROTOCOL>
    - -
    221 HID(p),
    -
    222 qNextPollTime(0),
    -
    223 bPollEnable(false) {
    -
    224  Initialize();
    +
    198 template <const uint8_t BOOT_PROTOCOL>
    +
    199 class HIDBoot : public HID //public USBDeviceConfig, public UsbConfigXtracter
    +
    200 {
    +
    201  EpInfo epInfo[totalEndpoints(BOOT_PROTOCOL)];
    +
    202  HIDReportParser *pRptParser[epMUL(BOOT_PROTOCOL)];
    +
    203 
    +
    204  uint8_t bConfNum; // configuration number
    +
    205  uint8_t bIfaceNum; // Interface Number
    +
    206  uint8_t bNumIface; // number of interfaces in the configuration
    +
    207  uint8_t bNumEP; // total number of EP in the configuration
    +
    208  uint32_t qNextPollTime; // next poll time
    +
    209  bool bPollEnable; // poll enable flag
    +
    210  uint8_t bInterval; // largest interval
    +
    211 
    +
    212  void Initialize();
    +
    213 
    +
    214  virtual HIDReportParser* GetReportParser(uint8_t id) {
    +
    215  return pRptParser[id];
    +
    216  };
    +
    217 
    +
    218 public:
    +
    219  HIDBoot(USB *p);
    +
    220 
    +
    221  virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {
    +
    222  pRptParser[id] = prs;
    +
    223  return true;
    +
    224  };
    225 
    -
    226  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    -
    227  pRptParser[i] = NULL;
    -
    228  }
    -
    229  if(pUsb)
    -
    230  pUsb->RegisterDeviceClass(this);
    -
    231 }
    -
    232 
    -
    233 template <const uint8_t BOOT_PROTOCOL>
    - -
    235  for(int i = 0; i < totalEndpoints(BOOT_PROTOCOL); i++) {
    -
    236  epInfo[i].epAddr = 0;
    -
    237  epInfo[i].maxPktSize = (i) ? 0 : 8;
    -
    238  epInfo[i].epAttribs = 0;
    -
    239  epInfo[i].bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
    -
    240  }
    -
    241  bNumEP = 1;
    -
    242  bNumIface = 0;
    -
    243  bConfNum = 0;
    -
    244 }
    -
    245 
    -
    246 template <const uint8_t BOOT_PROTOCOL>
    -
    247 uint8_t HIDBoot<BOOT_PROTOCOL>::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    -
    248  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    -
    249 
    -
    250  uint8_t buf[constBufSize];
    -
    251  uint8_t rcode;
    -
    252  UsbDevice *p = NULL;
    -
    253  EpInfo *oldep_ptr = NULL;
    -
    254  uint8_t len = 0;
    -
    255  //uint16_t cd_len = 0;
    -
    256 
    -
    257  uint8_t num_of_conf; // number of configurations
    -
    258  //uint8_t num_of_intf; // number of interfaces
    -
    259 
    -
    260  AddressPool &addrPool = pUsb->GetAddressPool();
    -
    261 
    -
    262  USBTRACE("BM Init\r\n");
    -
    263  //USBTRACE2("totalEndpoints:", (uint8_t) (totalEndpoints(BOOT_PROTOCOL)));
    -
    264  //USBTRACE2("epMUL:", epMUL(BOOT_PROTOCOL));
    +
    226  // USBDeviceConfig implementation
    +
    227  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    +
    228  uint8_t Release();
    +
    229  uint8_t Poll();
    +
    230 
    +
    231  virtual uint8_t GetAddress() {
    +
    232  return bAddress;
    +
    233  };
    +
    234 
    +
    235  virtual bool isReady() {
    +
    236  return bPollEnable;
    +
    237  };
    +
    238 
    +
    239  // UsbConfigXtracter implementation
    +
    240  // Method should be defined here if virtual.
    +
    241  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    +
    242 
    +
    243  virtual bool DEVCLASSOK(uint8_t klass) {
    +
    244  return (klass == USB_CLASS_HID);
    +
    245  }
    +
    246 
    +
    247  virtual bool DEVSUBCLASSOK(uint8_t subklass) {
    +
    248  return (subklass == BOOT_PROTOCOL);
    +
    249  }
    +
    250 };
    +
    251 
    +
    252 template <const uint8_t BOOT_PROTOCOL>
    + +
    254 HID(p),
    +
    255 qNextPollTime(0),
    +
    256 bPollEnable(false) {
    +
    257  Initialize();
    +
    258 
    +
    259  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    +
    260  pRptParser[i] = NULL;
    +
    261  }
    +
    262  if(pUsb)
    +
    263  pUsb->RegisterDeviceClass(this);
    +
    264 }
    265 
    -
    266  if(bAddress)
    - -
    268 
    -
    269  bInterval = 0;
    -
    270  // Get pointer to pseudo device with address 0 assigned
    -
    271  p = addrPool.GetUsbDevicePtr(0);
    -
    272 
    -
    273  if(!p)
    - -
    275 
    -
    276  if(!p->epinfo) {
    -
    277  USBTRACE("epinfo\r\n");
    - -
    279  }
    -
    280 
    -
    281  // Save old pointer to EP_RECORD of address 0
    -
    282  oldep_ptr = p->epinfo;
    -
    283 
    -
    284  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    -
    285  p->epinfo = epInfo;
    -
    286 
    -
    287  p->lowspeed = lowspeed;
    -
    288 
    -
    289  // Get device descriptor
    -
    290  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    -
    291 
    -
    292  if(!rcode)
    -
    293  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    +
    266 template <const uint8_t BOOT_PROTOCOL>
    + +
    268  for(int i = 0; i < totalEndpoints(BOOT_PROTOCOL); i++) {
    +
    269  epInfo[i].epAddr = 0;
    +
    270  epInfo[i].maxPktSize = (i) ? 0 : 8;
    +
    271  epInfo[i].epAttribs = 0;
    +
    272  epInfo[i].bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
    +
    273  }
    +
    274  bNumEP = 1;
    +
    275  bNumIface = 0;
    +
    276  bConfNum = 0;
    +
    277 }
    +
    278 
    +
    279 template <const uint8_t BOOT_PROTOCOL>
    +
    280 uint8_t HIDBoot<BOOT_PROTOCOL>::Init(uint8_t parent, uint8_t port, bool lowspeed) {
    +
    281  const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR);
    +
    282 
    +
    283  uint8_t buf[constBufSize];
    +
    284  uint8_t rcode;
    +
    285  UsbDevice *p = NULL;
    +
    286  EpInfo *oldep_ptr = NULL;
    +
    287  uint8_t len = 0;
    +
    288  //uint16_t cd_len = 0;
    +
    289 
    +
    290  uint8_t num_of_conf; // number of configurations
    +
    291  //uint8_t num_of_intf; // number of interfaces
    +
    292 
    +
    293  AddressPool &addrPool = pUsb->GetAddressPool();
    294 
    -
    295  if(rcode) {
    -
    296  // Restore p->epinfo
    -
    297  p->epinfo = oldep_ptr;
    +
    295  USBTRACE("BM Init\r\n");
    +
    296  //USBTRACE2("totalEndpoints:", (uint8_t) (totalEndpoints(BOOT_PROTOCOL)));
    +
    297  //USBTRACE2("epMUL:", epMUL(BOOT_PROTOCOL));
    298 
    -
    299  goto FailGetDevDescr;
    -
    300  }
    +
    299  if(bAddress)
    +
    301 
    -
    302  // Restore p->epinfo
    -
    303  p->epinfo = oldep_ptr;
    -
    304 
    -
    305  // Allocate new address according to device class
    -
    306  bAddress = addrPool.AllocAddress(parent, false, port);
    -
    307 
    -
    308  if(!bAddress)
    - -
    310 
    -
    311  // Extract Max Packet Size from the device descriptor
    -
    312  epInfo[0].maxPktSize = (uint8_t)((USB_DEVICE_DESCRIPTOR*)buf)->bMaxPacketSize0;
    +
    302  bInterval = 0;
    +
    303  // Get pointer to pseudo device with address 0 assigned
    +
    304  p = addrPool.GetUsbDevicePtr(0);
    +
    305 
    +
    306  if(!p)
    + +
    308 
    +
    309  if(!p->epinfo) {
    +
    310  USBTRACE("epinfo\r\n");
    + +
    312  }
    313 
    -
    314  // Assign new address to the device
    -
    315  rcode = pUsb->setAddr(0, 0, bAddress);
    +
    314  // Save old pointer to EP_RECORD of address 0
    +
    315  oldep_ptr = p->epinfo;
    316 
    -
    317  if(rcode) {
    -
    318  p->lowspeed = false;
    -
    319  addrPool.FreeAddress(bAddress);
    -
    320  bAddress = 0;
    -
    321  USBTRACE2("setAddr:", rcode);
    -
    322  return rcode;
    -
    323  }
    -
    324  //delay(2); //per USB 2.0 sect.9.2.6.3
    -
    325 
    -
    326  USBTRACE2("Addr:", bAddress);
    +
    317  // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
    +
    318  p->epinfo = epInfo;
    +
    319 
    +
    320  p->lowspeed = lowspeed;
    +
    321 
    +
    322  // Get device descriptor
    +
    323  rcode = pUsb->getDevDescr(0, 0, 8, (uint8_t*)buf);
    +
    324 
    +
    325  if(!rcode)
    +
    326  len = (buf[0] > constBufSize) ? constBufSize : buf[0];
    327 
    -
    328  p->lowspeed = false;
    -
    329 
    -
    330  p = addrPool.GetUsbDevicePtr(bAddress);
    +
    328  if(rcode) {
    +
    329  // Restore p->epinfo
    +
    330  p->epinfo = oldep_ptr;
    331 
    -
    332  if(!p)
    - +
    332  goto FailGetDevDescr;
    +
    333  }
    334 
    -
    335  p->lowspeed = lowspeed;
    -
    336 
    -
    337  if(len)
    -
    338  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    -
    339 
    -
    340  if(rcode)
    -
    341  goto FailGetDevDescr;
    -
    342 
    -
    343  num_of_conf = ((USB_DEVICE_DESCRIPTOR*)buf)->bNumConfigurations;
    -
    344 
    -
    345  USBTRACE2("NC:", num_of_conf);
    +
    335  // Restore p->epinfo
    +
    336  p->epinfo = oldep_ptr;
    +
    337 
    +
    338  // Allocate new address according to device class
    +
    339  bAddress = addrPool.AllocAddress(parent, false, port);
    +
    340 
    +
    341  if(!bAddress)
    + +
    343 
    +
    344  // Extract Max Packet Size from the device descriptor
    +
    345  epInfo[0].maxPktSize = (uint8_t)((USB_DEVICE_DESCRIPTOR*)buf)->bMaxPacketSize0;
    346 
    -
    347  // GCC will optimize unused stuff away.
    - -
    349  USBTRACE("HID_PROTOCOL_KEYBOARD AND MOUSE\r\n");
    - - - - -
    354  CP_MASK_COMPARE_ALL > confDescrParser(this);
    -
    355  confDescrParser.SetOR(); // Use the OR variant.
    -
    356  for(uint8_t i = 0; i < num_of_conf; i++) {
    -
    357  pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    -
    358  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    -
    359  break;
    -
    360  }
    -
    361  } else {
    -
    362  // GCC will optimize unused stuff away.
    -
    363  if(BOOT_PROTOCOL & HID_PROTOCOL_KEYBOARD) {
    -
    364  USBTRACE("HID_PROTOCOL_KEYBOARD\r\n");
    -
    365  for(uint8_t i = 0; i < num_of_conf; i++) {
    - - - - -
    370  CP_MASK_COMPARE_ALL> confDescrParserA(this);
    -
    371 
    -
    372  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserA);
    -
    373  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    -
    374  break;
    -
    375  }
    -
    376  }
    +
    347  // Assign new address to the device
    +
    348  rcode = pUsb->setAddr(0, 0, bAddress);
    +
    349 
    +
    350  if(rcode) {
    +
    351  p->lowspeed = false;
    +
    352  addrPool.FreeAddress(bAddress);
    +
    353  bAddress = 0;
    +
    354  USBTRACE2("setAddr:", rcode);
    +
    355  return rcode;
    +
    356  }
    +
    357  //delay(2); //per USB 2.0 sect.9.2.6.3
    +
    358 
    +
    359  USBTRACE2("Addr:", bAddress);
    +
    360 
    +
    361  p->lowspeed = false;
    +
    362 
    +
    363  p = addrPool.GetUsbDevicePtr(bAddress);
    +
    364 
    +
    365  if(!p)
    + +
    367 
    +
    368  p->lowspeed = lowspeed;
    +
    369 
    +
    370  if(len)
    +
    371  rcode = pUsb->getDevDescr(bAddress, 0, len, (uint8_t*)buf);
    +
    372 
    +
    373  if(rcode)
    +
    374  goto FailGetDevDescr;
    +
    375 
    +
    376  num_of_conf = ((USB_DEVICE_DESCRIPTOR*)buf)->bNumConfigurations;
    377 
    -
    378  // GCC will optimize unused stuff away.
    -
    379  if(BOOT_PROTOCOL & HID_PROTOCOL_MOUSE) {
    -
    380  USBTRACE("HID_PROTOCOL_MOUSE\r\n");
    -
    381  for(uint8_t i = 0; i < num_of_conf; i++) {
    - - - - -
    386  CP_MASK_COMPARE_ALL> confDescrParserB(this);
    -
    387 
    -
    388  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserB);
    -
    389  if(bNumEP == ((uint8_t)(totalEndpoints(BOOT_PROTOCOL))))
    -
    390  break;
    -
    391 
    -
    392  }
    +
    378  USBTRACE2("NC:", num_of_conf);
    +
    379 
    +
    380  // GCC will optimize unused stuff away.
    + +
    382  USBTRACE("HID_PROTOCOL_KEYBOARD AND MOUSE\r\n");
    + + + + +
    387  CP_MASK_COMPARE_ALL > confDescrParser(this);
    +
    388  confDescrParser.SetOR(); // Use the OR variant.
    +
    389  for(uint8_t i = 0; i < num_of_conf; i++) {
    +
    390  pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
    +
    391  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    +
    392  break;
    393  }
    -
    394  }
    -
    395  USBTRACE2("bNumEP:", bNumEP);
    -
    396 
    -
    397  if(bNumEP != (uint8_t)(totalEndpoints(BOOT_PROTOCOL))) {
    - -
    399  goto Fail;
    -
    400  }
    -
    401 
    -
    402  // Assign epInfo to epinfo pointer
    -
    403  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    -
    404  //USBTRACE2("setEpInfoEntry returned ", rcode);
    -
    405  USBTRACE2("Cnf:", bConfNum);
    -
    406 
    -
    407  delay(1000);
    -
    408 
    -
    409  // Set Configuration Value
    -
    410  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    -
    411 
    -
    412  if(rcode)
    -
    413  goto FailSetConfDescr;
    -
    414 
    -
    415  delay(1000);
    -
    416 
    -
    417  USBTRACE2("bIfaceNum:", bIfaceNum);
    -
    418  USBTRACE2("bNumIface:", bNumIface);
    -
    419 
    -
    420  // Yes, mouse wants SetProtocol and SetIdle too!
    -
    421  for(uint8_t i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    -
    422  USBTRACE2("\r\nInterface:", i);
    -
    423  rcode = SetProtocol(i, HID_BOOT_PROTOCOL);
    -
    424  if(rcode) goto FailSetProtocol;
    -
    425  USBTRACE2("PROTOCOL SET HID_BOOT rcode:", rcode);
    -
    426  rcode = SetIdle(i, 0, 0);
    -
    427  USBTRACE2("SET_IDLE rcode:", rcode);
    -
    428  // if(rcode) goto FailSetIdle; This can fail.
    -
    429  // Get the RPIPE and just throw it away.
    - -
    431  rcode = GetReportDescr(i, &sink);
    -
    432  USBTRACE2("RPIPE rcode:", rcode);
    +
    394  } else {
    +
    395  // GCC will optimize unused stuff away.
    +
    396  if(BOOT_PROTOCOL & HID_PROTOCOL_KEYBOARD) {
    +
    397  USBTRACE("HID_PROTOCOL_KEYBOARD\r\n");
    +
    398  for(uint8_t i = 0; i < num_of_conf; i++) {
    + + + + +
    403  CP_MASK_COMPARE_ALL> confDescrParserA(this);
    +
    404 
    +
    405  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserA);
    +
    406  if(bNumEP == (uint8_t)(totalEndpoints(BOOT_PROTOCOL)))
    +
    407  break;
    +
    408  }
    +
    409  }
    +
    410 
    +
    411  // GCC will optimize unused stuff away.
    +
    412  if(BOOT_PROTOCOL & HID_PROTOCOL_MOUSE) {
    +
    413  USBTRACE("HID_PROTOCOL_MOUSE\r\n");
    +
    414  for(uint8_t i = 0; i < num_of_conf; i++) {
    + + + + +
    419  CP_MASK_COMPARE_ALL> confDescrParserB(this);
    +
    420 
    +
    421  pUsb->getConfDescr(bAddress, 0, i, &confDescrParserB);
    +
    422  if(bNumEP == ((uint8_t)(totalEndpoints(BOOT_PROTOCOL))))
    +
    423  break;
    +
    424 
    +
    425  }
    +
    426  }
    +
    427  }
    +
    428  USBTRACE2("bNumEP:", bNumEP);
    +
    429 
    +
    430  if(bNumEP != (uint8_t)(totalEndpoints(BOOT_PROTOCOL))) {
    + +
    432  goto Fail;
    433  }
    434 
    -
    435  // Get RPIPE and throw it away.
    -
    436 
    -
    437  if(BOOT_PROTOCOL & HID_PROTOCOL_KEYBOARD) {
    -
    438  // Wake keyboard interface by twinkling up to 5 LEDs that are in the spec.
    -
    439  // kana, compose, scroll, caps, num
    -
    440  rcode = 0x20; // Reuse rcode.
    -
    441  while(rcode) {
    -
    442  rcode >>= 1;
    -
    443  // Ignore any error returned, we don't care if LED is not supported
    -
    444  SetReport(0, 0, 2, 0, 1, &rcode); // Eventually becomes zero (All off)
    -
    445  delay(25);
    -
    446  }
    -
    447  }
    -
    448  USBTRACE("BM configured\r\n");
    +
    435  // Assign epInfo to epinfo pointer
    +
    436  rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
    +
    437  //USBTRACE2("setEpInfoEntry returned ", rcode);
    +
    438  USBTRACE2("Cnf:", bConfNum);
    +
    439 
    +
    440  delay(1000);
    +
    441 
    +
    442  // Set Configuration Value
    +
    443  rcode = pUsb->setConf(bAddress, 0, bConfNum);
    +
    444 
    +
    445  if(rcode)
    +
    446  goto FailSetConfDescr;
    +
    447 
    +
    448  delay(1000);
    449 
    -
    450  bPollEnable = true;
    -
    451  return 0;
    +
    450  USBTRACE2("bIfaceNum:", bIfaceNum);
    +
    451  USBTRACE2("bNumIface:", bNumIface);
    452 
    -
    453 FailGetDevDescr:
    -
    454 #ifdef DEBUG_USB_HOST
    - -
    456  goto Fail;
    -
    457 #endif
    -
    458 
    -
    459  //FailSetDevTblEntry:
    -
    460  //#ifdef DEBUG_USB_HOST
    -
    461  // NotifyFailSetDevTblEntry();
    -
    462  // goto Fail;
    -
    463  //#endif
    -
    464 
    -
    465  //FailGetConfDescr:
    -
    466  //#ifdef DEBUG_USB_HOST
    -
    467  // NotifyFailGetConfDescr();
    -
    468  // goto Fail;
    -
    469  //#endif
    -
    470 
    -
    471 FailSetConfDescr:
    -
    472 #ifdef DEBUG_USB_HOST
    - -
    474  goto Fail;
    -
    475 #endif
    -
    476 
    -
    477 FailSetProtocol:
    -
    478 #ifdef DEBUG_USB_HOST
    -
    479  USBTRACE("SetProto:");
    -
    480  goto Fail;
    -
    481 #endif
    +
    453  // Yes, mouse wants SetProtocol and SetIdle too!
    +
    454  for(uint8_t i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    +
    455  USBTRACE2("\r\nInterface:", i);
    +
    456  rcode = SetProtocol(i, HID_BOOT_PROTOCOL);
    +
    457  if(rcode) goto FailSetProtocol;
    +
    458  USBTRACE2("PROTOCOL SET HID_BOOT rcode:", rcode);
    +
    459  rcode = SetIdle(i, 0, 0);
    +
    460  USBTRACE2("SET_IDLE rcode:", rcode);
    +
    461  // if(rcode) goto FailSetIdle; This can fail.
    +
    462  // Get the RPIPE and just throw it away.
    + +
    464  rcode = GetReportDescr(i, &sink);
    +
    465  USBTRACE2("RPIPE rcode:", rcode);
    +
    466  }
    +
    467 
    +
    468  // Get RPIPE and throw it away.
    +
    469 
    +
    470  if(BOOT_PROTOCOL & HID_PROTOCOL_KEYBOARD) {
    +
    471  // Wake keyboard interface by twinkling up to 5 LEDs that are in the spec.
    +
    472  // kana, compose, scroll, caps, num
    +
    473  rcode = 0x20; // Reuse rcode.
    +
    474  while(rcode) {
    +
    475  rcode >>= 1;
    +
    476  // Ignore any error returned, we don't care if LED is not supported
    +
    477  SetReport(0, 0, 2, 0, 1, &rcode); // Eventually becomes zero (All off)
    +
    478  delay(25);
    +
    479  }
    +
    480  }
    +
    481  USBTRACE("BM configured\r\n");
    482 
    -
    483  //FailSetIdle:
    -
    484  //#ifdef DEBUG_USB_HOST
    -
    485  // USBTRACE("SetIdle:");
    -
    486  //#endif
    -
    487 
    -
    488 Fail:
    -
    489 #ifdef DEBUG_USB_HOST
    -
    490  NotifyFail(rcode);
    -
    491 #endif
    -
    492  Release();
    -
    493 
    -
    494  return rcode;
    -
    495 }
    -
    496 
    -
    497 template <const uint8_t BOOT_PROTOCOL>
    -
    498 void HIDBoot<BOOT_PROTOCOL>::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    -
    499 
    -
    500  // If the first configuration satisfies, the others are not considered.
    -
    501  //if(bNumEP > 1 && conf != bConfNum)
    -
    502  if(bNumEP == totalEndpoints(BOOT_PROTOCOL))
    -
    503  return;
    -
    504 
    -
    505  bConfNum = conf;
    -
    506  bIfaceNum = iface;
    -
    507 
    -
    508  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80) {
    -
    509  if(pep->bInterval > bInterval) bInterval = pep->bInterval;
    -
    510 
    -
    511  // Fill in the endpoint info structure
    -
    512  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    -
    513  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    -
    514  epInfo[bNumEP].epAttribs = 0;
    -
    515  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    -
    516  bNumEP++;
    -
    517 
    -
    518  }
    -
    519 }
    +
    483  bPollEnable = true;
    +
    484  return 0;
    +
    485 
    +
    486 FailGetDevDescr:
    +
    487 #ifdef DEBUG_USB_HOST
    + +
    489  goto Fail;
    +
    490 #endif
    +
    491 
    +
    492  //FailSetDevTblEntry:
    +
    493  //#ifdef DEBUG_USB_HOST
    +
    494  // NotifyFailSetDevTblEntry();
    +
    495  // goto Fail;
    +
    496  //#endif
    +
    497 
    +
    498  //FailGetConfDescr:
    +
    499  //#ifdef DEBUG_USB_HOST
    +
    500  // NotifyFailGetConfDescr();
    +
    501  // goto Fail;
    +
    502  //#endif
    +
    503 
    +
    504 FailSetConfDescr:
    +
    505 #ifdef DEBUG_USB_HOST
    + +
    507  goto Fail;
    +
    508 #endif
    +
    509 
    +
    510 FailSetProtocol:
    +
    511 #ifdef DEBUG_USB_HOST
    +
    512  USBTRACE("SetProto:");
    +
    513  goto Fail;
    +
    514 #endif
    +
    515 
    +
    516  //FailSetIdle:
    +
    517  //#ifdef DEBUG_USB_HOST
    +
    518  // USBTRACE("SetIdle:");
    +
    519  //#endif
    520 
    -
    521 template <const uint8_t BOOT_PROTOCOL>
    - -
    523  pUsb->GetAddressPool().FreeAddress(bAddress);
    -
    524 
    -
    525  bConfNum = 0;
    -
    526  bIfaceNum = 0;
    -
    527  bNumEP = 1;
    -
    528  bAddress = 0;
    -
    529  qNextPollTime = 0;
    -
    530  bPollEnable = false;
    -
    531 
    -
    532  return 0;
    -
    533 }
    -
    534 
    -
    535 template <const uint8_t BOOT_PROTOCOL>
    - -
    537  uint8_t rcode = 0;
    -
    538 
    -
    539  if(bPollEnable && ((long)(millis() - qNextPollTime) >= 0L)) {
    +
    521 Fail:
    +
    522 #ifdef DEBUG_USB_HOST
    +
    523  NotifyFail(rcode);
    +
    524 #endif
    +
    525  Release();
    +
    526 
    +
    527  return rcode;
    +
    528 }
    +
    529 
    +
    530 template <const uint8_t BOOT_PROTOCOL>
    +
    531 void HIDBoot<BOOT_PROTOCOL>::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep) {
    +
    532 
    +
    533  // If the first configuration satisfies, the others are not considered.
    +
    534  //if(bNumEP > 1 && conf != bConfNum)
    +
    535  if(bNumEP == totalEndpoints(BOOT_PROTOCOL))
    +
    536  return;
    +
    537 
    +
    538  bConfNum = conf;
    +
    539  bIfaceNum = iface;
    540 
    -
    541  // To-do: optimize manually, using the for loop only if needed.
    -
    542  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    -
    543  const uint16_t const_buff_len = 16;
    -
    544  uint8_t buf[const_buff_len];
    -
    545 
    -
    546  USBTRACE3("(hidboot.h) i=", i, 0x81);
    -
    547  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].epAddr=", epInfo[epInterruptInIndex + i].epAddr, 0x81);
    -
    548  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].maxPktSize=", epInfo[epInterruptInIndex + i].maxPktSize, 0x81);
    -
    549  uint16_t read = (uint16_t)epInfo[epInterruptInIndex + i].maxPktSize;
    +
    541  if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80) {
    +
    542  if(pep->bInterval > bInterval) bInterval = pep->bInterval;
    +
    543 
    +
    544  // Fill in the endpoint info structure
    +
    545  epInfo[bNumEP].epAddr = (pep->bEndpointAddress & 0x0F);
    +
    546  epInfo[bNumEP].maxPktSize = (uint8_t)pep->wMaxPacketSize;
    +
    547  epInfo[bNumEP].epAttribs = 0;
    +
    548  epInfo[bNumEP].bmNakPower = USB_NAK_NOWAIT;
    +
    549  bNumEP++;
    550 
    -
    551  rcode = pUsb->inTransfer(bAddress, epInfo[epInterruptInIndex + i].epAddr, &read, buf);
    -
    552  // SOME buggy dongles report extra keys (like sleep) using a 2 byte packet on the wrong endpoint.
    -
    553  // Since keyboard and mice must report at least 3 bytes, we ignore the extra data.
    -
    554  if(!rcode && read > 2) {
    -
    555  if(pRptParser[i])
    -
    556  pRptParser[i]->Parse((HID*)this, 0, (uint8_t)read, buf);
    -
    557 #ifdef DEBUG_USB_HOST
    -
    558  // We really don't care about errors and anomalies unless we are debugging.
    -
    559  } else {
    -
    560  if(rcode != hrNAK) {
    -
    561  USBTRACE3("(hidboot.h) Poll:", rcode, 0x81);
    -
    562  }
    -
    563  if(!rcode && read) {
    -
    564  USBTRACE3("(hidboot.h) Strange read count: ", read, 0x80);
    -
    565  USBTRACE3("(hidboot.h) Interface:", i, 0x80);
    -
    566  }
    -
    567  }
    -
    568 
    -
    569  if(!rcode && read && (UsbDEBUGlvl > 0x7f)) {
    -
    570  for(uint8_t i = 0; i < read; i++) {
    -
    571  PrintHex<uint8_t > (buf[i], 0x80);
    -
    572  USBTRACE1(" ", 0x80);
    -
    573  }
    -
    574  if(read)
    -
    575  USBTRACE1("\r\n", 0x80);
    -
    576 #endif
    -
    577  }
    +
    551  }
    +
    552 }
    +
    553 
    +
    554 template <const uint8_t BOOT_PROTOCOL>
    + +
    556  pUsb->GetAddressPool().FreeAddress(bAddress);
    +
    557 
    +
    558  bConfNum = 0;
    +
    559  bIfaceNum = 0;
    +
    560  bNumEP = 1;
    +
    561  bAddress = 0;
    +
    562  qNextPollTime = 0;
    +
    563  bPollEnable = false;
    +
    564 
    +
    565  return 0;
    +
    566 }
    +
    567 
    +
    568 template <const uint8_t BOOT_PROTOCOL>
    + +
    570  uint8_t rcode = 0;
    +
    571 
    +
    572  if(bPollEnable && ((long)(millis() - qNextPollTime) >= 0L)) {
    +
    573 
    +
    574  // To-do: optimize manually, using the for loop only if needed.
    +
    575  for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
    +
    576  const uint16_t const_buff_len = 16;
    +
    577  uint8_t buf[const_buff_len];
    578 
    -
    579  }
    -
    580  qNextPollTime = millis() + bInterval;
    -
    581  }
    -
    582  return rcode;
    -
    583 }
    -
    584 
    -
    585 #endif // __HIDBOOTMOUSE_H__
    +
    579  USBTRACE3("(hidboot.h) i=", i, 0x81);
    +
    580  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].epAddr=", epInfo[epInterruptInIndex + i].epAddr, 0x81);
    +
    581  USBTRACE3("(hidboot.h) epInfo[epInterruptInIndex + i].maxPktSize=", epInfo[epInterruptInIndex + i].maxPktSize, 0x81);
    +
    582  uint16_t read = (uint16_t)epInfo[epInterruptInIndex + i].maxPktSize;
    +
    583 
    +
    584  rcode = pUsb->inTransfer(bAddress, epInfo[epInterruptInIndex + i].epAddr, &read, buf);
    +
    585  // SOME buggy dongles report extra keys (like sleep) using a 2 byte packet on the wrong endpoint.
    +
    586  // Since keyboard and mice must report at least 3 bytes, we ignore the extra data.
    +
    587  if(!rcode && read > 2) {
    +
    588  if(pRptParser[i])
    +
    589  pRptParser[i]->Parse((HID*)this, 0, (uint8_t)read, buf);
    +
    590 #ifdef DEBUG_USB_HOST
    +
    591  // We really don't care about errors and anomalies unless we are debugging.
    +
    592  } else {
    +
    593  if(rcode != hrNAK) {
    +
    594  USBTRACE3("(hidboot.h) Poll:", rcode, 0x81);
    +
    595  }
    +
    596  if(!rcode && read) {
    +
    597  USBTRACE3("(hidboot.h) Strange read count: ", read, 0x80);
    +
    598  USBTRACE3("(hidboot.h) Interface:", i, 0x80);
    +
    599  }
    +
    600  }
    +
    601 
    +
    602  if(!rcode && read && (UsbDEBUGlvl > 0x7f)) {
    +
    603  for(uint8_t i = 0; i < read; i++) {
    +
    604  PrintHex<uint8_t > (buf[i], 0x80);
    +
    605  USBTRACE1(" ", 0x80);
    +
    606  }
    +
    607  if(read)
    +
    608  USBTRACE1("\r\n", 0x80);
    +
    609 #endif
    +
    610  }
    +
    611 
    +
    612  }
    +
    613  qNextPollTime = millis() + bInterval;
    +
    614  }
    +
    615  return rcode;
    +
    616 }
    +
    617 
    +
    618 #endif // __HIDBOOTMOUSE_H__
    -
    #define CP_MASK_COMPARE_ALL
    +
    #define CP_MASK_COMPARE_ALL
    uint8_t bmLeftShift
    Definition: hidboot.h:87
    EpInfo * epinfo
    Definition: address.h:76
    uint8_t bmKana
    Definition: hidboot.h:117
    uint8_t bmRightButton
    Definition: hidboot.h:43
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:81
    -
    virtual const uint8_t * getSymKeysLo()
    Definition: hidboot.h:169
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +
    virtual const uint8_t * getSymKeysLo()
    Definition: hidboot.h:189
    virtual void OnRightButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:75
    -
    virtual void OnKeyDown(uint8_t mod, uint8_t key)
    Definition: hidboot.h:155
    -
    virtual uint8_t Poll()
    Definition: hidboot.h:536
    +
    virtual void OnKeyDown(uint8_t mod, uint8_t key)
    Definition: hidboot.h:175
    +
    uint8_t Poll()
    Definition: hidboot.h:569
    uint8_t bmLeftCtrl
    Definition: hidboot.h:99
    +
    uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
    Definition: hid.cpp:50
    +
    virtual uint8_t HandleLockingKeys(HID *hid, uint8_t key)
    Definition: hidboot.h:151
    uint8_t bmRightShift
    Definition: hidboot.h:104
    #define NotifyFail(...)
    Definition: message.h:55
    virtual void OnMiddleButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:78
    -
    virtual uint8_t HandleLockingKeys(HID *hid, uint8_t key)
    Definition: hidboot.cpp:160
    MOUSEINFO mouseInfo
    Definition: hidboot.h:54
    - -
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:19
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: hidboot.h:498
    + +
    void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:19
    +
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    Definition: hidboot.h:531
    +
    virtual bool DEVCLASSOK(uint8_t klass)
    Definition: hidboot.h:243
    uint8_t bmCapsLock
    Definition: hidboot.h:114
    uint8_t bmNumLock
    Definition: hidboot.h:113
    -
    union KeyboardReportParser::@14 kbdLockingKeys
    +
    #define UHS_HID_BOOT_KEY_SCROLL_LOCK
    Definition: hidboot.h:26
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    uint8_t bAddress
    Definition: hid.h:146
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: hidboot.h:247
    -
    union KeyboardReportParser::@13 prevState
    -
    virtual bool SetReportParser(uint8_t id, HIDReportParser *prs)
    Definition: hidboot.h:201
    -
    virtual void OnKeyUp(uint8_t mod, uint8_t key)
    Definition: hidboot.h:158
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: hidboot.h:280
    +
    virtual bool SetReportParser(uint8_t id, HIDReportParser *prs)
    Definition: hidboot.h:221
    +
    virtual void OnKeyUp(uint8_t mod, uint8_t key)
    Definition: hidboot.h:178
    int UsbDEBUGlvl
    Definition: message.cpp:22
    uint8_t bmLeftGUI
    Definition: hidboot.h:102
    -
    #define USB_CLASS_HID
    Definition: UsbCore.h:57
    +
    #define USB_CLASS_HID
    Definition: UsbCore.h:59
    virtual void FreeAddress(uint8_t addr)=0
    #define HID_PROTOCOL_KEYBOARD
    Definition: hid.h:93
    virtual UsbDevice * GetUsbDevicePtr(uint8_t addr)=0
    -
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:127
    +
    void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hidboot.cpp:127
    uint8_t bmReserved
    Definition: hidboot.h:118
    - -
    virtual const uint8_t * getSymKeysUp()
    Definition: hidboot.h:165
    + +
    virtual const uint8_t * getSymKeysUp()
    Definition: hidboot.h:185
    #define HID_BOOT_PROTOCOL
    Definition: hid.h:82
    #define USBTRACE2(s, r)
    Definition: macros.h:77
    uint8_t bmMiddleButton
    Definition: hidboot.h:44
    @@ -731,8 +766,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t bmDummy
    Definition: hidboot.h:45
    uint8_t bmLeftAlt
    Definition: hidboot.h:88
    -
    virtual uint8_t GetAddress()
    Definition: hidboot.h:211
    -
    HIDBoot(USB *p)
    Definition: hidboot.h:220
    +
    virtual uint8_t GetAddress()
    Definition: hidboot.h:231
    +
    HIDBoot(USB *p)
    Definition: hidboot.h:253
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    #define HID_BOOT_INTF_SUBCLASS
    Definition: hid.h:89
    @@ -742,7 +777,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #define epMUL(p)
    Definition: hidboot.h:34
    Definition: address.h:32
    virtual void OnMouseMove(MOUSEINFO *mi)
    Definition: hidboot.h:63
    -
    #define hrNAK
    Definition: max3421e.h:216
    +
    #define hrNAK
    Definition: max3421e.h:211
    virtual void OnRightButtonUp(MOUSEINFO *mi)
    Definition: hidboot.h:72
    uint8_t bmLeftGUI
    Definition: hidboot.h:89
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    @@ -754,36 +789,41 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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 bmRightGUI
    Definition: hidboot.h:93
    +
    #define UHS_HID_BOOT_KEY_NUM_LOCK
    Definition: hidboot.h:27
    uint8_t bmScrollLock
    Definition: hidboot.h:115
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:83
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    #define totalEndpoints(p)
    Definition: hidboot.h:33
    uint8_t bmLeftShift
    Definition: hidboot.h:100
    #define USBTRACE1(s, l)
    Definition: macros.h:76
    uint8_t bmRightShift
    Definition: hidboot.h:91
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:80
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    +
    union KeyboardReportParser::@17 prevState
    int8_t dX
    Definition: hidboot.h:47
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    -
    virtual void OnControlKeysChanged(uint8_t before, uint8_t after)
    Definition: hidboot.h:152
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    +
    virtual void OnControlKeysChanged(uint8_t before, uint8_t after)
    Definition: hidboot.h:172
    USB * pUsb
    Definition: hid.h:145
    -
    virtual uint8_t Release()
    Definition: hidboot.h:522
    +
    uint8_t Release()
    Definition: hidboot.h:555
    uint8_t bmRightGUI
    Definition: hidboot.h:106
    virtual void OnLeftButtonDown(MOUSEINFO *mi)
    Definition: hidboot.h:69
    -
    virtual const uint8_t * getNumKeys()
    Definition: hidboot.h:161
    +
    virtual const uint8_t * getNumKeys()
    Definition: hidboot.h:181
    #define HID_PROTOCOL_MOUSE
    Definition: hid.h:94
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:78
    +
    union KeyboardReportParser::@18 kbdLockingKeys
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    uint8_t bmLeftCtrl
    Definition: hidboot.h:86
    -
    virtual const uint8_t * getPadKeys()
    Definition: hidboot.h:173
    +
    virtual bool isReady()
    Definition: hidboot.h:235
    +
    virtual const uint8_t * getPadKeys()
    Definition: hidboot.h:193
    uint8_t bmRightAlt
    Definition: hidboot.h:92
    int8_t dY
    Definition: hidboot.h:48
    -
    Definition: UsbCore.h:190
    +
    Definition: UsbCore.h:197
    uint8_t bmRightAlt
    Definition: hidboot.h:105
    +
    virtual bool DEVSUBCLASSOK(uint8_t subklass)
    Definition: hidboot.h:247
    uint8_t Keys[6]
    Definition: hidboot.h:109
    #define USBTRACE3(s, r, l)
    Definition: macros.h:78
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:210
    +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    static const uint8_t totalEndpoints
    Definition: hid.h:154
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    uint8_t bmCompose
    Definition: hidboot.h:116
    @@ -791,15 +831,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t bmLeftAlt
    Definition: hidboot.h:101
    uint8_t bReserved
    Definition: hidboot.h:108
    +
    #define UHS_HID_BOOT_KEY_CAPS_LOCK
    Definition: hidboot.h:25
    #define USBTRACE(s)
    Definition: macros.h:75
    -
    uint8_t OemToAscii(uint8_t mod, uint8_t key)
    Definition: hidboot.cpp:186
    +
    uint8_t OemToAscii(uint8_t mod, uint8_t key)
    Definition: hidboot.cpp:165
    diff --git a/hidescriptorparser_8cpp.html b/hidescriptorparser_8cpp.html index 33878459..13c24c55 100644 --- a/hidescriptorparser_8cpp.html +++ b/hidescriptorparser_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidescriptorparser.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for hidescriptorparser.cpp:
    diff --git a/hidescriptorparser_8cpp__incl.md5 b/hidescriptorparser_8cpp__incl.md5 index 92c3fddd..41a329ae 100644 --- a/hidescriptorparser_8cpp__incl.md5 +++ b/hidescriptorparser_8cpp__incl.md5 @@ -1 +1 @@ -554c54073302f1217d88977562c2dc01 \ No newline at end of file +91b99ba7a1c855f43e1158f1ae0764dd \ No newline at end of file diff --git a/hidescriptorparser_8cpp_source.html b/hidescriptorparser_8cpp_source.html index 25feb2b3..85f71e47 100644 --- a/hidescriptorparser_8cpp_source.html +++ b/hidescriptorparser_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidescriptorparser.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -1096,91 +1097,91 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1005  ParseItem(&p, &cntdn);
    1006 
    1007  //if (ParseItem(&p, &cntdn))
    -
    1008  // return;
    +
    1008  // return;
    1009  }
    1010  //USBTRACE2("Total:", totalSize);
    1011 }
    1012 
    1013 void ReportDescParserBase::PrintValue(uint8_t *p, uint8_t len) {
    -
    1014  E_Notify(PSTR("("), 0x80);
    +
    1014  E_Notify(PSTR("("), 0x80);
    1015  for(; len; p++, len--)
    1016  PrintHex<uint8_t > (*p, 0x80);
    -
    1017  E_Notify(PSTR(")"), 0x80);
    +
    1017  E_Notify(PSTR(")"), 0x80);
    1018 }
    1019 
    -
    1021  E_Notify(PSTR("("), 0x80);
    +
    1021  E_Notify(PSTR("("), 0x80);
    1022  PrintHex<uint8_t > (data, 0x80);
    -
    1023  E_Notify(PSTR(")"), 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);
    +
    1029  E_Notify(PSTR("\r\nPush"), 0x80);
    1030  break;
    1031  case (TYPE_GLOBAL | TAG_GLOBAL_POP):
    -
    1032  E_Notify(PSTR("\r\nPop"), 0x80);
    +
    1032  E_Notify(PSTR("\r\nPop"), 0x80);
    1033  break;
    -
    1035  E_Notify(PSTR("\r\nUsage Page"), 0x80);
    +
    1035  E_Notify(PSTR("\r\nUsage Page"), 0x80);
    1036  break;
    -
    1038  E_Notify(PSTR("\r\nLogical Min"), 0x80);
    +
    1038  E_Notify(PSTR("\r\nLogical Min"), 0x80);
    1039  break;
    -
    1041  E_Notify(PSTR("\r\nLogical Max"), 0x80);
    +
    1041  E_Notify(PSTR("\r\nLogical Max"), 0x80);
    1042  break;
    -
    1044  E_Notify(PSTR("\r\nPhysical Min"), 0x80);
    +
    1044  E_Notify(PSTR("\r\nPhysical Min"), 0x80);
    1045  break;
    -
    1047  E_Notify(PSTR("\r\nPhysical Max"), 0x80);
    +
    1047  E_Notify(PSTR("\r\nPhysical Max"), 0x80);
    1048  break;
    -
    1050  E_Notify(PSTR("\r\nUnit Exp"), 0x80);
    +
    1050  E_Notify(PSTR("\r\nUnit Exp"), 0x80);
    1051  break;
    1052  case (TYPE_GLOBAL | TAG_GLOBAL_UNIT):
    -
    1053  E_Notify(PSTR("\r\nUnit"), 0x80);
    +
    1053  E_Notify(PSTR("\r\nUnit"), 0x80);
    1054  break;
    -
    1056  E_Notify(PSTR("\r\nReport Size"), 0x80);
    +
    1056  E_Notify(PSTR("\r\nReport Size"), 0x80);
    1057  break;
    -
    1059  E_Notify(PSTR("\r\nReport Count"), 0x80);
    +
    1059  E_Notify(PSTR("\r\nReport Count"), 0x80);
    1060  break;
    -
    1062  E_Notify(PSTR("\r\nReport Id"), 0x80);
    +
    1062  E_Notify(PSTR("\r\nReport Id"), 0x80);
    1063  break;
    1064  case (TYPE_LOCAL | TAG_LOCAL_USAGE):
    -
    1065  E_Notify(PSTR("\r\nUsage"), 0x80);
    +
    1065  E_Notify(PSTR("\r\nUsage"), 0x80);
    1066  break;
    1067  case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
    -
    1068  E_Notify(PSTR("\r\nUsage Min"), 0x80);
    +
    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);
    +
    1071  E_Notify(PSTR("\r\nUsage Max"), 0x80);
    1072  break;
    1073  case (TYPE_MAIN | TAG_MAIN_COLLECTION):
    -
    1074  E_Notify(PSTR("\r\nCollection"), 0x80);
    +
    1074  E_Notify(PSTR("\r\nCollection"), 0x80);
    1075  break;
    -
    1077  E_Notify(PSTR("\r\nEnd Collection"), 0x80);
    +
    1077  E_Notify(PSTR("\r\nEnd Collection"), 0x80);
    1078  break;
    1079  case (TYPE_MAIN | TAG_MAIN_INPUT):
    -
    1080  E_Notify(PSTR("\r\nInput"), 0x80);
    +
    1080  E_Notify(PSTR("\r\nInput"), 0x80);
    1081  break;
    1082  case (TYPE_MAIN | TAG_MAIN_OUTPUT):
    -
    1083  E_Notify(PSTR("\r\nOutput"), 0x80);
    +
    1083  E_Notify(PSTR("\r\nOutput"), 0x80);
    1084  break;
    1085  case (TYPE_MAIN | TAG_MAIN_FEATURE):
    -
    1086  E_Notify(PSTR("\r\nFeature"), 0x80);
    +
    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;
    +
    1092  //uint8_t ret = enErrorSuccess;
    1093  //reinterpret_cast<>(varBuffer);
    1094  switch(itemParseState) {
    1095  case 0:
    @@ -1203,7 +1204,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1112  break;
    1113 
    1114  if(!pcntdn)
    -
    1115  return enErrorIncomplete;
    +
    1115  return enErrorIncomplete;
    1116  case 1:
    1117  //USBTRACE2("\r\niSz:",itemSize);
    1118 
    @@ -1212,7 +1213,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1121  itemParseState = 2;
    1122  case 2:
    1123  if(!valParser.Parse(pp, pcntdn))
    -
    1124  return enErrorIncomplete;
    +
    1124  return enErrorIncomplete;
    1125  itemParseState = 3;
    1126  case 3:
    1127  {
    @@ -1259,30 +1260,30 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1169  switch(data) {
    1170  case 0x00:
    -
    1171  E_Notify(PSTR(" Physical"), 0x80);
    +
    1171  E_Notify(PSTR(" Physical"), 0x80);
    1172  break;
    1173  case 0x01:
    -
    1174  E_Notify(PSTR(" Application"), 0x80);
    +
    1174  E_Notify(PSTR(" Application"), 0x80);
    1175  break;
    1176  case 0x02:
    -
    1177  E_Notify(PSTR(" Logical"), 0x80);
    +
    1177  E_Notify(PSTR(" Logical"), 0x80);
    1178  break;
    1179  case 0x03:
    -
    1180  E_Notify(PSTR(" Report"), 0x80);
    +
    1180  E_Notify(PSTR(" Report"), 0x80);
    1181  break;
    1182  case 0x04:
    -
    1183  E_Notify(PSTR(" Named Array"), 0x80);
    +
    1183  E_Notify(PSTR(" Named Array"), 0x80);
    1184  break;
    1185  case 0x05:
    -
    1186  E_Notify(PSTR(" Usage Switch"), 0x80);
    +
    1186  E_Notify(PSTR(" Usage Switch"), 0x80);
    1187  break;
    1188  case 0x06:
    -
    1189  E_Notify(PSTR(" Usage Modifier"), 0x80);
    +
    1189  E_Notify(PSTR(" Usage Modifier"), 0x80);
    1190  break;
    1191  default:
    -
    1192  E_Notify(PSTR(" Vendor Defined("), 0x80);
    +
    1192  E_Notify(PSTR(" Vendor Defined("), 0x80);
    1193  PrintHex<uint8_t > (data, 0x80);
    -
    1194  E_Notify(PSTR(")"), 0x80);
    +
    1194  E_Notify(PSTR(")"), 0x80);
    1195  }
    1196  break;
    1197  case (TYPE_MAIN | TAG_MAIN_INPUT):
    @@ -1291,18 +1292,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1200  totalSize += (uint16_t)rptSize * (uint16_t)rptCount;
    1201  rptSize = 0;
    1202  rptCount = 0;
    -
    1203  E_Notify(PSTR("("), 0x80);
    +
    1203  E_Notify(PSTR("("), 0x80);
    1204  PrintBin<uint8_t > (data, 0x80);
    -
    1205  E_Notify(PSTR(")"), 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;
    +
    1211  return enErrorSuccess;
    1212 }
    1213 
    - + @@ -1324,370 +1325,359 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    1234  pfUsage = NULL;
    1235 
    -
    1236  if(VALUE_BETWEEN(page, 0x00, 0x11))
    +
    1236  if(VALUE_BETWEEN(page, 0x00, 0x11)) {
    1237  pfUsage = (usagePageFunctions[page - 1]);
    1238 
    -
    1239  // Dead code...
    -
    1240  //
    -
    1241  // pfUsage = (UsagePageFunc)pgm_read_pointer(usagePageFunctions[page - 1]);
    -
    1242  //else if (page > 0x7f && page < 0x84)
    -
    1243  // E_Notify(pstrUsagePageMonitor);
    -
    1244  //else if (page > 0x83 && page < 0x8c)
    -
    1245  // E_Notify(pstrUsagePagePower);
    -
    1246  //else if (page > 0x8b && page < 0x92)
    -
    1247  // E_Notify((char*)pgm_read_pointer(&usagePageTitles1[page - 0x8c]));
    -
    1248  //else if (page > 0xfeff && page <= 0xffff)
    -
    1249  // E_Notify(pstrUsagePageVendorDefined);
    -
    1250  //
    -
    1251  else
    -
    1252  switch(page) {
    -
    1253  case 0x14:
    - -
    1255  break;
    -
    1256  case 0x40:
    - -
    1258  break;
    -
    1259  }
    -
    1260 }
    -
    1261 
    - -
    1263  const char * const * w;
    -
    1264  E_Notify(pstrSpace, 0x80);
    -
    1265 
    -
    1266  output_if_between(page, 0x00, 0x11, w, E_Notify, usagePageTitles0, 0x80)
    -
    1267  else output_if_between(page, 0x8b, 0x92, w, E_Notify, usagePageTitles1, 0x80)
    -
    1268  else if(VALUE_BETWEEN(page, 0x7f, 0x84))
    - -
    1270  else if(VALUE_BETWEEN(page, 0x83, 0x8c))
    - -
    1272  else if(page > 0xfeff /* && page <= 0xffff */)
    - -
    1274  else
    -
    1275  switch(page) {
    -
    1276  case 0x14:
    - -
    1278  break;
    -
    1279  case 0x40:
    - -
    1281  break;
    -
    1282  default:
    - -
    1284  }
    -
    1285 }
    -
    1286 
    - -
    1288  E_Notify(pstrSpace, 0x80);
    -
    1289  E_Notify(PSTR("Btn"), 0x80);
    -
    1290  PrintHex<uint16_t > (usage, 0x80);
    -
    1291  E_Notify(PSTR("\r\n"), 0x80);
    -
    1292  //USB_HOST_SERIAL.print(usage, HEX);
    -
    1293 }
    -
    1294 
    - -
    1296  E_Notify(pstrSpace, 0x80);
    -
    1297  E_Notify(PSTR("Inst"), 0x80);
    -
    1298  // Sorry, HEX for now...
    -
    1299  PrintHex<uint16_t > (usage, 0x80);
    -
    1300  E_Notify(PSTR("\r\n"), 0x80);
    -
    1301  //USB_HOST_SERIAL.print(usage, DEC);
    -
    1302 }
    -
    1303 
    - -
    1305  const char * const * w;
    -
    1306  E_Notify(pstrSpace, 0x80);
    -
    1307 
    -
    1308  output_if_between(usage, 0x00, 0x0a, w, E_Notify, genDesktopTitles0, 0x80)
    -
    1309  else output_if_between(usage, 0x2f, 0x49, w, E_Notify, genDesktopTitles1, 0x80)
    -
    1310  else output_if_between(usage, 0x7f, 0x94, w, E_Notify, genDesktopTitles2, 0x80)
    -
    1311  else output_if_between(usage, 0x9f, 0xa9, w, E_Notify, genDesktopTitles3, 0x80)
    -
    1312  else output_if_between(usage, 0xaf, 0xb8, w, E_Notify, genDesktopTitles4, 0x80)
    -
    1313  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1314 }
    -
    1315 
    - -
    1317  const char * const * w;
    -
    1318  E_Notify(pstrSpace, 0x80);
    -
    1319 
    -
    1320  output_if_between(usage, 0x00, 0x0d, w, E_Notify, simuTitles0, 0x80)
    -
    1321  else output_if_between(usage, 0x1f, 0x26, w, E_Notify, simuTitles1, 0x80)
    -
    1322  else output_if_between(usage, 0xaf, 0xd1, w, E_Notify, simuTitles2, 0x80)
    -
    1323  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1324 }
    -
    1325 
    - -
    1327  const char * const * w;
    -
    1328  E_Notify(pstrSpace, 0x80);
    -
    1329 
    -
    1330  output_if_between(usage, 0x00, 0x0b, w, E_Notify, vrTitles0, 0x80)
    -
    1331  else output_if_between(usage, 0x1f, 0x22, w, E_Notify, vrTitles1, 0x80)
    -
    1332  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1333 }
    -
    1334 
    - -
    1336  const char * const * w;
    -
    1337  E_Notify(pstrSpace, 0x80);
    -
    1338 
    -
    1339  output_if_between(usage, 0x00, 0x05, w, E_Notify, sportsCtrlTitles0, 0x80)
    -
    1340  else output_if_between(usage, 0x2f, 0x3a, w, E_Notify, sportsCtrlTitles1, 0x80)
    -
    1341  else output_if_between(usage, 0x4f, 0x64, w, E_Notify, sportsCtrlTitles2, 0x80)
    -
    1342  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1343 }
    -
    1344 
    - -
    1346  const char * const * w;
    -
    1347  E_Notify(pstrSpace, 0x80);
    -
    1348 
    -
    1349  output_if_between(usage, 0x00, 0x04, w, E_Notify, gameTitles0, 0x80)
    -
    1350  else output_if_between(usage, 0x1f, 0x3a, w, E_Notify, gameTitles1, 0x80)
    -
    1351  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1352 }
    -
    1353 
    - -
    1355  const char * const * w;
    -
    1356  E_Notify(pstrSpace, 0x80);
    -
    1357 
    -
    1358  output_if_between(usage, 0x1f, 0x27, w, E_Notify, genDevCtrlTitles, 0x80)
    -
    1359  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1360 }
    -
    1361 
    - -
    1363  const char * const * w;
    -
    1364  E_Notify(pstrSpace, 0x80);
    -
    1365 
    -
    1366  output_if_between(usage, 0x00, 0x4e, w, E_Notify, ledTitles, 0x80)
    -
    1367  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1368 }
    -
    1369 
    - -
    1371  const char * const * w;
    -
    1372  E_Notify(pstrSpace, 0x80);
    -
    1373 
    -
    1374  output_if_between(usage, 0x00, 0x08, w, E_Notify, telTitles0, 0x80)
    -
    1375  else output_if_between(usage, 0x1f, 0x32, w, E_Notify, telTitles1, 0x80)
    -
    1376  else output_if_between(usage, 0x4f, 0x54, w, E_Notify, telTitles2, 0x80)
    -
    1377  else output_if_between(usage, 0x6f, 0x75, w, E_Notify, telTitles3, 0x80)
    -
    1378  else output_if_between(usage, 0x8f, 0x9f, w, E_Notify, telTitles4, 0x80)
    -
    1379  else output_if_between(usage, 0xaf, 0xc0, w, E_Notify, telTitles5, 0x80)
    -
    1380  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1381 }
    -
    1382 
    - -
    1384  const char * const * w;
    -
    1385  E_Notify(pstrSpace, 0x80);
    -
    1386 
    -
    1387  output_if_between(usage, 0x00, 0x07, w, E_Notify, consTitles0, 0x80)
    -
    1388  else output_if_between(usage, 0x1f, 0x23, w, E_Notify, consTitles1, 0x80)
    -
    1389  else output_if_between(usage, 0x2f, 0x37, w, E_Notify, consTitles2, 0x80)
    -
    1390  else output_if_between(usage, 0x3f, 0x49, w, E_Notify, consTitles3, 0x80)
    -
    1391  else output_if_between(usage, 0x5f, 0x67, w, E_Notify, consTitles4, 0x80)
    -
    1392  else output_if_between(usage, 0x7f, 0xa5, w, E_Notify, consTitles5, 0x80)
    -
    1393  else output_if_between(usage, 0xaf, 0xcf, w, E_Notify, consTitles6, 0x80)
    -
    1394  else output_if_between(usage, 0xdf, 0xeb, w, E_Notify, consTitles7, 0x80)
    -
    1395  else output_if_between(usage, 0xef, 0xf6, w, E_Notify, consTitles8, 0x80)
    -
    1396  else output_if_between(usage, 0xff, 0x10e, w, E_Notify, consTitles9, 0x80)
    -
    1397  else output_if_between(usage, 0x14f, 0x156, w, E_Notify, consTitlesA, 0x80)
    -
    1398  else output_if_between(usage, 0x15f, 0x16b, w, E_Notify, consTitlesB, 0x80)
    -
    1399  else output_if_between(usage, 0x16f, 0x175, w, E_Notify, consTitlesC, 0x80)
    -
    1400  else output_if_between(usage, 0x17f, 0x1c8, w, E_Notify, consTitlesD, 0x80)
    -
    1401  else output_if_between(usage, 0x1ff, 0x29d, w, E_Notify, consTitlesE, 0x80)
    -
    1402  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1403 }
    -
    1404 
    - -
    1406  const char * const * w;
    -
    1407  E_Notify(pstrSpace, 0x80);
    -
    1408 
    -
    1409  output_if_between(usage, 0x00, 0x0e, w, E_Notify, digitTitles0, 0x80)
    -
    1410  else output_if_between(usage, 0x1f, 0x23, w, E_Notify, digitTitles1, 0x80)
    -
    1411  else output_if_between(usage, 0x2f, 0x47, w, E_Notify, digitTitles2, 0x80)
    -
    1412  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1413 }
    -
    1414 
    - -
    1416  const char * const * w;
    -
    1417  E_Notify(pstrSpace, 0x80);
    -
    1418 
    -
    1419  output_if_between(usage, 0x00, 0x03, w, E_Notify, aplphanumTitles0, 0x80)
    -
    1420  else output_if_between(usage, 0x1f, 0x4e, w, E_Notify, aplphanumTitles1, 0x80)
    -
    1421  else output_if_between(usage, 0x7f, 0x96, w, E_Notify, digitTitles2, 0x80)
    -
    1422  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1423 }
    -
    1424 
    - -
    1426  const char * const * w;
    -
    1427  E_Notify(pstrSpace, 0x80);
    +
    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  if(usage == 1) E_Notify(pstrUsageMedicalUltrasound, 0x80);
    -
    1430  else if(usage == 0x70)
    - -
    1432  else output_if_between(usage, 0x1f, 0x28, w, E_Notify, medInstrTitles0, 0x80)
    -
    1433  else output_if_between(usage, 0x3f, 0x45, w, E_Notify, medInstrTitles1, 0x80)
    -
    1434  else output_if_between(usage, 0x5f, 0x62, w, E_Notify, medInstrTitles2, 0x80)
    -
    1435  else output_if_between(usage, 0x7f, 0x8a, w, E_Notify, medInstrTitles3, 0x80)
    -
    1436  else output_if_between(usage, 0x9f, 0xa2, w, E_Notify, medInstrTitles4, 0x80)
    -
    1437  else E_Notify(pstrUsagePageUndefined, 0x80);
    -
    1438 }
    -
    1439 
    -
    1440 uint8_t ReportDescParser2::ParseItem(uint8_t **pp, uint16_t *pcntdn) {
    -
    1441  //uint8_t ret = enErrorSuccess;
    -
    1442 
    -
    1443  switch(itemParseState) {
    -
    1444  case 0:
    -
    1445  if(**pp == HID_LONG_ITEM_PREFIX)
    -
    1446  USBTRACE("\r\nLONG\r\n");
    -
    1447  else {
    -
    1448  uint8_t size = ((**pp) & DATA_SIZE_MASK);
    -
    1449  itemPrefix = (**pp);
    -
    1450  itemSize = 1 + ((size == DATA_SIZE_4) ? 4 : size);
    -
    1451  }
    -
    1452  (*pp)++;
    -
    1453  (*pcntdn)--;
    -
    1454  itemSize--;
    -
    1455  itemParseState = 1;
    -
    1456 
    -
    1457  if(!itemSize)
    -
    1458  break;
    -
    1459 
    -
    1460  if(!pcntdn)
    -
    1461  return enErrorIncomplete;
    -
    1462  case 1:
    - - -
    1465  itemParseState = 2;
    -
    1466  case 2:
    -
    1467  if(!valParser.Parse(pp, pcntdn))
    -
    1468  return enErrorIncomplete;
    -
    1469  itemParseState = 3;
    -
    1470  case 3:
    -
    1471  {
    -
    1472  uint8_t data = *((uint8_t*)varBuffer);
    -
    1473 
    -
    1474  switch(itemPrefix & (TYPE_MASK | TAG_MASK)) {
    -
    1475  case (TYPE_LOCAL | TAG_LOCAL_USAGE):
    -
    1476  if(pfUsage) {
    -
    1477  if(theBuffer.valueSize > 1) {
    -
    1478  uint16_t* ui16 = reinterpret_cast<uint16_t *>(varBuffer);
    -
    1479  pfUsage(*ui16);
    -
    1480  } else
    -
    1481  pfUsage(data);
    -
    1482  }
    -
    1483  break;
    - -
    1485  rptSize = data;
    -
    1486  break;
    - -
    1488  rptCount = data;
    -
    1489  break;
    - -
    1491  rptId = data;
    -
    1492  break;
    -
    1493  case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
    -
    1494  useMin = data;
    -
    1495  break;
    -
    1496  case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
    -
    1497  useMax = data;
    -
    1498  break;
    - -
    1500  SetUsagePage(data);
    -
    1501  break;
    -
    1502  case (TYPE_MAIN | TAG_MAIN_OUTPUT):
    -
    1503  case (TYPE_MAIN | TAG_MAIN_FEATURE):
    -
    1504  rptSize = 0;
    -
    1505  rptCount = 0;
    -
    1506  useMin = 0;
    -
    1507  useMax = 0;
    -
    1508  break;
    -
    1509  case (TYPE_MAIN | TAG_MAIN_INPUT):
    -
    1510  OnInputItem(data);
    -
    1511 
    -
    1512  totalSize += (uint16_t)rptSize * (uint16_t)rptCount;
    -
    1513 
    -
    1514  rptSize = 0;
    -
    1515  rptCount = 0;
    -
    1516  useMin = 0;
    -
    1517  useMax = 0;
    -
    1518  break;
    -
    1519  } // switch (**pp & (TYPE_MASK | TAG_MASK))
    -
    1520  }
    -
    1521  } // switch (itemParseState)
    -
    1522  itemParseState = 0;
    -
    1523  return enErrorSuccess;
    -
    1524 }
    +
    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 void ReportDescParser2::OnInputItem(uint8_t itm) {
    -
    1527  uint8_t byte_offset = (totalSize >> 3); // calculate offset to the next unhandled byte i = (int)(totalCount / 8);
    -
    1528  uint32_t tmp = (byte_offset << 3);
    -
    1529  uint8_t bit_offset = totalSize - tmp; // number of bits in the current byte already handled
    -
    1530  uint8_t *p = pBuf + byte_offset; // current byte pointer
    -
    1531 
    -
    1532  if(bit_offset)
    -
    1533  *p >>= bit_offset;
    -
    1534 
    -
    1535  uint8_t usage = useMin;
    -
    1536 
    -
    1537  bool print_usemin_usemax = ((useMin < useMax) && ((itm & 3) == 2) && pfUsage) ? true : false;
    +
    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  uint8_t bits_of_byte = 8;
    -
    1540 
    -
    1541  // for each field in field array defined by rptCount
    -
    1542  for(uint8_t field = 0; field < rptCount; field++, usage++) {
    -
    1543 
    -
    1544  union {
    -
    1545  uint8_t bResult[4];
    -
    1546  uint16_t wResult[2];
    -
    1547  uint32_t dwResult;
    -
    1548  } result;
    -
    1549 
    -
    1550  result.dwResult = 0;
    -
    1551  uint8_t mask = 0;
    -
    1552 
    -
    1553  if(print_usemin_usemax)
    -
    1554  pfUsage(usage);
    +
    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  // bits_left - number of bits in the field(array of fields, depending on Report Count) left to process
    -
    1557  // bits_of_byte - number of bits in current byte left to process
    -
    1558  // bits_to_copy - number of bits to copy to result buffer
    +
    1556  uint8_t val = *p;
    +
    1557 
    +
    1558  val >>= (8 - bits_of_byte); // Shift by the number of bits already processed
    1559 
    -
    1560  // for each bit in a field
    -
    1561  for(uint8_t bits_left = rptSize, bits_to_copy = 0; bits_left;
    -
    1562  bits_left -= bits_to_copy) {
    -
    1563  bits_to_copy = (bits_left > bits_of_byte) ? bits_of_byte : bits_left;
    -
    1564 
    -
    1565  result.dwResult <<= bits_to_copy; // Result buffer is shifted by the number of bits to be copied into it
    +
    1560  mask = 0;
    +
    1561 
    +
    1562  for(uint8_t j = bits_to_copy; j; j--) {
    +
    1563  mask <<= 1;
    +
    1564  mask |= 1;
    +
    1565  }
    1566 
    -
    1567  uint8_t val = *p;
    +
    1567  result.bResult[0] = (result.bResult[0] | (val & mask));
    1568 
    -
    1569  val >>= (8 - bits_of_byte); // Shift by the number of bits already processed
    +
    1569  bits_of_byte -= bits_to_copy;
    1570 
    -
    1571  mask = 0;
    -
    1572 
    -
    1573  for(uint8_t j = bits_to_copy; j; j--) {
    -
    1574  mask <<= 1;
    -
    1575  mask |= 1;
    -
    1576  }
    -
    1577 
    -
    1578  result.bResult[0] = (result.bResult[0] | (val & mask));
    -
    1579 
    -
    1580  bits_of_byte -= bits_to_copy;
    -
    1581 
    -
    1582  if(bits_of_byte < 1) {
    -
    1583  bits_of_byte = 8;
    -
    1584  p++;
    -
    1585  }
    -
    1586  }
    -
    1587  PrintByteValue(result.dwResult);
    -
    1588  }
    -
    1589  E_Notify(PSTR("\r\n"), 0x80);
    -
    1590 }
    -
    1591 
    -
    1592 void UniversalReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
    -
    1593  ReportDescParser2 prs(len, buf);
    -
    1594 
    -
    1595  uint8_t ret = hid->GetReportDescr(0, &prs);
    -
    1596 
    -
    1597  if(ret)
    -
    1598  ErrorMessage<uint8_t > (PSTR("GetReportDescr-2"), ret);
    -
    1599 }
    +
    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(HID *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
    const char pstrUsageRewind[]
    Definition: hidusagestr.h:323
    static const char *const medInstrTitles0[]
    @@ -1705,7 +1695,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const telTitles1[]
    const char pstrUsageSystemColdRestart[]
    Definition: hidusagestr.h:105
    const char pstrUsageSecurityCodeCharEntered[]
    Definition: hidusagestr.h:267
    -
    void(* UsagePageFunc)(uint16_t usage)
    const char pstrUsageRearBrake[]
    Definition: hidusagestr.h:180
    const char pstrUsageACSort[]
    Definition: hidusagestr.h:747
    const char pstrUsageSelectedIndicator[]
    Definition: hidusagestr.h:329
    @@ -1825,7 +1814,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const aplphanumTitles2[]
    const char pstrUsageSystemSuspend[]
    Definition: hidusagestr.h:347
    #define TAG_GLOBAL_PUSH
    Definition: hid.h:55
    -
    static void PrintUsagePage(uint16_t page)
    +
    static void PrintUsagePage(uint16_t page)
    const char pstrUsageDepth[]
    Definition: hidusagestr.h:908
    const char pstrUsagePaletteDataSize[]
    Definition: hidusagestr.h:878
    #define TAG_GLOBAL_PHYSMIN
    Definition: hid.h:48
    @@ -1870,7 +1859,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageACRotate[]
    Definition: hidusagestr.h:694
    const char pstrUsageSystemMenuLeft[]
    Definition: hidusagestr.h:102
    const char pstrUsageColorDopplerModeAdjust[]
    Definition: hidusagestr.h:917
    -
    static void PrintTelephonyPageUsage(uint16_t usage)
    +
    static void PrintTelephonyPageUsage(uint16_t usage)
    const char pstrUsagePageBarCodeScanner[]
    Definition: hidusagestr.h:49
    const char pstrUsageACFormat[]
    Definition: hidusagestr.h:685
    const char pstrUsage3Wood[]
    Definition: hidusagestr.h:227
    @@ -1894,7 +1883,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageSave[]
    Definition: hidusagestr.h:901
    const char pstrUsageEject[]
    Definition: hidusagestr.h:494
    const char pstrUsagePageConsumer[]
    Definition: hidusagestr.h:41
    -
    static void PrintMedicalInstrumentPageUsage(uint16_t usage)
    +
    static void PrintMedicalInstrumentPageUsage(uint16_t usage)
    #define TYPE_MAIN
    Definition: hid.h:35
    const char pstrUsageALMovieBrowser[]
    Definition: hidusagestr.h:626
    const char pstrUsageACExpandAll[]
    Definition: hidusagestr.h:725
    @@ -1933,7 +1922,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsagePen[]
    Definition: hidusagestr.h:785
    const char pstrUsageSpeedSelect[]
    Definition: hidusagestr.h:528
    const char pstrUsageSubChannelDecrement[]
    Definition: hidusagestr.h:567
    -
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    +
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    const char pstrUsagePower[]
    Definition: hidusagestr.h:277
    const char pstrUsageMessage[]
    Definition: hidusagestr.h:383
    const char pstrUsageACSelectTimeZone[]
    Definition: hidusagestr.h:753
    @@ -1953,7 +1942,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageShootBall[]
    Definition: hidusagestr.h:250
    const char pstrUsageDivePlane[]
    Definition: hidusagestr.h:175
    const char pstrUsageSpinning[]
    Definition: hidusagestr.h:290
    -
    static void PrintLEDPageUsage(uint16_t usage)
    +
    static void PrintLEDPageUsage(uint16_t usage)
    const char pstrUsageFlightStick[]
    Definition: hidusagestr.h:143
    const char pstrUsageDisplayEnable[]
    Definition: hidusagestr.h:194
    const char pstrUsageAltitude[]
    Definition: hidusagestr.h:816
    @@ -1969,7 +1958,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageAlternateFunction[]
    Definition: hidusagestr.h:367
    const char pstrUsageDaily[]
    Definition: hidusagestr.h:483
    const char pstrUsageRowingMachine[]
    Definition: hidusagestr.h:199
    -
    static void PrintGameControlsPageUsage(uint16_t usage)
    +
    static void PrintGameControlsPageUsage(uint16_t usage)
    const char pstrUsageTrebleIncrement[]
    Definition: hidusagestr.h:552
    const char pstrUsageArmature[]
    Definition: hidusagestr.h:794
    const char pstrUsageCharacterReport[]
    Definition: hidusagestr.h:838
    @@ -1978,10 +1967,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageNext[]
    Definition: hidusagestr.h:900
    const char pstrUsageCursorEnable[]
    Definition: hidusagestr.h:852
    const char pstrUsageSoftButtonReport[]
    Definition: hidusagestr.h:892
    -
    static void PrintButtonPageUsage(uint16_t usage)
    +
    static void PrintButtonPageUsage(uint16_t usage)
    const char pstrUsageALOEMHelp[]
    Definition: hidusagestr.h:631
    const char pstrUsageQuit[]
    Definition: hidusagestr.h:470
    -
    static void PrintConsumerPageUsage(uint16_t usage)
    +
    static void PrintConsumerPageUsage(uint16_t usage)
    const char pstrUsagePhoneKey7[]
    Definition: hidusagestr.h:407
    const char pstrUsageALLogoff[]
    Definition: hidusagestr.h:598
    const char pstrUsageOnLine[]
    Definition: hidusagestr.h:313
    @@ -1989,10 +1978,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageACInsertPicture[]
    Definition: hidusagestr.h:773
    static void PrintItemTitle(uint8_t prefix)
    const char pstrUsageACDistributeVerticaly[]
    Definition: hidusagestr.h:781
    +
    #define TAG_GLOBAL_USAGEPAGE
    Definition: hid.h:45
    const char pstrUsageVolumeDecrement[]
    Definition: hidusagestr.h:527
    +
    void(* UsagePageFunc)(uint16_t usage)
    const char pstrUsageTabletPick[]
    Definition: hidusagestr.h:822
    - +
    const char pstrUsageDPadLeft[]
    Definition: hidusagestr.h:110
    const char pstrUsagePlus10[]
    Definition: hidusagestr.h:424
    const char pstrUsageBassDecrement[]
    Definition: hidusagestr.h:551
    @@ -2005,7 +1996,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageMenu[]
    Definition: hidusagestr.h:434
    const char pstrUsageALNextTaskApplication[]
    Definition: hidusagestr.h:605
    const char pstrUsagePhoneMute[]
    Definition: hidusagestr.h:373
    -
    static void PrintOrdinalPageUsage(uint16_t usage)
    +
    static void PrintOrdinalPageUsage(uint16_t usage)
    const char pstrUsageSystemDisplaySwapPriSec[]
    Definition: hidusagestr.h:126
    const char pstrUsageInsideRingback[]
    Definition: hidusagestr.h:390
    static const char *const consTitles3[]
    @@ -2031,7 +2022,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsage9Wood[]
    Definition: hidusagestr.h:230
    const char pstrUsageOrderMovie[]
    Definition: hidusagestr.h:455
    const char pstrUsageACSelectColumn[]
    Definition: hidusagestr.h:742
    -
    static void PrintDigitizerPageUsage(uint16_t usage)
    +
    static void PrintDigitizerPageUsage(uint16_t usage)
    const char pstrUsageSystemWarmRestart[]
    Definition: hidusagestr.h:106
    const char pstrUsageALKeyboardLayout[]
    Definition: hidusagestr.h:616
    const char pstrUsageACHistory[]
    Definition: hidusagestr.h:668
    @@ -2100,9 +2091,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageVoiceMail[]
    Definition: hidusagestr.h:380
    const char pstrUsageZoomSelect[]
    Definition: hidusagestr.h:912
    static const char *const aplphanumTitles1[]
    -
    static void PrintGenericDeviceControlsPageUsage(uint16_t usage)
    -
    static void PrintSportsControlsPageUsage(uint16_t usage)
    - +
    static void PrintGenericDeviceControlsPageUsage(uint16_t usage)
    +
    static void PrintSportsControlsPageUsage(uint16_t usage)
    const char pstrUsageElectronicCountermeasures[]
    Definition: hidusagestr.h:155
    const char pstrUsagePriorityRingback[]
    Definition: hidusagestr.h:391
    const char pstrUsageACLock[]
    Definition: hidusagestr.h:732
    @@ -2139,7 +2129,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageLowCutFilter[]
    Definition: hidusagestr.h:283
    const char pstrUsageChaffRelease[]
    Definition: hidusagestr.h:152
    const char pstrUsageACBold[]
    Definition: hidusagestr.h:687
    -
    static void PrintVRControlsPageUsage(uint16_t usage)
    +
    static void PrintVRControlsPageUsage(uint16_t usage)
    const char pstrUsageMediaSelectProgramGuide[]
    Definition: hidusagestr.h:463
    const char pstrUsage1Iron[]
    Definition: hidusagestr.h:212
    const char pstrUsageCompose[]
    Definition: hidusagestr.h:275
    @@ -2160,6 +2150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const medInstrTitles4[]
    const char pstrUsageACJustifyCenterV[]
    Definition: hidusagestr.h:708
    const char pstrUsageSlider[]
    Definition: hidusagestr.h:73
    +
    const char pstrUsageMonthly[]
    Definition: hidusagestr.h:485
    const char pstrUsageZ[]
    Definition: hidusagestr.h:69
    const char pstrUsageACSelectRow[]
    Definition: hidusagestr.h:743
    @@ -2216,7 +2207,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageACNewWindow[]
    Definition: hidusagestr.h:682
    const char pstrUsageALDatabaseApp[]
    Definition: hidusagestr.h:579
    const char pstrUsageALOnlineCommunity[]
    Definition: hidusagestr.h:632
    -
    const char pstrUsageFastForward[]
    Definition: hidusagestr.h:324
    const char pstrUsageClosedCaption[]
    Definition: hidusagestr.h:444
    const char pstrUsageVCRAcquisition[]
    Definition: hidusagestr.h:896
    @@ -2242,7 +2232,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const telTitles0[]
    const char pstrUsageACDemote[]
    Definition: hidusagestr.h:717
    const char pstrUsageChannelSurround[]
    Definition: hidusagestr.h:561
    -
    static void PrintGenericDesktopPageUsage(uint16_t usage)
    +
    static void PrintGenericDesktopPageUsage(uint16_t usage)
    const char pstrUsageALFileBrowser[]
    Definition: hidusagestr.h:622
    const char pstrUsageSoftStepPrimary[]
    Definition: hidusagestr.h:909
    const char pstrUsageACCollapseAll[]
    Definition: hidusagestr.h:727
    @@ -2253,7 +2243,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageFeature[]
    Definition: hidusagestr.h:360
    bool Parse(uint8_t **pp, uint16_t *pcntdn)
    Definition: parsetools.cpp:19
    const char pstrUsageFont14Segment[]
    Definition: hidusagestr.h:863
    - +
    const char pstrUsageRx[]
    Definition: hidusagestr.h:70
    const char pstrUsage14SegmentDirectMap[]
    Definition: hidusagestr.h:864
    const char pstrUsageGamepadTrigger[]
    Definition: hidusagestr.h:260
    @@ -2287,6 +2277,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 TAG_GLOBAL_REPORTSIZE
    Definition: hid.h:52
    const char pstrUsageACFontSelect[]
    Definition: hidusagestr.h:700
    const char pstrUsageRingSelect[]
    Definition: hidusagestr.h:372
    @@ -2332,7 +2323,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageMediaSelectVCR[]
    Definition: hidusagestr.h:468
    const char pstrUsageElevatorTrim[]
    Definition: hidusagestr.h:157
    const char pstrUsageRz[]
    Definition: hidusagestr.h:72
    -
    static void PrintSimulationControlsPageUsage(uint16_t usage)
    +
    static void PrintSimulationControlsPageUsage(uint16_t usage)
    const char pstrUsageTap[]
    Definition: hidusagestr.h:805
    const char pstrUsageACSyncronize[]
    Definition: hidusagestr.h:759
    const char pstrUsagePlaybackSpeed[]
    Definition: hidusagestr.h:529
    @@ -2363,7 +2354,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageModeStep[]
    Definition: hidusagestr.h:452
    const char pstrUsageInUseIndicator[]
    Definition: hidusagestr.h:330
    const char pstrUsageTrackNormal[]
    Definition: hidusagestr.h:500
    -
    static void PrintAlphanumDisplayPageUsage(uint16_t usage)
    +
    static void PrintAlphanumDisplayPageUsage(uint16_t usage)
    const char pstrUsageACPasteSpecial[]
    Definition: hidusagestr.h:729
    const char pstrUsageCallWaitingTone[]
    Definition: hidusagestr.h:394
    const char pstrUsageACAddToCart[]
    Definition: hidusagestr.h:723
    @@ -2469,7 +2460,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageSecondaryTipSwitch[]
    Definition: hidusagestr.h:819
    const char pstrUsageDiscoverWirelessControl[]
    Definition: hidusagestr.h:266
    const char pstrUsageSystemMainMenu[]
    Definition: hidusagestr.h:96
    -
    virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
    +
    void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
    const char pstrUsageDataValid[]
    Definition: hidusagestr.h:807
    const char pstrUsageACViewToggle[]
    Definition: hidusagestr.h:675
    const char pstrUsagePriorityRingTone[]
    Definition: hidusagestr.h:389
    @@ -2507,7 +2498,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    const char pstrUsageALResearchSearchBrowser[]
    Definition: hidusagestr.h:639
    static const char *const digitTitles0[]
    const char pstrUsageAzimuth[]
    Definition: hidusagestr.h:815
    -
    virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn)
    +
    virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn)
    const char pstrUsageACSelectAll[]
    Definition: hidusagestr.h:655
    const char pstrUsageALNetworkChat[]
    Definition: hidusagestr.h:595
    const char pstrUsageMotocicleSimulationDevice[]
    Definition: hidusagestr.h:136
    @@ -2675,7 +2666,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidescriptorparser_8h.html b/hidescriptorparser_8h.html index efaac84e..91781fcb 100644 --- a/hidescriptorparser_8h.html +++ b/hidescriptorparser_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidescriptorparser.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -125,7 +126,7 @@ Classes diff --git a/hidescriptorparser_8h__dep__incl.md5 b/hidescriptorparser_8h__dep__incl.md5 index 991feb0f..e086c781 100644 --- a/hidescriptorparser_8h__dep__incl.md5 +++ b/hidescriptorparser_8h__dep__incl.md5 @@ -1 +1 @@ -6d9c0da3c50e6ec2d2e9f7e12ac51f93 \ No newline at end of file +f9ba94ed99ad5905f056e92fce988411 \ No newline at end of file diff --git a/hidescriptorparser_8h__incl.md5 b/hidescriptorparser_8h__incl.md5 index 0decf55a..a4d83f26 100644 --- a/hidescriptorparser_8h__incl.md5 +++ b/hidescriptorparser_8h__incl.md5 @@ -1 +1 @@ -995e56fd70b002050bc9cb01e6404c98 \ No newline at end of file +a0afe05b5a9c183c07c271615e912399 \ No newline at end of file diff --git a/hidescriptorparser_8h_source.html b/hidescriptorparser_8h_source.html index c33f5022..c4e264b0 100644 --- a/hidescriptorparser_8h_source.html +++ b/hidescriptorparser_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidescriptorparser.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    21 
    23 public:
    -
    24  typedef void (*UsagePageFunc)(uint16_t usage);
    +
    24  typedef void (*UsagePageFunc)(uint16_t usage);
    25 
    26  static void PrintGenericDesktopPageUsage(uint16_t usage);
    27  static void PrintSimulationControlsPageUsage(uint16_t usage);
    @@ -187,7 +188,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    96  static const char * const medInstrTitles4[];
    97 
    98 protected:
    - +
    100 
    @@ -202,70 +203,72 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    111 
    112  uint16_t totalSize; // Report size in bits
    113 
    -
    114  virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn);
    -
    115 
    - -
    117 
    -
    118  static void PrintUsagePage(uint16_t page);
    -
    119  void SetUsagePage(uint16_t page);
    -
    120 
    -
    121 public:
    -
    122 
    - -
    124  itemParseState(0),
    -
    125  itemSize(0),
    -
    126  itemPrefix(0),
    -
    127  rptSize(0),
    -
    128  rptCount(0),
    -
    129  pfUsage(NULL) {
    - - - -
    133  };
    -
    134 
    -
    135  virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset);
    -
    136 
    -
    137  enum {
    - -
    139  , enErrorIncomplete // value or record is partialy read in buffer
    - -
    141  };
    -
    142 };
    -
    143 
    - -
    145 };
    -
    146 
    - -
    148  uint8_t rptId; // Report ID
    -
    149  uint8_t useMin; // Usage Minimum
    -
    150  uint8_t useMax; // Usage Maximum
    -
    151  uint8_t fieldCount; // Number of field being currently processed
    -
    152 
    -
    153  void OnInputItem(uint8_t itm); // Method which is called every time Input item is found
    -
    154 
    -
    155  uint8_t *pBuf; // Report buffer pointer
    -
    156  uint8_t bLen; // Report length
    -
    157 
    -
    158 protected:
    -
    159  virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn);
    -
    160 
    -
    161 public:
    +
    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  ReportDescParser2(uint16_t len, uint8_t *pbuf) :
    -
    164  ReportDescParserBase(), rptId(0), useMin(0), useMax(0), fieldCount(0), pBuf(pbuf), bLen(len) {
    -
    165  };
    -
    166 };
    -
    167 
    - -
    169 public:
    -
    170  virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    -
    171 };
    -
    172 
    -
    173 #endif // __HIDDESCRIPTORPARSER_H__
    +
    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(HID *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[]
    -
    void(* UsagePageFunc)(uint16_t usage)
    static const char *const consTitles1[]
    static const char *const consTitles5[]
    static const char *const consTitlesD[]
    @@ -275,31 +278,33 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const telTitles5[]
    static const char *const aplphanumTitles2[]
    -
    static void PrintUsagePage(uint16_t page)
    +
    static void PrintUsagePage(uint16_t page)
    static const char *const gameTitles1[]
    static const char *const genDesktopTitles0[]
    static const char *const genDevCtrlTitles[]
    -
    static void PrintTelephonyPageUsage(uint16_t usage)
    +
    static void PrintTelephonyPageUsage(uint16_t usage)
    static void PrintByteValue(uint8_t data)
    -
    static void PrintMedicalInstrumentPageUsage(uint16_t usage)
    +
    static void PrintMedicalInstrumentPageUsage(uint16_t usage)
    static const char *const consTitles7[]
    -
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    -
    static void PrintLEDPageUsage(uint16_t usage)
    +
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    +
    static void PrintLEDPageUsage(uint16_t usage)
    void SetUsagePage(uint16_t page)
    -
    static void PrintGameControlsPageUsage(uint16_t usage)
    -
    static void PrintButtonPageUsage(uint16_t usage)
    -
    static void PrintConsumerPageUsage(uint16_t usage)
    +
    static void PrintGameControlsPageUsage(uint16_t usage)
    +
    static void PrintButtonPageUsage(uint16_t usage)
    +
    static void PrintConsumerPageUsage(uint16_t usage)
    static void PrintItemTitle(uint8_t prefix)
    - + +
    void(* UsagePageFunc)(uint16_t usage)
    +
    static const char *const medInstrTitles1[]
    -
    static void PrintOrdinalPageUsage(uint16_t usage)
    +
    static void PrintOrdinalPageUsage(uint16_t usage)
    static const char *const consTitles3[]
    static const char *const genDesktopTitles3[]
    static const char *const usagePageTitles1[]
    static const char *const simuTitles1[]
    -
    static void PrintDigitizerPageUsage(uint16_t usage)
    +
    static void PrintDigitizerPageUsage(uint16_t usage)
    static const char *const consTitles4[]
    static const char *const digitTitles2[]
    static const char *const genDesktopTitles2[]
    @@ -311,52 +316,51 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    static const char *const sportsCtrlTitles2[]
    static const char *const consTitlesC[]
    static const char *const aplphanumTitles1[]
    -
    static void PrintGenericDeviceControlsPageUsage(uint16_t usage)
    -
    static void PrintSportsControlsPageUsage(uint16_t usage)
    - +
    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
    -
    static void PrintVRControlsPageUsage(uint16_t usage)
    +
    static void PrintVRControlsPageUsage(uint16_t usage)
    static const char *const medInstrTitles4[]
    -
    ReportDescParser2(uint16_t len, uint8_t *pbuf)
    + +
    ReportDescParser2(uint16_t len, uint8_t *pbuf)
    Definition: hid.h:143
    static const char *const telTitles3[]
    - - +
    static const char *const consTitles2[]
    static const char *const telTitles0[]
    -
    static void PrintGenericDesktopPageUsage(uint16_t usage)
    - - +
    static void PrintGenericDesktopPageUsage(uint16_t usage)
    + + - - + +
    MultiByteValueParser valParser
    static const char *const consTitles6[]
    static const char *const vrTitles0[]
    static const char *const telTitles2[]
    static const char *const consTitles0[]
    -
    static void PrintSimulationControlsPageUsage(uint16_t usage)
    +
    static void PrintSimulationControlsPageUsage(uint16_t usage)
    static const char *const sportsCtrlTitles0[]
    static const char *const medInstrTitles3[]
    -
    static void PrintAlphanumDisplayPageUsage(uint16_t usage)
    +
    static void PrintAlphanumDisplayPageUsage(uint16_t usage)
    virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn)
    +
    static const char *const digitTitles1[]
    static const char *const vrTitles1[]
    static const char *const ledTitles[]
    void Initialize(MultiValueBuffer *const pbuf)
    Definition: parsetools.h:42
    static const char *const gameTitles0[]
    -
    virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
    - +
    void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset)
    static const char *const consTitlesA[]
    static const char *const genDesktopTitles4[]
    static const char *const consTitlesE[]
    static const char *const digitTitles0[]
    -
    virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn)
    +
    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[]
    @@ -374,7 +378,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hiduniversal_8cpp.html b/hiduniversal_8cpp.html index c5d2676b..b64f8312 100644 --- a/hiduniversal_8cpp.html +++ b/hiduniversal_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hiduniversal.cpp File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ Include dependency graph for hiduniversal.cpp:
    diff --git a/hiduniversal_8cpp__incl.md5 b/hiduniversal_8cpp__incl.md5 index 4c55bb1e..abe26a65 100644 --- a/hiduniversal_8cpp__incl.md5 +++ b/hiduniversal_8cpp__incl.md5 @@ -1 +1 @@ -32a76392309f3454fa83907b12976ee0 \ No newline at end of file +f166c2163e3da736da869307c3454d25 \ No newline at end of file diff --git a/hiduniversal_8cpp_source.html b/hiduniversal_8cpp_source.html index b49ce6c8..1aa9434d 100644 --- a/hiduniversal_8cpp_source.html +++ b/hiduniversal_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hiduniversal.cpp Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -194,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    103  uint8_t len = 0;
    104 
    105  uint8_t num_of_conf; // number of configurations
    -
    106  //uint8_t num_of_intf; // number of interfaces
    +
    106  //uint8_t num_of_intf; // number of interfaces
    107 
    108  AddressPool &addrPool = pUsb->GetAddressPool();
    109 
    @@ -291,7 +292,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    200  USBTRACE2("NC:", num_of_conf);
    201 
    202  for(uint8_t i = 0; i < num_of_conf; i++) {
    -
    203  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
    +
    203  //HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
    205  CP_MASK_COMPARE_CLASS> confDescrParser(this);
    206 
    @@ -490,14 +491,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    399  if(identical)
    400  return 0;
    401 #if 0
    -
    402  Notify(PSTR("\r\nBuf: "), 0x80);
    +
    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);
    +
    406  Notify(PSTR(" "), 0x80);
    407  }
    408 
    -
    409  Notify(PSTR("\r\n"), 0x80);
    +
    409  Notify(PSTR("\r\n"), 0x80);
    410 #endif
    411  ParseHIDData(this, bHasReportId, (uint8_t)read, buf);
    412 
    @@ -509,15 +510,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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:766
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    +
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:769
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    bool bHasReportId
    Definition: hiduniversal.h:67
    EpInfo * epinfo
    Definition: address.h:76
    bool lowspeed
    Definition: address.h:79
    -
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:81
    -
    #define hrSTALL
    Definition: max3421e.h:217
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    +
    #define hrSTALL
    Definition: max3421e.h:212
    uint8_t bmNakPower
    Definition: address.h:42
    @@ -526,69 +532,72 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t bMaxPacketSize0
    Definition: usb_ch9.h:105
    #define NotifyFail(...)
    Definition: message.h:55
    static const uint8_t epInterruptOutIndex
    Definition: hid.h:150
    -
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:805
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:808
    #define NotifyFailGetDevDescr(...)
    Definition: message.h:50
    uint8_t bAddress
    Definition: hid.h:146
    HIDInterface hidInterfaces[maxHidInterfaces]
    Definition: hiduniversal.h:65
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    -
    virtual uint8_t Release()
    -
    #define CP_MASK_COMPARE_CLASS
    +
    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:57
    +
    #define USB_CLASS_HID
    Definition: UsbCore.h:59
    virtual void FreeAddress(uint8_t addr)=0
    -
    virtual uint8_t Poll()
    +
    uint8_t Poll()
    uint8_t epAttribs
    Definition: address.h:37
    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:796
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    #define NotifyFailGetConfDescr(...)
    Definition: message.h:52
    virtual void ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hiduniversal.h:78
    uint8_t epAddr
    Definition: address.h:33
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    -
    virtual HIDReportParser * GetReportParser(uint8_t id)
    +
    HIDReportParser * GetReportParser(uint8_t id)
    Definition: address.h:32
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    -
    #define hrNAK
    Definition: max3421e.h:216
    +
    uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data)
    Definition: Usb.cpp:292
    +
    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
    HIDUniversal(USB *p)
    uint16_t wMaxPacketSize
    Definition: usb_ch9.h:146
    Definition: hid.h:143
    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:83
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    +
    #define PSTR(str)
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:80
    +
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:82
    virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)=0
    uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data)
    Definition: Usb.cpp:206
    #define MAX_REPORT_PARSERS
    Definition: hid.h:23
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    USB * pUsb
    Definition: hid.h:145
    uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)
    Definition: hid.cpp:62
    uint16_t idProduct
    Definition: usb_ch9.h:107
    static const uint8_t epInterruptInIndex
    Definition: hid.h:149
    +
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    uint8_t bNumConfigurations
    Definition: usb_ch9.h:112
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:78
    +
    #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:206
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    -
    Definition: UsbCore.h:190
    +
    Definition: UsbCore.h:197
    #define USBTRACE3(s, r, l)
    Definition: macros.h:78
    -
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:210
    +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    static const uint8_t totalEndpoints
    Definition: hid.h:154
    #define NotifyFailSetConfDescr(...)
    Definition: message.h:53
    EpInfo epInfo[totalEndpoints]
    Definition: hiduniversal.h:64
    #define HID_MAX_HID_CLASS_DESCRIPTORS
    Definition: hid.h:24
    static const uint8_t maxEpPerInterface
    Definition: hid.h:153
    -
    virtual bool SetReportParser(uint8_t id, HIDReportParser *prs)
    +
    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:761
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:764
    #define NotifyFailSetDevTblEntry(...)
    Definition: message.h:51
    static const uint8_t maxHidInterfaces
    Definition: hid.h:152
    @@ -597,7 +606,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hiduniversal_8h.html b/hiduniversal_8h.html index b16a31d3..575027ec 100644 --- a/hiduniversal_8h.html +++ b/hiduniversal_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hiduniversal.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -119,7 +120,7 @@ Classes diff --git a/hiduniversal_8h__dep__incl.md5 b/hiduniversal_8h__dep__incl.md5 index 436cf0d0..8b07bcbb 100644 --- a/hiduniversal_8h__dep__incl.md5 +++ b/hiduniversal_8h__dep__incl.md5 @@ -1 +1 @@ -a86212bae843e45e600441e77f5c34e5 \ No newline at end of file +6079ba5023de3a9bc19938f024e95433 \ No newline at end of file diff --git a/hiduniversal_8h__incl.md5 b/hiduniversal_8h__incl.md5 index dbe1fb13..9ad0797e 100644 --- a/hiduniversal_8h__incl.md5 +++ b/hiduniversal_8h__incl.md5 @@ -1 +1 @@ -9241a6908523802cf640b05f17a0115f \ No newline at end of file +7e667316a72f4254e92d23fbd41baea2 \ No newline at end of file diff --git a/hiduniversal_8h_source.html b/hiduniversal_8h_source.html index 4172f3d0..442b2526 100644 --- a/hiduniversal_8h_source.html +++ b/hiduniversal_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hiduniversal.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -160,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    69  uint16_t PID, VID; // PID and VID of connected device
    70 
    71  // HID implementation
    -
    72  virtual HIDReportParser* GetReportParser(uint8_t id);
    +
    72  HIDReportParser* GetReportParser(uint8_t id);
    73 
    74  virtual uint8_t OnInitSuccessful() {
    75  return 0;
    @@ -174,12 +175,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    83  HIDUniversal(USB *p);
    84 
    85  // HID implementation
    -
    86  virtual bool SetReportParser(uint8_t id, HIDReportParser *prs);
    +
    86  bool SetReportParser(uint8_t id, HIDReportParser *prs);
    87 
    88  // USBDeviceConfig implementation
    -
    89  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    90  virtual uint8_t Release();
    -
    91  virtual uint8_t Poll();
    +
    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;
    @@ -190,12 +191,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    99  };
    100 
    101  // UsbConfigXtracter implementation
    -
    102  virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
    -
    103 };
    -
    104 
    -
    105 #endif // __HIDUNIVERSAL_H__
    +
    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
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    bool bHasReportId
    Definition: hiduniversal.h:67
    virtual bool isReady()
    Definition: hiduniversal.h:97
    @@ -203,25 +207,26 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t bAddress
    Definition: hid.h:146
    HIDInterface hidInterfaces[maxHidInterfaces]
    Definition: hiduniversal.h:65
    -
    virtual uint8_t Release()
    +
    uint8_t Release()
    uint16_t VID
    Definition: hiduniversal.h:69
    virtual uint8_t OnInitSuccessful()
    Definition: hiduniversal.h:74
    -
    virtual uint8_t Poll()
    +
    uint8_t Poll()
    virtual void ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
    Definition: hiduniversal.h:78
    -
    virtual HIDReportParser * GetReportParser(uint8_t id)
    +
    HIDReportParser * GetReportParser(uint8_t id)
    Definition: address.h:32
    -
    virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    +
    void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
    HIDUniversal(USB *p)
    Definition: hid.h:143
    #define MAX_REPORT_PARSERS
    Definition: hid.h:23
    +
    uint8_t SndRpt(uint16_t nbytes, uint8_t *dataptr)
    -
    Definition: UsbCore.h:190
    +
    Definition: UsbCore.h:197
    virtual uint8_t GetAddress()
    Definition: hiduniversal.h:93
    static const uint8_t totalEndpoints
    Definition: hid.h:154
    EpInfo epInfo[totalEndpoints]
    Definition: hiduniversal.h:64
    #define HID_MAX_HID_CLASS_DESCRIPTORS
    Definition: hid.h:24
    static const uint8_t maxEpPerInterface
    Definition: hid.h:153
    -
    virtual bool SetReportParser(uint8_t id, HIDReportParser *prs)
    +
    bool SetReportParser(uint8_t id, HIDReportParser *prs)
    static const uint8_t maxHidInterfaces
    Definition: hid.h:152
    @@ -229,7 +234,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/hidusagestr_8h.html b/hidusagestr_8h.html index efee6706..03041dcd 100644 --- a/hidusagestr_8h.html +++ b/hidusagestr_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: hidusagestr.h File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -104,7 +105,7 @@ This graph shows which files directly or indirectly include this file:
    - +

    Go to the source code of this file.

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

    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

    @@ -104,6 +105,38 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  674. Major contributor to mass storage code
  675. +
  676. guruthree +
  677. + +

    Donate

    +

    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.

    +

    +

    Table of Contents

    +

    How to include the library

    First download the library by clicking on the following link: https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip.

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

    Now quit the Arduino IDE and reopen it.

    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.

    -

    For more information visit the following site: http://arduino.cc/en/Guide/Libraries.

    +

    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.

    How to use the library

    Documentation

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

    @@ -132,8 +165,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    Currently the following boards are supported by the library:

    • All official Arduino AVR boards (Uno, Duemilanove, Mega, Mega 2560, Mega ADK, Leonardo etc.)
    • -
    • Arduino Due +

      Interface modifications

      +

      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.

      +

      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:

      +

      ```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?

      • Try to connect a external power supply to the Arduino - this solves the problem in most cases.
      • -
      • 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);.
      • +
      • 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);.
      • +
      +
      +

      When I connecting my PS3 controller I get a output like this:

      +
      +

      ``` 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.
    diff --git a/inherit_graph_45.map b/inherit_graph_45.map index d3c2ebdf..c9fa69ac 100644 --- a/inherit_graph_45.map +++ b/inherit_graph_45.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_45.md5 b/inherit_graph_45.md5 index 159342ba..188d85ce 100644 --- a/inherit_graph_45.md5 +++ b/inherit_graph_45.md5 @@ -1 +1 @@ -1c7a9b5b86003e92c3bf0c8685c00950 \ No newline at end of file +02fed3113bdea3a5e53c82b05dd542ab \ No newline at end of file diff --git a/inherit_graph_45.png b/inherit_graph_45.png index 108b217978461d1a74236ca155f6f762b2229ac4..9637db9a767ffc0c491f57c177461129daca51fb 100644 GIT binary patch literal 1703 zcmV;Y23YxtP)O5{Hq=Z_`JJfDCFELgAr z&YU@8rP*pL>*(l!s;Vk0L36_W5qSRmIh;Lv)}~^sj8UYjtE-ivd7PjK)YR0#wr$&N zYPZT5n^NYa$0J|@QyK%E_Uor{%2Bd z0cORD6>$6ZZ3)f2d-otRGScNRm6w-8Nl6K;S+mAvU0VNKR^}lEZUJU^co=^D`Xw%p zj*i0n_wQYH|HX?J5E~l{+qZ8YqwC|xkMQ^J-!XH_$+vIc;Kz?2%BgzP`ln9X8L%F$ zuAe`D0_(R$?9c1huWhl$KgX~AwM5S^{561f%5WSL6N6q}UKkJ%fX9y?mm^<4W5x`m ztq4OxLXbdHb>!#gV|I47dTwiQ`t)g>K7Be)n>G#OTON>yI5fhT-AiICJJqq^EdnYim<^_67#AuC_wJKv>t# zym|Amxw%>RckkX6C;8;-*ROIje1lAsO*nV%Tx@7)kaMFy9QYkOc8JKAFJEx}{P}p~ z$PuJfi%*|E#YKx2;iXHLgn#nnN!+z-7qT4NNKa44g9i_)>b3qIJ$e+kY}umn7*t+J z^c0Q^4v!gFzMqki5zNia70@3&dW4iUxO?|*+_Y(vTt7HCh;!!5LDs>G@6@SNxPJY5 zRkyu?L9DCYvX#-z*d$tEkdcuAwY9av=Q>2rLP|=CO?kb^#>Ph3D);W)E7udaKv@TM zb#-zH0SM>MpO^822M=Vc>+kQ^Q)hRcfQHSRH;df$>(_zpQsx71(?vx^(AwGxlu6n}7 zdp8K_2z{CNMkC1d>j{NVHF&*B4T z13RyDG(J8);`qLO`(W0rSwMTR)4o!{g%2M-KxJj6Y#$6zYHF$kjO|b{hP7+g3MkCu z%+z*nTK|?TSpq#hJuomZAY0S9bLVvZ;l;p#zj*N?Q2hd`Ir5bV)g4(N)R4f|ty_V+ zzTn_s@kwh}SFs}u%K~LkkSs;jbJ~NYTdJt2kb=2%=~5&RkiZg|_V#uuswYmIP_MB! z&=!A|B~YZ1Sh#Q@QlODCM2a!w3caLwX|#NFgJVDud0cU^o_ z^zb=G#Qc_YOgOAgCLEZSmKH0c=7jwSxTPzzZ^o2xHUcIv&PL2b@+L4I3beCkbZd;> zuQ!}EV9M)9fPcQEM^?aaJIbxB_O*rH#pb+g5#W}6-MV!)m3Z;Pk4=s_IhheK{|#d@ xqibts=J$=owWby>9`M?I3 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 - +
    diff --git a/inherit_graph_46.md5 b/inherit_graph_46.md5 index c674602a..159342ba 100644 --- a/inherit_graph_46.md5 +++ b/inherit_graph_46.md5 @@ -1 +1 @@ -8d5846296d9d341acf795a87b1f5cb3c \ No newline at end of file +1c7a9b5b86003e92c3bf0c8685c00950 \ No newline at end of file diff --git a/inherit_graph_46.png b/inherit_graph_46.png index 272b475f7b189cfb2a9025f2d22ce849ed739020..108b217978461d1a74236ca155f6f762b2229ac4 100644 GIT binary patch literal 3861 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 e)f{lmfqwu>3~V^^Co6#f0000 - + diff --git a/inherit_graph_47.md5 b/inherit_graph_47.md5 index 10babc4f..c674602a 100644 --- a/inherit_graph_47.md5 +++ b/inherit_graph_47.md5 @@ -1 +1 @@ -36b8ffb823d725e2c783a2b7a8202aae \ No newline at end of file +8d5846296d9d341acf795a87b1f5cb3c \ No newline at end of file diff --git a/inherit_graph_47.png b/inherit_graph_47.png index 024b00ad18b1947ad789a7ffd435af30f9cb3c50..272b475f7b189cfb2a9025f2d22ce849ed739020 100644 GIT binary patch literal 2828 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 - + diff --git a/inherit_graph_48.md5 b/inherit_graph_48.md5 index 449e6996..10babc4f 100644 --- a/inherit_graph_48.md5 +++ b/inherit_graph_48.md5 @@ -1 +1 @@ -868b020ace8c41333293b31d6f4ba3db \ No newline at end of file +36b8ffb823d725e2c783a2b7a8202aae \ No newline at end of file diff --git a/inherit_graph_48.png b/inherit_graph_48.png index 3f4ec196cfadc7fb6d203d80d453004a9107bf2e..024b00ad18b1947ad789a7ffd435af30f9cb3c50 100644 GIT binary patch literal 3133 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ΞjWyt7Kg_vv=gt8;HQeh&LBZfCQE^h{F+M6Q=mWt6**}Is#@x7Z zV}U5}Xx<2$jZ7Sd5|spRheL$}7hVd_7>I0$R(3)Z;3UezanKOs7 zX3gr+rx~bZ0rKF`LBthuLjxTHb!%W;`%fp84H`5ccsbx+O^ALQHf*r;gz$|T@}NP3NJ9eX zs#~{il4$yaFMtn-6p=-UB8W85oh}JNHz>QpvyU4$&gY{M-C*cWsKDoqPMvI!E);>80l z)kUOCXn!te|BA!6M;XqVs6zu~LVsiEGND~gw^6#p1{m%P!6>&J>KNUBYnHj0fz ziztRDDp#&t@=S(^qH}fziZQMw<5VU@XP-WO6h~H(({MOyp;(dz|KW6B(-GyHN2Gx!*C-j*&-w)@Rn|DtKU}xFIez4 z5t!Utn0)r^nRqVV9O6UZYq%KQhx`Sw4COLF6sM4mJ%UGs7sp#jf1dmQP$<{F!WhMK{fEmp1A&2BeI|4K0Xpn^S_+jwGtZF zK}j-0W2t7AF;N4?z+>XB$DlPE1CK$Q9TS&o3_K?8dJI~#*CaEtU#!F+9h;>_fd=pi zg8SEtc&vwk<5e!c8nb^469w}#k1!gDkOpA4_+L-% - + diff --git a/inherit_graph_49.md5 b/inherit_graph_49.md5 index b88e057d..449e6996 100644 --- a/inherit_graph_49.md5 +++ b/inherit_graph_49.md5 @@ -1 +1 @@ -5c3434b4140d15887c2ce9b803ff2b94 \ No newline at end of file +868b020ace8c41333293b31d6f4ba3db \ No newline at end of file diff --git a/inherit_graph_49.png b/inherit_graph_49.png index f860dc479d9d4f965fb0d35d6f3cc531d599122a..3f4ec196cfadc7fb6d203d80d453004a9107bf2e 100644 GIT binary patch literal 2644 zcmV-a3aj;rP)@87@OyUexGz+bI_x^?SP$BrFc=IG(U&zw0!>({S$ z5i%D>1An^)V7Kemt@D_shX>aZ8#iv$P4m}i;IG#}*REaZ;lqa>^YrlG9ukIOG!ViX zFa{pNn`fr(UjxR#{p-j`gs=vTfrs$snW_8NfY&6`|E>Q@j2%0cYSgGf6)RT!m&vW= z%a>E!xN)gnyLQ6AeEBlXoH>(j-MU4E3m2x^wQI|L2@)ib{$DZL2L<$uuL}$;QB_z>Prc4o;kt0Xa z=g*%l`OKL!Q~C1c(>dD%zj&L@D;=!Tl3l}bU zOkvlqU9@-aUg2N5bcsrqEGdT6zI}VjnKLK#?c0~?*ROBY+@ai~M~@N~iQk(yZ$$Y} zZXk63{(YJ~dp7;~^T$IR{5yB<2pRLe;BRr~du>JC0@D zXln#A#>%!V#%xl)Hp`t~L${HaE9&~f>-aWbR`0?Yk zY11a_p6}nk6Ao{-Y}x4Bw{L`lg?sSBfyKR_K7F!y=>PHKhd8x<{rXXwG-;@N_wJM< zM-Cc4e!Mue*RNm8v!DlkKjw$ut5>gR=+L3!EHQ3`i6`Vj?Ah>jp$pI7MW#%d)Vz7~ zJj9wcYo^$H3%_^o-ikNNMdr$tEAlKp9KvtXq=|x@ow&9sGVG=7Y{&MVJ$po!73|TE zHL>RrK5x9@17yjhN|j1+w6U(yIDPuGV(+E+oq!A9+eIK_u(8Sfcw@Z{qYfQ9q&RY^ z7cXA8$Z+IQY|z4+J9n;1o;wPrRUJBX5I!5Q%n7;! z4Ie&SRj5!w+WH?hWR);sLdAzev*howW5?uP_qlQe75(10al=La$&)84efso@9f$Ds z{@=cR+eMBYjEu_;(uMEqqDz-9s%Fia9wI^U;DMYncqn)YcqmQz^XDg45&;r;Bgn&> zr%RX4n@FVaOO+}mo^Ij7h2b7QJY#(M@`d0v5smD$Wy=-|>LL2TYuh0UWWj?RqL4R= zA3wf85pVrYe0E^s!F2?5lCksnph@%t9I{h}3>m~bFI~D+B7wcn-UciMv}J3xv%}R6 z3I-44$-sEPz3e@xR;^l8sZu546X$_*fjbcrLBNkYcI*(G#vUY)$A}C{X>3`M~z=+XccQ7xG7dU2tT2zV7lk^pLUV z27reej)0Hc4G;9Z@V+otQ-MB)xi4MJo9{>7p5W`K}8fBw96fDjF`WXVGF=g*f! z5&gdC{rmUQojP@DM=_mi;Gk;i)Txu;Z(P57_l|H7r%s(Jkz31z_is=P9GU*dj~_ke zfRhSi12ImclqpjZ7K7ifU%$kQATfeBN5TmzTed7soH$Y1_y>wW_6<*pq$LoVFkym( zIJ>Mp`LgqUwHZSaJWfQ&X$*w$6e&_T4hxToLj~`R9|+Z_wr$&rj!>0A6hx(?QKLpK zW8ffT?JZljl!JgyL_;KPn()mA^oe8>6%8jUSFW6RdZ#{rJirh{CwOtj@*d**_U$9U zB*0R5ZqSJnCΞ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 diff --git a/inherit_graph_50.map b/inherit_graph_50.map index 648c5372..3cd215b0 100644 --- a/inherit_graph_50.map +++ b/inherit_graph_50.map @@ -1,3 +1,3 @@ - + diff --git a/inherit_graph_50.md5 b/inherit_graph_50.md5 index 39b032ef..b88e057d 100644 --- a/inherit_graph_50.md5 +++ b/inherit_graph_50.md5 @@ -1 +1 @@ -f7bc24c0b02011f24f977e7adc86dd70 \ No newline at end of file +5c3434b4140d15887c2ce9b803ff2b94 \ No newline at end of file diff --git a/inherit_graph_50.png b/inherit_graph_50.png index bde5017ccea4d6fedf0de2d12d7899363303088a..f860dc479d9d4f965fb0d35d6f3cc531d599122a 100644 GIT binary patch literal 3090 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 literal 1739 zcmV;+1~mDJP)$K|3TS6TuoYk{pq&wD=k0@?_kZ%_31wzx($AkiomuwSM+Bx!nL?{quXd1P z2|+h+-lSv4jyX)S2fib4_wHTVzkk0)ki`Rx8OM(wH@fz>9}rl#ZXFdB6(AENXM3JNGB zB!reOUFtw@J*cg%rQN%CQ*Lf)CqoYl_x1H_V zw-d_4`1p8lMfkMNFCMUW?_Rod=Z@td=gys@3l}a}=&cE_UcI6N2M)9*IrN`De@;7g z>>%730{pLEzfxXa9*rD1lFptz>oC`w!Gi}6=usUH*cs{uU_gI z&g&W*8x`mtJ$g8^C?_X}!otE#I?B2wOO{YwU7gA^7)?!0^y9}5>e8i)LHgJ4{QP_i z|MlzFgfoPOhFW+ZKYpa{-MdqV4t}v+@{bhDF|CA4moCxRv12JVHdeveym_-Z34o=h zrcy*igo2rrltiCDe>VB9I%#QX1ceaF8>5_H2T(0Vb4j<;oRP4Enu$ z_trh8PMu1J4joe7)2B~06b&9cnELeTL-Xg)r!QZ=DDT#-Tk3WF`}e2t@Nmk?%2H!7 zg?iZum;%_7Ri-%WY|C(K{D-T|+|y zrKF_LnKNhT*RNk1o=%-QMJraUaFB~!1JB6F$e_-hJL}ot8IvYWqQb&Lf|4K~xd`Wk zx1BzH+Chdl1HUMsTeoiX>C-36{%~LL&`=R|>eNXesBhoCgcxqbQ7B^2ph4#P(W6JJ zrb8b24G3B zOeD}*vu3G+5UXLeC|S|qC7w#m;^JaL2|ID(MC#eIr>?^#B1%d$>~sJAeU$^C5YJDZ zJgEvVEPbpgaMe zhYT6QyLRo;v4Eg_v38am!2&uXK z%Hk0$%3=Z8q+^a$LM(*<3-G*hKf;H7NosV0EBMcx|JoVv6N^m@t!5j@a4;w&Hc7*+r|=dSn78ckKsj&7U{!4 z0RsjM;5l>Vuv9NPN4$f@f_1H-02l>6;w3D3g12nhqU((fpdiT!y1$gUEa8JCi5hI3 zD`Ac$^q4es3#u0oAD~O$X0-BTmnXQTLmpxupnTE_&;ofe@nsT zpL4S)0A-fEB-#I%<&2b%W87~U*Cee)1>p^%HNox&76Cg41Qu`0Zngp}kOY=sD - + diff --git a/inherit_graph_51.md5 b/inherit_graph_51.md5 index 54a30c4d..39b032ef 100644 --- a/inherit_graph_51.md5 +++ b/inherit_graph_51.md5 @@ -1 +1 @@ -1f37fdf36af1f7a4626fdb6e529e6fce \ No newline at end of file +f7bc24c0b02011f24f977e7adc86dd70 \ No newline at end of file diff --git a/inherit_graph_51.png b/inherit_graph_51.png index cca1320d81fb9e7aaecc1ce9fe57c72892e1e8d4..bde5017ccea4d6fedf0de2d12d7899363303088a 100644 GIT binary patch literal 1739 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 - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/inherit_graph_52.md5 b/inherit_graph_52.md5 index 08a49cf5..54a30c4d 100644 --- a/inherit_graph_52.md5 +++ b/inherit_graph_52.md5 @@ -1 +1 @@ -e4445773b5106a04d2bf2621be8f242a \ No newline at end of file +1f37fdf36af1f7a4626fdb6e529e6fce \ No newline at end of file diff --git a/inherit_graph_52.png b/inherit_graph_52.png index 73fd6ca2aa48fe6f9d02f63ce194bdec923ddfb0..cca1320d81fb9e7aaecc1ce9fe57c72892e1e8d4 100644 GIT binary patch literal 2455 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 VwnZ)mDGL0Pkx&%Ry{G@|{{U+psf+*s diff --git a/inherit_graph_53.map b/inherit_graph_53.map index 1afdcd61..c8040b18 100644 --- a/inherit_graph_53.map +++ b/inherit_graph_53.map @@ -1,7 +1,29 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inherit_graph_53.md5 b/inherit_graph_53.md5 index 9e0b9eae..bbdef3a1 100644 --- a/inherit_graph_53.md5 +++ b/inherit_graph_53.md5 @@ -1 +1 @@ -0ffd2b6d2b4510d83bb6613deb8d2a78 \ No newline at end of file +b6eb6599ec3fa784957794c8b757b828 \ No newline at end of file diff --git a/inherit_graph_53.png b/inherit_graph_53.png index 0ef1f9448b37262a4599aa3cf22e13aafc2d0eab..f3a83859addce9c5f77b1373d23932303a53b853 100644 GIT binary patch literal 100227 zcmY(rby$^O&@~K)Lr8ZwBHf)564KqB(%s!kOP7RncS?$cbc3{XcjtE>f6x1V@AHQj z*M;ZY_ujK-X3wm(hA&DAQYeUoh)_^aC?BOis6au1nt^}w2ynn}QmsBQK|zT?ef%J* z<_UeI59^7gjn^UKv+p&o>BdQ0%a0#F#GRT|bTVGE=f825 z7TG08o;-Fo{2s}qv1Csdxc%m15B{dmoKb)P3JxSENBF-#Py{GXi=g5LW-DUm88fc_lV+@7phx8Rp!18-#| z1DPympvhW&{9kJ&&%!|8X>gNErO9g^Mg@D&c?GL4=ozyx)#D2WsEo ze?6w#7vZy$jWA;&_5a!6KT`!cN{U1;ISNBhb^P}jkvq!u?QMw;@9XcX#R>!{W=-%;AO+=;ZVAv5-L7 zPpAo||JUJkCDunX$FJ^PLeWuJ00XJDI2udHOJ{O3t#k$C45cv1W@l&56nw<;etByB zPJ_*$5&c~v3io?cVI8npEj(y8`^u>1t9Sn$G`bA9y}kX<;FE~G{ppKOhvutc`<)1j zfp0-7%lX3x1B3TT5nSTo@or#i5O3obEEY zS4xuR-*Z(d&TfwJywBDfy@kB5!byd%{CWbzz<4rAw9HA2+IpxDk&0DSPNmXck&`&B zh-DJq#x4q*_Iq-Nio=lzHmVlMDTmkQVd$2sP!~o!K3rK5^4RMQ5+*M~-sJ{4JpQez zynlx`78BUq9DB0jBhl>8mHWfP@W9aHq`lzw)DP4~DHZzxctkFz6{boGWQd!Efu0Kr3FTHC26iy1!o9 zjsae^@D7Nb#T~D&%5NYEV;vo#d&&EFQMJu!lR&@gCHnQfx@2WU1fIla^q`no&m=Ze zm7#9}T(hN#IqYWAV*ArH@9=9D97ZvzWw7a$zk~JLT)zw?>aMx<1jEuPWbuaP)=Ph- z+;1Kx0z9Nf9S;BZ-CSmJ5F2tq9#1$k z_4S_(V?(;+@GlW8i9lWG&?v6vZw{PZy#9zZIopijfp_W4_r0G|DpoM3 zby(#bN{hjuinK%4k)!}zMd3>zezSttqWKiCDslvHOgC_X+PH_fUG~#ousm=SxlMk3 zPNI@Rq}O1iayvB$idk%sDJ9=aF{}Q!@;OLY9d0mn{5un)L~WOxN{p z`8Mai7?`%t7h4}IlMusEpVJX>WE5*nBpQF859j`isRZn%h_iv+?E=Q%rD`nl^@NA%+z)2ikdB!xD4ApMQ!FPYX69eIm<-? z8%ZMr!g4gOw1M_t_{dX0#r$E?Wp+-fM2Zy1sFCRJZe#)qf|!iUe|4^UqT+SD36bAJ|{*&`f$C zpkqB(L91S!ooUjK-O5}a$QT2;r}ZIU)X(N7fNYPK0W^{GjboSm`SH{X^+TlG^#P8O zUzc42_`V}OBu{D=UvtXmbf%IDddhDPndch@Fv(NPm^srEo7MgE z-%v1cj^e>7GdTaE77@YI({nNshvrj%wBOamw$z+8(+41s@~-x=bn`s+#r|30QBov< zcj5LvaT0RLz)-C3--qBb@s|lUlD%(JO?)R&qFP*+B-p;UvZe#}#hTT^%EKwtNyWJQjVk}_3S1)LK$KDR%34ESKyIV~zB%cTq>{2P z)NRgI?F|nr@i-mIl4q>aevI$`_Z7!?Kz?v5s%LV6Y$Q{39mwXKu6vUFj_Yvhl^IbM zqYq*17IG#Wn~6dH>L#OVNE}pKD)ch}9_;=l@W-PE;d}q$sj|@&CO*4`iDX1P1&36Z zucH4gAqwHMPB2q84nZR10N;WhZ`X4DpEagaSx7k@jkuD1Da61Z;|}9#bl*_}5BwV* z=xN`J;=Qj0SS$-RXgo(~?{;l|`e3$LZ6mDfrA+<}R=;z~{;=RbgVfLisagleeqRpq zag-nqOVXOGdCZHmvw|?BC6&I&Ki^P5>HlRA4GHq^>OP78)fA4D;GOaJa&CtTyRNNO z4FLfGY_{L_mWS1V$C5vxqmSF&8M6pMwh%&jcAQCbef%RMq;Kr}b!eu;2NwQYshsS; zBVB?7(vkoTJ0&ESn}Sz6pMR$JSxjyYI9TmZ8SWS7)GeIbn(h5_ngvKvwz$TZhyi(U z4CVUHO)MeTLj>S(R!dFUN$=#vh)7D2|9kR)1W@Y5`q-OWKu%Hu9G{eDFEkj;xn?mm&oBpZkABN7o6a`X-+qB~Ml3va1k@O_#tPYJ~jf@NnKR zpwTL;lB?x(EkNmT?($8YVY!AIcJG`_HyRQ5h<)|98okRmm~Yol7kL=+7*`NLH!*=F z)c>Mn2?I2qEtEg_m1;VHTK4GEOuzUyHdDCP)>Z-s*C|E6$Exo{JlT^wqbqb)Q@je1 z!Pmtxr-ox$d{$@cJ#(jmS>Elw_w3Kt^M+d|Ckm6_C6J1hrJI8TpCS8t&SD@ag&~I; zw|joLK6Zbn+iYK`S#9v=_->Tz%4Cb;g)LM|-B2ng&QIj~dh+3@i2N_2n?DAP=c8hG>Oi=WXJ@uB00Sa(82l zmyP`Xiyrv%=l$ib)z#i4Hg%*!Lf}%f0~R)N!^Xyjn0CEIAtDaFV^hVvW-}6IqI2xJ4?*!_6`;|6G+471&-gsgdVD~*+h(V<%c>hT=o{2lEyVYg)6Hw4T zoQuXX*ey0(U5>vme+7#4;(*s@&91f6%qF`f`Zry`dnQBQV9ogS@&hF!`ONRHRPf(~ zd{Q*34dhMxqm|Wxi|&JAr|+buVmdoD4ughV#}&~(Q>T$Y=TWDTs8}hXv$B97)$b1v zhYUe4cDtpf(UNnZsJ_I!$DZ1E1^42@9UlFupN(-JPGNdz19n*~X|Jhx?bi;|Cl~e;2*)&hi#dj*pKWs#;!7R(=#Wt+hCXSd3+r zR>OqgFFD%%ED?6yLr-SVR1lJbn@M>Q@uC8b%vcQQ9F2n&QE|bHaZp>$>y=^iIHb!u zjn?;vt}`XdSvRvh0&{`TFeO&gMOW)RFbd2@j8p{#O+cek5CV^uP+nf%bz>I70!pMg z{Vw2PFmbZtm+nB+;}OwbPXu8cFBi=ra?#K3+Z_Lyfi$A;nTj-8Bu+W`e6&*}4V=&-m zNJ)8!ra0jzK;sj946pr5*#AkIL8F4Ttel|9VXdC`-6KqBPt(82qwy3Wvjc`TMxsNBG-%Jyw`&@wy8PHc%7;E*<{wT^@miz? zomB-#vYPxt7)qdyx)`g{t`85E4ayYu^X_ZyOQ_K3eulw;mOSo{A&L=H)gie*jS4K@ zMJuAHP$FKMtCW2>iT7}ifa-i)@A@9-9B2czs;Y-ZLDzB;|Czd?P%fRl!T0{6hMQ^t zNX8=M2%mSk(T&XN$&HW@7M@?tT)UTc&J!U0= z8cY5H%4UFn^Yvq*JKOvPihRZvQRr?oFYi#+-^xCudF2dFD}<}S4xiibPu_#k7I*9g z%%KGodYL<{3F1@5K;e+}2C~=bKPjz?Bp@U_<^muE?RQiRGND=bJU`xgr3>zr_z}+o zY3n)ba(h_nhx;)lxMX`IJrU@Ht0{k6<7~x{2Fa#oPh9Q$SS{4(96>9VtT8(rVFjhJ znN9&|GX^ehe0@%%QfKy)j}lq;QkaviR<04|RIm-!6<9V2s3fNQqT=>`h7DA#o&}P= z_m|aexR!5~@gZKnM@vLpm+lb!;y%I3rO6Nwvup7#zG8guQz#lf> z`-PO)eh9{+SCj5S5`4eBrEJ8R{|!hos)uux*KS)VwH}Y~Zl|4DKwU5%Bti|wgqMH{ zN{XMVcRxQnQ%VXQ`z8?4dZ?JwSxfPlhVnoo|K`?Z#7xBP=fk zB5r-o9e?Au1l%AhMRMt&vYn)*{@9iN$@5eEO?L&p0I4iavu4MbTu(2r$s+m8Bnzf0 zYFRvR;CBZlN>U;3f+~Rtf;PZ=zgJOxa5Ub$#u$#(*U0`eU3|(=%}Dr#_)l1S2Zd$P zbn}-8&ZLFf{93S%+P}!*g#j$c->aR%7fu8Mx^AnrPMZogpBVF2(sV&oM^g+(cBhRG z0R!vd(S=H$u8kmVDs0B|pSl8$>mmp9)j3T9-LG0Hu=05y6W@W~yzLsUgeKiuCsNFA zmwJ723G9!t5usDTmo4GDn<4S`R)QA=!D1IE!WF_ljO9{mwOt*|MxBZEh`%M(I$yV< zU9lX(Pk3u3Kbpy6#=^L@M_EI0Sl)WLzmM|?ORW42HsPPY-3TAni$AVO3BhNV$jPJE z;DRj2g$qaom>EKDc1A7bU_Z;;UlbaT4+&@p;~OW{4(gb)Yrda2^u0bvPI$|qnb|aj zn<}Of&%POP5wfp@yQ%$KpQ#UByew6aMkz)0|Voc$&@ift~i>JQ$ZVLt2=Xq_^l3 z=FIB!NTV6oQ5Wm{gv{(@qU5aLUoJ%W>~;F+2+$xNd%=7ZqOsavb9{|zX%ym^<`X+Z z$-(GZu6Jilb4f9{!MKHGjTrc>MkrpMo>O<{lobwkNAky~z3?6nSHJnNtUNshx7N~b z+D$h58F+O64Ej|iM0)zbpX3Bn_6EW5Xh}Mf)3|*3O^@*g#o)`;slNVZX_K4~nu;QN z%|8g@n&a(ey*3y#R^{rVkFYFXUW{92du(Gp<* zFNybZ=N2F-CS3sP*883R3m$PieiEpYfCRB-CF1yr_zT5CtyX{ceGScTa>0pU( z<)1;QUSs@ZhF$XZCi{-TE{3IrsON+CRP(7txhP08VbCyTwfr(NDUCjr1;>DA_Wrr4 zVtc(ssiyQQDf>z#Wg>^AwAk<_ng4Sf#*xjF$@RxbawA1ZxekFBt+5c+-~Dj>i;*(l zIv7Ma>DkK4LsY{zEARO`!E}hXOr0U;0t%OLk73^J`GF!6zYF;%e$Z00p(9*f<4mn7 z0nismoh#g%aeS2&=jT;I8zj zfaL7=uelBk#y_>ZSy*`6t)|{i5&Z-(Bswwh?p4v!QK~qcq{;G7D$wgeLw_Lc#rk2? zV|>#syq#%heekC~;X8S^%j5G8ykwRfc_*&nv_|YB4Gpi3>}0`x~oZSMnz!8FnxtZOCLKo(bp)7Y&W&`q5(VJna03%Px*N!sepr z7tFpel|q@bob$uYV~Ly$JYLCYTK~+H@!-HdNMW{tE(?DX4Hdn(Jsig%8sN!iJu@f^ zG~ed1p+w-{C35KrW#(OrjhDZjn@F-h70mlR-XK-#{ZVcZVe)*5AG#aDX@1><6^3IH z4ADZ3I7gKKJNAvjCpETp--(GAbHJ8R(*7I&{e3eXS*5N=xKQiT{{FPbK_0o+#l&9% zpqnrsN&C5%<(fFu*dM%$s+r;iWT_kTN;&t}-CAf)N z0=)(d>AFDbR?{aKfyzH@)8mw*3MU_~k(Ap#C;9T{t#0D83L|mqr_0nyw5jH#f`?CN zjzY20c%6z>8oRx)Lx$Q7p#)h2JM+)YzkXU@;!)hD1~=xq9VQGhAhn4$eEK@N)QZ&% z=N1Y)lU^LJOZ{v^Cz3s$*U5G)3t!jk&$C#pOU%e8R!F0i5~`+!n#SVuO)fLy#|b1lLk8@G4EN{Z%E zw0GtTe3Gnw=N5h(+d|3eaiW*(IWXA;6EuqUMbTm;El-h(OiRcXZKeM}8vYc{ z(ztoed_jD|?p)OcQ&IOH5oly}*3$ky#QtghPk(#i%@+(iyp!w9hjDFnO_t%1zN$Hz zfgS5lR{i*bG?55O@}*AEgALnU=?0Xq3W+cF*S?NhD!GIVNjyJr&?#oCRd`RP4?E+T^NSV^ z26Mvt2v1Xcu$~hf$WOsixM-edW0Yq|la~N&q$>#}$)JILcA?vi67VoHe^@?ALN3*8 zzoLy}8f5CoA`)0?@${hX73i9Qy(A^#UupYF{2O638Vc06*lhTrSYbt#{R2>|6(QpI z&Y;Dc%SD<}IBxvXM+IdS*KsoG%*>T`oJ(s#Q{l4UHv)Hs8jlP3rJE|Mn+3mqe~Q|< zf+c9Ae;*@oGE&5-9VBCYeqSGP@$hrFoS^dzl*8|qqfWD0h9eaC+14&&V4h_gT8(6I z>EoLK0JcJTbs?v!p#%Xyn7O!RRRVP+E)$|nmjBK#Bs(>JSq4<`wmM9ZQs>^3IoE(Za?50;t7HL@Xg4>; zXB-B40fB__)HMu~!qY$Xx8COP_}yrv?Ri)U0AexLrB=k>JRWMMoC}B4Qc8qJ^+OP5oJq3 zT?b`gh0w~6YNhNSdz1Q~#S>cYa(~rKHj{i%jf3I7;%3SiL8T;Km#^v*cnMz>3Bkg9->stA@uPx zegY~KUGuJ|vmSktV4L|_F4FsC?&&G~h zqks#jh}&FtQO7B0s?9WZTralMe{LHNodW%kjAa{uKa{Pw?2b)t^hI6!1-^Xcw$o8S zdai$XJy{WW0Pu$E$LCHurCca3o4JwG9o7KcP3{qN8JMQnZUCDt^*BwoPMa;;Hgzyq zVcnlyeDM9|Pmf7rdpB%B-K1 zau2jbUdaP#;>%U~0#uto?VWkVm>~`z7;1h%&niLiBjD*AzWVLAzYSM!wD>0mTw)NB za2eMlPC!GS`z>YnJENSCTnl*_L9(f&#s1H8XU>XmGdN2zW-E2Ojdu@@uyi}0z$gTD zK~#l_^-={LIlZzrfu5Z3;Pv$-b>#0p?u|F9`Eqa|9YWw~ zHiM?j^@Z-*@UZSAA?K#YP|_PcYO|+1*Zry5*hf#lY3bkuI@NbNUH(EgEj)PvFZU7t z5BoGaty2Tgp^;}tVzRiTD|)TY`*GiR97uh#;tt;1IK=B2-<|zkl$s;*AI&&VS0@9i zoI(Kh*uTwNd$>MS1sK=sCB}2fXkFP{db>q1h}He!)^Iev|NGQpqdw^Ayyi>L5c$tg zsI7{JYu(X5Ys?IO8~)E_3pmBtJ@l*wC^6b+S7#z{cG@4@#j{Z*D?bf~@0U};BZ1t* z0;6OfQ7 zH$TI(i5CD_98wCmR9<>w-lj_NFblsO9i8Z%$98zF>ag z&RfYIA%{Z^aqkY~k_mAG@K$JX>0 zqw$z6rTKBd#PC4?wo<#brq7iJU{KDCKi`e9dxj8lSr;?~eXsGpwl+W0C{z1VibY*& z(if>#p~WVIu+|lzITKE&TEvPo6yVOIgdyS~a{qMCLBi`8XsQ#b1b|^zc3O`y_|0>Y zdJpxypyAXUGn`O$+l78Jf`T3saxG$~Lk}p2<6P0hy|sYx%Q#nKRIL*8dO_;~q%aI5 z{p~8(7*0mVEx=J`A zcneK-L;^@~H3<{da(~NZWm6cHgDe5iXltz`I5PDIuuZ7*;AULdRYTA4IAXrrJh&hy?$m==+ebDNg4}o zFai=18piuGpo5$zs?UgoriD{tLyrs!Qw-#UfTofN*i1TV1R0Va)qkJ5OMfeQSqn**+ z$Y3a@c>t+mA8(2r!o_BWd8wXuSQFfTx|bSC6Y{#q{*Leav{%(W7{6&f^-Hsl+}qV~ z|JxaH{S}0J2@VX00u8*A&-mq9vSXbX6@>(#Q?iqoK;He}b+Kh^x3) zzxy$h*U6-kAmCMBUw{ARc$%>0-eVdnIRI z`%++hNm*kvuby(6F-{8OpuxwRhpgF4y4v+Bv)O-aH;{k0;6Z#s=I zGSGX-5RnMLm`}u#2wWYL3HxeIVl~*sV~1qnm7vg`Jq6DT82`!9#UR>IR&)=8IO<0tp2hDe>sSv=d z5k*zdg#&JKF{rqwze`9Z?|R&w@l#}@Mq7EB82@@`KPfju&&3jH%~i^C1vDhyg`WbW zKm11+BA|foI(*JI^4Se?1igk|*J!CUI4ts9DhrSLP8Ele&ebtLmuueEAc~4TJf3!m zPus;02nM|9mC}oJGHA0eA=!uR*aP)x(hYM7b`Q?^GF(LbQS(P|x0~&>g|G`TnR9=N z*$_fHcV(%3tUBB_8MNo(Qgejy@CVG0U7L0Z%5VUmzDx}8pQEe#e$o2q(BpyB-j!Pz z*cli+B3y)x|7-o!x}UM7UV0^y)tJ$I(0yM;!OQ%s29|f?e>-5s2?EML0)mP-vPZ(2 ziQ1Q!6d2^7Px(}4HcR!9pTBi{*)u50wKslsPU)HtQ%;JBsYalG_h$WMH(7!* z`4*Wz%E<;QyuA?(Y;@P~i7g_3Do1%V!;7zDoh~KxpvYD1*c5I|XsA+`rOxX+hG9W6vS>Knjicj75fsx3VWR=%`rwp3EGTijP7hFrXJ0fmqlkP=O2`b zP$79Rjb=gz0Uc${WZMUV+6=aXX6+)|+LF6{@|Y#_VTB2@09$f2w4AK%aJ#=kf_3XX zly^w0j1kBI?$Hs3W4x<6y~@_Ig|8H005G6AADwd%6mgAwl=Xll+OG{| z7i)l&W^+zKA&CQRy0X^#)rmdScV zf=&KN$m7yq9XBWFI<$J90Zvu*DhvsaRQ2{`c>m>D6TIKNj@bV5Z1LqZpsJ1-pIEET z5WPkf+!^qi7p>`O5EG+C=5Ta4pL4|_E=Go5%BmBEH~#B&^RT0O0k}8J{Pevx@geLZ z{_do)C3I``T;(o=B1n(;^N~p+j<7NL;i~lKeVr;Szr$x4kAs;nIb&;ZI#TXhqySZ) zKM{u153Te0+h^i?cuUI5q7r4HKMcXI?`IfflE|J2PK|#F8$+LS+s^c(oQs@y^mxD} zf$5rJx&gpG9V-URs50^eid{a2fFm5GwL5_3`Nm^^%5*4;Pdir|^gP$RWmz#N=!fV~ zUVV!bq(gX$qoPANPg?FtIF2*#3pmzwPA$pRTPZq#C_$XxLiiiD2{im-GmU%8;Rwv7 zw({Waj-v@&c~V&fOHs`w!69p>J(+LXvMqR$y11cPBSfSkrw6!#I*RwLX zq!N+MPPmj3sJ89xVaw@hIHT@h4e~IxcWh=@iI{=_f(RG)bp`<*9FDS7u$7C;_^Gl^ zOmxiZ<*7F-yYWkc{+kGjkEz_jPz68E#GGN1>{rHIsxBq7j*m2-5hw`YXTcCX;yM|0 zmn4&QAY5Q_d<2@|<9qUWCY|pf@ze4mekjBsxN&=L%ubhOt~m{x?V)XuMIUNh!0~k| zknS6w%JFPne!Em6-l9NSSo_v!#u~OKEq-Yl5gXQbs`uf-z<6*2N9j9=EJFme9WVWj zKhMBP1QX}e=b-=_h7%m@J8IlZqm{AY`G8ZXLBYiw_BjxBeB-PlS|O5gsg z?#S1pprUo2swf9lIILk*NrUJ={;4xfh9=Vc4jN5M{s7ylH7u|s0@0uFqOl`N8qHUg z6N4KR%t>t~zo-2Km#XZJ35{eF$0Wr!K|!=NfVqqa0kovk+;8v8JAy`?C@ne$O=gBd z*;K7@AJ{@DUx>sLknZ+Zc4X1PlhJ&46>!&+iy^`@mY+tnZqi~toVLVyzEZ_4GwjNh zzz|WhuQuq2evnQ>U#>}5epR#RSDVKbZuh>9L>J-ldvNWkDSO=YB=D zzs2iQz2SMAWX#1%(VEo`537B#T)LRUYI~kmtqI*G4o^F~`Ow7s*Qb2%$EW-HvXD$8 ztsy`yOY8S=Wo#uDaOBYSED6XOlyU%FwsgJ4=*9NPVgc$;Q1@R7)U`%{-Gs2oTI?s8 z{LF9HuJKq5l)?~kJi|U!bt($dZrnm0=b_j6dqc}ZXXyY(EJTG~<1>(L`PQ_V0leCNFDIWdqB3mw`g9p3oS&4rBmihC zQZF`w=gljpisXqpigEqsDs@xU33uvO?IV;>pm_{fSXfd@FOuududdW28`j{AwR#5u zX>0A8zD&i_WWH1qpp~JjW`;?|bt=Gw{#n8Q^5xkl5|1VO@4Nh4RuCZTwrxP!3^gX1cnUroFQK?!zd|UGO&uGo zKiJukOlLP&S*()J;8aE{DDs`B(7YaI>3T|~9)Dk#o~~xQ{IIvY z(Ttm5s6{OR-1}VtgY%mn*O^G9%$Pa3>m7jRs$|&5=L4XPxbd7LHXB*%^isLpaY=d_ zNuWNCRv{Og=JvYqlvAh0s;Up8AdFAF29S&_35K!@LMxb1c-MoO(gP~wVL-l6PK1#l ztp+sjj;cQZnq9p@OPL^>)l>QOd~+b{OL^!4JkK$JcufPMj|K}XfL6Dr13J5(WgURn zghBDJ#<+LywClA95P#QV&y7DkP)WtAU1L$p6r|X^_q+HgzJGF3wb+-{kicc5!S8)V zE5-FVXbsD4Ka<04moXGQ-R|YGvstLh<7M`KDs)b{*k-=UdiC~nO|zdR+5vxYrOiz> zC&)ZcEDT}QCMowp6=y4s+z15nObgz<0cei0Cb~5@wJbn~Q+yU{?D`Cz)d#dze2tg- z>agMOkU!}Oum(Dz*brdk2>X@!li@OI<+gXgqY~!=AWto+i?CQ7qTXZf@u%(ORu@14 zjQTPvtB@-mWKdwfCPtPk79=@SZ>e}3kN&Ed#+ss%wLf1SIdtRsc!Tc`^&G?YNlZQy zx3EGxk)ap&DhxoP!(06L04*LJ_zsjni4ckeI$mU&F&`I}9++&Ed_Gh0W2xcAB`fc-UXme{00Z}*QaZS1917VD5@mWSZYKgy{c}!kLj^O z-wuR)%&(5?C(BHQ%O958+-yiLq1=4yXKOW8239HbTb;LOIstfZe?cJsJ?fHflWnOf ze-P?sw@;^X+4ElFeMcKGrcge9ls8ptT)IiEdYvBgk;Er+)@Nt(VE63l-i6D)Q~Mx= zS-qxy%7CPX_|wrvyad2cCMT%?@iC$7vV(15SWx)YnXXi?wOA z-@_e=`^W_;JukO=sW$uGJG&j9_2!oiz!k^t3-S97IIUdtR-&4UPx>?5iK-8{!d-U^ zc=!Vu&-xXRhPc_Pl^>!FY-SL%n|+S$=xzh*v@#pLM}>OP%Bpe#4vW1zXl)X*WwIw` zY`DQ%T?+SFp@0l3c<|-U zl*&itq7I%T(f>!|>KRU%;5+H#a;DdyDEOCerLe>CfYwG$wjdXyTNN?xU9kGo&OrFQ z`{`f1i2cT%jJE**Q2yH5R%3@jWgB{iDX;$tlJe{gM;Rg_oJd=r>|^r`GDTwH zKol&}>XgtK1N3K;fKW?q14fA@g;D#vU`nRE_mzUpBd{$6|={c5$KC{4wfqT*t+k$|FG}aUEuMiA49wGTytJRIAh3cHHRAo^R8H~k^_ddNyBknN zJlW3$pq~6dec`Wy75scr_PK4$NNXdn+IqI^!Cgd@wLSYv;0^^_s{1#rA<3Ep@oB0e zDt(ZKh_cZsBOpGE2H2F!XdBwpKpE(VSYv%+n2cZz^f}9?maEQzNEP4h<~r!rhmV-_MU4oVs;GO-kef z`CEFd2FM+evbEc5(0C?iN@F@GTL^yM&9nr6y8H=Cc2DY=-<=tT@ky&@%|Rgi5hX^k z_ZWdVBvqQ>j1YqNt=KjiaUF4(FY6GUEmPtnXNh@ctmj?pvcltobb@a2oy{qFJ_=|6 zQx8St=*u1?q?#q)yO*Ny1glt8dW?Ar*ZCtfarC?^YPu)FBQzfM&z9hLyYDIkhhRt@ zYcqoIu<;#9x+nU%N}dfwtU~t%{WHG;$^~*GN}zzxKuA(U5&%ihFO)CD_e)K38iFdz}`xymiU2 zb<7eh@-!qKZfSS6F13}X_0lj=q-qSxb|8U`e58LzcZw1VsK$nKTA+J9Ln|o&q{|@kfg_RGD4=r@2U+`87*83|-Oz+5^P2b=on4}>I{s5Zi zPwOx+c-Sa|+&yV%@&W!!fDA)K1OXCW*9g5TJ{06wq`JraNG0;Ub}jA{6mSnPr0o9%GI=~~BQ88(hV zJL@q|UxMk^CfJ}Fa`J}Inp~QJjA*F3)dqW^IF!DYBRZ>{@m}ct^!rP+>70N$lQAXySxUdT+M3$%vRG$7iBw$oJ`|~yB*F)lq!;F z?&gqP97zsj6a0DrTvQ%@(5m|7{M7aOQhpH3Az(3r-$>>Pi@(PDP8425G>5gD&Hn5$ zn4UEk04!y5xpD*WS8@@IO0nT+Wt28iE9|0Sv$Z_CLBOO#KC&z0%J=t-&DN$U@&VA- z6iZ-eaj@Kd7112pzRz2yprB|QG*>G8>h+;b9e`HuFE{Qvg{^`S{P43JnNSQ6l48Fn z8E|$iz5wUTPkim(?K_R4Mud-IL)qk_7-i<{KY!_uv9!(Y`s;N6$&=@k(r0ySLf!8^ zR;uVVh#(A4FIeSd0OgCKoM^qo6!X74Uh;7|lL7_!T_3duD|~BHj6g+Ea^`%Y4|RkQ zq&P#a(+Tb(l1Ioytm6m$T8{~(IBM=@0I=nj%Ju1c{kqU9rf4DThM+=a{ASkB=ea(W zcXwU!Q&X{%4$lUp9B%WPAumCP)f8ZdP#IywP2o89#IFnU1g)wG=3lX> z;_9Ph-^Q|){48hNmfM#(Kmc)n0Y)S2E*f~}a^tORr;Cspe7zo_P;@=f=BkA91!2+A zn~O2kCa~H&&ZfW`$T4d8emYkkBG;nI6DlDOD{+}t(unrip0FChL>@*1u+1a~D9|{v z*LX^Xb)&852q!;CH8>rgiC*CD{2VWr{FOF)dg(N*N7POFM`V$3^)`2^=-N`7n`_CC za=HR;KQ0?B6sOLkDeP_J+nTiKuOfkNLIeG@F>gXEqSYxJ_a>MK*-Vh0UwlwdTLy{A z=@BRa$tVWP<}R9Jmn}AAY(NAZfdG^vOk!&9Zy|AcAzO}ERhY%+m(T{*RJ=g~HAMo- zohEM!Vk5ovN%y0cH0!w$@#Cde?Dc3spdkS$|MLwx=owDM0+Y@1fzBLga78|&Pwcnz zdGb(O!Vt@$5aFt*(M+HRGrYn4Wj6N8H&(RQ?+R<`;NUng-_%&1=!qg!1z`@&8lX(jpK*A zvrT>NYYHkHrVM53zh8)W+ImgiVbvP~uWwv)v8<;u1cZw;NW8y$knOabhon%*b9=_J z{o+-B^(&XU!z{8afrGly14(!5El+2M`>2tQmu@4eMm0;|>G$ZwiviR!ah4jhzWc=? zh>L0o7P?qG*PsK$D4LRpwR5y_)f>+j-EGYzELl}tj0c}ss5TZ3u!I-}qZv5r_#IxC z=_o7ku1|L)Kudx;n(iV!JDf5)u)w6jn8@zkt2#8fuTUh%s|5al$f)$mOzIPQpn*xF zbt0d(_#2!LxLQPH!Y!97^Eork4mc@}^dwr1N)Gb{-2mO#2j|+Y{E%m_hl*$N2 z-@R5s{9Ge!saD|eqAw&7QEqEQpq5Wpv6%eYx>$Z``1`BR{?VVj$a!;nv)pfsrK&WA z0#+wYg&px!XD@zgomLO?pjdq6fyHKFIESk}VK|m(!(&(~d`Upk_hum%MHs)|(F`br zRL~T^&s%+tJnkTS?=NVhms8gf^ymI_yeP)Qxb!B8-k;V>M4Cdafmzq5%qJk&q<7I zER~c-=`AqS#K&ulZ+T1C{l4U7`V7uH_o&7OETXwTX&ROxZq&nw9zP(gsOV|rN7*RK zq}5!7go0la&bO?2Mfy&)d!Z(e0f#xuTW>xZ>VN(gz-m&NiWIt|H8|Jn@o%r@b`~o< zdb7RI?oljHa;?wPoql0yCX1mpFhL1lOgvUai?*{TwTKP|i2;LD(0P?c5k#!?d;r!%iy$gy!rkG65!$MlytU z0*1=Qasod5aMw4M8o+4-0@C@j8Zh&B-{YkfMA32PTItD5+{nOYPjWq?V`Tu~8}z-n z&a#K|9&ZvXqbMk5?Z04BS)Fe*0g&l>sZ}MX@BX_i^o6!-N}3xj;({O|KIacRj=Kfg z^*V68GRx#XS6T|UCmmZN?54H%w90xVfZ(&ei}D-aCY2?ChWO3h`4+TGufI^7NpN_6 zwa3n80I(`@BYp76ve!r5CcRvM&Z^t^t-37~o);CJe6}Zp0hyY|Z_X2ykDa8N=z1lL z9TZaZxw%r`SbHD|YA4{f#d?j`FG!>bNG-k;VRcR!1q96&4zFU#uym|wCwr6VIk#Ua z5fSh_?OtDe-p7!2i8pSRFA)Uoj600>JE7+HikP=JZ-1FO5%jtsCF(@m14OzNtLtK| zF2x!ElWfqwF%W0$THy;Bv>K*_x`q?HGjW3tXD)bqIL9Os&mtb_4(y>6qQRzDQ5h!# zEj8(XZ?eNClUS+(zw!NG?b@*Uc zARf_2@9nqJHs<>R579o0|GAIVf@Orhc0@nxXUl$u0 zNNBr=HZD8~;PUo~5c`NKc=g(@w7lH7&`tp=Oijn?^UNk(ln9rjr?HyszeSM;8chLK zb2drYgbd=RV7aJEG7GkCj5Z?g+$@&iH{W>g{B&Bbw;)lPJOE~9$hR1H3VmOWdb0W{ zIBm7;tQQ+T(?v*=(1@>}{nedmzbBsSy;6}O#GyCi5rgW9;;=YU{r%pkC6-W~Wtr2K zOwhBkm_3W%Ee;(!B!SHovx5?*y?uwhCMGZ*GR2=u%4@u3zu>6g<#IU7Fo<2OazKdf z2^m4&7C@&2#~U=uB!2-=vO@H83xE!n2SklUQFyPEv<%W1K>mX=IbC0fAz32NU9l$O zts5+IUGGNOZX^(F`TwYT%ebtz_4^x;loII%3F+?cl#p&vLOP_oyHmQmyBkUA?v^e= zK+^xjbI$MiJo}CN#rEDei?!yO^BQA(2W6nMfV)c=TKeA3Qpe!N)nK~jSUfdGjq3L% z)I?H3Wn87$aM>Z23YgacColK7A1C(hw-$R;G$Ni@WMn(S0vTg0hjbk9MKb>E20I)L z8NBM_aIz#`VuU|Q(@N#Y=wEL9sB)1~GAP9_OhN_y<|Bx1A16-t{P~3pva!$DDvo7m zSHB;7GAW8#R%hH@HrnsXi;-L}^XKu~!K*Ui#llk;jh0aJ%3?u@Yx{aVob^?vFJKP^iPgn|x;AKRj2)bszhepn#MwSdp zgRj5^9pi}vdo~cc&!tfV4HrMBf*|6@%fNTD(RM3?+j?=f?Fjt!6v1$+u(nPO1`Plx z5j1#_uOQt0=}oiKDfO`-v0?&@`a<(;fh;$Q6g{2RJc@mge^v-iQ;#7zI}W6&-+T$H zE^aZ{e7;7byr?GqNt2%v@SFJEL4Iv0{3b7l?WPt5grK{VY}=4Fuq~>S8QyO9OYUxM z73^ihl=N(l#gY{$;(mA}l42L`e&Y-L0Mt>>BZ=?17g;HL;#Yu+rD54nLt&kl2s|G= z>)h-Q5i!{9mP>Xc1{%%Pav>|{KvM4jYy;PigrXkh1b{gZ)?N37_|IO0#uTJPM6qln zUf>Do=&To=Dr!BkTq2~f`R0Y+2n0{GK8^pyJiQ}UzOJMgM5tEGi7`;AP7FeY*V@#x zDdob3MDxfpPyX(a4^+I$(y^CA{?QpCwbs>@H3CT#=hVXwO_2lMS~P^_Qc;PmenL`c zLIbrmhD|ddp0*^a9PxZ#7Nxt<9aA$LJYcIpk<#pbTae3QG#qy#h`>U;rfc*S%xmGH zgvl-MDYOxO?kvRzQUqq-;oNngNrYf*mLJc4&Lz5Uk`I&kU0V*m4LQO&~1I^Wz8jMYY3;;PQ>8@Eq>{$`!)XF0=GR+y}hl_=8gu2;g zeX8G1XA29@PoeOPHOV3C!J?DAEWYsJma_-&tR`$P8fDPyH}EU_L(CdxD{7VLWGYre z!hS*;XhJN3QH0o6M?Lgf)!C6Vp>1STr@zfMpwXqYU(>we3fB6Hpom-h1)D}xqs!uJ zyC)gMm+_0Ow8I_A{JTmqtL21Ri}6m+tjOv}y@-|St^F8D(Wqj}rJ4k8dnIF}0H-+Z zCcS(VLadp&GBR>nO;h27ol(CR5DZ!VH}uZReA&+DLdO4c zYE%DK5aioY8`9(?6-;RG*V@{OUQ2-$$TMILIX}XAZv(N;2M;9@7^6|LSKPjB4l`&u zB%lxxWViF?5Hgw~YwRtxHb|PL#q2;s){#P-SxscprkLADVKG`uQpn1<$s_BKCvZ8A zyl;U%K+3lB8M)~COQDQF$;RUk9cUgh>@6t?f!E^wSQFc5)g}g<$0k1$mp`=<^YG|3 zatH!1%4tNvl}n|bXQ|Q&3bCG~GDSNuul3bU%)geg=TK1 zyuYdFRSAr{%xLmgW&|U#baD%1G}$IV-%vV~<+MD&E40q3kKw)&!Wy?0o-5l&QP%!i zO=2Mb!oj%fu|m;p*_KG-bbc@GjL+A)NpFY=>&waHHj(Kmv^hH%ahNsYV+E!(k|Gc) zLkzOU5gRFL?d6YQ?H*zgWHs9p}`uL<8T-yTfi7nrS7XuBq+GLY!?xz;N#MUdag#q@s44>7rwyDU{!T-1lBcn~Z+-9_TN}p^>|l(DtX+@R+Tu3WF1eB5Nse@sjUk+|RY0JB zRnwO=)h*lS5hp_Tz<}&9fV$x8&yn;)CK#YkO(YzlsKV(TgXlPj`t5_P3m*zQr+fM+ z@PlAtVN8V_qaZ8OYX1kXRFk6%-b6a51xt0 z*B0((gEr6+K7tz|a?vkMprT3+(z$4;*3qsvg}t6OC$k_x(pAJ&1A7-h6jC(v+Zuy; zcEO}c&@29cXK=Y;f+iJ5jv{E(PzYc-r5n-U-kt=n^%60JU)#&Q(&#($SmPpGQCmN- zQSn%e$k;74LS8T=NwL7S7DhzNypRHgqyQdV9D;U1w+l#Kea~E zg)9Z^HhLe%AlDfqMzNggp<#a#ao?rF3W>#K4+3L8@J=2{LHfxz5V;~xM3m{lJP&V-_>9`-^;EK)Ot1a= zFRyVpiGe?S1mTJgjS7y!S}T3t&mSu*oA8A8QWsvrq8N-Ain!ohR?O)l8NFUuEABhu zlmC`cpVCOn&+s#8U9CR!Tk;TT`@Q;nu%rLg;lN)NpjSk#oLZa+|B#XB8Lbnc{UG4| z36G!6YJZIPLvzi}Hk*2j(`m`OsRA60tE<}78ensL>B-S9JR<*TxmN`H(887V$!OvD^MEn0>Ve$4(R5F}uegrdK zhiuK|K^17b2QCE@VhU?Ku=iB!ApoWk4vUA2Rg*EA1n4?Hnn+CoU!WA)3*3bTAbAcg zQcygiL1035QDjGbNSjY!4_)i^R%C$^24tveyc#2EUOeVp1~?VsY&`Zt+kvhHVFJ=N zI$tmVrS~l*tZ(tSlLnD&gfHetRyR}Yz+RZ=7N63g`^C~0V7xps84in3JeMq&YJory zsS)|^HE;=pf|a6p!{!fct>MmKbP-61Oah<6bsNxkW`0L*2 z@LS+81_2ETw{c)#Hs}wo0}K}PdC1#ebUT0S_hZIgYvvQSVTpbTGjA|g^|K#L+vp1`ngyVtG^_UU)i>7TfUWl_G)3d+`sP$y@A9a^dc3=TWkvgN zPlWdtK<`Fk`rS_hc^+;~^S}tJCTA~K50!||fPUwUU{2fb=f-z**obgKD>%!zcGO447qctl!UuPCqR_YbN*TKd<7!wmt5#CG1Z+jmFq zm*ilGNSlNmvaH<)XaF7RHGj3Joogw+zxbf-4DP4`twaAVUBR;Z^v?bi%S(QO}|ROAC$OO2be)oUf^ut zTwc$UL?v`Dh-lmbVm+Zly6UJYuX~Pz$JN|iiSnSSyDhN@&-3PT-Q3e?+gyRnoVGJK z2Wk`MDo2%pG;b^L!=&-u`o4lY0)7>1mA?S)$D>y>Ne{>oR)g35nOb=~01=_Qu-G4t zJ?C_@cXWSyUIkp7Wl@nzy1={R0K5;X4@r#rm9oGMI`s<}siym*iS;?1PBijP|HJ_1 z*V^yHnI|h$>%I!@rrBhTeU9eR+6`DVuCKdE3<{Y!ts;RzhvOOUrv79O<)oqe^Fc&x z<;)4-Knu(ll1uI%Gd>S;c-saI(93+22g4wW_woe5OAje|YrP5o z`&*9n;73#-DddMaoJ|>W%PNO{8H*ifjT7p&cRyd}XQy{|cJ{-@T1Zr@H5n@{<^ze6 z{PT@2WgzH<5EEfW!p*`?BFCtZR`;6tUCx^f#gJCh)UFM`5yGnLaF1OUD0!^|z&%;< zqy}q;ulMI$U4q?hP8teUTa>AFwPlg^fOD0m%j0Mkfqtr8xzTm|J3>Q3*s!4cO$3L{ z`Umg~zh>13&tEMK9wFx;xpW*CMWe8s+xB+}mC98OU{=DuK2+u|F0GviLW6h`%7X)| z{>P6F)~n4qF2^_=RhGr&zDzDltmUR~K+!eo%#X%mJUUr!K>Vw*Z6-*|nNF$4pW}Eu zUt;y=mCUOH6sjyiZ#9gZcj95y-!<7ABC8%xoI@AKB z3x`Hnk;rg#bip7>ADYL3N)(^d$?*KIeW`{W9~_OqZ*6gbU^H-o?}N|oAUFfl%IA9v zbT~1LLY)>RP0PiJEbqBuCMyR={e2QVoN=p7xM$Bl+&1^WZ3$da`^XKGnrl{WO zRO@F7VE;6B60HkmKw|_|>bBKlebp{3cPV+|(rc5*QG_CER>%@C59}|7yd!~s42H;u zb3Q%F^J_hxO&LH57xjz8eM!+r7%YEP21t&b0#;N!uF2XTMqq<#Fkz*m9n^a^2&-TL zd|siiKJ>C-4@LA;2ev0CbfYDML>xYwjfR?)dljk zUbOHItRBh1tu2P52n6fKOgOghF{!97DV1L3eAc709yIV}<*?a3{4Npc3wrv2`T=p) zbJ-P*d1JKyg{R7~G7Y{I=3o(sX_$79W{GMrj1 z-$$YYq|LS7>cBzg(PZW@ZN&An*%D=hp3m^|qQ2?hoIHh{-InXkWL7xH7mDYb9-RfC z0c>ip{al^~T|bd#Qag!cquL7*?0sqdoNW167%1fMf|u*5jekw~C6Q!m8zy&jI68np zZ|BmJ?8m%9j&-x%_ogO(U&67IG*Ah7@*UW6n#|07=PTx6e_PqTdcNK8)@XP%n^q8fQb4Hnem>cn)!RB?`OyGEn{|&u z04!80QPNbQ(LhIur7@9!Na@?82T8`v6m3d30Af{A^^wGy*7rhGQ|wlj3=*8JaU!9l zLP=r$qDExAHT=NO8+C=d`b;XyK{Y%+p7Dd4hBWSn6ap^PI~XjM_LE8uhPZd)EE@gQ zPk(;lTZlhri-mq(A(Y?4Vfw9jd)fw09a#lnGW#{Z;oG!Ke;hy^a8s+6LK7IDl3^P~ zJ?A4Izl#A;nIssC-V&uR_D)S7u;ORx&dT#Sks)#FA#od)y^Ih>vo>0Ym)YrdyMDe2 zA>e)s_ila%$=S>l1PRL@G=@(>)=CSYra^_0i#cX%Fsqtz~f5*^;N80=!Owi`rl^FK;Cpg!$C%B89VZ*v(wM`J)-FC!te=k%TqN z`gIjq(MiOC+K(rTQyM=mVPwUhe!!mNipvVAJb|fLiAdl{I=L{GWVvHh`4TE0_0?WO zuG_UqwZKnGJf7cQESwlUUxaUTQV626#TsNP?Z#aK%f^q=fpW={QY^l(zX$7RIo$63%>6ME9{#uq z-gmi9r!utuoLtoPU`MWf-7fVdNti^xlPv)M!#4)m#75TfE{q>!wjd~-C_Q?~zodpb zk%>?++&CU`Ejd$bj3ARGfWTXcb=hG;X_46EbdWe*O+q(dr7>C8W4N}u&W!z=NpS6H zl$s(>%P|0$PwjDbZiZr4*gXE2fYSqWB6WPCe@`p*&sPV3qVSviljwQnH*vl(W<@43 zo_7F;;Fju}Oh-Q>V9jx*! z9-b{b;%4yP#(bNA)9{pjtm@*J0fY<J<@1Iz5kI290A89NH1@3wdTD-X^^HL?W2$0XDBw==V& z-jFMDk5{Xql(D{EqGy2?-@4%LLK4z7Yk2MS)q$S4!e% zwkcuJcKF;n_b9SOX&kzWvBjIz(L}n@bvBqP=I{kFk%eHwNqf|@+>pUN;W1F{KsLz3 z1@%TR8jHSGNfF|2yLk9#6amAOOz=|&yoZ9{%;c`)R{r@`IZL4I0FY)q7|R%r=slFc z3va@v5cff%8{IF91oy4pPk^Cuv`4La7F}j+j(Y`HS#Y|-s610BuGw40Li$U5Dz^_a zy4HFPihyZ8N!f}L#cW1tLmJJ;T;%Z&v#JTHN0-}ewc!-0ts-cHTKVE6K0vMT3oRTd&?q&m|Qa zK@50&LAHXxM~c?g@Q)wjD!nhN17*{DOc+RHU+cAzGI$ds<~FCX$U=E5^XpA{E4oYl z7oz7YUm%MpgH%2|?wC-4c56K$x2Q-#_jo0A0!&Z@q18s$Us!jdFH`ds{FwBl?Lkq@ z&8-8{m8>j+e6eCAuD!(!oJT2uNJnz%qXoErM_~nG+#Z1`U^c!ifM` zUMN%x2N?oZjHD2gc*S@bAXB};g5GSgnl?(xr7YK&%2X5;^u6IUJ~4Tofy2la!UXmr%92Zx}nzf3PyY-1cx~{?q(#FJ!Kk_h&dMp zzqQ87s+oldP86bq)%$M;tgzkAazj!2g&~scSSa>Fk9^$+$rl?t;9~cFO*)+|wZ7V` zL$IS9SFxOUYe)IJk88p4c$})F6u9aGYACJf7lLvvKm2{O>s5;xoGksnpHU>_g^8dh zZz=;|$!cc3X!_f9;y_#2aNFKUvX4>y|WLM7YG#kOKJ(GSdX z@5^0E4tz4hC|5-K9s(+@7GwbJ0%u50F#n5)dmsJf=lZL21}N6In;pniP&PNSCGN>H zTw1t|Yptq^()8b}k*iqWJ;4S;sG&y@6My$LDKG`Q<3}bAKQO%{tX%kLYnb%(^3%CO zgON~)nh4oNNF z=VN4yg#AE7M>~yjsMj-hwA@F}519!nz-Q;nM7p`RH*j06pVF!#@Zl8NtJ+Wz9booH zVcY&L!Z2IE61?JQfzzr5n)D8xmbeweG;xp7{LSjSpXUct+T2nnOaOtKz{l@xE3hqX`uPUu-Ip7L}%c%k6Y`~3^I9rNSml1{aWqJ6CA%aY&(eF@N& z*T)N}?xHBGBJq@RQ0WR z4x>_(-Jv~QfrVoFS|o2J5{!zP51c=x^;0mfABR_0Gah{&`Z-{!^ZrBCg+&AILFCMY z?jUH?pJ0BkQ8muNA3r%;SO3x!L56vXz#VV5gQp0RWyNmS!vQKq=#*?oNIXjn@Qd_N zE{p2^>`HZBMI9{@8208v*^C^iVC!N;X?SfN@p zU{Qj%0M-HNiJaDSbN}OD#F7NNg?tVM^>!VOmv^Za`?nE3kU-E$Wi2X@Gm%8(EuHow z+4L6zd}pw6rE%CBRlM1r&j!TUkAbguX4z{%@Dqwy|3BMKKZsbc+1=Hyb~?q4f`9B5 zrffWHfQg9N^+7W~`wDg?=sDh&~AOHRXtphYj|` z0Duc8yQ!j-D}BYHV@PWl0rxxnroC$-dOeQ_d&6k;uTpJJ*B^uEVXuK(0hsULJPd7Q zrQ;Tf{&Ik>?=63KD($2f zRC9Oc8!$P=Ic}}m`i{hK1e515nJo-Z-+1>or)jApA!uY=LJhn{xe8;bgY=2M+5p^= z%57iRRnqD5%TGOsruyxa&Qm9dew7OR#(#FV2gaf(xYWuG0v*BsUpVn2I6or5~p&h}erX}iEP)15p}`!K5DM4RGet9y8N zbEYe;z$-M%6|vr8ul+HKfI0#-K>_Uj-}yky5b@KLE`U8LLMe^+Q$y%=CZ`fe=_e*= z++8l+QNCS5n2M!Fgc|o10^90{_M*v=u>@-L3jM#{H z|7v{By4Yrx0+2_tyq{Cz20R9Q*lgC*Yn>_cyXRu_yJv@y-jef!`)atZW-pP!!*|O( zKWjqp@9K!Mc9kA~80{ZX$Aih9!1WV#%$<1w27x*-ACK&4ygtTO#bqJCPO)3Umx{od zN~SchNuxdHu;h{sdZdG~dw@Y~EzT8xHQGj&jijf&I#j0m$$+0PO8GrFBVZ z3$81Q!1BH^t zX%^d?W~K{*fd%DOYNs~imIv8bfyvt6Po%03q4O+;RCX=^0bg~kRs3MMN&vt4-j>9B zw((R&P3q548O^=<-HZF07k+c=Vn!kS*YSEsk@;|(ztI6v_Tdnx1^j%3KBX<2bTI_bazN{g{$jDM3?I&@y8&A2TwIPqYs*cdkpO`r}8TcE?DB z#EU^}>Fnkh2K?&8I8igC-$T&&XX^ugd^?{~`R?F&|C|1L#U_%PHaxW3dWn>U1Ed`j z9j*FU=c;}t({=3tPvm&UqiBN;@lxmhNTO_kJUygbr^7mMkW4_D!i$L-9E~JO&W2%1 zhFr3Svt|h^o##bgR`(nqvx<$|dY*UO&VsaMhU%|Ft3UeM)drC6qaJSAEL>S)5J6_X zP%ti*%}FdqLqfMdm}$U0)?VrT_xXcDGAmp{7xD+?5Nt*w?!+J_%uS${<_paxxIChB zcmKE{iClLUJ(9G+*3)aBw9XZy#H7M$&t?y30G0zaX#VEEg>pr+v1IC@qC3R*70G*I zxd`fr?a~__tkH!EaV2wQ?$h;RVFq#$L>=;0Yi<&Nr>IHE@YDrS6U4h!gA@@VseON)doMkz;Y?gB+MunO2jYuo*Ge=t2E z3Hm^y1TM{_Av)l^0tWkXAQHcmlL&v$yn+ zDFgSvQ>siR)}>?DjiuY_lGgCSY3kb?V^?`LbzEwxK~F>!+$NcJ9J#cJLzs&I3*I@( zPH!OM`l+HDB05wk`k?V0lkL4Q;&Q`rx>nN}bVn2`Kb3rXveBjqWoRaW7~F{PU-84m zA8!lg`P*5IBJtQvH@EcoX4-k7%=lPY%;q-Gd{RXcX;d|GAS7sBBWWt4W;;NHR(%ge zuXBTJ@1S}wpKdUI+HAM8*c^D-3ryB31_mUw1hy1z{?m|+IXH)soYt;z;Y|tD%9n48 zF#$Cd0zI}9xE#c-R-A&2IM>CQ?(cu~*jpsn0}PMu_Jn*M@vJAi_*VvX>Hbjf3UC>y`2sKM`4#YzMvecbayy@hVGD)@06HK0x8ohfE3XXC=u=DUsgcI z=!)u%C9J{;VDr1^0%LpgS<{A>taM^f94k%X3(k#}KA%+Mp9dCLIpQ~H%>Xco2j=E8Lc7-*@h|KY~V^7yQ{TmAqAbjmxkl{^EUwVfSG#J z`Lz^ks_XB&>23GQy@@8QNT-L*0^yhAoCrh;1U@H252GcQ-8QV8Yo=NZp8pvK6dzhW zsK7Gea6rT!&wq_MLf&JhMl}MqHu&(}K7r&KAV9bz6gYpn*5<4VwhWl2aFeOXCHXRm zVP{Ka)SGRUz_|#}Oc>c2D+RLH>uXYi*%vt;_lHG~p`1ADQdl*h?8wak#r-ubsOOoy zAICP@^~2%)zVuWQAST;g|Gu8{z1*@Go?8L6d0mt)o}bs~<|6RAWMtxL(;T<}BQo^M z1kw47?R&7SC@VuDZUW#ketm6_51Gks0ar9AVIXyLQlb+3j#3nxEmx;yI;PlT(MD~{ zd3U;wWb*-@go-X-3HT5k0ZJLhj0vX^1`*4_d{%_Lr_tx;W$y!^%#PM%z=x5})?2G5 z^+YlS4K>WC`Mvp?yfw$teYN>|ckaWPGfyR04vMIeX3$ekbM(8OW1#q-jm{^Mna5N! zcml1;H0b@KChPVIw(oY;*)6c@mnjincInUXK-Wq2Q&vi=g9STsjnfV96g})i$51~( z)VQ;2SvQ}^aail;$3t!}2xjO-1tpWj9De6qX3-`uNfu#b)UG* z1@o^zuLcFgd~4chy-vOqI5&oL%B#iKBg*YNBXG55j$Eo-V~fKIRUkSfBA5OAE|S+W zgae7NH9eO_KW@Il8#aiGmt)0h{HyKCe5C0QpidWxy$YUPs%xT3Q#%cDa)~{1iGgi1 zpKE{Y^(BKGYq4+A{PpuPVa0g?Ey|HzD-8kibvdDaW zT-7zr?vfO7?!oq4S`LZF>tre5?GKCm88y+1C3dPrK7&WBhbq77oxs;2$I--};V(}Q z0no?zQEDs*KcqK@`g0sDFzzi!2`KWamE-jAHE|I^=K|w=^tDCgYI77}TV>&gC6U(% zS#MF_ccK!c><2--6<~YHrq=+uJs2haub!fD;tIj=r}AQT@6MgXs4hnQomjn}^aBR8Hx^pjS|XdSL%{bF4*mZtDgXap;c*v;7Z z_Yo{(J|ro6^1DFlUTvE}!mN--2EBH!A0!Q?Qz8IH5dx*rWuU7Fzt;D_X0^-)$V9U){93wF%u!t zLPA1c1F@ALk6|8pjXnoVg^Mw4URf`F4NFk@Ai;PfoP>lx2@C=Q1J(l(h3EIRv2b5H z1fT3dDNA`B!bkTGl`=IsUrG3A20tssm>>*cRyW@vPk?ir1E_@2?JJ3+gNGkQFTYo; zm)~o6m23qW)vE&6t6SaW33VEOdqirc)qH`66I37ylTBA!P2inUg)5(D==P+PPbKs-{r#RPviq;yFC0`p-Xs|Os~gZk~e-m z=z(bre7#f`P-GNjzman&Lel;KGsdv&GvY6@ELy3qZup>m99TzC&M^m?0Yw~XY(03L zGm9c*AE-``y$VxE#OpE-cE<20U@-#BCu^0PNg!S)k>%aqUrU0Wjr(KQ*Sky4K+B+P zZjy|P3|@s%U+QfB{)oGAQOjMS>;;4zH@-z-JOr3`mmv75d^p29k3D$u+KUma|7`e8 zjZe5GhHcSwFU3UeFI*~quAmmoiy0>Ng?wp*uEc4`eXIhR#4V3JFb95*!2F&$0=d0I zG>DD@N#?6c;}+pl{kwmcMZo1ETPB_oS;1Yz2cO61rPd-JJF6}>Jc1QWFPO!vn~a}C z#JYj=A#;YI(PAO$rxr;ivM7$8wk^!x+pfQMt>WFVudt@-h6GW#lfk*}t9$cSA4#Q7 z3(J>k-w)waUoUs*@y>p*Q|m##iz2YG2qWU)9-| zv#ZjA4X){@@Vhp|fF@zVWU#v87lTK#h)uKBNNnG9)Gdg~y630(JT3-K^&~l;*JHD> zJ^3()4?8Sqh#NkR4MR)$Oru)*eZ3s0_g7A383c4-j293Qn5U*4iB}H^iMF9_0~0~l zOb99GzNM75xgsJ)bf4wY?9avT#R<>~WMPX)m(YW|H%xWDOGp^y{+mzWeebI2&8j3> zMVkc-+3*Ii$f)}3Lt5ArGAga!$)AZu@V+rx!>Kj)vmf_4*=Rc9L&3L;DO;j23-gghMVBo!P0>)ruy9`Pw=WMMyiD;JPcNYe5dj+1}U)GYgfWjz|O5-V}1# zNY{LqO9DmE($_=$-GLU#U}ZMAM7e0Mb&^P|CLzRk|70vJ2HpN5>bF{nk{U~hVM&9< z#G8!mn#2XQs+|M-lSQoD;3IefO&fS$lQ9$A(jxU%&j$`=2NKI@Y?r;{pF-6*?akSL zvb${?c2|!cw7u|33^nyT!RhmjMy(OTn2e5{T0i{?3UQ|bs?)bn(ah+xm7YkkCWq}F z34=wy_cq!(bwZZ6Nybei5OPDF4-C@|_UcXb`(qN>RtR3F;0+@^Qj&DEVDpKoADV0j zSJ3MfK8MxvpQ`=kAv>*k<~aYAOgoDuSibVji5GY;cjICZJ_pp0!BFoDf0Oq09*eQ3 z?-u}fQBIOeMm8=>%+UdDj|{lb##EDqxQLJb7ND=d>-vu!NtQnOrL9V~SwyxNwV%)d z8axp|5YgL?Z^c@zw{xray&_VP6_V|?0o3O=dhjG@P9acoFW^NC%oV$GXeevQhT->p+Zd#P63)8aGyNOCM9{>(v?KV@e66cRIF zf4MtWUhLzL8C#&Sw<#fn__{qmsim_9#g_pXTL%^lVA3_96MZuw46!(OkLJo~#k|Qh zkb6v%-2#iSSDv3AYzir%ErwnJrrS`i*L{hAYb4y%pJip1D3M*<5Mhbtx2P3x7fF=5 zlG&hnrrgEAYzT0hRbQC1$T|z!3H;EIe}y1q*fV(KicYdZsfwGUypfgzKZe;ILuq6d zhrNG)VYSl0T2TL6j5yQO{@1oYMmk$qVe8EFpSH4cP37bcYsC+?1rfM)nSm?XO$<9D z)?WJR6FnWD`e4VeGXOxQ5Xo}AeTim)vrr1{0Or+vqtSSJ3Y%{c6Cbs)F;gRp$1a;@M&(f=VR_G`FG5;F`r>tg9`O$!k1 zojsZ-EciLGp`K^JDf%EyA>54y75bJU_itQi6bG-4_s#%vBwr(*KwsUPekroyt_uRc z--HNnNXG0sgX14f1NgPJR$-fNI~rj}ARO%9M|~FWN-h-N)QBeXj+H+WmI>DuOeU%t z|K{;f@8n!?NVr(Cm6Nw05hfd`6|NLVMySEtc%78BKS;rNGCBSflyhX|(!Exo+0 zgJ%vo;3uOyvRUi&Vh52KhJ1%7DON%)kND0slp_fRZM`mr)tSP^`Z2_qlkA8T3`e5A z+*EZreRMcWGm!Yqg);nUVY9!{nm>>gek^@S9(1jdY3LrL!>!Ff!q?(9fYy(;U%5aP*+O zIb*Fvxv6xzpr`HwraT#Z%SzYZby3_(%Hl9g`?3~$-oRuX;oH^EM`Za>RvZ3sjAcXl z7Wi)|LHEwTIX7s;TI>!Vi<)@umc)%Rx( zj~82IRAdvDff1h!2iQ1&cyRmEx;f1JH2QAO`(@lZ@x6l9YrogF^ZAx9=h%Nr6SS}5 zyEiyE-$Rq2pyJ{)t=1G9x4qjC_BjZ~m$JOA$+mU_N@XyW!)9%9{Q4NscCY8u?Wq^; z1>SPnNM&m8;3_$2iGY78W}wsj>XS)M%S#X}XhR~+;7#O}JQ$VGp#+X)LJ%WlLnFc8 zy08fRfrncc{`U#DIzW<&ffkkc#L(5b%Bm)^fr@VvlRv&y&FOoe?jE{?tUM?I1Q1N5 zMJbfA!ToQJQja?w22|7_IjMouqdCdBnIcAN1hG%wR&IY1z97Ud_a`Pa2RvNUfpP=J z5qxWbpq6h@+yJaLVfC4()>pxaL*yal{vavgOybjw1#LZ%xuyrmdy9l}_j353SKaPZ z!1P(DC&Y4jw#h*k$d?~dozbZhk69aRKdFzHCUU3@bsGfVE@*-Us)LRqiN#pt%iQDF zv?|k~dkPm8Q(=+_c+j{UH|>L;W%b(7xwegDv+jj~9AyeGJKMA|uV_31{q5}cl5d-t zLFZ2%hZ*6!udMLoWgqh(3N+<5S^N0hZyHNAuQ=ydfk#2R7+IU(&2))UA$9N|Y{%;L zu|n~Xh`BR-faQPh3$Q`*>29zmg0Q;Xyx2Br!LO%=l2R*$<+DDq`$^j&>CwZi|q)80VqNRlvJV8WCss3qeP za@U3)Ba6lGgEQ`SXu!fv$L(|p=sa+*Q6JQ;&~j8^H)qQ%{8d}bZO>EuJ#>es($W@@ zt0~oRMXf^5GlB|%n}RGwn6Du9e@~tPhA$ESvl7sL^G~v}W;{6xr`F!-@H1O?ILI&) zqIOnPxmbM}U+w8J9E#yEQ?kJ1ZFHaBc&E4?yN?w|4&?YkAA}9%(2Hqf5>Qk5-$#!~ z*kHEUF~Rb%I+ZD>U?hgLMDqUPn*>GnsO*>5!Ya&$66%h}L0uxRb46#q+7a$e3*nbo55eVZM+N|Bm>JHv3FZ+fAtMza@7>b4&&WLB5U6^kG%B|I%mHaZlw<#QDbZjd z$pg*T++KenN@FWY3?tHgOuQe)BzGX^`+axtkz`wU$Kro10JL^gP{h>x-t5)A&7y5N zkH?>|RKcz~Nn~xI5QEy{kN)^g+KuTZJR+HVIkG5QIWuHq|GG6_7GbYYp(g9Pxw|W8 zsytKereeZ73V0M)`b=%O?q&;isNt9fT0W&QFa}93=mc%ZJ(`1{H+ZYE@9QGU0qV{4 zYw&Ci>;yIR2@k{m=R&^>_DOv9OQYAWL3B3U zdRL}Stk{*ub-b7>u1{lw(}>e^ykMgOG>3B7S2hfB;t4c~W9A)n|93_Fd@SHcGdq-@ zo*(c~kQjBB?b$>ZBz|f)fOpa6-D20@I3Cx_ph3ST0%XEN2a5%w5|BqP03}|z)A`c7 z#iiN{eHP)LEmnzmo#cAlb#le9nr_}l{+DF}4;705DP`{Ua4J|T8BKEp!~pR^QRhRA z{$@u6h6Nh37$n@`H~j|{Ur!btbA=*u9a=-@1pj($sV-HhSFK-sTE=Sv-Pr~LieSjn z0ptIV?f&nn5Tk-7xtjwMozl^1ITbIa>3!VX_~JWTvyGd{%MHM-+_1zm-bIBOHyTH62xT@woICGI6kMR8kC7z>T9qwSuOY1I*f6 zpioe)trLq$QWZ)>S$~ZNSV! zd3G!#J75~kN- z6*4z{`|KCVS#okTl-_}JQz?+xOXJ8xk8K5){<~*+`Q!YJPk>30{LI``p8Aqu8na=o zGyYHQkbkW*VwI{w_nPF^Kw>VIjFg)s>iqMWvS5zB3>LNWc$tJ>Mf(<5<1J2G#Sf!W z$>^dyp0mBmLM3sD*OPh2%A4_x>^Ht|SDVM)jFZKm{qHlu>B8V*v*75w>$Wr$UAq)y zDIW&2JuMUFKb;D2aCsAqx4X8f{@T`50f`-cmdD|E&UoQAAF*_cYP;iDd6A`qok8F9 zZc-;pWuc`!N#EBg)0aQdC#OcW10{&G7iYMIYLC6Mi(M zP8%7oUhL_QA)#uMb?hdlQRF93glK_N8biyV=i%ep*kF$Nx}`RpeIR;62>bCfyMd6^ zT%#2?_U(TNA3VrB=1plJchUpw%M!2MIv`FQyQ-j;mJ z8-4>gj(7l;_YbO=1bC)MpmQZ6OMxOSJDzy^xLusYz@HB`!1EQg_m5XBUd$%?MENe( zYc5U>Rx3ajY^hQ0SH@tn{Kd9k7DSJNlc_DMyRkD^W!K2o}#Epu`ww9V;)U2}ap&Qa( z8C-V$EQQ97_KeRfI)Iov3(C(PZy}!XU4i@aT|~|q?fX1%_(@>x%&0<=93X}N!w&_@ zHLt@BHR|?~k0v4GG7A=ce`5RJ_zQ>a&&$0BH0ln}H}lt3LvQdN~x$TNtNn?jHeUSYfVYC-Xo8I{NANjMC*Y z$7acEPNXSXx$b6=fFrtfyxet!5%G>9C~2Q=a`?Zs>CY=*$4FPp^5hUF{qyMk*Wv(G z^rnp&Tmj@FB)t^^ZlyNy%hx=OZWkKiSm$k@9M&zi*E^i+1LEJ?)XrB`x*m6YlmcFX z|85j)K*5wDy|%m>P;(W#p5_;=>N+}I>$f;*eys+fJ%E8Djg(J|Xg}CjpPCSA=g(ai zK@kw~xm3oz=bU;gpWa;gb??KeLhz=tAt(i*;h*|Dah41QDtR~O8&x2CXXNY-ybiAV z&|bhmGOF_)pqGz8f$;vf&PxzoE&Vc)i7`3pOGV!Dd+zeE5B?Ff^c(?MmaX8f1vIY_ z@fCw=X0uLfPzEcq1hrENgio*&8mB5|Ie=M^0?L*u7<8%(MBrY}9YqU1D*`qt2O}8E zYX2OLmt;4el>$RmhKj}(zi*xGpxUFB<)-?G9?bYkL8UM_CS0l=pMwr)P>^1AbFw7* zR~l6X$j3vXYO zf=t$&#*vXL7*-@EO+`?c1ccg>&WAJNalZK+(LkmKOd{SF^@m*tgcQE7W${q-7=7YK zbv|4D2;hWmz3-7!ek_!!S5X<9SNMGjTL8ZYYSo>MJ>zoG6sAv58})X1QEw^2mfKxf zH|PM;f8-$# z@C&H4OOw8kh1ed!9!fwPxN`(fa<4zW%zIH#V;^x0DzS9Vo8>==eX;~S*q_MSMFL-2 z4jr9>JdzrSE5;!U@eP4%=I71JH1Lw%Q&$!i7Pd@wI-C|S00mKrG%R1nKh&8B)}lpt zDgNHT5%{#b1u3E*%p9ol(!baxXArgU;~OI;5f7{Jh!`^hqsuK=drG+N_b!||)^kLI zRlv-4j&sAq@a!|Fm9iY&(b@Ke8AQoLmtgW*q2lVg|8wDkGzxa0=6b=W63o4Sk%(Sr z_oXxH3(VCRN^%T=0J=g#OV-#9%Q6v?3(jS11D%eGPi38%!1*5! zJluUe+_Lt}_C7q^Vl~HVp&-tzw1p~ti|$M${m2N_GPlKf(3Kw9evXHGq6V~;m4QKz zha0Q1YYApN_WwuJSw~eBwOgO=&VzJ=bazXrbaw~{NOyO4N(zEBNOzZ%NOvDX0i^__ z<6FGneeeCtp#ukJpR>=}Ydv$$-~5mkVS5fJ0or%w{*Bhtyj@0xN6AvveD*7I6>KW( zAj|lQ7Q36VgLCcjlTgQXo*)2dDt#XQrC*jH;cqB$JD^Xmxg9Fu;Tf3N# zChCB7zvp6(0A-yg&hm)z=kCG0zE483%+!99Z%#Kxaa1ibE1Y+R5I31@X~^L+X9Di8 z>)_`5)Pj+*H)cST(D|d~So&X2#Vy7+X;D1$eFjk>lQrG9F&EYNEQYogOcg+UKIJ#` z1TBy>T3IVtsX?CvokPS1^W`DT5CdQ@Z2b+e--O(-Armrk-Sfwv18$jZ95UXWu<$1Z z%RRLj5sEqK&xaE6br$ElO;yc*$mt*g%~`{Ft4VmCFdY6E*B}{|t>yoBkXULFWe$TXneFB_o8gjoh76QkmBlJ36oO}7`k!&-q)xB}UPiHe)?X5j0R zOM5XZ)@{1(pyq7Cpf?Kf5EHRShcf32imH(so6 zhzixndsMA7aJ*=s2lnhYz<>8bDST5Eg%0rA+CGzqpI{O*`-1R>DFwuVx7qORxm>6T zXReU%rCn%KaW)5y6SNl=@v+DfbyTF_!3-b*-^dwP4*M4Vv51nfNhkC zCTT1>pDzWkEO+*In35%1kIMc8d+9W!E~?xYBED;5F+g-b3F^C;ESd(=#N*^GS}N6l zu7`>;;VC$T_^V+@FwKapvXsH=BgI*tTJ%W`a(@RGzg&hmykHz$hiQ&MKsn{~oIb93 zLHe^S)Vzi7@bDO?|IHLOs1F=&I;E=f`umPT#OsF-ERygdi5oK67?3}&Td?4X#-P_B z4Ymfo#mLq9$YGk`N#Hk~C&tP}F-52G%(+yO_2Q|``- z^I^ExDom9ASL?$SZ!=;Zy-)%~-gAL>z8%a9T%{2$(8oZE&e<-uf?Q-mjZ=ob;r?S+ zNs>3H)cZl;^q!omq;&P}uz~xVO@)o4PLIAP5Lnx@vaXv^7(#ts&6TO$|AzQE*Fx1o zOv;FzF8lR+eZOJ8iFu-d38euxWNqYpFt^iwq1*cprn=N}S}X!ZA@nbZG}Ha^4k1Ou zX2&offCNGV`$f=q(yck|?)%MSrRPu(Rp`}lnYyeQjZ1r|nb3w_uCN-maw7BLjR%E7 zFNB*vLx_z}U-a9?h4A;Xg_mOMmDi3N2PdNrs9m8js5m@riEwfzc`kNMU#_@Vl2g2L z+rc)MIVBFc!|5#{hNKABkeDMZiUV*-+Q)i6oxV)_t{=DEWrM+;OpI*E=X|H1nAqhqeX$LadYk(3;5 z;SQakV#h%$#jv?V`@Fn@)J_uMgb_k6K79mE-v%AM8hAjMkszSKA&4>$6<9M4c0q%C zk~BamhYX?&C*})W#3K`og+#_amttsFMMQA5tZnXl8tO>gpTaYv{M*SFRRtz4d6+y7 z;w8k)WTUn-6hx6`s@2{{#SjiknO6{lQ=xcJ-yud7$OhbKlzk*&mbRlJ-|cI}~G; z$^}r!WWNa`8x_jXX%(+TsjXfictZ3%d-<~{xz!7|E~`o76tv-2>UDwz@5euIL{yc+ zdd_r1T9kY1){02W)BjwYv=_X61ABq&lc8hMbsO|~&A5l3r0*IZ)bp|^RVfxTZuO@* zoM`x8q5Snem=W`tQ5mYY_B<9%ZtM_u(Jq)r&7-pjrh2Ox;U;BPwuDr2J>p~up^$@F zgfoWjN$aDnz4jV{PS2tj6<+voDgq+JM2ZHqe*sMKyzANtNJJx0IA?DP^I3x4!DC+a~jno+5;=%do%87WL zD?SePo-$Ng1=1wo;Q!Hkc6T%<^LsvNx9-hlm0VzJ&3@vxkZ(Yp$}1+pp+Ae1_0GPB znWGJ-8@>lL{RM4)7|*Kkz!rbk@#&wnwpHF-uZ)s6l|m>adMns2oO$;R&v61lxVqL3ju%t-&v@Ccpd6Qm9lLR7aTka zs#Gl{hT37JuP!dt9AKaE|4<-`xeJPTDcE35+-H5d-%k}Gu-M$&yMP`i;YGaldJewI zbhj@SRfQ6dRq`inpFSs6pX+>A9pGN5)1kjN#;#_MV`Uwf87Dy*$#&Jte}gl&W$?umvj(i&vUCk{L`E?w%wrDDU75`&@YDg=16jA^x#-M z2AN<|liNS{d`jqw6z3NHus)_hI{sh(SQMxcCghhKifNzM^Z|%*D{v#7oAtiS%`3;;5uCR zTl$f6<4p#IBHX$d7`a$6dG|87LnQ+Pg%L7_Vv5My|Hi05YOli<9|vP~*0i_3IggU2 zhY--JCk@jhDz!N6I?_^yB|0>?RIy0let%<&U6A06g~4-;qg z+o6lva}t>qnZ~Two0>p!o2Bg1-A!BjV6g3BRUm-Dh9x7%zRIQB99tf6s>h`bY3nwI z>LG{24|U<@RTb`V#o#I;cr|Qw4a&rdiSyiYuH+T|-Txyc@8n^>|4;h%TU*$7WbO&? zdb?$p>{K3rNr*W)P{mBadqj!aTYw5lN|M<8Uag8B4rSKR&(WBqSzQ8Ww4;T=H$@fU zGtv*YgtNTz1p^ zUi~QTJnH$^IQpX;xd~=9lwOI+8%yhm*ht5x)-MK8HXJM*(aRzB97P^$W=j!sksZyG zpV~q@m(HU%G?Hcx_)GH7qqs=_u>18lkb~XH7i`B$@=`V>S7tPV%GZJX3==QPkWuJD zVgGbme>#MD3IAA)?0Ya{glC`lwr#>ZRetNmLqX5p{gl6jt?Cr%w#)j%WE9^tvKt30 z9HLrp(?lj0GimK$tku?Bbh|t#q23d)VX}}MgG37ho&bj?45iQsH^#Hp7_`ble?|@C zco_s68!g=s?X{t0t=;lw7rt*eQ8&&YlyM|)k0?TAFs99BrLeQ@5E#ew?Ta%xkdA4XX!@;;{Im8S8>{J z?LSI)wgif5*(f)ZYH2obl}C@AFpgH~tfN_u=!x##e#g_1Zix6^`fT2{!o)-oo~lXF zG%2il_fK&P1azcnAKPm434-)-w2#k$1D;vhSHRomirJ}p?BiIuT%7gS3hi-uiq%ZA zX;4q3u;HhZp!@rOBpfe%*fpJJd)^FTz))I$fB2DxW2X?q!I(I(F0KsIFX^Z5X`7IT zV=R>wl`ciV(QY8VJ=_e8rU|dv|9Fjm*EaWoH$vXZpK6$W2-Y+Ev2eM@hiqDf@JD{(A7%9MUo0o z{3Vb`z=(mZGmm7SA-R)w@7?v5rCJnu39E^wn#7Ei-45+eXV1;0)7^NQM9&G~8FHq_ z?(VD26Lv?p99te3j#JTI;(iK(D2yx=-Hr@WZ?;p8`EsARYq^#qJYO;Eq%TRe zaB;9Y2b=&3X{+C8o6;0QowHdoc6N~5x6Xdv9eOwY?3d;shQL{QwKcp~8s&}DZ$it$ zT)H?&o$-j-J$I2>AVI*f+wjY7Z5cX#Ic*#joBM3Ryd-H)?zp&iozDY%CO*&Y%Er7TH6~wkPB~4n(Yu zSS~nBh>dS@8+#)nuM9%MmW1#0m+B&;&(w`dqXAn%lC^YLBRJ3J1t&<1qbI_Z|d&KqL7qDtbCt>Z)_imD2DF50p&2&xgBqXBy+ zRyuOF(J*n#(}jzb&nBw(tz-ne8@!ngZI=Ew$2lkn=WD+yR->S1XG$Xv=9(kyVHg|$ zJg6%1cpVD_Q3mALa5p3C6@#-CI=c0q3cFsKeDs%ykLt!f0dFgiJLVjFs@}tsH--Wu zqk^z(pinTkatl=uvM{6$ytsU~Mq+~ZY@DmWUJt2Dx??dGZII5k*C{$%;}*1eg>#An zm-P2=#*)Yga1rU9l)j5O2)BcTTWjy*N=Lg@{tagb= zL)3T%ydN~zJW^FS2CSd1HvQc?E2EVEs`A;WtNY(r(w|8)UK}`&K@oy$X<&Yj*O@Oa zC(VmBL{SI%ndOPv2&v*_ugS(DDTI0H_N71g69x0xCM0XT$FiN|&^xniRnWg>6$}vM zN3%q0cx>2`dMztO z^$7p6hW`dLP$)mCCrd3AvLqf4iUF^f!?$U)+a!aQTAkT+D;G+U z*+TIV3|~R}!#kdwEjgz4WYLT}My0q>cEfNDN|ntnC*DuyeIHCOZl{87qS$Q)q<1x` zKJ-2HSdgBdoZATba5=C|C!Jv7Dts1??nf`T`N!>bs;>MFW@8-`ZVEcXs;_?u>e#Iu zVhb4zc=E?&ruu6Bnghi}22m=83VMP9T@m-YMk8&=hd{$4Rri&NnUaDjG|$U`557;% zex~T}{ezR`eTZZkPOsu%Z*c7EoA)A?$v-Ls9@~QHHbC=GcSkCurQ6rRFTet9OV#P$ zSWv6jQ!!S8^mLo_0=w6%6e+P(^!#{Z0PjsB@+{sk#Gkdj8uTuAnyfJDP_>Aplcwk~ zh+BPpxI3R~sw!CncGLrGz6d~$%91$+^Py4(#Y{;O$pB|vWKxgArGocAGNl4HB46`L z;ErjygFND3%s=*rs#&B@cAZ{-zhrY;qWyh)uA%9N)C6S3`6>eeMqegGYTv`zY9kS} z_7U@HUw|`x4p*d1Uy!s|ZQ#K6kcsxL3 zF6jM|N}X45wc(rCN$)!kyy$a)Pxd1kYia@1bu#%bIyu1qlS`zidZ}54^Dd`a6HL4X z#Jt5BM=LfBm&fhhPu9HqE8tF%s4dyK>u){;i(3sR@GvnQBia&y=)gCf$d@~K2tQDu zo*$YM@JlDa(ywgyP_~=%Nr|>c5UW+p_S$5D+yDaPo}#AD`rXxu#yeyUZul`dz`j(N9*rKa z9@N2>$|X5LJ+J)15Q*5 z!+3}5uQwujUv1fja&tw0C~2MTJ{Gq9d2Lr@zbONgM}J?PUl*-{;MDE&FCxGodYNUl z!Ak2E1IJ!(Q^cK{hEf(LEq9~qNez70-gli<8?i*gMJ493v|z_#z*KUB7R92xdVS&< zX^>RrJyS-il*^jn{X%zo3lwM@a6X+$VN|J3b}q*R=gLJ#U|R;^#;i+VxwB2HF{a&7 zuGA<^xCCXh8yhty63@!W3zDyWD~z{69;Z+#V-+`;c=eDE7E7QNV{mpO@X7xO#1T8= znXq4YTk^$4ijJ-YZg%^78-SaWkNZ^<0xF*MuKoN-?AK&r7)RfS+a|dS1PbDzB><;n z1G&5v5J~kG*?86xllOFKIry&PExVHHehi21(9jx!evP69Fkl`E!!W3B1{@4FtBFr> zup~A5;Di0Q&c|KR1k}<~F927n0hfue)IFQ&WW?< zdH?hK$5~K&)o%{2x~a|I%4CFT?~f^%|9VtDoDRTMsTZ4t&2z?EG#)OXPJZ0gWB5A! zA&c9;7yw(iL?dbZ(cwIBspjGAfBhiW2XppD^3A~ec z9#oh_H~sBux=5Bhv>Wdn}Eh-Nh`GQs@8cv2l& zv>>D%q9IU+`eNBVhCnIB>Rwpz2iBCdyQN|q}@$q($3MTX6gyI|{ zVay0$5dVD8?U@RqMT;{Q#mR?CQ32uI!s2pvWS}y+#Q3FAC0}ZNul4gp{jY~|`2GmoC=@3s)cDl@vargaj>Gqh^+T7II}!GPBw%_bc+GKPiMefbJN7w1{sbKgr~E|3Jb`*>pnh|VQ98)47* zijJE*&#|}mLT}&wV1m$+eCex5<(hCq^NY}wWCMcFFzW3$z`kUL&><({@4y z__+gRzLMb1hIlfoGEir=tWQ=J1uZIGCP5`qt zW~g~d>V3h98tKn`JXRmjZohwdHsnYY5VAcx zT-HKiG@VM6R^?*ek_y$f$wZzJBx(d7&u#^(xJ=@{VJVR9WgB7>1tZTBEdB@p*R6X4 zqg2lF1w9F2c+*Z5D9Cy7t6-(E=+zn06;FZm4V zKSJz?XWIImzBP)XVQ3l6fQYha{Wr&-_DfF#*b)}9VE}FXSC|P$QV6yJ9jxq@p+p*Y z-)to+Xo-$PaL3MCn6}7#>j5 znxK?m^B~U`h!HFp7N${vkZ&JA6%>rV14=YSVk|qn6kx{9fmflEBW?{CnOBQdPbbX$ zzaJvfU$&2_qQeCO6CiKp>L`3!>cDFlQPHda%Jp)ZQp9$V=6$7#!w!*(iB;w)e%NP z5oj^ctdvu~OZIzM?+W|?`D9dQq=9G))HCD?EtEjxsNHTJ=*-L-AEOg*fP~LQ4~vS; z8Llj4P{gMbU)&%`4NeubwgVxwv6uP8v2ZGMt?lF@9!0w_ZA-JU4^oc0pt8s@QVP|a zD1s9dI*3UsV`w~@G3TrGs(!l=FDGO|gT7N{EvKB)9N`7t6TF7Lgn(X5Bw5%-1W3u$ z_#k>js~FlV@XUOj_uKQ5-P{E2e!B?A1Ta%xnskdknD&@+aF(Iw)0vV<5Ky!?x#n5#7EX~>ot(orEWFqsMYb=*n&f)LO7;m7ZvCE!bUn+&GWSu)tgUakFJ zR*cW&ETGRl7c}12YLD7Sq4FiC3v-)11XjiyDN);nv>zGvQ~8i}Lmqs~(e5?VSHtoN zDmbV7aQXd8pIX(_f*|9X44O$7;4#O$?rQGs%QW-(GZhYEuyeXOqB{&y>iCDTmsmXm z_^~#AkPP9f-g@ph_EQBeM8`2BSuw?q0a}~U#HKY$UYL}tcLD5iVykc`45Mz&Pteof z8W+v~;@CIa-DBH2IYrGR2jI~IIIjoO*Oro2LN8h4%p1*WVDP;%-8p!ed6JqfUz}fa zVL{=32U~jo-A0@hy9g2y)r1LDx27uO>9W+y0IwqMQ2{MZ?8pcH*=`h>`1jK?qRO~Q zfXz4u!yrG{xS1#Z+32^uoK+c%N>Gj9jj^4T(IW7VI%5VWT9_wSPGff&BDo_FRoK5G ziq}{OF%G(D;(VVbe!qPq+5!HM4T&v%LjRDpun0%`GYLSC`i>f4F>H?E(61w&?ilQH{XQ`!F{n zoUKyK$u%y@zPl}v1wmyX$lFtj{0WLpWkx=gBjCvFbV&Kd@bJq)xv@(>YH zItCFIp&SSqDW0^Z;;+awYg?yCb(=zzRD+rSwyu;c#WuzE>0 zl*PG){H?8P-(^x&-N`CASeluDnbAuTZTn9NSb+{FeigGx$ig(B4kwyCC34uFO-TC+ zX@A{+rSe^Y2i^O1)8MzPkESvbVx!!LD3LJl)rr`IdpXM1pauAi@J=>AJzs1od$y7% zL0Yzux=uX(_9j?o>d4>D$`UJVZPQEWMe=@_!Utf$iC`F5SZ1bc4)08aCS3Z}FN1XI z>k6Y3s~`^(!Hcj=A%z>HJ{%06G2UmAUn=T<8{!xRW^D{rW88j)teQ;th#_*Z`Aj2b zsBjyyFv9gyX|i8s|NX9hE3r+Trmn(s1oHtIR4mfmOlXpkX#-QTlh)c__LP|%0bD2R zHEBMn7-xihp}+SxwkZtGC^k{?>m64i4huD-G9>XB{rhv;80v~B&H{;=L1!T)T_rYO zeh{?Ir-c0GFEtlNJHDdw?TqaiJ1>cO80>aoaKuds0AnVh|yHJ;jY_35Ib#ozqf-%R{1vPe=sk((HE?h2oE`R5l2kv@%!hqb=)N8SGi&f2~l9!xw9mBv@8S{!aQ@%r@rJ({%=H;Nn_DSPCVe(g_wIu%7_u5BCPC&8eDqt0 zXz@I}KEis@7zW?@MPA^iPk$iyoSfucozCf9xC~qk@Bz6PSscpz;D3vK1!?8!%Vh`^{{ioumr<~aU_9(E@pgJ`xt9}jA2fFl@W9=26U+H(yG0jWs8UBk=5cEN76 zW099US>5-a+xis0P9161>(P^w6DKH&@+fu7WrUSPlJsA@yzP@2%P^TJIrscrBR>bL z^J2M+s=?C0DHrK%}3wsfhjt2D~Te(&vh5qRkJlw@C<=n zxArqRdj6M!ePs;4?I%e4B$KM(Qr*s{mHMB&$Pu|huCalCEXRJ)VV>QJx~7V@-D$bD zo-16Gd}dr{hd_fQO{hDwk>na&-Q2CWy{F|i5-^$#V8x`T`SCxT} z%ay<9xJcUc8X`W8qs&%~Wq2~)q&m}exQ`vKHy#oaw;um%G<+Im3}+)=fAk-W8QA?8 zFglz`_uBCG{4VqJ$X0Oj#sT_G7#Bhuj?Ho*kg zq|{ZB$j39qzCXOHv?}x4g!8_GDle>JxkuH9+dnV)4*`R}*z`W4*W!!exp~kz!Lsl-&y(lqr<ANs@MEl~KhF<%h4E+L5SdP#{7HA~iR&g_Td`hm&*F>M0?vEi2 zYb>C^ZH2?US8Mltiru05v~I=OE#Szj%_tP$=j4T{b4!ST@!U6TRu-pqI8%)0ZH$dn z`Bekel!?ZKpBMP0D_#_{G%Gh%o}kn$rZIn>=AAY?i#l$$mF%rm$mHaguMa^cln7w; z_iPCWF^0ux|0@$^^L;hZJ|!72(*BoJ zH!9r!_(bz&U`6?%!HEY+&Xv_M>mIU>{o~^^3^&mo+4PTVP7+Iv}(%=8>Xg=Q9PtNVZNGVq4B3u6V z?LQ#|0|KA$eAFw-R_Nye-)iK7{mlQMbiyd%Q1Q}e1{Tt~I9^6m_x27t@)bpD3BvRi z67TTePvln0@)%V6s za(j73lCnW-1jfyX*tDuJL8Zh)HKQoqAUM)9qTzizfEH)qE60IhGR4%dPt}L$-3=;U zboqc8oA*oHE5-y5o`itoLWIJ?f3aFF<$S9mLw;N6wX zQDa=pIB+>1sKtl11iwitAoJtRROEU{4t0t6U~3b4;#aqzUU2M_ZQq)l2XPMvEqF9q zkTKDGy4!s6dH^)IsF#EpWC-zkAM8MD$FJLKBT3{2fZOIRyl~*R0(Pfe|IUi;>uq#b zBR?T0D2z9cRn}_rigiQK<5*HXV9H*SrY1O|Txk6UW9MB_Qe{+rkCgASa5IfH-&ck~9n|~O0ws{&baVB;&p-xo5f$;9 zFo|(ezl&JF$r0q5+Wj_n4K`gz%2!nRs6#k#!>0ET=A)I5JCaq$>sw&*Nj#qYk#3o5 zR#T|C#oi!&<|oCT9k)`Baz0fp_o4Ho;?jdOwu#knI4e zRwElqAg=_`e99lK;Yc)LOYS?Dpq^w;f*I2C=QX?&P=emGje$VP%)k_{x&TD+{$#M| zrCC+^Ax3N_*CdF;yit=l${d1y30zExf~!;Uq}a=+!{fMTlIgNNB>L5vs#2Ha;W74}xOHyf~5_5ykIL z=fBLcW@NJs=`4eTW07^s<{({GZFhpjV&*6S(HU7234|bgEiQ41w6CDT2b_=Nclk5U z9=5=2tjI|%xdp`7l2XrEb!&sHlT1?O0|gMft#nG2b7_WW=^h{Qt>`>L>SF)coosZu zsbDN~S=oKdD+eJ}E2m=ga&E+FMXUwkPVmT)#w~~)yVpd}?_+XU^>`tlN4s8T*_TQv zn(rm$>I5J&MWVHHih7d%5FNQO5Vjr(@*W|vJT3iI9b!sXMymK}>3b>WYElAmBTlYW z9P5W>#G%i{)98~Y5txi1oZT{tk2lcVE}y>DR__-xJPUx}KbK*GqB>aU<>HvMR|bQF zr7T1#X-7N6{JIL*OyLSmI22~K4ua&nH~`@^2u3vX^w;m7tByTdAZ%5)hdg=kW~k zbLlrM$&$s7uLCb2Eu5W_v=$y2YZw08i8Vj~{|W_gRCddZv4ZCWB!3wA9-X4s*%x`i z!Fthd2@T@c7@IChi&v@^U>su3FLss%F9?hxB9v>Hg0{F;xFpQ~^coEp* z5NRp1R0XHIv;y`>Y?IM{w-@C$W!=edP$)tTSFZoE36)KZh(GEhzr@Q21QGR=a{5$; zCYs4xoezUC{BGym?(#KIAp570?;N zI!kNHYB7=&EN1Gnij#?~1cylRt_XEdlVb%G$kk*m#zZPYwmF%gMiH=vz!Y?uO|O#o z>3{%4^`IW6_kb~UajnEzxK~7NTjx zYBknzvd09=F=C1-$>dtY$di1L)&^jS%mtK~a12YM_8;3#oOU3}rZC(8`MkZ|UB2?> zT*S2>HfLShkX4^IDC`7Y`fDVbss@Y+5i`z~C4fxxkQnSN!$(3JR3z9ObT-iMwpBRH zhl(6>B3_7kF_S-OV^IJljCzSOM*HIK=%J6mty?gL*J99e& z0Mw}2&(WnHx0Z8ypmk~i3D5P`s}VCM)Y$ZXyM4$C#L{kHF;`CwX6~YiIr46I5+zzGn(f!y zKgJu~E3W}oraL2$YNUvXZrb`(zPU~Gha2gBK+Dsypsv&ywt&*q1(l*Rff4$zpNr)h z0tb_x=!r+ApVRB~;hE57{gI7N!q`q=z*d()(wthvy`*nHR7GVlr8*UWt&iX}}8Xa`J zu4@D2MXlUCD}7pj;hIK-JV_V+%rFTkSdR4CRb+ZI>axN3Gc#4Yqo35EP!2O&=`Ip8 z3@qw@?Z`v;&33otuxnTyE`5i-%&xoq?1u8^_9;-cw_dDA-$j~R8bpL_OIjaQcBP!Fc zK!7ns#8w0G%Xe0&`!>)S8fzf{Aw6^+v7u2))upPR%a;PrK@A& z*aM%|qw{_Y&(4lpKOQTkh-<PJu`!BMYlyUT1jTR~HQ!dA)3xF)8C{T@c<%Z8f5m{$SiJ?}VT@oB7j7_|2NNy;!O$ zOz_{m4^p)t0L|tlu%^2eUe9)_ejs4vpHu9N8IB97Y(_llw}uG0(2+KRNX*_Qap#Zy z;ThH5?tJEbM5!-6!8#yLZ(w)b?;1-&v~CWp1A5x8p2_gY^?lH(wv^k)YQK%1o+#0w zolzOG4EM#Y*7AR%s zKA!&3zpEpP$nQ`jElvOZ&U-(gT@&70>wPXE;nnsN)gRyV2fQyrRG|XD?ftJ8zcs2)#mR+SULhhO>AQPg zpPF4N>Q&E)nWX=*>ltuGf21j~+xlofUqPr7Z1xE}!?0Fhn_xKXz#fPhP*istJ%#ms7146S+!mgXWwS@A_lH)6PMF{1 zM@908BJ_u1$l|LIw9$IQX@%N{V2gM<$p2dJ?**y!b>8GYhBbA}AymQI{I_3CHpdR* zSDTMmNs4227hdv`v+21ci7q~s8Fy7o&&jk+@lxM~;RXYUHfI|pLZG7gyBLC@szTDQ z$;U}z*o$MkqgDGhfjGsA4qx76OiXB)aw0j2y~ai8M~5~1&PCf1nRRJN1&1eqH(ixB`0AR2b&H<7CMPrykT(L&i72 z;G$P@0wCXq>uewycM{3fUx>a#*2B>VkIg@Hlz_*g?N$==@ORki!k6MX1J3pLWy6Ej zuJn#}z~pi7a>j}zlxFwR)a^GS>`?wpP(UHEq516zs@w@+nO+B@ON}zMZWM^cXW=?I za`_ezPf!ig2%OGshx6m=wwVuO@qxto2KJvmY!55k9q`zV_)>*{`fm2K5wf;8 z&>+R_ywZ7X@EQVaRvKT=WteEwj4#Nz)nQXRej`Zu!Y2%rL1kyCVGh5gF46dYfcj(? zisT<6+yyUcFPK18@U{I?gmyg57V!dP7-Vl=09T)UyU?N*BANv+W!M_=xatTo2Q^GN zjp50Z&rsu|=cd0r_QAt=m&`~2NTw3N*Ci3+_F6{5Vtfdua5As9J4G);_41nQYF=V< z{q=)PH=^j}DUpl^Ixew|LfOiVsy9QhpLy+?rvnlM6%2d*2^00|QJ?|$0&ARbSm zwM5QUl$Eu

    K4ND&2ku>&xMdKjBe=@UeVgtx+SaHjWWBTBW;S8ABy4D%|Os=?8KtmTpZqOSn_tf8d%Eu?>yO*ou^MvoR5^jtbe~ zhD?J7%4%7Y;6v+R3rP?+rP%uCsw)vUbe)9EI7yimrs@GHQ+ok7*MK&vttKJbb#;o& zaKAfUDVoGdqW=&cV{XdlK&q{e&vvxjeNWJSwO@wGtJAC3Rg*6N2QIg>kd)RFY#TU(;Pi^7GJy{ZW$)?l=XUfF90IT=C=bnB0p;pV@)vuj!p>o=?QX9}@GlE`Fm#4UKo8jC*F1+g z4V?WC=yEIaMymv?w*d;jO|zC@DFhq|nQq;VZj)QuQv*7~V5$X*EU;~ZJ9BFY3+S(> zNPveO>9tE^fz3L`?hV;n6$YJ7;dbwH5B!s#^j3oKluOOMIrlwJd`0Y6 zoF6<0NwmYh^5n-A@xTBeCQ=_CY*RKvh};H~X=xl;Tg1plOjq5+tzrrtJEDpvU2bRh z?ty(dg&3NJd8cN%)NbxvRKx72`ovequVITez>>{|sE z@hW96HLX@K(36z@WRE>~gIOEsEUdHIfagSaXA z-U=FSuLaN66|C}EgLLkuK0Q} zC7)$Ymehd@qw3s|Raz56X>Rth9$?7My!>Q_1N^3}3}^ystN0s<&L%oAg}x zN=`7?5#QOK!}MTGp^O2G8b5#X<+G8;P+l@XbJ(n3v5 zFtN(@@9FMDNjC&hs4MWUitFGyJQ19eG~NsC@c> z>uVJj|3XN|952`4iqrG!yyXn}rIcH3G;O)muODn{dnc02o5q_U_-JmW)^lnCsPR zYOS@_F&$aR%1|r;6hyLgKMKEs)%XYE_iP4YTnP1>RQcn^@1j&GO_@CX{{4>6mI$OQ zJ~phuVbv~vWBk2ZlO6JpCT)Do;eWY3R8T1dz*?kg&9n2F__Y2CHS_Ij*f*6@p}!+4 zDvi4y8L)qwEtCU=7x^QNEL`c)bE?DrcbvKcVW*poz;{$~(dp11=<*zQZLr4#gdT2)pkUs%uX2R~m!nG-WyVod0>7!5_UD&u?|cL`1B) zUiUrc+wl3XdP(r(poA+g6+T#v{td=1O#S^0kCR+oQhVg_aRRv&Azcr*rB8;7K+%KY zGS>J03N87p`k-!5&o|h)1~{$Gs<|xoBvt5z9=8|vAAV&1ODkYg;Iq|!)8uGkT>RQx zv~|MTL|x_oK5fxh@Sf)lF78x4J2T>XB$$|3MBavzjAJ07)_9*^s(yRY$OdOLFkPtf zFcmp1kja?keL&&^d%r}+w5dCB=j{k^@?`tH8F*D^Y*#2Z$jtSMq=jUG!#Gp4sZhQ~ zV=@oXc_tcUPs)m3?;OY^sr=vCe9H6u0W{#hcWecwJ#_&2*YrLsDzJ!!szO>Ai5p~wHi$GYrlZA zYk|@S*pt(>whkfAlj*{}S4Y>9?#K59kR}ST*qPS<-fvLy=U-AUNtOJcr=VO?{sa7u(CiWb z*J<5eyarT(E09UAUnCMWu%KV<>FJ5VXMA7lqwBmkf&V?~|55do0aa~V+r*~3Q&PH9 zkOlz(X{5WA7U|k_gGi?!Qc8DAw}c?wEz;e56VE;Oy`O*hA-dOIYpyxRc*Yaw-vD`# zFE827>LvYu#IDJ+N^Q+XKb=H>twYU0r(v(m~+Zjbu=&ccmZ zBAo(ilZ!>(zu%Y&`H}-1hSvuTRYJ!=qWzU#u_xZ-IzerYpq8@x`Ntonn=7b+-tjmjkLhJHB)7r>$N$(GVEsq4mo50G-R%b(~a ziH&Wp^>R#r8v*p;oiQ`aA{ug23y9x`j-R}WB|6R-XXhCOlUARAw$BB%U5XenBL- zmegXhJL47O{E>2UGtfUCNxd_A=~^{o`*GpN{_tJvhvu8omJ@#S#d#hpWW!fq_N0#y2anfc zBe&Q4$#xfP@hs8j?ru1^+%DbZ`Z#U1rB>z;lL!UW^Pln>ivuUxZ7URRsfeZHjZiT6 z&b9va)y(#g*`odUKvIkaE&@uEjm!vVf&qI52x&ruU1uHIEC$y^leItEG=lInN^~js zS7X$!Ps88rOq_q*ZSNE3_w{DEUXO2<$e>;Op`w_<3m`T0w-Px<1 z$r4mx)8{$+{edBef%gq}Qgbtnb8TrOIh0SjGU4vlxkSat!5B^8{Whx0-t&0-17DkP+XP=w1a^9*)TtJ)w{yWB&JRMu>0IWcS!@uTmCQ z1qP^;&SM8S0p*9q`Ld-&tQCAJ-b`;A{}Y7*rG;$U8MV#?fhk4zw`e3dw*TBy@MF0Fd7GnVYmqEj ztJbtz6(t))WU&ED6DY80aG>Ck`zY|46q`;SztM4povg0+$CmIOd_ddV31X$SUWXhY z^sNXvAZoXqUY%`e$&Fy}TI)G@p@gpOvcqfelTgY94hvED|L$iS501)6iPa)eT`_9A zCfG%3zvL;#(NM6UR`bUSIj!<9P8zX>tO8DyVEhawI1SQZcb3wGLJmQ~gPYpJy#nA^ ztOJoFProo>hr);7_VeytWnaM#ILnvQ~Xu zIDglV|ERQh^xSB-*tBJt?im&s7l`_QLsee;ES+glTA*z7vzHPp51j-za%%Etm_fxV zGTBF-pz-SwF*ZiaA?x;9Q7?E($R*goJQmW6>=yzuGIB)Q+s;nmF!!t92wl}g z0s^RfA6zI*H7*^u*Y!^qpMO`9c)b+(vW{*F;mb9_7uX>ypy~Cnc@SzCkc+P!1Jj9o z-~_LBw3-UndK5ypBtF;f<`aAhvU}g>>9~xQ3SEjv823=yZLca_Qb?n zhrUuuU{HwmS#m62kx2<#HEg5Xvb=qcew`3+i05^gVP=_&H0Q|Y&QMthfQY*v#PYr% zVNnG24xUWgkaC$q4#KYXmpyiATudUM>DY(w#s!{7g;JFROL;h=YT4MY9Su)Jn=6XZ zW!MF3mP==OY{vv#b|BTZGgGJCMC#Ll&p)0yr8^ym#s=)65^;#W5b+vLtZuNGa>c62 z=F;N8<~AAa=|*!`&f2}<?s)V<5XZ0hk84yXd7Epq32f)xBV6}) zrNEiBQF3gO!23o&?O7SE&av&D0i-e=h*4A$@I5c?gEq>UXKg6fosoxk#;stT{oI^Y zG)b;kLeo~*8UFwl5UO9*`Tt#{TTx`peHO=}hWsaTqrT-{($m4lou>p@xm`V`u9= zNdik5V=ODZm7);Xu)yXnfW)cw#t>|;bQ;`#z+T^;Q9t^N-s(zISotyc=t{=qy?k1j_Fc z7~^KV#%bqCYuWw3WD@*$k8fjwOw_xe@{jzfcHKjH?z&6LV8Y138*siiC{JJF@I6zZ zL^tu>43t%iT}Z*ug#Zf-^*e*qNj31X9fP6#jQrvlCcl4{F)5}6Nj#C6`|o)LUJPt1 zu=5}yD^5T6uPz5epM1bnL?y_Pj{JD~OKbcEAM7c_Edd~2+*8M7{hpdl=g4DjF7Nft zFTbj9IrJa$z148u^!??A*3v$9Rg?Mm6#V=)bGAp(`FQ2x{U%3{BkaUpN=1> zKdA#r+YiMu{RT$>;p&@Ye&MT|XtJ(B(mBbvA(3u9E* zcIc_w%^8$M2-GC^TyNUAP5wx~8|vLk{Nd3PJtv7lcHenymilHx-reU{c@2sNOd_~8 zldIZ&UhhlC9*4Z|nn0zONI42ZEKfRnh=3rSa!l;umKJdzX#eu=fCHgUz%IvdK7YT_ z!;dk_zsW3J`cc*t-3+q>a8ELsXu_&%2`1DuyJ^{ z^{}*qW#QY4}OznQ@ z@Qi-A{g5W@dtpMyp>buhw8wi<(-p{_h{$}|L6UiElE(~bA zZiGT3fX}NM;PIx&yACZ~L9a!9t`nFwi~B0DY;MoSP{AR07ziWQ{T8JY5LBG!6Sy~? z<%23O_1)IK&CZlVMUmr*Fa0n#A&pjdKk6&n=9GbitM2z8cIG5w?AhO_0BHD!4M4BOK#O$IfJwf)p1 z@C_8-jGupS^Hu^Lq`%9)PtNQXB;p|X%f?cqURw2asTpG$or16Zssea=S4c4X0AVag zZ{ag}VA`wL++;#NAY`+1ykziPeK3h_BPH5EuxCjW^&qTIcbb;D*YDx3t_Vai(Q77h zy)IId-ih)%6j@!sT2oonInlXZ6AG=g8lk{r5a0rvm+a0bVGo+Kq=#j%K?<|0m{Prq zl^bjoBYi0_Nibh%vjZaLq)x%p262D5d~mV}PH2)b!L7hPu3xV6&e@f6lW)@0D{cM? zr>os$jlOp{5@N2Pyrq7}6pUs?rGjDF8zb@S+e7~wALXALgBLR_M?_u;eOXM^u#@54n+C#{;^Qy&b#7xQt&RHb) z<<1PBO(R%rD3Z2MR_s0tx$Pqpm;mxjlofvj2@gHPN(#fgls=1lU^eyiPj+@7873gV z^e@&bqX1cMq0>BcTZdOwBckzKC8R=*hxaYX5TxPsy5zbL4z4mzTnG5?$yp9dt_o$C1AdOkVX=^~ZAV)}m8ATSCYts}%-4;x;0M>@@&vstt|CmU8 z8)yne_g-$eVFO}ELR!4D6dNGy{z%+DH>a1j>J>q>jdQtp&DJc{kxD#{bI^6E5KN}B z1SVpY^zL3HsLiI2l|Ht><1rKy*INs`*9ef{HY`ME>COj4tjgx4H}evW4JSjhBR}YR z1EO-!5*ZV&lT5YS=OQu=!=VppqWZ(|tyB&*1879ZYxw?V$i)({e%OnYvI?Cc7+2JV zd|qdvxDJCqfpvko@Zm#%nqf1i)5FKpy*lT5vL#1uE+X8fa(@Cmr0$XrTE=W=-j^~| znygzt_f53|>Rws6br4EU|7e4!LT#nI6p~d*J`%S&g>_42LOuoDig&ul_qW(t0|Erw zLYuPfo%C=`DKykQZ$G~X-#uRd21VXWK)h{SmzkvjitZ^;^-j8=OIbjkS_$}E6C#oF zSq8eoIcRmSP(?7}z99UG7QlrjWz`-4pCNgnj`{N?gFNbJXC`M3p95Mx@^8A}$g30u zmfxNg1mVZ4-DpQLT;G*z)mDCAC68yV^iGytxB}Yb&)&nAD=-s~+vS7#hIpkcVJ5xI zVHMow7Fwr|AI5FpPkjctCrp_b5l!1p}e3g??8KFB7L&}m1umuh23P!f+5H%=!6yR#!Dc>cve?I#=v(+QMNWv%U5Az3=Np@(PuVPGMNmQpw6KC4wh(6nhy<2B~Sbnt*joAJ; zPpwXGghfjTt9;z-@kAQ+t9rrj_seY-J5y!+UdaYGTqt8`=-vIGUZ!k0~~p z?_i1KKYW>knWf){=dwSaiu?3so1Dn)AFR%7gqHT+UfC#pEet4{{ofk` z*LFJbaW%YW_Ve}4WH`NxobND~(m|y$Xl1C6vgRif@70&{1T*>Nh)CYOe zV3(YagzA#+ck@ikN{tSeo7halYlZPiJ*;heQ1ZY1sK6a;{Au1aAWs2Hp{D{E^I!AW zMq7?{22bwSJC$@*g`!(Lb3puIW)?*dw^(5iZl|>EdCdkMG+lr!kp_ggW*Lo!hFom) zlKQ*%6?Xx@;ZE#VXvJYCrm`y7xde+sd}6Yf8sLSL()n?`qF4@F?mu2d{m>SnE-19l zrkuRKKGOq%xmE67@MH=jEO3Z$oK!gV2&ge}T@Za|M+1pxDPn%DV-uS~QKpB3I%<&* zBlA5w?B9Y}&{~U+K))CCqt%xMP)*74p`@V(5kKZAQ$uBcnj3z@mnNL9i%es+*2fQ{LMqH`U!WHY)pDg{#wQ9;q(nxwSi zKh-2?wF255s@H%>k?^GBB5~&z6I?4YBO5jP9UVxVP~v?-#?LBWWx1CJaO{djvqWqj zTO5JOk~!9MREo{L>g&%#%Z%QAuMkD%vqZL>IeP^bm5Tdr8{V=~=cOaXm|B-TL7!db ze;a+3lXSQ)r<9+;N-#{56>BF(n~v;Pm4rZYGErXh;>Ex4TRjeg$+=7C}_COo>Su^0&}OEnNN_o-ax>F-ZS{pEa{GUan&IEpEnV_~oHYq@Jo z@fRBNcoE<~l^FxhMtT$!ZSZIc@KZ6ekJ|$%o>*A5cpEi=WJgK}qZEAv^-1 zl9OCY1_Op8xa3UVUrylAE7_XGYyIAL$q@01WWx3<=k8F)T-}zp7%+Ev6Co2F!Kqxw zf+Qxg1{{K`Jx)lHd&Y;UW1-1Y&gaW+CZ6(AD2zeq2F3{O7OC6~Nf>P9f~U>@ZLWIk zh_A>}`0W@#s&NK9QKh3wmkuWKz`!xrn?Rqlxw;2gV2hOvK*LB0R8M~))TcR`B|G## zO%&5(@_-6*Ch^0&-i#bR#BK7613ib4&`I5S5r=sCZtZ8F<-c7|%Gr}+@oyY07=cUT z{4>IoS}?ZWKS$R|!TYX;@m~yZUs7DKZeNm{xEBbPF_273h?v{zmWBxgOSsH*5!a$x zrAE^0V!MBCg|Yws&Sq(^j z;7(^X=|vrZih!1HmisKQ8I|x=S+l;DL&Uk(Uwjmf7GRac^;hcowp+^;Q?{JVW+Zt9 z#WuQG7N5MGQ<0{Qsh{!NPQQ%_E9=@p{{)%h<+kq(k?tzIIvy+{9}|kA_54#oXp>`{ z$y1Mr}Yl`>X>jXqvPf9?^dinF-vgHZ*iBX2~=O1^2|+eH>y zi#K8-_y+=sZ9WKX>qm1rT+b48{`1hYFFn>P{SLPpRA_VsuYOqbyQ_Z*3uXT=5a|y< zGNy8IYSaZpQPHwO?F!iDz4TB5Tvr9e%3RqSBt3fWm;CK|O^z$D{M>)4radaK;bG#= zz`QBhxS`PnErLd>SbI#$)>n(3ySe(%RSZm2qEGcZV%fFW)6vn!u7G!a6L+xenY2tb zXlfw!`CuwnaemCoZ|ETZ*6``U_R@FEnzyf++e8KYquhWc94}cjgOYx7XyZf?UJ8Z* zaSJfsLB?rqSm@r7E5H_~fym<03-HyuqGH3oyadicoNXtbk~ql9$c0XSR^0F?CQ$IQ zqp&}nNjNyE1qt9 zL1r)Nq?xb6pGhADAb72w>pkcPyt45eDXk$5MDs>35JN;J%Y}Rzj0OCd+t1s!+!Q@` zpThwsoe#F2rLkXV1p;6`76OS%$VYk?<)I*2=eK0iRJ@O%CGQxPxjphK5!-WUoz=K= zNG8uMrMfWx=j%$&RxsN)d7^bCdyJE#UT$_H#F>KR_M_q}qs#5~@U3x^O5k0f8fr8`{)l zHGK5+1b37?33s{Z@&~^aV)W*e6HNsuz3EX9;J;c6sQfjGkUrULIyD z?tyz^I*{<>R@~|1_-qd$gXH-v5fIc%83m5HKs8Zk@a=4^SYqaY*ZK+ly0 z#3sxyU>+19UPui#pF#=B!!E7Td8@rCqad?1P7~I+c+jLdw>`-afG_&G*s@hcD(OTj zT%Xm)FUa*O%ncNW%syb010Yu%5QL?u`IK?LmXFG87EEPQoSP%rjanIsOo66A?)5j{ zbuMqCIs;n><@Tnc0&^$AV;G(a2{t}*Yiaw!k0iw+bevmdX$~W>L^>Y9KF?*vKl2`l zkLi$9fe3HD&?z+bVU;!|p<-==vf?wa^pi1Y(sZ3Fr{>4hKrO%LGUJzn3p42?l|$sS zB7$*2c7K!1CiHai4}l z@EPvH5=jjEqe2`?O?FoSLEng3YJXnEqR;w#pI#1^At3v6@;{d`E&lg1luPuK%|#~E zHL}H@-Lh>PdRpilp?v({hCbf;`)c3OU z$(*hKOkZ}v$yDOwEqTg%`Q_KwJL>lk2$w_;^085A63Ci;`7Wfzi(_=X-_C+%=@*ws z$;0Cm$m>Gz5uSP+@&Ut4k1#|QFdHn{HPK0XX6!{ap|Eo74Ng$!buw|E9yUmbTA7hJat zj$Or4em9n~C#ODYiz4}?4*WNTw<8vs@EMt-C|bf_6HFo-)f#<&{{HsTuhduv#D(Ewm~p0rj=`in~ikHPAl8DU+tuo@v?-&GBORNR*hET@YS zYlLi%wdkkH-~64QVw*fd0PyxAl}0WHqUkL)2-bVEc;uI7TrT_iW4{xrGwpL_9>Sc2 zZ8VYOB$rQ(DHd^h;Huv+C@(4{voGXUT2!gd)#eEXrZ{v&%Eo3@#T>lLH{VU#28!6@ zb-BG2t-QfVMr5cwJab^48_^Es*k_OMfL7cy)t#M6G$S0E>j9|3&u*~ z{EO|3XVoc@)4H$W=FB~VzMfSJKZDXdb|)dX>3D&k1aKWgcHA%bh9ftHg#E~Dilv=Y zoXD1-=6^c~c_|{`c}mLQqy5zTdH`aWs4>r3)-1v+n#t^z7W1# z(d;o^$xwyyr$)y4ExGbOB&|INMURfnK8+WpNHP8AN783XX7rOQ!lU<7E5av#snN%i?zT_SlEDmddVNrZp$FQ?w zFmIvCc-*fU7gZ=fO(pPHISiL3e&Duz^$Mut3SNI}b$Tm3SDR_ky8o0}ot}kkkj+Dn zCqjMA-IU>}KIr+rAHD$w>~f&kvwTxksgWno9)Zua{S~Rtk>BH(KS@WA;hjmQkk&^C z=38R-)rBd(D`^-F#6l=>5Bmg({Sr9l+uDM2Y?}2~_HHt@V*k#6kXgV@B8zZCHJrpC zQyPcD*8C2oBy{R29{y}cHbF=I0XUuZfBay4dDx?QT`KWpFn)Ha`AXZoIbV5+PU2Y~ z#bl`gi7(a5-$@pd^mY@47$7EwKi|P!ff=}LM#{sa>Cul$;QM1sF7Nz8x-Ue}76uL! z6Y>G9pBeLmuy>zFgRaA!5gZ#KKckNnt8UVXtB^h6WL;Og_$3T~e0|+pC>83bLz07R zwexm4fq|zl9?==;%daP5zGyag6mca}Kt8GlxC;hqvE_B^fL_G?#9YKV!3|ffs3U%^ zFpjk0oO9ecE4nS70Wq;Xxe1K=2>Sa%*Exex^PYLRN|>N3HwkC?XuWrNLF&L6f#|GsfzWo$XL=~C!zQJ9I4T7(EyHRj| z_XqNZ4pd-?@2fara#lz+(E=<$a3|da6nK}b|N7cc8 zaOL)U>ejJK#~_w8*gSb2LxY`xtl#Qw6lDq(ZyY<1=YD1gQ~gTK7iW*z+^-GN{| zLBoiyueCi6p!7a7cBBYY6-#IcyYFc_KO1|-66hSghDcqgBcM&#Fi1WR_mP%?7kzQx zESaU^XkTFDH@P%C{Zkjz6SKhDtVFB?Y#b5=t2Uk( zB3z4?)o7I|r+ifDU-8ZQiLLj!-uLOZmx;`+#F5ctL?_mQ>`x<7p1Xt+uPtwNjAO=L z$x^=IMpnLR`sq?n39CX9^Q4L1|E-ESH1uMzr9g6=OM?Wk#~8^MFOQ!13AjDTyS(^& zloUU1t)#KWB9fExvHHGWMz&HZTEjPQgQv)1sWW-36+~Z8<~_swzYRmL$2TldrGE zP}Qe!SeLi6ao}Kg>xo0yaTTe^XyiACS-)-&DC)p#$H~7 z@I$kQ-lgx*ra3m3!1#>wy_4VeamtDZ6ePt}!b#^IdWYj2&t{(ntaG&@9w5La!ZuEX zKAx|X3H50IMW@25S$vqf$PWPPTPQbA^)e>UNr&0Z=8tsFDno<96XZ4_y>jE{ z9wZY*U?dljgLc6FzTxPBGT>#-08GS3lf!%kE3p(_AZOq812+a7jga4Ky4#w7 z)YhNSG(Hvz>zfbuhr2T@WBy>5W?5*ydKonX3%?W5OaEo+^9d8^TBapnDnlv#G87E8 z`OI-}tlu8GKHPhWIM4X>%?YKY4mjSpu9rLeH>y2;sLNx+x2bn{bMWm2OQmFR#%c}F z_(ixg?kb{jFjgkrU4PpmsqI@u5M{&VXtP1{(S2(0GM+xCMd7FO-!fqO1!s4~0w@4yye!6ZZ<0weufbNt-B@doB zMnzh@r;?COzTS?l6cf^-K)f)R^aN+ESs^)=ZqH%9o=g9U?#*A`gK;nz`pF@e$wYe> zp+9-<-Q8rUsd)Mi84BjHzZbXG7dtu`iIje*)~%U0#lOFC5NdiSpkA<_0Ks@!@Q3Lu z@(1>ttxt;8X1#t1LT=2YqRm{tic^gm93^f~1i-MHAt2@LelRo*cuYD=hUp&Li{i9} zf=HyQo+IVmv4`NpE8ym7JUie3TTQ>ov!4gTFh~92kr)9=oyGWwAA1|b zk(&8B;b=yOS$W9+1y#wgRcPYL#H;zbhBLRUJ4514Az4Ch$#k}r>4KKEv!K>V_q@pB zNbQYcG}GIY{ESInuTyn?m=?;phoyE4z4R77;i`D>j2*a9U~9g zlN_|4KtKw=Yvr*D2q7R$l4g+kt{6Fp1hT)_!m^Z{%wcr=pk=sg9`*|SLrcL9jpGSdBsk{F)(%IY-lHs%i6+g6JERR5i>fr~M3j%C3HJVeXfOy~j&@@{d4S9_0%0m3 z+bxB0MK?tM1U~NrAE@E2igt%IA}7eLr$zIU9xek&-Ly0fMg;AYSPF23HUX_|K6no4 z)Lbqp>5sOe^!M%W-50>zjF(O+WBRMe157%Y&KR3w6~AsNfxlPfJ91k*JzS9*2b7gp zyAqYZhTb2oO5^>G;P&{}3*aH;#OHQ!=N8zKE8fz+U8S@c2Sb;;%+C6x4PaW%>vMb5 zoAg@AuctYqtNr)=tSZj-bVY8Fe#1LV_;w+>W1j}6wUF1J02?s%?Nlk7OR>5gAS@OA z@>m1$?N-MkrtsQdv&8)D0dD~BAghmytT7*?UZkl!>@Nsim3jkj!*}-JfgKz4x)CBQ z`S=#{9l8|6u-{fVpkt3`@ds_W{P%5T20>c0Q*Y2QjcnLSY(tuCU3zTMCbbm4$dM(yzF z4A0OmS4P@nL2MLY&iS@8ACYcuaa`c;DMK$q;~IifApzh$Q+u>La1{Rn(DUssG3e%V zJ>Yb_f)s$rIC}?t-MJ}*Ws~So5B`{@p94zSuD=n>qUk7sObmHH`OedzC|M8yf@|VF z=&SrmH1G0gExpA+pjT`tfzw3N6uzyp$X630OyLg*AVSsZaE-8H?rCS{EiEmA2JQqi zuq&ZbN?q|80LUANz+7A5hJ%8l}`DWYT zHcR4lEU3ckqoD8X4WNerZn~B7%Xr8gkbWtp^ZA9Psthr&bps?0co%&1h{(#J5(k0+ z={Wjq5^%tz0!l^Cn{ctX=fsUk{g}X4AQb;#d3%-_5S;RZ(TE0O*?nIRQliJuf z`c*?Dm*Ns|byJMHMFgJklW=L0-4O)c(*_l$!NeVxF(eO2#6G76peEG^Tu(isL$YV~ zJV<-H7HqSLwoq&v?)JAFn zi)pqEfbSHwgsHaCV)L7sHoM^vMMD%{v}@~GT1MnH73pxm>;wB#42U^qzirw16?pG> z@;DAI@IgPo&A`beSflBCw4S)!F5@(i5oqH4937C&ORJs#A{-YN#w>$p(PXz{j@NZp zyC}eF0J(>2cDspYIUKp|124sCIlMm-@0Vi?`F40?z_r-8nFR{wZ>8?UT^F#392A7A z00Lx{$VkFCT1IJYRvjhGFogJSf>68tg{G~t*fGte$8L7}u^xCoG$gW|D1G(4rGuoA zeLRjfc|*Wn-$7MI0HBOh1_UGfbxYTtj#Fh~{fo1Hbb?afeQSQKA#5Q*!hd}F9*dFi zW4ED6ihz0DSXqjJ*>K)XL0DjGvcd-kiX#Yuky!*B(GeheJ#5XjumtY8*x2x~?9H;k z?>#P`gvWB-)}6@CHP943U<{oULQ1E2?av;_rm5%Lp%4k~1~Dq~sEKIl#BZ@jBnoP* zxT`6kZVU}rgvYXZxWAJY>^i_ibskS`J!81LJsBx>99No9&h~B7H~PkOG>WqGK~>xa zrUeNrLxmfb?#<6Hay@T+9;ZG;kDUMl%t&U_URj;Vb_euTIzKfToa*-8oEvLSP104= zh=&3*gO?M70<-*=Ul{wxmq%#V7fVlgomMr^cUrJ(0#WdE6$~$yv-Eng$YE~}Nxg+` z9d$ilbLiJ&FT)(-x938zcBYK{*d|~xwbw$EP>*S&D1qOay6zd$7S^pO<`9lDjuNRM z+qV#3%w-Fi7Z)JdvpZ!|oSe(?j(1#2nrfa3dO%GfKz)ZWfa(5Q2KEeTDU?<=CgnSl ziu(3c8KuNMnh--0Dx-=m^w~4uHbJu#da!x8(rF>!{cv~~_JsTq%UTwN+~S?gKXa|8 z_`SbSFjVG)x6JpL3K5+&XFB~Er#2S=N5je&@mIfFVICMRbf7-)&z+7|Ma~Bn(6*~z z-<|!zlIE!c3gcH2(|xAftrDhww_`6c^jJVV4vZlw#AhX#vI&$1dcN3VH$xW=uwoG) z3O*l1f1qBtc7@@}^Ja@@otKLNp=emF*BB(+ zFY2q1Z@b(GmV`#J4h>*A7C0T9FtI8wvy#AMW;|&Gzl?2JJRO`#>R@m$g8jtcBMr9e z;{g(XftfXvO{j@%w)l(eJX_RiZ6k9b2-CM$6sR72&Sw~7enyW_G%flnr^m)p%68q# z$dSegd+4KR*vwWFdr^H(o!br_m4Hcrfw<(fnZcJRB=zCy!tE@#lknT7+`602;m&3F zduTdQH0wd~S7Zqm>8)qLPGDFoBoQqBfpl?fm|Gj&`MEA2t;->M`*%qC!y%CG&8C=rpqqLSf;9q|kB+5?}}6K>lOx_xtN_-eM-V9Xx0v`ou+yD)Q3}&IOKdByRl8 z;G5_ffi*gTJXQd&6J`&$LOc$>^4~GX4R%n9{W)8Lw$hfFV)X4 z2rYt{)MqQWB__n14rZMFyE}R-l$MC|hx z%wY#Nz zs=Ps>aq^c-PESa)MaiGQgpI<0dia%p8otel2}isf6=4*Q>R~8Da4q z{l8&+RumZgDJ^EkGwfMKqgrbdD}bkOs${M+*-+9ZA;D$GZ_soOac-oq;IcWE^=Tvi zrbW3?QWU#=GBPL!hnOB{O{cJzA^`o9BL+`sI1R#8!||~+P}TCIIAj2exi8i%Y( zt}8p(#3phU=zIN<1KCgCAN_oMY=3*WAOz3_x~#HG(5>9xLDgevQWK2I*wNKWEtGBL z3N(Z0f3GWkb~M0^<#lo^oj@dF>xOI@Bj46v8DTQ@`9p zVIwCxfS`Z?xq{y)mk$NW*upd`qYM^p#3PE>-}%$sB9e&ae^o57BaeqY!#+wBy3k9|Iz*HH7o+ zTK5TNZO!ktzc=9TeOM-WMB}=Api>i^=4?$2$`rBti)T1?bKos;#3l}EJ2_0Uci}2! zotwP|2K5v%ZJ%fhc1dcjp%rnHL}qg*aC2$B1};Dhurc&}uuCX{t70>mW2t@}LHa=< zc|V+J@>%vDcp^e(1V#YsS6G_Uv{#$=vy!iCtUee{KV>b$)0*7|N9n&z5g-f%=V16v z%#eA~q7M34j+CI1T~qf^ESow#nGeYMntcAA^^CSM>}+3TY2_Dm6UMV+D78ta?ZGVc zrXhD_^M}=Rp~1k|$+H)szkXuNehhCbC6RE_Diyx`4zetFk>JmJqGbc9PxV$dhC$-_ z#&Bj@;O22U#x&pv95)Z$A#VhHL6?CGQ8A2=RsQaEVb82zUoKmwO0;!_EIz69-JwgO zuTJ>E@;54hzluy-zEdRS-o{|EbBDiHPP6bxhVNPr&t@>SK(WPO@otMShm6kVkkbsd z!bn#4G`Z^cOryYg#j_NgYFlEIwY{Xfw>510+c=ff&y}4j$#HZ(AWauEJvu-$9opin3VEb^% z??Dw?n{ZhzY9VndH{BY4tIR$ybjs72uV1vx{q-z+a4MyH3-ow% zr1F3M)qXw7OB_*Q)3fwC$y@-L*SS%pKxRtG1lJ#E1aN-7GHktthG5<$kE>Hyt}RSO zl729WL_-i+xjIRfq_&=`jdC|z3C3VU2i?1(}YWHHyA-{;gPsDrGh3&vv z`t+>^2hYglVxqs+KbY!&Wowe+B6T^z&7mUzrbnEuvcdB%3`M=%%jNh6Is zQZ|*i4G{u`UM^J}{HZlCDmKyh-SoeoN*w|=PHIG#=?vuG{tAf$G#qQFA966bjXB*- zE-3^Y!^h_qH`|^Y(OwKB-moqu4p^5yHvW$n{Li*W{5TmQo>;M>aX2W{_=_ECAshgo zsk*1Ifz$|=8RKq$q3QqJ8c9^xI+8jdxZnY{OyMHldBu~W9>?aJHZpl2l|}9jSTb5q zmzzLLE(DxbRe&?6v@#!<$Gr0erET+_&xEiH2>fOQx|7dLq-?spMWLmCVx9;M*>Nh} z-(D5z*1TQc+tZEs<#n;|6cFIgYu<+qq&9r1UxDgi{FC2(f7TE9Vw%H@medBp+-bLB z|McNzS1nQ7+3N6odTO4eC^wB9s6F(4D1b4=Iqcl>otU4>f55=nVLeh$Per5c+8!`y{wu z6=uEpK>MZwz~OGkM8w+>;5OEsa&mlZx>!Kug~s8OR9e#c7<6SDPbZh&v;UQriL0oD5?Y{Es*mz>`GC z^*@~dAd>>tym`!~6Xwgtj?|)$FOyyOW`X#{=LK*uCct{i36eI_=O$}Z;AvLd&GCQZ z;e2nxTL2hpUn!7~i#;z7sTGXrs-I6)n8|Y4n>5oVvZA6NR$2_I0f~z>Py}tBa~8&_ z;jEF_{b0C)e;*3eZUZ|AM?ZdPV{PtFm3=z(e>U#`2zJ4PS+?KJb}IgFIv+?+58;Jv2J^^~op3j8%8{560rOkZ4IUiJ|KLs&v7@(E<(Pf0TC;QV5g z2!N=4Vp6AnG-y2apCY8tQ{lTM{g#c>h8GQ&TLa`N+(v+Wj`D_}!Z+b$Ya~)a6o~6m zDgPjCz{>~^Co-wa%+e{QX~e`W;{TD5IF1HVDTN1Cok|t(t#8MqzvSHiLrM7OONt9f zQN0kUJJbd90~K^O+oCmM^07y!;&xO~c69CpkOT4)+{tZV5{NQ^hJwY>oI3qE7RVu} zDLrn^_lf{V9m3AG8Q`xAats4Pi70f7VP!Tm1f8u{yTT=9-ES`|hA?O=9rd3<_0aCQqqcyhf4@u49%z!*+hITHRa;9OItH%7N|E(uJN%FM z7If&%wAi1s^oTP6-bj7uh@*kP49AGPJWq<42`dn#(LBlk#6!HmKoD+Z!mwR{5j-{= zsUv`$J%W>c0*BrKvoL13pTw@#@qn{QYjtQZ0fi=UX_5tie@(+W%B6t>CE`>9Iu9HP zgJkuJwYg9TI|bbxOjJ6AqQ&ch4oC-c>wqUm}22seW5uI_Fw6w*_9tkUMDuN^msNRCuC2a{vj z_3Op6385os1hCDg7<|_#tL)$&%pi z+0;J+h<`V83&_0XyeXMCIHT{&p#gBiIj1|n6q*a(9X|Li+W~jH5;2NW3o>_894KPv zs3EKmObA=gi6>(MZ38}SLlLs&;oq{G^Xj}#0lhiTu~W|`9LnwMF~8ZDFO;zd`L2NHu|l0pV!JXXT6gF7&jyu^8;xR zLz}L#K<9K&F99#)&=Xi?GOzjLMV%3ITW8a@jYoTAvSrJd4`=8^Sw|sAkt5dp|7!;V zXB&3S!a8HI8u_f^+0P|GFM^EAwyv*;^qTCP6?MP5WU|BYFtlB+faK;2#y9j7Zu354 zQv?W}myjZB0o|T}w!&u5t^1K?a}m&@(euOoSbM)c+Wr-zNAi1(%~aalGCWx=JwLDF zE(#xLf=myJ!&_=L`FGzWIcZz8>Gx*o7MVr(Pec=QNnV>~?#A&|NU)sQmJhh^`t#)} zrcZVmn&Od_Z8~X(w@-Zc^V1Py_{8ZXiHzqJuQ+tVS7*|>)TR5K{(LxXx}LvcBKfMh z0+WCB$DaRq-I6a$ukGnzV^qBDQ2O*?lGM3MxZzRV>00hwdF-sIef- zyk=&)TYf0`tZj~T!iFm!QJEM87u_>hHP)?AuubT#3J&YY3Xkwmz2?i*3ND8eUFvAW z68%FjgC7wgg6&9%H7j5o^qCX(HKI9BAkkc0z;dgw$1$=6+^vc1;E(j!R9WxX2%?d7 zYa+XX|E&Y`a2%VQ{!IS*ZLCBMBg$2Xvb#Z$2AQC^KHp>cXdHvS9p>Z(qN$YPy`$gI zYW*I~8GH{29!g0^`XNizMGQ#4=-kYi?f!S)hw9;|9I4lJ{3Z$XH$#&~eELp&742yu z48!b#SD?#E z96ApGtUo`SD@->w)`?hB)wq7`#zhmdp^{Y|6r;~fl`ZN10FLD7!%>8tUzM=_eZ?MY zP2@-AH3rj{&S_yTQ*+Zdbu2?T_vMG+pZEwMFRM4c4~G-T{q?^kAw&$$J{}J3K5qw| zI=t=f22C(rhHrB?|HB(v+1m1V@Y*kd%3Cn8BD@Crtn%qRj?$f1Al=F?Lng8@W6A%t zw9-KIz3XWoCr?=Pme$kb{+6v^EBb}oL8~!Az%>5~%ohHhX?G=B(T`S{4Lv1}+ZaAy zT4(yozT!l(V0A3L2Bqkb_FGIv;{=ew>hvyhAR}s(vEamDSRUD}f&b$+q5{0wgS&_H zW*4zTDsDv}u&H>VGAu6l@hK*Y^iz|X@UC0=uCk}zQ6u4k(&crZR6B-OVxH6wlbKkx z=Txf!Ewo%($4B>^YPkQ$)m27SwRLSeq?GPZIusO;6ane(lNWa0yOB#o45(+qtebfx@SLVS+#~28wDUTF0bn1&&f$|43LK}iJ=os9#Puk0eny!1 z&e^#;ozry=xu=U5n7!`Vcj#f{ScOzJa6hw9aWMW+1w-E2JkyzML^~AgUbyTD#W2_y znho;*a01eBYief%&L@O(cPHDkfHhII$^{(`{gez$Mbyg%tybSOw(@Fc8j{u(nzBUh z&z>Hx14r!N13dzRv4fx1&@f_-`h0zkWj@~}s9x>%fqtbtHCKUi836bffL-urq@zBh z@+!D2Hc|KaV1i@5FZ^V3q$R*^fF}XAAYN~U?kV70s-WsQd&vPAZRe$$o2y4_doZ0) zh;w}a`Z$*f<}(H@FgOu(SgB$qc=-#O#^6d&neTru3t(BWNQDx!>Ac}bx)LvWDPFo^ z>sRY;KSL$}`o%BAlUr%(9Au>^LmLjwpXWO~Mv>`rL^HV@-NTn8lVdoTu@s1sQkW}s z1)E1#eqC5Ja;Yy^EsG;_oLPzD6j6gD($L8#l~35<@ylrYA~6hPJ}?$0Lg%iCBIuf) zuCKxL0SWgZ5P^zpP*Mc+%_goxb>oq)Di&iRg@4%<;+T^QU+nOa-(a^1tM&g~`MNddV-CiG9AHv4yxzN;lXInF7xBBvI-`2y;!Pl&gd(yzRjLmM@c;ptd z%)U#|YH$ah3|LNRhd?n0uI)>F__=vaNW2P!9|Io)xp9koEx*y0*b;FFF9`hm7Id^i zW-dq>Zs(d=T#onWvmuu1>|14}d=D+eg}WYKpjG?)GIU&U5m>_3_NIS5A%51WBzDFJ9peSn3`t=GKHv{gBng4$D^`B-hI<@7>+iKUZPH(y?3haY1clAK8J8v5&8=$aQm|V|LwDRQ@h%_|8s8qF}DBP z;)|nlCbf3pgQ3&q$D~+ofa?{&G(rHa2s8+I$&Ah}Zl^`UKtJ)t)Qjp7V#0I^NA!%{ zqh)>jt;>eICd8KB@%7&PK;p~z5*ytRT<%ktD!tw?+>!t$D9I>t>h=lw`&-kywcU+h z0~VLpuAWDBz9Aa5z}3X}1L?|#Z^=9^JTG_95ZY%sB5)X*+imN9-$O`I$%6uzG_Xx% z-&~&t4MoEtFnfPE;OY~9w9wU z3^?m~bA_+0yL(k%D%Z{3?^o7(e0@A{H*Xx*E=43B#gh9_|D=T)kV7H#4VNo_(Dl5= z{Az^X>fGnC3Ji+hx8L(mFxu*grgV1i4<3YLQf04ZpQ`?Mya*8d^X;IS?V^%8#$i65 z&)293@K>$&QOc|Igd&o{DPP|l(NPcjS?2>dpKIQgqGug`b7cfF$z32{HIOrhr@cxArCM?v0gj_-+;y zhzW^QMLBlWfhM-=k4G9d@?b!1;y=*kYcy;E%s3rPP7DORQ*gH*ceKJpHtO}HP1ReP z5;A9@54L+qFE)6Ma*b_&WCe;}Zqt<(7Yl5+eiW_=Fr3zvvEc&o7x`gqCS&B+*ZY;6 z>h=ca7sN$T$Nl{D4wJL9=}7NCFZ<%s~3>EAT~55&+5!A_*3$*}+~ zPa(9U+7DU3=Fr$Ucn4!(u8EK}3;%dyQl8!5iA_Sgqxt@!#i>z=rkYk1CimC0<#LNJ zNpvVnZ{83IsSAJ+dw#+Sgojb%D~ziSBDmR1C*GkBXeS#@1ng4L4y&;}d;Y6LBn+P) zlEw=7A7cO~>egIyR0Q&w{-}gts&D5=07auVOXA1!wt4d^;f@mrqpzHD;_Fgl(2b&{`HACI!hOB7lgth5-}89cPeDW zAB>$_#c@Bfy9c8&(_20L=LVI74109Gb)|A=^7!Quo4S~~u2HD~I)YJ?JTZ`Dd?ZzUTrol+#32Z&Mt*0z}V{wdX^07I~@2x&Sy4I;Y`|KQ4w}EhObB?3(KOC@-A}d3K`vV;G zJAS%=LUzLezpj2i3Y3qy@Czm1=C%gnLq7Vq>3yU`*x!!G1Ctjx!$;eT)%>wd;yBk9 zhni+}w$JkEl*8&#iAD7vVP{GGfcJF2s{W;KE))3Vt&R$K2{x4iILGZ(w=A(4bPcuw z(c&_%w7gwqK``+`gEbkO4*jE+&z>$75JCzFEvhLv5kFp9`TRlVn#k*;oz6Cy$hJ=+ z-it7ExQfni(|>0+&h!AhTxfbFEB@B?J+{g6H4_rM01IjekBhwhqm{j<4DejAmJ;@y2C^-0}+3UsvX~bbk!>gQZZzG#(Ttt8q|89Pw5T`Q!EKCVEYur>jM1eZkN%>bSO#6DpHFpxP|dZo+;d_F>i z`R?pc5*a*A&az~0+-bFzd?1VK#q-_^jc>a>oN-x0lWiVuAT@*;aK2xh9<@JI^DMBl z^mgL>GeG>O40nF|&s8zJdGkUD0hLYz1!sVqDY~;nr_+JB;}@1lo!3wR)2DI5MBwKr zR;uh6+YBlUUFQGt(1QPo`_m#iAZYj1IVGgh?ed#y zu-2A-dZKk%-+p&axT~5NLEJQO`tc6JasrJ1&czAsM@P7%OZMA`b7r_d97S=Xo6MB1!(gY? zZJV_XxEGh&+huXtUp@Rfj%Vm>LrC|2cRYHj1-Sgf#Os3j zgV72@*bu-ALbaYRd~^$~2i&TdZ>;z|V>9VrFm1u+`wlB`D>~qI6uAFzM)x?n_`pD? zz_s*#g8|dxKfCM`aGD-0;fy_snjfIe!osGDiEcG$aNfVbF%P580yZ}+o8PL&->ukh zN%m{>_ozuYG*LQKaqVtHEiKO1aEop+;5P!o?aAa*0}L$VQR#TEhx9fb)8d@6T-St; z3Dh>slX~cHKIg>w>$DOui&G#YaKXI!m=Q%OhPlw}SZZUQ%?3a^Ib`P2p&0A_7%Hra z=a@XVKf5ui*{8}kJNPN>z5VdD*vx0J)nOfM{d5UC<%I-ig*2IqF!evE!bu3h~|5Ccz)xD3qy^ zq3YULfoMh$nvGKkM0ihj)U{ijhb{YR3NI6!?RClB1o+Qu?1`H&;{8h{wY|UKS7&aP zX=mnCf5M5D04HD1vq#cp+$b$|Q3!%js%`F9ls>+z$DKW`U8IhbZcy=^$`D3hSoAAn zX%_LjdRqh1b`M|I+my2;pUD_1i7#K#&Acot{~R4~IM9yma8Fol3?}m>hN6Gq<e4b^Ca9hipAkPLUG)FIx6!+BbPG5MF8{iD3_M_~TK z>S)G&j#{{O@NK+nv2L7kswAcgvFc6$RENISULisM^hy(Zy=F3Bl68rSAzNmW*JAc$LXrRJbfo1Ufa)V{LJ?sjW8lKoF$#nPoCjto*ITJ- zQzg@I_e(J)%EKf&ZZaIYvba&i>wF{b2=VZ;xR^C%N}lWv-KhgzfGtF;UTcy8)hbf4 zcA(Mc#K2>B+)VrLM(M*G>@DuY>9PnSN7KK0A1q$vy7=k!AlTIxMRItTB>-bKC?S9G z_yEl6bP5y3qWlj>SFHNIRuB@mF)IW9)M56*{qw>k-mhYC(oE{_v=~w1Q){v|jhC04 zO(*>Jnl;mT1OrgZ{A~NDb-O&gie6f5dw1*gg!tc>PoqFQejuok2ZRlALJBcFhv*p* z(Qk+BB##Z^fVy~4bN&E8lcS6^-!qSakDW`2igg}bm{LU=!`D|B#EoIC4XN|6OWv{X z{CEY|HoF5I;%dxE?k}`m2e`_U-`poXs)|mnci1J@&nEd_q^ipQZCqy499OpE`4iDJ z4)$=;RxyLm)y5Y%<1&E!2Jw%3b4|-;93j4E4drb4LaT*_6v)vfs_sp&y)1ty#nHuv zgYn9{yKAPkAqAFqa-CXkGThreDdoi>*wK`a#egQpJPliK_UGDDx`1!B?xljpVUBY6;ENs>qGUg6;(Kh0Qfle$rpN4;Iz zzBp2VSviaZQg))lXuPaY`9H@9pjJV&EO=JKz)B3_gi5SOX1OiCqiW!aw<74hj6zdrfS!jmspMkz+CusIM{ z>0*BpLJ%uGlrHi4;X3q?m|J)y7*p=nVVB3SxEcM=`3#;qEYc-SK!A^s+W=;^t{X5b zD*cW&UAj#{saF;MX-E}fZHuHBaMYG+t_XkCDwq2d;(D6R;c&> zZFAMD@WuI2q2BxEG0vIcblGZ3CbRjN=a%#9Gcj5X2zI0}a*Q1U)eQ=wl6%7KkoVv5xy`^PX_5o2xH~EHer_ zhoqEYDuvl+rNx>5S1N0^nBm|=Hl4!GaE&o(z25tX|3<2QxR5Ihat8*mySFapD@*|v zb5%%8TJB@dm7qEeVG(EYo9r*DeQtdgz755I*(Se4qEj}FjF#+hir09ZIYv4`Z|;qE zb<{rv)yENa%Oz1$4!VvRA6O4M6ux`W$md$8J7@dr|Gl>4myn`PD6I3dKVuTr5w0M+ ziENU)yViIJj>wM@?=Yh%%>8L|QXuLWv0Chqep-Gsk*^&p-d&h^Pc;?PaqTz#E4aom zH!=`48yyi{_PFBx?rpOpYji9>qrtR)Xezt^^x%Z!|M-1|LI_Gvz1vzAYb}=UjoIX5 zC~b?xLMdcqs+Yi=XDT-{H=gg_?7b2te2>ZWootytv4+; zx(8CQ!wVquY4U3{5eM`aCO0V(E%l+T*r>#0fnOditCc20iAp7T=}XBRwHlZN zYLtl%-7J>sOeI2|BrakeQL6SkWs^s-oR=1Wk|dxFB6~WNb};`Oeb7Q31aPc^$*+p8 zc4LA4?TC1NG;rwriJt}L5%=5TUgHo?{lV?k!U2%DWDn`lhw4T(~&Q~4Q?&-mTnyM46L0U;@-jw46Vm(@Vkhj+-tQ(?Q| zdSkgh#bSchAJe067+~lCW;7+LEQR>Z(rCE2+@It!$@PT?)GA3giNHlk}K5y+aGSp9|t#dI7ZH3(2fwJ6V(UA(*4+ksvx^{1V)UH zmfMfIeYDbV(|>6kU!QTG*WXJQE70T-yn1utwvexHW8HphM;}igAJ03?1T&j4Qh1U{)3`-UCE~Jff2<8_=0D=MlMMZz_f`t-RAou(0xh`|yY9cWOdR9gy-1`__IQX=pPkM6q%H>69#$4vi z=D2IlyW5$Q&NCy++-BIV&iMBZz8`%f>y`c-F07iH62lDwq#G2GE; zv_Sy62JE}jNxcSRqHeBif48HINJ=+A?rdA#6mHybFdUF28F84g>O&t;&kewD&_}_^ zVO#z@nZD8YjF{B5^Y50YDh$rB*UPQ6a!-FbdEut^G8KUAO%4$8ylU0^axmZh;f_Xt zXlL5I&9F}6%}2x*-~x>eGK@;(^f^G;I?uEbaK_)!%G8%Ul2t96t<8u0Hg$m2U#-r3 za+gYi5{aoyJGTO22J&yEas*jDz1*7h7Ea@zg=CXfCyL~rjHsT+gb#Fk%FOc!o2>w^ zi*aCke`Uxwm^=&(Q~WL_SSXY$SU?bXX_*2!iO*>eM`5epmn@z%q@2wFv?-f=_mFr> z-l1W^JX)7OK3zf!JFL?lIh}Z!Vz)gwH*C1a%pkrILvRt@-qKt^Q8p(?U``e?nd}C za^PkjLo#$UHr7q@#+^y2C@L0E{I)M@hxNZY4}(F5bXp^Srf15i5s?agwui*wA z615*rO}K84+H*2dc;Dl9{dJfE>=TE_vLofGwl9EfGzhSY2U=e%`|s?Q14u`>%?%N_ zMNH)6f0W{q5G77usAuL?o+6F{wj_1zjntPC<-@b(8$%%<-n|AWrAj*?T&BI?AP`}-7ge) zzF)#skbS?V{lC3hmaIb~S z^2Cba1_K<|PunIBmviev@g|v-RiQQowWB$h>Ktd?5>Tzv(QY){ z4kCH6f!lZHJTZx>4KPg?bvwU(8}-<})?&pyAcd7caHF?Q54o}>!pXiQJ#v)cdOeh` zr57dbO(TI)>3Oumh98L5vY!Y9Ift@9$9DI=V0W4!1e>?H{W?hbQwC?h{e147Y^>h9 zT8+xtQb?l-F#~$S+zG`?*%=k`It#Fu#FXF8G2Uv3G&SItYBpI+-V`R~8QNh_*);X9T5UsVS67;$o?#mvDDfJ&C}5mI@)7O>O>= zxp5J<7zxBDUwkaiRE4t9(Fm$z+U{McTRrba4u0);|F>R&4h=GyS@zHC;TQ|?XPoN| zr(rTH=c~7RAL4YtB?4fW>NiimKB=`52{WO0ZJI1RdX!h^CJmC#Q(7AjdL}gipYw&!;4PK}pegLP@}ym?DHee+9H$7JkPe#zcRGzQ z4}t>ldRHeEIWw|#d(2#(x6Kd2>i^S)guJB%Jbg>%WpD9#JKL&p7wM)O`VNAHS~@8d z+#lOIM2pqB&`#g6AUMY9E*20IzUnu4Id8sKZ_nJTQg#^-eqx~b`8-HR4CP0C&)(br zE*~OK++a_#;^t{MT1_<>Oqhfo83W!k(HALPjw0TcFkC)xC=iD`bh0*qToLO>Mahf% zfGEBdW}2z6(c7acwWdwTH;!;_~*!vN|6rquU2+oR>YXUtY| zUTaYxw7!-OU$ZDQ8V;Gfz0w}<{Ft~K zD{~LV_VrwTH5(#Rp3Jg?@eCq>orim52_a$vo^37A0sD%~(*FDb+Vu1j}c(V zp9zY~uH?@4T$-4>t&L2d;#B2*?E==8^Qp}% zj06di^s3Axmh%(oyg@6JIKxgqf-WDYQ|-SiY@(o`prk-OTDiLz6bF*x-3!oh0d1Oa zkU(!};%ppsFVJw*ohf_?I$K}IYOuO<)AXku?x{gAQfVYw_+{XJhke+vZ% z`RPDL$_o03rY*2F1Z@#UxjyFiD(QC)z;) zb4JVI+%_;l&gpP44+FDav)zP+=c+0VJez=1IK3^S3A|g$H)V5pM8wiAM1Xf^g9UK1 z8jN{+kqd*vq^@|NfGTYYp3zpj#-dV@uOAsCz<0Sc@ZkX>l1^hEVWz$TCfkZF&bDj< zUBm)J28qhGW$=ly9x40uSsv%>d;Jq>lu$GT`9Tae*G5;7ZYAyUX!6D1Xc$VCXjPYR9-p71^HL7%AGO^?VA4nrd5MJ5kp~%UgCFm1qz-#?{Zq^oX6uzV z*V~zel%yj;DbChC`z~u;?;kx9#~rT{y~$5eZL-T%qGIVc`4%*jBV-H816f1)DEG!1 z;|5C3%K%|WE`mSc>TeIsO|guVFi-Nfe>ftg5|0Z~ueT_EvtAr;fegr{a$1_lKg7)e zw=raRy1&V04W?$aNZ@P107_!F&x=!3ryCv~ttJC;)buSN z8ISkc(@h)ud0Iw0=}|vI8d>H~GMQ3kkCcdk6)w(hSIigtYirqEhywfe>tB!^8FY~# zWM5$*r7A8U zm_Wp`ZTx<2qrp!OdNGv8mv9fWQ+Z-?()x8#*XQqrj#j;D70V<>WunNT$wjQei+y^{u5 z=xb+n0xTtzM~~KFBl~uNNOT|wSV!k{VjmL%iM7^Q@RK&PX?nAS+nC}kaB4wlkei*;XuxJZV<3Z^6o`dV889lb?ScpJ^(E*oMmqmdGbJgWzp!MFW=3Gh-zj#b5fU|5mwmnG-3T$axl7kWZaUtRB?|K-krq9y}n{qV=&c!!hh@lusi>-{6s1!w|w~ss*0{ChnP>%U|evdMz zd(C63_bmRUBzntq@hc(2Xq%vys@VT*<&fQ+3Av-OZqmG5lar>O{}U|YbKxdE8ynM@ z$|IFB4$RHDB81Zejc{Om)?3`PWg9W|Al)OvHkvR>#7g^)=(Up)52eF8F#Dai^buM5RO?3E} z598>cxy0N!{n|QAD`Z32)=lRZ3@D2{pT{mkCxGGq_v9fb!~{#dFY$RcGMFV=E`^Ab zaK$NQ!=oYeDeN}^c5?#KQl%6|NX?JkbgdLq)aW={!rday3soAb-hBN zox{m@w1t}O7NuHZ)*=L891-*@ZY2EWc7+lyD}NCFFCun_d|(DGyFC&L3Lc@;lT9Kl z$~mthMWV$v4{ove7w%ogD*1cLNnci zPF%%knA-hX7ZILvI0@V9E$r`y>Gl}hbBuxPnaf|J=ENFY8BPa#!%9UtBiex0gx6TM zr#SL_Ec|3kibOo-DiOSm*|{z##k$>HTPW3QLx8p<+h8TZ5!Q~{Kxa@H_x)iN4V^Hi};ijO9MtMQ8qS*daF(XKi zijmH2Gh}O;!Tx?kmWaz}0%9Ge3)E_yfRWmUSV>y8&%f^q`2E%ZtU+PnKH*V%r2*Yq zTL${m9l2$YM6_(ypP#|<)>0jd&Z)0?c8>TwvUXL&##QDg(MWG>V^ z(2)L|6OTbS0kaj!&*xMtXG6&vl*g65to`sncS0BuU6*m8946H7#h^4s**2Y=O3bd& z-iG3FrbGZDPuZp``NBc0-j5-A!PozuIp8-U*t7ScehP&e<@q6daB_Db=c?cxm46w? z;BlGU;gmy@jQg5sG-8pxt`6K6pG?~XzPb1bX02|@@&q^l=@2#?2+Q+Fu}vDxegPl) zdxP-C!u*NfF^qg>XCD8>-1T4q7GSKz{j-O?wGO*6HYQ!G1C8Z!&oWsQ!U(bOle}+l z-2v|l4Wd+w@x>Tf%5w!(dS)@JF5i7)Fr;TW85C%7UKuH4clfgy9#>(3gZ%)G>&HuN z&*Vhu^ky-jNyWIK?Q%O_v08Le9}cyNBESI7b^P+**Y+#%#()9xP?XLpT}B3}JAMT{ z2*(lH)hHN>taU!-zoGY;{`=ab#emlau@(22omy&7#C(RBP5mRp;PP;(*mSAUQh1cb zDJu{D*F~gAx%%CA2YAw_3m@}@W4n#yT>vhzsaQCI9d{ItgnRvGvq%98cRve{38%b7 zX;2XCGq1#eBL>4*0#o7T+Xc(mEg?1zX<`|WP!!MgeWrBwg&f+4lxB`S%@Wml;L!+cBl5UX7})xY$b0C(Y7W3i zx*EgN4$CF;R22mHvTeTQTa~}-3jIft+dT;JwLhl!fNA+Wuc*?+t#;1q_rfmCaiup1Fe|M$q};UBW=(s4xll z^Sl%`8VbeExppXg#NVIyTpX&m{G)c7vko{W&8jczC6gHy8*N+(-?-;WIepu}O2tU3 zD*&UFVr<=%f_VcH4HT&;a`bRwwMcgBL+NVx;GTmO4?1AiqoDBu?do?03I&4>s9!VC zW8KfMHWRNnjQ4HX+azC+_qZ|Gesa6Wz+jl5zvz$cQ$YY;QQL~qh^0u5QBj&r@^%Y# z((XDHbif_NCj^H`SRM}MxDnlzLKXM-k!kS`3TMCqZU*~P%#qW{cM=O5csU^849iG) zX(+(u^rM-6aIx{&Sa|f6VHSQPK(-5fU}sA*fsZY-Ve@48a10eEo3&P&y9ci+=rMqg z@wt4NDk*VyT8!8F2i`(AU0I~xe@T)OT){h?di)I9=*j_4au;=~=|nmvg#su-URM;u zL0nOO{(i}1v(vdUHQ3#QMGShl9MNc0dfeHaerXQbYI3ve*^nR+W6?lNmsT&8^@EME+_(E>03<5-(>YmSe3*ZF4*mP_ zjt4+#DoUS}n9mIL1vUtn^hLBw&g`UG(*r)q1;^cVCiN(rVb_=7a9XL9FH^O`D3zki6@9ztNo;L>>tDeEyHlDtz?CET>-0Z=68SH$jPHek zm9o6;Ftc6yt|dR-?^l%>@~EQ%1&=5r9Jhv+!RZ!xvMHe-^IXqHOnSlPm#0eaC#DS{ zq4uRFg~^~NL|0k!ZuD9_Un$?eH>`5DG_+b5ucEo7!NjA|GF$){Gz})j2yevyb=_ z+{aPgl#ykh*=0smA*Y1da&uk?=SuY^b~sT(xW2=S5?Oy#f|!L<^32b6J#Bx=V_dk$ z_U0%hxLsfrVVC+Apc}saz4E5>SJZHK&Mx zQ)4C2VrarR3 z{CO?O9}oI{!Z)LVaooqv6ADF_Uu{zoLr+egXld1t%|qA+yAe?um8J3=MXhwM$Sh5N z&RAZ*_=a_RfJljl|wkQ_UeR9}}g`_6W&+KKYmcT@w25m6wU>y?w4gjehiG z;~e<-(4Wr`8v+-txAI0#U!%^pBwxEkD4wRUmHLN>SkBorzjTno^+o=>?UC!igU4JB zHNNoldzJE9*DfdPT9jH&zBu6DOq<@Ezan;X>t`e=kdB$C<9k?2;Nj&3ie3UpD4T+i z4$q&{2ntD6670)8NS4puwln}slLFvmom%&{KPGt!x)SVYcIR+6imD03pCuCDeo>U- zrA1h7<1!2KpXLGzZiou3YfU@$43$<_t#~c7g9Uw~N}x8@KB0TiFd~zFWxR$> zhe;0$D23cp70W!=Ki6_O^_UU==M$cK!x|dt*4$Cjb!!yMqvNEI$5#)TCclK21>XB6 zmp{WHiONdiGsK()BhlDKD0ua`&5nigvlS91p!hEcv6(*xBF>GdC{N(xEN!+lXS4bd z0WAj@B%XABrgr~U`MHynibNUk#)}+wClKy{zw`H{p2=OHtk9%5V8I*xDm7iIQfRk1 zPzk#PL>=`et;`7P%d&7wD<&yySc9bgh;ZCL#)b5Rszw!{iG79sQ-U)5< zxS0SMs%P(kQ+ZyFP-sbH8`d9`f)&rI}Y_z%P|EEHCV(fulVTKZy#3U}pm~8H7lODY7s!D3!c}ML?D9 z4pWms0AE#^U>eAt*Khm8=1Ny0YSiQ6bCzVKp_a}2`WRTQDB+rZrShn&HFYxso?^A45uC9gjJ-Ht za{fJt*Z9aenXV^&^1YvpT{wKkKb)r=@UYbZW0Cc|?B&INN@ivzyY2crD#7bZvbK5< z^9h?=XEr_Y2$!+wNWWWIzgy1j?z*l`=K0*5(l1~lPL;q6CRrfT~or(2Cl16ReL0s*65#;j_Ly9Bh(D%obD56aSu zxYyB(TA?BeZTEODcEAeaT(!{vA)${Q0kL<2S0acXfP>RXV7fBa`4Q0+ur(>;TLc;a zX@A@}(?b|QoXX3+Wi%_Q{gXu4*x2gWpVp)yMti^&G|A&<6q?;YEDeTKD*NzTcB?UCNT^cZsm)`3dbja7&W$@NHT4IlAtGq&B3Hs>&X6Uh{3qvQJ^Mm^(%*ZD zYB&^6gR-D05&!+YZ7~pexWC=^7D9<*N)6ZNs7hks?W{NQ!F*tsUL9F^wpJ(>i zC*NZ$$fk)?&*tOJk!HQALQLCDMG2RVQSm3MCrI3qo+sat>rBRd0pyv3uI)b@K~68) z*j1(5t+?as$6|xZ1hPK;tw3Z{7ZxZeOT*@VPA%745*dDt;(ws6KBGK+i(Vdl!QMi> zqL1tmHH5gu93OWMtQR0MJtejt5AsU$XlGKHO~$6XC>= zCzFi*SzY6xDdDJT(ly}1X!^6GDWU*LHrUc@(|Ps z@r+l30#si*(C;98=KH20taOlXD+cUMRIXg8T2&Phw@zVf{*5&jXp6-z=aXi2<>)~YD#>WbFZK)?wCWG;%HOeUu|#q z(HhO*-MC0p-;hM4=f!_WRW7b_;Nv7!2GiQ=UM;md99)KQ1O58twNXzZ4ESe>~UR87@_74fIFiy;Q0a$6|MA!2TB{P(Dh~ zD2Cdi!<$X>+Obg3v2*=zrBfjV3Y5@RK64VrSj&qYx#0DlUu!TJr6khXmKrRz`(vO^ z-t8lMHcJ1^#xVOYFyuW6P{jS(N^18WklQXc`+I{dWAGUw=d_ze!0-B$dP z>j@TGTv#GHEwjYW&JR8hu!p{-|5F`#YhZ!T(5qCTPf#jN2((W)tP9!N95BqKSF$_y zDaJ{&+G|xZP=ESv0BtmF-WLoe-==dht(T|;C^a%hhd2GbhC>-}4Jd6JV7NF|tnj+Y zY#yi7gwNTADc)aqB9BBl+PFAsAl`mrl&@h^61|Y)^$*QL=4Pg4tgYXm4}bv!q2zt$ z18b&LiscQ7^QF_13S_K}aOOeUp0Ym)pbZESyt>z*8>IJTdJKfhvqh$p$slye?m59y z!0l}dQ7P}rR2qVBibet8J2_4dkk#~cQY~} zJQyQ^RTqoeBGQ>TbDPi*YFBQO`$^^6v4tLkj=r!1hT%5mMu$DpxkpFHtZFFI(kTfqh zgZBUmy7|%2G@in2xEuoYe^CH5B8D=$8MA6&f_?p<*+^4twOkBrrcp}!|Neg{=vhc< z@3@+-_3QjVViKTgy9;%J*KZ_VtoNSfu;>#OIcu5so~oCq>|6o%@0w=udnK;gf%v}h zRj*a#JN!TMS16cq2n7Gyc^C6T>Qf<@2$5yW>E$@aWU+k0o5RoX#0B5dGRCvA4APDo zi12Df^Ip=4D!pR;19AE6NPstpsO1L0wz8m;=Sc0KaJ^>zQo?<`7Wje=0DODPH+ZE3 zbp=&^$QwUb+H)4_P>SqYAs8pCRLvG<6#Uc(COutt=MxrkrS^ zF4}GomQ*1cOSe1(|qIR+q;X?DMQ6ZkkS2k;=0pFQp3ls|l}-Nwpl_uc5^*Dtx*C+JST zi0l0o8V%kjdKe_lKKIxA>=4O`{dunw%t02+-!)whnMgBKqsQD#s~E;n(BSlzEd%Ud z>iy@0!fe6WNf6#v&a|?3qW2|;AE4Da+MZV-5W1Y72s8=&j5^UnC(2Tz}{KYm3BkX)gRr?*5~Lt6#H}bi>LOJV4`u zlLHOgmIsHt-srnG_T*2y*Z~K&sT8O|r2wZr#fbaMjhDc7uV;^5V&PMNZ0cA%1BPOd z?=)Uj^jqZlB-UaUvPN?$xAU|OyPjtp>{m(Q${$t#-a*J{c%Sx!U9&+p+d;8N)|GwB zY0e-XjF~30_}NSsYTtuoU8>YFU50EBBA2!N`NoFYKW!?z8%C*l7Ds^5q6gOQHx}Ko z3~*S-hS%2*cMf}s$~}n-C6wiPOPGRks9(UKxfxsNc>VrT|GiSPN*B&R0!feVBlBpy z+5DBKaq$0+VSIiflW(!RKerm!s92&MNaOS_kTf-my%S}tJ=qkIOJMX#vnmajnyIRj zMds87Rv1K|Q$^Q07gX{ag<^_m=Pv_56B9BC|%@=XAAY^h*#IH^LhlI2U;9<-vG5s@=PTkKLAIIBoa^3V3;s?nw&gP zR8fB~6G?GKtHL-fjw&y3|vjA|TzFkOOV zM*3QP09;V2Jp~PuO@P1e_f4F^l@cA^ziZ_gc)n~fF{K!4RXTiUN9`$-P98GQ(8reb z=^(qE0Rwogu}x<)rZO3bbb`Ew4foE#o%_4lG>>&$KrxM!xa`fLmh!zMPq*Y*b6U#i zPJD!l`dz!NOoM)5E!Fq;289mUaI-HDY8subLEfD>pg(0%2%611$Zz_JY;{R}fS2IdU}8nQ_()5-9_~NywRbBL z`D%2lD7Os>UG(B7eKlzpM{h7>GE$JDWUq5RCO4b4${5@PpEm^To{K=UN@?43;_`40 zzumnoakRoaaj~1Rw%r~Uwppdq34_`8=jrK4LHaDQ$zVe^3spZ%nux)C`wt765_F>s zbhTVgnnkE@Q(pwZ|6N6Izde9$PdK*yQAWmti!~Kn5>x8;sdTnd_=8oiXi(7_4d#;* z{dw1+;7}oVy<=_VbvU6%Zx6D2liqwK`>F|;7>S}Mgp+)ZpZu8q>B?30-|6u`zx|-X z7EMks-fp+X|3H4Y{RM)Vtru!(LCAz3m!rC9j6BMpsuX-H3rK-kj?A5WOD*;0nb$+3 z6AE6`QgiYvL>n^@!h3sVPLm7m`1k9BI`-xG=S8A$J-!&uY>`ND5ViE;^la9U)>8d} z)=2eSbtaYfGnG;aYXX;p>Q~b`_0Nv+FZ!W=0!9|tQa;iump$CO0AIrh{iuu5dtk0V z0l=Fx9S|5m2g+vxuj(tO-nhfcJ@B8oT zEeP(ewllwPZ;Jpc{;e|H16p88c+K|t!_mlQz$@ENAvzwJnv7a4NrQ}TvVf+v3-}tE zt(LW&_RCVBQ!6%~t!UQx%aQpEK|l__lC)>izJhICLA_a3gO~BzaI08p%lvrn?)mH9|PbLB-3Q?*UtE}d;eTSNK`c6 zHZYnplLi?ZQ#>pJU>;BywgF(aagc>Rt*Sp0>jR7!b1RGO7W8RIlL?|VVG3Q{^6aL>Gt`%9C@H__ zkXrqIRvm|M95htwtdv!rceYGIA%_c~CaGUMOav{ZL`F+#z3Z9W=W^3s0gE`ZwCx#6 z77KE-A57D8+@)JeMY8+=HH+)zd_V0moWfQI_>T*3w}5b#^}eqXkfDUmfN_Md{)P$! zf$D4ou^Z;l(9r7JBk5;%a^*BH=R?ar@t0&i!#i4SpPj=h1qHjhzP>tdtSw0T9GfdG z1$d7%Uq+~!2_Oc^T>!^CrRHkeQZK6!c(-&m;I(95pojkZJbot%m7($ZfoqKzMY%jB z6_mLK7#q}|=^%-G_k=C1jz?{Nkj}Qj@t`%z`3+!9iODZp00>I+{1OU~HzNV`b(u*- z6f+Q-3hMv-3TN4Q@BFMRa@aFqm+%L9+ObCxsapYfDJ>8?rhRD4^0=YV57>?| z_(Pz$m*ioqx7 zy_k~{Y$&Ji+vJyOMPR&Up=epVc%pX+oZ!M@sD9-ZNEwfZ;#vQwujj?Xgq3@9n;skz zk7jM@LY)aV+bI0x8lz$PPqi|c_o)TLt9-ZJp3RLjWBKOKG-SRDQSNW_MV^A!PiEj7 zNasr(NMO1NZg_qA=F7$)1qMPU_|kr)zJI?CH)Q%AvDAc%ePkIe|42rXmCUmDOxelG-m)E=LN-bEK~_#yC@U*_RuZxzC4_7;q9P+nM&|E+ zK1JW_`gQe3*Ol{}$1~pV`+nW80UW#Z<5|S|MMC$qzVsA43UcW*e@*Re3}_^v+IRc| z0`!N_$$X~8O9TnoGQ;2oBi9;E+&{rRt9vR!#Q=wpfs~{i_7zH=e1_cmxK=azlH!xr zW)`-KkF_3|(`40EWe0iemP$~wTM=1}1Dh*}${Xwotr&{@R==~W&j)61x{2P^{Bzw> zn6P@vI$v^+bD9)tOKA2dC6+{$4Zm?4yT&G8ghmtINBcqPwC{V_f40LdeDNdL#fB4a zJkn3+V>o%0>si}YOsUFliS5_ztBC|X5tBH4-_>Cw>c*YZ?BCufQv|T@F=V}s z-Za(Cx%Kli`!mZH?0c&p9fqr&t4F|^pa|R@2MV+pDCfAD@X0-Senak!S&4-~V`J0J z#pLaDG4~L7cJg&SVJx790SXy{PMM?3#wuX_E0Mo8(|1RMMH=8X?s?xy7F{73D=|FC4|_8Ab?*H{34&cE3rIWl*kMdM2lOmqo$rGs^s!di zW79Aq0ehGd42lt<*^8RDr17^&A{Zgk^-F&;zgaO|d7ww~aSV}Yp*xH|K8Tq=oYFC0 z{#fg|4O0$|&{3J8t;&=HCa!kY<0)_Nd!e$^@^HqhZy3(=V=%5ss=Q9zmA!twW^11= zgx1DSFj5-Xdj0rQU^Sy~&fDfBj!kHH-ou56BiTm*B6|9Ki(}OxXASpnafuIrfi^#7 zkZG~rwfYK%zL1&q`xT$%{mfWsZXw2`C)P6XJT(`>ez=jaPTT-2AXt42IFX2wVw~z(6 zvFikQ#CIgsm=wP{wZ5Q{D|u_bd(+WXs`3yP4-Q^LfT+5a_w1>|MOTAuBoiUh^HJu# znvM{wu7?zC{V z56`_LIYxE--qamkhkP=bt}=(0IfL`l(?aQ{gDK%BjaPaDz^ggL#;qv_a_n^%hot-J zZ!ypplbpdnylHOcupne?PKco{5MomcX5p2YK&s5|IpK(fL>@y`yJ>iA@06Hy-$5_- z)}UV>wsE%!8F^c7PhtA)4Vv~Z0?ZHwh^u0PMoawiNYx^@f>B=%jlDsPq=<=zv?^#?Y2hzov9&D^MDf5|h<%0}f9L2#2 zUl-i_q&8%c@b z4Zws8Or-OvVc)T8b?hIjeq+D+-ScZ?<#syE@$J_aG=KF-YZYl`bZ`#dxcQ2d;O}S4 zm9X&Np;j`)^=vxypsc+$KWx!d3{9eLcWUB%GxmKi3>IbG;q5F#ZfBWA zg|o=!YOZ1uHzphCBcoYM_Gt=T_qhiXwUeN;RQwaT}K z=u17j9-K#10pNbFpDI1ITI(u58<%scKVSGUyGFF`&W5yScEm(B!z}G#=K>r(pOe#H zzxuUpILR;?3rQm=herB~P#|~91O`ru7`?s}udA@U*7G!>qJj#Pewi*)fpUPNv5}DM z@?Srv({;G~3^N5+;zHxCS?~>c-~E5&qvW|~ z&|ZF(`^4j;-@a51IwO5SMGL0mMESV}Wzi+?>`2bNbW4=;G{dZtVAe)nxytv?LZlP1wm_VA|{-;z8HITWwMjYO3s2-5>ll2 z( z_7R!%iY!*U^XcFpBR)9fZ@5P(z=6MOlwyodx)06r`o_*|Y?@xNzjoX;DsS-Ek~d!UD~{Cf0xbg zlwwLQ!D`Fc@BSj|GG6Rhvmz2r0d&iIdpogu)eAl#tYHTZ=AArLMM*U%YdxYqm4PF* zwA1IW*H~(pJD4v1LyG3$(?hjWv7L^$KyAXGDi{taZWWiypTvtekM)9k`u#fH_Th0! zmI$8H*(3}|aK#Oj9UXs3K~s}-idv%vC>^{cS*6=c!;uDYi3xH&AE37#)=XaL#H7GyXo~S0z~>%+ z1d?A~o@_{apDCpVNo;u#4zMPGyDWbFN7I2G6|YhAarS-o_=?5E+fZfag8ZvwA8Oek z4?(q4H^9&-v~g>O=<*1aR(@|Bll(k1dJu#=p6(IMw#3#&>3SmQ0fs56zYD^2Dxyw}zYins3| zu1xZu_y`7!CAC6YF?R9NR9mgkV$f{4im1w7}v(+W-wA*S*pvH1?F zyHJjD!k8JQdz(ZbfHi0t6@vEGsr)`YT_oN>GKyg`eRE+x2*&SvG>bs`8QA=ENE~z0 z3_jop$HVbv6Lgz4;gb({eb%&J=RAB9V_XWd4-*J@#n2SD`|ob)AP_^cfW>8uR4pxC z>LC-RAqGa`jut_C)%)iB$-KtQL%Gm|Q4UI9>!QXGTP%ZOXu*6FpXy>S4i3&UaLrt- zdj=hVgHxO160t!5CAXfog#XqL*@>sCMYa}oUMkW`{39~@dk~DMx3{D*2tE;3g6vBg zV0$Jk;wYTqG~xM804P3nc3Pe<7UAQ{HY{eMZ0{bWi8$+ei1j$%w>f`UZ7?%K&(|Fk z(2Qe62xFuq#Ph;=tm{kIUPbF=?;^hn>;UREZ6@lb-Jf^O-$A1WcH{Egyz)~~M1NKz zQb<({I`(_1k~A3$`z&@;Q-=7{<4FS2sl;^(;PiK6f+b~_tEzyUySMJ#998ExEEuW)w^EOc=%IjOS=&N5cm_OX{;fArn=WL5#lsP~R z#rFW{qvuq(Ez5ynkjicp)!7GG($i{RFQ zsP)Hp*wsW-{G2OmKfiP)wa`r({W>JI@DX0wm&)fe3}3R>%7Q6M`p$C+I#k+L^WgE6 zFHGUNVFZ9pD9|KA(|uqofKbz{TEmNa;O>6|IVblO%hj3Jtl9W8EtD(HKF;u_fBy32 z@k#3mPvg$v;gpcjP?eYwkk5WQ_bo{EMF{;yLadM5>k{sWcU}?www7yOyY)rzJLa=? zlt)6J0jrcJ)aY}VGd*2tjB!Q_zs>74-pO(3^7=ltMihZZlvTl}bAKxZCrwzcyUA?O zZwZij_f_RD`4x@Z55ehxepI_4fW18{j3v@gPY(BUYeX*d;BaeeC~G~MI%*Tw7-qBMr4&<4P4y~`o?}k~S z8vTtc65mqT7{r*ajzymrDC#=m;Y`9NGnOVcv=i1mQbj!CNArk;q1#&P)3{cqq-R84 zJ$b0+sU#Iz{;2Deu8#0}>Z$T)e4h~?yse{^E+z{J5V^2yBrOb<6okJu+)kJ>IFiDvw{Kv>7OY* z@yMT*RrXS=b){B@L=q4X6+8$ub(2+=%IV#p!!I$vhfaF=D<^8YuGxwM;SKL%clyoZDyCxhd&Yn8ibK$&D!ynXk%<3Smiv1%3`SqG z>P#TFAkCXeYs_8lw`>JAomsA~VC&T-*GgHelhR0Nu2xDH$Fyi1S-9zc)ca7BuXn-I?0XNraobL`L zE1toO*4aU^nlg#cNkE_3`^2yGEyr{d_G<1hxeqBS?u4sYruEJcs5|0gm}zH>e^?xJ zF$Fsje${TJPa_3679WOIKXz7$YRxJit2{huihWV6UK;=lhU<3xHg{nLkvqO*@r4E>!QVw1Yb;)rQ~4H4*`(1&8N z7}z|d)sE{F46l4=zK_4&|5w&4!(&frC3pWOf%2s}C_Xsdtt|k##hY`xxlGtN7Tf&#V>#9jC_xw*EvPfjM-~|cqIo_bDXt}$v)5TqVussVR#j=KuX@8*bbQUTYDbnJc)CLtRQWuF}~soYRI0hhDX#OPW2^>C;z! z${r2p-H@@C*;<2wTA8HRRys_|K!?c7DDGxZ=ap>Vft~hG2l)W&6*=>@P!3JiEYlh` zuse4*dHF&LX=+re!%U8@lFa0*rCeI#dK&We;eu;!fy3-T;>L8~hDgvWFoM!7>h&dG_DKI{-hG`Ta zV#~4W3@%{(@@EO_9re+bYyc)b&m$TY;rIblEu>GE3fxUFC|^>Bkf&$AQ~!<7nr{WwYbaW&b-+t$M*n5Q(n$a;SWluASR{1@RE!OGc|79gqVNXAoMP(0h^|Y^!5b z_lxIUiU1#oX_KD2NIBPPD<5Kqq;9@&h8g>mva+6pTU%`iaoat*au?hzwUDjZQ^D#V z`gfO9h76zTwvKkc5RT{9rN`LEhO}Qti`##E5zd-v_OA`wWPxwro8>e)A7){WY(RG}4!KL@dt3NwpZV1JahYm4TF%l#)C#$V4-wGKBPX9-c75+&r9@= z2lJoeaD&G6qSrj$WgqWwpcRzLQJy%hyy(`D^^fc44nIx%hA=mW1|5no(DybzO(hWT z_-)-MwuU)0*yFClot<~vVQLvg!SQ_0+6eo5g8G>#D2px+z!Y}A z%0Y7JCzRx;sj2NFk}7fkTN`D(Sb~{P^(|v;nvR}I#_4wClB{;V9y(f>Wf<##jY2mu zDYkK>Pr|}+K@=KvO(>_sy##(fhYp*b^RA04{Z2I(8rm40rocTUBya%S8$$IzV+yda z@NrbG$m&(&5z}6Qss})-R3w3qI8#NU6o#$ZV3JO}4VK%={RLVD(0cd7$_X}kAN3l1 zZ*m)!rz3+67<}eJ%h?Nav?3_u@qWfan~qFt`yjk>CxzEoj>n)hi$g0@`=O9sAq*rC z?&tb097%DpoGS9D24_L$Sp;-ywbE!Xgt-d1N|AnvffuM<_QK($RbZH$1-)t_btDD5 zI^%g1r17bNfjCI1RqT|bnM!UzLy-qgrM+MXQ3!^(tcnXDwtxa!^`d1nmT=dDb=zqO zQE`Bwhok1aG~$K>HSW+YVi1nQ$Vd*v8u@4VOgN7j4rNN*ET*+7{qBo?arip>QS>79 z7c*PjrQ04DOrP?bu)w!?Sq8;=TzueMKSMM z&=)?Ygs{4)H{oRlkkGIUg~0aZT1y+l?y34)6$`PBQZxfFO(}z1K1cs~X=Ebfe*SoX zAxzAl0o#9m<%{)nGui}Pwe=rW)zJ|U%zcF!zavTdoJe}XzsC(hFejTdETw8VNLdt5 zLh##Vn9AJ^Ct=WRI@p(lmTf*UF1V7BwT%&C6N(X+6x7*eMin4;{yZ^(l!M%U-I-Ep z(NqGOU(2aX@=XTj88Ep|O9%Q>dNV58&$G9GgERdGPY#qM#u8rhadj!@3$z{?KzB0|K0MN@W{tI& zdVcX+yW+2_zY>isHwKVmSsztF-2-sYL0+_xZJiP;!yz_oNdh{&YJ9s=GCsn{7Ou%& zz#O!}gJ0T;vF9@jaEY5gwAtU^IFtkAOT5};I%g0SL_EQ4Do|>5*4KRgM${LnTi@vi z3w7krT9=sC@IMAile3OQQv5;_^0BSLhd@LI)`8Xuc$pZTIjA zNqY=UHJC^&7)ElsB$3>5ICt(G?RDW^IPrqlF*H|+2nqXohynl^Gr>GPKVQ#ms)e_{ zGG*}^YmsC3KyK#7-rn9|M%%_^pC8SZ1Ps3YVyz(`6lQEOeG@V=xT2A@7_5_jacN$5 zXrw2CGMYpB&@#~b-WTHPI8qk}B5L0R5}_ zV`&_47O%IJ@Ql)p7!CEr6LoxG?8#f6YI-yhhX80Le!t~kzJajVhM(kW+*Oe#_7g0$ zp@D}DF+OrzvtopED6!wm$RM4wkUBWtL|x#}c5@S~cIXcWQ@FhA?m(`9`DgNWorXB>iFL~Bo-3< zy3v9F3tN=KQq|}c(l^|z(6_?MuDay6p+5VuiuSrhZ%}p5!KA(f?{BVbY!t7oO+{&7 zYTg#Dq<85V4o!N>@@Ds1+PUgMv54}^sFnxoUO2z8Qa{MrZf$Qnrdt@=*cfga?IC3S zWHz-kN#}SuIhB_cKBRv8aPQkI@|+J7GWKGk1Zo8MC+hwz&!uvV;mYn|Iv8QuW_(_x(Jf{5u+^BkrY58mKNUMilS?j&y$YEcs z8a4=E{&y4I3=q-kkm#|7e|rZOt~!F`+S)!inkvCRrc05HbTJKW{%_~O!U46D`wghT z50^mX*??n0QM2AHBXCp^!9NlS8BIev-U>2FkUx;TRjz7Ed3Mv~u2e+X{cCrH87cm3 zq`n|!6!C4mwKRr{16&^^6J81*nhW=dl(j)l7D=Q?eSzNQ?};|s<8aPcUgSP`RFxuM z?G1pv#136Z;QyYaB65=d|0m%j_lRYs|Mw&jRgEw$CEh=@7K=bk5`BQJQzMC1ak?LX P1%Ff&G_RD)S%&-{P$Fse literal 19421 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 + + + + + + diff --git a/inherit_graph_54.md5 b/inherit_graph_54.md5 new file mode 100644 index 00000000..9e0b9eae --- /dev/null +++ b/inherit_graph_54.md5 @@ -0,0 +1 @@ +0ffd2b6d2b4510d83bb6613deb8d2a78 \ No newline at end of file diff --git a/inherit_graph_54.png b/inherit_graph_54.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef1f9448b37262a4599aa3cf22e13aafc2d0eab GIT binary patch literal 19421 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 - + USB Host Shield 2.0: Class Hierarchy + @@ -31,7 +32,7 @@ - + @@ -73,7 +74,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +

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

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

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

    This is the complete list of members for tty_features, including all inherited members.

    +
    + + + + + + + +
    autoflow_DSRtty_features
    autoflow_RTStty_features
    autoflow_XONtty_features
    enhancedtty_features
    half_duplextty_features
    ttytty_features
    widetty_features
    + + + + diff --git a/structtty__features.html b/structtty__features.html new file mode 100644 index 00000000..da33e44f --- /dev/null +++ b/structtty__features.html @@ -0,0 +1,246 @@ + + + + + + +USB Host Shield 2.0: tty_features Struct Reference + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    tty_features Struct Reference
    +
    +
    + +

    #include <cdcacm.h>

    + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    union {
       uint8_t   tty
     
       struct {
          bool   enhanced: 1
     
          bool   wide: 1
     
          bool   autoflow_RTS: 1
     
          bool   autoflow_DSR: 1
     
          bool   autoflow_XON: 1
     
          bool   half_duplex: 1
     
       } 
     
    }; 
     
    +

    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.

    +

    Member Data Documentation

    + +
    +
    + + + + +
    uint8_t tty_features::tty
    +
    + +

    Definition at line 146 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + +
    bool tty_features::enhanced
    +
    + +

    Definition at line 149 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + +
    bool tty_features::wide
    +
    + +

    Definition at line 152 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + +
    bool tty_features::autoflow_RTS
    +
    + +

    Definition at line 153 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + +
    bool tty_features::autoflow_DSR
    +
    + +

    Definition at line 154 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + +
    bool tty_features::autoflow_XON
    +
    + +

    Definition at line 155 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + +
    bool tty_features::half_duplex
    +
    + +

    Definition at line 156 of file cdcacm.h.

    + +
    +
    + +
    +
    + + + + +
    union { ... }
    +
    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/union_p_s4_buttons-members.html b/union_p_s4_buttons-members.html index 9451cd2c..a6bcd886 100644 --- a/union_p_s4_buttons-members.html +++ b/union_p_s4_buttons-members.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@ - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -112,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/union_p_s4_buttons.html b/union_p_s4_buttons.html index 891c0bd5..1a0b6895 100644 --- a/union_p_s4_buttons.html +++ b/union_p_s4_buttons.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: PS4Buttons Union Reference + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -95,41 +96,41 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Public Attributes

    struct {
       uint8_t   dpad: 4
     
       uint8_t   square: 1
     
       uint8_t   cross: 1
     
       uint8_t   circle: 1
     
       uint8_t   triangle: 1
     
       uint8_t   l1: 1
     
       uint8_t   r1: 1
     
       uint8_t   l2: 1
     
       uint8_t   r2: 1
     
       uint8_t   share: 1
     
       uint8_t   options: 1
     
       uint8_t   l3: 1
     
       uint8_t   r3: 1
     
       uint8_t   ps: 1
     
       uint8_t   touchpad: 1
     
       uint8_t   reportCounter: 6
     
    }; 
     
    struct {
       uint8_t   dpad: 4
     
       uint8_t   square: 1
     
       uint8_t   cross: 1
     
       uint8_t   circle: 1
     
       uint8_t   triangle: 1
     
       uint8_t   l1: 1
     
       uint8_t   r1: 1
     
       uint8_t   l2: 1
     
       uint8_t   r2: 1
     
       uint8_t   share: 1
     
       uint8_t   options: 1
     
       uint8_t   l3: 1
     
       uint8_t   r3: 1
     
       uint8_t   ps: 1
     
       uint8_t   touchpad: 1
     
       uint8_t   reportCounter: 6
     
    }; 
     
    uint32_t val: 24
     
    @@ -361,7 +362,7 @@ Public Attributes
    - +
    @@ -395,7 +396,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 7116f7f8..7e9ba56d 100644 --- a/union_p_s_b_u_z_z_buttons-members.html +++ b/union_p_s_b_u_z_z_buttons-members.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: Member List + @@ -31,7 +32,7 @@
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -91,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    This is the complete list of members for PSBUZZButtons, including all inherited members.

    - + @@ -102,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/union_p_s_b_u_z_z_buttons.html b/union_p_s_b_u_z_z_buttons.html index 060a5b64..4c822d51 100644 --- a/union_p_s_b_u_z_z_buttons.html +++ b/union_p_s_b_u_z_z_buttons.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: PSBUZZButtons Union Reference + @@ -31,7 +32,7 @@
    bluePSBUZZButtons
    btnPSBUZZButtons
    btnPSBUZZButtons
    greenPSBUZZButtons
    orangePSBUZZButtons
    redPSBUZZButtons
    - + @@ -72,7 +73,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -95,19 +96,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - - - - + + + + + + + + + + + + +

    Public Attributes

    struct {
       uint8_t   red: 1
     
       uint8_t   yellow: 1
     
       uint8_t   green: 1
     
       uint8_t   orange: 1
     
       uint8_t   blue: 1
     
    btn [4]
     
    struct {
       uint8_t   red: 1
     
       uint8_t   yellow: 1
     
       uint8_t   green: 1
     
       uint8_t   orange: 1
     
       uint8_t   blue: 1
     
    btn [4]
     
    uint32_t val: 20
     
    @@ -186,7 +187,7 @@ Public Attributes
    - +
    @@ -220,7 +221,7 @@ Public Attributes diff --git a/usb__ch9_8h.html b/usb__ch9_8h.html index 3917d368..9698e710 100644 --- a/usb__ch9_8h.html +++ b/usb__ch9_8h.html @@ -3,15 +3,16 @@ - +USB Host Shield 2.0: usb_ch9.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -887,7 +888,7 @@ Macros diff --git a/usb__ch9_8h_source.html b/usb__ch9_8h_source.html index 119419ce..94e96d08 100644 --- a/usb__ch9_8h_source.html +++ b/usb__ch9_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: usb_ch9.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -151,17 +152,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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.
    +
    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
    +
    73 #define HID_DESCRIPTOR_HID 0x21
    74 
    75 
    76 
    @@ -312,7 +313,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/usbhost_8h.html b/usbhost_8h.html index 8543887c..f7b8d37e 100644 --- a/usbhost_8h.html +++ b/usbhost_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: usbhost.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -126,7 +127,7 @@ Enumerations -

    Definition at line 81 of file usbhost.h.

    +

    Definition at line 104 of file usbhost.h.

    @@ -135,7 +136,7 @@ Enumerations diff --git a/usbhost_8h_source.html b/usbhost_8h_source.html index 72668e0b..0907c205 100644 --- a/usbhost_8h_source.html +++ b/usbhost_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: usbhost.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -121,484 +122,561 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    +
    33 #if SPI_HAS_TRANSACTION
    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 defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    -
    43  static void init() {
    -
    44  SPI_SS::SetDirWrite();
    -
    45  SPI_SS::Set();
    -
    46  SPI.begin();
    -
    47  SPI.setClockDivider(4); // Set speed to 84MHz/4=21MHz - the MAX3421E can handle up to 26MHz
    -
    48  }
    -
    49 #else
    -
    50  static void init() {
    -
    51  //uint8_t tmp;
    -
    52  SPI_CLK::SetDirWrite();
    -
    53  SPI_MOSI::SetDirWrite();
    -
    54  SPI_MISO::SetDirRead();
    -
    55  SPI_SS::SetDirWrite();
    -
    56  /* mode 00 (CPOL=0, CPHA=0) master, fclk/2. Mode 11 (CPOL=11, CPHA=11) is also supported by MAX3421E */
    -
    57  SPCR = 0x50;
    -
    58  SPSR = 0x01; // 0x01
    -
    59 
    -
    60  //tmp = SPSR;
    -
    61  //tmp = SPDR;
    +
    35  SPI.begin(); // The SPI library with transaction will take care of setting up the pins - settings is set in beginTransaction()
    +
    36  }
    +
    37 #elif USING_SPI4TEENSY3
    +
    38  static void init() {
    +
    39  // spi4teensy3 inits everything for us, except /SS
    +
    40  // CLK, MOSI and MISO are hard coded for now.
    +
    41  // spi4teensy3::init(0,0,0); // full speed, cpol 0, cpha 0
    +
    42  spi4teensy3::init(); // full speed, cpol 0, cpha 0
    +
    43  SPI_SS::SetDirWrite();
    +
    44  SPI_SS::Set();
    +
    45  }
    +
    46 #elif !defined(SPDR)
    +
    47  static void init() {
    +
    48  SPI_SS::SetDirWrite();
    +
    49  SPI_SS::Set();
    +
    50  SPI.begin();
    +
    51 #if defined(__MIPSEL__)
    +
    52  SPI.setClockDivider(1);
    +
    53 #elif defined(__ARDUINO_X86__)
    +
    54  #ifdef SPI_CLOCK_1M // Hack used to check if setClockSpeed is available
    +
    55  SPI.setClockSpeed(12000000); // The MAX3421E can handle up to 26MHz, but in practice this was the maximum that I could reliably use
    +
    56  #else
    +
    57  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
    +
    58  #endif
    +
    59 #else
    +
    60  SPI.setClockDivider(4); // Set speed to 84MHz/4=21MHz - the MAX3421E can handle up to 26MHz
    +
    61 #endif
    62  }
    -
    63 #endif
    -
    64 };
    -
    65 
    -
    66 /* SPI pin definitions. see avrpins.h */
    -
    67 #if defined(__AVR_ATmega1280__) || (__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
    -
    68 typedef SPi< Pb1, Pb2, Pb3, Pb0 > spi;
    -
    69 #elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
    -
    70 typedef SPi< Pb5, Pb3, Pb4, Pb2 > spi;
    -
    71 #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
    -
    72 typedef SPi< Pb7, Pb5, Pb6, Pb4 > spi;
    -
    73 #elif defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__))
    -
    74 typedef SPi< P13, P11, P12, P10 > spi;
    -
    75 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    -
    76 typedef SPi< P76, P75, P74, P10 > spi;
    -
    77 #else
    -
    78 #error "No SPI entry in usbhost.h"
    -
    79 #endif
    -
    80 
    -
    81 typedef enum {
    -
    82  vbus_on = 0,
    - -
    84 } VBUS_t;
    -
    85 
    -
    86 template< typename SPI_SS, typename INTR > class MAX3421e /* : public spi */ {
    -
    87  static uint8_t vbusState;
    -
    88 
    -
    89 public:
    -
    90  MAX3421e();
    -
    91  void regWr(uint8_t reg, uint8_t data);
    -
    92  uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p);
    -
    93  void gpioWr(uint8_t data);
    -
    94  uint8_t regRd(uint8_t reg);
    -
    95  uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p);
    -
    96  uint8_t gpioRd();
    -
    97  uint16_t reset();
    -
    98  int8_t Init();
    -
    99  int8_t Init(int mseconds);
    -
    100 
    -
    101  void vbusPower(VBUS_t state) {
    -
    102  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | state));
    -
    103  }
    -
    104 
    -
    105  uint8_t getVbusState(void) {
    -
    106  return vbusState;
    -
    107  };
    -
    108  void busprobe();
    -
    109  uint8_t GpxHandler();
    -
    110  uint8_t IntHandler();
    -
    111  uint8_t Task();
    -
    112 };
    -
    113 
    -
    114 template< typename SPI_SS, typename INTR >
    - -
    116 
    -
    117 /* constructor */
    -
    118 template< typename SPI_SS, typename INTR >
    - -
    120  // Leaving ADK hardware setup in here, for now. This really belongs with the other parts.
    -
    121 #ifdef BOARD_MEGA_ADK
    -
    122  // For Mega ADK, which has a Max3421e on-board, set MAX_RESET to output mode, and then set it to HIGH
    -
    123  P55::SetDirWrite();
    -
    124  P55::Set();
    -
    125 #endif
    -
    126 };
    +
    63 #elif defined(RBL_NRF51822)
    +
    64  static void init() {
    +
    65  SPI_SS::SetDirWrite();
    +
    66  SPI_SS::Set();
    +
    67  SPI.begin();
    +
    68  // SPI.setFrequency(SPI_FREQUENCY_8M);
    +
    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(__ARDUINO_X86__) || defined(__MIPSEL__)
    +
    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 /* write single byte into MAX3421 register */
    -
    129 template< typename SPI_SS, typename INTR >
    -
    130 void MAX3421e< SPI_SS, INTR >::regWr(uint8_t reg, uint8_t data) {
    - -
    132  SPI_SS::Clear();
    -
    133 #if USING_SPI4TEENSY3
    -
    134  uint8_t c[2];
    -
    135  c[0] = reg | 0x02;
    -
    136  c[1] = data;
    -
    137  spi4teensy3::send(c, 2);
    -
    138 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    -
    139  SPI.transfer(reg | 0x02);
    -
    140  SPI.transfer(data);
    -
    141 #else
    -
    142  SPDR = (reg | 0x02);
    -
    143  while(!(SPSR & (1 << SPIF)));
    -
    144  SPDR = data;
    -
    145  while(!(SPSR & (1 << SPIF)));
    -
    146 #endif
    -
    147  SPI_SS::Set();
    - -
    149  return;
    -
    150 };
    -
    151 /* multiple-byte write */
    -
    152 
    -
    153 /* returns a pointer to memory position after last written */
    -
    154 template< typename SPI_SS, typename INTR >
    -
    155 uint8_t* MAX3421e< SPI_SS, INTR >::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
    - -
    157  SPI_SS::Clear();
    -
    158 #if USING_SPI4TEENSY3
    -
    159  spi4teensy3::send(reg | 0x02);
    -
    160  spi4teensy3::send(data_p, nbytes);
    -
    161  data_p += nbytes;
    -
    162 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    -
    163  SPI.transfer(reg | 0x02);
    -
    164  while(nbytes) {
    -
    165  SPI.transfer(*data_p);
    -
    166  nbytes--;
    -
    167  data_p++; // advance data pointer
    -
    168  }
    -
    169 #else
    -
    170  SPDR = (reg | 0x02); //set WR bit and send register number
    -
    171  while(nbytes) {
    -
    172  while(!(SPSR & (1 << SPIF))); //check if previous byte was sent
    -
    173  SPDR = (*data_p); // send next data byte
    -
    174  nbytes--;
    -
    175  data_p++; // advance data pointer
    -
    176  }
    +
    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 SPI_HAS_TRANSACTION
    +
    161  uint8_t c[2];
    +
    162  c[0] = reg | 0x02;
    +
    163  c[1] = data;
    +
    164  SPI.transfer(c, 2);
    +
    165 #elif USING_SPI4TEENSY3
    +
    166  uint8_t c[2];
    +
    167  c[0] = reg | 0x02;
    +
    168  c[1] = data;
    +
    169  spi4teensy3::send(c, 2);
    +
    170 #elif !defined(SPDR)
    +
    171  SPI.transfer(reg | 0x02);
    +
    172  SPI.transfer(data);
    +
    173 #else
    +
    174  SPDR = (reg | 0x02);
    +
    175  while(!(SPSR & (1 << SPIF)));
    +
    176  SPDR = data;
    177  while(!(SPSR & (1 << SPIF)));
    178 #endif
    -
    179  SPI_SS::Set();
    - -
    181  return ( data_p);
    -
    182 }
    -
    183 /* GPIO write */
    -
    184 /*GPIO byte is split between 2 registers, so two writes are needed to write one byte */
    -
    185 
    -
    186 /* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */
    -
    187 template< typename SPI_SS, typename INTR >
    - -
    189  regWr(rIOPINS1, data);
    -
    190  data >>= 4;
    -
    191  regWr(rIOPINS2, data);
    -
    192  return;
    -
    193 }
    -
    194 
    -
    195 /* single host register read */
    -
    196 template< typename SPI_SS, typename INTR >
    -
    197 uint8_t MAX3421e< SPI_SS, INTR >::regRd(uint8_t reg) {
    - -
    199  SPI_SS::Clear();
    -
    200 #if USING_SPI4TEENSY3
    -
    201  spi4teensy3::send(reg);
    -
    202  uint8_t rv = spi4teensy3::receive();
    -
    203  SPI_SS::Set();
    -
    204 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    -
    205  SPI.transfer(reg);
    -
    206  uint8_t rv = SPI.transfer(0);
    -
    207  SPI_SS::Set();
    -
    208 #else
    -
    209  SPDR = reg;
    -
    210  while(!(SPSR & (1 << SPIF)));
    -
    211  SPDR = 0; //send empty byte
    -
    212  while(!(SPSR & (1 << SPIF)));
    -
    213  SPI_SS::Set();
    -
    214  uint8_t rv = SPDR;
    -
    215 #endif
    - -
    217  return (rv);
    -
    218 }
    -
    219 /* multiple-byte register read */
    -
    220 
    -
    221 /* returns a pointer to a memory position after last read */
    -
    222 template< typename SPI_SS, typename INTR >
    -
    223 uint8_t* MAX3421e< SPI_SS, INTR >::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
    - -
    225  SPI_SS::Clear();
    -
    226 #if USING_SPI4TEENSY3
    -
    227  spi4teensy3::send(reg);
    -
    228  spi4teensy3::receive(data_p, nbytes);
    -
    229  data_p += nbytes;
    -
    230 #elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)
    -
    231  SPI.transfer(reg);
    -
    232  while(nbytes) {
    -
    233  *data_p++ = SPI.transfer(0);
    -
    234  nbytes--;
    -
    235  }
    -
    236 #else
    -
    237  SPDR = reg;
    -
    238  while(!(SPSR & (1 << SPIF))); //wait
    -
    239  while(nbytes) {
    -
    240  SPDR = 0; //send empty byte
    -
    241  nbytes--;
    -
    242  while(!(SPSR & (1 << SPIF)));
    -
    243 #if 0
    -
    244  {
    -
    245  *data_p = SPDR;
    -
    246  printf("%2.2x ", *data_p);
    -
    247  }
    -
    248  data_p++;
    -
    249  }
    -
    250  printf("\r\n");
    -
    251 #else
    -
    252  *data_p++ = SPDR;
    -
    253  }
    -
    254 #endif
    -
    255 #endif
    -
    256  SPI_SS::Set();
    - -
    258  return ( data_p);
    -
    259 }
    -
    260 /* GPIO read. See gpioWr for explanation */
    -
    261 
    -
    262 /* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */
    -
    263 template< typename SPI_SS, typename INTR >
    - -
    265  uint8_t gpin = 0;
    -
    266  gpin = regRd(rIOPINS2); //pins 4-7
    -
    267  gpin &= 0xf0; //clean lower nibble
    -
    268  gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation.
    -
    269  return ( gpin);
    -
    270 }
    -
    271 
    -
    272 /* reset MAX3421E. Returns number of cycles it took for PLL to stabilize after reset
    -
    273  or zero if PLL haven't stabilized in 65535 cycles */
    -
    274 template< typename SPI_SS, typename INTR >
    - -
    276  uint16_t i = 0;
    -
    277  regWr(rUSBCTL, bmCHIPRES);
    -
    278  regWr(rUSBCTL, 0x00);
    -
    279  while(++i) {
    -
    280  if((regRd(rUSBIRQ) & bmOSCOKIRQ)) {
    -
    281  break;
    -
    282  }
    -
    283  }
    -
    284  return ( i);
    -
    285 }
    -
    286 
    -
    287 /* initialize MAX3421E. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not */
    -
    288 template< typename SPI_SS, typename INTR >
    - - -
    291  // Moved here.
    -
    292  // you really should not init hardware in the constructor when it involves locks.
    -
    293  // Also avoids the vbus flicker issue confusing some devices.
    -
    294  /* pin and peripheral setup */
    -
    295  SPI_SS::SetDirWrite();
    -
    296  SPI_SS::Set();
    -
    297  spi::init();
    -
    298  INTR::SetDirRead();
    - -
    300  /* MAX3421E - full-duplex SPI, level interrupt */
    -
    301  // GPX pin on. Moved here, otherwise we flicker the vbus.
    -
    302  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL));
    -
    303 
    -
    304  if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
    -
    305  return ( -1);
    -
    306  }
    -
    307 
    -
    308  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
    -
    309 
    -
    310  regWr(rHIEN, bmCONDETIE | bmFRAMEIE); //connection detection
    -
    311 
    -
    312  /* check if device is connected */
    -
    313  regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
    -
    314  while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
    -
    315 
    -
    316  busprobe(); //check if anything is connected
    -
    317 
    -
    318  regWr(rHIRQ, bmCONDETIRQ); //clear connection detect interrupt
    -
    319  regWr(rCPUCTL, 0x01); //enable interrupt pin
    -
    320 
    -
    321  return ( 0);
    -
    322 }
    -
    323 
    -
    324 /* initialize MAX3421E. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not */
    -
    325 template< typename SPI_SS, typename INTR >
    -
    326 int8_t MAX3421e< SPI_SS, INTR >::Init(int mseconds) {
    - -
    328  // Moved here.
    -
    329  // you really should not init hardware in the constructor when it involves locks.
    -
    330  // Also avoids the vbus flicker issue confusing some devices.
    -
    331  /* pin and peripheral setup */
    -
    332  SPI_SS::SetDirWrite();
    -
    333  SPI_SS::Set();
    -
    334  spi::init();
    -
    335  INTR::SetDirRead();
    - -
    337  /* MAX3421E - full-duplex SPI, level interrupt, vbus off */
    -
    338  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | GPX_VBDET));
    -
    339 
    -
    340  if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
    -
    341  return ( -1);
    -
    342  }
    -
    343 
    -
    344  // Delay a minimum of 1 second to ensure any capacitors are drained.
    -
    345  // 1 second is required to make sure we do not smoke a Microdrive!
    -
    346  if(mseconds < 1000) mseconds = 1000;
    -
    347  delay(mseconds);
    +
    179 
    +
    180  SPI_SS::Set();
    +
    181 #if SPI_HAS_TRANSACTION
    +
    182  SPI.endTransaction();
    +
    183 #endif
    + +
    185  return;
    +
    186 };
    +
    187 /* multiple-byte write */
    +
    188 
    +
    189 /* returns a pointer to memory position after last written */
    +
    190 template< typename SPI_SS, typename INTR >
    +
    191 uint8_t* MAX3421e< SPI_SS, INTR >::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
    + +
    193 #if SPI_HAS_TRANSACTION
    +
    194  SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    +
    195 #endif
    +
    196  SPI_SS::Clear();
    +
    197 
    +
    198 #if SPI_HAS_TRANSACTION
    +
    199  SPI.transfer(reg | 0x02);
    +
    200  SPI.transfer(data_p, nbytes);
    +
    201  data_p += nbytes;
    +
    202 #elif USING_SPI4TEENSY3
    +
    203  spi4teensy3::send(reg | 0x02);
    +
    204  spi4teensy3::send(data_p, nbytes);
    +
    205  data_p += nbytes;
    +
    206 #elif defined(__ARDUINO_X86__)
    +
    207  SPI.transfer(reg | 0x02);
    +
    208  SPI.transferBuffer(data_p, NULL, nbytes);
    +
    209  data_p += nbytes;
    +
    210 #elif !defined(SPDR)
    +
    211  SPI.transfer(reg | 0x02);
    +
    212  while(nbytes) {
    +
    213  SPI.transfer(*data_p);
    +
    214  nbytes--;
    +
    215  data_p++; // advance data pointer
    +
    216  }
    +
    217 #else
    +
    218  SPDR = (reg | 0x02); //set WR bit and send register number
    +
    219  while(nbytes) {
    +
    220  while(!(SPSR & (1 << SPIF))); //check if previous byte was sent
    +
    221  SPDR = (*data_p); // send next data byte
    +
    222  nbytes--;
    +
    223  data_p++; // advance data pointer
    +
    224  }
    +
    225  while(!(SPSR & (1 << SPIF)));
    +
    226 #endif
    +
    227 
    +
    228  SPI_SS::Set();
    +
    229 #if SPI_HAS_TRANSACTION
    +
    230  SPI.endTransaction();
    +
    231 #endif
    + +
    233  return ( data_p);
    +
    234 }
    +
    235 /* GPIO write */
    +
    236 /*GPIO byte is split between 2 registers, so two writes are needed to write one byte */
    +
    237 
    +
    238 /* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */
    +
    239 template< typename SPI_SS, typename INTR >
    + +
    241  regWr(rIOPINS1, data);
    +
    242  data >>= 4;
    +
    243  regWr(rIOPINS2, data);
    +
    244  return;
    +
    245 }
    +
    246 
    +
    247 /* single host register read */
    +
    248 template< typename SPI_SS, typename INTR >
    +
    249 uint8_t MAX3421e< SPI_SS, INTR >::regRd(uint8_t reg) {
    + +
    251 #if SPI_HAS_TRANSACTION
    +
    252  SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    +
    253 #endif
    +
    254  SPI_SS::Clear();
    +
    255 
    +
    256 #if !defined(SPDR) || SPI_HAS_TRANSACTION
    +
    257  SPI.transfer(reg);
    +
    258  uint8_t rv = SPI.transfer(0); // Send empty byte
    +
    259  SPI_SS::Set();
    +
    260 #elif USING_SPI4TEENSY3
    +
    261  spi4teensy3::send(reg);
    +
    262  uint8_t rv = spi4teensy3::receive();
    +
    263  SPI_SS::Set();
    +
    264 #else
    +
    265  SPDR = reg;
    +
    266  while(!(SPSR & (1 << SPIF)));
    +
    267  SPDR = 0; // Send empty byte
    +
    268  while(!(SPSR & (1 << SPIF)));
    +
    269  SPI_SS::Set();
    +
    270  uint8_t rv = SPDR;
    +
    271 #endif
    +
    272 
    +
    273 #if SPI_HAS_TRANSACTION
    +
    274  SPI.endTransaction();
    +
    275 #endif
    + +
    277  return (rv);
    +
    278 }
    +
    279 /* multiple-byte register read */
    +
    280 
    +
    281 /* returns a pointer to a memory position after last read */
    +
    282 template< typename SPI_SS, typename INTR >
    +
    283 uint8_t* MAX3421e< SPI_SS, INTR >::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) {
    + +
    285 #if SPI_HAS_TRANSACTION
    +
    286  SPI.beginTransaction(SPISettings(26000000, MSBFIRST, SPI_MODE0)); // The MAX3421E can handle up to 26MHz, use MSB First and SPI mode 0
    +
    287 #endif
    +
    288  SPI_SS::Clear();
    +
    289 
    +
    290 #if SPI_HAS_TRANSACTION
    +
    291  SPI.transfer(reg);
    +
    292  memset(data_p, 0, nbytes); // Make sure we send out empty bytes
    +
    293  SPI.transfer(data_p, nbytes);
    +
    294  data_p += nbytes;
    +
    295 #elif USING_SPI4TEENSY3
    +
    296  spi4teensy3::send(reg);
    +
    297  spi4teensy3::receive(data_p, nbytes);
    +
    298  data_p += nbytes;
    +
    299 #elif defined(__ARDUINO_X86__)
    +
    300  SPI.transfer(reg);
    +
    301  SPI.transferBuffer(NULL, data_p, nbytes);
    +
    302  data_p += nbytes;
    +
    303 #elif !defined(SPDR)
    +
    304  SPI.transfer(reg);
    +
    305  while(nbytes) {
    +
    306  *data_p++ = SPI.transfer(0);
    +
    307  nbytes--;
    +
    308  }
    +
    309 #else
    +
    310  SPDR = reg;
    +
    311  while(!(SPSR & (1 << SPIF))); //wait
    +
    312  while(nbytes) {
    +
    313  SPDR = 0; // Send empty byte
    +
    314  nbytes--;
    +
    315  while(!(SPSR & (1 << SPIF)));
    +
    316 #if 0
    +
    317  {
    +
    318  *data_p = SPDR;
    +
    319  printf("%2.2x ", *data_p);
    +
    320  }
    +
    321  data_p++;
    +
    322  }
    +
    323  printf("\r\n");
    +
    324 #else
    +
    325  *data_p++ = SPDR;
    +
    326  }
    +
    327 #endif
    +
    328 #endif
    +
    329 
    +
    330  SPI_SS::Set();
    +
    331 #if SPI_HAS_TRANSACTION
    +
    332  SPI.endTransaction();
    +
    333 #endif
    + +
    335  return ( data_p);
    +
    336 }
    +
    337 /* GPIO read. See gpioWr for explanation */
    +
    338 
    +
    339 /* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */
    +
    340 template< typename SPI_SS, typename INTR >
    + +
    342  uint8_t gpin = 0;
    +
    343  gpin = regRd(rIOPINS2); //pins 4-7
    +
    344  gpin &= 0xf0; //clean lower nibble
    +
    345  gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation.
    +
    346  return ( gpin);
    +
    347 }
    348 
    -
    349  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
    -
    350 
    -
    351  regWr(rHIEN, bmCONDETIE | bmFRAMEIE); //connection detection
    -
    352 
    -
    353  /* check if device is connected */
    -
    354  regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
    -
    355  while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
    -
    356 
    -
    357  busprobe(); //check if anything is connected
    -
    358 
    -
    359  regWr(rHIRQ, bmCONDETIRQ); //clear connection detect interrupt
    -
    360  regWr(rCPUCTL, 0x01); //enable interrupt pin
    -
    361 
    -
    362  // GPX pin on. This is done here so that busprobe will fail if we have a switch connected.
    -
    363  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL));
    -
    364 
    -
    365  return ( 0);
    -
    366 }
    -
    367 
    -
    368 /* probe bus to determine device presence and speed and switch host to this speed */
    -
    369 template< typename SPI_SS, typename INTR >
    - -
    371  uint8_t bus_sample;
    -
    372  bus_sample = regRd(rHRSL); //Get J,K status
    -
    373  bus_sample &= (bmJSTATUS | bmKSTATUS); //zero the rest of the byte
    -
    374  switch(bus_sample) { //start full-speed or low-speed host
    -
    375  case( bmJSTATUS):
    -
    376  if((regRd(rMODE) & bmLOWSPEED) == 0) {
    -
    377  regWr(rMODE, MODE_FS_HOST); //start full-speed host
    -
    378  vbusState = FSHOST;
    -
    379  } else {
    -
    380  regWr(rMODE, MODE_LS_HOST); //start low-speed host
    -
    381  vbusState = LSHOST;
    -
    382  }
    -
    383  break;
    -
    384  case( bmKSTATUS):
    -
    385  if((regRd(rMODE) & bmLOWSPEED) == 0) {
    -
    386  regWr(rMODE, MODE_LS_HOST); //start low-speed host
    -
    387  vbusState = LSHOST;
    -
    388  } else {
    -
    389  regWr(rMODE, MODE_FS_HOST); //start full-speed host
    -
    390  vbusState = FSHOST;
    -
    391  }
    -
    392  break;
    -
    393  case( bmSE1): //illegal state
    -
    394  vbusState = SE1;
    -
    395  break;
    -
    396  case( bmSE0): //disconnected state
    -
    397  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST | bmSEPIRQ);
    -
    398  vbusState = SE0;
    -
    399  break;
    -
    400  }//end switch( bus_sample )
    -
    401 }
    -
    402 
    -
    403 /* MAX3421 state change task and interrupt handler */
    -
    404 template< typename SPI_SS, typename INTR >
    - -
    406  uint8_t rcode = 0;
    -
    407  uint8_t pinvalue;
    -
    408  //USB_HOST_SERIAL.print("Vbus state: ");
    -
    409  //USB_HOST_SERIAL.println( vbusState, HEX );
    -
    410  pinvalue = INTR::IsSet(); //Read();
    -
    411  //pinvalue = digitalRead( MAX_INT );
    -
    412  if(pinvalue == 0) {
    -
    413  rcode = IntHandler();
    -
    414  }
    -
    415  // pinvalue = digitalRead( MAX_GPX );
    -
    416  // if( pinvalue == LOW ) {
    -
    417  // GpxHandler();
    -
    418  // }
    -
    419  // usbSM(); //USB state machine
    -
    420  return ( rcode);
    -
    421 }
    -
    422 
    -
    423 template< typename SPI_SS, typename INTR >
    - -
    425  uint8_t HIRQ;
    -
    426  uint8_t HIRQ_sendback = 0x00;
    -
    427  HIRQ = regRd(rHIRQ); //determine interrupt source
    -
    428  //if( HIRQ & bmFRAMEIRQ ) { //->1ms SOF interrupt handler
    -
    429  // HIRQ_sendback |= bmFRAMEIRQ;
    -
    430  //}//end FRAMEIRQ handling
    -
    431  if(HIRQ & bmCONDETIRQ) {
    -
    432  busprobe();
    -
    433  HIRQ_sendback |= bmCONDETIRQ;
    -
    434  }
    -
    435  /* End HIRQ interrupts handling, clear serviced IRQs */
    -
    436  regWr(rHIRQ, HIRQ_sendback);
    -
    437  return ( HIRQ_sendback);
    -
    438 }
    -
    439 //template< typename SPI_SS, typename INTR >
    -
    440 //uint8_t MAX3421e< SPI_SS, INTR >::GpxHandler()
    -
    441 //{
    -
    442 // uint8_t GPINIRQ = regRd( rGPINIRQ ); //read GPIN IRQ register
    -
    449 // return( GPINIRQ );
    -
    450 //}
    -
    451 
    -
    452 #endif //_USBHOST_H_
    -
    #define GPX_VBDET
    Definition: max3421e.h:80
    -
    #define rIOPINS1
    Definition: max3421e.h:86
    -
    void busprobe()
    Definition: usbhost.h:370
    -
    #define rHIEN
    Definition: max3421e.h:153
    -
    #define FSHOST
    Definition: max3421e.h:35
    -
    #define rHCTL
    Definition: max3421e.h:179
    -
    #define bmCONDETIRQ
    Definition: max3421e.h:149
    -
    #define bmCONDETIE
    Definition: max3421e.h:161
    -
    #define bmSE1
    Definition: max3421e.h:209
    -
    #define bmCHIPRES
    Definition: max3421e.h:62
    -
    uint8_t getVbusState(void)
    Definition: usbhost.h:105
    - -
    #define rCPUCTL
    Definition: max3421e.h:65
    -
    #define bmJSTATUS
    Definition: max3421e.h:207
    -
    uint16_t reset()
    Definition: usbhost.h:275
    - -
    #define MODE_LS_HOST
    Definition: max3421e.h:230
    -
    #define bmINTLEVEL
    Definition: max3421e.h:74
    -
    void gpioWr(uint8_t data)
    Definition: usbhost.h:188
    -
    uint8_t Task()
    Definition: usbhost.h:405
    -
    #define rUSBCTL
    Definition: max3421e.h:60
    -
    #define bmSE0
    Definition: max3421e.h:208
    -
    #define bmHOST
    Definition: max3421e.h:168
    -
    #define bmSEPIRQ
    Definition: max3421e.h:172
    -
    uint8_t gpioRd()
    Definition: usbhost.h:264
    -
    int8_t Init()
    Definition: usbhost.h:289
    +
    349 /* reset MAX3421E. Returns number of cycles it took for PLL to stabilize after reset
    +
    350  or zero if PLL haven't stabilized in 65535 cycles */
    +
    351 template< typename SPI_SS, typename INTR >
    + +
    353  uint16_t i = 0;
    +
    354  regWr(rUSBCTL, bmCHIPRES);
    +
    355  regWr(rUSBCTL, 0x00);
    +
    356  while(++i) {
    +
    357  if((regRd(rUSBIRQ) & bmOSCOKIRQ)) {
    +
    358  break;
    +
    359  }
    +
    360  }
    +
    361  return ( i);
    +
    362 }
    +
    363 
    +
    364 /* initialize MAX3421E. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not */
    +
    365 template< typename SPI_SS, typename INTR >
    + + +
    368  // Moved here.
    +
    369  // you really should not init hardware in the constructor when it involves locks.
    +
    370  // Also avoids the vbus flicker issue confusing some devices.
    +
    371  /* pin and peripheral setup */
    +
    372  SPI_SS::SetDirWrite();
    +
    373  SPI_SS::Set();
    +
    374  spi::init();
    +
    375  INTR::SetDirRead();
    + +
    377  /* MAX3421E - full-duplex SPI, level interrupt */
    +
    378  // GPX pin on. Moved here, otherwise we flicker the vbus.
    +
    379  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL));
    +
    380 
    +
    381  if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
    +
    382  return ( -1);
    +
    383  }
    +
    384 
    +
    385  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
    +
    386 
    +
    387  regWr(rHIEN, bmCONDETIE | bmFRAMEIE); //connection detection
    +
    388 
    +
    389  /* check if device is connected */
    +
    390  regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
    +
    391  while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
    +
    392 
    +
    393  busprobe(); //check if anything is connected
    +
    394 
    +
    395  regWr(rHIRQ, bmCONDETIRQ); //clear connection detect interrupt
    +
    396  regWr(rCPUCTL, 0x01); //enable interrupt pin
    +
    397 
    +
    398  return ( 0);
    +
    399 }
    +
    400 
    +
    401 /* initialize MAX3421E. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not */
    +
    402 template< typename SPI_SS, typename INTR >
    +
    403 int8_t MAX3421e< SPI_SS, INTR >::Init(int mseconds) {
    + +
    405  // Moved here.
    +
    406  // you really should not init hardware in the constructor when it involves locks.
    +
    407  // Also avoids the vbus flicker issue confusing some devices.
    +
    408  /* pin and peripheral setup */
    +
    409  SPI_SS::SetDirWrite();
    +
    410  SPI_SS::Set();
    +
    411  spi::init();
    +
    412  INTR::SetDirRead();
    + +
    414  /* MAX3421E - full-duplex SPI, level interrupt, vbus off */
    +
    415  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | GPX_VBDET));
    +
    416 
    +
    417  if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
    +
    418  return ( -1);
    +
    419  }
    +
    420 
    +
    421  // Delay a minimum of 1 second to ensure any capacitors are drained.
    +
    422  // 1 second is required to make sure we do not smoke a Microdrive!
    +
    423  if(mseconds < 1000) mseconds = 1000;
    +
    424  delay(mseconds);
    +
    425 
    +
    426  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
    +
    427 
    +
    428  regWr(rHIEN, bmCONDETIE | bmFRAMEIE); //connection detection
    +
    429 
    +
    430  /* check if device is connected */
    +
    431  regWr(rHCTL, bmSAMPLEBUS); // sample USB bus
    +
    432  while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish
    +
    433 
    +
    434  busprobe(); //check if anything is connected
    +
    435 
    +
    436  regWr(rHIRQ, bmCONDETIRQ); //clear connection detect interrupt
    +
    437  regWr(rCPUCTL, 0x01); //enable interrupt pin
    +
    438 
    +
    439  // GPX pin on. This is done here so that busprobe will fail if we have a switch connected.
    +
    440  regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL));
    +
    441 
    +
    442  return ( 0);
    +
    443 }
    +
    444 
    +
    445 /* probe bus to determine device presence and speed and switch host to this speed */
    +
    446 template< typename SPI_SS, typename INTR >
    + +
    448  uint8_t bus_sample;
    +
    449  bus_sample = regRd(rHRSL); //Get J,K status
    +
    450  bus_sample &= (bmJSTATUS | bmKSTATUS); //zero the rest of the byte
    +
    451  switch(bus_sample) { //start full-speed or low-speed host
    +
    452  case( bmJSTATUS):
    +
    453  if((regRd(rMODE) & bmLOWSPEED) == 0) {
    +
    454  regWr(rMODE, MODE_FS_HOST); //start full-speed host
    +
    455  vbusState = FSHOST;
    +
    456  } else {
    +
    457  regWr(rMODE, MODE_LS_HOST); //start low-speed host
    +
    458  vbusState = LSHOST;
    +
    459  }
    +
    460  break;
    +
    461  case( bmKSTATUS):
    +
    462  if((regRd(rMODE) & bmLOWSPEED) == 0) {
    +
    463  regWr(rMODE, MODE_LS_HOST); //start low-speed host
    +
    464  vbusState = LSHOST;
    +
    465  } else {
    +
    466  regWr(rMODE, MODE_FS_HOST); //start full-speed host
    +
    467  vbusState = FSHOST;
    +
    468  }
    +
    469  break;
    +
    470  case( bmSE1): //illegal state
    +
    471  vbusState = SE1;
    +
    472  break;
    +
    473  case( bmSE0): //disconnected state
    +
    474  regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST | bmSEPIRQ);
    +
    475  vbusState = SE0;
    +
    476  break;
    +
    477  }//end switch( bus_sample )
    +
    478 }
    +
    479 
    +
    480 /* MAX3421 state change task and interrupt handler */
    +
    481 template< typename SPI_SS, typename INTR >
    + +
    483  uint8_t rcode = 0;
    +
    484  uint8_t pinvalue;
    +
    485  //USB_HOST_SERIAL.print("Vbus state: ");
    +
    486  //USB_HOST_SERIAL.println( vbusState, HEX );
    +
    487  pinvalue = INTR::IsSet(); //Read();
    +
    488  //pinvalue = digitalRead( MAX_INT );
    +
    489  if(pinvalue == 0) {
    +
    490  rcode = IntHandler();
    +
    491  }
    +
    492  // pinvalue = digitalRead( MAX_GPX );
    +
    493  // if( pinvalue == LOW ) {
    +
    494  // GpxHandler();
    +
    495  // }
    +
    496  // usbSM(); //USB state machine
    +
    497  return ( rcode);
    +
    498 }
    +
    499 
    +
    500 template< typename SPI_SS, typename INTR >
    + +
    502  uint8_t HIRQ;
    +
    503  uint8_t HIRQ_sendback = 0x00;
    +
    504  HIRQ = regRd(rHIRQ); //determine interrupt source
    +
    505  //if( HIRQ & bmFRAMEIRQ ) { //->1ms SOF interrupt handler
    +
    506  // HIRQ_sendback |= bmFRAMEIRQ;
    +
    507  //}//end FRAMEIRQ handling
    +
    508  if(HIRQ & bmCONDETIRQ) {
    +
    509  busprobe();
    +
    510  HIRQ_sendback |= bmCONDETIRQ;
    +
    511  }
    +
    512  /* End HIRQ interrupts handling, clear serviced IRQs */
    +
    513  regWr(rHIRQ, HIRQ_sendback);
    +
    514  return ( HIRQ_sendback);
    +
    515 }
    +
    516 //template< typename SPI_SS, typename INTR >
    +
    517 //uint8_t MAX3421e< SPI_SS, INTR >::GpxHandler()
    +
    518 //{
    +
    519 // uint8_t GPINIRQ = regRd( rGPINIRQ ); //read GPIN IRQ register
    +
    526 // return( GPINIRQ );
    +
    527 //}
    +
    528 
    +
    529 #endif // _USBHOST_H_
    +
    #define GPX_VBDET
    Definition: max3421e.h:75
    +
    #define rIOPINS1
    Definition: max3421e.h:81
    +
    void busprobe()
    Definition: usbhost.h:447
    +
    #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:352
    + +
    #define MODE_LS_HOST
    Definition: max3421e.h:225
    +
    #define bmINTLEVEL
    Definition: max3421e.h:69
    +
    void gpioWr(uint8_t data)
    Definition: usbhost.h:240
    +
    uint8_t Task()
    Definition: usbhost.h:482
    +
    #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:341
    +
    int8_t Init()
    Definition: usbhost.h:366
    uint8_t GpxHandler()
    -
    #define LSHOST
    Definition: max3421e.h:36
    -
    #define rMODE
    Definition: max3421e.h:165
    -
    #define MODE_FS_HOST
    Definition: max3421e.h:229
    -
    void vbusPower(VBUS_t state)
    Definition: usbhost.h:101
    -
    #define bmKSTATUS
    Definition: max3421e.h:206
    -
    #define rHRSL
    Definition: max3421e.h:201
    -
    uint8_t * bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:223
    -
    #define XMEM_ACQUIRE_SPI()
    Definition: settings.h:123
    -
    #define bmLOWSPEED
    Definition: max3421e.h:169
    -
    uint8_t * bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:155
    +
    #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:283
    +
    #define XMEM_ACQUIRE_SPI()
    Definition: settings.h:115
    +
    #define bmLOWSPEED
    Definition: max3421e.h:164
    +
    uint8_t * bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p)
    Definition: usbhost.h:191
    Definition: usbhost.h:31
    -
    #define rHIRQ
    Definition: max3421e.h:142
    -
    #define rUSBIRQ
    Definition: max3421e.h:48
    -
    #define XMEM_RELEASE_SPI()
    Definition: settings.h:124
    -
    #define bmFDUPSPI
    Definition: max3421e.h:73
    -
    #define rPINCTL
    Definition: max3421e.h:71
    -
    VBUS_t
    Definition: usbhost.h:81
    -
    void regWr(uint8_t reg, uint8_t data)
    Definition: usbhost.h:130
    -
    #define bmFRAMEIE
    Definition: max3421e.h:162
    -
    uint8_t IntHandler()
    Definition: usbhost.h:424
    -
    #define bmOSCOKIRQ
    Definition: max3421e.h:52
    -
    uint8_t regRd(uint8_t reg)
    Definition: usbhost.h:197
    -
    MAX3421e()
    Definition: usbhost.h:119
    - -
    #define SE0
    Definition: max3421e.h:33
    -
    #define rIOPINS2
    Definition: max3421e.h:98
    -
    #define bmDMPULLDN
    Definition: max3421e.h:174
    -
    #define SE1
    Definition: max3421e.h:34
    -
    #define bmSAMPLEBUS
    Definition: max3421e.h:183
    -
    static void init()
    Definition: usbhost.h:50
    -
    #define bmDPPULLDN
    Definition: max3421e.h:175
    +
    #define rHIRQ
    Definition: max3421e.h:137
    +
    #define rUSBIRQ
    Definition: max3421e.h:43
    +
    #define XMEM_RELEASE_SPI()
    Definition: settings.h:116
    +
    #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:501
    +
    #define bmOSCOKIRQ
    Definition: max3421e.h:47
    +
    uint8_t regRd(uint8_t reg)
    Definition: usbhost.h:249
    +
    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:47
    +
    #define bmDPPULLDN
    Definition: max3421e.h:170
    diff --git a/usbhub_8cpp.html b/usbhub_8cpp.html index 0ebd49b8..46de35c1 100644 --- a/usbhub_8cpp.html +++ b/usbhub_8cpp.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: usbhub.cpp File Reference + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -153,7 +154,7 @@ Functions diff --git a/usbhub_8cpp__incl.md5 b/usbhub_8cpp__incl.md5 index 3fe83bc5..10f8250c 100644 --- a/usbhub_8cpp__incl.md5 +++ b/usbhub_8cpp__incl.md5 @@ -1 +1 @@ -7bb3faf4e14385f717626e8dacb74409 \ No newline at end of file +d30f3e0393f05796b3f85b9b895576e7 \ No newline at end of file diff --git a/usbhub_8cpp_source.html b/usbhub_8cpp_source.html index 928319ff..f2c1dbfd 100644 --- a/usbhub_8cpp_source.html +++ b/usbhub_8cpp_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: usbhub.cpp Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -344,9 +345,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    253  // rcode = GetHubStatus(1, 0, 1, 4, buf);
    254  // if (rcode)
    255  // {
    -
    256  // USB_HOST_SERIAL.print("GetHubStatus Error");
    -
    257  // USB_HOST_SERIAL.println(rcode, HEX);
    -
    258  // return rcode;
    +
    256  // USB_HOST_SERIAL.print("GetHubStatus Error");
    +
    257  // USB_HOST_SERIAL.println(rcode, HEX);
    +
    258  // return rcode;
    259  // }
    260  //}
    261  for(uint8_t port = 1, mask = 0x02; port < 8; mask <<= 1, port++) {
    @@ -514,7 +515,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    423  USB_HOST_SERIAL.print("RESET:\t\t");
    424  USB_HOST_SERIAL.println((evt.bmChange & bmHUB_PORT_STATUS_C_PORT_RESET) > 0, DEC);
    425 }
    -
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:766
    +
    uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr)
    Definition: Usb.cpp:769
    #define bmHUB_PORT_STATE_CHECK_DISABLED
    Definition: usbhub.h:119
    #define bmHUB_PORT_EVENT_LS_RESET_COMPLETE
    Definition: usbhub.h:130
    @@ -522,7 +523,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #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:81
    +
    #define USB_ERROR_EPINFO_IS_NULL
    Definition: UsbCore.h:83
    uint8_t bmNakPower
    Definition: address.h:42
    uint16_t bmChange
    Definition: usbhub.h:157
    @@ -534,21 +535,21 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    #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:805
    -
    virtual void ResetHubPort(uint8_t port)
    Definition: usbhub.cpp:307
    +
    uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value)
    Definition: Usb.cpp:808
    +
    void ResetHubPort(uint8_t port)
    Definition: usbhub.cpp:307
    uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr)
    Definition: Usb.cpp:64
    virtual void FreeAddress(uint8_t addr)=0
    #define bmHUB_PORT_STATUS_C_PORT_ENABLE
    Definition: usbhub.h:89
    uint8_t epAttribs
    Definition: address.h:37
    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:796
    +
    uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr)
    Definition: Usb.cpp:799
    #define USB_HOST_SERIAL
    Definition: settings.h:34
    uint8_t epAddr
    Definition: address.h:33
    #define USB_NAK_MAX_POWER
    Definition: address.h:27
    #define bmHUB_PORT_STATE_DISABLED
    Definition: usbhub.h:122
    -
    void SetHubPreMask()
    Definition: UsbCore.h:198
    +
    void SetHubPreMask()
    Definition: UsbCore.h:205
    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
    @@ -560,10 +561,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint32_t bmEvent
    Definition: usbhub.h:159
    virtual uint8_t AllocAddress(uint8_t parent, bool is_hub=false, uint8_t port=0)=0
    -
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:83
    +
    #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE
    Definition: UsbCore.h:85
    #define bmHUB_PORT_STATUS_C_PORT_RESET
    Definition: usbhub.h:92
    uint8_t bDeviceClass
    Definition: usb_ch9.h:102
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbhub.cpp:42
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbhub.cpp:42
    Definition: usbhub.h:164
    uint16_t bmStatus
    Definition: usbhub.h:156
    #define HUB_FEATURE_C_PORT_CONNECTION
    Definition: usbhub.h:54
    @@ -572,23 +573,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint8_t bmAddress
    Definition: address.h:62
    #define USB_NAK_NOWAIT
    Definition: address.h:29
    #define bmHUB_PORT_STATUS_PORT_RESET
    Definition: usbhub.h:80
    -
    #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL
    Definition: UsbCore.h:80
    +
    #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)
    Definition: Usb.cpp:206
    -
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:75
    +
    #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED
    Definition: UsbCore.h:77
    uint8_t bmParent
    Definition: address.h:63
    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
    -
    virtual uint8_t Release()
    Definition: usbhub.cpp:214
    +
    uint8_t Release()
    Definition: usbhub.cpp:214
    #define HUB_FEATURE_PORT_RESET
    Definition: usbhub.h:51
    -
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:78
    +
    #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL
    Definition: UsbCore.h:80
    #define bmHUB_PORT_STATUS_PORT_ENABLE
    Definition: usbhub.h:77
    uint8_t maxPktSize
    Definition: address.h:34
    -
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:206
    +
    AddressPool & GetAddressPool()
    Definition: UsbCore.h:213
    uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: Usb.cpp:652
    -
    Definition: UsbCore.h:190
    +
    Definition: UsbCore.h:197
    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:210
    +
    uint8_t RegisterDeviceClass(USBDeviceConfig *pdev)
    Definition: UsbCore.h:217
    #define bmHUB_PORT_STATUS_PORT_TEST
    Definition: usbhub.h:84
    #define bmHUB_PORT_EVENT_LS_CONNECT
    Definition: usbhub.h:129
    @@ -597,11 +598,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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:761
    +
    uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr)
    defined(USB_METHODS_INLINE)
    Definition: Usb.cpp:764
    uint8_t bmHub
    Definition: address.h:64
    -
    virtual uint8_t Poll()
    Definition: usbhub.cpp:227
    +
    uint8_t Poll()
    Definition: usbhub.cpp:227
    USBHub(USB *p)
    Definition: usbhub.cpp:21
    -
    uint8_t ReleaseDevice(uint8_t addr)
    Definition: Usb.cpp:746
    +
    uint8_t ReleaseDevice(uint8_t addr)
    Definition: Usb.cpp:749
    #define bmHUB_PORT_EVENT_DISCONNECT
    Definition: usbhub.h:126
    @@ -610,7 +611,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/usbhub_8h.html b/usbhub_8h.html index ca051af9..1cc917d8 100644 --- a/usbhub_8h.html +++ b/usbhub_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: usbhub.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -260,23 +261,23 @@ Macros   #define HUB_ERROR_PORT_HAS_BEEN_RESET   0xb1   -#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) +#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)   #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)   #define bmHUB_PORT_STATE_DISABLED   (0x0000 | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION)   -#define bmHUB_PORT_EVENT_CONNECT   (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION) +#define bmHUB_PORT_EVENT_CONNECT   (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION)   -#define bmHUB_PORT_EVENT_DISCONNECT   (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER) +#define bmHUB_PORT_EVENT_DISCONNECT   (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER)   -#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) +#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)   -#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) +#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)   -#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) +#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)   -#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) +#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)  

    @@ -1256,7 +1257,7 @@ Functions

    - +
    #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)#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)
    @@ -1298,7 +1299,7 @@ Functions
    - +
    #define bmHUB_PORT_EVENT_CONNECT   (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION)#define bmHUB_PORT_EVENT_CONNECT   (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER | bmHUB_PORT_STATUS_PORT_CONNECTION)
    @@ -1312,7 +1313,7 @@ Functions
    - +
    #define bmHUB_PORT_EVENT_DISCONNECT   (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER)#define bmHUB_PORT_EVENT_DISCONNECT   (((0UL | bmHUB_PORT_STATUS_C_PORT_CONNECTION) << 16) | bmHUB_PORT_STATUS_PORT_POWER)
    @@ -1326,7 +1327,7 @@ Functions
    - +
    #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)#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)
    @@ -1340,7 +1341,7 @@ Functions
    - +
    #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)#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)
    @@ -1354,7 +1355,7 @@ Functions
    - +
    #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)#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)
    @@ -1368,7 +1369,7 @@ Functions
    - +
    #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)#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)
    @@ -1421,7 +1422,7 @@ Functions diff --git a/usbhub_8h__dep__incl.md5 b/usbhub_8h__dep__incl.md5 index ba39f868..f8e4934f 100644 --- a/usbhub_8h__dep__incl.md5 +++ b/usbhub_8h__dep__incl.md5 @@ -1 +1 @@ -f7805dd5aebe658aba38ee12c3ade2e3 \ No newline at end of file +600ba6d376b8fce703e559892c09ebf2 \ No newline at end of file diff --git a/usbhub_8h__incl.md5 b/usbhub_8h__incl.md5 index aadc2324..2966a465 100644 --- a/usbhub_8h__incl.md5 +++ b/usbhub_8h__incl.md5 @@ -1 +1 @@ -72cfd5a19df6b412213ae2c7400f96e8 \ No newline at end of file +dd1f2b59c87dcda8d5477cdc57930370 \ No newline at end of file diff --git a/usbhub_8h_source.html b/usbhub_8h_source.html index 11a1b9a7..55610232 100644 --- a/usbhub_8h_source.html +++ b/usbhub_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: usbhub.h Source File + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -110,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    19 
    20 #include "Usb.h"
    21 
    -
    22 #define USB_DESCRIPTOR_HUB 0x09 // Hub descriptor type
    +
    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
    @@ -164,62 +165,62 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    +
    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
    +
    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
    +
    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
    +
    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
    +
    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
    +
    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
    +
    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
    +
    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)
    +
    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)
    +
    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)
    +
    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)
    +
    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)
    +
    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
    @@ -282,16 +283,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    191 
    192  void PrintHubStatus();
    193 
    -
    194  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
    -
    195  virtual uint8_t Release();
    -
    196  virtual uint8_t Poll();
    -
    197  virtual void ResetHubPort(uint8_t port);
    +
    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 boolean DEVCLASSOK(uint8_t klass) {
    +
    203  virtual bool DEVCLASSOK(uint8_t klass) {
    204  return (klass == 0x09);
    205  }
    206 
    @@ -348,10 +349,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    -
    virtual void ResetHubPort(uint8_t port)
    Definition: usbhub.cpp:307
    +
    virtual bool DEVCLASSOK(uint8_t klass)
    Definition: usbhub.h:203
    +
    void ResetHubPort(uint8_t port)
    Definition: usbhub.cpp:307
    uint16_t OverCurrentProtectMode
    Definition: usbhub.h:141
    -
    virtual boolean DEVCLASSOK(uint8_t klass)
    Definition: usbhub.h:203
    - +
    #define bmREQ_GET_HUB_DESCRIPTOR
    Definition: usbhub.h:28
    uint8_t GetHubStatus(uint16_t nbytes, uint8_t *dataptr)
    Definition: usbhub.h:226
    @@ -372,7 +373,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    uint32_t bmEvent
    Definition: usbhub.h:159
    uint8_t bDescriptorType
    Definition: usbhub.h:135
    uint16_t PortIndicatorsSupported
    Definition: usbhub.h:143
    -
    virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbhub.cpp:42
    +
    uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
    Definition: usbhub.cpp:42
    Definition: usbhub.h:164
    uint16_t bmStatus
    Definition: usbhub.h:156
    #define bmREQ_SET_HUB_DESCRIPTOR
    Definition: usbhub.h:32
    @@ -383,8 +384,8 @@ 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
    -
    virtual uint8_t Release()
    Definition: usbhub.cpp:214
    -
    Definition: UsbCore.h:190
    +
    uint8_t Release()
    Definition: usbhub.cpp:214
    +
    Definition: UsbCore.h:197
    uint8_t evtBuff[4]
    Definition: usbhub.h:160
    uint16_t CompoundDevice
    Definition: usbhub.h:140
    uint16_t LogPwrSwitchMode
    Definition: usbhub.h:139
    @@ -392,14 +393,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    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
    -
    virtual uint8_t Poll()
    Definition: usbhub.cpp:227
    +
    uint8_t Poll()
    Definition: usbhub.cpp:227
    USBHub(USB *p)
    Definition: usbhub.cpp:21
    diff --git a/version__helper_8h.html b/version__helper_8h.html new file mode 100644 index 00000000..09f52012 --- /dev/null +++ b/version__helper_8h.html @@ -0,0 +1,1645 @@ + + + + + + +USB Host Shield 2.0: version_helper.h File Reference + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    version_helper.h File Reference
    +
    +
    +
    #include <Arduino.h>
    +#include <inttypes.h>
    +
    +Include dependency graph for version_helper.h:
    +
    +
    +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    #define __PGMSPACE_H_   1
     
    #define PGM_P   const char *
     
    #define PSTR(str)   (str)
     
    #define F(str)   (str)
     
    #define _SFR_BYTE(n)   (n)
     
    #define memchr_P(str, c, len)   memchr((str), (c), (len))
     
    #define memcmp_P(a, b, n)   memcmp((a), (b), (n))
     
    #define memcpy_P(dest, src, num)   memcpy((dest), (src), (num))
     
    #define memmem_P(a, alen, b, blen)   memmem((a), (alen), (b), (blen))
     
    #define memrchr_P(str, val, len)   memrchr((str), (val), (len))
     
    #define strcat_P(dest, src)   strcat((dest), (src))
     
    #define strchr_P(str, c)   strchr((str), (c))
     
    #define strchrnul_P(str, c)   strchrnul((str), (c))
     
    #define strcmp_P(a, b)   strcmp((a), (b))
     
    #define strcpy_P(dest, src)   strcpy((dest), (src))
     
    #define strcasecmp_P(a, b)   strcasecmp((a), (b))
     
    #define strcasestr_P(a, b)   strcasestr((a), (b))
     
    #define strlcat_P(dest, src, len)   strlcat((dest), (src), (len))
     
    #define strlcpy_P(dest, src, len)   strlcpy((dest), (src), (len))
     
    #define strlen_P(s)   strlen((const char *)(s))
     
    #define strnlen_P(str, len)   strnlen((str), (len))
     
    #define strncmp_P(a, b, n)   strncmp((a), (b), (n))
     
    #define strncasecmp_P(a, b, n)   strncasecmp((a), (b), (n))
     
    #define strncat_P(a, b, n)   strncat((a), (b), (n))
     
    #define strncpy_P(a, b, n)   strncmp((a), (b), (n))
     
    #define strpbrk_P(str, chrs)   strpbrk((str), (chrs))
     
    #define strrchr_P(str, c)   strrchr((str), (c))
     
    #define strsep_P(strp, delim)   strsep((strp), (delim))
     
    #define strspn_P(str, chrs)   strspn((str), (chrs))
     
    #define strstr_P(a, b)   strstr((a), (b))
     
    #define sprintf_P(s, ...)   sprintf((s), __VA_ARGS__)
     
    #define vfprintf_P(s, ...)   vfprintf((s), __VA_ARGS__)
     
    #define printf_P(...)   printf(__VA_ARGS__)
     
    #define snprintf_P(s, n, ...)   ((s), (n), __VA_ARGS__)
     
    #define vsprintf_P(s, ...)   ((s),__VA_ARGS__)
     
    #define vsnprintf_P(s, n, ...)   ((s), (n),__VA_ARGS__)
     
    #define fprintf_P(s, ...)   ((s), __VA_ARGS__)
     
    #define pgm_read_byte(addr)   (*(const unsigned char *)(addr))
     
    #define pgm_read_word(addr)   (*(const unsigned short *)(addr))
     
    #define pgm_read_dword(addr)   (*(const unsigned long *)(addr))
     
    #define pgm_read_float(addr)   (*(const float *)(addr))
     
    #define pgm_read_byte_near(addr)   pgm_read_byte(addr)
     
    #define pgm_read_word_near(addr)   pgm_read_word(addr)
     
    #define pgm_read_dword_near(addr)   pgm_read_dword(addr)
     
    #define pgm_read_float_near(addr)   pgm_read_float(addr)
     
    #define pgm_read_byte_far(addr)   pgm_read_byte(addr)
     
    #define pgm_read_word_far(addr)   pgm_read_word(addr)
     
    #define pgm_read_dword_far(addr)   pgm_read_dword(addr)
     
    #define pgm_read_float_far(addr)   pgm_read_float(addr)
     
    #define pgm_read_pointer
     
    + + + + + + + + + + + + + + + + + + + +

    +Typedefs

    typedef void prog_void
     
    typedef char prog_char
     
    typedef unsigned char prog_uchar
     
    typedef int8_t prog_int8_t
     
    typedef uint8_t prog_uint8_t
     
    typedef int16_t prog_int16_t
     
    typedef uint16_t prog_uint16_t
     
    typedef int32_t prog_int32_t
     
    typedef uint32_t prog_uint32_t
     
    +

    Macro Definition Documentation

    + +
    +
    + + + + +
    #define __PGMSPACE_H_   1
    +
    + +

    Definition at line 36 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    #define PGM_P   const char *
    +
    + +

    Definition at line 44 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define PSTR( str)   (str)
    +
    + +

    Definition at line 47 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define F( str)   (str)
    +
    + +

    Definition at line 50 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define _SFR_BYTE( n)   (n)
    +
    + +

    Definition at line 53 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define memchr_P( str,
     c,
     len 
    )   memchr((str), (c), (len))
    +
    + +

    Definition at line 85 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define memcmp_P( a,
     b,
     
    )   memcmp((a), (b), (n))
    +
    + +

    Definition at line 88 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define memcpy_P( dest,
     src,
     num 
    )   memcpy((dest), (src), (num))
    +
    + +

    Definition at line 91 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #define memmem_P( a,
     alen,
     b,
     blen 
    )   memmem((a), (alen), (b), (blen))
    +
    + +

    Definition at line 94 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define memrchr_P( str,
     val,
     len 
    )   memrchr((str), (val), (len))
    +
    + +

    Definition at line 97 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strcat_P( dest,
     src 
    )   strcat((dest), (src))
    +
    + +

    Definition at line 100 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strchr_P( str,
     
    )   strchr((str), (c))
    +
    + +

    Definition at line 103 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strchrnul_P( str,
     
    )   strchrnul((str), (c))
    +
    + +

    Definition at line 106 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strcmp_P( a,
     
    )   strcmp((a), (b))
    +
    + +

    Definition at line 109 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strcpy_P( dest,
     src 
    )   strcpy((dest), (src))
    +
    + +

    Definition at line 112 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strcasecmp_P( a,
     
    )   strcasecmp((a), (b))
    +
    + +

    Definition at line 115 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strcasestr_P( a,
     
    )   strcasestr((a), (b))
    +
    + +

    Definition at line 118 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define strlcat_P( dest,
     src,
     len 
    )   strlcat((dest), (src), (len))
    +
    + +

    Definition at line 121 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define strlcpy_P( dest,
     src,
     len 
    )   strlcpy((dest), (src), (len))
    +
    + +

    Definition at line 124 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define strlen_P( s)   strlen((const char *)(s))
    +
    + +

    Definition at line 127 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strnlen_P( str,
     len 
    )   strnlen((str), (len))
    +
    + +

    Definition at line 130 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define strncmp_P( a,
     b,
     
    )   strncmp((a), (b), (n))
    +
    + +

    Definition at line 133 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define strncasecmp_P( a,
     b,
     
    )   strncasecmp((a), (b), (n))
    +
    + +

    Definition at line 136 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define strncat_P( a,
     b,
     
    )   strncat((a), (b), (n))
    +
    + +

    Definition at line 139 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define strncpy_P( a,
     b,
     
    )   strncmp((a), (b), (n))
    +
    + +

    Definition at line 142 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strpbrk_P( str,
     chrs 
    )   strpbrk((str), (chrs))
    +
    + +

    Definition at line 145 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strrchr_P( str,
     
    )   strrchr((str), (c))
    +
    + +

    Definition at line 148 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strsep_P( strp,
     delim 
    )   strsep((strp), (delim))
    +
    + +

    Definition at line 151 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strspn_P( str,
     chrs 
    )   strspn((str), (chrs))
    +
    + +

    Definition at line 154 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define strstr_P( a,
     
    )   strstr((a), (b))
    +
    + +

    Definition at line 157 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define sprintf_P( s,
     ... 
    )   sprintf((s), __VA_ARGS__)
    +
    + +

    Definition at line 160 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define vfprintf_P( s,
     ... 
    )   vfprintf((s), __VA_ARGS__)
    +
    + +

    Definition at line 163 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define printf_P( ...)   printf(__VA_ARGS__)
    +
    + +

    Definition at line 166 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define snprintf_P( s,
     n,
     ... 
    )   ((s), (n), __VA_ARGS__)
    +
    + +

    Definition at line 169 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define vsprintf_P( s,
     ... 
    )   ((s),__VA_ARGS__)
    +
    + +

    Definition at line 172 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    #define vsnprintf_P( s,
     n,
     ... 
    )   ((s), (n),__VA_ARGS__)
    +
    + +

    Definition at line 175 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define fprintf_P( s,
     ... 
    )   ((s), __VA_ARGS__)
    +
    + +

    Definition at line 178 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_byte( addr)   (*(const unsigned char *)(addr))
    +
    + +

    Definition at line 182 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_word( addr)   (*(const unsigned short *)(addr))
    +
    + +

    Definition at line 185 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_dword( addr)   (*(const unsigned long *)(addr))
    +
    + +

    Definition at line 188 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_float( addr)   (*(const float *)(addr))
    +
    + +

    Definition at line 191 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_byte_near( addr)   pgm_read_byte(addr)
    +
    + +

    Definition at line 195 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_word_near( addr)   pgm_read_word(addr)
    +
    + +

    Definition at line 198 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_dword_near( addr)   pgm_read_dword(addr)
    +
    + +

    Definition at line 201 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_float_near( addr)   pgm_read_float(addr)
    +
    + +

    Definition at line 204 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_byte_far( addr)   pgm_read_byte(addr)
    +
    + +

    Definition at line 207 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_word_far( addr)   pgm_read_word(addr)
    +
    + +

    Definition at line 210 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_dword_far( addr)   pgm_read_dword(addr)
    +
    + +

    Definition at line 213 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + + + + + +
    #define pgm_read_float_far( addr)   pgm_read_float(addr)
    +
    + +

    Definition at line 216 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    #define pgm_read_pointer
    +
    + +

    Definition at line 220 of file version_helper.h.

    + +
    +
    +

    Typedef Documentation

    + +
    +
    + + + + +
    typedef void prog_void
    +
    + +

    Definition at line 57 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    typedef char prog_char
    +
    + +

    Definition at line 60 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    typedef unsigned char prog_uchar
    +
    + +

    Definition at line 63 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    typedef int8_t prog_int8_t
    +
    + +

    Definition at line 66 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    typedef uint8_t prog_uint8_t
    +
    + +

    Definition at line 69 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    typedef int16_t prog_int16_t
    +
    + +

    Definition at line 72 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    typedef uint16_t prog_uint16_t
    +
    + +

    Definition at line 75 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    typedef int32_t prog_int32_t
    +
    + +

    Definition at line 78 of file version_helper.h.

    + +
    +
    + +
    +
    + + + + +
    typedef uint32_t prog_uint32_t
    +
    + +

    Definition at line 81 of file version_helper.h.

    + +
    +
    +
    + + + + diff --git a/version__helper_8h__dep__incl.map b/version__helper_8h__dep__incl.map new file mode 100644 index 00000000..455934d4 --- /dev/null +++ b/version__helper_8h__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/version__helper_8h__dep__incl.md5 b/version__helper_8h__dep__incl.md5 new file mode 100644 index 00000000..f62c3636 --- /dev/null +++ b/version__helper_8h__dep__incl.md5 @@ -0,0 +1 @@ +7ffd9ab4c1f44f6844779ea69abf203a \ No newline at end of file diff --git a/version__helper_8h__dep__incl.png b/version__helper_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..e5506bb545b516e5b4b471aafc5bc6408e5c39a1 GIT binary patch literal 3860 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 + diff --git a/version__helper_8h__incl.md5 b/version__helper_8h__incl.md5 new file mode 100644 index 00000000..9317a64a --- /dev/null +++ b/version__helper_8h__incl.md5 @@ -0,0 +1 @@ +b5906582666204e62305ef43411e2ee1 \ No newline at end of file diff --git a/version__helper_8h__incl.png b/version__helper_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b650d82f03cd3fb18c3cdec264a3369692d60a GIT binary patch literal 6395 zcmVTCO_#zz5+nuulLFB%_-DOkttADX zQ$R9+>XS8*a{!-g7Fj57Q9v?)w4bzOh=9!aVoC8kz6UCy?LY+o@9VjD1YI? z1-f_dUMg6w1)n-~iqOfNflZq>(YbTyoQZ0899PO`cP43ssA~p*qwD?q_id8);lqc9 z@c8(6QokeMv(G-G>eZ_oaPR{Rarf?Bqi^aLq=SV$XW-GJM^@vaY{|*Vb|q`Ae5ug{ z<+fFJTjjH>U_OTAbL#;1(r4hnfmEbO5$e;YkBE|#ltgXYwxwRZdQoU-C@ovIjHXSS zM$eu-qujZ3(|`d3s7jS80=IA9zErJRHHwUkq%vj7P|uz{Y1F7ubmGJb(YY&Cszl-8 z;gl^~Hv06_PpL_hCRDFpJ-UAVI*lATlFptzD>@<;?1l~1u(@vc_iMS_Eo}_QS`G&4uy-GnrLDal? zbCGVkbm@%J?%1)TsQbo^8|luSJCrY9K2eVnB}xc9Yc#oe^Cq=x*N*!4?@yB_PZo7D zU5l|*KBGct>_xL9z}s)XO`A7wHb}$+2M!PXg(vl@h#2=*O`t|EYQzA{^1HSw2J1SJD5UpCZ zO2jE#xUgUxgrUQ4*|J6CujDy<_H4omw>@z1;6bWgyS7Ld3<|da#6|vt2M?xNwQA9d z6)OZ&gK<%2Q$Q#E^UptN(xgeEj9640J$f{uKDKCra0rUEYuAd-4*_5b*2-s!r?q#@ zG61AJhU3GB4-1+{M@JKwB7OSwv~uN2(P7G!D@RYBJQ32qV8Md)*I$1b+NVyPI@GLL zGs>AWCqa_N#>UdFUAqJ${P4pMBFuoyKOp`0@82(^?+Y)yKmh>()T&i05l>M!Fq$-M z*pLv8v;mhcT@ugK{*@|KiW)U)B+6gEetp5%h`VjuHqkj-w{9&ua`x=msczl6v~}xN zi%FtP81X;{j0k7WoS|#iuGvMCu3fu|Rd~cT1#9Iq#nalmW>ugpS+dYuZ@nc(f%4_c ziw*$^4S=eE4!dvPKBM+f>$YltqZTb%2$kW-AAb}oQ02;%sb9Z-LbXv6fFDa>U?7Er zgead3;fezvm`MTPg0Uc3?SVXb@)*#R4v4tO7o$Mu&Ycb6_))xgaie$T1&po$(nJ|B zXR(JSimIfSj6;7{0Mb<5L6z@# zqH{pshN=XM3RH+0GiC^#T){(Jr9(pX0h~U4T0HaS%`2X!I=T30=Ra$4kuT;V3l}aF zof*kNzsJaC36#+YVaJaj7o!H4!WK=erKL{aTKUvCTKuh96$r$}q!w0@DO08h)kA53 z8Z~MN)j?4|_U_$FAAR(Z=r{_F`Z;&*T$(j&meAuNSuxy0FIEFOJ^nCvfJ6pt*swt` zU)HQy)u?X$4d#CE;DMO1qfAg|FrR_SX9?DFQJP>P4F=LXXnF*I z9uDgaIweK}1)zV!b`2dE(ixor7LKAtiz+BaPw36CDn&#@P>viq#5@2N88slUAw!1H zuwlapw)f1LGZWM>SdTmj*dqZ`EYveh?4fSG^UgcercE1**@78cwrnXF7ZtFHu} zEt=f8alC>kR+Jb@f4Cz>^7>l|zsx71(CV0@}O-*pl7U|ZlTZG0%$47^?1z?hk z7cUA`DmXaUDk{{V^XJct^w2rIr5e~%J}@#y2h53}CaLEGN`)Mui4w;h&ksNRP?)U2 z%svFsnjQgCBP1qn>dBie{7jiLQR&j9ZJ~%T(}{4Z5g1{_h!IxN8aHlCRjXFD8m+vueWcyW&mGlET~Q10L)#WmPxRm0+Ipjr3>8e1-vFy@-m6BG{?54vC4$yl{1h&o|0Wty`CHsyYb? zN$kzKpPl*&P=f}~T`!zU$VVb!y#!8tz6L(S03Zy!IrRWThc0DL)f5^#wi~-o=W@DA z2?>RH<#`!(?fO2w@rHAZU#Vfmyy-|F>%R@4N8=L&bjR)*TJ&*l#Ugym=mEDr^Pd~Ne{RQc$Z{N9YNlzwX zOaaLN#`JLMtxuo1?0K1y9pqZLl#V)bjvSe2;=~T@{dtU?;kKxQ;bIwbIPU;}jaG)Q=$0zVnA!CG(&w>RXI}p=zs863h zqsEQL@+lSR`Hq3!d}O1PX%0|Z&H)@C79SkDl#fM!EKHG(#PcLBCcsmsbmEh#uZoe$ zlX>YeZ7DA7Y}M7P57NAOyIAjT%g2sqw=uegW%&XCJ#KN5SOQ6jh~hX>4v-oN$B&QVTU##h z%_$vyy7QwRS+i!~^?{DGbLSa$&4^B|YBHQDAXOk6-5@6BBCqmB@S(U(s9d>!&)v5X zCC!5>RxHA967TV`@#|>s-t%c*9$znjRDrCt5L}Mmd1nljC=pC^=5(`y<-4CdcKnTx zH@`|7HxA+xuPvVw>bs@)TFImeWR28=2QLwR_rLto-WrNefB*UCc6{GKidZD`>4K(l z;iL*=p#hdJkDXWTSAfnOj;BU zW?y`{IkdW|< z&+=@SCXL{&OtC-~5|WSaL!QC)P4ZT@KAn%>Gr;1-d-*=y7=pbYrb9hLP*8wymB0uv za^y-qSJm#i`85MvxNwWz9G0+Z5K5t;soxN3H&uNYu~@M@^!@j3Xxg+bVvWFui|Uo4 z`K=i=DJhwnHXTQaiO7e}oj4K4CeM!K zZ=D}K02^qq%8jGfu~y)(plcQA@#6$Kb?TZ~+rnKKZqDK1&3ICn*DTy0K4i)iB(_o> zJa|cXyqeY-`=7B9NbjI)1{gm+l4{rfPVAM1$^*D}FP?h!n$0`A%2QZab-lN*&H9xo zQ-E)=Z_az1BWe5gQwCg|Kph(T9W`n4v*DXwf9RS4)~!1%E|{AzA&TC8cPw4Jc#Dr2 zU&!BxrCwXTwy8t)f)HrjxFQRMIduE>BXI}8d+&{Vup!p0-Jtpa)~q?iI_|fAzhw{`{^0=FqQwL;H^TL^KadH zl6ORzHz*nyrz>B-eqWrhjJvn|72qcQeWN6js#GTHf_?Us;D~#z_mefamFi{$`JqFdlhNRmciWECH35= z9j+VBI-Nhihq&E7Lxv#21srO?s0pE>M=-9b4r&+~d4whVztuuxX3iWWe172flRbMz z9n{h@RluUy=FOjrt6s5{QUMqZKv!!MWd%=*&wqQ07E5oT%n=cXg_Q?EXhd9Jx_R?p zad4~!bot4I0ytN6#fndbiU{EWwGn`W0^mcXH_#OWU`2E9-V0(e2aN|kf7!C${_O7S zRDXra*rP`smimL(N|w*Cptxbf5vS7gwp>yZX3EQwQ7u-_WwrxAl9-bSi zNRb@e`Rh{2l6fqldGuScV#V01;+dUgH*VbE<4taOwEU)tL;aaECr11Q2WR1@Hn)ui z1_m-Szie8)XtVn@A3S(K*REZoym__fCS0soEuKLsQM=)a9+4Q)_BGJp-@$RPbwz^x1r8ym~Varb3g{9cDCck<*(zS`%@ zRO7+Yf;^r+eVQt+BM75LjiOzIwe-`)@uK)}-_2&l}P;{h>%cFj>BQ`Plbmrzwi2-hcY(Cu-HI zl_>KYZ@eMsTDo*;Do~(+pqH|4QK?cTvH01H4gH{f{rdF<4Y8vA`|rOCT7W4OfJ)N7 zeS4uYmMT?B2tBl6?%cVlZQHh_2sN}@yLRpPlD-@wjRp-Ghy^L617X#qNfSc+7himl z>eZ{qcNpAJvM_s&9z9y50o>5gP~Ox1zzoNk4{l?CKmPbbbZ~Uk=FOYatXZ=R<$-j@ zsE{>lRw2C+(7%6w%9Se@-(+~4ov&8#=9G;__-cYf8biY13Drj}F+d262SM8H{53+ z&@NuQNV|9MHjFy``t@Vi^f)?p?3j?;U_3AmVCvMV?4_HT_Zwdoe`wbkGiHb|OaCD3 zjvhVAtI-FI+Sn4VBj4P@0H`?hN2PN?3g8_QTLDPui4!N%E3dpFhFB1J@ZiDhuTzpe zHmmRUvEh{87IwI(l8i1~#g)%~;T_K1XHELvt8Xg`lM*V^X3(_Z_e8MM5tQJf$ zefo3)6Tqzo4A{GOZ;FnN76J@yvSY^%-e<5*wB7pk>qT1`5;gfTV#El+q!lVu5bf-) zws8vs%$zw>5Cu{N9Ua3SIC}2fxrSj&Y4(E$=4BP7&W&=vso z25N}{P=#QrgQ|%>0EQ@2ri}OlBSF2yXbfgRKk3%3n_$SMO`D35KuO2+iP1xWj2SZ; z<}1oKXP<6i0B|~Vf2bh%LkEYnQL91f0zwr6G1V4|n3xy?3fytkv;MPZ&llKgS3Pv+A;C%M2qu$O9Er(fRR?_Q#w{ zVYd16=Zn!8BQn&ORjXD}(V|7g?_tA+3DpT^bF}yH;lq)HMX=Py77-o%=rRL9|GseH zg5YFST>0zLr3+s;cUb6bre%UNS4c>RFqdMY1XXFlf&~UNOpMT3VV1Ahj zfRtC(8qi*t&tbBQ2{8;1zyA8Gfk}o88A9k6U_{KXu=WB$2(|dN*IqMNreJ)SH*cPj zg-4$*GXSJNDh!FM22=>0+|nojX@c*N22e|&mm&=XpkHFhgW3d!LPvH~0w{T4LX13K zdg&#xKsR~vWRVRdQmNvy@Z`s%AfO6Sj?-(YQl8iYwG3=3+& z90Bt=&=}SvsKLPotWjP8 zp3oQp`%R~CL5;q7>V+jt3adUTJPKIMf+yE0tfyKGv-cxQvJ@UoQh4}HVQFP=G^g-* zf}O&nnNxA?iFD-1kre!S3V1Y3;Stx6Jdcuw-)zlE;gKN)PX$n4o&$(iv=!Uvl_0~D zRU1)eW&|_(^T?dS>Q4#_BLluCexP3H)9SkYlTVb@{Q%zJKA21)HLQU(UELbKrSBNp zA<-nHP61fI)PQvz!2bRF2_q*=pBNP^fwi{6$Zc)^0!9y50Mim&R)Ny8@G@`jPynh4 zEHBEsfs$*sY}u$xR_6e)`ATq%0_xRk$70%#jfF$mHulpCm{`=a24)O^ znLRuM*-mOLj{I(g0`Q4}Z;YqFbg|J>`RFZOtZc*23yY(sV0JQ`DS~{L6womR^m|F3 zjvGx@&5ab0lVCRzQzoT73P=XfUYp4hyO9Et0o+JTnUwY@@P9QN$Z?G$kWl~t002ov JPDHLkV1il+Ir{(r literal 0 HcmV?d00001 diff --git a/version__helper_8h_source.html b/version__helper_8h_source.html new file mode 100644 index 00000000..8f7203a7 --- /dev/null +++ b/version__helper_8h_source.html @@ -0,0 +1,332 @@ + + + + + + +USB Host Shield 2.0: version_helper.h Source File + + + + + + + + + + + +
    +
    + + + + + + +
    +
    USB Host Shield 2.0 +
    +
    +
    + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    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 prog_void
    +
    57 typedef void prog_void;
    +
    58 #endif
    +
    59 #ifndef prog_char
    +
    60 typedef char prog_char;
    +
    61 #endif
    +
    62 #ifndef prog_uchar
    +
    63 typedef unsigned char prog_uchar;
    +
    64 #endif
    +
    65 #ifndef prog_int8_t
    +
    66 typedef int8_t prog_int8_t;
    +
    67 #endif
    +
    68 #ifndef prog_uint8_t
    +
    69 typedef uint8_t prog_uint8_t;
    +
    70 #endif
    +
    71 #ifndef prog_int16_t
    +
    72 typedef int16_t prog_int16_t;
    +
    73 #endif
    +
    74 #ifndef prog_uint16_t
    +
    75 typedef uint16_t prog_uint16_t;
    +
    76 #endif
    +
    77 #ifndef prog_int32_t
    +
    78 typedef int32_t prog_int32_t;
    +
    79 #endif
    +
    80 #ifndef prog_uint32_t
    +
    81 typedef uint32_t prog_uint32_t;
    +
    82 #endif
    +
    83 
    +
    84 #ifndef memchr_P
    +
    85 #define memchr_P(str, c, len) memchr((str), (c), (len))
    +
    86 #endif
    +
    87 #ifndef memcmp_P
    +
    88 #define memcmp_P(a, b, n) memcmp((a), (b), (n))
    +
    89 #endif
    +
    90 #ifndef memcpy_P
    +
    91 #define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
    +
    92 #endif
    +
    93 #ifndef memmem_P
    +
    94 #define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen))
    +
    95 #endif
    +
    96 #ifndef memrchr_P
    +
    97 #define memrchr_P(str, val, len) memrchr((str), (val), (len))
    +
    98 #endif
    +
    99 #ifndef strcat_P
    +
    100 #define strcat_P(dest, src) strcat((dest), (src))
    +
    101 #endif
    +
    102 #ifndef strchr_P
    +
    103 #define strchr_P(str, c) strchr((str), (c))
    +
    104 #endif
    +
    105 #ifndef strchrnul_P
    +
    106 #define strchrnul_P(str, c) strchrnul((str), (c))
    +
    107 #endif
    +
    108 #ifndef strcmp_P
    +
    109 #define strcmp_P(a, b) strcmp((a), (b))
    +
    110 #endif
    +
    111 #ifndef strcpy_P
    +
    112 #define strcpy_P(dest, src) strcpy((dest), (src))
    +
    113 #endif
    +
    114 #ifndef strcasecmp_P
    +
    115 #define strcasecmp_P(a, b) strcasecmp((a), (b))
    +
    116 #endif
    +
    117 #ifndef strcasestr_P
    +
    118 #define strcasestr_P(a, b) strcasestr((a), (b))
    +
    119 #endif
    +
    120 #ifndef strlcat_P
    +
    121 #define strlcat_P(dest, src, len) strlcat((dest), (src), (len))
    +
    122 #endif
    +
    123 #ifndef strlcpy_P
    +
    124 #define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len))
    +
    125 #endif
    +
    126 #ifndef strlen_P
    +
    127 #define strlen_P(s) strlen((const char *)(s))
    +
    128 #endif
    +
    129 #ifndef strnlen_P
    +
    130 #define strnlen_P(str, len) strnlen((str), (len))
    +
    131 #endif
    +
    132 #ifndef strncmp_P
    +
    133 #define strncmp_P(a, b, n) strncmp((a), (b), (n))
    +
    134 #endif
    +
    135 #ifndef strncasecmp_P
    +
    136 #define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n))
    +
    137 #endif
    +
    138 #ifndef strncat_P
    +
    139 #define strncat_P(a, b, n) strncat((a), (b), (n))
    +
    140 #endif
    +
    141 #ifndef strncpy_P
    +
    142 #define strncpy_P(a, b, n) strncmp((a), (b), (n))
    +
    143 #endif
    +
    144 #ifndef strpbrk_P
    +
    145 #define strpbrk_P(str, chrs) strpbrk((str), (chrs))
    +
    146 #endif
    +
    147 #ifndef strrchr_P
    +
    148 #define strrchr_P(str, c) strrchr((str), (c))
    +
    149 #endif
    +
    150 #ifndef strsep_P
    +
    151 #define strsep_P(strp, delim) strsep((strp), (delim))
    +
    152 #endif
    +
    153 #ifndef strspn_P
    +
    154 #define strspn_P(str, chrs) strspn((str), (chrs))
    +
    155 #endif
    +
    156 #ifndef strstr_P
    +
    157 #define strstr_P(a, b) strstr((a), (b))
    +
    158 #endif
    +
    159 #ifndef sprintf_P
    +
    160 #define sprintf_P(s, ...) sprintf((s), __VA_ARGS__)
    +
    161 #endif
    +
    162 #ifndef vfprintf_P
    +
    163 #define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__)
    +
    164 #endif
    +
    165 #ifndef printf_P
    +
    166 #define printf_P(...) printf(__VA_ARGS__)
    +
    167 #endif
    +
    168 #ifndef snprintf_P
    +
    169 #define snprintf_P(s, n, ...) ((s), (n), __VA_ARGS__)
    +
    170 #endif
    +
    171 #ifndef vsprintf_P
    +
    172 #define vsprintf_P(s, ...) ((s),__VA_ARGS__)
    +
    173 #endif
    +
    174 #ifndef vsnprintf_P
    +
    175 #define vsnprintf_P(s, n, ...) ((s), (n),__VA_ARGS__)
    +
    176 #endif
    +
    177 #ifndef fprintf_P
    +
    178 #define fprintf_P(s, ...) ((s), __VA_ARGS__)
    +
    179 #endif
    +
    180 
    +
    181 #ifndef pgm_read_byte
    +
    182 #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
    +
    183 #endif
    +
    184 #ifndef pgm_read_word
    +
    185 #define pgm_read_word(addr) (*(const unsigned short *)(addr))
    +
    186 #endif
    +
    187 #ifndef pgm_read_dword
    +
    188 #define pgm_read_dword(addr) (*(const unsigned long *)(addr))
    +
    189 #endif
    +
    190 #ifndef pgm_read_float
    +
    191 #define pgm_read_float(addr) (*(const float *)(addr))
    +
    192 #endif
    +
    193 
    +
    194 #ifndef pgm_read_byte_near
    +
    195 #define pgm_read_byte_near(addr) pgm_read_byte(addr)
    +
    196 #endif
    +
    197 #ifndef pgm_read_word_near
    +
    198 #define pgm_read_word_near(addr) pgm_read_word(addr)
    +
    199 #endif
    +
    200 #ifndef pgm_read_dword_near
    +
    201 #define pgm_read_dword_near(addr) pgm_read_dword(addr)
    +
    202 #endif
    +
    203 #ifndef pgm_read_float_near
    +
    204 #define pgm_read_float_near(addr) pgm_read_float(addr)
    +
    205 #endif
    +
    206 #ifndef pgm_read_byte_far
    +
    207 #define pgm_read_byte_far(addr) pgm_read_byte(addr)
    +
    208 #endif
    +
    209 #ifndef pgm_read_word_far
    +
    210 #define pgm_read_word_far(addr) pgm_read_word(addr)
    +
    211 #endif
    +
    212 #ifndef pgm_read_dword_far
    +
    213 #define pgm_read_dword_far(addr) pgm_read_dword(addr)
    +
    214 #endif
    +
    215 #ifndef pgm_read_float_far
    +
    216 #define pgm_read_float_far(addr) pgm_read_float(addr)
    +
    217 #endif
    +
    218 
    +
    219 #ifndef pgm_read_pointer
    +
    220 #define pgm_read_pointer
    +
    221 #endif
    +
    222 #endif
    +
    void prog_void
    +
    int8_t prog_int8_t
    +
    int32_t prog_int32_t
    +
    uint8_t prog_uint8_t
    +
    int16_t prog_int16_t
    +
    uint32_t prog_uint32_t
    +
    uint16_t prog_uint16_t
    +
    unsigned char prog_uchar
    +
    char prog_char
    +
    + + + + diff --git a/xbox_enums_8h.html b/xbox_enums_8h.html index 7f5baa04..8b2f3e62 100644 --- a/xbox_enums_8h.html +++ b/xbox_enums_8h.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: xboxEnums.h File Reference + @@ -31,7 +32,7 @@
    - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
    +
    @@ -105,7 +106,7 @@ This graph shows which files directly or indirectly include this file:
    - +

    Go to the source code of this file.

    @@ -219,7 +220,7 @@ Variables diff --git a/xbox_enums_8h__dep__incl.map b/xbox_enums_8h__dep__incl.map index 3e8ddb68..b55e74f3 100644 --- a/xbox_enums_8h__dep__incl.map +++ b/xbox_enums_8h__dep__incl.map @@ -1,6 +1,8 @@ - - - - + + + + + + diff --git a/xbox_enums_8h__dep__incl.md5 b/xbox_enums_8h__dep__incl.md5 index 87776612..60b9cb6d 100644 --- a/xbox_enums_8h__dep__incl.md5 +++ b/xbox_enums_8h__dep__incl.md5 @@ -1 +1 @@ -0d6e097941f73a0223c1d6fb58d28848 \ No newline at end of file +37fbd5fbccd0c87996af0449ab2a7de6 \ No newline at end of file diff --git a/xbox_enums_8h__dep__incl.png b/xbox_enums_8h__dep__incl.png index c731a96a27bcf94212c19f71af16492fc773c539..df456f3fb08ef56858082bf1822ad257c440d392 100644 GIT binary patch literal 16125 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 C^VNL- diff --git a/xbox_enums_8h__incl.md5 b/xbox_enums_8h__incl.md5 index 11e9cde4..08a549aa 100644 --- a/xbox_enums_8h__incl.md5 +++ b/xbox_enums_8h__incl.md5 @@ -1 +1 @@ -9f9a08dc9bbd9533350f7cf79e5be9b5 \ No newline at end of file +befff066e79e637de52f84f14ca3f473 \ No newline at end of file diff --git a/xbox_enums_8h_source.html b/xbox_enums_8h_source.html index 452c51d0..bef2edad 100644 --- a/xbox_enums_8h_source.html +++ b/xbox_enums_8h_source.html @@ -3,15 +3,16 @@ - + USB Host Shield 2.0: xboxEnums.h Source File + @@ -31,7 +32,7 @@ - + @@ -70,7 +71,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> - All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages +
    @@ -164,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');