Introduction
Abstract
SwisTrack Multi-Camera Client is a client tool to communicate with several SwisTrack instances. It is written in C++ using wxWidgets. Data received by a TCP connection will be merged and synchronized before displaying it on a window. SwisTrack is the server part of the connection and SwisTrack Multi-Camera Client is the client.
Zoom / focus function
You can zoom in and out using the scroll wheel of the mouse. To focus on a specific region click with the right mouse button on that region. The left mouse button is to get several information if clicked on a robot. By clicking the mouse wheel the view will be reset.
Class hierarchy
We have 10 classes, where "ClientFrame" is the mean one.

| Name | Explanation | 
| ClientFrame | Defines a new frame type (main class) | 
| CommunicationMessage | Creates new messages that can be send to the robots and the SwisTrack instances. | 
| CommunicationNMEAInterface | Interface to parse incoming messages and send outgoing messages | 
| MapPanel | Responsible for painting the panel | 
| Robot | Creates new robots for communication and painting | 
| RobotSocketManager | Responsible for the communication between the robots and the SwisTrack Multi-Camera Client | 
| SavePosition | If enabled, saves the positions of the robots each separated in a file | 
| STClient | Defines the application type | 
| SwisTrack | Creates new SwisTrack objects for communication and painting the camera areas | 
| SwisTrackSocketManager | Responsible for the communication between the SwisTrack instances and the SwisTrack Multi-Camera Client | 
Edit Settings
If you select the menu "Edit/Edit settings" a editing window will pop up and you will be able to change the settings. Beware to the syntax, otherwise the program won't run correctly. Lines that begins with "#" are treated like comments.
The proper syntax of the SwisTrack Multi-Camera Client settings is (with example)):
SwisTrack
| Type | Adress:port; | Reference point (x,y); | Vector 1 (x,y); | Vector 2 (x,y); | Width, height (w,h); | 
| cam: | localhost:3000; | 2,3; | 1,0; | 0,1; | 4,6 | 
Robot
| Type | Adress:port; | id | 
| robot: | 127.0.0.1:4002; | 5 | 
Watch that after a type follows always a ":" and else after every entry follows a ";" except for the last one where nothing follows. Have a look on the screenshots for an real example.
Save tracking positions: file syntax
If desired, the movements of the robots can be saved on a "robotX.txt" file (X is the id of the robot). A line per frame will be used. The syntax is the following:
frame number, position in x, position in y, angle
example: 217,0.669787,8.297836, 6.210000
Camera area definition
As seen above we use a reference point with 2 vectors, a width and height for defining a camera area.

NMEA 0183 protocol
The SwisTrack Multi-Camera Client uses the NMEA 0183 protocol to communicate with the SwisTrack instances and the robots.
SwisTrack
Keep in mind that every command is encapsulated in a message with a message header (command) and a list of arguments according to the specific command. Every command begins with a $ and is in capitals.
Sending commands
| Command | Arguments | Description | 
| $START | None | Initiates the SwisTrack instances and sets the current frame number to 0, but doesn't process anything till $STEP is send. | 
| $STOP | None | Stops the current tracking and resets the current frame number to 0. | 
| $STEP | None | Indicates to the SwisTrack instances to process a next image frame. | 
The program can be paused (not sending $STEP commands any more) and be resumed by the menu commands under "ST controls/Pause tracking" and "ST controls/Resume tracking".
Receiving commands
| Command | Arguments | Description | 
| $PARTICLE | int id, double x, double y, double angle | Every robot recognized on a frame is send separately with these parameters | 
| $BEGINFRAME | int frameNb | Indicates that the data that arrives after this command belongs to the frame number send | 
| $ENDFRAME | None | Indicates that the current processing frame is completed and finished | 
Remark: One or several $PARTICLE commands can only be received between a $BEGINFRAME and a $ENDFRAME command!
Robot
Sending commands
| Command | Arguments | Description | 
| $STATUS | None | Get the current status of the robot (for example: tracking, idle, searching). | 
| $POSITION | double position x, double position y | Reset the current position of the robot. | 
Receiving commands
| Command | Arguments | Description | 
| $STATUS | string status | Returns its current status. | 
Screenshots
Here are some screenshots taken from the SwisTrack Multi-Camera Client:

