GposClientDemo.cpp
This file accompanies the Global Sensor Service tutorial. This file shows an example of a component which uses the Global Pose Sensor. This component exercises all the capabilities of the GposDemo component.

Download this file: GposClientDemo.cpp

#include <openjaus.h>
#include "openjaus/core/Base.h"
#include "openjaus/mobility/GlobalPoseSensor.h"
 
using namespace openjaus;
 
bool processReportGlobalPose(mobility::ReportGlobalPose &report)
{
    std::cout << "Recv Report Global Pose\n";
    std::cout << "Latitude: " << report.getLatitude_deg() << std::endl;
    std::cout << "Longitude: " << report.getLongitude_deg() << std::endl;
    std::cout << "Altitude: " << report.getAltitude_m() << std::endl;
    std::cout << "Roll: " << report.getRoll_rad() << std::endl;
    std::cout << "Pitch: " << report.getPitch_rad() << std::endl;
    std::cout << "Yaw: " << report.getYaw_rad() << std::endl;
    return true;
}
 
bool processReportGeomagneticProperty(mobility::ReportGeomagneticProperty &report)
{
    std::cout << "Recv Report Geomagnetic Property\n";
    std::cout << "Magnetic Variation: " << report.getMagneticVariation_rad() << std::endl;
    return true;
}
 
void processControlResponse(const model::ControlResponse& response)
{
    std::cout << "Recv Control Request Response from: " << response.getAddress() << std::endl;
    std::cout << "Response code: " << response.getResponseType() << std::endl;
}
 
void printMenu()
{
    std::cout << "Menu:" << std::endl;
    std::cout << "t - Print System Tree" << std::endl;
    std::cout << "1 - Find Global Pose Sensor" << std::endl;
    std::cout << "2 - Query Global Pose" << std::endl;
    std::cout << "3 - Query Geomagnetic Property" << std::endl;
    std::cout << "4 - Create Periodic Event (Report GPOS)" << std::endl;
    std::cout << "5 - Stop Periodic Event (Report GPOS)" << std::endl;
    std::cout << "6 - Request GPOS Control" << std::endl;
    std::cout << "7 - Release GPOS Control" << std::endl;
    std::cout << "8 - Set Global Pose" << std::endl;
    std::cout << "? - Output Menu" << std::endl;
    std::cout << "ESC - Exit Component" << std::endl;
}
 
int main(void)
{
    system::Application::setTerminalMode();
 
    std::vector<transport::Address> gposList;
 
    core::Base component;
    component.setName("GposClientDemo");
    component.addMessageCallback(processReportGlobalPose);
    component.addMessageCallback(processReportGeomagneticProperty);
    component.run();
    uint32_t subscriptionId = 0;
 
    printMenu();
 
    unsigned char choice = 0;
    while(choice != 27) // ESC
    {
        choice = system::Application::getChar();
        switch(choice)
        {
            case 't':
                std::cout << component.getSystemTree()->toString();
                break;
 
            case '?':
                printMenu();
                break;
 
            case '1':
            {
                gposList = component.getSystemTree()->lookupService("urn:jaus:jss:mobility:GlobalPoseSensor");
                std::cout << "GPOS Services (" << gposList.size() << "):\n";
                for(size_t i = 0; i < gposList.size(); i++)
                {
                    std::cout << "\t" << gposList.at(i).toString() << std::endl;
                }
                break;
            }
 
            case '2':
                std::cout << "Sending Query Global Pose" << std::endl;
                if(gposList.size() > 0)
                {
                    mobility::QueryGlobalPose *query = new mobility::QueryGlobalPose();
                    query->setQueryPresenceVector(65535);
                    query->setDestination(gposList.at(0));
                    component.sendMessage(query);
                }
                break;
 
            case '3':
                std::cout << "Sending Query Geomagnetic Property" << std::endl;
                if(gposList.size() > 0)
                {
                    mobility::QueryGeomagneticProperty *query = new mobility::QueryGeomagneticProperty();
                    query->setDestination(gposList.at(0));
                    component.sendMessage(query);
                }
                break;
 
            case '4':
                if(!subscriptionId && gposList.size() > 0)
                {
                    mobility::QueryGlobalPose *query = new mobility::QueryGlobalPose();
                    query->setQueryPresenceVector(65535);
                    subscriptionId = component.subscribePeriodic(gposList.at(0), query, 1.0);
                    std::cout << "Created Periodic Event: " << subscriptionId << std::endl;
                }
                break;
 
            case '5':
                if(subscriptionId)
                {    std::cout << "Un-subscribing Periodic Event" << std::endl;
                    if(component.unsubscribe(subscriptionId))
                    {
                        subscriptionId = 0;
                    }
                }
                break;
 
            case '6':
                if(gposList.size() > 0)
                {
                    component.requestControl(gposList.at(0), processControlResponse);
                    std::cout << "Request Control Gpos at " << gposList.at(0) << std::endl;
                }
                break;
 
            case '7':
                if(gposList.size() > 0)
                {
                    try
                    {
                        component.releaseControl(gposList.at(0));
                        std::cout << "Sent Release Control to " << gposList.at(0) << std::endl;
                    }
                    catch(system::Exception e)
                    {
                        std::cout << e.toString() << std::endl;
                    }
                }
                break;
 
            case '8':
                if(gposList.size() > 0)
                {
                    mobility::SetGlobalPose *pose = new mobility::SetGlobalPose();
 
                    pose->enableLatitude();
                    pose->setLatitude_deg(50.0);
 
                    pose->enableLongitude();
                    pose->setLongitude_deg(50.0);
 
                    pose->setDestination(gposList.at(0));
                    component.sendMessage(pose);
                }
                break;
        }
 
    }
 
    return 0;
    // End of user code
}
 
Copyright © 2012 OpenJAUS. All Rights Reserved.
Joomla! is Free Software released under the GNU/GPL License.