00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "tracking.h"
00013
00014
00015 using namespace VRUT;
00016
00017 Tracking::Tracking(const VRUT::MODULE_ID &_id, const wxString &_name, VRUT::EventHandler *msgSink)
00018 : Module(_id, _name, 0, msgSink),
00019 localPortParamID(_name, wxT("localPort"), _id),
00020 packetTimeoutParamID(_name, wxT("packetTimeout"), _id),
00021 bufferSizeParamID(_name, wxT("bufferSize"), _id),
00022 translationFilterParamID(_name, wxT("translationFilter"), _id),
00023 rotationFilterParamID(_name, wxT("rotationFilter"), _id),
00024 bodyIDParamID(_name, wxT("bodyID"), _id),
00025 bodyTypeParamID(_name, wxT("bodyType"), _id),
00026 dumpTableParamID(_name, wxT("dumpTable"), _id),
00027 updateTableParamID(_name, wxT("updateTabe"), _id),
00028 IDoffsetParamID(_name, wxT("IDoffset"), _id)
00029 {
00030 REGISTER_PARAM_GUI_TEXTCONTROL(bodyIDParamID, wxT("0"));
00031 REGISTER_PARAM_GUI_TEXTCONTROL(bodyTypeParamID, wxT("0"));
00032 REGISTER_PARAM_GUI_TEXTCONTROL(rotationFilterParamID, wxT("0.1"));
00033 REGISTER_PARAM_GUI_TEXTCONTROL(translationFilterParamID, wxT("5.0"));
00034 REGISTER_PARAM_GUI_BUTTON(updateTableParamID);
00035 REGISTER_PARAM_GUI_BUTTON(dumpTableParamID);
00036 REGISTER_PARAM_GUI_TEXTCONTROL(IDoffsetParamID,wxT("0"));
00037 REGISTER_PARAM_GUI_TEXTCONTROL(localPortParamID, wxT("2627"));
00038 REGISTER_PARAM_GUI_TEXTCONTROL(bufferSizeParamID, wxT("8192"));
00039 REGISTER_PARAM_GUI_TEXTCONTROL(packetTimeoutParamID, wxT("20"));
00040 IDoffset = 0;
00041 rotationFilter = (float)0.1;
00042 bodyType = bodyID = 0;
00043 translationFilter = 5;
00044 remoteAddress = wxT("localhost");
00045 remotePort = 2627;
00046 localPort = 2627;
00047 eventTimeout= packetTimeout = 20;
00048 listener = new Receiver();
00049 parser.SetQueue(&bodyQueue);
00050 }
00051
00052 void Tracking::processEvent(wxCommandEvent & evt)
00053 {
00054 Module::processEvent(evt);
00055 switch (evt.GetEventType())
00056 {
00057 case Event::EVT_PARAM_SET:
00058 {
00059 updateTable = dumpTable = 0;
00060 UPDATE_PARAM_FROM_EVENT_INT(localPortParamID, localPort, evt);
00061 UPDATE_PARAM_FROM_EVENT_INT(bufferSizeParamID, bufferSize, evt);
00062 UPDATE_PARAM_FROM_EVENT_UNSIGNED(packetTimeoutParamID, packetTimeout,evt);
00063 UPDATE_PARAM_FROM_EVENT_FLOAT(rotationFilterParamID, rotationFilter, evt);
00064 UPDATE_PARAM_FROM_EVENT_FLOAT(translationFilterParamID, translationFilter, evt);
00065 UPDATE_PARAM_FROM_EVENT_INT(bodyIDParamID, bodyID, evt);
00066 UPDATE_PARAM_FROM_EVENT_INT(bodyTypeParamID, bodyType,evt);
00067 UPDATE_PARAM_FROM_EVENT_INT(updateTableParamID, updateTable, evt);
00068 UPDATE_PARAM_FROM_EVENT_INT(dumpTableParamID, dumpTable, evt);
00069 UPDATE_PARAM_FROM_EVENT_INT(IDoffsetParamID, IDoffset, evt);
00070 listener->UpdateSocket(remoteAddress, remotePort, localPort);
00071 listener->ResizeBuffer(bufferSize);
00072 eventTimeout = packetTimeout;
00073 if (updateTable != 0)
00074 {
00075 if(filter.UpdateFilter((Body::BodyType)bodyType, bodyID, rotationFilter, translationFilter))
00076 {
00077 LOG(wxT("<Tracking> Filter updated."));
00078 }
00079 else
00080 {
00081 LOG(wxT("<Tracking> Selected entry were not found! Entry Pre-created: "));
00082 this->dumpFilterTable();
00083 }
00084 }
00085 if (dumpTable != 0)
00086 {
00087 this->dumpFilterTable();
00088 }
00089 break;
00090 }
00091 }
00092 if (packetTimeout != eventTimeout) packetTimeout = eventTimeout;
00093 }
00094 void Tracking::run()
00095 {
00096 while (listener->Receive())
00097 {
00098 parser.SetPacket(listener->GetPacket());
00099 if (parser.Parse())
00100 {
00101 processQueue();
00102 }
00103 else
00104 {
00105 LOGWARNING(wxT("<Tracking> Parsing Failed"));
00106 safeEmptyQueue();
00107 }
00108 }
00109 }
00110 wxString Tracking::GetDesc() const
00111 {
00112 return wxT("DTrack datagram receiver and parser");
00113 }
00114 Tracking::~Tracking()
00115 {
00116 listener->~Receiver();
00117 }
00118 void Tracking::safeEmptyQueue()
00119 {
00120 while (!bodyQueue.empty())
00121 {
00122 Body * tempB = bodyQueue.front();
00123 bodyQueue.pop();
00124 delete tempB;
00125 }
00126 }
00127 void Tracking::processQueue()
00128 {
00129 while (!bodyQueue.empty())
00130 {
00131 Body * tempA = bodyQueue.front();
00132 bodyQueue.pop();
00133 if (filter.Filter(tempA))
00134 {
00135
00136 }
00137 else
00138 {
00139
00140 DeviceData * data = new DeviceData;
00141 data->id = tempA->GetID() + IDoffset;
00142 data->type = tempA->GetType();
00143 data->matrix = tempA->Matrix();
00144 data->buttons = tempA->ButtonsMask32();
00145 data->control1 = tempA->Control(0);
00146 data->control1 = tempA->Control(1);
00147 if (data->control1 < -1 || data->control1 > 1) data->control1 = 0;
00148 if (data->control2 < -1 || data->control2 > 1) data->control2 = 0;
00149
00150 wxCommandEvent evt = Event::GET_EVT_INPUT_TRACKING(data);
00151 PostToKernel(evt);
00152 }
00153 delete tempA;
00154 }
00155 }
00156 void Tracking::dumpFilterTable()
00157 {
00158
00159 wxString dump = wxT("<Tracking> FilterTable:\nType\tID\tAngleFilter\tDistFilter\n");
00160 dump += filter.GetAsString("\n","\t");
00161 LOG(dump);
00162 }