aboutsummaryrefslogtreecommitdiffstats
path: root/src/genivi_request.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/genivi_request.cpp')
-rw-r--r--src/genivi_request.cpp350
1 files changed, 350 insertions, 0 deletions
diff --git a/src/genivi_request.cpp b/src/genivi_request.cpp
new file mode 100644
index 0000000..a485667
--- /dev/null
+++ b/src/genivi_request.cpp
@@ -0,0 +1,350 @@
+// Copyright 2017 AW SOFTWARE CO.,LTD
+// Copyright 2017 AISIN AW CO.,LTD
+
+#include "genivi/navicore.h"
+#include "genivi/genivi-navicore-constants.h"
+#include "genivi_request.h"
+#include <stdio.h>
+#include <exception>
+#include <dbus-c++-1/dbus-c++/dbus.h>
+
+/**
+ * @brief Destructor
+ */
+GeniviRequest::~GeniviRequest()
+{
+ delete (Navicore*)navicore_;
+ navicore_ = NULL;
+}
+
+/**
+ * @brief DBus session creation
+ */
+void GeniviRequest::CreateDBusSession( )
+{
+ try
+ {
+ static DBus::BusDispatcher dispatcher;
+ DBus::default_dispatcher = &dispatcher;
+ DBus::Connection conn = DBus::Connection::SessionBus();
+
+ navicore_ = new Navicore(conn, "/org/genivi/navicore", "org.agl.naviapi");
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+}
+
+/**
+ * @brief Check connection status
+ * @return Presence / absence of connection
+ */
+bool GeniviRequest::CheckSession()
+{
+ if(this->navicore_ == NULL)
+ {
+ this->CreateDBusSession();
+ }
+
+ try
+ {
+ // Get connection status
+ DBus::Connection conn = ((Navicore*)navicore_)->conn();
+ bool isConnect = conn.connected();
+
+ // If it is not connected, it issues an error
+ if(!isConnect)
+ {
+ fprintf(stderr, "Service has no session.\n");
+ }
+
+ return isConnect;
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ return false;
+ }
+}
+
+/**
+ * @brief Call GeniviAPI GetPosition to get information
+ * @param[in] valuesToReturn Key arrangement of information acquired from Genivi
+ * @return Map information on key and value of information acquired from Genivi
+ */
+std::map< int32_t, double > GeniviRequest::NavicoreGetPosition( const std::vector< int32_t >& valuesToReturn )
+{
+ std::map< int32_t, double > ret;
+
+ if( !CheckSession() )
+ {
+ return ret;
+ }
+
+ try
+ {
+ std::map< int32_t, ::DBus::Struct< uint8_t, ::DBus::Variant > >::iterator it;
+ std::map< int32_t, ::DBus::Struct< uint8_t, ::DBus::Variant > > PosList =
+ ((Navicore*)navicore_)->GetPosition(valuesToReturn);
+ for (it = PosList.begin(); it != PosList.end(); it++)
+ {
+ if (it->first == NAVICORE_LATITUDE || it->second._1 == NAVICORE_LATITUDE)
+ {
+ ret[it->first] = it->second._2.reader().get_double();
+ }
+ else if (it->first == NAVICORE_LONGITUDE || it->second._1 == NAVICORE_LONGITUDE)
+ {
+ ret[it->first] = it->second._2.reader().get_double();
+ }
+ else if (it->first == NAVICORE_HEADING || it->second._1 == NAVICORE_HEADING)
+ {
+ ret[it->first] = it->second._2.reader().get_uint32();
+ }
+#if 0 // no supported
+ else if (it->first == NAVICORE_TIMESTAMP || it->second._1 == NAVICORE_TIMESTAMP)
+ {
+ ret[it->first] = it->second._2.reader().get_uint32();
+ }
+ else if (it->first == NAVICORE_SPEED || it->second._1 == NAVICORE_SPEED)
+ {
+ ret[it->first] = it->second._2.reader().get_int32();
+ }
+#endif
+ else if (it->first == NAVICORE_SIMULATION_MODE || it->second._1 == NAVICORE_SIMULATION_MODE)
+ {
+ ret[it->first] = it->second._2.reader().get_bool();
+ }
+ }
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+
+ return ret;
+}
+
+/**
+ * @brief Call GeniviAPI GetPosition to get information
+ * @return Route handle acquired from Genivi
+ */
+std::vector< uint32_t > GeniviRequest::NavicoreGetAllRoutes( void )
+{
+ if( !CheckSession() )
+ {
+ std::vector< uint32_t > no_route;
+ return no_route;
+ }
+
+ std::vector< uint32_t > allRoutes;
+ try
+ {
+ allRoutes = ((Navicore*)navicore_)->GetAllRoutes();
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+
+ return allRoutes;
+}
+
+
+/**
+ * @brief Call GeniviAPI GetPosition to get information
+ * @param[in] sessionHandle Session handle
+ * @return Route handle acquired from Genivi
+ */
+uint32_t GeniviRequest::NavicoreCreateRoute( const uint32_t& sessionHandle )
+{
+ if( !CheckSession() )
+ {
+ return 0;
+ }
+
+ uint32_t routeHandle = 0;
+ try
+ {
+ routeHandle = ((Navicore*)navicore_)->CreateRoute(sessionHandle);
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+
+ return routeHandle;
+}
+
+/**
+ * @brief Call GeniviAPI PauseSimulation
+ * @param[in] sessionHandle Session handle
+ */
+void GeniviRequest::NavicorePauseSimulation( const uint32_t& sessionHandle )
+{
+ if( !CheckSession() )
+ {
+ return;
+ }
+
+ try
+ {
+ ((Navicore*)navicore_)->PauseSimulation(sessionHandle);
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+}
+
+
+/**
+ * @brief Call GeniviAPI SetSimulationMode
+ * @param[in] sessionHandle Session handle
+ * @param[in] activate Simulation mode enabled / disabled
+ */
+void GeniviRequest::NavicoreSetSimulationMode( const uint32_t& sessionHandle, const bool& activate )
+{
+ if( !CheckSession() )
+ {
+ return;
+ }
+
+ try
+ {
+ ((Navicore*)navicore_)->SetSimulationMode(sessionHandle, activate);
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+}
+
+
+/**
+ * @brief Call GeniviAPI SetSimulationMode
+ * @param[in] sessionHandle Session handle
+ * @param[in] routeHandle Route handle
+ */
+void GeniviRequest::NavicoreCancelRouteCalculation( const uint32_t& sessionHandle, const uint32_t& routeHandle )
+{
+ if( !CheckSession() )
+ {
+ return;
+ }
+
+ try
+ {
+ ((Navicore*)navicore_)->CancelRouteCalculation(sessionHandle, routeHandle);
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+}
+
+/**
+ * @brief Call GeniviAPI SetWaypoints
+ * @param[in] sessionHandle Session handle
+ * @param[in] routeHandle Route handle
+ * @param[in] startFromCurrentPosition Whether or not to draw a route from the position of the vehicle
+ * @param[in] waypointsList Destination coordinates
+ */
+void GeniviRequest::NavicoreSetWaypoints( const uint32_t& sessionHandle, const uint32_t& routeHandle,
+ const bool& startFromCurrentPosition, const std::vector<Waypoint>& waypointsList )
+{
+ if( !CheckSession() )
+ {
+ return;
+ }
+
+ std::vector<Waypoint>::const_iterator it;
+ std::vector< std::map< int32_t, ::DBus::Struct< uint8_t, ::DBus::Variant > > > wpl;
+
+ fprintf(stdout, "session: %d, route: %d, startFromCurrentPosition: %d\n",
+ sessionHandle, routeHandle, startFromCurrentPosition);
+
+ for (it = waypointsList.begin(); it != waypointsList.end(); it++)
+ {
+ std::map< int32_t, ::DBus::Struct< uint8_t, ::DBus::Variant > > Point;
+ ::DBus::Struct< uint8_t, ::DBus::Variant > VarLat, VarLon;
+
+ VarLat._1 = NAVICORE_LATITUDE;
+ VarLat._2.writer().append_double(std::get<0>(*it));
+ fprintf(stdout, "VarLat._1 : %x, VarLat._2 : %lf\n", VarLat._1, VarLat._2.reader().get_double());
+
+ VarLon._1 = NAVICORE_LONGITUDE;
+ VarLon._2.writer().append_double(std::get<1>(*it));
+ fprintf(stdout, "VarLon._1 : %x, VarLon._2 : %lf\n", VarLon._1, VarLon._2.reader().get_double());
+
+ Point[NAVICORE_LATITUDE] = VarLat;
+ Point[NAVICORE_LONGITUDE] = VarLon;
+
+ wpl.push_back(Point);
+ }
+
+ try
+ {
+ ((Navicore*)navicore_)->SetWaypoints(sessionHandle, routeHandle, startFromCurrentPosition, wpl);
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+}
+
+/**
+ * @brief Call GeniviAPI CalculateRoute
+ * @param[in] sessionHandle Session handle
+ * @param[in] routeHandle Route handle
+ */
+void GeniviRequest::NavicoreCalculateRoute( const uint32_t& sessionHandle, const uint32_t& routeHandle )
+{
+ if( !CheckSession() )
+ {
+ return;
+ }
+
+ try
+ {
+ ((Navicore*)navicore_)->CalculateRoute(sessionHandle, routeHandle);
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+}
+
+
+/**
+ * @brief Call GeniviAPI CalculateRoute
+ * @return Map information on key and value of information acquired from Genivi
+ */
+std::map<uint32_t, std::string> GeniviRequest::NavicoreGetAllSessions()
+{
+ std::map<uint32_t, std::string> ret;
+
+ if( !CheckSession() )
+ {
+ return ret;
+ }
+
+ std::vector< ::DBus::Struct< uint32_t, std::string > > ncAllSessions;
+ std::vector< ::DBus::Struct< uint32_t, std::string > >::iterator it;
+
+ try
+ {
+ ncAllSessions = ((Navicore*)navicore_)->GetAllSessions();
+ for (it = ncAllSessions.begin(); it != ncAllSessions.end(); it++)
+ {
+ ret[it->_1] = it->_2;
+ }
+ }
+ catch(const std::exception& e)
+ {
+ fprintf(stderr, "Error:%s\n", e.what());
+ }
+
+ return ret;
+}
+