// %flair:license{ // This file is part of the Flair framework distributed under the // CECILL-C License, Version 1.0. // %flair:license} // created: 2013/04/03 // filename: VrpnClient_impl.cpp // // author: César Richard, Guillaume Sanahuja // Copyright Heudiasyc UMR UTC/CNRS 7253 // // version: $Id: $ // // purpose: objet se connectant au serveur vrpn // // /*********************************************************************/ #include "VrpnClient.h" #include "VrpnClient_impl.h" #include "VrpnObject.h" #include "VrpnObject_impl.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::string; using std::vector; using namespace flair::core; using namespace flair::gui; using namespace flair::sensor; VrpnClient_impl::VrpnClient_impl(VrpnClient* self,std::string name,std::string address,uint16_t us_period) { this->us_period=us_period; this->self=self; serialport=NULL; mutex=new Mutex(self,name); connection = vrpn_get_connection_by_name(address.c_str()); //station sol main_tab=new Tab(getFrameworkManager()->GetTabWidget(),name); tab=new TabWidget(main_tab->NewRow(),name); setup_tab=new Tab(tab,"Reglages"); rotation_1=new OneAxisRotation(setup_tab->NewRow(),"post rotation 1"); rotation_2=new OneAxisRotation(setup_tab->NewRow(),"post rotation 2"); } VrpnClient_impl::VrpnClient_impl(VrpnClient* self,std::string name,SerialPort* serialport,uint16_t us_period) { this->us_period=us_period; this->self=self; this->serialport=serialport; connection=NULL; mutex=new Mutex(self,name); serialport->SetBaudrate(111111); serialport->SetRxTimeout(us_period*1000); //station sol main_tab=new Tab(getFrameworkManager()->GetTabWidget(),name); tab=new TabWidget(main_tab->NewRow(),name); setup_tab=new Tab(tab,"Reglages"); rotation_1=new OneAxisRotation(setup_tab->NewRow(),"post rotation 1"); rotation_2=new OneAxisRotation(setup_tab->NewRow(),"post rotation 2"); } VrpnClient_impl::~VrpnClient_impl() { if(!UseXbee()) { //on fait une copie car le delete touche a xbee_objects_copy via RemoveTrackable vector trackables_copy=trackables; for(unsigned int i=0;i xbee_objects_copy=xbee_objects; for(unsigned int i=0;iself; } delete main_tab; if(!UseXbee()) { //it will automatically delete connection connection->removeReference(); } } void VrpnClient_impl::ComputeRotations(Vector3D& point) { rotation_1->ComputeRotation(point); rotation_2->ComputeRotation(point); } void VrpnClient_impl::ComputeRotations(Quaternion& quat) { rotation_1->ComputeRotation(quat); rotation_2->ComputeRotation(quat); } void VrpnClient_impl::AddTrackable(VrpnObject* obj) { mutex->GetMutex(); trackables.push_back(obj); mutex->ReleaseMutex(); } void VrpnClient_impl::RemoveTrackable(VrpnObject* obj) { mutex->GetMutex(); for(vector::iterator it=trackables.begin() ; it < trackables.end(); it++ ) { if(*it==obj) { trackables.erase (it); break; } } mutex->ReleaseMutex(); } void VrpnClient_impl::AddTrackable(VrpnObject_impl* obj,uint8_t id) { xbee_object tmp; tmp.vrpnobject=obj; tmp.id=id; mutex->GetMutex(); xbee_objects.push_back(tmp); mutex->ReleaseMutex(); } void VrpnClient_impl::RemoveTrackable(VrpnObject_impl* obj) { mutex->GetMutex(); for(vector::iterator it=xbee_objects.begin() ; it < xbee_objects.end(); it++ ) { if((*it).vrpnobject==obj) { xbee_objects.erase (it); break; } } mutex->ReleaseMutex(); } bool VrpnClient_impl::UseXbee(void) { if(connection==NULL) { return true; } else { return false; } } void VrpnClient_impl::Run(void) { while(!self->ToBeStopped()) { if(UseXbee()) { ssize_t read = 0; uint8_t response[38] = {0}; read = serialport->Read(response,sizeof(response)); if(read>0 && read!=sizeof(response)) read += serialport->Read(&response[read],sizeof(response)-read); //int temps=(float)self->GetTime()/(1000*1000); //self->Printf("%i %i %i\n",temps-last,temps,last); //last=temps; if(read<0) { //self->Warn("erreur rt_dev_read (%s)\n",strerror(-read)); } else if (read != sizeof(response)) { self->Warn("erreur rt_dev_read %i/%i\n",read,sizeof(response)); } else { //for(ssize_t i=0;iErr("checksum error\n"); } else { vrpn_TRACKERCB t; float pos[3]; float quat[4]; uint8_t id=response[8]; mutex->GetMutex(); if(id10) || fabs(pos[1]>10) || fabs(pos[2]>10)) { printf("prob pos %f %f %f\n",pos[0],pos[1],pos[2]); } else { //self->Printf("%i %f %f %f %f\n",id,pos[0],pos[1],pos[2],(float)self->GetTime()/(1000*1000)); VrpnObject_impl::handle_pos(xbee_objects.at(id).vrpnobject,t); } } mutex->ReleaseMutex(); } } } else { connection->mainloop(); mutex->GetMutex(); for(unsigned int i=0;imainloop(); mutex->ReleaseMutex(); self->SleepUS(us_period); } } }