anyKode Marilou
ContentsIndexHome
PreviousUpNext
DeviceEmitterReceiver

Gestion des émetteurs/récepteurs.

C++
class DeviceEmitterReceiver : public Device;

ModaCpp.h

La classe DeviceEmitterReceiver ne dois pas être instanciée par le programme lui même: elle doit être obtenue par QueryDeviceEmitterReceiver de la classe RobotPHX

 

La communication est orientée 'Message' : les données envoyées par la fonction Send sont reçues en un seul packet par la fonction Receive. Le temps mis pour le transit du packet, de l'émetteur au récepteur, est fonction de la vitesse de communication l'émetteur. La communication de fait de session d'émetteur à session de récepteur. L'application peut ainsi déterminer la provenance du packet reçu et envoyer des données à un récepteur identifié. Il est également possible de dialoguer avec la session de broadcast en utilisant les fonctions Send/Receive appropriées. 

 

Comment créer cet équipement ? 

//////////////////////////////////////////////////////
//Sample from samples/devices/EmitterReceiver
//////////////////////////////////////////////////////

#include "Modacpp.h"
#include "conio.h"

#define MODASERVER "localhost"

#define STARTPOINT "/"

#define RECEIVER1    "receiver1/zone_sensor/sensor"
#define RECEIVER2    "receiver2/zone_sensor/sensor"
#define EMITTER        "emitter/zone_sensor/sensor"
#define JACK        "slider/axis/j"
#define LIGHT1        "light1/l"
#define LIGHT2        "light2/l"

using namespace ModaCPP;

CRITICAL_SECTION csDisplaySection;

//---------------------------------------------------------------------
class AReceiver
    {
    public:
    DeviceEmitterReceiver *pReceiver;
    DeviceLightSource *pLight;

    AReceiver(DeviceEmitterReceiver *_pReceiver,DeviceLightSource *_pLight)
        {
        pReceiver=_pReceiver;
        pLight=_pLight;
        }
    };

//---------------------------------------------------------------------
void DoReceiver(void *pParam)
    {
    AReceiver *pParams=(AReceiver *)pParam;

    DeviceEmitterReceiver *pReceiver=pParams->pReceiver;
    DeviceLightSource *pLight=pParams->pLight;
    pLight->SetIntensity(0);

    int MySessionID=pReceiver->CreateCommunicationSession();
    xkode::lib::Array<MU8> Received;
    bool bToggle=false;
    while(true)
        {
        int SenderSessionID=0;

        M32 DeviceResponse=MODA_EOK;
        M32 SystemResponse=MODA_EOK;
        SystemResponse=pReceiver->ReceiveFromAll(MySessionID,SenderSessionID,Received,100,&DeviceResponse);

        if(Received.Count())
            {
            //received some bytes

            //toggle the light
            if(bToggle)    pLight->SetIntensity(100);
            else        pLight->SetIntensity(0);
            bToggle=!bToggle;

            //display
            EnterCriticalSection(&csDisplaySection);
            _cprintf("[%d]: received:%s from %d, SR=%d, DR:%d\r\n",MySessionID,Received.GetData(),SenderSessionID,SystemResponse,DeviceResponse);
            LeaveCriticalSection(&csDisplaySection);
            }
        else
            {
            //received nothing

            //switch off the light
            pLight->SetIntensity(0);

            //display
            EnterCriticalSection(&csDisplaySection);
            _cprintf("[%d]: SR=%d, DR:%d\r\n",MySessionID,SystemResponse,DeviceResponse);
            LeaveCriticalSection(&csDisplaySection);

            //wait a moment ...
            pReceiver->GetRobot()->GetConnection()->Sleep(100);
            }
        }
    }

//---------------------------------------------------------------------
int main(int argc, char* argv[])
{
//safe display
InitializeCriticalSection(&csDisplaySection);

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 *pWorld=connection->QueryRobotPHX(STARTPOINT);
    if(pWorld)
        {
        _cprintf("World PHX found\r\n");

        //find devices
        DeviceEmitterReceiver *pEmitter=pWorld->QueryDeviceEmitterReceiver(EMITTER);
        DeviceEmitterReceiver *pReceiver1=pWorld->QueryDeviceEmitterReceiver(RECEIVER1);
        DeviceEmitterReceiver *pReceiver2=pWorld->QueryDeviceEmitterReceiver(RECEIVER2);
        DeviceActuatingCylinder *pJack=pWorld->QueryDeviceActuatingCylinder(JACK);
        DeviceLightSource *pLight1=pWorld->QueryDeviceLightSource(LIGHT1);
        DeviceLightSource *pLight2=pWorld->QueryDeviceLightSource(LIGHT2);

        if(pEmitter && pReceiver1 && pReceiver2 && pJack && pLight1 && pLight2)
            {
            //devices are OK

            //create receivers threads
            DWORD dwID;
            CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)DoReceiver,new AReceiver(pReceiver1,pLight1),0,&dwID);
            CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)DoReceiver,new AReceiver(pReceiver2,pLight2),0,&dwID);

            //start moving the jack
            float testpos=0.7f;
            float pos=0.71f;
            pJack->GoPosition(pos);

            //emit data every 50 ms, from the emiter, move the emitter along the scene
            int loop=0;

            int EmitterSessionID=pEmitter->CreateCommunicationSession();
            _cprintf("Emitter: dialing with communication session %d\r\n",EmitterSessionID);
            if(EmitterSessionID>0)
                {
                while(!_kbhit())
                    {
                    //move the jack
                    float jackposition=pJack->GetPosition();
                    if(jackposition>=testpos) pJack->GoPosition(-pos);
                    if(jackposition<=-testpos) pJack->GoPosition(pos);

                    //emit data
                    xkode::lib::String temp(loop++);
                    pEmitter->SendToAll(EmitterSessionID, (MU8 *) temp.GetData(), temp.Length()+1);
                    connection->Sleep(50);
                    }

                pEmitter->DeleteCommunicationSession(EmitterSessionID);
                }
            else
                {
                _cprintf("Invalid session ID %d\\r\n",EmitterSessionID);
                }
            }
        else
            {
            _cprintf("Missing one or more device(s)\r\n");
            }
        }
    else
        {
        _cprintf("World PHX not found\r\n");
        }
    }
else
    {
    _cprintf("Unable to connect to moda server\r\n");
    }
//Disconnect & delete
connection->Disconnect();
delete connection;
DeleteCriticalSection(&csDisplaySection);
return 0;
}
Documentation v4.7 (18/01/2015), Copyright (c) 2015 anyKode. All rights reserved.
What do you think about this topic? Send feedback!