####################################
##FILL ME IN
####################################
## for a custom note with links:
## note =
## for the canned note of "This tutorial assumes that you have completed the previous tutorials:" just add the links 
## note.0=[[rocon_utilities/Tutorials/hydro/Rocon Launch|Rocon Launch]]
## note.1= [[rocon_gateway_tutorials/Tutorials/hydro/Launching a Gateway Hub|Launching a Gateway Hub]]
## descriptive title for the tutorial
## title = Command Line Tools
## multi-line description to be displayed in search 
## description = Convenient tools for gateway interaction from the command line.
## the next tutorial description (optional)
## next = 
## links to next tutorial (optional)
## next.0.link=[[rocon_gateway_graph/Tutorials/hydro/Gateway Graph|Gateway Graph Rqt Plugin]]
## next.1.link=
## what level user is this tutorial for 
## level= BeginnerCategory
## keywords = rocon, multimaster, gateway
####################################

<<IncludeCSTemplate(TutorialCSHeaderTemplate)>>

<<TableOfContents(4)>>

== Overview ==

To keep the workflow concise and clear, we are using [[rocon_utilities/Tutorials/hydro/Rocon Launch|rocon_launch]] to kickstart a multimaster environment using linux terminals running roscores on different ports.

== Launch Hub and Gateways ==

The following starts three separate ros masters - hub, gateway system with tutorials and a gateway system with nothing added (to act as the remote gateway).

{{{
> rocon_launch rocon_gateway_tutorials gateway_tutorials.concert --screen

== Operations ==

=== Flipping ===

For ease of testing, [[rocon_gateway]] provides some tools to conveniently interact with the gateways.

Interactively flipping the chatter publisher from the first gateway to the second (make sure you are on ROS_MASTER_URI=http://localhost:11312 here)

{{{
> rosrun rocon_gateway flip
> Create or cancel a flip rule (f/c): f
Automatically selecting target gateway pirate_gateway2 (only one visible)
Select a connection to flip (name-type-node):
    0) /chatter-subscriber-/listener
    1) /babbler-publisher-/babbler
    2) /chatter-publisher-/talker
    3) /fibonacci/client-action_client-/fibonacci_client
    4) /add_two_ints-service-/add_two_ints_server
    5) /fibonacci/server-action_server-/fibonacci_server
Enter [0-5] or regex keyed by name [e.g. /cha.* or .*]: 2
Information
  Local Gateway: /gateway
  Operation    : flip
  Flip Rules   : pirate_gateway2-/chatter-publisher-/talker
Proceed? (y/n): y
}}}

You can see here that connections are flipped based on a 'name-type-node' triple. Also note regex's are quite ok as well (this applies further to the actual service calls). 

What this actually does is add a flip rule to a watchlist.
When it finds a matching connection, it will immediately flip that connection
to the specified gateway. 

Cancelling a rule that has been added to the watchlist:

{{{
snorri@snorriwork64:/opt/multimaster$ rosrun rocon_gateway flip
> Create or cancel a flip rule (f/c): c
Automatically selecting /chatter (only one flip rule in the watchlist)
Information
  Local Gateway: /gateway
  Operation    : cancel
  Flip Rules   : pirate_gateway2-/chatter-publisher-/talker
Proceed? (y/n): y
}}}

=== Advertise-Pull ===

The second method for gateway interactions is a two-step method, advertise-pull. One gateway advertises some of its connections for public use and another gateway can freely pull these (flipping provides a mechanism for the gateway system who have the connections, while pulling provides control for the gateway accessing the services). 

First, let's advertise the /chatter publisher from the first gateway (ROS_MASTER_URI=http://localhost:11312):

{{{
> rosrun rocon_gateway advertise 
> Advertise or cancel advertisements (a/c): a
Select a connection to advertise (name-type-node):
    0) /chatter-subscriber-/listener
    1) /babbler-publisher-/babbler
    2) /chatter-publisher-/talker
    3) /fibonacci/client-action_client-/fibonacci_client
    4) /add_two_ints-service-/add_two_ints_server
    5) /fibonacci/server-action_server-/fibonacci_server
Enter [0-5] or regex keyed by name [e.g. /cha.* or .*]: 2
Information
  Local Gateway: /gateway
  Operation    : advertise
  Advertise Rules   : /chatter-publisher-/talker
Proceed? (y/n): y
}}}

Then, pull /chatter from the second gateway (ROS_MASTER_URI=http://localhost:11313):

{{{
> rosrun rocon_gateway pull 
> Pull or unpull connections (p/u): p
Automatically selecting /chatter (only one visible)
Information
  Local Gateway: /gateway
  Operation    : pull
  Pull Rules   : pirate_gateway-/chatter-publisher-/talker
Proceed? (y/n): y
snorri@snorriwork64:/opt/multimaster$ rostopic list
/chatter
/rosout
/rosout_agg
/zeroconf/lost_connections
/zeroconf/new_connections
snorri@snorriwork64:/opt/multimaster$ rostopic info /chatter
Type: std_msgs/String

Publishers: 
 * /talker_snorriwork64_24493_2191842069361869173 (http://192.168.10.123:58213/)

Subscribers: None
}}}

The functionality provided by these script are also accessible via the 'advertise', 'advertise_all', 'pull' and 'pull_all' services maintained by the gateway (with even more fine-grained control).

=== Introspection ===

Once you've flipped/advertised/pulled some services, you can use the following scripts to introspect on the gateway network.

Introspecting the local gateway (from the first gateway at ROS_MASTER_URI=http://localhost:11312):

{{{
> rosrun rocon_gateway gateway_info
Found a local gateway at /gateway
Gateway
  Namespace   : /gateway
  Name        : pirate_gateway
  Ip/Hostname : 192.168.10.123
  Connected   : True
  On Hub      : Pirate Hub
  Firewall    : False
  Public Watchlist
       : /chatter-publisher-/talker
  Public Interface
       : /chatter-publisher-/talker
  Flip Watchlist
       : pirate_gateway2-/babbler-publisher-/babbler
  Flipped Connections
       : pirate_gateway2-/babbler-publisher-/babbler
  Flipped in Connections
       : -
  Pull Watchlist
       : -
  Pulled Connections
       : -
}}}

Inspecting the remote gateways (in this case from the second gateway at ROS_MASTER_URI=http://localhost:11313):

{{{
> rosrun rocon_gateway remote_gateway_info 
Found a local gateway at /gateway
Local Gateway                                                                                                                           
  Namespace: /gateway                                                                                                                   
  Ip/Hostname: 192.168.10.123                                                                                                           
Remote Gateway                                                                                                                          
  Name       : pirate_gateway                                                                                                           
  Ip/Hostname: 192.168.10.123                                                                                                           
  Firewall   : False                                                                                                                    
  Public Interface                                                                                                                      
          : /chatter-publisher-/talker
  Flipped Interface
          : pirate_gateway2-publisher-/babbler-/babbler
  Pulled Interface
          : -

}}}

== Using the Ros Services Directly ==

The functionality provided by these scripts are also accessible via the 'flip', 'flip_all', 'advertise', 'advertise_all' services maintained by the gateway. Using the services directly provides even finer grained control - regex based patterns for the gateway, name and node in a remote rule, the ability to provide a rule for a connection which doesn't exist yet, amongst others.



## AUTOGENERATED DO NOT DELETE 
## TutorialCategory
## FILL IN THE STACK TUTORIAL CATEGORY HERE