=== API Examples === {{{#!python sm = StateMachine(['aborted','preempted']) sm2 = StateMachine(['done']) sm3 = StateMachine(['done']) sm4 = StateMachine(['done']) sm5 = StateMachine(['done']) sm5.add('T6',SPAState(), { 'succeeded':'SETTER', 'aborted':'T6', 'preempted':'SETTER'}) sm5.add('SETTER',Setter(), { 'done':'done'}) con_split = ConcurrentSplit(default_outcome = 'succeeded') con_split.add('SETTER', Setter()) con_split.add('RADICAL',sm5) con_split.add('GETTER', Getter()) con_split.add_outcome_map(({'SETTER':'done'},'succeeded')) with sm.sequence('done'): sm.add('GETTER1', Getter()) sm.add('S2',sm2) sm2.add('SETTER', Setter(), {'done':'A_SPLIT'}) sm2.add('A_SPLIT', con_split, {'succeeded':'done'}) sm.add('S3',sm3,{'done':'TRINARY!'}) sm3.add('SETTER', Setter(), {'done':'RADICAL'}) sm3.add('RADICAL', sm4, {'done':'SETTER2'}) sm4.add('T5',SPAState(), { 'succeeded':'SETTER', 'aborted':'T5', 'preempted':'SETTER'}) sm4.add('SETTER',Setter(),{'done':'done'}) sm3.add('SETTER2', Setter(), {'done':'done'}) sm.add('TRINARY!',SPAState(), {'succeeded':'T2','aborted':'T3','preempted':'T4'}) with sm.sequence('succeeded'): sm.add('T2',SPAState(),{}) sm.add('T3',SPAState(),{'aborted':'S2'}) sm.add('T4',SPAState(),{'succeeded':'GETTER2','aborted':'TRINARY!'}) sm.add(('GETTER2', Getter(), {'done':'GETTER1'})) # Set default initial states sm.set_initial_state(['GETTER1'],smach.UserData()) sm2.set_initial_state(['SETTER'],smach.UserData()) sm3.set_initial_state(['SETTER'],smach.UserData()) sm4.set_initial_state(['T5'],smach.UserData()) sm5.set_initial_state(['T6'],smach.UserData()) }}} ===== Lexical shadowing of currently "open" smach container ===== {{{#!python sc = StateMachine(['aborted','preempted']) sc.set_initial_state(['GETTER1'],scach.UserData()) with sc.connect_outcomes('done') as sc: sc.add('GETTER1', Getter()) with sc.add('S2',StateMachine(['done'])) as sc: sc.set_initial_state(['SETTER']) sc.add('SETTER', Setter(), {'done':'A_SPLIT'}) with sc.add('A_SPLIT',ConcurrentSplit(default_outcome = 'succeeded'), {'succeeded':'done'}) as sc: sc.add_outcome_map(({'SETTER':'done'},'succeeded')) sc.add('SETTER',Setter()) sc.add('GETTER',Getter()) with sc.add('RADICAL',StateMachine(['done'])) as sc: sc.add('T6', SPAState(), { 'succeeded':'SETTER', 'aborted':'T6', 'preempted':'SETTER'}) sc.add('SETTER',Setter(), { 'done':'done'}) with sc.add('S3',StateMachine(['done']),{'done':'TRINARY!'}) as sc: sc.add('SETTER', Setter(), {'done':'RADICAL'}) sc.set_initial_state(['SETTER']) with sc.add('RADICAL',StateMachine(['done']),{'done':'SETTER2'}) as sc: sc.set_initial_state(['T5']) sc.add('T5',SPAState(), { 'succeeded':'SETTER', 'aborted':'T5', 'preempted':'SETTER'}) sc.add('SETTER',Setter(),{'done':'done'}) sc.add('SETTER2', Setter(), {'done':'done'}) sc.add('TRINARY!',SPAState(), {'succeeded':'T2','aborted':'T3','preempted':'T4'}) with sc.connect_outcomes('succeeded') as sc: sc.add('T2',SPAState(),{}) sc.add('T3',SPAState(),{'aborted':'S2'}) sc.add('T4',SPAState(),{'succeeded':'GETTER2','aborted':'TRINARY!'}) }}} ===== Method redirection using modification of smach namespace behavior ===== {{{#!python sc_root = StateMachine(['aborted','preempted']) smach.set_initial_state(['GETTER1'],smach.UserData()) with smach.connect_outcomes('done'): smach.add('GETTER1', Getter()) with smach.add('S2',StateMachine(['done'])): smach.set_initial_state(['SETTER']) smach.add('SETTER', Setter(), {'done':'A_SPLIT'}) with smach.add('A_SPLIT',ConcurrentSplit(default_outcome = 'succeeded'), {'succeeded':'done'}): smach.add_outcome_map(({'SETTER':'done'},'succeeded')) smach.add('SETTER',Setter()) smach.add('GETTER',Getter()) with smach.add('RADICAL',StateMachine(['done'])): smach.add('T6', SPAState(), { 'succeeded':'SETTER', 'aborted':'T6', 'preempted':'SETTER'}) smach.add('SETTER',Setter(), { 'done':'done'}) with smach.add('S3',StateMachine(['done']),{'done':'TRINARY!'}): smach.add('SETTER', Setter(), {'done':'RADICAL'}) smach.set_initial_state(['SETTER']) with smach.add('RADICAL',StateMachine(['done']),{'done':'SETTER2'}): smach.set_initial_state(['T5']) smach.add('T5',SPAState(), { 'succeeded':'SETTER', 'aborted':'T5', 'preempted':'SETTER'}) smach.add('SETTER',Setter(),{'done':'done'}) smach.add('SETTER2', Setter(), {'done':'done'}) smach.add('TRINARY!',SPAState(),{'succeeded':'T2','aborted':'T3','preempted':'T4'}) with smach.connect_outcomes('succeeded'): smach.add('T2',SPAState(),{}) smach.add('T3',SPAState(),{'aborted':'S2'}) smach.add('T4',SPAState(),{'succeeded':'GETTER2','aborted':'TRINARY!'}) }}}