anyKode Marilou
ContentsIndexHome
PreviousUpNext
ModaCPP::QueryDevice

Recherche une device spécifique dans la simulation et craie un object du type du template.

C++
template <class DEVICEOBJECT> DEVICEOBJECT* QueryDevice(RobotPHX * pRobot, const xkode::lib::String& Name, Marilou::Commons::ActiveEntityClasses ActiveClass);

ModaCpp.h

Parameters 
Description 
RobotPHX * pRobot 
[in] Pointeur sur le RobotPHX qui contient la device recherchée 
const xkode::lib::String& Name 
[in] Nom relatif de la device 
Marilou::Commons::ActiveEntityClasses ActiveClass 
[in] Classe de la device recherchée 

Un pointeur du type de l'objet passé dans le template si la device a été trouvée, NULL sinon. Le pointeur doit être détruit après utilisation par la commande C++ delete.

QueryDevice recherche une device en fonction de son type (classe) et de son nom. Si la device existe, QueryDevice craie une instance de l'objet du type du template et le connecte à la simulation. Si l'objet n'a pas de constructeur comme décrit plus loins dans ce document, il faut utiliser QueryDevice2. La classe recherchée peut être soit spécifique (Ex: Marilou::Commons::CoreDeviceMotorquery), soit générique (Marilou::Commons::CoreDevice). La premiere device qui correspond aux critères de recherche est considérée comme acceptable. 

 

L'objet doit avoir un constructeur définit comme suit:

MyDeviceObject::MyDeviceObject(xkode::lib::String Name):ExistingDeviceType(Name);

 

Par exemple, les 2 méthodes suivantes sont équivalentes: 

 

//get the motor device using the predefined QueryDeviceMotor function:
ModaCPP::DeviceMotor *pMotor1    =robot->QueryDeviceMotor("hinge0/a1/m");

//or get the motor device using the QueryDevice function:
ModaCPP::DeviceMotor *pMotor2    =ModaCPP::QueryDevice<ModaCPP::DeviceMotor>(robot,"hinge0/a1/m",Marilou::Commons::DeviceMotor);

 

Cette fonction est utile par exemple pour les devices créées dans des plugins : Il suffit alors de créer une Device (un objet qui dérive de Device) et le créer au travers de QueryDevice(...). Également QueryDevice peut être utilisée pour lister avec précision les devices embarquées sur un robot ou surcharger le fonctionnement d'une device existante. 

 

Surcharger une device existante:
#include "stdafx.h"
#include "Modacpp.h"
#include "conio.h"

#define MODASERVER "localhost"
#define MYROBOTNAME    "/"

using namespace ModaCPP;

//-----------------------------------------------------------
class MyMotor:public ModaCPP::DeviceMotor
    {
    public:
        MyMotor(xkode::lib::String Name):DeviceMotor(Name)
            {

            }

        //set the motor speed from a voltage value (+-12v)
        void SetVoltage(float voltage)
            {
            SetVelocityDPS((voltage/12.0f)*720);
            }
    };

//-----------------------------------------------------------
int main(int argc, char* argv[])
{
ModaCPP::Connection *connection=new ModaCPP::Connection(true);
//Try connect to MODA server
if(connection->Connect(MODASERVER))
    {
    _cprintf("Connection ok to moda server\r\n");
    //Find the robot
    ModaCPP::RobotPHX *robot=connection->QueryRobotPHX(MYROBOTNAME);
    if(robot)
        {
        //robot found, find motor
        _cprintf("robot found\r\n");

        MyMotor *pMyMotor=ModaCPP::QueryDevice<MyMotor>(robot,"hinge0/a1/m",Marilou::Commons::DeviceMotor);
        if(pMyMotor)
            {
            _cprintf("Motor OK\r\n");
            pMyMotor->SetVoltage(6.0f);

            //(...)

            delete pMyMotor;
            }
        else
            {
            _cprintf("Motor not found\r\n");
            }
        }
    else
        {
        _cprintf("robot not found\r\n");
        }
    }
else
    {
    _cprintf("Unable to connect to moda server\r\n");
    }
//Disconnect & delete
connection->Disconnect();
delete connection;
return 0;
}

 

Enumérer les devices d'un robot:
//C++ source code
#include "stdafx.h"
#include "Modacpp.h"
#include "conio.h"

#define MODASERVER "localhost"
#define MYROBOTNAME    "/"

using namespace ModaCPP;

//-----------------------------------------------------------
void EnumRobotDevices(RobotPHX *pRobot)
{
//2 kind of devices: CodeDevice and FromPluginDevice

xkode::lib::ObjectsArray<xkode::lib::String> list=pRobot->GetEntitiesList(Marilou::Commons::CoreDevice,true);
for(int i=0;i<list.Count();i++)
    {
    Device *pDevice=ModaCPP::QueryDevice2<Device>(pRobot,list[i],Marilou::Commons::CoreDevice);
    if(pDevice)
        {
        _cprintf("found device %s, type %X\r\n",pDevice->GetName().GetData(),pDevice->GetClass());
        delete pDevice;
        }
    else
        {
        _cprintf("found NULL device\r\n");
        }
    }
}

//-----------------------------------------------------------
int main(int argc, char* argv[])
{
ModaCPP::Connection *connection=new ModaCPP::Connection(true);
//Try connect to MODA server
if(connection->Connect(MODASERVER))
    {
    _cprintf("Connection ok to moda server\r\n");
    //Find the robot
    ModaCPP::RobotPHX *robot=connection->QueryRobotPHX(MYROBOTNAME);
    if(robot)
        {
        //robot found, enum devices
        _cprintf("robot found\r\n");
        EnumRobotDevices(robot);
        }
    else
        {
        _cprintf("robot not found\r\n");
        }
    }
else
    {
    _cprintf("Unable to connect to moda server\r\n");
    }
//Disconnect & delete
connection->Disconnect();
delete connection;
return 0;
}
Documentation v4.7 (18/01/2015), Copyright (c) 2015 anyKode. All rights reserved.
What do you think about this topic? Send feedback!