Controller Class Reference#include <Controller.h>
Inheritance diagram for Controller:
[legend]List of all members.
Detailed Description
Handles the menu/command system... when it detects the EmergencyStopMC is activated, it'll kick into high priority.
Keeps track of a command stack. A Control can designate another sub-control, which will receive events until it finishes
Events will then be sent to the parent again.
The GUI uses the same commands as the user (makes it much easier to have only one parser). The commands are:
- '
!refresh ' - redisplays the current control (handy on first connecting, or when other output has scrolled it off the screen) - '
!reset ' - return to the root control - '
!next ' - calls ControlBase::doNextItem() of the current control - '
!prev ' - calls ControlBase::doPrevItem() of the current control - '
!select [item]' - calls ControlBase::doSelect() of the current control, unless item is specified, in which case it is searched for, starting at the root. - '
!cancel ' - calls ControlBase::doCancel() of the current control - '
!dump_stack ' - requests a dump of the current stack of submenus (useful if the GUI (re)connects and thus current robot state is unknown) - '
!msg text' - sends text out as a TextMsgEvent; also note that any text entered on the console port while a GUI is also connected will also be sent as a TextMsgEvent, without needing the !input. - '
!root text' - calls ControlBase::takeInput(text) on the root control - '
!hello ' - responds with 'hello\n count\n' where count is the number of times '!hello ' has been sent. Good for detecting first connection after boot vs. a reconnect. - '
!hilight [n1 [n2 [...]]]' - hilights zero, one, or more items in the menu - '
!input text' - calls ControlBase::takeInput(text) on the currently hilighted control(s) - '
!set section. key= value' - will be sent to Config::setValue(section,key,value) - any text not beginning with '
! ' - sent to ControlBase::takeInput() of the current control
In return, to send the menus to the GUI, the following messages are sent: (newlines are required where shown)
- '
push ' - signals a submenu has been activated - '
pop ' - signals a submenu has been closed - '
refresh
text:title
int:numitems
bool:hasSubmenus1
bool:hilighted1
text:item-title1
text:item-description1
...
bool:hasSubmenusnumitems
bool:hilightednumitems
text:item-titlenumitems
text:item-descriptionnumitems' - refreshes the current menu
- '
status
text' - sets the status bar to text (until the next refresh) - '
load
text:classname
text:instancename
int:port
[arg1 [arg2 [...]]]' - tells the GUI to load the java class named classname, and have it connect to port, passing it the argument list. classname should contain a constructor of the form Classname(String host, int port, String args[]) the argument list is parsed as if it were on the console - unescaped or unquoted spaces will separate args into elements in the array - '
close
text:instancename' - calls close() on an object previously created by a load message. The Java object is expected to contain a function void close() . - '
stack_dump
int:depth
text:item-title1
...
text:item-titledepth' - a listing of the current stack, first item is root, last item is current control - '
goodbye ' - Indicates the connection is about to be closed purposefully, to differentiate from an accidental cut off.
bool types are expected to be numerical values, 0 for false, non-zero for true.
load and close are intended to allow pop-up windows for custom displays.
The upstream is the responsibility of the individual Controls, but the protocol is listed here to keep it together. When a control's state changes, it's that control's responsiblity to refresh the UI (LEDs, console, and GUI as appropriate). Thus, future extensions to the upstream protocol are between the control which will use it and the GUI. Future extensions to the downstream protocol would involve changing Controller and the GUI.
The Controller may connect to serr in the future to pop-up an alert anytime output to serr occurs.
Note that all state is maintained on the robot - even if the GUI is connected, you can still use the buttons to interact with the controller, and the GUI will update to reflect the changes. In HCI (Human Computer Interaction) parlance, this is the MVC, Model-View-Controller architecture, almost by necessity. (HCI happens to be my double major when I was an undergrad ;)
Also, the Controller is responsible for sending out TextMsgEvents from user input it receives - either a !msg command from the console or GUI, or any text at all which is received on the console if there is already a GUI connected.
These TextMsgEvents are always status events, and the duration field is always 0.
Definition at line 101 of file Controller.h.
|
Public Member Functions |
| Controller () |
| Constructor.
|
| Controller (ControlBase *r) |
| Constructor, sets a default root control.
|
virtual | ~Controller () |
| Destructor.
|
virtual void | DoStart () |
| register for events and resets the cmdstack
|
virtual void | DoStop () |
| stop listening for events and resets the cmdstack
|
virtual bool | trapEvent (const EventBase &e) |
| passes an event to the top control
|
virtual void | processEvent (const EventBase &e) |
| just for e-stop activation/deactivation
|
void | reset () |
| will take the command stack back down to the root
|
void | refresh () |
| refreshes the display, for times like sub-control dying, the previous control needs to reset it's display
|
void | push (ControlBase *c) |
| puts a new control on top
|
void | pop () |
| kills the top control, goes to previous
|
ControlBase * | top () |
| returns the current control
|
Controller & | setRoot (ControlBase *r) |
| sets the root level control
|
Controller & | setEStopID (MotionManager::MC_ID estopid) |
| Sets the emergency stop MC to monitor for pausing.
|
virtual std::string | getDescription () const |
| Gives a short description of what this particular instantiation does (in case a more specific description is needed on an individual basis).
|
Static Public Member Functions |
static std::string | getClassDescription () |
| Gives a short description of what this class of behaviors does... you should override this (but don't have to).
|
static void | loadGUI (const std::string &type, const std::string &name, unsigned int port) |
| attempts to open a Java object on the desktop
|
static void | loadGUI (const std::string &type, const std::string &name, unsigned int port, const std::vector< std::string > &args) |
| attempts to open a Java object on the desktop
|
static void | closeGUI (const std::string &name) |
| calls close() on a Java object loaded with loadGUI() (on the desktop)
|
static int | gui_comm_callback (char *buf, int bytes) |
| called by wireless when there's new data from the GUI
|
static int | console_callback (char *buf, int bytes) |
| called by wireless when someone has entered new data on the tekkotsu console (NOT cin)
|
Static Public Attributes |
|
static EventBase | nextItem |
| event masks used by processEvent()
|
static EventBase | prevItem |
| event masks used by processEvent()
|
static EventBase | nextItemFast |
| event masks used by processEvent()
|
static EventBase | prevItemFast |
| event masks used by processEvent()
|
static EventBase | selectItem |
| event masks used by processEvent()
|
static EventBase | cancel |
| event masks used by processEvent()
|
Protected Member Functions |
void | init () |
| assigns appropriate values to the static event bases
|
void | takeLine (const std::string &s) |
| called with each line that's entered on the tekkotsu console or from the GUI
|
bool | select (ControlBase *item, const std::string &name) |
| called with slots (options), a name to lookup; will select the named control
|
int | setConfig (const char *str) |
| sets a config value - some values may require additional processing (done here) to have the new values take effect
|
bool | setNext (ControlBase *next) |
| maintains top Control
|
void | activate () |
| called when the estop switches on
|
void | deactivate () |
| called when the estop switches off
|
bool | chkCmdStack () |
| returns true if a valid control is available on the stack
|
Static Protected Member Functions |
static bool | calcPulse (unsigned int t, unsigned int last, unsigned int period) |
| returns true when the current time and last time are in different periods
|
Protected Attributes |
MotionManager::MC_ID | display |
| invalid_MC_ID if not active, otherwise id of high priority LEDs
|
MotionManager::MC_ID | estop_id |
| the EmergencyStopMC MC_ID that this Controller is monitoring
|
ControlBase * | root |
| the base control, if cmdstack underflows, it will be reset to this
|
std::stack< ControlBase * > | cmdstack |
| the stack of the current control hierarchy
should never contain NULL entries
|
unsigned int | last_time |
| the time of the last event
|
unsigned int | cur_time |
| the time of the current event (do*() can check this instead of calling get_time() )
|
float | nextEv_val |
| the magnitude of the last next event (nextItem)
|
unsigned int | nextEv_dur |
| the duration of the last next event (nextItem)
|
float | prevEv_val |
| the magnitude of the last prev event (prevItem)
|
unsigned int | prevEv_dur |
| the duration of the last prev event (prevItem)
|
bool | alreadyGotBoth |
| if doReadStdIn() was already called, but the buttons are both still down
|
bool | isControlling |
| true if the Controller is currently active (in the activate()/deactivate() sense, not DoStart()/DoStop() sense - use isActive() for that...)
|
Socket * | gui_comm |
| the socket to listen on for the gui
|
Static Protected Attributes |
static Controller * | theOneController = NULL |
| currently can't pull connection socket off of server socket, so only one Controller
|
Private Member Functions |
| Controller (const Controller &) |
| shouldn't be called...
|
Controller & | operator= (const Controller &) |
| shouldn't be called...
|
Constructor & Destructor Documentation
Controller::Controller |
( |
|
) |
[inline] |
|
|
Constructor, sets a default root control.
Definition at line 104 of file Controller.h. |
virtual Controller::~Controller |
( |
|
) |
[inline, virtual] |
|
Controller::Controller |
( |
const Controller & |
|
) |
[private] |
|
Member Function Documentation
void Controller::activate |
( |
|
) |
[protected] |
|
|
called when the estop switches on
causes the top control to activate, registers for button events
Definition at line 455 of file Controller.cc.
Referenced by processEvent(). |
static bool Controller::calcPulse |
( |
unsigned int |
t, |
|
|
unsigned int |
last, |
|
|
unsigned int |
period |
|
) |
[inline, static, protected] |
|
|
returns true when the current time and last time are in different periods
Definition at line 192 of file Controller.h.
Referenced by trapEvent(). |
bool Controller::chkCmdStack |
( |
|
) |
[protected] |
|
void Controller::closeGUI |
( |
const std::string & |
name |
) |
[static] |
|
int Controller::console_callback |
( |
char * |
buf, |
|
|
int |
bytes |
|
) |
[static] |
|
|
called by wireless when someone has entered new data on the tekkotsu console (NOT cin)
Definition at line 240 of file Controller.cc. |
void Controller::deactivate |
( |
|
) |
[protected] |
|
|
called when the estop switches off
causes the top control to deactivate, stops listening for buttons
Definition at line 465 of file Controller.cc.
Referenced by processEvent(). |
void Controller::DoStart |
( |
|
) |
[virtual] |
|
void Controller::DoStop |
( |
|
) |
[virtual] |
|
static std::string Controller::getClassDescription |
( |
|
) |
[inline, static] |
|
|
Gives a short description of what this class of behaviors does... you should override this (but don't have to).
If you do override this, also consider overriding getDescription() to return it
Reimplemented from BehaviorBase.
Definition at line 137 of file Controller.h.
Referenced by getDescription(). |
virtual std::string Controller::getDescription |
( |
|
) |
const [inline, virtual] |
|
|
Gives a short description of what this particular instantiation does (in case a more specific description is needed on an individual basis).
By default simply returns getName(), because any calls from a BehaviorBase function to getClassDescription() are going to call BehaviorBase::getClassDescription(), not ~YourSubClass~getClassDescription(), because static functions can't be virtual in C++ (doh!)
This means that getDescription called on a pointer to a BehaviorBase of unknown subtype would always return an empty string, which is pretty useless. So instead we return the name in this situation. If you want getDescription to return getClassDescription, you'll have to override it in your subclass to do so.
Reimplemented from BehaviorBase.
Definition at line 138 of file Controller.h. |
int Controller::gui_comm_callback |
( |
char * |
buf, |
|
|
int |
bytes |
|
) |
[static] |
|
void Controller::init |
( |
|
) |
[protected] |
|
void Controller::loadGUI |
( |
const std::string & |
type, |
|
|
const std::string & |
name, |
|
|
unsigned int |
port, |
|
|
const std::vector< std::string > & |
args |
|
) |
[static] |
|
|
attempts to open a Java object on the desktop
Definition at line 183 of file Controller.cc. |
static void Controller::loadGUI |
( |
const std::string & |
type, |
|
|
const std::string & |
name, |
|
|
unsigned int |
port |
|
) |
[inline, static] |
|
void Controller::processEvent |
( |
const EventBase & |
e |
) |
[virtual] |
|
void Controller::refresh |
( |
|
) |
|
|
void Controller::reset |
( |
|
) |
|
|
bool Controller::select |
( |
ControlBase * |
item, |
|
|
const std::string & |
name |
|
) |
[protected] |
|
|
called with slots (options), a name to lookup; will select the named control
Definition at line 306 of file Controller.cc.
Referenced by takeLine(). |
int Controller::setConfig |
( |
const char * |
str |
) |
[protected] |
|
|
sets a config value - some values may require additional processing (done here) to have the new values take effect
Definition at line 426 of file Controller.cc.
Referenced by takeLine(). |
|
Sets the emergency stop MC to monitor for pausing.
|
bool Controller::setNext |
( |
ControlBase * |
next |
) |
[protected] |
|
void Controller::takeLine |
( |
const std::string & |
s |
) |
[protected] |
|
bool Controller::trapEvent |
( |
const EventBase & |
e |
) |
[virtual] |
|
Member Data Documentation
|
if doReadStdIn() was already called, but the buttons are both still down
Definition at line 207 of file Controller.h.
Referenced by trapEvent(). |
|
the stack of the current control hierarchy
should never contain NULL entries
Definition at line 189 of file Controller.h.
Referenced by activate(), chkCmdStack(), deactivate(), pop(), push(), refresh(), reset(), setNext(), takeLine(), top(), and trapEvent(). |
|
currently can't pull connection socket off of server socket, so only one Controller
Definition at line 211 of file Controller.h.
Referenced by closeGUI(), console_callback(), DoStart(), DoStop(), gui_comm_callback(), loadGUI(), pop(), push(), takeLine(), and ~Controller(). |
The documentation for this class was generated from the following files:
|