diff --git a/lib/include/btdevice.h b/lib/include/btdevice.h index 260c5a7845ca3b95180988755076fa87822a751a..83acdd89915ec66a28eaefceb4d9b85e086c3765 100644 --- a/lib/include/btdevice.h +++ b/lib/include/btdevice.h @@ -21,6 +21,7 @@ namespace statemachine { struct btdevice_sm; struct idle; + struct pairing_connecting; struct pairing_done; struct pairing_failed; struct connecting; @@ -108,6 +109,7 @@ public: */ friend struct statemachine::btdevice_sm; friend struct statemachine::idle; + friend struct statemachine::pairing_connecting; friend struct statemachine::pairing_done; friend struct statemachine::pairing_failed; friend struct statemachine::connecting; diff --git a/lib/src/btdevice_statemachine.h b/lib/src/btdevice_statemachine.h index 53975f441532570ea914b26904a3cc114c007129..d5dba92d0ddeb9a04aee3538216b10d535853e87 100644 --- a/lib/src/btdevice_statemachine.h +++ b/lib/src/btdevice_statemachine.h @@ -66,6 +66,7 @@ struct event_secure_simple_pairing_successful : sc::event<event_secure_simple_pairing_successful> {}; struct event_secure_simple_pairing_failed : sc::event<event_secure_simple_pairing_failed> {}; +struct event_pairing_done : sc::event<event_pairing_done> {}; struct event_done : sc::event<event_done> {}; struct event_auth_successful : sc::event<event_auth_successful> {}; @@ -73,9 +74,9 @@ struct event_auth_successful : sc::event<event_auth_successful> {}; * State machine definition */ -struct idle; +struct normal; -struct btdevice_sm : sc::state_machine<btdevice_sm, idle> +struct btdevice_sm : sc::state_machine<btdevice_sm, normal> { btdevice_sm(btdevice &device) : device(device) { @@ -114,6 +115,9 @@ private: * States */ +struct normal; +struct pairing; + struct init; struct idle; struct start_pairing; @@ -127,10 +131,30 @@ struct pairing_failed; struct enable_encryption; struct connecting; -struct idle : sc::state<idle, btdevice_sm>, state_logger +struct normal : sc::state<normal, btdevice_sm, idle>, state_logger +{ + typedef mpl::list< + sc::transition<event_start_pairing, pairing>> reactions; + + normal(my_context ctx) : my_base(ctx), state_logger(ctx_device(), "normal") + { + } +}; + +struct pairing : sc::state<pairing, btdevice_sm, start_pairing>, state_logger +{ + typedef mpl::list< + sc::transition<event_pairing_done, normal>> reactions; + + pairing(my_context ctx) : my_base(ctx), + state_logger(ctx_device(), "pairing") + { + } +}; + +struct idle : sc::state<idle, normal>, state_logger { typedef mpl::list< - sc::transition<event_start_pairing, start_pairing>, sc::transition<event_auth_successful, enable_encryption>, sc::transition<event_connect, connecting>> reactions; @@ -145,7 +169,7 @@ struct idle : sc::state<idle, btdevice_sm>, state_logger } }; -struct start_pairing : sc::state<start_pairing, btdevice_sm>, state_logger +struct start_pairing : sc::state<start_pairing, pairing>, state_logger { typedef mpl::list< sc::transition<event_connect, pairing_connecting>, @@ -161,7 +185,7 @@ struct start_pairing : sc::state<start_pairing, btdevice_sm>, state_logger } }; -struct pairing_connecting : sc::state<pairing_connecting, btdevice_sm>, state_logger +struct pairing_connecting : sc::state<pairing_connecting, pairing>, state_logger { typedef mpl::list< sc::transition<event_connect_failed, pairing_failed>, @@ -171,11 +195,12 @@ struct pairing_connecting : sc::state<pairing_connecting, btdevice_sm>, state_lo pairing_connecting(my_context ctx) : my_base(ctx), state_logger(ctx_device(), "pairing_connecting") { - ctx_device().connect(); + ctx_device().socket->connect_device(&ctx_device(), + ctx_device().get_addr()); } }; -struct requesting_auth : sc::state<requesting_auth, btdevice_sm>, state_logger +struct requesting_auth : sc::state<requesting_auth, pairing>, state_logger { typedef mpl::list< sc::transition<event_auth_request_failed, pairing_failed>, @@ -188,7 +213,7 @@ struct requesting_auth : sc::state<requesting_auth, btdevice_sm>, state_logger } }; -struct link_key_request : sc::state<link_key_request, btdevice_sm>, +struct link_key_request : sc::state<link_key_request, pairing>, state_logger { typedef mpl::list< @@ -203,7 +228,7 @@ struct link_key_request : sc::state<link_key_request, btdevice_sm>, } }; -struct io_capability_request : sc::state<io_capability_request, btdevice_sm>, +struct io_capability_request : sc::state<io_capability_request, pairing>, state_logger { typedef mpl::list< @@ -219,7 +244,7 @@ struct io_capability_request : sc::state<io_capability_request, btdevice_sm>, }; struct user_confirmation_request : - sc::state<user_confirmation_request, btdevice_sm>, + sc::state<user_confirmation_request, pairing>, state_logger { typedef mpl::list< @@ -237,36 +262,32 @@ struct user_confirmation_request : }; struct pairing_done : - sc::state<pairing_done, btdevice_sm>, + sc::state<pairing_done, pairing>, state_logger { - typedef sc::transition<event_done, idle> reactions; - pairing_done(my_context ctx) : my_base(ctx), state_logger(ctx_device(), "pairing_done") { ctx_device().pairing_finished(true); - post_event(event_done()); + post_event(event_pairing_done()); } }; struct pairing_failed : - sc::state<pairing_failed, btdevice_sm>, + sc::state<pairing_failed, pairing>, state_logger { - typedef sc::transition<event_done, idle> reactions; - pairing_failed(my_context ctx) : my_base(ctx), state_logger(ctx_device(), "pairing_failed") { ctx_device().pairing_finished(false); - post_event(event_done()); + post_event(event_pairing_done()); } }; -struct enable_encryption : sc::state<enable_encryption, btdevice_sm>, +struct enable_encryption : sc::state<enable_encryption, normal>, state_logger { typedef sc::transition<event_done, idle> reactions; @@ -280,7 +301,7 @@ struct enable_encryption : sc::state<enable_encryption, btdevice_sm>, } }; -struct connecting : sc::state<connecting, btdevice_sm>, +struct connecting : sc::state<connecting, normal>, state_logger { typedef mpl::list<