RandomWalkUntil( hole-detected || connection-slot-seen ) if [ hole-detected ]# INITIAL STAR MORPHOLOGY - Seed (Hole detected before any connection slots seen) OpenConnSlot(0) # Attract four child nodes in turn to create star. SendRuleID(1) OpenConnSlot(2) SendRuleID(1) OpenConnSlot(6) SendRuleID(1) OpenConnSlot(4) SendRuleID(1) SetLeds( 'red' ) WaitTimeout(2) SetLeds( 'off' ) SendSignal('front-left') # Signal to four child nodes that we are ready for next morphology SendSignal('back-left') SendSignal('back-right') SendSignal('front-right') OpenConnSlot(3) # Attract child node to start line morphology SendRuleID(2) WaitTimeout(9) # Wait until no connection slots are seen, then light up in red. SetLeds( 'red' ) WaitSignal('back') # Wait for signal that rest of swarm is ready to reconfigure SetLeds( 'off' ) OpenConnSlot(1) # Attract child node for square SendRuleID(6) WaitTimeout(9) # Wait till no more connection slot seen WaitSignal('back') # Wait for signal that rest of square is ready to reconfigure SetLeds( 'red' ) # Light up in red WaitTimeout(2) # Pause for visual effect SetLeds( 'off' ) SendSignal('left') # Signal both child nodes to start reconfiguration sequence for star morphology SendSignal('back') OpenConnSlot(0) # Recreate the star SendRuleID(7) OpenConnSlot(2) SendRuleID(7) OpenConnSlot(6) SendRuleID(7) OpenConnSlot(4) SendRuleID(7) SetLeds( 'red' ) StopExecution() fi SearchForConnSlot() # Connection slot seen before hole detected, so search for connection slot... ReceiveRuleID() # to become part of existing star, square or line morphologies. if [ receivedruleid == 1 ] # INITIAL STAR MORPHOLOGY - Leaf Node WaitTimeout(9) # Wait until no connection slots seen, then light up in red for visual effect SetLeds( 'red' ) WaitSignal('front') # Wait for signal from parent to start reconfiguration into line SetLeds( 'off' ) CallFunction("disconnect_reconnect") # Disconnect, then start looking for new connection slots CallFunction("line_node") # Execute code for line morphology child nodes CallFunction("star_or_square_node") # Execute code for square morphology child nodes endif CallFunction("line_node") CallFunction("star_or_square_node") StopExecution() FUNCTION: line_node if [ receivedruleid == 2 ] # LINE MORPHOLOGY - Second robot in line OpenConnSlot(3) # Attract child node to continue line morphology SendRuleID(3) WaitTimeout(9) # Wait till no more connection slots seen, then light up red for visual effect SetLeds( 'red' ) WaitSignal('back') # Wait for signal propagating back up line to commence reconfiguration SetLeds( 'off' ) SendSignal('front') # Propagate reconfiguration readiness signal on up line to parent node OpenConnSlot(1) # Open a slot to start forming square morphology SendRuleID(6) SendSignal('front') # Send signal to parent node that this part of the square morphology is complete SetLeds( 'red' ) # Visual effect WaitSignal('front') # Wait for instruction from parent to reconfigure into star morphology SetLeds( 'off' ) SendSignal('left') # Propogate reconfiguration instruction down tree to child. CallFunction("disconnect_reconnect") # Disconnect, then looking for new connection slots to become part of star morphology CallFunction("star_or_square_node") # Execute StopExecution() endif if [ receivedruleid == 3 ] # LINE MORPHOLOGY - Third robot in line OpenConnSlot(3) # Attract child node to continue line morphology SendRuleID(4) SetLeds( 'red' ) # Visual effect WaitSignal('back') # Wait for signal from child to commence reconfiguration SetLeds( 'off' ) SendSignal('front') # Propagate reconfiguration readiness signal on up line to parent node CallFunction("disconnect_reconnect") # Disconnect, then start looking for new connection slots CallFunction("star_or_square_node") endif if [ receivedruleid == 4 ] # LINE MORPHOLOGY - Fourth robot in line SetLeds( 'red' ) # Visual effect to show pattern completion WaitTimeout(2) # Leave morphology in place for given time period SetLeds( 'off' ) SendSignal('front') # Send signal to parent that morphology is ready to reconfigure CallFunction("disconnect_reconnect") # Disconnect, then look for new connection slots (to become part of star morphology) CallFunction("star_or_square_node") endif StopExecution() END_FUNCTION FUNCTION: star_or_square_node if [ receivedruleid == 6 ] # SQUARE MORPHOLOGY - Leaf Node (one of two attaching robots that were not already connected from line morphology) WaitTimeout(9) # Wait till no connection slots, then light up in red for visual effect to show morphology completion SetLeds( 'red' ) WaitSignal('front') # Wait for instruction to reconfigure from parent SetLeds( 'off' ) CallFunction("disconnect_reconnect") # Disconnect, then look for new connection slots (to become part of star morphology) SetLeds( 'red' ) # Visual effect to show morphology completion StopExecution() endif if [ receivedruleid == 7 ] # FINAL STAR MORPHOLOGY - Leaf node WaitTimeout(9) # Wait till no more connection slots seen, then light up red for visual effect SetLeds( 'red' ) StopExecution() endif StopExecution() END_FUNCTION FUNCTION: disconnect_reconnect Disconnect() MoveAwayTimeout(10) SearchForConnSlot() ReceiveRuleID() END_FUNCTION