[TeamTalk 333]: [869] trunk/TeamTalk/Agents/TeamTalkBackend: Dynamic processes now use OLYMPUS_ROOT.
tk@edam.speech.cs.cmu.edu
tk at edam.speech.cs.cmu.edu
Thu Nov 8 17:05:23 EST 2007
An HTML attachment was scrubbed...
URL: http://mailman.srv.cs.cmu.edu/pipermail/teamtalk-developers/attachments/20071108/d2aa6cfc/attachment-0001.html
-------------- next part --------------
Modified: trunk/TeamTalk/Agents/TeamTalkBackend/agent.cpp
===================================================================
--- trunk/TeamTalk/Agents/TeamTalkBackend/agent.cpp 2007-11-07 21:58:55 UTC (rev 868)
+++ trunk/TeamTalk/Agents/TeamTalkBackend/agent.cpp 2007-11-08 22:05:23 UTC (rev 869)
@@ -1,7 +1,7 @@
#include "agent.h"
#include <utils.h>
#ifdef WIN32
-#include <win32dep.h>
+# include <win32dep.h>
#endif
#include <sstream>
@@ -23,14 +23,14 @@
void Agent::spawnHub(const string& uppername)
{
- static const string HUB = "..\\..\\Libraries\\Galaxy\\Bin\\x86-nt\\hub.exe";
+ static const string HUB = OLYMPUS_ROOT + "\\Bin\\x86-nt\\HUB.exe";
- map<string, string> subs;
- subs["%%DialogManager%%"] = uppername;
- subs["%%DMPort%%"] = stringOf(iDMPort);
- subs["%%HeliosPort%%"] = stringOf(iHeliosPort);
+ map<string, string> subs;
+ subs["%%DialogManager%%"] = uppername;
+ subs["%%DMPort%%"] = stringOf(iDMPort);
+ subs["%%HeliosPort%%"] = stringOf(iHeliosPort);
- string cfilename = writeSpecializedConfig("TeamTalk-hub-desktop", "pgm", subs, uppername);
+ string cfilename = writeSpecializedConfig("TeamTalk-hub-desktop", "pgm", subs, uppername);
ostringstream cmd, title;
cmd << HUB << " -verbosity 3 -pgm_file " << cfilename;
@@ -41,12 +41,12 @@
void Agent::spawnHelios(const string& uppername)
{
- static const string HELIOS = "..\\..\\Bin\\x86-nt\\Helios3.exe";
+ static const string HELIOS = OLYMPUS_ROOT + "\\Bin\\x86-nt\\Helios.exe";
map<string, string> subs;
- subs["%%NAME%%"] = uppername;
+ subs["%%NAME%%"] = uppername;
- string cfilename = writeSpecializedConfig("helios", "cfg", subs, uppername);
+ string cfilename = writeSpecializedConfig("helios", "cfg", subs, uppername);
ostringstream cmd, title;
cmd << HELIOS << " -maxconns 6 -port " << iHeliosPort << " -config " << cfilename;
@@ -60,23 +60,23 @@
static const string DM = "..\\..\\Bin\\x86-nt\\TeamTalkDM.exe";
map<string, string> subs;
- subs["%%ServerName%%"] = uppername;
- subs["%%ServerPort%%"] = stringOf(iDMPort);
- if(safeness == "SAFE") {
- subs["%%EXPLORATION_MODE%%"] = "epsilon-greedy";
- subs["%%EXPL_CONF-CONFIDENT%%"] = "-";
- subs["%%ACCEPT-UNCONFIDENT%%"] = "10";
- subs["%%EXPL_CONF-UNCONFIDENT%%"] = "-";
- } else {
- subs["%%EXPLORATION_MODE%%"] = "greedy";
- subs["%%EXPL_CONF-CONFIDENT%%"] = "0";
- subs["%%ACCEPT-UNCONFIDENT%%"] = "-100";
- subs["%%EXPL_CONF-UNCONFIDENT%%"] = "10";
- }
+ subs["%%ServerName%%"] = uppername;
+ subs["%%ServerPort%%"] = stringOf(iDMPort);
+ if(safeness == "SAFE") {
+ subs["%%EXPLORATION_MODE%%"] = "epsilon-greedy";
+ subs["%%EXPL_CONF-CONFIDENT%%"] = "-";
+ subs["%%ACCEPT-UNCONFIDENT%%"] = "10";
+ subs["%%EXPL_CONF-UNCONFIDENT%%"] = "-";
+ } else {
+ subs["%%EXPLORATION_MODE%%"] = "greedy";
+ subs["%%EXPL_CONF-CONFIDENT%%"] = "0";
+ subs["%%ACCEPT-UNCONFIDENT%%"] = "-100";
+ subs["%%EXPL_CONF-UNCONFIDENT%%"] = "10";
+ }
- writeSpecializedConfig("expl", "pol", subs, uppername);
- writeSpecializedConfig("grounding", "policies", subs, uppername);
- string cfilename = writeSpecializedConfig("TeamTalkDM", "cfg", subs, uppername);
+ writeSpecializedConfig("expl", "pol", subs, uppername);
+ writeSpecializedConfig("grounding", "policies", subs, uppername);
+ string cfilename = writeSpecializedConfig("TeamTalkDM", "cfg", subs, uppername);
ostringstream cmd, title;
cmd << DM << " -maxconns 6 -config " << cfilename;
@@ -96,120 +96,120 @@
const map<string, string>& subs,
const string name)
{
- ostringstream cfilename;
- cfilename << temp;
- if(!name.empty()) cfilename << '-' << name;
- cfilename << '.' << ext;
- ostringstream tfilename;
- tfilename << temp << "-template" << '.' << ext;
+ ostringstream cfilename;
+ cfilename << temp;
+ if(!name.empty()) cfilename << '-' << name;
+ cfilename << ".instance." << ext;
+ ostringstream tfilename;
+ tfilename << temp << "-template" << '.' << ext;
- //get config template
- string ss;
- {
- ifstream ctemplate(tfilename.str().c_str());
- stringbuf s;
- ctemplate.get(s, char_traits<char>::eof());
- ss = s.str();
- }
+ //get config template
+ string ss;
+ {
+ ifstream ctemplate(tfilename.str().c_str());
+ stringbuf s;
+ ctemplate.get(s, char_traits<char>::eof());
+ ss = s.str();
+ }
- substitute(ss, subs);
+ substitute(ss, subs);
- //write new config file
- ofstream config(cfilename.str().c_str());
- config << ss;
+ //write new config file
+ ofstream config(cfilename.str().c_str());
+ config << ss;
- return cfilename.str();
+ return cfilename.str();
}
Gal_Frame Agent::galaxyFrame(const Msg* msgp)
{
- Gal_Frame f;
+ Gal_Frame f;
- //robot reporting location
- const MsgRobLocation *rloc = dynamic_cast<const MsgRobLocation*>(msgp);
- if(rloc != NULL) {
- f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
- Gal_SetProp(f, ":type", Gal_StringObject("location"));
- Gal_SetProp(f, ":robot_name", Gal_StringObject(rloc->getSender().c_str()));
- Gal_SetProp(f, ":x", Gal_FloatObject((float)rloc->getX()));
- Gal_SetProp(f, ":y", Gal_FloatObject((float)rloc->getY()));
- Gal_SetProp(f, ":r", Gal_FloatObject((float)rloc->getAngle()));
+ //robot reporting location
+ const MsgRobLocation *rloc = dynamic_cast<const MsgRobLocation*>(msgp);
+ if(rloc != NULL) {
+ f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
+ Gal_SetProp(f, ":type", Gal_StringObject("location"));
+ Gal_SetProp(f, ":robot_name", Gal_StringObject(rloc->getSender().c_str()));
+ Gal_SetProp(f, ":x", Gal_FloatObject((float)rloc->getX()));
+ Gal_SetProp(f, ":y", Gal_FloatObject((float)rloc->getY()));
+ Gal_SetProp(f, ":r", Gal_FloatObject((float)rloc->getAngle()));
Gal_SetProp(f, ":error", Gal_IntObject(rloc->getErrorState()));
- return f;
- }
+ return f;
+ }
- //robot reporting a movement
- const MsgCmdGoTo *move = dynamic_cast<const MsgCmdGoTo*>(msgp);
- if(move != NULL) {
- f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
- Gal_SetProp(f, ":type", Gal_StringObject("goal"));
- Gal_SetProp(f, ":robot_name", Gal_StringObject(move->getSender().c_str()));
- Gal_SetProp(f, ":relative", Gal_IntObject(move->isRelative()? 1: 0));
- Gal_SetProp(f, ":x", Gal_FloatObject((float)move->getX()));
- Gal_SetProp(f, ":y", Gal_FloatObject((float)move->getY()));
+ //robot reporting a movement
+ const MsgCmdGoTo *move = dynamic_cast<const MsgCmdGoTo*>(msgp);
+ if(move != NULL) {
+ f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
+ Gal_SetProp(f, ":type", Gal_StringObject("goal"));
+ Gal_SetProp(f, ":robot_name", Gal_StringObject(move->getSender().c_str()));
+ Gal_SetProp(f, ":relative", Gal_IntObject(move->isRelative()? 1: 0));
+ Gal_SetProp(f, ":x", Gal_FloatObject((float)move->getX()));
+ Gal_SetProp(f, ":y", Gal_FloatObject((float)move->getY()));
Gal_SetProp(f, ":status", Gal_StringObject(move->getStatus()));
Gal_SetProp(f, ":taskid", Gal_IntObject(move->getTaskID()));
- return f;
- }
+ return f;
+ }
- //robot reporting halt
- const MsgCmdHalt *halt = dynamic_cast<const MsgCmdHalt*>(msgp);
- if(halt != NULL) {
- f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
- Gal_SetProp(f, ":type", Gal_StringObject("halt"));
- Gal_SetProp(f, ":robot_name", Gal_StringObject(halt->getSender().c_str()));
- return f;
- }
+ //robot reporting halt
+ const MsgCmdHalt *halt = dynamic_cast<const MsgCmdHalt*>(msgp);
+ if(halt != NULL) {
+ f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
+ Gal_SetProp(f, ":type", Gal_StringObject("halt"));
+ Gal_SetProp(f, ":robot_name", Gal_StringObject(halt->getSender().c_str()));
+ return f;
+ }
- //robot reporting going to home
- const MsgCmdHome *home = dynamic_cast<const MsgCmdHome*>(msgp);
- if(home != NULL) {
- f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
- Gal_SetProp(f, ":type", Gal_StringObject("goal"));
- Gal_SetProp(f, ":robot_name", Gal_StringObject(home->getSender().c_str()));
- Gal_SetProp(f, ":relative", Gal_IntObject(0));
- Gal_SetProp(f, ":x", Gal_FloatObject(0));
- Gal_SetProp(f, ":y", Gal_FloatObject(0));
+ //robot reporting going to home
+ const MsgCmdHome *home = dynamic_cast<const MsgCmdHome*>(msgp);
+ if(home != NULL) {
+ f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
+ Gal_SetProp(f, ":type", Gal_StringObject("goal"));
+ Gal_SetProp(f, ":robot_name", Gal_StringObject(home->getSender().c_str()));
+ Gal_SetProp(f, ":relative", Gal_IntObject(0));
+ Gal_SetProp(f, ":x", Gal_FloatObject(0));
+ Gal_SetProp(f, ":y", Gal_FloatObject(0));
Gal_SetProp(f, ":status", Gal_StringObject(home->getStatus()));
- return f;
- }
+ return f;
+ }
- //robot reporting follow
- const MsgCmdFollow *follow = dynamic_cast<const MsgCmdFollow*>(msgp);
- if(home != NULL) {
- f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
- Gal_SetProp(f, ":type", Gal_StringObject("follow"));
- Gal_SetProp(f, ":robot_name", Gal_StringObject(follow->getSender().c_str()));
+ //robot reporting follow
+ const MsgCmdFollow *follow = dynamic_cast<const MsgCmdFollow*>(msgp);
+ if(home != NULL) {
+ f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
+ Gal_SetProp(f, ":type", Gal_StringObject("follow"));
+ Gal_SetProp(f, ":robot_name", Gal_StringObject(follow->getSender().c_str()));
Gal_SetProp(f, ":status", Gal_StringObject(follow->getStatus()));
- //string host = follow->content()->leader;
- //string::size_type i = host.find(':');
- //int port = 0;
- //if(i != string::npos) {
- // port = atoi(string(host, i+1, host.size()-i-1).c_str());
- // host.resize(i);
- //}
- //Gal_SetProp(f, ":followee", Gal_StringObject(client.find(host, port).c_str()));
- return f;
- }
+ //string host = follow->content()->leader;
+ //string::size_type i = host.find(':');
+ //int port = 0;
+ //if(i != string::npos) {
+ // port = atoi(string(host, i+1, host.size()-i-1).c_str());
+ // host.resize(i);
+ //}
+ //Gal_SetProp(f, ":followee", Gal_StringObject(client.find(host, port).c_str()));
+ return f;
+ }
- //robot reporting cover
- const MsgCmdCover *cover = dynamic_cast<const MsgCmdCover*>(msgp);
- if(cover != NULL) {
- f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
- Gal_SetProp(f, ":type", Gal_StringObject("cover"));
- Gal_SetProp(f, ":robot_name", Gal_StringObject(cover->getSender().c_str()));
+ //robot reporting cover
+ const MsgCmdCover *cover = dynamic_cast<const MsgCmdCover*>(msgp);
+ if(cover != NULL) {
+ f = Gal_MakeFrame("robot_message", GAL_CLAUSE);
+ Gal_SetProp(f, ":type", Gal_StringObject("cover"));
+ Gal_SetProp(f, ":robot_name", Gal_StringObject(cover->getSender().c_str()));
geometry::Polygon<float> polygon = cover->getPolygon();
Gal_Object *xs = new Gal_Object[polygon.size()];
- Gal_Object *ys = new Gal_Object[polygon.size()];
- for(unsigned int i=0; i<polygon.size(); i++) {
+ Gal_Object *ys = new Gal_Object[polygon.size()];
+ for(unsigned int i=0; i<polygon.size(); i++) {
xs[i] = Gal_FloatObject((float)polygon[i].x);
- ys[i] = Gal_FloatObject((float)polygon[i].y);
- }
- Gal_SetProp(f, ":x", Gal_ListObject(xs, (int)polygon.size()));
+ ys[i] = Gal_FloatObject((float)polygon[i].y);
+ }
+ Gal_SetProp(f, ":x", Gal_ListObject(xs, (int)polygon.size()));
Gal_SetProp(f, ":y", Gal_ListObject(ys, (int)polygon.size()));
Gal_SetProp(f, ":status", Gal_StringObject(cover->getStatus()));
- return f;
- }
+ return f;
+ }
//robot sending camera image
const MsgMap *image = dynamic_cast<const MsgMap*>(msgp);
@@ -221,12 +221,12 @@
Gal_SetProp(f, ":height", Gal_IntObject(image->getHeight()));
Gal_SetProp(f, ":invoice", Gal_IntObject(image->getInvoice()));
Gal_SetProp(f, ":jpeg",
- Gal_BinaryObject((void *) image->getImageData().c_str(),
- (int) image->getImageDataSize()));
+ Gal_BinaryObject((void *) image->getImageData().c_str(),
+ (int) image->getImageDataSize()));
return f;
}
- return Gal_MakeFrame("bogus", GAL_CLAUSE);
+ return Gal_MakeFrame("bogus", GAL_CLAUSE);
}
void Agent::spawnMinorGalaxy(const string& name, const string& safeness)
@@ -235,6 +235,7 @@
string uppersafeness(safeness);
toupper(uppername); toupper(uppersafeness);
info << "got new robot: " << uppername << ' ' << uppersafeness << endl;
+ OLYMPUS_ROOT = getenv("OLYMPUS_ROOT");
spawnHelios(uppername);
spawnDM(uppername, uppersafeness);
spawnHub(uppername);
@@ -246,20 +247,18 @@
Agent::Agent(TeamTalk::RobotClient* robotClient, GalIO_CommStruct* comm)
: name_(robotClient->getName()), robotClient_(robotClient), comm_(comm) {}
-Agent::~Agent()
-{
-}
+Agent::~Agent() {}
void Agent::processMessage(const Msg* m)
{
Gal_Frame f;
const MsgRobLocation *rloc = dynamic_cast<const MsgRobLocation*>(m);
- if(rloc != NULL) {
- if(location_ == *rloc) return;
+ if(rloc != NULL) {
+ if(location_ == *rloc) return;
if(location_.getErrorState() != rloc->getErrorState())
SendErrorStatusToDM(rloc->getErrorState());
- location_ = *rloc;
- }
+ location_ = *rloc;
+ }
const MsgCmdGoTo *move = dynamic_cast<const MsgCmdGoTo*>(m);
if(move != NULL) SendMoveStatusToDM(move);
const MsgRobDone *done = dynamic_cast<const MsgRobDone*>(m);
@@ -277,12 +276,12 @@
commitments_.erase(i);
}
} else f = galaxyFrame(m);
- char *frame_name = Gal_FrameName(f);
- if(frame_name != NULL && !strcmp(frame_name, "robot_message")) {
- debug << "sending to '" << name_ << "' hub: " << m->render() << endl;
- writeFrame(f);
- Gal_FreeFrame(f);
- }
+ char *frame_name = Gal_FrameName(f);
+ if(frame_name != NULL && !strcmp(frame_name, "robot_message")) {
+ debug << "sending to '" << name_ << "' hub: " << m->render() << endl;
+ writeFrame(f);
+ Gal_FreeFrame(f);
+ }
}
void Agent::writeFrame(Gal_Frame f) const
@@ -306,76 +305,76 @@
void Agent::SendMessageToDM(const string& sMsgType,
const map<string, string>& sMessages) const
{
- // variables holding the nested galaxy parse frame
- Gal_Frame gfInput, gfParse, gfSlot, gfNet;
- Gal_Object *pgoParses, *pgoSlots, *pgoNets;
+ // variables holding the nested galaxy parse frame
+ Gal_Frame gfInput, gfParse, gfSlot, gfNet;
+ Gal_Object *pgoParses, *pgoSlots, *pgoNets;
- // start assembling the frame
- gfInput = Gal_MakeFrame("main", GAL_CLAUSE);
+ // start assembling the frame
+ gfInput = Gal_MakeFrame("main", GAL_CLAUSE);
- pgoParses = (Gal_Object *)malloc(sizeof(Gal_Object));
- gfParse = Gal_MakeFrame("parse", GAL_CLAUSE);
+ pgoParses = (Gal_Object *)malloc(sizeof(Gal_Object));
+ gfParse = Gal_MakeFrame("parse", GAL_CLAUSE);
- pgoSlots = (Gal_Object *)malloc(sizeof(Gal_Object));
- gfSlot = Gal_MakeFrame("slot", GAL_CLAUSE);
+ pgoSlots = (Gal_Object *)malloc(sizeof(Gal_Object));
+ gfSlot = Gal_MakeFrame("slot", GAL_CLAUSE);
- pgoNets = (Gal_Object *)calloc(sMessages.size(), sizeof(Gal_Object));
+ pgoNets = (Gal_Object *)calloc(sMessages.size(), sizeof(Gal_Object));
string hyp;
string parse;
- // construct the nets
+ // construct the nets
map<string, string>::const_iterator smi = sMessages.begin();
for(int i = 0; smi != sMessages.end(); smi++, i++) {
if(i) {
hyp.append(" ");
parse.append(" ");
}
- gfNet = Gal_MakeFrame("net", GAL_CLAUSE);
+ gfNet = Gal_MakeFrame("net", GAL_CLAUSE);
string sNetName = " " + smi->first + " ";
- Gal_SetProp(gfNet, ":name", Gal_StringObject(sNetName.c_str()));
- Gal_SetProp(gfNet, ":contents", Gal_StringObject(smi->second.c_str()));
+ Gal_SetProp(gfNet, ":name", Gal_StringObject(sNetName.c_str()));
+ Gal_SetProp(gfNet, ":contents", Gal_StringObject(smi->second.c_str()));
hyp.append(smi->second);
parse.append("( " + smi->first + "( " + smi->second + " ) )");
- pgoNets[i] = Gal_FrameObject(gfNet);
+ pgoNets[i] = Gal_FrameObject(gfNet);
}
- // then construct the encompassing slot
- Gal_SetProp(gfSlot, ":nets", Gal_ListObject(pgoNets, (int)sMessages.size()));
- Gal_SetProp(gfSlot, ":numnets", Gal_IntObject((int)sMessages.size()));
+ // then construct the encompassing slot
+ Gal_SetProp(gfSlot, ":nets", Gal_ListObject(pgoNets, (int)sMessages.size()));
+ Gal_SetProp(gfSlot, ":numnets", Gal_IntObject((int)sMessages.size()));
string sNetName = " " + sMsgType + " ";
- Gal_SetProp(gfSlot, ":name", Gal_StringObject(sNetName.c_str()));
- Gal_SetProp(gfSlot, ":contents", Gal_StringObject(hyp.c_str()));
- Gal_SetProp(gfSlot, ":frame", Gal_StringObject(" RobotMessage "));
- pgoSlots[0] = Gal_FrameObject(gfSlot);
+ Gal_SetProp(gfSlot, ":name", Gal_StringObject(sNetName.c_str()));
+ Gal_SetProp(gfSlot, ":contents", Gal_StringObject(hyp.c_str()));
+ Gal_SetProp(gfSlot, ":frame", Gal_StringObject(" RobotMessage "));
+ pgoSlots[0] = Gal_FrameObject(gfSlot);
- // then construct the encompassing parse
- Gal_SetProp(gfParse, ":slots", Gal_ListObject(pgoSlots, 1));
- Gal_SetProp(gfParse, ":numslots", Gal_IntObject(1));
- Gal_SetProp(gfParse, ":uttid", Gal_StringObject("-1"));
- Gal_SetProp(gfParse, ":hyp", Gal_StringObject(hyp.c_str()));
- Gal_SetProp(gfParse, ":hyp_index", Gal_IntObject(0));
- Gal_SetProp(gfParse, ":hyp_num_parses", Gal_IntObject(1));
- Gal_SetProp(gfParse, ":decoder_score", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":am_score", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":lm_score", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":frame_num", Gal_IntObject(0));
- Gal_SetProp(gfParse, ":acoustic_gap_norm", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":avg_wordconf", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":min_wordconf", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":max_wordconf", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":avg_validwordconf", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":min_validwordconf", Gal_FloatObject(0));
- Gal_SetProp(gfParse, ":max_validwordconf", Gal_FloatObject(0));
- string sParseString = "RobotMessage \n" + sMsgType + " " + parse + "\n\n";
- Gal_SetProp(gfParse, ":parsestring", Gal_StringObject(sParseString.c_str()));
- pgoParses[0] = Gal_FrameObject(gfParse);
+ // then construct the encompassing parse
+ Gal_SetProp(gfParse, ":slots", Gal_ListObject(pgoSlots, 1));
+ Gal_SetProp(gfParse, ":numslots", Gal_IntObject(1));
+ Gal_SetProp(gfParse, ":uttid", Gal_StringObject("-1"));
+ Gal_SetProp(gfParse, ":hyp", Gal_StringObject(hyp.c_str()));
+ Gal_SetProp(gfParse, ":hyp_index", Gal_IntObject(0));
+ Gal_SetProp(gfParse, ":hyp_num_parses", Gal_IntObject(1));
+ Gal_SetProp(gfParse, ":decoder_score", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":am_score", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":lm_score", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":frame_num", Gal_IntObject(0));
+ Gal_SetProp(gfParse, ":acoustic_gap_norm", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":avg_wordconf", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":min_wordconf", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":max_wordconf", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":avg_validwordconf", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":min_validwordconf", Gal_FloatObject(0));
+ Gal_SetProp(gfParse, ":max_validwordconf", Gal_FloatObject(0));
+ string sParseString = "RobotMessage \n" + sMsgType + " " + parse + "\n\n";
+ Gal_SetProp(gfParse, ":parsestring", Gal_StringObject(sParseString.c_str()));
+ pgoParses[0] = Gal_FrameObject(gfParse);
- Gal_SetProp(gfInput, ":parses", Gal_ListObject(pgoParses, 1));
- Gal_SetProp(gfInput, ":total_numparses", Gal_IntObject(1));
- Gal_SetProp(gfInput, ":input_source", Gal_StringObject("TeamTalkBackend"));
+ Gal_SetProp(gfInput, ":parses", Gal_ListObject(pgoParses, 1));
+ Gal_SetProp(gfInput, ":total_numparses", Gal_IntObject(1));
+ Gal_SetProp(gfInput, ":input_source", Gal_StringObject("TeamTalkBackend"));
- // finally, write it to the hub
+ // finally, write it to the hub
writeFrame(gfInput);
//and free everything
@@ -388,7 +387,7 @@
void Agent::SendErrorStatusToDM(int error) const {
string error_report = (error? "I am experiencing an error condition. Please help.":
"All systems are OK.");
- SendMessageToDM("ERROR", error_report);
+SendMessageToDM("ERROR", error_report);
}
void Agent::SendMoveStatusToDM(const MsgCmdGoTo* move) const {
@@ -443,290 +442,290 @@
void Agent::location_query() const
{
static const char *const compass_points[] = {
- "east", "east north east", "north east", "north north east",
- "north", "north north west", "north west", "west north west",
- "west", "west south west", "south west", "south south west",
- "south", "south south east", "south east", "east south east"};
- static const float precision = 1.1F; //110 cm precision
+ "east", "east north east", "north east", "north north east",
+ "north", "north north west", "north west", "west north west",
+ "west", "west south west", "south west", "south south west",
+ "south", "south south east", "south east", "east south east"};
+ static const float precision = 1.1F; //110 cm precision
- ostringstream ossMessage;
- const Point<float> p = location_.getLocation();
- double distanceFromHome = p.length();
- if(distanceFromHome < precision) {
- ossMessage << "I am home.";
- } else {
- ossMessage << setiosflags(ios_base::fixed) << setprecision(1);
- ossMessage << "I am "
- << p.length() << " meters from home; bearing is ";
- int a = ((int)(p.angle()*180/PI+PI/16)/16)%16;
- ossMessage << compass_points[a] << '.';
- }
- SendMessageToDM("Location", ossMessage.str());
+ ostringstream ossMessage;
+ const Point<float> p = location_.getLocation();
+ double distanceFromHome = p.length();
+ if(distanceFromHome < precision) {
+ ossMessage << "I am home.";
+ } else {
+ ossMessage << setiosflags(ios_base::fixed) << setprecision(1);
+ ossMessage << "I am "
+ << p.length() << " meters from home; bearing is ";
+ int a = ((int)(p.angle()*180/PI+PI/16)/16)%16;
+ ossMessage << compass_points[a] << '.';
+ }
+ SendMessageToDM("Location", ossMessage.str());
}
void Agent::move_cardinal_command(const Gal_Frame& inframe)
{
- debug << "sending move query to backend" << endl;
- string s_distance(Gal_GetString(inframe, ":distance"));
- string s_units(Gal_GetString(inframe, ":units"));
- string s_direction(Gal_GetString(inframe, ":direction"));
- if(!(s_distance.empty() && s_direction.empty())) {
- error("agent") << "distance or direction missing" << endl;
- } else {
- Point<float> vec(static_cast<float>(GetNumber999(s_distance)), 0);
- if(!s_distance.empty()) {
- if(!s_units.empty()) {
- if(s_units == "FOOT" || s_units == "FEET") {
- vec.x *= 0.3048F;
- } else if(s_units == "YARD" || s_units == "YARDS") {
- vec.x *= 0.9144F;
- }
- }
- MsgCmdGoTo *go = NULL;
- if(s_direction == "NORTH")
- go = new MsgCmdGoTo(vec.rotate(PI/2));
- else if(s_direction == "NORTHEAST")
- go = new MsgCmdGoTo(vec.rotate(PI/4));
- else if(s_direction == "NORTHWEST")
- go = new MsgCmdGoTo(vec.rotate(3*PI/4));
- else if(s_direction == "EAST")
- go = new MsgCmdGoTo(vec);
- else if(s_direction == "SOUTH")
- go = new MsgCmdGoTo(vec.rotate(-PI/2));
- else if(s_direction == "SOUTHEAST")
- go = new MsgCmdGoTo(vec.rotate(-PI/4));
- else if(s_direction == "SOUTHWEST")
- go = new MsgCmdGoTo(vec.rotate(-3*PI/4));
- else if(s_direction == "WEST")
- go = new MsgCmdGoTo(vec.rotate(PI));
- if(go != NULL) {
+ debug << "sending move query to backend" << endl;
+ string s_distance(Gal_GetString(inframe, ":distance"));
+ string s_units(Gal_GetString(inframe, ":units"));
+ string s_direction(Gal_GetString(inframe, ":direction"));
+ if(!(s_distance.empty() && s_direction.empty())) {
+ error("agent") << "distance or direction missing" << endl;
+ } else {
+ Point<float> vec(static_cast<float>(GetNumber999(s_distance)), 0);
+ if(!s_distance.empty()) {
+ if(!s_units.empty()) {
+ if(s_units == "FOOT" || s_units == "FEET") {
+ vec.x *= 0.3048F;
+ } else if(s_units == "YARD" || s_units == "YARDS") {
+ vec.x *= 0.9144F;
+ }
+ }
+ MsgCmdGoTo *go = NULL;
+ if(s_direction == "NORTH")
+ go = new MsgCmdGoTo(vec.rotate(PI/2));
+ else if(s_direction == "NORTHEAST")
+ go = new MsgCmdGoTo(vec.rotate(PI/4));
+ else if(s_direction == "NORTHWEST")
+ go = new MsgCmdGoTo(vec.rotate(3*PI/4));
+ else if(s_direction == "EAST")
+ go = new MsgCmdGoTo(vec);
+ else if(s_direction == "SOUTH")
+ go = new MsgCmdGoTo(vec.rotate(-PI/2));
+ else if(s_direction == "SOUTHEAST")
+ go = new MsgCmdGoTo(vec.rotate(-PI/4));
+ else if(s_direction == "SOUTHWEST")
+ go = new MsgCmdGoTo(vec.rotate(-3*PI/4));
+ else if(s_direction == "WEST")
+ go = new MsgCmdGoTo(vec.rotate(PI));
+ if(go != NULL) {
#ifdef USE_TXT_COMMANDS
- sendAction(go);
+ sendAction(go);
#else
- r->sendGoToCmd(1, go->content()->taskid,
- go->content()->x, go->content()->y, go->content()->angle,
- go->content()->useAngle(), go->content()->useRelative());
+ r->sendGoToCmd(1, go->content()->taskid,
+ go->content()->x, go->content()->y, go->content()->angle,
+ go->content()->useAngle(), go->content()->useRelative());
#endif
- delete go;
- } else
- error("agent") << "unknown direction " << s_direction << endl;
- }
- }
+ delete go;
+ } else
+ error("agent") << "unknown direction " << s_direction << endl;
+ }
+ }
}
void Agent::move_relative_command(const Gal_Frame& inframe)
{
- debug << "sending move relative query to backend" << endl;
- string s_distance;
- if (Gal_GetString(inframe, ":distance"))
- s_distance = Gal_GetString(inframe, ":distance");
- string s_direction;
- if (Gal_GetString(inframe, ":direction"))
- s_direction = Gal_GetString(inframe, ":direction");
- string s_units;
- if (Gal_GetString(inframe, ":units"))
- s_units = Gal_GetString(inframe, ":units");
- if(s_distance.empty() || s_direction.empty()) {
- error("agent") << "distance or direction missing" << endl;
- } else {
- if(!s_distance.empty()) {
- Point<float> vec(static_cast<float>(GetNumber999(s_distance)), 0);
- if(!s_units.empty()) {
- if(s_units == "FOOT" || s_units == "FEET") {
- vec.x *= 0.3048F;
- } else if(s_units == "YARD" || s_units == "YARDS") {
- vec.x *= 0.9144F;
- }
- }
- MsgCmdGoTo *go = NULL;
- if(s_direction == "STRAIGHT" ||
- s_direction == "FORWARD" ||
- s_direction == "FORWARDS" ||
- s_direction == "AROUND")
- go = new MsgCmdGoTo(vec);
- else if(s_direction.substr(0, 5) == "RIGHT")
- go = new MsgCmdGoTo(vec.rotate(-PI/2));
- else if(s_direction.substr(0, 4) == "LEFT")
- go = new MsgCmdGoTo(vec.rotate(PI/2));
- else if(s_direction == "BACK" ||
- s_direction == "BACKWARD" ||
- s_direction == "BACKWARDS")
- go = new MsgCmdGoTo(vec.rotate(PI));
- if(go != NULL) {
+ debug << "sending move relative query to backend" << endl;
+ string s_distance;
+ if (Gal_GetString(inframe, ":distance"))
+ s_distance = Gal_GetString(inframe, ":distance");
+ string s_direction;
+ if (Gal_GetString(inframe, ":direction"))
+ s_direction = Gal_GetString(inframe, ":direction");
+ string s_units;
+ if (Gal_GetString(inframe, ":units"))
+ s_units = Gal_GetString(inframe, ":units");
+ if(s_distance.empty() || s_direction.empty()) {
+ error("agent") << "distance or direction missing" << endl;
+ } else {
+ if(!s_distance.empty()) {
+ Point<float> vec(static_cast<float>(GetNumber999(s_distance)), 0);
+ if(!s_units.empty()) {
+ if(s_units == "FOOT" || s_units == "FEET") {
+ vec.x *= 0.3048F;
+ } else if(s_units == "YARD" || s_units == "YARDS") {
+ vec.x *= 0.9144F;
+ }
+ }
+ MsgCmdGoTo *go = NULL;
+ if(s_direction == "STRAIGHT" ||
+ s_direction == "FORWARD" ||
+ s_direction == "FORWARDS" ||
+ s_direction == "AROUND")
+ go = new MsgCmdGoTo(vec);
+ else if(s_direction.substr(0, 5) == "RIGHT")
+ go = new MsgCmdGoTo(vec.rotate(-PI/2));
+ else if(s_direction.substr(0, 4) == "LEFT")
+ go = new MsgCmdGoTo(vec.rotate(PI/2));
+ else if(s_direction == "BACK" ||
+ s_direction == "BACKWARD" ||
+ s_direction == "BACKWARDS")
+ go = new MsgCmdGoTo(vec.rotate(PI));
+ if(go != NULL) {
commitments_.push_back(new MsgCmdGoTo(*go));
#ifdef USE_TXT_COMMANDS
- sendAction(go);
+ sendAction(go);
#else
- r->sendGoToCmd(go->content()->priority, go->content()->taskid,
- go->content()->x, go->content()->y, go->content()->angle,
- go->content()->useAngle(), go->content()->useRelative());
+ r->sendGoToCmd(go->content()->priority, go->content()->taskid,
+ go->content()->x, go->content()->y, go->content()->angle,
+ go->content()->useAngle(), go->content()->useRelative());
#endif
- delete go;
- } else
- error("agent") << "unknown direction " << s_direction << endl;
- }
- }
+ delete go;
+ } else
+ error("agent") << "unknown direction " << s_direction << endl;
+ }
+ }
}
void Agent::halt_command()
{
- MsgCmdHalt halt;
+ MsgCmdHalt halt;
#ifdef USE_TXT_COMMANDS
- sendAction(&halt);
+ sendAction(&halt);
#else
- r->sendHalt(halt.content()->priority, halt.content()->taskid);
+ r->sendHalt(halt.content()->priority, halt.content()->taskid);
#endif
}
void Agent::follow_command(const Gal_Frame& inframe)
{
- debug << "sending follow command to backend" << endl;
- string followee = Gal_GetString(inframe, ":followee");
- if(followee.empty()) {
- error("agent") << "no followee" << endl;
- } else {
- MsgCmdFollow follow;
+ debug << "sending follow command to backend" << endl;
+ string followee = Gal_GetString(inframe, ":followee");
+ if(followee.empty()) {
+ error("agent") << "no followee" << endl;
+ } else {
+ MsgCmdFollow follow;
#ifdef USE_TXT_COMMANDS
- sendAction(&follow);
+ sendAction(&follow);
#else
- r->sendFollow(follow.content()->priority, follow.content()->taskid);
+ r->sendFollow(follow.content()->priority, follow.content()->taskid);
#endif
- }
+ }
}
void Agent::move_to_goal_command(const Gal_Frame& inframe)
{
- debug << "sending goal movement to backend" << endl;
- string ordinal(Gal_GetString(inframe, ":ordinal"));
- if(ordinal == "home") {
- string sRelDist(Gal_GetString(inframe, ":relDist"));
- if(sRelDist == "1") {
- MsgCmdHome home;
+ debug << "sending goal movement to backend" << endl;
+ string ordinal(Gal_GetString(inframe, ":ordinal"));
+ if(ordinal == "home") {
+ string sRelDist(Gal_GetString(inframe, ":relDist"));
+ if(sRelDist == "1") {
+ MsgCmdHome home;
robotClient_->sendHome(home.getPriority(), home.getTaskID());
- //p_client->sendPacket(robot, MsgCmdHome());
- } else if(sRelDist == "2") {
- error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
- return;
- } else if(sRelDist == "3") {
- error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
- return;
- } else if(sRelDist == "4") {
- error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
- return;
- } else if(sRelDist == "5") {
- error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
- return;
- } else if(sRelDist == "6") {
- error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
- return;
- } else {
- error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
- return;
- }
- } else {
- //absolute ordinal
- istringstream issOrdinal(ordinal);
- string token;
- issOrdinal >> token;
- float f_xcoord, f_ycoord;
- if(token == "NEGATIVE") {
- debug << "got negative x" << endl;
- issOrdinal >> token;
- ostringstream dispval;
- debug << '"' << token << '"' << endl;
- f_xcoord = static_cast<float>(-GetNumber999(token));
- } else {
- debug << '"' << token << '"' << endl;
- f_xcoord = static_cast<float>(GetNumber999(token));
- }
- debug("agent") << "got x" << endl;
- issOrdinal >> token;
- if(token == "NEGATIVE") {
- debug("agent") << "got negative y" << endl;
- issOrdinal >> token;
- debug("agent") << '"' << token << '"' << endl;
- f_ycoord = static_cast<float>(-GetNumber999(token));
- } else {
- debug("agent") << '"' << token << '"' << endl;
- f_ycoord = static_cast<float>(GetNumber999(token));
- }
- debug("agent") << "got y" << endl;
- MsgCmdGoTo go(Point<float>(f_xcoord, f_ycoord), true);
+ //p_client->sendPacket(robot, MsgCmdHome());
+ } else if(sRelDist == "2") {
+ error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
+ return;
+ } else if(sRelDist == "3") {
+ error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
+ return;
+ } else if(sRelDist == "4") {
+ error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
+ return;
+ } else if(sRelDist == "5") {
+ error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
+ return;
+ } else if(sRelDist == "6") {
+ error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
+ return;
+ } else {
+ error("agent") << "relative to goal '" << sRelDist << '\'' << " not understood" << endl;
+ return;
+ }
+ } else {
+ //absolute ordinal
+ istringstream issOrdinal(ordinal);
+ string token;
+ issOrdinal >> token;
+ float f_xcoord, f_ycoord;
+ if(token == "NEGATIVE") {
+ debug << "got negative x" << endl;
+ issOrdinal >> token;
+ ostringstream dispval;
+ debug << '"' << token << '"' << endl;
+ f_xcoord = static_cast<float>(-GetNumber999(token));
+ } else {
+ debug << '"' << token << '"' << endl;
+ f_xcoord = static_cast<float>(GetNumber999(token));
+ }
+ debug("agent") << "got x" << endl;
+ issOrdinal >> token;
+ if(token == "NEGATIVE") {
+ debug("agent") << "got negative y" << endl;
+ issOrdinal >> token;
+ debug("agent") << '"' << token << '"' << endl;
+ f_ycoord = static_cast<float>(-GetNumber999(token));
+ } else {
+ debug("agent") << '"' << token << '"' << endl;
+ f_ycoord = static_cast<float>(GetNumber999(token));
+ }
+ debug("agent") << "got y" << endl;
+ MsgCmdGoTo go(Point<float>(f_xcoord, f_ycoord), true);
#ifdef USE_TXT_COMMANDS
- sendAction(&go);
+ sendAction(&go);
#else
- r->sendGoToCmd(go.content()->priority, go.content()->taskid,
- go.content()->x, go.content()->y, go.content()->angle,
- go.content()->useAngle(), go.content()->useRelative());
+ r->sendGoToCmd(go.content()->priority, go.content()->taskid,
+ go.content()->x, go.content()->y, go.content()->angle,
+ go.content()->useAngle(), go.content()->useRelative());
#endif
- }
+ }
}
void Agent::turn_command(const Gal_Frame& inframe)
{
- debug("agent") << "got turn command" << endl;
- string sDirection(Gal_GetString(inframe, ":direction"));
- bool bRel(false);
- double fRad;
- if(sDirection == "NORTH") fRad = PI/2;
- else if(sDirection == "NORTHEAST") fRad = PI/4;
- else if(sDirection == "NORTHWEST") fRad = 3*PI/4;
- else if(sDirection == "EAST") fRad = 0;
- else if(sDirection == "WEST") fRad = PI;
- else if(sDirection == "SOUTH") fRad = 3*PI/2;
- else if(sDirection == "SOUTHEAST") fRad = 7*PI/4;
- else if(sDirection == "SOUTHWEST") fRad = 5*PI/4;
- else if(sDirection == "STRAIGHT" ||
- sDirection == "FORWARD" ||
- sDirection == "FORWARDS") {
- bRel = true;
- fRad = 0;
- } else if(sDirection.substr(0, 5) == "RIGHT") {
- string sQual;
- if(Gal_GetString(inframe, ":increment"))
- sQual = (Gal_GetString(inframe, ":increment"));
- bRel = true;
- if(sQual.empty() || sQual == "<UNDEFINED>") {
- fRad = -PI/2;
- } else {
- fRad = -GetNumber999(sQual)*PI/180;
- }
- } else if(sDirection.substr(0, 4) == "LEFT") {
- string sQual;
- if(Gal_GetString(inframe, ":increment"))
- sQual = (Gal_GetString(inframe, ":increment"));
- bRel = true;
- if(sQual.empty() || sQual == "<UNDEFINED>") {
- fRad = PI/2;
- } else {
- fRad = GetNumber999(sQual)*PI/180;
- }
- } else if(sDirection == "AROUND" ||
- sDirection == "BACK" ||
- sDirection == "BACKWARD" ||
- sDirection == "BACKWARDS") {
- bRel = true;
- fRad = PI;
- } else {
- error("agent") << "unknown direction " << sDirection << endl;
- return;
- }
- MsgCmdGoTo turn((float)fRad);
+ debug("agent") << "got turn command" << endl;
+ string sDirection(Gal_GetString(inframe, ":direction"));
+ bool bRel(false);
+ double fRad;
+ if(sDirection == "NORTH") fRad = PI/2;
+ else if(sDirection == "NORTHEAST") fRad = PI/4;
+ else if(sDirection == "NORTHWEST") fRad = 3*PI/4;
+ else if(sDirection == "EAST") fRad = 0;
+ else if(sDirection == "WEST") fRad = PI;
+ else if(sDirection == "SOUTH") fRad = 3*PI/2;
+ else if(sDirection == "SOUTHEAST") fRad = 7*PI/4;
+ else if(sDirection == "SOUTHWEST") fRad = 5*PI/4;
+ else if(sDirection == "STRAIGHT" ||
+ sDirection == "FORWARD" ||
+ sDirection == "FORWARDS") {
+ bRel = true;
+ fRad = 0;
+ } else if(sDirection.substr(0, 5) == "RIGHT") {
+ string sQual;
+ if(Gal_GetString(inframe, ":increment"))
+ sQual = (Gal_GetString(inframe, ":increment"));
+ bRel = true;
+ if(sQual.empty() || sQual == "<UNDEFINED>") {
+ fRad = -PI/2;
+ } else {
+ fRad = -GetNumber999(sQual)*PI/180;
+ }
+ } else if(sDirection.substr(0, 4) == "LEFT") {
+ string sQual;
+ if(Gal_GetString(inframe, ":increment"))
+ sQual = (Gal_GetString(inframe, ":increment"));
+ bRel = true;
+ if(sQual.empty() || sQual == "<UNDEFINED>") {
+ fRad = PI/2;
+ } else {
+ fRad = GetNumber999(sQual)*PI/180;
+ }
+ } else if(sDirection == "AROUND" ||
+ sDirection == "BACK" ||
+ sDirection == "BACKWARD" ||
+ sDirection == "BACKWARDS") {
+ bRel = true;
+ fRad = PI;
+ } else {
+ error("agent") << "unknown direction " << sDirection << endl;
+ return;
+ }
+ MsgCmdGoTo turn((float)fRad);
#ifdef USE_TXT_COMMANDS
- sendAction(&turn);
+ sendAction(&turn);
#else
- r->sendGoToCmd(turn.content()->priority, turn.content()->taskid,
- turn.content()->x, turn.content()->y, turn.content()->angle,
- turn.content()->useAngle(), turn.content()->useRelative());
+ r->sendGoToCmd(turn.content()->priority, turn.content()->taskid,
+ turn.content()->x, turn.content()->y, turn.content()->angle,
+ turn.content()->useAngle(), turn.content()->useRelative());
#endif
}
void Agent::set_pose_command(const Gal_Frame& inframe)
{
- debug("agent") << "got set pose command" << endl;
- const char* x = Gal_GetString(inframe, ":x");
- const char* y = Gal_GetString(inframe, ":y");
- const char* a = Gal_GetString(inframe, ":angle");
+ debug("agent") << "got set pose command" << endl;
+ const char* x = Gal_GetString(inframe, ":x");
+ const char* y = Gal_GetString(inframe, ":y");
+ const char* a = Gal_GetString(inframe, ":angle");
if(!x) {
error("agent") << "x is null" << endl;
return;
@@ -739,9 +738,9 @@
error("agent") << "angle is null" << endl;
return;
}
- MsgCmdSetPos set_pos((float)atof(x), (float)atof(y), (float)atof(a));
- debug("agent") << "setpos (" << x << ' ' << y << ") " << a;
-
+ MsgCmdSetPos set_pos((float)atof(x), (float)atof(y), (float)atof(a));
+ debug("agent") << "setpos (" << x << ' ' << y << ") " << a;
+
sendAction(&set_pos);
}
Modified: trunk/TeamTalk/Agents/TeamTalkBackend/agent.h
===================================================================
--- trunk/TeamTalk/Agents/TeamTalkBackend/agent.h 2007-11-07 21:58:55 UTC (rev 868)
+++ trunk/TeamTalk/Agents/TeamTalkBackend/agent.h 2007-11-08 22:05:23 UTC (rev 869)
@@ -15,6 +15,9 @@
//The Agent represents a robot, including its connections to the hub and
//its spawned galaxy servers
+
+static string OLYMPUS_ROOT;
+
class Agent {
private:
GalIO_CommStruct* comm_; //hub connection for this agent
More information about the TeamTalk-developers
mailing list